aqbanking-5.6.4beta/0000755000175000017500000000000012643540662011326 500000000000000aqbanking-5.6.4beta/src/0000755000175000017500000000000012643540661012114 500000000000000aqbanking-5.6.4beta/src/plugins/0000755000175000017500000000000012643540655013600 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/0000755000175000017500000000000012643540655015367 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/us/0000755000175000017500000000000012643540655016016 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/us/us.c0000644000175000017500000000344312364015477016534 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "us_p.h" #include "../generic/generic_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_US); /* interface to gwens plugin loader */ GWEN_PLUGIN *bankinfo_us_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_BankInfo_new(pm, name, fileName); assert(pl); AB_Plugin_BankInfo_SetFactoryFn(pl, AB_Plugin_BankInfoUS_Factory); return pl; } /* interface to bankinfo plugin */ AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoUS_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_US *bde; bip=AB_BankInfoPluginGENERIC_new(ab, "us"); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_US, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_US, bip, bde, AB_BankInfoPluginUS_FreeData); bde->banking=ab; return bip; } void GWENHYWFAR_CB AB_BankInfoPluginUS_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_US *bde; bde=(AB_BANKINFO_PLUGIN_US*)p; GWEN_FREE_OBJECT(bde); } aqbanking-5.6.4beta/src/plugins/bankinfo/us/Makefile.in0000644000175000017500000006722412643540061020005 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo/us DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/us.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = us.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bankinfoplugindir)" \ "$(DESTDIR)$(bankinfoplugindir)" LTLIBRARIES = $(bankinfoplugin_LTLIBRARIES) am__DEPENDENCIES_1 = us_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../generic/libbankinfo_generic.la $(am__DEPENDENCIES_1) am_us_la_OBJECTS = us.lo us_la_OBJECTS = $(am_us_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = us_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(us_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(us_la_SOURCES) DIST_SOURCES = $(us_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(bankinfoplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS = us_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES = us.la bankinfoplugin_DATA = us.xml us_la_SOURCES = us.c us_la_LIBADD = $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) us_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/us/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/us/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): us.xml: $(top_builddir)/config.status $(srcdir)/us.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-bankinfopluginLTLIBRARIES: $(bankinfoplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bankinfoplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bankinfoplugindir)"; \ } uninstall-bankinfopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bankinfoplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bankinfoplugindir)/$$f"; \ done clean-bankinfopluginLTLIBRARIES: -test -z "$(bankinfoplugin_LTLIBRARIES)" || rm -f $(bankinfoplugin_LTLIBRARIES) @list='$(bankinfoplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } us.la: $(us_la_OBJECTS) $(us_la_DEPENDENCIES) $(EXTRA_us_la_DEPENDENCIES) $(AM_V_CCLD)$(us_la_LINK) -rpath $(bankinfoplugindir) $(us_la_OBJECTS) $(us_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/us.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-bankinfopluginDATA: $(bankinfoplugin_DATA) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bankinfoplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bankinfoplugindir)" || exit $$?; \ done uninstall-bankinfopluginDATA: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bankinfoplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bankinfoplugindir)" "$(DESTDIR)$(bankinfoplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-bankinfopluginDATA \ install-bankinfopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-bankinfopluginDATA install-bankinfopluginLTLIBRARIES \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES sources: for f in $(us_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/us/us.xml.in0000644000175000017500000000044412364015477017515 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Bank info provider for the United States of America This plugin handles US banks. aqbanking-5.6.4beta/src/plugins/bankinfo/us/Makefile.am0000644000175000017500000000106712364015477017775 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS=us_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES=us.la bankinfoplugin_DATA=us.xml us_la_SOURCES=us.c us_la_LIBADD= $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) us_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(us_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/us/us_p.h0000644000175000017500000000204212364015477017052 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_US_P_H #define AQBANKING_BANKINFO_US_P_H #include #include typedef struct AB_BANKINFO_PLUGIN_US AB_BANKINFO_PLUGIN_US; struct AB_BANKINFO_PLUGIN_US { AB_BANKING *banking; }; static void GWENHYWFAR_CB AB_BankInfoPluginUS_FreeData(void *bp, void *p); static AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoUS_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_EXPORT GWEN_PLUGIN *bankinfo_us_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); #endif /* AQBANKING_BANKINFO_US_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/ch/0000755000175000017500000000000012643540655015761 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/ch/ch_p.h0000644000175000017500000000200612364015477016760 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_CH_P_H #define AQBANKING_BANKINFO_CH_P_H #include #include typedef struct AB_BANKINFO_PLUGIN_CH AB_BANKINFO_PLUGIN_CH; struct AB_BANKINFO_PLUGIN_CH { AB_BANKING *banking; }; static void GWENHYWFAR_CB AB_BankInfoPluginCH_FreeData(void *bp, void *p); static AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoCH_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_EXPORT GWEN_PLUGIN *bankinfo_ch_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); #endif /* AQBANKING_BANKINFO_CH_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/ch/ch.c0000644000175000017500000000344312364015477016442 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ch_p.h" #include "../generic/generic_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_CH); /* interface to gwens plugin loader */ GWEN_PLUGIN *bankinfo_ch_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_BankInfo_new(pm, name, fileName); assert(pl); AB_Plugin_BankInfo_SetFactoryFn(pl, AB_Plugin_BankInfoCH_Factory); return pl; } /* interface to bankinfo plugin */ AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoCH_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_CH *bde; bip=AB_BankInfoPluginGENERIC_new(ab, "ch"); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_CH, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_CH, bip, bde, AB_BankInfoPluginCH_FreeData); bde->banking=ab; return bip; } void GWENHYWFAR_CB AB_BankInfoPluginCH_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_CH *bde; bde=(AB_BANKINFO_PLUGIN_CH*)p; GWEN_FREE_OBJECT(bde); } aqbanking-5.6.4beta/src/plugins/bankinfo/ch/Makefile.in0000644000175000017500000006722412643540061017750 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo/ch DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/ch.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = ch.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bankinfoplugindir)" \ "$(DESTDIR)$(bankinfoplugindir)" LTLIBRARIES = $(bankinfoplugin_LTLIBRARIES) am__DEPENDENCIES_1 = ch_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../generic/libbankinfo_generic.la $(am__DEPENDENCIES_1) am_ch_la_OBJECTS = ch.lo ch_la_OBJECTS = $(am_ch_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ch_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ch_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ch_la_SOURCES) DIST_SOURCES = $(ch_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(bankinfoplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS = ch_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES = ch.la bankinfoplugin_DATA = ch.xml ch_la_SOURCES = ch.c ch_la_LIBADD = $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) ch_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/ch/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/ch/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ch.xml: $(top_builddir)/config.status $(srcdir)/ch.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-bankinfopluginLTLIBRARIES: $(bankinfoplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bankinfoplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bankinfoplugindir)"; \ } uninstall-bankinfopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bankinfoplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bankinfoplugindir)/$$f"; \ done clean-bankinfopluginLTLIBRARIES: -test -z "$(bankinfoplugin_LTLIBRARIES)" || rm -f $(bankinfoplugin_LTLIBRARIES) @list='$(bankinfoplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ch.la: $(ch_la_OBJECTS) $(ch_la_DEPENDENCIES) $(EXTRA_ch_la_DEPENDENCIES) $(AM_V_CCLD)$(ch_la_LINK) -rpath $(bankinfoplugindir) $(ch_la_OBJECTS) $(ch_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ch.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-bankinfopluginDATA: $(bankinfoplugin_DATA) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bankinfoplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bankinfoplugindir)" || exit $$?; \ done uninstall-bankinfopluginDATA: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bankinfoplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bankinfoplugindir)" "$(DESTDIR)$(bankinfoplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-bankinfopluginDATA \ install-bankinfopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-bankinfopluginDATA install-bankinfopluginLTLIBRARIES \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES sources: for f in $(ch_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/ch/Makefile.am0000644000175000017500000000106612364015477017737 00000000000000INCLUDES =-I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS=ch_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES=ch.la bankinfoplugin_DATA=ch.xml ch_la_SOURCES=ch.c ch_la_LIBADD= $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) ch_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(ch_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/ch/ch.xml.in0000644000175000017500000000042712364015477017424 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Bank info provider for Switzerland This plugin handles Swiss banks. aqbanking-5.6.4beta/src/plugins/bankinfo/Makefile.in0000644000175000017500000006005312643540060017346 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ DIST_SUBDIRS = generic at ca ch de us SUBDIRS = generic $(aqbanking_plugins_bankinfo_dirs) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/at/0000755000175000017500000000000012643540655015773 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/at/at.c0000644000175000017500000000344312364015477016466 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "at_p.h" #include "../generic/generic_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_AT); /* interface to gwens plugin loader */ GWEN_PLUGIN *bankinfo_at_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_BankInfo_new(pm, name, fileName); assert(pl); AB_Plugin_BankInfo_SetFactoryFn(pl, AB_Plugin_BankInfoAT_Factory); return pl; } /* interface to bankinfo plugin */ AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoAT_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_AT *bde; bip=AB_BankInfoPluginGENERIC_new(ab, "at"); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_AT, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_AT, bip, bde, AB_BankInfoPluginAT_FreeData); bde->banking=ab; return bip; } void GWENHYWFAR_CB AB_BankInfoPluginAT_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_AT *bde; bde=(AB_BANKINFO_PLUGIN_AT*)p; GWEN_FREE_OBJECT(bde); } aqbanking-5.6.4beta/src/plugins/bankinfo/at/Makefile.in0000644000175000017500000006722412643540060017761 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo/at DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/at.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = at.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bankinfoplugindir)" \ "$(DESTDIR)$(bankinfoplugindir)" LTLIBRARIES = $(bankinfoplugin_LTLIBRARIES) am__DEPENDENCIES_1 = at_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../generic/libbankinfo_generic.la $(am__DEPENDENCIES_1) am_at_la_OBJECTS = at.lo at_la_OBJECTS = $(am_at_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = at_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(at_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(at_la_SOURCES) DIST_SOURCES = $(at_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(bankinfoplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS = at_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES = at.la bankinfoplugin_DATA = at.xml at_la_SOURCES = at.c at_la_LIBADD = $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) at_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/at/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/at/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): at.xml: $(top_builddir)/config.status $(srcdir)/at.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-bankinfopluginLTLIBRARIES: $(bankinfoplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bankinfoplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bankinfoplugindir)"; \ } uninstall-bankinfopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bankinfoplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bankinfoplugindir)/$$f"; \ done clean-bankinfopluginLTLIBRARIES: -test -z "$(bankinfoplugin_LTLIBRARIES)" || rm -f $(bankinfoplugin_LTLIBRARIES) @list='$(bankinfoplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } at.la: $(at_la_OBJECTS) $(at_la_DEPENDENCIES) $(EXTRA_at_la_DEPENDENCIES) $(AM_V_CCLD)$(at_la_LINK) -rpath $(bankinfoplugindir) $(at_la_OBJECTS) $(at_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/at.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-bankinfopluginDATA: $(bankinfoplugin_DATA) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bankinfoplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bankinfoplugindir)" || exit $$?; \ done uninstall-bankinfopluginDATA: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bankinfoplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bankinfoplugindir)" "$(DESTDIR)$(bankinfoplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-bankinfopluginDATA \ install-bankinfopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-bankinfopluginDATA install-bankinfopluginLTLIBRARIES \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES sources: for f in $(at_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/at/at_p.h0000644000175000017500000000200612364015477017004 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_AT_P_H #define AQBANKING_BANKINFO_AT_P_H #include #include typedef struct AB_BANKINFO_PLUGIN_AT AB_BANKINFO_PLUGIN_AT; struct AB_BANKINFO_PLUGIN_AT { AB_BANKING *banking; }; static void GWENHYWFAR_CB AB_BankInfoPluginAT_FreeData(void *bp, void *p); static AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoAT_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_EXPORT GWEN_PLUGIN *bankinfo_at_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); #endif /* AQBANKING_BANKINFO_AT_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/at/Makefile.am0000644000175000017500000000106412364015477017747 00000000000000INCLUDES =-I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS=at_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES=at.la bankinfoplugin_DATA=at.xml at_la_SOURCES=at.c at_la_LIBADD=$(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) at_la_LDFLAGS= -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(at_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/at/at.xml.in0000644000175000017500000000042512364015477017446 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Bank info provider for Austria This plugin handles Austrian banks. aqbanking-5.6.4beta/src/plugins/bankinfo/generic/0000755000175000017500000000000012643540655017003 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/generic/generic_l.h0000644000175000017500000000140212364015477021017 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_GENERIC_L_H #define AQBANKING_BANKINFO_GENERIC_L_H #include #include AB_BANKINFO_PLUGIN *AB_BankInfoPluginGENERIC_new(AB_BANKING *ab, const char *country); #endif aqbanking-5.6.4beta/src/plugins/bankinfo/generic/generic.c0000644000175000017500000005061512364015477020511 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "generic_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC) AB_BANKINFO_PLUGIN *AB_BankInfoPluginGENERIC_new(AB_BANKING *ab, const char *country){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_GENERIC *bde; assert(country); bip=AB_BankInfoPlugin_new(country); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_GENERIC, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip, bde, AB_BankInfoPluginGENERIC_FreeData); bde->banking=ab; bde->country=strdup(country); AB_BankInfoPlugin_SetGetBankInfoFn(bip, AB_BankInfoPluginGENERIC_GetBankInfo); AB_BankInfoPlugin_SetGetBankInfoByTemplateFn(bip, AB_BankInfoPluginGENERIC_SearchbyTemplate); return bip; } void GWENHYWFAR_CB AB_BankInfoPluginGENERIC_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_GENERIC *bde; bde=(AB_BANKINFO_PLUGIN_GENERIC*)p; free(bde->country); if (bde->dataDir) free(bde->dataDir); GWEN_FREE_OBJECT(bde); } void AB_BankInfoPluginGENERIC__GetDataDir(AB_BANKINFO_PLUGIN *bip, GWEN_BUFFER *pbuf) { AB_BANKINFO_PLUGIN_GENERIC *bde; int gotit=0; assert(pbuf); assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); if (bde->dataDir) { gotit=1; GWEN_Buffer_AppendString(pbuf, bde->dataDir); } else { GWEN_STRINGLIST *sl; sl=AB_Banking_GetGlobalDataDirs(); if (sl) { GWEN_STRINGLISTENTRY *se; GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 256, 0, 1); se=GWEN_StringList_FirstEntry(sl); while(se) { FILE *f; const char *s; unsigned int pos; s=GWEN_StringListEntry_Data(se); GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, DIRSEP "aqbanking" DIRSEP "bankinfo" DIRSEP); GWEN_Buffer_AppendString(buf, bde->country); pos=GWEN_Buffer_GetPos(buf); GWEN_Buffer_AppendString(buf, DIRSEP); GWEN_Buffer_AppendString(buf, "banks.data"); f=fopen(GWEN_Buffer_GetStart(buf), "r"); if (f) { fclose(f); GWEN_Buffer_Crop(buf, 0, pos); bde->dataDir=strdup(GWEN_Buffer_GetStart(buf)); GWEN_Buffer_AppendBuffer(pbuf, buf); gotit=1; break; } GWEN_Buffer_Reset(buf); se=GWEN_StringListEntry_Next(se); } GWEN_Buffer_free(buf); } GWEN_StringList_free(sl); } assert(gotit); } AB_BANKINFO *AB_BankInfoPluginGENERIC__ReadBankInfo(AB_BANKINFO_PLUGIN *bip, const char *num){ AB_BANKINFO_PLUGIN_GENERIC *bde; GWEN_BUFFER *pbuf; AB_BANKINFO *bi; GWEN_DB_NODE *dbT; GWEN_SYNCIO *sio; uint32_t pos; int rv; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); /* get position */ assert(strlen(num)==8); if (1!=sscanf(num, "%08x", &pos)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid index"); return 0; } /* get path */ pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "banks.data"); sio=GWEN_SyncIo_File_new(GWEN_Buffer_GetStart(pbuf), GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); GWEN_Buffer_free(pbuf); return NULL; } /* seek position */ DBG_VERBOUS(0, "Seeking to %08x (%d)", pos, pos); if ((int64_t)-1==GWEN_SyncIo_File_Seek(sio, pos, GWEN_SyncIo_File_Whence_Set)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "seek(%s, %u): %s", GWEN_Buffer_GetStart(pbuf), pos, strerror(errno)); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return NULL; } /* read data */ dbT=GWEN_DB_Group_new("bank"); rv=GWEN_DB_ReadFromIo(dbT, sio, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP| GWEN_DB_FLAGS_UNTIL_EMPTY_LINE); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not load file \"%s\" (%d)", GWEN_Buffer_GetStart(pbuf), rv); GWEN_DB_Group_free(dbT); GWEN_Buffer_free(pbuf); return 0; } bi=AB_BankInfo_fromDb(dbT); assert(bi); GWEN_DB_Group_free(dbT); GWEN_Buffer_free(pbuf); return bi; } AB_BANKINFO *AB_BankInfoPluginGENERIC_GetBankInfo(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId){ return AB_BankInfoPluginGENERIC__SearchbyCode(bip, bankId); } AB_BANKINFO *AB_BankInfoPluginGENERIC__SearchbyCode(AB_BANKINFO_PLUGIN *bip, const char *bankId){ AB_BANKINFO_PLUGIN_GENERIC *bde; GWEN_BUFFER *pbuf; FILE *f; char lbuf[512]; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "blz.idx"); f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (!f) { DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_Buffer_free(pbuf); return 0; } while(!feof(f)) { unsigned char *p; lbuf[0]=0; p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f); if (p) { char *blz=0; char *num=0; unsigned int i; i=strlen(lbuf); if (lbuf[i-1]==10) lbuf[i-1]=0; blz=(char*)p; while(*p && *p!='\t') p++; assert(*p=='\t'); *p=0; p++; num=(char*)p; if (strcasecmp(blz, bankId)==0) { AB_BANKINFO *bi; bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num); fclose(f); GWEN_Buffer_free(pbuf); return bi; } } } fclose(f); DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bankId); return 0; } int AB_BankInfoPluginGENERIC__AddById(AB_BANKINFO_PLUGIN *bip, const char *bankId, AB_BANKINFO_LIST2 *bl){ AB_BANKINFO_PLUGIN_GENERIC *bde; GWEN_BUFFER *pbuf; FILE *f; char lbuf[512]; uint32_t count=0; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "blz.idx"); f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (!f) { DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_Buffer_free(pbuf); return GWEN_ERROR_NOT_AVAILABLE; } while(!feof(f)) { unsigned char *p; lbuf[0]=0; p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f); if (p) { char *blz=0; char *num=0; unsigned int i; i=strlen(lbuf); if (lbuf[i-1]==10) lbuf[i-1]=0; blz=(char*)p; while(*p && *p!='\t') p++; assert(*p=='\t'); *p=0; p++; num=(char*)p; i=strlen(lbuf); if (GWEN_Text_ComparePattern(blz, bankId, 0)!=-1) { AB_BANKINFO *bi; bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num); if (bi) { AB_BankInfo_List2_PushBack(bl, bi); count++; } } } } /* while ! feof */ fclose(f); if (!count) { DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bankId); return GWEN_ERROR_NOT_FOUND; } return 0; } int AB_BankInfoPluginGENERIC__AddByBic(AB_BANKINFO_PLUGIN *bip, const char *bic, AB_BANKINFO_LIST2 *bl){ AB_BANKINFO_PLUGIN_GENERIC *bde; GWEN_BUFFER *pbuf; FILE *f; char lbuf[512]; uint32_t count=0; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "bic.idx"); f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (!f) { DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_Buffer_free(pbuf); return GWEN_ERROR_NOT_AVAILABLE; } while(!feof(f)) { unsigned char *p; lbuf[0]=0; p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f); if (p) { char *key=0; char *num=0; unsigned int i; i=strlen(lbuf); if (lbuf[i-1]==10) lbuf[i-1]=0; key=(char*)p; while(*p && *p!='\t') p++; assert(*p=='\t'); *p=0; p++; num=(char*)p; if (GWEN_Text_ComparePattern(key, bic, 0)!=-1) { AB_BANKINFO *bi; bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num); if (bi) { AB_BankInfo_List2_PushBack(bl, bi); count++; } } } } /* while ! feof */ fclose(f); if (!count) { DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s not found", bic); return GWEN_ERROR_NOT_FOUND; } return 0; } int AB_BankInfoPluginGENERIC__AddByNameAndLoc(AB_BANKINFO_PLUGIN *bip, const char *name, const char *loc, AB_BANKINFO_LIST2 *bl){ AB_BANKINFO_PLUGIN_GENERIC *bde; GWEN_BUFFER *pbuf; FILE *f; char lbuf[512]; uint32_t count=0; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); if (name==0) name="*"; if (loc==0) loc="*"; pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "namloc.idx"); f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (!f) { DBG_INFO(AQBANKING_LOGDOMAIN, "fopen(%s): %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_Buffer_free(pbuf); DBG_ERROR(AQBANKING_LOGDOMAIN, "namloc index file not available"); return GWEN_ERROR_NOT_AVAILABLE; } while(!feof(f)) { unsigned char *p; lbuf[0]=0; p=(unsigned char*)fgets(lbuf, sizeof(lbuf), f); if (p) { char *key1=0; char *key2=0; char *num=0; unsigned int i; i=strlen(lbuf); if (lbuf[i-1]==10) lbuf[i-1]=0; key1=(char*)p; while(*p && *p!='\t') p++; assert(*p=='\t'); *p=0; p++; key2=/* GCC4 pointer-signedness fix: */ (char*) p; while(*p && *p!='\t') p++; assert(*p=='\t'); *p=0; p++; num=(char*)p; if (GWEN_Text_ComparePattern(key1, name, 0)!=-1 && GWEN_Text_ComparePattern(key2, loc, 0)!=-1) { AB_BANKINFO *bi; bi=AB_BankInfoPluginGENERIC__ReadBankInfo(bip, num); if (bi) { AB_BankInfo_List2_PushBack(bl, bi); count++; } } } } /* while ! feof */ fclose(f); if (!count) { DBG_INFO(AQBANKING_LOGDOMAIN, "Bank %s/%s not found", name, loc); return GWEN_ERROR_NOT_FOUND; } return 0; } int AB_BankInfoPluginGENERIC__CmpTemplate(AB_BANKINFO *bi, const AB_BANKINFO *tbi, uint32_t flags) { const char *s; const char *t; if (flags & AB_BANKINFO_GENERIC__FLAGS_BRANCHID) { s=AB_BankInfo_GetBranchId(bi); t=AB_BankInfo_GetBranchId(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_BANKID) { s=AB_BankInfo_GetBankId(bi); t=AB_BankInfo_GetBankId(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_BIC) { s=AB_BankInfo_GetBic(bi); t=AB_BankInfo_GetBic(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_BANKNAME) { s=AB_BankInfo_GetBankName(bi); t=AB_BankInfo_GetBankName(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_LOCATION) { s=AB_BankInfo_GetLocation(bi); t=AB_BankInfo_GetLocation(tbi); if (!t || !*t) t=AB_BankInfo_GetCity(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_ZIPCODE) { s=AB_BankInfo_GetZipcode(bi); t=AB_BankInfo_GetZipcode(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_REGION) { s=AB_BankInfo_GetRegion(bi); t=AB_BankInfo_GetRegion(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_PHONE) { s=AB_BankInfo_GetPhone(bi); t=AB_BankInfo_GetPhone(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_FAX) { s=AB_BankInfo_GetFax(bi); t=AB_BankInfo_GetFax(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_EMAIL) { s=AB_BankInfo_GetEmail(bi); t=AB_BankInfo_GetEmail(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } if (flags & AB_BANKINFO_GENERIC__FLAGS_WEBSITE) { s=AB_BankInfo_GetWebsite(bi); t=AB_BankInfo_GetWebsite(tbi); if (s && *s) if (GWEN_Text_ComparePattern(s, t, 0)==-1) return 0; } return 1; } int AB_BankInfoPluginGENERIC_AddByTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl, uint32_t flags){ AB_BANKINFO_PLUGIN_GENERIC *bde; uint32_t count=0; uint32_t i=0; GWEN_BUFFER *pbuf; uint32_t progressId; GWEN_SYNCIO *sio; int rv; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); /* get path */ pbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_BankInfoPluginGENERIC__GetDataDir(bip, pbuf); GWEN_Buffer_AppendString(pbuf, DIRSEP "banks.data"); /* open file */ sio=GWEN_SyncIo_File_new(GWEN_Buffer_GetStart(pbuf), GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); GWEN_Buffer_free(pbuf); return rv; } progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Scanning bank database..."), NULL, GWEN_GUI_PROGRESS_NONE, 0); for (;;) { GWEN_DB_NODE *dbT; AB_BANKINFO *bi; if (i & ~63) { if (GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_NONE)== GWEN_ERROR_USER_ABORTED) { DBG_INFO(GWEN_LOGDOMAIN, "User aborted"); GWEN_Gui_ProgressEnd(progressId); DBG_ERROR(AQBANKING_LOGDOMAIN, "Aborted by user"); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_Buffer_free(pbuf); return GWEN_ERROR_USER_ABORTED; } } dbT=GWEN_DB_Group_new("bank"); if (GWEN_DB_ReadFromIo(dbT, sio, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP | GWEN_DB_FLAGS_UNTIL_EMPTY_LINE)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not read from file \"%s\"", GWEN_Buffer_GetStart(pbuf)); GWEN_Gui_ProgressEnd(progressId); GWEN_DB_Group_free(dbT); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_Buffer_free(pbuf); return GWEN_ERROR_GENERIC; } bi=AB_BankInfo_fromDb(dbT); assert(bi); if (AB_BankInfoPluginGENERIC__CmpTemplate(bi, tbi, flags)==1) { count++; AB_BankInfo_List2_PushBack(bl, bi); } else { AB_BankInfo_free(bi); } GWEN_DB_Group_free(dbT); i++; } /* while */ GWEN_Gui_ProgressEnd(progressId); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_Buffer_free(pbuf); if (count==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No matching bank found"); return GWEN_ERROR_NOT_FOUND; } return 0; } int AB_BankInfoPluginGENERIC_SearchbyTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl){ AB_BANKINFO_PLUGIN_GENERIC *bde; uint32_t flags; int rv; const char *s; assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_GENERIC, bip); assert(bde); /* this is just to speed up often needed tests */ flags=0; s=AB_BankInfo_GetBranchId(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_BRANCHID; s=AB_BankInfo_GetBankId(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_BANKID; s=AB_BankInfo_GetBic(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_BIC; s=AB_BankInfo_GetBankName(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_BANKNAME; s=AB_BankInfo_GetLocation(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_LOCATION; s=AB_BankInfo_GetStreet(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_STREET; s=AB_BankInfo_GetZipcode(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_ZIPCODE; s=AB_BankInfo_GetCity(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_CITY; s=AB_BankInfo_GetRegion(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_REGION; s=AB_BankInfo_GetPhone(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_PHONE; s=AB_BankInfo_GetFax(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_FAX; s=AB_BankInfo_GetEmail(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_EMAIL; s=AB_BankInfo_GetWebsite(tbi); if (s && *s) flags|=AB_BANKINFO_GENERIC__FLAGS_WEBSITE; if (flags==AB_BANKINFO_GENERIC__FLAGS_BIC) rv=AB_BankInfoPluginGENERIC__AddByBic(bip, AB_BankInfo_GetBic(tbi), bl); else if ((flags & ~AB_BANKINFO_GENERIC__FLAGS_BRANCHID)== AB_BANKINFO_GENERIC__FLAGS_BANKID) rv=AB_BankInfoPluginGENERIC__AddById(bip, AB_BankInfo_GetBankId(tbi), bl); else if (flags==(AB_BANKINFO_GENERIC__FLAGS_BANKNAME| AB_BANKINFO_GENERIC__FLAGS_LOCATION) || flags==AB_BANKINFO_GENERIC__FLAGS_BANKNAME || flags==AB_BANKINFO_GENERIC__FLAGS_LOCATION) { rv=AB_BankInfoPluginGENERIC__AddByNameAndLoc(bip, AB_BankInfo_GetBankName(tbi), AB_BankInfo_GetLocation(tbi), bl); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No quick search implemented for these flags (%08x)", flags); rv=GWEN_ERROR_NOT_AVAILABLE; } if (rv==GWEN_ERROR_NOT_AVAILABLE) { rv=AB_BankInfoPluginGENERIC_AddByTemplate(bip, tbi, bl, flags); } return rv; } aqbanking-5.6.4beta/src/plugins/bankinfo/generic/kidaten.conf0000644000175000017500000000136012364015477021210 00000000000000# if 1 then values are quoted quote="0" int ignoreLines="4" # if 1 then a title line will be written containing the names of each # column title="0" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="xIdent" 2="bankId" 3="xType" 4="bankName" 5="street" 6="zipCode" 7="location" 8="xSitz" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/ca.tar.bz20000644000175000017500000000411412364015477020511 00000000000000BZh91AY&SYà4@Ð ÿ†ü°Zçÿâ?ïߢïÿú` ûm ÔR¤•% QMaJ"C("56S@ðƒ)“G¨zŒ†™™=C&#2da€a4Ðh2hÉÂhÉ‘„b„Ð`A dÉ£&C q£&FˆA€M“&Œ™ 0ŠB4A©ŠzmÊjj ô˜M#54h¢&”xSКi=*~™4iªiúdš†OÕ=M 7ª£ÐžÄú¿—ÝŽÓŒ¥0…X¹AláR¨sMøMj 3`w„ ¡M" Lfp`P©é=p@P’`€ìQCñ ~CRNè=éÔjLjq3`&M`fR• °q¨7Cu·Ìê/>Žm…¯ˆ¡Ã'°ÀCÈ“0î6g¯K ƒ ¹ºÔÜÝM\XáËàäCçxÎ{ðœB¶¨¯¯·¥î “ÔâÆñé'ÔÞÑø“RF+°ÔIÍ;7:]wC±ß ‚Þ@zÜÄ1(6Ã(œ‰‘4ŠTlÂ6/ \u6ùö†¥aæå q†Ø7ŽÒY9AÐ˸U_)ÿZZyŸ(òw8‘4ù¤qÅ‘¥‡]ì™ I¨uÉdBE ˜<î8‘DC€¬ž"¼ !+]£¬ãòÉ\ œ§ ݺŠ,·áÆðS€¦ßáç}æ%îqvµ6¿éioš;?­’‰´‚e$CªrƯ2ú°ÞjgR"73 ´?ï6â8&!´ù…C`˜Ý 0¢V-(QõIÜd~'Ìþ¦¯ˆˆFá/äÏ”ÌТHr:ìšé^׸Á÷”TàÈk’w¤´Š7 ӆɅD¢Sˆ ™~Tÿiåp_ziÍ ”ÅŠ^Ï% #óÐø›ž‡o™ú„^ɰˆž£¼M$èupèÅ2ú›ÍlÞñ,͆÷#+0ÀeÆ^}- ™xT&–um«˜Q' yL¸aäÛÊdïÐÜbùš”®™jrSY 9ÝÁ–#éØºG9T†äà[8Y6±µÜ›.0b ìn똓•ÔHÁÚß–þø#²˜Žoƒ ›p£ª÷½L¡4$…*,P†iµÏhÑé¶´{»ä‡S’þ(¾`!…{_OžˆR&L„„˜P¡BiP¢…Ejµ„9…sH4>Óp@£ÍŒhø¥æ‡Êû„˜˜I‰€.‡a&¤lu¾Ð•HºQ¶Œ¢%X@†ÝD¤¨„§ˆðd£!úϼïÄè>f§I‰0• …EjÕ¹u˜ƒÌ¦†°©!t—X¼å$©F£Ø6á€HD©¡! BDÄ,"µØn; #ÚBÖŽCHÐét TÔë*´7Ôn9Ó ^IÈT+F*h^R£ÿB¤Þ¡QCx@^Á0{ =µ¿­~ß (â°„ø=rMe(ü¾Ÿ“´QÓÐò<ý.@îD“€¸1}Ä›™ (T„‚B¥Üⶨ[¥ºñš–C´J™ƒ `ŸwᘙíÆi{d^!ö—ó†a@a›†Íï†çÏŸÜí üÅfæöï/5…Î×I‡U׈Új˹ÐÃÝgר+GÝôžxÒ-v|c‘o[ŽüMæ¶ÀÀ©7®ÌÔðEìµ@š§Kì°VE®íÙr%‰ Ç]›Q=fþú¢;¸¦ãXr¢ükJç  |Ît~+‚ô½­ñ·o¿n}œÊ¬ä'øusºaÑ P“»ûlEø•0XD†4 ý˜ eþÁYÌ,vxä“4*èmz˜ ƒ`^êPæPX!š‚~œaÑ5!›À¸ì#mtÁ³q§âf'"«SêÄórS¢*ahÌ „–ä0$€á¬Ræ3<D *­¹Ÿ³â‹t"ýB²…ÀCìçê®`p’Y ê€Á´¹V¢^ís …DÅ,nì ºqQèsº™T“ù"é #›™%3´,‡H¯Â1µS€ƒqx@t r !Cföô£‘0‘ÔVqe&ÞÒy¼Ã#¢ÌëìEß©‚ ƒ–zQSyE±>‰_A°Î+Ä0­Ð6Lk3ƒNDVd(Àý4Ba{ ’Mሲºñ…CÄ :h¼Np¨* "²ô…ã`fPà 'Ò+ÁTph>ò´!ë.y²Ì%Ò$(Z‹ BË[ŸµS é¡ñð ¹Ú$?¾ãq€`+‚Þ&Ãq2çÐÐFu;ÈEÍëEÌ~¡€÷'zà°i1‚HÚûÀZ´bä Y°(«–•Gq–:]ÆŠ¯w¬p(‰ Ž‚gÊ`T V? úÂóWl*Âë ”hîÖÚ‰%Ûs¹s²{|â¼Ôq h®ÎfÍÈgh†æFÒd7q®bÁÁ*HAd]4lÜèBUí03Ö¯Öë|†RÀ+à&bb…úFaµœÒL³YªXQ¯© ¯`­èºÎ`ô‘Ýî¢é˜ïŽ¢™Á àÑ:ÜÏpßט—‚!ÀW W$è ¯`­›î ¥¨ÄàãÕîd\Åiš.ñXòªø»’)„‡¢€aqbanking-5.6.4beta/src/plugins/bankinfo/generic/mkdeinfo.c0000644000175000017500000014631012364015477020667 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "../../../libs/aqbanking/types/bankinfo_l.h" #ifdef AQBANKING_WITH_PLUGIN_BACKEND_AQOFXCONNECT # include #endif #include #include #include #include #include #include #include #include #include #ifndef GWEN_DIR_SEPARATOR_S /* for gwenyhwfar < 2.5.4 */ # define GWEN_DIR_SEPARATOR '/' # define GWEN_DIR_SEPARATOR_S "/" #endif #define FUZZY_SHIFT 10 #define FUZZY_THRESHOLD 850 static AB_BANKINFO_LIST *bis=0; static GWEN_DB_NODE *dbIdx=0; int readCSVFile(const char *fname, const char *pname, GWEN_DB_NODE *db) { GWEN_DB_NODE *dbParams; dbParams=GWEN_DB_Group_new("params"); if (GWEN_DB_ReadFile(dbParams, pname, GWEN_DB_FLAGS_DEFAULT)) { DBG_ERROR(0, "Error reading profile file \"%s\"", pname); GWEN_DB_Group_free(dbParams); return -1; } if (GWEN_DB_ReadFileAs(db, fname, "csv", dbParams, GWEN_PATH_FLAGS_CREATE_GROUP)) { DBG_ERROR(0, "Error reading data file \"%s\"", fname); GWEN_DB_Group_free(dbParams); return -1; } GWEN_DB_Group_free(dbParams); return 0; } AB_BANKINFO *findBankInfo(AB_BANKINFO *bi, const char *blz, const char *location) { while(bi) { const char *lblz; const char *lloc; lblz=AB_BankInfo_GetBankId(bi); lloc=AB_BankInfo_GetLocation(bi); if (lblz && blz) { if (GWEN_Text_ComparePattern(lblz, blz, 0)!=-1) { if (!location || (location && lloc && GWEN_Text_ComparePattern(lloc, location, 0)!=-1)) break; } } bi=AB_BankInfo_List_Next(bi); } return bi; } AB_BANKINFO *findFirstBankInfo(const char *blz, const char *location) { AB_BANKINFO *bi; bi=AB_BankInfo_List_First(bis); return findBankInfo(bi, blz, location); } AB_BANKINFO *findNextBankInfo(AB_BANKINFO *bi, const char *blz, const char *location) { bi=AB_BankInfo_List_Next(bi); return findBankInfo(bi, blz, location); } void isoToUtf8(const char *p, int size, GWEN_BUFFER *buf) { while(*p) { unsigned int c; if (!size) break; c=(unsigned char)(*(p++)); switch(c) { case 0xc4: /* AE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x84); break; case 0xe4: /* ae */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa4); break; case 0xd6: /* OE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x96); break; case 0xf6: /* oe */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xb6); break; case 0xdc: /* UE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x9c); break; case 0xfc: /* ue */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xbc); break; case 0xdf: /* sz */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x9f); break; case 0xa7: /* section sign */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x67); break; /* english chars */ case 0xa3: /* pound swign */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x63); break; /* french chars */ case 0xc7: /* C cedille */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x87); break; case 0xe0: /* a accent grave */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa0); break; case 0xe1: /* a accent aigu */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa1); break; case 0xe2: /* a accent circumflex */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa2); break; case 0xe7: /* c cedille */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa7); break; case 0xe8: /* e accent grave */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa8); break; case 0xe9: /* e accent aigu */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xa9); break; case 0xea: /* e accent circumflex */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xaa); break; case 0xec: /* i accent grave (never heard of this) */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xac); break; case 0xed: /* i accent aigu (never heard of this, either) */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xad); break; case 0xee: /* i accent circumflex (never heard of this, either) */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xae); break; case 0xf2: /* o accent grave */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xb2); break; case 0xf3: /* o accent aigu */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xb3); break; case 0xf4: /* o accent circumflex */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xb4); break; case 0xf9: /* u accent grave */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xb9); break; case 0xfa: /* u accent aigu */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xba); break; case 0xfb: /* u accent circumflex */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0xbb); break; default: GWEN_Buffer_AppendByte(buf, c); } if (size!=-1) size--; } /* while */ } uint32_t _word_similarity(const char *a, const char *b){ uint32_t score = 0; size_t l = 0; while (*a && *b) { if (*a == *b) score += 1 << FUZZY_SHIFT; else if (*a == b[1]) { score += 1 << (FUZZY_SHIFT-2); b++; } else if (a[1] == *b) { score += 1 << (FUZZY_SHIFT-2); a++; l++; } a++; b++; l++; } if ('\0' != *a) l += strlen(a); return score / l; } int _is_ascii_alnum(unsigned char c) { return ((c>='A' || c<='Z') || (c>='a' || c<='z') || (c>='0' || c<='9') || c>=128); } GWEN_STRINGLIST *_make_word_list(const char *str) { GWEN_STRINGLIST *sl; sl=GWEN_StringList_new(); while(*str) { const char *p; size_t size; while (*str && !_is_ascii_alnum(*str)) str++; p=str; while (*str && _is_ascii_alnum(*str)) { str++; } size=(str-p); if (*p) { char *wptr; char *t; size_t i; wptr=(char*)malloc(size+1); t=wptr; for (i=0; i0)?(score/n):0; } uint32_t _find_score(GWEN_STRINGLIST *a, GWEN_STRINGLIST *b) { uint32_t score = 0; uint32_t n = 0; GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(a); while(se) { const char *p; n++; p=GWEN_StringListEntry_Data(se); assert(p); score+=_cmp_word_list(p, b); se=GWEN_StringListEntry_Next(se); } return (n>0)?(score/n):0; } uint32_t FuzzyCompare(const char *str1, const char *str2) { GWEN_STRINGLIST *a; GWEN_STRINGLIST *b; uint32_t score; a=_make_word_list(str1); b=_make_word_list(str2); score=(_find_score(a, b) + _find_score(b, a))/2; GWEN_StringList_free(b); GWEN_StringList_free(a); return score; } int readDBBFile(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading Deutsche Bundesbank file...\n"); if (readCSVFile(fname, "dbb.conf", dbData)) { DBG_ERROR(0, "Error reading DBB file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } fprintf(stdout, "Building database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; const char *lloc; lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); lloc=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (lloc && lblz && isdigit(*lblz)) { if (strcasecmp(lblz, "0")!=0) { AB_BANKINFO *bi; bi=AB_BankInfo_fromDb(dbT); assert(bi); AB_BankInfo_SetCity(bi, lloc); AB_BankInfo_List_Add(bi, bis); count++; } } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Found %d banks\n", count); return 0; } int readHBCIFile(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading HBCI file...\n"); if (readCSVFile(fname, "hbci.conf", dbData)) { DBG_ERROR(0, "Error reading HBCI file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } if (GWEN_DB_WriteFile(dbData, "out.conf", GWEN_DB_FLAGS_QUOTE_VALUES | \ GWEN_DB_FLAGS_WRITE_SUBGROUPS | \ GWEN_DB_FLAGS_INDEND | \ GWEN_DB_FLAGS_ADD_GROUP_NEWLINES | \ GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \ GWEN_DB_FLAGS_OMIT_TYPES)) { DBG_ERROR(0, "Error writing bank file"); return -1; } fprintf(stdout, "Updating database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; const char *lloc; lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); lloc=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (lblz && lloc) { AB_BANKINFO *bi; bi=findFirstBankInfo(lblz, lloc); while(bi) { const char *addr; const char *ver; count++; addr=GWEN_DB_GetCharValue(dbT, "hostName", 0, 0); if (addr==0) addr=GWEN_DB_GetCharValue(dbT, "hostIp", 0, 0); ver=GWEN_DB_GetCharValue(dbT, "hbciVersion", 0, 0); if (ver) { /* normalize version */ if (strcmp(ver, "2")==0 || strcmp(ver, "2.01")==0 || strcmp(ver, "2.0.1")==0) ver="2.01"; else if (strcmp(ver, "2.1")==0 || strcmp(ver, "2.10")==0 || strcmp(ver, "2.1.0")==0) ver="2.10"; else if (strcmp(ver, "2.2")==0 || strcmp(ver, "2.20")==0 || strcmp(ver, "2.2.0")==0) ver="2.20"; else if (strcmp(ver, "3")==0 || strcmp(ver, "3.0")==0 || strcmp(ver, "3.0.0")==0) ver="3.0"; else if (strcmp(ver, "4")==0 || strcmp(ver, "4.0")==0 || strcmp(ver, "4.0.0")==0) ver="3.0"; } if (addr) { const char *s; s=GWEN_DB_GetCharValue(dbT, "ddv", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "DDV"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if DDV */ s=GWEN_DB_GetCharValue(dbT, "rdh1", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH1"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH1 */ s=GWEN_DB_GetCharValue(dbT, "rdh2", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH2"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH2 */ s=GWEN_DB_GetCharValue(dbT, "rdh3", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH3"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH3 */ s=GWEN_DB_GetCharValue(dbT, "rdh4", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH4"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH4 */ s=GWEN_DB_GetCharValue(dbT, "rdh5", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH5"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH5 */ s=GWEN_DB_GetCharValue(dbT, "rdh6", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH6"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH6 */ s=GWEN_DB_GetCharValue(dbT, "rdh7", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH7"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH7 */ s=GWEN_DB_GetCharValue(dbT, "rdh8", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH8"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH8 */ s=GWEN_DB_GetCharValue(dbT, "rdh9", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH9"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH9 */ s=GWEN_DB_GetCharValue(dbT, "rdh10", 0, "nein"); if (strcasecmp(s, "ja")==0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, addr); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "RDH10"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* if RDH10 */ s=GWEN_DB_GetCharValue(dbT, "pinTanUrl", 0, 0); if (s && *s) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "HBCI"); AB_BankInfoService_SetAddress(sv, s); AB_BankInfoService_SetPversion(sv, ver); AB_BankInfoService_SetMode(sv, "PINTAN"); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } /* id PINTAN */ } /* if addr */ bi=findNextBankInfo(bi, lblz, lloc); } } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Updated %d banks\n", count); return 0; } int readATBLZFile(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading Austrian Bank file...\n"); if (readCSVFile(fname, "atblz.conf", dbData)) { DBG_ERROR(0, "Error reading ATBLZ file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } fprintf(stdout, "Building database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); if (lblz && isdigit(*lblz)) { if (strcasecmp(lblz, "0")!=0) { AB_BANKINFO *bi; bi=AB_BankInfo_fromDb(dbT); assert(bi); AB_BankInfo_List_Add(bi, bis); count++; } } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Found %d banks\n", count); return 0; } int readATBLZFile2(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading KIDATEN file...\n"); if (readCSVFile(fname, "kidaten.conf", dbData)) { DBG_ERROR(0, "Error reading KIDATEN file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } if (GWEN_DB_WriteFile(dbData, "out.conf", GWEN_DB_FLAGS_QUOTE_VALUES | \ GWEN_DB_FLAGS_WRITE_SUBGROUPS | \ GWEN_DB_FLAGS_INDEND | \ GWEN_DB_FLAGS_ADD_GROUP_NEWLINES | \ GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \ GWEN_DB_FLAGS_OMIT_TYPES)) { DBG_ERROR(0, "Error writing bank file"); return -1; } fprintf(stdout, "Updating database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; const char *lloc; lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); lloc=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (lblz && lloc) { AB_BANKINFO *bi; bi=findFirstBankInfo(lblz, 0); if (!bi) { /* new bank, add it */ bi=AB_BankInfo_fromDb(dbT); if (bi) { AB_BankInfo_List_Add(bi, bis); count++; } } /* if bank is new */ else { while(bi) { const char *s; s=GWEN_DB_GetCharValue(dbT, "bankName", 0, 0); if (s && *s) AB_BankInfo_SetBankName(bi, s); s=GWEN_DB_GetCharValue(dbT, "street", 0, 0); if (s && *s) AB_BankInfo_SetStreet(bi, s); s=GWEN_DB_GetCharValue(dbT, "zipCode", 0, 0); if (s && *s) AB_BankInfo_SetZipcode(bi, s); s=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (s && *s) { AB_BankInfo_SetLocation(bi, s); AB_BankInfo_SetCity(bi, s); } count++; bi=findNextBankInfo(bi, lblz, 0); } /* while bi */ } /* if bank already exists */ } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Updated %d banks\n", count); return 0; } int readFedAchDirFile(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading Federal Reserve Bank file...\n"); if (readCSVFile(fname, "fedachdir.conf", dbData)) { DBG_ERROR(0, "Error reading FedAchDir file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } fprintf(stdout, "Building database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; const char *lloc; int recType; recType=GWEN_DB_GetIntValue(dbT, "xRecordType", 0, 1); if (recType==2) lblz=GWEN_DB_GetCharValue(dbT, "xNewBankId", 0, 0); else lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); lloc=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (lloc && lblz && isdigit(*lblz)) { AB_BANKINFO *bi; GWEN_BUFFER *tbuf; const char *s; /* compose phone number */ tbuf=GWEN_Buffer_new(0, 32, 0, 1); s=GWEN_DB_GetCharValue(dbT, "xPhoneAreaCode", 0, 0); if (s) { GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendByte(tbuf, '-'); } s=GWEN_DB_GetCharValue(dbT, "xPhonePrefix", 0, 0); if (s) GWEN_Buffer_AppendString(tbuf, s); s=GWEN_DB_GetCharValue(dbT, "xPhoneSuffix", 0, 0); if (s) GWEN_Buffer_AppendString(tbuf, s); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "phone", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* compose zipcode */ s=GWEN_DB_GetCharValue(dbT, "xZipCode", 0, 0); if (s) { GWEN_Buffer_AppendString(tbuf, s); s=GWEN_DB_GetCharValue(dbT, "xZipExt", 0, 0); if (s) { GWEN_Buffer_AppendByte(tbuf, '-'); GWEN_Buffer_AppendString(tbuf, s); } GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "zipCode", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } bi=AB_BankInfo_fromDb(dbT); assert(bi); AB_BankInfo_SetBankId(bi, lblz); AB_BankInfo_SetCity(bi, lloc); AB_BankInfo_List_Add(bi, bis); GWEN_Buffer_free(tbuf); count++; } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Found %d banks\n", count); return 0; } const char *readCharValueXml(GWEN_XMLNODE *n, const char *name, GWEN_BUFFER *dbuf) { GWEN_XMLNODE *nn; GWEN_Buffer_Reset(dbuf); nn=GWEN_XMLNode_FindFirstTag(n, name, 0, 0); if (nn) { int err; GWEN_BUFFER *tbuf; uint32_t len; tbuf=GWEN_Buffer_new(0, 256, 0, 1); err=GWEN_XMLNode_toBuffer(nn, tbuf, GWEN_XML_FLAGS_SIMPLE); if (err<0) { DBG_INFO(0, "here (%d)", err); GWEN_Buffer_free(tbuf); return NULL; } len=GWEN_Buffer_GetUsedBytes(tbuf); if (len) { len--; GWEN_Buffer_Crop(tbuf, 0, len); } if (GWEN_Text_UnescapeXmlToBuffer(GWEN_Buffer_GetStart(tbuf), dbuf)) { DBG_ERROR(0, "Error decoding XML buffer"); GWEN_Buffer_free(tbuf); return 0; } GWEN_Buffer_free(tbuf); return GWEN_Buffer_GetStart(dbuf); } return 0; } int readMSMFiles(const char *path, const char *ifname, const char *country) { GWEN_BUFFER *pbuf; GWEN_BUFFER *dbuf; uint32_t pos; GWEN_XMLNODE *nBanks; GWEN_XMLNODE *n; int updateCount=0; fprintf(stdout, "Reading GnuCash bank files...\n"); dbuf=GWEN_Buffer_new(0, 256, 0, 1); pbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(pbuf, path); GWEN_Buffer_AppendByte(pbuf, GWEN_DIR_SEPARATOR); pos=GWEN_Buffer_GetPos(pbuf); GWEN_Buffer_AppendString(pbuf, ifname); nBanks=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "banks"); if (GWEN_XML_ReadFile(nBanks, GWEN_Buffer_GetStart(pbuf), GWEN_XML_FLAGS_DEFAULT)) { DBG_ERROR(0, "Error reading file \"%s\"", GWEN_Buffer_GetStart(pbuf)); GWEN_XMLNode_free(nBanks); return -1; } GWEN_Buffer_Crop(pbuf, 0, pos); n=GWEN_XMLNode_FindFirstTag(nBanks, "fil", 0, 0); if (n) n=GWEN_XMLNode_FindFirstTag(n, "fi", 0, 0); while(n) { GWEN_XMLNODE *nProvider; nProvider=GWEN_XMLNode_FindFirstTag(n, "prov", 0, 0); if (nProvider) { const char *guid; //int isCross=0; guid=GWEN_XMLNode_GetCharValue(nProvider, "CrossRefGuid", 0); if (!guid || !*guid) guid=GWEN_XMLNode_GetCharValue(nProvider, "guid", 0); else { //isCross=1; } if (guid) { FILE *f; GWEN_Buffer_AppendString(pbuf, "/fi/"); GWEN_Buffer_AppendString(pbuf, guid); GWEN_Buffer_AppendString(pbuf, ".xml"); /*fprintf(stderr, "Reading file \"%s\"\n", GWEN_Buffer_GetStart(pbuf));*/ f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (f) { GWEN_XMLNODE *nBank; GWEN_XMLNODE *b; fclose(f); nBank=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "bank"); if (GWEN_XML_ReadFile(nBank, GWEN_Buffer_GetStart(pbuf), GWEN_XML_FLAGS_DEFAULT)) { DBG_ERROR(0, "Error reading bank file \"%s\"", GWEN_Buffer_GetStart(pbuf)); GWEN_XMLNode_free(nBank); GWEN_XMLNode_free(nBanks); return -1; } b=GWEN_XMLNode_FindFirstTag(nBank, "MSNOnlSvcInfo", 0, 0); if (b) b=GWEN_XMLNode_FindFirstTag(b, "ProviderSettings", 0, 0); if (b) { const char *s; int i; uint32_t uflags; uflags=0; i=GWEN_XMLNode_GetIntValue(b, "AcctListAvail", 0); #ifdef AQBANKING_WITH_PLUGIN_BACKEND_AQOFXCONNECT if (i>0) uflags|=AO_USER_FLAGS_ACCOUNT_LIST; #endif s=readCharValueXml(b, "country", dbuf); if (s && *s) { if (strcasecmp(s, "USA")==0 || strcasecmp(s, "US")==0 || strcasecmp(s, "Uni")==0 || strcasecmp(s, "United States")==0) s="us"; else if (strcasecmp(s, "CAN")==0 || strcasecmp(s, "CA")==0 || strcasecmp(s, "Canada")==0) s="ca"; else { DBG_ERROR(0, "Unknown country \"%s\" in bank \"%s\"", s, guid); GWEN_XMLNode_free(nBank); GWEN_XMLNode_free(nBanks); return -1; } } else { /*fprintf(stderr, "No country in bank \"%s\", ignoring\n", guid);*/ /* assume us */ s="us"; } if (strcasecmp(s, country)==0) { AB_BANKINFO *bi; const char *zipCode; const char *name; int addIt=1; bi=AB_BankInfo_new(); AB_BankInfo_SetCountry(bi, s); s=readCharValueXml(nProvider, "name", dbuf); if (s && *s) AB_BankInfo_SetBankName(bi, s); else { DBG_ERROR(0, "No name in bank \"%s\"", guid); GWEN_XMLNode_free(nBank); GWEN_XMLNode_free(nBanks); return -1; } s=readCharValueXml(b, "city", dbuf); if (s && *s) { AB_BankInfo_SetLocation(bi, s); AB_BankInfo_SetCity(bi, s); } s=readCharValueXml(b, "address1", dbuf); if (s && *s) AB_BankInfo_SetStreet(bi, s); s=readCharValueXml(b, "zip", dbuf); if (s && *s) AB_BankInfo_SetZipcode(bi, s); s=readCharValueXml(b, "phone", dbuf); if (s && *s) AB_BankInfo_SetPhone(bi, s); s=readCharValueXml(b, "InternetMail", dbuf); if (s && *s) AB_BankInfo_SetEmail(bi, s); s=readCharValueXml(b, "website1", dbuf); if (s && *s) AB_BankInfo_SetWebsite(bi, s); s=readCharValueXml(b, "driverType", dbuf); if (s && strcasecmp(s, "O")==0) { const char *pver; const char *server; pver=GWEN_XMLNode_GetCharValue(b, "OFXHeaderVer", 0); server=readCharValueXml(b, "ProviderUrl", dbuf); if (pver && *pver && server && *server && strcasecmp(server, "http://moneycentral.msn.com/cust404.htm")!=0) { AB_BANKINFO_SERVICE *sv; sv=AB_BankInfoService_new(); AB_BankInfoService_SetType(sv, "OFX"); AB_BankInfoService_SetAddress(sv, server); AB_BankInfoService_SetPversion(sv, pver); s=readCharValueXml(b, "fid", dbuf); if (s && *s) AB_BankInfoService_SetAux1(sv, s); s=readCharValueXml(b, "org", dbuf); if (s && *s) AB_BankInfoService_SetAux2(sv, s); AB_BankInfoService_List_Add(sv, AB_BankInfo_GetServices(bi)); } } name=AB_BankInfo_GetBankName(bi); zipCode=AB_BankInfo_GetZipcode(bi); if (name && *name && zipCode && *zipCode) { AB_BANKINFO *tbi; char zbuf[32]; const char *x; char *y; /* make compact zip code */ assert(strlen(zipCode)FUZZY_THRESHOLD) { fprintf(stderr, "Updating existing entry for \"%s\" " "(%u)\n", lname, v); break; } } } } tbi=AB_BankInfo_List_Next(tbi); } /* while existing entries */ if (tbi) { const char *s1, *s2; /* merge in new info */ s1=AB_BankInfo_GetEmail(bi); s2=AB_BankInfo_GetEmail(tbi); if ((s1 && *s1) && (!s2 || !*s2)) AB_BankInfo_SetEmail(tbi, s1); s1=AB_BankInfo_GetWebsite(bi); s2=AB_BankInfo_GetWebsite(tbi); if ((s1 && *s1) && (!s2 || !*s2)) AB_BankInfo_SetWebsite(tbi, s1); /* move new service entries to end of existing ones */ AB_BankInfoService_List_AddList(AB_BankInfo_GetServices(tbi), AB_BankInfo_GetServices(bi)); addIt=0; } } if (addIt) AB_BankInfo_List_Add(bi, bis); else { AB_BankInfo_free(bi); updateCount++; } } /* if matching country */ } /* if provider */ else { fprintf(stderr, "File \"%s\" does not contain bank descriptions\n", GWEN_Buffer_GetStart(pbuf)); } GWEN_XMLNode_free(nBank); } /* if provider file exists */ else { fprintf(stderr, "Provider file for bank \"%s\" not found\n", guid); } GWEN_Buffer_Crop(pbuf, 0, pos); } /* if guid */ else { fprintf(stderr, "File does not contain a GUID\n"); } } else { fprintf(stderr, "File does not contain bank info.\n"); } n=GWEN_XMLNode_FindNextTag(n, "fi", 0, 0); } fprintf(stdout, "%d banks updated.\n", updateCount); return 0; } int readBcFile(const char *fname) { GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbT; int count=0; dbData=GWEN_DB_Group_new("data"); fprintf(stdout, "Reading BC Bankenstamm file...\n"); if (readCSVFile(fname, "bcbankenstamm.conf", dbData)) { DBG_ERROR(0, "Error reading BC Bankenstamm file \"%s\"", fname); GWEN_DB_Group_free(dbData); return -1; } if (GWEN_DB_WriteFile(dbData, "out.conf", GWEN_DB_FLAGS_QUOTE_VALUES | \ GWEN_DB_FLAGS_WRITE_SUBGROUPS | \ GWEN_DB_FLAGS_INDEND | \ GWEN_DB_FLAGS_ADD_GROUP_NEWLINES | \ GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \ GWEN_DB_FLAGS_OMIT_TYPES)) { DBG_ERROR(0, "Error writing bank file"); return -1; } fprintf(stdout, "Building database...\n"); dbT=GWEN_DB_FindFirstGroup(dbData, "bank"); while(dbT) { const char *lblz; const char *lloc; lblz=GWEN_DB_GetCharValue(dbT, "xNewBankId", 0, 0); if (!lblz || !*lblz) lblz=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); lloc=GWEN_DB_GetCharValue(dbT, "location", 0, 0); if (lloc && *lloc && lblz && isdigit(*lblz)) { AB_BANKINFO *bi; GWEN_BUFFER *tbuf; const char *s; /* compose phone number */ tbuf=GWEN_Buffer_new(0, 32, 0, 1); s=GWEN_DB_GetCharValue(dbT, "xCountryPrefix", 0, 0); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendByte(tbuf, '-'); } s=GWEN_DB_GetCharValue(dbT, "xPhone", 0, 0); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "phone", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* compose fax number */ s=GWEN_DB_GetCharValue(dbT, "xCountryPrefix", 0, 0); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendByte(tbuf, '-'); } s=GWEN_DB_GetCharValue(dbT, "xFax", 0, 0); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "fax", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* compose bank code */ s=GWEN_DB_GetCharValue(dbT, "xNewBankId", 0, 0); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); /* GWEN_Buffer_AppendString(tbuf, "0000"); */ GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankId", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } else { s=GWEN_DB_GetCharValue(dbT, "bankId", 0, 0); assert(s); GWEN_Buffer_AppendString(tbuf, s); /* s=GWEN_DB_GetCharValue(dbT, "xFilialId", 0, 0); if (s) GWEN_Buffer_AppendString(tbuf, s); */ GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankId", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } bi=AB_BankInfo_fromDb(dbT); assert(bi); AB_BankInfo_SetCity(bi, lloc); AB_BankInfo_List_Add(bi, bis); GWEN_Buffer_free(tbuf); count++; } dbT=GWEN_DB_FindNextGroup(dbT, "bank"); } GWEN_DB_Group_free(dbData); fprintf(stdout, "Found %d banks\n", count); return 0; } int makeIndexBlz(const char *fname) { AB_BANKINFO *bi; FILE *f; uint32_t count=0; f=fopen(fname, "w+"); if (!f) { DBG_ERROR(0, "Error creating file \"%s\"", fname); return -1; } bi=AB_BankInfo_List_First(bis); while(bi) { uint32_t pos; const char *s; char numbuf[32]; count++; s=AB_BankInfo_GetBankId(bi); if (s) { snprintf(numbuf, sizeof(numbuf), "%08x", count); pos=(uint32_t)GWEN_DB_GetIntValue(dbIdx, numbuf, 0, 0); if (pos==0 && count!=1) { DBG_ERROR(0, "No index given for \"%s\" (%d)", numbuf, count); fclose(f); return -1; } fprintf(f, "%s\t%08x\n", s, pos); } bi=AB_BankInfo_List_Next(bi); } if (fclose(f)) { DBG_ERROR(0, "Error closing file \"%s\"", fname); return -1; } return 0; } int makeIndexBic(const char *fname) { AB_BANKINFO *bi; FILE *f; uint32_t count=0; f=fopen(fname, "w+"); if (!f) { DBG_ERROR(0, "Error creating file \"%s\"", fname); return -1; } bi=AB_BankInfo_List_First(bis); while(bi) { const char *s; count++; s=AB_BankInfo_GetBic(bi); if (s && *s) { uint32_t pos; char numbuf[32]; snprintf(numbuf, sizeof(numbuf), "%08x", count); pos=(uint32_t)GWEN_DB_GetIntValue(dbIdx, numbuf, 0, 0); if (pos==0 && count!=1) { DBG_ERROR(0, "No index given for \"%s\" (%d)", numbuf, count); fclose(f); return -1; } fprintf(f, "%s\t%08x\n", s, pos); } bi=AB_BankInfo_List_Next(bi); } if (fclose(f)) { DBG_ERROR(0, "Error closing file \"%s\"", fname); return -1; } return 0; } int makeIndexNameAndLoc(const char *fname) { AB_BANKINFO *bi; FILE *f; uint32_t count=0; f=fopen(fname, "w+"); if (!f) { DBG_ERROR(0, "Error creating file \"%s\"", fname); return -1; } bi=AB_BankInfo_List_First(bis); while(bi) { const char *name; const char *loc; count++; name=AB_BankInfo_GetBankName(bi); loc=AB_BankInfo_GetLocation(bi); if (name && *name && loc && *loc) { uint32_t pos; char numbuf[32]; snprintf(numbuf, sizeof(numbuf), "%08x", count); pos=(uint32_t)GWEN_DB_GetIntValue(dbIdx, numbuf, 0, 0); if (pos==0 && count!=1) { DBG_ERROR(0, "No index given for \"%s\" (%d)", numbuf, count); fclose(f); return -1; } fprintf(f, "%s\t%s\t%08x\n", name, loc, pos); } bi=AB_BankInfo_List_Next(bi); } if (fclose(f)) { DBG_ERROR(0, "Error closing file \"%s\"", fname); return -1; } return 0; } int saveBankInfos(const char *path) { AB_BANKINFO *bi; uint32_t count=0; GWEN_BUFFER *xbuf; GWEN_SYNCIO *sio; int rv; GWEN_FAST_BUFFER *fb; fprintf(stdout, "Saving database...\n"); sio=GWEN_SyncIo_File_new(path, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } fb=GWEN_FastBuffer_new(512, sio); GWEN_FASTBUFFER_WRITELINE(fb, rv, "# This is an automatically created file"); if (rv>=0) { GWEN_FASTBUFFER_WRITELINE(fb, rv, "# All banks are separated by newlines"); } if (rv>=0) { GWEN_FASTBUFFER_WRITELINE(fb, rv, "# Please do not modify this file, " "the index files rely on exact positions."); } if (rv<0) { DBG_INFO(0, "here (%d)", rv); DBG_ERROR(0, "Error writing bank file \"%s\"", path); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return -1; } xbuf=GWEN_Buffer_new(0, 256, 0, 1); bi=AB_BankInfo_List_First(bis); while(bi) { const char *s; GWEN_DB_NODE *dbT; uint32_t pos; char numbuf[32]; count++; /* some conversions to UTF8 */ s=AB_BankInfo_GetBankName(bi); assert(s); isoToUtf8(s, strlen(s), xbuf); AB_BankInfo_SetBankName(bi, GWEN_Buffer_GetStart(xbuf)); GWEN_Buffer_Reset(xbuf); s=AB_BankInfo_GetLocation(bi); if (s) { isoToUtf8(s, strlen(s), xbuf); AB_BankInfo_SetLocation(bi, GWEN_Buffer_GetStart(xbuf)); AB_BankInfo_SetCity(bi, GWEN_Buffer_GetStart(xbuf)); GWEN_Buffer_Reset(xbuf); } /* create DB */ dbT=GWEN_DB_Group_new("bank"); AB_BankInfo_toDb(bi, dbT); pos=GWEN_FastBuffer_GetBytesWritten(fb); snprintf(numbuf, sizeof(numbuf), "%08x", count); GWEN_DB_SetIntValue(dbIdx, GWEN_PATH_FLAGS_CREATE_VAR, numbuf, pos); if (GWEN_DB_WriteToFastBuffer(dbT, fb, GWEN_DB_FLAGS_QUOTE_VALUES | \ GWEN_DB_FLAGS_WRITE_SUBGROUPS | \ GWEN_DB_FLAGS_INDEND | \ GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \ GWEN_DB_FLAGS_OMIT_TYPES)) { DBG_ERROR(0, "Error writing bank file \"%s\"", path); GWEN_DB_Group_free(dbT); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return -1; } GWEN_FASTBUFFER_WRITELINE(fb, rv, ""); if (rv<0) { DBG_ERROR_ERR(0, rv); DBG_ERROR(0, "Error writing bank file \"%s\"", path); GWEN_DB_Group_free(dbT); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_DB_Group_free(dbT); if (count & ~31) { fprintf(stdout, "%u\r", count); } bi=AB_BankInfo_List_Next(bi); } /* while bi */ /* flush fast buffer */ GWEN_FASTBUFFER_FLUSH(fb, rv); if (rv<0) { DBG_ERROR(0, "Error closing bank file \"%s\" (%d)", path, rv); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_FastBuffer_free(fb); /* flush and close io */ rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_ERROR(0, "Error closing bank file \"%s\" (%d)", path, rv); GWEN_FastBuffer_free(fb); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_free(sio); fprintf(stdout, " Written %d banks.\n", count); return 0; } int makeBankInfos(const char *path) { AB_BANKINFO *bi; uint32_t count=0; char numbuf[32]; GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 256, 0, 1); bi=AB_BankInfo_List_First(bis); while(bi) { GWEN_DB_NODE *dbT; count++; /* create path */ GWEN_Buffer_AppendString(dbuf, path); GWEN_Buffer_AppendString(dbuf, GWEN_DIR_SEPARATOR_S "banks" GWEN_DIR_SEPARATOR_S); snprintf(numbuf, sizeof(numbuf), "%04x", count); GWEN_Buffer_AppendBytes(dbuf, numbuf, 2); if (GWEN_Directory_GetPath(GWEN_Buffer_GetStart(dbuf), GWEN_PATH_FLAGS_CHECKROOT | GWEN_DIR_FLAGS_PUBLIC_PATH | GWEN_DIR_FLAGS_PUBLIC_NAME)) { DBG_ERROR(0, "Error creating path \"%s\"", GWEN_Buffer_GetStart(dbuf)); /* GWEN_DB_Group_free(dbT); -- not yet initialized */ GWEN_Buffer_free(dbuf); return -1; } GWEN_Buffer_AppendByte(dbuf, GWEN_DIR_SEPARATOR); GWEN_Buffer_AppendBytes(dbuf, numbuf+2, 2); GWEN_Buffer_AppendString(dbuf, ".bank"); /* create DB */ dbT=GWEN_DB_Group_new("bank"); AB_BankInfo_toDb(bi, dbT); /* write file */ if (GWEN_DB_WriteFile(dbT, GWEN_Buffer_GetStart(dbuf), GWEN_DB_FLAGS_QUOTE_VALUES | \ GWEN_DB_FLAGS_WRITE_SUBGROUPS | \ GWEN_DB_FLAGS_INDEND | \ GWEN_DB_FLAGS_ADD_GROUP_NEWLINES | \ GWEN_DB_FLAGS_ESCAPE_CHARVALUES | \ GWEN_DB_FLAGS_OMIT_TYPES)) { DBG_ERROR(0, "Error writing bank file \"%s\"", GWEN_Buffer_GetStart(dbuf)); GWEN_DB_Group_free(dbT); GWEN_Buffer_free(dbuf); return -1; } #ifndef OS_WIN32 if (chmod(GWEN_Buffer_GetStart(dbuf), S_IRUSR | S_IWUSR # ifdef S_IRGRP | S_IRGRP # endif # ifdef S_IROTH | S_IROTH # endif )) { DBG_ERROR(0, "chmod(%s): %s", GWEN_Buffer_GetStart(dbuf), strerror(errno)); GWEN_DB_Group_free(dbT); GWEN_Buffer_free(dbuf); return -1; } #endif GWEN_Buffer_Reset(dbuf); GWEN_DB_Group_free(dbT); bi=AB_BankInfo_List_Next(bi); } fprintf(stdout, " Written %d banks\n", count); return 0; } int loadBanks(const char *fname, AB_BANKINFO_LIST *biList) { uint32_t count=0; GWEN_SYNCIO *sio; GWEN_FAST_BUFFER *fb; int rv; fprintf(stdout, "Loading database, this will take a few minutes ...\n"); sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } fb=GWEN_FastBuffer_new(512, sio); for(;;) { GWEN_DB_NODE *dbT; AB_BANKINFO *bi; int pos; char numbuf[32]; int rv; dbT=GWEN_DB_Group_new("bank"); pos=GWEN_FastBuffer_GetBytesRead(fb); rv=GWEN_DB_ReadFromFastBuffer(dbT, fb, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP| GWEN_DB_FLAGS_UNTIL_EMPTY_LINE); if (rv<0) { if (rv==GWEN_ERROR_EOF) break; DBG_ERROR(0, "Could not load file \"%s\" (%d)", fname, rv); GWEN_DB_Group_free(dbT); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return -1; } bi=AB_BankInfo_fromDb(dbT); assert(bi); AB_BankInfo_List_Add(bi, biList); GWEN_DB_Group_free(dbT); count++; snprintf(numbuf, sizeof(numbuf), "%08x", count); GWEN_DB_SetIntValue(dbIdx, GWEN_DB_FLAGS_OVERWRITE_VARS, numbuf, pos); if (count & ~31) { fprintf(stdout, "%u\r", count); } } /* while */ fprintf(stdout, "\n"); fprintf(stdout, " Read %d banks.\n", count); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } int main(int argc, char **argv) { if (argc<2) { fprintf(stderr, "Usage:\n" "%s COMMAND\n", argv[0]); return 1; } if (strcasecmp(argv[1], "build")==0) { const char *dbbFile, *hbciFile, *dstFile; if (argc<5) { fprintf(stderr, "Usage:\n" "%s build DBB-file HBCI-file DESTFILE\n", argv[0]); return 1; } dbbFile=argv[2]; hbciFile=argv[3]; dstFile=argv[4]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (readDBBFile(dbbFile)) { DBG_ERROR(0, "Error."); return 2; } if (readHBCIFile(hbciFile)) { DBG_ERROR(0, "Error."); return 2; } if (saveBankInfos(dstFile)) { return 3; } } else if (strcasecmp(argv[1], "build-at")==0) { const char *blzFile; const char *dstFile; if (argc<4) { fprintf(stderr, "Usage:\n" "%s build-at BLZ-file DESTFILE\n", argv[0]); return 1; } blzFile=argv[2]; dstFile=argv[3]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (readATBLZFile(blzFile)) { DBG_ERROR(0, "Error."); return 2; } if (saveBankInfos(dstFile)) { return 3; } } else if (strcasecmp(argv[1], "build-ch")==0) { const char *blzFile, *dstFile; if (argc<4) { fprintf(stderr, "Usage:\n" "%s build-ch BLZ-file DESTFILE\n", argv[0]); return 1; } blzFile=argv[2]; dstFile=argv[3]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (readBcFile(blzFile)) { DBG_ERROR(0, "Error."); return 2; } if (saveBankInfos(dstFile)) { return 3; } } else if (strcasecmp(argv[1], "build-am")==0) { const char *path, *country, *src2File, *dstFile; if (argc<6) { fprintf(stderr, "Usage:\n" "%s build-am SRCPATH COUNTRY FEDACHDIRFILE DESTFILE\n", argv[0]); return 1; } path=argv[2]; country=argv[3]; src2File=argv[4]; dstFile=argv[5]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (strcasecmp(country, "us")==0) { if (readFedAchDirFile(src2File)) { return 3; } } if (readMSMFiles(path, "bank.xml", country)) { DBG_ERROR(0, "Error."); return 2; } if (readMSMFiles(path, "creditcard.xml", country)) { DBG_ERROR(0, "Error."); return 2; } if (readMSMFiles(path, "brokerage.xml", country)) { DBG_ERROR(0, "Error."); return 2; } if (saveBankInfos(dstFile)) { return 3; } } else if (strcasecmp(argv[1], "install")==0) { const char *path; const char *srcFile; GWEN_BUFFER *dbuf; uint32_t pos; if (argc<4) { fprintf(stderr, "Usage:\n" "%s install SRCFILE DESTDIR\n", argv[0]); return 1; } srcFile=argv[2]; path=argv[3]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (loadBanks(srcFile, bis)) { fprintf(stderr, "Error loading data file.\n"); return 2; } fprintf(stdout, "Writing database and index files to %s, " "this will take a few minutes ...\n", path); dbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(dbuf, path); GWEN_Buffer_AppendByte(dbuf, GWEN_DIR_SEPARATOR); pos=GWEN_Buffer_GetPos(dbuf); GWEN_Buffer_AppendString(dbuf, "banks.data"); if (saveBankInfos(GWEN_Buffer_GetStart(dbuf))) { fprintf(stderr, "Error saving data files.\n"); return 3; } GWEN_Buffer_Crop(dbuf, 0, pos); fprintf(stdout, "- writing BLZ index...\n"); GWEN_Buffer_AppendString(dbuf, "blz.idx"); if (makeIndexBlz(GWEN_Buffer_GetStart(dbuf))) { fprintf(stderr, "Error saving index file.\n"); GWEN_Buffer_free(dbuf); return 3; } GWEN_Buffer_Crop(dbuf, 0, pos); fprintf(stdout, "- writing BIC index...\n"); GWEN_Buffer_AppendString(dbuf, "bic.idx"); if (makeIndexBic(GWEN_Buffer_GetStart(dbuf))) { fprintf(stderr, "Error saving index file.\n"); GWEN_Buffer_free(dbuf); return 3; } GWEN_Buffer_Crop(dbuf, 0, pos); fprintf(stdout, "- writing NAMLOC index...\n"); GWEN_Buffer_AppendString(dbuf, "namloc.idx"); if (makeIndexNameAndLoc(GWEN_Buffer_GetStart(dbuf))) { fprintf(stderr, "Error saving index file.\n"); GWEN_Buffer_free(dbuf); return 3; } GWEN_Buffer_free(dbuf); } else if (strcasecmp(argv[1], "update")==0) { const char *srcFile1; const char *srcFile2; const char *destFile; AB_BANKINFO_LIST *updBis; AB_BANKINFO *curBi; if (argc<5) { fprintf(stderr, "Usage:\n" "%s update SRCFILE UPDATEFILE DESTFILE\n", argv[0]); return 1; } srcFile1=argv[2]; srcFile2=argv[3]; destFile=argv[4]; dbIdx=GWEN_DB_Group_new("indexList"); bis=AB_BankInfo_List_new(); updBis=AB_BankInfo_List_new(); if (loadBanks(srcFile1, bis)) { fprintf(stderr, "Error loading data file.\n"); return 2; } if (loadBanks(srcFile2, updBis)) { fprintf(stderr, "Error loading update data file.\n"); return 2; } curBi=AB_BankInfo_List_First(updBis); while(curBi) { const char *bankId; bankId=AB_BankInfo_GetBankId(curBi); if (bankId) { AB_BANKINFO *origBi; origBi=AB_BankInfo_List_First(bis); while(origBi) { const char *s; s=AB_BankInfo_GetBankId(origBi); if (s && strcasecmp(s, bankId)==0) break; origBi=AB_BankInfo_List_Next(origBi); } if (origBi) { /* replace original */ AB_BankInfo_List_Del(origBi); AB_BankInfo_free(origBi); origBi=AB_BankInfo_dup(curBi); AB_BankInfo_List_Add(origBi, bis); } } curBi=AB_BankInfo_List_Next(curBi); } if (saveBankInfos(destFile)) { return 3; } } else if (strcasecmp(argv[1], "debug")==0) { const char *bankFile; if (argc<3) { fprintf(stderr, "Usage:\n" "%s debug BLZ-file\n", argv[0]); return 1; } bankFile=argv[2]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (loadBanks(bankFile, bis)) { DBG_ERROR(0, "Error."); return 2; } if (GWEN_DB_WriteFile(dbIdx, "index.conf.out", GWEN_DB_FLAGS_DEFAULT)) { DBG_ERROR(0, "Error writing index file"); return -1; } } else if (strcasecmp(argv[1], "debug2")==0) { const char *bankFile; if (argc<3) { fprintf(stderr, "Usage:\n" "%s debug BLZ-file\n", argv[0]); return 1; } bankFile=argv[2]; bis=AB_BankInfo_List_new(); dbIdx=GWEN_DB_Group_new("indexList"); if (readFedAchDirFile(bankFile)) { return 3; } if (saveBankInfos("us.out")) { return 3; } } return 0; } aqbanking-5.6.4beta/src/plugins/bankinfo/generic/de.tar.bz20000644000175000017500000175576412530647242020543 00000000000000BZh91AY&SYö¢’Osÿ„|°Zÿâ?ÿÿòÿÿúc,?|}.€:¶õçµëTЉA@ú_mt €ôÐ èô[;Ø *  €PR¨EhŠŽµ§ÃßöÚHfÔ%Jk@ ”(@()  @P(  (M (5 •((U €€@d€/ȶû°¬A¶Ôƒ$”#ÐÇÁ³žÛ·}ÞzöûÐûríj!$(*¤my´¢Þ»¥IH’9 éZPP>=[©ŠíЏPZª«íÄ‘N€>¹ßAJß3 lÓÅQE)AE* J•H€õ ¥EH¶€ûì{‰€4R€©5<î  J»Vmƒy ¥Tt¶æéô¦½kjVu÷Ü{Ø4µ ¦w®õ<Šh›B’³œ¥}°yåÏKƤMmÏ}½ð4[#>Ç‘×#‘÷Þ{ÂNët¼%×;ž¼ù¹ð>àÏ}; Ø*÷nÔ͵`ß}ê¤×Ó=zº€Ñ§·{ëŸ^¢ÇZÓwzÞ£ÓEHO{<—…°ª.ö<žlÛ13wßw=Cé«c¦ï—v0uÐwÞÏØ>H¨ƒÚÙ§¾À »”îÜh9{µŽŽv S€¡÷ßUïs¯²El4Ò1Zú¹ï·ŸvwZÙ­ßvï®qö×-›œÝ5£vÙ¦´ »Û2T­['¡ÒŠí°]íÒ+kî¾w×ßÍÝî¡à <«èmv å¤}n÷»Å½À}sÌÀ nÛ€n÷_fVŸc®ÚÆŽ›ßn}ªúõß&J¥÷ÛžûuZÀ,]=ß-í¾ïŸ}‚K_w¾Ï}´£îàóÎá•ûÞyöcÑ[ݾ«Õ;O™¨¦vG;œ©ëÎ>á¾õÏ{ñtR¸Jç€î={™ÃI¬ÖÚ›Aßwò°Oyï³¼÷½U îëZ¤¾»ØzèN÷nÀ-»}ÁÏ»ïº{çwÛàï}7Ì”UR*‰¬E½ð€Þ€mî ¨ž±Vîï3>Ú£@ùÞv€âûÝÀ]g>Ôè7{ìóO£æsT_.w×OMæ—{î}MósÕ7ÞèdIÑaˆÛT„¥màÀìt9íE}´*¤WÎ{oxßo¶ôÚú³¼ß!Óë{׳¼¶» § ×ÍË93Û«½ô¾µ¡ªÏ>û %J‘­HšÌ«ÁÑ`¡÷{¾öF¶l»Ý³™Öï¹ëïr¾ÝóÍ×Í{l‡½¯™çÙ_{y¶G'võãÝÛ¹ì9íä7¯{$ØU¡šÀ‘%¾tíëÁÞÎöÆ]¼ûçµóž(÷n‘îi8öÝËqï¾ï}÷¾çϯX}Þyíì½ï^}ç·Ï¾]ï¹í£ Œ¥³4µ[o`@ î»îêúÕv×Õ÷KŠ/z×°û¾7º>^÷×oW7ó³îöö{Ï[¦ú•Z×׸޹íázÆ*‚ƒZ£m¥cïD (¾ê­µ’06Ñ\âwçwv{´^°^ÀìÐÐ--öè­-°ôMÎ`ë–íÛlË­Úɳöæ)k¬N.×8ú×G«[•U’8»…l55 š#³hgnøïfûQ-±5Th$T­°Ó6ÊF¶ë¸µ*ºõÏ<îåZ,½àUô@‚_GʉU í¢BÛB P¤’ (jß|@#6›MI‹{¾Å¼{nx|oxÕ ‘­ Q % ”…¶•-5WgA@t“I™C¼M÷€Þ­Å}†kClÆ©B¨HkT%¦[Y”H_/Ï÷ÕçÛïŸ[wŸm·¾ ÞP}Êí÷Ï„JJ[ ±©«F¨D¢+ß{Þ•¯uõ»Á÷»ËÙÅòïYåÈÏŠ_@ØùSãT€Ì¾íßJiZѪ( ˜«e´…H•³[PÕÎç3žøI›IbÔZTѰ›f B@%šÚÔKlÙk@ c-£hfmbÖµ…ª)† Æ(Z¥³f§›UÃ(š‹f­©Q%Ú*`€„#@I4SÑ£I²e1¡"ž¥ˆššd44 §¦B¦¥"†”žQ‘ê4 ™šˆ@A&€"EOjž§åLžCSh€ÐÐH€’“F d0˜š™M¨Óô¦ÄÊe=&@ÐÚQ! L&E5?HÉ£*x M?ø ùÿþ}?W Ì !ÿ(æfD‘$‘Y IÅPü‘ˆ"îŸúÏùsõn³­xú½rÔÔT ˆƒÈ ¸¹CÁÕOèÅo ª`_¿÷eÀHDA‚Cÿ¬h  ½hA%E" @ å¨z‰í7|¸˜$'úWÊ«ÿf—†œ4øx{xrìÙÉÉÁ¬¿ëEëü"”ÿJÿ›Cª¡~*]¾ô£nã¯Z»u]5ÏØÎÆ˜e mtçîÌaÛðþŸ '«Îmœ~‰·þI1õL~©ä8ÿÜËåÇÙ?Ñ>¿gŸ—/ ¯oÝÃéúºs}¸tîÚ«ËóËËnèÝ‹Ðÿ‘—rs[­Ì8Ìghú]ˆEDm¤O¾îÖ*«Š¤y´ôÈsÚáÛ†p𯆡.Va}³Ã…žÇ‡¹î{ž:téÓ§N:téÓ§N:téÓ§N:téÓ§sËáç´í\Aê»™gMÌqNQLáVß3ö®ÿX£±ž¬ú¤=ǿх|wŸŽkÚ<~zëßM0›MêÞàï/¾xKun R`O˜þð?žëÇ¿$Û»}@÷ÝwüßûaÌ~•–¿Ó+õ>wþ˜C_Òã0~'¦ûBô…6˜Sñø„6ûB?<|ù9‹À9÷ |ã¸ë¸¸„Mÿ&üÄL÷Ì(_HJR|@í¬#¿ÌkùãXâÞ#ÏŒº·ÛP¡|¢#r“ëŠðõÿo÷ÆWŒ‰/t?V]¡>2›Œž¶kím]š}tñþÐ?_Õï·¼0ï÷aâ÷{¦¶îšç§Úû8ö‡ê¸Œàx˜/0;̘Vt„ þÕ/þ÷ªþÙ?_²N¿–?¶N:}¿g ô祛¼»ºwtÈÿ¤¦qò‡TóOÒHgôaùgŸL&~¾ûaªçð÷Xü>ÚvͶðŸë—ŸÂ¯«ñÖïÑ7·/]ã^˜mùd3ã¿ôÈÖï.ÊCúó…š®ÿ®òø{tçkµdòÃ+áݶiððúÉrŒF&ø0N/éŽÃ,­Þ…«_P„ýV!8ãfÞÓÇHsÊáð½¥t—It÷LTóHz¦«J¦mMÓ6¤Í8­6ßíïf_å?WÏì› SÊðŸt÷û&ï¿LûøyþXzÝû§ÏöœzNÿßáøÿI¿Ã^Ÿwé?ð…³ëðçý'Õ÷íúðϦ˜~~5øxýk)>wMÿÚmŸå‡^~2„Ý¿­µàÿ^?‡Ý!ªf«~ߎ­&~‰+–¹¶¨rñû k”›W÷õdœrÈzÊx¦Ugùâ~_}Ó‡>>¹á“›W¾Œ‡_—ç©8éÙëÞ7}$×ë·ÝëéòŸ *ª¶Ò€]?L[¯³ÓåøgËðôpìãÍ|qïgš’ø*·å…þÉöýP>¨á“öúÓ¿‡¯Ùßáçt i¥ü¡ù¬8øûÿ{}_º{¤ Åñ‡þZÊü³NqÕy¾Ù…UUE LunÎæœûq‡ðùf]=¼;ßèîìîîîìîœÓnsÑ[÷Æû[Ó¢*TÄDÄÄÄÄÀ$¸Pƒ ðJËýÂò•²ªª«Oûõ¿Ÿõ›ÃM,+ô{÷Ú¾<½ð’Ý0ºÃË_—Çü'¿øN~î¹tø~Ûe§.|e†±–ßd¾ÓSwðůœ_Â4’kß]¡¯åýÙÃòü¿/·§‡çy»»»‡wfÙ?š‹[¤—^-Ä‘9m<ñQQ¼çh’¥²üf„I­×¿å†Ô„àïåáÃ휾k—N]3N³½å˜òø],EÓ\AÿtšIÕøž¶édâBm8œIq ¤ ³7%Y˜‘“ä^˜1þU“‡øF‹ÿxïºáé´1‰‡$ã7Ÿ÷¿½øër¿ ·Hsi'óo§=!#á9åß(wî’]&}ú¿» ‹Š+‚©Ú¥-©*²îòÓõ+ô~”š¦I°WŠà{oöÿ,ÅǗƆ´Ü2?¤"ÈU*ôÒ­+J¨ªªª¿_7€y§5³nÊBׯû2NË8å¿ 3þ3Œ=ÿÃÇå7ÿl®Þ¿áøü0Ë3IöýXcû}þÏŸ6zôùÓ¯éžÿøCçOãî˜ûùÿuødõþ':m‡£Ïô†>¿DŸò?øOvÿ=|rù‡—‡ ¶ôìðøwgg5ü;3‡\<;1ròòîòÀ6ÖÚÖÕ¬›•,X±{¥–ïzZ³þžèJ—NÓù§‹øIg)´Ê227î½'hY5¿äÍJ2x2hµÉ#טJe Ã:máëÆšgn«·l é‡?»'|3ÎýÞ>âú}>¾)Ë—.×|wÛ_?JÝLúú, ¦?d îÔ_ òû|¾ž™¶i6m§LÙÓ³{°Úó[™ú?«~ßž{õ¥$ãêÃm?K¶šaÿ¤þ>œzY*±„‡w…ß÷sI³'E~¬ïøCåû~‰ŸÃôú8Ãóü:ÿhk—óŽº}tñ‡£¿ü5çõË{?<8iáÝ.SíÆ×ÝV/ÛÇðõ·á:þ+÷aÔø…ʰc8Òðõíþ`ï=wûx§Qãyý Ûãîž-’q×Öž\>ÝŸ‡Ù³§gfiÛùï*gÓu·ËíþÜáÛõ|­[ëOãÕµãÆ»}Ó ÿÛ¿¦uòÃÓ%ÀÎsö@åP×Ñ ?Ý/ñ:?HYþ{d”®É%âuü’¾_Óü«u»–|ÕÕmŽñù¯„öýûíoáû³µ|;gM±tåÓ§U÷d¯öümôŽ8_Ÿ\zdßœûL[¿ÑãðÃ}vóÛ<ü)õü¼þì ~Ï¿ÑüiãèÖx¶¿?Y§Ëðí_ ÞÞ¹¶~ìçO/ÝœpÛ„¼/ÓÅwãV•ç .°ü¿éò÷ø|}+——,ôöøÔÓ§N]:I“ñÃ!¿¬é?¦¼Çï¶üáôôÏO·Û§L¦œ¹ß,WÏKŸ”'ÛXòý+ž¹dã÷MøiðøzÆY‡.0Kë«¿¦yÃ}S¿á$Wù'Ý#Û¿¦ô’4³öIWò’úS͓Γž_Ǽ$½ñÛ‹ëòç+?†í;òÉ·LÆŸÑí_£ôviÓ»‡ ÝݤÔË—vŸÙÝ›;;<<<9tá‡öö˜ýŸÝ9ÿoÕ:ýßÙÿ^÷õ¯³ßñ¿Ó÷xË>Üý¿‡¯å'ÇLÛ×M7ïUÊkŸ_ªCÞ4ž“ý?gõGgúwpþÎX*þ­9ùòžÿÓü~??³óå®Çøœy@Çß8gìþÞráËðë_,ÇÕŸš`þüváòîÎúÓ•{vv¯†~÷×hb«ðߪù½Ð¼¤ê™¿ìøý\oóü_á>–ãtþüRý\§?EZùd5ú|a.°ÿ¦›Ë6ò™Âú¦tòß;¸m§ åôþO­Œ^ú­·Æ·Ø¢?dœt×ûIðñçŸí“¿£ûíþ½ýPøÙóûíý;?UíôÏåˇ.L&DŸ‡Êq‡4_匇ü&z_nÌß9ª)»ú·mUUUÛVÒöÒª*¶°›ÿËK*¹zm¶Ý? ûv‡wüiéç”"jðåÏZ®«Õj±ü!ßáöþ¿ÖF|Ò·ŸñÛùgþÞ_}>9}ü³ïo(Wݤ´òî϶înß<}‡„cÉGgw§9ÿtÿ·SU}Õgðv/ý1Q[vò儚Z´'Ëú!ôÇ…Ußóvý;>˜Ã†Ÿ²’©Um¥UËKj°’´†îkÇúÆÙpîýÞ^ŸoËôyyyyyyyyyyyyyhhhhhhhhhhhhhhhhhhhhhhhhhyyyyyyyyyyyyyÿ9wÆU¥þ_Õú>ŸËû¯*¿Z¥_³mª®x»ÃôµR•Uüâíi¤Wøs³ô~_¦Ú·åû?g‡‡w‡ìòòÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐìììììììììììììììììììììììì–½_~6¶úø}Й^^žÙ‡Ã—‹Ãn•§*éÈ÷ë”=o·Ÿd'_(O_d$ß⾌áý„¢§kœwûêéöI{5Ý%"žPþZí O5Ic).ým¸ëÞ”î!7½}@8ó xú„~=¡þsÌ1~`´øýÛýXCôËãøg ù½o9{vvÃ)ù¶]ñ_ŸÝ!0gwo,>ÿÒŸíý§ôÃÏ´|¡_t˜þ?L&>¬Ÿoò‡ã·ö‡Ûãѕü×ð‡×§/ܶÒþiÄç_|$÷ö×í²’ppצÎY lÿ *µÕÚ«M?½qi_ºHwí•öa?t‡ÆRy¤/êÌ}ßÞß«õ)‚ShDË×ëÏç¿6… ý¢ÿˆ_˜]¡8G¼.Ÿˆõü¡)aßHXW´Y!ßô®W\ú۵Ϫ9ÂÇu þ’B³‰=é97×íëˆs¬uø„Ÿåõ ã(üóÆÿÛóümú2ü¡;öûwtþÏŸ;9tìëPùú¡9AÜ.ññ} 'Ô+Ï⢽Â}à:„×Ìþ¡êaO×ÞÏ1¼RÓŠÅqæwù‡ê/ì„<ûd'Zg¦Þû¯Ý7¤$9ùI=7Þùxö‡çèÀ8éáÛpÞ0ãOøŸé v„þX?VCŸïmÒOÏ8`Ë%|¿£¿ï‡ ÿ|÷öËÃÃíøzyzyyyyyyyyyyxxxxxxxxxyyyxxwwwxwà§…UUUþm‘ÂOõž­a7éþž’R ß´$®™?¦Nm%H@ÿ_Ï×éôΘE“þ<'øÃ´?¤ŸÊOÒ«ùaÿ$çõ¦}ö°·¥UUWõûõyU`}†ŸÝ¥UÝVMWëx`pÒ}S ”ÚS Ò¼0S-„ú¤“Ž<;É/¯çøû¾iþÉ¿Ý }~zM~ÏÏüð‡Ÿôã´ú ~¯ÏNÿ _ tçiL¬Óâ‰K&¿ž*ž¿„>Éçá1»ü'Ÿ(mR߇=¡®ß§¯§Õ9ÿléë)ÛŸöŸ¯ÝÛõ|~¬Ç)\¤Ï¶}ý½¤+:å?Mú`üò˜ðøá“Ãï/ŸNÿñÇíãÞ”ßOÛ¸ü³ËyCóçôaã÷_ÙÛtõéÇÙïåׄ¬÷ÃððþYãoåÓ‡.]TLfóÖÙ4cËË}ÞÙ!ÒNßÃõ›zÅü$’Ýþ]n÷ü§ñû'/?õ„úd•ç7óóËíÅ0&|§œ§×ûa  Ÿ†O³ãâ»Ù@Ÿ[Ž¿2ç„)ñù÷ödæ/Ë»‡eË—.UrïÂø@YŸÇèúýSÙ.ìùã+TÀ¡>r´Òû}ËîÏH}w§+´Å2ùså:Ó³åÁ†Ü&0ëôaå·ž¾ŸâN¿T3ö}SóÃÏð€mÖÓ ¿(ü3—·‡._’œ9påšu×ôÉÂ}·×_‹¿:X@û.+ø`pÿûRž¶÷ï:v¤’[øI¯ôÃãøC):ÙíÝí÷yfsX_Ã!þ$¤‡Âúg×¼^÷~Ù!Šá’Xá’Då>Yõ}.ɪ«sç¤ñÂ3Œ'ÒÜ9þ™þØÊsïMÿ,ý}Tóê¾ì9Ó6Â!  ÚÄæ?ˆCb¶…NöŸÄÉçøg×å¯Ê~É×—ËT±œe”)úù¥„œþï¿ÙÆ]Ù&™?g¬êÑ¥NŸœªÖëΓ5üç{¯¶.øN=ÿO¯ÑùÂxû§ŸuûºÿO?»+Ëðé–ÓiŒ%•ú! ÊOœ?®°ŸF¿ÆqöaŽ_‡«~¬û¿}òÓn\ûÒzòÈxøO(\øY ¯ç>Òè|ø¥Þšû¡'Të´‡šeÿ¤8˳ô~Ÿ4Í?Oœ¤6Ÿíùd?„“ßÛî…úH}|tÛãê®ß}5û¤×—ŠC‰ñškÍ¿²ºIô¤3øOß>×ÂÕ>•Jå uNqvÀÛõf—9{tå<ÿN\9rIN6¯¨OEÿI3—‹½¼sÇ{˜§oÕœRWÑ®^Í[+‹yY­3÷a'îÀþØLkàí b·Ùçð„›S¿«'?²áæ¾õºzú}•oÇÖÖzÂÿ¦_FööÃÇîÀ=|¿OÕ$ü¦ÙOöŸ]$õú?/Ÿ|}:pég³öÊQ­ßéöBFNuòïðÿ8éÙúûAaãvzóëôO?ÃË8pÚtü¶å¦eÂcׄ&ßÀ<(gî„ÇåŸ)'ìÒÏý ü§îÃ_d•ú  ·æÚ¯á›³jß´4€¤?¤8ÙÛímbØ|y`sÒC? Ûœ?_,ºçf@¿zžÃ8ªi¶[ŽþôÃþÆiœqf;*œ¹mUUX*þUxitôÚ·³³úç9ªUUUUUUUUUUUUUUUUUVyOñòãm•W½o*ªª•L›RH][ó…zoÊË ×hO¢t’â@ûÿˆB¹tðø|¶ü;>Ÿ†ný]8t†ùi\¹ròìò̴ΚvyMŸžRIµéؽñŽs¶y»ÊŠ6›WûdºIÿ ŸVLëÝ*øiZV¯MrÖÕù~R¾?d>0ïõ¯å ÿ·¯Êÿ¦=8òÉøý¶á'¯í×(zü$Çîïí5¦WÕ!÷úµ¦·ìý;aë”5×jmùsçoÙã·t'×áëøC×åøé5³'~c¶O^ÒÚþï¤÷„6ÖfwËæë¸ó¤žð'˜Vó0ý¡D“öúÅ_Ýþß« ïzð«åû|W_ðÂkþ6ýÓ~5²I6ü$ÿoJª©õUU­•UG_ã ŸÃöHM­’§:d'¿·õúªªªŸEU_t«ãü*ïöI'Ÿød'ʤŠ« ©ïú~ÿí•þÐߌmÆùùdü9Qòü*ªªªªªªUüŸ~ñò¦):­I¿ðýÓ, þ!ñíÓâ˜~tÉ8ÝÛôLˆqùO¦ÇðõIÖÌ ðÚÔütÎ0˜ý–þÌÕ3Õ2§öÉ¿òÈ™¿Óë·ö|>ž×NË—ZÓû{d/wNP?ªóªªªªõÎ5õøÛíëæ÷~`à?hñh­¡ßùEþ >i Òmøøí5ð“íùI~Y;ýØ}—îáõ¶\6æñçt“„ý»w·¯·Ý†¾YØCnRu‡a zB`Lý/¿…UU?Lÿ¤’ÂDD ¥²æ‘æ#¿EP¼:Î]@¡¾×ÉÚqßÞ¯åžpî’_îšû3ñ÷qÃ>p×ÂyR{·†¿ö=þìžþž´›e§‡OÙÆ[p̦>ߣŠgßß «Ç*¸Ûå·¶XIzÿY¯ ªª«\%üß?Êg¤ç ›}Âwþ! ú²zþRÿiët??”7ÿhé×ú˜tϧÃÌ/éSãZüe|@…f/0-¿ˆý __0³·>R^’|U-yÏ”3ý²I”“ßöÀ3ÒÆÿ>aà¼ÿl„×úVLœ[ ü¤ùÂ:ç·´6€Ïêñú@ <ü@zý 8ê=»õæ~’L‡lŸÛ§mÕUUUzž?xHߪ!öù„IÄ¿íoÜzø…?œ@éó^çøCšü§Ã'¿–yÃÏá5þÒ{ü°ïê“0ž­¥{Ö6Ö1÷´¯,‚‡ê=¿v\þ‰÷`ý¯†ñÞþuïl_Ëzþ–~RyHøï‹’m÷óyHH¶ÊÏïv¶ }ë–Ü~É9gãfý _ÊÇË%|²m÷}솰õû³üIãìÇí·lïõs¤ ùú?ÇlÖ]þõøÆp¶Î;óŸÊ x‡=`ýá'Ì'½÷Þ³7û8b¯”ÃOo//‡üf5æÜ<*»°·d˻džÿ뙣|íÆ/fS%\¿|pª¿·ïÚ×ï·¶HcèÉýñ窪®9^vC¢B}XN6d­ |®Ú@•²CûgoEUUÖÉ$ßùI»$ý™2ɧí_Û ý§J§Å=tÂKú0'éþ’þX² ëúg?Rí½ÚýXxÚ¹a>¾PïòÊåïøHw²cúIüð‡ŽØÿN?ÛŒ²W×ãñðÀ I?}z&ûv¡_²Hn„çî†ÞÐëI\ù?[>ªªª¼má¿¶Hÿ^²1¦@Ûì„ý}²áUwÝ]þŒ ³ xÖTÛuUUR·dži$þ©7þÒI ÿ´‡Í<øIÝ'×åïå1ôqû¾÷Hc V¼ü»þÛ!¯ö÷ü½óóË }žÚvýpÓŠ´ïŸ¶XEÿ¤?oôÉ2׎0ªªªª¼¿³uNß\, ãøa€¤ ö“ßôÉ+)'œ³–/¯Tóü*ªªÅy¿Ò ã XBXä}“ÿ$•&C"å½¹¥aú°“ñùý™_Ë Ïö›nÉøÛª«ßkN~É íÿ3õWögÆ×îïWõO„á->P0‡á7|ðÉ>û¡2þߌa×ñþª×jýøû2pÈg¿®LþwÄ”Óéû_t½“[N#%SIDé!?IÚ|§Ý&~4Ì;½;¼¼:tò͹é½'O„¶][·]¦³ââgP¡ñóï ýBüÁúo­'|@댞Ù)<ÓOÙÙû4òòáøx{VÚrðððððÒ¼?-4Ó\ûxrðððÓÈiáéYM9xxvxxW†šxë„’þÌ?fH}·Ûµc-fùóêËâ…züBhGO0Ÿ¼”)\ô˜ñïÿ¤ i ®ÝåßfÚ÷´GˆPÆp ÷…=¸…šÀ~xöŒý ïXˆ¼Î ìcìí†«á­ØIùmýÜ!òÂOù¿Û'¶~_Ëÿ6ÿ‡¾Ñ5}¿j}¢¶ûGǼ)´<ÅxÄ qºIødŸ¢~.™òþyÄ÷ê¾Ìߥ%VíÕÿIôõá?)7ûþÉÃëòñùaãwg‡OÃíý;ºråÇN\½?-?——‡w.^]gðá·¦tòôòìãÃFš6`ÑÑÑ£Œœœ›7â VhDÛ¨Ûî–y~ú× k·¯L¿,>øŸv}ŸÓ¼¤r…´u¯ÚÒР{_Ûßæñ¼GÊ}œ=¿£N_ÑòòýÝß.îÏ.Î<¼»<¼¥š;4hèÙÙ³£FNM“žœ,èøvxzmáááœ<<<4ðððððÎÝÝÝÝÝÝÓ‡‡‡Ž” å€cÅ[꟢}˜A|þ^ÙDPæ ýA(‚¢0" «B(B1ŒDD`Åb¤€F‰AP„# HªÊQÿßüm^—û|÷íeÔB5[×´ä¯ëÿ²Ñl]?Æ1|ú„Ö€W-b‰|Ñ >ÎÁVq/½ã öOÝvÄ1,ë úë˜íèîq’i­UbÔÝìß^7E»­Å)Æ¢jz=vhu ­FÚ)éÝ•U½[ˆ3ãì»õ¸÷Lûæâ@M°$efT&4`g[-l¢¹x;1æ‘ë½››^»ðÛl¯¨ÅïÍÂô–£(xÔ°iTcá÷·XÅZY¼¬î)™Òg F3˜+6ìµÅñÀ@A ,*ŠD'£“_gÊcêsñn“Jš¸Ž®Õ>{¤~ßr¶Í\ð ì"ÅDТšš…b¤«Ÿ™Ï3̶S<¤õyÉB±VMMÝžÛHL‰½Òñ §¼ÅgFÙ}]^çsMZª‰/„Ä~rª¨Æõõy}Iúzg.{׸jWOÜPª!@”M/É6åécÄKxzlA‰A8’­!ƒyn.¼¹3¯såãÅŒuÀÕ ˆ+ßÎͺ*9—òªufÄ[nT¶Ó*e¡m]á]¹.àDÊt.]Í›»Q !U êÒÝ=üÝz~®¯w·Êò$h¬G‹Ê/‚/æÎS˜Q 8 r‚A[KÇ„å°p­|Ý^KÌ„.Å_–™{0=b\(ƒ”b;tãáÁ%C4zsNÁLd¤óÅç¡¡:ànóÉ«"Ô©pãòµ@¡wÌ ˆåãI™Œ³ºÞõ\ÛyÆwžk[ç9Îsœç9Îsœç9Îsœç7¬êv»6âÚå3Žc5œÄW¾^•6áíE¢¡Áj0u¯xx³Ÿµ>ÒÐøœÐ¾?تõ¦ô]]Uc]ü¢ééÃûýÖŽ^‹°Xí+11 ƒN›5„~u.'u°üþÃÏ;TP îfk$/®.NÊŒÿ1‹Rh=h£ú®E¹”DK8N–¯uÇÉÝïC¸Èaθº·ºññçU}6c’þw˜o+hÜÞTuÚÔ^¬GcŠ{ÛŽ~JXkW§½G1Æ%Ȉe^oÓæÜëùà‹ªYßOÜîü0ºn~•§s¥ÐsÙ,R›s,Ì@;ª‰:+Å÷ixˆ…WÅóxPØ|¨E}ÕöðœEEL)§÷ŸN÷Û¥kVü 9ì'B’. „-7«GÕXÐÜÇ&ùvLsMwÍÞ“ú.æš`trÞ8ÌÏ ž…ýËœÖîb2è‚M¶{¿XuNn”ÜYåvx‰Rl#ˆé§ï!ùYÅ­¥æj9õh¶tF¿MŒ !Ã,üéÕž3qðžrš™Ç{x³ˆ±J!fŒW\Úl}¤j6Mf´h1Ì¡®n8ü¢RhÊÃú &á}ˆ[È^~Œ{}¢5œl]ðS¾ø—N‡¬èuBØWׄsÎ&X=i-LvDÛâŒ,!CEî˜ÁHW¨ëg5ŠðµÝп{ªÎìF×dÑòÆZèFlc R¥@‚Ö´ôuë<òe8HnR0¢ !£Ä••ˆ!™ŒÀÈŽ€ßŸi6VhXL£È ±®sxbgä4|Vœ·Ñwfò¸² º/R‰@ÂzÏYkªFÛ±^Õ ãÞõyý¸q+¹ãõ›‰_#Þ¥;‚¾s4—&ewiØŠâÜWží}ߦÇÀ^—cW’çêÍØãh@Ãr‡ugPõŽ0ØŸF°’Ç„!vXBµýÑå1M¡;LƧV}6îw,¨uC4ôð×fw…Ñ„ÝJÊ‘Ä`‚M Afž„–§WÖw¹iŒzŒE¡eè‘q|3=±Bã1³½…Ÿa §‘§{+#…:±PI$šSÏrüªmC€úV&`°†©ãõ‡{ Ä| À3ØuBãˆ&)—½¾nc3|áÕ„ÃSc¬\=÷P¤cؼ×™–É­(㮃í¢ë»ûG<Ö±ž^ü>LË—GælêÑ~2ý&ùN1Ò#ÛÃÆ÷úR!|¸Ø~‘áëщÜõì—Ö’‰‰éЉ‰ÝaP˜Rn”¨“Ÿ°{¿½A‹­Ç±ÌÈ:B9|)$n ¾—³ë«)¾Fä›Ð"yJ;‘À“îΔ,âáð.ÈS‚{L¸ÁT“JL;¸w()Dª³ *kéó;¼ëboUº|Û3­Ö<(:á^–4£FÑäÁ »ùUšl}s¬,Æ/”' æ,Ž0Üû;:¹„3ŒŠ”÷¡@f˜$Éá(Fk”‚’ Ö4ÞJˆ•ãè“§§R°ÞÑ(‘#L©i¦Ú¤"Qõà®ðå»Òy\ÏÞm\è™—½>9³‰¢¢®öر-,מ\ÞÍ„;Þ4Õƒ¹Š¼U?3Dûuv`Ç”çU_ µtá§…5Öq˜Ûƒ4ØW} ¯ïbˆâÍX—[™ñûׂ2°mCÜqÆg´í>”6ŒÞŽÖ×ÂïN„†&Ûð‰d0óÙ=OÎf>»(ÆÍeÔkSØ‘ä÷šlé¬mœ|×ãÖUiEoxK¸r±Í)+ür7ƒDýçA"“„;KL|=olòļªÙ>› ö†êoCžìì2y áƒuòî½V¼ ?ƒÀ«åƒ³>ƒ’ÞËõp¢´ŽY‹ûœ㓟 Ý€P89dõúÇzôμf¹+ÑÝ­™%Ñ×këŸC áˆÞœäv§f^kWzîÓeò=²CB1ãæ¸Žê¹¼¹ŠA)‹”~¼D5*CåÎæò7BVápMÙ‰ƒ®“ÖÃÞ%“ÁÓ µT4õfFžiþ”¦[ð7áó1^ 36·DþxÁuü߇Y½£µ²ô5¬§.CÎeÊ¥ë%VbreE'a7bcf8ìtª˜Z5!3¼q??…™ŸÖ>¬·¡›u1rÉGC0^• }¦ÂP¾ÊÝêâ5…á$E3U"¹ÖÇV«ƒ·-çæÍ÷œDACÛ¢JþZsºfKˆ«6{§S6Íã÷†FÝEãu\‘º»²TZRi¼”Wäõ½çd½SµuÞd NXZÕºˆâ·ff a¿xz­ +UôV‹ ¤é™®Pf½C´nB"®"-ãNžUÃN•n e-&Ïu¯·¯f¦·ÂÚ’6‹­"/¨MzQtuj«P­Aâ(ÔdTˆ®¸ôr(y#|ì tGñvˆF}tkÛÈç3^ãA7›ðó›šU»q‚_Qeb©Ä›Äa}Dpüåã/GÛed¥æEjݽÞPkïw³Ì‡Kª~nzˆ›¦/!à’›Úƒ2º* {­‘±ÆàHÄxZJkÝW|;èMž½-‚Î@4užïBª!Šâ*IÚd 4Ý-èžm¯§½™‹”)êÁaK÷+ƒd¬FeLzæ^e{›zTßVý=¹|f&º…Áòdí ‹g·Þm“mñ±œz¤Y¡-8HåÂmPÀ†X²ˆÍã»M„Û·ƒjmyå?{‹,]Ô[æ=Zƒ¶4ÕÛ;f]1(c™è¶õ̺Ñ ;á¼»3o«å|fZ4Q|;˜Òf&08!xÓ§ ðEµ E»ÊàøW—‚O$íű¸NhG@Kt—’#[ÉšËqcê@ÜœÝ'ºdaG›ÃÊi›ÎW 6á,ÑD>ZÓC:ü3 V,’ŽöGºRä?…¨k0å÷ëèÒAY4ÉÞÅUìßDóZ›]c¶¡ -½ùKƒÎ¦–½á~,ŸÇz™ ãóAùúÜY"V/ÓíÒâзÕå8…{·ÈËÞ¬[aõ…°{Fs×`’¥A”󱨒…JƒÎ œb´›)sÆ%;ƒØ/ãQƒKy(=Ÿ;ì>P¹À—X ŠØNo>,÷³‡ÖiІӓï.øŒÖ`È+:{_E¿9”Ú ïè¿¥À‚<^ÍX¹VÃfê›æt¿š-Èuö½$ 1;wŠÇ~2-é&Ó>3‹s²GGwÍwr,6àdó$Fz*¢‹›6s×Gxºdb¹$Ò|ý›ö­Ö’zV-êª|q4qU)ÒðҞǣ#eñ*y¬TEÄÜ.ýÍ´,I#<‚œ£·Þ×u2ËG7e>Ñ>Œ :G¼xñ[.ú”mŒ[ Þ”ß3Ácà_[•}jµµs­g{ç9Îsœç9Îsœª""""""""ˆˆˆˆˆÆº…¹n帳fç¤TD‡&ª5]¥{˜×ÕêÒw‘¢¼îîîîîîîîîîîîîîîîîîîîîîîîîîî¡ã7ÙŦˆx÷qü¶>Óªð¢Ñ̽ÚhÁÄk¼˜Üš¨‹S¿Tñ¦ùó}ƒ[ª»ÀþEÛå-»Þ5]>农“ë¬IЬmC¹df©qäÉy¦¯^£‹¦‘ùC^^ÅÜíÉ—ÔE—»TQÉ¢0á Ö¸m,ÒÙU‚øˆ-Ô 1 n^!¤áhv8F[-¡€¦šlH1•™0$X"Jmýr«œ¹â1ÇÏ][£gtZ¬&xœÌög—Ãá+ÜWVÚS6ñt3muaÓj3܃ËS®{¤K¡ßn<$5\é1{P·é.<åÞ«µ P`ï'?EKYÏ)›b¡ ldMªŽ^*[ ,W°ÛÎþªÃ,G$iwÂf¢¥BD¨èÇãéXÉYZõØÛϱˆÓÕG^m¡¿´2EÚ‹ Àq“çœ÷ÞGaЉ…PlëÀMi’°OJ{áŽÚ_I²[š1?RXä‰BQ yüxáDÛ,#¾'da@f%f5U$~­ð¤5Ýù¸¥ëŸª|NB,j„ B oÄæ—4.6¹]®²3±~Ê¥cÌ8¶Ë‘®mõ1£ltO±È@ÛÛÝ£u¨':S~%…íÅv®”×á×F<îŽ\³Û˜1»G ɨî”è¢19ú<¸h{:gb^õoŸI7͵ˆzÓz4¼F‘Ý‹y·«\¾} •ÖpVb¡_T-ýá@¹Ìw4îº'…Xügt#Ʊä3¢eQJWíª–™ UI£0ÎÒÑ·ÊíãL¸‚4¼ž¬˜åÔó`ää""¨`¦|Æ"d`5v»>@‰Ò–zªwxóÝ.‰Fš ]7z=x%ÓÜä=‡—¸\4#>uQœ"ìöbžœX¦o Mú3G3J„ÁèLÉéIvõå ±ÞФØãå«á×”WJtlKx÷‚,5C'¬çÞ&yk++|Ëò£*2Ýp…ÎI|±HìÂÛni,DÔ©NgÅóœï<Ï=Ž)!GŒrnêksÎ>üáô°Þ•87êåûEãõB¶yÞF© kFw•÷Þ¸_E³g§¦änÔPI;Ÿªª2öäcDRN"$|‰–=×V7Æê°gçVQtÝèµ??…­Ÿ¨Ùôj¦ØèW‡7N_Ôå4㚸 ^ò÷ªÒ»½~iX3W[€ì²Uö{Æl-S†æ‚𯇰§m䪽W¼èì##?¡2Zì±Nø}ŽÌò&>òâ‰ù'+®ù…ñreTퟞj“Ò|¾>ó)˜’®3„Ð2C(ùTPmé}=vä‡"Ÿ¥Ø "‚"¡œ[ò[â­ú¤`F=×\ô|ÁæìâF§ )çõ)ôµ¨£eúhúè|‘ëÎA–6ï+‰C<\æ„aží};+««&y;'ë4q0ð#Å£[o­ðEúÜìGTQu€¬ À_øÆðHØ™ÍYEÛï/T²=Ï3Ò1&v3®±yLýìÌãæaî¬Lé xÐC“-vr5à½ÆÖ¶r1ƒçC=×1¼±óÈÃøÅ«ØÞq1ÔØÎ¨’SõI•Ä Töú¹„w0êüg‚.ÙåÁÑqLa#õ©ot£ šWxFŽ/Ižù§0Ia:<$ªR™:Kkî±ÍÜšðDz”•ÛLäedò2Tõ™¶w\¸XSÏŽk³J+ÔDÑHæ/mbEÁn4¨Šˆ.aÏ®í¥wAUV‘uu ц ’„Yq*âT‘Sn];|^óÞÖV|ÉéÛª¹)@N­Uf»±òw˜%‚³Í |'N÷q‚Oä¿J®§† ¤Õñꃹ7UÍߘû=%:¥½Hd…¹¯4m # { Õ™îb9õ¸`Ì=krAWRg{EI¸ðdº3Ï2ÒÑ­ïVA%»CÜ*­œŽdùV8û£Ö¯]ëñ’Êaœä‹n^´§Ð_lj³)2¿#Jª-q´­e­D;ºì+-÷¯tz8,ÃÎÙë¯I^8ë´‘4FW£;¾½Dd÷aßh—¡ahõ§{2½ã-2ñW@tg‚2Vhæ°n¼NN {ȉº!ÔpMÍÜ¥ŠðÞr¬°«9€ilÒ„"ØÌL‰‹ £F=ž–m­fö¡`÷°J›Téa3‹ h‡×™É:² "Qžõ>bbÁŽÄ2î;¹Š«Š<0Âp§ ‰´°s‘É[)$x%Ͷw´ÊMõ áÕ®)ðG¥Ní¢øIðXmgÇ>4µô‘Å*¥Øû[×pMnøŽ³G‹$gS­N@Pv"DXkâÈ~ZŽ ‡jC‹››±’²IÜ UXì§®|×Fs14Y¾XÓEg6Á¨ˆK+²îâ¼3ì"žó%3s'0âÌÄ™‹3bíÁ(Ë.Øêû[»:ªžµ"±Í…šêd¦DDáKB}ËBÓ§ñøIÄXAlí´ÚŒš4QYâ<)U>qº‹ÈÞUöNI ш&Ëܾ^h¦ë`Ù\úì`†x5:‚™6É*Ï RϽµŽâV¸ªcYãYWu¨ Á¸v³•Öæö·Úw™ÆÊå7À'…íòz¡¼œÚo#’Õ­Ó Ѽ°=­¢>ÇáGK•ØÐ®w˱ï0´Õë´k›y‰õòlôJឩ̃ÀcÄø3I1*ófç¸ |AUY f‹z‚÷Üh,8"­«f‘T\ÌE‹èÙ8F5 k™ÕApn)À´tÆjo^jɵÙðî‰Oi¿_ŒiJ£Ð$^WWØBCGð¹ƒïW¼ΔÃÜÜ4Î}§ïq»8¼JAÙ5dðfjKR«Shœ’††ø&íŠA¼®[árOZŸšó·dibhó| ÖOgy×2½ù·HqKŠÝ؇4Õ ™»¦2 ãÏuJsÎ=Fo‡x}t)^3–iYöju®fo ý¸‚)9œEi"•¦qâvÈ›eÌD‹¢~â÷Œÿkô~ü±/ïŒðËKž~вëó’W”æ¢î Nê,Îe±Ds”"ÆíÑ'±×Ùfn*/fj(Ü9k<Â\°äk>ÉÓà’_dÝõ¨¿­ÄäáÒOxÈjŸ´Àöƨ•áç‡ÒžUó› hª@ã݈- $OOI¦C J%n˜òÉ= …šªÇ ϸÎÝÇb+¶ZÎ = é†<™¾KNmÏp'!× ó×Õ¶BPSá½TvöÃûزv˜¦þ+&6ZõXýZj«áé,ØÃv¡×öõ8ƱúÇDˆ¯Ü_’¯ Pèî÷Tyzú\PêF'Ê‹4R†H;×ЖÕ{»¸6á·ä64i;¸ñ‘ÄmJߊ)zÈp­ä|º¹àrA(YèAèFîÄtA,óïˆÍíHÓé û…KJà¢7lC$í}™ûÞG—£M‹ æºã±Ð¥Œ£ykXýã£ÁzÉp*?ªˆDá,¸tqLI¦zv·žÕÐÓÒÞãŠ?[ _†¢—¨ÈèSº¢v¤€trOÀ,lú’žZ]S¨¼q&V*“ ÇJôD*×/ÄþÜoP܉ˆãŒ ʉÙ™n‚¶ÃŠO àÄñž 1Íqåæû]ñMàF^ ’Ç"÷^ÙÛ½ïyÎ)¥ðdÀ‚TÉtÙ5ý±"àÐQ"ZÞ=~¸\~}¸ëø_oǹJú~R/U!É‚ù›êî›gÎÕÎË8Õ^î^UtSš¡Œ¸¬9`Q;dµq)\ŽòíŠf”gžçÆ*¼‘¦6P^$ SFÊÝŠx(ÞðøB/Óí΄µ‡ô”¥— *‚11¨;0£:U_‹ï6]¥¡ZŒç ÒÆ$›±áÖ|g4F!°iÍ(´ÓaB 0wP%wòtúz0ÐÐQÝõN;‡³¶¨Q¨]9ý˜q±~1µZák3:„“@/ âö´>Äɪ¯ÖÇÜ{kXfmæYŒÊ ÜÉÒ¿¢k}ºh5Þ3ÓJ¼õÖÔýkJU{Ê TÊí(ï úôRŽb!¢"‹|‚¢ˆ<’–Eh’£ aˆršÞ~å¦ëA±Ç.cÔRt`TX‰C‘-%PÉõ8®·NT¯\_šAö±8Kк8˾&7o’HCù¶–И03‚®'®Õj©ŒÜôìpâr°ÓÆ$&-»:¼þ6DZ”.Lã9I ÆKœ)|o $¥X®ù£'-ê ÅƒÁÖäǾ×ê t”7xÇ7€d”1F§-$$öÔGÃ\EèÂ↩VTµ˜gó‹µZ³LUæÜå¼»/ æãèÅåoK‹<õ¯Ž­®tÃרža޳w“tfóý¨û€…²fEšJf†ß'Ç—äk³­Þ"'[ueÕ(rî{>NæOoMhðr#ÊÃ˾sÈSñŸ¼«qNb>Á¹ß¹Š¯m\aù2Œë¼‡¥HD%hÊã°fqë³ö sNAŒ¼ŠQÞA`›` Šªé¨ªÓ˜‰q KÛ l Ó ¨ƒ(‘±Ñé\Pðôt÷_¶¢E!9ÆnùeóFôj-μ“'2ÑJþŒ•³™î¾<Ä?p4;xU&UE: qFFÜó*}~ÕÃ5¥ õwA 8£˜ ºfq´•øŽ#6®ämÅ”ÌØR&1¸Î±ªôáHÛ*ôI³ Áž9éÓÜ- ➦åKØh›!&k-»ÜRôÉîãú¤ï¼ÙæõÔeœµ8Ï¢W_±²mcËBèá}J¶9ÍÍç½£ª³È%סĚUÎí¤2’øvübEã2)E/ vÚX¹¡ç>]Š캅"O+Ïpë¥úµÁîw/Ò­äFÝê)pêóI}Š Pqȳ·Ó(‚Œ kxm‚wq¸L{;}—EÑG;îÖ¶óù÷hÎnWžÓ0JîuÌ÷Kk½9ޝ–F¹J„ýž–\ÀùÇqj²†Q)ÑpàÏ]f¸ñ`ýÏ^µáO¸Ì.7ž.ôÛÍÆ~1™hrﮞ*ÒŠú)Õb Çdm„^éTgÆâG¢‘UC­Y(£I-¶¢mÆç¸jmDlßäQÇá! güY Mù¡§}¤~Ñ_Èózl'xWfº7´ÙÕg3 Zó}5›•jmµâ{ãLÈg‡“­ö|:!¾<1mo׳pj{…ž«w|Gc'ÑÑÎþêüêÅúÌÓÚËF0¢­ËBæÀwsCÁö$ ‡(p¾P,³fÁWö5Ö´¢ˆ,/MѦ™ÿzû+I±·Â««ÚÒü~yÚšäÇö˜èè…é%Ž¡%‰'?­Oš%Üñ£8OEðýkC ‘íz1,yÊÝ[hÍ”miBC&]w2w1b¼¹€º‘ò± øí„ÄË™\mÔêu)s}×¶k„½JºñzI¾ý9jGnõqsbÊ»ø‹£]õû—¦W¡PÌQdz .!â1<µ5! «¥Fþ÷„’{ò#â!M0j{nê$ˆ.»\ÂâÅ€ô½3Äú=Zð"lP+ÉÏ­rÕe‘œÑe‹ÛC´ ówá…¹îŒòÓøE Ô0’׎|øóÞ¾ü™‰™ãhEÙ†‹n”4>¯o»ù{©§}~×oYŸÂúYðƒ"Ão³yŹXü¥4Uâ;ÉÓƒó'²¸÷ÄŠ9máõù!6P<,†Î]idžæš©Ñî·GÌï²lZ+'’UZ„¸}K*¢…x¹¦§UmɯV¶| dÖÆØÃSìD.÷™—'›»‡Úê¨éûÀ!‚Œ ú¾>ÞË}S¶Qá%Á„òó£FC-‡½&.D@ì7êaZͤ?5õ"ÅŸ”LrŒ„B ÂU'cÔX.›#~o+é øuNëÊÂÞÁ*7aëîiuaÇôú“ŒHZºØ±‹ ×6Tˆ(žus@rpz‹k–‚$d€÷x‡ÁbYäHÝ[­·…<¶yž3~űDá[î>ÓõõÍ’£;ËB‘ɪ“+¨‰1¢µ ¦)¢{TEÒ&ã}*3sÆú1ZÃ×FkɇäÆv[ ÄŠæ«‚L•¹'Ùä­û¼û¬ù³ú2ÔßM•4è}\=5LhÍOÎbþ;Óî ìG+ÄÛ‘ìã“7áVA™«ÕDédUùÆ·šÅCƒj½˜1ª+EGœW#^V5)zòìo¡f…< >ÂTI3ðÅ®È'-ë=éºßg9ŒÚ©’ ")wœ˜¾bUÄ%£¯J&¸öÃUÑíS*‘‚,Š”6ŸUŠÑ‘´Âx3Æ*›°#‚F*LíÀmïRHÆë5zûú{„³j]ë¹Dš}Ö´§´»ï _‰°^vò•cÏTñ[¤ªþcU? zÅßÞÎψ¹çœ ›Ð+Þ‰Özðm˜n@š©˜ºmÑ—RãoŽK»š!˜Þz4ÑuxÙá3ÊgÐzò>sVaóõO O9ᩦ–;Õú9}Ës¹\"$%B—æ=™U³ènX³÷ž9êÎöNgÍLßÞk\âLdjß2|6[½ÃW³IŒ?%:Pˆv,åÅ©ŠvŠÌqÎ2ô‘:´Páɧ’d+L†ñWPÌŒÚÏ<¬(Ý^IÔ&¨¾æjßå‡ÌzIDH„]WìJñ+ðFôNnágj频7]8 ƒ,l›3E,t_„àøâ†£ÑÇlæ>Z±L·ë‰•>Ë»93Õ¤_Aôúi}í.0@„ÐU|r—óÍjæ8"fujäŠ3#;q)Âլɒ¦\FSÍt/ƒ'—”^O,ÛŒn`ãn„¡v'oƒ¹H—·Ë‡>´m—v‚ÌõHJ/aiˆP#¨"©™É üÌè3šœ){mºÇ´jÖõ#~k8eSéã°q)×£=|¾ÈÁnòðSϤSÓÂý6÷Ù'h°czøÓ‡×«‹•>=c?^êG I”=ÖYîR‚Œ||, ”,uã1©wAÁ4ªh½“‰mÅŽ ­÷Ä1 ŠïÌß“ö3…©#éÒ‡ˆ¥&j¤P¾îÞl öTäÍ’Pà‰Nyù³KLè,êàOÆ« wk±‹Q"5^òî?¥Í"­õf©ç9ìJ­GÖÍj³¯ýŽ ×XáCëm$Öw7› ½=Ãß ;zÿ-LcÜgèýét·Z‹SŸzOŽàÄ“ïÉh/ò+Š ¨ RÐ÷Ÿ%3zÞy‰à“hÏоáRð¶÷€ªlÞM7zUE”qE{|#¶w¦2—@-”bTd6YjÞ?CKßP¢fºß¯Ê ,pLìh¢äæÛ¬k@Bær‚Ñ01‰ ×cÂRp›êŽ™¡—=ƒõ‰ZºˆÕcb¿.kg©LÁnAÈɵnjE¶Ô]•U1P†Žó»æûæ²ÙOÇí®yÔnõ©>zôN·ðî9°WÂr¬j¼‚Ò—æ‹£a‹1Êî~Ò—ÝŸš¿ *Ù>3jNŒ7ÚÑç¿ kŠù‹£³M!âWÞz9o  5·eÒÞ¨Þ#ˆ×*¯A¡úšž¨ìW8_kÞËUVÓŠˆ<ÆÕï\ô§â¦ñ”¦ûØ#ú¨u?лN/çy|·XÖ O “ŠóSc[ô Nh–w+TþÕ_ ®á{ÏåØö¸JÇDIa¨â|l;#´âGPhÇr>>”xoNÖQ:sÁÐLÁÜwéè±NUÌjâ}˜±›ŒÅ&Ž€x‘óÙîtùODw•²-ZìR^˜EXv}¬âÌ}]2ëåîŠÁVz£5a‰ÎØ„—å Ž1Í)€ÉÛ†L•Õq¼{ÇoaÊŒƒc×ÂDZŠõBtåŽÜ½}¾Ÿ¸l0µû‹ås«8d¥¤õCðЂë.Õ%k<õ4Y<Ûv+Ó;廳íYk¤Ú˜ìÏZö˜{J´!ÈIé7ÀÂp)¨Çj¼aû¿y½Õ«¢Cõ~ü~¤fè–®Åýh{†Å­y+f@7·ºA§ëN?ƒZÊzç“Úˆ‰JæÚÞ`„×Ͷ‘Þ2x¼í0Ý‹½¢Øéˆ¨ ¬êšL^A–˜R?W£ÂÞšÁþ» ठÕl/ÏE©x”Uˆ(&ßLU=qZà/&”o 1î‚á9À1BÚÙÀ¾RÚâ°ú]Æ1-rãA¼¬ù‡Î¾A4f×iCêó–".ĉ‰H™Óñi—²%'ÔN £Äʾ:[H87¹"¿'+†j0p°wt¤—[G³· ¡ÖëZ¥ ¯Ð2beR˜#m”7¸pÏE‹Š·íž¯5ÚC—z%™ë¼g”ýL ­ k913Y5ÏЩꨅZò%€ªg]åKn½@ \Žíiß¡v=q³^ ˆ¹À RŸ=<8\]„•¸5hÍî Âã¼3hâ"GbÎ?›hèõ0$ºh­s0£` ‰Ï*w[\²›Ñ´à¸î,h=|IjrzõE4rŒY)‰æò7MûÉ꥓*誆¤NÊ Ãï#šc$ y:_xä"6¦!—WÚ"Ö"ª-õF¬8ìü §j7 e®>(°ñVR”T÷B„ #jô景9¼äÍU…à¡PB…'4l ›¿±+É T¾u­Ýð ©+l[s3yÒ•÷ÝÂ}Ólz ;6ú~‰Ù_FæÞŒH„óà:âb£ÅŽÍ\˜ð+;<Ö…DÞ®/-f6{®ˆÉ™BÊÆ†¯Í•àYáÙŒK ‘Ầ•izmÇùdÞî0CgUVq÷Uuëà #<Šz£mÛØoTM(•èy§G=Bóp”ûÝ…Ï&ûˬwË´>©‹I|Y¿?¨‹†Â³$5Ï€¸5½å‚mæɞ”'»L˜vœ-Ó?[³³aߤ-}Ü=½á‚ð Hk‚! ¡ë]Ø‘N] æÕ(“‘‹pƒΜ­ÁÙIYeñ™#n¾d­ Š"˜°"kû.2î%îÎGõä‚JÂ;'•‰öµqùC•©à‚QÈž{©Q-F•@›½Y{y ¥8“\¾k‚UªÅ£su‘­Œó9w8ö´¿¸ƒŸ`ÍË¿`ξÅÀ´s7XŒ£Ã×fdõtžÑʰµ¤In¬øm3›Ù”Ýq]ãWçÈêžIi:¡a!‹nÏ)ÉQõœ+r#ˆ’Åt»Þëk›ç9Îsœç9ÎsœåQDˆòãÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝäBs)öÞºL —® KkÒ½¸ã¢‹,ülíÌ죠à*ç=¾–žQ€S k˜”ñF)‰¸IÛA ïf7#²³n²¶žmD $ô•=®³Î06•áêê ;GЃjô“vòy/ÛæbJœj›Š:V@ÈÒ}€UÓíŽØÙðªÊÛûgFWÄ`—r㎤5Ú)-Mj öÇ’/´+üžX“!s/'Œqz¬áB@Gm‘†çÂöô3™î.¤¹,åhJ'z\×Ñj-ÙšeL×¶Z‘ܘ”nœ)ŸO³º=““C‚a Ë z¬e‚q ùâÁí ÂÒš–ÞlèUPr]Æ2`ùŽÖ¬·®‡£~u掜QîóДÍ+¿g‡³ÖFo[%a‘-©,@rmi^}w3âæ‰z>…4I.W|w[K¿4ŸxÔxkL[Bìñ(£}åh=”*§¸Š ¸ny‰ƒ{pW´ä£B¼šÌ9opUC¹yͳ |\Íí%Ï_„LIxr`û°ÐLÂÁ§$ÞþUóÒËÁ[ <ÉÌ”.O€¶ÖUV3 žüIÒš"OŒVÄ4†|’ Ä`¼gw,’nu¡¼ÛŽW=ÙîôgÊSÓu„Kƒö KPàzP@ZrÉ3emnÍT䛚×!5Eižâô W#æYÐúÚy®¾Òd4ŸCuQͨüKèñ0bÈH&Q&†3Ši&¬tí´s„kä'«"ËR튷¹×˜ù6Ð Í@½{Vý+Qê$Ç©£…E0Ánö§xÁا*Áv çU!ƒ#i¸%ÔÖÞÔʰ´ÌLq掮-+Rg åÚi WaÎGàs-½“mŒ’¡à$Yð‹ê›\ùûÞèB¬ ´¶˜=ˆ^݆ åºjðWˆó`6®YÜ}.ÑÍòuVsmñðŽEŽz-¹¹ª¨;Ô›„ÑèçËO«xèH‡I[8ÓT½%ìmÒ^Qh”iò‘¹•~^|*=ÓõU:é±Å[•-´Ê™h[WxWnK¸2 —sfîÔBˆUh:…¹˜ó×! .LI–ÄŠ±ì¬%‹^I¬_Õ÷Ë'„¹ X×Ù·Íâ„s ;„¤˜†×س zµuljA—b¶±qžzê±E22ó›ã¯@cxKaïpI••½¬d °§Îü)í›Ûq6FÇOxØ/½¡`¡jÝån£W`„á$Æñ ‹;¼°K³L”¥4‰"$ãÇ´ßJ Q!P !šQ¹+=9úöû;;½îsœç9Îsœç9ÎsœçM•Œq uW"šÍ”‹Ëc V'îb˧ÔÞµ±òÃÝ´Íàf†Ú£ìy s^'šýéñ½4`¤ÕÔ6.=Øïvå‰ÜžI‚ ™`àpL ¥®‹—x©Jâ‡ðH]3ŒL©J4¤ä¨³D>™IXÈß¡ÁÁ$Ô¡†Å€U£‹ËDX`ýå­„ž›º?Üp8Å“9ûö‘c4“ÛŸäüûO]ën‡ÞóÞîï§\PKÞî¼½™/”½^TÁ÷"ʆ¤åsò×{˜8hù‰^Œ£ý€¾x§(*®ñòøwø”>ðÀf¶~ƒ~W? `ó¡ùÌo,uäaÿ)/í2Z —bÒÛåB q—Ö̪ØõSAŸ®½÷šht{gìªÖo×%ï€hÚЃ٠qZm[)=eç뀴@Õ„XÛôåë×WK§ H¢8Bö¨m/A-C±`'µ7¦%1ÜrµçÞU81ÛÈ%—ÓóÄh@d˜û³n¼›ƒë¾òä´ç’I`ô[‚gÍÊó>Ú°D­&“h便Q D‘{¬Ó0mÕ!ÌW©ñç%^ÉŽ…ºøßÑ€è²\ÇÒ<{ó¥ äWY\ÎôIå/M7Mlœã•­¢zÒ¬ïÿ/öÊD‰H섇â…"(ˆ XAd„Xª(A  !R ’¬d‹ ˆH,ŠEX,ABHªE dŠH°X0‘I$PIb‚‘`‰"" X«H¡‹QdX² *0(D‘cd‚„R*ȤYªŠŠˆ°‚ÁŒUФc$RD‰ ¤‘d`¬€°PPD ‚@Y$XE ² ¤YXEE"€ (@Y¤ °"¨²H,‘TH(E"‚Å~áÿˆBûƒUD4‚Š þ5Jˆ OµëýTþ_þl’ÿÜ  Õßã*¨¼ÄäíùcË7%Ôÿà™fÏÿ›O ®w¶“ê­9™uÕÿþ¤S »+X¨l ë„SEBŠ"hܹº³JÒ(Ð^J¨ÉšdwÈJü ‰ÒÀ?ÿþÃ÷øŸÛéAFŸïùþÿ©òzºô÷Ûñº‰ÑjµIÐù—úýåfT.ã°¦SêÞTÿÚ |ô'ÿ’Ðä?3m½ˆ=Ÿóñó¡àý¡ÁU?_ýìRÌ @Z´ Ånèâ0mJª#!Ï¶Š¸T¢¥,Dj©QUÿýeDqEãÿOýkË®*[N*‘EUDhj©©B¸ªUiZibÅTET¦©(UV,QF~*…DüÿqþÃíÓÿwêî‡öi4{˜«KŸd1h‡ÿÏÝEW×zI0?MÏùžƒ‹ ±?íýÿWÿJÄ=Ð c³ÿu`—PÐ ßæœšN-@¢\ *©ä;>r̸ä™ ü‘YKEèÜ< Dn9h?0ð-•ˆ4€(9ì.LäŸZ  ÐI%ûïû[œ%ˆBW<Î÷ÿ{QjUxZÙEL~È,+ÖõÐIu;¢"ª ¤:ü"ÅXA%~tY ’QðYˆj…€ˆ"A,‚„ÿãĠЛ¢ÄP€@4~£f¹CŸP7°^Ž>Ú•H@Ðtû”ÚØ5®ä|Üçl«"ôÚ¿`ä1ÁÒÃ&Ó¶)„SÐ8 ŽP£ð†$„O ýÄÙ’¡AF¬ùQEUWúÆÄ¹7,×0¡Uý%ŠVO>ã#€/Ñ`6C7vQî'±•laÈ+XF…¬“ý×èÈŠŠ$a&oJ’çùÙ´š„4*Š¢¨›@g‰ HWÔÁJŠŠ¯dôK„Ø„ùOú~¦>Þ7<åb‹S°„’}Byþým8tЉT¤¥¦˜«˜R(ÓCL¢’ƒi‚fÖ‘Ôçt’BEƒ¢DtWSÚ‘¨3l!`À5-݇»l]”(n@†°XÅT‹XE€ŠÅ,EQ0 ‰›Šú5šB•øªž«”OÆB\j,¡ÁC× ÎÆÇäP¢pD@ÄåÃ30TAV,YQ"…0)‚ʪŠSI&‰D€‡õ÷ Ñ:<èÀâ‚ ¹là†Ä ”5FÀØØ\ÍŠœÌ›Ãªcãú?BË:É'ƒ¿±’·íbtA ¢ÊŠ,£cÿ•¾*ª‡¤PF)(áôc+Éè,œ7 ³¬ÕÝÙÀœý?þöÕa¯Ò¦åQ+}£­ñìNlÅ~ ö?à ‘ß^ýê\â ˆrÔ|<™_ŸÛ6i[üWø XdP8ªU¨( `PTAþªŠ/íQ?f† ´PZŨQE¸7t*ŠbÔ P¡÷~CDÍÀ´n‘E%YBƒ€¸”0„UBA"±º Öˆ!B¡P ¢ *@Cÿ·õþŒ?Õþ¯û6l"â°ˆaD µ Üpÿ¯Õ;d  * P×;ÕTtö®÷œ€…–s`o”„ˆ! ¢”Aý#Q¢¼þ_ï¼ã)pŸø¥A\ô|Ô \þ?6'VD!ñýüßÓY¼×3½cUØp*ú¡N›KibÍ›]Õ" ^Ûu¾Û·†«m“„Õóx²¨UbµKm…Õ¶(¥Ê˜ln©f(¨­óv‰“–ÛÀ‚À%€yÿÿtf£ÁpŽ Üý+òí?¨ŠL_òk&"òÊyLK‹IAüheR„h·ýL—îsr&î½U¸¼Q˜:ì:ÊTE\nA‰)<Å>…YɈ¬ÙP†Ü(¹Ly ¡šˆ¤´àTV_‹Æ¸•æ{Š#]9˜-“æ {ëÞÉëÿ3áüò¯ù@7(R/hBäÃâFB¼xÅŸ.¼Õ%¾üÃô}@ÝãîýÞ1Ïßõã{í,®=Á…° ·[Ñ´TÓãý´O½ëß:ežšÓ)Ë|İ|dæ.Ú:ÀÙö€ Bõ¹´l „…ÞüßýªtŒ»¥I%|(ÇüÕüÎdnß?û%–W¦†¿K"ÁE7J8>[?öÿç_X°Ÿ0þ#ïøÓæöM¡^Îà_QˆCï?x‡ôĸ."•íOÂp9.¢:Yɇ€?tþa9Üù`qç¹ ·9tËõI „‰Y J”·ó”׿­'ÓÏ·§çylúýnŸ¿Ï›ZÖ™™™™™™™™™™™™™‡—y9SG 8hÖ»£zæ³É}Â"êK€•DdP4«]¼!6„ã?Ä!æQöév„ÙKÁ­ŸÄ&ð‘Ï´÷aËǘ] ,•€OÎü}~ïÑüãÛäÒgñÎwºvÀÑöâ¨ü¡ƒÿ½Î´ Võý'Kް!#ñ Í â;GXû4€3vAæ™·ê‡Þ0 ¥2%áŸ_~€¤s ¯·"z÷zÏÆz䲦çßuÎ Èo«±8åo)¡¥JÍïmåºn’…¢ 11"ypV0E“­+*T ÜTKŠÔ«BI' ØÖs ¥Ü„lÀ€EA¸ˆÎÍÖµ½^¶ã)ËTv¡å”Ø›T+7bnì]ï;мˆÒÛy†L¶Æw2@*3š½Óµz#3¨T¬…#ãÆæF”¶ÛvÚšCAf`vdùäDVjª™™™™™™™™™™™™ž÷½ïG?õÿ¨Éÿ«cÂ{Q^ò]ï.®Ë.£{ÞU&uFTÊjêÛyïqÛQˆ•à­¨£ñ25F™°npYªˆsaPÜ‘„›»w‹1‹!ŽLÙO(vT4Nu‹Í áF ‚o Ý ‰‘:5­6böµß;9š*ò UM–ȱÆî/Mç\@UmVF’½›œe0®f0VtpeM™ãˆ»0àÛl˜f/§5ÞI­˜‡6"#8Ƥ´¡É›VÄÔAjDb]MBSªÕµF4q9ä…Ûׄޯ†7Zé ÑÇAÝš–h¹YæpÉ™[´Á£E–j‰ ¸gmq†°Çš²eÉÇWÝ2V†p3!hV°‰72+T7¥*Q§@- Õ‹Ã"*1¢3•zÎs˜  ˤ$X`3¡FˆŒÄŠ2”ÎnLÀ‚‹8M©:«fðjEœ’À&DX:ºŒE=rêëÙ{‰R^(y™’òXmÅf´]”vvHj8ß ¾é²Àé—ZŽ6ç™Þ›Æˆh ‰L^jÈbô$L@[“Q@ˆº«€†ªÄ F2˜,Ø« < ¶ Y;!]4gÏ9Z;7ã\æ¶seÐM•Î`ÌÅk7à —ÚÑrVy¼=\¼o¥KîæY³;Á¹<¸TÉr¸Íßo˜Ô2lêca Ê1•·”Lw4Ä4kyq¼“ŽqE"g22 @«aCX°d™*ébf¥ãγs0Ì—ÌB¤£¦£'9Za¨w.Êé»ÕFUM•ð¼Þ0ó9K9Ì‘®c:sÆ ä§FŽôÆeS}§Afû›7(Ï)›ëX»(Žîï&`–h¢iÉ\Íó¦MHl;·gs!5Ö4PÕéA¹­ààl8v±hZ«”§5˜ÔÜá’+ÖòíDæNvàb6œé[Ödh¡Ô`Q$ä@…$- š”¨ÃDîÆ«§Y¹;(æ©3ν†u x\2ó’©¢DŒXs"ÀbD–ñ 1¡˜d­&(1CB⬀ÈBH±˜!H63ª¡. xo}×tf‰¢ˆKMìèasgIÝÃàFØ]¶ê¡‹˜pä × Ì4IMdtr‰:f%^ ¶È`¸/Nãׄ7ÃýëÿýÓþý«&Ti¦šrÿáŒZbîãÿ•;mœ$*_ñCQT£ÿ•& "ˆ*ˆPhA¼QZgët›µ9?ÕóÃ\ê¹stŸú™GB¸iHV’WûÕbŸÛæŸål0ˆXÿƒ­ÿ¯¯Œšgû*·D1ýÅ?ÂÿÏû÷Ÿßçó×â'³Ûô’s¿§à?Qû£OÝ%þÿÖ?N¨Ÿu\»)þ‚þÊ”)JEARÒÆ¢öÄ ¹tÿÀÃR*Û¦í]SCZª§d\¦ªÕõxÛü¹²2*mOû&$—¡ç’ã·#f§ @wìºÍ™@32—LíÆOP¤`ˆeJQÕ4V‘ª¦Ö®Ö–è¶Õˆe ‡¾EQ€L°1 £äB8$å6lÉPq’ É„cö™£Gï!œ(¢‹ˆP<…lF ˜‚)aw,ðȸpwü°·5Š2ånŠTSUSª¢÷nþÕYÿ¥vÿÓ:oÕ)mÿC~íøùü}ñ?¿wúÿ»ñ׿×êOÃ'ú·­[ú%ô½zºSžßëþ¿ëþ¾LÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿ¶ô¿àæý%ù(Žƒ~Ñii§·Â²$ôgÖl*åƒì'ú+¦Æc:ÿP¦ãÀGLAô£˜ƒP ˆ‰L¡Ù€Ø¶X¨]4Uêÿ¶’ñ’ê…¢ªñ‹êßu¡-.”†r¢ ' µtT¶¢?ÚÀl3¸€H ‚qyiÐ!8e8àÿ õ5T\¦Ñ¨¿ÍU¬¯æQÓlÂW˜uÎæ3º¤j& zFOΘ0 Ëa¦]›8¢´UË»4Ö‰EfŠºF »j­Š‹Ž»®µ•Ö8Åã R–ê‹i\µ‡ÜO“µwFgÅDkjMj)¸FáBD@ˆÄÈ4!‰P ½%«ÜÑ5‚/-sµ®¬[T­Öíáj5Ïë% “Õ\Qɧså`9"´N³ô‘Ȫ ûÝ£’rÔýª 5?«œt‰¦¨†zº½ÌÕ%iøÎ%ŽÛU¥V“>ê³åµnÍ]jš«kªÊO.-e´%¹JcÕzÚïTS¥kR!mUnÛš¬Ed²®ìªCŽæ‰Ò DE1Fj?ð¨j5¸ˆËŠˆ …Pü,¨# Ü qn¯ÝçÓš´º¦UfêĦ¨¬´¨¾ աФG5kUIeÖõmÖ(­VÅsA—ü‹LnÀ&bT¶¢Ã"N0M!‘F 0HqY|¤¨þ"³'. %ÄYÛ†`Ÿe†Á&ƒ´!¢"8á’#q>Eà1‚b">ag4°ÁQùüdåsWÕZYu]¹K³bËð¼(ÿ»m§ ›nÊ,dø –]®BÌÔTÍ[œnuð³$8©™˜5™Ç”½¾DSÿ®µ…µ\MoV†ç 1ÿ¡ŠPÖò>¹3G;¹ÔX#N’$ û*Œì¯czµæR8ˆþÐD£"4’jÔ[m¸ÆÉ|Ÿ?EH$Y Ÿâ,­~lîÍ8Ó]1ÿê]®²—òÔvk%f»»£&ò¡•×€`b¼²_~¦E–žõ,‰1ïTåœb¹ÚÎ&üsUd±`xA†«WIŸê ïÏÇeø³yôò·uû×ûuqÌB-œv‡þG¾Ð>fQGr å˜ÒxÂc–Ç L“ÈZ €Í²‘±Ž±C³&@zÊßáÐþ*þB'À$p! ÏËN(FPdobø÷¹K¯3êÄš1Y¶#è P‚Š>ßô¹§–z~9ø}œçiMÕÄ>Q럣µ1 mÉ»¹:ˆïõ» 1?¸b£ßËÏ~ש§eP”~ ÄÉÊ8r“Us°)!‰å °ŒòhÍ&ë„ãä @È'R*lP`YzÙçùÛþÌÀ&<„?2²®¶ÝªÞÓ.ñúòxaÃÍgÎ}j’L™lÖœé""IŸÊpÝÌìŒäUþJ](¬:pO‘ÿPO“Q«‰@ÁÙ¦ð“§"aKC(b×kI·[˜p„Ê2ÞÍ+Å<'š¸»ÿˆù–sZ;˜s+E;˜Ü]ˆì‘SB‡Ko“ýäÇ~ ! I®(Ep±JôðE}¬ÎAÙBV¨fƒ%˜”¦ƒÍ-í”»;€wH(-S”¢n1‘ñ’G*2·+D¯¦–„-È ~e2‹_ˬí¥ú¬ÌQ\þ‘A–iù!öÜØUwsA‘S¥Yb/ü[ãRC“–qé-Bˆ$ÃX÷È“DQÏ¡Ôeê#üB%ŠÛ§IÜ=F (·¯Õ¢(ªŒf2quk ;h‡vax?ŸÜG>Ès¢üv„¡›m“B ß ·+ü>*äa^:ù“òëã ¹ý›SKd@B„x¤¨<4Búè+Cµm)rGŒA'¸Ç«+ͽ¾3ùp°A5Âgr™ˆ>ÿ†ƒ yù(²„öŠÝG°«É¢ìST6hö n ‚o%Eä¤DeÁ§ÃË3ξŒå¤<Ëùðü9:Ò€ œ—=^EI&"kÜB2ÈHCü‚Á•)“ˆ:¶S<øóÎÏÚ£^4ù±¯AdÄIåLü±N#T˜z„I‚ÓÆ:=ÿ7Mz¿økE/ê2Éœ‰Ö¡©’RÙ^lÓG$Dí_)˜s÷¢p—!ãž\ ¶±Ø52h‹RG/Ø›©‘òÝ\ƒ´ß2d<±òõ)&ý{>a~gyoIJ“aŒ;ÓÞéÑÁ( Pm{Ã… ‹7Í'1Œ(]Ê(˜òŽ;ÇgÖºŽ +­*.¶XIŒ}Zü÷H}~IæÄôz l5Ä,ùøÖˆœ ÙaUÙ|_º“'CÛžA„R ‡‚ !â R)(šrK³ø…¹s0ëKœ…9§ÚÊ٠ûì6á²CŒ;“9~e¿\5¨uá0Œa6RƇÝÝf,pÑXö~ìpf—sF;ºn±ÙŠá ºêbáÜfT|ÉZÈ%ò&¥LÒÆŽåÊ7°a€ÛK؈k”A7_–O£Ràä3¯£ÓAÜÁ‚‡ƒ}g*éy—FˆuÐYNL#EÓÆ#½[í§6¦ÃÜôÑÁwBÚg/½PÒë¡ÑßP(z $Hl”]œ{Þ g²à0,´É«ºL`†ˆgÂZtóà´ e¡¢ £ T®¤:0y18­¯½½¢â$ëËÀoƒ’ØÃP7;CˆoyI“ÍßÅŸ"C³ ¦|ÆZú©¹•ï;ž@ddð&ÆÁÔ°Ù¦ƒ%Ò{½Â¼©aàA†Œ#€ïíòßq7Þ—”; Ĺ %‰RÁüò`¹ƒÜ²‡°c!M”G`ö(ŠTÁéz€–@<?ô3<‹ÐFMÇ´Q|‡þ /BAØþDú<‰üÏÔÐ÷ç‘,ÒFü½‚Uì$’@‡‘(J¤|íMaxÁ_~ëœÖÆÕU GNÆuFY‡)LëÅã5)ª\Vs; 褾¥L8{Ϙt`Z4RlØ¡.‘ŒmSÃnîˆ%Ø•ZûÄRÂèžgM— m50r’м0%ô<ܦª¨)4Õ—vÚUNqv˜«¸Œ!Dš… l(Bé§‹ ‹è•'J„DÜNN9jèùj˜ÇW‡v…¸-2שz._pÖj¸¦¼º¤®ú„ÄØ0ôÛuL.€³@y2R±!ý¦àßöÆf÷ì•–\jY䀣¾É(1·ýàª{!ò€XA—BþÕ26™0?¥r? 3ù¢ÿâ²r“Â.(‰;êI¯ºP7þªúüÿ¿ßî?Ó`+¹{Ó÷T T•ˆ‡ÉÑä”\‡Ôìñ,OìµRÃòÙ!#@!%AûWK~" B\ªˆ@,D)•#ùþ§Üö¹Ô­GûÁU_ñúo!«’?–ùöˆ";²ù/ízR5º¨îšx" W  Ь†–„B‚„BYÎAâœCH h6B**ÈWesõÂü@!Ãü ª?"!_7B¨(Qëÿ¯#„̹ÿ?öŒ¿Ëùãñ+>øÖ?ã›ÿ;ô+Y5ÌËï9î~}ýOTTÜEƒ!ªdT8A®cß!†EeuÿÝݯƒF…›ƒâqšª¦ä‘ºgJ䪣 ŽäY;kZÅ+6ŠD:lÁ²Yˆp×w‰95ž9Åài×]ƒ¬œ@•uÀ&âÈ‹ËEÎð†…½æ`–®Jfs dÇ6‰x£‹P‘å@0£¥¸¹Ú&Äz,t½¢@ÐF:ìCI!q ím8ªÁÖ—C}&ä2‘v`âdë‡gÕ‡N%ЇY™ØCIB6.á½-D†pR;YÈvôn9ØjEºÇ†lªIïûu°Ö†ªDÍGÀñ’`J(3åÇ&±4^Ê^X† ®¦‚ µQ]Mæ¸rS‡£f#…雈bS2®©ÅDáQ'pœK³@—³Q—¹ÖMl¦M‚ˆ\tÕfE›3“ºîSnd Õhìî¢ÔCwãÅ5Bž‡+©EݳS7Qk‹Ä;E¸Có‘PÔ¨¦%À9¬Þ! ªùŒ² ÷:×7¡ 05—{Þ÷Óyà@‡HI È“ Q„ÂY ZîNã1*Á¦B ªk𨠤9hS.t©&€"& 0£‡¬C+ ŠhlTÑ$w[-IX@J4 ž ìZÜÉМªR `@°N 6Šg½Öz W¼V"À(m › \8ŽÖibî¦Ö cµÜtíº&‡pwduTœÚ® VR­-•¹2¨Tʆž•»Ê¥1/`¦p-Ú­º.!HVn¶Ý0½À ª`@°½S” ¡í©bb¦ã•KÚ¼Ó`L9PÖ‘ÂH:4ÞÔÀ,pbÚv( áCŠ£‚²Õ°0i½QwM1AÄ[ÈPS(º¡`½¥01l«w{HjE/›]¢à¡F±Öª·Ñj.Q ÝÑ! †J@² U)Zí®£SÈ;4RÔ (sÕ÷ÁlRÔ4b¨ˆ±C¥¦”ÈãÀa¡À©§º¤ÊTyz’`\Ö„¤C Zš`m¸:¡¡J¼I$”˜P‰¡n¨ê†^ "E,Ò¯U¹¤]ÐtZ„\‘ÊÇš"lè-É$’I$±°¨JPšx´I/ðÄp-ƒ…p«t¡X”… An×”0¦Ðå@#Ñ PÚð79"v£J¼5Yæõwwx ¹Š€äGªç). 1\‚¸Ì1,ì¨F®ª³UxABV9ŒcŒ}Úü,Dyœ¦êŒ¥ ÿß‹Æ5¤²C§–Éᡸo)"S“„ášÊn!™Q6½Š—Ö>Kȯ4‘yT ÇOlp“pš \fy^Ò»%$ó¹~6×îäi“j0€â‘r)RáÐe2VãÎ2Ÿ/½º`¹‘>?<á‘Gi^å‚4ú©¼ÖR­50§sYq`ºÌª®¤b J¢¾î$QãCWoHœgŒ’U7fG¯€AsÛ‚~Ç"©Ž 0b0w0R-š6Ü‘gö+ÒªÊIŸQ c%j«-øø¤Â²÷6ô|`ùÙ„{Yµ‰óÅ/Jýw@)Øð‘.òÔæ¦V¼Þ„ñAÄôÚÇ{Ü‚ož9¬¹Tå5¶KÌ—ñxμI+4^ô„'%Òúñ¤9O«šLz„[,½gãY8•‰ÆõâäÏSÀ¦Ïz”‚ÅÞëvi`v*L‚<ÜÅ®Vã'™Y¼èsÛÕ¯‘¸Õ2ç…g¹½(oá“™€YKi‘šï1(hf ´ç®Û§²ÐÁºá®äÏ~PPì0e„{±òoËë3Ì‚ŠµŠ*µÚ ÷²ÙèУÀåeRÕêHbŠ\ßX¬+ xÖã^aܱ½>èªFówb£`Zîb ”z'ªã·szåjA0Az ü™”ÕgÌÃ0a´gìpç£&c…í*zê lÃÆÙ«xn/¬*=åû-SÞÆGB9îDÕ¶XñYƒ¸I)e$œÊacMô? ¹Y*cƒÒz3½¹I°ÓÝiYŠ}‘×F¼N1«¥ÙîÀ·ðŸÎ)ÖwOlþ³Œ ¶1#󘈟ÖÎîŠTåpÕu7·HæO,­¨%“Ô`Žƒ±%:¢I-¨ä¢v«,O'Ç…ç Á•p¡¤3ߎü(Ä€y ÅÙåJ2Ÿ^4^!‡¬£Ùì:í{¨’!Ì1Tƒ[FŠCpÜÙµ€¯>-ÊYèïzT@–`µUï·JÎÝÐ;tÛ°<dܵ‹Õ˜tQñ¢£‘=é[xÍowiÂZÄM÷sR”¥þB$¥Š¡d )"Æ(€d€ˆ €ˆ‘b «ˆ1d Q ‘EYPˆ¨Šˆ `÷ ‰þwÍ_AÛ2Fs®îYËhLEVmn8Års•˜s”âÏ9Žk<¬U›™Y Eêù0‹•!X RÛÅZÜ í 6 ™\ç1½‚¸€+ `¤ÐË ­åÌS|ÍUІJÉ´„·:Î.k6ó”I¼êùq»£zj·Ík>ŒiÕdc©4é…Q“¨sƒ22a´0¦1®Wa3·| tØ]„É£A³”o¹Ñ^p j¼)ØJ22 yŠÞ8q¨ÞæŽc.Nµ‘‘9x›BÀȆhEtM=ä0A9î7»½ÄšÆ'dÕ¨òbuV&ÐÂ!É k©÷YXÞLÌ÷F·š£šÍk5œ×ù4k‚éîuÚæ`¸ÁÛ°ÁÞÍQމ–ëWXî7ãCqæuUYÄÒPTÈyÍÍkV^µxŒŠ rò¸9*o'&¦³ª5«ªÎk'Æ c¬ "À•QYÍåéSÎT郇›yš»×9óUÜó9æò™è@çxj»V'æIÛ½cXÆï{ÄÍk˜š†‚°·[åëØ¥ Þ)HZÛçP#¬ïåj Q#Ž]ðCI ¡нª½V΀¢ÒÌÜ͉Žè³(š2©Ío]ÞÀ¾o*šMv)BeÐ0l –‡§1f“ pfмP{¥³¨P†Sz*”ÊEÚF!ÐLÕ0¯#Ç*m ó;î3Ýï{ß3žQ–Žî÷yΫ¡EŠ«Ô1›»Ð§:rêñš^ŒïYCèBŽŠfô[{šB€€ÖÆÔŠNZm4"ï”aй8#;´u•1TJÅX­ØeºªdJ±d¥j%Ê ¡‚;ŒgÍòËÆ-¤câšxÏjìÒÐqDŠo±¡ý8xþãGx Þ3=Бïd—#Ñì²Pš#Ý–i^t©ad x „ApÌDà 1E²L"äâ¾…p„€X!µÜ/xÒl®kË×3ÉU™ÌNðé9°ëÉ”¦iH¼¨ÖtI:8 &'õ¢"`EE[W‚¨ÊŽáQØNÁ,`,jP¥)+;Å@0Ú„[ňÖ!Œ(D+jÀ«r½.½põƒ+Àj¡*æ^zD<Ï™3n’Ô Ñ‚€Š¥ D((t¢–¥ëJåwEdBà# ©«©-AÑA™j‰2%âÔj©CP. sD.ô-ãJç8Ø­\)¨!b0&iBñ€KF Aê• DÒÞíW¡M ç"„ªU$ àT¨Ž"$ªEI•Y‹W6-*Á`,U±RªT¤iZT ÅB "„T"$ƒì¡ E%걘ˆ8Š©b„"AXjh){Ë»Eµlmª¦…È”®LA -d h6-¨–†`´Ò¹Àº«ÊM † CÿsëþOý)ÿÄ¿}}ŸU#Na¹… Ì”ŠáHÅ(/œI©ÐÀá«7­UUUn÷›»»»¼ç.îîîðìÌÌÐñîîîñˆˆìÌnˆŽûÞúyÞkÁJMNƒ›|5„Ý j×6 ‘’î‹òüTð ZïƒÂS*:€([ÇœkŒÈÉ ¢Ís@袂±”.ùKz`ÒPè,BÙ2hîô5©¢fgHŠ·\SŽÇc¿œ‰¹¾ˆÝX&iC”'è5°ÖM€!QQ_QA@:A¯÷ý@Vˆ,DH² B ¨éKúâ°£˜¹}§Ýn𤛡(ZDÝT½†®0e%Ï5\† †´m9ÄãÇZ6rH:…A$F@Iäjg9ÞñŒ†à;Šf仦¨’.06³€)º”€¤Pd$PF # ˆ‡Ôîß7@ðÓyÚ%BD ä@ª¥!¦LaIIB"¤FA*(0ˆˆH¬‹xÀe›¶€>Ü•£d’’ UA„¤¤‚’’’ "ÀF4 NRS$"0DB"AdˆÉ qqØzÍ ‘@* !D CdFH#D…ÝK€ˆ"HŒ" "AD"! Œ‚0@F0—…ððá”л"0€‚BPˆÂ‘A‚!D‚0BÀˆ’È !€!!a!¬u5fÈgÇqPÀDˆ€ˆÈ"2,’¤ ""$¿Jõ94Ú¸2 ¤"Œ‚ÈX¡"’E Y„P‚„P "ˆÉH ,‚ÀXE‘`(Ì›V°e‚‚É@Y"$‘XE"ÁdY"€²  (‘QHD@I$öCÅ5aƒ hHÈ,"ÀXDФ °FX ¤$PRÆRAIaFH°‹FEdKàæ¸ásI!$`°X, a¦H¤$X,R €°‚€²,Š€ ,‘H}¦È,‚’,"‚’(DIAdY"YB d‹`( B,P‹$X , Œ °ŠŠA@R "’,‘`(E ²# °‹"€¡°Š’)"2 HŒd‹@AdP€,‘dP ‰DBÀꠉЅ °ŠAdX)"’,‚È,„R,°"’#’(H°,  )$Y` ¤‚È,H²E$RE€ŒadФŠAID ²À ¤‘I$R2Â,‚I„XAaÈ $D€¤€¡"€¤ $P‹¤PH  ¨`„M¡\_¯N´É“lxëËk(ºCÀ*j”_a€±-t¥‚ïN1³;†yìÐ,n ÆåÀ̯1U``‹µ&Ö.ªÛVà8€k\ÎŒc(¦s¢Ñ!­Rhµšµ d‘a`Á`ˆ Ç6øÌsNÈ• ¡¸•‘d ‚‚Á`°R)ˆÈ°F‘ °R)3žB;ÍÆs%PgÍ]o`Ý‚ÀX/RE#!"Å"€¤È A ,°ˆÀ`àÂtÈøœÑë«Ø¬ŠH„‚HŒ‰šJa‚€ "AdŠAH"‰IY‰"É"QLÀÁÀò€"AaÀ@éSpY„ ˆDa„FAD $!A!°à;ñ\šÙà@ˆ#pJ ¡ Â0€™€4@ü<ËÀäŠ$ ˆÂ*ˆ„"®`QHD¾ïrðd‰QT¢(°ˆ$"!‚B"ÂVÍŒ<”>s6kiq Dd"D„+|‰“xÈš )¨B(0Š, ‰Â"‚°€ £ªB(‚Œ £B(°‚„")ˆ:"„!XE„E ”0€#$@`AXA„a÷Š´@. ÑXAF„QaHAXAXEXEXEAXE„ Qb‚Hç­Y0ÍŽ„ê9ë!Õ età P @´°,4†ÍÚŠo~ZŠz¹ØŽï8Á’#á9™B̤K«ª³$Rön­gؘÆ@ÑŠÆ3‹¼ î ³e./{¼ ")0€¬ g ;ð;â=/ :óà+Ò0Œ #$D‚„R ŠE"ÀPŠE‘D@&MÌMÊâÜSDVAa„aƒÒ ‘ ²,E‘`² `)°‘K3²©«È%Ä5uÉJÙH°ŠHˆY EH,’) 2)"È¢Â)£.újÀÁ!¤„„‘aAIÀXÈ @R @Y$hѰiZ ì(°091°Sd$EFNÄ¢ƒ&È5dAd\Û‡•À\kHH2 ‰,a ¤‚É€#š¢E‰$‹$R"¤P¼áÕâHL°ŠÉ"$ ( YaÈ#•Æ@Ï4„HŒˆ€‰€Œ‚ #ÉDÝ„Dd`"H‰@ Iz¤Ñ/ÊÉ °`Ddˆ„€‰B"dFDH"A!„P‘„aaF@Dda#"0DB#$XD@AdY‹"É$D(d)‚ÁdR,‚‘d„DB"I2((Â"Œ‘D@X"ÁAdRDd’#$D‘# ‰H"Œ ˆDdˆFD@ BD`#"$ˆÂ"I½2Â"A’#$D"!`ÈÀ"!€Œ"2DI Œ "HDH ,` R Y"’ Xbˆ€‘H@R˜‘L&ß6`™ë«„ 5àž^ MåBÑ0ÍñJ"á…œ”h ØÚìkl$†0ZämJÍL“332LËl–Ût&I!€HÆ„„HH‰"B€ B$ Œˆxw~/%òĤ/ßW6›¤NDª„FB‹@XE’)"„X ² E ,"„R H°$P )B,XÉ×:ëžs  ‹²EXE#$D‡TT!DA!„T„DRA½s|jÃË ( A@R( AI ²"#"‚ÀP‚€,Q„*Ä3¢RoiPÙN„‚€ˆD"2’"@F ˆH’‚H,‚ÅÖf7ƒ»q½c2‘nɈž*^l4 Þh1Ž)Â~ØeB\o˜¢…’ÆIØ„8Bz@B@2EQL§¯5”Ë9Sßg_NJÝx–»G5‹ Ѽ¢‡±r'3œgœÖ ” ;Ú›™ä³b2‘Ï6› .#… ±`0ˆ0Aª“ X‹ÎZ ™PÊÑ$a¼ìÂ$A£Q (ܦ¢„É/XE£ÂÀ ÆBÐlƒ‹{j”©7ñëÚ+&g<×§òñÌöL´šžå¥vRÃD¦9 ÇŠ6Õàè6 FŠ,MAÀrbî–0–Rªq#)^6°Šm"…š-Z!²1"81E¥á „€ÈÓNlxHg XD0žRYØ"bùc}¢/Ø@XRP­]†CC€Šã (!d J¤¡*ÊBÆPÊ ©c± 0`BÆ!†`R@ªˆ`DBPAA*(PÕ–6ÄPІHž ‰áíS¯?F Ö³hù˜™}…öØ» øK届ÒC˜p®ÈåaÒ& 'p:ÀEaæp,RÁtcÎTd É 3a‰ iÊ©Ì]&íåÁ,ÖÆà †ÔúáS‰Ü®¹Q»p­Z ž¨˜Èdö‚¾E ˆ†‘(bšÖ>{• MR¤Þ—º§ÑŠ»ZŠû!µ]€du&£ª±ƒ’æ'-æ"ffeÉ$A!(º©’f¦q‘Îsœdsœçæì¤R[[AI02†“‚X¡qÐ!•ÎD-Ý 8..!jx;’2R]bÞ¡ES­ªÖÙ{ ·4Ë®%„FI hŹ*ÙÑ t™›”=(ФäLÃrÙÝ·f‘€BÉ‚t‡;["™"§H@q)H`1^:ÖkK7ë5ÉI] £H 4(lˆ†‘4ÙíŒÍ8Ê…Y YŒàŠÉ £7¬¦qŒ½„‰,ÙX (B ,V¼¶¶‰x8H …Dnð•¹yL dª fÊ)I©’ô µçH•X 3M_Ë_ –¨^)Wƒf쥛š˜Dõ À{NTçÓ郞cH?Aöƒä@pEȈÑTÁ} ¡œ},¤ ˆ&¢"ò ù² ˜Š§¯~T´Þ 7ìJUÔS°^A=ØÊIÂHe@Ü|í½Zùú@À^Ä}¼” & #ˆ y‹äÀ ¸ºÔZ 1DL‘O7Éb:‚&`¬ø%·A$VÈ(5güî”íGÎÌK>‘r}L•ô!€léÿ…•ÁÑ~Æ%£´+HÿÓæÂüy먉Ð|!¢ º‹ {C÷ш`?Ò“teFAtÈÿo;ëçÚß4¥ÏbÝ{ª‘ ðÖ[bήóŠõS›Æ7|ÚÓGÏ™®Ànã®2¼œÛe,DHþqà7 ~‡Ãñ4ã;LR¢9,Ó©©wdµÚ•+W&Ö$ÈØ £‚çú}ÿu5ÕPˆMa bª"설ÒQ'A@6êÔ§®L–¥(~ŽÐ!؋鈺"{A¨&À1ñ-k'º‡¶OtƒÆ¢Œ›,P¦î @t¡ÚDÊ€b‘ŒbJQD¡jÄ(j!dP„LܳEAI  ‘T€#ˆ)í’i„æcÓßYê€ p”!"]Aa†éˆB B!Ph ¤*€øˆ T."Í{c¹6q l¥JF"’an*YV#TR¥@ T)‚-Ý(z2¦(1 —I aGÞ*•„®ö‹ûð|¶.ˆ‚E3MÚ n(Âó`> ˆT$B)’VZ´bBꢊ@–!=ˆÊDPõN壟­Á0’cY§¾îüh í@Ý!™ð0€¤‘HD˜I=yÌ®°DIоDÈ‚’ñÊ<‚?H žD1t ¾»íXT=ˆ¨ ²*›‚óŽä(ê@ÅäkS´ºÒ =ˆ¦Èü@A=ðJT@º•‚ô=¢¾òË÷„Çâ¤ë# tLí°;FdŸˆ.™AãAª9+øÿ†÷.\ø¯´i{Âûüs¹³¿¾| ø¤m¼ñ"¶«r¹­—5ÞÔÊs%ç™ß™Õžm„vk Ìîlî[| |Vmæ] °ƒ¢¡.p`S÷`Ëd$œP @"´†P)P°WdÀ¾«éŒc"¦bž·Ÿ†d%Ú]ÝVêåâèÂÕ`˜ë¸…µŠ½kzν·˜F«›Á¬‰[öÁŒ˜œ׎i¤6ø³“œàUu0™§|u¢MìÞ÷›ºÄ3—€`ÜX°C)& ‘ããowŸÕ¨à’M•¨PŠW¥ÁäB&)è°qt%‰Ì(ˆDˆèÍ$ˆhÃ@±÷"¨oÊÕÂûW-ðÆ ÃCÃέ^µ%“x–UE"E¸#~¶– ¦Ø>ˆ‡B‡±q% RPhªoçÍͪ®žíK¥¢«º¹t´Cx@;8ÁHDKn娅ŒÌ@rD]Àȃ’ !!"¢*ƒbR@EööðÑQßµ)Qת1)ŠÌpxP£ó1àb´†½·ïeäøñVÅI|‚™Š²Ÿ?4£êæEO ìHØCt $˜tóé¿'‚Q‘PÁb%ê”!Pé¢ ŸH‘Pé™ää4ÈëÅÝ%H0 BaŽ :ˆˆÜFVIôËŽº¾+\T‚9¬ ã‚Dy€ÒHT5…Q€)&ÈI‘€ CãÁSI CÒ.!Ñ#}£‹ÞñkZ×àÑÂÀ& U‚HN’D&âe²J.¡hd>žW ü"‘W°UÑ9{OµQb%0L‘Bˆ*‡Hg®GŽñާN(U¤"Þ°€™ddd‡OlbHYŠEMÑBà?õR€ë~`Žb‚2¯yï`€r!áCØ‚nÞR‡¾¨_Q_b"üA¨¼ÒŒ‚úˆ!ˆ£¹é@~k¯”ö=7ÓñëøËcøäÛù¨<§ŒÂQÚpº)X]Å ‚P2> ûSë¬À63ÛJkæÞiíÎ#yœ{J~ùoý‡O´w£‚¥jíù”‡&‘CÛG%óî{<üŸSŸ¼ïsfr7Èt";Ô!B0!g''Èþ‡U¸„©SÎNÇzòÉî:ª³Ž8G'á{&Äc*f¨€ÆVISGºªÌÌ ‰ ªüófÊ÷.î¬×¬g!TbU†JqUjzU2`Î ²òÅ»ózöÆw€ÎTSšw߀ ˜MÓòU MiØR$Ñ„ ÛlØCÞ«(T@9z`M؈‘“"Aa d9•FÈN’Éïé›Ó|øíߤ’yBÙÅ€x'Ó"\ F*åY…3ÏU$2ê0šƒ‚ÚÔ%ŒU²!!LU‘Q4šx`A) uñ¹ïº·#ÓN¥Û|IwÆ›)‚€wµM‘ÑDbHâ õª‘~æí\‘77†^¨„4ÀŽ^¬Á´;…tŠ0‘†èAò]Qp¸ŠEMDV 0’¬-:C±’˜›4yÖÕ{/ϯµ˜á ‘C„@÷Š ˜p‚ ‚¡ITƒïõŸXY'uÑg0`F]Ö(Ÿz @°!¤QJÀ‹¼"´ 2&xúŒöÏn-{åÝ|÷ö À h 1Bâ+ñ¿¥|C„.üDQÑ=ùJš‚÷ãÛ7ñZÔ)j,¨*š"¨T_˜!¨"0Aö‚9€é}Õàû3ŠAÜÒÁ¥Ê@ʰB$1L@T÷ˆ)oÆ1í﻽اUhä-`XB)k(Å;ˆ dÌAä)˜® v(›‚ç>Ih¼‚І"H&¢` ñ Aá9 C0TõóïÓ†UWpB ¨o ©05×+X˜æ²¢éêB&ãCf†ByBÐ+°¸³(' ƒP@=ˆ¹†")ˆñA®Wjí 0DøŠ¯Ìh€ ¦!q]‘öùòÁ Š9‚î%Å ŠžECÔU|ˆ¸€æ"x.Ñ¡O0l&l¿2`±Ý>¡hÁ¡àl” v$BÇ××”­RuJ)0G^=y5ÆyøöÓ:s§XÊt¾)ŸhÆ£=á7zÄÎex̨=T›Šì¼´Ù5§Î¬º5jW[vŸ7vÊŒ¸=¸܉"E% *Ä-eà`-½Y±¯¿w€ 5¥Š$%ë>}z66a·7Ô ïºpÕQñW£bÚ¼9ê뱺·fÔ=PÒ˜€=X§Tà=«ÔÑÚ©eIvH$ƒb L†- S55mŒPÿYЂXšp^i1€'ˆÅ¯Úf!©æ™i¤ë×µ½rVmê±­+íGx³dæ)þ˱ð.€B0°Çäæ@:vPðÉÝ#¥8¡v[J0ÏFž!AÞѱ(M·Ñ`g:³¤ë;ܤ ƒ×ƺïŸëï$Þñ°OcʾS=Ú.ó^åã'rp˜ï„™3øJ6*ôfÁ ŸH©ÈÛË¥î ŠKmŸ«'ˆh×®LböÔó77%j´qjŽ£¡\жÙB†“,š#W½Z•ŠË”Ò5ÞåUÞÀw‹ìå&É΂iîÌÑ*'׊®FOŠ»ÛÇŽ®ðts’îÃt¤â†Šè¢C‡á!¹9õ¯{ç`Ñ7ð†™¡JžG´›fŒŽ6©!ÁëÆ<”Ø(Rª¸6‡ Àà ÂÙcÆ;º½gv"ÝÑ<Ä5•­‡M§¤8òòàHìß͵äOQ7š_j+<(h™¬ÓˆxHzÅ^üwçú©"øÛ·œìÃÀÏ(vòá ¦ÉÏŸÂp<$Ü|°1ÙFR‹Bê|A>»JXM"Š@üàЋ€hHä±õÚZåÓ ÊÂ3CVK6tD©ZGÒýpJ†¥%$ v1ÓøóJD:jþÛ›®3Ë{jÏX×.4CV,\äÿ¬T¡õÞ«J÷rôƒ7mJ^Zè±­ÛDÝ,&«„¬b=³.²ÞHËÍç·m. ŽgѦ<;`YÉ Àv¸(®QhDŸ~1­\ª¨Ê ­USM-¥ª,j6ÒUJhºÕ ®kfÅÒÁ×"x§$³"6NH¤Ðð ZF²qJìïC•d6ŒÙ ˆi¢ÊE9fÒ“%†fe³B1 @£u“égf8l¹¼ó­Óê`5œàñg ‡"q6ÀO!°"3Í}jðÔRº¤:ÊBßâQ¬9È` ž œ$Áfp‹Â9=&ŠémJ2û%¾ ƒy4/ Ø ˜)ಽŠÀ®#kM‹ZÐÒÕ @Ê&@ÉHdÁëÄ+SE”õ xX„j¦föõ5³˜;¡¨&Å“4½Á¬éVÁ‚ì†È:·1Š­`¡Òe4:Èì-r›Ï¬à ½øb{Æá“¡1ß·¡ì†“`TXø¦Íôö𠉲n="úò„²zóX|Ë:.ÄР; KpMŒ-1”f˜ ÞÁv–…€¡Þ0ں؅@×¼”¦þ7Ã×§Û~>n‹ªàÅ(ákk,Á=„¨j¨ã(’„•Õ›ø373ÉE@OÐYËÅ­£Hxà ÞIó¤|M8Ä:OHôh‘¨ÚG²D,€\ñIâ|ã²°!‚88QèVš,¶‰ B ÂzCž9Þ`ò† ø¢§¦C؇‚}Ž|{¾óÄ ‡£ (t4=•RºànN„áÜKe(X€9!i«·U¥dwГzÉ,©/0¢¨0E¯ŽûGOž”ÈFÆ–0 ]Ð%&JllôÁ…4@ÉÒÓ#Á¢€2EŒ¹9cÀÀÒ`ÐG +‚N ňYf!“T P0RÑ`èOD¹i…… ©+@0pÐ`°—6ô1&ªD … ¸R„JbS@B 6ÂÒ”””‘!@‰¡`Qƒáv‘ ¦¢Qd-0¡JÙIiƒT¥¡0¡ª¢%– ÂhŒÀÂ2" ÀA(90¥)tP±•‚H)A ZÁÛ°…¬H‹#(ByèÀÅíÆ.ñEËI‘'¦JdèLx ÙYÑY#—ñ4{£d‡†¸žÐÆ9è·j?és±Üú×s·Q-!²cš ÕWxç8ɹª;nœê&®Öц={Jœ¡˜:s2>h…™lq4ŽÉR´*@ì?2žÕ g\m^ïÔãΔ­½½'(öõ{¬=³Yæ«qÖž°Þ|¥ÃYùÍ6·l-3kÛtvÅšÑKÝÎerGR‘ë`3"¥Šöú:oîâ£Ò"„P‚å#Î>ϧÓZ®BÖî…ªÅ"U R°©E€ÜÂ8ÅbñYhP¥•Æ2.Qt …%è€EH¡ •HEr¾É Ë‘ $DË€ †Ý‘Of“N…(­ž‰Ã¨pèCaÐ:½NzÑê©Õêu€ñ8‡ÈV+éÎÊ<"ù­ê`К7 ´±”ÍÓåË‘2 )nq·œæõe mŠãªÝ±ˆÌeÃ-…6¤¤yÆúV*ôš™ã KôJ!'$2›ý+aXlÍŸ(eX, 1媮ýgØá8KOZ*&™°ìžÝ­ !"ï7ºÃ à@ùf¡y§‘u=ÈbM6†âæÏZÕÀY¼c£Ñ»ä`xÅîn×Ï™µ8Ø: P#`ìLyAŸ-(qòѹ÷z°²æ½^(ªeP I Î|ø Mùä,øeMʤå02æªRqÍe9î‹{ôù²ls«,ILãào9*½õ¾7%¥0­i°ªÁe »‰¤Ügi² 6gódé;sµ'-˜`xïzo‡±&1æÎµÉÆØÉÓ ÐÞ-Í Z+Ǽú€Olæ4Éü%O­V[\¶hK•ÍÈàÊàAB §Ô‹p,6_¿‘˜Á0“‰†dô¸eõD)íh”k¹]­ö˜Áñ:â™wJCà¥+6Öe:_ßã\ƒR\òíyò"míññ°%˜°öL§FúŸjTØ#U|^ÝÍm±4†YPª¢ü‚0Is¬fWÑ6¡ùŽŽ×1:q^aâ¼N!º9*/RÄËHÂB.ÜÍÝÌÕˆcCh¬, ,Q4:Ù°88ßÒè Ë,è,£|Ú:´ñÕGš¢È5†¥lI1€€€@‚Fʇ.îéÝegUC5Z½î¯jÖ†¯6ÝÝ25QØ*˜±EŠÊZõPï«’ÓõLæŽ^n’Ónªl›3ƒ"BäøúºúÞ{yâ´ž‡rêpæ{"â“qÜoâ” œÌ³°ã —%00˜dëlÜß% ‰õ7ߤb¡ÑãfHÒ]7ðV Xtm:DÄæ(÷#ï>Ԩ羚¾×ŠÀôXIä gÅÑb¢Èañ½e7ÕÙL(Iu[sëÑxF !àI|HÃÓ~ˆtÌuFD’wë½î«3ÀzõÕ“rL á%‘/}ƒÁÖ&L6&¬­”^èÄ2ÒQЦ@½z÷Áœl]Arc+DÄ—ƒÉ€AÜ…µh%A|D¨…E` u¡lPg碬ï)OŽ7ùª'¯š«û%iäg"C8(›½o½´=>F¤ô„ ô2ò||×¹¹„Lw›×ÔJH#±•íY[â1Ÿ;¨Ñ ⑘»ü€ñçÕ×›Óxa«ÄêX±4*Ò›‡ˆ=òÊèÔX¯e}3‹hÒK¶í«¸]¨¬ž¬1Æh1ˆí†Pµ€ìÁ"ä è4'§¢0ê!ˆM d:vÌ¢qM hMá° Q °¡`¬"†i,-ªr4ỳuâ¯Ù8 ÀÎúÀÑUž÷W‚·Üà*laÜòvûyÅr—!àÁ¿Ð쉄±ªáuhÅÍŒh5K4D­ìÈšM:ƒYÒ‚цó¡À1ƒØ CÀƒ:V!®TRÎóÛ†M.2†Â,<\GA,F²„œœ–ãB¨…M š¨=ˆSyöŠa‡˜¨rH\€Ñ9*ä‘J;2Vb!^ãè³yEÙï‚…aù¢+)Lžö`ŠžAr„HŒ! $Ø‚€ž¢‰»íœa»ˆlÈq׎¼ew\(ƒ Ég¼•4',åÑ NJìe/‘4Ãß7Ï>³Á·aä¢oˆÖÄ!–RsyGë}¶ÇT{ìÍÏy$âa „䃫JÞÌX*Cê5%Ų¬Ð^ôyOÁÆg x¿g¹íäHØŸ` wfD)±£sÅY3ª7R`²€î&DçC@qÕa0;(M™§ÇäÏ7v°Å™{Ô9‹ÌËàËß ŸN°W©Å÷¬˜A)äqç{#㌠!ý¸ˆC½0Ä´+á©8æ`D:ÈŠ€ö2,mc<Ç /‚ŒÖK’gÏ8óWz8uG)ÂdGš;Áª8õ«óÉx0p²Ra¡B ‹óQS *"˜9W¿2ÊɶÖ5q·˜«5﨓:ú»gÜé0éÞŽ ·Ã¿tPAÅ•Eš•©ˆ¾ «2Â=uØn ØbR9µ ²,‰óUó³tš0'iå6âƒÈ!~ 'l±&é·LqïŽþ¡"âØ8ãZûnÑ•ð8oÒ‰b7Sœñ¾^F¸*r]Œ(NXz®3Åd6dÙ<Xß<¶`t0¾èí,診øßzÏ Fkz' ‘,NÐ6CzÚ©Ä9Ý5ÑRoÙ[ùÏt×yóÉEŒ9놃Ó&“Â&ˆvÀ2o_7¬ ÙCy×9}¬Þ3¡Ä_ht€a“ÏŽŽLçV50$õ·’ÀÙ”!é,à¢n€y$É©é´cÌ0cmÙ(ÕF8ö“ F¼qv>S·²°ñÁAõëJDÙ':(=Vð"“u¹ßª ïbÃ#»<§2!» 0Û=sŒâ­(Dž»je†Ü÷É;g ;,졈„cÄ­‰JÜœoè à7 Cp ¶RE¦z@äd· £^$0™Mp0YC-›ëgÀÀèÆå™d- çÉ¿Žj4†4GN1n‚h@ô†­NÞ̈é$l¾í0È÷ËÞ²¶6@D‹~‰ïaV|ìl&âDÕŒlYã<Øl‡(v'åî}LU5²ƒF¨Y0Uƒp‡<æ² ¤ÜOWß·ÐL a !9êŒõ®¼sçûCÈ ¯ÛqÖÙf î’ò9e±â*—7 0Á`‹K¨Ñ °Lñ¾G½6èµ…í+ª1çÛ¿<ìà Aé€@ẄbM²i;:£Hx죃Tv‡ã)x7CË&[9S[·Àì宊Öœ˜Ä2XgãšÃœÐ‚†QºL™¢W{ÞFeôè­ùßYÕ>\9aäNÒtð!–zLŒÊn™Ohlóèߺ8³¡’ŒtYãš'PZkª'#=x ²ƒ±‡¥}00Ä@sç¸è"N-„1DH#Ø÷ß>âö!ÀžÆ7Ö.ŠÆÝ=^3¾×'–fÊeÛ–Üô†ÈM2^q}9M(mG¬(ÐûFVœ¨ŸïËU_Ä}½~˜Æ¥"5…á-&ëZ¿ùäÊ&›Âuã[j€˜0–oXÍ›±K.fëVJÉ,K^£Æ+Ũ– q¹u©óÝi½ÆÜ¡a¼ìÇGhhÿ-¦¡ºÖöc8²Â»™’¦‰¦¬ì‡hÙ@¿#1ÃgZ4Îï²g¢’‰²\?ڇî9Š?(æøÔ:¶„Œ¡Šæ œZc%g8ñ¯R2ú©Ä½»à(ÐîB¦3hßü}!ó9ªæ¶}²¼Ï›öï]‡·9Îsü¬_þ•ÖPZ $AŸµ^­`ê¨IûTÁÌæ[ý³¯Ys@㬨jR¥v×›‘eD¹¸d`øØKàRë׫Â’s@P€ø%hÂd£|ɽy³ sœRê‰;Ú]®…d¾œ–è†ûŸ¢ÞÂf‚¶Žá,ÉÃû'°˜Â{üøÿYñ¤}l¹À=]É2œÁù6ºþ;æ”ÞöEÜ!zÒÆƒFÆ¿ý@VÑ­Óg@ͬ†`xÞ‘Öƒõœ¢àZ`Œî!B *‡Õ ±&ŠiQ d8«Ÿóñ°žùà„öQúŽOcyèNðGkh÷ulü¯Ú„ÏH/¯v¥§âèÊßyùô¢ ‡ÊyéSÍþ™¯SfVª{ý1DIÊõþQXþ;©Oâ“£ò¾.”þ?–‘VfXZÓTOè’¨#3:¨è·"Yõ™3ªèŽhÙ÷EÜÍ(âõ&Xõ=ÇQ–V`µˆ9Ǥ䒅‹ÞÚ ¦©ÍðÑÒ›ú/ÛÙØ—;ÀþewŠ`÷“mq†ó'dUÒ˜l¸Ålj š¹OXIzÐf·<âôŸG è« L©¨ÿÓ‰0@üPð¡Lèpcç4§DlˆW»²Nö‘Ëû¯S´ç¿­Pw]£Cj¾OœôÞð3ˆÞ‘}çjÏ`Hœî«Ÿ¸ü³6=1ÎÓ“ê<‡•®@Šo§`BUì·™/ÏȸÁNÔ Nïk)夕óH4v^¥5Gh[ú)–ÜäÊ-à€½¸GéZžè‚És°¨É¹8kXÁVÉ¢·€~Ì/e«‡Ö+˜€ä>Ù”Œœ•ñ‚YÂO±êöÇÞ•5k}³xvVÞè¥}Ûæ\ew*Ö*‰7²ò«ú‚S“Û–”Þž‘šº£ó^›ê!ƒG©`#†ùŠ.S|!ËŠ—æ+Kè÷ZºAtzQ_|Öàæ³ ¬$ëyn‡ã#C8}#ƒ²‰äxdñ{“5iâ3{y€¡äaWÁ1íÅ6³¦ÑJ±"'TjmBm²*Ì,z’zŠ2KžÄ6ó ) .4{×w6„ç jjçÑ^iTüL@yLKî@õxd=Wˆ)( U8»ÜúîwCæh”}Žƒ^!“.r.ha=,ÛõE'ýŸèß` ÷÷¤pÇóÍÝî%MÛYͫʥ¢o,DOÑÚæït'Ý+¸ìß_ßÞê_Çp©½P£­zmŸž+EÔÎ}W½ë^ùÖ†‹>N¶Ɇ8Ù³ƒ¦Î0jÊ1+¶ìÅl3¬˜k.Š/nò` +³…&ÑZ¾»æ“§4òŽ:3¾à‰Í–+Åë/]Y¾4I·½†:éæ]t†C‰¦6tÑÛíï:Bˆ¥á¢`맦µ ÞÜÀúkRë¹°l šœ¼~šÜü´QÀ1½«Ÿ -¨ßð´ðqIŠ¥8‘!Ê´L†l-v{ÚŸÆXê±G/P‘"DJF—ãÑJ¶¼¯iHmÊ©€xFR¤ Xhã„Î,±˜0ÔKØœW1pÅL*I”$Púý§Hùo¨DïtÕeö\}™õê­5Þ©8eç7ZÑRͬÝy¦0Vu©Ì6õþÙY”ƒ|jq¾«Q}ëa¼>7’ó¥ƒÄ…Óþ‘ˆü8Á{‚S!®‹'Íþ1ô]÷Ý7Îe~_€èXpRš©Ò´…"ˆ:Rª¶‚ÄÚó3^ò·þÿàk¾ŸË4DßOìlÿ§d’ªç§Êïkn÷$5© ©ï¯I/&Û*ªÔª¢mƒ$BcZUUUZ…UΚ%ç*ªªªµ­hú^=m²­ï¾ç£šŒbªø³¼c“mÚçmiUUUUVµ.×Zo¬ÂaX ‰GÉ”¹Á¹öB€š¿›Ø =ãÆ2E¯B|i©^ŠêP²£Å:6ê±Cö®ÅÄ@YA]3Xˆ¸aØà—a´3’ìÚxÑËÎUV¤È˜Õg+wš¥UUU£>?ƒ9UÍRªª­É(šæä™Âªæ©UUhÍÚ¯uJ¸*•V±eªª­•J¼Xâï51wWÚxðQ¤á3ü®Ù’tØ/[N-ª½{m+'­NV“7ßòdÒg»³1‘¨(ñEîuš.¹2/OÐfº*;ž!JÃ9üÞ»F˜ð=PŠ<îuen[kg" äýdžp^"¤D˜ñ¬|Á¼&:Ì¡rƒÆUÆysÕïo`$aŸ^‰šòÅ=Ãèhtq)ù8w2SY“;0.M —`ù.E3:Ÿ?IÆ —A8Ê"sÜPì^k„Ë Ø3¬’Zj‘Î$& ›g=ƒ )¼4' ªb»Å T²ãÏ‹Z”™§®+¤ÕÈܵ"¶©ƒEIjã_6jp6a¡sœ4¬šëˆ )› ÆmÑ( z‰~Wˆâ#·x&1mì]†CL(4[éȹ0[ßD˜—ðq,\!æÊ.Ê6 6”‰Ž« Èéê~}øÁßzçM:1°ÜØf \ï) r`І!Ïc"yä퉢$²—¤Î*(tçÙM£áÍÅsË{Úè`â” ¤m”ª›B–Yx¥˜ù§^½!è‰ë¼³ÞåÙ¤éš`i“z£ƒÏ†÷s^l;±×<ó®·”„ ×8ÖÚäª0ÖJÆ*¬÷šœ S68ñ·›§3͵&ÃjäBü”q\û½ e'ƒø¿ãÛq†Z€ŸõDð „ âŠ+ýT4?&¦öîVâXËCÉp©b!€€›ŒÊTd›°€vBõ_O~´)oòéøÛýíe^Õ½0­”u`Æ]î­"­s‡„Ý•6c-dÙ?½vÑ©wY+Å_·íòç U36ÛϽìÛs<©b»iÍQ)^ ú¡)hF©!hô~ ³˜ t B"Bü:ë×vãZ’!ŠÜRì£b1÷æøóãž³‰¹¬x¯/`ÈÑÅ_éƒå,N҃׸<0ôu ë»Ö„ñ§„1ÆË»´‰q9šÃTë9åg)º6ìë¹aLS't/»¥ÜLUNaž‘Þ+âž"4 Hp¥\`sÂÉR¡Õ"×·¾ðׂ¦á>5dĤ È ¸£$ÓÁÑA”'éÇ¡«½ vrNÓ( AN³íó·wÇ4òwŽCh©zçE®æ” Rô ¦ÝFó™ãbØãT7²T„‰îqŠN qe'Q6Þ SM”žã3«oÊp?ûûÓ R‡¯æ²7t¤DÛ­oÎÚIOc8³ÕÃ, çÍAî÷W‰¦l$àw¹DÞKKŠ{äµ’Ä. Jù­þ×5pÖˆ´ÊCàà ”Õ¡æžöÏníÕ©{c-k_Kêø§¨ŒVÍ·nžØ9²h¤Ù^˳n®ÊúXðW£¬z»®ö¿ ”Ò×髌˜~¾¾`Œœ„V üßÓ{!n±¾QïP­“gåï~ܤmt¹#»£–AŸ¶‰L¸Y0Ë Gï‹çd4ûÊ$b@8JVV½9æ^1ݯæqs‡ÄÛÕðØÍ™Ò_ŽR¸ÍÿÐÎü²¼·E‘ѪÍaîb+[Ãa‡Ö¯žJº]d"ãÛo ÿDü-­sÖtàÐTM~ÿlÍŽ"µÖÎÆáƒ|†¹9;!*IRDE@ Öÿ~åjIub$Ȭ…Z±¸1>9$Ü3®–+ˆwܹØsS¡0”P\¢‚Š(çM¨ô!¡FM­²Ãðü›<ý~«ƒƒ¢'Æàn$,ߟ‰eˆc=cx£¿M`çe"÷ا¡äÁcEhŒ(ª † ìñ±b­xûßÀÖ1¹­ÞzI :à߯ˆ2Ù5!R­\• ßÚ…ÕOg^ý7ðPwŽèÁ®É¼aC$‰Mƒz´C@šÉ÷Z DYѪ2îÚIÉÑB|Ÿ;Óã785ç©>'sÌÓ4)CesØG€Ý ÌÁ”:7„ì,á95ô°Ü죣WΗFx(î ²oÎH”:˜±@ ø¢ÁlÊ·éTììN…³Ìã®N Ö\'¸Mͬ+¤‹'fRChMˆ8ƒr BÊöN.•ÐJŽH5£ˆXµÑF`NŽ‘Á®·$4A„Üë¢ìÀwY4R©pä™,¸Kí2“™,³ßÁ“íÙÜçS=âj¡1dÈsW´Ù¤0:O¦NFXÈO.;vïâ±nm{z yQ~ £Ûdxê(Þ†œ©½Úþ$ä<=è̯HgrûPÚz¡¶”6‰ Òå ÚUäÈdü©i°…öQd3ã7Y;ÚI°hNÓ pHoô/‚ úbÍñ @Ê(a:¾œt^KíàŠz7: ¢,3ϧ<„JÑDæ% Ò ñP݆^ÄÌ¿§­òs[Ií=‡m,ó ! mÔfA‚Të<²Á–2C%œg£0=°5áš2•êŽ=”n—â”{Ä“”d+#2g7î»]BÐSH†æ(»¯IL7C(c¯ ìÚÀ~>qï5xÖªŽû(ÙžµE¼!á=p÷VI¤8CȤ6±&Y&½çÆ ˆZ!:M*ü^U„̺œ.ÜvÂPºê`®S—ÖAh&¨TYH úÖ¾wÏWl”ñ˜Ý+Ô÷z½¬ê¹Ê][mƒ2MPÊ’+x–-íþªlÓ]U¸ìÙHŽD¸xˆ)¦ Ö†ŽÐR>~ ½ÍQ.)‡CŽHšcúFÊbèçASt~¾½Ôl½#¹'8Á‚#+iÅ ²qŠº0l%äbÊP³sxÄR)ŠIa§D"`Áƒ€Ãå¦0¡fQaÌ,Óx…rƒ“YLëïÄK—äÍ­ƒ®N“SÉœy,É€†þ¬è@ À„™­À²¥Ÿ}·É‚IYÛ99(ÂzCЖýìñß”Ÿ:6NÓÁª3òh(ì £Í™³êQDaÆ¢Ùd C§Ã Àe˜¦pÄoÎÅ)cgŒÀÝs6¤”dMèR¨Èn,ÒE1æc‚†ÒŒ¦õ (Ý<û¶ÀÙ ÍÊ96ÖNè1ió m"ôŠ™ô >¥¢øh“U üNxŠ`ëN8ÙÊCĆû”¤âòî˜Þ+•K! h ÌÉÖìIÞ\ZlhÎïÀüÙai@€V.Q½x¨C­†¬ðW몛[›Y0î'BbþŸM|Îàå>Dðcª¦ÌB€qt&¨ejIò›íÉÂTŠ Uñ{–MxÕ3aädšÂIÚR†éãZT‚rVAŽ ÷*y´MìMª @pxЖVÂÄ•ì¿IB8b¾oà±wDÓOQ]ˆZÔZ@»='”œ8[߯Úó^· Ø_¿#d6Íe´éõ§&Îìˆhp†âóG·è¬' œÛVÌœõEé&†k’á–N:äówo'DbÈéGH|¥m`pX#æÖ:¹Fä'Æá+£S磩À«;ƒ˜I™szŸiÊPNÞ<-¼Sº¦{Ö<ß2 q±KÝŒE œ÷F ì“¡$Ø—&a«,UA„ I$›í­‹¢Qd‚Úsâ$‹o;<ðxfŽ{ü2¤K(”²‚¨—(¸›à€\,ÖŠð'Ù:Þ+ÖKÉÏŸ<׃ŽÍjî/‚qv&¨0B‹6“|”R?í ­4 G6K7ûc® À›”zìHçÆB‡ãÖ¦…ÖŽB¯ ¯ldáD£(cÃŒD¤…SFôoUÈÑÖN77ê½Ä1-‡ä²™ä¢Qׯ­‰“²Žƒ½g.«ÇS9!‡ŒÅp¹)m¢áŽV‰je<F@vZ|Ž˜hy§}ïY/¯Ð‘º+V’SBJº@íRÚ«b¾µ2e^yå'6›(ÄÎhá¿<1PöÙ4ÇØJß]|x<åÜÜñç'Œ¥,Ä)“Ç£6vøy0J=oñÎÆ²IÞl·²GY¡K²§‡Ë0ÊÑF]‡I«h <ûï|MØl•~¼\04FHdZŒ™¸DKéè£BÜcbcdIBž7ÏÇLJÎÁ6Ú‚¶ ´1’°2ø(4 i› ¸±Ygb˜ßÊsU€Ên“x%AÌ.ÕŸŸkµ3œáøpaÓï¬æz¤7$/D\“‘>n8Ë–ÄóçÍ +¯žío ¦eÛÝ&‰_=b*Wzgµ Û~oVmÚœ³¶¸÷­óÍUî`Ù‚ÔW15ÖßWV¥§ÂB—–‰Jµßxm´\ËçÜ·¾RoŒ÷šß9pÀ£„ÇÏôý(¾NÆûs%½J£z£ p- GõFC!&cHÅkaaa%ö Ye€€“ORyÔê(9’º†PzËŒ-KW#÷DérʷЉ)^ Õ(ÁÌL;ìC’bÞ¬ib*I˜5$¬ÊmåÁk:aQ‘<2zì­]œsî²C‰±G«²ê”EÑQ1éðëÈ™£ß¾69 å9dÊžß›µ“ÃÀ9ÈpOnV~5sË„:p›¡ôÍSlQ†m½„ÁÇM™¥ŒŠõ¬U6à'»÷g}ûl2ƒÉŒñY:쨡³ f*¡Òd×’ˆ›…Ÿ­J¹ž„ûWí‘™©ÂP7:ëC<¼m•óžøœcüoäµÌt¤gdÿ’âö½uFU4pÊi#'6umÙðµ½#pÈÙ½·¨]¥cyÌ¥.tªŠ"‡åé¡¥bz~ظ½;âÓ¬ V.+f w*­vWe Õ¸8./Ña}˜ÃNEš˜è©‡gZO7ö'ˆZz4¡ÛLÇ20†õ^;‰i|Ñ¿œŸ²Ô¯.®wиBÊÁàð± d²Œ¡ B 8f yu·€®á¤Dj¥•(bÁUF%•‹71oî•–N'ê­½µ0¾è£¥“ÀA˜ ²0Løªdœs9ÕõiªpE;1ñЬä0‡B ¢GK$á§  “":¿çÏc„ãš›3³KPò$èõF_{sX;Mn“¬Q9ôQ»&ýi|om×2x’xCHNG½<øãÏCy!Û%Œ¤&ÂW|â÷?>¦ˆ fì*ß vA„EÍ¥ÆzãVYvÊÈJÃ_jÂî]4ït­ìáßH-±à`ÀxI2–•ê¼°ò'ByM²Q·eCšõoŒz†1ñÒgã'‘zU/'Ïœªµ« Ì ÃUH‹½sä}Õá=2pB0<çeöþ¦0µßxé…qPØvI–“ ´ìNy¬”i> YÀöüƒÊPáéjà#^½P艳à@±ÊÍLŸ<÷ßY67*NôòÃN„5Klʸ ÀšÅBõÞÞhrn3oTX–Àð‡¡:gBL¡ÀggE̱g<º­î¼dȸfF$±óEÒ(g’Î;«0†D“¤ÒLŒ÷×s½vîÞlY@`kìjvÙ=í"§§wãGa|õŸ ÃØ# àm„åövZ¯JÎb´DôKTÊ¡ÀL pp߀‡Ä!‚¼UYz*å Èž8ïXšIÀÃÓ¿Š†v¬#•‘ qnè Iw[jãgéYÈÎ ¥C‘ÝÂnúM8gƒTgº(IáäÞƒ|›YýWœ@ÙÙ2ÀP¦ÓEC­ªpìѺÔ놃‡HÞ;Ä 0ƒž®«gL&âü“qK l›æê} œá…Tšñµž׌W{ï,8c÷½yHìaBzHrpd²v”0;K²‰u@wëšØÄ´ðë†Pl$0ðÊN„Y†%®f?ß ü`!ðÃNI;Ü~ØUiÝîÕj ¹f=šbİ­Çß v^ñ)$gSW¸ ñ§äoœÎ©ÉKîù¼¯·ÌH#ÁsXÜÆ1)= A:"‰hv—ÞÏ*'ðÖq‹IÀV#20Ž{ã"±;y]ÓHe4ÍÓ/Ÿmn ¡Ø›2Åáh›0÷ëžiÁå7<”¤å9Çy¹ÊJC¤ Nw(¤7)ó`t†uAÂ>>;¦ëÅ™€lž†ÈÒC‡ŸTCØ„Êz<Ô)9MfŒ|4Ÿ ”ïY¹Ó2øÕmž}jó*°ï‰C&ì–Ï(k/—X…ôR'F1@ãÔ¦$‰Ç-`3®Õëw*òEwSF*wÙ«t6ëöq Ù ¡Œ>2Ð[»;[È÷ß.6=à¢<2Qi¢5ì¼LaD.«Nqá£Ó!‡§Or—I߯SË\ÆŒš'N:ž‰É”ÙClGt–˜Áâ O‹ÿ.èÖýxÚØíõû`â’°°tÏöèmÄ2«QxÓ÷̳lDDj›R[c}‚Õ Z—«˜! ÖC¶T=Ë|'5ZãìêhŸfá3{a4à›®y ÅÆŠ ”Lsi`KCA[SÔdH×*^s†Ü˜—ž4—°'”%·÷.Øe` aRœµŽÇÜoZ>5 w'‰`î\AôK2 ,Ø2'Jrš?}µ~l9¦Äs:e9W› öJ—«×¥:³°ö‘1\aw„ãxÃjè)J܉ê†R—š’4ÚÚNôwôú‚¬J{oÙtJô‹ÙÛêt¡ ‚–áq>_#(cn¨ûÕ5*0<&3°s!sÇÆ…ÚŽºG ïÏIù[Ê[àЩs¾ ¨¼•š¸a ªÉlô•ûZiÊ}n¨#p¸“Ôè¼])¸NJ*{Ôä—å\\JGVDÅ´Œ$ðU&ÄW¶ÝCeœv©¸ýÜ 2f…«!€«^§ä/]‡¨všØ<+à#?#PìÝT[.á×*#çd._–`xŠÈÛtZÀúa˜„Ý7*5ÖÖÕô¸ú=ÚyítVw@~eô¿‡Ÿj|šž’·Ç1¨R­+ÑÉr7Hš2Í8G±rEÒÜËRc‹#¯þ/÷}ñìM Mç÷ê.üyœÖrêTç/¬æÜc0Tó«01‡ŒHcb‰Cé˜t©NCU7nƒ¢§WYŒ'±Îƒ ‹“’V3¡¢B»[M6ã´ÃƒíwG,Ä…Û×YÌ9ƒ˜É±éŒe£ ™ÑªÙÓ k>eQ?` ®5¤îŠüA\!Ä¡1ÅŠh× Š°¤¤ÔÂMÝî;H¦”ŸÙa¤Œ0ŽÐ?×K¼uUhT” ºP VˆÉ"2ª×#z€¾Æ>…0¡…VÀ’$‡¥…§½Ñ=­_x׺4Öqµšï³I;&¢˜E“ÛU;ŽSÿmøªKÆž1éTM{@¼7¡DÏkÅuÖq¡c‹R3Ö?ÁUä¢ÃP%Põp!ÞPЧe,sø°9ÿ/ï§ôüÖu´À¸u J”EðRÀÖ aE KE È,@¤Â${wãŠgI›Ä×sÖM·žo$'‚eÈ>h!Ã+y)•uõT£뿳éÍëùÜkŸÇôô6ì 9\K5! 5•ÊÛow»½T•½I!Eôseƒ9Uuê긩FòÈH*ªªÞÍÈ\‚ªªªªª¬¨bí€0 •UE!€ÂX¬!ÂH¤X±ŒcÀF1+¢ ep®ŠÅkAª¦Å" €¡«FàI.HjWRlo&$UUUUUUÆÐ€s4ȆµJë1$„’_9`܈¿™]ù:æ‘Uøž2šZø'L ¾ähgH‹VÙê½›k>ý*ÙTªª¹óƒTE£Üå l!Ë äCi6‘„DD]嘔þš(7>¬%ýr¸Î$<ñê ÿqƒ„7<Ý]'¯d•ĻÃߵÛbê¨è˜IŸzÒ®¤û¡ÀA:hè¢@㪜Á‚KÉ0•ãœZwÜ6¿kr<æuÀWš;Î&·#«Æ¤ÒÑ½Š€BZF¥•Ò÷N(òÞø3 ½Y½2‰>@'‰ì{¼5ÏYª4SÚ¹t²$âÃ~Rêøñ·ÇÖu­õñü\„ç£NÌnì-‹ ºŠãáTùß)ð Â’T0&.R Gv£ Xn.aaÚ×äO‚Æ»Pó„4=³ó±¥cé¡À¦ºEÇ DXLJÌò$p^­0/Âü ÚÐÄ hˆRœ6!HDš¢ó¡2°Ëå¡BT D nH¤ _5Û}Æ»cÏmLôÖ…ÑÆ¦¼Íb ‘`PºÝ‘C`.RËt[Š d¡4l¥À=zUUUUUUUUUUUUUUUUUUUUU]1õjfI™%|tÖæ>;ù¸Â^øÊm†X8ˆ’ÊÇ&iÁƒh¦EV‹\ä »â¨vOLëèì+3¯éà8äé¦ñ {ƒî¤¬•Œäj(†¬z‹B !c;d1õúã7êœßØÛÊl›0å’ÞDùrqˆÚú>@ (ˆ%kÀb_Õ÷º§W°’Ķv&ÀŠs®º¼Í ¤ÓÿœK”#7Ò€Dz*rð¢>Fù¯Õ­$9ƒlëh®äPŸ©œI`»ÐF@8ĈŸÆÅ9³ƒÂiÒéÅ Þ)ÞÙâq‹q•ãÄHÿ—þ‰s¤($ÝßMwl ƒt+ØJî¾1dÖïckB‘:ƒTINUUUÐÙAp’MÒƒJµ… D±=4©°˜,¡ƒ ½„ãj>?L¼I÷C¾7ã-jMovjªe…=öª«g{c ’©P3w!rİ–Œ¦™Ÿ>²cž~>Ž{î÷œs½Ö!BÐŒªáå²ûJ!’Óòˆ&X®·¥Þ|ZÁ%ï.°Å+–U­,{Ó‡ÊÇ9Ææþíýó¶æÐÃ)˜›ýŒ§5¶ úq@"H’Hãpó'ŽPÁoÁ+¥ïZžûwâ÷¼^ÓÈr/«¼!B`ô„´: Ô½ŽÈ”x936G‡Ø$°àÈa>²_½-c i9°[q¯xÖzæÕÅÿÔaKûÆQüÕú„ÊëNÂ_iÖï}fíê'îCJ‘šoÍé¤ë¿48&TñE’!ã®e^aº}²¢ 4É@%q0=Ï×WW 30J÷X¨VϺš“ÖôdÄß ó(z¯ºÞų4n¹æÂÒ·©« À9e. 0¿¿ãõäØëœëm‰¹óÑÉù¬Pˆ«o].* tIuÍV!hôb 0Œ%còoFŸcèËD¥×ÇmK—‘eÞµZâE Nhˆˆ“øfÒÈ“H²h¿| xùC‡½B_éûZ5Èeüë0­üü<ó+°ü÷(D¶èóÌ´Ùþ‚ê9h<.†Ð•o É¡¿ô~pI“­z$8/4_¬ß¯˜p0¡¶‘æ{b·ÄIpÑÔ‘J&8·ÏÍ7BÙˆ›—3) ºÅËž°}3œ­Q D"­`Rà\ D""@`7nÉp,œ³3 •H ¶pÝôžϳµ^z<舞„ò‡Lâ##%‰z=x鿯«Ø4BPƒ=&°§dï—¶‡«¹RÉDdáàfO:¹+ŠßmU›ÅNÐÇŠ8|(pÃÌ7 CgÒ{xXº}>ƒ¢PòQA¢XLN˜|@?ù²NÄ5ž¶à‹º †iCBùª‰¤‘'?¯Œ¦ó”¾Ï'É’…T`( 쩊')@Ì h=I£Ï§Fá¶êcQóR† –U$QŠ áIC3GÁÁîƒÜP²„2Vb)€(;ãņN´t`-ÌI ¿š;çWð… ¾Õ8啚=&Sd=gŒFªÙ-;Âb'7ç¾²Ö@Ù› PóÙFyZ´Ï¢‡„É¥éß[ö+.ãâ!PáP•J€v(pÄ‘79ñÖÔ>‚$„€› ´ƒ² ™0˜"e‰–7ÄB# n„¨Ê¥ÈAs-•E–›’ȃLTÀDJü7´¼2?†–Ä‚D#HT ÀšëݱŸ{•-l¹×zS==µï©’¥¥ª40±Z$kDÿ¯KZë S¢uãyy×Kg7ã8ÛžqxÆÕÆ:iUAˆ¦k¯A•H1Ò}@Ÿ¿×ÍM­×yÖw‚øÏ<À Úç‚>¾u:Ê[w—5.h,Þ1fÆ“ÌTÈw5öÑ^ÕDšÖ1ŠV•£ÂZ)pZ(¡¶’îÎ ,½!¦he><¾³Ð8ÛkÆyšn'N¤ÌÁ,ÁÒmN«32UQU R)‚찢Ј@RÜã É%ãNÐÇ]Ôä׊Æ{ô|O ñP<ø(Æ ˆÕ‚xïX(pÇ[–}¹¾´¤Èñ¶Ìo­77%#e%„1!í …‚¾tï{²5½N2§NÉœ¦ìÞ!¦Bf}þwãÖøƒÞìJäl³“L B’R˜²†¨ äê}K|68&ÅÃ%Z3‚†8@íÎ 3ï[Ó<‡1Ù6BÒ°BÈgªî†¹É´šÍjȢɗBn`£)äÛŽ™³(Ñ:ðuÇ­vüAˆA§Pî‰Áu‹²¨Ë v•DI¡={*M Їgcy=ݸ¨‡”± MõɯxÛ:´ó׆z¡{mÞØ¼Ò§>¼ØtÉ;l;5µÕXe0&P=b†p££â鱟£é]áåûÄ0 œ¥ÀFò ±2M‘åkó$€üæ&5|sÝwÚb×¶&i†ñ¿þ+|“ÅÚÁ@ºª`Õ2$ei¹h3/f•J,@^ÄÐ`ÅÈ;3ãO¶¾=uãZèvnP!Cn¤ö% .-*H{aÑQ À±IAE2µ-„€± ± ß«¼u2ÍkÖ§Ï1è°^&T4QY}6´äñD㮾¼ý?Êç²N»I–}¼`ŸJ¬ìYmÕ¨J Èœƒ ’âQdiâ =Fd'à¼kïä¬VÛzù8ùõèžF*¢‚‡ª¬ž¬âØÕPZªPYJ[,‰u£d8vWÓ¾ëŸÏ<`uo˜ˆ,R»» ªI§xD³(aATE+Vš‡æ"õçÍý¯3vHÄ=âkI_;JО(؃؀ÌÑC¹¢Ç„–…Œ­Cì'‘&™Xøß¬}ÍNû(šK}!ºa=Œ8¿m&Ø(Þd\ˆ ŸnŠ}·ÆA Ss ²PpfB`$¤F «©q9Z‚}äóÕ§,ŸbºNûSÌ“möÿ/ϹM"ôs_ß( ë·¨ Pp‚lIÆÝŸýÀó‘ç-ÃwÆÞY­­j‰¯ã±õ÷ûÒŠõ¬S©ý³bÁ6ÐE·ßp*?"àŽ@”-u|ª`cDEŸc)*aZf¥J*"H4•;ï¼·÷Ú67ïSX¡;‘L–«Ì>[) ‘( º1 .ÆèÀ˜l¼HÆ(…Ò…PºË!Q’#ÄIàë®´øßç|öµô=1ÁÄà,• Ë„59Äù‡6þŒÌˆxw(q!FÌ `ôº(Áã{,”ξöPÙrÇUöÎù›$€à;ÆåÚ–(ÚB_XÚ~ ÖüIßygö/JœÅ4òÐÞÀ^’à)ÛÛr*hjF7^ôgçîýX•|8KaT W½TP$2A‚F H^b^ îwÕ ®lŒ¬IfŒH'î&;éÎ ì‡e‡޹õÌ|ÚÑñ‹H¥¼+¤ÌØð¢H8ƒy޼o¯|yŠÁ$7àÙÊÄœ‰2"@IÙßuîïÁ=bñ|¨A²QBŽÌ‡Æ±²yú•µTöÃ,>!n{ùîú½ô}}7©-†ÚôWX<¢'LÙ'{W´·±Fcj:ÉSÃ&üóÇ£r;@ò„¯©E»&Ý•=>ÇØ–&˜dýkõë!|Ñðo¸ç‚¤&á420a-vÅñáß¹9Ò5Û,õóÇ)Gø?Õýþ>¦ ÒX¤÷âvBò× FþáZ´W½ù|Nú²Ñ4ÄñÄó³Í³kx¨Â 5»fO´ú'ÄüÎΪ’ùžÕ’…m*bß;¦1“¹ä½ÒúÁØfk“{…Ùƒ6:€FF'ÓŸNŠ-`„yŽ,}¸Üþÿ6™Ü± k ’ðTY ¾"Zoïã¯Ò™w1nºlçø€² ôú"MÃÉç¯Ë⾡ÉäÜázý©WÃIï‹¶1Ù_W(WÔ ôzì'²}ë>KºÃ‰¿a:h÷T¦àW„*8e ö¼IxY^+λÏ{÷4¤æ¥MxʃƒºiSˆ+ïvä)2ž|óž;W³nRÆDá.>Íö¨­D %*¦scv8ªÂ¬¦]%ÌŸ&_’e&œÇ¨W}ø;¬™‡ñ°UH ÞO(–¬—¿3ªQ“Ä*5Ï0C©¢‚–U< FHISߊ²ïøa‚ùW®€áv±‹‘•¡,É¿cËÍÖàuÞ‹$Ȇ9õqæÄòb êO°à 03±KDÌsï¦Z‰ p‰y¬çæÝ~nÎGÓE~ ¿~  ¦pˆ{š¡ÄqÓBRËÂ'å@SâØSÅyòUIŸŽuãßNFvhÕ"o›•€¬Ô»‹Û>íæ—¼å285BI’»¨iE’šS¾nšœæÕy/“F J^YXDQ@£Oß“Ùgl2õïØúúùõjyžyæ ŸD§º*$‚‘1t\"e5ì¢t`¡Ôì¸_ÆÞ ©«xî 1™-h‚C™]Nq®&L Tø£vSÈÃò!¿‹šè«éŸÚƒ”žtTðëÝKO"tjOÔõŒŒ1ãl€ú¡¤àL¿ÀIëbÍ0Ê#êù.[_Nþš½MÓsr±]¨Ó‘”ïÎÿ.™—´-™~ê™”2˜NÄèL!º»ñŸ×zL©S9¼Ù¼*†\o5FÐdcj¥cHOª§_|Ì%à°ÌÂOr«! rkH>×›§•âõâm‚‘–ìÕ8öž]¨¶¥5 и¥2r5º)eLx„²PêñM‰P_Ð@è¶P üžò©öÌà5("ÃÏÇî&‹0¡ÎFzR–zFëth TOB}d+ “FѱMèôjžÄ £Ì ñ)Ý™P·©“" `ªP‰JQ/ÛKª<“ñ¼{kÏ^Ö¬ga¶9Cp4P• œt.J8ZØP™D3E‚IBP”¸¼ø+ãmIˆÓ?¾È`¦ÈÕ¡µ‡;Ôd"q°“Ý/õ§¡9a¹èãxõÜtq%ÝÍ4*Bí®y+ZÄø<äúd+¤åÃ0'5@Œðô%¿ü·ŽÆj¨4‡|Ð’Ò“ƒŠßÍï0QvZžNn[ÕPòÒsP(Èô \tû®õ3Ÿ‡G)ÂE%3ÈðÎJïß?|ñÉå<³ÊRw’‚qËZ{ïb„m1® zEÚ!Ø“dò'㎞üõ*ã­ç‘4'ÔM –ežñ×Ó9švöWI½Xû£ëq†ÈwçX/|ÀÐÃvÐø k0…€÷ëEÀÜc\=d79“¼0rëÇ‹ö¶ƒ Qçb©2ì&ƒãï ’B„‘ŒúWì B ü—zzÇÓ×Ó¬ÜSK4Hó>ŠG"ëá»|ùÍíš-bö‹Ý6±¼0_Eó¥hV¶¨VÚ5y¢*jé[/’²ê&²!J ¦ðËõ½ÃÏ9½Ç¾ òs·x&Gêq\ ã)N[¬¦kGè`Ñ•8†„. u”E(Q@žõݘÝ(ê¶O‚¦LW,¦AIBu±Ç¼xkQ€Î,œL`|D¨ëàûê ˆdéŒ5E x;Þ¬Êi¡4é\³ ž9wòÞÇù×$ÅT¾¼Wjrdí™CqÙåŽn¬ë\à7OI²KNO}·+ÁAèDLíÝÀôQVͼׄ3š“Ë4–œw‡§oÔǺ9ñïv›!Z¡rÇ}¹ÍçNÉ-nˆ˜râÖŽ™(ñ^ÆlÀòÒ[6CÏ=÷ÝfùÐrí++g1íþæ÷W…+<&ùN}›®#•»>%ŽñÉîbûDæ»4e_Ý4Á­CÚÐŒdÎsd3š!¸ž«›0™0šÍL§¦lƒÎqøF{b†Ät°F> „i‚6„·¥ kW³-b¢ã,¥+¦¾«=ªR&ªPÆté6NöÈl¬‡±m -4‰éœ*pvPNJÛÚÑÁçÖø·¤œè¢{8(Й¾ û©’t&PômF èòÌr¼Uô06.ƒ,à@Àá2ïëÖwÖ²“Òn1CYõdÂã¯=mz= ñæ»0t› 0ÃOeÏž[ÊÆ}“ú`Q hså„ |39¼"ê Ùùe‡c¢à$oa!À†CÀ³:Ãì*zª£ñ±ä¨×w$¨[ƒ¾TC½xã‡Ût®Éï=c…uŒ“mvag A>‡*šÞÆÂ#ç Bî^¸®†ˆô²¨ 1ñÇ=uàóÎolV(òr²‰à¨zqéÃÐâ,àd_nÊ.ˆdHñ5€;ÓÌÇâ ¯Tóa6xFô#p.`cX+wÁŒ ¹fOw’Ρ:1«+û‰½  ^ë*E’0#6Ö âç®}S™iggF„T«ËQ´8õ]5vÝÈÛÄQzŒV¶äWë°>Þ’¶]J¥nošÜ1R«¢MúP„zòvu=Œ5#´†fR¶Ý;£Ûnn˜äP&ôÞÚ§/;¶_÷í)Hu#§^„ÛWqŠvïZÕ+­VCüçKZ­g÷š"­à +034êëN„À³×8ß2r)ÄÝâcÀ_ue0ÑÝavcfµÓGw¨MÙOLrNd]dêcD8·ÓaÓ%7Î:aé‚0á³+1²¹»w ÁÂá€ÈpÖ¶¹(ѳØÞuçéATÈUÙžÄ þ; á=ýé `Œšœ‘¤þ˜zøž’°íBÙyâ©KE ÙMˆáB”r\ D¥HG¥# e¨i)‘ yA)"~‘5j[ã-ílÍa®™øuºutÖ)¿ÄéBåcÞ" &Ž<4y‡s'Ú•®Úc "[­»úÍõ«ê¹X² ò|ø 0Ì<º[‚ x~‡Û­Çú”RT@s7_ÔgòýWÝÜæé¨%TóeˆÂZJ”É@œ@ ´«@"Ó¬x›šETR–R1ìUD~csËÕ™Ž|Þ7’b¤@¨ ›š„Ýkæ¹¼}¼ß;½ï}Ö¿«µà~‚A ’` L´¥PRœ#(i¡i A ÈÊ­$‰ êÊ,wNuU‘ƒ­ïßf„:sÉ,WtQR ¬Ñ„Ñïãã5Í6o0zãêf—m]…5Zµ7½â`’wM J•¹rÕ÷œsïß¾¤ë‹ßØc©ˆr¾¨w†ðÁVàó#6.9É„£;ï¼õ7Æ çøßîž¿éBIï{5ÜDŒcΕë# ¿ŽèhL¼CrxÛÕ»ZˆÍдÂÏÆömÏ¡¾œºg“5›ãÇŹ7MÍè(O#bPŸ|¶[úA‘’æÁª¯pߊ×X¾w<¡ñáw¸ÆZ¾¤8Æ×°i³lŽØ¸çÍ1µ¿Dý¬-3d21Á½Kœ7* KCïÕõÊùÚLܱOø¿»˜õ˜4„²=±Nšú›„é‹løœ¶k¬¥âïŽjÛT4ž0jR’.i¥2'$ÖåM>ùŸ™Ù¨‹aŒˆÏ^éH°âÍ­­þ_½&O‰¶dÓƒ¢´„æè|0¬ Rº‘Ë‘1µCoµs](áŠôÃBxQs:¤¢tƒqªN_¸ê·…EÚŠbø ÐT› zÄÀÍJ›¦¼”kvŒI‡Ç®:òìkÙR»¡ ”ZDCöúýlùÇŸ|öØLæŽßØNyè“'2rSÖ‚§&|‘…~J”‚HsñÅ+$“AÐå“–r&ù(Ÿ>!÷÷ïÏËõt;÷ø`uuÅád´Ñ#ŽFyø£dÙÒÒ˜rŸ"[ô„ãæÈ21`ãDzOÁŠÔH# 88Þæû”©±8SñYII<ŒàNÞ³—Œ¸¼á6¢§ 7C¬š9ÍÝ'œnU&„²“6`R^÷K*rÈÙ<Œ67B a™0cáøŒ?]‚—ƒƒÃB€vY‚éPn•-cí¿q§VÔ¯ø¯ÏRÖ®OâbØô l}Q[=íekóØ yãª×M¹ÒK =-G‹zz"(Nÿ>ÒÑÌ™¶¦eCö§·¿ÕÌì¯[gêfÊ…ø7ûM—˜“•£äÌL9‰€ŒˆBж‰%²–X拨¹¨Q6¤ÈÀøøâþ©ÎÝýÞ}w¡ÜGfNgÁPäÚ£ÊSEqS@ï<ê;ë±£¼pE7u—ôÊT¡#æžwã}‚— È\͉[k餕õÑ|mŒùêî|¦~¥dMx¨| ,HðÃÐÃæÎ.uÕ:1hÖA2¢”8’¥ ÞCÁ§8ë¥àùKdØ`"IÔ˜²r3dØÍœé;Àc7M›êð>$0xçžj!㾋ø7Í>Ä&Pœ‘ä‚—öß} KOs²>ÐÐ’O©µJO— äù_V? ±dNp|ñáçy\êžÎp£È9„—õ*è‰ñ ‘Öiô@à8J5÷d;":#áÆÇ$Ƽk朦Ìò0ðÌb²†DÛ=S¶KLYG†°ZPú§Ôu¸³°?nȰUãBÆí#".Ý&Ä™ D¨Èë~mÞ'Æ“;I¿ÃÆtm"³_ï´PÓ2·]CŸ ¼ÞôÁR•Âæ–(Úa'©éŒøz'„¸=˜•wIóóDÏíñülT÷Û߯ž §_y!ë;ˆÖ¤˜Ú˜ñFA)"ÀL= ™zÑÏÇÇÇbg¿q9æ' uwƒ¨>`~Æb:‹ød/‹P±Y~ýÕ퉒… Ã]r<÷Ç&w†#ÜÀ&»E­÷¤®D©RË áe—j5ó´¾Ú¾b\éA< /²ü &Pž¢Äð‘ö†ÐwÞEõݸnqAI8“–{‡`VžOnMì¡úàÞåp ÑÙøNŠ©S2JHH;!‘œ?mUcn±Ï¤«}I֌ۚ lpb`ôgÇ\õ´w5aå7cãE“ßWê×{’ö+„6,:'‘ òùu‚¸*M£ãðPÞõ­d¢ŠÝx/´ Ó-“(zr8N m^±¹ÕnîÈ|3M_ƒ866k›¬ë» Óž 8죦l“aëã a³3®6ƪÖ÷L úŽPÓ¦Ö¾qXûÐÍòŒ9šâ¨XšPdNX3H¸8ˆ2o騕ÆH¼9×S·SøW ýʺ­iźæ×îH¾|px¦dhîÙ©G«}ëõóóöñ¢—ÓÉ—ß=C£x}üœ™s{ù'¸m¹¹£''~ ðH² CülàÍo½1ññÖ<ž|o9xzJIµsÏÇ3ÐDøãíW|÷ <43´ô"ͨœx#”Êxãoïâæ2>L2k·Ú‡Ì`ê´*åZ{Þ%«SK‡¯ž÷­R÷á+J´>F£BÂH=à±¢Óx ¶ï¿&û벆O"jL‹.ðA½¤:‰ƒ‚"Eà¿$¾-×]9gÕ$jHü6AqîDEÕÀ@]Æ]}þ-³(Èôœß†ùMHɗ㢳çsssÏÒ÷4†h¶p>aÃ×–mC—Ä=½ù®{î¾&눽͇HœŽ b>_=÷Œâ)™¨ý4Xg4|øßÛˆjˆ"mÑãy< 9i6qçV="ÆAù£×$‹¸GÐDÞcWØŒâ¾E•¨£¤©TÆDÒAZõeyKœV&£ÂŽ9õo«‚NI l& ‚%ÜÙ;€ƒH@Åœc`9‡õ»wûQÙÖœŒæ3¿ëYü³bªÜII¯%ÐÀ —qûŠŒîÈ‚´ޝËÚÚ]íªó¿ vÇ$K´¹3©X@y[<”u+—úÔùøÞvÐ ß=3óÄÝ ŠH°¨n €N²wù¬ê!pLÁ¨.!ÇxÄ} t¼3ö˜ó˜lª¢äˆP¡nñë×÷Ù=žvò8„ì•` Éd'˜…aB%Ó´¢Ò›<…ŸQÞW“1 §½iLââ2Êbžzë#Œ÷‰„Ë^õ £'J"ðÞ |íÆõÏkç9v¡r°i R’Q…Ï›šxøŒÌa¦â´ k&#‘È…*ÆD”„ãS}±BáñfM“k³I“i9÷ç¾äúx~²Ê÷Á³ÊR\½îZtû;ëÜûwÕvoƒÑÇÃ;p>2HÒ³&›m÷·6œ·:1ª`’MÏ !ÙpjA­Ñ°–ÎþÛol³6¤²g&$¡¹SÊa~¯®3¦`aÂiÛœÞØÃ14D¾Vànj»%›3Oçߘ½¹9-˜ƒˆù ã²Ãëž[£,˜® [.èç³cošÕ#¤l¢7ØÃ! FW‹ífä;C¨ }¶µ#›4÷ ¼œk÷§XÁ4Ø¥vФ®¥$/H øñÅ©»-mT³¢ßogµšmà·Ùf!äzŒuOsëÌ’{ÀK}¦`^¿ŽUñï2&ðصê¼åõö÷'íö÷Û×½)¦§@Ÿ\á[Ð1eŽHî€Ä–ñ(„L•$,d±lL¾ýìxü~¿ääGq´8ÂEM Ê.”û{a5ùøúÍT#¹ÐkM4ë\/ 3rò²â­ÀAã°(ŠBŠj¥ B‚€ °2Š’Eÿ5dÓ²Xƒçß½ç^}UÝðpKNDS¸~ã ¡‹ ßß8ñí®Îù®Ÿ†_’¥Æý÷±¶ß…×Xö3gè™ÜÍŒfqA»ú`ñϵÎqðqFÉŸ¦ÍØžŠ_掬Ü{ï,G“tÄnS7¸jzâ’Áö$Jµ©yf„pkæá¿”u¦¶xUÊYšËÉ¢–Äð'¿}|½öwÇ\ï‚h‹C¼3®¶=m–NqƒF´N!Ú=­&µçs"}}zã^õVšìï&P¡:9 (J;£ì˜Þ)MsµÃOÀ³ñ¾ØøÍüS±[-L ši› 5×\»p“”'MŽÈ¾oI íЖÎÌN¸ÑÎŽw(“dƭΞ]3LŸa'­Ùá4Põ ¼ ~“$oñà_¬žZaf-ú4äÃãB› ßß•c½Ö+ÞñS^4˽Ôð™hÊR²{]N‰æû¹2|'¹Lîò¯u=A€ü÷ÁõžÉ˜ QÈ ?^µO£ãâiw ß“ÌgõÓÕ§‡BšqlGÔ„Œޤ#!1=Tö€ø¾(Ñ}¾:k½½õ,æQz©JwY¾1Aç’‰ñ¹ëÏž}s’ën½ïã]‚êÏ$´ ±´j\P}~J“¸fâ1,¥ˆ~ˆÀâµduá=o÷øõÖ^vçæ¥vóG€ƒŸAâ²5óPkLìÔLR–}<»÷äQG„á ‚e ±Y{ï¾äÆã8D©l¾*|',‰ |ùª£‡–io{ÝíëÛÈí’äø²æ”Sï¦æJÁpÊ"}qÎÆAöø3½-¶ÃíëÖý-瑜!¿``nåǪšfÙã~yxÖ¶´)7ô­xª6HišZ­õ‡X •Ñ“"âÄáï=óÄg\TÄŒ`QW,F¶Û©D2íë«<ˆrÀ¦~’2rVr~¼œê ‹$›¤RÁ°Z:ŒO{ë–|ë–óS+cÜg¤Ö#=Œ qEÜBÙìaSœ ‚Áàq EôÆ— ØàP_)i1\öÖÒ’v#ähÒmX»&’nžWÓ4 ˆðCDd‚qñˆ ûïjâqfÛO „ Ófhp€aïÀöY£MC´‡Ha%m×®LíG¡¡‡eTÊOµë ^1èdÙÜCž 7ÊeÒ}gÍWÆÉ;dÈàœ28Ä‚1N8$c\ Û34 ºé´ô2™œP¾½5é&¹ÚçC<—^ zõç>¼Ö·¢™ zItPw×tÜ5u€ó(¨ý¸.Ù;Ó ¶ÚýÃÈÇEc%MÏg¤gÖÚÁ8¾dì©’ôßœÈÆYBn¹{q|›nCg7³£ z« 0€¨$).ʎŰ&âk(±ž{ ™ä ô0ñãcŽo½³›½¡éœ²Eœ‰ßÕÃÀ†´Q£¢ºg¤Âéñç}íÁ¤1ThN„/ª—Ó½U›¢†îÌ…‰,HÝ›Ú÷“ 0q k/âÊ«Åôƺ6p43Ÿ³:í£–p‰£ÅÎLÔÃÒõ³^/$ìCó›(~%‘°pŠ!xã±4qÀiÀ°4 TébHàL¦C[Œ@8‘(~RÁ<~^³šw…2p6@E½„"ãþ0"â,\``E,ë:ÓsFÄ~l-× Ó"ñ-o7ž¢°fZ‚Ÿ(%áÛz­â¯ˆê‚ö™§x8í«’4$]x’®E!-y¶7\M¹3&Eé%Ї„ôèt4î™ÝõÝàêós~ “Àɤ”'²ú«’ÐÙ›3†RC¦OX)öQºi ³?RÀ¾in?UåÒò0 3‰8À‚µ|sPCÆ2‰ƒnb!ŒA¢i ¨É Èí›ròf°ÈëÉÇš0ç¾(7CPxÍÑK³ìO{÷bs‘^Gž@Â#$QD„ ".‡l• 4”åö›ˆp“)¡4ÉU»¾¬Öl¢E<]{pÎ1· û÷wI²S'Èm_žg¢­¡- 7$à¶W*Ì&˜¥†c00Î{Åâ€Ó46”äL3!?ÐÞÚŠ :âZ ¯g0zMKc|Ôàê¹ëÛãÇóŒúêÇ&ÎØGf¡®3jfPRµ¸¹½EÆw’XÇ2G:GÄ… …dY$Ò+ÂîÏ™‰ýj(×××£ˆüŸ53:½•6p:(â°Ðf‚ع)Ì~bÜn#zîûlÊd)bŽZwñîÌ2l3LñµÝ!ýëžö2„uæãŠ8ß›0NÙäCÛ¨ô3«Z‘aºIàäÚÌ0—é ô÷ïÉpßÅ{êË›!ãjÃ&e³¯|zÁ ¦„@Ž 'Ç·몕5Â2.1 o-É›°¤¨"$Š¡!A ½÷‡Ó=³‹ÇË·b7ÃçJÙ–Ó/ Õ#z¸ ó}>±>£¢V%[‹ÊFkæp©Ë%®¡Q$´PÀŒ¢ËloOi5ÕE%xëÎ4zϯ½=‰¤é„ º±3y®yÖsZ’™¶*Ná˜fÇy|ßÓOkö-ì‘7åóYïÒ¾q'x´Az¹ç©Cb0'íÇ¢dp€ ã½T¤p&Y)§tÍx»Ù˜çc3d:”;r03ÚzÖüàÅSä­ÆCfü¤žRg¶ŽhªCvM&8j÷£Ã²Gž<ôj9)¹È;‹ë×Ï“.·.;‡LæTNÄ7¿líÝUjz)‡‘¼˜×ä0Ï{¢¬€8 í±rñ’A}£B D°ì¬Ù'u+U³¼½ØYÌœœ½·2DT¤.©Ôçvq2åèÛ;PsÈrN,¸æ4!#QpI ïÛD;+N»âëÞû™ßÕÏc='Š1~˽ŠÓAœY³òÀg ÏPx¯Ø³¤Ñ†ŽSBLnüÕ&Å”l›2ùZêemž[÷TrÏbMø£Öš"qáï8s½ÃË &9©Þ6Èà)´ (Mœ`/|…øˆ˜Á´±"ß«êk›…"Å~g¤Ó=',)¶{ñ‚Ù“U³8*L»¾zõà¼t'',œ³ÂBÚgyó]™†èK$fÌ`11þ0$›•‹UÄ ,àWšçÛçeÎáÓ!ãÁGL˜BxÚÇŒe†”† 3^n€¸ ËŠ×m ƒqn# d4p_DGÃp.•š×7ý~h†ÌžV±Dò«4cÎÞ2”9B)§eI'…pÀ9Lêr À ™ ¸ó@×bb*Z‘Ù°hâÂÖn3Tá"f1-šä´'6w«×AÍâQt¥4¡ˆN¡ØYQ¢á+‰a„Q‚”'3-ÃEÉÔŠq&†B#)Xj&è+‚ƒf5€ˆS.i Â2‘eè<%KŒ´Rj$Ý#T.¦÷ÇÛ0Î6ç<ó­kZÕä ÈD2œìpYlRŠ)šÂQµ¨Èàlæ4T ¶Oã³ÃF *AÔ‘—M§³º»Þ}Y“d³¢ k}¯¤JY,JHƒBž@æIAˆí*mŒPM% ­[[å!±bfvƒÀ¨Iª»©BHÔ¡SøWN˜L€xóa¸ N\6Qô«¼ãœH §“Ül=„X„•„à›åD¬ñFòø!ïÂs@ë„;£Ýž¬õ/P·yùÅŸÌÇ2îkfª×å ˜N@­Q—ªì¿ fcf4QpŽÏ‚½¼ãy5¯K€Q’sã ï­_ Ø/œ§+–²ò_¦HC\nyeú}‹R¶)†j¬Â:Â÷½kªž S¦cßË~È ßxXñßÚ»pä¶öSÔ"P¬6Y^aJH[ 8ªÖî(÷nE¬gÄ2¨9 — Úørs×»î÷oz¡“²éÅG‚VÞPQêäf¹t;Ý–ä'Pn`Š~ÌO»Û)ænZãV ’zg̾ayÙëïOÃ^†\vÂÕ#ÛYÎS3ë™ofä=žÊŒ´ÑQm—\ÅNhÙ™cÙ{$ÕÔ-Ó,»À¾¹õÐ9ù똈·™»žç9Ìg9Ê4À€¤KvÊùÈÈ8:Ç_Ï@VœWKLoÎè½á¯+ßsmt¾ñßs—®:aî\ÙÀÃiªÜá‡5ÞIÇž¯1¼ãwÚÐY‚ƒLçE9 ä7wÍÎDÒ˜v5‚çã‡6M·LŽn-™8¯W'ó3™ÈGî†tV¡Ab¼k_4~Š&´X• ÿO—!a• ZR0 ;•¯I„к4Õ'PÒ…ÖK¨JU 7ã<渧Wîõ˾<ç·lÎ}|ÅV~žÇ^Kzˆ·[ô}+4‘—*ÜxómUUJÉ'Ç7yfZÀy£Qìgõ°(a¯Ñþ¿qÇOÍRÃgLØÊû Ð}O\›ù“¾=ãMC\öèõ õÚ¢8L¡“E\/ÁÙ¿>P"CAb_(èÖâØ¡*\ `:ÆÔ%8ÑðœØyÒiñ“sïœõÏFç”6ÁG<Ñ|”B͸¸Y(ÏEž+ÃÛVåЕ[ç%ß. ¡h:(ÉÍI¿:çÇ[CtX%$عgN"­ONÁê ÿ<±8@3A´ ‡‚½×Ú𤋮Ö0‚…Õ Øÿhþüâ-*ˆæÌ´M4r÷ÌÕ«È]ÖÇDÝ­„ÞfÊa.s` ÆÎ©µ ¶»4¦ãÇÖ–,’û$:öfÛÞ´$¶íú(«>ÛÜO¥ðlâ!ÕÝÈû õBcó±¬!GÛ4å2ŸFωY÷ьȌÝ'Ã<ç-”!–a— CéôÇSŠÍu|òV&Æó4À•á¼T¤òË’yð_@úõà¾÷:1ƒ ðb¦~Õ'‡¡Ë—tùCâLO% šc#j—uZø†ÄÊÅ $rV Àƒ.bwÏN¦Ê3Á"­$äÒ'h2@Ò.ÌüäÜÅѸô>ü°|Vx! [¦dÀZ3³*û|ÐFØ—ºà²âx´jCÙÒçÏ\X¿Pìß}¯øœÅp›ÍÅ=Ïz×?>ù•(>3eÀ“ÃÊfA'Ó²‹ˆh4t~œqwŽ¡9UÈvI1ÄC¶Oi‡¡~«F„Ó'lðÀ6ÕøÛ¼cJpoDÒMÕBÙ4 mèïÅ^Æ`l…²dì£)Æ<ï«ìÑ<9`Rv2pkŒÙ ÊNv'¯’Ðû2RìßKpM¬Q‚x­Ø`Ťžq ÃèçÝÓ dÀu¨mÙ®ì!dŸõê'áÈÙ7¯”q1ZŠîƒù2Û û@]Þ¡«^/œ¹LÁgz©2ÓZÍz%%•VOD7S"‚=‡¿¯…‡>–ëŽæÌ̺KãrÝ8 ^&©UʬÌÞ”´THÁo=™¿pžH[üxñµ´÷ÇS¿ ùö½p{Û•Æ"èaQÀËK} BRÇŠß׃ã7*üЦ (©9¬ŒäB§À‘- °:ëÙ“ß’h,7 Ý‹sB øa”:ÓÏ5,ñ#¾þ®yãÖº1YÊÕ,L׬PöyóD;9Ϊ(zTô¡€înÂɲûÛp7¤4à“m>Ž„ñ®Y\ï…i$ˆOÊ3ÉÜÆ%€RIdލ™ìo8¤ÍO'7(Ÿ†M'³ì¸hL§ØK7ûF¼ó½­o»àòh6O¢hù”+Mè(Ђš3ÉŒw[}¯å¶J$PYò3–gÌñ×àÑË<¤éàÅú 4sÊ]¬Iˆ²Ò€¢•9i–ÉØÓ˶9Æ/&* ¡-‡c4‡cǼšðf™  rÛ'BsÎþï$ÙÜE:§¢ä,v q»R t2ÐPÍx£§O)9ÑFÆ|æž3lú!·^šãÚlšOea{Ði:$±Ép ñ*ÝË—“ºD hØÜüWßH(}$óáý¿É£xþ@ÝÓóÉþýŒ 0ép $¯¿‰ÆùJ×=3žª,òí÷ЍwϼŒ=óEbÊë¥ÅXÖ/¥¢Z-È–%eT^I%g&J=ÓÙ}Ö€>þ÷Lsø°jX,R¥MÊîV6´FO²èÈ$(ŒÈ[ &~×äpn™ú“h=}9½f´t˜MBU"L¡„ðÁ㯵ö=²ñçɇÖÇfåÎòT X!<” 4a'^¼gçâüùàוì±`”]˜ûP>`ÏÖÞÜó«ñî†6øæzÜñBLæ^æOboˆVLÿy.{Ñø4±@^¼ø^8;ëxñ¦¤âJ^MŽ*{m…A™åÊO¸ÇÇlóç8Àfã’FîB»•œ†Á\gÇÒñìSgnÍ7ä–¢`€yü5ê FÏaNJTWì×/ +-Á@‡Á_8WâþÔ;Ë<ô:Ë!¿–ÀæO3Š©›nÊÞÓ­kqÄiólnu9íT¤ÝÚûº›Þ¤g¥JÅhÈ×R “ÚÁrQ%”Æ“Hf*,¥ôÁï\{Vo’6•µ*ÕF®a'»]n–¤·ÇøçñãÉf+jÓ;âÄâÓ¯¥yg‰áçÂtÓÖûWg¾çBÛ´×YPÕáE”zõë9ÜuÖøê÷½ï{ë+ÉÈKÓ)`Âô  u‰Æ+\8Lþ B{¿mO÷ûÙ1/Sè!ÈŒ&VÑ ó~ëÍV’ز$8R÷Ý­ñÛè“KÃTà‹ÒèO²§1Ÿ ûûžË|òU‡;2A–F76õb87aÔ§eËîx: ±BÝ›œòvéÞýwWuô¸‡½ œ_bƒ‡Ú9½wÖž"ÒS2G¹<*_.ŠíÈÈG­ô1<kæÇ¶Ñ&Úتù*jSç[…;çã­MSP`…^dúÀ…^ü0xã‡{gæ“&Ì(ÁXˆ¦D×|4A ¿è/ìV2D‘& þS‘ì2ßúVE?_æÐŽD~ôÜtÔŽüKþö®¢kØ%g¼·ÝàÁá¡Êz‡r§œw0PhÕ†ò-)\¬&‹ƒ†O]Þ·Ü{ß´&rs¦KÚÉî~}Ì_Ãâh×kÜûÜw˜‰ ø½jñ—SÇåÍ´+ÀºdPÎj9{~sT«õ#ã,½ƒ\õ1Íx÷Ýìæô*$@Ü¡BŠ\M †dú/½9èçÆyŽuöÖ¸Ô(­ö;*ïµQ¾Úvi4ñ®—oãÂu+zë¿gðdïxÞù”vÑâ«)O³ßÝîvèöï 5m3Æ—Ó(¿^}‡­…nÝpÖo>Ž•Þ õ¨WƱØa5ª )H*1HEc8œÑ®c<ñkôðï4Î\Ï[hŒcDž[‰í ’T±cf‡1™ƒyZÛ¦/’J;TâÜÙz®ý6WÎK‚Û<´6üÔÑpb÷ÍÇñú'cûazøÕ¿^P–>P¢L‚8Æf?­}uDåW„1ýO¢Íèí´ú-'a²?†› ¢¸m0®ƒ7"4%åN×x½3Ñ8HÆ'ÇêÔoZx},ɧ0c˜+n¾¥MiÃê‚Fö2s2ûÌaŒ(nì´±r]õ?=øËŽüpニ¼V¦<ÓF–È'ªlç fŽb>ð ß@ ËR«Íå¾%oCØøõµb4Ë$4µšX"ƒ*Þª´ 057+—yDéæc;Ôw#¼ñçN/”Wc‹W£8v•53Á— óhàñ&\NYEe| ù¡K‰© ÷ÔLýHö¥ œ³2 .íckñnüöc¡â;( –3Û,|fMªû[Ε¢ôbÙd6,t:øŸy›èðŒ€€#žJ™\óÜ©¾MÍÑ•œ%O*}”Ì©`^µÒ•"(Œ$?Ë ÍçÛÎGÙÈ©›s؇B¢ýa; ?(V>&ÆGòœ¯-?æDMÊîgˆèiÏL¬™~tF\g:R>9Ä©Íuiî¶Âkø?˜–ѽìA{VÈ•¬àZƒ¢ï­ò…ÍE€OHìpà.k" Jרh¢S³€ddÚ¥/.Ç™¢STÂî–‚ËcV+cáBʼn>rù*?‹€·’ê1áP>-þüˆEìN"œKE0ß~ 2™¸›- Åk%Æq «R*8m!(€ð¸BQ©ŽEÚÞÐñ†.οHŸª³¹âŠöŠÒ@çHK€Õ}oSúŽâÝá ÃÀŸž<¥S P)Í’Ç{B#+-íòÄNz«ÆÀþfçR³EfZP4‹—wåÆÑˆÚ€PVÆo>çY™êhò=Ô•E0×Z\åDMM7|Ð4‡%I‘¼lH~@9åæ0{üá ”ÚÈ…õ¡jÖ]Q}Áã46ãšKÌáVGÁŠXoÄâã` €yÙR à€·fÞ¬Š{àc²ÞLîÄØóòcóñýä~,hg‚DÈÏFœ"Ñø&ÄU~üb]‹Ðqä¢Ã=`ÐWØ«#mcª“XðogµB¶(ÂkÑ^éw?yØÈ>¼$c€ýÍÖj3Ÿ$õ´DÞ,÷— úìÙka=f±#ߨ>ý>ÕðænT¬Ä *$[нÖÿÍÚû T®ßƇZ<" ®ÂHV²šR¿ŒU¿HhRЖpÒ‚LүƂ lyñ‘êpdgÓ‡?wq)Tü`Œ©á¶Âëvš¢¼üD^X 8%°-~¼!š=ñ\Kà­Í I6W ùø´•ú×#§1^=ëd¸…ËT̲8í+õð!yÞ×a&‘*;Rèü}`«@ !Œf!å¦û189Ô@Ím¬, È·IÇ[€ÍJ‚Ø\È•htÜŠˆgV& %çh ÁD³²â_|= ä!ÞŒœñZ:}MJ# 1ôÁt®ÜÈ0ûGÆæn2‹tú‡y,1ömÈdŸ~±K¿ïöŽîo®­÷¥ü‹ä„&ý=ùý,×b¾©‰ur!ìGàØYðƒŽ%Ÿ‘üžc”)˜"Ù6[Q]ˆ ½Šíù…ÂdÀ· d‡B\„}Ã}§‰ ÃL>}^F…S†Äò÷µœç! ¹#!¯X—soŒ¡õÏ`V|ò¼~ 8~àÐû²bV–NÀøãßtZ­6Šâªç .év*ß)Éô]VR¡=Ì‘>ˆHw3µÌÖsÀˆûÈ(I&f„œ÷†he<;fÍ~ÇÂÜ9eعqÖÚ™Øÿ¼Ü¥™z(YAäð—ˆúú¼e@Ì–¶ºqĪPAˆ‰yÀ(ÃFý .>8»òBºm iVÇœ…¤Ø×fìj6;׿—½6oŸ„H~ªêY~‹&âø]UùÐÖ²&?y48ÂüÅ‹b5ZŸ¦2RÆF\40R–ÉHPzªJô2°3QŽH’ŽC¤Â4J7˜ÊºÇDðÊÔ]Þ$NÐÊÔTGw±Ñ¾Ÿ°D?MÃÅ}¢”îx¦ýRfœÚóØ9 ¹ÆYyÇvQÓ&t÷½†yŽdç)¢†ÅÚºïf‡˜8!µNÑÁÎ΀`©…d9ØtN9I£n:M»^:f‚dÇEéÃÖÛ5Ëo*ú"ð:l!ªÜác=Œƒ…÷&Ë4q2Y·H^Ú£jVæsÓ[ vÝå®)tï™®™wy6oº«&+›ß"ï9ÌsGy›ƒÌJ9x‰UÞAÆU·JbpÐÄ6˜Ù£כαg4‡R¸1(ÀlËrõÎp1‡Z4zdàZ]@ÅÖÊÉÄ8rŒ$-4HŸ—‡Iy+7¡(©• @¶¹ÅÈh iCJ{¬h8ˆ$î÷ގă5ÄÝnÂè„ãŽzCV•áK]; =­!Íš¼Ù±(*ÄØ9ZæÎDéˆ÷`ó“~ûÇ•U²A[”«5ÝUnŠŽ³Ff9xñç5w½üåï«i„ÐKü%+R³JÃoQg¼hÄCi‡Wgå–íëàI#o¡k#EÎØþºMö)yd_J¯×kBP­¾Xõ–å'½´×Ï» 07'Ì Š9ŽÖGêƒØÖ ª!¯ …”;òXÁ :> .&zŸjˆn=Žêj„n^¤žÔ¹Së%Š1ò±@ûØ•;'¢h: ëÇ ¥¹¼i×å?pCÍu ã:«*–ý ¢4¬ý A8–÷f#¨šÞqœö²kÅ-¤É´;’Io§»J+Îz:€*ˆ–âEAZŒÍM ¡–r°O«Ò©ša"pyžðIŸ•Ç¡Šàb=1ˆHk´¹r3p˜ý6®y; ÑTKP~âõPéµDŒ«m„Š @^›s†å/|YÕHÛæX² Qœôm¯Ë$±*ÞœÅÀyÍ·õ6úÕ0.ëÜWåãö ²©0 ð Á®'SxçÜ– CÄ—·78"üábv¹wÙàïŸu£ƒ„ÎÅç¼Q‚³-Ü¥²”‡p­Å’:ƒìðú|.ýÇOG†‹œòÄB6‚¹ä[åSÞñùšfŸØsÍRëíƒztÏxÃFŠLNÙ|“ynÒžŠ ÷zÞ6$·ÐøýR‰-žAäó'…0“Ô©~K‰Y©ç-l€2.—Añ8¡abêËôa­á‹ùI´N²}½P¢²J’cŒî%NœâÛÓ€í ·¿O¶G§Ø¯DN,(L%5I›¤bÿ2j1UÎS¼™¤Vp•ƒ×JiLñÇÔ[ô,Á¦ú§•̽oa=j”˜2/™l³yèÙMÐy¼\èÊA­ÌÕ…J‚õ¨«ú›º ,T‡%jÑgD"“yÔh0,i£HOIä4;½¾Ç¸"\òÕß\åM–7…òÌ7‡}Qª„ú„ä¶uƒ[‚h £Aè­œO\yT‡ÍÇà'52ôñÔ¬eùä#q êd^Mã3(°Þ‰¦ N±$‘< 2꽈=ÊÕ4i±vʤzt˜€xï EIþ 090œ—ž}9Îsœç+˜xŸ›hñ{›Ï­è+Âb±¼gu E,j³sYÕUæòé^„F…h †3ŽÔéeë¼+&S\qËa.B¶˜® (ÙÍo:Êï¸q‚h6GF°t6ñâeéÍÓ1Þ¸.c)»7º3ƒììɸ٬ý²wÜ߈g!h ^@Ê` ‘u‘¥9I¶À MÞĻߋZ3  0 D,5Aƒ‡åÍœ‚„B¾6¡ˆ‚`˜RÅJQ˜Å«¤N–¶Ó)@ôR ;¯Î~ÎåÛ?ÆæÝ²qþ˜Dçùœ] «±˜OåbŽ÷EDzóç]'OÞžwC°_¿M™oƒê¡}î$’ 7ÆCY˜A7Õ$¤ h˜ŸÇª——r” 2%@¤”JP€0dRNQqBÔ#*•ÜOŸ³ÑV*à]l¤RÁ¬«^ÀRƒ›pŒ–rPÀ Irƒ±xÍdÍ ¼ˆÔØ¥(¡t- J²#cHЩj†D´[P¡€[P(B*¨ éW¹@ „ª’Ð ÚB^0Q‚éiueØkäùÕÝë'w¾ï½Þÿ¥ÞQóÅÂuS*u¤M ò¯z !`aSÎ.„r  ]®•|x€S¥a­E¤ð‘›̈àF*BœV \iî-@ÎÔ¬"èrî6¢8á’óFA:8ðÐ_Â¥&”K°CΔ¢æ åi“DÛíGjùÖrMË™ˆ X…D,Ge¶yeI 5ìƒ0¯ºäî‹[FÁH®}ĈdÔ °pMèiÀŽÎñMÔlTÌPÇÙP­I¼‚-¦Qç#“¸ÇzéÆ4'ƒU6­c¿(G(ç)£83bµecá3’ÀKF!k¾tÈRÚÂ)p›œlS=¸âš¦×ÒÏO‚`÷“[òeEvÎ}·æ¸¹½ZZ\„9mÂÅŒéi&gh2—ÔË»ÚöÜÞ88¢ÌˆeëŠAë@ˆEˆ¢¨j Ö›¨Pmg°n pj"PLA1e€6!ÀX"ù@(_(R…á‡Ñ9b¯,\0¯ÖÕ <ÛhœIß]rб´6HC\r“%ÄH’Šë!A—Á@ÁdÀ»ÔG„(4€ûÃd‹ "ÈH/q÷;KbØ.iÍ Õí ¸|_T¨`9a@pKpcƒòŸ'Éâ´5¿j“Îòÿ ù¹±,±1kê(¾ áq~ó{½ì¶4[ðëdÛ3.]½‹ÉlÝåf­¸ðˆ çjÔ¨9Ü0aôú‰CZç§vÒĽÈØ}@ÔæèÀ%]ä1½Ê Ü`2=ª1Q±éú~x#Ä#êRÅ#”£6¡b <9Ó:–M™ØÓ·(U·;ϧ×_-uîÉ{$:aéé„Ä•ÓXè˼mâ»Ô;5 àMÓz‰iŠÕo“EZïrhÅ9±`:¡ñ²Åˆ¤WDJîqëL̤$Ó/<"e­Ž8Ò1ë‡TØz¯–"Àƒ‚·o¥G¥ïMuøÁ4‘:Ó\éAÊæ«†è²ÈõaJÐN..è•¡H4W—§N™;ÄŸu¶¦Ar'ArD5ä•°–B1$Åà’èÙ¡Ë”J¹;ýümŸ†}¼N[›á¡¶(4(ãÁÆb—Ï!˜*zË<iŒDwãÕÈâºÛ3ƒ5/h82ZÐB$k@iw`¢BÓ>2ûi§6(žw w~#mÌÁ±&¹@Ê ð¢S…•2 ]€Ó<ù¾ øã´ç¸Çv¬ÐÚÀî Bôö‘ºD›ƒÀhRC Ñ!BÞê¨w¡rÖ„¥{Ô;¼y‹sE'©6“¦ÃyYÙ‡K•µ§‡„ÔF¯èœAâo¡Û=4ªÔ¬‡’ÈEÊ•c&ú¹‡3ÃPͤƒó¼çÍ×uÎs}æ¬ÃÓûó nDŠ.¯{ÈÙì:£VŠìòãwŒHñ¡s ‡\\/½«•ëë¬øCª¾ TÊTÍ)è=DŠc>¶Ò9¤Ú» ¾ª^v9ùölÐ0[hœVñ• ½”)!â¨ÈP†þ)œÎå €ë¹6Ïb$œeº;ivhóZàØÛL¼Ge/E¡li#@(”…lk†Gyädg¶Þ:ëi§]nš ©È…E¥ óšvÙÜމƾ7Är‡ƒÇ lX‚›F„u¾‚0MJfâöPذ¼0V¡µ ðmW è¹!R;¼y´nl6-‘¶VÁ6ÕXà™¬d¤±Ì\½+ÊáïÉ)±(ð™Ñ"ü±|OÇ£$$ý&Õ®W§Ók¯ =Z]÷]7ou¼¡ÂL†oZdmjDFæÛETíŽO›‰ÚäÁ‘=•±9²Ô°¶‚îÀÈaàa`@âð=È.¹t‡Ü‘ïÒõxõæà5œ:ͪ\êÀåzÞRyIF±Ê¶Ã¶‹¬Òõ59µ¦^PÍø·vReç)@m‰_oQ¹×*uΤû`ÆRHp`_Wfm%‚Š„]BQSÁ¯²øÝu×ÎTžºz.k–üÜLXêó¹·<Ö ²ë&mDM $@æóÍ6î$®þ#.ÍÍgR¼ÀvFfÓ^üFÏ.ìôqJh±ÝŒÎ¡2kÓ€ñ¾Àš‚l¨iAžÓFH ôOÛÆDtoµP2Ù6Œ™Ñª¥‰«ŽŠÞÓ‰5ÓM-äÖÕ±AÓ":«2е£5º%[äçÓ3•:/• L-f%„[œÆÀ#Þ‹ýñêv><]ÆdõEÌèLËOËY]¼Ä¹˜Õb8©ÜêOªVÓǽNÓ¾•¶å$ԱΆ}Eñ•r úÀUÔ%¥v*q 4§­É¢Ã¢Ð,ÕЀ#îì§^IYÃ7bWImÌoq;û? —N³j\/Ô×]`ö&ì§ØôImbÀí ÉÙå:¤®OJ°J‰êKÆ2 }§âî`7×ZÆÑZîl€Ü4!ƒwhÓ,†`­É - „ÕpÀ&çß¼n¸‰ õÌ)àÜë+¹¾óŒxº»‡S=œE H¾-¦Ûv¶ñ¥5ÐÝô4ªûcv»mµËGŠ¥Œ£îuŠï›¹)ƒÂŸ8Ù-\&r¾d@xà¶eP’³3Gaä:„ ÀÜÛë‘·N}wÇ;zµu!K—¢4©)@\ »¥˜욎ü󦑧6Ó€‡X6B›®ØæÅoæžyÉLÅ㹜·µiYì+·osÀ ¨I$£^éryç/Æùí×0© ‡Š<âÏm§o~ó“é]7Mgªq¸5XÌ h°˜JH^¼Ui(„ò¥dË©Øx¸Äz:5ö„ú6ôÌâŸ7#¸æ€!NŸÁ›í̽´(ÑF¸èêh¯Ï°¤9°âèÍò^þm¦(·Eõ]™Ñ½ª?ãü"½!L‰V¶œÑw,Fƒ^+Ò»„Áà’!úOäè_ƒ È´ŸbȃQ=f¡ëÔ×íšÎá` ^Ýz­xèùóH("ø |€ û·—ÝZжZC`Ò¹Ú)®nã‚’†s(’¤ˆÄ %.‡'žïÖ›ã.ýë=<åýûÌ¥n)©ÍPÙµº¨VuÑÎëן6u‰3éù)iëXÎs"QЈSªÔÃÖ„(í$˜2Þ aÆØËK …œš hŸGGùÍ›‰®ôŸ>)úiÔT*!šžâ4-Ûaî†Tt¦"†FNI{g^' ¬Ä²Ê¾¶>˜Ètq.͹ºE(ØÏ<üxãµ›';û4ßUô¿^«£ž0X€0—}1(W@~IJºéù} %S¬Óy77,NÅqrvKÝ”e*È›£ð{+oÔÑE;6OœÂSzÓE‘]ç­®è˜ê™sr­v.\ùcRž !@y6GB’Òh”­)ZEd.Ûv¼ö¸ÛÍ·]NÔf¾->ÿ ;W j"ã뇟=¸ ~^¤"tÝxÔMÑOm:Í辘Z ÚdxÖ7ñ‰¯Þ²‹t21íê”iÊ7ß-©Õ¦:xºïï9Æ*ضýo},x Z¨Àœ%2y¯£š†-Þ™Üä‰ "V0ò—7‚m1æ¾MinxÙ5ÕÛ0j¤˜¢_z€ð&R… ÀFYEwÁ©;Ò(˜:'«N‘iJ™³½5$’÷åZ½Ñ6ÎwØC\µ¾¸ÉBâ’M­SZMlÀ‰ÐÆh{®Wæîf‚'Žk&·È#9° ã,è6+%<ã’˜¤²±x¸ZIñdÙp}ÒHíÉRA‰b¡¬nuŸ‰Ï31RFPV)XŒâ“Zd?.?–¥¡ü™Â~:R• mÞŒ’ÌC”=5üá¯,TÆ¿4#І£#´ 1°‚á˜E$’¡E„‚)&÷±YT;XU{b;¤ñ ¹sú‚g¿‚©Wû Ú’2 8ål Aû‰[rBã9Ì-@©Ÿ®ç4Óe`,0ÅÞ• å ýŒÏ?ÏßÞ˜Á˜µ ©…O×TÉ9^XÉÌÒé PéÁe:°ÓKnG&ÌwÀ¤¾(PAKZA¹Yašm®‹—œ¼ÆÔ­($²°ž¨»G ß·[Ý}Eè¢7®̘îFGgž5Ó¨-Œž(S@zµT _º˜4¸9x-¼ëÜœZÀ”Ù½Jï}uÙ.™ÿ<¶5ƒ –ü{Þð~ú¿ˆø%œvÄ&9€î ^ SšãzÅâç<È”9âhå!ª#¡¥ Rši­zÏŒV™Ét“>©ÑWÁ~òI®÷­Îze‘)4Œé2CfË4.D§µ¤ÞgD ÌXñ¯ãGpƒ:ßåîsL¬»ˆ*¢‰©º²üÆL_7Ò\ðé,¨‡®7‡¢‚ñ “åñ–¶x½ÛÉÅŽ!Ø=ã3 :D”Ë]pKL^¦AÓßB®˜Eáø:¯!UĉŽðè%2¿V{Öý€€é@ú¨k¶âÊø{÷æûñÃ5“C«LWçòón=`ûÒ7;•œãc"Ü­ªú,+8×$­ÃÉlÏ7[îÙ(Z¶š[]¯«,¤`W®žÛÒ6õÔâA =®†Ë¶ÅŲ©–y˜ÀQ ÚišÁuóF ‹ >0QzèÞ}_C€é…þÚû;½™Í›ñZZ kkrz§+G½³ç“7^ ÍÌÓ"Á41^ˆk¸»ªCÀð¾7Å´ª]iú–÷ÓÖÁyñ•ò&9º&†“}N ™ðI%¶äµÓ"(I½ ö‚b³3(&,S¹ F$hw¬§¶ÖËM2VDYr®Ø ßrœƒG"dú¼à¿'ÑLõnu™+Í?fˆ_"ܦL/Eì4˜øANœnÃÀàИf[™½ês]­o²(@Œk9YÚ:ã™Ó-ËÃí˜~?Ìm NMÆoív„S7ì°W6õ8¶±D‰ ¹Ôb{ÐÆ´»ç”ØVÕ×2;­“jî|¹½)<Æ a!1hZòìëÎ6):lÐ…S:Í×Þ!ƒµè …×Ôs-ƨ~óôÞÄG<6ò×O…àäy({ 'yé‹ýG+ë—7~«ÖLy÷œ‘:aõ-ö"¾ÃF‡‘¯#ĆÎ÷ñðçYÈË)™æfÙ´"à%i¾FUR#øŠàeÛIFŸè8;ñ£8½·è,¯Œ³&.ÞèÅϸ ‚í€@ž€==,*“ X®#È"0QybÅ’Gt%…"G ‚,À‘̨ô)]¦tLPC«A;纎u¥÷B«ªû0¼= Øû0§ ê²’HCGPÜø‹c‘ß!|+ šFuà"è@†ƒwšÂhrÆv"o[8lÒÓdOÛZ†jÍßÙ\5À2F¨"˜^\½\° º^‚`$ý6^!5ÌÍ4$-oíV•>lÛ$N–{Ó0ýÄ›Tà;[4Ìzp7Ô0-]SgÍP|Z^ã±Í×ÜŠÚAKØÙ]ï“.¯#4Ø Sn{ïÂ]u…3¨P"‚4Íœ¸6(˜H,üÄ€2? %‹#(J§]aômLO¢‚+êje*ǵn¾ôPöÏ#ÓM"fXÿ Aêo²ê‘T+ôÈ3òˆ)L!sÚ™þzbBt#ß(xsÁp'ºj¤yá¿W‹éf»Rc[¬¯Éà©öTs›I›y±Z‘òeŽ­ç)•M× õTÈk‰0ÁÓLÄ’LY½¬ÒzŠ×Ù»êyètxXT‚˜e6žªKî"e+ èH—T±ø_Œç1°ÄÑ' p’> É(H-‡@Ž8š…‹'’Œ”4väM&ÿPJþ ¿`ÚHPNB;05樸ÁGŠš®ƒ?¡¿ºLdz-‹ü3B_?yY±úó({Ð?§ó¿ïÎ+Y ¤Rµu¤à@¥¦<Èê ñô`Û$Ų—Þ©¤Ü+Ö[*)Rn`|@ÀŸëýø“Üæøéž¨D!b!, ‹Eæ…7¤“"Úœ@äšæ€rº2û“[wî§ä4ØÒìaà‡L•¼QŽl³œ'ª;Œ â¹Ê-Lì+'†MÙ]ë¦Àp°![Mó:„,²á{4u㦎“aÓf¹žYž÷z×7½ïwr"Jœ-Á€£ˆN‡!ÇõtýqîÑØd;^z£«G˜‡-!f6âƒ:iæIaÆs UR„›äžœá5êlÐ.Ý&²BŒcÓ›“¸°Š”ºME ê³o'°Iµ±¢ÖšÑ8¤)Mä»Î×IFÖͧb”½P‚m*ÉYæä«MI$:rŽG—‘2>ÿ/ø?Ö*Ì%Q¿èíMJð^E ¶IKë½9GhX ã/rWùgì*–‹÷ ®`õtÖM‰ÞÕûÂm¹B”¾%,ûWÕÌ%·êtÄqjN~ó3±kæŒÒz/d(Tê0’Ã=â'&¸®žd—«Ø)MâîC$_(?  Ægg¹ï—\«Þã2ÂY{o}3iE‡ê³¾¼IžßT2º¤?ÉâY6†=Ýòc3i(\÷¹²ó'Þð5Ð @l)%¹/ZÍÊnÊO«e[ÎóÓ1”d,ùV²t ­˜œµ24QÞW(½zÔ^\€[ö–Õ6ôF¨„ %}àæÏxûä–Q72ñÑóìñi)ÆJQë·¡.ÆUG¢§sNÝØxɇVˆÌ4#ç~­ôD³ZÐãAúe¬ÿ—U8¨ê:A_¼á ùHœ´ÒÀ!ŠRMЧaõr‰S²´Œ4žs©¶$^ØõÏâ²&ßmbÀÍi޲>·çL՗ϘšÍRž¬ŸZðXƒ ¼F6=ßKûSëããê£Ñ‘žº}@ò a )Q2ZS¼6žéaD\Á0PÚAÑR«ŠÒ³`vÚ™gçXÎÂftH—p ­°j ;°-Ñ!¡&Y6Ú{ï<ôâ=EW¾oÐWØ€- 5/|%Ó;¥PJ­ÈÎQÈÙKÉ©¼ û|dCA¥öä^çvqÙCÏÜïd¡`BBÏ—ž'‘ܪ¦²ìµÝ9Lr:áÀd…Ü•oñëׯýeÝ œóžeãxßßH-âLƒÙ/‚ w 7¤¡@©"ë”Ùó*—õƒgÇ>}·‹¸{ Ðghã®+U`È@¤#êd-oL“~7çÍÃÇ“jÔ ¶Ä”€J°/Þ ëRô vÛä+¶&8íà9ÚÄ€o"d„îU21ÜùÌÊÙü{xñá=»ñ¿1ã}Ä+Õ;$:;5Å×ã[•¹Ï~¯ñ"<"é<›µTÍ&à_Ú+M‹å¼ï¾ù‰žæåD©A·ÄŽuÇl׿\ê˜Íu øÌœ ‡¾ ›–\“yÈÞØ<ÎktfÛà\,¤&W(ÃÅ©DÊJE< J̯ó~+\æma RÈÂR®±‹«.ªëÇa;LÔÉìÝHȵ‹QÝÎÊ¥™ð<ûY¢ ÁC¥í™ø BÝY€]/Ð*`Mýñ3ƒ*YŸ“žå\°4DÈeöPæ2Jd¢ HÑ@II–kv鮬÷½9 ~óKDQššœ#²)¥6¨¡}ª:)ÏØþTƒëëacgÚUõŒßKkj±}qŽR—ÎˆŽ œKƒE$D¤Ò”^¾*.ükg‡‰×}ýúTÊ öŽB8S 2!À(Ù±HÜEámV²Wžyó·F3Ñ46åG”oÈ„és ÊA!zỈ¥._®§n=µÞi\ìºPp|¨—*¡Ÿ˜¸Rö© ÓÎûφ¾sù·aÈ`â¢&ð¦25Š-‰‹Ý8ã—¿q9o³²>{憒+ˆ âÂùøÅÌÁzGuoéÎqáWqu±íQ­D$R3­C+êçΙðMÓ,£ÞäÓiØR$Q2¼Ž„RˆNÅ©×Z{ê)’è@ž¥Kó)N0–«ç6Œ,£š*8—çf>1­W·Ó¼òHغô·Â 0‚ZµËž [³|Xµ©Ö|A%K#ÌÎé+*΃²òfaƵ7&]) ¬›‚»˜§‹qs2zâ*q– ×R …,H…XSæMB\¾L®”[&ÊD•8&ÛS‹ßâù×½­5˜¨¹#ÖˆôØ€X^¹YÜæ®¤ÈZɾ~}é¯> §-íñ hIÜKhÁ ÐòeE¶1®ûèk§&" ÚÔ tÚÅKH—jU4=5ÜÜIqàï]s¹9ç¯ ÆfϤÓR…iÚ…Zžln@ž ™ÒÁàÊ:B¥‚…¹ç—@3¾ÛÆhW†–1²/àkŠ€Ú§Ší¶7ê¸Ó=øËÁ5ùè©z‘ŒðH¡UPr¦<äeS~¹žö¶[sm86ë,Ï4¨½+Ð{àî ç™\ MzˆóߊIןÙЩžû¯„î’­™µ 9ŽÅ Jêõ¹c~y¯>Øæ•¥|úD‰œDæO=—Ç×ñ{íÁ£Ï©‹­vRóÌ… â“HÌÌ:Êô65µÍvƒì![ˆÆ‡†R#ßK’q¡G2š¿nÍ@ãPɆÁH¯4Ãz&a²5¶îϾ{Ï&‘Ag\‰vq4G(ED>:‘É4‚ -)w+dÜšžF¾ñ¤šgÓ9EÁD]ðwð¬±ØH¦À®rUÀõÍèÕ÷R)·°q`L•Ä €b1 ¥zÓŒ $0¨Ò›¥uå {ü{ûÒ­·Ë/5Ù‹$œaFF‡ P¨M3 ¡RUz‚§˜$KÀ!5,òç:o>·µv@¼id\ïÅó–·'å»f[¿#· ±É)É‘ VX»ëzO•Çr-Äÿ%$8îi· Žå ÍL.—ãwíæOË3 õ†²†îà•¼ohûN-Äï–éÈÄi–ÄĤV…«®ÃËc$(åãÚ=YÇwŠ{ñCŠ”³ná$Ž v!⠤Ĕ€<7R o¦í+mñÑ•ËYôÏæœð¾yÏ]Ó)‚Mœ…ñÜåàð…/Z¢Îö¾kD¿ž¯ÓȆ3Œ2’:ia:Ó:럮&âhÚ®ˆA HU¬Ö©¢gkî] Üäö <Ï­ 3gzÿä×ß1'öªoˆƒçïéDa¦Ãè0’m#zë®ë®æ3à(SÖ†Ç=Ü›¹×¬1MÂxÃø‘úŸCø±Lf-¹×‡Më5ÐŒSM~*Ïì[ÚÉ"JcŒ©¥ô¶í£šÒå®àÁ.îºÂºcêûTÐA1®}ûyw׎3pJûr%€, 7 "%FAB B+"x%^X„ åp•*’JMxãï1Æ@Àš­„7¢„„l QàŠ‡¸´/‚ÂÆ HŠHF dA![ß¿è7ƒŸB²ÄJ…¥BE`¸V-Íh4x)DJyïªÒãçÁ×TB•ÏZï\÷®+Y'Ï6£­H ˆ`Åð$6¸ÈÈŒ˜ôJJ«ÚïãÇŒzλ®¸(ŠzˆoàÃmÄ &b|‘ H!`Ò% b1FP5IÅGX:~o§ÙêåÌ£±aÐH)DbEª–ÒA€@l¡°BŠD`C[mGŽ)Ö,Œ )B$ x–RH‘¡>oÐó—õóËüÑ<á|`9†V²’°ˆ)½*ºë^+¬È—Däh¥ùÑK<24kCDùñD0 ƒW¤Ó€|xçž8÷ŽÔx“€™J<èl¸ÉÐ ãßÓYÎÏñ:]b|Χ÷óa 7òî–ˆ±{¡ða‡y¡ 9ÔFwÜ‘ª®e¦oí $l(? ÿ×$Ý'Â>Ñ‘PÖ[‰Q 6U!/^_ v½Ø0I6uîJ¬ê—•…Ôx¦½dñ$Â`iåÆ{¸.fXmóîxþ«B:’Î+¾u‹ô® ó]zÖ®ü~ï°Öž3šÌ¶ ñ¹Ñ~xø"WxàtN€á¼2ÿ((>b50y…­˜ýê¯:HtPB¨» Ž€¢ø¤£ŒÛM•Ns•Ý&Z^H‰…U'“þÀl¨ u<§üê)ªOúÔÄ'줽HýZƒŸŽåÊ n•ŠkÌ(Û&1J3v¹=Œ«bª‹°ï™„°„ŒýÜ æc°XœàˆÔäCƒWÓ[~ÀUŸ¡ K†‚^ Pyg¤ƒ…NÁb9ÐÍì+óç®ÍsÆèH%¿”k!ѽØGQØänänÉ] -`>¦ðDÛŸ8[¦x„æ)} ¨à¡¯ó ·AÀbüˆ3ûfáËŽN´(1ÇÞ4Åxu{‘Yè›÷~ô‚ ‹YóP®z×BÏ«jØÍ"|’ÜJØûdøGl1~ Ç!CÀR>*3¿„ÃfTC#–$0ƒ¹®¾…íŠ_7:v¼nKêã™°³.>‚øÊâ`‚È:›´AÅÞ„†ŸyßEµÖJë¼ÜB…رêÁÒ!x’±è,Á±aî¯,xÇsSàŸ’[•*æª(ëØùÍçqÐYø“ð0o.DʹëèÔëÏæ/Úhò.›³=i¯hípx™„ΡF«¸b$œÞ¹¬äDZ½Áp!}"œÒ£H&m_vDãWy5Ê‹\ÐÞ4XvžËEî8ypÖ‡Ýë•a·˜žÎ`e›(Qè7£×…)1 ØëÐgeò¢eRÇïÇ÷òj€È}ò ¢%!Aå|Äñ;)Ê̪K#^Ý™#=P¡ðø=EðSZx©ðš®1ª±Gõì›Ýú2”?Rbl\ƸA ·Ôø;øŸ^õ–‰Qߟ|©oÁúÄG.}wJõ*Ûç{¸Lo‰xj‡¯pÈÏT.ш žE@Áø ìP×ci=ï!ÒU ¹x†kªèIª¼ ’´4Ü.û°ÊvWµ’VPPly§ô °ü^­{géYÕ½ =ŒèèX› pæ8${ßy^°¶$gFg‚·kÙչ̩^Ý)«ÂÔåß&ÉÍ´ANÄv#ð1`é‹:ƦÇà™|<ª³åUÞùìó÷«ºjN¦”óº"©¤Ü>¹Åµ¾lP”²±+ »z®¶eü¨€ÒëÚ0€A)FÙL•Yí[8ÆÝ`‚¶¶ ô%PlîŽX‹fhû[–&F—u]=WB<+…L¢uÐØpÛ‹ÑÏ”(ÀfõHN´êDy4¬Ì@à‰á~Š›ínŒº¶ÊÎ[âiÍr•e¹cU´&ˆzg§;üöìŒQã0H¡em" +é~5`ŠB@þ}òx0öJνµíwwÄß{ª¬e^·ÌÙá¢ÂÁ¬s/u¤I®V{‡¡-wSZ‡Dá°Ž:PpgY×S¦˜ÏôølÜ1Ï Q¢€¦Ï;ž:9åÉ‚d×B/ Ê‹¡0q$–ÑHhÖCvq&ƒ— °êsUWwwdS¨¼ †E`,0¬VL™XYtáy¼bjï. (Á `¼NdÉFއÑFòuÉÃNÉ(8”&dÆs.--/|0Äê1À-Ã×ý’KÉÞ’ˆ„¬&1¤’Òå(ó;èOãDþˆßó†j¡_—·-fz¿¤­MHv£é­áðÚnŸ—€ufšYPBe#‚ ƒª“ÞñAŸdú7Y­u•·oÛ~JH]·1Ú8ôHǽ—)³ìGZ@ÕÏh»J¤“µiîô5ùÞÏËt œ;ʼn·%Þ}¡sêL4ÕöyÏqƒã—‘1ãKÕ’ÖõžÞ‰ÁÈå÷86zŸLU|->‰?˜ïN0èyöñÍ{Û&”çh f fsB£Âƒ‰%½ÕåaíÈâ縣¢ z9()m9utÚ]l]“CºJƒƒÞ!L,„°Ä¶·V¦òØ“º¿®áJø‘,µCR‘Z$6êÏ}«®µ]ãžðêàdF*8z®'|~ YKjž%u!ºÁOk¬$è%µ4YùP3´Ÿ¶DÙšçy{Ä;zTÌž‰»0Lô$¸Qa2]ŽÖÅZÀL•ï¨\INâ*ó¸ólÆELH) )ïbÛRŠÆô6èû¨Ø±}æé›‰ë[•ÈCð3‘ ©y’2ÁÏ(ÓÊ|÷âfGR·M‘Ø@ö©¥]àb&Ê2õ+zÀûÉù€ýJ³¾'õ&åÃ'²4:Ã6n4ªÙÆdÀl0t*u:;0:CÒM8hÑ{Izø-àÚâÈÕÊN$Ô·±V’dn( J±Úž®dŒÈÀ­cíz°œq=ª¨·œv¦WÎfHÇ×Õ³Ï2¥ä3­4UlMFkËQ¾Ãí:<Ž&%\µùµˆ|'(ï¹L .5µáêo.h‘{ømÞ·¸Í2¤§abæ#Ü«'Mj'dP•ë6‰¢åÁ\à¥=õ¯ óîATÐerõË#õ&Ôx¦¨S½à,ƒÂ¶·^¼ªÙÖ¦dËË3&>J[Ñ’$‘ø¢6@Úö’”7Êäo¾’d¡M’“HÏC²¥U™Ö‚CÚ_NUðÏŒ1„ë­—”R¤aÄvgâ$7Qš™>#îò. #a‰$›S4-¿)‘¨Òå·€Ná¹M…0ýÄí}hh›R¾ãxÿˆ>ûà€å#Ã=DDDsœ¾ ù¢™Ð ^oR¹~k@\óž1ݳs¹Íu½œ7Ýrg¥·9›ë­£ŒXX‹ TPZFi¥‹„š2¨ Ë®gíç…Íß-!Ë7Ó6ñpÙg0æžö4ó8¾ï§õw¼Íº*ðD¤¨È1,êÀe9 dzŽÏQĈ•š}A|( ž¨LH.`YÈ¢C˜­àe:=c-µóMõñmq¾{XÞû7ùëBÓ ÇY¨eqÂùHu9îî¼Oö‘¹Ìcœjîî´Ö.šÅt§d‰àÇ7DiHç(45UXØtõ°ºÛŸ›+€HŠDd‚B"n‚éýÕÿlê\Àϯ±€Lø¥ì‡^0"![Á—Ç:_ïd =¹/ÔÀl:”ð<Ô\Äè<„¡-ð€0 ‘˜B‹ŠÉb$a¡¤T¼°|+Ë0¶6¦[D¦ ‘eÐ`ÚE(ƒâÃÑÂÁKthFУÛջŒº(±Ûipxhn×è4 FS!’ÒØ“QFrTÑÌ(íxÔ´šJZ‰„“ƚħ t/Á7¬/‚ 8–P Dl¥30Dc@NAЉ ïË8ÃÀ™|)0¿ž…â!+0Š–€h(@ÛZDécè=6sU9ï¹Öñê:æ9‚”Îîç% lÃSv”yr„[”ªÜ¼¡ C,“9×ZÇùóŽý5Ü]ÜËÏ‚“³1qQ‹ªÄ7oêQ$1϶·3ˆÎö¦ýõ–™^–’šófóA­l™–¨X¯ظÛxOæn- ƒÁë«”‘ÜC Äd½M¹¶WšN–Mùç_Y^“I62ÚEwªžÀ¦±m(' PöV`«dÎVA7Bµ¦èo¾™÷ÜLëµÄv`X”I‰RdćÕ2O;ž°&G*(v’@‹Dd…ŠIJ” E#)c#w“žoLô#[k˜.’¢Y6B€%T†²`µf¥†X¼èï¾pTЄæljÂo<•“³b¬Ö«:{:ꦽW=¢:Ä$•¬ÈZØJˆ`¦àèH‘ÓÝnuFqv×e„553žáUÜN› ñ²(QÁÿžXnÖ"¤eÌDµDÍ3>ÆþkOßFÞ¦r^‚®Y“Ùî˜e¡tœ¤ü‘RR¨¤œy&"Ù´öÍ“4ÝVÎpS²[¼~ÁD²*Òã‘À5-¿qQØbÑб/Ä•^=rFÜ“ž°WÏê „5ͽ‰m¶ÇÒ¾¾åHÚ³¥€5Àb€%(Ðø¿›i>ùéBs6 jSSÕ@1´ ¡ä‹¤ªèg:c—R[úF•ÒYƒÙÌbÓžýŸËÈí úÇo$B ÊYÏœØÉ†Nù0vF¶:ì]i¨û@Ž”Ã*«ƒÑÏ>þqª|–XT›ŠW½ö-±‰î9#ÅeÙ‘XÊñenîç—˜$èÔ(FÔñ‚¶½·V¢Ô)Y4­*kÅý•tŸðˆ¢15;E‹”¹‰ŸNËů Û>è‰zÈÞ¸`‘bê§Ð ’£»&æf~_«}ܰlXVåù•Š_1Kg5Àì7ºÄJ`ŠÈ$¤âH‘‰Dà²&…$Ny•0fzMò×Κ´«''UPÎì Ul,ØéYdÆbcaðË‹œ´ÝD² o6‹¦VÜ.K½ ò(ü±ñýó|þ¾½OZ!ãÁ{ùDÄ_Õ䢡YÚæ—ßwçÎïWßPÂ4bö 0!ÖhS•$@ê† öÜwÞ¹¥ ¤3}µ/RULË) ˜(SY{Þüz•Èwë‰Þéüß2¯çÍxW]kWµ3‹Þæ4rUzAé`uð²–÷ÎR`š7°¿2`ì[ãŒùçÞþn³ÐIC!R’‚à„»(§ä ôu‰{ÉßuŽ>ƒSx2I.),¶1¼U9Õ%äÍÆnâ9œ÷¾£JãÑèñÐ$r2}ùð™ÅÞ8÷Öþ·Î+{àæ£å)‡âØùÌyâØ>‚/îÑ¿¾Ü‘U•-©3¸©–ZàŽDYöouFjÖ¶«Mý8¤³¯‡‹ƒÓ IìarØÇ4‰¢ ù÷„„YÔ¿ ðŽÇî8æüœá'Kè`4ÁŽñõºÆ¶ª²ì/Bš°‚³CcVeË|¿ŸÞùœ'7ƒ(8ªë«Ö2h7ÙÓ$H$qEDΫÇÔ‚ó,5xÄŸWg—i,™‚¦¢;ªúϦu¯káÕîf9w…÷ß¾—ð‚ÝJ¥’ƒ»šzõÓh¥í&\ðšK)#ZPÕëDA+U¨­K/^þþÿ>Ó´›êâ3™æåjT¢ç<õmªAì)%À9PôjTÈȦ# M¶§8Þ#SaÍSSMî]0ç) $Ä5¡µ¯:¢cyYBäËpl¸hæØn<™Zæ#³‚–µ¨FÕÐ3Ô¶¨DóÔ Ûí,Q#¯+¬ˆF§ÂPD‡I@‹¨7IÔå+È»=3î°Ç0¾èˆÓŠ:Ñ*TöF³6#›CW*. P¿f¨ñÄÌ_±þ E5‚Ó7" •Móô”þK±L†º¯¤šSk§JóF²ÑžÁ¢Ç$O/ú.¶ºo•«nº%ØÄ pk8Ë+FŠq§V¤ÓƒÕÍ´­ì¦Æ€JˆKÒD+¶.>ÞÞÕÏ3|©\ÊHDH+2ÒEi¹Á®^qÍk湺F¨=ù+AJÖÄ•ëoUÚô«–9µæ¹~ ±A:>gŽüý7ɸyœZÙEñß%üR,Ð^÷¬}pg<=¼Þî룢 ”(”–4ç]sß‹émm}òˆ¥ Ö={;O¿©zî«kd;Mø¾$Mû}vQdŒ‹ÈŽ ‰Mö>ÇmÄ?‡º\Ÿ7¤ ÊT+…¹ÉòHƒ"œ¯’n…Œù_zQŽW#ƒŒo:ßy˜©LªYlÈË+µ LÃ86NL8Bí‚Bát•¡ ƒbò,¹]_Š£—R"“܉ü”´s«„Üʶ0#Fê‹áÕµñö‡ªèœ8›z¼ËÛÉÔu ãW«j–]ç¤o3Ó,ñÇtĺ™²Z“©WèQäö&ÀD^§^3ïÆ~ UÕaXõÒ=©`, Aè“E ¨#¬”×;óÏ‹yª*2qÏHD‰k?™3îÆ1¤Ê_« wÖD¥jN¶Þ9†þöo£Õl ÇöBàôdg$ùŒV¿WÒ2*ZÀ0µY¶×HÈp`ߺIBvNùšR“‡+;’b(…óÒÔVAðBºÃ¥_[‹HêÁž0Î`˜ô€¹øD`f-4'" (‹f$šÄœ±çP~Aä˜ÖóÌê4޲!iûà!‹žÌÅb${lìXÖƒ<\7M ´¸áÆ 0jÄyÊôÇ_Šk/ñáÃv¢³n¤÷´coh=—¾€ž ¸µé[R#ö6 ;ÆÐáå±8k›<%Éoz£™OjG·´íÍõ¦~Ûëx¢ mà” !ð¨-r‘å"ð!ÅíŽ8×P¹²j`Ð ;!Ák|%µÚÝo½m¦äšy‡av^¼Ã¤Œ5 D€ gNºë[oòsƒŸ|Ô=FЄÉ$@ô^ >4•eßyS~yîaèÚ±Í AßbEÜç–Úßžmç-ø©ZÛiáCbƒù™MÉš;ãv¿bR.¯îéâ0yªÔ´cÌv·dÉ[QSЦ+ÂÁœÓ—Ý9ÏšEjJtªêJc¼Ì²s "Tí2 ¦•JDæ»n©Ö fèZ÷œÔ_YÝ7;ÈcaçW<âV¤Kª½ ì?¤ÔGžÖØÁCÏ=Q®;Ø£˜2?vuɽ‰C$•‡”"6Ò’›Å—™n‰ÃõTÍG¿'}.]è¢cbèl„üoM]p¿|ƒâ»%·\† ¤·$ÝtôäÀ!4HF¾¢ ¼ÛL¸UMô’Z̆• ãâò¥7Æ–O^­K[ÃZé–eÆI<¬Ô޵ÖN;˜ðÞ;×3µ¾Äfk­k‹Ïž8ÒÒÊŽ!S"ò‰Ñç}üøèïiÐcBœ˜_Ê+& Ì ÀÀ¦94*Ì þœ‡ïò¥{M€õ©Ô)ƒ˜1؃ûšP*Ãð ‡+볦g;9sbä Ó(Ww2MØÃtefª´B,z>»î¯Ô _ˆ^P?ªAÆäÛæ¼ dO:ÌÄk¶ÍE°FÅWÖg‚"†™2¿(È #öpžS~‹WÒÕ—ö>®É—äúŽ/6r¨[ÊãìÆ¦¼"Nߥ y×¼ñXÑag·ÁÝró5<’.BÎwï<[ÝÎÜèñõãÅŒ#kìo¡ƒc¦ssÖÊ]!ÓIS MŠsI=z®Qs —­åâK{*oÖs>*VÙæ“CZfF ºñ®†F´ØÓd’nk æÁŠÑð¹©Î7’‹¦Æ«RÏÎ\g¡j‘Ç;ÔÍàXéO:&03‰—Š£¼Á C£’ìlÀ7憓߄-?–‡Ù~ƒXLO¸xÝCO2UñÅrŠ[ c#¾uMc‘šûŒp§•ÊIÊnW^yÖn`ç*ïj¡mšý\°!D¨>`@;ÏœçÝúüÞGŸßH!ã¯YÎÞ±Ä#kÚ÷ï]Ü1I×"ZS¼ôx0å«vÚÄðg$Ù¯&M`À^åÕøööž|i}œ‚}„Jy%MaAw;%FÕ×}õæòN§5×ÊîlŒŠwœZá``NHºm¶\翌ë¶t65™'ªO\ø…6Í\á5ÌV¤&;òزâg0ÎTÖvÄR9á ÷ÓºXìø9@é ™/cÑ”ñâ÷Ô­è£xH•ÄMã ‘tTl³¹[ÅçÇñÏz°6:\„´x",kq¡áÕÿC#JÖq <”$1ý/°Ã1Ó 8? ÃÁ¯Ó¡aÕBh{ŽnÒ30œcVEö0MœSÜ Õ‘©šÍ£¾úGemÛ¸ÂõÍVµît¶ðïž¹·mè™Ëî–µuæ3£"OeîÚIÃÖxÚlv âpZ ÌB.¶d3¦mNwŽ Œ`ÊôI¼ƒc…‚‚r/žjòüé³0>–Ü|íh‰M¡–.ÊdÊæƒp§kÅÅçKAb7Ä¡ÊLJÉS‹-«62ù¤l‰šÖ›œü|sÏ—šÊ5Æù…è?1¿&?7¯A A)Ö"˰è|)*~ |¬‹ð$ƒð\]Bg.@RºÌüÈážÍ£‚-¹§6×QJ;Âë#! °2`5¶øƒPJ”:8ÄøÞ’ÂvyÀÌ ¬˜ÜÈ|ä§;—BóТøüBªD/}Fœös‚=ìr`¯ójœ[‚ Ø*0X b|™eýü;²vN¯Š©õ_Áè~ŒðõÀª#œ&$=ߪvÄçãÊVcL¤‘>p#@¼±A¥iluÙ6?˜Ÿ­²ýD–š÷¢ž¾.ð‘Ä+`!¡’ŽPJ¢øÍK¹³+|"I X…E˜+à—2s¹q–ùØyèl询‘µ6ö$M¾¯s¡gÁî! 䇴UØÙŒÈædªÚcY·i–«æ>õjš• b”!qlÓõ˜Rº#¼èe„a¶0¤šÒ ¬Ý¬¸dBÈ0"d ñƒ Ó¿7˜Wê3¡aR»óÛ÷±Œe†{£ãñ¨ÌäqmMQìSiøÓ›ÓãA'XÇfæ  C¡Ý‘–¬‡±\i(zü,ÀØÀ~'K …Ö7–Ø‹ïß»~BñƒQàÞ§yœõTMD4{îjMö‚úúéß® ð·"ÒÅrT^h¥Κ£Ó‰‹(î/¤Ì".©¼n>€àk‚.8xLj=o¢ìÏ.Î+(Bã” # Š<à×詾ßv½s?Œg3ÃM«d³xõ#øØßƒÄ›Â}+ÐÝ+šR1Hñã,ˆé>!  €’³ûE¸YàpvWÆÇsÁÖ¢r| YzüüÿAa›Ö”“:HúX0)ÁÁMçºhbj¤(‡×XX 6 €à*ÜFÆÍåS†'$eJ‰Ã¤¼ìt8LJÔ#Ú®sU²A7z¡v`èê6Ø3èIãÔµõj37Àú²7@ÆDÀD‡Éå`‚l¸$±šè]ƒâÚ°dç_/(˜y t…6Â.Þ'} ÞÌñúìÛ¨XÌT}T2‡uá'ÛºâÔØ˜ŒèK8ou—BÕ3Šö³”ʪi˜S¿|å+‹~䨧ô‰ôû]ù,ŒæÂ¹¢j†ì¡E1¢`28㘢’Ы‘«u"ƹˆ¢G.*J!lÛŸåôÈ€åønÙ<"Z.ñzfô6„må"$QV8sëú|æ}.XXzøÖ`9{VØx&s•2¨R¯P¥H5ªnz”?­3¢oŠª²&]ÉI¨ö×½Ý^•½ŠÒ=X†gCœÇcÃF˵η¬)5ÀêhÃ7ZC`s‡ \–Ù“+”á—§xw½î°›2pph™c¾³gKlÔÖÀÍ N¸zÙ BåZY .b¡Ü‡\º;”í†,í`Ç;Ìë{Þ÷¼S05w±43YM)rnºÕœïLt:°¡ <¢k8•צÌ9HuÈg•ÆZ’²KÁ²p½»*8lãÆmNà¤Z:!°±áœ9•Nš;´ð &ÁÒñ2èR„àТ„±£Zïlžåö6Âr5V×g®l\ͦ­"«‹Å=‚} ÈC×zpgàn.|•™Øí_­-ZŒí žnV5n”V®š„ó“Ö¨£¥ÉU4áK5ìñÑ[¶ 鳜°ê¢¥;®uÀ3¨ºµt'Ù+ŠI9±Cí=ü2´WBä„àYÜƳ~çy§iRFc4Œ®^޾KÉ•îÒj&Üé¤à{²=Y±£=}€›í—Ídn_;>„lî"¿ÜÅá'Îvžq]çZ‡›˜<ðIÜØNRAl}è¨nEŠ1!ÏsóÑuÓ•ä'1Šc"¹K´;©ƒV-4™]öD¯3ŠÅ™Ÿ”¬+s|V¶`ÑrÞ]Û`¯ „¼aÏ,òÛ6GzFæñyu£Ø`ëœgtªBóêðíû@ùîü:íJéYåhø·Ú^ƒø¯¢éíã l†|[·##ãðwŒ= c³Ì'ÃӋ܃PþwKÄàFÐH˜£¬ ÃØ]àp$ Åóú¥ãa‹:’˜HÒ[“E2d\ …½Œ·›ƒ-„=™C;Ùxp~·Iœ;wÅ­÷Ú¶¾[ªH>6¬ïžkÐÂʾôNŒ{LBJ½ªççK­6©HÔ Ú>¡°vm6-Ú:)ñ«£ñ®Ž8«z{(B–¦Mè¬ÛMªŠ¡öžÃË$êz“ o ^Ê%ïjõ!ðxúNnSŒn¤] ôð»¢Òf߉ƒ0`›æ g )¡Ik¬W¨-ø’;_D¥3QáVd¼Y‚)§¼Ò!åU½#ÍöË·/“1Û”{Äù”ªXÂo÷"}•3?Ìç£ðÁÆ€ a´égc›9USQŠ3$Ø%)¹—D0ï¹juK9fbÉ&•gXajE"C¶vd‡sÔß/¼u²ùD{ èÚg¡\(¨sxîIš¹Z1y“ze8•4[ˆaš­v: ›¦ÿ æ;Ÿ1Ìd(î³XDÌèpSA,+ï€÷#ÅðL ð*k$"+|ñç6Zot ,8°1Ý ùF¾Êr|Fò”·Ÿ 9ùŠf1N?,Únnü¶ë>k-ÛÖgT'9Ýx©£;îóz V=Q`Â| `\ Kè}piÑL_lÖ#¹² Q¯ÓH4 ÅBD>úöÞ*º`‘à!C9P@’1¯Ÿ}ªŸõ7$EÕá)S $ð¹Fî%L2M`»´v3x`"7à®Mꓼ(Æ`e° uIàâ±—®‚#¬-i–±HE=¡ 5*ö4 jªLN˜¤ «äD¨"èX.a¸Góüý<ø6úa·YŽC5-Ý`¾uU‹ª=õÇŒòºž¤ß˜ó@Ù¬n\R°!hHÄ÷—‹Z›pdnj^41—›SRÖ¬§Ö¸Æ¹ó½ ¨†ƒaÝÒDµ ‹lSšÖ‡’ÒŽyâ(gÔ†T®€%CεKTKÅýX£†xÖŒs-vGçÜïÆ ¾ÑöS¡é.ÅŠzÖ“˜zÊh†[á˜6°KˆÜ —¿Í„!¬4PÐ:-–º¯°–o™·Ïš/×O°ð` ÷y ÈZÐ@ `D¾ T†$=ÇßÔ Ìä0h2N÷Û5œf«ªû/ºï3¼ee ÂaYйý™˜rFÆÿH‰'Â??½³U®1A×&¶¶³£´¡Ø¢<@ãí“3ÁƒÓ1!½”žÎ(‹ZÕé¯{Öus·Ž)è‹©¿R¯ë''\9pìÙÎ;´ bkÑšvéšgž™â²V›­yx”“Fynª¶Qg‰¶±]Z5»ˆf…W‘dö/ÉËÕ7X`”² Å$´)’’DzöÓÍ¡ÏB¼å%çšl¦šyñ”M›µËBå)ਦ¸-33ÑR˜1ˆ«®¼}|>ØòUy¤N8ç³&]Š¿EÍÝ`Î’µäëÞ {Ë¡u"M*ÉØ$Ü:žÆP0owëŽÇ@›pØlÌ5Ÿ®WÞf!']W>]ªžâd¿&Go¤Þ÷®U‹ÁÞ‡ïŸï |%³ ä^`ŠŽµ,äÿB¼€hi|'%èçBµã¼é&¦‘©äd¦¥m °‘ï+(u™Y9nHÓ$°°É–piÌ× ö“sXˆ{a˜U#Ä¢šSÍ[Ø•f|šë°w×YWÚr ÷§Z¸¤{Ç€¨ËZ×y(IFMlS&¥#9Í)ªUÖ·œç¸”Ìç;$²ù^±#R<6ÆuÄÛ‘~‰3Ch,\ívÚºdpj†n¥E¦°tFšzËÎ3&¶/uB€’LŽ.ŒæÖz§…WsÍ‹{^ù•ÈÔ¤²ìîÃá“…DMOÙ§ué1‰c/{÷Zêkq/zã%è#+¤Jy¥<;·ÁB ¯9c0)¿“ß¾LÚkñ«–QˆÉš ê ³Ðœv›Û¾»îN²$ Ð~[ô¯lk¶nm”ʽҫ]ªÄ×¶¿9ß,³Kñè^»™µØÔ¼¸$±(†…JÛÏ™öç|ë:‘ߦÉJÌ(sä B?¿0èx,_€£wвȱ“:Ùâ9*°r@Ù5`3 °À?}D`à)ïejb"¨4+ºšÄ&šÓXÛ(I¿Â‰øÌd½—û.É’.9GªÚÄóÌšÆO•ei–|\­ì²F9ßq2½—¥¤ÙÏ%÷7Ã8‹×’¦¯«zõ<å9ëí»¸ÔnFÉ‚ .ø‹À x+ †}‘B-¾ûõÁ¿QZM…Ë-œiL-iïÏŠ;¡YJÏÚùi^þöß›aS°F±…N4Œc]É(Eü ÜC®ÈÈhJ1EÐäÈÜûT(eÉç;¬*ä˜á*ÈE¶Y¥ì¯g8ùó׊Χ`ÁQª8㯗Èå–hé¡Ùs½¢‡<‘Œ™IN8®|Ç|ŽeY‹Š2ÎÓçKCMˆžÕºèøϼ¸©7¾ùËqÖNÀ&ʲ®ò†€ z£‹K Sÿ\Q§Y§=ìÕãoõUZ(¡–Ý'ˆ‡f+(O0fd™®¡S¼²&Î=U—º«¿mß Ð½†®ðØóû2E‰A’Æ¥äƒ÷åÁÈ!Bûª>Y"nEQ—UQäh™N$ —§Ÿ+ïíIøÞ4¬èêtL{Ù ˆ×œ˜¸%QµJ d縊(fÀ…¯ŠÜžÜŽûß<æØZù›iÀ¥¦ \‚‘ô^…=ÃÉp)Ö‹ŒÄ|Ó届댭v1~Æ4b±Ü!àiÞzûv^Îèͯ·¼÷;¢ÑI¬}H ôs·›œoÓË\ˆëßVtÈt¼­„"ž»Ö­†ENýV§/1^Ãæšbf8– ©²ºÖÅïl7}¨÷”‘ %Õ.PfgÌy› &`ïùŠmÍÜÖ'¨ãž`d‰O¥W@K_Žr‡5!ü¿,Ð{ÈiŽÀÝ%•¡¬Ïq ÚFnGðêJ*¤*¦„µhCÈÞ©\ e¬7)¯EVD)8¥€{ÇÜüyCùžD?x«±.veæWD÷Ÿ¨â—×òjûs^5¦ï.ª­ŸÐ>EY¹&¥(FëV†ÃF 5Þ™¼d^Ö(=ä¿Ïøü×_lû9çç—Ñ#ÒÂK¬¡È¤È¦„P©RÆa¯Þémï(·S{ (¤ŽÝf“!}ìT³6Z,HsÇïΜg§{H´9¥«‚j€ 4eœ÷ß­¼õnüŒ˜BÄè¼ù3ñ×Z×=»öêZçRmD=Íí®³ÆzI8åPx|c™Ç*ìx–ŒˆD%"ô£ê1ŽïTÝeÝÌq3Ñ;‹ò=¤okœ[Å:9Ê,V…ïZY(È¢Ø2ÎJWï {é uÜC7§Zd2V„î¾Zž)Í¥ŽX ”X¼0»'L»Œ>·œQìÝv–Hcѵ±°ø+_KOV¡G* ¾29HXþŒ.³6ÖåÖ =‰9õTmÉ|Ü~tŒURÛ%÷éÃhVßÖ8°ƒ”½*ñª“ÕSë*wóÄÈø@GEFäZH4Yy÷ºøô5¦äîòeíA<Óùú÷ó¯zz§ °+»þÿ( Úhný…"н¹×¿ÐMŒo.„xÍïZõË9MÚÄ™;(ÄR£õ)@†÷¼ofjí¶Á£Záï|ÞoÚ³^]çÆ”GÜDÚ”)AQ^–s®êË/úŸèhlKÌEFOõãCzw ð–æ³‚ý>ªñêïÖk¡§’èhqû¥Ç©Te›jHbt(aa.C Fi.Tß“|i­rë£v^ŸÏÓ!ç+­Õš#:ÉÜQT·(¼“cšûÜ õëÖ½xç1ŽÌötÔ19àæöyç+¸¬¶--ÕdÌÌÉœçÝúgj—ðææ*ùasœ¼v– TìYAgЬMï{ã;–hçÀ¸Àúóg9ŒÓ®yϙΎtmÆÜ¶"""‘3ZЬ»~ùˆÑ<Ô¨ÝãÙÝåÕ)Kî)IXX•(¶çhœFwI*¦öuä]½]¤‡ ÁqQ8^£JÈ\˜¿š«»?¨)è‡øä!7ÊÄÑÈ0ÌŸÙvKôx‰ô>„ê¦gaìÉ“N¶\m•Že¦+Þ7.µïæ»|~sÐ?’ ‚°P‹¤ Zi¾;ۛ߮ïMóÆ$¥1•9Ú¼ò/—·ŸÊA;Ï劖ì×ð´BÇQÏÃå¿7¼¸‚rŒlɱuŒ M65¸ZªN”Œm*©vºPAmÅß Ï&µ+½3Œ‹ŒÕfræi18{Ò¼ô8ì/h‡Þq«ôkCÄå„0¨c‰®$ž1º#Œ‚ ‹»Š)r8©AåaÍ4låô˜*…VhkpÛãqŒVÃØˆô<¨%n5²ì1ÒSÚ8¹éÆJ4Xt¤S¿)zj|³Òufaª3˜;¾.¥v»3œe°:0n2p+GÞe’œ À§‰ -kÓRO„¯ÍøÆH¯‡¡Ûˆ= ‚<¢—ÃáZŸX û´¾^ø¡A…aC€Fƒ"ƒ¢wÿMäÙWÁpO뀆Ä)ô6ûdéÙœP”¿¯ÐTÿ4#ÀcdÝ? yÜÿ'ÇÀ¿PÈe3µzì}é01‚Œâ±ª©_±¹jÍaÑ ¦o¥IbU^ ÕN1^À±±”ëcÄD!k•£[×^_+tZi©yúª¬¼€"jyé•Ѳô2‘Z0:×à.Õ1!ß×;¦â}õ½ ìØŠS<_Iއ3âÌÃÈ› Ä“ëª(\D@ÝæƒKÕÒ—ó¢C¦4>×3àŒŽšÛÀ膤¥`DÀyPJÎ Ù!U’IòäLä!ë|öü(L_ÌйQö´.Åäo¿f ¼úO¯'ÙÙ‘,ìðÅzÞ…pÐ!!vóöéÒˆt»]¹VŠ…-pë«/wkh­-½ n¼JPw&kUÙ”˜¾zdFùc!‡ª9ö6 !;c3ì°{ù[ù8ôx5„ Êäh¥Ñb†HÜb=;Ñ;Žåc€:Ž|£–0$iºSî°©ª©AG'Î*€×³A€è³ä‰nîA „É1.7ŽŠÍ[Œro¾¨Äס6á'7]Sª´ßÉﺢž[O,ÅMvyçmñ4aBã ô#Âlo¤8‹Ì¤E»p—ëj/¾à´§d§<â µMßYƒbµí‘L ɇ«s" ºbš¨Ñô|Ht¤NŒ ZöüóC*zgø$B-kHh X2ü#pѽ­ž,¤òÈ,êÒBû">÷IÏß9,’DFñ«<"|$Õ„èy“á5Y¹ ªW”‹PWW™Êw‘3ó–Ûï#DwJÎè f_Ìäý[¢‡Ýº:ÝPwŠ“ÒšçŽ[(A2[=¼Ò™‰˜ðö~»åë€ÕŠ<È —3u¶rö½1° °.fν¤_.ŠHEú‹ ô4! HÛæp`kLaH^n8ó¡ÓÅØ2,9žíÄ;ìB>ëíùŸa$²6uÚBÅWi·ø}*èñƒ5Í9µr…N‡|Íg{ÄN[4)~22“D©<€†¼gæÁYm¹ ®ç”gR  WUC¥A_WÛkƒEǤér"+Â`ŒbG¡$+šNñÒ†S†CkCžœÀÛ×i¤ ·ƒÎ/f@Éœh'G«u’(‘³’gfÚŒ)Ù½V’BÎ2@5Ü›[CÞœÙw}Ö³÷zîµ­jñ˜‹·08uÖ»“DC;Q2á4D'Lgº¾â&ÈrÓre9 ÉÁ³nÇ]ìÃ}é!« ²d¤hèm,š,À&Ë£'A3•†6§:M&Àlzà4Ò=×^Ä“<fs1omÊ„ÅædDZ!e¦£ÏÑ¢’ž÷ ÚÛ©l!V–‡ho¶gÜù]9 ª²}×áj%ÇoqÙkÉažï^ÌKŽ`yœ4¼ò5ôDŸ!À–aS‚ÂE¼Ö{Ê<×YíígçL8»c©TÆDÛB¨ïÒó‡ŠM:ñmÚœ¼æâtMmº9 Ç`²¯S`ðcœ_¹²æ^uÆ ¤hÊ˨âÃyZf¯*„§DÓæ'µRÞ—¼ã‚–YéW•õûËuY‰ìy¶„evóž7”80ŽtÉ–½eÎ{[¾…>èWßÇ]Om´ýï1ƒx ÃÓŽ“V!o8µf&C"†%OæÚZWG`N jÐË&'EÆ{²°õ§Ò—Ó×±¶vL”¾:Ô.§?[[¿‚d3Ä—:¡ÄU1eá¢4LÉCžëš’§!ìz÷‘Ÿë>¬s`JŸš¹0Ú‘_JpnïÎ}ähNË’µ.ÌÐÖkõx бÜA²Ë¥:âfiy+f9H¼ìåÙ'8‚$µ°š›¨óTŠØ¹»']ÓG{ÇÕqUä[·, Ø©§‚àÁA¹âàl(%ˆ€RWį̈öK‡‹ ¬2œÐ[Ó¦/Ÿ4\¯%|Å•Žn¯‘QË76.¯EËb4š¢ÆŒöñ@¸Ø2àZ "/ÑoR&/«‘+Åî×êÚ{/:@°iÙ1æƒ~áîE%!Ìâ"EØ]Í.r¤HÞû¶¢ÕíÑìééæ)¡Ë©„$d Pû­Ñ±v¥Ž»ƒqj¶ÍÀ²±XŸtí%¬ ´“rÌ£ mì²1+ äP}<RDöq!3>Á…!ÖBO€T¨Ý¾Í%‹â—Z×¢¢¾_Á‹5Ýw@€´ØÊK`²ƒ @Øðé~®¶U]— ¡–%”½a¼‘V—¼©<‹Ëž³4Ò¦çÁ•Ý(Làßâ¹]j¡E Øé¤,ÂC: 4´2`^Ô͘5ô=Îó|>Î{ö€ò yµm3]õœ&Ï=lÎë®Âð´†ÔL¥ Dkj“Pµê°RKe¶;.OWã¿<³åp›£DZjå[(KÉy5ï½Þ±ïåÜ]¡Å):#OˆÁÁc>Øœ9#áKHYØx:ôgXMFî!ôóÛ—²cgC*íÀl)bP™Nù¢ÃË¡%†!íŸ\Ÿ%Ð3‘¦æ<Æp©Pbfú2s˜¯n$PEy Á¡­}= ¡=h£“qÍ‹ßw½îó†±p6ÀÆÓÜ´6ò›6Ai2J ´·!P]‰‡èÙ\MªÕé[­&y¾°ˆ~§ ¥­Ùæd­¢t^nP4KÆ#Òþý$;—ôb s{µi·ë5ÒòôG/“IN\ Õ^R Zâm4¡ë^ÇÁ7à'`žÖ¸†ÄÇLjzá~X—ÞPu¯Þƒ:l1>™\!,êÉš×]wïž©«;;0œH$ìîPD 3 Vç.1yKy„ãÛZ˜¨¹Ñ Øad¡³PÿG.¬˜ÈòšÁ eèñ€@À@PuàvÏsè_ÜD#9— ±CÌ~ýD™€HÝú2wYÇ«ô ¬_G—.Gººæ¶ti¡èÐà_œ¡„Àþº>T< ׸Æ$^Á€€üŸ /É…¹¿Y3¬ce"©ÇâYºO×qÅãwñ´éTz²4.áâ .#ž%5ŸJߗ決é¦ë„ã“b¥ 8åN轊àõÀðryvkƒó„ MѲªrŒ|ã„û Îר¾Ø±CP€ºKZüsC_Îÿ2yˆü¨hMË =ZÀNóàF»ñïƒß ¢À|ðô–Y×± å§ŸN×½ÑæÑÓш‡¶þp{xn½¸eG(ÐÒ4°ˆJ<9š–U(S}-j÷¦›Vú•5$ˆV¤’«Ȧ•Î÷±¶&YÕ.&@›£¶t ‹ß‚ÔC«D.d:µ3•µ Ê!9CoQÖ÷ÚºB3q¬•3+×[ø ødd\ÐüÃ:÷ñ°ñ\7¯ÅØ)Ü\8¯|³«ãs÷Qˆó‹_³¹SÇŠÂÅ 1BÅyC$ââ\Ë„|D–$Á€,ìÆ$c#zýç¢ùSÝeT0ªúž¨Šô˜,OãRˆð÷xø²!(Ä*óœ½ìØ+HòHx•pœÔ‡ ´ÓT w œ´÷£tˆ¤–5¥ :*&¯»ñÎþ½æçu&!ÒQÊšÀ±ÔXÝuNˆ›Åµ^!BxiSÀÖIÕi·Ì ¶Æ¦dÏL­3œ`dGÜ |qöB¤Ío£Ç]ûÂ:Þ»¹¤BÀ{ì.ƒÌà¡Õö0u–…nIâ-XA86§^=íwUª$Xo‚ÃÕ—®ñæ”ñ¿;Àm‰ÌÚšõ×9FñX¬ã0]ÐÂÐjA”áJClYQúW ÀÕʪn•n¡NfÂPY¥ S#­ÅânL$ðC²Ån™UrQçÖ‘íÔsïÖu"!¡ù¢¬253¨|o²O“à °ýÀ]9)Óü‡h±¨:€Óx¾ü6v‰ ¬‰)sŒ¡SìJ‡¨ ziS™`vê½-§¡]¹¨7¸\Ÿ˜ë‹Ìb)¶h^€j¦ S¨Ù}ø¾Ìv)ºÂ¬/|^õ1“¥ØC)jjÎóšÇ£hß·,s~Îmï~w byñ’¶½õÑ&SIdÛzç;ÆÁpÑÑXÆhë‹CD¬ñÉvÝ¿WÄ^§Zf›aâÔ[Szg D€ÅŒsÖ¾‘¶4 ÑÄ ÏÚС~os^»Ÿ4Á õ¾ã:­Nü}<’²i9âñ0RJB€DÏŠ1ªt~ì¨r€ƒV‡å/†Y1Ê&›[cÀÿö3r>;“WÃ$mè{¾Žï^Jë˺½õƒ:Ìük ž¨{‡tyøƒ‡?'•|;FD0«ø_òÝûÚ•MVKÏTö¯ázL–¹Ñy1A™· 7§°ðôfš3ãIÇÅõÚg<¸Ï}qÄ“;9Þâ9ïÑC™W’9f3…3ÈQfC9œ×¼œÀðwQ€7e£ Eï=øß;Í \Áߌw¬ëËéÐðg—šÜ`…0iêãý¢3ŒHþZI“>ã~{÷<øÄÛ;ŽŠú¯LõIžãà±̧F+½²®ÆÕ­Ýu *›ŠgTJR©Ñ,?-Ô+ ðôÇïC«ÎÎã¼¼{DpsÁ8Ñ?º‡,h`êK‘CV|Êàƒéw‹§á?¤M䦦•B˜”¨ù…›óv¸Euñ8=˜µøIJ€¹?ã šì.ãçzŽÅL¤èÊÔÒœc©Ôï©[íÜÿ"â¶[¦¯‹!?“iWì4Nê#òúŸÚVÜ}ÇyoÛ<Í ÕðÀâ3ßW@7øK~qœ° ó¼±ÍÇÇÅJ¶ ˆ?žü¿Ln¦ùµ”¯¨É»ÌЬ¥9Šs—‡T „™ã` çsÏ@Ò1„°&ÀÍs#"˜ž &„·r‘S%¤<±¦Þ–ÄëlJAPˆé:Îè×åyd¹Ln¥a-ÄÞò˜%)VâÊ[I “(rÒýRUùøãÓßá\àÝ×™ãü&BC¶x!ŽS$ã–fÖè®>°Ž¼+èϱ¹qRõâIÄ<ûžwϰÈÞä4¡Ñ8Æ@bFµ°Ž™”Ê ÄAe5Jw¾^«>_-:eOhÂsÑúp¯ 1J'¹Ì¸œª†Ùùú»Î)†Œ2bŒ“Ëã<Ö²KÒ)qËXrÈ×$[»}WFÀÐÁ!œ P™ÙŸ¾Ls¿’?oÜc Š’§Ju4¢í·TßVÆæ­7ÄÂvv +wæ5×4些àqS“‹ìÚCŸަPy:;ˆÙ©I~CsR\v*Ô±dl%´/ßhغz3Å Dï§uÞ&4 Öø‹#jpeã¾;Ï02ÿ)þ¿˜àíþˆxV7çTBËÈÝæ#Åt ¿¦_fßë°`ù#¢}Ñè4/™êÛv^Œ`°îHCUñ[6¾ø$ñ]ô;?Ý`zñÀÁiÐZ##Ê$^HG*NMKYIªssÑC:-Í­Fõ¦ã1u¯è…4ŒÏGM\;¿‚e%Ù¹¶Îß:ãs…߬ç7à«Qád/%‹‘Û÷]Nc„-®š¯X’ä òσt2^6©}/x:Ño.ùœíXLäË(3¾—›ç&J2¦u Ö æù>~ Öó„ÂLÛ~<ówƒƒÀM…®»¥¬-ôÕÔÝpdu ©$‡PÄúœ̆0U´4æbDl[jÀàÏ$yZ¿V«{ÐôiÐÄÖ‡Ÿ`<_’aoƒXô·…îAœWg¾ ³–r<¡TÇäk{¨ü+êâ|ÙÏÒ¢BMÜȘ<ÏJÔˆòLz$JLýE:æéL_*ϘtÄOªCºXæyA—J¹wüÛV£žÎögÊQRS¦! fÕãlðìL1ºï´ÛŒ0Ø7£fâ)œý5Ó§¡¢Ù/J¶æñdxÀB·…Â~´üÞÑÉåý¡ÞBåÓ³'ä/?…¥ìÒÎý{ï†Âðg$#»NI6 _’=Ëÿp”}ð£ŸOcÍ+(Mrøÿ!ʤ@–…ÄgS€Ò®B¡è ý-6C·…+)œÞ£¿bUYäËK[r—kyÕ¥M÷ I[Øê¢ú‰ŒGeˆÛÞM™0 ¤Þ£zï’ÝYl’µM8ænaŠìæ ¯^¦®ª½>q%P°ˆÄ(D',n¶nyˆ|óâñCî h®!ÁRLƒ§px<öy…ÆäÓáîó7z¢ê`BÁL YÁ j ½ó5‚©'+;­ÈIF èxnЀò ‰€ì˜ p=$^Ù‡éÒ·ª4•4a2DëØ\5%øf“¤!*®Œo¯Jh&\ç\^x\qýÞû’{¶ÍæÊy”‘^@@øƒ¶$¶<Ŧâ4x·À¯Ÿ>#oÃ? ±®ô÷tBÄõ­õ`X…–LúÛ‘ó´„6/È ž+ÃýÛŠg;2|Ùã$Dc °ÐLt„9×§#ß3w<ÁÚÂ|°¡0Ü/àgÐt…=¢oa€ù%·ƒ"lü^'PK’”"8îÅó¦Èˢܘþ­Ñ”åŠÏxLaÐ_6ÑŸ÷éýv—E]6¦î<—-梄èY ÙQ¬¦†+'@nt À,è(\W? e0s›ê{®\CpœKÐ~Ÿ|~‘ì¥çƒý@÷ ¸ ?{” mE<èàKmlBL,A«—2íÓòè^hjs3æ¹éøGH±–8”@3QÀ@T†€ãÐ dÎ'Œ“W½¨·WExøm:øítuŽågw; U‘¾Þó÷JK™óßX—\ì#0M¨ƒõ‡ºA\Â%ˬ?Eú¾#]mÍfj쪳¨§V­DÓôê¼’Ä8߀ø*3[Ê1^ó<&³Û`™0 5Ålzæ?v íå¨Êy¾ñJ"° RTÕR™($qò¶f‡âòåˆW9y‘¨µ‡Þ­j—‰8 >MùR¢GÒb/µ ~ñ!Z+Òx3&OÂJÛ7ê¦S»>ôZyì= í bÒ÷¢|\"鬪*L¿Ù“DrÈïrÔ͸.´p~%`3ÁPTÕ'CÓ \`*À<`xqª Ü&F£»“ž -ÄÚKä,x$rÇ™›‹ð1J#¿w=mS8Øàñˆó"ê»\©<ÖÔ…cÔŇ=àº|Øäf¢hú2„oðÔ?Ç÷q~ÓžŒÆüŸ;Þä7þçýª YH±€‘ $a!P‹BX 1U$$X2 F#‘¬b0‚K  È°‚F(Äb(Š( ’E‘ƒ,ˆÆ2""D`$BÈ€,‹+$€¨°‰"€„bɈ+$"ÁÉ Á‘dR@Œ€À$Hˆ(‚°TXˆdH@‘dHA ’HÈ@˜¬Í¢*±ˆŒ"¢*Õ"*"¤H‚ b"ª"ª"±ŠÆ* …¸ÅK—$`ÁŒUTEVFEH‘ƒE[¢…UH‘ŒTH±c$’1‰©))  UUUDUUTDDED©*•UU‰TÁ‚"±Šˆªªª¨ŒŒ‰P*Dˆ@’ µFŠ$º¨#TF˜T‚ªªÜ’ä‘!!a…Û«TP«ULbª°`ªªµ¢… •Jªª‚ b%YÉddd²UQR¢¢"*ª°`¨ˆŠÀ`*""*ÑD¢TU*  *°`ˆˆˆˆˆ‚ ¬ƒ ˆˆ‘"¬b""¢*22*%ÈYp¸1ˆ ˆ‘"+ªˆˆˆ‚ ¬*ªª"Õ"*"ªA ‚ bªªªª""ª"-…’@€$„……‚ª"+Â0€ª`0ÅDH@(¢„DUUTED`0ŒDDDDAE`ÁŒUcŒDUcPAQUŒDDTD €X]¢-…$ ˆÆ]Rª¢"-Õ1•T©*Ý$IaA@ª¨ˆˆ!UHAT…Rªª"ªª­@•J¨ˆŠˆÁ‚""¤HˆÀ"2 ‚"¢P\»ddcXË©U"DEUTTEcƒ UUU"DAETEH‘QVŠª¸An`ÁQn©ƒ2ª•ƒ¢©Q*©QŒZ° eŒ*ª$ ªª¨ˆˆˆŠ„B+#""DŒ+ *"Ù J(V„¢ŠQªTD[ªUDDc"EUDTEU[…"1Œe……–"*Dˆ ¬ePP"*°`¨ Æ*±‹D©%IAƒª(Dº!Dl$$%RªD‰*¢"221Œc€ˆˆ¨Œbª¢"USˆ©"IE*#ˆª¶ÉvÆ"*±—*‘ÄETDUcUÅ`0(%RÕ*"#Æ0`ˆÉ"ª«ˆ¨Œ""*"*%QB#´*ªQ(ˆ ¬#‚ RU ‚ª#Æ*±Œ"DˆŠª´EÕ"""" ‚*1Œbª ‚"%ÑBª±—A@Æ0`ˆ·HUYkIe•R¢¢*ÕR%QAR­€T¨‚ ¬b"¢-Ô•"#UHˆЬbª""ª*#ˆ¨ŠÆ*ªªª¤H¬"ˆÈÈÆ0`ˆªÁ‚¢+‚Ь-T¨Æ*T ¥Uc”2"Â$‚úÿoñþÿíþ’¦Ùþÿ~†hÔ,‰ý_×ýßèzÿ:Ûû±þëÿuþnÅ·úioX﹯Œç=Nþ:ÚN+ÞñMúֽ߇àQüý£hï©­'üP€è­þx®óÿoôè$ýQV—×zç9©µ~zÿãúü¿¿ãÇ\¼Ìf{Å Æ=ã{Å8ê¿@%üñ¾šá1Ðê,ý«9ï‹ÛTöò·/ö¦‚LD!¢w=QÚŠ¨LbTjAxCð2bŒ‡l€š„% Âîéý¼„¥(šZinÚÆûœRr¸æWþyùóM­– í·¶V¿œ7‡}iºýù¦€+7 dp v—zGSkh«Ûï8,çá‰|4¬Æ»Fö‰ŠîíJt‚Y ‰Ö} ßŽgüßû þò¸ãožˆ ?ÄH%X‚?ä2‰)ƒ$ LŒ‡ž}§.ˆù§¿·ñññ_¯×/Ý+óLû&“ð±ùütüì¿{ µé¸7 ¯õµq„ûR³ý{pó(AD²S)·Ìï»±ó³ÞÔöô®žÜÓåì0{œÕoí­¶J÷d¢JTIEôÀHëXóÝ-»²øå»×å$ýQ">ØçøÞg•ˆª"""""""Š""(EU6ó¬ÂüªŠªªª“ ªªªªªªªª¹*˜HªªªªÅUUV ª *+$UTUV”EQEUUU-!¨H@`¨óÎzþOÚ>ûÛ>>ÿl]POˆ÷‹ÄOÑŠ÷ó~çØ¾[Ьf\ïÕ~´Lq É&;ã|üe‘Ÿºˆ P¤}*ük©ôgLvž¨I$@y`ˆ&ò!‘Øø‰ëó¹h:WYØÌÀû>·®óJ§ã|„L}KO¾ð¹÷ û϶õ¿^ÕÏÒÿX’ª""""®óùÿ?éÑße)UÁNY~"•ýdëÏÇ¿×{ø¡ôù÷ëá¿õà _ÕmO–î™ùÞ%î é´¥U%ª©»WßÎ>Ÿ?Ýý8£‡ÂܬøúoŸOãM4ŸÐ ¹û÷è8¤u—Šò{|ðuñêCo^ÙüÛÏÌ„ßÓçÇYZÊŒ¿é ³Çwíß³ÓÀžMáEÌ©ø¾{ûa* ó›öŠÄ0P¬OÍùðV‘h¦ºü_ϯ{â€mu2‰1 9R)‘Ç'Ç|óÝ›Æ â½ž)R×gÅN’sö[úͽT”ß3ïÄRMu‘D|yõâÚyñ@¡­0¯¸«]Ìí箄Ÿ±OvãÒÿµíãÕ6Ï|³Ðà>¾ âõZZ(¢ôlÐ׊úUòñðšFå¿ðúúÖwT„€$UUV¯à°±3ÁÍã—×àÞêzÿ¯ço3õ›?SGÀÚÞwÆ/í¶VÌÖr ÓNÇÉã ÝÀ7§…Ï×ÛHˆ‚È*ÀUTUU¡¦»9ú_^ëÌæý…@vE„EHDN¡:üäÒÐ$W¥sÓ»¨ÙËØñ³àhòöÅ*{ç–¹–ßNý•tPãYæ”AC_Ë?ô¾Š¼ÐÁ%ý?óZÆýˆÕµ”±3‹þÚ 1ýþ|øÍÀlð[@-Âþˆbù™ÄÇŒ’P¢£Lü›Î)¤Pý£4 Ìø'DLr¾éRUPQE$ ¨Œ,R(¤‹0”¬Qª”ÁÏ9ô¿{óÙ®»çœï¦óTóÏd€^;ôHvïÈ5w‚Hžq¥}Rp{gˆø:‰5‹G‹R—º3V#_¯Y±èïÕY¹æÕ5»dº²ºxjBcˆ$‘] º‘ /ºB¿±öЯ³± cÚiÄÍ­[ZÄz4&!$Õ‹ëu†Ü'킣ʢ¨ŠŠ@›#µSF ‚*‚"¢11ŒUR*1DV"1b€¢ªEŠŒAŒFETH2* ‘Š*DˆÁQYDdA9ü^‘l7¡_5ڥɾvùç.3‹ ç Œð… xK"P5dRE"Ȥ²õDІ¦¤R’¬…²‚¨    „"ÁbÀŠ ²H¢ÈE RIH"EYI:BRB,"ª’¹~žuõ>Ø£‹ê·ä•íûs›*Ê)"ØÒBUU4FS<° õJÅ\4ÛJŠ#y«TQEQEСС%0#teªaï-S]ç‹~†$$ Mêmµ›’芄 P„¤ˆÂ†IH=ïnébn¢õP‘œSzU5ºß¬>>}dzi55÷ÔŸUï.2¨ xŠ{[Þ±âÞiT¬ „,°d‹$@àd’ƒëÕ ðµãíú£ùùÑöùùo.o.hã }̵Y׻Тˆ Q߉úê+Mg5™…«*R‘XßFüu֯ܣçóA™Ê¢0bŠH ÁXÄEF,@c1EŠŒADUQ+ЬD@Dg®}súoçÆ°g¹øEDb1jŒ(¤ëëM|]@ß}/–ž/^:­o ÝÛôø‡ë©0ªÁbŠE`((±V(¢ ¢ªŠ¤Y(²"°"‚‚Æ*0UbŠ,$R,‰ÝÖÎ>^á~®9aÇúªª±E‘dŠª(Iªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª ¢È@UI°dU’I$UUUUUUUUUUI ¼wÍ_Y><|·)bcƼ_eDS<¾&ôšù‰ßêâ8®³„™„kTÙO£ª?U¥RdþoD&›ŒÕ¢¿çvªªªªªªªªªªªª¬ ª¬"© ±dUR*ª¨`ªª„OœM}·íöõÖvk½gR4†ñÍgï•)·*´ oÔYÎÖ¤ól=µŸ?¦ƒ}èþü2 ý…JЍ"FâÈ•!’"ŠÆDA H²$ $%€ÑU H¹ùûöoñ¹ô¨‰ëï5Xøyþ=ÌQŸôþʱøO—ÍK_œˆ/r¨Ãã2§@_xÒ 1Õ•KþWJ† Áù`§n%–u¦<ä¶uózç=G9ÿw4ª @°+D$ˆ0DAFI ŒQ÷„EôrKùäó÷ÏÓï¾—m æ+SæE@í÷4椑FdB7Û¯½Í°ï­ä°¢i žÍQr×?Ó=yû¼dmŸtœc¥ð _nRXˆ….hm‹!UQíd“HP¶ù_êÙGœÓ‚)÷öų¦( â|Á0 @q?:í§=y½7'%ÆÆ2ÎÀYu5ÖO[íu±ÏŠÇuùÞ€vB ˆÃÎa·ßÑÝ—|¼ù¦ü×aTra€Œ^4ØßÒxÛ@©ªˆ*hcÙk«Ïq=ç½ìÒ ŠçÆ;÷âqÍ3ø©_yŸÊoܧÆÿƒàûÂÄ,@,„Ü‚DH$†#"ƒû}»úå|®Ûñèøê·ø÷ZOÓ×x­¦¹§›nüƒ_¾ûÛ-ùýwûíä1ûŒ@@PÓǪQDK‰÷‘„Ûhùù?èƒõ(DH É%PÒ(ÂP’#ª`$‚0ˆÂBB]ÙŠ")bE" ªÅŠŠ¢ª¢ ƒ¨(ŠŠªª*¨²* +DUQEPR#$AbÅETU€¨ŸôT¥ŠÔªª¥J¢™RJ¡V*Ȫ*¨*‘QD×óøó±ŸÛ?Ö’âOЬûj Ù2bðÇÞ“H÷ÜùÚçöÎøû¿zêç«'À’ž ƚ뺢·>¥4#K¢$ÚR° ‹ k§Yéhù¡$›Q}.X‰‹©=–_Ä?_êÉß=U{ÊùÊ©$VJÛÞH Î=¯óVž2o`tÞ•ˆ44†]üYÚ©ð騶QCˆA`Ò%…`„Qú…Qªb>âýÄéDOè ‚A%ƒp,Hˆ”DÅ?¦ŸšôQ ˜,!$‘Ha UeY$b `2_Ÿtç…ü|ü~)é±øêtû}õu•~´û‘Yå —UOµúÇá^£Â~±;ûÖù$-Î'†^†…gâø¬àŒþ>u§ã<óÏáËôv§Áƒ+óoG¾AH )%CáƒÚMâäíMêpyú¡ýÔÞ‘`(,‚Š( ² ‚Å‚’ ,‹@DE"€)"Å"©,X,"‘UT‚Â,PVH*¨E„X ±H(E‘@Y ª¢Â,EQa*Á@P‹(¤QIT $PX°X(,RX²‚Ȳ(( ª°€Bƒ_§Ÿ±jÛºãßÇÆb ¾ªw€ ýå*WŸi(3C–ºP=­;ñ75$ëÔˈNÚúÊ®‘–l [ÔŸ0>`Ó9 cÔ'·bõ °l'Áü…)B’V Cöª$PJDd"þ˜D„ UãO™ž'ôù3å}Ù<û~Q¾Ÿj¼â‰kõ],ó¥ª ”ÝŠý6ùü?5[裖ÒëñIË][fþqòŽOõ:4kÄ4n‰:uDõ?Ö½FŽ6¨ü|šxÆ<¡XEC  ·5Z ?ÔI"`„U«TB<»UWèoŽŽ|þðÑŠëöûyçõцîïÿ•µµ‡En«e'qÜõ—¯Æ "W5@ßì‡Ä\îgHr ø‡É‹b¤¢\—ð}Í_ê”ï³V d µ®ñiÐñ`0„¨ ã¼Â+ïPùªÈ†‘zõ·Û.?>78´àˆ ¿}רˆCç|»Öä–ÊœÅÝâ^‰)ÊN•û¼®ïÃØO¹æÄðªÔª¯|Tοp!e>ÔI`¬ŸÖì`ŒR*þª~N ¯çØ{`¢ÈH*ªªªªª ªª ±UUUEUUUUR@"ªÀ‚D UUUUUUUUUUUUUUUUUUUd©ŸÏ‚~ðØÚ„@‚0‘d„QT "Å`ˆA ‚ÈÄA‚(ÁR(ÈH0X À‰"Dü òBˆ`0JIH"" +‰A$ KQI )ÿ`B¬()FAŒ„€a>߯<¿ˆŠüÇÍ*Gg£,c»ù¿´Òk¥XóL¿3çm£ß3J 5§ãÄ9 /þ‡é–^Nç¿£íóŽ+b¸æçWþ6½]|zýmR:m_zû.ç“ÞnesÖí½·Îs½k¡nOƱëá%{FýÌç3^yìlq~gÁµÛ+Í=ü䦹כçwLe”‰4`Šs?_Õb×_ï¶¼OÄ1 óÞ4gNù=VµÿÖ¿Gàù„a',eê‰ÿ`Q@5ò7ŽPЬI‡Å÷‚{ÅN¹ÌYëÛ/®ÿÄþòZ—ûbxÏí·Ð}¯_<{×óIñ»˜íVdùûü&ñnç‡Ç•~€(zx7˜7ÕUGîCò‘CßíõQ‚²¿ðßëûÉûÄüãê‡ªÇØüFÆ‘ž/)ìVHt檬AºÁíó$€|–ÀC×Û`!2®m{è`_Ç”ž“nkä¹6¿Ï?’I§kÚ²a”»ŒûaÛm×íeùœ­Ýs2¿Ñf#â¸yxò²í0!.ùø:1äÏïÿrËúê$‘’1², Œ"„A"ˆ0þX*I™$]õŽ=¾ÿŠSõù½ü"æósñöý|þ—ûióöÛóâ|k¨ÒFg çt4Á1;¤ílõ|FzΌܘÕ[¶¢Ñ{³“A!ªŸ´ˆµö·fºÏ•Þ¼/AöI }Ä 1H $‰ ?ö“üùëÇüHO¿¿?{þ~ÛH#""ÀRH¢ÀAE’(°EU=ɱ$ãëV"²Šýß´ñûAšiÖ4ÆŸþ=e™íd©;à£ö«ä¼üëŽÿ|ë<àñ¿Ð?g'ßüsí]/¬Ù $ºW$•¶©Jz³ûΙ™ß2Æ›¬ziÉRRßuÕÙ7åº*¾0ÔÍßœý÷ŠYÃg]ßÃé!(U¿²÷=þ/¿&ï3¶|¯Ž§­U Ľ½6| éä²·‘ˆ*zò´¶+­Î’Íý}ŽÍR}—¸!úU‰F"ÁX@‚@à2ˆ€¡…þB€%@ Pú¤½¾Ü÷s×ê{õ6ðΊ׭|,σc=,Z“žœË+e–³ø+›þ(^g*ëÌ;®ç¯$@Ü=…§ë?#Ùs”û÷ZŠ£²Ÿà«H¨2 (ÂT@F2vP¯§×~§ñç¿Û¿èjã]Õþý©UUUUUUU@$µ~üŸ¿ƒêÿ>u·§èo$Ï.üz㋟×µ¯æ%'ë÷ž¹êõ>6j|ùŒCäùVj ~ÕÇÛ«§;ñ¹s¶Œáû)'Ûö£.Ç[ã*PŸÏŸ§!„T$·¬k`W/ŠáÒ>6¶åKBǩˋ:}Q¥¡—gÄËÉ  ÕöÞ =¯­¼t‹¨Éý¯«ß`}ƒ-5óÑš´üH‹ùŽC=ý©3F>ýFX‰eC")I _ÞU€9>ަ|þ𓼒[{ýí—8ö±Œ¼åù{ü¾ßî®cø›î¹jãné×_ªE?T¶2óµ<Яá.ÉEõ‰îäÿ]kÖní¬D>ÉH‘!uÂ.Ó_Èbq¤fÒ×8R¿‰y´ù'3.2Èñô„[Ú7—3çBš÷a¾C¿QòšIó 1_Ыúùñ@Ú2ÒTåEÌ³×ØGÚŽyÊxêtöõQJ½è¬QEŠ ±AbÁE(ª±EUTUUR(ª*ª¬QUUEJ¦~OæÍÓ'ÉãÏ;p9úûΈ™YXÃðù9§ûóò{z<úí ÿMõAB@€H‚1 „‚’ H¤PDD Š ÀOÔF”t5#)–I T%ô¿íø+ûú·îŸžèyËþÒŽ~¿‰Ö´™ôø½²ƒ§]sóû&»·î¯õÔ&ÄÉo3›¿Ïâ±HÙïkÓMÌ"~õM`9Ô·ÆžÔ­ùãpE÷TÐŽüí  Ž‹Š(»‘A*wÔŠ©Ñ½ù×yÓOÔÒ¹ß#L£’-~«‹;–Zæzææ<¬M,æÇAÅׯsùúÇ!O€c QYðNt®—‰Æ]ès~y­âæz é7µçäÏ^ëq ­²§UL®{®h¸²Iä‹åæu=«u±uÒÒ/ãíqÀu%ûÒÕ`ñjVgêxÏ΢”Ô¨ŸÉGúÏÓ%K ˜%‹ŠÆ „€„T‰@((@@çëÉôoã西–"‡¬ýõ÷¬ì|{孹⧰§…….i™CÞ„“Kì!ÑÅ«¤áQòª¶©¼‡èâ“B?Ÿ‹û5´):õ~q-=§‚Bu'ÛU}&¡’f„?¤Ï×´â½Óß/SÔö´'¨žC›YÏ\ëðc›š9Ø’#Ib HÃÿ Ø­£pa$$„b~5)¦)#H¤B~¥A"Â×"”ÖÔ”ößâœþ+?_¬~ À|~7¾]¿4ø‹ýi‡¤3-Ûê«ZO»ÓOˆhXá4Ek-Gë Tü­-•ÎKµ|è£$ë>ŸÄ€$“ASv±o1DôÀÁ A˜¹æ~Þ±âÛW^(aÚ7ùv·©%=Ö~5­›ö¥-2HØŒ’ëL ŠüfíÂ%ø‘õYž£¯9÷Î~…Hïßlqç-júµ-òõñºÜó*%ˆñÆùÉ_œù¿«ï…ïâ–×ãl²H…¿k¶_;ÎA埴ê…R~q—z7†KÍ-xÕ÷¿Ë <(í×QÆù(›çˆ¯ž§Çn¼F5(ßx˜µ*=ú®êþc¼|µ¼sŸ­õ¤ážâ]¢©¶ç8bëáKùºÙ³IïM×#ý>$A·ñö{ýxÖ¨j¨­½‘ø¬[îÁ—¬èW©$`6¿¯yãëªT- Ž;û„™•Ú¾+å KÐ1Ÿ‡dòÿ[yŸ¾$'õ¯$ UW´Åü@žÓ‰öÓé¾Rå}ne¤ê"‰ó õN“Ζ·;Úç  ÙI0"Ik鲞ÂZŒm]úÔLí¥óRûóFàa=k[ؘOŠÍÈ«¹õ眼üïíñ–Z°ŸŸ´’Tò°¯ïW"øË’EÓþ>æuùë„™2ÇèÔN~õ4Ì?žù|};úâãz€QЙ`=´ñ³õ­ÊmÇÇ5®Úmž{n8"ÐøþzEþÈpErñ4&Ÿ®:ÈߟUÈ8yò*O_óÜ?¿*«©ôaÇê?á — ÂB)""øRTUŒFB"DPjAT `ˆ"‰  Oä+JDŽ)@* ¨%H(5@( (p ØŒˆ‘B B±VB "’ ANCóûý¥ýŸÇÇãW·úÑû3Y†ïê¨Ñ_ˆ«çD}÷”óù©y¢}“õhûÇt…ï_«#_Æ^gƆ¸®_¤^CW{ën¸Ì)Ã÷5Dõ&W:ŠEéJ~<ñÈ´'0£<RßÞ´`T µõ¥56ókâ4 |_„HËøÇ?s&‘ñ¤Þþ§¦µ¦E¬žÎ§•4‹S»=ì¿Ó4ʈ‘ç>õr†,ncÜ„Ÿx­+OcÜ–|{ûé—gŸ?B €ÿÐD(B`,–`ùôv}k×ÖïÛKãi(ß—ä™mTú?Æ>þ϶¶}›â¸–óÊÚ½fùcààÂüæé(ù6øO(º4ìÓ"}ê÷KÞ÷¿z3•«úøÁÒ`„ë¼WWŸüÙ[î~ã¼S[ø+tÃÊZùô¾‘"o,oJ‡GŸ~ãèHŸ³ïŸ):·šÅ¼¥R  å}òÌÓÛäõ]>@?€…OB@` JB¢s®«‹·4½¢§©þ?_3Å{cΆkæùÖ~p|Vß<Íkny·Ús—ßÉ·ïñžÛß½zøSضúù”òIˆ€b#¤(~©hþBª#þ¶p3ìÀû¼ kè;]R¡NnEõB©\âfi­?4Ü(U ”òC‡þ ¡,DPD0PE"3ø©!C …ÈEŒU@‰"ȲEPREŠEEP‚Áûïñü}þžÿ·?¶¸¿¶ÚÖ6=²y̵Šåý¾~ó½?1øÍ©¡*jÕ·àKÿ—=©kûüHýƒ¿ŸˆŸî]Qˆ„§í§Û\¹¿éõ ”9{í?1S?Ò]ÃîmtÎ ¼êwÙ{°HÚ¢}sAÒ9c–b„B)PU""!X”˜OÄå/Ÿ3‘SÇž~kmsdIƒâ'ŸDMyâ‡Fiús‹•óôÿ”ðÏÓ±ª@@@€ÃûSþ¿Óþ³üÿ—îý~ß³þ7&¿uëü ýþ»ûølÏŸéæ~+ü½ýîü¾hHŽ>y5ÅʬÏAäšÙvÓó¶£B¨8˜@»i:²EPû~öMÏ-´ïOE]ŒÈ•¦\º¨`A‰çLÓn„FV`b´·¨”½–ÙvR½™æV§³Ü “i('m¡F@à¦æ<ÂRJiòÂw¤yÌåRCNq)çd›‚ek‹éƒÔ7ƒŠ)§Ø†‘5|¿oÑâóÜ77>)ù¡:cÊ… ¯Xô˜–Ÿ›ØPqÈþ—ÆX0îZ%<í°È“„„Xtgâ5\‹á.ht'žkaÈÌ¿,™Ç/]k]rT•ù2¼!z†Ú`ÞZŸNeöKcxuC;–qË7;ÐÃÒXžÉrMhm6ï-E0ùØfñ½æã×CŸ·M·ˆ”ºH,•|H9×:òÅ+>éî’PuÜß\ú¬ <ºþy¶s.º¶ô6` †Ì_J@žž¸b ˜Ö—o‹¸è¤]S[ep¶PêRƒ³ o¸"!„g«6è±È çõ{s×K,¹rMPBCº3çPòº 4K¼ˆa`j!1p(ƒÓ¥uQýŠâ Dƒ/j">Mâ×Òl®NªŠê`zmz¥.gªõÓ4«; …ùû~% ¼9îmÜïðxÖ55å?Ìü†}§:×™5×àÖ}xx“ÒõçuY8 4IoŽ”ùJŒP¼,ˆ¤š-<Û—7²Cl/êŽFpÀ‚OPEøB°Iª`(‹ái|ò%Ù& ßlš vòK¥qy×Íò ÃFûêÜüš±›ì¾ÆËXæ°ÑuçÝ„}å^Ðç" Ó æ~ ºdP€ø` ÆBÌ!¢Ž˜Qö‹)ª˜•8@®g›H(MDÞ½á„À€:Ÿ,B¯c4*zC›6{Ü_Õw>¸Á¨×«khï;Àƒç¼ì“p+‡Œ7I’˜¨¢µÙ{Bï^bÁ°GÀ¡±ß§Ý¨øg#11”»‹å5½ ôŸ¥ ‰L*dK`±‡ñAüü»Æ·¡" ‹ó—ŸBƒƒ@Îyà@`oÁÝ µìbÀ[ | §A²Ü bMûÑ¥!ùÒ3ç¬HA™“ÞwV•äÇú:uÉ‹Ì0h )[aÎ Pf Þë±¢·ÞŸ&®„N™Ë£¹æ±¤[ ߺJ·Ê…W‡¦y½ӽʅu;g%Ù,£Š3@R™½¶ j6EG3„ÉE6=Æ,ÛÑÎaYh.ÁTj$I²,<¡_h¼" ÝetÒz LB€ìÄ»Dëˆ%-Š‚ƒƒ¢˜…ÒÜÁÈ“ç!²ƒÄg»^bU˜à À€åòO]à ý ñäÜ;1Øb¡Ðün aÆ}¢¶Ÿ8”-{µÌrÛ£œš÷ )Ÿ­®/Äç"cTLÍâàSB :§/uFa‘ Î(X$¼¤Š]ö]G$PGBÓ¯ÜÍÙ:‡;~k"ò?°Û|ëE}0DZ‡ÈPúfÏáŸÂÈö,ØÒϰ½"îöèп×ñÑ«â?kAª¼ |îäÈ[ ªöj²ˆºuxû½T·ï2”ld(ïž:„QïOïÇŠ Û¯Z¡âÆùœF”ƒ91;uàwQסûÎ[T”!£Ía(Í@#¼¦v7€®$’.0iÊY»7s«È‘Qô6”ŠÍm¥DiF2! |£3ÔU>õp<šT3/™"$zv¶Ä »™ðŒ¨H…ï£ÀÐú>‚àô¼‚GFG‘ç‰TpìÄ:Ì©eÃð" ‡¡Ù~`P¨Ü"œû#Ì|‡~šŽÚÞ}Y±CÍDWWDŠ8U oÆúÂBX¿'ìR'Ø<@ÏFYœ]/vŠå;9W†UZvçXJäµ*N„(TBVõåEå{?½ã\P^øH^à†,/^/ ª ¢fJÏ MÃÀÇÚö¶KñXý1â? ÃêQBpW1ã*Œ]ÈQ…avñ¸ˆuxÏ“CBì-„ó­y#^°†B½÷:m¾Žlx¶cÂ@!ŒX»nBÁrœš,@ÆÛD©`1Þ›SHc0h3Ì‹)]+Îl‚Ó=ïw/½æv6qÍ>ë¡>„ò xm£Fê àuÈvšÂãbr ËÍO<µî# 0о;# É—X(As‘mã—¨óN´©<› Å/ž3ÜȇÁ‚!ƒyÑ»îÆ*i!£*c£b™æÀp—E!@. =8`9’ô¯ÌgG[u—S#ÑŸ-³Ò½äYv%L°¼ w^§¿ÒK×ä~?N̯8¼cÝZQwúá @’¾gLÔmž+¼ë¬ÕðBátüΙ¹kdçlíÐ<³L&›‹”&@F3lXå‡Jž­|ÞéÕRÞ.r ô‚ô»×¬xu Åë‘ÚÔSí—‘æÔm5CÆ:åò$O=Ñiö†4‹mq›ÁÏ* „™Ø< ;dƒÉ<F`@QgìŠtã,¡ðN|Üìû?KT•OM‹¾|tÁï}žg62Ǿ:¬A! H``gÿŒ—:¾‚!X´Ó‡lØPXüŒÃeùc w9" n2 ™¬†i±Õ Ý`©’ì(sVg©jfÌÔ0 \0þg`(2k.…T!x͉%›ŒTmÙ-¡ÅÂWZc—:7¹—æ!邃°Šƒ Ú?EÆ[¢ô<õëm$ÀÀƇ«ßM¼h~#±£ðØÌ\/„@ÍøMÚZu2+M¶Måfü™߸²6g¸]Íé–™µÁXõaLÈ5\p• D' MÅ?— ÍH°¼/æ‰Î€Ppõ{¸Æ;Giò½ËÑŠ™ÐΤeÐ|Yr‰öA™å)aFb.$0‘_z>Éö¬„àE©Þä=HÏÕ©Î-Ê¢‹ƒ*çC.)'÷ | §o¾±ßù KWkë§ìŠ|Ô‡ýõù÷ëëÛë¾°LüžÀ,½½ôo®#ÞúYí¦©?­£Þ0ö¶ç—½£LØãAÝC ä­ANͲ«Ïö­aئÕQ’Öãè߃x•Æ7M{6P‹Ø°¾|çyˆ5¡"ÚÒ{×õL63áœæ$°òßBš5sÊVcÛ6ƒvW`ÀPó‡†ó ÈE¦¶ÞùX|±Ø§ÕUëÙ<š$˜\¼ôœöÜÜåæý)J¹€% ˜0!h)R{#…@qÞïØ;†‡-|, 2®;4A8hå­h´Bµ,4(ßS›éêÂô)â (ò–?-)¯è!}ýQOg@C=7{@ ¹K|¸›û¸VzmÉU.P—g(4TËÓëé‰rõMЍSËzdÎã|wàÀ5vÚfÖ‰è²ã*Š”FÍo”Ç¢ÐPJ @úêçÖéè2vÍ@žîyw3‘ ž-Ș{°oá|ÃG"8|}‹HМ'…míq³ÁMb2W3D‹gk¢ÈkíN…ÖÁ?è!ÿ€›©?™€WðÔAö¥ø°ƒ£ýú/ö¶ÜDÁ'úŸ'ðè(!àê"‡ùÿaè>Ÿÿ’JÌ,¿Ì¯°àÙCûÑWQ5Dj!þ!—F§Éþgô4ö<&ý„™ÁQ?S# n<ˆyÿMÀäÐãÀºðmüWû"þC"ÝàIöþE²ða‘'‚9$ÓÖ„Bñú‘ò‚`ÂÉŠмJpXh´³î(ýÂP©ûQo©ô¤*8ð„HääÕ˜0líãG7ü½ÿßþÿõ·ü=¿ãZÍ¢ß×ý~Ô®_ñÓé ÛÿÃp„©¿÷ #!ƒ¥ÇÇw²Èx?&ªøç-¹L߯±K$Å„B7ÝXè7–j2øÓä‹ÕÍè’R½Õ°î}» Ž‚ò=A§ ÔáT7ƒÛNäWt~ÅAÔw DsöЪùB÷ÈÌ-)ÏQ…u‘ã3 …T‹…Îxê\“îȱÊkÞjWéa¾Ã™hò4®ÝºÐ+¢m”VŒÛ6cÓÓ5`;“ÞŽLV꜆y›T ˰ëtcÒÙ²cÓ`Úñ0Ýwª§™ì:¾¨fÏK*‹àxܶ­'NP{J=ž¯dHûi»)ç¦^jO«'ÌÏ™(ë£QóhœAQàkHöX ìÜ=ß×å6’¼ž{> ùP§ÒØñ}&†¹ E·çÙx‹e(‡¡éf3ŽR€v+Äù`ÐæЬc1ìñÜÓ' ˜úÅèO#tâ-º†®Þ H…9½®Þ§²«åöžSö¾Þ[haJMü'œnÑvý[ÅÔî—UÌ«ºùÂNíá c7gE4¿MÏ•jz/¨H¿RÓXØI{É7¡9¨Ö yäuDµw9ù#‰÷‰Ú$rѵcS¯Î‡œä!‡ï¦£ØÛÞ.ÝC¾ÕÜ´‡ªÚ-¨óë¢ ËQE» 1¤@†*—MC€ºi°™ùÝýA5/Ñ’[bþÃö=ˆúY6ötš=h¾tm 7šèÈGÔFì $&*—AÞëG»vÈø'¼@aMA¯êš6ÈG96Œ÷³íe])=–로7ÌÝ.qëŠó£§›Bü+°Èß^$ÂÅâ…läÚ8ouœà"'^£mÔͦˆ{Ð,sˆUíõCw§]’ýv~⳯^ë*ûË*æ÷•Bìk´ âJÒ0ä b¶ŽÃÄÜ„!gáуåÑ]ªô¼ú‚ž€¯Ç–P…ê¿1ßÓ§A æÙ%ÖðB@§@,®×!Cw dýØ\¶T73æ­¶<ÃQëO ‚q‚ä㫉âKùì]XáÓÀ‘>P;ŸLï ˆ©-2¾ØË-1LMâbšmzmjíƒ}s®GÈ*…|@D)Ø@~ÀÊLL0A2ÊÀOó§XýbÿÖó«òþh!sYòŸ¹ÐÁ#ç™Miá°zñÁ˜܂Ϙ‘¥OHe€8ã4`h˜ÐÛæEIíx  ÃÐT—ØK•YYª‘ÏŽHØ;烂¹KCî×½®á¿Zy5Ô‰Eþ@’t :mªè{.ã4±¼iÏ‘èY»èIw±á×Ì»à²ÔãØ AŒ{1;â/6§Cµqí»f^¨£$üB`Fw)Ñ6¹ááÕnªï#(@^xäw›Ç~6ÒO(Úú µ®€´°€¬ÛÆÐÀAjÕ’¼#Càk15wýõ>VH/UÜæÚ˾"MU.õëö &’ÊG»¨ƒ^ŒÕ¶4âãìîTk¢ ¨[µ݇—UI)МRLѯü¬èoÙñ?£ôË5‘ç’¬ÝL’W¿¾aª1zÔVÆŸµ²ƒÂ£T´@Šš¡`Ýó6Ú]|8+qÙ¤yÓuÛ"î6ss÷³áì‚éSëeA…šÄ²½""‰×ÔWç¹·) #dëN«K½4 ô<Š@°©²Ú{îP2 +=`5Æej°s6 5á'¦Ëm&¤rjÇBRdÜO;Þ=³71š­Ê°K€k+m’£1 iḧ›{ÌÉÝ|yr(S)yôù=2‹hÒ3)}Dî¹–Î"eE}̧)²6̺ة"mb"¨N’ ÍìÂâ:ï©åÝ•ýE\J ùœ‡qÒ aPÓ ítÎïw߬;#£•t,÷Öu sÜ~Û¯Ù&m.È'œ²CÐE®+OQ ×…€®C’F¦jPÀ%±Í˜Gã#Vn32yó÷*‹¨<O ?’|± ÛÊèžÇÏß\?2GkxžÀE˜káøXÏ(¨0>ò¥@–B„+]~¨» ¡sSðþ€ €üŒŠ-íñ’$@×´’3¶è%è8B—„4.;H=ê‰<5g–°L²VL`[ pAQ\H‹,^lƯv Ÿæ¼o¸Y­ç¾èse„!SŒJAQ›;Û¬ŠÑ pmdTÈ×Êá^P7;¶eÃÉ i°ÌÅÂÈ0‰Ôžœ˜ÀÇ» )؛҄ê‡}ãÉ”Í ¬Zl'¸uÓìähv÷¹ü8]áØ»™¥4~,_8x0 Ô,#[ÐÆÀØ‹vþEÂ!A$\g½§]^Sè]ÀŸ6÷“§Äñ7Q‚}O^˜”w”×ðOyÕ#ëDÇ‹ru#ÙŒ˜S½ÝB‰Þ¨"&s?XÐLdšÅ¶2&·ô­_Ò$e´Mpù[5èš<^²g¨~ G"c9c;"‚éßdMÔAâß]®)ØòGá#Ý)¸Ø4+LÀÕŒûn3]8Úô &¹›6úR!ÖâGÆf]Yà&ì#°'é¶æ^žõàH@.øz‰”#ÉÝ*Å•°øg†QÚý —¨r~~ÄÅÕ‰*xýß üd”I$'$XkçòpM±‘‡dӯ삽"ܤ*…« !R‰/æ*g…>¾ÅAdÓÔ&«Ü`83g QÂ^êóÈuˆ;yÕØR²_„#3íø9Wâß%õôUûWäÁDé)‡ Í:Ï«0 <#Lˆ¤*«î*¯+aT;œûÏåØöé%pg¬RPÊ ãÕ,[)›À¯JE ê³6Ž’«È$߉(ý:w%aÀ ! ò†4×½šSîÏP¡£¼Ðù?DX|¡®?JÉTÈËB?6/µ&iÖ€}p²¡*Ë‘ &ÀÊÄß—ÈøPǧYEÿA`êº×ªsKíˆóB¸9›¹Vû; ]5ÍÅû«bcHäeô|“t¤2;£]äG1ï³—qw<Vµî×zÛÒR·Z8VÛ±õâù^GP[ ¦6Ÿ¤WÎ¥%wF¨FÞCOM\ù㛺ƒãÍŽ±©‡°0 nlwËuw˜Eh?õ—)ƒ3Å-&Ô%¸1l§­rûÁ×eÁ…a3Vg³ˆàpB€‡™¬z¨©à÷ƒcÀ(D ~„åç´8Ì_¹ñ @8ð¼CN»Gh [ðHˆ wˆ!nÀf'ÏXCÜ1îà(ÜÄ•á00i…èqYûeŠF=ìŠ]YíC—Øž¢yè‘Î’”‘àCu|MÍŠØA6=Ä‹è/Êæ¹«°ŒrèyÇÁ¿Ó”Wç>R÷q$4¸¨%úÂÕÎ,‹9 #qõp°L#TÃ=êóˆàDz§ÒÌžª«_³1Ö•V+Õú ƒÜ—×Õ­«ÉÛŒ•½ëDÞô¾ä‚G÷‰îÊALc|ZOƒîb!ãÅ­ XcºJoT£öEÙ âÑnü"Ö†–”Å‹q÷N;¦Ë•’,ºáªC%§Lá€EšÅìƒuß@z¡øKÏa4ò’IaW‘ˆUÖœzÑȽðÌò#TóÒ”­Y‹8èû¢ØÏ£•MFTDçŽïž||u?­´j]›ÁãˆØEŒ 8ë÷<`DÃÄÍ,ë™OÀ ýÿ©øhR}zˆ¨´± Š–,?¸XØ>Æ“ „ýBÐe„Bà…‚'ب²0º¥AJ %%T(BJò,x,?ت¢  HAd¯þ§ß‚ÿ¨;oÒÿT¦¿o?ŸÌV¿X#.O½¢yûþ;®)Ñæ ȳ[î­íFA6¨•¶¹¤®ööÝš¬u ŠU(’2mØÜº%ËG$#å¢è° æM*ÀA¢QdE\äDSøX‚“KL³‚h<ø Í\ƒùp9w^!pUé1»š902Ê%c1ÏuîÔIJØÌk÷„¡‚&kIÒ£©c-ƒ«™Y£¤¦UŒ¥‡J<çšPÐÈ%õ¿k„'á« s *P;ñ‰ÔÎåüÁàA?OÉÙüà ¡CIpÿ Ðþÿ’?cûD³PŒ`jI‘A°jè64I|¼ À¯ð¢‰.–š)Zcl@J¢‘—…¦UÊ(»¬¸º¤ª#T ‰qŸé%†AK1rÅXB)fÛ…ˆ( b£ƒ(H檦.’ª«›¨L!ˆØ‚ä¶ƛ̈XàÈZYWI`â‚<04 jÄEJ  ± 3ù*PNÆÅÃüìêC„ýþç_Ÿ¯ÏëXý¯ûGé¿U½+F¤+=7÷þøÊîV}b'|FçÉÍ-ÅT…M e@Òîöh! yçhÜ_A*v£BlKQðÂGäH‡ØTØXô$±ýiÕÇ@Fðh&›V–}‰jô*Þózt¼Ž„¨B „)á+š¹ Ú^:bÏ@ã´dE—ªkÁ~ðË9ùŸ›‡z‰ÄTg%ûD^×”Uzî_0;ÒÂä\Á<…i“N˼~ÌǤ¾TZ56¹»ß¥nIÆ:ØPIqôÝ•Õf!a —<½& |o­uÝžÎïzµWݶ°òÝü¸›ÇÖ±¢bó$ƒ þQ ÞÜ¥ó؆­×"rŽ-Zå›4•wŸ¨s‹—ÊÅæ3jÓ,6„Ï « +ÓY“¸Uƒ•* ;ƒ•½}`bÂcÌ ÚçBæ;et ?lç¾r;PVlfÖÝš'£“¨h¯l¢UB˜ì/œÐ»ó6ª¹·¼×kÖ¶P˜3 ª“$ÂøÎ°[ ]%Òög‰,l¿>zÙ8 x…|ÜLoèÜ£¸·xñNØoÂRPò}%)ìûÈ´¨Ëá.>ÖA†8†K˜yQ ȹ}Ý‚—»¿{Ppü©Î„Ât£k°©Y(&ÕD‚¹˜›sê ZÃòæà°HCë˜o,Ùð;ûËéå­°pÁ±¹"Bð*™ÙWÜ-<šzç‰ÜŸ§JúٳР’¾)bz¥çAw2nßV…}éõÈy>€qzo_°Î“Ã-'X4å“Þ]‰’ *}Z\kÍVÒÄA²j¸î»¦´t Œˆº|õõ+¿–ÈßÈBÖÓ.ðÅ{FêÙ/$Üð½ÆMEžõEÞ=xò¡<ÙVNñ‹Me$@#3nÜÞËÅÄlò¾jVÓ}‚îë»Av¯£«¸IàõÓ!äñ;+¯; ¨Å3=åFöß»Þʆ÷y•Ä®%iuod7êéÌvØ÷¹ÓÆv낇ë÷µc*2íÖ‰Û`¢©ù¥i |3UÐïëköߥ°MÛLm!ýàE<#÷O‘íìÙàQeì……LoœÁëýðð~áθBÄfYØÐ-¶‰¦*Ò!åµ^¦¶ýÙè®QGCØNäa”â\jãÑñyÚf€­;ŒìñpVÆãョϘ#'¿Y,÷^‹^A+#!h&þ`VeU¹›`œ%·Wá46Ððhv…0à- #Õ&ÄF~ñÙg¾½çB»Ãsó$%?Ç‘¨Œ?¨O­È•C Ø=’(pAŠhy‚»!0 ^¯'˜Âd ë½o+iȵ³ß¯Ú^~-¤Ã daOW¦eQò“|'‚¸Å~\TÅmô/œ a´€AZg¦O°#QØŽ€Ã ˆ.èIõÕçyBñyÕ‘áú: /¼“3¡ æõ„ÉoJZ„o‚¿âÌü6èH±w+2"§WؘªûKݬ®$¼ÝˆcXø±oaõý>E@2ìU‡¥Íp,ÞM °P?8~⦢ô6‚(@‡†sÊ0»tW 6Z#ÀêÈÅXÔ È ˆç^rET"³&9"4P‡e_%Õì’çØ¯¡0*š—!oMcòBú -íÊJ”:yŠg4ºÕ’ß„ômèÄ&âR§Ò\vG“!£­0Ÿ<{înø‚Zñ°—‡Ípôg!«ÇáãàQ¼Ÿ~»ò½i ³—_¡„9àÖÓ¯…u ÿâlËAD=R¾ò’È8E¢a”þˆ×2=sb•0ôHß„Í×-!ÜУØð; ¶âˆÝ.îDf y>¾íÝiÎS î‡_A²\a<šP§.ɨ*-7&סÎÖTZ™ü±lÉ”J@¤L'¾šœn0"ê”çvnx…Þ'ƒÉ; †cÝy Áðz<w;Û"•!7 ¡ˆ÷k•SŸ¡f#Ìû}òyc‚ѯ¡ø¨`î6˜`tد G»Ï+BEvUŽã5cÁ±AùÑÁÎê}æ|“ŸƒaŒïã%Œ™ ÖSär¯$c–:±3ð¾nÊŠ°$ò­ÆÄÇÏè‚#o;"«n%¦]Æ®—¼ Ô][œ©O¥QØB¯0“ÔOv´²T'>n,3Rb"y´ŸŽÐõ¸\¿¦*Ž×këøçFãð"®oƒð+ýx‹TÄZ >`9WÆàŸÂ|4UT—ñ’0~Xs&e$#•X›ZH‡Å Šõ‚&%òÐ|ú[/Kš©ß‚â&©„¸FRX|WuÌ(ä{ óÇ ©ùÄq=ÅX¡¦ÓD9½*Ÿ ç¸ÚƒØÈeŸKR‰6Oäyíl ´+lŸ#jºí{O §Þ ™¼À-£Äq_cÁ·\ùÁT^E¤÷LËÚ€j>»o\îïŠ3WèÕËo¿ñÑÓ¸ˆGuTÀ°ì°Fw™UZûZ;f Ìá5S[\=xBŸ±sA4éEè;EJ/&€×’ò†Ö–EÀjZ7”n\¹Ï ÍXˆ§LVCF¼oRð˜<›àÑÜe‘²ýc~ß™Ÿ‰¡÷¡ÔUÐÎk³3xAÝ}?˜9b¹ŸužÌƽ€dăÎæ ûÊ%ajà˜ Rœ§ÔYÔbÅçSÑ_Z™}ês¿udÞÄQÉr&}ÐnsÞá(akcZ¡èU‚<›öFêIRCô Kºe%W‚ztlùl¯»Cýå)æ[Ûô4Ž–?X“' øš GÛqnw©`Ëž¹äטrÈE¸bQ3Z½¾ ð=.‚7:Ï–ì t°›ÂšÆm=æô„‚¤€˜x€Á(Nï½ÜXÜ@ŽÇÈ693Ù”®È‡LúlNwìOM›rÚj™žêêî†Ìé#f¬÷UßC÷ÇTÒ#A¡N- °žB¥Œ¥«Å!§6ÎõÓD†† >æ8ÊD}±2Fm wÎfo­ÉÛÆÁíØvâ}¬9à‘?? Mâæ£¢PÓgŸ•x3˽Çï wmlDÑú™]=4§5w¶‡=[Õ?r¬_¤ihuÓlz¿ âémûÞåé êµZ÷Œ œÿ›jÕ¿>¢M‡Í¿cÓJ¢{¶qõj§ÊAPCÊäÆÜ>NqqÎÝÓvƤk¿uÎ*¥0ðÏ .#¸0yÁ<“&‹ Áð î""U »1QšE)ÈEhió0‰v ³lc9åa]|»Ý¿µ°‚½{øGÝ5G1Ë+à‘:K{ï3QŠÓjÉi¨H¿1w\ñ{ÄE`Ra)ækZ›;¾ýòH±¤L#¢KH`H"À{5ƒ¼‹_É'ÅêºZ,àcoF³³747k6¤‹MŒéÇ×\ÎBÐ`勞¥˜Ž#=Hj Eð€˜O‹žßMÁ¾ô¢ Ôš‘ Éä}|‰·ª‰•j˜ÈÌ̈Uôÿ Šå¥°oßÿ¡ýEÛÖ9ëÖ´ñ¯WÇ‹yëOHþMMаmñš™b=àJÀJôÍÐ`DîŠ`µ{Ê /Óu6„!ÀdCµ_C²Å^β£¾õZóCð3ñÓ‰­_9 ‹ZÇ»ê[E°4l‰€l`$I|‹Ö^kb2À€`Ø"ïl¸»œQOl·$Í™ßȉàTâ x“Ý.À€àX Á¤ÌÎ4|“ÞÞö3rXº(0¬ªhT¯cå8L@5º$U3nÚMÚ ×U@$­JÐ<–»[˜û—rv>;ö UÊCÓ˜Ãê»xËñ(š“pž^;§ Õ­ qL9Y”c ªêš¸ŒÔ•IÚ3\¯Àl†Uy\þøY‚ôä!+Ä#çP~póØ"ì¥)Ø\‚ì¦C7ÀFZ°ðwÄ‚ó${*óà¼)qCÎ  ©ô¢”  ‡àf²D¥¬c?ßL‚wÍRÀ§´.Ë0†Œ›#X’ÿi•þ%gM~[:ÆôÃ30ïÚ×·„¡²ÚB2ßÌf󷲜ӊX Äüs(Ôä}p ú! OÇ~A?;X&ùÍw>dL|úÐW tˆˆ˜—Wã&|ÆJâÎä"ÐWÊYSÂÂ=°!lºQÀs»}ž`0|ƒ‹©Y§‘T4"^åçàå[ã1¾&,wWÏ‘ðx‡3¤#?Dȃƒ Á¡Nm61 9NܽÔK•26ñíîEa–ÉkË yíÈõ™k¾†ž€µkîsj“‚Ñè‘<ÅÙcn‡D3Xm‰¼ã«æü©¨4 _lãêe šNàÉÄ/Æ·A áÀÃOÚJw–ãÁ ?‘ ì2ü›³à¬ƸØl*ó1Z‰–ÌÌâ/!D+aÉÁ«¸ƒÚõ|,^÷h'/ÍÅ‹‘£²Õ¡Oz}n äÀŒñëÓíô~öÆU F 5ìaí¯s.fæ[ ýÈoø01€ž'¥8áЖ.w¤Ícüôx +á:8g¿fk†ˆkãØµ”³¬Æ‘£P6»¿.ê%m\À è<€ Xgʼn­çÂ*q¨®5!ö®&GÃêć®Qê¼æwktÁòhØ!6¹¼Ï©…h Ð_=lÓô§—šÚ$&[i¦¡› —VŒ‹|Fîè™ÈˆA |b(¦xI]OíO°ž!!™_õ¡$06A¡E ADHÀPýFÔÁk„? MÊ*†Øîäʸ VÏè ²‚È@pX½? rDÁJ@@é  Œ‡ä9ô2AÁÂN _Åð*¿°PƒÆÄáE ŠƒW)žÆ€0­ˆ¸,°HFކB•, Ä… ²ÐÉÿdq ?‚¥¢)³úHà ¿óÿPþH-…¿íü~öæÑ÷¤~lE÷ôýYëzŌ◿ò)‚ÖL ›"­¿”cUÞë˱%e‡êöΠêG+ #LË<µ:u‘ºàõÒ$ @WbVŽæ›ì[ú) ή¼­~ qx3v#–Sª›¸Æ´É ޏ—£‘ƒ8‰3]†#W²L{ñÉè$ˤ1fg/¬Õ”ÑÝŠׯ„¯7Ï.úû°†ÁO¸[­]2À3ô•ä#,¸ð¬Sk#z3ß xӓů¾™†ì'‹O+ÈÓx¬´:2ãg½zïz„\}¾®!–Cã…ÃofÚaꊇo…ÚÍûB-Kz:ga.6¦eÈ5#ÙX~'ôÇ¥ùØL9¦F7#ÊyÔ"I‘7ºî|cí°ô̤€ÉjŽÆÔ›ÐÀ#QjCzA kat¸aÅ<ÄD¡àö·°Ý¼s—–”Olb7i9Ωó þj$Rà¹N¡·Ü÷L(ǽåá&‰4ˆc˜Pa{ÆërÚÝâä"U¢H [÷3Z/à³`ÉN¾0VëgzqäÓ`[DŠ…îl¢O.sÕ&µ¢Dž U^™F´–X®š.vR TÏ{&ßYs4A/MnÓFTƒL=àD· …C5 ——S“Nö›{qeÆ»•|ÌÌ¢%G„ì›ãž¿0D‹Ôó{’º ®“O !<.)4lhûîq äÎOz¯µgXßOÃEÞäm)gH⻡Á›iÖ‡xæÀuõÛeŽdÆiøüÙ9('0ìÜÇ ’m¬’o¡2ËNH‹Žú.Æfo!×ãC Ìv‹†KŽÐ\eÂËQ¼ Üœ¾xî†RJxôw£QÃÈuíºÍ=q‹ÄÂÆ²Kêâ:Ä&Ù­ ðpTp=FDòéQ UyЇ<òl$¤Ü¢»m^ïvšg+#ågN ¼r…–×+ëlEj·CÉ„âå·žŽcöÁ†ž¢Y"Ê´ãshÓ"ئš çïïûÀˆ*þ¿JJ_Ý0Q,€Ð*Á‰@ !Hû K‘%…‰²l…1@Ã*šªn¬CPD*Tª.Ê`ÔÅ„i #‚’„Å„ÿ™!`@D2 /Ÿ¯ÛéökÎ>}{-3ůJ¼TzßÖ3é²±jæ©§ö¢ï)ï,òþ㨯UFÏR·oƒ½o@Þ³E¹ç§ãÙx:2lqì \€@69Ç2{€F`O-á=…ƒ[ËÚ@-(€¦ -B\™–©ƒ†ßDXÓ½XB¢çyŽpRt-w–¡<ÁÓáѰÁ´Å1Áÿ„¶‰|f££Ïšrjh ±#¨x`Öã\îdkcðÞ…ÂQHÊ0 ƒß.iéÝ]è”Æ»–^ÃE•ß~h¼šK<Ûõ}åäë¾awF¡>I˜Ž5.%ÛQnÒ¥ø›iâ  ðxÃ¥ÐLCÀÁïz÷ÍÆÕ*Çp¥#”¦íT²EÍ,s)Që—ñðë(!È"ðÛ;ÙK7G\TsäÝÍjüæê\ râ`> ˆ»2¸b—5´˜8üeÌÆÏ)ºoZc'&Tµ°WF.cHšÀ« ®2J ®Ž'ZDÈå.§7¦§¡ ‡iñŠˆ äUž}0÷¡°ï-䢽TXÕ§®®j¯‰&(®ø"« m'Öa]"𣑦ôˆ2náµâü×'l<¹8T™ã®F ì ±|4@ëátšE1pP b ÉçpŽ ;ÀšÌµQ@“¤ 'ŒÜˆE–oÂK^¢î«D`rQ3PJæáÜX£ðd‚¨WÉ0æÂ·qQ1 ¬Y `PÝ ŒîŸ%(ì‹øhH…®:x>±CÁ9e†¶Ûb¼R>äLrGDŽ»Spö4 œ2ÐgÞ«°±a(B9‰P¢±\õY@ÓÚÉdFäÇÞÚO?‹Èc`:3ZÏNHqþžÈ* ` ãå#z~ 0°Ý“0=à(Ñ Úu|À¤lÝ8@ó$ƒ8FÁ4¹“££¤DˆÑA:Š˜ÑkIDÃZ2¼.Q¥ƒBï¤Ì8>ñ)KÝKãÒP)US±]ý¯´U8²Â³Éi»°‡:’jÆÊ#Z©ð·A¶*šiêsD“»¥ÌœÂçרMsãcÀ!‹{Q©´º(Ù îiÆ]+ÒÚ½x¸£;Þ«X‘ð ‚y¢aÂ|d p  … $!WÙÁºR¬ Vz6Qó·°ÍÂŽ Tz/ï.“³gz.»Ü³ˆÍðôXGØ*×jóðOµ2IöˆGÜ»a‰‘b+p ÔâD47óê¡LF…®@էӻͪâU¨™•P x ÙzØAç³TA‹”õP=ß:X›×z ÝíÀ??u~¾ù¿9‹0ªEþõ·—ö¥)bÙw[þ>^ìk5¡ÇÒÀæ<¿jóyÊ´M‰°oöjÿ¡` !ð}ôðÊê¼0Bô.„Dõ)aþ‡tºNrrP”²†þ€¸ *®ánÐÄðËÆH~_âe ‚@ü;,x$=TB69âÎãN#b]0¹ ü¹}xl$‡XmýáûÙ E c d¾€TÃÓß`CætO|ï­ ,úÃÁo9 Nœ*ù†æ{’I}½Í[2énü>oU æÐ?õØ¿ÃSæÃª7ÿ0D¡òNã<¢ª§:‚¦o•TFÜT½ø(*Nƒ>N!æ‡kñ¨ÎpZSQîµ ûŸÉ­GÚ¦Ag*kÈ™±šüoñG/} 2#†óãliì%Où[ÕB€@Jo*nrY‚¯hR‹)Œ;ÞÔ±mq0\æXƒØïúd¢È-í¼Ö8‚‰èH1øuLC ¤<¿v·…^€}Nvæ|NŽ×ºX^™wNYéxS˜ÏUÌ÷ûD.7h’ŽzlWÙ8=À^èâÊLó:‰71 ýâe`©½èP\i‘’iì‰k¯ÙÿAБ−v`ò ¤ Æ‡ÊG~‘׌¨H›¯Ú÷hÌTNµúvÌéyv²¢)jÆ”‹DÅŽD¤1ÿtέ|òèùÊ‚‹0~`ãK#ƒ#qßmˆÊÌPp¾ò(G’Å œXvˆÔH¬ùóÌçäahZ±W&£ÛJhxEÃÜ0ëfoV-’ûÀäZŸb,ªÓÒ·±7íôà'«—H¹¹ß¤œÚR¨!🠟ÆÛÕ'Ò­² céqXÚ4€Uà2D¿<Û pRu‰Ä‹‡ê’D@ÜpùasÕ^äøÎ¥…müÙ¢ÄpߙӫŠò5"gáï]P¯aªøôšìÖ¯½ÜlX×Di‚_uØâ»Èš73#ÎîUbÖ6Ø[—Ë>W¸q.Ž‚¼–·ìñ?[‚–!Fû¡Ù¾2ðÕ® Ã@¦Å‰—ƒyËn¯Äk©–9àèþdG»3òM#ÁZS 0U^3½üvP×McÄÞÜé}ß(Û+íxæf™ß;ëÚ?ṑ¬ –t@Õ_4ˆC™-Ü{£Ž)|׫¼¾k×8î¸éÛï'ùù‡ÖШDI“$$ gë5E¥%?ð3¨Æ0-ÝÝ4]ÑlRe§ %¥YN »e2œ2›ÅUÊ©¬gfe)¤(X‹ VhiÕˆU UHh¨ûVôk8+Y1¶èè6Ú%Œ)!¡6´3†4Ý8cM˜è¢&Œa¡8ªj‹‘ÿž¿Ãþÿ___Y¿„úLø5ñ?¡8é™Óë+Ù £%©4K ;¨¾ñq7ú+}gɼÒÅ!#Ó7Û\×)KÞÛñÌ‚ =azHøHàÆà0HYÈè8üupÅíEëücÀÀ\ï–C­4ü>íæY4óàIöOòHNDñ¯Z•ЈÒx×|ËãÞúožX¾(­ÚðôU ¥¿á>UW¾VjÅÛz ÿ í ¡aø_¹Œì\%2– Šþ®Wˆš (,¡(?Àfè<_À`2! ‘ä2l}‹:.ÚCÏðI Œ„ûݤîÏ$ ’!tI(K7µ`²™B(lh5RÕþÏÜ.&¿}þ¾ß?Ÿ.¿.|·ÜŸÞzÅsrêðØ‡ŽÿÞëD´ë=̲c'¨Ê  À¢&IÕèhDà´œO‰A¤¦o ‹]Ü@×_Ê* qª©Á(ÛQ*þƒìP™0eŒh1ÊžÜùšbPm…QZöA¡Ù ß7ƒ@–Œ¬Ó,¶±¼vNé­¥.c‚A[O{­WäçкxhÓe"!™y’8Ú»0fXÝP47 C“›õÖ|ЪÍ~þó‘¢u‚Cýᨨ8þˆY ”RIßõ2aýø `NÏùŠãeJ´ˆ&:s)Çÿu­`CMH±Hé¬kE-3l%p @x UZP BÈd@AÒµ€ªÈ"¨D‚ ¨Å`FH dRÄU‘Áƒ>BI„àúd]@ —/ŸÕ??¦¿Ÿ¯ÇéÚ”ýçúZ* Düþõ‡Š^uV½_÷8]Õîµ¥ßKÍZ§Ý–6 hlÞ¹mi–ØöäzIÃÆ"³p\&z²eé JK橞¨jä™óyoÈ9< $çž35c¨I3ÓÄ“˜M{}-˜3«l^4Ϫý|^Ô!Èköš¹8(ˆ¿•/Â*&#WÆŽ`xR’CªV\~«ê`ÀIa°”]×Cеp®SqV4ËBtƒ&îU®/MÛzž¡¡]Œ0—ëÞ2ôºXß)?DVÎ:ìR¶ƒ`M!øcrzGÖxÍR]6Z¨Ï«Èät†ãÈ×>Ô}Î¥C¿‘ÔxQÏ»0v„á‚äJªHú­”r¦G•)·y‰(—Ô5›QçÝÚÄã 3! Ço É73gB=y2–rbø6p ©ºJ4&ê)ŽLõä–N<*û¦¥R"Þó†wBÂNj³e¢JzûÈ/ѾAi– |¹Š`[ê"µöÆ^I·T€˜{C1æ½'¤¯;ìßz÷²oÉÛ–—¦èœƒ­ã&P½{šòû^ ]¡ u"c•ruØß¬<ê^À9 Òñ ›ã>ëm’Õc¥?¯UXv5¤‡—»Ÿ‰áAáYý®8±ÓTû$ŸV Xö£ SðÐß_˜ \¬=m‹›ºÎs¡{…e•Sèö^'‡IEWg…“_(&ãD¸a·#¬Ê™·Gx+(¶ Œ€û[qŒû„캫¬³ÖÁ9—ÆÕ32Œ%Ùî»SˆB@jC"nôòÆçrtùñ±íY#3£I‡ÛY‘gÎÁµ)M‚’""ÇB­K~ šk¥ÚÈÝ=y=ÐÆkÃ\mB+ïWŠ`KÐ’R«g‰´ÊÚì‹4„ô‘Þzè9@[’ú³§˜ ¸ Xj@ûψ҆ò¡-W€€º#è @%Ø¸Ó Ø Ú¾è€E*£îJ6$w½öQÔ‰ùšÒ$ÛÉ%£#ˆå^Oy…®514ððÉrÚ=¿ÏùQ}ø$ßô“ò25"œŒ)ªUH)Pªˆ€¡IZdÄd"É b Ê¢¢¬U1X¢,Ѝ$Eb ,¸°¨f*à(H`ý& (Ïå)À`V)Q6(NjÝÎ/8ÓIcCÛj»b­ª§²ª÷ªÙºÆX³’²f¥Xƪ…Q­®&É‚ðуŒWB2Ë»ºJ0`¦”¬«»¼˜¤¡i(¤)ÄE¬•„Å•ˆd¢¥+Im"64-UJ%à“€KPT †ØB 2é3B¤DE£EÙmðQ?­Ž-ïâ´o“ŠãºajÁU”u±sÿ~xÿÓŽÐüe ª?ÊQÚtÍj­ŠÄ§PÓB”¬¦eºªˆÿÀzœâ"n1‹·XƒQœÈSˆ8{„t”ŠÁô&láµOëÛR¾.ù§6Yeh¢±VÐÉæAá'¤—èÜ/6cé>w€± ¤5¢Ç|ø,ú.Œ-ÂÔä(2¸á‡n} ‡¸GÙ€ž°Ée‰©÷Ý •®¼K€6OÙé<ÃAädɨ S!÷§ÌÏÛýg:ý«OÅ"‰ù§ñù»'ê-G¢ÂlþÚ›¦1xÆ¿çbT¼%4->ú îK|0G¾™ÙZ=êÔéè$y^àŠC|‘¹fD*5j˜>ŽØ¶äòŠ ¥>GP'îÀ„pz„Á$Ÿ…¾Gü'´êÖ‚VõôkjëíA6#U«µf ÝñYÙ_KºüÔk¼ûÁ$—·æh»½‡°Q¨ÊQßXødߥ^GÏß1î~˜=úLsO h ø¥8AæÃž€ˆ9r h$¼§»N’M—ŠŠ o9ä÷7(î2fxèâÜIöÆ8ü.“'°h´á#À¤Àá6@ˆV\Â22k#Ê »"½éï~Ï“õãk¢‘¿›ÁQ¾ô1>(xcÊ×®œ^ƒ¾r¢s¨‰ÿÔ;" *¥B/†gôEƒ†‰A‹òÌ SVˆúa’wb‚x ájÈ¡Á=ƒù ÕîŒ 'á»Äå…}÷Í^˜€ñØ_?Ÿ³¨Òzø{v·9…|Í«Ë2×Å3éŒw'Ü ty¥ÖÂZl âóhÀ1Zx^ÏÈlP{ÏÊ®—^Î÷’¬‹±  uë¨)–Iƒ‡ØzXAW¬}ÆŒ ÐÞ €7 H­Qˆ Œòøx°;B>Pò¢ lx¡û˜¯A¤+8ã2ekWØšY¡KɲštȦÇ ^c´IÔ„É>&2ðÜ KÕû$Ã`ê9/¢g°wÄäÌn­ˆ ×µ=9CàæŒèYJµ‰.è/ÎG›[#“Èkh‚§1tÄ©†hï¯TšinÉua—°$Ì=4Û^ç Ê* õ!Ø_Þ$šßD¥±/TH@=‡°6}ú!~à¹#ðÒò"Åh{àcé 躣ž9d0Z4¢—:3{ÕÊ:~o‰¤]È Ì20Q¡œÓ+øä(9Ùm@G™‘Xˆà=@‹ ¤uÀ»â#"Và® _¨ áü¯‰8Ϭ.èièmw.€¸ªî×@z¼Þ0ÍyGØæL»˜›Fî#^Þ|? bÐcD’2F€V¶a€yN ñ„`ù8ô´/® `87šPY°‡R[æ¯á3B2'¨{>ÀÜsàÎZ€Ì.׎2(}Üf·íe£ ïV7»êŸhq *™'Èmšj@Ð5dYA÷íC š0%з\™käåÄI÷x-‘Ä$ F!¤á¥ ¯ëadˆ`žã·C‚~2=íÕœgÌ]ÚÄ;åSiVèwMf– ª ðá1C¹… òÇ ýÜŒwZÓx¥VOH/™Ø’®XŒÓ¡;ì%‹®U…»zc5èoðýT&~²—Êìådö’rÊyÖŸÜMˆ‘¥¿ÈgÓïËzFþù ‹³2䯔2w63-“`ÆF3?ØÙ+&0ŒE>åjò¨V£Èø;¢qç…:ÉÊr8BkËðáœ<À®Àüì"5ë ) y;‰ˆ „,Æ0sRzÕÛ–»œ¿5xÎ3 aJ2È·/4zTçÁhµ[$wB|bÅ˺D þ=—>oŠ•?+zð‘`'÷¦}T£kùÿXs#Ê.á{­»ÏQ)œ"×R†d½I kÂ)¢SŒfrÔоpoz„GÆH`«hš¤°ã q߯ɱDCŒkÁO>¯ûBÎB¶q£À kÈÓœ© `­Y ò¡oT‚!@ºú LèW¡È|ª?j6RϰC§ 'WÓ?P†r<’m|r¢¹/Xo`A¹ ÁQ!!z©#´ØðU{õÚœÅL‘DO2Ж†EvÙn±HYðRbÚU©MÓÉ’ØÎpP™Î•IÜÑ[ÕhË»³< ^ a²gó/¢~gºW;‹3¦éMvJéýþ~þ7ó™:‹£•¤:8ñÿÇÆ÷‡žOªÜr«rï$¶Ý"Á®DÆfTP~Æû*EO¼ÐìÓÈζ·äúð;š§‹+ÉË¡šïJv½¹¢’gÖ ?Õ»ÅKŽO"x‚ÁéÐÁÑžQÃÏÅš®¸¢j! Ð=áLø}f<™eñúC“çÔšðÂÝŒŠG8e«Ãu ª&‚£ýŸÀóX‚524Ìäž*$ù+Ýô:Ö”ÓÄlTêÙ#TõBq泆ÕU« ˜²/¸/ì?°ûÈkþáÞ²R€~õ•!¥RFµóïÌDø<}¼ý ÁôÇ çå"_÷BU#+ý²ä¤–É ,ª°'ëÌ1Ž=ýúïõë²´¼ëó_g_«S1æ°Y^Ùf\^¿/fià‡W¸óÆÄ¿0‘•¥¼´î¥ÏÛàToXj½-ãçð†Óç1”b¾0‰]³ž…”qõåkÁ[bFC‘ûaÐÌÎòàæ>°»¡Qé'Ù¡øDUöb è°ä?Ϋ܃Ë^@ØQ­û–®‹ŒåÇ‚<øU¶‰â‰à¬÷Bêþ»–ž QsOh‹m|©¯‰¯øÍè™];¨ÔùìÕ:ý?¦¹çè#Wv•èåbÊ1ïxܬúÝ{æftÿì§ýô?ñ ¡'áþÈôDSøöù÷ñÅ;õñõë.=ý_LÍ}ôÏ_š÷D¦O*!)Ê[®Á˜Å,dB $¼)¸²¼Qδvt® ªB:ašsk7ÛòIûAŠAÐC¤Z#C˘í¯{aC4û±5~çcæ/6¶Žëôí •QV¶KZy6Vjvw‰£î×DÅØS/Ö^z'2#3ÁýÀ yâ"{žÇêP¡- m¶°OSÑ]äÿ±ºä/àéO•ÿR>¾þ~~#¾§«Ö±JVš ƒ˜z ‚F€~9ˆ§ÏŸ±ê¦žßWÞØ>Þ{6×lK³M~–O¬ítú¤í7£ˆù¼f9Zfo»eµÍÚ±È >Æ«J¨[ãOk¨Z,P*‰Ù§° ¥kú(}X‚,Þz ðFo¸ÂóèœUö.2ç#Ò ÑÝ7+ üaZwÛê%}«çC7Œ‘ž=x–“á Æ+ÈÀÃŒ¼XÖ‘Vù‰Òl<ßK»RhÓ…UÔ#6§<Ѷ_¹÷A”«¿ÑQi^ú-ZÏŒ>`%þO˜äAÿºÿ À6°@f—üA‡êèJЗõø°ýÀ_ØÈ,Œ„€‹hv÷ ˜ š4¢æ ·@J>Œ€AÿÌCq‘bø`Ywj¢I%à@C"Pl¿÷C€P# 7÷žõšë£ùÈØÿ„ôùî—eB¥‡ûÿÇÕ¦MHGJQ&ÈT d0&u`TÅÅ%U0&£‘B¤¾‚hnHŸ Iú‚,=Æ   ¨k" °ìü‚‚…8?â{ax?Ð=ƒüÔ?¸ù?⇸Ÿ(j?¡üƒSØöÑCð7ÿâÇì|žÀ{Ì 0'¸sÙ_’ `ö?Cî`&?TI£OÜ{ÌŽCáÑþG 3/AäÓ ÿAþ­¡dü…Åþ`Š0ü q j‡PþÖ#9P°°€}‚áùŽ¡e-A2I#GŒ’,h`Ñ–(´Ì$ÜrИG4(ËL+{ສP£*e«¬6ŠL՜ث†R4ÊT\1e]V*Oš»¦: ºkŠLY@’t¿ñW‘’GÅJE%þçý&¥`«S>ïî| ~iõ#À¡ö`ï€Ë3#kÅRµÇ5WJÓEr£EßUÞ&.…‰ƒÆi0ÀÝ~Uc š@ð{w oÖ bC°N{+&8Ë u·8&b¡SÌîpy4!¢ŠÕK Œà9£Î0_!EÁIgø‰€> m²4%™!î,0¢¨¢4´`0!ƒ† H@ÉûvÈä2tV‚ƒ$aÓbˆü@Âõ™=h0CFøaBJ°_“ÙÞꛆƒö ¬ …D°¾ñ/-âqœ0g!þ!¤ÌHA#þÄ¡4(AÙJÕëBx Œ»½Zey½æã{Ý5€ˆCü"žÆJ§Hlp =ŽÐ ô ó  hg—μM+ZÜ€¡Q(ÂãÑû†€`€ýÏôvÿC'òCðÿ5ð2ш~C5~`ö,C B‹’UvûÊEIò*Äò$>ásì…[‡°(û„$€P8 ÎNðtGqûC(½ƒù`l665äö +ø ÿ:íä ‡ßÇ›¥“Dd(qT(ŒX1iª©Jª*ÅV"±qT (ÊŠÝU0˜J$’¡R´¹ÑÅ X±gòLðÀS8ÖºÀ,báUŠ/ IJŠUTÅШÛKWUW-šeÞN?-D*¥²•–Ò(+&í®¶F­ CŒH°é¤¥‹ Plm/xB̪4Žð/«†U£MQCȦȌ grƒ$¡c„=‡Š ö¶A¢KüVJ…ô Éú >CsÁx"u@Rr|Ç—îrŠ …~W1 ƒ…G±åÈÈÔ6Bû ² †Áɘ@I–à zÎh$Ò¤’` @ÝSÐy3*ý|Ú(M7*G4õ83æ’Ì À•€‰Ñƒ ¢ÄÉ@&*ˆÀ¡(J'è‘N)h±2dº¼ ª°*ÿAEá}ckŒçþ@¢€uò5E  «þ$UåÃÔ©’…«Q(/‘)?qµEóŸS¢ýMQ?ÉHBE¡CÐè( ¡À0‹¡¹SÀ+ˆZú€ˆOÐòöƒ÷0î½äüŸÁ÷>CØM‚ ƒûDP4úXj~Cî¡öGêX U~@ò}Æ PÇ÷ þï|~Ãëã$$$aÀƒþÏùÝßgÙƒùÿOð_êàßßE§û"µ?ĉËüm|Æ•«#6Ó‚SLËÄgÁk±?/(šÏu%>1¨`«rdæy¬’dÞêtÚÕT3£Õ÷§t =ÅPài>‡bAï¼6^y°©â½ï…}fú“ëu}TYL-0@â(©º÷ÍZeñÜÁä¿¢L¸O㦄1òUícžŽ¨°rxĂê˜v!1ŸCG<ÃGP}êÆ(ƒt¹CRµª7 $[¶´(bÒ’<)A3ëq äÒPØEœ&áòÕºA™Yh¯‹ l£Ù3H²®F¦ç©BO³ŽÆ¾ôŒc¯¡°÷®0â|jòï–äë†pÏV;h™ClÀz‘O½ë”Ѽ˜áçËì§ÍUZÉ'“Ê»‚Ïz-(EøÇ,:‘_¢mÏ=a^{ñï1B#nÚ§Ï%-ÈÊL€Þl‚ó-ó¸só1ïnsrR„æÛר²Ñ[ƒ*¾Ø[mbŸ–œ¬F¶½P5s§’û¬ðè'Dß” œ=}Ù+fçr¯X}AìòïØ…ÝE¢âÜ0BpÇंDò¥Ÿ6 ØJiˆ­‚U£¯;™L3ÁöÚ˜öû®…d ËÉò£¸yn —Â/+$†¥ìYqÑbò^ÚÐO½1²‡åÖ}Ò1 !u>}æ‹R;ìÊ߈õ²uˆèñyp¡|cËÚ×j¿[Ló4¯…¬& áw|¼®Çq½‹-ÎЬ¹^®ÕcfŸxžis=!'¨¥Ê«P6d÷ou⊥;ûÓȬçVðz9ÑßÀë=¾¬ÝPYö(`v¢ðn&š'FŽËuY®?Œ6ó½{λ’Œ9*ÍR¦N “l5ÐÃÓuv‚lçI¥˜ iŒ³æôXO½ªa="fþ™"YÔ0Èð Ǥ¹”§Aã:νvé鮿s€íjIЊ?HÎ 3™jCA6^-ߺ¦šÓ“!òäý~½«­Ïdå™fÙÖbk®RÖœÒo¯¡/Ðp þ*H²ÑR”º‘°D¾(2°û~–‚-‚m¸÷¡4ñæœú¿Sê|WÚs½²ÊÞ½S?}ãYÕ6Û¼[6¾±LeýꎘÚ:I8G8šÝª·ÜWž z¸b@Ýv7’ª¯^@ø>dn¶î§R# †7™‡žÛSØ€^~Ò¥Z¾šXšVNØÀ @ÕÍ ºG‚c^e»#c›™NÇÎÌò]_=àjV‘Þu8W¬åè| úCë™ö0¡*'«¬ TFÁ“Í@ (÷ÓãMÁJd¼[n<33CšÈ™TXE²ÈJIn)wÚÅéM„IIŠ«ðB¯áýž©V–E^ú°•»ç³7± ‘ Ã›­ÁR3¼HCÏ|¶•– ë+ ¶ÓËÁ.!Û’¹ÍéÚJçŸa,lJWŸznqWF"‰¼-ÀTSµäO;ñY¿j¥ê¡Ë2Ggåz}ua éV]%Üs#1uÞãe¨Cêj©D!#†'y(Í Í]ä0^$dL‘Ü1ì̘ü”BŨÚÙŧTÂ,¸i8Ìg ‰ÇwÊæ®¸™Mᘦ$æ “s  [÷†¨8#/ÉœÊ(—a6äŠÚ~¢f|80£fÕÄU@*£õ—´64TAšÔ=`m5柴²Es^<$£Ù¾Õ‡ÃàaUñ•3Ø ØØx£.±§‚—^â-;\Þù‘¬î«½É¢ fjd@êûhÂà"ÿ !×$UHÒt2‘†Œ¿D ~€ý Äv0ó ëè Èzz„T˜8Àb5•Tœ@tíFÙ¥%‚ƒO¥ æx-8âR]Á@ÁÛØéâbÀK j³pƒü V™4—If¾>ºñxÌŸ(·×ÏŸ7&ªª½š^,M~Yãça¸€Âd2ÈnÑȺ*/xâw ÏÓ  BnA¾)ÒI„¤z|Ì Q¿]–ÐŽ¾; ˆ¢@2ñöá‘`sŒxQ”8-²Í=o!Éá°«T Î ¾FÍ; ®ô…HCsЉ57´òñ¡móB}ùsÎeFD{èbØClˆ½‘¨hØá@ f!$pájôïjú:ay³4FD<à{>øêž•|aLîyœ¨¶cìõG«)ŽÌýjz…â®é¦,÷C;9%‘.¾Wœ´¹3*ûÜ»Æw dzJÒáÚ$×ãà•…Z'€aüêüex£dvYèy%’÷Z®Ù±F™(8‰˜û'\CÓòåÍÔà vA* û¹\40ñÕìØÕ!°Š¾ÝDpé«[€‘<*]Ñå;œYð^%9\›ÊÍ”Yav–¡9X§ì'ËÄ\­R" èÙ/m7䊆 Khy5Tèô‘ÎÁˆö+f—Œxò‘Z \c;žlá©”_V½çàUÃ|GÇû¼i5Êc˜ …è°žÖ°Ò˜ÐO‰0Aa‰È ¼. £­döîÂ'¥ øPú€½ÆE ÊâV´Ph:,ÑF<éI£É`]o+Ød¾p÷…Å8*7 sëXÊ-Ž­?ÙùèlMý–<!÷z_s”‘9`Б%Å KÃö³Z“õ÷KÞÖs•‡@ÀcøèÆ¿÷0¦Ú#Ë'T´A5ˆ¹gíDÝXQ#ýÏï_AÈïy @Ê‹|½as=o‰*D!¡ohHÁ à`”òúD>ª   xQÊ‘GºÖ…>©Ÿ¶>#ìóCá8àRRàybÕ¥!gÐ@ÌI Àb ™0[^?(uPBÍöBü lZ¢„ȱžBú&7±¿NµPMÖ‰’R4.´õÍÇ[+qÅêúI®¦¨%ŽƒÕáÖ¨ü?+6G…$F]òu/$l-åªÛ'Û^šå5Æô…¿˜Åu]y÷<ð_9Ðó²Ý.1¡óÑBd5•¶PưTÌbH; 0 @0 ^FØù—½„2 ä <AaOQG Já6Θ$‡–§YÔ} éÜ‘Ãò„b`P÷3ø‘7)‹,>ƒÈfo7òCÚû'£Á΃càG#9Ä (.…BÚÉ%”%¡l 3¥mìÉ} ø#ЇɺÐXûxçK'Îú{-ø¯~\ 9j— Ë£âÚvdé{Ò[˜Ýô!èðpA†„¶ì½˜D‘¿¿Œè P`çäàWá‡Åyçz)LÙã g”?jÂCÌD“缓CP°R¶= ;¼0]¿9h˜8~Û‘©ê>ŸÌ!ø~¯™šŸÓï yÐÕƒÊKÏÂõ½ ¾AŽŠ 0Îð†ž»ôi0«A »ºóuBé­0ŠùYT ظ¡]DÖ’ÄyºÂgpA¾2I[…Ì;¡Šì*ôÍ-ÁæÔ1ÉJ@H“QÇyÄl‚g„Kâi7ÅǶ8Ã|¥ž~ײFëˈ…2&Ã:&súv¦8!l]’`ùD1›šÐËg?‡ï³ðÌ4‹QƒóˆÃƒçÉË,uã"üÌ€­ÛUúJwu 5R)«l©ÛúóšÈ‰!™ GŸ,ÿ+ZôØËªç®•§M•“{+¼ß$ñEq·˜E{ÚŸŒ,?t¢(ëÆÉOäwTUlô¥§v½gHJP¬Ù+'KtY^)å@ESRtC»ŽLÔÌÙÍ~Éùàoªبöö Öh|¤<îŒKß±ˆ0‚ºJ}ŽyÄ(UÀKíç]ŠbØöØŸ(hdÙ½×Ù¼ˆ?7¸¢4„X! |³˜‚Hüå÷‹óÝ Œ0(0"…µþö‘¡[ød þ[DZ, P]Pð"uY8$‚€1>_¨]‡>ío³Sk>ÐfÛSJ[«–§%8÷ð|P‰™ i@@@ÿ™CõØ Žýúñ¿¶|Ì[Ç’Ço9Uö³Þ‹šëÎýOOªBeé:­fgo5.ÈkZ!}HìŽÎGì©ÀdT¼ÃI3-— ø€¸H¹á)A5†ó}â òr:šŠ/yå­ÀŸºgLE(&âAR£CÞîk=Y<>Èj}‰ð7Í|Þ‡F†‰+ÀOù­Oƒ-|ŒkaòêÆs»£)9¦¹÷.%õŽ^z°VÜI‘”]O±&‡ZêvDy¶ÖÒœêÉ|.ô)g„€ik”ÜÙØ>ú}ÝÏôÿ¬"‡Ãö!è>òÕÀÜ„7="ÀœAP$ð ¿ê©Ð5áBkTb"EÔFE¸ÜI’%Ôª¢’ZB‘DDb6¬±²èˆÊ(©(d6E…(’,¢•$’,Ã0“úV¢¨ÚÒŠ ¢ƒ™`Åf`¡$Dµ RD(2Pˆ4B(ŸP øaè_­¡2’·MA¨´àû „°À‡þL€È$,ÿÉm”°¤”¦ $.vJ ÈÅ$ A¨@Žà¨™*Áì0 Ø?ì\€Ü€ºì •ÿaÜ$ ÄC ÐP¾Ê CL‹"  €J(4 œz ÁëšcTrœ3**˜U5Rí¤¹D*™(E Aÿ(][Ùda`ÿy°6 ©þQÛu[,e˜ª À!(@²ÏÔ,ØÏŸÔ8“ðr}§èu÷g€”ûapâßÁþÇçöÇ%^tOù"B**ÁÀ$ Ÿ Ô÷€DN#³¿{•ùì´A JÖåî!QPÀ]ç¦&!Ž$(Â4|žÞxóM>PÑÕð<ÄB@B†*BJJà (’0”¿g¿Ì‚}‚€Ø0!°,ÿbèÁè,& ``2T˜„ꟑ*Š“È[¦ EEU‚0QŠ-4 Ïa2È ÀÕŠ”Ÿ÷CÓª‚|ЍYbdGØaOÀQúÌF÷G²î#q9îª X„?â¢Ä*¦8¤ƒJ*¾#()@þü2'ô?ƒPïûÑÿ ¢ ?¨МGó8ú ~H”`ÿ3ÜP ñûƒýù”6?Ùà œð]Tÿ™BTÿ˜`5#‘‚‡Ê4?³ô?ÇëØÿÐìíI!_Üþb‚BOû¾}¢ÿR2Øb0(îH=Ÿ „‚Õ€HXOòá¨ÔPü4,%Ã"‡Ñ Ô¦„ , !¡¨p?æ6=€¿õ§×„Ä‚5‘‘IÂÕ ¢Ì`Àguq.h¬ÑxÝÑÁJæU1Æj[šª¢¡0É‘Âa¼co8p•Vc,ÊR´0º´¸5Fs‹Za±ËEݲ®`ؤ@P²ûQ[%0™WK­±üåµ£hŸr¨Yñªã’nðý1S(‰¨›À#ÓÌ¥‡Œ³µç¢ 5Lý¢ Á4† Â"Goì lP×`§‚¢’\LÀ÷ÿp.XH]B€…_«~èæŠ™@‡îl2H`‡¡0¹´ûn¿4“h¼^GÑDE€qáýöMòFYé±Qü –ˆ R`mºˆdân{œè TPÀ( æâ~ï•À/'ñòˆýÜ;Ðèÿqýwôøïò´>B§ƒgòBª ýõ¡¸þæ¨æ\Vä~äƒû‡ØDþÀ[O_’~ßHXx @öçV'9ö"ŠççüïÞ]·LªaJ”¬H§Úª/ÓÍÆé‚‹éÁÿv 8"dFŒf„†°lÒæ„”¶(K@4d´@= ,,0£#üÐ`R@V !kpP#˜>ÒÕ@Ì[ƒ ’! ‚‹ ˜Hª¢H -nb¤)_Š[ºT©ƒ–Æ)?ì“-¯ûe8  1ÈS•²Å2$c2Q¸†¦òì(b¨†m‚”,QU·õ…ü„ETþ’-k÷^ë¼R-øQDÉdÓááþª$aX(‚dï„ ¨X"|¨=Š˜Z ¶> †Ïáðp³÷‡{–£Tp¿¾Ã{t¨ˆ©à¿2B, $v¢± èw¼oå¸7e;‹-IÁû ˤ–·ò–%¡L«aJÐÉCE†ÎWÒ²‰˜9ÕÙ-€´Ij”(ƒ¨¦«\µ@#£÷¢ÿr2ÀXc`9É !Éšˆ jìƒëPÒ‘d”ðD¤š†üÍÓ.Ճߪ¡亅ÌÂ}§&¼B¡LŸòE•C(°§2Dßæ€ºXB„B„xš"Å©K¥€€[F Ɉ,S5PPA ‚Tɹf‘² ¡‚åZN°dPd#,;v‰Éá }Š™eÜ”ø0 Ä!O¾ h³Ü|E HP>æ”R ¸$ý@ýÀ}ƒÜÔÌøî…¬$!SBEÔ/ýJ‰C¿cS‚¡`„}+÷!Á¯‰¥±ÒRK°ÆsÁ?H”¨_ÜuOxN®­–_‡~ð¤;4]6CÂØ'ÛX(£ïìQjŒ ~„‚Àþ€HPö$—EˆT ,Е%Ô2ÁO`²–‚`xZ"‘u%@CþࢀzÀ¿Ô‘(ÑÇÙ/Ä¿êÓ‡Áb@4BŠ z$-²Ê¢Š)hâàZ0ÉD³ íSÃ…ÐJ)T²dE$QZ ¢üxDŠÆÅbˆFŒL9 ’1îIu¨€>æò…+$ ÿxlCé‘_Ce Ñ)ŠPE‰B{Tm=„‚å\.6û¨ P$UB&l©«"Àb° üq Ì¡þ¿Ÿƒõ÷˜ )6%’ žÐPtQ‚¡øÉÕ!@ÒÇ06A‚èO¤J Oâ Û n`Ø’‰(@æÆƒs?cñ$?E`„ý‡Ü? P<" (î’"’’A04€¨2‡d‡(|r„’¨ÚÃQ’ 0 D’€žþD¥û¢È%CPìÁlP¹"(a²i‹,‚ŸÁ’i¥¡C‚±%…P“aB!A >ôN Ú?BaHqÙÈ ¨Q P PB q²Äéh‡¸@ÈB`½ü?ƒ¨?ÜCögûPÿcüþÓýÆÃö‚ŠÉ´Sø„X¿Þ (ô¨‚÷Ÿð_üH_à+¸ÈCúÉ)% dKŸ†±ö Œ“ûrlp@è© æXÿ¯ìNÊŸè‰ BÁÿ¢¸}ä!÷–}¢`ð¥¥D’AVFB$""ÄUdF**¤ ˆ"1ˆªÄ`’þ¢{.X?!·Ð\>â/Øüª#TM¿òü~⢠ñíýÿÑ?o§£õŸ¸p€eù=Šš‡ÜôO±ïùçÿ"¢*Å"(aùI¡AŒ`  (XÂÈD’$$„ü£ûOëæŠªd*~ßÙ‚@d„ SÀæàEè¨}ˆÀhvÉ cèC÷þØÐúJc¾H`ð'ó Q  S#òÍý?ƒ XF ~2¨‹â4YûŠ 21?I@þÕ•¢Í¨¬´ÓÿÏeëYZγ–¦…ÆÛ hÊç C7fƒ.Ãç„­„è áÙØ0?Ýþ'ðAx‚H`’W×Aü]•:%ÁV˜Á’"’(¤€ c ÁÁ@I"ÀT‘¢ÿp( ‡AAÏíùŒSS ÑØÈýÿ¨ˆj`íC@0d®Ê t"ÿ‡ù”T¸x÷àJRIž±é=@(‰±ÉØ®cþ€àKïÜ,¡©ü„aD WY ,!DPŒ ï")- 1ê ðÅ!…‰„…Ĥ0Ém¢H"H…Æ ‘U¢«.úÉúýƒ²É?è`™´è)‘a)8ò€£GOÙáùÕä?ÞlL…Obƒ?Àü*lèÑ#°ÁϸÁ`ø ²Àø H ?` D‰ECÚªÉa@’…_±P!š"˜†ÄBƒ’ ,Í26¢K#ûyÀô(Có¨)ö#íDý€?°ID÷0'¤_ì:D22A_JŸÆ€ØsпªÌ“2Ì›ø‘äM† •û[Ÿ‡@{*#ÿlÈÁ n$Á@¤B"AB#R,U‹FUŠŒTb‚Œ   È(¢É(¢¬A‹@dF,`É!’FXÀ "ŠŒD‘€Áaa ÄFD•XI EBÉ@Yb¢ìàÿAö‰úWÁø?ª½">ÀœŽ¿P!À@!P=É8:=€Ð;¨ÜCù‰‚M‘ƒA\Æ ¿éè$ý*°¨!$‚€0ªˆ@I!E ie$hQi¢˜ˆÑCT™T”#U2(ˆ­B0RQ O"À“0FÌ… h…¹Ð>îÑä~CêjƒòEE@z'aà„žLQ`Aa‘’!€PB*@+õ¥”>$³‚ªª d–±b•ŸÔɨd=Ÿ tlhBp[¡r2Ô˜'h°¿`Rˆ ‚°X}ÓúÕRÓ» Oú Ôž©D Ø~ócÿÝA±à…ôD¡ $J”¡üš†¥Î€(C¤£ÈzãD ’ˆ’±€vdõKŠ©D©\ºªPS!ŒÌÊ—TMXY–—I:C„£áþ² d,Ê`0$-)ýô9(‚üF„?˜( A8oà&Øcä)_¦¨Cêk ÕQÇÈbC!%•¥DÈjH‚nlxýéú—l¢¼ä_àÈBÖˆ“¡ ˆüœ†@ÿì9lÔbâ{Ý© C$œࢋ‚QWàur†¨ ¡°ØBƆ‹(´ÈÿGöÝÃC2v/gت€Y„UÄöQ,‰ ’ ‹lŒ"àèfK61 ?Ê’«~…ÛQb…K>Õ †!€hÆO`šç!aäœv4óq 8?ê…Bˆ@áG…„@Þ}«je‘¿ê?Ø’KÁîc¸ðLm⚸>b%ÀÁöSäчNŽÂ‡¡“¦ƒN^£©àOæàös¶ O~â`œ”AØÜ0¨‡î%€ù )UD$‰> ‰( $™a¢Ï‚’Õ…e¡ð JUÇDÒ!@ŸÔh +Ù$†bùX…Š %)P GPÑ” „=ûEä\Á[Ÿª6KÞeˆŠ ZÌcE2¦a '@}€©¾aˆØ`üÒ'ªf º‚À Îêxˆ5 e¥]ÅU”pYhž’‘[eUD)‚ÅtT†Uµ˜¹k¸²"* ²1\”jª(¹Cˆ¨ŠÈ‚ AÕR4Ñ*±´…0 *ACQHÌ@ H‚Â.˜´H©D"H† i\@°¡àA   ›³ô ÿqê …ª€u ÆD´’øC ÙÒéR†›&NSPJ€U*lrµÁ0P`\ŸB³¯O¨?ù(P€`¡Ø"°ˆ–1ì'B@¡å}e€|@Ø–Cssæ…Á±!D¢IñKVHªÂ„0"t>†A{4,6 Ì›8FˆnD7tƒý²–Wƒ!7 ‡÷ûœbðÔ$¡:eØ„˜ˆs -pQ@!Ãî=Ž×€'–E„-YD¡’NÈ".*0:ÞÁk2hÑe† ƒ#ýÇÈX˜€)ÿäÌÿ8ÿ`¸¡ØÀ2?ÞÞ  ¼Òû‡ÀÀÁNBº„„R!CÑýCÿÕ›ƒûÚ#@¡ýP7Ðïh'÷ûLÌKC£úHT±KZ,¢•$Gaÿp]ˆÂ,"ýíýñŸŸøþ*íq„ l¢¾áòäÒô ›ŸÔl,‰ÿ1ô¥‚}OÀ’D'ܯB ‚ ¤F Œøÿ¸þ »ÇJû„ÙxD„BRýÊ }ÈŸÌ>€fù…$5??p¨æGJò ~. sbF¦g° þÐÊ@Cø7ìE_D䡨’$"Dˆ@UHÃûTñ >,GúPðÁbŸÜ”üˆ!E@6 €ØÿˆE‘,]¬ ]óú€ý©àÀ€ÀHíPòK©S”7kýÆB ñÿhÙüCø4e÷Tn¬ƒáÉ@䨰 ŽØCƒ"h,Á…äªÆ‡Öj„Gú7)*×ÜN"?Ý Ú ¢€d~Áû‡hXñÿû„°'ëýÚ‚ ô#ýÂmÿ”þb}‚ˆÂE’ d ‰ª,"ÐBè(@"AY‹VPUPSkb Œ,öQ"H+ôiª ™Îb#ø‘·õ¶`ˆ( °(Õîµ€Y@* éDP¢îþŒPVI”ÖY/ñ€jµ—àßøÿÿüÿÿþ˜DÇP÷Û®ì¯ö[°CEvÛ.íx½ã`½Lo>ú6¶šÞÜTz Á@>ÙT€PN(  P€CfJ”… PÐ$7ÝÕ”ùdÁEÖ¡­.íÀPJŽ®íÃr>À÷¸ÝJ¥@úS¢¤£ë  ½>wq@d€1ôG¸zôùpíÒ.î²Üžî;Ú·±;qmÑë[Ç‘ë ïnG¬´¸ÚÏf… ØîÀ6À:(@èfÛm);€ @ÐÉ@ P2D†kŸP*€(n¶ÅÜܨ]T;q¸úsÞê®;45MwiÀ]ÝÝ×'+F§nç:¶¶æîØíÕq:ë3v¬¹E×)͹½:zV€ |Û†ž»§®ºÙï=ç‹[Üå\´0&9çróÝÁK¶ÙÞó÷°§¤¡òp—yÀè}ç@=Hë}=ïzÅãÏÚÖ   ,f°fŒKiah ëC°Ø%¼ÜO14l§³¡ŽâvTI×IÚ‘oyÏëFÔª,Óu¡E;5Ti¡0mj°–F˜¶V&§=ÃÞ1¦y1бÞÞFÜuÖïw6ÈëU€fÀP^lƒM‚M@õ1¨zõ4Èi ˆ’‰(BdÐ š€%1‚B„“Ú”Þš£FžDå4ôõ#@ha'ªJH“PÚOHÒz€ÄA €R’d €Œ¦Õ<šSô§©êzM” ‰‚4BaÕ=©µOQ±5=CÒš€xåz=ujj)^ÛÄÿà•KÁ*¨òŠ%”Q,Õ•+"ŠÄ1‘,eXʦU,ÛJÙƒlµdÛ[m,ÑmŠLª+*ŠÕKÈJ¥›U«kWW‘¶ˆØ‹XÚ5¨Ú#V+ÑZ‹li-i*ˆYÖÆ)dTÍ ccj*Š¢Ú655š(ÑklQ¢ÔDÔ62ËjÐZl©­#E´HŠÆÚÅ´hØ£I‰"% a ¨0X6”ÖLjj-´©Ue‹I’LÀªQRZ6¢“I©4@‘«Ø5ÄÙMF¬lB¥£DU³ 3f¨Ù©¢ÄZ!¶PFÆË)³`+,T¨‰‰´6’†€ È´ÅDd-TQh$‹lb¤ÒE‚Ø Tm°Q´b¬hÚ#lhµI´mЦØÕ¥›ehVTT(bÓiFcXˆVš*,U™¢*Ñ(ZͦˆÔjÅQ#ÔhÛ6Ê +Fج"2F"j˜¤-£"Rš†›P´102k+)6d›f-i©B&˜1 (ÃLÊ4m‚¦ªcA¨5J„X±¢Ñ‚±f¦R6Ã0¤E&¤ˆ’,ˆÔ*f¤_kmE*n”НÏQ/õ?óÿüÿÎÿøÿÍ™ÿÆ6§K˜«ÄqV•R¶p×ûoð³A¨ÿºÿ5ÿÈZ–*2µ¡K;É’¿‰ÕÄZ(6µ#Zy­T²Œ³aÞëÚ“YþFô¬Y«–ˆË.-\*ˆÕVÕ…¶„ÚÁ«ʘ ‡µµË îêø†Þï‘+,gÎdR Wh‡Ä4—ÿpXa˜p£k)„Ó-Ÿk´‰Ë3+‚(Êû¼ÄÀ«ÎvÕ¹ÑÛöìòÖÿÑ¿sXôòýåÿ‰m6 {)É Ò·L3b{»$ÓK*ÙQ•Áq7[K,†^âÄÝø®ÚÌ•NصŽ<­ŽÌ¶K2O'ózêHꈋj6bO^X£tfbT]šØ7ÚbËÄ3¹[PØ_WÜé_57®­'n߯#÷_þª´ ¾?ÝŒ|1•jÿÉcÔ’O3ÞÉŠ¨ø;á‚‘óÃþ ?Âõ·¾¦O¢>¥ñ´Ù=ާC§þÝêeµ-¶[l½ÌÙw;•¡Ï‡oã×6‹xÇ—s¿±>>ÿÃG„ã%_éç°Yo§«§ÜmÆö&äOG&ãgZáËý{îqòÄ›å¿~£Í¾)Y2ç·HÝlį>Ëzã3žKƒúýÎ/ÕÃ/ÓZÕ¶¿‰–ϯ̟ôVSãÚ¬³¶ÝõiáíÐòÇÉ˸滦ZˈøÐ\ðø>·ú~jíÜŽŒâÚi4Ï¥7øË~¤ª›kª“nªUûC AU¨žÊe:I$•YçÐ~•Gý:¹6'4ù>U®ûË83+’™f‘òÆ $ò¬XÞùÔþ¾Wó4í$¼ÛgW‰àŽ#Á&õlùÔ†}­«S.[Ç»­¸X¨¼÷Õœ³;}4–Âk7©8}}d6¤²ÅUP±Â(8NkЕ”¨©»Ö-ú_^S#}¬Ë*Éj¯‹•jÙäc%ŸÖGvü[2 ôÙ¯ò©Ç7NŸ#—9òÃxæ×LõówWˈç$¿|$ÉxÃÌ•®—v1ᦣå‰×YÜ’“ùk®©•T´û`T;ã"+EN‘qö÷ƒSØ9}I‹8’ûc¡_jyÌáoÍ5~Ky±´9én;'ƵÕË™”ô9©»2ɤdŒûólÓécÂSB¹Yºø¶”’HI#T] ¥ýŸŸ dè²'\'aâ'zêµZjL¤õÕ”{ëgÉm–ÆV[V¥ôˆÔGÖF&G+Ä*pU²|õžÍâ~-¹F†í/k—GI“‰g·Œå¶Y–[–-g„i=¤v:ÑõxÝÍàóÙçKË2йY€ëãÂGjÿwµ$߯÷CÖû%zõ¹cO?Œ›¶:ú²G›:ùŸÅmX¶¯É‘2¹´Nm’–Ûj:ïyI ¦W‹å‘ƒN&2fVd³L)‰ŠÑùôÔŠ4*æÇ7£¿8•K;ÔàSŽ€˜Æ®T¿+ñ÷¿'åêíêæÝýiïÞ>o%^îyš-Ó --&—ËhõjK“Õ¬Ë8mð‘Ç“ž–ÛUmª¤@A}Z½mú–ßkgÉ$¿7fc#ÍL»û߯n$óÒ½ì[3Çò¯m+MX> Ù­zHÝìópÞ3_¹õéCUú6TÝø½hó”pÚzV»(…oÛ6U /Ô\îž¡û#Kë¯5<ˆí1mªµV¢y2ò¡nM´oäZûUµ·ò]û'á  ¢-[m‹cÎGßqãxx¶3%µRìŠ|„‘Ð! Àð¼fæH&‘s0?«”Û”¸½V¶]®Ù4aò¬,lMÖž«ÃP„¤×øY¨fa„¢ŽÄAÉ ÉÝnûÂ1‚¬X¤î·)s^/öàÛt/Ñê<Žê¯93%Œ—§ŒK4y4é“K+^Ó1•–O*p¨a _ ’ID!uêµwvÊ ©k¡w!N< +v“‚†Y ™Ö£„UH„9ËØØ°§µJÿCF¨{)4,%³ñKøçm;*xƪ»*þ”Q/V“øÔº:- ß3+˜Ì&Iû3áÆÎ,«¬¥mµ=y$^êrr¢‰n%RïEüÿ‚‘Gð„>Ì',)sË1KöäfMdƒl"Û"Q6RmQ~œ³¤ÆS ª©,P¬ÄŒ!J´•2ßf«µ»7Z½ÂÊè¥K*FfYIf1+"`*Û•º–’ÚJYY°ÖJl«+)-u×[%±iYj‘bÅ0i´fi±Ó‚£:UªDÖ$£1j¨¯ùöÿOáRµRµR¿ÅJý+Š•ÅQ~…ÿ5EΦÓMsÉsW§þ‰•Ej¦h’ê®uEt&ÙFfefI˜f 4²¶(¶Æ¶TÖ£M…jSZ-¤©¦¨R±¤¶’™©e«(U0Öi¶ÊmdÚÑ«FÙ›i›X©¡³6´lÍ©…e*ÖÉd$"­þëkúçm<ñ¿ï¶­ßùcUèH@×þ?ÛüjhÓy{)õ–èIç*øZVà½ÙF'ý+gQ ni1l^Õ–ÄZ­q‡7‹÷Ú{Ûâþ… ¼¨Gï ¶¢ª%³ª"®×ªß“—j©#ÐEž¤4»Ë,Qu3Wâs㾆î.ò3Ï}Õ÷ÇléöNnÌ·¾g7zœs¤e£Íñ¹±Þ‡{ÖùØÞkË‹³Î¡öLz÷IÕšæ}ôOu÷^>ŒÝ»È­˜žezò¯sÞ¹S‘®ã=™,öžö©ñ¯›ßÞwþ™®(·½ìVŽ&ÍÖ¥ì(õm^ÄVê¥ÚÑ+-m¯¾/Ó¤\Ùìúc¯Þ9‘6ã·Å–Ù÷wELfElÍLîýs1ŸT¿Žôý3öt{zn¯N§_[¾÷®;iöÎíÕäÞÌOLWž{=^Ù’''žáïd².=èÂ´×æû÷žúXQÿ,B?Œ!xj»h·Aá“ÿ0øé·ÇPÙ…è`¯ù‘TMù/öúétË…ÿœ>ŽYVÿ\¿Æ‚¼°¯^~85SøØŽª>–eŠ÷ï•?çãé§çœiö³%!üSÛ×߆‡‡ŸPÌD†4(òT5œ@U±²­éû Œ÷vÏ©ÆÌ ¸ôîIA,{ #¾Ý&¾×°OŒËÓ6‹‘É#ý®Ö~'æãîž5¯ùÎG‹þ-PJa>‹â\È©AK–ÖÞlMhHs•N¾Xx#ùŸ­Ó‘ ß¹^¼ ›¸ë œÏP.`ûéïõ¶¼_${¶wï_'·¬¯Á$q¡¡/Š~ngì°‰MUÏÓµ—²'®ˆJ")ÒõSÚyT|W¥jh}æÉè Ü‹¾¤BJ ¥©4›góý?ÍAóïœ>òª£ƒóOšµßŒ?¢ˆ ¡ }¸w€¤ ž'züZ€I¦×qbˆœq¶šùõëz Ñh„Z×oÅéÎöçŸÖ-(;ñß{Cìêiö{g´¹bã;w­ñ>œ|›C0éÎñœtà2@R±è\¥ÈðFJkfX…Õß§ëóûgþwøŒcmq«ÄõlÚôVå N:LD”ןŸ¿ÈöCŸÇª\ 5¤Ò=üþ­WG6||v;ý+'âẜØì:@Ÿ<” ƒc×Áê,Q; üìBPñä|}8^ŠÍýä'˜ì@ÑçIó~ªá²óÇ䆯ÑE¹ú*=X¾yl8zãíÖœÈï ”:ý·é»×ÁQ:`f.¥3´Ÿ]È äúÈéÕÓä`>Å‚%6’Ö¿®žuXðÈ>ê>^~mN™óìkÛúñû¢žEÖŸG¢|”çšÞ©Ô¢—¨b¾H’ƒ¡žIئ“ôcäïÜsúÞjæyõ¾-Oû¾‘Kø(=ë®ã¹ÏOªs#zí3â÷A̲'Ñ Kns"þ²õ à QÚÃÑŸ™޼âˆ,EˆÛ×¼qÜ÷ÞýlâÝ¡9rçâ¢Ýˆ¥Ò烳Œ²|šçq¾<5cîþù>À`€+õ| Rˆ<׆ä@`å8æRÞ-è'O6± dó®'Ãr7÷Tû)‚>Š"qæØûúÓžžöý—Ô©³ÏV{sôÑ˶ä|`Ó~–¼Ž÷OŶ))¿ék§ÑhP ½]acÓ šqè×’îx ÇcKö°èÙ<"Z“×äóíÛÑR8 Ìë¬iu#Ü ­Ð}¯œŽÍΜ|óó÷àž!è*>"ÇhÐ0ë·Ì3ç˜ýºU=ÔÏ·@+Rƒà„O‚öPvr6ìG&º2%'…_ŸÌ3üþ–ÿ¨ý”/쪉º ïÃÛ⹯ÖÂÙ@ ,CªF›E¥»‘$’èn58¶?á‡[âU¯þç|ñûÐẋÝ7.±cïmÜk‡|u÷]­ï½>¸ˆêŠûï¥Çºèt÷*jó¾œÈzy¡§£bÏL =L`Ô-HBL„Ô¦#3˜Ò´R‰Òm4HÑóqcTˆKÊÙñtØûèú¶Ý4ÓbLˆë^¦–wÑ»/Û²=\p¼e¬I1$Þ-éóÎOšëîëÏ{Ýww33qì÷½íoÞ÷¾{ð‘ócB•ll¾o ¯{çÑ×ãÍ<Ÿ]÷6ÆndÔøsѾß^t™^÷¯.fv!óÝŽrë¨uuf;ÏuÕw¥ÇNªÈÊô¹­Ûç¾®ëôúr÷«Î"vx}ì®Â÷NQq•=Ù‰Îyíê˜êκëí»˹½–úEÔçTV?mìû¶5žñDϪ:¶û½Ñ·S7}êÎÜŸdݳױw»Øùùö:™o"LÕ¾Øìø_}}õ¿¾¿£›þ¬‘ÿn¹ tS(m$ V.Ò`›O„¦@JŸ_;Yæ×Í|ëÝï{³ÑÓÇ»»ØD@{î•N\äŽO3„2¯Û{ï}ãËÑ ÆÔ¸DÔù—0[Ù†4ÒE% r.² ¼†¹*f™–ÆŽ9-k7QjsÐÓ’<4¦6(Ýš×b ‚\oA¬ŽYÑ’³ ÂXlx£3+œ¢x6èÍJñzü`¯FcZtž°ò²žNxâÁŒâ•ªªÉ)O§ÖzŒ¾Ì4µ…û ²‡‡œ×ki§9†0·H›ƒtñªÕÒ׃7/Ï73Õ sÅ´Q M©ñ˜cŒ1høáä—ØO´~[<ï–°tEI™eû#‚Þààm׆qoÊ 8d;¡·ãÕŠJ¾—Š'Û$œIïm@Æz o†æ½êl‰rtŽ– ôÝC¥ Æy¨J®µS£ Ëâªt2¨hóñ#iẛ5BÇꇎ6 ‚ß q„\Œ-æÑ¥yìz‚ ÂDX†›¢"¶4É<‰S ­)ÊÉñ9î„{9]zG‡G—“™læ0¯F“\A0£¬Òò°¾R6ƈVêhõKFYYoàƒÕ$¢ÉïM׃ÙzW.f@ÙROI£n"uÊœñërß±V¼aPº9·¦R,Õ¬òÄGâaQªTqsºø«ŠÆTô‘ÑW ‡†ÕlrØ^€qæÂk`õôpüB ¯#_\žƒ–K…/=êuí0× kMñŠG2ô…àÜÂGS‡†Ï@æÝ’R‘Õ}Õ§F™–#:4š£½S/ߎ;pcNu~ÓgÏxÔx³Íi’6Ȉ»x÷7Ó€ÙCêõÆ5ޒܲ’HÌ÷›Ú˜â'4/–Yo¬ç—ºCT,*"[²K¸8†@Û.ËZ˜ï޲φšõ“Ñ4îú<¶äµ;.‹G¥\››Îß r`ØÖÄuPã°|˜CìÀ·ª%3[d]ñz¡Þa§6qdx«Îyt?It ¸î©WqÎ2 'c«Á„éÍ%mï*Ë=kYa]ZÂÊ(·ì&Ž 4ã–(ÓW³Œ²çnIšU¢ÈÓÇ‰ÕæIšw‚ È+ÈÏ3'ÓZ{׫ÖêË%Ha¬{ۙ畫ñÌ&âÆJ~Y,ì߬».‰])R£Hq±FTv;8³½å4YØ®G%¶ig¸…GVç4¼Òñ¥Ë ‡£»ˆ‡°A™s9ôD˜­V‡E4䳌9žö•ãâ×ÇäaGÁ ûãj!NVhªöqPÕLáIardú#K§u¹%i0^¿pï×ÏBpè…’c×9\¥ÆÕŸvÆãÔ9‘¤ø…‰;ÓÆ[Ótv½6l‘0KëVO5s®™êMqç&^˜›¶(j¸ZõMéãGÒ÷´»Œ=C1ëQë%óãŽJ=yÈÞ"4Œ¬¿5ža>ñƒ-v½d’x¤òõcÉMžáê!ÎÄ÷iH¹,²È¬ÂSP±×do´£o+®§Co—eÂXë٠!›«œ9¨…f3¦ Â×-MÅwRÙ^ÖDvóda„[(Ÿ/hdR°|´ñµzã(£N"§ñ–ÎnäueyÀqéƒwÔ7I¨68p̨•Õ¿W,Ò÷çQ墈=„ÄYdXýNɾÆÏ¾÷ª{ë_Q÷Ád”ÔY¬~ÓÜŽ•x­Pz§,~â'œI‹_º¸Î3FuGL|K%¸)m'Y‡ˆ˜Å&<=»,å!îTŽòÀ%{§†‹ºMæhy©­Š‚Ëj÷ºLÓh‹ÒAEÈðÉLŒÞâ(àâú´Ò|¤}ÔCPÊ‚‹Ö=6Û¨l2HTØÚôĤtjèñä5ÚTaIÐëÆûCHd l}…–xdG‹mTÔ½Q{ ]Tg_öÝý?ÆÿC¯¨ÿÃm/úÿΠäÏð’ïûÿÂº»DLÄ1Š(•&˜–¸¾tg¿Åÿ©†×3ý°D1-üšÌ¯‹uv¢½Âй8[1&?VJëFÖ1íiž¶”†öðÛâùõÛ!£ï†e¥I/Õò=öÑæå_¨èQ%ößMÿNþÚ.ÙXÞ Ši`»ëx¶Ñ³å]‹äcX·ó}S~/¦3È©Ï){P¬Q‹aó¥(Æ–W7ÝIÝ”P¨»e•Á¦™´°hF°Nv¥ë²Ùÿží«Øìë‹aÓ-/¢¤2…ä­E»)Ì­æ÷¬ibÖ«Ù^ÖÒÅ”kN U.G¾ßMøëøË~[û‡ßwîTyùçÑ|ÌÿŸˆíe_(o´qM=߯_ÝãÍýú÷Ë;}y¯¯ «ùV¨©?~!ûGáè`9-Œ²Tʾ2"öZ¥¡à‚ÑéÀÉ >«óhýÙ£k¾UœWe¡¿Î›Ï‡³‹”?×_súññ‹QÚ8Ãh-$-)ÎFò©ŒÓ›¦ö‹G®>þûíÆ½Ÿ[¿_KÆñb3f µíŠÒ˜ŠX=„/1ÑhðÄ‘îÆ;0ŸˆPÙZÒåT‰Xœ®©Ay§ê‘º«Á”1õVóÏäS”P“ˇ’V"œËKDY¾™„*­ý÷:gß p­°ZÏ3¿+ÞÔ¹ÇušæïU@2¤žËR3c4š2°¥^Ä•êëöl%bµÌoã½2c„‚+³;¤u`ɘ^6…-Þ»Ü4X>ÎàšNCA€QÙ@ “Æ£9ž*ªtr^<«X"øxxzæ"Ø£àÆ ~rî)²®ýdLrejïÈÕàÜðHåVbÍÜ‚9\Ùó (B‚NÝ-DC+E•ŽñnR”ˆ*ywW^™Ñ~Qµ…ÍZʱñK¶fy[XÌÍs¹ZA9ª“°½Øî­UäGâûŸz¸š;¿¹yìkåøBÒõ½7âxØ•|_ŒqN¹õ4këVYôzþ¹Ï»Ú´ØŒpŠª¤‹o`s®2´Yn,³©µFI²Ôd9faµï*´¢Þï,hM•à}(bHy<;/é$ÓmˆÆÓ¦«;7M@±þŸÒŽ>¿oÚ5î~T§êŸ¼axSÑ[×ûûÌòz7ìŽ÷×ácä¥Nœ­öíºGâ–usÁ¿ÛÒ°Å!’Hz; ÍÓðâÏä‚aÝƒŠ¿ãv¼~‡¥d†Ë°zFœ9“¿XzÌYW¥™^Í/7àÕƒ@âÏ\åçYˆ0¿«ËH¨z«V †Ø6GKHª–嵑§ßyšå¶¥7ΛRZÃVi#ójÔ\Û‚b· •Öü˜CgÇ,<z;?*à@ÐayV‚ê!"ð¼îg8åzÖ1³hΊšk›­„`Ò^ëêì•<ßÈ·;VøµÈ㎗ÒÖBÙ[ýÎ÷_Å×ú-sÚ[j!:ë>Wy¢»Û £JGv˜E³0ôè$2ÞËI3JÃT¾ˆ áØ‘E[]«OrÝÝþñ£›ÛÑùÚ4mvž}B$ó¿.3…b½bíýÒñ&¶ÕxI 0­‚½øwÚ‡j‡™ ”<±`ÐFÊÄOËRÃck ó4™7çW]ĸ-²¯IWç™`ÝÔ‡3Ã…Š ¼’ñWOPΖ\·&ÁÐå½­N-C°lÅe‹FŽF {£ezºêC#®™HìDbì×[ö+e¶]‹ƹvg‚Ó‰“B8v—ê«&[›»qGr¹€¶ÞKñ4„%ѨYtüã‡2Ï‘˜Ó{;ÄñšŒ‘¹¶:(€ä’±ÖÍrœ*ÎtrXâý)H¶Ìå7k6%œ:u~Nü"›DèŸz9#"[1Hz:ºk…ËÞE>#1½$å§œ¦ñ•¬Hn3FŽpÓµhÁâ-–™¢‹#]1§¾+kcž*¼ë"´òÑ™Q°Xh $Q¥Û+ÛMAz ÖÖgvR1Ñl\ˆÝnëcxfp·×K Ú•P·k–wVÍ\¹%% 0pcO¿*=0Ùã!¹mÅvXVzY·0l¥EÜ4—´êÔ<žø{›J…ÕEŒ­–¯ E”̱­seŠÔHrb1äõCbÝ3!µ:ÒÞlíC•…—x®Uâ+´A1¨wcïùøKÒ?9'‘é«»$¸õä¿™©­}¿-õ)BÀ‡f™ß–øÕ ®Ä«-Úó92{Q£p­»VœétâïAž•kloË&ÖWP`,…á•_l>æA0W@ºÉÝà†Šß¾ï[-áðÛš iââ)SQ®—¤žfkK*†Ž»‰­tCZ† ö~„³œ0«½0Ò…É4É ò.Z·šÍ¯ƒÊ×)šaÞ¢ ´UðNÁÚGr6˜d·üþ~?_»âû“ð¥TúïáÂ…è‹Ì˯²é/E_œ*zjøY-6ŽÉZPQbŠ/ò¢ ŽÅMbøÀ’˜Òˆ´»ú]®³/«Î-7önþdñ3A±ëÁÚZ,B­–0<I$%}¥ðèŽVi(+L¯€O¶–ÅïÊaðD z*"ñ¯}Jñpô†’Q%áàƒ&Ò‘F¼40ìðÒõµ½þª+òÙ{üÏ©î¹swr5ô~ªœk›ÕbånÍR1uKo¦‚-J60·l†ÉJCáö;ìÚщ¥–sU£êò§P€³4¹6[íåAu&µÎö˃»}ñi ûção‚>—Ô9ãwY3>;âCK£óÿö7coæÈ»ÆyŽòò¥þ)çÕÞ<Ç™LßÐÇ=T§>Yîž;†c¬I~lȆӖ^’m¶Ö%ß&üdRï Ñ„zç™Å•,’ØïY¬Ã=e²Þ^µÍÍcO™¶£é~ÊeÈ¥Þ–k}ÎXÚë/òÿÚ- çSb® kñÊ9¶b¤ƒÝCΣփ-—‚¥ÔNáv6ÎßfÀˆ $ÛRÒI²ˆ¢¹$èä¹ÑiWy²«9)¨\*Ögýzf4Î$í‹¡Hf#j<:Ã*©$¤‹â´Þ(ž‘pW!Ç—¡ Ǽ±nmÝëøk¬›W:[[ñ[]>¥]y—rù§ ÕØ£z$IKd———¦•TÓ‚X.³RÓæeת{{ïM[BÈMŽF¯j棥ƗÛýu˜_5,û}ý=¦©c ÇZŸPjؘÖ|ú~[ª¶º¶–Z¬zÞVXܛъa*a•ƒæ¦‘×È©'}»ë‹QZ+mo[ù÷÷ï‚O×úIªI°kõR'/âÈ®Eví1²M¹UÝïå˜+Ju§ŸzÅGÝÜ´t´¨ø’ò3‡mÂñ6Ek‚â ÜDi!3äœù¯¶mi¯vìX™\}ŸZKšwÓ7ôÑMkoãæ»£Õ?~µ-¿˜Þ¬É•q³åvšëõt ¤ªšSßÌ#f6ydß™+×éÚë7Óé.ù«Ó˜[Ðë\·ÍîöÆ/œP‡Œ²WøØÓ¶«9irÙoïL½RHHI¥M­HƒqΑ«}cÒƒb¤¶žDýî]¡¢M|?GÒÉ6³­ä6-=oH›‡ËÈ…2Õ«¯ÍÙúþ…á7ÅH×=–øN,àóá¶;Uc  èŽXuFæ4r­,œ|£-=cQÔÖ¯oOˆ4~\j•/.RHP@Ä5e ¤°4‹o xÚÏÚ¦ÍÖ×Z£ò°F˜¿1@Î4ƒRâ b€kÅ0¢ÆêêW‚-3ö÷Ë«º>«ôØþ&DÇÔª­L­Šaâ{=$Ù†# ±Ù¥S«{úê̘×ÕàîN¥zV8ÐÁœ;6|!ƒ3ö‚¤Ä§Ê Π¶Ø÷GoV4³‰Xų™£N–jtiârîáËJáã&U>M:–#…вy:M¯—Vº·¹ysø/w~“cÂÉÒiaæì^èÚhÉ«‹'¨àÚºks¬8)óŽîÌ•ïU¤ÙɳNïg!¹Ìó…zVV¥†‚†å"àkʯCàéz|j PÄwª ôº¡³ê«¡Ï³Nù¸Ñ{C©¯zécl˜õSÏf<ÉÌzG¤viíÊšö­›kqí)_ý/ÅíOö+‡"ûVì_½œ¨ýg*q Ëù¹DÞáxyc–_÷iµpœcÿç®e¶þ%Z²ÿ-¥ú:OTÿx¢aÌŸô>Ï2¼Î}”`[ì=¨½Â§U°ÐÕ0ùRøÃe5V#+pîa?‰É:=OƒÃä9ÔáWwª¾gû/O|è.«rêyU`z¶Iƒs\Û‡(e”Äœ£Ùñ«\«1`Æ&Ìç‡e~CÙ;S©b2ÝÒŠv|Pø.ÉμIxؾcûó~¯ÅÈÄ5SGóe–òýκ_½™J•?ë—2(:•¤›D­‘Iãg‰õÇks< ?¾Å§€V”¶Ú”nÛÿòcUx/ü5™˜Ç‘¹«iUÏ[hlÐÒTŽˆÕ&zÐ’¤ }ÊI±f;U‡w5bdeµe,suna—Β׆ F!(’!®Ûlî´e:•VauZZ‹|p!´˜eè"Ž:f–Bª2¥V«YDÄŒ3ȵQ4ö”Y5Ap”¢¤ÎÆÆÆÆ4ÄÄ|¨ "mpžù<¡¬T#ÛÜÓ½îáAZäpÙ¹³¦=˜*·[¸cq m-\'(ásœ‡(åӚݽud¨Š”þ­ð9ݽ¼5‹£ja¶†/„||h³þ×ùU0zªhn梕¢ÌBÒGÓ¿RPñÒU£±“‚FÑ*mëkDFœ… ·¯bQ,i $¼ë5´8­Ee¶¸$Q‰-ÊjÂä6„„„ ‰ i RËxš®½`1§½%Aúîí¦£Lo;/‹9œ™+”äd†Å‘‡1ZMÛ:­Ü]îNó-ŽsJì»»«iev\[; Á£ö¡ÞÇ-ꮑ“Øvr›'?§óãbþû~ï™e²ð¹5½4æ2LX.DŒ‘7fË–Ü®!ôY:9Ù¤ú¥„ó÷„{nÛmµVƒ!%+·úÿ‡[«Û|×W¶òêèжëŵd´ö]æõÉÑr¶Ÿ¸ŽgÛysº=÷±>}­]“›‹ÞÜé}‰¼ò|\;/ÝÞº]—;NYfY°tpÞ¹¸M¡ÊÚ{9üÛðr®GF¦Ò¾Õu4§õ¾È̶“²¼4£­xÞoqeuFNöÍ]OXáÌn-_tu§î«ß!Ö¨¯¹IyÄèÉ|£ ´!¤¶‹ôöš¨áúç^^>¼Ï³oׯ–õ~:e†%‹÷ʨ_ÊRwzüçGµ'Š·/©ý´¤ûUjïT_Y²¥m•+І+j¢Ù²¥j¨µ5TVõ&%¦Äff Ì&c0©ËäåWj¢¹ßÞŒ”£ßT_á¥MªyU«ÃÓ×þ¿×ñŸã·.#håØúw{¬Òg·*wþn¿ñÿ¸Ä{øû?×sБw¶ÞýöÝËÝõœ:ðò‚¿zª _»ø[ZÿM’ƃ&©)KQŠZ¬›“lh¶DV‚ÔT[2Ñ¢Øi6Ú6JŲUd±Tl¦ØÕ&FØÛ#m%)d­I%’-ŠÌÖ­²ŽÔ¡z(—’ñÏÁŒÛϯ^™œ¹ùsίòÎö×^ÇDmÃn²Ûì•U1ÃqèÚVvóïKz»Ìã-ÓtrÞ˜ÔÉ–cë¥CdmÔ¢›7Q%cqž®Ù©ñÝGµïNxzTîDú_Ý=âÎV€€Ôjä¤P*Wr¸".iu†E=›÷x÷µç_°„¼’“Ú%¥‡ZAè!] RGYª|$ÀÒë׈ ”´$^Ù(¶ŠG…Êüxg-Húù/L –7ôÜÄ%‡owLqÓÒ|¬Ê0$¬F !¥*´,ìÒç¼tæuÁÛ릉“×™òò]DÝûÝ~ÙƒŽdâiÇ8¸Ä&"ÁÍûnzzôÈÊ¢K bµz^Ö×d:Û¹}íÛßTMߦ!¾dÜÝæÜžDup¸¨4Ö™ROBF16vܨÈãëpqâÌ4Rw2œ¡X¶ßÉŸ+Yå|*#,;#HL=!ŽPQëÔòÏÀ¿æI~` ‰}Ù§|ïõª•+÷#ܵi«tÝ=ÂñÚÏz D_úˆ­ù$'n$C£ Ò© Z“1ž‚'øÕŒr¬G–$S=ˆ d†éþP‹°èÌò/øÑ`¤”’åÌïâù ~ûQòô$”Aidæ¼­–G‡f¸†Óbš_~|:®ÖX«<Óåþ¯õ“ñøÞS•2ÖRÅa3KùË· ’·U¢÷U,5ÍA8Ú“_çùðiñdþ—ð~AOòR~$W@ ÌËüÛmñû÷ß,|šQ#ˆØ ¬µ$ü“AòahOßt¢Ö˜¡±šÐÛ`Ú…²ÕnÃèÄÀÙÂO_ÇÔiµÕ‚‘k d@ï¶ÊÄœ² d<±þÎa ü z·wÄ£šChasÌ„Y*•9Sýñ˜¨ñ |Øäp1&±@¦»^.³PìõrզåÊc|SV À² K«ùÍþ`§ãÄ ÙB)Ò(^ÚH(†RGîT%H£E„ \<ïïîûKTs‘*¡‰ŸAåd>eOø ‡Öüxf’­eå!D’ràò<’7/Ñ" \+`Z, Ö/%ï–J¼ ôm{3331BU·‚‚»ç_w• ®Ü£{e Mƒ Þ]k4ºH¥¿—ZM0RÿÓôËÆÿ¡þ¦ƒªªYåÔ;CæÔ ^S.·x«v}ä!½H«VòÍŸgö𢯿v© eR®üöç~v>”¶2wxž?Ï4„JÐc€žÁdÀz$=@Ǿ^ªìº)3ô"”JP $R ùÕ•ðÀôê<Ãüýæÿ4ZHéIt#cëù½U[½ÙŽuÌ8rlùBöî_`¼i$Çû.†Q€3Vˆä‹çE ä¤ÄŽé!ÄŒò-ªÃ Øv‰§}f÷ÏXm½2 ××Éa(^H"Aª[l‚1.51V2'#%Ó,Ю3±Ï-Oš“M^<úó,žNÑn•£R«'—ÏO8óÙËBÅR”ÙbÇ]­t¥»v+´´…©,²bVL•,šu2CU-‰çטãVáoÉ„D¾¢“VY|DÙý (A§ôýoª‘ˆ7òiñ€QIX— äysmªhçÀqÅ¥Èä¹çìa(ñà±LÌ×l44¼y+ÔpØ™`døR )-A¼gÐB®Lh‰! ìÃv@®Îð¬+ç΃«ך?Pþû3 ¨}]ÝígÑ’« 4}/)K– ™TWÇI”? kB°n›áVð: %T’m„ÏD9ð1ÎÀFƒ9ð̨×Ys2Û’I)ªé n¾v >™åU-ŸÏ‘’JPÀ65?S¥ÅÛúŒý&ÉH>èØ¡Ã0Ý ³ø‹ëçÝ/òôåRõ¶X— ¼vÔy„w˜ä¨ÿ?‘‚(ZMr¡(iRgþëƒùkbÇÿ ”ɳy÷ø’:·F6gꌽßäßeTöUívõ‘{·Öçfg·g¦µ’}3$ÿÛP”׺}ÆûëÊèÔ” D¤ ôòPOùÔá<÷§CÃdé7ç©;ºvúij6BÒðü û{¾›SÅ{¹¢§»D¿fÏqžÍ×Û[IúçRš…ᆗ儥 Æ>“ÇYàÖÞ/ðÉöõÖŒÝë±Q3t™0 %Z²”iJŸŽ‘ž^ÌàVËx6‰gF/N­fècõÙ£Ó£”•‚Ö>§÷ß›1³D#„CùFcd»#F’™žiy‰6’(ÿ~¾u­™$;utE¨)À¸&4 ’ùL–.ì=òù~ñBÁ6€¹–å$ŽHx$2‹ú ÞH¼L( :"K_ÂÅKg-ïÙëÒí¿J=5p±·ïvÏ î0×™Ðã£Ën=^uË”-yøÙ3¹®´ÈN½™*Ï+G3F‚ìuê7TèÔ¨§ºðÖ^al6€ÄhÒŒ‚ÁtèÂB;ƒd””Òi ŽÁçHÿ¥sTWÁʸ Ô”HÊMÒË^X©X›»—fˆÿÀ¼j?Yþ^„‹RiWŠCQáYDÂ$Ú^ ›t¤ L Þ¬CŽªÊ¤HЗtI|@Õ_ÐÎ^?ÉIß~^·ø†Èc¹põÀmHƒS²i˜Æ_åûòÀ»tJÛ¸ãì’°‘Šli§ªt%¤CÙR:PO›ø” gˆJ^TÍ4A|YOjô~µ÷Y.‘WÈNV0ðjߣ‰Ìã «,2¦Ÿûr¥‚ùx»´*L™JÅ–,ÃÏD!=7ùè `„xþÜ£ÊÓ4¡¯Lð5†­4èÁ‡P5%9™  ¸Æ*!( ™·¬-еÝSŒF–9¥D’Q0Bp$ij  µf`‚®H‰…‚ ‹±‚La8¢ZP¡3ê1Š™3« ÐXˆ(ŽˆH¼(µ•:虜6qA ðÙBÐj±Ý8£yJòÑÈDAOfY¶gY㊛˜a8âi¤”¢WhÉÛì¬mSF‘áJÄ]248!•>, -XR‰…ŠGùÝ ä¾Zl¥ÍUÂóØ£S» 0³ëã,Ð\¼a⣗ǪÅcÄ(øË8]ajä‚­Z)JN#ÕÒJ¥6ÜF ‹_½Þš}ÁÌÃiAe¯Šô¤×Å‹ö‘f&LI Tù‚µ„Ô¤ÄÌ"(E¡x„®Å¨®Gø@´y8‰ìûwÚ±L*çè^ ¢—°ð•ú‚„¦ú¤»øÃEÜ!~¬aÂŒgœá»%7—WUŸ©öõ¤…êbˆlŒ‘1±1‰ ¦Ôm¸Û‘’&(¢cl‚I G#dg\¼Ç²åÎNîË…Þ»Îç¤DIm¤Ù"‘8‘¨¤LM§N&ˆ©*bªBcLDƒŒLi¶äŠ(œM¡41µQAŽJ‰ Œj·Q½î€"{Þ÷W;»×»Üº Þö{Œv=ž÷iî½=¸.º^që;r\w½åîý7Ëä;\Ò*jÕDKÚùÍ+2§ygYkAjR®*Í@Úëç’W»×{·â­Õ_œîðÆcqÑÿ$EdåÉò£#·ß~©À^0…yòÿ…ÒƒÈP¾„(„ÑPkÒ•Ê|z·éëÉË0 F­Úìïw¶}ªgÛ¹í✠g£ÍÑovG¢¦!Ò#–¿NœA&;–´²ˆR^ÊÃÄ%njàš°í¦™Sf3VN‹º»]zq}j«mä\ŸÆâö¾« ùõšÖkZÌ(lut2öü<ÇÑ l÷ëéÀï°ç×€aV{~€½ª¡Pšlr1${÷ïbø0Õò> .TŠ…L*X¥û÷òæxr–t.G™7¬š¿—•¶%Lw*gß§½.ºÄ^·¬ŸWGn¥u;îË—]œÏQ花@÷Þ©NW%ibªHcS½Ë}é,1 ûªóÀ´Š™öOH¼ŽŸyÖw•çD8íé¼îÙ™ =]™~ÏQϬ}–5å2V\k z2޳Iu`Ú唳š4½&xÓk¨<§Ë•-;Á¾é5z¯Öl˜Zg ­jƒÙLµÆÛMÕ©[$’UB±Âž É%ðÛJ™êë뢈Jnîà7Á‹Ò¸Š+Ôͳdáøœ$òì›jú+Quïu³_´ÐQþãþ$$’@~QUU@TΗ;ïÖ¿U€®Ú”S~œ h*£UŠ‚0ij%¯…®´2m›ŒÞÿ]®~f°¢„ÕlB ¤ V"N ët¡Õ(†È]ügiž=wíw]«Gv“¿Žºv¿’Ññä˜{ÞÔ±¡îklÝßçßÕ÷¸_ÔÒ‰÷«¿ÚoÇñ4)#Þø^<{úô_ ‰0©îŽ64Z†ÐÐiÇàÒ·a0ƒâ7š&qù Ä-ÐÚ€§Ê³¾º>ê÷^ì tvåÝÞú{{fºóï<ØI• Øá¹e( ¤¤”à¤JŸ¾­¤µÞZUlNÈxçŸ-£Š[µE§ÅqÇc´òâ Ò!Bif~K-[m‰ŒC»òXg¿×÷’úI}CíÙ_KU­W{ì kèÔ¢ÜY$‡” ¶ûmš’’€îQ@™x`*L\šµUQé˜/BÍ4üšHîä7ý>?°f}‹UrãÒ.çâË»þþ1}ò?Ï ù-¼Jm Ë"&þ²Šþ£úªÇ¾UñÅ”H­ Äçý»¸‚«ŠßtD%€A-mír¥i•¬æS@£ ¥26 \ð2†ÁARSÙïߣÃܳ„µ{LÊ-+#žtãÇætä1‰ü”ƒrÏã.QGâN.bCHEˆh¤fƒPö¨?ñ£¿¡ú(’X:-¯І¦†ƒ FVÍUù…ýýýûß§^z}ƒA\æý3®‹öù ó®¹ò±tÍÕZdPÕØEßû”ç Ïâ`@Ð0Ýn²Bï;½2p–3¼ÉgfÞ²¼uMkÛIÔFÆó1e[×6]¡ŠSÄé^þ9³@\æ‚„¢-ÿßlá*0aK%ï{ÀÍ«ò…0íÒ;ﬓ¿£Ú0g( jô÷3­p÷á;¢¾#œÕØ]æ …j†yE_†Y~Ÿ¢5­O_Øaœ:!ê†1&êÆ~/¿¯§ú<¯r»±]Øšd^l<ÛNF‹¹ïãó(\Ýtx¬T"ðè$&šûîúó‘$e𗨶€჊›èŒÅ¹h%#„:Pd¤+'Õv ÔÖý{øý,úö©YØ£ sçÏÍÏ.¸ãLš+¿áö(þbðÆqùBH„½éFŒXÒLi8 ×ßâ…–¡ Ü)ª£ÆÅ«¾ü<0c0?ΫÅ*#Çù0µphñýT.•öëßÛÛW¸ž-©â­$Ô5­ £5ìñmo"Jï§ 7¿—ÓωÝ`‘·’’(Ë¿ñèæn¡ˆYÂ51!¬¼üa‹ ¼³–ø?‘Ä¥uP‰&?Ù_¡`_ö¢ ³Œ ƒ¢N5Ÿì!§\j ¶úÒ°Ø !(@DHˆË¤@CtŽí%,AwH.ÒîÌ2bÑþ™ÂvÌâæìåÒßç/RYQá¾gž¼ëüÿSìZÖ¦”6áýSšæä£#6{æöï:½á“éud½ÍöúÔAâ)±6›ô&³`cD¼5œ‘p•ñÊMjEËèí²e!ÀÒhx!ÈF¤@º°‹Ž«õ¬HBT­i MõUu{Ýr?\ô:xéÄÛO¢'ª*ÄK3dNHU‘€Í 8¡œ³04˜ÁÙR©Å“$‡Lº¥§­–†ÙbÉ\bÝ£ÊÞ'S0ïPY*3Ãáx”ÆY.¡qž(=¡äÙ+ÔKœ.-ªsRg¢:¬Ildzcò-@à¶Ux‰,özý%.8•c„x,ÂWЉÓ6¬µßí%›[Räoî M æ(™â28Ä#âEU;’HÈ©øÒ69þ^ï|ôœqŽõs-¥A¾ó4–PÙ·Š]/”Øe‚Z)wäRÅ ø·§I,kÌ@ÒìäÂiûÎSsOPLmmÅoVW=rœæÂqan¶ÍVO.ï®íÜ÷±C—¿~.¾Nó£¡<†Žçð~þÿIåI®HøbÓ LÕÉ| #0õ&èn ¢hú’%XØ•–Yh±&‹ bX`ªÀ(IÑúõWÈs°6å[ƒò †‚R%‚áæ‚êŒ®*ogÇ `Y'k× ˜[~ë šûî Cþ/óøhûÅ\xß–rņF,¬vzW;ÑË»”ó:N1W/;IÅ•uhµCLrÅÑlݰ°1YO§ê™Ð4PÈp~Xˬ B-ÓH®(ÎÊÙ¢DI]Ò1  PŠ©_ßZWy÷Çðöˆ7pÎ[‰˜¯ùÝø± ž48) U~" @š ?×递´J*"°Si€vÍ„…ŠÈš#Nµ²è $ŸYÓ¾fsàq™guÐŽÅòXœ¨h”: £!Ö\U R½š‰ ­Xáî–l2¾]ì×;•hs¿O\Ê<øÂbAüWöR³æ=çë_ÜòƒøO - " ª‰ƒsÐp$ CÄfq3«e € 7w?†,·w÷._—ÇŒAÝÜo~ÐÞôgÀùçÑ-»ÃÙä“37¸?+BÜ®]sË®†>‹?9÷ðù(ÊàoÏíA¹õ´TıêPyyåíáÓ˜ß|ÝŽòö¥ò¶0P§Ïåáüp…¶ËËR¨L`qÓ)1™Æ¯rÀDþ ޤ“ž´J,(2±:¨?<ôJiº6a…šï¬>þ…ä"ÏÅ”!P5ï}ïËéûP—ÝÔfbJA¤žeš-<Áñ –ÿËö`^{ß‘û·wñ¿ÓÃ<ë²Ýz}vD‘—$³„ôÊë@!©+‰’è0Ê呟¿f¯éâBWñB(*T õB„=Ýüi¦êeî¿áÍ«Æ!”]-WéB$™+- YšI‰ ü‡@}þah²Ð#F ï)é¥ü ?–(™£Ï˜YhX2ö¿‡×>•lIh¯zTUV9*¶òÒ¯6Ü¼Ýø¡±axdçœtn§H)í$“,„Ÿâ³òAíÿ °í0RX48‹¢Oáö.kdz(ìÝpNAJÂÏZ1£äpТCécIH¬©AÍhÍmwÏ!6¤©$tq·ñþUTl”P/»«m/dxñOE„¹r:®ÉçëöU_rªÂ}ïxw;ìš÷”Û¿bFÊÙ4W  &b/®»7KB4"‚FØY€9*PŒ5Èé“•±^WyÁĺs`9˜î­èìŸ>¼î¢³ŠÍ#¢vøâ*!—U¦Ç½·ÎcÄ8ç¦_º ãNÏ Ô¼Ç û Ââ·„OÁª+90i³Õ[¾ÂÃÞ™¡®ZoDÂ4£}c)Á‡¯£eyr¹ã˲'IñïË݈ȩv¼í›íÂò±ZwØ.8ÇãÝZá<\I!A&c6L¯y féÊ–+ º¥† åe]þèk²pûë¿¡¿‘é‘°Ô ‰ä€ø¤¥)pc9“Fg‰£PчŠk2<ÐbKR*.²¯o)Û ¥Y¥‘O·8à<$`‘Âà&fz¯­cx›šPûРcnŠ6Am‡‡ƒ4=§W‹û `+D‰||)¹©Äy Ôr`ˆJ"(†Ï-ZþGØɦjB$ñ!‹´©Å\XÞ$±Q@X)P¬FJ,M T¸ðR)aʨ5#þ‡å[Ð1þ‚Y2QGÖ¥f~’‹_ò}å¶h?*G=”‚‡ùbÔ½ª°9Òñ8‚ŸCÎñ–@4ŸÖ¸ñ ¿¤Œ„s-§„âf®n€¡"êCËÇÐ'ðE04B±²v´¦«ßçÐÔâús2uM ÌÁ@“ÝU‡¯¸nMWG‡Tµê§5k·)à8!ÇÆŒ¤Ùšy†—´yC(™d¡¦1,6´+,© hÑ¥¨  ´)ˆ%B޲¥pÄ•éçú„Ï·\M•C 8_|cm¶&4mAF”QÝ€ˆ` -hºÔ2Bª 88'KUQÒálâãFIÁ”1)¥ñŠ€0h`ïÄ q|¡®x“aÀ1ìrgÉôýwEJ£W‰!^€¯ˆ>G$Ä`"ù ‹m $bæH—$þ$éyL‰r„J˜66&Á{¹J)Aƒ0 `ÓhF¢ŠACƒýô!@¸ú3÷¾ËÌû÷ëç£!¾ìšÒ¦}Õ5;Wî~ºv^÷ˆÉ~—ž5ö º£˜DûŠI‹"=X´¥,b àÚº‰{$hê |œÆãšÌ¾Ò¥ìëw}]¾7'½Dª² ,Ñ÷.Ju8QÛuvb‚Uè°Ÿ*£ÅpØñ¦}â:Þ%{9e´žTx¡ž& Â)bf°¥E«*…‡½â:ͲW_t”²´Åëb)®‚JŽ=“ë#bQfiAl¢ÉX½6Q;gg1@Øÿ‡Ý¿ý[ˆˆRãf¦#äZA_% Š=©xA” )rMg_\¾ÙÄ]¶½ïi}D¯çÔ.à^JNa¥¡U¡Úc¼nz¯Ö©F椊èv“© À…Ía U­T#„ˬPjeÓ\˜¾ĤQš•b Àº0t•à P,D! Á‹KF¦ÁRU—SX4¦o…¾\A¶2 ©¶\…X¶¾£’uÞP"7ÄØY«²ôÍ”ªN¿Æ|nÚ¢ H–}ŠB‹ G’”/2ÂÈÂÂH H´‰!DBÖ+{ÆÉD!RŠrH•ƒ¥JhÖ+†èÂÚt&6Þ£Â«à º(”ª^DtD1;áÓ1©áñ†š®úÈÄÔRšW”‹¦¹€Œ‚èÕ`°õ¨%$A㸔‰¼Â…Pp, òñ‰P–´i”vHÒŒ)r¼ûy464´$àìﳇÊ”¢ªÙ)ß„æ*×5ªŒx0¬v­Ï/Yˆök}‹\TF…™g€a ]ÎÜ2Éw– ~‚/U®ÓË 4Òm  ÊcÙT aèD# 0¤ÃA;.ËE ‰8²Æ†|•*X(#Ç,|2Þõƒ’1VŠð¸j™ExÏC(-VSRtR'UMÒ©”È%q6*+s™CYe ¥3"A¦4ªŽC"&ý3…"*ð9˜É™b¸¾¸öf^æ¹,õ¼L£w DAooF³ xA‚9R€c…1Bµ©»$ßd¦šžtä¦îåXçWF²!©tµYdÚ†§ï%sbÔE²bÂÉ}øßéQ:(·8x.UËGD&îüªâ¢Àa³ŒÅãù¡' A1Æ5±ŠŽáQLh˜ïZ²¹É#M,˜G2µßPÓe „. h¯}œuéBGeßFûêëÄ3âÆUCÅÈ-i¤µBà‚àÔÛ[didUm“»¼ÔÙ9›ÃA¤«IL GÏáÕáÄ"~Âe• Y%Á‡°ÆÂ4~hµÊ“üèÜq*sLŠÌͨð×)¥™‘'ïÐÙ×ɤÉIù{)Œð®ÏÖ>*Å@Ó >„§ƒdR˜`“#ÆÁi5Ìãq8,‰¤ÉªŠ¦ðŒBÙÒ¤Å3†iIÊ²È¹Š³:´Ð›Ç¥!c*‡¬%·ù÷Û~Ý»ýÖk{ÌÝÃõä]ú=æc8Î:¯»:Ô©¼f¶áÿ·’2‘Dj Ñ:—€YI>p =Ad+âÚ¯‘KIf‡9÷¶tôçqs·<ç[žž‹ŸC„ˬZù\§Üioؼi$ª2pÎUs‡-€Áœ&):ÖǨÓÄC wP…ÔÍq˜Y…/rN†Œ fÉÁÖhiáMÀqܽrjnmC š4ÛŇ»ï¬{èJQâ‡ãH n AÃ08Ü¢ã xJõq›*ÑeØ3‘ìÿMÌ™õœW{Ï_ã"z"à›6µé{0½N Ó©HËæBÚڊ픩+RƒýQR%Bdžý%“éã-±ÊM i¤ÓH‘¡9„YZ[,bÖÅv,œª6«I¥˜ ”j¹lB­©Ô#B¨¦+LWPkB‘¤CB$`5°oi q&%€0 …ÓBšw)¦Ë¿ñGÇÞãÀÒlZ@òϤ«N((xX‘iZ<°²lIŒJF ¡iâ¨í8ªzHm ñzQž³•Zi&Í2Š@eÄ8ô—2ÏPÎ5xÈ9E•lïÉ_A8fÏ$‚Yó†ÇìTeskP¾ Æ1žf H©Ž"" ˆpp3ÅZµx¬Ã¬<*ô+…în¸íÛV o8Sâ7§Û†Jiuowl‘Œr®¥sÓ’M·’,Þ!l@. ÂÓ¥"n½G åV‘UUI£ T,ëŽ\Ygv!ÀƤQ3‚å&¼@X1Ž¥q&¥™sK¼±.¤¥‡6—©Œ£ÃšYJ4ò£t'ù* ¼4ã~ÊWòÉ$ùÂC[ãò©*!Ã7ì¡X`Â)N¬JM¢zƒÂ–‡ëñʤ–D«LE¡;âN™ež‘’ì¶Xïl’ƒ£d²ROQ@zè((2F¢Ž D’dgò1·j‡©¯Oß@-nØkø‚?\!LR  ÷èU‹€„4¬”êJa '"i¶1ÑtH¾Õ°&Už(ÙÓÇWöÛÊ8®†h}²c05¨hè5ÇÖQXÑG”$àôú™ÎI-l™S)`}1IjÅ÷Ëè0+²®“½ K*!\ŸY:@±4ÀQ‰Â%ÊöC€¥ž2ÖUסZ0•AŽËÚ|®¹ :wãà"öÑNgøJ+¶òìØöb<õЮf3{]Ýlþßxn¼žªœÌçÅA²ê ¸4Ræ ìwÌ*eÊEæ]abQÉ‘ñæ_YÐ,Vkt÷ Ø®˜ËÙ™‡”YddÑ„Naª ™Á=Ú³8•¸x²´¢£”frËŠªÚ¢p¬ £š4U•Á>aÁF/¬§)¤Î4³½„!–LI¨!pÎ^å{é5äñˆÎ4/eLÖHgWo™žQgwOöV|,ËŽ_Ö(–ÏÊ-Ì$ŽA+òÁTÕùôþžäDÑì)´óQ¹»‚DŒN*O¦á»!$pœ&lÀŠ•2ÐØÛtâÓG _ÖŠi%ø…ºžƒßb{í¶µkCd&Ú!¸#Þ+½îä­s4"âdìXe8a¼TšE¤ˆCI¦ $Ó"“l_ðf¬eõ™†.þÒõ¯§é?€i™T×R>q Jîâxa¤ü¼™k’•Ð0˜º/ƒ%m©‹“ â¹²wHµ×wŠfÐ¥w+‚³r‘©|8 x<­p'Áín  ›¸R›!4K‚!4lbTY.²,(…œ0ª)4ëªm²(™žGÚ²Æ0Õwí2ÂÃ(*šléD|«Ã8|< 4)$*öÆvDÈ©(ì ”&¥¦ò¦Å¾ŠmrC©‰ŠñYÓô ùiºyp°z/X5+W‰%ƒF.9)'Öàî4„›dví2‚hl¡”†òˬ!ƒ-àE4‰kvˆ[Bß¶Ï$W›N"¨¸.þE²ÍÔ„9pB>ˆO¤Ä‹ ³)L©mw †9ld«{÷ £d;…CG}1ôe2‰åµ;(a nJƒD5R²¢z¿{5ݼ°ä±BwdY`ÄZýŒ’TD¥a%$* xtª-$bNVx¢ÁUÒƒ0ʑՉ„ÅMwKµ@ÒOÃÀÏ9°ÂŒ‘¡•#¦yYD¯ÅÈK0˜Æž´x5/#M9Xn«'ë–<4üt•ñ•zi °òŠÆ ¶†‚þ& DdÓA‘9õÓc Qñg/|ÄnÙ9‘·&ÀCÎ"´_¶1ƒŸÎXh h^KJ\˜ÀIÿ$ê›?v ð}WgŸqµ~ï\x¸î³¯³’›Ø^¤Ñès&‘„Xg‹À`XÕ#“\ŽU&jkuë…KÀZäÓ©ŒêÒæwEÙšÎÈUmʒβI(=µ‡†T¼]¾/éë#I“kŒ!J¤µz§ ]äqåôø'H6õdY<¥a¥oS<³0­Vz)‹cÈ—kÚŒR§WÕMøÚ²7+±µ¤âv³-†º{=Æ^pû†o§‰ÍP·+:÷Á«x£eA¬ðÍxŸtnøå†Á§ôš)yÁƒ[§KƪuUûĘJõºC,h™ĸ¸¥”qu,Çm%'µ‚.d:áÛ›¸îo×€Í[¼Il!‡ @‘t]Õ¤ÁÞe‘t]±\ )‹òËÙÈ>† ^á2’›¡t`ñR‚û ºF”¤Ô'!ëXŠhâBønN¯Y‹“¶Nd¨4|‰¡‘õíϋ𨉯ݽIP¤ª¦MdÐpäò-×d³•©`û¡*P ¬R q¨P¾BòXF•îšåw tÀ¨Ói9Héb1"†ÈP•²Yh$ `àùÓ}IÁ|± JUL݇þ+# œåÇVìî*˱ÙkàȱÀDéI ðŠù*¨ÅCeuZ_Yú|ÜÅ#™ñÓƒ_r‰³öûƒ³T8C^_x_Ê–Y$#òƒmThÊ_*†ž¨DæôÕ“I2ÑÙ#3-îë!â#1XÙº)a 3* îžÌ¶2UbdÇ­ÒíHðH¥TUuˆãã£YÒÔ»úoLŒ’¡ÅÝZtÑjÙ-J' eÒƒ/!(²õ’ªÅŽžcÁ!V„2Á;ƒÂeÁ+èVxÚK¢“Nú좮LáÝüñÌAF˜ÄÖJf‚†:D¹I6š¢b“"®ˆŽ¿˜ÌIPYP5v)±Q*B ÈJ¨UeA [¦ÆÌIx¹Ùï ¥HáØüñëvÄBæuZºU0z@ÊQŽ¢MЉªtJ³ÖtŽÂPqQþJ£Þq ®¨Û‡¢ö¼ÊÎxÍ›¤Y™Ð|ÂRe$}"B"ÉaŠ-g| TžGoK}5+Ó¥5é¿Mr=8c<2¢–2’ÊbË ‘§áÚ%;Ãõ—w¥©•®ƒŠ,û^EÉ¿»—ég]ÛE[Ó·7³¶¯}·÷ü;|<½„‹–ß»8Nö'‹ãlžY„™`yÿV9RzZõ þ(ªYnæÝi-»WYºÑQYÑ"¡‚Z…¨²1,bÊ•¥º¨­2ÉbÓ6–¥f©ù@ub"”}¶íÓÀó¯_ëÿ¯9oãëʯ®\ëÏŽTßÏÓ×½Hµ"Ù>¯³ìŒ*–¢©»kûš¿?Íû»_´àÚ¸€* l!¶¶ÛjþôHúx||o"Hóú|Ú=¸ÿ³YÉÇÕ—GÎüOCoŸ¸”KŸ^qóg©²Ï3ø];@¼}îøâŒ5Ûê¶Š ÂçIMÓ\Hï}6a”&¸DD(=å{m—ÏÑ«íf^½1•ã=žt¯éû¼¤…¤4µ-¿UK\¬V®ZédªkþKÈYšSÊDš¿ÊíY¥M«l©-Ú-6×Í®©*ê>9‹hØ«rѵQº\åiÝr«EW.Z£jæ¹V¹bÖÜÚmÍ­{2Ô%IQ©%,¶ZT¥¼®’Úêd¶’‰EJÆ#QdJªYIEQj›6VËbí–좊ԨQI«îÃJ’Èn"]¾n·+uMÌEL¬U™VKEKHRÊ“JU-©×[©¬E€•²ÚISFͦڔ©jZE ,«J±"•%ŸIöˆWÏíñû·øq[~þñ80ŽŸtª¡ñÛßÏêG*¾$y÷~gKù~މ_—¦¸–»uÏ|ʽönh?ŠsR-•µŒÌ²e`É#›K¤iS$Ȭ-UYiUÒ„Ì È¬YCéSCQJÞ.‰÷G§ËoLÏÑóõß}³vÜý¹ûµä—¢Œ&UGzøR.iyùð^ëðïÌŠòÊìGn6¥ôü]‡çŸ?%  ø@gª?u§¹{/@ X¬lïÛ3îݤmvç[»ó½œï(Í’/šþ'ý6üïˆOwê½øêÕïW Õü6ù|îÁ™ °“3&³4†!…ˆ¤4Œ¤È…JH ’;5LŒ @Ô>ŸPKäq=üp«žT³›CÉ' «¤¸ÅmŠÌÁ0Å –õ\å™ôøn*êvÄk椭cãí¤zù|~2RûôÓ¯ÖE8'ýLicV•ò?ã!ý–ïõge'X8ÍSòÁ­ßf,±>Ö²£ÃLÁ”ÄceM$Â-ºeeKRL²¥–U4´–²V™Z¤…JÙUgðP˜ÑK21RF~GŸ³çöùoíœ{îß-af´µkTñ_‹\ý¾=>K²¢" ‚ gÙðâ¹å=uöÍåt%غ)´3îȈ ”D'¢½ "]ù¨ÚúUÇ]mÙžu·œ…^L©†híÆqïÍùx‚wjf‚°0R´k_¯ ã˜ ÃD•ééã¯ëäåõxìLcà öÚ—E)h¶’’Ù¥.Õ]WKeTµûk ÐQ  WU”µÔ§aªê¦%C"“EP°©•,Ì21¿-+@Çè—‡æ¾ß¯¹áŸiÊ$]G׫·Z‰ø_Ç3,Ë&fÒ$2ˆL„™¬ÆLÌ5ëú?œÏ··.½*wÏëóÚ:¹Båøj¸ã®µRe‡Ovmöûq:Ý(YÐí¸^êb’Ê$ 4œ4þl˜ÃëEᵴã+ %‰eEb9’}ßß½üÙöãöýÿÃ.¿–gãöÁ_\ì§²ŸƒLÌ4´bañÕßæú×EÕÜ¿ÙàìÍ|¾‚=jo,Ù}x×*ûöû·=Q‘åñûŽÑÖ²±‰þie†1,±L–+ßcJ•ƒ1XÃ5ùVÚ¦®Úiml’Ø©bf)Š16°hÂÈĬS!Öþµ÷˼¯f'¤øòhÑ=yÖz_dÜ'1`•&3Á†J‹%Cí&áAö‹­VŠŒÁ*;øô×ʼc’;‘!ó׎øá¬ç?+šùñ‘åÎNÔí}÷’;zgÛÇSÑz²ú²M¬ïü®Ò/»M•L߬º¨­»nêÝmÚ’Z*¥¬¶Å›-•-Ò×$¢’~–ˆ¤&k[úU-z•©Vekå*å¶TVK5–Ù­4h¢Øª]utÛY–‹Y´±Eeªjaie·ii·[­6—]vL”Ú–ˆÄ¦)“1jUF±)¬,I÷HˆéÏJ¿¾<“„@¾……;……ñÛ¿µÈ^±Ã”}¼qêóëù‰7öõë®×áÛÞG’z¸MGöV¶Úß+Õ½M’¬•ù¶¹ØY2Lå¬,K"ÉB¿Rò•Ÿò8ß·%çSÜü*ô‡ïßî—°Ù:)%BŽC’@B"V39.3çðu½9ß~ÍßN}km§—Æ‚2WŸŠ&ä]©>«ùéWè‹ýŽB! ÙÍ/öÝ[©je³zëjéi)[·Zin²ÙdË+mJU’ (€ˆ€"oºûÉ:㯹–U>V¬¾#˯ÀžÞtÕ·®7‹G{k N€€U  $’I$I%«*ËSYR…#Ú3ÛãÛÓJ²Õ°«ËmX¾d„ü'Ç|÷öç\d’pÒ×-ð¼|Väñ¿7G0øÛl^ë…‹åRk»[ ”^8šøß§§}|~^¼ú>¢ŠJe”VÕ4Í%´ÙVKRQ(û.$³*ÔÄ´Š¥?yb¤Ô©ŠJE•ŒTÂFƒ%2¡bŒEXÄ1,ŒÄT"O’:¥9zãDxñãÄÀîÕ{Tw¶FÁ¥Š#ÝŒ"Ò‘”˜‰*-@,ˆƒ<º@§ìDAkíõûJ]ÂepˆêÞXu¾Í$WãyD@ÞÙ`…ñã!,.Uó¸×líàyÊÅðjhf‹"Á‰TŠ(¬a)—c11ÊÑkwcY(Bí¶YX´PtðÀ{暦9ާz|z¬qY¡³zŠ=:úžó#Nd'Íœã½õǰ‡‹ztæ\&¾Ó^ÞW'ž¥~åc£çËfçÃ^ñ"ݯnYÈüDªY/}Ù4>¶±¢±)%R-LRa* dÆICaFÉšƒ)12›VŒÉ01% %)*©!*  €<§Ç/C<ßœs4øíAçÞÒ§ÛòãYçÐ’ÕVE[íåÃËË·§,é—>µª@D<‘?K""ÿ"ùËŠmky»/Pùüæ¼úëãÛ}ïׯÂ#è’YSñË1#"ŠR§ÔŒhŒ“@ÑUªÚѦ!e“5eD˜Ñj[JW®½{¥iE²ËbMš¶½lÕÄ•GÕûyý¿/³öÍçÇåË=“Щç÷!¶ÐHñžócâ€(àÙ•JÆêC©¸QbOrfƒó|ªMÙLb¢I**,¶¨³ð’wúü>§ÏðÞùÖ÷í~Îô§£?5ØËutzö{z· ªËJ D½xñ\ @õšuÅ1zŠ·0íD¶ð艳šq$[•€Ðèôznï· 9‚3h6ÔjÛ–*¿^櫬d[&ERR¤´‹Œ¥– ¨±Yƒ¦*/±VŒ%RMUS)j2*FQle„½ªÆá­­Í_6¼Ï/‡Ãoñùù{><æ¾ÿ»žÛߋ۷ÓÜŸ/œ´±1(”¤§T¹ŠU#]¨ÔÜ éç ]¬€3üa’‘–áP qˆe@èPBü;ñšÐE*T࣮lÄ’I!úôîÈ"ØôçÇ‚‰â˜9€Ðö%ERŸ€µˆe1bbL Y$2)… Á”M$ËjêjRZeŠee*-³ ©- Y%%\0b¢Æ•I¡²6U¹cbc ‰,‹5#0*EKK Uˆ›skb5Y©[QZ™¶×T´“fÙ,¥v´ê6JͶFbÖÕKBÄÊ™0µLF•Œ³ ²²ZajŒß?o=yg®½>š×¶~™Æüyîø ¿ÛŸz ñP¥! q弄Dîú>¨n»(ÐðóNdGt)¥ð°_©¬ûêÆ‹vÕh½NmòÙúåÁçuOc}7û)Žg¸°à‘ÆìÅd•ÜxÁŠ`ʱ™,V0ýL£„ˆÛÒ¹ú3ÓïóçðïÀ_>ùs)V¤–Žöb?t7aù³ôH³éé×(–^ŸO]èì0Å“3,§†fœ e²ÊÙµ-oæÛKv•*S*½W]nÒ×vçWA¤µ™’ªÑeU5X&&BÌC ­£mQZ65iR­Õ+Zê[b¶î¹wu;ºtî%)d@9ÍÈwBÍ–¿vÿGõŸÇ×·¿_\åõ{³<'’}V-;>²þN¿×ÍùÔ@Áör€ B„ŠSôXB¥D’=Ë7ãmœ~¿Féõaeaª˜ŒÄÖ–•R™#Pd¥Êù¤ÒMEB©52âK*b¡Jb#DÄi…6,¢ý&[[&†-Ókç6‰i$³JCeŠ*•“ LbZÌŠ1–±ŒAR‰L©R¬Ùf¸Ûù®õ¥–ÊÞÆŒ'V®Yƒu5ÕMX~êTùâŽFžî¶Ô•äx²ýþÓþ[Τ;T8°’¾²þŽÎ{fë’õ™æµ¡_!ÙX¢"%"©ð±b†ÔT®-ã1cêêÀ­WGë\êã¨ßÑØ~ú¯2B p8Q­›w[„[êôåËç„}mS60 e)‰ƒîÿŒþOåý /TÏïB F“Dhc?ÕþËÌ(y˜±¿8â®+ÐöŸê[_›#ùѳÞrW¹¦¯Ó ‡û½Þ\å=;Ÿ$‘ÑFät#ʈ°¶ÉNŸÄŸÃþiý~µ|7U.Ï™T]*M¯#+î?ê¤Qÿ>Ù“»É…ñ+§lgM5¯óqüÈzŽz¿÷_q%Þvy°b=ë‘x_ö=Üt)ª—JOÌ`:§²Õ¹Ñ¤ÁK™,ŸúJÆEe\SQ£M•†I–OEÅKÛCºüߺþÝäým.ôþÞñ'™íUî§¢ÄÅ?æ?/øýuþÿDûÙ}šÿõÉ»i—¶ZÈ«HÔ¦ÒR•v²»kÅé÷zdÌL«)‘£C¥æ¿àýÇÇŸé˜dÓ¦çK¹ªmSñY•›“ùu\HXßöHr–ƒÞz0Ùz=E< §èaÁî`ÿ!*–WæÂ½¯¢ÂÆ  ý1ÍÓôaŒ|ûÁ’úBÒ)ö?å–YVVI™UYa’˜d+ÔïÕÎ+éW(‡)û-2œÎGÑ7NK–† –¿ŠÊ¾¥~ÍøDL1$•K)&dL2¦2˜È2Ä´m4²U²j5Š4U˜ %´IQQl "[”Pµd´k*Z¢¥•ªkkfŬ٤¦Ê³6Ö¢µ©­¥¦Óm¥%EŒÚÓm5R¦±%µY‚0Q“2Q6Ò@b”’%šbÐÃCI™ ™ ƒ’RPDÈÄRPbJD€ÈŠ0AAFHˆ3 „bD1‰0J$c1$&Š I ˆ"L$`‹Œ„ÉIˆI‰)“"1 €#F@ÌBFHˆ˜DD™’dˆ !2˜‚šYC$ËU,àí.)lMæb§TkTŸXpt{‰}“s“C¤žõÖ+þ…·¯“ì}¾Ÿé–ãù»ØÅïüòZÅfG Ñê}Xu†Y>[>!ðo%ðÞŸËö‡ Ñ™áÎ%ìï^I•z´¼¤)±¶æ§“ïb¾Ã±Ýy=¸ô3Y‹NÉåG"ô†}]–ŸÁ9;žÇ£Ë›e²[Ú´¶Ù ý?Eû_­¸Zy¢Rw3ÞØÒy¯HxO“öº0|¡÷éøzÞR¾ãÚƒ˜ò;o¼J¥×õK«Ü{G¤U|3üXn•ýÿvÿ?¿gîïn¹vï;ïÙÙØïÌ' ‹Ü_cà¸ÅŒXÂ;Yʇ£ßUyí&bTß§¥>ÆCŠW¡Í÷Ì}ß°ª}ƒà˜0Íøž÷ÄÃ0ÈcMƒCI&•¯àÖ62(Ác$»™R™cJ‰.DDÃi1Ä2îìIRV•Ú²m«-úœÇïGM:YFÒ`âÚ÷Ì™–d¡†̪Y}ª²[lª,,Û^NÚ[t­Ó&Ý5ÚfbÖÌÛY2ÊÚæÖém¦ÒÖÆ„MUZ•5–kÔ–’²Z²–Ú• Ф™cY0˜¤†šœ(¨˜M Fϧ»¼YÉÎÄ:®EÍÒH¹Ê,†õ~^¼Ñ¤¢ wpŒ|»±D ˆ¨0Is] LS#!¢wn½Ý>Úmm»m5«i¶dŠ~ú¢µS•ÿØJ¥ü§+÷Þ¬“iOâötÿ+ý“›þ¼Ÿˆ¥¼¯wo€:?¨Q ±qc‰CÒÏþ wU€:¸pâláic>‡ãrÏ' Vé“ô&lœ}œù&âmVþÄØ¨ÔeñL÷]5ΑŸnä^ëšõÕÈ»¼òÇóÓ7µb®³6©¥7öf®ì·‹YjÜ¥]¸™ IwÄa5*i*Y©BÑ L‘%Oäá­8JTˆ’*T±Å¥ñt¾Ó7m¦£|ôªòá³e¡6{yJQNU%æöÿ?\qsÖO»î}‡?9íKjU²Ú¿«®ÓBÓ7Åv/Ns…$ʲڲÎMÔ‘Ri¦ÛMm=&¶ÄÅŠ¸rsYÆgï897Ë<µJù¿‹çUû×r"‰õ„\º]9Äå7ìw§N»»³¥+ºî›³;{½…©RþFÅxÊÈö#F–w±S-¿IL×a3(SÕRÒ8_°ykÊ aâÕŠŠ@ÎC(4¤‘ऴVlô1JGrm³Ñä{9&窜^Oƒu8/­^’¢›.bU/– ©*–G½IvÛ1—–µ¥RÜd¶Gλw]/;{»—/]våî»Ñzî¯×7|·T žòøÝ ‹®×dÔ•ò–ïz×#bÞa¾ÔjL­Zš1¼¥~ÈšM$P¨ªª76I7 L¡“wI©*22¨C¯^«¶·7[tŠ iM~&¨GÄʉ!ˆ.…üÖ+#"¢«R£…–C&Ó Ád8v0É`âdß$榚; 2.£9&tlÊá_l°ÞeYœæ•rwSGz.µSl—%Ž.¦,0Œî?Ù¬Æd蜜OÑÁa]‰èìÅw”2zÔ•^(ójú’DÎÞ’÷ïtóvST1K,YcTîæ„IM"SKi»ºŒzë^)íšÝ]«ÒÛÙ ª‘¤ÆR1=4MlŠao6YZZ¦ÒuÊÙ8njU³þ$‘>°:â7á׌úÖ\ÌÅ–Â’xÅÌšè“øš’,0*Œ‰QeE– H‹# ¦Y#¬5 µ*Y¤É8éÖjnÆ–Yl´ÜÝ4˜îãï+ëÝbWºßóc øØ-Ò>;ó‹ÝЅݺTQ¢çÏ]&ø¹ñWJwt¨$Ów O‹»µÙJëµÏŽy¹Ë©pÝuÕ·Ï[•öm]%ó×79ÝÝ×@¤»­—iÆadÝ$ÅSJ‰…8±8Fd¥c dŒF,%°ªƒ&)¤ÓRÒmlÊe9ÖÅ̪/¸J¥Óíòím%‘¹Õ{7Ó1ÑS¥IŒL§uÌlc»IED Ü≔YLøü 4(¢¨*\FÔnš‚¢)¨iXÓTòX¨åQÃ2Zs <‡PŒo`æn¢ñ¹ÅȨjO¬Z;Zº^(˜fí‘øˆLtpc–•]jË*•7¶KgMÜéB–ѰÅи•÷ .†W%\}+Êÿ [±Œr9<”•ú÷×J‘|äT^1&Tµ e[º¬•}–ßƒÈÆÆŠ5ø¶æ±A©6ÆÔhµwvÄC?!Ñ*Æ#††\S4ØúØ`l,S“’ØäâçpÒè[4®¤èŽ“'®þkîj'w”I¸Å•Š• W&à D­›SÔ“ü¢T㟆BJ$ã2åÃRRÅèíw0¢RwQ¸– Õ'(Ò8xpèió·1d$jH8Éð|ƒïøUʯ)øGròSîy{÷{xR®2u¥Š°ÿÁÚFp6ÿ¶M¢©Š¥T²Ä©ZNLIÁdàèq:([+dáoÞjs>›fV$ùîñâ¹k®Û ¿ù7Õm¼Kä¶gÑÇhÒ¹æI ‡"¶¦,-ÓM3M4.Cmª÷©eàù’•ûŸ¦²ÿ}ºïw`™dÒXUµhcÈ”©jbâ 0ÈŸI#v òåÿ-}UT¯=Ì>¾›þHý%±>»cÕÈåßâ1õkSôE$›m4048Z"~J¾~Ǿ©ïy¡—9R²CXxgå{­Õêï’¯«cƒ>´'V‘+ ŒGÄ‘÷Ѫ©GWÇ%$½éöÕ*‘ŸUHÅ5{”îxG²š\ž:V¯£¿®§£kñ§Å+_ÔˆäþžgïjÀ䥇åF“ÚÙ¨ju.Nî᳓fåÎx†äôŽî%ŽŠðéÞNɸp{½í©‡}ã{î5µªÆéÆØ¢L@s—wt:OGçz^dʶB´y«U[§#ÖIÙê­Û,¦‰éÙj»âÚš1ƒ 1lW{cFJÊí^'$æáÉÊæÛ‹jolñTW&„ª]ê!ŠL¨ è¢X´$X¦IJ1(KòèÖàww÷­]Ãùíä?CsÐëë]#ÝljÕ£S±au£oÞjþÌcÙGôpþ¯¥,¥˜.£äãfÜ/èw;-/úHã–c,ȼ§§…ïŽf¯¿]À…¨­´ $?ëEOò¯Ì؃(2ð«r×MãêîÐèõÙsV_Èñ[±Œ7Eäa{ñÑ•)çæg3šž(ŽoL¬c,,™NRÊø6dîk¾_hû2,±ê—ÁyäÍŽcûÓ³gJý¶Ûùí÷üÚÑ"†mfÓoMùÛêùµ×ðaF Ñ´mo«å®©Îb݋ؗÔþ,_ÁWÑö[©ÊñÒ̵SâÌað~T8SÜy9ž·Ñ…Sƒaàüd#žìFRdUŠ•ÂTçÒÕ«m²:9H›w I>f¢vB%#%îvÍZ‹-º¢LT‰UY bMÁ>ëRŸ_åU^[j´ÚÙµ6SDà©É-ÊV:Hæc“a^dLP¼Ï¯¿á­Y…˜ŸNL)éðwœ/òý^šºûñ9þwóÚƒ†ÔG#|Ñ’ãX³Ìon¡«ÕèÁ¸—³`ÓcFqk[ÿ¯¡"éäê®å²| É/5 èxÉÅ¢€jR¥eÖÚuWÝWrê1Èxå™¼è® °àm{²l~•ù9Ò/Ì2}Ų)Þ¿t§áEôyþïwKXÌ|üøf±»M›×º“_¬ðü–Ïyö+%t课ýõ™Œ“±•a Ç›æÿù¸s·¯Í|Yéi¥¥ÊŽýRä—iéë~Œm™ŠÌ[EUºc_-Í·[ã"ÉN8DXøtl÷+ÉÜý‘ô‹ºrXÌÌŋ꼚_¨ÿ§2Ÿ{õ¹_‹ aÚü©þÞ9æ!s¢‰aìHܸ>{'GÈùœØò†è{­ÝkÃìb±Œ~·¸ÿ-fixeˆJ€7…çM»ó·¸nDÞocâ‹H²û¥¦ŠUŒJêèaeS(4 ü×}ß¼{çr™Pã5t{*ƒº(Ÿ7k»èEÚ¦vD˜v…n­ûd±+l²ÆÉ‘Õ‹SÙ³O'GklW#Ã8ª#¥ˆ–âˆ0íÐL4EE ˆY—kØûn§Eë5{IÒ®ËL½0ñS-¡"’­*RšcH‘[“ZITÓ•›„HT—Ä[ä±³Ö‘Ínж´ÝTiPã"úoâéb±A´Òâ´D1_Ð’G˜ÂÛj*iKJªýd¤ûxº@‘®2Ä%i¥¶›-14±i×i¤±4cf"û²Wkš~< dtnâ=eÜ(mªê”ÿKM¶ÞÊÊØªœüNZ:äÎóɽÙð†ÎÆ1‹ž;hÃÃÁñG~<`Ê^û Ç×?#Ú}?n1´þ¦þ0Ùmxp›¢6gÑÆþô8Œüq³¯a´¶%MS"¹GJœ„ITwüÌiïN(ÍF®¡FšoãêÜw6\KS¤Ô˜¬lÏ´©X¯ã‰MüV m¨ùpO®`•+½ºö«M‰‰t¸ªÆÊÙ´ Z¨¢£Z]!»_qí*Þâ‰Ìµñð´m%¤=ÒF= ƒO‰:ÚºTÆÄæw½‹D“¾úäÜdÑ÷ÌÖw!ft®·±'¨#H®-ܱ6˜¥Þðï/*ž$rò«,“\1ŒVR·$êÚæÊˆè¾\¶ª¥­1í¦L\N–b•ÃsÄèæyq:<)YTét”¦£%YíïÓ†›¼& “!ޤš-—œe8Nì^w³u½ló5t6??&±_ø¬•áƒKàÕþŽ>yjtie5jNµ»†Õ¦F&crÅÞñsN#¿§9¦b[jË=šYG.ꪜ&¬¾Õêô”»…+írÍö½ f”“’rƒ–Þ e*dŒ Ž-%²)`Q³‘¬µ}^ŽÛK³)Řֿ~óÐÑÂT‘ʬøR ü pˆ,%‰žLK…ä¾=Jšj»´t‹¡½ââ»¶Ž¹t›.w„òW9Ðâ`éhjyZ×S»µ¹š§Í±tÁf†žF4ö<OW¯V4ËLK¤Ð«Ï+‘Â{³¯K×Vø6°j›©Æ¢«nrÛu+knë&njFÒèàw1ÂÊ¢Ç=.|—wÅšòòwmÄDA~Ÿb½¯jü©dqëdª”°×¯)ɃY¤ãÏ‚šæ¹Ì[d”±-bz4ñ§³5¢ªÙ¶+mÃh=é$“¤ý¿­¹}Š`¦˜~çFÒw=»E«Ko yø¸ÙÃMðâ8“‡Ì¨ê&ŸCÙsb×ä>ÅÃ…WeÅýïcHå¼L'CÁÐ:Ëe¼||wòÌO5àÉÕƒ2¯êy?^£›È½Y‹•¤}‡eÒô9¿îO'Ý-Eûß›ÞðŸåñ½c»,eæm.ŽMŠãy¦8î}†çšù3îç噎ÕÙÍ|è¢[ž1ÔÊ|Cç?WXóûó'^ÍΫ³²WÁ³ù³‚’ƒæ'ìùï|úúþ¯Õ½eIGäŸ3×߯¤´páH¯×UÿÕËDK¹5¶CZbúnxâÞ»TZæ1 ßyÇbŠ#Õß·\."ô0Ù£‹Ñ°U_Öƒ¤ q–J…ì:}AŸZ7^\‰_ïËÄ7i£Áðið¾!–Œ(CNÊP¤_‡»ÎÆ;]|xr¹²Ë{ŠÆÎ³ Y2eccêqt’»ção4/ß5juór9£ÕÞ“áWŠ(–ÎwQÈD£ƒË•+º'ÏBýí¯\˜¶Õ[qlxGàá,1'?{Ós ÝL>¿cò§Ä÷𻫭OcÑê^;&ÜId‡ƒ×ï_Z¶ÇÛ2c&5<¥ôVÔj-DE±mU -µ²IRŠ$¨Rk>º‰|¢<…Šùòo¨m=N#ƒó2W¥Gi:Z|’¦ÅnDw~›Ög—Y"ËȯtêüX§.ùî¾uÇÆò×—6i…Å4Å+&ŠhÒµÛmDäbø>âº_Tw4W©’ûGg 8½n "ækGÕë½OVkm¦Ós—Q<ŽðäÎ ŽRv=ìj¸{³’“åO˜hSÑXÇ3ÁÙ¦ïCŸf3'ÜË=$rz9ê̼޴‘/ Ü`õÖ¦YF^”ðì­®2¸Ömû·\ÎJ=ÿVf28ʳú#ß3Ü;ö6iЧàÄ•K*L$º«Ùoª¸J¨éã_}–WÄ9£ðÓâ?“0J¥³ã‰ŸC.!O”¥u&GâQr8<ÜÎíVŒ59UîSÑÄäèv'Ö-‹çV*ÚÉ‘åPûÝ;.ŠEcêë.cˆþ/¤>&ýy{~ƒÕ°bȵ-Þ-¾} ˜d¶ÝzzØ$}Gß>Tø.ß|¤}·ßŒ~†M4´™äÈøOSèýOCß;ׇײæKõ¾ÉÐ9—ä|#ü¹)æO°ùéÀýCìVª¯ÔÊ¿#"| ø)ìT¯\²¨¬œÃø½‰ìŸ©[ÒyŸ›÷ùñ©Ñ|ŽEà\'Â|ËþÆÉû¾ðà³ó^vm›äŲ‚²bÊîÎ*q˜–êÃ.æº.ëªë·MµülnµhÓ3—ÇȽ ­‚¶‹UFÛ•Õ6Ñ+tµòõ‰ª£+‹ŒLÙ¸ÒlfÆ+§V~G\¨œ•~ªŽÿ'ݽ‰ÒN_eU=*¬²Ãd#õ„zïÓî5§+™ƒn²¦Zª©n•ŠÓ½ÓMÍähiƒKŠÔdd‹ Í+Bš¬Ì2$:aÏ2NÇ/°É)>Æt˜“úѧñ¿Ö&BWY²ì»VÇ•7w°`ÕRñ²/2œ1 -Y*ÛV†”§—øÄ‰7$÷})e `³ ¡©k:嬭2#“+Û-{Û]o{¶·-cncnë®slc”Ô¼¶Úòض‹Ê¼½-nmt³*îíʹh­æÚ  «™#jö•¼‰µÅû7Ïy|”m¯ $›H˜ë$¶MÍ`ÚÚÝHdd†"¤È’“J1RR…MN愘²°Æ°‘“­&»Ðª.‹Ãî6ð“¡‘Ù–ÛlìÄ˾°²ÛŒ4Ë0ÒÜ–µ*f–Á詆ѓh¢n± FªÐ¾)¶¹nº®ˆ©ƒCîé¤cÎåyÈ’ÕÒK—In𝗩ÝËi^êæ»º×t\•͸ÛM•©1d™IZ,“ ,J1Ue.ÚmjpS‚ªU+}Y[_,–ÉlÍ•»7ef–1yK¡ss®q‡#TfeŠq`ÃÚEUV$éê26!ìÏ2mG÷lÐt椹4„ÿ5X7‰ˆÆCÐrÙ¦ÑçEø7Ó‡R¬Ö4Œ{”Ò{TK®ÇdŽ ñßuù _¥lÚYe™r÷v«…ΗÝÝvs\“pë‘ëtºb8T¥ Ó>ëó¦[FØÙ)*I6áRɆ%a0ÊÕF%I)QªZe`eV1heU\לŸ±õY;£‚t(QIP¤EdÃ!“i©"oãäØÔÕš¥¬²[…=·pË-¸fÛ‰Ãn¶YÇ96óîÈ4ãÒÕ²è©âª¬”Éøò礚¦$•2>Sâ~5–vÞMi‡¥«9oVò»zTõfM²m§.[M?ÈðõM)j­ª¥ KüŸ£ÞOÐ þ Kb Z¥,,‘”˜¤¼GgÞ´å3åí‹[_<*þÀtÄÏùFYvÕv1ʰø¸¢«åV3Èá•SçòÉ0õ>ŒŠG™’¬‹McÆ-–ÜÉñZª±W1q,Íîmo¢¤­¦%œFãSSìK!§Ø=µbĶÙ,¹La“"Ã!';»›¢_3õlqdKH‹f2b"Ùò¬£K)£6ËL$ÃÀj“ÚÙhÌ¡ÜÌ’O?,‘9æ«ódÅb™ÈÒm ìOÙ6wq' mÓ'ÞCàÇÿ¢‡bÉ1ÓÕåÊŸÖ5wíÞ½æ‘ZX^õ4J¾¶aŒ¬˜aßõ°‰œÒs|8£2®¹ç¶mµ=UÐùIï+–›¸håW7÷žf&J¿‘hÙ-¶#ºälžj½ŸŽ nêåNèG¿)iV‹¦ÆOK¦?p¯:’K!ôº³šM[˜%²1¬¶Õ™ Ã51 ¡SI*>I<Ú%ý¢ž2ç¥; !·±æ<7Ûúk1‰ø¶«d¯ÖêÒ‹.ÿÃSñŒ©ª’Â?6Ãðvüo2MÇ×öÓVF·™hÓF1GP@9%:LEZ‘ÿµîªÑ¢6j*¬ÖI8¿ìA |XJ´Òl2Uqˆ¼)AY+zŠ€Ì\  -v“W‹’Uf1(–z>oVÏd‡wéæ+ öj7)^õì5 êcuKipB÷^L°iX[4û‡¬¯¹“:~#ðUÐc°=U{šÐJ¥ÙÓü¬ËOÂê•ò«öõ_Ÿî«·hŸ{3éÊZµW½jÁò¤~ë$K銳¹d†²©3%2(µ„_,–²RfB·1˜†6­%Ib¢¤*))›Ii+¢ÖÈWà­Ók6¾šÜÚƒT›EI%¶-£UŠ´k&Úü–Å«jMi+AÑj5J[sjåª+ÍÓi5¶jéUŠº[…ªºk¦µ2ºõ›k¬6ZZ¡‚‘¼aö®#wS¶ÉŒ¢Æ1ЦYPc1D•P‹)"-´Í/îþHÚùÔxÛdÓku6ن曛“ûs»é˜‰¦ò#i¦åfm%Ãm)µ¶QöÓsƒkRå8oW<—7!µ8m+RmªšâáªÚ©íãíÙ«²÷nš<·eRBS'ZšL2²5iÂí:ÉmTÑÑl~®Õ£õ#iØxPF‘âäëm­V®F[ ’åá™I\TØpHñ×JU¶--³Ñþ Ì«Û2M3‹ü/KR–ö¯“ZŠÝgº„ ëÝ"ƒ›íëÞ¹^Â÷Ëžíe¼ÿÁ¥XÑw|´žUhåG ²}eã_Ë÷¸SQ¥ Š£B¾}·Ï{›Í`j¾ýÖ,oÑõÀiDªŠ™7—V€b\N«¡«jõ)ÚD¥[cvK8œM# 9L’Y8T¢•.B4u›n aY7ºZ3šÚq4jÞ­sOÌý•±éÁ9Y•V*ÁÑit±q¡¡©© º3 ²=o¬“hM«³ûJ¶ËeT[d¨T“íÜåÈÖË-+äÏeÍ,Æ™a]¤ýT‡˜›åûoG%”©R(`·ÊlbØü¥#Ê¿‰z%ôO†/¢­§dò"àÜÜìÓÒ»œª8G›#oñj|=ºáKm…,“ú#ƒk®¬üS1În媪–K 㤞”Ð1Ž ¦!Rªgîô¿Ë€Ê3‡àÓ‚šdKâÚÁ?±ù¯ø¾‘ô]û»m¶©Lß©Qmú}^Þb¢4‹bAZ’aF>i2E6›`Ó4ì°?Íf’a”‰ÅŸƒ_Ê™!”L,˜‰'9"ƒD']ufÔ5[®Ú°É¤,ºVe†ŠÙ‰Uôè1[/ÔXÔp9üž‰Â¸0èéªsbÆ—ÙÈjÝx(órscsª4¹¹££ô±ÇûÑD½½Ø£a‘‡¬e¯F­v쬘]!éâ“b¶CAŒÝ-¢#qWRoK!U0Tø I:“âÀ|î«.«Öº°âÄËÕ[͉»¶cÀ¥’¬*QÏ:ÔžØÆŽ²$¤LÞHæEض%–ÇW‹%²x»Šª¶Îda!¨9á¡ÂÆìï^±¶û>Îë_Y¹£bÂVúo¼¶ó`ßJä_5s•hû®kãiÝ©5\¹}Þkß~înÑjó¥F¢Œh±¬}—M{º#ér£ÍÌœ«—®â°š‹§*)|óßÆÑ·•ñ«çÎÆæ«‘±·+¤l—Æô·Ò¯Í_Oƒä¤­Ãl]M¯¼«Ñ24ôêQ|ÜÚ´F1SFÒBžîîå}®Û¥}ؼ6ßH¾Òø‰§8²Æ³2¦QV­“(_MÍæ¨Åîºa[ãb’Mk¸»s“›¶×űc[ä±rû%(5 úî¹Ór®gņ©*Ûtƒdi‹PãLn!¤Ô#zà]w=ëWN×­-íïu«ãÏ}ÎÚò¾ënß_\o#|$6øßJ¸n\×ÓLúú®Ú™7+!™ ¥„¶H2åI‹ ÂU¢È1‹“IÁ¥¢ÓY%²É4Òd²:dŽSFH©6iªd`àÈÙƒ,%•VIr“&F2œL'*ÙŽq¥i`$±±jn­&J%PiÃHk,È®ŒXÌd˜±R9'…HbÉ*`• 2e§V±5–VAˆÔš¨eƒblpƒ‘•EÉ¥ËQMê§' %“2ÌXñ(Ò¹+sž”Ú3 KSJ0P˜–T”D«cU„²h¨¢SR–ÛҪѫQ¢ÑXÖ-VRÊ=tNŽ2žq†1˜Y­¤¶Ñj¤3e%@Z ²ŒªQ4­KT­­ó6Åp›6òÙÁ¤MV¤ã*lÌÿ3RI8ÖB2ÍÖ¬DÊŒ£)5MTË!•5bÒÌÒãÈ¢¨ê9`ßQ\«c®òäp­=í5fVf-ÂŸâªæ­«ø§› 0˜¤Å'ª•bvj1Ù’MžŽr½P‡ÇMŽ ˆMÈÆ*¨Š †’3-ª†šzi&4É'c×…–V’ËI²WC ¯Lú*Ì3,Ä¥¶²Á”…©"Þø;‘ÜæHüOØš;£¤tê,­Bć­²Ú’&!´}†˜–CU•fd‘hUDÚÉ4°cZj$ÉFŠ’a’¬°± 6F–˜µ¤Ò²ÛJh’”9RO ¾;U–8JH«øÉÊHüuo+yfU1‰ÔžÃa­˜ù'tJÝ&”z;= RL)H9Á¨pÊÒV§e%RL%…FÐúÉII ¸T“s•Mä…¥U-©•6Ò¿rÑ^¯Í¤)EŸaq˜êäK…Ípô,©»a°ll­ÞNŸŠ .ùSÓ²®2$î‘,gÑàÔpR»Åz©±²™Qܪ²;b¹ñ!!2•Jæ,$­µ-'‘ïÄÒnFúqµNLÚUV1;ºÃG¢®Ö:V,Dëßå9}¥;#ú¾Ÿ|¾Ì©ý¿Se9‰T¶ãöËóSúaMŽXfŒ“#îÕOÅŸÀJ¥íEó6FMÏÚêïú•ýÞå'Iòþ™xý¥‡Â‰Þú§ËÈõUh¾]ÞÅ8αý~eìøI£1‘Õñ84zèàWÉ6?¦*pøÊܵNnfå 4éc™ì|â¥ô.|ŸÐü?NÅ`"—JŸÙƒÏà? ûN¬«“ÒÎg§¤WÊ>ßÓÓ,ºm.¢µàè½ Í}©ú:Ç÷¿Ó#ý T>«ß9ŠXdÔ1’KUµ&&b©‹,2¬0V3ùÜÑì[ú›Jú|Ñ’’²¯³ðõÖ°»ëL3ZѦ™"å’aa¡ˆM¤tt½ßq»´ù×:vdc NnŒS•{'ààü^ù6øZs’bÃìý8ÌÅŠ÷þŠœ×ÒÞ¶µæØÝït¯µU÷ËÂzRØéûS´‡‘ÃÆ34~/ÁoÁðWë'Qêþ¯õŸ¿É,ÒÚ¥ÕËJ)µe¥’’ÌYŠ˜Œƒ F¹eDO¶RÔ“Z6Í•”­–FÑZSS[6Í2Ñ1­6´5Q…6­Qb´fÓeE¶m¥¥dÚZËYf’ØËV¶Úß§¿{¼h÷t¡˜¬›IŒ¿mKøœÇù9IäÈUmœÌdɨlì“ag©¹7VUbÊeÖYYcÁØxlÙÏ\±˜nþp†?Ïù·œ¥çSËûÚPõ¥¼ž¦XÊóK³Oê÷U±eji÷0§§©’{D‹Øõ)èð°÷{Iþ‰"^Nï«ýýW×)ïÊ”~Å1+&³Jc ½Ô¤Ø»Ú2 ãR2YˆTÿªÌ¡(µ/½þkKT¶Iýl_ƒÒƵȷ&î’®¤’°2X²ÄË'Íj±c;o{) ÌvåCLŒ¯2WSm{4‹%É C& Š¬ÞšH²U2¶†’x.té?"Ñ)ñ2¿MW:t1ŒVV1VQÕj£×-¬µ©ª¥%»ƒ·L¦OÑ~©X±oOV n´'w±úÞ”±:¼ºžç§¦«ç}ëiŒ~ŒÞæ&Í´›&‡Ç´’N“h>(ƒÂ¢’‘J‰_sTÌ«0,±–*›iIi¾'Àî]:]7m¯[æÝmçIPrè¹eºÛÖUv²×–ÚêhÄÆÌ3‘³jÎÿ£¯­kß6Ê>’½ß6j“áN(ô^’9Œªua Ýx‡ r4âSø³!äáeT™rÏ™qS ”Fš2ÔÕ9½‡šÂ‹ ܤQØÒ¼­'¥ñVÈ™‘þ’ŸÁu &Z•–ÍblLÊ¥¥©HÒ˜dŠLÖK&E00€¦Z*AKcCF˜”’e”¥¥)²)1ƒ6¢¦•Š4$Y¶)&e–ZIm*jÊm•6Ëij””¥JZIJE6ÙZhªF¥´²V™Yi6Þ˜×êÉMF6 bŸ¢ØÂ¶UX†¦I…•ïV!y)0z¬ y–‘ú\Ë'Ó›/5èaÐIi”±• .¯Š®h|§}÷ikMk³Ë÷Õ+‹eÊ2B˜{é0ÙMMCìWŹpj¦ÙC û"ü¢Ú”¸b·S2£9Ø«¥”l¬X|Z •ƒöFæÖÞÚ™¬É±Q´”…¯—ª™0É"Š’¨«_V#Œ)£ î©Él¶>¨òÅçºN"ûÍÕ{‹|)‡J­œŒ_^ÛVÎ1óJ¾Êc µšV¡ Y‰1˜ËXbœ©£KjÒ{+òd•šÕ[Yóbd›IY²ÙÚéo¿W/ŠvÞù,øMgÕ]·|Eo¯¶Õsj*Iæ¾N÷¯l\[iM‹k%¦Ñ,W&[+†Ú³MRÜÚL¬¥75¥ÍÉÔóàóÉPýSÔwîʪ«%«,“Á³©2“Fм–¼y˜âI#DXö±r~só×ëòëS_µýW†H—vöL«&³A©Õ'¶ÂŠª¢ž#ÍZÂ/ x‘"[ïUp]ÃfóW«"! Ëù3C%QYªw¬q*­©Œ`&’Å€`Q»–$µb«l3*JÈd‘Ÿ'w-ÐÅÔɆ'YJÔæ¯6#—|ÖcYGE²¥fAfJUf2ÂyemTWÈv_6Lds»ã¶s0®K]v×­½­ú-·e22±Är~ÖÑÑÖt©pŒšr]ÏJW-òÖ´µÝ¿v`½éJ{6Ö”ášÐi‡c…=Õ»¡Žú]I?.Ɉe;Maì’ÄçRŸ9ñ¼0`Å>HQ t\hcI,@6¼þRÒHb$?ݧ® »kFíA¥­\…J³K-†Öª4Æ1S—k©ÙËFÎÓ™£²71Á`ð*mD؇v…éljɃ@år/‘µUqV9ÈÑê³Þ`r<Α{êõÝÝŠŒ¢‰b;£%;ÒvþâU-)/QçáìO~Ó…‹íƒ&bNš’{IŠ9Y¹V+ú"RF¢è©.E˜ß&änÛˆˆD©ƒ¤TÝ“¥´²«–ÛŒFCÄH“‡t[lQ%DåÄ‘dþïRË,¡Ù÷ÃËtžÉæø¾†“ÑÅ’yMrzi²ëÍtÄ­bHG¯QE)T¨|…Ì ÂéWïöÔÿëÿdùÌLÖf±¼8ž\/dU42GòU%™žŠ+NAâc&U[RÄÚµVF¢²Ô˜q¦¨yÊÓFY‰”[$¼Éžîf+÷Å:`æÑÓ²| Ä¯ì*iGÑǼôûÖb\ȵ£a&œ:”í#Ü©Ò}žoŸÓů¥»Ö¸Ê¸¿;ä‘¶’Z¸CñÀ¿¾HP0fJVôQ.’‘³ŒÛ9ã3“³VÍµŠ©$ò8†4Ù ÓR2+–¨n$•@BŒ`Ý4v5ì–’2SÒwi¨–ÕVÆØíŒPmâ1"²óU´Úpѵp°à§Œ¶L-…æÖ^KĘ$«Q$ I^“šI4–‹-ƒU™±›Y„¢ÉÁQ’n!cM*™Ȳr±N'.HäÂZ­0RË-œjRÅJ0ôK­éÖNNœÙCG 1E„]÷÷ð÷…â÷vo)%5¿-ÛrÅ5hnq«öy$O'‘vZìÆ33.|ÙmYj,ÃÂÉ™3çLD­>nM" ªã20Bh»$Ï„EŽ~•yiŽÙ%èµhÀj“¬J)?ÆË ¬µOCT.‡‰ª±S22Xœ#ËlÓM5#RÉ&£Y*¬U’š-}r«rÉ­cLdÒ±[d£…jü­Bm¦ƒ  ÁJPŒP/cfÕ;KCŒ7,Ÿ8lm&Êm8>4ÚºLpŸŽY[—3)ŠËf.f-VF&ûË­Ô¥nnj$¶Ü\Mm‡!Á²VÌMRõq/ øo'jÑÆ—Õ­+šdà<á ƒtÐWCŠÉ•¼wòÜI$”bc@!ÿŠéʱ1‚•ö-,Mؓ֩Ò)Ýê¾êñKœÈæIeK;Ïg‚©XnNg?_–œ¼#Ñ9fY<µ55¡©,JªM½¿ÎIñ'OÊõ ˜hæ`ޏ&«e䵄·›Ø™0Y0.u7{ÉÑOMr˜Á†0ba‰ãÓÇ ÝˆN¥Ždœ†êS<Öc,Ê̘²åŒ“ˆÈ] ëi]¦q¥É©²ÙUWÄÙäJW³j¥y‘•yº:.^ZÔ^éû¶¶¶š¶ÚnnU§´g¶2ËeZÊU”±ƒ$ÂiOß{} F°™ó4Ýl¦ë¦õÏçXÅi•™–SAÁ²°²Z7/äò‰ºŒ>{ÓÐÒþÿæó¸•KùÑD²§1å1ñÖšÖ˜Æ1æ§ýŒÇè–ÉOáƒoýÑùs^1Ùþ¶1`þM‡ßFß*|›«âxG’}»ŸèÿãšæX©’® =–…±ÝÌßûÃç”ËÃ)¾O¿ÝqN³ÛÞdïSeT.ôQ‡÷WÅ ~ßüâ¤1ÂÈà†‡B•_ÜZ¯ü‘ ÷Ÿ»fÐ*¢a†U‹a³HiÄç `Ïß-˜%GØFá'§¼þÁÑy.Íã÷Â$ø›×{ûáJÜ»+ŠOêéãÑžï~ìÖžZõ}5j?µX¥ø>‘ÒS$¾µÝ—?5‡"Ÿq_]ùßçª$—¼òQö`ëŒÊºéMË2Ë K-VF–TÈÙEê /3ÃòœG¥ytH«ò}ÿ(¼N||¶Ìö«öÕ+y±•j¯ÛSIü -+÷çm´ÆU¦&!•¢Õ,¥£¢d™SªkF]ÔYÈû 85Ćªj“Œ91þi"\ô¾+Ç¥%Räd¤~iõ}㪿„OÝ–dÆC2§Cõ›Émþ*ÿjÎ’ozUv·˜òŒÇëdNâœß-4Ã^üj÷<'΢¶º,µ+£Ys<^,2áNÃùTm<žGÄäì{¼Zk“ Ñû ñ]KÉî«÷ÕØí>Èþi9¾GÚ“êé:dÏa*—»xi…üTµ§Yöó¢‰~BùH?¾ÙIñï÷ù³/Œf‘…™&*ÉÛ—]Ó®eÝIu×Fræç›³ÕÙʺë{Ûsböñ{ö­íZ­­†4¬§±mX^º=IÊ­b²V4jN$ªÈ‹i¶VLÆJ³M"i£´i$À£~û„J–èÙaauŒ¶_i¤¶¥ \„ªYEÿþb‚²L¦³Ìé×Ú ½¿ð ¤ÿÄÿÿàÿÿôÂF>ú_½ãï»yä¾Ît7ÐsØuJWAöm›fÉ{ß{ç±/ˆåXÄùêÙôÁ  ºâ m€t€¨ììTÖ²¡fm˜ŽtûæÓ»®7TPm.t·½ÁÔ¥ª’‰q϶iŠ·;¾zíîw`Ð>‡§)yØØè†º¯«€hùJí÷ep8¡@SM ôl}Îì Pöru¥vի6ª­`­kí݆VÛ()Ð\–Ûk7§\Va’©TæÐöÞÅeOmª%жlPoƒT×''+s¬+mwbs¶ÖÉœÁ MC1[wtâ×,šÎYרZ·[¶Û³6f9Ãr· 6æåÌf–>dë²Ùf¥ ›m¥Bä4_8Ó^ç°:7G=´3róØÑ×¶.3GºäU½ÝU§»Ñ‹ˆ÷‚îQ'‚ ãÛ”B·tPu»¯Xw­wwI5{nž»”Û*]Ž¥# Ëw½ÑW†³)k0Ö­æyÃk]o`•¡l6aL3+Ä;°Q,!@gºŽâpZ}Ü¢«ÇÝÅ)Z‡*K³ÞÎË ÕÛ’‡K{´jC©;»Š %AɸƜ9=Ç “€1 ÉªZ¬¥âó²»míÈ9OyX÷±8÷: àÕŸyν_c ©QTvw³ÕyîêHi F„B(4Ò=M=M‚dF@h  DQSji£Mš  ž‰"‚”óTzÓOP ÓÔm@“Õ%$DÄÉOFTôÅ0£@22b2$ ™ M42¦Ôõ<¦4Òj= zQ"‚=4 ODÅ#e<‰?ʤ’¬Ih‹a- ==ó¸ ={° ÿB ò@UUÿ¥A D$Q• Rª¨•$¡*A%H„©–YÂ!aPb¤R ©@" sJÛ5m­¶ÕíW¶4i*Š6jFÅ"‹ckIªB$ÁªdŠ-’›kA´Á cmŠšj´m m©16¥fÆ‹QhÖYh°†%&›F¬lVQ¡ªa5˜¬j6 6Ä’4¢ «M4c4L-heR5¶6 ¢ÛhÔhPÔš*LhÖÑd¢fbª6Ù£%`†A!¨XÖ¬š ±Q±ª5F¢# H£T•¤ÐB6iI±mÊCmDUŠ i¨Û’¡Ú"Í Œ‹d–¢ÔÖ%±¬MLXЖ6¤Õ‹hÉÕ‹Dj,–¥’5+j6Å•- Õ¨¶‚ƒIT›T”S6­‹%Š*6¢Øm1´EbŠ6£ƒTlš5±¦Ìm¢­F€ªÆ¢Ö*£Y5‹QQª5,Ö¡ TJ0’L¨¶ŒllBhب Á& ²¤j"ÆHÖÑmaBš61"¶,…¾õUµª×Ͷïÿ¿ù¯ø¯Ûþ Ü ?ú2þø0?à?Çø”0ª2Ã?õvVK¨¸šÌÿNnƹ¯Ÿù“¿üæ•ÿdÈ2JŠÓíû óœ³qƒ)ÆéÅïÿªÚŸME¶ua-Ë‹_‘úl"¸Œ¸ÁšéßmZãƒ2ûð6‰,7ÃÌ­NE“øâûf™Tš¸Õ]mfkíLéA¯Vûîýæ§]p>ß^ºìNă¶Ñ>¡XÔ›“h¥{NÍäy¸¶Ëåog ªœ&®!¹~†uu•’¦Ë$‚€ý›‰ûìDð‘€É’}ZÁ¶Y‰IAa¥¸Ü9ÒÑVP+^ázæGq„55Çk¯?éÊö ‡.ÚœµÀý{‹(–ý_Ûù8ûvÅ?LîÄî ©£«ÒŽJZ¦Ö /eg¶Ã¶ õZ„ÿ¡Oõ!?Üä€Å 3zª2¿â®¥ÿÔðÏÜ?§ò "w°!<“ÖHX°çeSf>BC÷Jþ™ç Ü{¦¹ð¢N‚ýÇ”yúëI$ $I$P‡~µ_ÊÞøü€‰_ev_¾©mZö'ûæ÷AùpÿÍŒ#;ý||.m>òùBÜ[€°å6 ÿ«8¸ ÏmmBƒ˜ÿò‰e à©©™¸Kÿ=û<Ã˘©Ö'Ôß–œ”-K"Ö £®O\÷½sl$³[±6Í“œ”³+!þ’Ûn¿Äbj;ŸêÃm$† H;–#b»gĺ>äG’bÉy ýII~ÒôÂN%AS´˜ºw»óŽóûüéëdž¥DkâÅÆÅe¤°•æåtØM¸øîñW¦*édåÿ×â^AéÃ3ø}þ_|çöÿކüΖÛ?ãÕ~šŸlÆáËð°—z#@°Ì&"w̦=ï8­>ÝÏsÓÏ§Š›ƒïÇå¨9bÁ£À~';øØê÷ÓNÝK`€—è/×ñÜÄ4iGWiˆ‡ ,@º|·òö üt·Ýøbú,ž3£+ ¸P?e)Lìa|ŠMÜP†ÞŸ ¾P^’À¬Îz57 DF;¯é1¯­¼Nþ¨~‹8ÂÎè0î1ÏÝÕ#õ†ÎrÀWö Æû µvsÿR$ù~¾ñûOÅ""YÿWiÁgãJõÒ#"H,óî(Ã"/á¯Ã4ß_㯫é·âFäç#øV܇ގW N™JSjkⲘùCžd†ÿó¨iÔd%ÝH0"At @ù…ÓòG¦ù¶CôÅÓ‘Ö‰xd+2×mÈ3¡XI©$¦þIAùúkYNÂø76øîà#I—åÓµß.v°CÆ4u­sÒ ú#PœÞãcÐ÷±üUïXö މP‘K Iû|Íð0AÉFÖ€ôñúdŒŒ$’^hœÏ‡h©OE•æÿ5Ié9¬T6Á§¹½-–ÛVRO€Çö¢Ã•€ÿŠõôüO`´úÀAI¨«Ð`Dœ€èQaMÇŸ#Dœ‡zòÜ•:çmàXû;¤È *$$! cr<·)uopÁÐ/¬†Pm¸ª%þþÿ«ñ2Í;wZßSùþ>×< é-¶þøô G Ö,`º`y‘{ï•Yï*‘ó‚aDؤ½ ”‰`~A˜-XØ,¥ŽÔ"êè-ÿ=ZäZ #*ÈH¡#"ˆD §—ðÑsü¥‘2@ŸÆÀÓø¤KaíÀê_‹ßØ›* ‚¹Ä¶7TQ¹·»¹vêTLÜáw9Øà]ݺ’­u»*Mi©™6•±½òiˆƒ1Ù%CId2‰C ¡¢;‡JB&(Àøj<”fB1kLT@gõ~ÿá¨Å¾6»ð«Uí»R‘ü»˜FH(­—ç›ô#ÐõýôÚ¶ž¼­v*=é\‚ÈH¡âRxæCö,öü7¾ê—Å×Û²ßA “@ Œb4ÌÉ0ª+ÎpmÄžç²n&ÞGc«}ü8Ž˜­÷ñÏM/‰ï¡VnI"HHI 4@JÐ)l¬©Si³-}_?}òüÿ/•û¨Œ%¯2Ū¶ŽGdÔsX’§;ÑÛ$0f€]{¢9>aˆh7ˆ0çB² ”FÙ‘×qûaÀ†ao>8…ë$‡@Í=òG­NZœÒ-L’LˆŠAó†’0Ô“'SNw;_é- {Ë‚hprÞºt*ÚvÞÖþ¿DõØϯÇòî™YâS­™÷$bm©B\y#¦{¬¤€¢Ëo*ÜJÚZJ¼Ùà,Hoeuܼˆ+jɲ-º–æOîÐãü@$xG“˜›+ͨ²²ÆbájKš®mrÚçKi6ªæÖ-¶pÝÁš¦m­kª»jí/èùñ}snhç_R°B{Vé$#3:ìšôÌq#"c—#&Éxsƒ^ 1šÑ²²ðÆef-—2LG˜Í,š&ŒhWªwš)ibÈáÛ¿ùôìr‰ÑUÄô†@á”WÁë›Jºbat¯ÒG"\Ñ ìN+‰OÙÞ¦†;ò?øAÊFHøEú'›Àjˆ«Hùx¯õTRŠŒ$gc>’XhÐeBHEƒ—a„>e…Ž&ˆƒ÷=´\(²»W–Šƒ¹”„º$ž‚!#ýDD‡ðöÔ‘íç $5IiЄÚ À¸ÇãT_áüpMIi(½¦ºÔÔ2·5®6VW½ÖöÒm“&ÚÊ”›e–ÉK®˜Y1XS"\¶F0IJeŒÆ•\®MÝWV[*rë4· 2 ±,–I8I$TH€ÁU?/ )÷‚Ÿè ð `S÷˜ÈýEsl(ƒBˆ4äÿè*¥4 B¶‚ˆ: ©šbH—«}{[o¦¼ÚƬ¦ÕŠ¢±X,kEmhÛ%¨ÛA­¤­±™­£m“jߦ©(AOö?ñöÿÇoüãL~šÛŠ9Îq Ú‰ý£ý*‘’¶ ¼5?ŠLÃ/í/²„î6 (M!(n;ïîR?”ÚÛž so,©KDrBð(o]›ùqжBÂñ¹‘p£r §E¬{Iùüùºõ ,÷gï/+#‘òÁ¸k´Zo9–_Yîs— 1‹ÊÒÀb´,¥Õ,vÇ„|0}N{ïªißs_}MËu¶Yθy¹žw˜!œ8‰P6BmÓÿãmœH ŠßávŽ5Cz0pÏ"bne’À6z­ØTµ=˜ †¾$ºÌW›^,o*îM”Ѐ¢%–q ¬Y·µÕ|Éò¢‹&ý¾êçÔäo+}‡®s$€,^õ5 iZž"ï|À¼ÜÄÉBö›šMçÿëÚ*³³îSø{/2ÄHÈF(ˆ[ÞïQ¯çâ!üìùîV™Y ˆwƒ´Wÿ¸ŸX¯¤Q¼”òè?Þ&©Î€;àÄOEûF‘ôˆ6ˆúÅ9@-/p/ÒŠzhy*Ÿ8ˆsöÝþüõÉÊ͉ zÛ—µbÕq0m'8èªBÄ4‘6Þ¸Æþ9®ù{ÃÆ©U(>D{gˆAèîµÀn™¹vD…¿'ŸJžÃÅûáÑÇr0~?yO‚»ïߺ%’+‰#r¼ðDØÏ}µÜãéÊ[~‘>¸ŽÄ}Ï^ˆ¾>œs²p}|¢3'Ðäì>NÚF)3Ûµf¾Þtâ=‡iúxà éįjøãÛÀð×ßÛãÝ:_ŸM|O8–>‘y(éäJIbJ2¦Ãã»}wúýuy> µå›pÅ~ƒððÉ’óH¢›A];¥wvõ÷ÆÎÇ„ÊÕ3¹ZdÀ,·Ï.={xÇ$2€'éí:|áϪfŸ83Ö²ŸH”Pé»Úíçu¼WÖ#è3¸| ùEïÂ-@îøíÉ‘º žJ{E_4ëþGÊ*()öˆp<áª^-Ô Ä'bçöÂ…çÖ'bˆA´|ûŽ ‹÷ü×áÈV@L.qf-Æqß޽}Sðo^>9¢U™âK~Ub³ùøÙü'Ê'/ _n§œ¿¼^þär‰gœÄ÷ô£õ‡Åú¾ùhox¥ÏÌ9À=uðñ±škS¾­€ôñ8åìøÅ4âÕœ½i:ûý'rxÇ`< x sãùÄÓBÓ]}£ç‰÷k_ó‰ñ=~è›FÙp^X=ûÇh áÒžøY@œQÄ|}¹²?Ü󃟕~?7{oyõ Q%zldu…»Ôʾ )n;!¬\åH£¼³hý%ÜåÄÞô¯'©ô‡M¼Xn/Ò˜våá¹¼N°¿‡jËš¾Q<=´Là<Šˆ=<¤·Êò‰”¯:´»Jïïñ³é ½¾ÁŸÝä8Ϥ<¸}mÉ;ü9ção®<4ꇼ-`2ˆ lr°ß›ZÊçÞ-c߉6º`  w0”£E Ž\£ŸåHúöÍSó's¾§õ>~¼wæâððlø¾!ÙfÏ{>ðÕˆqOFµª!¦íI4ɺâZ¥çxLvbwìIã*Õۦ磘µ²–“gÃJmå©{'<¨½‹Çòg=UÎùÂÁû×ÓìVÛN*²þ@rE+ŒMcªªªªªªªªªªªªªªªªªªªªªªªªª¡UUUUUUUUUUUUUUUUUUUUUUUUUUUUUW 2FHk\eÕ×&~ă–6}dÜ6k-×}¿_3½Mú‹€é†{#Ñœ^Îq7Þ'·gœ#½=pÑç‘î¤Á¹ˆ{&v¼¹ßgº®}Ø·¾õtÜãã~|σ÷šÔ_dÍDÔõür/FÉeÇUÛTËùÛQó®&ct«xà¶ UÊi±±’f’at©1²E‚" lâŠÖoj‡ž]š­SèV<é-œxåIœð¹­,ƒ ŒE]¦o‚Êàjü¥¿ÃóÇÚVä½àµg Ødìt+{×$gC"Ð’p£c"gÙ9ƒQ.wñolFijKÊÓ+ ˜“É–Ûæb© •&ú8Õ“âvHexìï+åãimÏ‚(㸙÷¦<§bmYãŽ8|âæfYRŽv$­Hz¸1Ò¤Ì(¹$.2 :[ž6&Ñ„ªoVåŸX=.ø“¸ñž8PQ£('|7é]â\a±…[r[5ÜÕã i'¤¶`ÖxÝstÉ5É…M’RÅp Ék °ƒ9.‘¥›ÄÏ.¤¬c1qÐ<ñT´j±@uE3PÔ3ǎ庑j8Š =~/ |8 Òåû92é8•œQ€CYVn¼îð’BÙ_•^Ä8æÜÔAZ#n"_ùæÏ©¦ê¤XlÃ÷º¼’ªz&[ÛËüDïZ¨8Whæ!‡›ö‹qdUÄø ÃY”òÁ‰ü)qsùJ§O¾ÏÆN×|hwÚ''³ _Ù¶ÛÖÞLgëQ)7†ák˜w›mCŽ5ÎÓßwÕ÷MÓÂÆN6N ÛMÅÆÊúûTiQK‘·}˜`®t%æ¢Ó¥Î׌v¿ñàu¿VÚ<8·1‹)øa[¨¼?‡Ç‡ŽÑëÇ=ì7žœm6íØ/åíq6PO<1ú½ýà~~/Ï4ÚSñνü`mX\ÆòÚ1Ò†wkz‡ûÇüo ûñ†ë‹püÌ>Û ÊL¶µ¹Å…×´ÖÏ(¡8{‹ªŽ­ˆ±»±O³]ŠÍµù?öýÿŸ·ë×=öÏ ¿à¿Õãõ}ÿ,Fo|5ûÿma…•P÷: ƒkÕJ¿ÖÛHúd«¦.áI]~|šÞ¯íÎ §k\¢›µ¹gTʶV^ÇÚóßx¿=…“û÷gíçX’¤ƒô]·¸·=ŒÜïŽc^}bsXN—Ãå¤ê,»'cVܹ™š& ýê/3§Q—›j_Çëd‹ö2Ø[ñ<œ¿'—ç ²õ˜¶¥—ƒ½,¶Á¯ÂW ·˜ÔbÖ'|hÊܾo\,7•|lõ»AI*u‡‚µ…¹¾ö¦bû¶3,<¾9ÆX¡íqf‹ Øá•ý3›Ÿ0¤XFì·òÚ›ÑÑkáqå³Àºõ8{¯u£w¾GBê;.¶<]˜ Ú"ô÷ä8aÎͨ‚ÔËÑžŠˆ ¿.$ÞßY{âLs…uQ‰¸àP´ì•I"¥m--ž—/ÓËa¸Q|Õ3‘q}ã‘kÆÒŠaØvézÀýLà°Ýx¦lÛ=mí?S©RI¬úl†åeå†Ëö-ؤMÂðË#~3é¯o F´³º–ß^|õŽyF{ŠÎ“J_‡]¶¶þ¥š®yi–À±CuÁƒ}tÏeù<2èÇ 6^„ìdjçaBÕ¬%•FýªaTM¤½<Q˜µm{Þtº4¹‡Í÷›KÕ°Îf[³L9å—âÙ“ˆùtÉGÚºbÔH+ Éͦz‹^ ö9Õ^mX¿Ä/ã—ÅcÃ>¦Ÿ:giÑq ­(R‡xÞ ³Ya|Û,µ5F U YÊ1ÉÁñŒz¿­j¹¡VÖÌk`WÕ·ûJný¸°|7S¹Õ”É;|ö¥õ£|þyùyQùŸnEÉ A^jïÂÿ`¶Á—·Ê×·Ë#H? =ÏIJHY»{¶U šµ¦Ð »ö¸lÀŸTÐpÅšF­¶–¡Ù˜ü2«Ã©q–‡Ö~CâåmFø¼XNÖÄËg®Oâãg+¶Žvr~xf;˜6¹QŒ0"Ï軿]}ô7lö|f6ì;MKa[{íôg{M•}_–¸öe ¬C´GSF‡ (ˆ^š|¼ã}zг¼Ûl_`©›)¼OÌîõ³B ¾ø7˜µ¯¶®nþCï™Ïšw˜òv œ°Ïè¢&5¼4¡MÄÍ•xÓµîn­ª÷š¹òÜmÇow®ÃÀÆþ:ë©J6’í³³÷Ã4_ß{ͧè´]ׯº¹í¦ñQÕ]›Þ‰„‘Êq¼¯yìðï»sŠ9ñÛŒ_MfƉÔ2mû–ÝŽ¯¦ƒ¾~œ^Ó§«T™ËsOô>PõÕ¼Æ ÛBû¬É°õ{\«_Ô¼˜VÈ+L§®ÊF½qøÞNl«t]]+Uõ³WÆ·êv¥ß4ÂXžåèìg«DÖb‘¹ºŒ5ÚøxƒÚÃOVp­N¶ìw]0¥Y¨ãÛÕvßÍgºìu˜ÞïàØ¬B¿…£¼¸ŒÄÝz[²‹;•µùV-‡q½ß6ÛXÀ!uF¶·v\ÌÃÊ•[µÙÕ±ÞÌgcgxˆûy™íÚÚ¿QˆÜ]OS{¿+6µäS?V§¿fˆ8•äWö|µæGÖÛ0µåE߯Ï»ÙðøÚv·³Œ\m_¹Æaú¿7ÆØx ywØ’‰ ¤7M§EaC؃°zŠâÖ¨ɺX¬•±|X aUMÖê²Ï¨ú=jÎ×¾žà ðöù‰~Èqúù9ŽMŽEçÓO#¯Dðpâ.h—·íNŸ¨,/£¥}üúÄ+#À^ É³d’X;ž]!Ñ¿_vÕlhG¸ùñÈð!¥—îuWà~ Ã71÷¹ÄzS8sW·ê;ž·–„ƒ©õžÏNqOÃ'™gRÁgÒ>™âGÝ÷,|úê{’>½ÞYÜ L’¨‹k5¡ò\Sˆý.ZÎZÝš!CDBÏôÚ6ߟqÎEå°OHÏ¿?-ÞkÌG빘’d äF쪩ÎöUR4"I·Döâ/•—x‡Ö®ª¸¤%8ÅÓ0UPÐÅT_ «¹‡¿l+zà+»3CAá¯Å•F4ÊJ”˜ ©qNebá[ò~NÑ»hú74DôüwzÃõÅ©m7ËÅ–ˆ‚€Q`P)`£J"=Ãv/+¥f(ä+wÍÜJ*…¼¢ÒàÔI(‚ˆ{ñiïm±´í’2¤Ø“YW²àÉdT$òûÐ ÷~ý„çì„à§oåö›Ä6ßGh-G|µ°«4£yá{ØÎ‰kKQ‚«¦hÖ0¯£%.–ð¥Ì²åšï¶q g rÛÛXX«ä3¦ öÃNZUL;¹aé£'ÎI:b¢¯V½9W¢¶|ò÷ÊÙ®WÌM¥-‚¢äÄLF¬2fˆ ]l^çË3l\ÎH}{¹ßÎï¹xø§9'°à‡¦Ñ‡%âï4Üz›•ê—ÞÏ3ZŒIõêÑÄUuáuê’Êì»*¼ÔÀ3(àà‹e^VÌÆlq¶#luy¼£Xw3Ùv'ïÁèN¹z:îíyIyjåXÄ. ¢áRJ%m0û°d`,rËÍëw=ÙUƒBøh;SºU«e¼éllq*öpáÍ µÛ7#s’ÆzVU¹m±}&Îm0]áC6yÒÐS‡Pæ+i»C×G²ßEÊ++ 3[æuï[‡C¯R|öŽ»%á%ŽÍ³Ìœ./ùwp^ÌµÞÆMÀ÷òÇþi0s’Dô¨Sõ”Ïã>ý‹;giôëŽk\îÍQÔïìùÙMnÈ~4²öëex‹Hˆu22Úeº¼=”ÙŠ4òÁH‡“3\™7 ‰˜ ˈ‹ãä¯O| ½ÉcÍùkž7ßS´œ²vkNâ1Ÿ¯,×EMD»Ú‡;껿{xÏmWåËÚM¬³i«A³ÙM– ¸+ §EQ×ý7~ΫeÖB–R묫Êêî×~f׉zÙ©–ÄH¡l]£¯v寙=ýîïhzMQÏ)>L˜$Hƒ$^¼{ï‹ÁNZ‘ó»|¹ÉnnÊ–=wæa¼Š~ZòQ~œò—ÏS{œz^®ôÒÂ#–¡'b¬Ä+,JÜç›b“‚·3vÚÐ YY)×}òYÅ(í èPÑmm5 áeø(²8º ÷d’ù\ìÖD€&P î)_ȳ…‰æjÇ=É]sï9 '<”)À4X±ÐÐ#f29™Œ†Œ,xÁAÀÈGæÊòiðýGê⦢·p¸ML5v<‹œ#ƒ2˰X!«80SÃÈäX†Å:–8s!b&#s ‹0Ò84°{ÓØâ1g†žJåæx8‡&X¾¥e„˜‰Â’$ü!Z¤Ì&Ô¸…kû>ž(²L^P5 IÇb(Ñ¿Frt!˜+!Jƒô”xe×âg†Îk¢àÁbɃ›Ìۜ㛞6Ì õ*õÝË'-+KwkmµiЄŽ(z¿‚±F ÃÀîÐ[¸çZ‹‘F…6K—¹g·1s°C2¥Eƒ(2©Wв„X]žØ‹ˆ P@ûm‘:`pAõÄ;®¹„ ¸°`Àl“æóøÃ¸ÆrñÅàûÕ˜B/W’SÉmÒ”HDÃÌ/d¦ ã`Ôµ‰ 1é$„(úLè¤C %`ŒS¤#þ ‰"&P^êÍH–Kõƒ.•iîNM¹DîXi»žªžíž\ìÔ߉ç3ŒZˆÒixsÖUHCb—%’N›HQIš`¹)á X¹j™"ͯ›ÝŠÃ»dÃÊL"‘mÙ‚ªƒKX€WkDsÁV¨g™*?K” x’*FJM0gÉc?dó0Xwì®·|ä‘d–J’!¿’e”~y~9ØLj)L€ªñkòŒ« Ú¯µ³É¢e¾G‡@ÍC…æ´ð°9uxq1©£ç0óé'aØ*NCÄps[#ä¥Ðèfæ.ÊPìFÎΡ¡qÄòpWwK×±Ìx8WhùJ›vW‡NŸ< ô Ó« ÜQÈáælf\¹p:ºòCeØ65.Çb6.lXÑy4†ì(±‘F†¡E ¼¨ÃÝԦ͎è¥Ó3´yÍÆÆŽŒ†þœÒY4ÉÑè1Ǩ\n4»-„s7"pÀ²89›pc±ÃNëÁ˜A…È '{‹'`³ˆ]ÙH¦ EÖ¤——…’›\€btrlÎxwlˆç–ª]¹Äb) “£µŽ ¤! ¹–nQ¥–ãb=4צƒS„"Yä ã‹2ŒS©1¶mäÌS²¶ôƒ™Æd¬ÆG¨äA°úBªøGö”¬Å’ÿjG"ÏdÅgÓÓÁñH5 \¸LΟ°Q•â'@䮲bž«¹¦JRÛÞW>xòï«:ÂÈ{@`÷(>'fŽáñC‘gTZ!U˜**ŒÜ4l#r5Å:XÑ!àlQƒ,%T7)®n…Y0@æÇ‘‰‡ ᆠ@– ûL8KÐAL•Mô4$^†F\8%¶K­iÄØ>Á](JO©ÎUÃÿ÷:ßÝ‘îHŠZ"KÖĺ÷çFžåz»¹sÒΕÙêßö6¢ çä}ÍEG ÷=ÛÈ9~UYØs. m©ØÉ¥4–2?´”q á2¦£i6Û»{ù×<Úu Â1!ÉáCr†—s$àŽÐºY¥áæCc@…‚Gš;MÎti§=ž]×S÷‚ž=9÷ ¥Œ i+">Ibª˜bˆà"ŠÎlhHHÿ($AÿàïEŠŸÁù?ú*©#ÜA;€Sutd¥°àL!6â´p˜pE/ÉøÇýä}#O”B²aü?Š8úúÚ•j·#í‰ÙqÑÿº?˜hh|óA„Rø BÆJÀ_þñõ=¯rvƒÕ¦¤nO#Ô±BÁ§µHåæi0þ/OüÎý?êNZv4êyüûÃ"+`ÜÈñŸPhò.‹²÷›¢9I„–$6ê&›Nl“$“”ø§ÄOܪ{ŸWs¡Hކ¤ÅJM •Ô‡½ÿèå8*JŽDÃèù©·½êÒxCî{’9:}!û?åÞO|Iò8r}ŽÇƒÐÂwO íû/ËõÏn^ÙuZÔ¸ü-ª8ývù×ü;1/ûÿÝìêÚ¼ìÍÍ U{¦š®¦ìÞ#$gû²?„| 'àAùýÄ3Ȳ%2¹•mMÉR¢*K¸Ý¡ÆÜc£Ô"3hç—‹dñÙÜÞi ‰2ÇÚù.~íߣínxˆÈ̳Ô‚IC/R£Å˜P})¬PM_r³¹}"j$dF’XÂãU×7äÞg)A)C!Íç„æBdv©Z9a§Jâhfê.'Ð:¸æx=$Ãâ(TÌ‚B‡¯nÕ}1žbOP…’fãªï¸ÈT)G ÁÜÒX.¢ªf½é†DR¢‘)˜3 8Jh6›ƒ=ît—Ó[›õn&’H‘ù9ó«_o}u&fL¨ôÇåÏwÎî"ï/#9A øq(øi¾ˆz%äXúÐ…7ÏTÕ„Íôi…ë/á²-”ÞÕÜ*¡ßù+ü½\ͼv‰!3BÑf鈦»Hcÿ(Ô¡¦†[ÆL!!Es! ‚ou\NWr”£ˆŒ–L%ÊÒµ,_Nrp¡¸¨º‚Ò‹J0R‘ «,ÌS^O7ìlƒ›Fó‡TqLSœÉ•Î:’™qÀ4L~!¤Ôñ—mj~¬¸á¸Šršeè\èü‚!ïÍùèõ…ÖLÅV/9m’öKœ­Ÿèò6ÉMýpò ¶²ò%™²») õ)<¢ƒŽZ§ úü>b‰‚yßM—&æ8e׆Ý!ŠýyŸr¢\ÀëMѤiFk 6ˆÞ~@ …è˜9`–…º/ÍÈ×à°¬D ¡_[õ$ÜuÝþFÁ¸¦ëØó:vMÒ¶Yì(Â4§~ܓÑò~§IŒ;ŸXìGšODÉ=ضùoÇ¥I ¯òÛ}W÷-dR¥ ¹…;ƒÕr6E¹ûátµ±}¾…(Ÿ{42=„ö$Òq…‡Ø84šφZ´Ye²­[ Šh‚PÛï*Ê·ëU;y»^ésp0ðGˆìÓà/xÇÔvz>ž±¶HcÝ$5„0ÝP€ Ðs]‹)ŠbëÀQ `Ôä¢XÎר?ìy"ïæ*§ÉG10D1gKˆ´–ƒÃ’K‡ÆGÓ—'aÔ{ÊGÎ;Œ?¯Îo­Äœ§Ø;¤–Bs=ÏÜ~ª(¢~Êùd þô,(¡Ð"/Í>lñê(ƒ@€Y€© ØQÀ)B´(ƒBª\4ÚéP ±!!GÛ#QU3悈0E<Å`Рáú¼/ñý¢ïÒòh3™%âuýÁÅÈçÜ „ýØDž]zH?©ª¢Ô’-¶-3UØÛFi5Y-i*ØÚ6´mX¨ÅF`DdQI½ "¬A¼D$ß—ûoˆ´ñNÐfÝšiØÔÏVNäks…<õ»ò `‚·}È4ü{Ñíß÷©½<˜…É$±$¤+BÔ“²tNYx¨Ù5ÆÍ:i£l‚Ú ººÆ!r†V&‘aŠFÀ6U4"†K˜:ÝÎã!É*iqBwŽæBvÖµ!œ¾[ÚÙ›ZæM[šÕô¯¦1\½3ca£ ;Ì÷g{»Ûê{Û~Û»»½ xÁk+ G0Gºš‡Ó Z)Ýe<‹O6«D Œµ¼²ž÷¤§â–´¡ãvå rú`EEz óXPÎ#&¶Öé‡"è鳉Ë^W%£IÍõR‹YÉš3Þ8š¾G‰³ G‹8´L·âhÈ…¤I„8Z[E£^,!Âi3-¨›Zqå‹`pÆh°öDö“%’b»Gq¼JðuËØKô0Þ0±vÆžÛ»ïî|„ºžÅ  ä€‡Yb¨‰“¨è] kB…Â-h U‘‰Øn2Dj˜Sdï#s#‚nGäHµ&”™RR,Ó™¬›³ÃλoEnæÄNV6Þõ>óvÈ™¸e_¨‰ƒÎµW,›·q™atý„fD²7¡êÛ˜ ,ôû=¹ö웟«Ýïl–a{–ÍØöåw§]á«ÆYå+!.T” cC3µ­*—P]EÂ…¹ @G1:;,¦ƒÌ¨Ú§&& n®îõÌg]UïlÉ×a!(Š@D)šS&:|„#Ù% BèÆØ4Ó`³*ëбòT— žŠ¤ØàE psÌÂÃ¥]CÒm¢ÃUÝ* › RåÕ¡´E$2!”*G¦GÈÛFt×€Å<ìSîOÁ–R‰ÉuU(pLáTmBþ½Þ{½ (m¦F]á.f¨)¢ uI“‹ˆØ©T¸HEªx±\|«`4•—60X­Aÿ #:ì™J¢Q0“訳°Sb ME¥6²kA´™Jmóðß—Ï“î´ZÈ«r_# §"Üy ®>ýÕ¢™J\‚ !7|eyEaEƒ$)ªÔ«+ha™Ó‘ V?¦èŽ‘Gýu`D³¤a²/ëuv°Á‰]ßÅ (6?&dËF:^ÖÈ Ý=Ëz ]s–¬jóówô 6€g£ŸM×-áR¤ C97PLجB Pm‹ °ÂâW—Rßô„ ©‚I„}(H“’m”j$2Áe³E·V¹¶ëd¬•hiôŽó·:Zš®B8*Ó~À+Äkoí‚>+ÓzÀòce¡X$† G šÒÞÑ`­-b•{AûÑoZÌœ‚ëb­3ðÅ&ªˆƒ{ jÒĘlD£à¦‰ôULÄLUžÛÖ%f\Çw#˜"‹’`Þ°ˆш¶Tq@Ø$ª!l¢Ë Þ¤–ÉZ/Ðå›×WQÅÐ< ¼mî - ©ªõÝDT‡|¡_ŠÃÚJTE1øpbI¤ ²~ý>¬>éöšŠ9|"WÓì6%,Æè‚• *i¥[Æ!X¤ù/‘Å“÷"Æ¡@”S aKK$F%I(&¯HìôPwÃî.YœÖ£†HRôÒwp‰“/šyÍnìyœqpQÅñ¹À¼EuÏxÔœU¤vªóY0êT¸Ã*yØÒ}¸J:!ËqÀ@ÒÖ&ØÐÚ“çá–!þ’»ˆÚ5“øxº!@̰¶($ád&ý$c¡åd€CPKEfš aI3ÐI’8LíB¨åz‚ d„‰_-RBŒË™_³ä[IO¾Èƒ†*D “ñÚ#Qò4˜›‡6D—E5÷á~Åq$™H4ŸÆ‘þMÓ†â‡]Q¿hSEQ$¶0•Ä7ŒÆ[H¤ˆ„‚ô¤ªŠ ú$j${&#RÔl‡‰&yü¥vt\¿œJ /1¸´~è…¨Äd…± È¡TÌR.‰KÁJ‰MK’©Œ5 ÃEMjJ%©X“KhˆhÊ:¦¹u~E\b¨YÕãÆH…ÆéÃ…Õ •JXÚ…*•©<{™áTr= ܉”€s~ŸImÄXÏt6 ”ÁE8mzmM)lMaö†³c}¬a3!±—Öæ—7KÞ® ) üÚm–Çi+ߊy£zxfÛ"k·%žŽ¬¯É’vH¹™¬$R€’±!]ÊÙ¨60¡PÄ•|›ü²| x‘? ™©XINVãÅŸ\F o«‘½!5D6k’F†$‰DEUh’á euHks—Ʋ‰e14VM ”¥À:pÈí$Re6É’†šˆ¹Ù&vlG[ i–?Š/ýÔÛÕgµaš†}kX«Þ÷› VEÿñôàAð<2lÀpØçÈ:)t,Ã9Šç?^( A²ì•é'ðÿoá{îWq±­o6âÕui@¦oªª®ßNG/{Ù½ì×Û—SÁ¾©`˜¨. °ªÂ=Pq–pj˜O´OY·yS%4O¼j”,„7 îîðy+X¤g­—Û-cÀ‰¿ á™~QâÉõ6QdÛí ©®&$×\°çqã8›PPõûÃôY…..`’Hñ᮲5AX9=ÝàÒÆ¬dïH^pÜš½“¨ÅÆoǬþÖyóá$’&ÛçÞ*‚lùÌZÁ"Ž€Á J‘H€#ò-ÜWî]ÄLû8IPI¡¢i0£ëI¦ Â3ø9 Ù™;#¨1¡(ÿD|•m„ƒß8¦Õß^Úàm¶Û#p!äɨ†­¹ŸbIÝeö¿B«X4¸ŸlÒݸ+ßñÝþÆî©§ò’^:±oöA·»X½/û»—÷[4p\ÏðÏ›»•¢9¤¢ðÂÈWj¡Ï1ª&óƒ pÛfLÔ{¾ù"";”o¿§¢c`y X¨¥óagK: b}„±’Îd¤0 b! …‹fÜΰªTòå§áß>Ûr¾Tíω­þ…ì®Æ¦†¯.mÙ'ñSEœ”CBÐR€‹# šZ‹V.´6·¿¦¹0Â}Ô’,ª/Ñ#%˜“Gm)tÈAðhR5L©LƒI-R±Qe”%L¢ ”‡$Ò¥$(R*ev’\ÖþîÊkâeÆ•ë—Ù{ÄMµÜ/ŠWºWÃRÆz‚ÅÊ 6#Ó%lLSqL DôL‹Cß°¤€Ñ L&j\r†;MSG ØŒl×~ ]6>|@Éú­ŽR¡È½P6J 8ëzQ&ˆP= »"Ê8&/€Xæd³  xX誢G PÅöWë¿¿¾ü7é£6ެøX°‘9Ë ?*å(ò¢2š‚Ùóâ²Ä‹H³eQOø²:ÈÇD¡”E ~áøµ!¸‡òÿQñLŒ13Ö.“áû‹ê¡HC%–Y½˜ˆÈ\qMI[0c!ZÔdïXe%õÒAõ‚aðà¶4ºÌVJä}¤«FȲgO8^K×3+ë4Ð5¶˜(ªRª’ˆ}9PÜíy•‹büt t ó¾nIwðžðaÅŒ’ÿrÆH$Е¤HâZX%-ƈ܅Ý `c} `¶0Ù£ ü1?\üAV±É “ýŠñŽ9$æH¤I[,ª@Ö[2 †ï7.–̰ˆ–XÈK9HŠ£y`¶2<š†¸ì­b6ÑäµåK.l"É伹͆¤´ Òk.ÖØAZ†îÜ À®^Kxnóœ¨ç!ÎJÉ¡[ZTZòÊ9´‰$`ã`«Ž»ú`&Í–˂O¾×Ýã½­W[Ýoqz«D¥t¨ŒÔ˧ Èä„€>~”6O ƒ›es»öI¦ Zlçå\íï|ªª®÷½옫™63®3ÛUMÊ!ÉÄP{™+9°Ø ch¸N͹ -{¯ÐìÄlÒjø²*À³ÅhÇNùì9pZi‘≂z§©bÜÝdIeÜ/(4²Q+TªñNJeAÓÈs jª[S‡Š!³É$Åú$ºs&UE-§›nFy¤Äí0Œ¥$ú:”&(Á{å Ø¢å´Ð„ï?cvßÄE5@×ÜP8ôæ´î¨p­ÖÖ `W¥Ê/ÊÕ`¦Q†Z¬K<5tîZͬË`“'Eºh6D€`b©Ðii¡µ›6ªŒ¡ƒú¤AÓr÷ø™APé ŸBÎ'ˆ¨{ÐAÉ‚ S{j®øÇÄ¥üq!¹¯)“¥[rÒ‚,µ+¼’’Ieü´=ìl½ b^hE]MÓÙ h’!DÊÂ%™4™?-Q?Ì…´c©qâeqª,aìd-·ôL¶„•0¶ÆÙÆÝPrä&?š5ui ¤+UD¢Φ|9IÑs8eam`=˃æ$ƒÈlÀ¦Á!Ò ~N |ð:º­ðé \?"Í1mGx”–$†)Z’p¹ JW´ò]²ÙgxÅrn°‹!fð`wÝâ­K`ÓÉ-*M&xdwž—¬Ö„2! 1¦4T­u‰é0{56ŸÎX Êl@6 M2bœNY´<%%PŒ£Ü¾pÑ×ÀOv@¨)PR^^¾²–q|Ù& A.Ï|²´°É ØÿìYäöÜ“l”3é ”ûƒlwõaGOç1+I3Ï} -@ñíP¼~(Aä¥}¨ž‹"MKD  <ð8„UŒŽÁ(ËìXh4æf\û¬¥Ê¨ƒ‹Ærâf‹_*0ôŽNå0¨ƒ‘ÆÚ¢Fˆ+QùdÙÌ0ù\‰X® g‹£°d§Ÿ$UãO»JQø€óÞ¥ )Ú¡¼!Zð’JJvA-uêX¤ -ÅäȲ >¤ û˜Ñ¬Í®ø1ñ…ŒØ…J*'U¯’a9Srú ZÛ*oA ׌Ýô†^šÇáØ&ø—A|µjÛÌ30¦¬’œâen3C7=qNèª"QTß!Öµ?"ötýÍŸÍûî½ØÝÍlÑÐ Qº”Ò¨°_q¶ Œià‚ÅìÆ”‚‘QžÐX—–RYo7wwyÀ« MUR¬AŠRg§w7Fó£¥Q§ˆ"g¢Õˆ.Ÿr†p ^$5žÕá |dN"Z­¢+iV©k¶5 r‚X±|ÉÃ+ŠŸQé;Øga¾ÔÏqÉŒòÄQÙŠàñ§þKæ.òX{ã<|Mìo $É.¨¢‹T›om:•Æ›§Œ2 # ÃI"J‚Ó)@JMLLƒø}#ÇúRƒ÷}&`Íé2é}gvY*óé³?ŒÜ8VoçÅôÉueR)µÔ/:r8q#™bM…sVÒ”žˆ›MÓ‘M¶.JL)XÊH ºMP)á}šWòq…'LƒàÝ™ ‹zUʉgÃo£VZ¢•hn]Ü’ÎB–Ø}Á…9#F ¨ÜéWZ5VÔt­…s%‰Ì'KÓ­fŠÜÒÃRÁ¿"LC†ÌŒÜ˜5FŒ ûc~ÐÚÙÂg ÂT@±Y÷Á$¶ÅaaÜ—²¥%¤ z—Â4j‚Ù& ?½z Pë+ŲÍFŸ¤­Tt£8u/¬,Ò„„Çô 6¹E¶Iv)  ÌØØ”áɦfX¦2h$ À+Jjÿ>}~À”î-ýèß½<=ÝÏ<ü3ÉMDv¯ î¬3ÒÕØ ûì–Î4ÐpÈ@‘GÁOªçvꪫòþSßw½W‘U \VçI'å?*1Â$3”Áên´,ñâÍOIã+I; "U¼r¦º‚‹)¢èáÓw7ÕÞž8/qzà½Äøg¾“—®3\«7`)’I|½½6Zíšqd¨ïQ Ì“YA$¨<7+j›Ž«[ÙÖÑÁrqNC°k}sHÛˆSæ3\2}Vèµ:5ÍCS;­l3ÞÑßóÛ„wCþ“Àµ‘@„ÀÑÁ059ü„Póàå/į~ôbç‘ù?.* ZzeóŸëb¼›P¾ü$ÑxØTÖ5×mÀŒó m8#ý«+:e! ð2•Ybé“! J ÄâH„ýj—È™ËkIeœA^é# üxôâ?s¯jjˆ‚){•YH/t–ø êqH4…m§Y~Hg<•x”þ™ywÊ0Ù>EhÖ˜gçÙ/ ʇPQÊñ° (©¦ÅÃcg#!1.ËZÁµìb.Á&rœ) „ÿ£L.Lpܸ+!ŒXÖÊRâiàð$øHš 6tU Î,òe tLHÓLC00’R»W©iŠº˜j4v‡lU–U⪲pîÛM,òïäÓiJªGˆÑ´¡2l-}I@šr} 1³j¾Ž´#ù"G/*÷óúa,BûÈ´ÊkàǼC{maÂD NP ŒgV a!¨ÑSøZ s'y¨¥Yô3vË9¼I¼`è‹©½²ã‡y¦ŠUMÔ–Q54L°tCM}¤iT_íwÐǹ¿ÒH\P‘ç æ’¹RÓJIHÂ>D©!Æ1ÛL54¡ÆÛ•UM±…ðžFF)8ºúBešMɨ!e—€˜eQðË×R€Áνbp`=ów4‚švò㎫±‰cM4à¨Ý‹+™¥!b1Å;ËHfðgam䘴jF-tiâÒüßQà& ÃBm—!Viv])3Õ¶ †p²ÄÜÐd 4-܉¥ƒ‹\±Y“†:£³PÑ`@ÖQdÏÈÒÜ}þßß‘ýJãOÄ +éöÿZƒ@(…ÿ¯çǬ ›5þÑð4]þZh-$²éq ‚ Ï À£âõkùôØ…'ô[ß¡\iÅŽ³>îzðEÔÌéÌ¢wd`ºÑEÓ; ÙÅš;©Çª©Ý{t%Sne&f½Ò¹îçTööÛÓ2ðß´ö@Ý+Mp"ªÉ€±*´“Âf³k,Ç©RòèïvòXGfzªª°·g¦;¯»î]ߦ#c·g²ü#eÒâŠWÊC‰1vozd•‡¢²ø¯ÖiÄ¢áqS26‚)/ˆ0è(³‡ÐP_¤€ïJjròóãh(®Ue£VïtuN²V3–—º™ˆß¯!>RQN›žeQUFÃ$›g4Fniê’à“GQuÝþ•wÅ­m0Mè4¬$( ¢k*f*oÚIòjŽhÄYPYEþ/w7ÙyÎ[…@Ð2C «…¸9y7PˆFK%ö×~ìÄ2àuQÌsAÔHă¯*³9$Ž@#ÉX蜡r¥a,…Õ¦”¤ÎÔ1€´EK(‘Ë"ìðå43x †\(-‡TÀ< ½l%Ì+˜@"„©EѲ)g7FÚ4mÊÛòÙÚ5wÇQ±-Ë ë¦=1Aõ˜›n‚^‡Ü`{VH™VÏj:éÔN )K)Ï®ÕѾ"Y *¢ÊÌ$i ¯­x†@Òi‰S¶Ž†ùŠ"‰ Ô#)¥òÔRB©U5´(ˆú~Va vKôœBSM·ˆ‰½4DWc`.øé;&£U®.&”eÕyyÞiÉ2b²âÄÞݶïÝÉ-‡ŠBùùÞg!ø}ï! <Ä$øú~ü0N,Ž2‡æú! ®pÀÞGŒü¤'b_-YIéú$-DîF8"†èP:¡ª±9¢¡€ÍK™½Îjâ|0h‚Õûòë?Iü?Zå_?ÝùIo›pÝs.X ‘Sm´nŽŠ9h^?¸Š3 äÐgw¸ZjPƒ0P–lc)w Ë\¦Cqam¸˜u† …‡5”Vy8ÜÙmU,ÝÓHôV¤H.š’­xr3éˆX±±»l`£N[¼/ó÷ñ¦Ð€”À ϳiõ…Öá @ÓL…W¯¬X°ŒP1 ãFîpô‹ZÓM†$4‘…ÜŠÓv¾QJ«ïBÐèBʳ™e¢©ú!ZÒ¤AÈùøGÖv,2šï#v³óëþ-Æœ³“‘Ë3$TΚvÛmö3 `ñ Çö¸  ˆc¼(@·7Í ÂF*e¸ê:ë­¹ŽT1奇Ü×·óM42)96„“‚kÛ,ÞnÔ–1B ì,&ši¹²¾{D0i spâÀHi¡]ßÎÀø0MQÚÁÌlNH¤$J¦€A`·»ŽyÎÓ—"¬Ë]ùkìwHñeh1È,9w)náÁD~^w.™9†.c$ Ã<[ʼnKHhPšÚ Ïè%e† [RÀF#%Â!¦3ßNî Ðu‹ mBCrí‚Z¬EJ)¥hà’í$c)À‡QvSRæ(† s±¡Ï>\°™n†±äh­:Ví€L9,Š\H'zÔ±ªíÚ&9paÂŊìÛ0ë¿o'.ŽaÒ¦,—2 DË#QW;”Œ"© ®6 AXE °Æ±$åMT‹L‚zõ‰P!PÏŸOÉøG‡¤Ã3vÙÜKR¶Ïáx§ë¥øåξ¹¦“5$[—C"¨¡âÕ L±/.8Ž ²Ó#{òéëË“´V¶IÅà$¾îýñìä¼ nÙêÁ„ ! %¡@fw-Ô4h €jbÒ’iR1¥Šë¯c¹¾Õ˨‹Ag.íD”b.öSWÀañ¿‘$ÙÇÂt4Šbó Ϩ÷¸Ÿ—J!L„mIü¬(»¿~þEü3ôHg° *¨,¤U$F/…RüHøDU úaûF:Y** a¤Æä ?>ý§{ð£<èx$ç™ç¦ÈTÛ¨ÒX7Ž]°²†„Œü,$Kó›°Ù &ÕƆ²®ô´FŸÑ†’H¥ð_ÆûëôVœ’•¨ê£‰cù.«,[ðWrltÈð.òC,Ü3žœµáÎY´j2ÓeŽ ‰”\Ãa#hRb4À.Ä"Ó2¡ %©¢¡P Årpäd7#"®%ŽS¢T–3|™â!IÆ{;R¢Uê$Ãl¯ëF‰»³A,BÑ âÔ†›LÅÂL&Á|››4p‚àF‚ËahÂDм¢J‹1Ý´G2ÁTN¦9»š‹,¶[#ƒK•&–LT±c·…]*Ëð‚L™¼¾x½  »ùð< øŽ€òäìFJÅi¨TŒ0B6±ºæRj]›ÄolibYG:`‘¨W²Š,†1 i&2ÕªUKjrÜ`ÕN¬F*;Rxá4Ø ÷ȵgÂeøðx€›(Çð“OŠŒd#Äš¾Mʆ ¢F †$<é(h±Ä¢È§Ș¡ÏNBEI£`ÆžFo2¯M b`9Œ$ÈÆF“$ÕÓb’Ë ¤™$ˆj“$”&¯c†-áXÍ(:äÂÃLT`Sq 7ƒh8p˜KC1Η l"AH“ñ„ LNŠDz!4ܤ‚n q7!uÈäÄŒdd´ÎZƦ*ÕM˜Òhœ:\–™ù`գ⒈<‰ZY Có•E5‘2¥k»†Þ9†G2‰ÜKnMKbŠXœR%pYXæ7Vš°’¬aÃ=P¸÷j“ŽPhgƒŽ*¬5“ãRÚý¯—Û»W.(0f`¹¥›É ΪtyêÞù#Ñ0¢Y@°,Å—*ü÷&awlMK&‘5ƒÜA"ÜÞ­|ï®a’†SP2H5¶LF’SGÄÇJ´1xjÚV¨$l "…c…óæÉ¢[ ‹YHÃæÒ1–‘Fš”ˆ@s´’ :Ë J ^|®`‚(5!I(ë^\™“à_ÂC "TÇTYG!¹DÚVÙ’1)µ"4ÕH‚>L‹®.Üž€‘²Êù)ü!DDUEWߥÑ3‚(½©‰´NÈñÓ*ݸD®14¬»wÝÕUU¯g®»äϽ‘~®¹÷²‘ÁgA°ôݳEyXoiãp±ÌÃ4ƒ”²V‡m¼óºŸa›Jøåì+kŒá¥ot!)"öÑñà…ïÏ|)Ä(©€rˆÖ €zÓŒ uâð!%ä6çnq¨bÈ„´c¸k¾NfÍïÐL|U„¥i#xø¼&¨¢‹›#Õ¬)A~”É’>j¯—¥æŽýï‰àhk^-EB½Z=‘äâ “¢9c¤¾B‚ï±s¬\.›6±»»Œ‚ÖèQUª ’Œ•é-+kI¢gLR_§þŸ,ñ­|Œj@\(( ’Tf?†‹í)GÁžáAC^ È$–˜Q,c|%!ÀlMRiB­˜ ­­ƒ –!U$!¡u}‚D– n*Q–JüÄ(&˜î£˜â½P‚¬)•vå¾\õÆ*n1²ËŒž2#âšÂš¡NÖ² –ÕRн|1}š£M%Ðå|Z}2û×1þ@…A!®DÒYR«ˆÕcÂHˆ+⡃ѯ®}‚z4ÓĆ6ƒ9ºõA¦((úI¬°’”3áÅq —.ŒF›aJm„ACHsA&á§£¢ªj«é÷2≪BüòPbбü~ à䇦ä¹=×Þï]UUd÷>ž­éöúâßdÖÍçXΡˆ®¡õšX¬Þ;¸¢3 §+Txh½°Ã‰ãÕá½RAF‡RSæ­ŠVI–{ :Íò™rà¿+ƒ=j¶ZíÓ™^9Až1TK®gŠ=^Z¼r•8ùpq&xÅÔ/\èÑxèÀñ1¦—Æ«Š÷idâ¨1tœ:ÄË!bö…-ñÈ™&‡!éÒ‹J]“D°ƒV­ä`ü]IÓàr±[ ò&JÔ+ÆšdNM§¥p Ö%Í!SŽ`’tg6D´·Z…b˹$Ô¢ö"V.V… ÉJˆæ‚Á¦Pê¦p!x<$)I £72)eôÕîö“žêDÉÀT),¸°M\$,¹XÀA­IaV¯,“Jo:Þj'+Ï(£Baã‘I— PšB—ª1QâN9_ކ¤âJ ¦N &“²:$L ¡a \4ŽÄlÄL«`Æ”£ ÒËmÅà¥V ŽÛ„Öfjop4h “Œ”bq¡jH_°kˆz6›À„‰QÔ‘ð‘`× D$œª@¤m “·y„ ·ÊH& Ë‘FÉj‚½ç`† XXƒŸ<ÊÏ«ãÓ4ÃÇ•á<¯ÁCV4í&‚H(I·‹4)qQ¢ ¹‰…M,Ô!1 ‡ŠËTª¡0ž™â 84~18„Æ­Yà„®HjsËûçxã•Qg”Ì´¬ }WoˆF=Š L©£åR\1‰œÂ†ºœÍéI„†—8R¥5 “(•å—üÈ#ÆçI\V†±äíþ–Ò–ÛoÞ"?*(¢‰OòQHŠÕlTZ5"mm¢¶­I­VÉV£m›VVµ,I-©–ÍZÆŠk-”š¥šÓJÍÒV6me™™RËkZ›K6Y‘ZlÚÖH±¤–*ÉØ”E¤M$«5Y6ʳ5$µ¤"Ii"P*!%Y%©"FÔ²¥£jl´©Z±cb¶Ój¶Û|½×·’P&÷’öÝ»]uÒBBJRI$ $3$©S2BLÂ@6l“SRI3$’@“2KKGw $ÓBBË)IzòÓ,ÊÏ^’i™%)R¥)$’ZZm›fd––„™…)JlÙ$”¡&d›6HlÙ&šHí¶×qÚÖîêî–Xîæša$’HHi¦Í’¦” R»W]3 $Ì’I$ÌÓ@’¥I$’M5Û®…(I™$™„’»]]JP)BI3$$$$$’B”Ì¥uÜZîHYfd…)/[mæ½^ õÝÛ®ŽÚ­ºè:«¸fõ¯Z¦ÚÛ$Ôöö’R©$½­]uÝÝÜ’]¶«w$’I$,²JSM*T$’JP” M@ É ÉzÖÕïxHHfë·d’¡™™›®ºI!$™„™$„…J™™™’[»™™”¤’I&d&Ói™³e)™!$»n®¤/^i—¯@)I33$’^»vI$ši$™„™„„”®×pÙ³UZj«]­®ä$†a$†Í’HYd„™’š”¤!!.½µµ^òBC2@Ì,²LÉ®ºR™’I™$’VVI™¦&d’îá!JIJi¦d’fIJšIR®»vI!™!$’ HY!™™$„”®»½{mZ¶•¨Ú×·²JPÌ$’LÀ ÌÂKe²JP’BBK,$zíÙ&a#®àHH¡¦…)&Í…)&d’˜a³d’I™! HfI fIR¤™™„™™YXHI$’i®ñƒ^«Õ$²É{¸™.ív’Hë¸fK®ºíï^’Hf–HH÷·¼3-–É$ $)LÃjm^Ûk·d’™™’Yd’I îÝ’I™ ™’e)!™!!!$šÓZIJi¤»·a Öµnä™–Y$’ëµÚI$šh6KÛ®ši$™†eJ½¶î*î·Y I™ ›6fI%+»’R’’™’HI˜fš™’d’I!!$$’R„†Ói&fa!¦¦’¡¦’KÛmy¢6ÞòI{«©³eZU¦d»jîI˜îæÍ!!$…–d„»®»®»¸I¦’îæÍ’jj;¸f&Í„»uÐ^ôÑï$Ì—µZë®îfI˜$†fÓi!$™™„ J„’fm6––†ffe)! I&`„’I˜HHR’HI!™›®à=uu P’I$J•6›BI$“0 $ªU$—»#ºëºé ’HI&d»víí­{[VÓ5=ï]tÌÌ¥%ÝÇv×m K,’•ÕÜ¥ u×I2I 0“iµÚõ›mZ«×®ÝÊWVÚ×p33$’”’LÂ@$Ì—nº„™„™’fI#­uÓ2BLÂLÀ)I333 4$Ì“2@Ì$)GuÑÞÕ-­LlÖ{Zö´²Þí®ÚR’ë®»¹&d™”¡!˜R’Hi¦a$$„’K»vlÙ™™™!$’JYJf»’I™¦’d™Žë¤„„™»m[WrLÍMI u×I*T’M›vÝÝ­Úí%ÚÝÇnä’fi I!$„†a&¶kfÍšk¯Qï µ»nÙ f;vì’”3 )Mf±Ýt—Z÷¼$zîR’ê­×@w$¥$©Wz«R^ñÝ»LÝZÝt%Ýt¥vÚ«]®Ð’LÉ%Þ±½zH’fI%)/Vîf’IJI$’ff!$’Ji¤€I™&a˜`I!$šhI íØë[®”¤šš„†¬ÕºÝ» Â@$ÌÌuÝÕÛ²M› ÊR@Úm¶®ºfI$‹¥0 "„=ô>“ããßã#9óÇïËmóþ¥ýÁAO0ýß‘æ §ñÛð¯Â„Íw1Es¯Ÿ.×<¿ˆ¯HTÑ‚H ½xØÇîòî2DpVVó/Dæ%_2Ž:eGM¹Ú¬ón–×Z #! /´Áþ;g>ó¥{"‚“–T"pcWÇ(XbÌ@ƒhNz·…­ÞÈ5ÆޛÙ¹õîçGß>î™*e ÉЂ¢?ԵфÂE ÄÁ†bÑ ‚˜E‘YQ+†PXAJ#Ij?/§Q<Ïñý+ÇÍE=½éVãYÕ좴,—·ÛÓO kåë?õñj÷åýŸ¥Ê ôÿB*¿–®VÝ[´¢+2·õ÷ãúÿoéþ‚I$’L¢}‘yxmåáã£Ýå¾z˜è>dÊu„ÒŠÌ6~<ó¼¿.„çŽj‚ Bâ*ˆ{§¸¡Ê'ßØÇ¡)€ýïó¼çÐú_߸óóŸ£^.wö­¯ëßéÇÆ‰ u¿ÏÝÞ%@nÝ£|A²ïÏgÙß Û§lxáç]‹Ã ¸×†v ¹ÁçkIÂø¶Ø=ÛÚþ>/Os­Ÿ¶”ƒãР΀„Ö–©V‹Jš†Ê°ÕIIK²TU$ò¤Œ¾¢ßɦH@² »"eJ›§þlïd¢Ý,WûA?+ ÒŒF'ùb”4”–EY*²H£,™ ‹©Z›nɤh¿Ò«oÁTV+|WÙ[—–¹VåFÆ´[-\ÅUÎEh¹¶å®kü»U6ÚûLÖK5ëuȶFM–”ª%¨T©3 ,U‰ä*b›U{)eu*ëipÍ¥¦RÀX ,P…@A ØŠ¸¢•4TªŒTRT*T(¶šY-EbÛu–éVR¯Ûâö¤¿ ýMý߯ËõýzNï$ýà‘´öÕøo÷Ôç` „NQ,%¸]IúÜkA[úÝÅËí§Ý{ ?狊7ƒ÷Jâþ\¦ÑkºCýRT­,‹f$Š™eÉÆRËVA%Š˜*¯ûû~qm‘ÂIlIÎXHU l'ßøxïü<>Rû{iÈ9Î%âŽ;ì$oé„´-Ò ãmyùúâû3æž@õ캦â (ˆ¢Ú4fhÆ,E±¾Ë†'væ“{òþ¯òGÏ{úo®Ø_)ã*+A@5¶Û¢ Öp‰JîoˆëéÇ—‰·ÄÙ[B@$ $Cuœ”,ÔRWçú~ß7¾WN]>uÓ D€‚ üP{øï×›´G{ÅCæìfFÿVÈsÁ8#Ï{ˆúwÇA„ Õ0h—ª½P¤„mÒðâ›øå­oÓ=3«h€.^cÜÖЊx_:v޳¡Îû7hõ…°âúuóÄûpºû-À@-ϧÁUñÏ·¾U:D¢ Àò°¡¼ZÝ/ª=Ù Zh¦óO?Ÿ2ÌUKzïçß<µC0PS`ÞäÜ7‚ÛöþÚªŸì×ù(ă"„€É BI;˜¼}þF}‰åEŠ·Ë¯·××Ç7M*Îh¡r_R€ ¢¼¾>w·6QÇ3M$ø¬è<ëϦà+qW}¸å|g’Q¹~¶¿Ê…€WqŒ‡ãS*CQØù¾laÒH’POn¼ÉˆZš(ØD‘¦HI$£ ŶNª~ö?Ç%IJ“Tü„BE4T¤¤¢i‰Ò|Ø“RÊí»*š¥ª­-lÛ4ÆÖ*+2µ)jŠù¥ÚÔ¤Ì#ˆ@u9û}9ùO©ãië>ZWÔùt9‡0LýmŸ¡ÒþM~zÞý4."óà·úqÚÝ‘úĦÙkÒ¾xí”é§/?#¸àþÕA `2 -$0WVÌ–È®¶¥º•-¥$€EA Š1F…Ù IBÚd*bФ”¢­”ªê×]i”¶l…L’B€H@ ?^užŸzíú]±T÷C‘ïáf¿ß¸z½BBªƒ@ÐEa°1Pñ œÔBE¤ý¾}í® ïÓ[*)d='m¼<¯©¾¾µ°!ÌŒuöòÁé–6çm9BõYDÞË@°è)I’£T¥¶ŠÓJ’º»ªe¤¢Š©KEw êÛ‘EMµ•+Jž¨,¡"A,!aR”b¤²IHR–Óiˆ²jÉ$.A-4Þ*)ݯ=¼-—nüèˡנröO¸$H#ë´oóŇž5;ù%lxÏé¨êâÄ·Ëžc·n­ßÈðAçS¿nÕõ*oš={€„aVÇ›þ‚ è9ÈÁŒa è±QŒ ¶ Œ)’¥…ZÌÅ)2H²| ò¬û(âS„açñN`O¤¡*© Ž.>ÒÞ\ý/ò9|úçé붘ŸïW¡’„êu€A€”°yõÛ:ªª?o—ËÝäFp¸ü:ƪ÷_„@¹R<‘Ø@@°Ô¥[ßú:ó×[5}¹\ÒIø¿,ô" "«`±%-Cæ‘RS K& JRZc0–‘l ‰;],UtŠJÙKWJþí/T©¥¡* im›Uí-É be†H±*H%ˆP`)F/ÇNzrÅü§…¾%œöØ Ü-, ü÷öÖµ=Ô>žC*DrœŸ_†ÖàŽ}øÆÒÒ9ãßë´|UµwW– rÙg^ûB@=‡…¾Ö¦J’TjU5fRÜäõ‹Mµ)ê¿]ª¹µòVú—šÙ¬³(¤¶KYjcÛæ•»e‹I"Ô,…EQ3VHÄʶ"2ÁBRøxùôô+¼ôùtËÊøÁçžší¸ò¥L*L(b‰‘*T`Ä¢ ÌÙNä¼Oy$‘BµÛAø ´‚+kX«Ì9/j¯Y§ë¾š’8ó+šÛ•†3¢‰Ç…^çí=w¢ö£Ä‡K¾ûøõ¸x›V¾+>ù¼ ª›U#ƒ„H ©l‘V!bL†# ’• ²¥©®é¶[¦ÔjM©µ’a‰ˆ\%1 Ë,–ÊT´m•uÚ»vë.[0÷‡y®¿„["‚Ÿ“ËÏâ¦nÇÙš—) ‡X!:íÙ¾¾Ÿæ`gZ¦GT€Äp܉·1 ºcN°TÚØq™¶ßô1FŒµ*Íu²I+)$QRÔZ²#ßR!åpRÐ`°YX°R@:Ë+-J¶id¬S+59ÅÀÊ "¬ËdŒÇÏáž_Lóü¾\=ÿyöÔ›b"?;8¶•°"ïFÄ‘QÒA!ú¯Í³k³¢ŒèV¾×;^ôú]ž—êCß¡ðQ,RÄŠŠ¯€•#*E*>J“*È)1£ E$¤,ªXh,6„€€µ£™ÙÏ—/{ycÚ{_Ÿ#¯Íîz£f¹]Ð^YxáÀ¸÷n-‹\" ‚%iAþ3nÕj°!BʬÇÕãñìéj{Ê‹!„Dù’1¦ªhY'ûõ&Åþ¤TL¢©\‘¡h`=ûqp¹ û¢¡Òà¿/—?\­_®Zg›]³£ïùpÌP9ÄdN`‹Ø6ãB×Z«ˆ$Vÿ÷Ç6¤MuøÇâ·ÎÿJQ"‹]dð[˜„mùBXu}Ü}îÖÊŽÇǮ̞G…Î:ÖDy@ƒÙSß™Döp@¶–ÆÆÛhÕ«•uemEh¶Â˜ÀˆÅ*KtTL¤Ã0*’_Ï"bURYOüHÃñ&‘’IB…EådLIaͲKÄ¥F)Q1RŠŠe2¦T ¤É+QB°RPÉ>üþOèHã#âßOqJV™ëMñËÏ»¹b"ž[úWšk_+iKô%´Ýï°ß•‰øçñË^žÞ9*=ð!š=³ÝQ "!Ê/SèEëãÙ˜wvc®;º H@4Ê=×à ߞ*NÐÌ\ÀDéøßó—3ÖY± ¬Wåáîrlµÿ:Ë dHwDWÆØ2&$–ÒÚT”íuuYDénÙe±d´WTµÒÔ¥¦Ëv•»,‘2Ò¦¬²ÍjVémvɵ-:ëYn›u¼ÇòŒ$å8*Iª…-"ÚJ]:³+kv²­rŠ4`Ú­‹mcU³\±XˆˆÅF"‹EbŠ5ˆØ(Ù5Ñ\·Tµ)–©Sm&Ú›4’©·Rºå:«•ŠJ-.ÝnË6Y¨0`‹,H$dûºx}¼ªþxëÔÆ_Zu@Ê‘AN¼¾†÷ðùò’²áPN_Ml©Øæd!Ê{ó=ñ¸uÌåóÁŲйŸNW,ƒÐ@ƒæi ú iU *Ì\·Ä™þoUëÊÉRÛe¦e%›__% ãß¾Ãñ÷ñ Ë2ù~Iˆïùf2‹*GÑ1&yDH>ÿ¦þ>>Ú†°íÓ[‰´N°Û­\mžœy¯@BmõüÄN¦æ¯8æ!ÒŠ$Lc?Ð%2ÉR|XÏXYò1…’*´a²Óm±ƒi³kK+Q¶™¶µ5-šÍkLµ†© ²*RDF¢<¿Ÿ¯{ûùzzÂ|?Žá:A$a@e}¿õÛÚ}½\`¿é|j1ç+¯k¼y[¬xf`u`ºTK)d•!JL…õ)4 ÑŒU3!ˆµ%©,RZ]•¹E–ÙoË••oSd©l\E’J‰dHÑ ’J°Â¤Rbd†!jUV&Œ2¦š±+×[­+ImÔ­&’¢ bD‚–£ÝTœQ2¯™Ïæ]À ó†õÖÅ¢u¦˜ÉûU~MYÝ(ín.\=;ícIR*¦CxZGtŽ«èI`vOŒÃ33}—ã§ü8ígóÁL9k,(Z9C§¯¾…(žgýì{ãñYßçãož^#¿FúþùËåŽ5åÇn. º(O:~Tb\ÂÒ˜†(?;"&$±ý¿/áø‡éû‡öõ€6Åëcüà c$?§ð¸§¿Ÿ#˜{òü¡©éãEsAɼý츦ì'ïFÚG áÑNŽ'®nMd‹qU>£¦˜d sJÑqî¦Â~h®¤Î(@JæÖ׿/šx7Ü~ÈúŒB 'ÜÁð“ùÙ. ~æ#âvtTîWã<{9iòñ-’æAÂ$óï`y÷­?õ¯¼ý×s»t±*˜Š$YÞFBȯ„ ¨ïç˜H…Ã%Qà½È!Ùƒ¡ÄôOî9ƒÈéÑ© Ô1*zžùú­‹m‹eQ2 $µ*³›lÕ³Y²›VÍM´k*VÓ*ÑU„L5£YL&Û&µ–Ù(ÛKlÖ[Jb)*²mTX3[6Øbmš•k-³ij[k"!*šÒÔÚ–Ö-f¶Ò£h¦Í-–)šÉ¢ØÛQ¦ÙVjŠ[#ØÖdL¶mMµc,F’“ ƒ1šLY()³%B™"@‰3&Š&6À3@I”†Ri0dB Éšc ÆbÄH0bd(!J`² bd¦%@†ba£I™,”b˜b“$ˆ$¤ÒÃ(¨ɶÚj²±d•lHˆÉ^Á–&ãJ¤ü[|Mɸ|'ÌúsGÕæ8ù˜ò'ÿ\;Ž_ \ïû×Ï3ì'`è‹äü³Üú¢'a@Ñ„U9EŽØñ :#PÍŒR Ì5üQ¶<Ò oYÑa± h-|ùXSPƒ›ó@@VD«fs5è{¤œîU<Þë^óÌŠ5α–¿Ífn‘¤\Ž2*‘ ²*Åre¹@D‚6ad•ÊdI7,žY¶jmcV,X85C‰µÆU¶X¥†–J¬0Ãh©ê*)ÙÁü‰_Áñ=y½ïlm={¬?7¾¸z¿“ŸWƒÈÈö<Ò{ ŽI·„÷¼ÓÌê;´mÑd`}aTPƛܦÁÙgb%Š¥°Kd¶ØE”HxO/)#S´ŽŠˆÑÝðžË¸1CÉèCú¾Éó;³BLU|’AèÈüQõ¢ÄjŃ z Ü\2-ôTjüf^lĤ‰1ŒM&Q9w·€‚&ÆÆÒje´PÄh™@@ˆ(= Y]ÐïE„;4ÒŒãYO ¾¬.ÿ=ùß.×··Dª­’+“¯󟓉Ôëßð|ä¸iÃÑì>y9TB8Ï„ÓÀ|Îf‚1r(ÝÁ¹IÀe€ÊôÆ¡²gi,4$ÃÐ8Z &tgT`BGk?rQEÊ07e‡`¨àç<eèprÞíèÞ˜ˆ.I(²òðLPQg Q†«7NÈBg`œ3@÷1QEoÞâ4–V[ðk©µ¦4- ¢!K‰ÀÕb¡LA€Á„F+‡v,˜¸T-.(-)´IX“E’”XT¶$ä±Ö:v»Vj"›ZM¬©U:mÛk*k*”Z[e+5¥>Í«¥mM²ik)µòë³ “llûêkµçjM¥›M*9vL²RVûÞÛVô¼Ð™£¹É˺‹®ä#³£—ŸátEU5$ȱcl(ÇF>%zvçu;”|ëŒó„.%Ó9ÈtÜõÜ÷\"NsË—œŒ@éÜý*·ªïúz¶°'| `J@ÒI#rü +EqýÄÐß#òTýȽQH÷¬IîIåÿ;´²¼Y0Τنáða‰‹;“bª*4b6±Å—ýÈÿ9+E?Ùü¾ÍêÝÃè²{³å­}’| '´W=”Àih‰Eda$:jåd™!0’,“öíÝŽL¬m°ü›ó¥æSçLÑ$b¸ŠrT/Ù>D*0‚a¾å^8prÎ éY;áÁÒ:¶ÈÕª–X ”)œ.æÕ½Ói4ÚÐÁÜÆl²n$ÙËÍè{!’ÜRžã‚¦ÌmL$äûå±hìh¬‰Ú)<†ÎJóy¾utMÏ´‚Aèm==‡Ý"{•Oú6ŸU‘Ùò>¨ìOCÔô˜|ƒÉeÌi\.­»ÓZEm´SÕ# óµ4ÆG+–E±é'x<ûœ:ú,¬_q§ÅU³É¯ë‘·Å;cOôN˜©[y_[®\[šmˆb}õi$ÇYŽ+œei†ë+’p DMåÓCœÞÇ Mx¤–“7œ7I¤É±±-Ël/e(aD‘™§6â†sÉŒÈVá»,³I¹ ©†UŽI­PXbTH­BÀ’JwbØ6nN[p•µç¥ªÉ¦†Ò”Àr¶‘ D„n4îZªŠôi3LhP@WáG°T¶açQKtsYÎÔ’F4¡-¼/•.š¾œ©}]]™-ên$‘б[}æÜÛ& Ô™ÇÈ»òKk4‘#‰ :¢i«Q–Y$¥Š¡e­¸nkg54±5 °mRs+JbÄ'ßbÝbåvj8k-•cĵ^¥«ìÖKLÛ|½÷ ··¦’LTI……:F5$1øñÁ©!¤¤šrÄs*-B,¡ï)‰Ú'L7ÔIl–Ï6Z²tª–½‹…íViºXPÈl„ ˜É)Jw1-§S£»ÚåÝ6]¥GIHÀFÞØ¬„æ«i„4¬JJ[ V C`|K ìvÉòcO ȘÔÃàH´Ž*WGO(‘èÂ2Bz)j…'¬LY,n[edÈš<'⨠‡DAÈË;Ѝü +‹òüýöûû|Ú4›²jR’ÔUîuºËY)µKTÖÌ©´¶üïÚé`3&’£?Néi9¤aP­t±³“eµhĸi,†&Ú9m‘²•Í^Ÿ”I;üÁ9š[}Š·‰¤¢e¤HÚŒ M@—M!†ØX>á‘ PdBbK$1 M¥©-!¦0ŒY!‰01&f˜XÛVå¼![d+$EVHŒrŒ³âZÉ‹Y]Üîç"ÜÛäËrÇÅÞºÖÒ ŠÛ ‘*0™’1[[&DD‰‘€™IZ)#H"8-F6•À¤È7 A­DI°ˆŠH¤„À×2 •p¨5Ñ-J@–0&³ó2Dq33™¶æÒi™`– ¡ä.92F"ʘ©k%ÉA²Êª²G 2KÕT$Š`+þ ê¦h°ˆ1ö(!°Ü67#ï6Œ;'’;‰K¨ï*,ÓŠBÚTJ4b:I†Qç Јײ$‰0áãªiY®y‘ ét™™]‹¢È ÝØªÄ*§JT©0ºZ²ÎŽ‹%LÈ<Ë:‹©u D$2ˆŸBØ‚ÑÊ~*ˆbTu ŽuÐÛÈ‚ÈR`J«0…i M”Ò¶3…,š¶RÚ–š›Ž—ëêX.4¾±ªÊöåX%åï1E:îVÊj:…NžÈ®WoiZOøq8ýCdç™Ì…ÃsÆC…D±§S(9T¶ÔƒÞ²ñ2dÉÂ<¯¨±6ºàº.„0ä˜0´GRŠh²$‹èºƒòÇð€äĂϴ$•΄B¨”` þªf¹Ž\A3v†ÕEL(ÌÏ©C¹‘XjÁ#BQÁþÏÃmkê¾ô­þjºa m6[2têY!©<q'ÐD¿aÉ77_ ¥½Bp„Ô'±Ìý¯CLj‰ƒr“2W2jmËXµ?S#,ZSÝÍ´¬&’tÒi=þ øx>‚"CÌNðí¸”™m˜4}ÜæÑÅʲÚP‘"Fc)4¤˜Ù©ªÒk¯çç÷/|øÅ¹/—ËçËmC6¤É¶I–¿ÁIDÔ$BrÑ_c¤óHv¶X²ÕI‘ƒBE„(VöYö>Ýgý½ë~Äúg|ŠÙt€AL²ÄbŽšÒª[ ¨1Š çý±HÈ¢s—`!‘Ø –BØE‘8¢NÃŒB-‚x,I1²sDµ$n a’Ô„ó±þ~|T/bBB|e 8VÔŒl’ ˜aŽ\®f ¾XöËáûÓ<÷Ï»_NÔE^nîfâí¹S‰nÊ5ˆ«®q̨k&¬»2rfG"EŒŽ^mäDEÌ®xûîòbJ~Èýá´~ ÎHÉtéÍH9Ú½qyŸ¸pΰ*4V5€BäY$–iÈå|µ¨E¸ó±ËlíÁ˜LÑ`¾Qø€£'ª#ü’{ Û–1‹è’ù=9r‰ÙRqOÝ’ °„zIH°‰ ‰ ÂH $CØãO‡ƒñòOèí4+æÿqÞËeEQRmCÉþ¤ÃüàñÉ©'•L³ f‰Äz0þ‘þ†Æ•âG'NÓFšÖM’1CÍØSD~ ` `Gê àúra|z¦\„N “ûóV*A>"‹à籪¢P±eƒ YJ<Œò7¿±ÍÅŒÇö“农$=êzOȸ}}ˆBwrù×{蜟ŒöO“jl™“ÚþŸTœ£„:lGalqàD}‹”…Ä>©ì‰än§Á80º–<Àô2QÀrøIxÖQ’¯£ŽçÃFtÃõÁNw†g‡Ñ\¤‘ÃnZ‡¬ ’ɳMV—ó®­ûžÛ­¸Z˜ƒ3~×uM%‚¤ÄiwVè’¦‰Z-š4 š±T’³R[iMeSZi«4Û·mÛK+(SkKkD¢F,IˆTTrÑ¡ú¿Ï۰鈞 ¦"NÎäJÉ4Xqq œ›v©<•Ñ]Ó¹ÝÓêá*$‘¡ô:MxOú9hâ~§ ÝGE‚Ÿøx‘¿çìÓýý&~°}s««oµ8„ƒ˜a¦=ˆT !M2dÖ˜‹I"~ÉrÉ °„’a‹#"ȨLbEHøÞèL×)(Ú'ˆº©ŸŸ=¥„Ȉ‡™›É/éM¿Œý÷X¾ç›n& >Áð£å£OG†Ä|M.Ø ì¥iEhl¥2Òn^Œ¡ó•üXäv2z,¥bJš^ã¿zá^f&œ/?¡ri·£´ÑÞae,•´z€ŠüÕýÅŸO3s`ÑŒz‰÷*) I#CÚé‰8{§¢/¶Ìát˜Æ†ä‰Ðý¢JÚ{G×àMŸÃÉŠ©ú> äóIÂ|OÕù€œÃÈó:«þFÔ8:Ý8å÷’Ö±bÃÔ<)õEЊܱ'Äw’‘°ýÍî>òzÛt£˜À“m~–î0yÑRÿ<[<¬äØ`Áá†æð(X †4Õ‹j›iŸÒYœMÝ93—Ï^‰Ã†‚~ˆùâb¨¤é& ª¶~™¶8qç÷æ«®sOøÊÔEÅÏ«<ï¾M9:J=ÍJ;:¦¾z‘6­>¶iü^Þ=¹×†:E" í¸ªscf.^YlæíEBÎ<ç+%-ví/W+¯}HõÂÉ 1œïc›ÉÏ©Òqz•kƸ±ÚA¼±îT´Ü“tS‰¶]ÒttÙmE¼Ç“yÓör<3Hi·­PyzþK\¬¶ðSX‚¡õëv³—›°Ë6«7Ó;“gqß}kž¼—W›QÅ$g›%¯7ÁaÎNs8–Ât¯,‡Lza>œó'»&ÓËÔœ¶:|ðÞÙ´Ü%—}ßÛtóö˜ø„—¶M9°ñó«Ï}pAÙ£R8¡u™‹ös\¾"‰ñ`ãð9˜L¢v@‡FáÁ£! 5Q†* œVÆ_Å)x’ ›ò6]r̲bÅͬdZSÈ^Yl]Õ­sÔõ6w9ˆÜ&:c™Ž¢7#s†F¡ 3lG&ám‹”bšÈl‰"/8±9$‰¢br?pÂÏ›?­"XƒZI¼2pô:×1OÜ! Ç Xâ$ÈÓQßÝsÆNÇ)ÁÃFr*Õ ß/Ûè¶¾BàõßÖµ^ÐLj—€zžíÜ»>! €©Š½_“ðè¬Ä&Q!3¤Æ’ˆFŒçT)&›˜MÛbhÉ0ív£³a¦†CÕu I!;H§1•ziUè““ß7Ñ“0잪SÁ·'³G˜;©¤z:`×Òpc·ž[x™jëN,VZºrY…ÇDCN´laÁAPKŽb©x"®"5kaèÂñWƒ šÅDÇ}‡EWÙ$’‹(¼9*óVÆy,¬4£µås;§3Ç^!ð`hXhË´Å žl"3$¼QŒsìÑ£<9ÂfDð´:Íõ§I†ø()LŒ«|„÷¡ éÁÉàù†c£µ-óY:ºµ¦ •®Ÿ’=›·Iè3D¿ÁiÄ6™ÐÚÓ(‚J*Q"å8É>Ú÷½]žÆŽsèpžl|c›/°ß¬|ú©ÇasG.ÞÍ­ÞÛͶcÃæSBƒÀ}Á´0Vp2D;1˜å§4A_/•˜3QxÂYL€¥-¦X¤O¾®g]ÍGÀ§ Ó‹l¯Ôý;6<"bu=SG˜ö'Ü÷ ¾÷ÍÊPõy§óÙíå*͹Ž;MaUN‚§PÀЧc#¢m‡Ð9é ¡Åµ<Õ+ºNñµªäÄó„1ô ~‡%A26„Øïüÿ|09 “°G BA=¬žeû*'€^b ³|ÉMAàR'ܧ°Û¾“/]ÂáWmü+šj- ËÆA•L…¡!zÚMpŽ(¥ŒÊ†¹š‹‚æ+¬$剙ßyˆ‹4˼Þ2sðûí_¬«ð¦Ô¾²a1`ƒ(”$\õ¯SÂØ˜´½:Æì¼C*Å5/V±Ó¨È/6(#NC–k®Ù6óž òÉÌ~Ù+0Ɉlåá縵®qšÖ…¥Â®RÊÛV‰q‚DˆD’[Œ’O´ŽUØ ¹rNçÛLãœv1ƒ˜%«i¾¢ÊTÓ?‚ËzL·Î ÍM£ö¤“ÆÃ¥݇Ndþf3í/ˆkE©Òû9Õ­¹³ÁvÛ™¨»ÖÅ·-(¥3$δ`yÃ¥byÖהʶJ³=O#˦<äÎŒi<"™WmÖÞü §,ô\Ž”W3«ŒÎ…QE”Ç|…4’*Èé61pÖ-VI1> O}6³ØºÆ3ƒ$»¾Uy|œ(m†‚i/ÀýS¥ÙÒ•\ûŠv‘¨“á'ñ!(CNœ•ñí6¯kî=§„õØë¥ª="$‚•IjD*ÖÉ#2¢jCÍ)¨Š©S•"}SÝ<þ ݱà|OWƒ¹áŽÌ‡sàÁñ‡¹Äîäìg¥¿ú]ŽÆÌ?‹Úi6jö¿ZúécIQ¶ ºoÂ÷bYK°ëíða/™Æ1ƒ28P†i‚²nL(›BÃù<šªÚ&¹ðëÆÜ«5¦øcÞ6ö&?cóôµl²¶~îž^¡;©÷è]9‹]*xêñ×´¨T*Ño¡]Z¨´¯¸£e9W,cÄÌ¥±Ôê.—8=—°d;‘>(¡!PüÂȨÌUU)PY%|±j‰¼;Ëœ57¾*bT‹”‘îuWÌC; WÄ‚!úÄ–a¢SóžÇrR“È®UÓœv¬±m£1åÝ‚ÿ®²­Ñ]î““FË{=¯½8=ŽƒXܪ[ +ÖÈžpù–$•l D‰Ü’O%n2OnŽ[m(ÔWºI"sÎŽÏå²õzŸ´«@¦ÖÜ ¸²¿ÈÉ?äÑíÑ[Z³ç—Ãà›9I±‡ÄÛì=ׄ›‹àpãÕée)šÆSÌÃ*žóHÄXq cÍø>5³J+U5E6ÚËfÕ›dÁ!ñ<Û7R©ebصjQb5¤ÅÛF²6Û_/—^¾ÿ_E¨ÔuR¨–U² i-IƒV®•ü®æ"ÐI³,küü?·ô¶µ°²ü}~kç¶ÑM÷“öIð†?Uø~¬rýž$Å=G½Ù+ÞšIäîpyËúÍ'‘;)îwAÏ‘ûÄ”©ÌLM5{V#è§ô82Ûmº¡ø™„jú ©pŠêˆ#à=æXH4|ÃhdÿÎS©¥ûÑ{yð â&j~G7ïdH«ÝWQaiùPÜ_¸­ËII ]Ë”—öíö›šŠ†¾³|yn—Æ¿Î7ꢾ¾6“l»J®m¥F×EœÊæW?³ÃI²U¸rß©ãÓòûº“¨QùÒ¬´µj["ؖث#Q“TVÓZªý÷îÓ›Èz£€ˆ€;‚ày‡Ü²(iE0EÉåÅ&Ññx=¯>xÒÛY´I “B'dÊÅÅVŒ‘ƒckŠ^ÍDªÔ üæ¦22c&¨„Á"»Ðx¢ŠM©±aµŠ#A=f<ä£ÉžÔrŽDïHMBGb¾nÉ88pa˰ëAaýá"¹îpõUª?ÇþPŠªsè;©‘g&@©ëš!ä:jø´=êxyCÙè\6b{šƒã6 “P=ÁNpQšÆP£úƒ_£ú[rÛFbBnV¯Æ½,»kb¨¶Å”¶¼µ¯6½5TW›^kyn[E¬š÷vÏ{kÞ¼åÆ] ÙùwžBî¹Îšä‰µÒ©Z¬o!LÆ3rÙ)š¤šm¼Ø=&M+«ùë÷ÛøŸ¼p*™ä…`Ñ@R"ÁHE¤ˆ´º!e±æ°žj­ÍÇ’¡•JýÜfãc{ÄpPìTÉj¬í“ceücØ|¿Ü»IäT÷ I¨ìEE$PN„A«ÊlÉXÚ†ëRÇ­B`¨²Œ³K,G m‚pYVU<Ê&/0D<Õ#AE ˜äPÅ_mû]£M‹æ›'YÆ_Ù+zßËîëøD$.@¡hsÉGÑl»˜ì.£ËÑ^:|áq‡´D$lnGu•‚`ÒŒ&â)!¤žDô¶­ëîN¡")—¥­)µ¨5¨¢Æ­~ÓVém£j5 Ì4F¬–)"Å®š×)-™ª*Š’ÖfŒ¢Œ"¨›yFHwâ£eÐ…#WÝ‹C6ªM¶‹Qµ_£kã$º¶£ßF9’Õ™ŒaO¬¿a”#Iýné×n®³_m~5§˜îÿe÷,t‰=îÞ»ÌÍ,ÃÁÚGR>ñ{^LBxRh§@†ÄÓ¦B$9á)Kpªà•#Žd’¹ÜÀápŽ˜á"q˜8™Ä˜:©Š¬aæQæTlé„ÈyüdH|Hýa&‰"•BÈ–"DÒœ) r>+$ Q$ÖŠ‚Ô,½d>ß=5 k{€ì00 ª› <xsâ:=ý‡×“ƒâQò%NÜðûiˆñÝÊYr—"Ì‘L™Ô©;†6²nÉv4 Áš&<²‡ñÁ,…Žy¨j†˜QFš,*}_ÖâÛd²œlËq ·Æ/çËÉ#ûJ+~=㾦Ùúr¶XROvÈTO§;y³¶&òW–Ûwr¹,*¶q ç]ÓŽoFÛ'Ÿ©z^w°à!ØäMb'@Ò|Z ìx4jOB“ p2b[ÙSÍ]ͳ­ŸJS|¿¶4È ÁŸ¢?J•»ä®lÛÌŒ•¥'¢xm6«VÔQÄÇ<tIÈÂbÙ‘.\õbE>Hî$mŒ˜xd£ õ³%h¦ÈõED$6ê| È‚¾%6QJ‘¥ ' F#i_ì³3¼ ìÃ3óöÍB&I# E$Šq×':æéÂë¹»®œ¸¶Ù˜V\Ëm©˜÷œ»$Ô©÷¢~-G÷©lÒÃèªZ>õŽW±¥2]Äa³g¹¦âÅNžóÜÙÄp‘É8ll˜š6ÚqġjIŽø´~†¦’a1‰ü—S„;GÈ÷§°û¾oµZÊû·ŒÌNÉõw²~‰Òš0¤âq9Y£×·£"½ë5Xºc{ÈÙ&ȧ&=åj4aie hø¿ÁÓ´C¦+ÁûAHz°‘TKÅ åüBš’#} #ü ÐOœD‰Q'ˆ÷ØIjòT„F* ÷€0'ÓÖÀ¨ƒ0:‡ÝSùR·Š}Si Ü‚AÓ˜_ÚH•m¾¾,&I ž_'üϵw¬xšj+M+üÍO±¶G2#ýN“©…Ž"'ƒÊiOôLþ7ŸUЍÙ?Ö(ĉælþ°‘ ù?Ñýß{Ôz=RŸÙCõDü}¿¾*ë:TˆŒ÷®Åø*ïN¶õ›46|Y‚áš ÔZ°ÀçAÌì•‹èˆÄÿmŸSå$z<ÑÁì½x.ÓÜì~-—cÌþçúº{•ä~2zÆ&Ççä÷ÿ*Ÿ +Üø Àц•î8N˜±9OÉâ×àõ{þ-i~ÇûæÙ´Ñ ˆ0‚) $‘Uù‡!¥lX€Dqx_(y{oô+øË?š. ,_LÍ ph’Äœ¬˜óNð.0îràÖtvTJM·†GöQåM*U=É)dôæßܦ‘¹ »OÛcÞ~ߘ<&D~¦±¿$õËaࡤÑ\·CÔ: ‚¿‰T9A‘Tª@nŸ‚<ÔvM2D©ÈýÏØ>ry9xTyH–¡d2Ô[IlQ¢S6ËE†,«+úºêÖ-«›VªÜ•BM¶•ŒÖÔVf±ªë¸í+²™mTi,­kM"b‘ Å"¤ìˆ£BRÁX‹# dû,Âá¡INæ½y|­n7n"bÅM?žv=…“øtÄ›ßÝú拘üßš´l.D¥ÈæŒè9å§o—qqØåAC2¤ûóâi̵xÎi•ÞØïrÛ[Ϋ’­º?Þ(7Tþü϶? ®bðÿ–Ùö¾LD}o£ÙMžû¼÷Ÿ Âcö>ŸH LßGƒâƒèƒ,¿¶x“éËïà 瘽¶¥cHî95 ÿ÷«{;2?Sæa®Ýü£Z׎ïÁÑ·¹éíÙ‡½>÷0±õUb}—¼ŸsoÌ­7"Dø÷–ÉQ‡ôÉ'ÕtOЯ¢!¾Ú¾¯ÅmC«Ij)@J¡°üÑzñéèR@AHª '4Ûï‚ 'êù»°Ù£‡„øyI)T¨EU‡°íõ½£I´üD|’O§Gèâ94|ŠæhŒGÕéÁëùéûgÇLYU¼Å¶Uö-±,À}î‰ôzîb))öãøDž§Ÿœà÷'G!ùD˜Á*â*£NР8Xý¾?î?#ÑË „û|¿ù'‘Ãò„?EùhbxI¾£ÚQRÁ´ïüýï“|'±'¡R#ô<wyŸº¾ô‚ %&ÒLù0djƒî9Ðóg%/ÓÛòý†K"|Dj ÈŠ‡{A¨Š‹*"IÝ@nÀBÙ-‰ÕcRj6Ñ´œ¶ˆÔmÒ®V·665–ÝÝm͹¹hÕFˆµFÚÆ×6«¥b´£[rì›ElE4¶BÛB´²HUŒI󆘚 ,°K"?,e0ò=ΖÄþÿ'x“¨‘Ê„=¶@“º’HÒ‘”HcŒl†¡ìܛ͙Wï—ÖÞ5.[®íÊ-bÕl’wPÑ£ ‡DÂÆ¢Uªd`›¨iš«X…•ÚÃÃq¹š,ªÑ5 ,:±4_Òy1ŠP¶O#ÖËqÁ³ª-Sl:ýÎö%¤Æ)ì°ŽæÎýç’OÔíÄJTˆ%:s"ž³¶Ó´Bpp=>­U–׺÷J†Š@$ªœíyÀÄÆ)F5ÆY\XB9G0e±sÆ÷ddlCa‘ƒ P‘Îá1Ž(0ãÇuÁrc‹ª"͵ÍDîÜÄm¹Â8*díi¢g“ß(ЍªbÑ+ítnr5Ë—4}#ÒL\ËÁvºâêVá¨îëžü;nWE͹ÍËÌ}œ2^ïžû<1‰*ºYÂÉUKUÔÈi]7qf–CE‡ VLQ» ›–L,*ËTÜ,aTÕÒïMî¤óüÚˆé?›ùM»x^ò0±l«!dP!“)™DÏô·ä‹,¹‰I\rbÞ)¹%zÑØ{Ú%w‡°9Ø$D o3‹ÒT¨2.œ‰Ið7ñ•Çî9JšÉÌ¡¢!Dä½(0. #9Èþww…Z#4æXaZ¦šG)ƒIô‘Rpæ‹S—UŽŒ}Å?ƒ³¸LVš3IlUWÞWnº¿/Ã)VŠj$¥0•A£DT”lijæË·"%¬h¶æº’›m3n•ºÚË)«6š¥C¼aa‰’aL ±Ä«,I‘-E…"¿ÔÛN‚pŒiLIj^ul« 4MEF£ç½š•BÅžée˜Çñ:FçÌú•>ñði+Þu$!#úv©|¬cxÕÒd¬iK1eX‘µJ©5ŠcdüÐŒöGÛjê•·YSm¹I2,jÙÔ‹D¿lLR*N¡Œ2Sü "ÄýG›ÔyˆlyŒ.c±âÃs¢¹‘¢©uäŒGÅM]×.vYwWi¶MM©U9E„œ4ŸÝÙ9¡í:|}Ú\ý)hѦÍÍÙ!ù'nO¢yuRa´{²M(x~=Ök+ÖŽ‚… ¯¹Õ‡»)¸UUR.!áд ¦5ftwÂÅð> àg¥»ø Œƒ ˜ð6 è]{°G¼¯tñ($ &A Gx”U|ékõ\i‰¥CeIÙQ£ã#„M:Et§un#„hU³²Æc6üh°ñmáÁ‰£ §FÝ–V“‘ÚäEJ¥“²Ò¤Ê±\ÉY0Y1ŽJ"ÁÈ4~Nñ—È‘‚‡pŸÍ‹©±žDÉ;ià«* þŸóOsêQû<>gÔÛJ}åO±þQ\’=~oP÷DíèKF-0#p1\ˆ>!q)SÞŽQÑGf«v8½|ski6»®VÙe&ܦDéJ²Xè©ËR:H;“J’U*¶%W(b°·Ž “±5PïW¡™…ƒPÙ˜*¤%úYq"q1elíØÁåÇ#ž/Ub×"[Ì)^J‡è6# R©K’*‘ –!ˆk JͶj«šÅ«_oìþá‹ÚÛ-t 6B~]qd¶ß£WÚ[#6ªû±o§Ä‚yȬʽ6Bbà^L A,K³/J`’"ÃT&$9XÒÁªâÉ&¨ÓÝ*Êwô4ŸnëU³´ŸEŠì$ì¯ ‰Ê¥–X¡4x19!H1IÔóI*iy„Aþ"Íf¬! ÇòDž¯¼¦ýìUŒÒ9ShÝM‰Š–ö6¦+*Ø“CZ[ –YW*$±7SI†„Òa¤ ‘¹Ì¡ )n1n¨ ¦ndFÅ{Ì{¥E:*/7•×|»ÖªE“dˆÈ^ϬTœ' ø9:’y-Q±Ó ù'àpÛec„•†)XU’ i¼íÿB!#³à¶¬ö<†ÉÓpMƒ `†ã’)‘ yUšššÑ†jE•¢¤rÓFêÙ¹E³ÙmE Ó™Í]8Up¡@XØå’lt¤ åBFГ¬½©d$UéOB¤R¢”/¥“7%<¬2Ô3cB  ôŠø"H™èòaÙNÁÒ 0•ÅÊœØÇ1c™• †(6¿48œ©#^&Ì"t™´s ¡‹œs€ªa'/Nd“2¹QØ7K4Ifͦ¬†A"¹•†W ˆ «›š$±\¯¥é|j6øw]6 ‹ÅÍ£^Uöy= âãá¥Ã¤-§NnÕdÅõÝZôç.î·á.§»vS5WpÑ„¸š 4€ªi s‘3WÜUäË{ëÞ¦/ªêùz·"rÉÔ}w}+[ãVúöîîD_»Ë­ª+Í\­h$È\Ηk³|îRC»¥Ý; É$;1;jçn37;­8Ý^íÓQ-•Ÿ¾É¦ìÈÊ÷!á„c$I’³ëW`¾wg;»¥ÝÆÚ._Eön$Òd¯²·(qôÉVŽy†EÙÍeÆ Y •.X¤/{X-X²Z ¬[²ˆˆ§v¸^šWs¨ÔÓn›ºZKkåÛ+ue6ñ‚…IZ!bÒ&Æ0bŽ‚ÆŒ]…2$eC$ïŠÌIe!R–ÝÔã/o«ºk—ÉL¼›5^jìÊÛjmšÒÔ×I-.­ºÒkBYZRHB0HRæÅ9ŽRd•UÀbËVI•ŠáFš\‹“Ê&êwK1E•‰R5Q÷å±$R‘nej’‹%¡½5vÝ^Þºj¼$‰¦ß~®µ_ˆÕ%rÍ_WWÓN÷¼€²ZóWo5ÕD›mvÝÝ;ºÕ»kµv¯"¾ÂÙ-·ªÉ7%«Y¤Á‚sC… àJ†’p±1KÈǸ ì  #dZ¸¥íaAö²v/ûÕïXºV˜ÆTSV„(¤%ƒò(RÚŒL$<ÉN ‰ š5Û—H²Š ?!*(„M 8'-’a8F&®#’KbÔeŒUrµÍ´$Í«myª¥f·õ´U÷FÔ›n–¾-Ò×-¾Y‘Áí0˜+ÚZ²8,$šL~˜ŽÈà°3)<„KbU$–¥…U'º ·.×K®›]O«JÚÄŠdÈ(Ñfê-µe–Ú•%J‡†rÛƒjšL°´‰lF¬MÕ¶aqMš)¦1kâc„ú¡Ìå§NŽZ„JF1X}2‡ó@¥¢'$9 $"<‚É‹ØÛ„'Lß²EâǵÙÚ® #–•ÔLw::tiR¸pü>Љ‘»ÕT‹t Kf¥„y0´˜B!Kvºº]J½y6¿¼!y]Md„"’I2 «‚(`|жÃÔÒ4›‘IUH›Q‹#…H RZ’ ©Z¹Š·äÖ¢Y•!ª†–IK!7E²7””¤¥Ž+ JOhá&4•«£ƒ1ÑQƒÚˆÑR~§ÔÒ\*kD¹0M*$À¹‰CIˆÅ*¼ŽTÑÉ)ÙaÍ)F‰™“Ã+—™ò}9•|OÅH h暌nÆ,939ç¦C¤¦RÒU•J°ÄIæÂ©¢½á/\d[ ¾]§bÁÁÉotªí¬N» ‰"(ì6k†+1ÜpÒ{ $˜²G¬ö˜…&”¶-¶ÛjÉPÿck*GI‰^ˇ’n{4“ÀL8›]FSLÒ9‡²”Í!Ã(zòµ†Ún±•[0óK5ĶdÞžV$V·"Y§ ˆ´J,©2šM19TOB“G—%Õ5$»UJ±|Ýn[7&æÔm6b7f¼%ÓuÈ0 sÔª ”±dµ0pbÃ;–:–U,T“¤Ôoµï²¥.V3*­ ,U—A‚.AeÔe„亡EÂÁp"…‚%ì+©±M¼kµ«´B]•³¤ˆ9j@ä¤w#¨i¡ÜÔÄ¢Eˆ•$Hd–4FI“ ï{ÙF‰óh]7HPÈ!h|ªˆ#u ½(-lûôíãù÷LyùÎD\`ìI?ÅNmZ¶Õ­ ú£ÏOGà3ô=_Üý´„v’H$ŸÝî‰ý˜šTu#¯”ø#ÈÛÿÇö| £û¤ÇÖzˆ)°¿"&CË"QÂO—°a¥WöI¤{õS±¢0ìÿ9>DZÉï}øü•jÏX?Ì”÷Vß þä÷œq➃±Û½©ùŸgâü£íÂzã„ö#ÞõùyúiŸƒ ¼:jؤ§Ñ’DÙõ{_à÷µ “ÞD…ó}ã( U‚ D~ÃÌÔCÏäsϧÌÒyŸ˜t}éÝêèêIׂðqùžÙ©#âý}ÆãÁ§àžÇ˜ê’>ó6h|Ï#ý>ÒLy£ÌøH>6~а-¾äÖ*HÂ‚È F*SQØ2?ÁÈZ,‚ ï<•©öa=”äú46ÿ”ðM=£àzÉø¶ŸïOæ}¤¢>¨d?—¤_ªp}(È*HRÃØ4üOÅ#Ãøž‚=‡´øG‡e„TàÍÆ?v>¡ÑÛ›F;v?ÄŒùžŽBíOËæþ/ƒÒÆ.?v‘úüû9vJrý¾ÜDôí֑Ф¤UE"R%¢RR ’êÓm--¦Ò‹l­›U“k-š²©kfÖÅK[ e© b"¢%¨µדÊ$›x’Ÿå$!#ˆÇšÁЧ™‰±¨ 2æ —X¹„ÍG$C _ÄüHHP´ÆŒ’Œ± P¥V·,RÈ,¶ã2TeÆI-!fHC"å¥ÁB¹SLæaóààþ]ÓÃ’¿î‰6ê?Å3Ö¢„ñ8±¿"„8=ªJÑÒX•[>ûG.\&èra¤§²<¿áî$$mþzønÜT?æ("‰yy½Î'|’@ƒù¬TŠB=–£ý¬yh?ÅSR|qK$Qd‘ª!- Ò¿ÎF3}(«°¹q5Ê9srŽWH¹rºkšsuÅq4_ãnfEuˆ±2K}ÕÄÅŒÍ’Í ºën’év[2ßõ~ºâù‡8çI$¤ˆ¢g—5UÁ:™›Ò@QLfÒ‰£ÍÈ)šâ"˜1¢’‚,I¨)¥LÖ뮚¼¼Ù” $Óe]†³KÒrYHé…šÉ qa‘l´ZŠÇýŸâQ¶'B‘*XŠ¯ãƒ °’²R¤§óAÐx¥±ÔZ#̲'%’S7ì7$÷¬“V±˜ÅŠaúsfš,xX«wø¾‘¢S‘„rjB`´Yâ²V&¥¦IØÌ„liª* ,ŠAû±<4kQ–ÍŠVYA,)ª^Gp'rèÄ{ÇTK‹0GƲE%@d5»¨šR›))´¤²²m¤¤ÒÉm˰¬²ÂIQŠ"“T™’VÓlI³+1¦ÔE´¥²¢mR¥2E¹Äé:}Æ’l’T¨÷)Ñ^AªM8Tü¶ÓܘPÜŠÐö>çÞ}ÿ•¸ø¤ø–OT_0‚ú…Q÷e`Ü{ƒ½u4 êzŽòq`ú'o–›¬ÍGyiL>8õO°‰ÏÍNè¢$ú&‚š‰RÈÈï©Z*¤òZ¹0>Äý´NÇNÚ4Sp‰F¢J¶D~EF¤‘Ò¡U#—Þ¨G'æÛ™¶Û·]¹Q¢¢%ÝÕÝsFÍ)%MÔ¶éjiMTR¶0L’¥‰…¬(ª1”Z–ÉlTª•±‰ÑX˜h(×È:zŸ¾|¥I*Ù•i h {³ð·épØÇ—Õå½ûQÜèÙ²¾oSé÷‡Õ3ƒ€.mºÙ8*’ÅÍþ¡ñÙýâþHú¿›ì§½M´ ¨ûÑLv<ÚI¤±¢Ä“ åCî90™)%ä…DpG%ƒK($"™˜Úð¥FÖ”ÕmmŒ8`41!SCïiP³BØ!bÜ®e¹¤í}®»}]kÒ©šˆ)ˆŒªµX¨B%–ÑmhÅ2$ÔÅf¡¤ ~ÖÙU›"ddìXì˜ÃE%4¦ºFJ¢i±: zyù¸úýɘ[ÀmÂRŽû$AåBG´úÄ™EªÐ¤•ë gU‡ÞT’'Äå8G¢ÈeÔ«çÙõ¯ŽBúà邳Ÿ¼µ)”éî¨5å½QΌߦLÌÏ@–FÌ"Ä%}ÊW}~«¨¢çÞJéêòî)³9!—‘-ÍÛaf¹[Ë|o  &fˆE¡ä߉¶‘s+ b$’H²2´YJ$jší͘8˜.‘!EFÅ m(h–æ·\¸‰šÂ˵x!,L ²‡K ® I³{ârrs&$R$C(‚f¦²—³I“”t3 þðPRÙ“˜AÈvú#šï˜&ÈYN‘4¿„Ô!>¿A‘êHI 8u„üÎãÜÛ Ê3@ÑQ,Úww-ḃB~ Ö‰\°&' "¸Ÿ¸ëöƒÊpšlèÂEˆK'ã}Ñ,!ff0Uj(…ˆ¥E 6*@¾i«a1EWm[#é²CœS'upˆEV/ØÑ³E.äQ¤,آи ±·ƒ žãŸ;Ôcn sÒ*x_º–ÌX„äòSƒ¯"ßà˜Î3EXø"Á€À| aQ ÅXÀbŒ $US<¬žr`3;“áâ‰O¸™‡x&Jp[R"ÿT¹q¿Á9ƒÕëà:w¢ð*H–=浦f'¸ÇcêOÉ>²AÓ©ÿ>îÖÕmèï=K1D?£öyS0z ž¶ÂäW±LÉ&ZÑfôY2ÃŒ$;­z¶›×¥¾R&…läÔhG+]³$[Ùî«Ö̰–5(“dÑcUÍÍ`-WwhÔ-uA…ò–êÜq’NŒa8Ž h²EQ6Æ&^,Ô$¤?*µ¦Œ É£"4 MBIr}ò1IÁŠî<I“¡²¡SÊ$©¤ÙÙ1Ü”D$lÑQÌ’%XÌ+xY¼ŒBHά“z£KÜ#s—{jíS »rìxžÈàá<ü-WtQáR½^øî±Ã³YÙ¦·²³ WŠÑbCÀ`b qaø2††}ÀH ëŽËl‘Å+)OÖlPF±Á75Í*H‚×ZC]!}È×Ϻß# ‡³Ì iõ•‚€ ‚<©L™H‰”ïÏ›Ø)‡C1q<"„2ŠïÛ5Z³…F‘fåŒv=\̯ma‘k„‘MpYÔ“nÔ»Mn÷ˆOâ=ýFò{‡ø<']D;çZ· Ê[F­\­ºj´‚"ˆÓè/¹âÆiÌåÊÊ+°r`’!#Á¢#âÞDIÔª#ñ’É#0ÔIZU‰!¶0Æ2aRLVZ^S”ŽN\ '/2¶P¨ d.Î%ãGÂIh2(Ç(³Èñ ³‘†XËIz zϨXR§ßlN²B²ƒaQ,ÛüÂå‰ñ®Ìê¨@b±ËmÔ¿Ö†¹v;·6/)>ÕÊx,Äz:Ëp¤(€Ü ZPJ FHs(@ð1(I}§£²=„Pë×О;2ܹ›ÖLòÞöSKtö+†óm«7Ãs~…gÓ”äÈ,\Bé5Ðt 0,#ä=ÃCqøÎË4d{$Œ«æö˜ø9‰¯ ™OiSÜÜvOɳI ª­¼Uðný§Èáç8«8SÈ›jIŠ9]È–­DQäÙËzõ=éí²/«ÔùHéŠ|g½3“s;³1†ž_ž-¹Œ©êª€Z(ÂoÒ 9g[_ Œñ'ò-áÌ´2ÁÊlc2â &â:‚Ås– ‘¢µ«kó¶µ·|&„"´}Úî®oÉ­¯û×Ïš"¦_ƒ¨dŠîúõȈ,&P¦>/_Êݕ៫µ–ë&Êê{utýLÛ\¨Ñ¶5ûû—ÝuÈú½öç[ ÷¬\˜f‹&˜Ã â¸[¬ŽJ’]RÔi­¾Û¥D˜Ô%]¾ÉéF6“²Ä°e’£Ö4݆♢¸S¡ªsTÁpdIb0‚BÜéÓËo¶Ƶ±ÐÞÚèFöÇæÏ÷@k¬–‘AÀ°Ò‡bHzu& dʆ¬«ã`×aYKo »c©ý“ñv˜ ’ °‚—ˆ^$DÏNx¥)`îñ*ÙËÆt앳GÛ ÜwO/r;†‘'´¥Ýš‰—›ƒHÚ)ICa°¼È0‚81Ï#`Y ÒžÇ]Ëòm±!l[lIU­l²›d™m/Û/´É»4dpR IdªA,xdie¶TOBž‡£¦©q\UÆš;ÔÙN©e¯”鎓8hÜ›8a=U4‰Jã´žmo°©*¸ ­#i3iJѨƤìŒ7ÁÝ:rœsÊ J¥ª±T–,…’‰’4ÚNjq#±…NŠìš3¥ª4vüÎF¥‹8¶ðð?ˆÙ¨)$M¾›Ë!ÎÖâÀwO§oÚWð›¬íÒ›©K­Òü­»1Æ h!ø?$8p‹¶å,µ6œÃ”¾èXå51Ê;ø:WMgœÌM´¥+GN$Ý7q3¾x°„²Ní+¹zóM¶‘æ®bÔº|“èèé$÷Ô’ÑŽÖ_6V0ê#ȲÝNR êµïÌf1fql­}Í”ðœ8[lT¬’Ž0HX,)€.6‰c‰ UppcðÄm[ ›²êo"BGcñ¯teŒþ#s:aMÊi,–. !Ëär.âSEê=@T|“™`Ð:†ÅŽ]Ô€Çè£KnÄÌL*Ø0ž¢4|N{Õ?©¿ççö‘©´¶Hr¢P1,‰üžÃG°öH4Ò iñcÂM¿¨ˆHý›OâCàži:’‘Üœºü\ “0H`¥AâúI$áø4öÁ>Ú+â"âêx–-ì>ª#и}|ÇÜ÷Cñ“‡ø×ù „ÛìêH@WÌJEÜz*÷þˆQÐOôøÁS"&΄> ’@¯8 Ò¶ Ò·Í,ys€¸ùAg7‚41±™²_“v[cXɺµ×ð÷]cM·)d8¶¤ÂŸ¢p™CdÉ2 k‰dþeZGªN˜pS_hö$3Á‰š ¸¹ŠäS:²{7vïé¶m&ßüåÅ_øæz¦*cPV=ݳÍ\Qj–rζµ¢rÛoUÉÇýÓâm'¢CÔÉ8jx{_ØÇh’y¹lh®…uµ¾?ò?S¸Ì>”pê¿?™(²89QMÍ{K’iIVU=A$ú9ܸ¡ýÏÌöÐ?vuTSÏù 4!ÜóùdzBÔ¶ÙVKT^êåyW-sjæ”ÕË‘ˆšš‹(”[!´TÐqÌ’‹‡i™@…lÓC5\ÅDmjðl\¤.HªÔX¶›Y$Â’0¤ÂU}ÿœÂÊÑx¬[À”®A¨€Y„„nE>cŒ*µöx›5L™¦Ž\Ù¡J÷MÈbMÁ´Ã Ñth¨1‰{Ù?‹J\ ýP ±dÍÍ(bZ+Ó¹D?‚IDBGÿó’e5œÖpÀ$eø wþ#ÿýÿÿÿÿ¦¹àð‡—7‚›í½mí•Ww³u{[tÕ]³w¶{k;5ç{¸q¬%ß>¨'úÞ:Ù›Ï;`l(ë´îPh ­•¶ -ﮇ,¶Úѽ¹ÛZ½v9/p޷س‹3àyI× å÷Ú¾SètzÞ‡×@Ðj@òÝ€yññÀï°ú ëÐ<€=@ƒNØÝšèZÍ:êRuî6÷ËÔåäݾÛéêã¶ÖS{€Ä-·w:W¾À}HUõ×[ä:@  @>Ü÷ºÞpzuyÃ׬æ]î;Þ7vâݲ۹ÎnÑuŒçZèížîSÞŒeMºíÜ®[¹]Þ½Ìø9Ô¾A¶ØÈ$†‹Ý©Á­Þi¼]\{qSÛ Îw ŠfvPÝÆqk%wH4=ry —{¡*© ôS®zÞ·Zšwl]±}î¼ÞQjì`ú ^½ï˜–f˜‚‰ãîi­šê”€»MêøRÏZKCàµ}½¶ÙëµfƒR§ž#žñ¨—nèZRˆ›T®†®©½™Ôk6ÁX£ZÕ³VÌ@ º¨ˆÍ^ö;Ö ,­ÏsÝžDÓX³ïw×Â[¹×E¯}è¾ù¥‹u²údå­îçJ±†Îžð4ÈABÒ5=ÍG©êm!A‚BIE"1!@ ÐD!2˜M ©éSA²ÐÈ“Õ%$ I§¥6”g¥“Fš¡ i JHA2Òa2M4ÀM)é'äÕ2=&Ÿ¨ ˆƒ@4§ªxL¡µ4õ2ÙGúb¥Œ#2R¼ÞW³Ùvª¨UÄŸ÷HRñ¤*ö•BĪHÔ©dÉ‘Q ª•Š¥c dRcJÌeVU+*•¨ª•!KU¶«ÛÙ‚€Í„ˆ„ŠP´T’’f*6ÊŠ’Ô´ˆ•P"¤V*4É"¬`´m2›Y5hÆš*+BI(€Û±¢©aŒ–Ú“&¶" 5B†´,¶4D‘›CbÁ°Qµ&Ñ­Š-FŠFS*Ñ´°ÐV,–RئIµŒ"°´c l‘"Ñ4Õ0™XÑL ’¬mجZ,kcb©¦ÀD[4D°šK±‰E¥B–Øf ‚Áe ÈÒš HÆÛDS¨VE i6±Xˆˆ‹cY5F›"ÈQcXÅ$JiBhmˆšaˆe`ÂÓh¨ØÐfØT"M¢ƒRTm ¬[cQ še1ªŠØÙDŒÚlj-£FÔIe”Y*U*2i6¢‹Bj¢¨¶J#(«3EÒ%¨ÓQ* ` Ú2ͪE I¦Ú6 ÕQk•¢´«A¨µ%¬b Kh¨™Eˆ0Ì˜Ó /­m¶µ­›¢¤“þ?ïþsÿ/úðÄÇÿI¨ÿŒ}2çÑŽ¿Ö¯GÇóZÿäÿ¢&ŠëUY‡„KT †©® ¿ù€˜Í\ÅŸí}µÓÔ!Ölï3ÊÞ >_Ft…RVÇÿ³xÿï•›:ÉC¼ø›2Iðpûñ˜ÊyžÕ€° Ücµ01PZ‡©È!üØ„»*éÅø´m¼¦FW®ÚW[ÿå¨Íé¾±–ãßnzsüIÎÊTÌ!¦lYÄœŽøG¯“.thÿ‡:j¦[rËRË8ÿÓªû‚Ô‹Ä=½r¬“üx8¶ÌŠ˜ª|mõ  6¶ ˜‰mqùCùøHÂK sÒš$×…£EéºÕ÷íµnœøŸøËþ±ç‹¿ûi?ß„j¸Kµ*ÔÔM¨5¤þ>öäÞêÚµVÒ¬¯[ŒD‘3?7dˆÉøî§»t" F ‰îëí?g´D’ˆ2Fû®I‰é×(HŒ"_ßýÝkû?Kë÷«­ü«©Mó¤9XK½.óÛòG ò[§äL¡‘¦ii›çå_-Ö+_}}K%¡ˆ”©“k56VbÙ]w«žêW9¸âs¾,z8IŸó˜wEïý‰_1ëƒm€GßûQdõ¯Þ²VúüSÝ®2e`´yùå\R¯.žsmù‚Ì…·¨_Çu,Ì.‚á¸(:œã`p7®²nr‡£fÆ;dúpSY‹?ñ½àøî‚¯âÙúÛîdc0.IBb±šcm±ƒC÷…þÅÑÿ÷ÆøXOƤnÅ£ç͵Y\q>ÇÓçµüí¾¿„hÁAØÛy:G@®Â6£"B*BÔõHIA÷³³;R!$±7hâ|W#mãr1#PÅ߇½ÝsîâåÝ/í÷¾}I&4ewTV©$±¥‚?~ ©um¶Ø#Uo­µy´EbÁ¾í ±²‹ ‰¦r+6Bik áš™B3m¢".¹|­ö«­^Õ•LÒ2X÷<6Wžç¯Ò#Ãðå8¶,´ñÓ§F¶¾#üm§)m»7.–%Y“i¼_Ä­ƒhÅ¿ãþYUCBÅ­œ°IÚj¶ÄôÎnD-Z+¢ÃÝM¹FÔmO—ëÓ{§aÑlŸkãFoðÃ2p“Iø“µ’zÏ›}î[U”§Ñô»Ö¿?ž¿+ߟ~„`MƒDjÙ}ñ—Ù>~ž–õˆý©‰gk—jý2Šn\¹ºæÛª]]ré~>öDK9Áœà "PÝÈgÈYUÃyWádœÈìgøÔrwÏ;W1ìMBâKVYùE:å-&ÛƆ,¤™jF,LiZZÒ©bÅš ïYçÃÑ»>ÑëR–­«LÎKÍ:ˆj4ôוlMÏ®ÎÒ¹pbC?Di-/ˆúG·>ΕßUqr¡æ˜²OÊúD“çµ·¯Lv®µêß‹oŠ64>uÍ>¥“Ó‘è“……XÅù¶­²Éç×u~6£Eo›êþH줱]5É›‰‹$ùÇŸÊ‚ì{½ž­ºôÍÅzïÓ À@ŸŒRö-q(GŸËžIl\ã$g7$7 ½›„¢ÁשàÑÑL“cŸcz–ÛmU¶Û D ú¿¶–®Ú_œ”FÙ³T–ùZö¯Uþ-óíF'¼'„Â[#¡’AZ6ØÕ­@D£¾†Û¯.uz—žîpî:–k<áÈ5¨ÿŽãÝã7‡ÁíÓi-½«ð¬œ$ʳrMz,Z%œž›/9*£VG@êqbÕTÃÒÀ܇QéÅò”¤Q5(O\7)V „6†ƒú%¡¿b JwthŸV¿Ñ¿jµ­|ý›GÖŽOFûFŽçÏ«›íèÎCÅ“ÜÛHž²¦ ¤àP싊LY(5²Y›×S†ªM‹¤e¸a~Ð(ª«2)™USqL˜î*u’SeÝHQ$‹æãi·NëZ_¤ØýMƇ™m§F¼´ÃÉá˦DA ¢åº‘I Th@(!82w«i]MÙu§Â½Z4Û—Ϋ.ªé"~o“C‹F–#Jpâñeü3ÛÙ6šÓši¦Š$h] ·"56PŒ¥k Ù~>tî«VݱXÙ©m¢Ò,©ÁmiF’œð»LÔ¶U1OC›l©„ŒYmtŽ™ (Z .¶Æ Ñ£´í‹RÌËj§Ãi‡)£Œ2Ãáñ£ÎÂð^®Š1’ ŒKàþ)T,®¦×gdåÝ›1™˜ÇåÒÝKí½5йkvå÷Û×1¦1H‚E€¢o–¼ÁÎ*Î[—”2cJá¶m'RS:.¤lûýafÆŽÊ>ܪ³d²Wi“c¡ÊÖfY••ë̪æ•BÑB—”U ÷•R«å”‰ùeUÿÞµ’¦Ø‚F̬ÉGýLÊÅ÷rÖ×…yhÜm-–\º¥©¶šÝiUÖ]e\¢ëf­sn5–ÜÛq¦Û©jê––›MªÔ)F R˜©‰R0°Ê,¨¬6¹vººËI‹Q3lØL¦¶ÕMá\ê••E,ªWúÿÉ™òGþÄ~¤‘NS”F•JÒ©ZpñªVDè­P«›•R¿þrßPÌVaXÚ-bÚ£mb¨ÚØÔ•©5Q­¢Öiµ±¨ÆUfIŒA‹ZJÌ©¤ªÂ?ƒ}˜àÄØ~¸ãYÒlÞmÑUi½äÕEEþÍ_þïÿ0Ámó¿´O„¹ãž <#Ú˜)„Rƒd8ó¿v Ïñ¤¬œ,^‡"ÉtÔ5RuÂeÒm©ÞÙoümS?nÚ¾=UÊ2îH ‘VŒ]ç#c²ÒvFêN_^¸åÑUØ£¥ ™PqÛ}¾µW=Ë«lˆd‡ÂP ¹$‚_Á ƒç¸Œï75%÷fÖùÊ/GæjrDƱ, o aȃÛâó!YÚ1{`vÑ«‚‹¬lzÒ¼âó(«Ó™‚ ,F¦¤¾lÚÆr‹ÑÃ÷59"cS‰¼ê^Ò¼X1‡" hV*]+‹Ò,´ƒ7U¡£’1y¼fc+XÊ“¬Æ]¤ô¢GS^?©ûËßÎgÏoÇΉ>GMáÀÿ2ˆf¢d8ùyü3éìõÅss³˜¬Å^Þ2øc|“{Ç+A¶*Òž8ß,Ž6郒?¾V‹Ï ¾JÿÖR÷dø=uuÅ×}½±ôÿ×?\3ˆfû¾ÜrÀýˆ#Ï é|•×<è}¬ñ¿‰'é_w×<Ç÷uõ,>Ç–o¸‹ñsôÏ«üÃx!µùzò[Öå¾Þ~ºõf¾ca°C·¶ÝQæ×zuÑœäPwgª=Øvßu£:‡}Ÿ—ãÉGŸ£<î®élͲ®ž n¨íÌÖûö?‡/…‘üZòK•yçí?~ݾ[‚;=»·.Hïuç4cæÏm4Æ+Ç»øzñ‘]Ú8öiÒË¢:´Ž)‡µ¼0]û®¬]) C»:‡».X}}¯ƒX<+Œ¡á|¾ßŽ7Ÿn'.Ó1N¬³Hü,Mï¡ ÷¤æÎlN+ë&ísÏÂÎT|ð⎙<1´ôïWÙÏ·»dñk cÊ ù´BÎ|ùwâù{íB/ Þ³•Éë×›ýÎÚë ‘p_é3EæÄ·»(»«›É®µóiJ³9¯fKÉŠí “Fé}£àÁ´ Ñ®w„nÒ9 ñO¿åCŵeÎ~ŸòÒ>hù£uû1-y³Óäë&{¯VD?£HÑ‚¤Ã~ì+îg³èÖ –¯ìp&É¢Í+÷=zK>7×ß.^??}ø;¹d}2^?<㌚Âõ3ÍÂl¬…þû˜­èûCzç;´¹¸oð>3ž#ø©ô¤îÉý¸ïÆô~v}¾Ø\\Ÿ~WÃ&Øß¨uÛŸeé–׿/XßßµuËÓ"÷_Ž;®™SîáË>Ì>ü£Ë*ü1=p;4vb\½  ^ßF‘ishåÎÒŽnTÑ£îk³=û|Ûd‹¸=Ÿ·ˆ_áãÍËIlâžõ>êül;ö¿_GïI§vê%˜¿èé~£ÖŸé€"~ßLÛÉ_É@Ñ™Bá`ðQ5³¡eêTFªïG9ö EÌ»‚§7˜$Ðñ]„m½=[ºI 4cë)ò6T‡{*NàªMUuv5-­K+M²¯sîrwL²¾¯±Ÿc¿½ëYÍÇŸB›*·A ÐÆ¹ÒYÜ÷^[ÞHÊqüìu²{Ùu]u}}»JL» É©œaŸyŸ}íc4´b±xÄ]QDºÉ°S¦&Î]Võ! ³® 7»ÍÎ^o º¾­äÒß2·xõ£¯(í†È_ ±ÝÊ6|›v†Ð5°œ ’@Di[ý‘þí¦Úcoþ,bÐ1 ¶€ˆã” ¶åkœÀº@d‡¼¸s(!)d^Û-†µ_Ø*`Ùr#ß{/I¢ 6Ùñ§Ã=ï«À5'èC9W¸´>>³ÅΕã¶! à΃:C½yÍ|0žÃ ÓN*ö+0ÝáÊôòñ–4wªæÃ B³„vŠcv†ÎN®x‹§7лÖ3†&¡ÄÈlò<¨8Ž&‘.¬7‡L÷xéÓ_†´lraËÄFCبØ+ÚQ¯swYªÎ™ÎžVOYü;5rŠÉó·ƒV ÙÆ_Ž5Á’Ì~Wï#‡·QÈr †:ŒñEv>Y°ËZq+47iBçš3‡z\;eï´"„<ÊTÏYâ3Äo»O2üCL8&©x‹»C,éS¼|ôéÓž\ áñk†‘X«åµõ'pèÚ,¢{ãp†®š±3Oy–½çd^ÎU˜G Z×3O3aô°˜QÍ !–Ó çSC^¦–(¬žCE&c ¢À¿ãø~ªß÷Ûùû¿œÈÉÁœ/ó‰Jì³ýŠ5ý•P︆ŽŸàgˆ`’2ÏéëWŸïð÷C#ÑGž«‹´â´ò6cÛÔ!:Ú½õüÿ³ÈŽ´t–IÃåáþh óâk¤†­Iê\{öŽ­â)b‡)Û…éÔtL0áFÔ·¾uÄq úþ9xbD¹)èÐ.ÄŽSî§\*‘’½ÎjÌÎsÁS4yÒ&ºÛ·7EFñE€OÁ.†/ÔñCz§ rBn¨gÎÌÖÄ9Žî³×;Ëöø°Û…TÂð¹Æ ‘>´òÅm9Í;ò]ââ–šåÇ'&£9ªäbæ0âÈáøã‡ @ÎÚp ™ˆ ™ÉjÈ<®.ß¼yQÆÍ ¬Ç\ª¢6F>\/ÖÜ@„9yî$<]—&ÝùäIc£äæ¥ë»ÏŒ g†Ë¾ú1_Ÿ ¬¡6‘àÌ·™õÖèAÑé(‡0Þv}zÅIDÂÄÑTŸˆâ´èä’6ˆ$á/x_$@²½ë§ÖÇ¿ bŠ>Ý6¡>|øN0/Y;Óx—ë)È |MÄùìÌ É7õR[ÁÜ®ÆÃeÅ8:pPÓ¹ÑDº Ÿ§“äƒÍÌ0ìqûfs®ŸSÝoJ7}JéZšÐÎèÎŽ3ÊïDZƒ‡]=p-÷Êçx§-@ÉòY} ä_ø¿Íu7‡#SÛÍP©æ§P÷ò²¬PùQGætlø$Ü)âÝkn>|æLOΟ'`³‘NW<üʲrk&<.:èäp¡ŽÐb4\ý/X5ŸSˆÇg`¸Ãµ< !øR;·j2\È-ÉsÄ(K%ùQŠp*·—²=nûOû—2GuÆàJPð_(ã˜|Åp`'ŠyÅêˆ{~µ³DD¹¸hb”ÈŽ/oÉZ¯+,‡.‡J"ߨŒúÎøõÍŒ.;~Œ–’ˆímÄ—#ª[ðýÃ5Ç#%âêüWfâˆÏüð£sŽpôÆö·8(hpœ€öœ-½&`ÌîñmÆ#ˆÎ({Zåg¿;|¶½$=±×ÃÏð_yº+3}wÍX”‘-ÏxxóãËŽ8^ƒíóÍDkÙG_)ÿzùý~¿w欋÷{ÓYŸOj”Ùýî=.O?o¥:û<}õû¿#?L x+Çóz¾ èŠÊÄ/Èþ_ˆ°¼Cdüß|;`ý|ÑÏ8BþÉ¢: ~gßb±9”ö"é-„ú´¢åhkΠ\Û¼±¢™BæàB…èÿ/~ $2ãÃðÜmÜH“Ëøý|L¢1 ä Òb ;‚{Ö50ƒ\f€œ+~MžfŒÁÈËDq½åùDò»=ÕOê¾s8-ß‚³ø}ÓS™…l ¼ß¨$ó!ùÓ‡ç~b s…$ÿʺë?QÔà³ÊâyŽmT£åÙÈ&Šã×O¬õb #㿈‹*N0¥ñÎhz½?_ÜoXRò:Iþ뙦1Êsž—F,JõÔ¯…×kDe‡dO:ë˜À‘>)ow˜X;ËóÜìÙÖu¸áìi¤Ž9ÐvWÏâõŸˆ#¼»ŒËÅs™Îú Y"ë¾ftFOÃÜŸ{˜ä÷3àñ½5ž²^ÁïqUãYǯ;Ï…Y(”¡6QòC‘êͬL½óŽŽéNôž!ù7’˜@·~§7ž¨áóM$þÈŒá÷Ù œdpæù\›ÒëˆaÇò~¯»ï‘Ñ ïýWùÆtFÎ~Ÿ€§Ø÷¬ƒI¬…öüÚÊúé_Ï)þŸ¤:®§± coÀK™¥øâgÆJ’ˆã¸“ U*0HR£Ä²..¹x"|{ô¢¶)h»u¾x<=kz×|¬ö=û×áã6’]¸ð!‘:?‘¸Šyõíg‘ç…Ÿ ‹oÛuq㈃[àÀId»¾„5/vñÝ;IIùü° "¹¹uFílj~1\Ï ‘y÷#&{·;±Nð82ZžœQ’ª¤ÉRGY‡Êä¡1ûN"K‚ "g/}^È?Ÿ ì¢L'.é¸])–§¹Å 碔 H(öެ‰&$—hó RÒKJªH‰ ‚’EðÀ9kïùžßi÷GÙIÕwÊ¿ø};¡îIqاr$£µHƒ@È©%¸´ßFÅæýn†9æ:ü;<30n›Sü7%“-öÈü+õzû"ýWá>qnmÁŠ3ƒýóðJl¦7Mìú: 1[q`ÿ–:1ùª¨ýÖÔM¿á÷txäÛÏ7PäÀÃ#$£v8†›¨úFñÎÊmdÒŽPÏ3¸rè}‹ï…g$±’ÇÈHÕxr^"cÁ+”{ágÂ%Ý)œWIÓÀò’X»VÅÃ&ssÙ%DU8cfl§<¡ÌV‘¸9É)0%2´•«(‚E@’2A.\ôL’^ˆÒdˆ'ƺqϵÓííøHVqUŠÁÄ…”ä½ Hs/àC¸- oÄ«QÆí´ýÖdy"ˆh$ƒ´ ̸ fLðUÝãÏ.cbÞX†Œ íáÂ$L¼@:HLl.ëmVe±¹;ÉxÝÑLyuXñºš×òm+aË—Pã=6½YE´ë”†ˆÊƒ)±©“6‘\F"1Ä‹ é°m š•OI5C¤…¿.ƒœå9âê¡?ò<Ì rÆû2àÕñö±Ÿ3y= ×5™- !š™ªv=œVºxÅ«Â:¬«)ÔdÎ5ƒ‘$vD»LdÉv§N%³øË¸†Ý9û•Dþ¶Ð½—–`À•ÇLŽŽˆä·™A~·@˜`7²€£4nÑ$¶ÓÙþI‡õއAþÐ:ÈÇ~ŸsÛÊíLLËxZq.‘å,˜‚¡.¢ª$³’Q ''d&ƹñ.)Á¥§pð wãI”•¼Í"(ë™;Ç¥·UÜ/ºêeŽ´ºâtF$ÂâwB(˜áAƒäR&'—ló®‰l&KȇL!#Ü'ÌLæ~î5Ä^íà·`ƒŽËî;cšŠ—BÃòíËŽUâDÝ»ø5¼”ý§TÑžƒî<õ×yGa”œvÝþÂÿÔ…Õ@™•(†¡~ü‘ISIr!D:–)0»V(ÖÔ4ò ü´Õóá)å1…â¸j+¬cX²Æ[´²vGk,›]æÒ½[ž+·°àè²jq%Å:tj I‡"Š’‡U¯ŠÇIcbo9w75à V¬œ, ÄÉ+'™©ƒ§»CR¥TåÃQ‹¥Y1ʵ\TF¦vâ4“¤³•pÛ)T±ádøG—ÂÊŒ•‘b@…G•`d›ÛÁsBéA)A¶Dܶæäµ #‚Vc7>S¶1ÒYg‰fN£'‡ È›“U}[ĺ5ýX­~]E-V¡©‘0f((xÒŒ!¨­DYe V™‰¢ÌQPÑOY1­+¸”ÃÅ}váÂ¥8·ª²_múkUo4>gl4å§Q6¦LCÄNæ e|•Uiº÷‘Œ’{ÏkÌš=§-´öV)Šû>Zi+l$ÑÂ’DÉ,A¢V\ˆ ,BÕ B+bSÂ…’²9q©ÄŒ–¨šHÍT^tÁu’4à³NäbYmøÜSng‡Ëѵ—‰:V=½“·ÃÚhð²8²ÅêΞ¬|´ÛÐÇ–{ºtx*º¿|6dÃËN%e{C=½ÚrÛŒ“l¥Ä]3ág‡È±: ¤…(8¦‹*?«OØÂ=mðÍÈ€£/tíñ0çç­“šìžªÜp¬;áç†øòêÄjvô©Â$A±ŒjÒ ØÓ64ˆGL‘К „P¡\èÕÀ?„LȪGÁ6˜¢d”¡„4Ô©ÕÙ ¼S§ G–¦›8'LšmÜÔÛ\Ä",X6roÇ ñü]ð2be”¦–ÅŒ”ÇÝ¡ Ï O `Ñgª¦˜ €È“kÊ-¦³ä6Ta†ã¼ž6çÕ&ݘí¶<8wUžRýw¹HY ZM äXš%(!AýP„’½p*+þb“òUtÀimèŸJž®g'#x<^“¢êŸšhý>æ‹VÚÙÅ·‡ÕË…åÁÃî@ñhÆ´Øëósôq9Q˜•€(:ß±úîI~—d¾5Rå¶}›f•!2ICn6ÝPÛoGžs0lÛ¹Xèxv-R,áÄYM D‹C%ª)y$š²Œ>£ëÏQ©íÇÈYÁéF ­¶iŠÊ2NVÑf£K-ü¬Z„&Jo\LëÉÄZ…iÁ’Å«óÐ2E5¬[ž‰cLEF)7rÕ,õÚÒ„×£ÓጲËñÀáŒkÂáEq¹íÕÛ©~¤%½ËwÞ~ ˜çµbÙV)Œ™™=¬Ö±«0Q{f\c$çÌd¬Ì©F3’š*b»µVÅ-·ŒÖfJÇ–š=sR)VUôѪUºS·§1¼Ÿ§v‘¶L¹?·×YM<Ú#AJJÊÙ«—„9p¨ÃÊAé(¡äÓ³”pÒŲÛacòEz¥«GþlypyìÛE{eÏ)f5díd®vµ[XæËX–Úå[ZÔ›i¥OE7{f7!¶Ç-²re í:ˆl‹K‡¼MPæŠr©’ïŽÇuTè'¹P¹öEwWwWN 8ã'e|ê¬t3­B§ÌWD§Æî*uNÌŽA·$c¹”F]UâE°9r†ÑCLƒb.ÁÁ#‚é¶&ˆª©¯ºï3/^•œ_ JòÃiZ)cÕ¢=[†Ç%vóÑ©&–rTå‹’ÙT"xfÚV¿‚´Ô]…”¸3Fp¡~)NѨ0iÅGU™xVcháÒŒ›nîÔuf2å19;4ýh›ÛSÑ­¢òÈÖ+®«¬GŠ×Uv|zpN ~U=ù)”b.ÿ–§s½–CéTîÞj©³jŒ‡ Å£¥î÷ÇEÑ\“¢èöæ¦ëŠË¤=£cеG µxyFÞ NaÔÙ],;Ÿ?ŸÚ¯åoß_/kñø*1RPAX|üŽî®]ÝÓ“;®Gs+IÕ6öŽŽ ‰]“Ðð–ËjüéSo¶Û©]ÕWìß@¢ÓÆ ò·[ë}W¯–øÅ¢/[|¾Ö`¼·(Ýâw¸ŽqÅu“Óeq†fc1ÿgp¹Õ+áB®e|Ex[AõLGŸþßy¸iÁ9i&©²}~ôåNN G箲÷ŸÀª ý"¾FòÅr7ߤ/þ/öþãò­³‹Oáü±”‚I.€™Œ+Ýò”¿=g ¥h¥³%,kiŠ¥l#SJ¥j©\”m•Ã(}®j¥rtŠ¥e_lÄF¢=æžñ¹‚Ãÿ·½*^ò¿ñ%fUf ÊSFe´m‚ØÚ²j¢ª5fmF¬•lUFÕˆÖÙ–Ö* ÅIŠU?Ú*…¾²‹¯·W­Yû\ý²*…bñ›ÎP” åfä;VœIr ˜j\XùWíï}Îùž÷½ïoX‡ÔÇ$gNQrUªM&ôésFébIP’÷k¦ƒIö6l¹8ýî ë¯qª2é-‘Ö—ëW90­¦òäI´6·¬ç<$lQ’A`™ $¹f$ŒÒEfŠ•`Tª0ah2£z±MtÒâ±WŽÐ³„•4蜥‹¹Á… JŒYT›ç½,êëSþw”pim>U÷D ãGÍy‹¯Xsè#—8úÝo´a¯Ü†LÙ]TêÆT›I¹D€Îñ‡’¯ ºÖáa½÷sµ“:¦iìÇ™•ÆeR"GQ§Ž®3„TBÃ(À¥½PxŒ8pеÚ‹;íÝVÃûR\HLž¯;ˆ]ŸÆ:$î¶ÚBŠ˜ñfuuù 55ÎJg»&eõ¤$¾+ê€ }3ØýÞ$–…¯®Ñ3) >móÀ­1IGo ‚fQÃPᔲFiôÔ’)-‚’È?’ØB¾ÛÛ£@qP-”‚‡æšö3ª¾±[ÀédyÁ D%ôTJ å½µÚÈZ¡äÑS3Š Èf¡ QŸø,9­Ås†a¹Â ƒDïÙ8…ÞéGr¤å ‚¸ÏäëH^CFVŸ*0'{`#2©g˜•¡% (çÝB‰óžñ#ÇGknïfæ=Ès¡8ד‹WtyØ´ëH¡'TÊÉןPí# Î’Ia<=eÝçÞꢾ¹¼íï`†#É*‚§wÃi,J‘1ž ¼µ© æXbÑã²á”]#èMV?7ü‡ÇÀxEwñÂ#ãó0ûWgKUÑž",-vtHaÆtœ¹Þ ‰#Ä|+K<2 tKi4y.ºÅŠP¢8"˜ÿQ°¦•‚;¤í*áè̳†Á &Ð|Ñï‘jFuoy£?Ly6:èo YM ;$˜…‰hËj¶áÓZ’4‘Ƶ®MB5 b’º•þKÀðxÁ¨DQåäq.¥åÕÓ‚á!x¿e‹Ž+ …€Ø45¥PàñëtÞÌJ*ŠÝq‰Æºu¾¹É0oËNéäòè®®¤ˆj&DcKë C@ÀbNÓˆMŠ HAY”e®1Æäm#£+F­ûèqœù3¥ñªÕ © ;±‚>uÚ»³¼¤‘ Éb éX. Á.êö’ˆ’x] 0U4  ½:hŽÉá-ÛPq¸áN£ÆÌU_ù W==ßS¹ô¸Û  úN¯¼¬ÎsœÆo9Ì¿þ\è}  ýŸ¿ûtÀ~ìûÀnw¡±‹S,;`yäÁM H¯rZ÷º°1j+„öáF5‹(-U¬,‡ƒœT{ƒƒšmBÌ:QW2€ÄÇ6ëÇŒÏ?ºb®¦qËL¥Û±Ù‡ \0ê¥GYÂpé¥YçEEq˜a¼až·‡qhuZ\¡–¹ƒàSžá¥«ípg8¡Á“J ¶ZÓ»ÚÕcq5Ñ•C¥¯ù¸\îô@‘R²#ÑJ§>\f5™Âvç\mªX’}Ù®n$l8¶bi4+ §OI1´ ä1ɮ۷1Ö×ì¬È D¿Å éŸ0Ëñüà„¼r Çð‹wÎÿÑ×F’Ÿéü­ÐÔÏŸSÏ0â]s—Þ¬? Øxø‚³ØËtöjH9J·ëI½'¿×ªÌ4Pÿ‡_{ÏÈç(|¢ó¦ÿU¡+ê¨AÞëEÊsð’B_$„|—Ã/×ÀìŽÓB7áž=z6c¸’…tƒÚ ªUbÚ3‘áãÞ1RïÜÄw@Ö6g0ËChÆÈiVu…ŒQÃ3¼4é.Z(I ûtAtù1õ; º&bÄuT¡Ñ×ã2†¼;?u åè}Ç,¡}mrÐŽ8ßN R[a‹Ú>>9뺲1Œ)ÃN‘>ûám\©SAǨøLiÒMVE†2ô5heð³\8a”K\ú×G 8ŽZàþñ  Bn8ÁhZœââÃ5b3oK—©&ˆÌFa@Y«ø¬(øôÃh oÝXQ|8}Óä{J 3ÒUà 3Är•£éã¼´¨¸Ï‚ü¢8¼Y‰XŸ§J º–ª¤ú¡ÔWS jÊV“?àC RúÔ¶Kø; 5xüÿæg…ˆŸÇU;÷ˆ[ý‰–BWøŽX—Xs7U‹ðyQÚ-tPžKø²ñ4=Z½äµhkiéëƒOP°¤¡3㦙‡)B„Á°ï ©5Ë8¸ ‚ðÔ‘Psùü‡—O«Ê•‘~ñea²‹>C.ÄÌĵû kð bÄ‹:ik·† Î#–µ2ÎC`¶ñ¸fŒþµœ"´×PØúèaÕ†—„tYbÑ=ôüµ&:I 9ùÄ?ÇŠ=… Gòù³†xž+|x/÷Ht²ƒ”€âVg8°;Âø¯$uñÊ-$ÂÔ:µ pV§=ÊÀX˜Ø `Ü,}ĪÂ]ÚUjŽ@:xñx¾Zs¤³¤üxeä ³lºI$ÿé5xÝž]ïO„5X@…€„ d9{.ž…Î7º cb"șƖ÷#GD|UÈ •ÈgÈ:eRéÛÅØBÏ.—0-㣧ò¿|xâ± ù8 94á%™ê#:iÁ(Ah¤t(>:`FJà“Ó….UÑ ¡ Ã`ц#Ù‡·ÇÛˤe>#–Ú’w<•Œ‹ŠÝ´Mª>!¤*Ëü]þZrìü3 2ƒyyo,ñ†~˜´à¨l((—WÁgÊ–:`͈_”;¦_.šÊ³O _ˆAuœ (©÷ïÖD0ö}û¶n_‘ÚZÊ> Åó :„ÝL– îêD¶âð29Hq‚)²MRò²!agÇ0õP€'%ø¤›ò])V’´‚TŠ—øCMSC7duË£m:µs[g¹̪¯E«{K$QªÒœÞ ÝÕZUfïûxdgxŠ7€h,^»â AðºjZA«äj‚f?tï=D™½æb%¿w¼’û˯XG}Þﮌöfxáe/[Ðæ ÀÒÎ'ã ¥:lå¡×:RàùÓLFBË£ÙÕã;Þ"¡e¯*Òl:»¬áj¨éYâŠUg—{†9ÔÇ£;vµ3‹<Yã2+ŽxÊ·âŽyRÓŽd44¢ã<¼Žž:¸{l„÷Žq£¶´ñAF÷Ïñ󢺻‚ hIâJ[²$Š…J.é£õ¬!KbûHiùà×:¥yY¬…"ÉÞL·u™pH]个Þ+)ffU8+–¨ÔèVaP4’¤(ç/Ƽ 4Bï•)»Òq:_7IUÿœ0É©ñqµÉåÍ\Dœ#!Ën:9Öì’;²ùyS·JûåX ²™‘´1 ®trÝ|mñ"$« â¥î}`„µ"t§°Pée–”4pÂÁ\àsMV# ZPäøøoˆí…¡öÊQutHúƒ¸Üepå©®Rã¹"´†Œ‹VËK*ÊÛÄIJåeK¦4Ôæ9dòÁžP%"*–ÃÄè¬ZNó§y^ž“o¾ÁJèoÍYÜ¥¶¨¤P}5p T,;˜°ÙÀŸ;®eCÕ´aöØ5…5%cµüÑ+çðÏf/ˉšGgŠ >,ã0ò^¢$aLA5DwBƒ ÛX•¥í?·~õtï:ïœåq=+BéPB˜#‡R Kîž'5¼öXp°c °3Ðy3z]×2„ÂA—–0!HÒÚ_ò3”t|S¢Ã#µ£³Šøiz:áˆ"ñL‡ÇŽ 8r¨^á¼Í3´S¥y¥Ý½.¨µ¥¯+7ƒ]Ãh{¹ÁÀíØ3‰ô†3‡ºÓ§L7„éÄq3¡9á…¢Œ]%¥Û¦zщk«,º°ÑšY«·øæiþ6!‘Á]#’é2Œ> =ð~Ó§÷úž3èˆGc­?ÏÅ™øEX„“$Úe­‚µ®ŒyiòùQ¥n³ÑQŸÂi$ïx¤u~>þ—ß0Ö 1‚Gòÿ¿¿{6ô{÷äó€«ç0-yñã'¿¬Hùs”ni©„ˆa÷ØPÏß¾?bËZ´H±¤%É®H²Ýr£¢h“Q\ÉŠ, /bÜo¾ú\uÛšB9 ,i4Òt0½–$•Ru×]Og™=¼([!×^ïGNA¢ñÈD$¥p@…<uÓ™ÆF|À ( 1¦špf®%Z—4MU_] ´ãŽ—ƒˆuŒŽNn|ù<¦÷…”ç^àŠ]uNÁ:cU$„•‚W9ç¾ò,sl\Ä üÐÐHsú—Þû2±ÿOx÷í“@†0]4ÛsD@ÈÑ M4Ôàj:ŸåÏ´FhÖ|#}ïçÁàéÀñÎ`‹0eßðÅÀ:p7jÌI5Ît_ܯÆ+PÈ…%s“,m§ï™²á ƒ„>ûïéÕãÛ»‡ßÓÑ ‚ù.Áï>>=ÃÉ,ýkå~ç—8 p7Öz»Jþ.óËÅßð0e}—:d”QT1ê¶ÄذWq¾ûpÍ i‚A–1×I ªÙ– ´Ù,_.þóàê|^‘ña=ûïÇn¹t}ÝuË’' ¬éX-n V¤Up‰EUŒ¬… 3xaÛ0 „úÒ(P#óêïí‡wßa—,Ìø´"«÷ÁûîîÏâÓ Óƒ3?¥¤!€³3f¿æñ%©]ɉ2È*–¥XŽ8ômÚÕ°ðg(³Æúë¿s YVIU+¬hw¥¤t~-»çm»Ò’Gº£€âŠîba`É’&bÌUL¬C*ÂsŸ*åãžx;m¯>¿Þ¿¿ž÷½ïwÒ{Þœ¾ñ¡`±`‹½s#¢^7Ù{âÕõa´k;….g =SÅgLg-epò¡ËL'‡ã 8¨òÏyp¯QxúEÃ¥Š3¦™ÕÚ”xÞ ‡Ó¦š ézŒá†õp!hÓ¤Äù†,*ÂÎûÜXèT×LéÅk§3”pñuz¹Ôp8R~鮺¹}•Óž½‹§UÖ*ï0³ ¶x ïUw©éÄÎWHŽtñ¶|xðÊf‡«ÇY=Fö“£À9ÙK1›jƒ®ùÊÙç #IBÔ¢uRFõ1!¾ehÕ|«äo|O‹Ã×…øÖ’&!b.ôõCí4Ũ¸­2ÏÁštÃðôÅ„ Üá–J®£M56¸1U‘S§¬õn.ÿÁñ§‰vºHã¸5ˆüP¡UƒIR€Â~)QDøh¡¬g¾ß²Ó£0á¶ùo¿ª…²EX‰”lˆ¼âMQèŸQž¾¨CAåÚùhxÃOˆ´ù¬EË%ÈÊ ž+†§9$÷(33 ln%œoyÎ3œdÖsœ¬â˜ ظ ‹‹ýÊÚ‚|Ëï äçy.d4µ ÄQÔˆiã¨ñ¹E ¸vÌ£(ê}ða¶·tá´\!§0‹KG«†áÝ£Z<7Âu8auãÇCQI„¯,Ø+s!e ¯.^âÌëì,‡¹ÍÃK8½Ã”£+{ÎÕîœZLÓN® \áÄ8ZZÄø{ÅKdžz ˳Ý!Jíjå,XCÅPvAiŠÆx}^ˆâëÌ(j-)0¬ud4ìÅ@¸ˆïR0š„Èq™ Ú:¤ÝE¨©ËÇ*;2¤ýÅóEq#F„†·»oÂÚY¶dŸ{+d¾}{m~4 œL-AË7<,Ï*1 °˨ ¤6¸RH°„H5B´\0>à£ß«îé``x|9â±"ÀÀ9@UJaÛ\'Ÿ[nµÌ“æ¦çpP¶ñg-Œø“P ] d(6*Ù6¦"™•†1ŒêÞs­8`Ú~j†•ÈÒ™Q4¬¤¹’CÈyC.õÓɆÛñ]:yµÂƒ™¢ˆ©f1ªÆŠÂM1©S*ʲd–ˆš†uÕâ⢭`Ó8ÄA`Òhhlk«!1¡¥š$×Ppe²–Ô1•KK%ÃÄ÷⪆†“cÀKyõ©úÝŸ·ÓQ}dÒi”˜!¨@P‡ñ¿j,‡ãlëö¤¨meY)U,JSL2ë†4»rå·Qø9ÕÕX§<bð“J ˆDÁß­Z«þ ýËÌÌ*TÍýتùÚŠÁ…PXô• Æ`QfÆ"Yˆ,Ê’U•-i+TVÚb–+lk[-’m[-h£-¶j¤´¥•&ÙRÖ˜¬Ò•¡•™U,ªÑ¬Íjk5U”±A›×ø2d¶È²5ŒR×]»$’BLÉ RI$$’Mf²I$ $¥ %ÝÉ2I@ ÌÉ4ÐÌ É$Úm$¥$’I)M5Ýt’Ë$Ì’I MJPu«{Qª{^ÒI$¥3$4Ð¥$ÓJPÙ²¥I$²É$¥uÜÌÌÚmumw$’Ë$$²É$ v«®ºîf$™’HfK®ºI.»„»¹$»u®´’¥I Ì’I%Ý»)LÉ3$’I $’C2I$ÓJRJ•$“0‘Ú×rHªÍ!55-²Í$I110cYI õ¼VͶÕ/jö :îR’I™™&d»®»®†a$’fím¶ë¦d’fT©$%(HI$’R½mvìÌ’BI$’B@’LÌÀ)^Õ×LÌ”¥ M4“06l’@3$—W]$ÓLÉ55$ÌÌÍÝ]I$’IV%‰mUcÆC!U©£O^’ëw$,·]»%Ý]I$Ì$2B”Õš³2ÒÒJ•$Ì“2JÊÀ’@’I++$’G¶¶ÛµÚI&a$”¤„–Y˜fHö»vYe)©©JI³nºº’f¤’I™™™$’T©$’I$’IJ’I$†fd’HHI˜I$™.µ¶ÕoV«×¤†onºHI$™™$…(I$»wI$ÓBMf·WmÛu]UÕIJRI$’I$ÌÓI$ÌÌÌ’BI uuwpI$—m]tM3%êóÞ’HHI$”¤’fR™†`õvì%Ý»)BBI$¥LÉ$“2BI$¥$—ºèHm³m†eJ’I›×rI É$’I 6l’BBI$“i´Ó]uÒË$ ÊR]V­ºè„’R”®ÝtÚm${vìÙ³2I%íu]PÌÍÝ]LÉI$LÌÂI$3,²I 3$²ÌË-Úë¦a˜i¤™»®’IJfm›ffd™’)™R¥(I&e(R–Õ-ªîºR„½«z^ÞÂI$’@’Ú[JS2JRI2I333)JRI3 {®’îå–I H*I&d’Kºé&a%)R¥–I!˜lÙ$’„’I¦„’i¡&d’I&f`f$&fd™’I›®ºöõ[פ!%)$†d»¹$’HI%)™™$™™”¦d…ed€ŽÝtÌ¥$K,Ìz½j­eï%îºI ’I!YY%)JHflØflÙ.ÝÌÅU¹$CRÝ4‰$Æ-ª°jVVfHI!˜™™†d…R©%J™™’HfI˜HI&d”¤”¦d…)&Í›6fKªÞÒ´6«{ÌÂI{®Ž»va$„’I$™’fë®’I!!!™$’H’hYfÍ…(IR¦³Y$™™„„–Y˜I$†a$ši ZZk5ši™&d”®­¶«®„’’e)$»¹R¦níÙ$’fHI$†`I$’fmSj’I$†`ZZ=]É$’I4ÐÓI3 4$¥$ÌÌÌ4ÒM4 6l—½½ædš¦¨fõ­]t’LÌÊRI,°ÓLÉ$‘Þ¦Ã6„ÐЪ·1Š«-¡BÉ&dºµ­·]—ZÝ»{w355$$Ì$’I3)LÍ›3 )I 4Ó2I3JS0 3,²I$34Ð4Ò¥LÍ4“2”“2I%’fHHI&ÓhHfI!Jffë¹J)™&d„™’ffHI.ë :ßV¶­i’¿§ù§úÿÕþåz;O®Qõð’Iö>¿6ü x­ç±ÎvÚ£õhá$‡€ Ä "I‹•káÑ·mG×ïÏõþ½sÎG†fffºúîYª;¼_‰ Ãç×ùsùº§*þ6›kü,¶ë1‹QiKJ!QÜÁ•¥£E-jEQaR¿ÉLM$ÄMRé*ÌIƒÌMX²Ÿ(ôÉáëéëG+¯ÞݯÓNÿ_;™-‹Ï®µ¨Ž`t˜4BË)–-𥍭êý5¶¿  @1#{yá$Žlë*´¼/-ø®—xà@¼£¾m™sò=R¨\m´ªKÆôîöù{b~/ŽøÏÊhÖß:=ùs@ƒÊÖÐÞ.qõúêëß[câ}5òüdyü~\I<˜Ó¾wïñŒ3U€ùü\þÛü{]Zm»I¤­DVKm6¦É©5“fÚWl¶¹nµqU±£05RmªËek_ÒÚj½±eSYfÛ%¥-¥¤²Ê¥¾ík_5e #WEBÙ,…X*3.·R×m7š¿Øµq4bŠ Z,»¶·»±nncΊ)#TUÎ^]îܼ܊ˆÆÅ]ݢѲk•Ï5ËËnlj ¹ýÚͯ¨ÕêWb¦¥’•ik5±mÓ©³$´Úà“$FB‚0–…¥TZÄÌC ±‰*Z%D9F Š’¥"¥-4†• £Ti0­43 •M0Ì‹QdT•üÉùÏË¿·¾¿.9ŽLÙ™õTöùo׿Ҟ+u¬·âÎ:Ò¨Y çkáÓëúè¹f3,;ŸÂFD¿\S†òÑCu‹eKcJU–§Â©±4*FBªñ¾=¼½?gã·å¬ïà™‹+»OŸ…f‡«[QY‡ ²;_õóÓ K’ú¦³3âs£”ý·ëÕú³F>>ª¯„…}-Æ÷ùeÄë”}ù‡Q[ !,!¸àB†­’H°U»*[ù,¯¦ÚcT‚X j¿zÄUñçò¸3/ç5òxúà3’CÄ–‹ˆ(‚! Ø,DdÛ3 HÄY“2±â7Ø-ý+<žÀˆ×Åé®=ûæÍÊóóäïòCU†2ÈÊIJbÆ(Ë—á©ôS¶,1f,ª¶…´04ajVDªI%%¢Å—¯]|Üúqø^ýBGŸËØ›}Î÷NW"{.°9ïD|yÄ“¼A¶ŸNõcǬI¯)H:Ô B—’]ý¯~ïwíüùõª§/N»QÓ$½Òe8ãóó¾RDœñ¨¤¶ËEbba0T’¦2%©…L¨´¶Z”±iVRcÔ´©ÛSmºªT°m6¥¦XÚ† ±,IJ20šÖ«ôªW—‡¿ÓÓçáŸoÓn_z§…Uw|¨ÊÃd•+øþÒ«‡ç¬Ëüãv'G;×D&ÒnN~Ð?c*ào­—M” ²A€nEùŸËašˆ°b¿¬0 ÙÝP¸†¹[ñTóËÕÄzÚ®´Œ“(U‹MŠÕFÔUŒMSh°|t— †àü’¨Xilc4-%-ËJ•‹J¥«*Ë- œcQh”¢R´TT0†ášð?—X:xéUw‡C÷¾Á°ƒBI±¡´Òi&!‡b4ç®/Úï^Û}½‹€’_¼|z_Éýí[hoG¯S`°†Ä1¶“KJ*ÿÆW,¥©•™YLK‚°´ª¿+–Šf1(þæ&I%ZFÑP™E¦e.ÒÉ]*å–µ,²Ð!ó^œ¿××§?Ÿ¯”O SÝp `@ä –ZÂ@##ºÒjÛú|ó’@,¾-r¬³¢ãÐf¶5£Ó´C¾åù±ñ*ûg’4ÒVuC.ÛjZR§.³ŒÒºº[6š®–ÜÙD²Ë5¶VÓiS[fJ™F©k¶êܪ*ì­ÒÌ´ÙWj»nµw$Ò.™‰fL ù›6£06K(d‚–¥***ZSüÛÉñô!$€ZxÐég/€”ü­·6­UkEâ¥û¤’BïÓè÷ñß|éßËÌëƒüß⥊lŠ]Ú“ Ãí«pÒTŒJ*‹R’‘ZR©”©-K>Oq&ÊöM‹V,>Ù}¾Þÿ·O†î×MsQ°a“é© ùõÓ¢š]^\ÃpGìþ“¾¤a÷þ öOx´µ*I*Š¡ñ"¶éMiZ-×ulÕ(¦–ɬÒb0ab˜Â°…ªÊ + ,§¶&’©”`¦ „°„ÀÇ#/Ïï>[_vv¨úToªKf!¶šCÅÚ½>à>IŽ™Âž2ö÷Ô¿wæ³·•³Îxϼû·ûý¦üyO¹H¢• /¬L˜E}°˜C²K$©hš1«aa€ÆV’Ü Ù4QR–×SkrÍ$¶Û d,©†ÿ¯¯ánÿnÓ´¨©;‹‘lUŠ·Rê•5l²4ÒlšBe±e…FKJ)mSZJê”S$§ðß[ŸT,FßKã¹#>ÞŸO}sk®ºô¯ÎÌ0çBL³ÖñE™“Óã,’Ý¡#@˓ԖABÑj$¿ 20``Z-™en·\2T•Š,m-4[6]¥nÚJ’T´Ø*J‹EMF²®»WUì’H=öžþcŽÝüo|Z·FÀšL7m\ëˆÛ¢N9^JEÖ×$¥å7­’I [ã›Û›¼ï™‹öR´j‹ÊÄĘ*}ë(ü[–æd¬KLC&‹L©Q˜¢2U1‹13id­,XO_ü}þ›váðçíÕ>  έãÕÁ¡-¾^ò€Aâ«âÐÍ7ENßM¹üܶûŸ‰övçË·½ÓË~âöÃäÁ­®®¶¹ªH¶‹QieYY©_E±lYLÉb¬F™Åò•£F(ijø>î¾ÜpVf¾VÖåÊü3›¦qUEŸO–×Õ“ƒ%á0¥lÈÂÔ´©ôm£I%J‘I™SeoúoÞ¶ê«ÊjQ“L€Áì#¿O?Ù»ìßn7ùëŸUÖ•vô鯾¯ͽ~§Ýå¿z¨Gl´úªcÏØðÀÓ²HíßÑOþís"ûò†6€ýU¹}9&2+*%¢¡‘ˆd…MSlµ®©mk¤À’²ÚZ–Ë6´­M””TÔ´ÂTµ(UTUR!)®µÛ«-´´© ÖJ–QmÙ[•6ìu®é,Ýh®[%$ÄÒb`40l^Þ7<§nýô˜éÛÉáÓYÍËË=|•äyÕ©ól/W·Zªv’Íæ‹ò¼Ã,úÄ1û®µo9écQ$u|újØ·”ASD“¬–¦ð2P’8ßË+[Ÿ–BB¦u …õ¼*ëÖ8[ødŸ `r`4†Ø1Ñm6Ô³ù×W*YJQh·I+tµlµŠ¦š³L"jlŠ–Ë5,3R±3ŠÈXbÅ2 âdŒ4µl #1ªWmOÈ­›Ø6¤ÈË4©-´«µk«\´ ã*‰¬…Ybf,4²«0kLÛ**[Se,ÛJRš®ÕÕÊÒÒÅDÙQS,1 !(°l í~^ß^=¾¯ŸÚrñÙâU•™,±áéT÷ýÕTZÓáÖ—ÓÜÉ"Ms„‘úrÒø;9‚õâþšþï^ç¿ßr8öìåGÃ2Ñ|•i³a3(ÒjŒY¶Ò²Ê,Eu·]Y×[þ:èÕi2‹•)*+jlÐ&&Á¤Ä0Í,ÍYÔÏÆØñK!õ¿Hñ®y®_§·_¯?/nJ•¿nÅîQìšCTiX´‰Œ#+’ÄÖ´žpã\ô²Eµ0%ÄÅW PÚROÙfe—<úg7)ü¢:š&XGÜW6• RZµ“VÄkj³B¶¬[lÖŒ¤XŠˆff,ÌÉŠÄÿ|÷þ~—Çïúû{º»& 'ÆI(PÅû+™Òº¯ÀZ bµàs³%”þ¿»=6()%*Ò-‘RTŒËÉ[õÖîªtº«:ºIÖ›-¤¶,Ê™L²‘ 0¤´ÈT`¨¶ÙD›,Ye2ŵÛ.²·kNÙY04°Ö,­M&±f‡ù(½rI/f´ˆ„cÕ‡G«Ÿ«‡öˆy$‘ñY?ûPrßmžqTN›H¾Åþ’Â`ÂÜ|Zi s¨ÁŸHÅ}ÏÛÔe÷ç7æüýÁ‡ ¬”d’Ɉ)T¨%ZŸÝˆ—&OÚÏë‹õ2=ÆÜ\¤rŠ¥ï^ŸFC13'Cý˜Ã¬~‹¹±µuá ºa Dþ6P0 ~ÐbÿPþFC¨RÂm4#û &\!½&%¡Ä2h¢¤dcàFš­»V÷à}‡w«í|>OÄñÝ$ý_S󞿲ÛV­¶‘Rh“,ý~¯]×oUüõ·â¾®¸Íê>K"œ•Ö–VX¿ó­±3óFEÌ[m¬¹.a0ħ¸§½¯çþhÙ”Blim©jYe¬©ZÑV±­µš“fÕ±)hÖÛ4¨¨µVŠY#X–@IJ«)VdÅK%ŒŠÊ˜,†4ÔÖ¬•dµ™&5¥²©´­T3) dȉ&I@$ÂA2HJH"L‰"H C¥™(„"€¢%B1°D"B$Œ©"€#` @²b”B„BŠDA˜D’2`CÓ!C2Rhc!@ F2JHу" Ä!Š ÖR2™)T¯:-ŽÍ.<¼Yè´l|å4z¶?s¸ð|žÜvö|µ5‹o½×íÅo½+_ãßåÚm†Ph˜hƉ3&V×é7óXµ®òê[0†­±ûv[¦¤òö2¾ãÝ?eâæOzje31L–OË£Ý}Œ4ž¢ºUUZƒF/t'^¹£â{Èlê§ù ôÛT3[A†JØýø*ªTŸ‘ý†ÌO'ÉíààÉå?M0)ïOœèÞ¾º›âÞNçEUW«™ã9™Lx«½úωÿ’…/§ÀÞ§†LÊèªõ]£ïzÐýéáöÿç=j•$¶kfM2k2ÚX"*‚R’@Ò€cˆQí$ `Ç›¥s®]e‹¥óÕæó¤;2« *¦7kF3-ZÓ bi·µÝÊK1¾ºv®húmÈÚæQv^1–\ÒpƘY**Y*…ÉUTà1Ȭ„j#MQ©Þu¢ðOÌúŒO3“ŸMjøžm§v¡ú.®ñê­,F5‹Ì¹xRy¡Äžö¯«Mc Æ 0UiÙpp´ÃEò:Ÿ¼õˆíúK®fHÌ…g×m»˜÷Ç~ÌŸ½þ¹UªËkËm® kJVë[ÌÀfúaf}Œó§FQûù‡Í'i¡±¶Ê?†î1`ðÝvˆ]¨¡±ˆð¤Œ@Í08Œ²Ë«†ÉÙ½,¬ £ƒM0ÀÂŽrš4ØÉpáµUà䉇¡¯²QÄ’mSÝÉ[9ڰʾ¹&,VcN㉋ؚ;SÊ$¯•÷ºý)dÁ©36›RµFfc,‰‰ÔƘ²+¤øªéJâÔJ¾Ò…-lëq•£,Æ[2£HÉ2MoÎ]kDÕ¨µÙc&"¦¾Ó¹²bÞwe˜dlbXúz¾år4Jý… _2ªÐ÷ùyk¾lÜÝo½6 ˜­éWìšš¦SXÈL†DÉ’2&TS$“lJe-üWñš—c ¨Üª¦UQ*¥ ª’”ªnTºn>nãpÛ³ç®w'ìº"ù×Kçwºâ黎컹p¹ñÆJ’¢‹*jæ>¾u|yËù9[¬«Y‹ ’é½jÚ²JÆ0Ê JR¬$íHö¤)s'™Ðä14áŠm+(ž'E©¹Q'IRW *¨¼Ô´ÇÏ”æ¥ñ0á -¶Æk&2°ð5ð˜¡ËsuˬÑm;´sšæ«–Æîê¹¹»¹"ÌX%´¯Ë^2ª•ª"ËZU¦o¨Ôƒ2–[´¬É\&JlUxѪÒÊç‰7+IO2Déœôºò#K6÷mabaO”Ã"îOÕ©’c&¤ð˜`ØÊnÙ+ {ª•»”ØáÛ,Ë¢lŸ³MHæÌ©”™d6á=2ÂéUUk ¥¬[3+¬\c&2K¨Á’aö7r‰óÊÑV(ÜnMŒ²Øø4SèI'«ÀsÔx»Oäða£âåâîÏ鯇Y«  ÂÈÞQ ¦–#L• 0ÿÍ.®Ÿ&K|ÿæsó½m²k¥ºÅÉ›v;0¨“ÜM׳bzÊÛßÕ‘e¥†‹þÃ&ÒTfÉ µ“i¤¥U» ŒLaÆŽ>¯ipXªWŠžê‹S»µÆ×ŠVåSùâSUC0&TÆ)¶h¬ÅŒ)2Â¥îʋֈÃÓÎT•· öàÓ'߃í0rÉ{1g\d Dìpr.t‰f J± ÃTÊ­UQv;¥û’þÌÕ\ÜØkË6¦U+ÞêP¥â(°¬<’¨XRª¢ÊʨF !Ûg‡5ýŽãñ?ŽãÝ=_ÉWSøœï1¤ ÈàÜKðͱB† ² ! ý4àA¾ü‘SâŸÔÃÒëñšUö —ê¾uûZÚõ«ÒfT´"lVÕ3`šZ•5ªÿ%ºß­é¦=ëcžÐæø´®SûžPl_tøÆ=ÎÍÂtü/Õ‹†2~Γñ‘²N¢iUSO Ûl+˜ù¥ Vnk2goä‰$“IÔr^ì« Æ# btL%žQxê?¼ÙÚ²[mªµm¡=½ö7üÏäzDZá?3Éâó55ÉgÑ®˜lÊÖš‘µö¿p8rÓéNUWàa¤ªžn«Ì§³åØMŪG2wè-aæ¿ñvö„u¼D äéÝŠF H,ÀÇ ÜªJ„U m± Åj¤Å‚X öKE§t¶dnŸc–䛲ánX,1¤Ñ‘R¢ŠJa¤££ÁÁàp`ÅF&0ýRµKEÁBüg]6[M"5Î16”Û²÷*™D3ó󻑪™AÞK¶ål.¢œ‰˜<º=Èݰw”:Ÿ™lÖA‹jª&öC˜¨ó–¤†dVÓ¨ ÊªE.1±íJ ¢Ñâ]ï0¼bi–ÐF.ËîælM¨ÅŽ9¹Q³\ø›nÎQnù-ÛÈ0~mVõ™Ý•'Í]Ìœt ck;Y@^DJ¼ö‘(Ê2Sm7É q´ÑMrúíÚ|]ø·šüûçÓäÂÌŠù Ù®7p‰¸ÈÅÛ”šØ­©PeõÕÔ¡ªO™we9nÈÞ8+cØS™ ¨,iýƸ„ñÝ’×ý6µëv[lÆÞ0gˆù¶€ÓµMÃ#hÔS:A«êëªA_×_¾KÍí¹¿Ou­ö•ò"Éü3»_,ßkõ‘Œ`ÙMÊšÂ7°¦´EŒ~Kõ^ï{o¡¾êÑn[òûÝëõ•Ò®îI2Û„g5Œ†82[Ÿ§w˜Å¹®h¨ÜÜ®r4Üi){@Þ´£ÇŒÖ:©lºŠ¸÷|õµËõqöî÷r-æú_f¯ƒJWÎíÎk;¨Ü0_g.W½ÀkTÉN1©± ”Ójš+ÕR¡MÜNùQ·Ö{#)¢ iúU8":©M(ÆÄØÙÄ…uÚߥ=ÑÊL{DÐ\”Ò Ê’†Pœ$˜)V°ådŪŠÉ„ÉëÉSE’s,éƒK =UÁc¤î—V¶¦®.wV›¦ËMÍ“½¦¬SR˜S0XYm’J,Üá*YÂY©ÍœUUäÓ-Y#JpÆHq,j›Y,jôhÕc½wi§S•g=«aÙŽZrqŠO&“CY楦”Î%“~ÍS–%£G+1R(Ü›µ—ðQÚ»u{KÝš¹kpåuÝh-Ý´«&[UNÄmSg3V.’{},Ä"FÈãÙ8ʃH?ùEô,ô( âaBFî1Än±3ŒÓX-×c‡¢1ƒÏ5•¬-XZb[6¼Ï›‰8ýdäÄËVŶOl+®Ê–n±Æb±±røä`™ljI(Z‡™—Õˆ;– Ò¨XljŒ7;KöþžNÇDé9%ͪ¢¬IìTøz¨âþ»UÅk‰¦Ù5¹£ÉÚ}–Cð5'†dj”jk²2h5GûÏ»ÝoÃ%Y“§Urmü?ª»sɘÅã.‹â¸ƒíO—&³¨ïð™„A$±)aõÝ|¨¬’mþð(°ÇÇÁˆ0Âþoçm¦ôB?>°XÒ¶…]Y—¨ÈˆÊhn‘)„mcm¶M5«7²©»¢Ú,i’@¦‚Á¾™³/×Òô#Å¢øvµC–ØÊ¢^ÑÜ1ÑД‘»D'`,|˼í`ÌiÔv<2Çfã¶xÍ·—Á‡*©ïܹv^§¢U ڼ➫-ëñ4´õÆc« l-ŒñŸ™¥ez'„濯¦“–1¦I¤©¦™ë&ÝéU<©K‘£)¹öžeºÞÝ–2J½ì1„a€¿±b‹C$ÑÙ4-,1•Xa‹‘0Ád¼K,³ }í›g²Q>^§ÛÂuÓœb³àèòz.Ïö>ê¿Dç*ÙnóÇ“¸8{­Yò1¢™¨ú˜¤ƒý½¿àU@Rm¶ßƒÅD|ChµeÍØoi¶)œ¾öÓë'rüRú¯ªÝßÚ¶9=§‹'9³ÍM¦žá»–0Ç#ÕMödFAòSš¡ì½]Ãì]ç ¬c•k"ÊØíÀuÚ`#B >õUL9T P¨èBH'³¸x9S N•ƒY«±ôZ²g8L=Ý]V¬ZL›a“ÆÓðì}O£Ó‹Ug&äöiŒc‡–â¨ò¼Œ(RÅYB®Ç#­£*•yÏíù¼~ú}í• _½±˜±+ÏßJ¹8bªà_àñ|ÎÏ7'£ÁóëŸ5ÉÉÉÃ“ÄøŸC“gJU±Q'o“FËzúGÒ¦Jbh=Ý*ª¸|/ÓGíÖW쪿ºýk*l6Òˆ¥Æb 3A…~ÕÖ9´¯‹Íy´ûŸª6wºÓÜ}ø3ëGæž ba’àŒ¡Ë©£ÖeSM¦GÉî[žÛÓœZ~‹MœöSrâªùÕ+)pä|O*øž_6§à¼\Þì~ÆdJÄ?t©ª¥ø£Åk$†ª„YÍ‘j“ì:ý±Ë‹i8<çs‹zMŠÚ^ EjIÚOYG÷ff*_-™›(ܰaJŠ(¡p0Á,Ä þâaµd¬SÃýɆ—Ç5“PÒhP"EýƒÙSVˆ›Bˆ„âDQº±a”Ú!#}7Õõ¾¯WÖK뺳UélGÌcí½L588¨pbÝd0Û±å\—:îÙÒs_Ìð$ŸÑÓ¾+ä—ŽL±'ñ7m' Ìñžgu8ªW¨óèdfY–ø«façÛ3djª–cM5Cüä$ŸƒØžNc댾O^Šž¿áF¨l¿£Fãš9/e©ªUÂ_Á|o•ŒºsXE«øväÕ×4eIiUJͬ¶´Í„ÆÚ6ŠJ#ÍF4Jm¤Ô‘j"±A¶ŠÑŒmEÿ'mÌÒI‘dÎéÝ¡–ð­Ê¼«¦êêé¯ì[r¢Jwjâ2¡Se¯’«v¯‘¦Ý)S3F̾Mkš²õ9’ª_[m~÷Ëåj¾j%µ ¦ ÆÒ“™®š¾í­&FY#­1L‡cHÔ1ëFçÄŸSb¸<·¾fJñ&KG“ué{ºé=O;Ò“—r½ç®2E¸È̵úÙ„:pŸâØâ´œHN9EM[QÄíäœF)QLy>‡³z<2_J­¬ÌÃ*mŠFeKY)k¬sÀ7ĘʫFÛm鵿‚ܬmOÇZ5rS3lÞÊ•³$Èn´`–0\%6V ÅldçYVª&V“Ÿ³ zíÒœ¸F1 KY„e²[QîvtüUTÄáú–¥ÙàO³Øö’m6TÔ`é™1š~§G%Þž eKÀÄyr1«’ŽZÅàwz.lsi¦×½:Òtž?‰i¬å´ÇÛ_RS"lgfØÉ%¨ØÖ|ÕE5oôvÕÕ˜þÞë3zã³:Ý.W;m{•nÚ«ìxeÎ÷µŽ®{žîONö0c]â‡JàÏpÝPaËÖVíQ¬£+§üáÒ‚Ê&¶6›ãr6Üpƒ@Â"ÔÿWˆ9ƒ“ÜLøôÇøÙý¼½¯Ÿo½þÛÿA å~í%I¦Û§­ÇcèMãmU’btäSÁÀtTõÏÈBñ¾({ïêµd>õó\o6q¨ž¸ÿu. ±ÏÏ(é€J†ÈzÇ1Ñjª 9•з\d¨y<§e°ÇŸvŠ6(r òùÜÝŽÞ¾ÜoÕ„¡vŽÔfô˃VŸ‹«ûêó ØuýþsácXë—E2qÊo>ªKô”åDãa€Í{IÃŽÏ¢W±ÜŽÙ¦þ”×Ft}ÕeSPagÐ"•ü²Ý²Ç÷j¾ì?~ŠQ0ác|xøápïÎãø…˜1XÆ3 üoøY͇×*Ñ;’hjÉ¡€FI,Ü Š"ç ól§¨­Ê¢›1‚îYÊ…bîhyE‘‘Án9Y!ÈGC—!—Ç:vš!c…U5<ÆÖ7ðÐáÃ-^]°Ž½Ę́°ÛÕï=Þ¾\6äð<§[»ÎæåÅ2ó ‹›“‰—w±§µdšTåêÆ=#Åž˸Dþoõ&pù~(õ®BTu3K²Ì8Úë#Ío›sQf4Äý×ÒÙF9v¥vm&‘Á¦˜QÙÚcÎ,¯F’MŸ›p!!oúq] ñÜ­o>·ü•>:‘çã„<—…Õ G–x±vJ…Ò’e„ )ÛÁ÷ ¤4žÌtU=:Ó3Q—gæø>f*ºO°Õ?§¶<;ýÌÖœ*GiåE±²>0sWà|h«ÈàÜûí““Ùó¯„ò•ç%BÀ©-ß"….n‡£Ðö>8£²Y‹0¬™1Š9¶6Ÿw‡«Ù‹ã=‚{γÕö*_HÕWžzý‡Ãó3š·=O1ܾÃ"'Ž2bÊÙ­Bâq‰ÉLZèTŒM›“Iòc‘ÔÅdÔkê2‘»÷ ï¿kžž,aæP¥âz‹b8üþ.u™3%˜1‘BõÅe™o’¦e"baµmÖm¹¶Û]2cX¶Ñh¬k%“IZ Õ°jKHjM¶2XÕ‹hµ[îÝM©š£h¬–6ɬmÌÖÑTj¨ŠÒµ¦­¤a‰û2_®©[+KF’‡ä°Há4&QX•e<Ôb5U£,ú/™£e¼˜[ØÉX•¢™…‹*Ée19GÙꞌ£Ö6 ¨’$•(Š2Ì AùŠ-ö4qRóÊ׈§´S·¬Hôätœ÷­¶ÛVû¼$ vè¨{¿>$›á5ùÿk®µ‹gtõ…XMìeZNm8BTtÆ›°Á,Ëq¢·0°Ó,»™ºZâÌÕ1@pîº9ºùuÓ¾wÆùØH5wuRYqNáC.¨.XSÍkM[+ÒšÓF1k-ŽšøÖë¾\ɽx^ßo®ò¹ˆˆÛJñò9M&Þ0ƒF ª5ª-iƒ%#BÕ°U‰©Y0œ±Åi\ Ta¤N)b~iÁmÙ°l¶ÆeSЦš&JÝyŒáà/³ÃK+Éæ‘ÓäñôtŽ~¨›j·ËÍC( OãOámøÚù˜Ë->4ó^u¿:ç^ʧw¤ò3a Œi”’a,T‘XÉ™˜¾>ôVCu¹ýÉ× Æ.0US ˜ÿÛ?êÁ2Ķ#ïd[ 0&˜Ç.`jOìqþ唫¯Åò³`‘¤*5¢Ù_•ÕŒb2d°¸2,EU0a’,B¥ÌLB¥*Ø[ ‚Ô®\ÍFLd!bP¢¢Ê–Ée-’Q¥’ëTM8;<š*d3‚ÛW²Jc±ÃgLEJ…°g÷;®oÔ=ëIú¾/3­9¥P—ÑaááÍZcIøJ~3jžéñW#»ØùÍžÕÉ´Ö-0ie–,o0N™,L<1ÓùÕU{£¬>â¾O2c¸ÕX­d-_LIŠ’¨i`Þ•Ö©µ&ç€ÜÅ­f- š¹Ê¬•fŠŠhÒ¦±6lË’~‘O¹EÈøN Š~)ô?_œè™™!…öªôînÀm¦ Ô[…–šiî--]òbm¶k3aÛ[ÌDV²‹UIw5†ÅHÊ)öª›cÓln œ®Y™|ùF¿ûì·Pž’Ÿ"¿ÊŠ>‡Yn0Ò?Ár™Ô;",Ö†ãÆ0<Šj¶$Íîá×&&Å©¯`eôãaþ“–ÍæFµ¨Ù"VG 6Fá)jh´6,…°Å nhq™·#qîÛ`g{×AØæ·r<—Gš;¸³9»vóqiÁ­œ8á¼Î«µS@ò°èÁæ{ýŒ™ZµSZ¿vŒnêêQ9]‹‹Vâ™Yd¥‘d‘ô~ R~mAÁ›ÿB9mb+K)úF»NqÅ\Ô縪WcùavF[Nss9ÌåZ]*a:˜Åšt­#DšžÒJ4IçWú”)yÇ“,fSÓÚÕ_m-¾Èžãñ¯Å£cÑ‹Þ÷O&åV=òÌ–c#› ëƒg¼°÷§ Ω™2Z*TüTÁ¡´ƒË©-JœÁ'›5©‘Œ‘‰’0Š1£(ùü39âaï;œÔöw©£«´,ÃÀL¨Ý«M2$ „#™t &Ì/¸µT¹rf :15Â5 ©j•ikd¶¦¨ ™h120ªÅ‚b–SŒ‡ç*Öë׺ÛóRb `l[‰5’,b,”j2Tlm,h¶’Õ)ª¿¾[tŒh’ÚýضÛéèÖ*·lÐÄÈÙU¾ÌÕ-L£³÷ÀE…«ê¦»?#›/»´\Ø,a:¡ˆ<RÕSjÊ.WÉ:e™lU}ç½>Z:œ/ž\·1‡³Ù£TO^íTǽe™Ç’®f›Ul¸hîÃjB–ïG ¦‘†'#F«’U &Êâ:¶¤m&éPûÌ "ÃìaàäÜU[ó!µ-©N)¢þ _‚U wê…ü¥ÇÛ+Á•™–(ëÜþ»+ƒÄýÖŸì·t‰Š‡º_íÐþFçùÉŒÃC9Ç÷aŒª}²ñIÂz=Òÿ9669§›Â²¼¯«Àl½±ü©õR¯¸ª¹×öÏÃZ±¦“ xΚúqŠÉ.(êr<Î&;â3”¶Ij©™’FUTƒú&©šÚ<ß{‘ú.o#ø“c¥Õ]Œ¼×Óú½Ÿ»¦Gô66}¨Þ¿ØŽ,/ò<*+ÒŒ]ÓÁ}%VïÊûLŸèršGÕÉaä½6b§ˆ{Õ~B}ÆÏ‰Èþ Aùß›E÷ôÕ,« °Á†[lÑ¿¡¹“`úW±É+Ôû>ŒÆ<]©KíóTûÏÁÑ£q? %ª¬ªÁc"ÉV(ÊŒªbVJXK ±FI‚±2Œ–aL£$eYF$eVRþ ¾á*…ÎÊ^ ˜m£ë>çw °¿Ìrýqü¸Ë4Ñ®Y›^‡):KûÁÙ£¹ãæ²#ñnð_á¹RáîLŸÙ•ŽñëŒþ£i´õDå˜Å2á<ÏsÊþ—ƪ‹Ì깟ë%Bæ~ÿ_=cýK!\ñí‰[#aŒLV00ÊÓIoL[Q‰XZL6ÌØÑ,ŠŸÔÈÅ °(RE3 È–DÄ/³¨Æ ÛÝE)k$ÿMû^­ë®®ÇÈ»üþíyEÉ(’Œjl@Ю]!`Õ¡ö`© ÛrBÜBµ´ÔŒRªL*¥‰,©V˜¦–L²Ì‡#Qù¯¬ûÍ-älØ“ÑÒª”rSx1©ÈY9¶Ôi¿L/ÑÎ8¯ïŠ™‘˜ºXeJ±l˜˜àÖ¿Ï& 6Ö¤›71xêçWsŠòTyÐx§Àôh®ïGï½,ÉŒ™ŒÃÇö:½óßÊ£ˆÝr9CÜdx›—eq„÷õÕ®Í1†Ô¯ÔÚ4)«’¹YV4”’!¥´³Bä‘EKŠXÈÈÞI¥„´©³I©¤§J¶ÉfQ‘[ÆI¸â+ƒsSWc_Œõ˵#ƒÉ‘é±çBù_å-«¢Tté–CßSc% ÑñÃ0›¤VÓÚ—¡Èð´=š†«cÚ{Áâ74¹r«ÅUaìúw6/U̇‘d=³2ÇâötyÐ:¬"ÄȲ§­fc1ŒYŠ•%•’ÔÒJm-eµ––U6J6(‹"F¢L!’Dšb‘Ài”ßât¢DÉLS0Q ¦D,®mºM €ÌÍ”¥ÊݬÕ2©ˆÆÛ,›JZM)e²¶¤–JF–•"$«¸«­M³1˜’¤’Å„ü[î¥^+“OàÏQ´ùw¡8LbZUj©LK Ýêj›²Æ&í–iL6ý‡RIô¿«Ã®3MžLgÔÎd|%l|Z®NGÄý§EÌûúž¬€j‘ÌG³Hù °àmÏBd»JMvtj‚V,µáà°£…„xãnç°Üýꫵ“Øë@×Öæbú2·““M#TàÄcŒf¼íKUNÌWìå ÈØùʬV¬u™FæÑ6ÈaòvÙ[8šlÄîÈj’«—ÜmI¹zm¦´¯Îº´E6ÊrMÙ dCIþóDbdÛ3*šŠqñSè~ü—aÜç÷½çƉñaXÊGÄݱÊäw+éKÒbÏYs§“êÈ{äl--UîjÔ¦˜ŽF¥ÎMy¿kTª/f“«&1^¬Änë[N3,’é‚8–È¢ç”ÂД¥¤¤gɯ›’DÊ* )©6K5²_îÈÌi­¿Ô &Ó¶“B•)¥Æ ñd‰†2Õ1¦&çG3´Ü¹™G:ŠgÛUy³Úf$dóú¨i=mÒú®µ!$”ò{˜d³X¶¬²˜jK$•v0y*nkž?_nùõo¶ZÇkæÖÛÝo”æŠKF»ef:* Ü2Š$ŒŒcd¸É$ƒ‘’U ›Gö…1’ʱôƪ;E¬1 ¤Ë¡D%\eìJÚÇ™î’I ó\òÏǬ?A\áWÁáBñBIÄÅ–eXÃÌÕ>íU££ê˜§¹ÒéŒ1ûµó#Þr~ÅRzº–Åý{Ÿ8ê1©ÁÕ^4004ÿ £yÑéLÉxä£Ó¦Ôb.Ö(Ù”ºŒRM2›ÔÛÊ1&“ŽWH HNî¤qr"ÇuÈ›—uÈÛ6¶·íüemú`b'²e·[S~SU+~µôü¿Z[¯X))“o.F‘4VL–&-¿•u_Vy¢e¦ËŸ!'e¾¤’WmÔÙýNx‹¯Å+Ûm·Ù°F‹£hŒb(ÑFÄDl–‰6MZ)™M¶¶þ¯ö·Ã2þ•ø¶u$oÅK;™‘,É܉°íüÆ6‡“è>Š´U-¶^›=Ž_šz$’d|/Àá쪪ÿVÃ~æY˜ÌÆ3+aÙˆÊÅ=VCR2ï×hÛkf÷ƒqÁ˜Qf'&Þóï²ù{%FI§r¤GšØ6Ñcm²TʪíJɲš,dT²:¥L3I¶ Öë¦æë Ĺ*¨[Ìr¨Ãø(RÊŠ¸àó5®ìòÓ1¦1d¸”<“»»¢ÅâÉ™¬ÍXÑrtXx:ã=ÚjydŒša¥&÷‰´Æ]wÞåô»Ýwn“¥Ôa.ë‘™I)ŠADûËÕýk˜Ú0œ‚fT¿-±f)ÍÙ¦ƒE Ii"†×q)X&C Ý0(çN°Þ"#— ªtL|²c†Ì<1Íu\Q¤Ý»ÀUæ•BÕ$’Jó9NOJq*"Ì7ËÙZ  ƒºÊ—K¡F  bÁ1ËÅà {’{}ûÞê¿Vë<4š’©5¾¥ŽÝ?‡-× FU¢©Í´ÕÖ&I—™NŽr,ndÛï5߯ÏXÛðµöTo¥|[â×ÁÎbót/7›WÅ´s›sF¿±çäýƒZÍQÅOе:²×;w­]X[)—tu)Ûã÷¸ù3^â8*&˜&ÄÉ–6´«fSa™•9Zj§†QÚÅ\ÙÏ Õ†§ ­12ɪ±UÑS'šò§«ÓË+ÕZQÕnäÕÔ^ŽTøMŽ놇,¥™îaj7£ ÇÑ'JÝqrÆLc‰&í¨*ÈE#ŽÏ7ñmžþÿ§wóÓ#аeŒmr9#TÛF1Wù^Z;1ÔˆæKtBŠ þK·Hp3…’Û e †H´Ð÷J^b«|˜i‰…9)‘&$6â»8‘Ä6¤b«ï;L6óÆ]stéÝ‹•rÛ÷½ò}ί¯ÊÚ=þ‰èxK˜Y“#3,±XHS$=Šè4òl_ölî{G2Øí[T}æËÙú%õ'Æâ¸bXz»ô>hO«ù—sò¥Zžù=Ó¯ä÷¿ö-Ëu¹Áì­©aÁÒïu“ç¬ùëÈ8eÓ‰#õJ¡i¥û'Cø=#’ñnÉlá¬e§jlO’ѺnÅ·¥6N†æƒÜj§•XCïÅÕ³:Sè¡Ìáø˜|¿¨‡Ñö,¥/±)*Üoªú¿ë)V×uj2T ³_/ôßßi²SZdÚlšeèJÿ3ýÏp[)Âň2&Äl³-/ë»ð¿ß©6Û6²&ênX²Å ÈF xªO¼²Ø´ÃdHÂîó—.2Y‹êà“,Š©¶2&2MÙeLS jÚ4¢ÒÝeGúµ9.ÌXáÁ-×S‡Âw»g™ùŸu|NM­wŽ=G‘B–¹f3êl•BþJRÙûžGZívµSZbɱT&›-“R¢Á]œÃ±’–RɃ¬)£$°²H’zî–”¦šÒÕa‚üè;:ýð*Y–‚°á“iZ:aÓE5QÃ"t­'بi.™¾1÷1½[tÓF¦ÙmÄÌ«j´ÈÏJÍS MR¤(¬bÐtâFœ—N„™)iŠ‚….Ns—YW6U¦µ.šÌ˜Ì™˜lÙôPçHRȪÿ†(+$Êk,VÖ ML+ð @ïüGÿÿþÿÿÿL"3ï€ ï¯¾Ÿ7×9“Kl€úÒ æ+%òÞ¤-4½¬Îûçxf-­ÛU»ÎÛÂ¥ØÚ¶Í4 ¢€}À­1)BE[³º`»[rú†Ÿ{Ýîéíƒèõ¨¡_YͰ (¥P€¶5è.ÀJQ@¼Op= Ð( )¶5¶ ¶¦ƒ@ ÊX‡@Ðé¶P  mš 64ÖÖÞîÖMg6¶µÖ‡&'`îÃ*;iv,®»˜¶uÛl3 av8ºÝ®widS».ÔË iŸ7Þ•1Aê’i¶¨0¼½ç¨M3¼ï¯xÏ ûBÞU{ÄÜÛEÍõφiFÍ|ƒD|k‡;ÝǺ—p²`ZÀhžÄšÅ6ö¶nn;µŸ]Ûîà]Ýv ²´_UŽÎî;k4Y»ºJà[RôÕîÑC¶I@¡àú}wÝï=zo¦^Õ›ÅÁ×™”%ïXïe&Q­ @Õѯm7¸q¢­šÖ[0ÈÙ³Z­°$(4Ȩ^ØAÔ`kI/w·½=Ùîíjï{‘踰QÕíÕ>‡Ç£y˜2æÃ ÅE*…m©¬5<€D"F‚ hž¡ @‘”D¢ž”ÄÐ@i€hO$‘ ‰¨z‡© “Õ%$…Gú§ª~¦¦õ ~¨P…" @ Jf¨Ôñ¤ò ©§¤ÏSS õ B€M&†™4ÒyM1¤1ÔD'ŸŒå’ 0ÒýÄNЍÿÂ*ŠB*ŠJ`+)’‚ P‹ª”€T,"Â.(ª)ݪÙZÚÕjï Ì…› ÊHA°´Â*Ñ"ŒF ‘&(a£%‹d¢°$Q£d«4¢¢ ¨ÑClÖ-hÔ˜ÆÔ4m*£m²U¡™Jm‰ÛF”1¤„…˜Ôce$R*4I`ű,Xh°TÑ©kb-FÀÌÈË1°Á¢±¶ilkc!µƒFZ‹X‹A¬‚À­ KbÒF`Ä)‘AE`j)Œ1³b±FÔaPÚÉZ6Û „€ŒSB1‘ ZJ¢‹F2mK-¨ÕE±lQ¶F*V¨¢ŒDˆAAB‘F#b‰ÚÅŠÔlh³1X&FD B!DDY¨lbŒd+F’„¶‚ØŠŠ46ÖJ¶#"ƒF3 ˆQ¢IJÆÓ%–Lj5h S HTIƒM¨Ø¨¦šØÓQ±kE2¬lfM-²VÑb¢˜–ѱlk&„ˆHiLÚ%#aiˆiJ¨5†E´mH*5$,ÔZåEDDMŠ¢ª‡þÊÒ@¿Ôÿ­M,’çñOÛ¬?y-þWüõÏé׃üÿî²äÞ¯“|¸^z^žeå×9 $Kmø þ”ñ pÿѲ…‹8#±+Vpñ-ɦìï êJ˜xŽ)',W§óíwÔãŒ3o‘S§ªPå3zl/ý0ÐIÛÐw±stË‹$‹>hmݽ•{1²öûšùGÃúv42 À†àÁ}HÕ:Wˆ7ir‚ 8zqÌïa¡÷tîcâAÿàIÅtƒ#öÄFßû'd3 Óa,óÜ:¶×ïß¾La6™Ê™&m÷ÒtàÉ9A°Ý1†ÈmȼÐñ±4|§.eHìvÁ¹ÿìՑ;C½‰t§þø‡¾|Ž Wh‘è}ï ŸÍÀ%Oñ8D0ЇãYUÍ–aÄ.œIßgŠ=ó¯"¯BE˜OÇdh†göþ==fdÌøiWkoà?!1­½ '±¤˜6Nl¥˜^icÌ|§$TÐÓL„Þüd“¦ë¤7v‹mR†ã+1¨¹:ÿ‘á_(;Ù_Ï?ߤì<$ò)¤ø€2*‚©"îGeu7(JYÒº–Í4Úíº½[|$HÊBû[ó¯ÏX:ð'€¢bš(ZR€ê!øƒ­1TEES£ÌðËìp¼)’qX4ÝUõDÑ9û÷Nž6îéx©¥v`ýao6ŸS‚ýý¿ý6xø‚²(Ë iòr;„G™I2ð¡ÁÈ{Éè´tàqéã¸þ»Iïdð›Dø÷vˆjªÕ D„Ę$“í5õWƒlÝ,O>||¾Šø!zx ²¾ï•µU2“}†¤Œ°rnðÖå6JŽh¿Û6¡ê§3Ü$tÔš GD`1ëØÒp=Wô(§¦.f&E#LA.by‚ö1¨ƒøâØx܇X¤Œ?q6Õ1Iw¨v”˜2ïä®Ãü´"‡ã¶Ô{ =¨p€t7£„AÅ-ð«ø<ö”N<óE Aâ2KcÀ˜zÿǪ÷½Ì&÷&™hÔò¾ÞjhâP}CøüWÖáÀC" „Ä‚ùóüv<4kÒW°S Ÿ¢/ ¨j{$¨½ñ:œªÕy°î“OõÝnþ|ò8'’88¸Œ„©çÐà]ª÷:ÖSTÁ!UØÚ‡‚D(ršÖfš¦$¡ ¹¸”CÛ0TÑŒ%F5bô NÎCDÜ)T&qDÆ€á^Àü¿¿ä}ÈÐÈßÅD–Õ}m±ö¯½”»ÄH$0HHFëõ­~wÖ¾ªþÓÓÛJÇvù~²N鲬p1æÑŽ$2&Ü»:dd¬©…]†Ë(í:ÂÞ²DéÐb9$ŽMÜ ¦•ò¯ªë~í¥91%‹Ý²9É<IáT¼»º«Ê Ýn5íÁý²Ø£‡q|€ßQ`Ç€éÒB8”•ÏÁøc˯ÿG“}¦×OƒÁŽËl]ÛlØlµu6s:)Ý9*yA©áCIbyWRÉÈžžpRKµ6৘tÐw-X"ÿQ÷ϧW`X#§ü‚’üRíìi„¨eåR_ÒârÝØî#ܱ;t)ÈwqôƒaR’Bzƒ¢Ìºƒrb£w›cd›,ñ¥±U…4oªí©—N ›ˆ&Ûm2E¨ V4ÃúUnäoä³ÁŒ1Ë-ªä9§I¥•9 tDÛ†Ÿ " d4@´ý Ð*†J (£èX—¥ŒfCL!')Îí˜eáÃFÇ2bj%< Y£$äÇ·aµ/XÒN\¬¾'ccz[ ½ÓFnµ\‰x²ÕVšWCMÓ¥š¥ºJkz¶*œ¦Åa¤bÛfìír[™+§' äѲ©± ×4ÌŽfÃ’-”Ê žnµwlS¹¹Âi6t¶S¥²´•Op>%$TgyðÍÒ_rS<¢$‘#Xù×SÜL‘âð<¤1™™’N'°ðârœ´TÃÀÕ£LÁX«›c(Yœ@i$Ý*Tjµ…ZLCNÝ©³äðNwxÁœÐ;ÿêl_(R.ÍmçÄô­ó3´C9¢I7 yHŠŠê(§ê€‰û¡@ÿiQOö€ÕB¨|+ÔPxû   `¢MÉL‰a1S,QZ®55Û&¥T•™fÒª)"KL„¢å ÎlÁK4ÊÚ •*ùµ¶¹"K„•~ä~¨ýQûÑû#öFÁ#r ¬„ ßÁP‘ÿ™&€täEÿºˆ”D¡D¡‘ZJT¥R’%E¿ë ý5þF’ „íž²>8q —ù 3ñ}ïwަx3ÂZ’N¼ümEƒ­¦‘ ˆŒ“Û*öC`GÝÔlLÔ«heoV}Ù§xË! ¥vj0LÕ+h"Ú¬å—r3gwöÛ¯$k~x0r¤žûÅÿ´¯Äc?ïæÞ¢ksÿ{#ÿŠ<Çþ¶&I±'9ØOüÓ”:XÁʽ46©çðôß^¼ÿù²|~Úò½÷ßå÷¯>Qô°ç:×*›&SZ©:S©Òº‡+1ð¯Tí~wkC™D‰Ý!å&x·U ;X6Çëçò;ȉ®~Kéθ?´#û$ƒ¤ãö5ûÇd¯è^/õ‡jx’Ÿ ôŽÞò{ó—§ÚïÌ}þÇœŸ?-~ø;}}Ö;|{H}e~”§oõ¶ùOÌüNþýPüÆÇ퇔~u?yûù‹î~>¹áçÒðA¡ûçð9÷½vÚýHað@ùáë¿ri×äcµ9ü¬ŸJœ¾'Þø{ÑñíÑÒ¾\}¯Íó½§µ’}muí?8h>zNêøŸ_Ì?!ÈãR~iÊO—o'(ååé|«ãäò­£µy½œ§aï\L#­~wÂÞ¼×…ÿC :ÐöFµïíÐ÷:ú‘ï‡Zù°ù×gÿ?NKGÓ¿§¯(ô¯ç]ùGnIågª~·™ëÕø×càš³yé]^Ÿ âüjgzùxÏyýëtòƒá¯ÂÆÏ:ß~O›ÆçÏíSëÖ>ükÕÕ=ïËË¡ñä~™ô÷Tô¥uyùýµ)Éïæ;èõ»'¯‡ðêðç>žƒá^“ÊÈó:Xu=ìž,úõøí\~S~ßÃíöþhåWô|þ<ëçùûùý¸t?Ðs ?$@ŸÑÂ:ý$üÞ—y_Ù_9SúÈëHIGâS[zlð¤{TùTõ²ªGÒ“™Örž SÎD?| wâúKç'eçCçdÑ)5vFÒv¤ocAÈO9‰6@'IO¡ö—€ó—¸t=‘àD}¿˜ÿ±ýXWã⧯ÑÁ%7êö±®)·ÁâoÇËßWmçto—Uxœóœ„C¤y-z7j6hs-äoNj¹‰­˜ô”`ðÙœœpMew¹s©³:¦w,¶eÿ;Íþæ/Ì'Eö•óôïû¥NSñÏ0Oî“ÉħÖ_Wˆ *CsÐ̘ž¾Bþ%ìºìû¡Më'tø€üð+Õ”¯ë)úþžœî/ÖrÙ‡¥•ÂN¥)ýõ‘8zB`lûH¯ÞCéî×LÇ^ ®ögË5)įé®>!÷‡÷w|þ¿NÎ[Ê ¿[=,19##~_7úDêO’ëZÃå|þ‚ðhe"ÃR]ó%Ô]¬$U±§²`)˜Æ<´D9{ÜËD§rέгZqÚX »åÛ°…-y ÍÍÝâÒÐ×P僧;!B„2±+¨hX0cÒ¦‰nïq»Þ4œ{Êœ™Ë9’ù`¼Õ8Ée<,v;‡‘œÑ3/jºlabC ©–t Õ,3ssy‘-AqoT-§¸²ÄÄ¥ 5 ) KDPH/ (>¥\†§’»„È…$™òŸ÷m¦ÆÉ–ã­X#]¹Ð€ð:ØZàê eŠÆaÉBµ¡â”i^¢½ti{âN¡“©œ_Ž2çax‹…Ääat±`ÝUQµ"qØQ„ o½äÉFÖ3H°¼ô\f±‰«,ðQÅ_#Å 8ÂpJÉ\½eœ¼V†£; $RY!a»¦Is^dáÜq|Qn#° “¦/ P½¾7÷¨›DjƒWi¦i'‰’E+ . )Ž;*x¹µãJÄzšø¥Ãò¢ VBëRQ«ÃºQËnu%iÁãÞÓÃï Ág¬„AǸõ.Œüd)Zkf 'M:ZÉ4%2ÈæËÌA±=Š ¢ßfdtè7P½M™âx˜ è7{ 3yœáœNI^$EA×}ÇyF.é5Éã=ÎFMRP\Q‘#ëT!µš´³Ã7Å·‡«³Œ&¼a$êãx)Qj XVÕq ¡¨9V*/ò˜/}ñ{_F•ž_åðu…ñ˨Ε¼Ë4Ýù5”r¯2Yã=\8"ZÒÏ(£VÀaÇæ­ƒŒ=° ùïØŽ$õo½R›™t,öø‚¹G4Ì£,¶âL0¸x²ä´©ÏFµBlÓÔ7#AFÙg’aת>SP€Jòý¼ÉΈG„q}C‚â=pmçÕ3ºQ[s›rjÛÖX†YÔÆ@æÓ®0¶n“ËÛf[?Lˆ%)O²³qœîažVù³sœ¹‰Pè&a©0ƒÝ*<ð†nëM(`Žp6ðˇ÷K {ÛÓòâ' –ÁoGE@›~”5DÜt )xÕ·íûÈnϦãõ¡í?NïŒçÊzË7Äz Ÿú±™/8Ù¾Ûz•ç™¶©œˆw/ëéRüØõç]‰¾K.k£—D4ÉiÊ›°Â7;vÊ!€Éä¾fi‹í£9³YÈTíœñw}ίÇä÷Y–Î[“ĶððDÓ±"­¤÷%<{uøíäæ÷çS^ËÂò:ÑEïú™óÃTö6â)O©Ž #[½½kªwë›È.ÖÛ„ëPe©…vó|6ÏÞ\:sÉ-‡Å3>è)ûs/È^‹óÅý;ëÆbô‡Ž®2pËɧNÕjLÁŒe¦lI'5VìÎõ LtÝ‹·~N Êw&4è6yÝØÜmÙÓÜøßt§ß·ãÄ.D²ïÞÍñ¨DÌ¢¶R»fbûŒ];‹­qƒå'R#|Ÿ£À0³\¼±R)èôi“G –v¡–H¶ˆ˜±7—¨F Xd!JéA¯¦>®÷gîìAçPN­›ù¿o™E!Dz,aûwû}ÿ7ý#36w¶óìÿ¼~“òÒsën›¿² &‹µ7ÉV„)SÑ:‚YÔìŽ=ñýÎqÚº‡êóFc늦ULot:yæY!Š ®L9Y¿¿Ý4ôk{“ÙüRcÆÞ ñé??K~­e0¾vÚ|nšèí²£Üì3ϵ¸M½·¨¯] =%ΧÌõéæýE0î0N[̶ϧ½¹æÛ³<ÆWEéò¦Y½åòÛÝgî$#½9àrÕÍøÌl0?zçnÏÄS¼”;A—=y‰xáËsÓ¼îZœ.ÖÕp]Xl¸ÐOÁ6ÔñCÚÃÅWˆuÚ×DSŽ…% ¢š<‘k¬ã ­Y%,ðáäFG›Øv¼quçCþŒÓ|)#…u¾:"bÏÂmÎîšN–)ž·Üö³+lã+îBg¥ê0Þòx]T†·ÛïŒ/™º·µÖÃ4p¶îÞ1¦Ûë"›TÄPb3nÝN; É*²"™á¸¢‚šÃaˆÇAwV;Cª¹áj¾žï-õ=T¨†ŒRï7 ðutXðôqœ‘Ößì3æËR¶ÇbŸ’À×T;Þ½¼<šùT`o&vÚé ›Çxq'ršv£Áï{¨%Qø»Üõ—‡Ú 8=Ç«Ù.w¼™Vk|ùêÚꩽž¤[~Îñm ±dŸñD³gf÷‚Stìzß9`‰AÇ+ UFí¡£&ê®\ØÉjˆéÄËjÉli>·¹x¸;´bDì5µK„ ½=§ÅÇ”š=ïÓÞá×w=W}\ú…[äp[ø×ÄbÀ៊#S³T¸hŠ;™º&ë\ÏSƒÂ9Ù)Ï}Ïrýïy“]ñ¯úu­ÆÖ³©˜Ú1µ¾<ï=Pèúºíì=ìu=›øªzõ!7[~re4Þ3ÌJ%{€Î,’{6[׊û×f½Çn}G›=çÑ[ñQ^nÆöÝupñè‡ê¹ÚÖ4½×Tç‚CwÇ‚Lˆ|Î뾕ìäáãf<†ï5†Ÿ¾;îvÎc6“Ž Ø§‚Ê'²Ñ©(ŠeKÓ¸“TæÐ†H'|ùõ×™‡Yçÿ©ƒú•šøB%Äø?‘ðg#í ï“aö¾'sõ‡5‡³JBø5)ž1p¯†–‰%Ë” ôÒdXfTÕëž™½óãë ½ñ6Ã+, g¦¯& ß¸üŸ§Jñ'å:â:=çÊWÿP´ëH@’„O|PöGÛÀéœ<ÎDá]L÷Â\÷s=‡½é9×Ä÷+@ã诛Èú‚×mk0dñ±€}È'Ñ,{;^Â7$˜@‘Î/GÃê“Á¯J˜Î@,<:>n¤„=ÊÔÌöç {C¾ãÅHž‘;^[˜)ä5¸ÿ´L~ÇGȲ7õäzD@´h:$æ¨ü¦^×Ñv¥Ãâ;áe2”}<ÁŽ¢á’ÝŽ?„Ëi_Ǿw@ÛþÑò&-èjÓ®”’YÏH°ÂdwdFg$tó;#> Y±ùàvSbõåÝŽÛfÍM2jaÜWÊ'#2þ#¦2àˆdCïè-ÞEvéhá郑G Funò¶ ¹!XLÞΔ•Ï¢ò“xÉïnySërÌ!|ý©†\7 îîû¾ô³Ñõ²3–åÔÆ× $‡N`õoÇ‚(D Äó–m÷Øfú¡ë8Óœ‹fÛÕ,‰•äg6%¥Ô”The}¬sïãøä÷¢áÚ†ý¤Hâ2¡,…‘´#nÖ…j=2%&ÛUÌ÷Z·˜U ¦qê%¥º`ƒñu2ÄIœë¾¥¨À u%‰=µó “ šjí“õ*J1o…ð ì!‚¹ÏÙN>Åk^µÄÑã}fFQøµ'&ŠOß'É踥?'®Uh?=íðú4ÔÙéý2sÏ6¢¢*|ê) †ö^4A­h¾È~àG¤ -ž›PXP„èÌÈ9o‡Ë ýq´HËip ØêXZöÕk+2&Cd1fÑò=¨&_Qñ[É8îÈà†BD´«ÉOEê^KÌ" dÖù7 ’ÓS`Ë‘:ˆ¶s Ä’Òe²êœ…†ÖÑzÖÞë@”âßm">ŸY!´¬e=ÏÄÌs©¹M%lºLÎ#›“Îjy+NÉ»œÕD¯„ŸÞ?¬Zi„GìýŠ#ñ1”©Î„“;5£O$ÆÌpôRE'" D„ ’ɦ øÅ«VªrÅ!*Ù“ DSñ?IÓ;JÖf ³¹“2éF-ÅÄÑ™†3H˜žÆ¡áz¥›X±×LÑÙßMžZi¢³3±×ųk’¸®šjÉÊ:É!pt`13FPÅHGì"‰ ?°/ð>{Oኩ‡Ã…e.öü)åÍ=æì^1œ±ÃY*£ÞTiÙ“ áU5ø|…kÍ%1©ÝƒjI’T/ÀfÐQ8ÖBýµE&ŽRš¡Õ?ít5$à®1‘à®Ç97šdrâLcD«üÀeþy‰T ‚¤~¡« 8–Yö MYüW$é+Wõµ/âõŸI'‹9HÕN’XψâÄÔ‚¼¤²ˆ%ÃÖôñbvŒ‘éOdêlÞniÃÏ›w/&98erÎìrkÍ»³dMËç«“dí299.8nÝCø 4l>±¢¥U„’Ú¡Ðù¼îîÎ">†¶m8z&=ÓiáéÂ0øG÷¸¢—*& y&˜3ê%GêúY(¤}8¤=>+4Ó²¤‘š1®Û=›·ycƒ©ÖV.m+X®cv8nii‘’õ4Ï{ËyÛSMœôn³cÀcÄ­,US!ÖM 4dè¥,ÙU§m9t÷š9Ôæß”Ò«›f“J•¦8Ó«ÀÓ´ìäßËLo³Zª<ûÑå9>’pJµIü‰.LüT¾¾ “áü,£A‚`qÖ½† ½Y 6F£ƒŒc¡O:Ó»NŽÍÝÕδd”²w6MYœøÁ. X!juïBkä_n$0f¹¡À:¢BÆfž ¤ÌAú‰ÃOÜÉ£ÿ¡$ ýÑû€sñx1âÔ™*­ÆKe³£Hh]$öÐ+ú( >òÑ1O¼ˆ€@¯ÐIUN$HÎÄ@Ó¼„õ‚Ùÿ“(ÿ‹¥î¼;9õ;^¥×íz¿’ªiþMÓñ³«‚ ÊÓ„TÚM”ÜáíK³"›†Òw‘õ>HøÉ#û˜ÿ±¹ó8‚|¤€ÑòùIͱ¢øýßòvx¹ŸáŽÒy& ÿgwùÉ:ŸÀÿ”äC³¬† Â+Ì­‘1‰ùÿÕ¡ÿŠ‹cú“ÎM½MOû<†žv ÒÒ)EIÉæCaêŸPùŒOÏjÑeHv8Lr‘¹³>Oš«ÞG‹âtSàé8‰‰at? ŸU;ÂJŠ&“ˆ4‘5j©EY­*"“‚Éhù™Zõ)^¿_Y“(ÓKO ,RNGÔ±>3ä|»Ç“Ò'ÒH“šxó,‘9&Ÿ¢yÑ´ê|üXûçítË—WTˆÆG1e„Ë#ðô߆æÍ›6l¤©3 ™‡TÕµiP…@¨´2Ñþ#a-æ1—?Ù4a@_Z°YpêL4jSV¤÷ÖíæfúŠlGá茨pBJTmm÷…äLœÅâ5” Ô‰jÅ!HVÉyB ™”Œ9´ÓcnÄ(B,‡ID(t'sÄœ¢&èj^Fºt²0¬ê Aظ*:3!•µEÞÍ=ŽyèÚ†e¸'ÑÌ1øÌ›g5Ìœ„G£bæêäÖq(ƒD¦JÖiž•íVJ8¥$úsLÒN=A'^µ*ȨP…‰tˆxI§‹xH þVÂ<‰4F!~`RiÈ¡ÂQñ?ŸA`†`4‹ï•–¿H;6×E0&ä6F(ïÜR1 €—¬b³bc£†2æ#’ÀoÒK,Q # ”i4† @Ä/tüGÂÌ>Œ0äf…à»í8Óy  ™8" !%ô1#ÞIpšB’ÂPGÈDÉTÝ~BR Ã[jÒ\ùTj^ó÷´Ky_Ê>~ÖÁµ¥Y«õ ’ˆ«NÔð óh›êBSǽ,µ³ò¡R´`¤‚C¯Þ#çÜä ¢ª,¾$å* $¼[>Œãc>6×u&‘8”¸¨š ^ÂÜ"0XOÚG’ÄŽ(\(’X}² _~ÁŠ`Ü0“OüI #ñ} y“•U~m¶Ûi„F_ßUwq _ôŒ_íºöÇk¤Ðòù&××ÂÝSgÄZáyŒ¥ %{ûhÍüŸø ¿óÊŸžºbKëO­{+Ðg0!Hôý·¸É•UxY¬³L8Š80~ ððe1鱞È"ö)¦Ê¾}ì¿m†…1àÓ¯±X‡‹P“€fLoF” †ÈM ‘Áplǘ „” ÒÈð­ ˆ‚JŠXjòØxÕyHB¦J7ÌA`´Ô$p’ªª«NÇ&yS%S¡bseI*¦Œ2U¤¨”`J_–% HdB &ƒ¤5Z Œ=!ñ ¢Õ¹Ìè‘JÚº0—kÑy5Rñ†­A 0¡ƒ ÂON !†XËHBP4Î.oBF¦ˆ… ± 4Ä!&~JU˜q¤YÃòž4l˜+°ÿÂW¯/s{)6rï{(”|‚¨gH+À;mŸU’…‹I¥3‘6ð¬&’Xi…”’úÐ|  Iƒs6¾ ùô°ù…!lÍRJ¹˜FIPaÄXTU%5r[¤Ql-@DYPÑÄ­0²h‚ Û&âìA‚T%‚S35ý7HKR cB ¹^Raq³G|ÓÈŽÈ_o0¦¨ˆh+ÂPEDRTFƱ‹IThÆ2[1¨,-b-% Ñƒ0O)r’šLܺð&ó§Mk]·ôùzùn±:/Pè¶“F<)æ~ŸD3€ûûˆ#‚×â÷®lˆ­kPä;Ç€ÉådWKH¸„“FlqÆà÷‡ýEÍ-)NxHzæ='a‰“†&½¢àÁlÞ^éí92 °g-µ+ËZòÂÖEÐeà²wÃ’²TÇ‚†Yy¬©+Wq&‹ŠÏ4P¥Xê# }Tk¾YGb2•OQ¥c;J É9°šfxs‰aÎ2æÜ5Ê7m=þà’~ 'cxŽÑÖöAR€E5UGÂ~¯¿¡^=[RIp³BQb$°€R‚(• #öÉ_r&9|AN’\Ê}µçaÆf.¢‹ƒR€Žh Çß Ë@ „v…!D‰BAaÁÅRHŽPâ,¡ÅÑæS²"Ši'©w:-ƒO¿Ñ‡R ôS1¼ £F¾2 ^ .0­”¤¾’ÄŽF$A+뉄ƒ ')Ñ…pÒa#Í $R¦‰H“ïŠ ÂHÔ|j¢L6­¨ÃêÕDžÕ©p@Ô²C’&rXGTY´‘_M@QJÁŽÑg—_®äÅ%Ë&d˜!~ ÿ@„ú|H;â>¹ù¥—k ^·©› Œ0d. 9b^Qé¿67aŒY¶53\ÞgÍ!$wÊ÷¾UW«÷nªª³ãŒÔn•¥(÷rW©pˆ±£*õ ¥) ¤‚ky•¯:¦ nüµ³°ðXÕ¬;ÃПrñåê†0›¡‡Œ3/4y@ÎSg…Ig”ažƒ­j2 0Â*)YƸR^¯”)XK†X³¥²K ‘–Q7JTDøÔÓѧN¬'ÑDù2ïŽ8ÓT‘gyV¼¥c“4¨e40ÇxÞgqf“åw¿À€@€þ$„!#¨¤†¸A¨IújÆq2p«Ï™„°A@ﯻ³ê†“#ѱÇQ»|aˆ› [¤æA Ëef±[¾qˆ¼ÙÕC.!B¶Bhc%Q(i´1¨ X|Ã|RˆVDlB-—F¦†0c$émk¢ÄÈÄ䂦>’¨3”‰"R“‰B”\ =* H‰”‚žžî’Í ’õdAjR£jµç5 ÍC6B…c,ˆɈº$; ò/Á>ÀD¨5\.iPŒ¥’iï8| ¥RQ^©MžâGžñÎÑÊ¥ Z¶Ö f(À¾ƒ–Mœ.åt[C•!ºbH$fBÓh³U™å9Ð!|ë*3ÿWâc賆oÌK „JPAåÇÄâ0g…e/ ,‡ ôb±Ù?,¡˜bÉF#„”ˆä‚*ª‡‚>Rñ& EÁ¤0’?‰t[.fTÌù%.gg‚’ .S"0Ä}F B” K’ì"¢—*¤@UŒ}UQwÉ]ó\PŠx`ÃéØoL-f¶Š4°•¦HxÆ.’)8²' ÃŽ -BÒô¨–0âߪ|ôÎ Â]{å$ÂáHR]¢NênäÊ~(øk,‚ɸŒ—$È€ÖyUñ ˆWêY%'v¤×G"ÉH²•@“8ÂÔÒM4š ±0 Á–¯õ8•5$ü:ÌR|›ÛGÄ2>c<ÕŸb3–öüÀ)…¯Ç©Œh¥»ï…˜l(a1«d¢YØÆ|gÔ“'ì(´‚„AÆtš}²ÊKâf*c„Ç+³‰â9“€ÙÐv$ŸÉR0ûðò°¦F2M<òL…ð ‚ ˜3ˆ9cP™m/‰pJå Œiµ4a¡@”àHå´¬Bší¸!¨Ûû@PBÆÁÊ XQ°Ç¬³Öf¡*øµ&3µ Bˆ¤Š ,êÚš”¥•j·ß‹³–67Ì¡BGá6ð1,pbàA ƒ)2††0cX« ^ÜAAP@Z"$Óà@ ±Æ|ÒÜ0÷VRZΘðиÞEZ±Ÿ0$%9²©dµxs:ðëË’Îów-·,)Ú*X¢€´}ħÞ!¦åð$¡°&-€·Üá¶ÖÞ)·½©^¢B®§(Q-ÊY{[µÛy$¬Sïߟ~˜cCX¿ÊÂÐÐÆZ•ƒC,¬\‹)T©xpcK,”ß~ˆÁŒÆXɾãO(Oû~IXm T꽨hÌ,’F_ˆ,~%Rx¶‡Â1$X“¹ )R’‰Z‹,b’ï(5ᚯW(1ÂëC$QD…&iª E,&0½Z=«_’tb¯¼qd–YƒÛ²«¨0f§j{ ;H–”Žàç &Œ ÃsÃ"æÊ< <\^XÌÈÒ¤šVw-¨âl¶·T›¶šP%³$ƨ74ÖYc›"eiñˆe†ÉE&aG]º0‘NeÁEY …”QRUÚµêIŸ÷’2Û˜ˆù(C”• O‚±/@j½h5|ñj‚óy ¸]3[ÕIY—Ñ^è¯PŠâk–(Â8‰^z<³Ã“L ,ê@•Q,A¢Rq(¥H 0¥Hl'SPH†''’¤zeœ:dè6^­0,ÂèÍaýÿ€¬»;ȱ‰ýÊRˆÃ >¯–!Š‚.ÈE.#M*PĘC3…&ŽÇD…ac´‹Š‹UD«Ãx“»èê®Éq),£ËÍ4Æ04öPÁt|ÑfŸ Î>Aˆà¢T/E–©‰˜R¦a˜ˆ˜JÈ$”h²I™&CåLd„Ë|0ûdJñ©$ÒDðÎ=bÃëD$˜Òkpí¿ŸMñzÎf#w Y,‘%¹I„†™¼/ž(‰˜ziÄvG),Ý^-xKXiàÈA!^¯‹,ñJ €µÉ¼eáeŒ¡"Ë*„ÒÏçà ò8ÑÅ"@˜(•&AYǾžVq:i ‡ŠÙ^ønJ‚Cåx=%[¸…Š“‚Ê$‚D¢ô²F4F¦&ÜIÆÀŒC!A‘B(a0}g !5óØy¡0›Á§>šbxI0¦J_¬®ù>•G((>:Œï#lÝø@Èù‘& …UÔ X@ª Ta‰Ñ6.âÈ[ABDBÊÊÅQ¦[ªØ²²²ëzCSC/ "CR’ƒç†uáï†xôåªMÇ\xî‚Iñ…‘å!†)/m¢Š8³Š*3M<2‡lÚ<‹#É’iÓ”5œš˜*C‡qPÔr ‚ 8礄((ž)$³RÙ%iE*éãÅš¤Œ\N”ì<¢—†vûÐ_†´£ ,‚ ^ŽÈ3üèV—Ä)I‰á…)|@¥åa|ÅXšøaßʳƒI/¥Q©aB¤„ª­¢;Ø’ %M$ˆàþRð…ãâKBŠKH>A8aÍXjFÃyádm³,…äd œºé!ºMô B‰bJØ2 › Y6íu,.±Ú›GÃfiì¦E4CbrDñÀ†4Q‰¢l€ß@4Ò ë$$CM ÁQØŠ.^¥âM3©(Óí(ª1 “D$& h’J¯¡~øàùˆƒ}*Âh²Ÿ1y—#aw M Ô$×°ª ;øPHd’Â4Š0 cÂk(P¤q N,SÀ»ODÎõG¨Eqv8€«0ø£$Ãáó~)*I5#å%AkÄÊaC‚‡íGX!A`52%(f+wS&óÁÖ55wcJïC¤sIǦj榎:àÒB‹(%Z’¿ »$âà åä{’Ve(ùdê¯ÄQ„¤[:(P3âß¡bT%¤’ä.(£˜¶ E©B?ž&eIŽOÂÉ—q¤Œ4kÍíè!(`L.¡B^Re ú¢×ųJº XSè(váÁ z¤wF+Ibð r!¿ŠäÞ(–Q1KNâóT­ˆÂäÁ>ßÊ_F’h©&öi¡}ÂF‚ÑE”¸´0b–¨i`Y¿<eÚGì¢ýýL$ŸŸ…ÊR5ö•¯œ¯Ö4øJ;døS²´Ev‚‘ú2T‚…ÙseP}Zwsvë«B×ñÛ‹ Œ¤¦Y¥Òû¦a…ŠŠ!"Œ!L šD D_%0U@ñ&7ã4=EßAÕÃua¤–¤¢V`Œš P†Ê*Š…¸o¦ñQco$¤ëà9´7R8Éb`ÊŒƒ]zèv„Rpb&#„8# ㋃:!u¢ÀC€€pœP&f’ÖìC i*R-œÑ„Á­ÛÀcÅ’J 9àÖÀàS…Í!bD&!Œ¸‹oIo) ÷ÌÎ9×|´·|¬Å5?bò 1}(©0² ’WŽ“$•aÙ8Ia¥…âÊ <µ3£kIL¥¥-:dÕ#€³ ’Šx°µ£8ãÞ*— ƒ°aâæÍâJ êåÄ ¢ŒXs,£ÄmÏŽUªÙà†´ƒœ]ÙîרðzH:$òØPHIE(®ƒ7BQ8â g“ï2Œ7)g;ã(©ò€ãW‰$‘ž92׆g,¬òj ¡¾š¤ˆñA‡(ÙæMPeòÿW¦Q¥êÃ[ɹ²bE¸±Y!s}üD ö©,ë\³»{ì$’hšUž„’ù|2D,ƒbˆ4#êárˆ¿‰4¦@Q+x4ñKK ê$Ô|@$þØið°BF¨úA“jaz)ŒGõH¸1/ˆæµ®ÐÀ,Ef °ˆÓ ÕŠ¨é‚ëÏiƒçˆDÖd|ýXØ“`$‹¼>Ð*¨å3¤ÌÉFª©,™³J*¬ˆ‚K_© WÔÉ?h‚æ|Ë(“#葌€BEŠû÷òÌ4I$feqľ´fq¯M.üºIw&ýãFpQtІϿ‰ üA»F*n"]$,&?OQh$ü¶ÕI!¯»oÂËaIMž @7ë ”,€´’³ (%YREPAOªP}êèXÛðGèË(™ÃŒý܊ñ’qȯ¿¿±§î°L`„&1 ïô²Â«ôãRƒ@Je ”«¦—¦ö‡ˆÔò»À4ðèšE|(ÄBM¿ÈÍ_¬£ÌD6˜jfOíþŸ¿±ßRýBBCLJUÁ% C[{îãˆpX’R÷ðCwg ²BïNšÜC2‹ƒ0º×&ÑÖ°ÎÔ•WÚ¿G£:•IúÆÉÉúGéd¬Ÿ¤“ÎOÁ #÷ö!¤¦qRYU[8H!dMï¡´ò…å—P61ÂõÓˆ€„ŸLú~Ÿ¦)øD›D: ?P•@`j¿·`ù!öƒŠ‰sDBûIžl¿«Š  çJ$óTÃ÷…ó ’ú6ÃÏ辇âb±q‹PI([XíW¢™ÈoŽåÚlÇVEVY´xZN·^õÆÉè‡Óݤ '9kÚa ”Y”® âÏFrÊ/¤wk 5qãM08,Âxô•6Õj(´QãÖq'­ \aªÎÌõ7Ðì£Çpn—4¸ðÃÊÉ ŸIÄÍä“ ^3ÇiR»‰%Xi&qEŠp‡Þ)2HƒqË¥%¥ ˜.¡0ŽR†AïMxj|ìH–YጯÊz¸˜4 E뢄1ˆ£ Lôj búAàÓ~|eÆÊ^‘®Nã:DTd®mÆIL!/oxUäð¡_‰r3Iä‡`€e%TÛ.=:¥ËÐï!ÃsNF7pµÕ¼åÒ!É)$Å’$„BHMQ¹#ÓCd’‹÷ˆy0˜Ð€µÑâM2YKN ”@Ç;:ªvlT9‘6Ê; Á`”‹\D,jx¸ƒÉžÆ@ù“©¯C°¤ĪҜH«&`*Ø’:Íë:™vs\D”¼P–£À’cBF0B"¡ $àð›ÕR3I6”ÔÀµ@‹Áx™œG—&©I„ž\GVx@; Cü!C~P|¹÷U+jÕŸR0¯ŸxÕÁàgC<’3†…D›5µê[gv@ï õ{ÓãØyaïf ÇЉT.£¡œ àß°¢î}š½ÛÁ̘òí^<ä²:H+ĸÅâ³,1QB¥psEO*™Ë»ƒdž¢OÅ(âŒ8´ø7KÒë\x°Âð£‹8æiš1œ4pû¬‘’i‡—¨»MG±ljß]´ñ%f5i“ǬðɰÃ$ƒÔf®RzN=PW“ÄKñB"÷='$ÆÑ—„qE”Ld ­ÀxˆH(ºÔi&¡‰&†+YPÄ.¨¨ÆÖ¼ÊL›Ú¦wXåM)…#Ž.A"D’N ΓDĤÈ;#˽vÓ°‰g‚Rï‰Z`½òÃÕ F|¶XÉùE(B„XqÝêÀŒ„‘›Ði&eI%b™RM£¡´š€•ÑEÉ IÕ¾¡dFAµÈа«»wp1fÔá{Fß!âOi˜BòA>_ cHø!)¤j‘¢¡Èm„jM™-‚¬˜RÄ¡@$ÓÌR$=èKäLLOAÉîo‚Ât! ˆN@”i*$̤u)ªFIŒdª&ÙšY-ܳM•yWR ü#˜Êà¹=pî»r„x9¬8¸’¸8C !`H8ÈIE?.Û¥©••îÛ¥©5(R!gŒLB %2B“HbH„4ktœ|Yd¥h¹êèX…*$dPž{:BÊ4€@ ÌÊK$¤AaΜåá³”èoº«“[¢tr‰e‚RXeHP`€Z q 6fˉœ3c#¢ÑED«%Vö$k€ßf,b¶œœ™µ ÎÂZgi+T÷᪆Yh49#Ì6ŸÕ$Ñý¸Z‰$öI‰%‹$…à­ $JˆR ª” (H ¨ïXÿ³­DY’I I&d!!¦’fffI$™’I Hõ»ši$’HfI!$„…J’H†eJ%)&e)$„’R••˜R’H[Kkµ»™™’I$’HI.ðÛzô’”’I)M4“2BJRI3$ÓI)LÉ)K,Ì¥ iµíºèI$ƒ»[µ…)³fd’fYf`HH’HIJ’fHI$„’I&d™„” I›«®…(’fHfH$™’f޵w3$“2I4Ð¥$¥$ $$’”’]ëYï4ÒBJR]V×]G·¶ËkOo`š’H:Ö®æd™’fhT©¦”¦d’fI™e’K»’HKÕÜ$3$ $’JR@’CM$’LÉ$$3I,²B@’C2I$$“2BJS2I5šÂI$Ì’@®ºîä’m6škÕÜÌ@Ì¥ $“2I)I{µv¡ I!˜I™.ªë¥)™$’fHHI¦’fHlÛÛ[Uêõé!¦„’fi I!J™’K­Wr@’B”$“3SRI$Ì“0)I$$$Ì$ 3 RI$“0Ì $ $’I$¥$ÌÌu­¶¶½ZµëÒ”Ì$’BI$’C7­]t$ $Ì’M433$ÌÌ’I ,¥”LÉ$3)BLÌÉ$’LÀ©RC2BI $ 4ÒI)I$ÌÌ$’I$$—×ËÕêHI™$’i¤†Óh™$/—nÂBBJPÌ’BË$¥)I3$¥$)C0¥$$$’J•4ÒI3-–É3 $’BB@ $$Ì$$$ É 3ÚÚÛ¹¦†šJ»mÜïmzô¥ 3 455$’I)LÀ“2LÉ$ •3 P¥$’@ wnÃM33 BBI$’I $’BË33$¶–×mºé$’õ«¸I¦™€I™$„’HI! I!&e–HHd„’I$’’I©©&a™$’Hi¤ši$’I!!JfI$’I$”¡™!%–miµ®íÙJI$™’fi¡$†Í†d’fR™’fI™!%J”¦fš’R’I!¦”¦d’fHHff`I$’$’HHI R’R”¤’’¤’IJh’I™!!˜;ÖÖ«zô)I)JRÙl$ S2”33I2”ÌÙ°’JP“2LÉ3$ 2” )LÉ,²I$‘Ýt’I$$ÌÓ@’@{¸f„/Uµª½•µ¶¯kÚI$’I$„’I$…)¶›iJI HI™! H’fHi$’I$’ffI$™„šš–Ye’ºµ×JS32I$’I]^õèd™™„’¤’’HH’I$”¤’fI˜„”¤’lÛÚí»aJI&šI&fd„’I$„€R˜HfI$’fi¡&d†fÍ’Kª»»[Unæa!!#¶·]w]$¥3$)BI0$$“2KKI“M$’LÌ•ëÏxI õ×LÌÉ“2@’” $¥$4ÒLÉ$Ì $ÌÌ$“M 3$ $‘ë®”¤½ÝÕ[]t$’BBI RBI$$“7yVÚžð Þ«k¹™$’R’6I¦ši.Ú¶ÝÉ É]×I$Ì’I3$’LÍ4¥BI$“2Ivîfi¦a&d’Yfa&Ói&`I&d†šHHI$™’I$’fI!!$’HHfI™™ H’fHH’f’Hff&d’’Ie„†šR»|Öª¤TIúÿÒGû|óþÿ/åôûqûÓòé¿ùtßöß§æý|¶³ï!÷?¯×ð¨ƒÏðuúêåëüøAÿ¨+ǧÉñÎþ]úi=ìó^’Ný£G'_㧪Ç.¸æ³Xþ1KTÒÑlÚÒ²¬ ™˜3 ÿh B ýb²¸Ñ4¶¥Ke2ªõÖÝF!Å…Km…"£ý&3I–Þ­J¦E”©e¥–©h%)ieZa¨¬’%‰•Ñ×Íçãÿ§¯¿¿Ï=—=3<ÿ ùõørë~Ú9CðK žcÔ¨}a}Pqõù»ô„ç~7Ç”?QE$P}{ûÞÆºõã?å°õ"=úúðh ªÕýÿG3í«õýqÚ¿–pû ¾•ÁXZ¢¨%‡ª…UIL1ˆ’¤f~w‚“ÀJöPÁ A)_çK’²!ˆ@¬W;´JÒŒIGšƒ_óÄËrdï0(bS’ð:„ÁýâÕ&¯jÚZJ¤´Ëm)U(³e´²Ù*kº×e¬ˆ…!ÐÁ‚Ÿ°™MC$Œ Bš LÜ%‰ƒBв¤fY&£*0T–(d¨––Jy<</OÏéÃÚB¿7å ý;>oæé×âì‰$Hä'ÒS–ŸÐ°’`4Õ `$©éUWYQA$¢•ˆŸâ¦«ñ¯×÷ëæøÏ_у ñ¦ZC@üxZÖà þeê?¯Ãn9÷ïÎÛá­DPÞ7‘–NÂm> ‘'ëÍsA\6æò õïϤð Tç¿I¥ä†´|¤šëíOb,«-¶E¡…B2T‹)J!…LEˆ §ÂO³Ú”¥”Ò„‰J6†Í¦Œ°2ÊJþ B;†a¦ò2I…,B§¯ëážž/Mü>¼ïš'Áö{oØå߬ù Îò$ˆ¹>>_n{;ß§ä€ßo$H3ÃGT>súí̃§?_]|ŽhùT¢–ZµQS#YvÒÛ©n[Ó+5eKjRÍ›FTˆ·l«IRÙk*’ÖWR®Ùf„´™Gàñ~è’rùzgŸ‡·ïÛïðÍúý>™ñùç”’<”u„€””‰G·šˆ‡CEô÷×Ðç/·ãÍpÏׯǾò®»%ÓØ¿³SÝXø°K{ÃIÔꃯs‚‰)„á ¤@±.4RhˆD~Òv$Š‚¦Å©2 dI"FY&Šf ˆ*[m¨°ªo‰a"¢0¦HX¶-0©°©¨kKZ<õK¯×õõëóñóüÔ3íYøtÏúÿwëõ:×Îö0ÒÅÈžóó÷ßÛ™òòóùïõ­r‰/ÏߥåíÏ=NÌ^þúç]ï…ià'€¢P°¿ Ž0Ð@A @!äB„  ú*«‚˜BÅ(¢R“R2T’¨³+)mÝ¿E^¢¯*s &¦Š{výßÓíéŸ]ûôùõé×>ûòÀ¾@C€cžÊ*yH¨+çåÈŠ¢žß<¾gí'Ç^š:G¥ÇLu½³à‚IÙaŸ=ÕJX­ÙlȲ¯ãb†U„–’ÑU!EH¢“J‘‚˜Q’R-)T•3,™2Ã,X¶R¥-–õ•®™£e¥”š¤™Q(¤Y(,; kZÐüþù¿àÛóí}¾zÍ/ÓðOÇÔ;sm­¿#Ó_Þ¿'oÓëóëæåÛäù9ödpî@$¨çâ)9GXSh1šX:¢ÒQ-›¬Þµe½+QY^·R-®æJ`¢Ò¬°¨`²*h{ºh›JSëèéòñöóòõç®ù:/SÀ¨ÊŒ”bEH±íôòy|Pç'Ëç“n>_-¼lëÝ<<,˜‚¤¼µ6–Q5+Y ³-‘eBaŒ!Œ`‘!JTR“2D…d¡áŒHTeeH #b&ÈU('¾ÿ'¿Ô¸þ­kƒ²+°c±öøù¢DkAÿo§y1´Çè±­|)¦ø\0PsÅ2AL RiÚiUËVéU*ÙP…¤Á…Hpa”ÁÂZ±L˜,J}Ôž¾;éŸF䜹£«uµ+vRµ› ¥"Ëm"ʽßR=¾?]øe{o †½Î¿/¦5¢ºÙ¯–ï¿§??wǹà= ‹G¬–®[4¶Ú-’’´Õ*m K[-4»Ss©l§[k­·v I„´"F@ÌfÝnÖ«KE«´«u‡EÇÏ··ãïõÏϯ¯ooƒè ‹(Ò‹?¼ü1¯KÒNóì} òÒv@ºñ¿k¶¤ –{ßøî“”¶Z>äJ1 ‚£¢‘QR¡H©31&(ZT¡‰ò¤¹,’¡J `˜ ˆÉJ…MÖ–»¤fAcA–u²B§_›×áé÷øï}>\¾Ùà¥X§ä'Òz¾œ¹ó¿4H>VüöåÕn{íÕööxÈs9~ùöÔùHs#äJT© *ZX„TªLQ„• „ ÄŒ”Ib²ÖT•8£I`ÉšºJK’™R¿² µ×|õ¡ñ'꽤=Ñ8 $)FA¤>ò¹*8$*‹Š¢Ä! Œ¤,¢’& @²‰BâÈmË-´­¶®îS'w'wnã˹$Ý:é%'s­»6ín®–JJ‹iR™ª`jE•„%`B”QP©E’* )ôkiCY¤„•F M)€ÊŠõÒ]WrlËVê·•,¬À4#UÞÿl_§Ïô{õûÄßçïú~[1ø÷éõÐ £EDQ$QS(˜Ñ:%÷ùøùý?Oüêÿ]îÀЫ¾€û€úS/¹D~žPDs±>>žü>zÓá WÁ[lŠ¿›LQH©chà ˜*2â [M¥©*åª-–É:îé] ,¤ \–’MŒ(„Ðä^hÆèSE¥¢ÈTTQj!Ü 0àP&”ÌðVCŒ0$‡ÈT’ a j¨˜“&*‚«e-JÝ-vÛImrPn««-–Zm*»Jå¦Õ*Bª,T—±“j¶*šSÛãíñòöúñ𿜾¾ý‘ã!RÅYFÛü}¾Jï×ÇÀƒ¡Ÿ_3áÎy×…øÖqöñêŸ%‰(ª–_®,FrIšV‹u+¥R¥R-ȸE…òXe”’­R%E)¥5QïéÓÎùvû{ïOÿ™ßSìçÜÌ/ßêãÀ=hÐ!î©’2˜ ¤Œ$ ‰e$µ=¤œ»úx÷óð×o?Ÿ·ËŸŠ{~^¯Sk!~¿" !oåStŠá,‚™- HÖ‘0Cýá‚Ë +C{i],•Ùݧnµ±R×ö‰MHºL‰Š,3$ÈR,.••šˆÁº2–µr!dQBξ¶zxúùúú_ƒ‘;'vb2*ÖKÇßÕááòÔùþ;j9Yã\9ܓ˰‡’yé5PÌÒLH~ÅŒìI€b„r‚”aa()-D°ŸxÂd©"“zVKJ¥YR×l®Ûe,–c%š©WRêRËEl²Ì(R¤QS¥*KQJ’–­UDþM• ü>Yå3q+WZÍJüëü_2I¿¡ý?Ÿ¾{ü\~ýeëñßf5—mf{=ýЪ|“JK ¥J¨±!GïÀøŸÝ§ýÿ)·úæ¦a­Iÿ@ÿrsH„å$„I?"}RzH|8`•ôØ`Fæ Íe– 9 ’x¸%6'šu|õ§$8IÿxÞÚñÿ×.ÖE)ÿ­EÅC‚ÙKUúÓjþ&§»ð÷\æNwwÙ¹^t·.o‚?¸|Žäîí¸ÎVB¬£`Òi¤±»¸”L«v†šd%1ªa ÒJ@†leÖæúbœ8a¥6U,Ž_9>5—!Fú|Ô9pö¢Ø6z¢<áºjÒ.dmÆc©X€âí¬7gh3Y¨Zâ;§µmyãpáã‡3•0`3“4`Ôá¶(* :P ‰Ä/$è€âNܤI­Ï³ºŸE6;†%}û?ÎU•;œ§²xª~Éž' ÌuwCœŸúHæFÙ\e¶ä¬Ò192MÏÔÇôäŽð¯îtOâ~oc¹øÈ¯‘ð/ÒE X£b¨ÛW袭,²ªå³,X‰ø°ø;ž§Áù<žmzÛ¨ÄÌJ!@PÊ6ªÊXª…UKxS…9Ô‡eÃ"Näpt8u;ùÈtlÉÊ©²¿ •ÕYü—å~0ÄII™¢É4š¥í>ÇÉéÍÌíÈ쓜|¢²O`úŸ¤Hð6Ÿ‡?œ¶lîD÷‘?`<=,ˆÿ" ¦d2&H ÅÅÿ3ì~€ ð~ò'$ŽäÙî7À©Û’ש=Næ~1ÉÁÁ£s/4š’ÒIÐñŽË5¢×âÜÐîææ¸Í¡*š¤ÃÁ{fâkZtßœ'ìnmV$=NRC$ˆýM“PþakŸ"qÛ§Ù;p9ü`â ¥©e‰E„wŠ| Oɰì+ö¢¢†&„¨)A„aT‘€@ T€…d!hP$†…$"eI$…” †Zj¥d”JP%$*P$BHQJ¥F!”‘!IŠ,HY$¤–PU$JRT‘jL†LZ1T”‘DEEA“`,Di"3*5ÆH£Ø) ,I`ÒmÙ l•‰#)@Œ‰,Ea¢ˆŠ"„ÔiLQˆ,"ŠP¤ &Dî$QUUP/R4&‚Óꉧ觸CÈÔvSÑÔ‘†Ê:”ÜÓÉ9ç?qù3»÷¼ÚúJRÚ–ÖÒ¤üÂ)526†)¤¯r¹¸æ?4=Sì|ýÎèÞƒ(5‚Q ’=Õø¤ýП³ìŸø«ETw"v8s{•?r:Hðêñ·ã÷ZÄ|ɧœ69žé×oâ˜o"W¼>ê|#àæšu¥‰ç$@n¨‡ƒó=d'Sàž§¢ òDaü_±Ú×…™dœßþÈšúŸ²>FÏÄMNˆõâæfc%«3# ¾vã#hŽ,…TŠ™€‚:<sÀú‡ÁãD(½é‘¦fD˜"ˆT­fÙE’ÉQ­Úˆ¬€ÀR°Œ‰(H)’@´R©"‡ðPÿ0|þ×õ>pФçdÖF‘ š„ú)__ªD­­]¼³žÛ#WœÚҪ͔R0aa m¡–íÓØ vêá°ÎÆ2òã+‚9xSÖ‰ŽÛ `Ê]Ü~>K(˜o ¬Ë=±Ž“e·U$E MQ|ºÿe³½ý‘Æ®uÚÚÚÈs®#³‘Ègñ&A¹¥ÁÝ΂;òóèt0ӲР—Grî‰Þ9uºâvVI”ð+ ŽI;<1ˆm‰BLl ¨dDNL“ÛâÞblÊ,e£ X¿z6V6ÄËn"‚Â@¤É]‰QÒ_‚àÀÿï€ìñ† Hä4!J \Ä^Ò‰†ŒÁB@‘e­;«w6íHÓD©´jhdÉ€fH¡ €pdXKòbŒÄޤÈ!H$`¡20†QXBsÁLÄ@ÆP R lÄq$bXY J` ],¦ ÀÌ̹2Fc89D´iM4ÝnØîk—9^îç5 ouïj9#ŒÙJ¡‘¬¢¹D!AZ14`C4Àȉ‘ÂI)Í(˜3-C10ÊàM(Ai”¦¶¥2H¬ÊI(™%©£%é®\ºIÌ0ùÔ\.‡V¦ŒÕa:Ý«X»Z<)†ÑBEI(H©%¢$¡#Œæ rIÇ%ÿiâlr:‚Ib’?ÚÜOUTt€ÿ¾þÆ&¹îZÓ4FÍ9Ü|Q?µYEp1·.Gƒ€?ȸf`†?ú"½CÂYÁPGÃÇ·¿óøi¾yjI‘8Ëi*I² @ºâ0šÈ –>•n&¥É¬‰Œá¦‘×£4‡\³Œ"9^"ðКãµ(bKye4„2è,³‹¶0z»X»L„…H[mé³h"È ¡¨Æ~6í˜Pðÿ4D·ðˆ.SDô(i¸!Ñ÷âBæÎMj„wŽ(éŽ"«‰ŠèÓJÔ˜ÙŒ3iÝ:@r;™'ÈèphÝ_ÆE0œ‘æÂˆL”ÓA33¬HÈ×hĵûè¤ 2B%¢¬€2ˆ JÒÁNÃ}Ýœ‘©1¥ByBšL&Dò%Q} ä ª²‡ÀüÔÙ°z£â”ÜpíŠÏÀÚ§z™ŒŒ²ªL–HóŸçÔær¨">Ä@Ôˆúx\“ÑcRNÄö: <™ècÉÀG î u©’IpÃME?I ©|ÇYøÆÑ™IFZ ˜LRIŒ405w?þÍ:— ¤Éù£DTØÉ†Œ*v,L)’L !E4äÄ‘ÈçÙlŽE4¨ùœ˜VÃÄë$€ *pªY"Ü€IÉ,'<Æ+-«’Æ,R©*_c +Ìj6¬Ucwhb¤ôx99Ÿ"'Á îvõø÷£Ë¶´S©Þ«7)œ¨¿î…éJ›z`š H’. ¸®*2!‚•`20§ŽhòÂmÐDZ”#U,š²hiËkh•9fêìau©)£skDkXFZЉP’ªŽV*Á+TcZ¶Û¢+ ­ŒHĬhU…¶âI¥ª ©§¶ù5éJnVún¶QA7ô>vóÏ؉q\6Šù/: ]Hf ”$CA²GEo’¯zIog²º¸dצªÃybtHCÀ€I Ýã*Ì7q"\Æ4N­’GÓ¬„’IÐY'D’H„üÜÛ)îdrXÙ‘‚V)dÇ}rÕðlS$‹)Ü3„”ØRX@”M±Óa‰Hh»e5ŠÒ鶸²)9l¹#‚€ wM5l(´XŠZ”;?lˆ4MâDû­Yl¥T&Šz0øµOY$ t’³ÅeiÕ+g4“r¡Ñ8i¨"ºJt0`u>·’ªÏc“¡ÍÉâ“íû´{5eT¸ëõjq›[­cm˜­£æ¬?æaø¦4œ$ݳ²=âÕQô_"’6l5Âø>è’D‹$èl6UWSR$F$òckEª°–4‘$Â’4D²(¯3ó÷,Dª=OWÝ=^jêzsÅäAá F ñ6x«IYb›Œ“à§‘ÊÉ‹45ïɤÜàó«\¤ŸGsÚ–ŽÇ’M“wÙH‘ÁõR9)õ=K ÉPUBdGGÒFH7D=I<‡—Ž¿]¼n×ß÷ûmc²*  j ‰w0 ²X’?ÂGÆžÙ*P¡4 @#Â(ÃU. °n>-çFÁx²èàTÖ­•M‡]ÛÕÎFÍ:±»cdr©¤ÄÉl’¹:[ÍröK«¼l'9GVåu0VOÚ¦Xñ‘#Ý»ú[À™eÆTwUÊ™7v«`%HætÈ‘›âŠråÜn\M^T·#¢µ=¢Ó6Œ˜˜„V+‡SNìn*»âÍÓ¹q¹x“k7±fÎt5s·«Ö½‰×U§'-Ö…èÙE½Ùœ–]:—0uSwo«\äQFÎQtY˜^ÖQ \®™{5Lv•Ãp› ‚Ašf[VJ²û.êÓ‡Mž²¹¹c—´6Rn™?µÿMÛš™Â óó†}iÛpB*ç†gW²÷£3‡!ÈM£,¬HIM¹‹2ÒÀ˜<é¼Û8$ç ¦$ÄÌXåòé¸k¦ZÈL‘h?Å(‚p„ÙhȃR¤< ½Öµ;îðiÕÊll9F74ñ•¥jTÙ]Ûzq”äìb;ÂÀàÞA&˜YŸˆ²,# R@XË °§g«Mªâ¬Yy9a¥Š˜Î(ÓX ,±i¥·e¹‰ˆq¨•HÂVSP þ’©K ‰™ š©2’1¶”˜am7$0º¢“NˆBªTS‹©Ãº]™\ ͽ)¾wwnsÆfF—RÒɦ4ßµU–~Í“¶ç"ºåÅ0 JTÀ:›B_%IÒê%Q@ò¦‘ÐÉÀÆ‘%G^²¶ÿL¾{ä]¿ ’(„½¸¸q¾  «H0 ùa‹ $$$’Sάˆ‡N䂉iÑ­ü,“óã\1…2]\„¬…§ } -ЕÍUÙKl±£"BCÊÄNuÕp<µacŽz͸ó¸M†&··k ð?Ó29l„A,V“iß“úÁÂø;·Pîu‹á"eDŽñU͹©v“ˆM¶Niò8{ý }Sš9OK2Ä´i޾:Ú/›·× ûø.™¤X±:ŒlqPZÖ¨`¬Õ š+—%²Jú†éÉ–™rÖb[™wÁ„³ûKq%ÉáÑd(ª,)0ø‚4®êHì«y]ôa­hàNáÐ0Á.aú;>'=›8’WÖG7{$¼ü}&ÌI·#’!)-I i1à dXI#¯¥DD„Í; ”:€adŒ²…8«b¢£&>Ž<õmɦ0јý^Ue8‚MÒ<Ô1Ruf_&˜Öœ‰ôÅ›¸~§s;,U16L7hê¦Ò¾G„<¿m²Êêú|Ðá9:§ÐûõUëzb¼ŽÛÆW¦«XaŽœûzWÇBŽ\G Q«*èó=R{œÚsR˜œ9ÆM±¥pÐÔ7ôíncdè§aÁdæs|;Bnl‰$Hèp96Fæ6dŸGÁUñ?DéÃèðUY;Ž£S²§i'£eTáK$ú4u‰ë»†V?)±ñLû¸NüäÚ—–x*V"a 4´´ÑAÀp/×ÛëïÎ]x“§£: ›¦¥µ±Ù´)nl DÜDCLJ›)^`¤ÉBÆšH¤œÆé»á|Ï“®Îüå7Èa—|ÇéÇÓôßU¾Õt–øàV*,_Ф~…€¡ü_SØEQO‘ÓêaðuÙIAU# –Ò»Ô›tçºÖé<£¸®N{³Í[›˜7Å–¡D,"TED°’”GÞ îœù©Å{Û™jÌc«\ŽuqÔñ‰ÏÊ­A¹ô’NÌ¥uJèRsýâ¨@àš>ž¥ÔŽ%*û±ŒbIeFe$" TÙÜLéM“c#aÁ\ÕŠSÐèØÙ6zUÃ]*äG«ËÔØðhvÁ쇻 Χ»ÒdŽ3"î‘äóšV+á&¥Z¶Ú»ãÏ÷ àë<ìw“DDw4=Í„`ƒÓ˜{£ÅMX’e.-{Ni†Û[ŒGª×vÜ $¦IÜè¯Fg pt$Â* ‚H0ÁÁügÓ“9´ÖøÓ1¶Ó'ªÖU]œÝUZ“˜@Û" …˜Ó Ë!H¼13S’|"$‰ǃÑ;[z‡aÁî^-ðz¡î@ça/—™å9˜tÔÙ™1Íò·L˜Ç8“]¢z'‰‰¦•Ñ=š3Ée{Fò@$àî~’MÄæn7xI$6y§ÂCÓkøø.ß»0¢š “,Ã,˜‘§4Ú%ÒwÅBö0ðˆwz÷B9$Nâtxs/™Ï’N‡3G‹d€‘Š'‘óL86{¦–ÛîÂO¯‘ÖA¢sNe,²OÝk±¢{9UÒ~Ïs¨“èTýÄìÓÕÃøðŸ´g$¦?7y*s0ø’?£©I¤M‘`©‰8ýï‚4‡Ä{'9Ô¤XŠ~õDÙS ~NRa9A:¡ÁcÝIIÕø¢J»r>°Jõ>îÇA±d¬ŠqŽ–‰ü uƒÆµib*ši*2j)3çWM9pÄ`b˜J0$3“XZœ•æ«•ÝÛÚí¹³H[^î-é2B¥†d§lA5€+ LTÉ'ÐsŸ‰¤Ô–• ’m!I(–@ä…?HæDÄr)²I?ƒ"R>_+ æÇ¢Ççaßã‹ÆCØq2[‘´î ihÖ¦¬ÒZè °£¡ Ä4$5É$Gƒù½de˜À§SRüIG!EBkómtÖàU]$Œ)ébÒ&%¡9ƒaá@ VŒ) F’„/†ƒâúhš|R9¡ýŠŸ¹R¨Ý1‰’ªI’H§ö6ž**s‡™ÜþÒH@× w ¨âpY£,Ù£C¸Â–Óf4±”óÅžY¥ÔÖš¸’tGR–X> Ôê`ÉñG3µR…QHQ¬m±i³­6±©%HX€•@™R8!ñ"Àúž²pbŽrlë$îž&¾'À!ÅdCaØþDzhÂ3ð.†Š–)¿à™H>.üÕ­ß:Öîêé4«)e„™•’·å\&ꆊ•ERTKV¦ÆmSW©[÷å®f ‹.îQM•DRšP„&ÁfÊQ±Q‚"6MEBF¢‰¤´hJh‰`˜R "¥¾ßÓï_n¹²`Ý×åÅ„ÜÜ´•SD%H®ë°‰"%$ÒˆRÔš’ùº]mÔ•,Ú"Ê߇]_y’îèØÝ×,bØÆ#\«…D Ùšîälj!—ƸŒgÅÅå¹2Å\ºkci4!2ŒHÅFMy‹‘I’¢·) v¾f¹š•zmØ–™Tj)SiM—® IT H„†XfY†v]]¦o6×e©¤©ª–”ÅUTML`ª QU2˜ÚÉ-ƒþƒØ†0p_d<Ì=Î¥æaŒa5DP¤ ½úÝo^sÕ<ûߟԕø»ês%¢–™&´Ã”&©€?Oöñ47BÉ9HÓv•XpXÔ5ŠXÊPCp±)í¼U #C iD—L’CP¦ŠE¨»‚M¢A¥6h8T<‰îb¼ HšÔÚWÎ ‰Àˆÿ`èèÁ¦Â¦P±2°•ø&ÒCQÍ%aÁîlo ‘ÁÙ2$šˆâtY[¦‡oy85#š”ÞD£ýHß„ñNIiÈ䤔üqìµC©ÈäTìêÓ”›$ïbšwu“¬N è‰Õ!z‰îFà¥ØûúzÔÕDUÛàEQNßý^ úIã&;p²'r°÷2HŒ“ ù§´QõrÂ& ŠSI))¬b ²Ù))*²³&¤Òi!%I’jX˜¤¤ÀÉ)¥d¶6“–™"+2L–D“«™±ŒPHIذhªKi)²‚رŠ5%±FÚŠ6³ E#ch¨M‰,c±Ø5 ªe¶–k4­E”ÚѲI¬e-dµšÉ”ÔRm½+[Ëuf[Œc!üO÷6HàJ…JŠ©´&’ Y¶KE´@0̢Ȓ"Â@0q‹ú%I'#Ù„zluut’>æúWY Œ~¡ø?AÒ¯&‚'È4/Ì…6r:AчsôM0áàzû—¾-n‡J¾†Aâæzšž‰Ñ§—xíds(Õ9vœÔ©÷ÛK™Œë1«Å¹a¬Œ£á Ž(# `®‹q£x;t†F8?.76~㎢r¼wÀ31t½VÏÊ¢Iè²$„ƒü$™€‘l‰ ”H ú¤²0*Gs0)’!îïïåòöé¥ñÎ>>â|oZ²ÌØ÷Sðû²IKnŸ7º«Ý|¬–|FƒI„cŽJ¿"J±pžùr“„|ücÁÊp„E¼ÊyyÁшÝ&s¶•[¶0u'âŸGÑSDŽ’M›4aà=ÏDÅL,Ù‡¹R´cѳfÈbØ6!ƒ´@õH¡_):„d*|¢¡ˆ”G÷( 2 ÞM‰O¡Khƒa?p@Ò1üI"„ޝ2ž‘ ‘è"+ÀªÂ âQP–%""ž²É!Ûcüáü ¯tG‘¶é³$Å–X±»ýH›ù­aÎC’T+úŸE4lȲCùÇ:^Ç3s‰!±ù‘§óDù§göðÜ«QR••Mù±¦1‡scIØÛøÉ!ù¿7ú; ìYÉ?Ф*RÊJ@þ‘£§4üCèþÉþ‡õIÍØ­ž­£²ª½Ÿ¹ÿóA_?òåÖÛæø³ã–IƒŽ*Ûâ¦ÙeÄ÷¿êïžìã÷n˜Ž·‹ofé娿7÷Þy1X`è1˜»¾Ç¤5S Ên5ÏRø¨È·’DÌ™PÛgÂ+ªaôð^!o87l± 5áž)µÆ1S1RM¹m¨’ØjƒÀ«¤XÔ­D;SŒp§Ä­!hÎ-)“ >åÆ ³ .ˆ(8 ”|TðŠS)a¶ŒP)$a…h µÃ'ðË0Î1GAËpš µB°>dž12gðL ñÅœ#h>c ? |/Šê$ž4ø»Z|Q¡ Ã#'œ¸Èa&Ë"x{è–lvXDx†þƒ!xZÁþÁ·àÑz’ ´åOr>‡ì7qãŒÎºHá,e[ z£Àëg¸ayFTÓ«qª;fAãœÝ”ȇÅfÍ“gœ>JÕÓI¤Ý1s¯i›ÓïsZÇôkÂ}'„Ýëzb Ÿ­—µù EWÛ¸¯À²!|"³}=øayd£–-’CêJ(ú¿dÎ4¦J£áã±…Á‡Á`9(³OL¸„É$Ü¡¤‘ÎFá‡â}Kç£Ü§¡dˆ÷Qò‰³„`Ói:u·ò‘ÊG%87É>gë$ØÝùWâp?âI<ÍI''¤ŸC»Ê"H‘PŸ2'âs‡ØÄ’Ä‚|£gäøŸTØýRqü!·”{¡¤éô¡,RÅ’'ï*•RŸ$ý_›°Æt>ãÈúpšN°Áù&äÇâT›¬ 1dŠþRD OÌï½µ\h'êYöG‰†Òj$üϬŽòoMdÜšIà(TQ¨R”xQÔãgCT± ¤#¹¤:ª ýà.Ÿ¶cìo$n|ŠŠŽMCØ€Iõõúñq'Å'ÍBIVÊß[fXd“c a5lð81¨ù˜}NÈw£ù·‘áQ-’ :Y Q$…–$ ,Š90 HE)A( ©±F¶ŠÖŠÖ5cj5­ (DHHÈ(1D"EAòÕ‘’á£ô   .•$JrÜØØØÆ˜TidÁ+ªbjÔ¥2”ŸOÒü¿q®’nL ผšÈ2òÃZƯkÓÓ Á_Þ«¹ºSQâC ,‹"H²6˜˜ØÒ¸ªé,±OÕàü³,ÌœÜÎI$hµÂºÐ“ôb^â_F1¿Íp‰PkQ¹Éë"ÂEÚ(»«óaxý Ó¤ä ýƒç;1®‚ e¸j%2¬º‘f˜‹™ µŒRØÆÖKš0ˆ(Èò\úæt+Æ\<€¤z`±¾MìУœµ¨s"«4™,b,e”ªËP¨h,˜iš1eh¬©Mj~çù6t“M‹ªØ`îšyy}kŠùy·ßmëføÜ©æÉˆ’DŽçè‹ÜÙ¦Z£ŠÊ¦Ç³Ñ98U Í©æyYٜژƞƓq9¦åw}:´ØáLL~ ¨{ŽôðAS_5ÁÜܧf"˜²Ùgè³T¶U…¨Abü¥Ø’ÜÅuQlE…5u7KS)Zm*`†¢e„˜6'a¤{ºDÑ2B`B„”©°ì9%q bSJ’vpwb«»G7É0Cqú‘³tI"Fî–ðÉ“DÕ)ôG<‹¹á%8CuESXxœÀp:Nçò;^¾7¦¼ +6ÚÉŠUm˜£ ¶ÊÉ…ž“­ëשLê÷'Ðøb,8¸JMSÑËáóW&w¤_#à ¶Ækóˆc‰ø9wœwO ˆY$æ’RlÔ¦Õ’ªûþ9“(ìÐó CDƃ½¸Ë´‘¹!»M=Œá¤ÄY)L“›ç9ª"•#‘ÅKàr+ºè–Cw‚˜»´É4i’d ,“sÓø-e-&ÆÁ[Ñ6ºÚ¸˜Üä† :>*ªÿ18x§RN‡€ìuR» TS§a pÅ0ªÆUÂn£âRNŽqábѨSvDÈsN‡š¤}¤n›Í8n†9·b±¹‰o±£ªL<˜ÎÌdðYO´› º×‹ú¦ŒI̳tÄT4'*Á1*˜Š¢ž¤ðO7²ªËá'¼;šHt'&+Ɉ†;›-7a£cá»ÛœC‹:Ù)“íjÞ'Êwh¸mHÀX)Eæ)#Aˆ,‰2ÂDJa< .‚*™)›“R¦µf¥‰u&dBk “×1CRa“¹“Z޲d NãdÌVÂu˜¹+•zîÚé¼¼ç—9“hÞ]•ŸiÂhÔ§eÄd¦È+Y‚gyz°^t­&ÖôÚéYšëÙ!™Œ±W `dW$YLüZ½óÐ5õ{Þå}×EuM×]0sÍèÕW+G˜út¼¼Ü"Õæ±m¹µwÈèî½óiBju.ÉÔÒ>›0é˜fä;¸Ü“¯7)ßn»|–‹3²-rÅeQ,èq×DTS!Ž cÜ¥ ‰=8¼’4m©pXC"ãÔ»e™³)e+¦ü&é¢ôƒV$ï 7(ˆA Â •4‘2ºÈ2%Æ…1”ç6AAÎPB N…ªH ’f¬!¨å†¬†ˆR7¥¨7Z»HI]Ó®¥Ô²_-’I!d©™J®š¹wvˆÛ–’«¦’¨¼±‹©¬¥ŠìÖäÒFsÝïW–æÝëµíîºkbÕ’ .#Ð Ú¡¢; ¨à¨2Â`Õä¥ED]«°va˜}Na.¼¤Ô†LF¬Œ¯ÀÇnù—w«Œ¶Ú¼Ç ¸T{’7 Côî›ôÜ¿ Aˆh¢J+!ˆ1B Â3©`¡ð[×Ô亚cGUà€p’!˜aF¤š¶TÑ© Y2BÀPp hŽä™”‰†‹0 Ь*BJ°K²“%ª•jdM&Ð¥¦š×ÚíZêU!ÂJV`î2¾dHl(‚6#¸†Qâ".¸u5’ªXÕcJ„ô‘Ãäz´ªà²M„A§¬D¬"‘( ,4Hk3‚,Z(Ð-»Pš$Ô©GԄ䛘$Ú$¦FŒ,Ȇ1U4d4`ZÃCjÔjD?ÒŽ…Øp¦‰¢i‚š!7˜¼åcLÖÝë]zÉeòJù1UR´Ù’ni&ï…y7¶Ï6¬»*n0×zˆÁèj,GŽ>kS–SdäÄ™‘„Ø£×æðtgÚhØ¿2å^5bI!’âÈ€w0<âƒÊÌÅÈr ¨”}ôb ¬¨ÚwrÑjh¶Òm·MdÕlj¦¤TU£!B³ ÞµšUÂTf´F‰SR%"ÕC J)ƒ"z(tk 5¢— 5†æŒòL€ËmT‹R¬[VlF¨#YJMU^;¶FQFµº[\ÛMTŠE‰ H,#"t#D§Å¤ÚIaZ: š*9I´G$FÉáŒ*n „ð²E¢P‘Jm·\÷µÎo+Òõ×m©Ø¤ƒ¢¹1‰ŠI¹Ô$z"dN¡Ò˶Œw68kiˆU„fU;Ùo¥[1ð{BA'÷T$Ipì¢z:Qt„VVtCQSBRÊÉ,ƒ<¶ )†PW½uw®½ 6VÄîùrSŽ…I ›7:Ç vh†6˜QLI£Ke68(Ø›4•)xa´…,‰±¦¤?Ÿî‰?‹ìy°p*!ÔÈøÅYUC±¨ < Ý 6*G ɶ‹GÀÚDÉìÁ“I\Ö–•ÁÍÃHçrÜÅciâÙ»FZ4œª6‹Eº19ƒ húµÆ¶h'nöm Q”ú‚İ»êªÄ*«‘M”ªÚI±MÇ%U|`Ò ¶%Y¨näìÀÝɺ•*O ‡ `ÞÉ:µ¥[VªÑÙ‚*¥X™1LRJ¦ òi±#àk«u(ÑŽ˜4Ò²G2%Å•ÌÍ.ur13n°äR¢•SÆCý¤$~DÒHúrs‘Sõ''ͯÁi_É<x 7?’G7¯âO/¯ò ~H’DÉ6’¿ÑÔtýª*©“øÙ$T°*ÑjL16lTͶÍ*û·MäÑ’QÊòèŸîŸòzÃÉ9Ä2Èièœö'¤=›§î"~ °3‚JH L±þ‚÷°“-†ÅƒÍWÂy‡Ü${üÏêž'þç‚x#Æ:ðy£“ÇÃ2åJÈrY‹¹£¢w’#ìo?=ßš™Œc!$ˆNF) Wúöö?$òÜ´úª=ŸîX|WØù'¯G2rDäN©ØÜúè´º0¤Y(ø_DE*H´À) Aˆ¦‘T_«'Ôv>iÔr÷v$ŸÚIrŸqOn’>©’*%AÞŒHO³”ÁpXÖªA¿¨h`Þ´JõÃ?¶0nÄjÚ 2l¹VËD(¤fa0$ †Â[e³–évcP¥  Òn6pÈ`Kd¥*ª)6RÂ6L“CRI–I7jŠ?5Noî÷L«'C‘N¥F%2bb'4X‘Èž.ú=ã{$vWaªÍdJSFÍ&²Ëd›©²~‡О 莌xvZÝñnæßÎ ÒÕMD&ÉãÕÉÑãŽla,%,ˆTnMމÕQBw)ëK`û,>†߭¹ c"StÁKððYSE ‹ 0l†…¤ÑJƒ Wþ88½Cí&MC¡Ø–Fz—¢TÏGsäOQÔ$m#Ôô“à{<ӆޢA>ÊHŸ#àáõ¨ZFÐDæl6Æ?3ÅÜCÔln=Œ4åÕàNð’NÉ#rl‹'¡ìŽÉøÏ³àÉXô>»=™ÊŸ&¿6óƒÁ­î8W²¯ÉTSÐ!Pe•ý `DÔÒM*“Ó+ ,BDh!2²“+%“Q¦Œi13H¦$±¥ jLÀŒ`‚„i1º&ƒ4ÁŒ#M¥%’lS52£Ê¦Rh–[,6)¤¨¢É¤Pb ª"™Üí\ÐfŠL²L¤ÀË2PÊMË•u×UIfÔÕ-,[[-ZŠ-µ¢©1™Y¡†–FU—@aˆa$`¿%t†à¡Øö £'!ù4 ©²".•ˆâp#1°‰Nó …/Ï¢CäòI$h jr0hyŸgº=Þ’Y*iºi°y¾Ì!ò0ñ­µ¯,½¶Ù³ƒgFÊÙÇ ãfȬ#[|ôÓS i<Ó 'z¹Hz¼‰Ù»¤ =£¹FÆÆ[‘ÀMß‹ ž:¶èêm"‰d¥ ,&íŠÒ6lã}‘&h©2zî×I5ìL[·p¾N¾»uÄÓ ‘ Ü¦Éjw neµUTþå99­YÌýç‡D‘H«*É$t1N¿S8RRhÉ60kDjÛ™FédÚ4“ƒÄܞĒG¡Ö$ê¥)>çâ>² l¤Ÿd>£è~ õÍõòÕõ{½Ï]ä ›‹LqMTٶȦÅcL‹!‚ÖÿF…’¥AˆWàÄðiA6JÈá0%RE(¨ÈåȦ‘‘„•¨úеUeGFÁµ4–*TB¶>²2Dß‹hp6.)¦R„‰¡‰€8h …#n T¡H·&¸<ÐG×ëó’T¶¤*=ÛAñ8I' Ss²$€z”Uw‘|•$CÌ#ÐaØ'©‰ý7/ÍWH„>î¢AÁ02é.ÄpZþ¸mU[ ü a ¯²¸£¢D‡¹ÆyF}HNÁÓ¬úÓfJGãtëƒ&$y†‘8ƒJ•Ç –—&鹓LYÌÂÈA4;#ƒ±„;yè¨õ Ñz§Pþ‘^À¯’$‘#¸#¡Î¥£™³÷÷>„ƒš|‹âYyv2C,N­’O>y|î¿Jü­õûG+ðQçà ¢NxTºTPJõZ”‰‹’-©1«šT­Y•º†ï5VÏÀÒMÉ-‘5’T'uÙMÕ–eÔMbfbD­’µÂXDFDd2g.’8g9ÝÒë•ÕÃtí×\줮cºé;ŽÜ±xk½ÕÍ—÷ºöiÎÛ›£ºÑ¹±®Z•V×J$tçRY"ÑÅ¡ŠèÇ=ïÁ»†›¸nÝÅL“‚¢X9Õ²0OéôÛcŽqè¨ ­XS“a»wwuÝl!I5>Ê•éXh À¤²::@ÝCeô84o â©ÀÔa,,hIˆ†‹‡EŒ4§ì+Õ –νxnl˜;%N‚iò;XVVMˆç"ާ2wÞÚ¯ÞÎ̬˜VÞ§‰çbH÷®o62Û.³£4Í1³·M¥ÐÔº¹J̇Rí²Õb˜dL¯ÍQ?eƒa¾ý`Ë$ÓW+²=wPgºvnèäùܺi6³IÆw½N.IOWr g]aÁ¬ÜJ†ˆ7R„èMXi†1qaÔïK•†åbW²Ï;´!´]mõ^ëmF5’‹£ZûJúËÙos¹njâ•êkLŠÌ’æ1SÈFŒ2j,¢ÃX‚–¬¡¥!ÄQ‹ H±¨I*% ˜‚¼…ä=ƒÓIÄ–A4ôfv`UD=$¬:1²h;FšÉÎrD’$q0*7Ÿð@$¢@àò;[pég6¦±£fÆÁÂX"WX9ãÑÅ „2%ŒßW¦ÉõT‡¡ÈÜð'žÜk(œ-¥‹L¥)Ußbîî¸O<ùÎÑ¡”€´ml¤%vÝwe„3„÷]][[.Ú6Ô¹2ªlÂL=S÷œÅ9©Æ‚H<½¦*šB©:/¶Êt ´X=Î{ÙÖÌÆØ]dÃõñZû•<¼ïarraÁ<<–f3‹*•g’Èx+LcƒÆGwö”n’x·0¬‰ÕÃxýÍžMŒÙâ½ ô$*z&Ef B… ±à>¡èiôläªÃMÓÀœÛ±Raa=zžfމM/‹ágRã•Õ}5åBÿ€_’¹¡¸9bni'Ñ\;H˜‚@õ”ꉮ€øë=X’ÝZÐ'ƒ„‰YFT”Û§çϧûÛùefu.º[§“ n´É¢™ ¶ßE/”¡”m±¸mЩ )RZÔÞlÆ7šYÈÒ%#GQ6’{˜DѺI»CÔ‘SÎ+uUÕ$«+Äð)¹£aPçÒHŠAäS¨6‡UV X‚Ôµ$)bY!ØÜh³½–È„aˆ`û‚Ñ&ì5…S9‰•̉ӄÐÁ:1 ÄQ ‡ *§UUM6j¢ÆÖE²ÃC™uŒÉIº“s“*]ÑSÑ9HjÝÙ‹²)ÊV‹4’›60ÑG…¶:§#NÙ&,ÊU5Ò UT’TÂh²6)¤¾¥1¦)YÃȧ¡³QM˜`ÝÜM‰:ìiÉ+¯“¯„ÞÄDZ†%%JL–/:suܹ”ÆçY¹¢ìHKïvì¼»_7ËÒ™ å¨uSx1£6VŒGU1› ¢¦‹V¥dhº#U;­uc7X^©ç¢¥nVåLom*¹}¢ƒtë#s„Ò&Æ™'3̧‹Ãû󻹌_&šsë¶yVZœ³#aª tj‘ɘY%„ˆ„Àƒu•œ7x1ÉT†pn³YkUZdi‘¦•©5È€I¤dIIþìÙ'“±‡3Õ:ž-Ó¢F’§ª;‡3ây{#c‡g-Á£©4Hc“´ä‡—=ŽRLM¹Hìävu†7‰7€ßжWSn‡A£g.Ä xÉ:·Jê@äÃ&4©æ^ò°³%Lªªª¨­ÕŒ^"BMÓ²lÑ´hû{+ $W¹Úb~KdñTƒ³d<*ð?GUV¤"70Æ: IX›ãER¶)Óœ†Í+š«ø_¹§á9œÎcg1ÌÔœIŒÐÝ7T¦sqÖ&ö,¨nRNIK#´IVU96M'${HA1áQ»Üõ+ÑÊQ $ÿ$I"E8µJìÆ3K0ÈEZ£±ÝÙÛe­4Óà²~Cšr9 ““ÅÓyll‘ÊOkmºOôKm}Yä–”XLL&2˜ JM„)D”–LÉR ¡4”ÆcbQŒÈl%‘RÒV–š²mªbÑÅ6È’J2DBJ 0¤‹ý“ƒeM$ BÈö˜©òFWó0›¦(É$(M´OÔPý• ß¹ü$ȃu?Õ8Fé’1 ù*`àúRÐQT2'˜Ž£K¨RC %MÏ©×û›HáÁ$˜Jæè§3d§ü<Ó”êèqÿÄnS±îþÑ!ÉæˆåÊÝHÀ[ÉJC©àÞLŸ(’Ê&A_ÚœC‘ñCÕŽ†›¾’ÙUe[Oõ’=GcÀ)Õ_lžªž3KTÉåv"WÈáͨIñ>àÿ½?€p*È*ŸÝ"´À©)RIK#æÙ1î{Ÿá)Tö,N‰7>èa»Ä9Õ•d_ø0û©¢"?Š$‘"˜lŠdüL|cú!#döóí’–©¢”ÞY‘3ÆÓab$¥X± ¥ñ'7™õ<'sæt‘'0¨üоzþ$ŒŸÉÚP€CùDTSùmT@ª©õ +ü&ǺÑP‰±K ý0Æ1…‘O¶Ic5¯¶´“k[7´ØÁÀp{ENE†Ãy%‘:úY÷²Øû‡âíVdGA¶[²~ÔxÁ+°áÂ¥QþRG“xêY´NÏY<ÝÞoORr)­ ÿ¯“ýSH{¤H›±Tª"?`ØŠ¢Ÿ²ž ?6òAûÊüÛ#™9–Hõéo¾XE·K†æãºîºÎº‚BvHÂ1(̳ W÷HéV.† ÂÉK˜ÕK(¦&Had*G4JšÕ‚æ„ÕžwaŠ‹­cIUUFíT•¨ÃIM1E8“ ‡ÚÃF™•º]¾]mÑ6UûK|Ì“dþäM¢giØâ#6‘É$’<¢ (ª)ÿùŠ É2šÉö1L0')óýãရÿÿÿÿƒÿÿÿÐ$  @¼ñ"ŠPPR… 4ª–Ú(T„RSwpŠ$8€È0FÙ³QCYPÒ š€¡6) ÚÀPPÖËŸ=åB©R) Q% Q(TP‘ ¡AUE%@U(¥!Yð_4€,¯¹n¾/œµª¹aŽàÊRE{e\²õF Uw±Ð­­5lÃ[aí»Mµï¾=zßn½%‡CÕ <>À:úÌ€P®Á¢J  ÅFH¥Gzݵîóæô=2Ô”(š·ÝOyè Ù­÷wZêRUP•@Ió‹Ç¹ßg_Cݵ݃¶>v^Æ—^÷¸§»Úézôã³§Z×g*—/^ç Jõîvï{¹g»g§YÛ¦›k´w„)^ov(¥ª¢ªª¢¨JB“×»"H[h¢\ÇsR…¤¥¢í¾Ùz$ª½˜¨H!AP@ï–t4Ò´Ù™­£ER*¥$+ØmŽìk£§»tõ®A”‹Ø U(U%G­ÛÛ¹^A@tvÚ»5ÓeÜd õÉݳ6€÷¬ÚËÙ’‰P(¤(Øîî݃^Ž÷rIdµféÞnÞ½îtTª÷|( hjëHZÕŠjÆÚa´†•lPÊ•R¥¦µ­2–Y…hØU¦«LÛ¶m¦7Ðr¸`ш6ÒÛ»+hMÜáQÛR…‘‘Rvä«­`´m¶È»s¨ï>ñÂysÕ$iNÔÙ‚“æÐDa±€”ˆª˜SMTø>¸tÞ®Ì"‘U]ÛxvûE w©,†>–ðO’öÎiäiöÞ ª¼ú¥¢’¬ûì>•wgUDW;:­É-ï¥S>'Â×<‰J*¯½¯oD·ƒ{sR’J¯m]žv%Ūà>Ф¨øÕÞð=ñÝŽgkO©(Š©Èné9²ÍîÔæl°>DY õ÷Øõ* ðß{ƒ@kíÐ6²ÙaîÕ.–1šÚª"Vô¼ ðd'Lè V næŠ(\¾}J·¥‡ ¨‚—}í+Þn z|$ìÉf-¤Š£*ä4b±«¶m Ú*'-…[›îi8ÓhEEP°ÆrRk¡³Jwre:Ý\œ-Rœ¨cf;`RÛ*Öª*+®vŠ4dVêVÊ, ²¥®°×[¢Žµ;du±FËfN†ìÚ´3*€DŠ*¢UB‚ÖT1j*¹jâ‰n¹ê&†cT)(HªŒÙbP¤nÝTT»4ÈÔTç»w®#º†KireÌÖ¶ã¶î¡ÓD¥ÌÔ©»»)—¦åTñw@„;:œeK*ÐîÔšH¥AR(Š–Æ¨eUD\Ø4jÅ×NÃJˆ 50A‚H@˜Lš&¦T~£ÔyECÊ@ 4É5=@Q""š4˜Diå4ôÔРz@%=DB)¦™SÒOÊŸ¢›S† Ða0@2“Õ%"§”ÐLQ¥=C!é @ RAh!1ÓS&SÊŸ‰TüIé#Êz5 THˆ „É‘OF„À&&¦§©êhIÿŽúüu°Ÿô×ü¾û}vî ª‹H_oݯÆDÞA5ñ(„Kî(’ ‚æ= O A§þ¿ú_ø-mÚÿ¿ãÿ¾æßý35¿?øÝ3ˆ!ÍÿòÿæœãŒ!ð8é?û«Ï P.°‘ŸT\Ôx¡¾tÿäêz$_ÄnWïgÞoà¾rž`ùg>Üy*!>~vYÔ'†;+,´}Oƒ’Ϥýÿ~¾ÒŽô{ÖlïämÞƒi˜,ÊS(eW+ާ!ÕðæâQúê 6¥L¤jBpWpé‘¥sZÓˆøµÇƒN>•2…DAã³³ýkw¢­r‹§Gƒ %î@V(K?•”¡â-Û¡UAÇ(ԄƉ,ÀêÁËó=~–yïgÓìÖÀ‹Çaž½îDë‚%Ñ> ‹‚ –øŒA ¬ÌP¡+…Nk-'¯Ï%Ñ)S±®n&HB¢šô«B1H°€á-áa‚r²ÎQÕU÷Ò:D’tCšD³€¤8ÊH¦sŒHÇ€ÄtxöØ~&É- ™æs[:% æRÍ=zWÂH}#“Î%2¸7ã®´¶G>_;:™ÓOÚpj~ eÎõ¿LÞ9H2È ’ JTó(ÙêW³•£dœ\[d? *€åäåqã£ËGÉ:rx;œ~î,ø½ñci.’žð¦2gÛDÛ@ä::Ùb†U‚NÓ >¢jW)éhƒD(³Á‘ñÑÀIïæT3Çã3Q‰J+rvÎV¸ÌK&QA%Ù²Ö‹J˜hÊ¡ïEƒ’ˆ)J('(3L33 ×-Üff´¢ó”}K%êR ß ÚÄYyóùÞ³„žï¹qE'6A‚.Éæ¯,ô]A„D@Ìå[ЃáÆj©S)µ•¢Ï:o«€ÙÑY @[ÎŽúžÏšùd'£Jï‡W|(˜@îâæÈ$I“îÁê7Eí Ûðõç‚v~9Òµ´t½f·IÅʇ–vL¯†c [ „dƒ±TV3ʧdL4X"Æ(h©t;ـᘠȰ”D‘ÒÉ‘AÀÔå5].ýSãO~l÷¼_²á´g¹¼^HÉ3U ®µºG˜L,*ÌÙ‘CpðL¤Žšþ"‚ÒCBÜB„æTIªµšT[Ltšúy‡Gk×Tšh—l§:ä’oWs©Ô˜1v´ñĆB'%[ã„,ììÅ1l—HÍ}]æž}q¿;¾=xèPç ŒMº1/c*˜ !IV ÂB V“A5ÆŸV$þjØŠ(8LŸIl†ùÓ5Ê|ý{ÝÓâ‡Æ]Ôï½^¹Û¯$æÛÇ”·\çϤεÛ\ï“™Tâ“*„©dPNÉH[4«@Çž´ºhanºéÜšuÝwpú=¦˜”`ˆ°aÈŒt¥šõËwŽ”…ˆÀãÅçrÈWã{uƒ ¾…x-ç–H}S³ìîÎÉ…˜ËkòùO—5^|z°=§~â’ozvUßwÁ×:ΧstÚnéKf#ÄŠìÇ!ÈHO´Õ^ü÷î wÔ$ŸÛ]xºîÍÙXb_quùN1éÝ<ÓÒxu â+ë=82w¬èÃOÛ§ÆTæYC™E-•Æ 8àpáHÀB¸i®N®Ê@FmmâHy§`N]òÂÝ>eXM")ñÀØAתJ¾“6ɉ;:›âF¼§Ü: M\„êá-¾7Ô{ƒ•rMõ÷Ãrvq Ê”U$.XK£º\CÄa Bnîï[Ö†ñžD’I0<—̬œæó(ï/–ÛuÔRÍòîÏÖ’é$_>-ÙÏK»º[iS¯]ÝFα¢Èø¾žs†íÄR‘ï—]˜ÆíÍÝ—l¼çÍÔðdµ–ÆÿT"aXÉ&D&ï8 „iqefUH’Wñ߇y‘¼kàèÉÜ ™Ñ " …VVNã/ÂÑJ(Mq×ÏN”Ò2®i†HX‚¸C¥:ºk(HÞ•Ø¢¨Ê•±µ^­çWŽs~9ðåm™ç¸‡!0DÏ—¶x“Hœf¼º•>jø³Y®œë˜È=õѧƒ1»m¿*|§ÅÉ,.%›ê¼Îhi»N¼LD¼9ËM|A>Z|2èTã2‘HÙa GÜ0šA30̬ÌËXb„¦¢ÃŒfû¤wwg.òÄJhÀkU–›ušYX © ˆÐˆUW5 ®§]!™!%Ã^D¸’•™š]¤K& kÓI–¤d¹†wwdrÆŒ)¦ÒCKÔw ã7§v«FÉF4Nº™Ô@—L%+™ª•¨…ßS’à±F.  ‰A¨¨ ’© ™ ;Ä$K³Çn#,ÁYÂÿÜÆVòÞÒ[„g~vçž¡%ìêËg7“ÏõwÁÙÏ„ŽëË6·¹ÍÛ]Hï†ûïO­ç/ë•Ù™î]@c(d"Jâ q£v à E¦í°ºÛ²MïÄêzíå7œâ¹×¶Kz>$îéÎŽµõ~SÇâ<ššèιK-*Fˆ&Ë–eKE È ’Êû|wãù±ý%(ý+_¯‘Œ£Ú4ñ–þ oÖßn2tpitЧõ+f#€r7K½÷y½±²È3ú¤á =WSA¶ " È ªªœ`0§ÓÁ')*cq$1$‘•íGé½/sìg¡ÙM„¡L¸b àh„ Æ$® c,qÌ ¤RÁÑðN â »G†á'lÁ8öë¡W.³×m ©IÑûéx|wi»xñ;çTzu¼lNT6¡D’QªT-½$‡½\·.TŒõ.„­ª%M $œ;’˜p¿‹ƒ#3 ‚%"‰~'9¹foæMð¢/œ‹ÉC2òÚçäÓ¥m¤©l˜LP‡•Xt$èd˜y®$Ú%ÈW¤ˆŒ…ÚBáˆh–!*˜*Hë¤QŽ”~í‘›HØ*˜4U-”¨ŠU°¼]çÈŠé(FªŸ çE §Ó´F½r›_¼~r•«c ¶µ0½0ÏȰñÈU'œõwÌ»o­ë¨ì„;-”èJùßN¯\’dH¥Ù€ã²‹i@‘x“ZU+¹åƬPvLè8.LÊC‚1 1Ž:"”Je®ÆõÍãâìè„?ô‰,ÃÞi؃h…^'ý¬›™Ùâ±õ##á‚DT"mƒÜ€÷ho}JìE8ÿU™Ú£l=Ü)êa1a–?N¼@÷‘žqptð«?Øé:US(wäüJFÈI9WÑa”¿æaQí˜Ó!Q¾m—–Xå‘Kˆòݰz$üþ½ÍÙÈ?´)ÉÅ=Z~×”Sáýz¼ü<^½–ãöÈšOÇÇ㮑ø¾Ù¤éÓÂÿ3~ƒ Sý‰u«€ÿQ:˜F? bªóªdðu½Iú”•#ãÛ°wïÆtà¾ñX %ë>ëaúˆ 3þ[#J‘’ 0Oß×ø×({´ëüGò¢<øÁI¡H¹0Q§ŽÃô’šâ§>‡’ý¿÷}ßÅ?Ô}¿ý·õGÌ£¹OîCþaôú¾?§ûø$ÿ¶Þ#îûíþ^{0?‘kùsþØÞd̾ óhAúGñA÷Ñd¿e%ǯןÃ-¢D&ùHcß6üdU#él¿øÊY“õ½þ[–2ab'ã×{ìŸ±Üæ4RøÒÏ¥L†…ÇÖY-%Ö¢ ²m(æóE"|¿‘*Ú&ÑÁfÿ E•ël•f LÞ3%UѷňMRQõ„?åI/ImžêÙÒ•Ñ?¾P†.²˜%1÷ÇÀƒ$~þ £vI ¬íþ;Ge)ý¿Ð Ÿì)Þ¤õK«Z®JN̯íÏÆnÔÍ"»'êYmÚƒ#ÿÁmBZ6µ¦rȃK­6Œ ýñsÉûM³ø3×|½'{­ó3«?{Møœwkâ¹î^IôÎã3¾_½ñÕ`n{ÈYVÿc“JѵOùúþBœ4È„9ÚªêgÊezÍa‘<ªmöêp ²!&u}¬—pUăÝ(•F?Ûü¬·÷NU%Ðüý/Öû?³e¹ +ùõŒ¥0ªŸ…„J§ò?iðþÉ#šÝtä‚}ö—eÉ*i«‹?p¬Ø6å?‚çåÒη;ô<þªaˆDÉy\úÈé´}¾¹ÇÏñ“¯òûŸÆß£Ü ?FRÁ|ÚÔ³ïJ4XBáp¶­„Ú/µäéÏãFä>ÿ?—åòßÝ{óȯ×Ú}Út?Ä; þJÃàCÿ‡ÏêAµ÷Þ¿§ëö°ài"ðܾŸkóí_Á>å%þmŸçÝó_¸Ÿ§o^~¦Júë_Oà|L(ùþ;TýT!ÍÝB,–¿BôçèZíéK~ÿÜ›½?U±ÖL(Hd „lü`’ˆJ|K_EM™#ÅX6‡øÒ¡®†fÁ>†tÑþDä4]•Š(¤$¬lö„®º ;;šúڗÄ!ø²¢þÞgøéûûù}Õcþ‰?Ñ¡æø³î|JªÔ?ã Ë-ðˆŒgqâÒ©GÿD!÷æÕêü¢ßÀŒ (ˆŒf??ˆáõlA"‚`kUõÅ ýµØ?Ô„}gú½ïÛ·|q•oî—ˆ8¬ãf– õ Ùê‰Ç7p7Oáú‡ÇŸÍ’Ò iòÿv¿CÐüÿ?ÀÓ­¯û½ûþïøeü?§ðû´å¿Øßÿ§ù|þ|ÿ]ÿ^|_Áþ<ïâ_öçñüóò,‘"ýŸBúë?¿ú/4_±zOúF1‚Æ6Ls"Où—¯'‰‰T_÷¾»dÇ»Œae‘Ž wáh(<Á&¾ä•Q8ïñéÀÏý’©§Ê“ ã’„Oþ‚?åÐüÍ<‚I#*µn!?Óþ½eªb>îê·*œ¤å‰(QkÌóúÝrúóNCÂM¶Fûc„P²„ ‘³~( ¡š¥’Y;ûe ‰rˆ“”ö¬€‰¾‰Ÿfåà BPê¢Á5‘’ΕA”ë· ‡*dÀ!SŠ®W°ìL'ëäügø›?–6£õÇYü‘DT¦•5n®ˆI‚!I9ê*;¶ Û3?E´îÂ<:7¸‹(&²fIäÝ#7Þ}3 /üÕÖMQ£€…ILöf»züÏÖÃS÷ñ4Fw(µãþßîmíéQÄÙ"‡Æøü·ç­ðÇ6QIP‰Œ‚ŠAù!X¡BÌgÍ#d;To›AƒØÙÛK÷…ûþï÷»çøߟŸ=íúþ¿î¿»_ïÞÌõü~Óý½ý?Ç/ÑþÒáú9¡1yï¬{úÿ_ëý¯õþ¿×úÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝþþóûJûôwù B a|~Kð¯¢O©¨.i}5¢Î²$euAeåÿ.•!ëû[¬ ‰!±ü/þO¾Yø·!  ñËÑ­»Wÿ7ä÷ãXÎIÿw9‘@ÜÜìr,¬ÔÃü±Aˆ#Ÿ—)´„¥gcfT«Ë9Ùqþ˜ï©¶½‡ —%•[%NŸÿµá_´úr甇P®xŒ!² #æÎñ5¯¨§ÀãA€YŽå™ÑÓâä*#Ù©úòK!ÙQ“ö¹?Ú\Ä Y?f­{©Pò{ Vïêø*=Üö÷œ_Í/®¹¢ì`Ëót|OÃÞñv‹JÁ.Ñl*b‚~åé…+îé5mÓœK,T¡niÈŒ˜ÿœÆYðuœº…rK¡?\”P4²1‚[ã…€NAIþ‡&2s ÀÜÎMÕüSÎÎa¶y<3.Û Aá‹ÈßûæÏ³…J!M¿5çœÏÛÿ)QN"œ¨cD32„"ð"ßéR?•ŸçÈ´‚¦|pÿÁaØpÁ•ËÈý̳¯p¬ª«¥¨èTaÆh>*b8F?>#t/ã3ËÓ…L$«7ðw¥pæ ¹JލòwÕ9æ·!ÔŸ!X8³øzŸás¶½˜æÌ&þGøýÁGý‹Þü霨½çCìý_×õóõýuúþÚ×5þ"/âÿ‹CÙ#½û¿ ëõ×å ?mFbBåžÄ$IE!’$‘ÌGø@œ7öR®h¢+ÿŽ×fM•¿²UQäÂ?ÆOå™D½ •‰O!ø¨~W÷ ƒüü]òV~mC]0’å|¡I61•^ í˜F–× „9Ú­ üMí% ^xÔ±ö¢å§=RL›Ô©aS£tfUüßÏSMþ»lãO´ííÔr¹îößÁA],K¯?X9ƒüsJ?±çD5~(¦…÷üûäGÇPph%R1ŠO~¡`†Áûäy‰Ò\‡^´tTú²`‘z£É®®‹ëÔO°¹ñ)ð‰4  ÈðŠXñ‚`å«*pGõýK i0¿Ä¨áÈ;‹0[„!S£;G`ÎÏ[IG*P.?y·£õ6á/1ëx?ÁGb”p§E¶p‡…6ŸÐéfÂ$9UT ÿÑ_P8XHÔ®)‚lšã`Á)dVIWzÃø¬=iˆDÖV´}†E?:®>#¾äÌb© á—Çž>nÓ£»Öš§»óMXðÑ¡ü¼Øf28sHdbô Ÿ“-­xß^›èxi’S­ä›§?>¯×ç½<$²’y®M¿¨ì?eM!Itmª©'÷õ:UÒx²ÃiŸC¶.¿J¸r©Å»ṎµwÕ]c •¦ûúz:‚v›Ø!ÃÇðáâ&ÿ¼®ÚWîåÃ|Û}zˆ‘ÁÑIçû.C‡2‘¼…‡ß´öi’EpÆQÄ>k1æUMGÌþ3¼çV½Œ´‡aCël:;•LÜ~Úé¡~a]ž†@E”- …!™Y—S|gb¢f}ÕQLú;ˆµeÃejÏR~óÓ,>üL¿™ÄŸî?/O¿S¤Ôø,²juwJd`•ߟ\G)q±–fr-2¨’¤†Do’ß…¡u†6 ïóøyƒ•ý mÓ+•l(-úFÔ"Š’ŒX«"ªI,îÂ_ê° ö‘{ëiŽ2S¯ÎTO—dЄ£†èh‡qô¡rÔY³¥‚AúBL¢.-8ì6¥0m©S䕎:ñ%_-¹}O'âESIöÕãð$Oûó”uëºXfV5÷þoÎ^¤@šÒý‘ºˆ¥)Û%‹ZOõš—dBYe«H„±€ÄÓ¢:|ŒBãîQOÏÒ[Y[)¥a”?ˆŠÓð R˜Ò|nw×"h[%ÛBËÈG$F™`³íC(t ÒãLߤ`¿—Çw˜·üx§˜ò¿ùN=l0É.]TZ(Úª‰ ÌN\#"<¸ÛÅá J)(ÐÁˆ¡þè²ÔÍQý|îû¨‘Å ¶3 f/ǵ?Ñ£»Ê’$Ï÷!Ý.HRéñn?v• Fƒ fA§eÈ¡MBñèR!B=)¶EÏßšqÕeôfŠm…w~£±€°E8V@ȉ´&£{«’ø/J¨C$;ŽyÞ—º› ô¤˜&xÏnœ¸gé&‹ òÛö]öŠI¬„ÊŽè'ïZÉ|mSZ ¸éŒÉÿÞcZ2/Ãñdri32ПíË|Äþ­ÇY"Êê?†'(ê4]^ -ª´«áþ·”Yªøßßœyîœþ©³ÕÊôÞ´¸ñ빫òãm_"Ö47HWUbê†FázF¾›d1„H["AÀLrQöÈAà_t¥rúÓù~ßÎô2V׿M‰í3mEŒxÉŽ?Ãùß/R!3¥–ù“ð隯õÿàDTû(ˆ¨ð ° ‚ £##*2*5!ˆKd‚Ô„T($ “BOÿo{óúÿ_ßëÎoëøÿ»ü3yþ.¿‡~üuã<ù‡mZf«_Õ§_Ý=R}»¶®¼C?ŸÛºß9á|ÙÓ;Õ%ˆ-é#<Â>žwÆÆ éÞwÓZæ²}.!ödÂ.Ì®¡zótäòÛ4ª=7\{z†sÇ{M%öMqg»zî§U4Ú‹É<†ï¶#­5¸1ëN &HÛn»J*£D­{FDÀÉb³Õ‘Rkn"ó;ºhWM«›¿[ëœëͤÊöÎÛÇÚ™fõÌÃN^žÒ}¾¶j;›ªÜuweôÑ1S©34‡Â³:…H’8t-ÝvÕ«Ï}R76ýæ ˆ0rx¾Õ-?­Zû×ÎèòÍW§6ÙÖV"·^Ü?OPÜ’)6ïrý¶”Ì¢„{c}µîÞ÷±t`‘^Ö9Îçµ­æHª×«Æ=g<µëÛ‰˜€f(³kÄSìßzÔJÝGpG­YöLB’31SËQÜf›Þ`D[uGùÍ!=Üæú­Å?*kµÌ¸ŒƒLðM¯.¼‹çjV<¾krÖkEn8õ¬Î[µ“¨KsÑ ¦Ã%Lùjfî)ž*T™óÚ"¨~IÜ=ëF©hŠÇÞfÍ`£§­ÁkæogWkw ª{ï^¥!½ZÜóÖ¶&®tÔ–œÛA6®êÁQ_Më-$u;åö«Œò-êaÚ¸žïwMÕõõr¥{µfͳTÔÅ*žÈzÜÜmÅUò˜BÇ#£ÖùîóͶØûÆFzã¿;[8†±¾\t,ró/|ì¯R2É0¨úÝÕ®»ÎEë/{ñªkÃñÎßPìV–fÝJ‰é €¼Ï7Z•Ôó±UMÍoR¨èV*íò™ËÞ³^ÛÎÐrë>·|MÐÜ'6¢å¢YµçÌk¾zëÓq8k ï`Æk‹73¦·ÕçÉ^j‘oÉ´ß¶ªð·Øó´eWœ¶ÓÇ(êQã­¶~V{RpW—Óêk•ÍB'n¡2J|ˆÕÁjlùÝVÊÞ8‡[Kóec¹d¨¡’“¯~ïi¼íƇo>×{ÅîÓ½ˆsbUDÜWš–PR¬!i†ÒËŠ#{Æv‚;”z›ñŒÔ=«õWoÀkk¶íÁϼvôQêZ^bº¼#™ŽÔñ5¸ÉêïÝ\œËöhBðøð31,õ6É ¼Ûkœ€[~s”â/µ¶ŽÍE3*»:–ƒ…Mé¡åÓ7®õ³‘Íܽ¹šÖìKÇ:ð¡Nî%!Ït‹QÍk—œ¡Ò7G´ÜÒÁÄn´W<äIGg(­_+ÉäxËÍMë|Å;™!Žvž §w⫞ÔÎËyßw´Ú­ÂCu߯OÓ5î¶ÏZÏ) Ñö#ƒ|뛊¾FL´‹Ó›£¨ÒïZë¥?;YIÔƒUAÍl%^‹B‰"zó{F:‹‰tž wºáæšyΟ2¨v¼Ñ¸‡O{¢„Ûn«\zÜ[ÂGºb6"ý:¦î²‡Â‘™».<'2Ü{]ôƒö4PÁúsz¾ù²»ö·©è˜»º^¯+y\ÍGD{ÛI¨;c˜õ‡0òž¥íïe ó¤»mo®Mj½4"¼z{t¡i§ÚhÓ´ÏoTy‘‘;q{¡s¢4jIÂpË»ìK­×®Ï¾£HÞá:QÜ£Ð/Þõï7•¹}ÜÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÈo/kÕê÷Þ÷½ï{Þ÷½áïQ$’I$’I$’I&§UMè¾zá…¯½×“UÍ'a7Í ï9;öÑæ‰Våk»¿ŸwÝ.ººy^GQß²s[<²ó<{@¤á]9,eY½ñ‘ãhUO²(9NiºµYbµ*r4¾…1Šž²Ô̆ Ì`L” 擄uïô¶ï‚S~ä²:Å™Èvi¬ï‡cG²ñtB«ç¡î·q×ãøM•̧t*!Q+T8TÞ͸E‹¸>ŽEodvdûêï²Ô ýɷâò‘žÀ=”´šŒ¼÷¦ÏF­Ë~oœN”òøÐ@åbSw˜¾UG½bu2E;Úù¢¤VcZ÷½ƒŸ/ Ý ×m3´u‹E1ÓÛí˦y»Ë*½œÉêt$IŽE¯|åN÷ÈãjŒÁT½«Ëe|üæv¢=»HÏwÁÚHN¤h©Ý4šÕïfmiI¦ ,±Ä.{»‹Î²ëƒãR’T¢pÉŒz‹­{¨ñäß×ÔäÎy5Ùª¾÷½ï{Þ÷½ï{Þ÷½ï{ÞwE%§unïh5Ę@¬å÷BJêüdŒÄ¬Î¥ÑvîâÉSÔ­Â-È•·l”gìƒ* fÜÔ¨•V{G—ÃÜÄI" Ž[vœ´<$o+g™Óe¹²Jy®rp\¼·uE|«INÖöýƒÕ/ZÒÁÆ {Z©àñ÷%_«ß`ͯrÓ;kˆwË÷kä¾Êû™˜ï» –åsh›ºÜ¡èåEƒ9ñl1(B!Q3Yᘜ֎wàc%£Síª,qõï>nY—Hýv3<›kw¨Ù¿zèÆZIeLÆôÝwrÏcuÍi;ë¾5˜ŽDiÚûΞKy¢§‹z±’üáìèÙí?o²Ç{­ÝºñÈ˨‡â¬ójêh¾Ó£*,)ïj%í/k¸ç·-”Dövm55roõ1ÛDµË(ee&g{CÁ›–潄 ·¸Ýç0Á9e®#(}INjlvJ„™Ö·wÙGÞÙõyã2×!Mqâµ5Ñ]ŽI:ÞŽ¶û®ØêWe[22ÈûINLhÞ|ò—ÔìÊ®º:ÇËÃDð%Ov­¶,…á)V©©U3æÕ_’šY·RÛ–¾ŽÞfk ×î:—ˆÝCôk{w~ªñwâÚM%Å'|¹êÊ×¼Š=I̧6®·ízZí»r»&ëH¥í¤ß¯tì¼CëîÕK¾Ä¥Ææ×PéÆº+¾§Q—‚@Ìí«tL»8íO5pPg½_#S6‹G°WËC²½F™Øtí§®ïi™uTdÛ=÷o•­»ÂkÝÝfš–Úxì]…#êñn;YŠ©­L‘¢#WGm•d™3]²—º¸ÔÜ'8çroz<˜s:)ÈIí笃eÞ éIû§¸]Žï•»½<‰.p/Lrv}sŽp\9O2{I5KJC—ãòD×/Mq¾.¹iÎŽ ‘Í_¢5ïUYî3Sæ{È[ŠTQQQ !l`Ï*œÂ'•’xb$°Ê´¨|‚>©ÆYa ŽáU<|p0&UP-3î2d¼9 0¸vHŸêÖž=-ù“þÙÿ£óÃ9㿼'4áHiOÄŽeOHº)¸¦/âuöï~aÅŸ>·¥?ÖmÁ°˜ÝRs Iˆ%C”ÿ[4®› M"iöñZyfãÅÃ"ªeÕtQ¿ÖûgHIU_'/b„ݸÒõµÝ$vµw¡(¢¢›ÎÚì‡=Í/ÒµÅ4¼à-:@Z6%:Waz"]”¡g´f~©*ª»¼±úÏØu½l–4Érç]W‚pÐÓ‚êê?¼“§'ªˆvU«øPØúfT ò1ÙëÄGßOúbÊV—íÊ´ùÔÈ*ªÊ$“˜A&b•&Ö–0U1.²Þï3™08ûh†‡ú©ù Šª®èüAŠÔˆ à§ó(,â)à™òuL§ë©‘Àú?08~ç]TwšËÈS“Gh03o%ãsƒÃ”ÓQ:9x6ƒe&ñÁóñò²(–F,qø©IoƒÆf÷=æs4såÑ^æw_µAÙí»ÊYçŸ_<üþ?ÃùxzGü>>¾Iýžà3€ûkØþšeÇËåÏ>&>1IõGUÏÙ+œ*?òè´XÑqýU•3Ëý3eŒ"í¬†)d¦›e‹ J!,²‹¤±A2ñ Žé:Z¡ Ê´¿×gäɵÃç_!Ö“I•8Π<ã8 8  cõôñüö€ÿi ˆñªÏsÿ×”ÞŸã1ÿÇ<ô¶]ô™’i¹’©Ÿñp†<…™ûIÏuýç¦sÎ]1ú|sá/þÇ|tZSûŠN‚çà3so¶“Ä«7,ᾋý+Óm©ãg À±8Ùúi»òÄl¿üõø#Aö úöÊ=¾ï÷þTøÝÖ}ú8ÿƒüÙ÷{éå\õ¶Ü#0åQD˜XÈšO;u|_×pÿS®_ØáßÕ]âkÎ’@D¢îw¿Åùx<ÅW?^íqÎ6ÿìoóÿk®**Š*ˆ£°RHЍ¨ç!é–Õ?·Ý{ëÞ”îBýoõ}‹ë™_öøÿŽûu½þ>0êm×§•Ј*"š‡B|îh ‰;ñù»þÏóŸÇa߉U²/†?³EQB$x˜„CgÓ˜÷tþ=Ä¢0QMH2?§è-7«S¦1‹"€À‹ðú÷Nî¡}w½ÄwðùÆ}¹“¾½ä„˜îéH »¸™ë„„!'9娯hG»rDƒÉîæ»p™`.[‡w/èÿƒñóäwº@Û÷™/woåf'núÒf²iöùú¿ñÇ^Ÿ>6oŸïŸ?×}÷ Š}¯3¢mt}¶Gæ#ß²lƒ¥O†´ „s¾*ùzo×¶êñãÔÐŒ‰i¦’iÿ]¦¤n¡ÛáéÄmI<ægÓ~rt$$HcD@Ä1“H 1:bH,"„ÄÀŘ1@™)0§öâÁû~Îw÷ãçsÐøÿYóܯЃáíåù{ñöåL"X©‰?EÁpñ?iÑ¡ûiõSðëñ !Ô:O({úE»¿õ£œE Ü)û_çðTÅ\UÄçÁxsp+ò);çÍéÕ?=Tµ9Ù§£¯Ÿ,þ·¥"÷—’JîÞ™þZ£iãô²Úöׯ¾û'›}žü‡—ÃDç{‘8ua>¯FºØáË£…nßí’zG\{¹0Z‹ñc¼ã9)ü9þ½ßáÕ:ýÿOˆ}žþÒÕñ£ÑŒFªJª"(Ššb è¾.ÿŸË•ìÆèÉ\û›@Ü øZíùà*kíßžfz½ûÿ×öë÷ö;OËÈ¥óVK/“oZë!ÊŒýƒåE¶’?³ûlvúà=¾§ÙOËoÌŒÈÎ÷ËoÆÛ¿N|7nL?öëæu‡¹È¾Iôæ> MÈà ‰Ì\š³P×Þü7袊½a{uü'·‰âö:›™¾#‰ý]WKkLWÜÓû`?Côc<ùò~ûv'[Xš=šÝ±Ù+£Y&¤œÃzŽïëö8ÞE‡)Í‚åÆ“ŽË–¸Þ˜)¥Ó!F€Áß_MIPHa°g¼@✶ýŒSíÛÇ\ÑURžþ¹‡ûrCŸ#£ÎÏÅE6G¿p·Ð>•ï|iæü)~˜ÍfÿÁš}ÞšO)Ñóo_*ÿ°ü¿¸Ï`ø”`‚éû¿Ó~¼çößmÏEÆ>Jæ½ðÌ~Ÿ'`Ì`}m=ã0>@ð@ÀƬìÉ—0ñIðúG1:¯ð°iìÄzÔ›ƒ×Ã.çøeú ¹qÔð#dv…Ps¹kñ„øOƒù–.CÐt¯7 J”Œ†RØ…äg»°òÿŽxã³áËíÆ!¶cUQÌüŽN*ct^äú5l–Ã*vÒN8ËÒi&3¹âš'_ù™ŠÉ2×g5þøÅÇH,„‘„TŒdˆ!;4ø?Õï 3Xñ¢h¿a’nšÌŽ=¾ÍšÜ3ü}#OÁD;oˆ–bBôv×]ûé󗇹4DRo ‰‰ª  }úˆîšWoŒ{ïñZRÙ*¡á06nós¤7˜KbJKI£E¤Ëç×iSÞµé0rs1'KÓ˜gŠe°ÖšŒñ¯HÕêÖíoºý]º—…ˆ~zä* I¤Ãˆôý¤áã›á °û7îÌ;æNßBu½ð»iíMÁM£¾y5Ûîo&/}qgçd:ÇØŸOSððöèõ½¯/ö{ló·Ö5ÉàbBÛvªÞygº7_mª3Táèñwã…¢ÙË^50Ûu4¼¨08lœàè8=¾¾^9*?ï¹vœFýà ]ìÖ±5Ó0ÔÕUG¬;\¡×„æ¦úWRœõõÔŸ8ŽÓ=Í6MT•L.ŸËoüÿ¬EsÛÎC¤ø ÄÏÍ(s̂‚°Œ!M@8ÊÉ ÍÁC…T„nžî½³ž­15©Ò½ÏbNˆxHqQ{ïØÛRÙ7¦¼i. ¤“œ`±ò|sÍ*ª*›ÁÅFw!)S¬¡ã¬€|¢ƒM訚¢ñ{šì>ŠïÂ(ªªçÛSåÂß&!ç ¹S.ê@ÆÔlË O¿«çáâ'åùþáGáõöÿg»Ö =3ùŸAÙá-‰J•"¦üAdZ‘CQí`I¸èÿO-¸áÎò ˜ø ¹Åý®ëå7òü_ Œ` *ðÿ//ŒÞäžÕà÷Në&ùšwB³qáÌÍ4j•ú½oxÚˆH@ªŠ¨š«á™T|sZå½6}ÞO¯Åv<:Döƒ”÷8‡}°|~¯ˆy'·{pr“·ÙÉ=!c½ëSÞQÆ¡Òk‚RÐDÆM$mˆÅDF(‚)*eˆ4Q±¢Á `Ä%V"®úýãdÝ}S`›Ä³#…ÒpW56ŽGæ|¾é¾_¾üþeúõ}ÿ@G eFÉçO'0àšÞ àÝ“ì_¯‡ŸSb"úÙS_‡‡¦Êì£ÀŽƒðꢾa±ERTUC-MIMMlÆ)¤EtÁéžä=4ù×Íùþw‰,/Û‘“·¾Gq̃„DqJ<|ü¯UÐSÎt‡Ã©c%äå|ºö‰Ì*wÚg!Äþ¨—ÏÅó¥Mù³~ÖüÚÒù$b"ÄhÇì¶í·â«Ð¯ÛÝf!ÎUÍͰQcXêUÌ[Ë\ÕËss¥‹Íp¢6K‚bádSÃýnw˜U¢Ìz؇DÔöNQÊC}ù'iª-[b0EEEE 4ÐÕXwޱæùîiOÃÑÒVdØì‡NÉèm;Þ=cï¹#Dóaëná¹’=³ÒÐúcº j¢ª"@“}8˜•)‹íÒ9Ej Møµ^´DÚ|»¶–VOŸgšów ƒçþË$º|¿HŸ—> Ø~Ô÷yQ{=ðä2ü2¡á¡p„²t’ØÇî¿?‡&$ή¹:çruËDïâsÃ1¬½´ûÓ3"7Ï9þ]o“{×ÿPòòŒ=ë´‰ÞN1äŸjxŽ=õÔøëõÍ팂¹ó D­°™þŸçà÷äh«Øt%ØöBî|Ïî‡u^¡®Áëžaè§w¡óã½Í9o8U݌ބ"L+mÍÆÕ››pèᦛ$æO‘ÕîvO.'§Ç¨µ2ÓÉôXÊy‘’"™Övæˆõ2$L°”b „iP¸2ÔÊÕê~‡ð·éõ>ó!Ä_]Ç"™ûîeá&IHI!⪎ð÷‘Ðä=}{ÿ·Ûµ½b6GÁhúú:ÑCÁg¡Dï}‚?'Ç&îºù˜áU9 €l‚pÐ@£!X NðPÍ8‘àé_geªüñ¡çð¼˜ôŠ +´¸Uë\h{l;<—3yßÌ;ùð~ŒÉåQ$é‚aó’H!1 ¶4™¤ÞÀ ~йþ‹–Y 2‡‰º$: LbÈ7ÕÇHú0pš½sŸs-¹Ì™ß#¶U‹9F¹yiêkoȰ¯”­î!ŸÊ"«fÑ{2Ûo:ˆá>Iò)´/Ûßt˜…b kR"TG5!iæw«WœÔŸ^Ï2OG ç±ã†IÝæs"¼„ÑAñ! ?3¤¸„‚‚*‡ÊNˆ?ˆD°”ýÒŒ‘QE‘…&%b&LF(Ò,‘,À& ÒŒL,`‹DTšDŽA%$‚PIßø ûPÙýêAÄOñƒÂ£‚‚` Ÿâ/pyTqÅ6ù)’¥"±(RL’¬0(D­ $‰¿öGøè ß¹Œcü¡§Åý/Ù`89>7ÿ§~þCÿ?M>Ÿÿ>þ2Èsÿ>ßòõ@øýUÛ¶Àvž¼á¯‡á}!}¤>:ôᧆ>ñÿ¼|ä}'Æ:Éç×êá<ƒÏæÞÚ:|¾ÙÎùÿ?}@_óƒ?ÇÒè|§˜8>1¿Î1Éú|pOÊ} ~þ©ÓG~ÁÖéáÄŸ»¸|½»vöݯ¦¸CÞå?+ÆûuSðøøþåø.ð?n|>ž„jøxué²þ?,òñö•pæR6×6üñóûïÖCÖPßÏü#é ù#Ó¾hQ>Ò~°hXd=©<Ø=,­2Àæž–'ÈC‰{·IS¬ý1›õò÷íñè}?qâä¿Ç®u!:|Kà&Ë,[o}Ûß Ì0=ƒ%×Ï”= ЛÂxI’üeú@œJô<äÄ8€èþÒñü!{ߌ‚8xûœ§¹Ò ¼üÃô~1•zñq‚q.ïY’ûs­|{í®‘ôg—›ñ„Ýë0xœOÂuä¾s¯µÐé#°hO(_ÿ9ïyJo'|À³Î3œ~væÒv_¬!å¶lÎþ&;fHY[|~»íí¾,ˆº>\ãqésÓ4q±Íuè1„›©¨dþíS¦*¤©A!NP.U Ö¨ Õ£.QZ“Ѩ۠¸HckPÁeRC%ZaA8¾¼Üo}uÎLÙßWMõ3=aßF3A³1ÿ«þ£þ¶fwäã1ñ/Ä3=RfIs|“”a¥@ppw±’A¨áA¥Š1JP+R Zup¢î@ `@*³â¨X«‚EªX‘E­DÓXˆQV!f.A¸Âì ‘"YD!V7‹€,PZÒ(KapS $Hk@E@ì!PH"`S.©ÄRâžÅ †Ö­A UÝR5‡7‰˜gâA ø,+bŒàDÍ\Ê·S8 xypé@‚–I ®  U,Š¡Ö%À§Gd‰! ðpìì|bu8p ‹ ä8œHŒ6# F‚]†&C@[ —–‚*‹[Ä®(8—TQ$9H"„°¡ä<ÜQK&mT¶@C“‹W¥à> „¬P1…‚Ë ±aS$9!JÂØ„¼ È  |L%(€ -¸‰`ÈX§Åb­…‡¡$[„ `Àx ²à’¬—A/ˆGÅH¬U‹qb0ÁD‹áM FÃ.!C9á_‰ÂªH™8”·Â–Ä•IÆͨWØl5  b(A‚D´|(·ÜàøNƒÉ°v ¢gŸ'á:ç6'yDMíHN¹àßæÓ|g²5ñ—`QP@0U€B ¬4 .C‹^Böƒ×xuËkÍì“Gþ¢Ä*R$Kdüÿ­Äñ}oíÿ7£¤¢ù*’% šÚ«æ?³0—<¢„Ü;n»OP°i%pÅšI„†¹ÉMº'æ‚“ã²IÝd­f„‰ff8r‚öŠa8¡›Êà²@…p±9Ì>Ê !¥ÝD*9ÂäLevj-ôªu£}†‡€„Å¥vùŸÕΦFá™­1k2~D«âF½lg@å?é'ºþ÷÷b?7HËÕQì£gÖ‹~’MÉ øŒCB{L ê¤þ ˆÛ3~‡Ca¥Bß:ÀŸÂÏaÚâ3jùU ¤ÊS (xt-ò4B—zý´tN|…TD,Êž-Àø`œRa芬_úB :;Hv4Hçgþ·zª¡µ lÅ…uv©Ì”¦2è” ÔEÚLW|ú£Z*µßôÌwœÝ ™„VÖo$ÉÛˆ#EZÄX~\}šÄÇú°¬ ¢òeFÖ^’¦&PàD3‡öÈÑú·²/õ°­JÓ䎾L4ŸÓŽÇí¯Í¾h>6Š J~&³D:SÒ »>QòBa‰¨îpºêjîˆÝÙb5œ®³ß1üºæV³ESÖ|åU\ò©),–Öˆ P¹o%lá êB‚ kM $'öjÙ!c÷ÜýÍÁ‘±¿¯¡gÅþ¥è¤“éåaÕ:é¦Ç‹ÎµoÊŽ·¸ãm’,’S3Ö“ª5þ›øb²ž*/']‘:C ¡ †WR m„æí¤!K…ÙÂg*Rå&=漉YÍŸoâ°ˆU¤B ð/ Ëâh:óKâÚD$Œ®TY}jjfAP»M¬Ìë/ˆ&”.Ý ` 5¶RD¦ÌõôpÉJ¦!-‘g8¸åm*Ð]7C¡fÌ h€Kwô?ÆçÓ ×ì ,=´§ò­ì|cuñÎL9Ê*Ißž>:î ÅŒÅ]¡ºÂöÂ'3"“k¤h‹\#BÎ.ôº††ÆMfi2¹ÔˆD2U¾¾—ò$¦R±­ß)¸=TC·êáfiU183ýÖr&?J<¢×õcõ ~‘¾]ò‘K¹§3bª>àÇâ©8£ñNpª?¢‘ÌŸÒ¼¡Ær®—Nt¡ÜIƒ®çα_Õ:ƒ6ÊÈÊ‹²œ ª†U ÞÔXy)¢Ãâ£)£yG ‘b @¤R¸ÏÛÐÕ¦2©´0 ÿ¶Ð€a¬?îY™‹_§hWQûÚÆô—©¡v-ƒt{‘Då¶~çË óÑôvwžc'Ì$óÙ2–DzK¢šÉ³¨¼xýøiâ8‘a íD_”SõWC¥áðXýIø<›ô¯á±æŠh&(ªB`ÜYª°ÊCØŽ„B"gà-ì­Þs’q¼úªo•¸{†üMúëÕSzÄРz‘ƒÔµR­Ýi½´UÑFRƒHˆ½Ë-%U*:©TÂR2%-—ôtªbJµ36¥Ucü ,çþÄ ½ŒÑìÉ*áê!Ÿ(ŠQó— Âý¡ôÑm$Aß´_^ò{6òIåy¦AŸ¿eþAQ?4hîù»|„$R$gVœDó—·•€Žb’Ô‹ºxDµ¶ë W|2öW ʇ’T,•,bæQ¤H$2C¤;Aëc×L•êĆ¡_Ç!Myݤ{wRAè¤ÊŽÃôŠ Ð”î §0˜Ú«ýÊ—èæß#ÏRó§­ŠØ|ZÔRÇ;Ø’²I'M+óÜø´½O(ö+çhZˆ…UÁFè $®À„A•F™îèIÞS°šÌ²˜!†QÂ¥`q)[GFHa)ñICë ÞÛ'.UbU÷132Â*¥*ÞijŒ²!•A¬ƒ/…!]4¡7Õ5¸SÍ”†©ÉpÑd `ŒJ‰UºpJº¢„í²Èʈ"ªCΦ^ «CS¤IR¢E2K¸`]N×ð!¦!)Ê .D(_»H,)%¤Õ´4²B°`ß3iÕ ” iÕC”¤¢OL¶5ÞžWs㫳fÝÏaÁëñ®\oÆk*Od(goùôbMù•ްägãºõT+ƒ’-œáC陘,K-$Æü´ 7ªXK&Š.J9ÐD lU›)…Ê8UZ}ê˜pÚmµ¤:2Ïѵw¹Šã9Xâ…8"°ÅVÓ§\9†lÞ’r8ñIÍEÖJ$RN;bJœóMÞeGÇ*Üa‹Í*:Nˆ²ÉÎÀ­æ‘V•løÚ!•T¨`§¥ÌÒ"¥SJ›(L·6À)Kž¤¥úÑ1šp+K/ø1Ùi|Ìióðr7Zù4?Â:qþµíÉ´ê*·R=¼åm ¥%mòì)%ðÑ¾Ì €‡¨(X3C‡HUS$ÊKDiµ¤fšp|â-9£é"º¹S„D#±Éâb>²à쌔æú×/”DÆiâ”Ì‚@°ù!Eí­`³õS(~§ÂbªÓ0´‰)Eä#Ã=W’A•†`°°Õ’„&J§V>ŽÆ:ëädòäÏ¡Bó¶ÁÈÙ¬w>‡`a š@ðØZ­ÍåÂÆÔÊç c݆ùh‰›tv}é´ÎÎ&0 ¦H%Õ´—(„âs¦cRìÊ–v°™Žº¾Âr6ñuøÞºÛ×ß{ï =á3»3 q.(Ãaº 3y9LNx™Æ!Ø[/¢B!4€q÷e4Ð”Ê ª°FjCxqAGbÃ`QÈq„]ØÀæÃûJÙáãR<øôºñdìòÇ´ñ]\ïGSÈçÑìá Ípá}3¯cËçÕ) ÓÉLÍ(ž~(tyI˜ž‹îìÒf¯Ÿ>{§6“têwÏG N/"ß?þ°HôGõ@üûãNEØÃŠBÚµi0YMµ Ë+’`$ü¡QpE1ÿ!`E$vTe@ô•ñPSàŠ‹ü”DÿÕ=ÿ¸°ý_Òd“J¨>â Â1˜Ñ4°¯&‘TšQTá YKˆŽáÿ'¨ì{ õT_õ¼Ò~¦ä~SþhöYÚa'ûŸóCºE<9ÅOô<£ÉèØô~'ü]N§”þ¡ÙäåO‘9ŒJ‡D;T°£ü?à¯òzÉúüæù!·ÍŠÑSÔÑîyˆÒJîz/ O©(œ·É%v?ÜüX`À¹ýZ<;ŒŽl´ìb?«Õ'«Øo´T‘'ÀRÁÝñ>¯š‘ñwuOr»’¾óû‘$=ì$éúü'ôãzÕÖ¶ÖÃí6fµûµÆ*ª/bc¼xÎd®ú"ièU…@rÿ/Ü.q°rçabɇYšq¼ TMñ‚lD1_ÑxçÞ© SÕÆ!UЉŽí&…\UCÄ÷/Pqÿ.réßµ\slëYöi5a¯\×65c[}¹£36èR—ø\A¢F–€¤¹Âæ*ܪæŒhÖ¿+”V¿cg©¬B"Z@¡¢ºÆB<É•N~O¶ýyñÛ¹ ÝöñëÐßE}ü¾f.Ž8Cë÷ (,PSñHÛ”|NòÙ PËêó½x¬&\¬ôtŠ!û97ë{çO6%|Mä·{ÙfBRÚS¾tsDÎÎ?_ŠwfÑÑÓ¡ÈU¶­+Û*1»ÂÀ©ã µï¯ŽØDpg#Ü‘"ìòŠ;½H†ÛîÇL[ ³<ïÙ7VO§¯‚^ùQ÷ï½Ù˜½NÇSˆjqÈ¿<ÜâÅ’pÞO/¾Lôªy˜qÿ~$Uù=œ¿YC„Ë=/™ÍD®‹´¶b!bOŽÖÔ@´v_cŽûÍ>TW(xxzoyuqÌÝ[XrÆÝ«ímŽ#…¶°cß#Ÿ<=µÄ%ûÞÓ©&G:–Ûh¤‚ü죩ZŽM‘.rÇ>³Ô3å.çœÀùߎß-Ÿ …T×¾m»kçNû É‘Îg¿Iž1ßlîÆùøn´fçXDˆ¸Ìa wv‰Œ"  »ºn7aΪDÒR$áNwß)áÏI¾‹¹i*/rñ•Û½iæB3¬4|vûÙ ,©xw·O(¸®!íñõõ€çXo™l:Ø>³Þlž±G(oÔ39YÂ]ÞºöÞ×4ê™Îº½ç}ÚÛd•áÌÞ»éŒ$Œ‘f\ǽhx1ù‡DÌo%ÌKaè©ì“`u¥7-ß®HÎróg ëi$È‘Á'TªóeΞ…’Ž8â—z–—>%ÕT0 UfÅj;uGDë‰Ó´èŒ´âÖ³-)‡úþ<ƒzƒQ>ðcщ>Ï3:W*DÚ@©Ï¾Døltàœ©ó×\»»«ƒ…%Ë;†ë. ¢Ê®Îe¤uo»Õ‘çV\‰Ä玬ñ|뎵0ðx% B¨ê®±§n»’·ÖN»Wnã²9'X81D Ëù³.½bØ…ƒ/fíGë(myÄ—r›v 34×ø€I¶ŒÛ–"ÕYIÃ%’&£g´”ŽÂ9„!¹Hi6”ëÎ;6í;1ѤëZ)©“©N¹ñÙѾü—.}ýLÊ>ýRÄl…!!Jaù ûÏ^lÌÀWÔN~0D†Â»ª¾3l4C`§dèØ¼¯¿_[:“«pýöéDàΤ“<]zêõÙÛ›tºÏ@UÎ#<%t6žUPÙ0ŠŠàœyÉø>`‘ô ªÉ,¿V³ÁvŽ5a’ÕEø´l„wìl¿öç,Ф-™dC#"LI^ÄC²ùâóTv{àtuØq:¨nŠtœœþ”é9Ø™ñýÒþægëÙÆ÷\oÌÍiò• ô„f@®W"e ó7Ä¢ì!˜.Ò¸ŠH»IóO^T¯²O//gêÿÃäâu“Û û§ç¿wI¢dIˆé†&}“=]ä™ ôÏsðDa¾¨ôÅ&(¢ªŠf*dýzpØ8éÉèpmðFäåz°‡˜A¸wûùý t¯QüÒDí<Ã^¼ÆÁÚ'¥ÍÍÉêèóö¨“/cÐðä;vØ7«°;¯+Ø…äz8¶÷³6öt§Ó‰©?ÚAO$puznÃê¾|<¢ò~ùÁþ_¿êwöß÷‡¡óø;ºÈáùm"|ÓðŽ#Cdž˜G®…PìOB^çÖ«Ð;=N軼MŸ£—´ °Žšh*¨j¨ª ªðè`}›³§¢¯ÈêƒÛ¢`'^‚»„4ô`ôC—”Ùs¯P ûŽzM»‡I:ÏR3^É1Õ$ÜŸqè#ÑÞLh9tXš*¤t­‹|œBžQN¼(ö0SžÎë,uM7Ù{¬“¢:ÜõhÒD{*'º”’`u;ðôM™—BØIîìc§2c‰ÄN£Ô›s¬<'¿n}]¤ŸBAíRzOÞBG3ß±'þ6#¼”§óÉ“Ú>V/õ™óI?«ãÏËóIÇ×èùë¸èúšö:Ýy›Lu‹úr’GsŸóÿ ôOá×Ó÷ò;>}'Ï\§N[OCQ®µmV~ÕoŽÇùÀ‚ñáö=Ÿý0:Ósû_ÃqJïþŸàhT_DB ~«÷ÍÝþ)ÙÅU1LHFdLHFMN'2lIÀåÒBªøNŸîb‡£ŠÿMµüùïþ§Ÿü~¿ëǶûÿ˸ù{Dü± Ü¨(žD¢¯…™Þÿ‘aççÝ2¿4Ó^,sk¢?^aò9"•[ò½É»J!Â>¾¯ ŠUÞ™œR6Ì“C}b³ZËŸ91b._\h<æõ$U ÕsIQÍCr­ÝO4uÄœñ³d;’Üwª®%û1zr] úê*A#­e|³0m»OC»ªº´«§¶Ó¯3Í®ØiW–}=ÏÕ¨M«Õ0dÈ1;¶ÝJ{0º‹—á}sé‚Òh중š¤˜ÙÊ–˜ãW˜iÒMÕ/TõBC[;“8TÎM(Þûƒ]í%œZ»hê½#íZwéï“m/¶çº{«á·QìÒy÷<×¾Ý8¼P/ð!JiA¢dZQ F„¡ ¥‚ANè˜ÀÇû€À‡únîâ¼ïU Ge‰¶³w7×}ºïÏ^¼k¯ €ì¦.J‡K¦Î‡‘pÙÆùéÄ™$˜‡hš°ovݰ ` 0Åà Ba%¥ÃÝ8§z”R$›‰ë¿3•È:C»ГߨòNÝvч3‡F°‹øu ‚+ "Ý` 4‹0Á€ CØQJë`0L@RF"Pê°Db€’Cj"ƒÔY‘Œ``c~çﵪDξ,rj;qÓï–häò<÷ìx¨”=ÕN«(²@¸ÈÊòëmj‹7Vj§ŠNtðæ¶||5ˆ¬;kåÐ`b«óµ^ÖíQùï›™®6ߎ8ë¡Bƒàka RTVS™ aa0›†ÂNÜYoÿå?ô¤‡ú¬"xÛÇxç·¹ $ˆðJ"¢u•UOQÏ^êù Zž½]¸ ‘ ¤¤)ZR…¤EÂÆ¢6ƱhÑE+-ch¶56(µ£XÔZbF¢¢¶*¢ØØ´h£EFجh£b‹hµ£E4QcE£hßµr£lQEF±hÚ6-Š4XűQF‹±´llZ4hÆ¢ÑhÑbƨÑTk+ű­¢ÑlTQ´mQ¨±b‹,hµ£kb­Ö*‹d†ì9)BÒДBÒ´,Ú(ØÚ4h±EE‹clmŠÅ,X¬h±ck¢ØÛIE¢±£QQ±´mƶ5Ehª*b£QcQ¨¢ØÔQ¨ÆÑª5¢ØÚ1‹ÅQ¬jŠŠÅDkEF£TkF¢ŒQEFѪ6‹Q´b5‹1¢ÅV-’Д…#JR4-J(såÉß©¼µ§EE‘;H§¯!œ”x‘6…oÉËÃÑNT¤Þ@Œ(P‹Ä0=,9”ºÌ)C1!ɘ”"o˜-Ó¦æÊ±*ŒP4!@£Ê0¨ÐÃÃן%Ü:À¦"’YæÁ&ùñÌ×t85­MDžqÔ5ÓËœvëŽzð¡ hWYŠ&B'„ z]|vÒ,D-wÞAb5bC¤º…CŽqÈÔ=àï. € D)ÊPS éŽÜ`†Òƒå ¹( ‡öóëåœæxùoéç×»·yDù{åø…hž` 8ÀÇú‘‚IÆùYÞ( $l;»ôߥɲcØâäÇî «ÿEGŸ.;*öA««â ¡n¿J"|qí„qå¸fÊ4¨d¼¼@{ÎRD4«¼*ž76SdÄœDé+¨EhV vôÒ(í¯¯O–ž¤©¼ s ŽHð©PÔĬÀH>²ä¨§O¿^âæ¡3 J1$«@Ä ñ"êT8‘uâ®6ºà…˜ŠP€dŠx•@¥ 6&Õ%Ij(J5·Å¹£a S L †q‹’š b ,•“T¦©M3l¦ÖM‰…© •¼(a£bšB`(…f  ¡7ñÆÚÈz×›ó§ÂœÓÍIÖĜѺNœcÄov£DaŽ2pÎþ›iêí Õ?Øþ8²™Ÿ) é%3‚°ÊQÐäzq )¢$qÆ1ä38Âà^)Ÿ(4`YPªJ«m¬Î;K¼;ÀùZ‡´¯Ú]¤ Œ¼úï£hQzÂñ&§ËÕrJL†ðŽ=¶R¥Àdϧ™â‰NË´æmÂ|}ÃÇ®Œ×`DÃîC½BG {Ùô™h)ÀíʇÓ1®OÒhpO©+šËO:í̧×¹o€ˆ`<†õË|9¸ôgfŽYíë³±Ï=RcRHØo®öÞêžœ§mï,™|Ôzï<ó$É9®þ:Ð;Þ'—¶Ù¾&fo->—mo O?;[KAééÖßdw—ÂßÏm9z`y‹è­hÞOL“¤™ß$k¼/5xÞžÖ8¾+¥Xöêñ½‹}©2– $cäì…#¤8o°ò>rºŽÃ>óÛ¿ì|™½)ÏÌ`—€8jpBU Ž àè-âñcJ)lZ º0Ð"Ãa CHFx[Yͦìe°vE¹»ÍŽõÉM§:ÜyvãŽ}žÏMëGHåæÅ‡#ÇFCwƒ´»Íß¾&£¿–>ms¼pðñÄ¡óß¹ïç³tñ‰ÍIk§~ü·bÅU*YCÚíºQDQ16/·Zþßúüôö¸Ñ<á΀ÈaÔCNKC:ÄŠ¨ƒ¥ª†ŸXòXôé¯Nw$Âéö‡_?^7ÐÏÂÂÙPr™øpâI­°]Gœ®GŒ’ý}ü»Þ7ø'†y¬Ëw<DÐ<.>4Ìé¬kCXD \›¨l½è+ʪiu·=8ëÓª/+º›J¦€% Á `v0Èv‡ßª=. ›ñÞyŸ_ 5= 2}££å–o¿a ðG€5CÅ·¹×|ââ6ïU9ÌÎbI[Í“©¯zšw°æðž°é ›o³°1`Ç‰Õ gÝ̾ÒyޱÞÍ𡵀ùð= /6iÇŸ‘–Iß¶Cµ=ëŠzS~˜Ë Jd¾˜§‰8ÔztÒ¦qÏžÀyÁ† 4XÆËˆzó’­«…5y?T]¶/S(U©¹ñåø3Ö¯‚Vø(s;ÆWªL†\ì‡ÍÇ:™œƒî¾v˪ ´/X”Œ,!ï xAÛƒ€Ô\.äo/mŒ˜ˆ]ƒ7Z64a„ÃÄÅS)åvÖaB-OT  Ç3ÂÍ8óÛúž0%Âm¢ðÑDy­1µ^–ÔÝŽ¾œ[eŽo2•lR‡ÛŸgÉÖS€•>ÛŽ#ŠâŠXŸ™tÉ'<1Ô4DÁ¨/>¼;[ù(fŽuMÐI7†ˆ8”£¿>]¤)|!ÔŽ@õ€;f xCÇLrtãùF8@ñû÷¬í'WsÉÜÏ%2íÔà‚1…ðÄã¡Ó3aÜIBg.0õŒcu‰;’wIÄÚ̉²M£b,3\ñ¼ÀzHkË~ —¤¦IÆÞôã…3¶õbn#’ª›‹9D´ÐÃÚM[èÑí¹»4ê{əςÂln™2Þ1µbÑ!“åØôÒ¸2 ¦Í瞯LµMÅ„¹`NÚÏ(<¡Ôvàri ™Õ‘L" ²´ÈŸ.uf ÒdNás‰ç¬IrB“™s× åâ¥ï‘Åé`!æ<épÒ ÌÒó4;yš†ß&a蓯¹×g³Lçs°èÓñÃæôyެšl%ó#©5$„Š[ Jø!Óή¼÷×}þ0ñï4¤å[¹S&>\Ôâ~¿ó/xÍDS¾ uÎ:ºšFƒs®òňbj{7B  .š„5+×~Ã)Ö‹‚®)ÉOÌ"•;}tóé›ü™ 0SLó)Ö7Ö:·„á*½ìÁíQíDágµu«x¹sÙïÆüÛxàs8ƒztÏ9ÛÃÞSÎe¢02CŸ›yidékTAH’”Msãóøõ<NSè&;¬R`t(n¸`ø2XߘÑó09zY‹úÆåk‡Öú¦¸esªAŠ ªgÂ-xç)`ÈŒ>1„MI×l³sqN¨ær­Ãõßl²¼îc! F0+¾pØAÀe\ctg®ý}8„åIçϦ·c½ezVwÄeédéR#H˜!«ãŒnМIÇNPQ Ô;ÆÒÑHt‡ G¥’øÏ”÷€êsbg+Wáìo¾äT®n,¨‚Ñp#@Ê x€0¼âãÝ °¤àf—›vŸ8Û¶9 çuŽoí<^r›í‹å'XâíˆW‰7ÏŸ¿¾t‚ž\"¡k¦Kåºã¡Ûgy!HˆrSîÚm\4ìâpïÃ'Ýç\6èÚfœHŒ0(K¡›c @—°X;†ž9Ù y”Èó sOäñÀBd¹ = ÷#GnôÝú°‚¯QA%G7åùx]:ý÷ëùUÛ ËðDQìw.P_8éàìù»œMöï©×»¢;I&ƒ1ÛXý)ÍIæÄœÀå†R>”ów\ß¶¼Vët×·FÃY!å.Gx5ž]×ÇÁNP=ä|<üu½9…IyuL¡õüóaÞßG&%0AÞéÆîê»IÎé=d;èàÐï+çÙ3ÊÝH}n'Òó<¤éÀóãÎý·7”rGˆñ¼= rx˨= çÛÒ¾°Òœùeš’Yã®Ûî›ÝûâjzÆKÇ€`!|{O_{ß®’ùÉךt_]äœ1h˜üZ¸Õý°:aîÃ0§ ï("Èl„L®ôñç#ÒÈô£›»}:ôÔ‘ªT>Ò8}þ-Ìü{—ÌÏ( ‰Y¦zI´øN^§–mgÎMM …’”`jY˜AS…6q`©:!HûÔ~ò©¾¿Fýó×]=úºÂÄñ"\ÌLUpstG—·K„·Óy#U”ï¬GÂÉ;õñÛhsNu½í&È*pç™ ’dŒ,Ûív´è€N:ɨNïN6p WÛÏÔã)¼)éëg¿¦'¬ñk0—Ãl@>ûöã;^>ïéÈx‰ç}ixNzdÿjÁk:ôŒ>@›jæøÀaë]d›ÁèκGYï“+Ö̯>Ûó®¼#å]{âu‡Wh½qG¿|¨2œ!×>¾}Ðâ@ëu—¤'Y|ã‰;oŠ›BjÝó¼d~v޽p<·ÀíyóŠPH_n‘ÃÌ·}ç>›£¯{£Ø9‹{Œ¶  .[mìäßËSZâ%ô°[ ^>Zã¼qÍF4 Q´úïšš¥hœ#€Øa>yputíO{#o\ózíÛp<äçÏí#î¿øÓù?èO¤ÖÙ#»Ý1p¼˜q8Î@I1NnÝk•/&k—ypÛ3ÈääÌàÖÎq‘ qs묕ß×箽'ìV¿?:žéS߯m2>Y΋ÆËXÀbƈa^ÓQÀ#l€ ki[+ë˜ÑzU°QxUò¶Š‰ˆºXXUâ¯i‘åë÷šò|Ôê ñ{æfBxÄú>Š—-„ØÑ·JIÉØhLø©Å2;´^4œ­dRt<+0æS½nR;JëmOb-3Ó}3pÐU¢&£ßMô`'6Š.§júƒ‚„6=$=¦ôâúȰû¬Ãš40hrµ ¦Ì×zÈ!:Ž7»Õ)d¯QµÕs²åK×Onº'1wèh¯e²-rh)½yzš_¢}ÏoQ.XeŽy›w&í]S»“[ò·7ÒÍ”MΕx=bswp¬J¢?7¦r|Èjô ö‘Žï“âäuWbìu„nQIR;اßpY¸-³„./9i[FA n\3­¢w¨—HÚj*`m(—ÔDž‹V"é¨Ñðƒœë¬eå˦IËvigáfˆà²W ¨h^y–®CÈÓ$Ôp¼Ý¹ÌëJf7´N™­ø«Ó: f²tODx\ú“áOŸÓîÝÎÎ~ cR‹´´dâ^q3=y­?†ßð걸0å”^ªe¢Ãü½–ƒ(÷ïÙ¥ëÍyÛq#Òú÷”:ÏRùѼ½ÇO“š¤çgÔjÊh¾OV7]BÁgŒós¨§V¸Ì{YèÓû·5ćæ*{–ܺõjµç5Ú5ã+:yދ八ÓH˜RЬýèm̼ Ó•<»î•ï½5ÉV²mUÉäs\^TÁ.{-ȶ€×[òq¹ÝT†µdHdÔ¾#~I€R¶yì#ùa25£7¾^ecÞ¤³~ÎxôÍUiæå·–µ½ÆÄ¹L¤M/)w\á½L/^uh¯§4®«ÚfóÍèkgg'€Ñ£=å;˜??€hI½Ó{̛Ѫz©§y õxEƲc£üŸãŸòÊ«`ƒ6ˆ°ÏœK`!ÂÎ@ƒŒj6 œE. 0˜†0 ŒR& x Ï@PQMKA„âAÀLR¼† Íh€‚D „a¥„%B¦"lP¤8y'‡3‡†” Lc~Cüfkl__¯Ìç5†º¿_FÒ“(vø¿²CЕtï5>M2©¦»M½»ößžÑGlóZ“ª2JXN+Ͻx—³¾ç„ìÞa¾AEûŒcbžÍà¨Ý"üP2=®ß_Nž;¢ž9¬4"õ×;w߯:WuÑÀ°PØx< c%åù–ÙA ”ê±¢1xWáùµ•g©µüF^¦Ù‚æØUjbpA‘AFƒQÀ~ô³ìãjkÈ8Éù÷.1§úFê|u)ŸSxÆ‚$¤ÏÈHw¤B¬¡|SûFnrâ³-Ä<êu]x¤t4̼'xL‘}>‰³ñ&AëÒûÊ~¦'ìÖG±ì`|Æ ¼ú24(JEÜw9  ®r4ïúKZa\b™"ÆöÑ=Lã©%D&‘;åÓyR9Àk’ºª¸ìÄ®iEºÊÃZI·>f Ò:»Ï¤ŠÛgz4\éVapøWx˜ šbªsá´ùià•å— °Xñ oŽt‹ØU¤Œ¦õ‘5q¢ü"…UêCô")œL³Óœh÷“ÍšDm«÷—+æ¢Ø+oÉóY~ùPñ]høeÊæ>f²vHŒpNÚ``c ¯@…Á§‚!˜ß†ik„dvD]H»ˆi/Ø£ :)†B±ù¶T¼¬,ZùuZ°ÚÊÔ>)³j’¸ôÍN9¥Üª!o߯/¿ÄH1Ò•V·ø¹–ÄJ@ à«õ ƒó³o)ÈÀœ,eE;9†uŸ¶µÄÖks#ó™Š~+®kòZW•±¾ 3.+$VÓº´>¶¯Åwš»Yuôomož['Lý(>­èÇÂÆ@}âš6à?Ä @Ð2á‘÷@¾òâá:ìÇÁ…/zôÔž¨ÆCšÊ—úâÇv“ZÎgì Ä2´©€Ü·­fxÍlÕÙ¥Ø~ÁgãÌÔ7/kN³ÆgI¿kç£=z#Ƈ0¸eQœ>yŒ0ôÉ ‹8ß@±B‚è×pÁô;ŽHRé;cÁÆ+Um†úán)TLû/>½š€qöö" …EÕ.7Iâïz©ž¶d[Ǩ7òý毇Ê^“È|ïÍ'Ö£‘Ïóöc£Æìø9…€ã}•X ä&*0k °xð”Ì ìMŒ¤==^ä wA‡ç5_‹ÎÎF¾åÖý@HaÆ1€!…ÒTrG‹Ô”çÌùär¾$FKpEâ¾kR wÜ{ô4 èG0®¯„0Æ®y³ÛKÏèHÞ(âäWÏÒ‡Ò²òÄ}˜Î3NãAÀ÷ß„Qœ¼ø‘fÖ.†4[u&>,ü˜l¶W/zg¤‘ÕüÊÁŒ` a]¼®j©§ÊlæPص¶#äJ˜ÞOw^.§Cm—ïÆê ñróK(†ov÷a:Úˆ‡äúw¬úc³¤É®`¯&öpæe¼ƒ.¿7£{2‘6T¬¾ü™g´·ë\çXávg¯Rý\ñ·žPó>|ÄŸk}ë@V£9[ï’¼gÍkÍ´Åœ1°Xé¼^ͽq×/Öʲ*÷·Åùw9«‹Ê/»¯’ëAy }ÈeH_<.qy;;æsÍ²ÍøÉÔg`¥{}4¥zãtþ¦ˆ´ªö½z9×k"GËf ˜+ÞÓÎõ[F|´ë?žV¹j<ÜåEŽË·ˆ+Á½dó l|Õ¹çHˆ´Ó<‰OËîžQq¶z†´¿k½&izÇ=@¾Lv÷Ûs¸žWœvRâ¾³â‘ßšmtÍ/lD~V'7R}«"ê6ãNqvЋ3âçܦùºã“ÆîæÛ¿5ìºÅS¯¬f’Ý..£RÝX]ö—z9<ï­|Q‘: ü½K9v˵åKΜø»žl)­Q´6µÝ'xÆ q»6–ñ½]i:kíj_°ÊĈå2ôàkoBc…Üä»ÊTÇ™ÓQ÷¹b&¶ÓóµÏ2Úx™ŽpWCDß¹#]„œñoA`eý[c%Þ]·‘0V"ˆù-ޏr:•6j)mFË5Ùe>öÚ³Vž ŒásÒz…oV¦ºÖ™u)1„×Ì £.ï–¢°Ø 8¶(@Š‘‚‹ÂX€«„°¡*aÐ<–à‡“Nvx9:Þ‘… ðO2œšÀÄìð1Ús îÛÒ+ ³qzÀÂcœï ö Äú1È<Ÿˆ…¼Ÿ:}-ûYCï_[ñ:Ù§ðü]8ï9íàs-Z˜ 69Úä–ígEK´êü\Þ”>Wðë”Æ1ñy^[ü¿’‚Äuhb>GZµå–¸£E…Xz.w\+Ùô•c‹L~nG¿SwëÓ§¢¡ÚõYßW&ƒIï¡+°/‚¸°µƒ€N1„+«°ÂNkÆ"£¼„S² XÁò0c¯’øÍ @ͨOÆ€ly9 ³ì ìBÁöª­T”NÉ]­åÛkó¹û5>Êì>Ãì8 „}ƒ °ÙnȧL†7”'êOÝTØ}r¹sÞï0¨zLö‡§âň²]UÍ–P¨ìÜø¶ßWîÙA%’×ËîééüÐÃÌÏoÛ.ýû郞ïÃÑ–ÛiMçŽÙ¥^ƒh;¡@GB aKÂt.Ÿ$ Ô:„µ§Œa®»ÚäOË^N÷–DàûUÔø° ôD½G‘a´¡ Q‚¶á—Nž¬Û{祄D¦íÃüUa¤O6™ynµYôŸéïØ\ùïÊg&÷n[u2#=f¯Ã§cn°™"tó]³,ÜM:âÆÜ@‚&ħq€ }Ù¡"xÛÐxÊ÷ñÂÞ@ÆùÞ‡C‡Pf[t𶆅ÐM“”2V«z…ò\¥3©ßÔœ‚S\ú»á'Âx©÷¼úȆ 4ØDPjj€ÀþЧßAÜŠË/ó­¼UrùN0Î1ŒDoªÁ¾üyùˆà0ÆÎ(U•:vöàñ–ÒÎP '_L2żœø{Ï#‹õ£R³òÄWˆñSÏÍ|Šèüi]OÄ^ù·SUϺãüȶ˜ ¡`(@°pØeT± ñuÄ# ˜9±‘åæ1°“é Šz\«“?†¶7C ÓT¼†í¿"CgÒ•ó!K%dÁ,RV[›ØÚ¨tòá>>#^6½{ª³aï×´ÀÆ4D[×ÞŒl $@'@ QéºÐ€Â AÃÒeCô‘Á½y»ÚD>¤:û‡£fje·Æ™ð—a‘uÐîç/ìŽdÅ/>tÓö¨í!›fÆ‚ O”K4¿Q–⟔ÈTU é[Nü¬çýêg\Õ%öû›,ê3Ý,´jU2'  4a‰ Ã!{Æ ŸÅô¹†À!cSŸ}øåË—6ßšU»2Oon|GW<ÅŸW"!@\íóT sá!¬à.o`!!~Vi³´û)7_ æ>š•Eø`îçoß"J¢ 1ö`cÆ@ô'œ¿8®úŸõµ^_œl—™”U/ïæ§Û)sZŠO'y-ÚM*B ''§QÉ«<Ô^ÎRßiºª–žL#–lD¹&’žY¢r¹~Ù÷“’-2ÏA£>µµÐÛ–Ý—fÊ~m•Ê• ;Ì(ù»^'|_\²ÜUÆÝ÷š[º[ª½U¶ê“§…R^Iº™Ã#1‚‹=¯`,6SÂÓ¤ê¡!á0E{lºnÓËpÄæì”sͪë±)¸ò&K‘Ái¢…%kˆèÂçÂá=ª©ù—ŒÊ'"rgïªc :)órÚ7iï—m^Ü5–⯑ W,ÌE{Dâ·!'b{’uÒe„x±|ÞŽ©ÜqXGˆåç/RÁQ=í´›6ÒŠÝiOF“ËËFtÄhS& ‡s±g£™ÞüÎøœÉ?âõÂa㽦žxê~fß–|ó}U8’*«iRC¬Ñ% ޓĦFµV<3ß.™$„_Äå#åîÆ1û‚§ :Êm'îMÍù[W~o}–—ß§\ùÈNüåËê^Ý{#4ýOI¸3Ç×n©ç5—sN÷0ÏÁ\\^Yõ ôqºá¼´ooÙ ”Y-AФçj•u³—œ¿lXömºe›k5H'=ê<5‘'OZè­¤Fîw‰Ò95œ9r³ |ŽZÕeû¸ëÍÝõ¢MvëÞ— wnM37 s( ÚO[rÉšN–öeÊ5­"?®´aoÝ; 7Z­«ôW‹æ½ÕÍMsЩ'vüZ¸½Õž×½~èºçO½ÉJÞMO­”ÑtïN¥rŠn•I]¤} ËnµI«=Z­tj9¥(¾'Ч£uÏ‘óç2™×¡Nžeå¦YbkÀ¬±Î¢n “×{‘6é#¬qÏSqÐcHæ\ÆKŒ a³J14TÔÚBâê§p…ƒŠ6.„SŠT!ƒ`ŠD€ ,,Ò2 bc †pÖí‰ÁÂÞ;0°Ö8›:âp㣫|×XëŠuœ6®­¬íÖm¾ ¹çÂQ ¿ŸG(ùèìÝÃt¹\OCÆŽ5‹ûIoϼú—ù_–ëÖ,þ?·ù;ÂcqÜšwug]Ó Æzz>à;ž¶[%X[ª4`E4ÍÏ×Ûö`5À$Y ;œex:Ìq‹+PT6LtJ# "G½}ºz![ç~úÙµóÏí'£¿L\éç¯L'&ç}ó¤×¤ÑÄ2 åØ?¼£ë…¨`~v)Ω&?SÌ?^Rl<ÚÓuw§@XœdpFjÙÁh ŸŒÙH%SYÀU&â„?PÒ¨­ª§ºÍCJ¸Ã&ȇe‰ÙÀÂwîK8qï‘Vý*ΡNÎuæ‚]t£ ù&e4Ú¨g„üxïÍh.°Ù@Znâö™«*ðr+àáëX<ɱó×oÄÅ/ª¶Œ½Œ¿§]y”ÎÜý@nsg~úÊ®Þæ—À¯ÕÕBt¸p .ÆFò*·Îîµ;®.7Ì(n‘°¯Úˆmž ‡BXÊ xqQ€‹U ˜œ"°¸”ñíQ× Æï{–äã?S§‹ªÔ%Â|—_‡±×Q¯47«jœ?01:®»Íl¼á¯}Wq±‘à†Å¿‰yœìæT”åû¨³RÉžÊ}ÝÔ×Âgwæw²%8F8ê1ðôœqÝ~® ÁÇEŒ68  ëL×Qq[¼Å ÐÐ!$ PNŒ–ï2üík!±öÆ@.uœm'6ÿ…/ÐöB(ˆNœ²‚S"2,^Ì£:Q㳚ÅõJšœÌ¿ÓøþÇžoéí;ýqü?§ü«üüý¶VI¡I…|~™QXÐd!ĆÂp€‡ † µŸä Î;Ój“+Ú;ãC.¶^ô1 o×ö}Ëc^PMæh>‘Y–±Ä*qh8QABšâkIEa9*§î‘Ié7µdøj©kìõ›1N–ÉÎÒw\ËÏÞ³÷"ID¤eÓ2ð£”&Q ÀñÑɊחeõZj?>^o9IÏY˜ÒeI ÇUÏVX$"uùÚ¡SÍÔp’`õüÑëê×¢ÊÕ1åÇÖô£ÖŽ\œ²ò‰Ó:>¡ï(„}D‚8#+ñ|f‡Ê¡ùò™D&Q<–xYùϾAbÉÚO”m[RÜ{ÚJI­+ëÄí.PDXLº¢o¹s_!º»çHÝO.“x?œ®²©²ݺùz²/߉­…òÉN¹˜ÉA‘÷æ2®ÐzY<ÙLA³‡… œK&v­4³´Â¬üŒÎÁßPt’¦#ë2”é)*ŸÀ‚ð¥óóãj+ïnùjä9$“ð¥"ã³VÙ¶S{UDFâ©”ˆ‘•X4HI â™Rª¡¹œÄ¢Qù*„@ˆ» Å׫¹¹Mͦ~z7i˜æÝWåÃ1'šGd!>ušQ eœÖ•~4ʤíU oª¥²•îwµ©šzïž*›jÇ)ôcËð°Æ0î?¸J¢v3näû°çÁ¯!¶(ß=~òcïä#ÅЮ'ƒ)Ï8Ù¦_—`ÀY*’xÏÍÚ«òù¼÷#{ò{NùoU^‰u3|·=»¢Y•ª+W;k£çÖÓ{L³šUý¨Ö:©(Þ‡ñ÷óÝv<3¢ïjïa¦žšf¥Yó5¨’æ­ZÚž¶û¼ÄËDCe:õ[n¦¦†c™á"ê¦k'·nZ(68ëS”ò[§RùM“gQd}UÔ–c­©Ù— \nbÞNÈtó±;Ï ì©·ÐE!Iù6‰Dòp»Úö7¨¸­3ð¤ûA"ï»X´TMÅ1]ºðeóÊRÞò„–$|ƽ@ccäö=NµT©b©ç €1ø³Œ ‡pÅ¡ÂØhˆÀÒ`­­„ ¢]!‚¨5£â_ ‚¢ÕnÔ8 qn᳊ª' #¢°q†Xw‹Œ5‰…Ã8 A”. ŽF(3ˆ¤a°¢0RPØêYœV_á÷.þ}êg£Ó)´†Â-·IÙ¤õñÌzßi€Ë ²p%„]k-)«‹·ßcgÃ7®Ûxi¢õÓ~|7ÓÏ‚ðt@龜mÇžÙ¹Áº««ÇÝû9êê{!¹§„MbHY â0ÂoäaƒÙQÄž>¶ï‚ð£kÁ"S €øl(á ¥\yš¿'­Ø·„‡J>*ÿ#^BÖ²ýâôOÝe&Ä c#0j˜îðBô¸Sƒc˜­|@00Ø(I‹ÌNt”ÉyXaU7=É™lŒ,8@YkªöJ’"a­Õ~M2ÂŒª£«à d†-k0QðH‰ÚöÓñ&Óv—\^fÒֳݰXɺNsähU`„ìÑνç+:ÇG†žxœ=:qßgr;IbQI è7É ?¾Õ »¤Ád ÄaÑOã…¾XÞ±†Tt€f°ª~/ÇHÃôü{ºnÙ©š Ÿœ¤—kÄÓŸeSÓÂxlICÕs 0µ°îä3»À4ú F11€+ã4à R©'æMßV¨BÙ†ÇTœ}¦û.>.µ8| =@%³ç= …—Ü,’çÐëzWëUG­1u:s·k}G¼·èœ‹TŸK#·,k9@3€‰L¹¬îÞz·5ÄÓ{úô;@wïÓA®¦#+ö ‘.#_"ùT#É¡‘ònýC üé]`6£àÐ> Æ7‰ŠJ4Ȇ÷¥ødˆo]:VƒÒF•zyccQ볕3o7ßc•ÓÆhž²wÏ^ÏIžúɆœdÓoow·=`íâ óí×F÷yíäÍ8áâ5¯mößw¥“§3ÇÓöFy.6P` ¢âÑÈù ºÁ”Æ~°ì;µ°cäe¼ØaæÑîuôÕ5KžÁú¸Ôç’ÁòZâÏQ™îÍVyÉ®Æi¸‘ÅÓžxapXÅf覉@ÀîÐ 2©eQ€Š¹ 1k^®ø°äv29èøp»g ேC§.ïÔÎùxÁ&n“|Ѝ ¦•BgȤ!îYQˆfÔÂ}ÀÌüÛçíôëOð'ÎÚÚˆO°ï¤±9!§ýÄ8#Ȥ.Ð$Ù ¼)åû 8KÖJ›Ühè”3ÄÛ'·BïÏ-Ú$«YÛ7ñòC~~úã 6svDO•Mçò ¼ª‘ß+†eBkʨˆ²údáê¹2è¹Þ¡éߎ{ÛÅ„µ€,Ì…–3‘Oœë~èvêw~÷êrt˜3ÜœU(£N’š:ÚzO >"¥a×Ê·Q$†Ãp»”*´C9òuqžàÛª×Sk[;Ûß•g|¶º|ïÍr¿$ƒâEeyÁµ0XÀœc «µ—–¾îÂÐçã„Þ<Ë@WøÌ^x«šDèTŠTa9Á¦pÅ7–Àòt|ÉÂC‡9%jʇ}%hß]G/ÇŠ%\¹]-jèæ»¾ø}¹Ð‰N/P¢%UÎÔe*Š‹I>·rƸ™"ˆsÍ¢¢v›e¡œ¢µ¶…Õ3i%‰1/Þvâ)ÄV©wdEpÆgïÄ {ø™îûSH`"+ ÄÒªííX:yhõ•FYŸ5zkS.Êê°^4¥¥ª¦M$¥"›r7å‚™US˜Ñ̉u»Æ3jš´!“M53*sŒ œûçÇvâ©)^,ß gâ©0Eª²…Šž¦ù·—C³»’S+Lˆ‰|@¤úQz‰ÞÝn.»Õ\ú7TDZްèHG+]}ê‘Ý>•[ ×Õ:—hó±¨ÐYŒ»õ$¯‘[ÜYâßx÷I4ù§Ê¡$òº„kT±¼Žõ Q›yÖèÚh™HŒÊaTŠš-X¤ˆö†Ó˜fzD¦×Yí5,§%>Õ¨]”×JÚ©¥Ý%{âBŽGÑÌqתeÄ­£ŽJŒ‡C•ybJfHÑ­]µF »ÃÑ$mW]@ž<ñ•xG£9:E*PË6ß<뮪õdO}è™êÇÆ¶I:KŽ;e3Õ_¬ނøì~¡ ßÆÍÛöG!hCÆWršÔ¥Gh÷fŽ÷§Ü£l˜r2EäqH¯Ò:_é´½ëÁîu^[ëF G^›ÉÏ/´ë4zowÙÔ{.Þ9™×_§õžWO‚&PùÖ]Ç,årü2»Î’4T¹Ç«¾±opʶÃ>ñçµoH;Â]vÜ¢›Y”¢·¤ß~Í[˜¾Ñ/¾;=¼s§q–ßõÍÜžƒS¹S.k:žñû“Æ1¤¨7FqÊbÞw¶ÞÎ:C¥Ä àÇZÒtX —“]’S „¦Å€UÀ¥¼<¨‚(Fi› ‰F!ÅÃP¨‘(D ¸Q‚qU¶XY€î˜ga!`P€^À§Å [ÃB†@XZ$& Ms Ì}øÆ0[bwÏ™E%ô³Єޣ5:ù¨× ÛÐr§.†NŽ¥¿NÜœ&xx¬¡²ËZ±WÔ¾¶ÅÞ˜²S*£€‹ø¡{P3CX”¶ÁÛ$ãB0LÂçæ†²,cT¸?‡o¯ë @‹J1YA„–ÈÃ1† ßâGÖøÀîž|ãœ{ñ…Ên ${“©ëð‰Ã„6ôiëÄæhü?M;à*²œqÅ×µÖC|ÕÛ¡Öáp 8L0hC1j!XáRW9ÔbtO … Û#=X·8ŇèøB\ ²Tí60À„ws¯oP3 ħ…°Ôl¶õõño[zz£>[ùõ}I¥ŸÂ"’zQ}¦4ßt8±Ì¥L²gÎø¬Ed)DÄ:m¶`k¯<üxpºÍteÍã›úùpLvk]Xãn9ÁùmÞå¤IɵhHî¤PÀ/áJмÂû#@,È&IÎØh: úÓ Dã ád> f²“UT=¥b~"*'5¦V2"(Iã5ð)·OzÂΠyeæÄ‚¸¡±lÌŒͬg(ÀC†øµŒaÝz± øsƒ»é’áá·¾ }CŽÇ’±úDÆý3ŸO^w³áÛ°âTn¤gMs‡¿ö©`9`)e R°D¾3¸O|¯¯¯f˜¯oì y+Beå!óÁ”Ìé÷Ná[¦:E« €Ž{=r â €¼iU@6›Äaš(À WŒ˜*êq°‹\@,Tï­ï»ÝŒP˜g«÷Á=›ÎŽ’Ð9f½h:üõh§P³ç3œ¾(ê”)ŠdcºLF*bÕ_êŠÝµ†eÌ÷St'Ç«èe- ùizc'‡ÒwÍÇe#ç³¹ÃïoYk/½æT/OÇð!áÛ¹°¯z^p5¥qáoš_Qk=åÎ×30F,0lØ]tçœÌ¾0’Œj²ºêUÁïxÇš¶ãã-'dÁQ†Ò°ËbÏŒ¡Šôf¥~…¢:éËØLlj› Yl¤ñµ¶~“¶ÙïÅ[8”²vãXƆÆð Ààp8O8ДEyw…|ù)_7M’ÞËŠ GDQÔ}æ ‹8gÖ)¤dh0o¨S‰J„êžÝÉwU= ñpÑå£ËȘçnß19u3‹g>èJŸUFpS>ÆNûÅôf›o¨œÈóH7yôë¶ûY$Am]Û9Õ¬^Ì$¾NøŽz®R«ÍÎÀÔ]w]>K®y‹ä î•¶ŽIgQµá£T…‘Ë®Ÿ,{Þ½´i™PÊVn pÉçk¬0æ-WzãmÐ’AdMŸkvS”N&v«æ"^ÕŽtnNFRJ†é}¶úãcïŒaÕ5ß9e™–—™oîBˆA‹e‘ Ö2 Œ8, = FB@ ‚àP(‹"Á€’ À2økâ$TáZ"ÃCŠÀa-HæðóxfŽõxx K¨vx;#Àã9 8+ˆ§QkŒU•Ž …ĉ Ðd`æj‹œµRÆGˆ33¡Ñç‹0ÉëÔŽŠw×u ø£ÒÃÑŽÚ+ã1 8÷Áµ‚L˜ó«èä€Î0ÎÊ”hl8 úø`Nõª{FÖ뙼zyG§mϸ]åïãÇ–æø÷Ò¦µ·‹0ÚDvÖ¸ßeW¤d5é{sÑ®½žÊŽMáµèíÍ›Ž ³ ’\!vº]ìé9¹F"Ÿ½ëg,0€$¨æ7Ü@a0pÔCt;í'Z¦m6¸@æ¯Õh¾õDïq…ÙîpÊN¢Â)Aš ý}uð“Èzb\åHÌ­1+*ÙCíª•Ò)mæÉ4ÛŠÞ“åGÔk/©nåÖ6ÿgÎ>mÈú =¹гæ²ÔÖð«Ç I7<9ŸN·™Nœï¾é…¶z;8s€]0‰9ËŒ9Àì[5y²"Ðb ûf8$#4ºî÷#@‚'wÍÏ"hõ‘MùL!$‰M«,Xe>Õ¸Aè±»­Ÿ5F³çÍvýÊ>#Ù"†Cè0*#´ˆè;bP#pÓ•ƒ»ÃȈX\ªdB¬a0qp­õ¦¹†¢˜’¹D뛌ÌÎ,áÜoÚ¨ƒtW¿ppxN1'=O#)›ª„"Ëé:ÚXyûŸF?+äÇÞ§ÉÌÈÞß§ãÏ‹ÆðEEm @C†B€Ô²£ù0Eãì¾!L5ò0 ‰üØ êp÷Ñ\`7ÄÀƒ€uã!°ÇÄYX¶#˜Þ3ªAùBƒ±#Ù±ÇÀӠLj«Òå<ë²—«—Ÿs—Å€½Ù§åÆÂúwÎG›’ï_Õ^ºŽß·¯ÞkÌŽ¡j=UšwtrœÊ•SžW‹äOP,ލxq'pÜoQ€égj0âõ;ë6àåóßvp²˜=œ h0šâõ™Rk0ÎKúvï); 沦.ÕzF‰¸a ½FiJG½Í:%ÛŒ¢jÛ±¶-Èå³ÙÆ:=ö<õ뾺p̪uÛ&•S!2„a°¢›®ŒÀŒsS5É€vá;À’À£TƒÙ(†å›¢;Áæ|ÉcxšÆyŒû³YJDÐ'¾E¯³xËÒ4 ¹ ÜK“hì"æ‹§Nt8Ë›B#Ń`bA`)¯$óÙ ŸI3«ó¦¦.x=¦Nyx|žG¢pwoé±—¡²3‚Û€°à#ŠÌÄáÜDŒJaç¥ZÀ$µ‘†,RÙòzœ,GÆPo‰«ë2³¨b:²ËóMmLó+Á0÷í;WnàPà¥Ò…ŒÁŒcă€1æï[#•„ï®NÍ0äÝßLcކ–«Í€a €Wåzýá Ql8àì'ᩈEÌ; 4+_¥’dMª‘ù ‰ñG¸#yg'Õ¯HQg{5Se×b0¼çe»«:{j‰üÚâéŽuíÏ·§ßö}ùóé^Ôc$œúí¤¨ˆ»b1dMç~½züzzõíß¿6KǦ™zõ°hrÒŒ`,€+ׯwñÙ—ÏããÝ÷Þüþóèä ¸¹™˜µ™›&zØa ¡Œ `µ°p§Òùø\AüJü(ÄįX}+•N2Iú» „ý;L³Q*Äì ý¢q+Kïj¡â8ã÷³âÏ1²7 .­ãYÏšS1óœò‹ƒ„¦CnaHY™H2+µK7†FÜ" ³º7£†Þ&O3ÞMjºq]áÓªf8pù—­!̈iMzû/©z=±rã’’gÕ)×ù6ç“9«ªœÌšùñ_çÁ/:ªO“;~‰„ÖÞocl¤|Û Òt©©FgfÏ)µfcÙË1“0Áu>ÜfgR›ß+’Ì›âe^§—×O®óf¹s­]qõ܉ªÈÛ'ÑRxtu—ÉiËÖÙ A L¬Ã²°á*tY ¬Ò/¶â)Ý·(å2Rí´WË-ù§Þ£ÈbO“1@ˆcg¥^©ŽéT5[ÖrEØu¥d&Tʪt¨×jqU…DÝ3<” –Û+<'e”9ØDÅÎ’»9âr<çK±ç|Ëež…kÕý®–¾ðe ÝS12ÕIž­²òfwuòÐçæ[.‡9÷]ÉÉÙn ªܪüíuÜXd{^W!aôÝ]ÓˆþP³LÍ~‡“I¾#êG‰P¦º’[ÚyæÖ[h^NR/µµ¾G.·r$&žFú‚Z̽çvÝN\Äj_&UËä­óiÄF¨¦Ô&•(II§*—§5QWFÊSZ{È”XÒó™Êñ·EOa²ë³ì;èÌ´NUt£B3;N«s¹~C¥nK­&™‡ ˉã¼K–Q­d@ÔI2Z^²¥¬å¤¸y~kNéaÛzšf ¾sœÚÂÛz×”š'KåÁöŽZu6øÖ£ Ï*L5r3­Òfó œ­{‰w[€‘ºG:}>¢õ”r¶&’XŽO+g/ºÎõšžõ¯·ÞUï_Ô`¡ŒXôh÷.f$Ì̼‡•ÖƒÏx6G—‡C½ÍÆg Õ^Šr =Üá®nàaKKª…‚ËPªC½š”·7°ðBx܆ùÒ“oåÆà™Ô…/^3Îå&%ÂÄQ¡ÖÚ7„Ó Ÿ,ßÛçÁà—ÀçÏ“/§O«ô~²—iŒbCŽp}œ]Ó8!ë3/ŠÆ0ä fÛó)úÖáu®`UIE:H†}™å™Työ`Ca¡ƒ¿"™yÔêƒSc4€²íæÜó|ùäŽ/o² 9ãLbȯ^½|Ç^ýây³J‚u•ÆEóÖý»vó;w¹ðéÏMxŒI\檤aÙ›CEHR¯îšª®Nî×í*¤u°;^ûUéÅË»°ì`T ?©ø'êþ˜láÝ>oŒ­ûä &;ë•ÙúœöÇôÕmäõ)ÖˆpAùŠѬH`Ðþ¿_­p À à`úwÌTˆ°>P%D(€GÀQßß³ £#ú¾½L á–Ü0¡úŸwäôilŠ¿FŸ©à Hˆf(þ¾¦3i}Íyö¶ó¥Ä„Þ”¢òá ¨u›Ò)žWzšçˆàÔ`"%…?¾ý‘cð `I|umýÖ´Ø|$~;ìtDuõ2»ù#“,ÀdjVQ&þUdXåŒQ2¡èåÝìYDŒyüêjœ+‚këkBíÜQソž!wˆg%áA?',’ñÄFÝÍ»E£ XQ»-°â:ãÒtéóã_Çëóz*_V) ÓO–ä<ÊÀ ðïßmWÌbq‚"—ðÃ3qL ’ƒÆ*•—4k³I¾žPúxëÎÂréÏi¸ãžP¿t' àÙ×*Ú$nl@Sˆ„ôªÙ ¿JùÒ¡¥½IâÉMªòeõÝöc÷Â˪ÏQ…µr:Ü'Á°àB Ž ë£ éÏ_/î?§üä†-Ѝµ#Æ{&¤Hïó¼úyóçÏ¿×ÇÏ·¿Ï·ˆ?wÌ37¬Nhùòo”ÄDds<„cáWÞ÷Êîñˆ8ŸÄæfp2ªLÿE_=U À*‘# œR2!4NŸ…ŽÒ‘4‰z¨ƒô|ŠËŒßæ¹í¹Ï^η¾B&û="aaá‰ÍögãßçïòòN01•D;አ×nÝ:tØîx]LQ÷_?9ÊMƒŸ¿Y.ï\1W_¯Þs›H–½ª¨pYšŸ8ƒ_»VêýÖµªƒú÷·U]é̼ñz!ŸfÌcÍ ²›eªÏÙd³ÐÚ‰Vñ鑨ýû‹^€+ Áâ0úÈ,ã*¹÷ïÜî°9øŽ_Žs— ½T̬ôƒò"6$UxÌÎçÄQïåÝÓò—Fª>âÃú¹h@«Dðüop­P=ÜÄúÑ·„p‰ ³ìЃ1Aüä+OášRþ¥íóº¼ÐÐr /ešÀÈ >ýL’ù¦ˆð‘æm@rýî"Ó³,8"½µ¿Ÿ´ãZ|›Ï{3°‡në×BDu"-ueškò6îh& ë¾µë|ie’k&/ŽŒ>ÌcÀÆ 0>;ÚóÉo¾ß¼µ¶WøˆS5:¿—ã[{õÏ~ƾÃÏr6Z——ʉVü:e]®ÁVÜáEÏ#‘N³z ›,“æ´såI,КØ~ê#(ŒÌË&¯'=m¬B‰@sl+°Šñ“%"ÚPçf“o«8²§e±Zï+HmÅMÍ-ÑN•bÓ"ôóÂèÎÎùÞ]n&ã+ ñÕãml$÷4ûU8>š¤tX†£uf~V]‡[5Y~ºäã`Ñ2q9®d÷|Bä¾ø}‰9¸Íå‹eT†i=t];$*"ö$‘íóÙßo[iÌdÚ­dG6˜Ò¶Û°›“ÖðÀÀÂ8kŸþœùsÏ<óœóËúÀë5h¼¼XÙ&Y± 4AÀ‘JÁ„‹ ÁU)D„ ˆ.T ,RX€¢0XXŒ60â%äJÅÙ)U`2 `Ô‘gX–v R¶¹Y·<¸pÆ3«µìjWgmºu™ÎÈ'¿<7F+ÞÇ“|Dç•¢êÑ .™‰ËÈ vÛåòѹ橊p‰¤³Y×åï°`Cœ]]× `c#þ¬*ò}œÆj>ä̱‚£r‚Çc!Ú]ûÌcÀÐÌX½í”hV\#­Å€té“ISo_M‡µ“½ìóœä 0é“Ù•‘g>™ä õCî”{{5ñæÛi¤—xظ ¿ÎÖ²+óLìÃ^~V¢q".a/'l"ólRàÀûö¸góKŽ  8…•xSˆ„>ýc’tq€&«@h "[Âþ“¨y‘2‚°½uœ 4CaVQU3…ÎP(öa‹&}:øTƒ2r†T6m"­³«½ ÖêÓ·Îþ»Ípd˜¯n˸‡èhLh¤Â¨1³2ýX¿s£|d>ÛêOÛùâ-›CÙ·|.Ð'Cæ]>1Àm" ã9V6~J…%ŠJ¤ß ÏYtxÞfÑîÍ:L"L_“|/6 :™)GAôzëá}6õë:ŸùqßÓ¤ÕÓfm:’ñëãßIÀrxo]÷ðE¥_7ŸŽoÁ™Ñ˜þá˜}nqèÛAñ iÝ+°•ϾüËѬ£u/ã.vR¬ª›‡§çœZgÜ íí—Ж‡Î;BÆJ†ïD¯(qLúî')MÄs s©Ýás|vu¹øMîrw—}C´Þ°°€£†zL9žz½}¿Äà$ T¨¬(5r  sÚvÀå[§ ÛT!+ê¡z(x´w_fÓ‡ò'?~:e~©m'®úö\UÓ‡ãìõ0å>‹øÓñ”úÏÐØ"ͦ4ŠžPÛ0Çïyªd7žy¼ß}7i ÉS‰8ë>HÀ±TˆFÝÝz†AÁYs‰f o¿ž0p»‡ˆO1¾ç­ˆFÌ<»u:¦é„†O¥ÅÓ¿}aó§o5ªt§%V2ªIdO™mª]i]àÎó§h¡ñ³›û×'88… ®¥C‚£ÁÌ„ú74èàõx87Þ Â`µ¹xß}ÁrÓ1è™\,†;¦ä…7œ£³”²<É‘Q¥À€³}üûõv䦽s*aælú“ólô{ï\C1§×XôÛ}vÄß¶Ý7IšôÛ]nŽžÎaÎÞE$4üY3þ0‚bPwî®í(Æ~ûË£½d!|ù?v&„ðß`¼ŽMmŸå£ô%ÉÛñ2yJ²Û7M(»£ÄkÜ&¯=í[5·ÚM©–z5Ý{Zôùø¡ƒz‘XÊ%J!‹÷™ÏRw{‰ÒA}"iS òŠ[È»HTÐÈv Fn-»ë{J™UõÆWu<íôõU“N ­ïW{ÎMÝ'›QÊṯÉt³Ú:lõi¼Aö|ѱ9O‰¼´ S«Øõ›q54O<ëÒ: y•æ[É{>ªjJ‰Ë'RÌ),—6ÂÛˆjpŠH/G‹)Ý’ëœ5CBXÚ¹›Ë½Ýµ§,NlµdT©¼¦ |ËG4V.o/h “gYøóÕ}ögå¡kzR³­HqÍØíPŽ…gM9–׳"\ø~jìvR©Sµåß«lš–fƒ•L¶T2Î&x‚ßa@9É¡Õèç$x2óR£Í娟ôcþ¬Ô„žÑ"I1–’>T‘X…!PU}-öHH*…)!ešhYd’f[-”¦šf6Y`$™½mÜ“2JP$ÌÔÔ’”$̲É,²@Iz«w$’¥@B”’B”’C0Ì¥$²ÂI Ë $—Vëu Ie’/jÝÉÒÓfÉ%í¶­Ü4Ð’I4ÒI{Ú¥UW¼$ ›¥I{m­»€ HI!­5®»½µ×LÂC2I$“2LË,Úm,²I$ É ÉTÕ{nºK­¶íÙ&níÙ™.Õwz»™„¦’I%(HZZõÛ°Ì › $‘ê­ºº„€HH™’½­ÕÔ*Tu]tÓ@$Ì$,²”Ì*T’BIC3M3$“fÂ@Ó@ $’Ë @“2C7V­[zÚ¯kÚI™%)JZZXw$ P’”3$$$$)BI)I)@LÀ$,°Ëw[¬©RI$ $“0J• $’I RI)I@3$’I*T’I$’BB”’I3 $$mm×B@“2]·],°vîHH$™›i¶ºîHI!!$J–lØI$›6T¨I˜6I$”¯Vë¡&³Y$’–Y!$†e)¦„”¤€i¥–m6…(*HH–Y$›6€’:ÕÜ4Ò@ $ É $$Ì¥$)I P“fÉ«{W¯@ R”$ 4$’”Ì)LÉ$ ,Ì—®ºê­Ü 4{ÚÛ[{É%ÝÉfÀ´´’”w]K,$Ì“30‘ÖÖÕ®æfš:ÖªîHI!! I!¦’’«]À’¥B@¥$$$“fÉw[­ëÖ›^½ëu„’îÝ’HlÛºé™!%) H)%(fi R’J„e™’VV(R†d”¡ fR›6ëVªîîà®ë¦a$ºîI!!!e™¦’HHjjfI$™„€’I™ I$ I!!e’ H޵·]$b¸aQ¹‘À¨` ¥WµuÓ2I$3 R^պ阆͒I$’T©˜HhI¦’$”¤„’™„™! HI™˜Rƒ«®R¤„™–Y¦ešhM£¾«VD¾¯åý·þ0ýïÿ^výÿßÿ–¶ù¢¢ÿ»ŸÑA_ìÏç/éü´öÛîíß¾>Ûÿ¸÷ÈGúÄ$N>ˆ+¨ÿwÏ~î¾/=\Þî~È’$ÖDðC³<¾!é™ÑÏ_hxúîÉ=qÏ?ìƒDÁ‹'Ëý“SÄZÃ*o c‚Å•[c$jiö)¦ð³"¬–›¦þHÄŽs!Ã1’e‘R+ ±˜p™ù£™¶¸`ÈJ²\28ŒkVÃ¥_Ä66[t¥±ß)œCBZm.±SZSJK-Yl–Ç,1pHÂIç@[8.– ‰˜L0†Pç} àL„ªJB‚’„¡¥ò”ôøžžÛ,å‹öù(§áýø«áº¾8tÒ-|àS”WÂ%½uãÎ_¿ôó´|O™X>ÿÿ¨goÊóúI¾è à!óüz}ýõò·bv³|8z|Þ¿ƽ?'§À„$ö ¿Ëô¾¾?)ôœöúôö{ÉàƒŸÎãÂÃòÞ\9‡ÿÖ0>@u²=:Œ `ßçù´pÈ”²TWb1bRÍTÀ’%2T °13SÀ²¢1pgA‘£%\‚ !$J¡Œ0`rÿ{CD)´–ÃðÖ$ìb õŽ i[2Œ• €¡BØ­wu‹“ºÆ¬msgv¬‡ þ2¦J r%J2U¥S% ÌPÈ2DÉrB²E2mbбm]Ýj.j£mW5\Õʹ©5ŽîÑ¢+þV¶ªâJÉZRÔ¦ÿam]iJme”J¢©fåvj›2 ‡|2U!GÃüúi€%C0ÂEŠA %TT˜í$ÒDË4ÊÈ+BH˜i1Ä »ªêä)"¹­cQµD*°ª­³$P»‚Éa™S«®?I+7Þ»\Ôj3å+½Ù‰dEÐ\“ô2bXTR¬6m¬Æš˜®ÔšDغK4ŒY…B‹*Æš†¤ÐÑ» e$!X6VÛé°Õ¯^¯WeV ml‰1£IY¸a¦™#e†[ $Q¹5!ˆµ²›˜Âg gc4C c0°1ÊLXad(ÆjDçM-YAƒýÒ' ò°j4”â`UCú«+ÊéW—WVÜ™,R±„¤±«®ï.±|·ÊöõšUš¦¾MºOWR–Ý( ÔŠÒÃl“ KVÒi£©· “C-e$JL&Å’î.aþ6},XŠÆ¢¥½|“uËK¦Ã XXr,pp0!7W 0†”œP,F£fJ™Oè?Ÿ}ûã-?“§ëþtá"!%‘ðøw)¹©ïÁû/Û§¿ÎN>Á²“_]N½Pϳ_Çáö¬q†r}¨ÆK[kmÂð_òA4ºf L60QÐ`APFÂúi™v ȉŒÜ –‚YHE€aºˆ‚®‹AB  0´,‚“+", ªšn“ ›"I¦øý‰õÓ›%èåÐTR³zIÑB&qRÏÕCú!ŸN¢RPÍ~{©×~4ˆ² n‡ÑÐ?æë‘-fýª&¤¿1@ÞÞ| ƒH‹¸: @”Œ±Q‚‹cFÑ%×iµjÁPÝGM˹ö7#º"OO¼¢‚ysîzõþ—cÇmÏ·û¼E8éo—oT \ƒkõåjÏŸ†Œš—I •½4 *Z¨¶dÒ-Ód5äÆá©gac}eDÂM¶Æ¶im“kb4.`›˜²¨Ö•UA• LÅ0•w(Ñ­öCr¥`!6Ó¥¾Jõ³f×\º»2•1öãQS—$àrqÄiŠÊe%&,‚¦è¬h×*ÑxdŒ‹„ÁVJ²%„JŠšLW2k¤•¶±¨,IajE8ýÞúCöOÓÝŸËãõºñ½òúþíóp, Ïa~ßY'ÆûvèH÷ü8‰Û„Aü{á#÷ù52üÇ¿˜d3¤Aå8ç³™üoÚóûñÓŽ¨k §‹žÜ‰áǶöÜî"/n>N:“ïRZ~ ƒVöL«2h‡â5 Ã?ć Ø"s%w4^¬¶K¶§*è5%v•paaÐ9I‰ª­¦VEf-…IK12dqGÕW'(§¦RU*¹ƒ$bªÑEmø´µìÍ“BÆŠáQ£F1jÒä–¥jÈML&”di 4´C¡"‘´’i³ 𲬋 15&H)‰dà Î/ë\]WLæq8œÓ† ÿ&ˆ^þŸ—·þß_¯Nˆ¨½ü„5°ÁáûÄ@ß×ü‰¦¨•l­u'çíõøö9å IÓ¤ãUû5žLŠ~ñj2 ”9øVäà¯E4þi9H(–BE$ãFß\5*Ö™“bE+„h’2I2 ,8 ñ1mÿ+ð—DC_Ó¹†Ž¢ucú„š$Ûk"­’E›)†ht+a½¡—H²Ã柾Zx<'2ÃCGHÙ¥)d‰¡aQA$0ˆ+$P-­ 8²N BQ‰Œc“c#†&88,«RΊÊÁš52C 2±¢i6D6WÞ‚ý ýÑücãgÇ/¿ñýo®Þ±<¬•C¾þí½Me³“®œ>å¬xýoóî‘ÇNç2dð­+Ï\søÿq¯œt§e˜ÈÇÌ pƒÆ‘™‡6ëªì©e¥»Ë={kÙÊàXްÁ4†`ÅH@šQƒPh1Ã2Ó£4¨²XB¨™%”V#øÀžä„˜%V“cŠÊE$ÁPàÒáp„cêK.«´lëËrÌf›Õ;¦‰Û[llÃ’ÒÄ„dm ]µd‹Jé2$Úh˜ªn`ȤÄv3Ðhi"I1bUÛ­w§A²VŠËeYí¥R‘4Bìa„ °bEýa#w‘„j¢HÊ?ÛÔôþ˜üuÛ÷þíwx'”bµ9¡ Õ$DgÁæ¾}"cñêBf}¸é÷ÑÄnN¾^¶ïhfÊÙ¦•Ö\’.ÍÃ{sSÚõIuòëp/­WRn²¡’šX.dÉqЦ#Å3,sAitİž+ÇØÞ*»¾ ‚þ?;êšû?›í׎/§Ó“Â+s.µïö8öã¡÷EEæðþ~_â~ðº‹ó¥)VXù¿sè›§÷ŠÀit²{hG°P»h®µ®*eFKÁÆK&hÚŒHQP.ÇÇöÀÎ>NüÛncÉä2aa’]èkI¦MMâ1H/éúþíÓqÚwoåîÿçL2ÈŸJ-nà é˜÷ýþ÷oÝË­öÕ(¥ *|tßßÏǬOÃñ}—¡ædèO~ÑÜÏ¡­Oð/¢_`2 )£ÑŒ‡É´ÿ[{JhbR”©‹1%dQ6U'E¨ÀÃX–w0MìRnȵfHÈÃFâMbkFöêõëÛºÞ¦êM«u+4b¤Œ\-I‘’Y0?vÜVƘa•3™–8³.ñ$FÓR¦ Ph6  •ed E‘”LÄ€ kI¨Õ¯oYEz¹vY¶_/i&ß’b!¸&ÖbZ‹E=ÃÏ_©¯c<¾™žý4{üþ[íúg?Q}ï+í‡õ=ÀÛ8ü¿‚ߨ‡ û„Å:ÿ÷ù§o/£ù}õ~_:mÓ×3û¿PÓ·…çïîx=9Ϲ撱’/ãŸI~†Ààš¨¡}%B*Å"o†Úi¥jC¦™2ªKXb1‹a‹&ÕŠÑY$ªQƒärš6nbc>ѤÔPV–&Bc.™t†¾öš÷¬·t–¢ŠÙiK‘EœK4`º&"ËW3#F(²2°Êbµ X¨²iÁC€˜¤h±p‚cB!ı o^Þ²³Õs¬§Eêk­Ö˺Jh°S\HÓHZÕ‹e>ªmÛ5f–é§Y‘™2;k¬³1M6VÕ!0—õÈù~­ùõðo>æyëéÈ£ñ¿‡×°=TWËXvÃÇç‡ç¾ö¾Ë:%Õõ>ó½OaóéÑ .E52(C·¦†‰eŒ12‹%ŒR¥£¥Ðq tÅì¦D(†ÄUË* *\VE,a„œ4ÒšK*âJLpRh–41—HªJÐhfKY Ó1ƒ Xi¶Ú‘¢hÆkXÄ•†FQ­&k µ&’šu)Ba, %‰o®¾¥²i„õïU­òžmIÔµ–Þë{%^•Íuu‹ÙÑ_%Ùf¥ÇÞ­!Z21xTMJ…¥>­Ûu+¦Ü¬•*¹mÐ+k™ÑtkÐøž¸þïÅ„W4Š‹ù}þ†Ü}<Îð—å×ñîb=ºý´pW(|Q6òçËuñ×)Ó“©õ‘QzvèzDÈDT å(Y6 ¶,}¥Ë>Ys*_ ³Z~xÍí© cFšY2SMÔF,šM1RªR¢Æ©ŒC 0Åš²bÉ0˜Æ JĨXÉKUBÕ¦,À\]LjLjX”Èđƕ[åÈR |¹Sj¬ARÅK#Ã4¶$&~¹2B]pÓRh5"‹!šTÅNfDÄÉ…›be¦„¬Òm¨H™’¹îû ‡ãðsœè¿Cðü;‹¸†)ÇñsðéuÇc§º÷ýzwòÛö÷¤C€…Oˆ2RQi™a£0eDji&‘ªjME‘‰U’JŒ2SFD©IôŒI‰½ðÓXQ…a+10ÊÆ W׆¶8qLFFȲM‘RÌ $Ôq72c,Öp\cI¡»T¯^Þº¼¨·­É"ÐÖÐñØÖÁ¬DšZXb¡Ý`GuÚ`JÙ˜DâBn4lâ+®±˜ï!Œëñ¾¹öÑîžÝCšd‚æâ"óžÛ¬b*.ÛA£ÅGÃðô‰²E_XÆud2¥.S”»¼ [.¥K·S®·¿§Uß,Ѝ‰]f °´bF&ƇSnèX˜phÒ@P Ž)ŠC$ú2"ì\m¨kŠV£·îóØÙ‚Ü^™¡?²ˆ¾s•žÝû{ïéàtPùþ]:ž~"Š ÷òûõ4)éäwëÙ/¯ã¶È=yõéÿöüuöùŸÌö=Ü0hH{²FNÊÞ%-·«i5•t,J"¿›WwWI‚„çc3d¥Î;»DÂ3 ’zM:Þë€ÒRo*Z–»f·n»]R²Á!) 1q $M`¹FÆ++²• W]tÕ¥K$ÉQ`¬˜e‹ F %p… ’™H030S0К])q•4bY"¦ÊSl`ÅS0Ñ£MCI©¤Õ+"ifF¦i3V0‹6×ãœpÙQÀ¨Ä˜ÌTª¨Zh‹&aVã0® llˆˆ%–)H 7Á]6aŽD›œ’µÖ"¦í¥uÙ]×K}3” ®"i:T™ ‚Išc“E™ÂÈÒ¦ì,i‘‰hb¶”Æ!¤3RòQ¹m²Ž»œ'!‘®5¯ŸÐ¹!>Áîa¶fqïï¿ã·Ë‹µ½ø}?ÝOEtÝÿåߪöüK:þ#èkÛ•ârƒÁìÁT94¯ß˜vì÷ão{žøö»)gPåœ÷Gp °3ðóðšì`¥ÓîÒGß¼cȵQ–Šq`¢?Pì¿!vP9)? d‘&1‹0ɦiI¤Ê\j ‰5IUZĘ1Kï"F³Fâ±RÉ8CymqDlÒíÔº•õ³²V¥5z»›&! œm¸`²c0N.˜•YVh6MšQw¸Ó K“,¬°”– †8,›F‚Y—fmHie1Lap©ˆÉI©0¬Mj0ÈB‰‰•HÒÅÔ-ˆ„‚Q¡@`‘ ‰1ÃI¶2 J˜Ñ¦Œ# h´¶+ 2Qb£C#ùÓøÁDnK$ቢiQH½(Ë)]“J“CF`ã*,411RQHÙ'}ÅÄ7’i¤¦EcQb6£AmEFƶ(Ö1¬Z$Úë_Z”ˆÊв¡¤ctÂŽ¡ ´ŒêLU€2 À…I…` Uˆ2DdICT†!D32M`ÃV1E!bI©`ŒVKZE4n¹©@€0‹À Öž‡saÞR^ `PÒ2$NÈê &š(vDا"›‘jád+‹5RfCK¼aƒ4Æ…L rapU˜Ø™+CFÆ$U°²±*f’´ÑMI™c#reZ„aSHàákca6ÕŽ¡%8l:Š-–G‘B$Ÿ‡ä^ÿoË>¿gÓãÓúüŽŸ=ÞQ|ÏØýwÛ·ä"/—‡Ûíꢗ©øæçO¿ž~½£Ï䢿/ˆ~ÉJSQÚOºtLâMŠŠ±dp`‰<I¡x8h<«•õzÍ·W²òºÜN]bÎ@ M¤(LŒ„&˜%.Ð’¬›1pn1>_Ï᯵ú=¼#ÏMsÝúI?†{í(‹äiBÐÐ’¤°³E„Y#˜^* į̀Æ.ÃFÏ&šT"m‚Ö$®F˜]RÙoÄøAö|ü{qÕzù¿§®ßxU‚ÒkæO„áÑàˆüv9¥SÁB•b"Â(Z¨JŠE– `–„`RQ"…~ëÞŠï{©Wv»F"$ÛÕ1ª¢©õs¶BCE6](?Ü!&ãr–E›mLF¦ªpÒ˜Èû`Í6&8ûB'¸‰" ÊnrBb’Äš)$ô•5Jnû\ÛwuNë˜ÁÒç-Ê9\¬dµB5b2lRTh#¹¹¨åÊô'{Úá…1;®­£Úˆ”a AE&A‰˜˜¨, Å4K–ªL–5M#$«‰ À¤,¡¥•C”!-Ê!¤]3¢QÈ JŒ$W0S;¹«vÖݪ›]Úš‰¨2¬…¢Ø“B0R:PÒ„ŠÄ‹¤ÄÄ\”p‘ÑFÆL–-Jº«‹å-ö …º…q¦ü§û?Ã'ÙóøÿwêéØž˜¸¤…$Cûÿ0åнÛÏÓo[˜öOÄ”—°f•#F‚,h«$êLÑJZŠšÙ¦¤i5¡¨ÒTa.2M•jN"¦8„Å*|ðcRqÁ¶än‘ƒ(4£SPÖF[j4ÈÁ‘©†Ck'hÚÒoiK"±†Ú­•Îí•Csfæ’X–Hp0“WN˜²ƒ…ñ'N™0mÉɈâFæHücA‰ ) ¬EF½»vÒÔÞË&é:Í:]v` ØN Aðª(œ¡&E”±*šac LLIXÉ-&ˆ$h\#`œ$Y C,8âl‰÷ËvN´¯ªZïc FÚ^µËK]¬Æd§Y¸ÅêëkµÙí(Rפ‹¯v¼Ñ›|‹0_ã÷úçÙõ~ºAðýgÁéÇ]çü¹æÿkÏ¡ýßOÔLýÈ©þ{rß»÷‰ð§_×úûsÌ}O>§†vëöþ]dI9kž§~á8¿läb…¨ÚS†`6t$åº68D.;HB)¢œ2‰Q~Ò anì[Â!23¢ 0?§â~ðð£Wû×p×ý•Î$\Å»ÿ,”ªH_ý-ÍaÉ‘B `Ô÷ÿ¿ýùý>Gÿ"où¿Ÿ§ýò‡ÿQ©žü)òL{bˆçõ\Åָ̫c;¸¶ëg³\%Ì\&rÚ À²<û3Îúk»vxÞcÆ’½¤šUjow-Ê«é$W{×;Š,‡Ä=oH¹#Á/|×Mni5!2iõ,òÚ×&Q•·U“Þ¿Q¦cSº÷}ñ±^UÕõ·1žMù—·ÏfÕ­qÆ‘}\ÕSè¶,ʤÁ¢ ¬–‚vª¢egU k›ææ5<7°©ÂF¼ñïIÙÞgŒ¯Ùф蜊Tˆ š:Ô#×BfsvÝŠ®a½ÊŠÒ:R!uôS³ÿéÿ·ùýý>ÒŸò5öWÛvÿ÷Äâ‰óo‡»YÝŪUZUZíÛó*N9Çtñ©<)êm¦*ªl§þ>Ÿ‰éÝÒœåÖ“wµ¿ÃŒ%!ú•ïgx6;u$ÝÛwvReÖL»{gÔJtWSÕ—I«ÉwzßÍ?9Nº›¬Ñy¼Ü›“$kO$ñÂîÉ׉×Rwal–C¡9ç/Y¥äÚ}2ï!|·Ç VIטáµ'=aÑÖF¸âîKÚ:3¢MMtíÒqÆ3³†Gz3jÉ£¶¿ª?ÂIáãŒÄ’½on¯ˆ›øøfda†”Ãÿ1Üq ó¸Ìà_3‘;’úªú¢=D„tüþ¿LûŸý¾÷éûkòéúwëû^¿®»ç§Ã׊ÿó¢2c¨J¦T¦MS.5!6/>xXX.QѼˆhè䎺q=Öë!'šŒù2Q.ÞeºeqºÎõkļÜO¸}Ѹ9*SS¤rT„n¢&rbʤZû–ÿäÊ­e—=eI,‰´$QùÁó¯+Ýõ³ Ì„"¢ã6E/®x°Ñ½j™ÕÕ]C×Td›ãqß(„郤Gé9¤Tì‡ÈŽ„ ’ŒRÆ—ŠÝ#Ô’uL¨]Ó>íîYâ•”Ñ]xDªªûÞÔ—)~©.î‰ê…ÓõR4Iò='œÁÛë¬ ržB!øF'¨ŠìAŠ\Ð=ä*“àÖÍiÅM_™‹n<ÊÑϧ°Ù\òe¥®WWNWÃz>jK)VívÙÒX,Ðrty>Zfc.¼^Ú‚¶«:V’å­:ÄD\æÂxŒ†HC~¼·Ãë@Ÿ> ñ<»2FȹêŠêÍÕÕ 0”|éw|Öô±ÉÌw)ò¹çà'œ¯JUƼÜ{+ã¢fŠÍHÕ˜rÏ$ѧ¦Ñ_^YçuØéêáµeÝêUÏ´6Ü/#ÍDfÜ×fÚ._ 7/ÎÉùƒ«<Ñ¡ l2¨2?ËBn]zY!fÉ\ IT`ßt´ÚMªœ½ÖæûSËã¥w.ºSèäf|E­Fß*iÞøZœöÖ Ð%ížäëÍw7”ó¤Ív¶Îê7Á~D›#¯„ÐS[Þ„D5Æï99殺'»Œ5Édf#1Ó)~lݦ)véH¼? ~Ãêx#ïÎ˓̵B%SOo±íèî­~ýåÖùÁ°;Z¾µõb"/¾Fk\ðüæü.¼R¨žõqíÏÁ?Çýµ5IþŠ ÿÝûµÓzþúb>F^yóõôù¨×È}¥>eþŸA·úåXŸh¤Æßgg¤°S[ ±£üÁýãà~¡»ý…ÒûöÿÞ-–—)ßhÚÿOùŸÞüßÜý¡ý?/ÇçÌ#£õwŸ¤ßâx¡b  ‰òü~O³ê¿ØßO³Šå´û ïrlj}Ïä>fû„Ε 'ö%ÌqÒþ£6kŸµâñ¹&ä6@ƒRóÏZæÞô¼{gTGúJ(³œ‘ù‘ ëñ³ô-tqæ7Ì2¦bgK>ñY[bzŽñK¸Jõ.:—&º°u:ŽÚ:Ä€l@±+4]Œà I”‰ÄdþIÅWûâOÏò`â?Áû?çþÜþðõU e¢!cúÐýóØŠù£ù ‹ŒÏý9úÛ÷Eüÿ’/Ûùðg÷þ!¿l—mÁÛÝiV„RT¥‰hKÿ01ý?˜Ûi:ÈÙuÄÏ…Im†S |O3,µý=Bó”Ld‹Âžý°_Ã`Q`Œ~Ã×/NCÉ=ê?© ýcò¯½‘ÖåJ³2â¯WH?É9}:|}§Çãð,’”2 ((0Oø:C_¼íþh/ꛇt>ÿ‡ž_ÿ”ø¡¨ñûGÛöÂðükð?½U¿~&óé5Ä]ß¶tÿ–Jx Æê'(AË„¸ðcŸÁ#›Ù塚¹‹J… Ù…Íñ[v…¦Qñù~#ã>ü}˜Çá…ú|¹ëè¶=™&Sã^¸ž½‘íXþ„ÿ?ý-Ô½; tºŒ SmûÆTºWç>èî~ÌoJÚ†? >C­^pøþ¿xÒ‚r=LHõ>ÃÀ+¾ý“ÅÇóþ ê0êËb'’”¤âD,,K3û˜9^#9·}ƒ©üãáýG÷‡ûÇNûÿ³ú‰|Çþ™ûý;ˆ|ÞT¤õ÷3ÚÝ3ü}!úΣ蒛>ï>÷¥‰ …E Z ŠIO¤ âÊ2ˆÈK^TYBJbS$<û*OýÑß_çöý¿ë†ÿ7åôOÓÛó™Ťˆ=â$È(OYÛFìaû×áëIÝÕºÃRý!ÿþËÄHW°r9ø:ÆŸ_šÃöA_°˜Kà4Ÿè‹øÈ(ºØÛð­?/bÿCîÅPÀQP'¬ï•?7à„@ÿêpôù¯D‹ÁlÈ;d®MMuSÝ'êæ 4þF&˜É?n©?ØÓUù5<ïë8=œm>ÞCéiÕôvô¥»‹h:›lE¬±¬š*4Th¶­%%±$ ÈÐb—éu«È1¢³–í¿.&Í4J ’°lË5T¢C^ááúÇìR9I#ö‡Àÿáѧæî:§SÆñ“óo´‘ü&çG»ÎkdðìÝ'YÙ÷éÿ´;4ž“U )ýò–X‘òx’ubèp//ÓêõÕ¿|þ_¹c˜e‘Œ‰ HXˆL¡1²È 2& „¥2JFJBI"ʼn$ˆF)„`É“‘1$””A!)€Å0¦”˜š‘L"$Ä…ŠdCIlHlILR@XŒHŠ$ɰ‰$(Ã@I3”³)`He A$Œ’`Pe ³)ƒ(ƒ#DA‰Q¤¢&dJHD™%f‘1™€Y˜Rl€Ñ’FH„ˆ€ƒ ˆÈ@ÓI)ˆI(‰˜d”¤B!`0S!a!df$ˆa&IIˆÊb b "FIÈ@€ˆM2)2E„“Š’@A ° ‘"‘JF)H€¤ ‘Í„ Œ`M$d‰‰I ”Â)c$ H2eiŒÁ‘!¬²Åƒ"lX´ƒ0%bƤA6´ÖÕI2Em±«Me¶++Me)jm´©–Ô°ÔÕ0!0+J,ˆH $„Ë&ØÆÖÒj*¥±† Ø”™¥Y©³m1¬¶ÑIJ„‰e„F* RqUKlÍ5f¬Ö…´’-¨ÕJÊÒ¨jÒš6¡ R‚P2,‚4ª1 µ ŒLĬ H²‰@Œ2!@*ÈÊ¢%E“T[j6Æ`¥i²‚›*ÓFmRZ›e¦¥5¨©T[fmª+QJJÀ- À¤¤JÈ’m-6šU5lÉĘ¡)i¦BD%V‘„T–Ú¶1 †$Ä“FIŒÒ`…¦LÄ@I™%2B„I‚"BHf!‰‘ˆI%…$†BE$%bS(Â$$@C m`ÒZZ©MP¢ 2‚*e !É(0c¸“Š»Š;ÔÊý|פûaæ¤ì—¾½ÿ”è§ð:Éu'©øøéòê½=~x‰“¿O^\¼Nëâ$»þ©ã¯©ÛìùÙÇÍò>¼ÏÕêùÃsåýAÿ?ü?ÖÉÙ?s'©ðöôhȈÐÇÊ2}0Éþ™‚q¹‰˜bf`8JI¥Yþ[èIcôò+çÿ&Ý·?ú9†I)ÓSò>Ácù}Ôð™SÖ$ç|0ýŸ£ªÏaý‰×ß¼\’çV‰wéó÷ÕòŸäœWgø¾çüwÂBÙ¤H‰Ÿ˜›D9±<ãŸb'ð£˜y¿ä¹é$;G_Fmý–F9>?ƒÍWÈýsûÃúÏŸ±à¾%Ý" &åE‡ü¶?jÿ{æ~œ~ß™ûÈO±:Bi+‰ê|Og¤Û¡·³†Út=þ‡ðŸqßñëu»ôW4Aœä«ün=kÖmnXÎy9rý|Oçûxì¯ã?£ú8ßÙ3g“}ùc“¹øGŸñB?‚Hw²>ÉïаN&*š?ö~ê|—êitsíîžéø#éácæöC—!ð‡—ý~_«ü" kèµ£>qµ;9ø†Û@ÇÚõöóø‡DOcCÕæoÓdÏ舒 ǽ–&kÃïxˆ|ÓäŸ×â|×èî)Ô4ä¿uí¼¿)zF"ÆrO`úãm·Óv<¿<ºàtf£˜”*21o÷éíÞAf/ ¶²Ò”V¬{ÛætÜÁ³^ÓppÎ!èA0)Ü3®Ë}ò”×3ŽUr¹, å–Ôx•*GD®Já©£Æ(æÃ7«¦ÅU„Ž¡%ï«çÅ»üúæy0\¥Ó"YYšó áž…ñV„)`®Íxño/&ù7^¼`yÌ—³Îg.`Ž/d¹ÄáÙi[q2xåz¼rìå<^òV»t¹˜ÆšpÎ *ºº1Ю*Øã&I™“IIÁ+ƒ‰Ñ´(ð“§·àæ›òqR5ä÷dzI:~OÂ)Hp²Ø}Å=¼„Ã8Äó$¡íWAÈpyy¾2x;Ar8ŸÐäó?öˆíbTZ©‰Ë´lå Ÿ‰âÚµ ¥µU,¾­§¢v‘ó²ØOÀÚ{+³pˆù”U¶mÑVÔY¤v•õi9púüiï¤Ç¬DÔ89HòðIa¢zî~¨½×JxŸ!¾W==ãèª ‡ìéú¯ôÿdoÕÏûXÚ§û*é¿âñžÆŸ5 ákû.`¿Å _Ÿ–¾}nïMíðø•¬ér_WbaÚ&ÐM¹d¯¨ç“ÞV覲sÍhgQ3RįÞ>㷜ݷ%ª¬¥k¡8²õ“Ð]ÍJöjæuÄQ¼½s¾Ñ9ëVÍÁïºôVd{ÞîÝ̵ͧ’s7ÆîZü!õHÛÔõ.WË‘š+ØÚ¦äõ#5ŸÉ)Ù“^MÝuv§9Ub³E–²s•Ýg® ·+1˹cßÎ[sžÖnáfÂü|U7×mZÄæ‹¶¼™(œéæñÕÊ,®Š·À­Ê9T(/<‡™OlÊG¬ï[+ÉÓeE¬í™¿´cÀøßùûGÒX‚Ϭ=„å>§uH¤¯Ò'¾ÓãÏdÕ­'6î¹ùýt¬2›ïè 3®ÑmÎt$ä>CÈ´ï'3u–”͕짛ˆ¤®‹JNŽ4˜SAªÞé'±¶|²µrßÐÑ¥Zõ£æ2¢vþÕ\‰#[ŠIÿ}?/zS切 m{ĸ…øžíwq_TוŠ/{òånzÙâWa_º6C4œm+ê,ï¹v€šâQÑ!Šƒ §@âê–Èž‚cáM4¬•ЀWÑÍïCum"ïzw§ÒYwDbÇH$œ–!­/ÃÑ™7†'}U›>÷MÃ[lg-ž(hZ¾¡ÄuÚ©–Q•Ê«Éáqp›µŽÛ7ûÙäÁSÍ#í—“ÕBÑ55y ¦ªï:ïDýmªºM«÷¸ì׎‡ÆƒÈ]?gmÍç~7!JʼótD£™uï—®øéyÞi!]ósÑs Î&›þÖ}TŸ^×R»Ï-ÜijyçÙzÖc™j ¨zã[ün‰ŒæÅ|öjJ=ë‡û“H®D´õ_.Ô¼#;FT¹Mê½W8º˜8“o¸×9ÕÁg1¥¿B ò&ajíx‚9vº½µ6ïsMÅ)» ”n,ÖuiZçi½xüLÜíhÒÌõ—é6òÕl"(.Ú–¥ë9Lzek1¼éëz‹›WÓ½®[ç#"¢:‘¿7º’Æ>ÉòÛoîv@ý£ëRÄæKŸ}Çßv•9ÖgÓe}5oðþÎûÔëÅ4oùSB¾–ËaÙTþ€ÂÓA‰ÜH‚*ë¿î;oŒÓ"x;E˜Wæ&ø†e=a⩳« Ëvï êoRkñ^]¦Þtç]BéåÎ%Ü™wnt'3‡GaÂõÑzIbx7 iÕ9³.RáÙ8»Žž]:3‡¯ì4›þ<¼²ï€ns&œ!ÃKftœ°ìÔð©Ë‚v?ÿ#QÕÇWf2º<=í<¡oÁOáïøl‚nÛí÷×áõÎÿãôõWàx‰û»w\\]ÇA(Œ€¸±’8§ð‡ørÐÔ^HIÅqqD„$$’+°Y1¨È¶E\È’±m±¬„û%¤XEŠ¢+Œš…F1Z2L‹ k,®}H*â`*ÉÛ+’cHD„8ÉD©~´–fãRVÛ‘ƒŒë¹Ì»¹ÒåD¸—»;“¡#XÏlD²,Š„WûöˆèÇ#1$È:Ƭ"Œ˜Â!+‘&ÚÔd$ˆ¢¸Œ$qlˆÉ7wq‰»¸EÝɈ9t”Y#$ÁUc+_@Á6BH*„Yl¶EDdP’H°Ž'»‹Ë•ÍÆç(IÝÛœ'wžqÕܹÂ.ë”.ã¢nÝÈÜäܹq2éÑÝÙ;¹ñÉ Ü×OҜ׫¯{’ûs»Þ×dI%2鵯æÞ%­R›iJˆcM!d X¹‰ BÒ’¤¨®jOyÚÙ•– ‘–P–¥Izxè‚:FYFn‰ iap…‰ Rp– %€)3•¥5zE[ïÚºÔÚ`‚D ¦m‡rÒŒ$²¤Œ±”­yn“+5ÖRÚ¤Ã(¬RJÁ0ŒÓERZ•KYM²©[(…µ++iR+VHÛ{Yº‰H¹…À"B "i0”Æ •„•¦‡M5¯*ömM±­st©°U"ÄU‘j&TsnK R&b°”,–B´!&I¬Ö³2(ó¯; žvD¤yÙ“ Bž\îä#w»yyÐÄÉ$¤M˰‡½îsÛÝ»4y»úví+ zB»º1QÖ *0 ÿÈ\TwÿeT 0åéÜû§ÍÉ "?×¹ÁÙüOÝú~Ÿ\¾úüþ»oÏã÷ôíÛm÷­÷Ôm6¾¡ò쟒 &*&#€Ò³Ý$ìã&¥)¶Q»>~F$´Š•ünëv¡Wÿ/üÆ09þ¸DïÀüGÝÉãûø ëß¿¢o×(—.MŸO›®QòŒïFd=ìùÛ« ™NöJSŽ\|ïµJ(Mñ¡¸¢Æù3ªuÛÞ¾ð0000<­“žKÎø‘ɳómuÎn*æcȧá]&5=_C«úW hÑÞQò­ý s™§}&í ‡mÓQ¯ìÀß¿ekU,ðP³.Ú5o•Xõ 9E=,Èßh'½…Ã9ì‚GgméÍô{ÙyG¦aÞ#®tñØóùý‰\3 ?ZüWñ=?ê¸sÌbãœÏŒ35®MLœLz¦¬SÓÃÏ×ë›ú\÷úgoûcZŸÊ=GùÿÒiuóù®ÛSâÃ_‰ûÑ“þ&ÄôìüÐÒ~Ü*–}¦GJ«Êd’jÂÐc»¸z&Åž'V¤ýå,§C³ôGŒ…ýØ ‹èš,Ê"%qåùµý)ÈøDKƒ!M˜0ÞŸÒ¿'E¿„%p+Ë…Ø¥ )9{‘Å ÚR ¬ÞÍMHÆ9lÙ3ü£Ö¨’†Kô ¬¼tètýsbàè8ó 1T'dÄÀãÐàñΣ² b¹)0´ÿMÈŠ·D";J€,ÿÕ”¡iQ‡„Iœ$â‰L* 0"z"ƒž©‡„¹TQ=ŽOjžŽCÆaÑû‡Y®%Ë“.a¸C4ÑÄ LÈL<,%T„cNÙenî\³Uƒ.<¤òpñ6C…狘’£‡¿ ÞtëqÝç=¦¦¼æe““Fp=a*cÔø’«ñ¼dë¾­ÃÌÝõ^±Š”8K…ÉlaRY‰‘Úw²h¨„T›Gt§òF‡È?Ì_¿ïú§å*=~ê_Ë÷ {ê! !²ç‡¢þd(¬†‰"’Š6Nh¦ÈÖc‹)ý,ü"òdo—¶Ïlñí—~Ž=ºéå?±" tù?ð‘ÌBi?ù¬þ/Î*¿]b~u;_ì×ìtcõ:uŽÌ='ïg™Ó£–j'm³Ký¸kk[“6O/â¦Â§õ׎x 1N‰ßÉS~Ž‚p¿aOæpýõÁðdʇ v9—)ØõsÉkÍ·ŠÆöÒfù4ô1.”¥)L Lß›æ¯W’‚ÈÕa…2T$ÏaèÖ‡NÝ׉¤²MbððÙ·òi×ú¿Æ;§¬û;I‚(¥3 >÷¨K™Î©b«„- Q¶£J-E­âݸ©jr-W ¼•D4«ÃýaMê/Ì…n`^›³À?s\ ¿fXÙ‡”¼fˆz|Q'¦g,ÙÈõRÙ…„&µѶBŒŽT£²6Ù”G.Pƒ™T¶¸ˆV¡K‡‹FŒãË7+¦’í…´H“#e.e£.$Y³K"ºBRñˆqÖ^X76h8ƒ½„>y35ETÓÉ »3«ÞÝ HÖ›7…“ëˆbs:V=ê¤UÑʘsŽ·ÆaMy‰9ŒÂEf¶tÖ{iÌß4ýå\_jû uy®eŒˆ•Bõ2á"Eg©“ac·õL5,p v–¡yÌîÊžx±¥ƒSÙÓŒöuÍ' =ìÍYÞöÎ’Žïº^E–àUÖ‘(ÕÅO-_&MÓÍ÷®N»€Lé©ÖòH|˜ÐÜÑè9Š:ÔrÍÜ7P²ÎËžf³]#:B ’tAÌ0Z--, “7ïðû冴QëÀ©É¾½h‰³ Þ9/¬ÓÅq³•\?†~•sÑz¸¸´î¹¾•VúÆ«~óúv°H—MûMTo5C>¯ùŠ¹ç³¡1—L/ÒÛó_³è!> éùÕìzYýÄãjë9¤Hèóqžý²•ñ3kéί»9¦ng²kq>—FQ"ëQUÅ™“ëù¶Ö_y}NûËäk.㵘*åܬ¤Ù¨r}!Öi0»ôãPÍór»A’®†Ü;/eq½ï°ßæ´ŠšPx8³åζoÔë™Ñ߇Ң&ÓEÃ2-‚Å´)ªË£ ­eK{imâbViöxÍÈv¾Îg‚² (¿T4á ¦²BsHþL‘ŽQ©êöአAUöRû•™ÛͬËz[‹5Y%îù›äÄòU³(ãL~Jkpj¦^4š¯+‰ÙÜSA”ƒ4Nw<~kg)GÉF­êR¤ð›wæWÊHÍŠ½^í_e¨ÓEÎzÕ)¥ÖÌŠk}\ÖÒù!­†J`Œ\ZU´õ”ƒ³ÍÞ›Žw£CÀŽ$n¡‘§Œ›â_™qÒ­<7œxw¥²×—µï -«#º>jPB˜”ÜQûÆÆ·WÚßK ï£½HZÉ+ºÊt[)?¨¸h¾uÓâR¥üJ"£79eøÓ¿rQ“$Oß`ÿ×@ÇÈ``c|7Ç£ù|¹%yoYï7ëåëÛ¹ê¶óDĦ‘ùnvVwQ³…³á2™fîÝíõò~Eòç³»½Þã³z¥Œ¥6oU»ÕmÞf3ZdâÚ·Í!´é—jVŠÍË>cl3µÛuZÝõ)ËBpôªÄîh‡ÉiwÎËy“éëØõë<מ³jÝF½EcIÅò}ÎÑ™JcsÁæyid›ÎZ $Áf¶zè-H¦õÆÚ¿ò<°é5—¤ì„EöŒ,Ižþ±ÌÝ:òµŒ´óisC<¿¬µœ›ùò*³¹`ù1Ã5Ô¦#1/ñ™öo£‚±uuYO ˜ÀÆ0ýà·ê<ùÈæÇËB•›? ÂÛhÙ¯ÞùŸ†£?oïzpO0q¹ª'îõ6ñ'5§ÒŸ=|³¿oÞ §·º?SNh2 ²Œª¦Ì¾A ËiÂ(›cp†d‡)dd MlÍX'øUuõéÆ6eFäL´ŸÖh­Œ\"Û@DÞÚHuAÂ¥™fS“$á.H'Bè…âØ$ˆÈÄ ˆCb"¶%¬T_íV4:c‚MÊŽLC˜¬F'K lŒŠpª¥X¸ÄP¡’biÅÒJhŠ0ÐØ7+3¶2‚Bo+¡(Jª"Y\Tæ·ñC±¦“$}¶Ö§ ‘«!@Ъ˜¤*.ò'*ë'Aѱ½‘ð}î“´±ÞöÖZ眼×occJ¯šõÅõ|º’.ÚT–Ü«Yr9…G0È‘‘:¹•¥ÓÅÔÓQ4©Ä¬)9’£q¨Ÿ¥ ¦Ü›:XÝ[1ÜYÒ"+uMž Á‰ÏˆÜ¤hØ78ÿ&± {I'^­ízWl3]"§DÂH6Ñ5‰Ð‡ø¬g_Þ]8®JbZrÚÖB)†Lˆ˜¢çd0ÛaŽfwSDÒuÓ Ñ¸•’ž‘ÚÂ=;Fý ;5R ú¬vÚwh'øÈV‡tàc˜%ôœ+ü“ÜåÄGg0®JѬ²Á”ÿÔÎPÙSÈ{Ž.Á<¡©?µ"êîyK탎ç)æp£/© ´ û¦ˆ`HEF!Fw 64ÿGpÚI ©$ý`D=Ä„móvÜ„‹þB" uÁo Àµç²&ˆÊ€•f-î×4W®Öó2õ*é®mw]L²\®RVç;§k«~׈î¦y “Nšø,!.,ÂÉ‹¦WbM&â¹nM ŽŠhÝ% ²w%tÝÙg7ÙgßiŒLR©' šNS˜d‡)ÃF þï~ ]ÀôW±Õzó ð"°v6„ù«$Ù7© T<Ç£ý(‰ ãØ1Q}žSo\þØÝì›ÉõÈŒÛX›#!PÌ”Èá®AT¨:åwwww\$Ù+º¬¹Šíu¾…Í].î”çì\‚’.HLŸ âŽ<„P®A1$‹F"=RœwË "q–I–ˆÍ/¿´»‹¤W´½{¥Ë®î†u'NjݮhØÑ’G‰0UDÔŽ¤$È8ÉÈ8J–‚&pÌâɨ?_ÓíðüNŸÃöãøóÇ¥®ºâ×÷"ýãGÍ®v#ਙuXTü¦_4Å ûÕ¦÷}¥wtÍrüÎlEÛç7ÊF´Ñº¹ÍG[:‘ç¢éE2è ±QÛÚ?vZ«áZf÷Íq´SÜ~ÄïY:΃ë…04j"¢P«jRÕiíc³½³,iôó¶_y4ó}«ñÒÓ:tyžóQžNPÜÙ/d§I‹wÖ:Ye«…t7L†dÜ®BÃj¹~ï¼Zo¾·/Ñ6Ñíˆ_,tyç^YÔE®§K\}æ-vµbó‰‘Rîáój½]u,ó­“Âíbª91±.æEœ¹°‰DºZa²ÕÊcEÝxzú´ïˆÏÃáÓFÖˆÌ0Ê&’D›{ ÌËØ ƒ7 Õ w÷bƒþxº:91’Icp¢ªY•†D@Ä ²KUa.A’!PÈT˜ è– X%¨,˜M*† Џ‚ƒ‘ÀGf\G[u6zëqÐa²î»ÍÍ3%r®T)·7&l„[¤WeLÙÝÊèë®ê—ê¾{ãDW»¯ŠåDbØ>.Ó6çh×9Šù•ò½Ö¥0œƒ"ÒK !èŒ 1]ñ1'ÚÛ$é—)© ›c!© È )hè¤?aS #ôíåíçðúüÞ=ùéôÍgBÐç>ÒúD.¹¹ÖKíÏ H¦¿cÂ[ÞÝNÞ™ó$2‡\?êU Í+=ýÈÖx(>øbÔø„D”uÜÉe{ª”]íëŸ4føSyâ-õA_.—Ö·í)†t³ZJÎٴɨë¶ï™ôG¤_bGµrþòó-Ù¸ÙÄï¡ÜÓU¢’×F©„^«'%KÔYß|óJ\ò|h$ó³Ì‘ŸŽ¢øI̓ÅË ­-Èt˜òN‘²%ÚÑâL4n k¨ËÛsÍ.戲SÁ¤ô×/pk0¥ÝF—ÕÙLQg¶Ñž²yW;˜Ó²ÒæÍ¯©úms^ÌSf횯YŽf¶qYå¿{åìó¾yÜ·O{>:œóÈ'ÂmÒó̾öçǨ F»ÆìX¶Ü1jèMu )~Ÿ{kkÌ[/ož4ë¡XîžåîÊ9’©56žåFkgÛîwc:!§4*Ù“UyÝk‘¸˜¦Ž0Ì'ËwKšåKg¤ÊVü¨•-â•V’ù€©‡? {0¹«l‚³,Õ팾K†d>ÊO’öƒGDéòÙ†WFú°3Í­v:[šÏ‘Ͻ¥KgßÔ?dŠø‘Á±%‚d´ëDÝ’wh ´g[<Ÿ¦JqÅ•#¨œ2zWˆã—³¶Ò×M+ÑéeBqÒ¹ •ï^v7lE¦,T.“E^!Ì7¢Î­3vµÅQI̳WNuØÕ{§‚¿çÆ\y—0X~—h~ZûfæmOÇõê åÐs…öÿ½ù!ý˜«#Œ,‰¥•¡ýŒ3Ò¨éí£vN&ø®9ÞG Ñ©þ-òiÄH+±‰¿bý…/·é’_¡³Ñý~F>lnB[I† ä2>½5>1y¾oºyû/¯œáβ׋öŸÓìúLìí°y#êÈ|ÏžËæ;¥4˜žÞ~9ß]}~¾Ÿ5Ól„dùÈ9áýNh‚?¼ŒýJÝ·â¼÷ñòa¹åd¡Œcôpß§ ý3°ÂÍ|²H?oâkÙí°ⱂ`/Køá€ ÞÏÜ(ßÇËÖÏ>—äSÊ}è¹£ÏÝÉwe" ‘³…²í%~3ØãT:28GáõÜ!îÐmΦWg¯oðô\ÖáUZ‹äß½˜‰ÍžJ³-Œ¼¥GŒ>Vüƒ¥­=å^Ÿr嘞$é‰jÊL,cÐ3ŽR[4Ròc~—Cù¸¬|‹GÓõ(‰ñ”s˜†LSAFSúïak|ÑŠ271þ¸+ýêœêð½øK:íÞXž ‹pâ;Ñp;× ßDβõ€ø.nòslØ´˜-MHàõ+’[É2»f‹ÂÚ9 êqÊëÆ_êý|ŸÚo¿>C?b}2šûB¶ù¯~Üü÷ <ôgè¾J¸Ofg‡Îs7îñxÙ‘(5›¯œM³¥~’@ Ë¡GªJØdp ˜RÌ(ân ‹œs¶œ16åÍm3;ä®´(ìá£åÈi~>þ§__Ãç¼z|yöøuøùüºøøúïÕé¾Ý8û/·¯>¼ü@“O~—ÚO_”|È ¨TÇJzyç‡Á9 _<Œׯ.¿,ßÃzkZÜçèìñ*É÷8‚zzU©ŸØàk¬‰O¼ô?8ïôìëcsÄ×ç:nÜäÔ®TþósmN¸ Œ/4á°mD¡ÄíHÐ +BÈ !~ìâÑ #ésjBš†¡Ú Hê *”"ˆQÈ) TÙ²Pîo\Ñ¿´t N¹ÛHx¬n[ØÑøw\Ý-Éwr¹¹¢’LœìI0•¹Í 769Ã¥tºNâÝ6mÒ»²Ù’C&%ÙÖSG§f›“Â8‘¸)ºrh›‡ùFÐ–Ïæ¾+ÛÛ]XÜÜÀ9zèØçE–!Y K"”)$—“"|U©9‡i#†Û™É4í;¸htljù¼$ì¯3Þ uGzá({ŽÇû‘dîwOÝí˜:€¡s2÷ö¶I Ø…aNëŽÇô+´M‹ý¸Kž¦²;óÂ$ñ=œ²M™!M229©vc»ºc2p:¤‚êTtA× ;™½„ͼÔtO1ÖNݨo¾s;I<©“ÖÂ@ñåS¡*Ë¡³‹Ø3ÇüO’ˆÿ¥ü'XxžÊwM|¿ÒþgË_Çõßñþùf¿—Ç5ü½¹mü ¤O d|NJô‘ Ú^glÈÿ¼¨+3.o+m¼9ØñíœýC~6ÞñÜ=ÓßðÖ?0‚©òH©º^MH˜¨š’1SòÏôò~_ÈåOýì+û,št`þ³Ðþïñ<÷u‘¿qêÅV/¤Ww8J?à’Õ† -*&Ì­%%‘LA-,‘än= ,I€çºhÎOc£²û ‚älíúrpžB½Õ4þÒo™Q¨½:gûõnˆù³üј`QA7 þ5¤®Øá¹ÜâéLÌaý Œ²êLì}®¼mGúŠÅRp}sü Þäø¼mU³YDCm‚ö“^˜Ò§Q0ҬLj8xÃgPàGöùá¯1í¥ux˜¦,Md(ªë7‘©¥•ËLžÄ$GPÑ9t8•>ŒHnEºV2\a‡Ú<:«þÀw8V78A܈(T™6±X¯]­µÂƹÀŲQ&iy®ØšU «iÒ¿¿½oSY3$êÌk'¤©©@¥0fÚb5[)¦4M J²JR1Wñ3sGÙ^@v9æÁ£ïÍ}‚B7翈ã¢ÖaþwIª†C=Ûå2?\ö 3$ªséàhÿ­¿Ë>_L ®Œ™D|°?/µ¯‹¾›¨xÏ ƒ‘ÚLŒ‚Ä'DdÏüÿ3t³·\’G<¡ßYß!¦5iã†Ù¬3Û:1sùAyH˜{üi¹ñù±§¨ùëM4ÙMÝŠ¨›ùzñ¸Ëã{ÏfG#òç}ɉZ':óétÓžúÄ“G%˜ãQH<ôYïÕµm÷>Þò×wCSq)OóØÜþÝIàøÍ¡PxÂì3Øïão8hf¥À·bªˆÐa¢ 2¼‚±?÷'ÓøasÖv P=;æ£lL‹ƒÙà˜ìƒnöçhW %Çq~‚¹Ñì ŽÉìg~fw§ƒý{Ò&¥Þ„>b6öšÝ¨˜*´!rΪÑõËû}òè‹Ð³Ìž6—yû…÷¾ìÛ&Œ™IÛ`@8V'»gèTcs˜bžþeœ— )Aé'ähÄ ðÁ¨6Û{‰âhhç:¥ÊáâÊäb çUspªî©“Ñv0¸BÎQ$å-†šÇ<ú‡¯0ãƒé'2(ÑR–eËöZnДåsÄ ófÛM&¿,§ž­²êwxç>aÁ+ÂZ§ÅNsÜÓÇO£¢ì1ò&@jCfejdʉ#ÿG÷/ïOÏúø}ÿà>ÿë£Ò†Dÿõ¶t¶syIH¾.vÁ‘ùg3¦ÜNäßñâ\ReÊRÔRjª{Z*T”“n²¦T«¼¿3-:Hfš:¸K×'Ú¿îô°_V,âÌCùy <1lZ¼…£(Ôó«—4Ó/^ ž­ù—®$-%Ë´ÍVšr#<}¬ë›^Ú r¬Qtåaòíù9‘µ!—PG}ÙÆšPE-qëw2’ÒœÙg)Ç­T>¹’—!£¬§»$ã\t¤Ûa×g*›àPo3µéàž7Þ¹“)N¥“äà•sÛ#˜Mo±y¾ÞÎKÜ>{ôuß²wÛ_ÁùJÁLéßíÙzþË,¿yÅÔ>߸ä¾äÖU Çà«•¢B“ÐÑŽ‚†3‰ÀA„ýŽàF]!²öûÈuuHÂ`ß)ZjC“¾ñ!ÒÈ¢ôÈæA@:È \®@³Àâ TˆþRé5Ótˆ„ BÚN‚P8Û@¡MB(g‡M)¢Ú\T]ƒÀ UxM9ç@Ôá"îHî¶J” *ðŒ`0%„4úFbÉ"Ab³d`ä‘ç8s§-Ù%Ü7N컸MÌ‹§w2Z·Ë/š­nºK`ˆC)²ÚZUÖ´ÌÄ$õ²;iϧ¦wçÓW·6“rJp<éÈq¹Ñ87ðÜ7ÜÙÀæ^T“J€.øß—>߉ü{\«èdwVâîÎurˆÉÎIÍÒç]Ü>ýï ]pîZ6çåg\G½_®_×{pr|/E_¸g¿›³üÓB¤{*ðsª~)GÏS›¡.[NfqÀ×/[hNmž¯'•ݵ¹Ô׆«ɦqÌ„‰,p•Q}ƒüÿ#w~åÏ£uLÅ×—MU±¡®øÜñ¿¡óŸ?sºÃÞ;Mö u•Ì—ß.UOêHøgÁJÌO'¿ùtœšžN7°øø^ÜýêæÙFÓo¤ë{Ù™‹êDmä[:T83ÑvCmC燣£ÞkFЉdö“¢O´êŠèîØé9Ç£ié'YÌœ–:ÊøMFtýÿOÂÕ;ùë7úþŽŽ6Oü^q[õÆjT4ò²dl®Â•Í 9‰vAþòÉ~Å|{QyňïbTðúf7ž¢•¬Ò†cÉLø˜brŒ‹Ò©f™”¢o!«¥-ÒRPè[%cÊñlvNf=Ÿ, uFŸýŠçůˆO¼ÙT),L•ïÄ®ø‹­¢­.Ø]Εš9É~JÏÅß=ï0ºF"N§ÒÌ|xn|«Û.Ï+ªW¶½%»-TƒzNžŸóZß„g[ëÜê»ÎœÝ7bµÉ|•.DeåsÜ"BZåôÒW­½g^hü“lšpË3¥Ë³-IÂÒvÑu»áã%"¡{Þ~ϸŒ[Ïå"îYŽ÷SOb²FæF‰ËaϤŠÉEÙ´ ÄškÌ&Nõ– g’ÊœÀ®)ÒµËè5/m¨=>¢Ú%ª#œÙp]®öÉÏ! Ì-×W‡’ÚQîPœ§tÓ¬¨éX•$åÒ•2Ì£PÍÊìó³Ös90³¹”Éæ"ti}iÕïh¿LgÛo&Èâ5e9!ËÕÄq:`ªuR6^©xvZ‘;uÞ(`H}6Ù Yžñà>êXwÎñs彯йÛ©3i‡òE§dV•õ ”éßRoã¶ËÞÒ7á“[Rg(AlYA/W…2¹Hˆ°…(îØ„mÃy³Á²¨…;Z¦E^õ—õO=zwölëk]=xz þ)kwuç :Ý×’¦¾?™ãD­åó6Ï )£XÕGq® žX»¶u\¼§bê¹Í._:åÏ–¼µÏqP>à ª‰ñXTEEˆQA%QûŸ‡Æö 꺧Ÿ}øÒpŸžß·»ßÅN–£©Îüœs+z¹á ~A»8 3†0L¬ŸÔœ˜j®PC¥Ð_Ci7'ý!èSrþ«;Bvã—ij€ ý1þ#Ì·öü¾ÿÛó%Yü¿Ïô#ýSç'+ö&y†ï° ¸þžVóÞö÷Öö?}ò={§MÔ®T||¤á¥yÛøí×ñ÷{o ú®qºPç¯Rß¿§§ïù±ó>Ÿ¥:ûþOçS šçíÎÄ ?ëzlþºm›9…þÕù>ÿÒ8qg¿Ë§Ày,Œ³Äéû6êùÒBAôìÁWø„ýÈ„‰êaˆsI"??×óýº>ïÁð|$B;è',|>õÄ8²  !èh îJ/ã†'†$M¢&IžŸ§ïöéíûgíû¿‡ñÛõë­µ¯ÖóóX0c÷×_wì9¢vλL38T^£ÑÆR3DǤˆ¯ð]¸= W;ø°ëä÷‡õïæéý™åñùõëõïôúùç´ÿÝzþbÎŽÑÌðéÊC[aÿ¹ÊwÙ0‰ê}DùüËëùþ_צß^xé÷ûfý·æŸŸ‚r†9Oü ¡´‹,9÷þCËWÜ‹‡Öûµ®j9g“¯×‘*ꥻ3þXüé°`ˆËàÿXN,³øžËÿ›§ßéåü<_zšãÔ Kam²Â§žqÚ)?9Àëú&ÝvÂz½*\–¡Ùÿ%igîCþïPlÛò~’êOóŸI;¼y™=º§Pì÷}ùçô>Nòaü$ŽÌ{ýb8}ÉÑO¶2>œ¾‘¿‘ËûáÍ…¯HMI'÷¾agu=â\ey:©áŒ›¬!â-ù·Wñm2¤Ñ£ )7»tF5A„#›©©/¬Ü°ï’GSNMÈc»¡¤ûÖ­¶­:>dÉ'q‰ÚF˜ÖpÜÇÞw4KåCMÉ6£Ñþ£ˆ$‰8·¶ÝSmd–ýÝ“n ÊV“Z5_¢¶åkÎ[£¦­åâ¥[ÄÚü¹Êæ¦Vö–¥’T)-HÚ#f‡’›“¦F%FšÀö Aýƒþ<Øî ݲ§‡/ÏFP%S´@F’rpg„I\’j1¸DñI¨yŠs&¦§E’<˜Ï‹“Ä!íÖA>C±´û`OÙdˆ&Jk‹¥pþ.Î"HO1ÁûHû}H:°¦>¥4…±IK/sðCŠý…>Ñóqed/Gâßæ=Î|zv^)þßöGûÿé×Q㯌U¶dÏö[bŽ+ýŸí3ÝÿVBno ­uü’rÜ¿ñ›–,É<§³Z·M<ù|fuð!K*•‘ I(ãXeÉbâÝšB8R¥B pƒ+ ™R\®?ÓG§Aù³|ïR¸´ˆb0mÔטޤlŽO—;RôNSÞÆƒ âÍÞ:éØã÷Lu›¶•_Ü®$“ïvvmúDv1ÕüO µ=JŸ8‰´âFùëöš¨ñÈÄõaÔ„Gú)¤ÄnÉÁ=ÎöÈ%©³æv?»ðAƒú ¿ï9_·Çܳo_3~áÙøŸQ²©¥7ù/.gÆPîzÉO¡°ù'rqQÐJy3Êw‘=þ:cNÐøýÑ5÷ö¾Fdü#¿ô±B0>G²ÍC°}ÌZˆk—øé «óyGîö~©õëßãµüç3vWSñ|¦‘è>ÛÌŸÙù½ãò•fÓ‚}ú÷ ’~_RwU—èÇé¿ÓsfÜY«n,L©f¸}ÑÄEŸË÷¦¼¿uIÔèù¼¾OOÑ"jzÈ:=_²•“Ò~‰ù]-dú=®|ß¶öÓ=\°ÿ„|…êïà0?—äzTÞ˜ýAÃ…Ñ®J[û¾8a}Þ}øŸ¨#‡Ÿâ¼ãíúO?WÎD~S¯#òdŸ7Ú¿ÛÕ1ÙÃóÙr+ü¨ÿ–»#ƒrHËjv$"OÖL*p‡/–“´ÆÙ›"—màE´˜«Xóúä°UÄçŠØ/[H2äĤ‹!l'ø_­ÝÛÙrÂN¼Í§)¤§Ø;ƒ¾å^·îhSHkþf•ðO<ŒñÁÇ/üy¡áÞ¢üÂRLŒó#Ƨ¶ó•xž~&ƒÉ0’.o!…Χ´ëžºÝƒNýéBl^L›+ Ô´òÎ93’qÃêCêM'’ÄVÇêvÔàäÄõ6ÍÛlOIóÔéÃc{ŽÄÔ7äŽ[d&$¡$9ÑÄGL9 ii¥Ä“,¤‹ã^!$Ë•*Æ t„Sc˱|[ÖH£· ÷$~l8¯Ö¼zO\>lSYÜøOër·éö‘_©ÑIîgT‚ïst˜ù·/”‡NQÍw;IĈOQnÌU3ÅœgHNÓ²ìϲÈL“ÏŒô×]çŽx™b£¾5aÖ HuÒ®÷ž(ÏÉ•‰Líj©rjY8¿}ú}wß›#·Õðv—“L÷….3ÜËô0˜Y ‹;iÜÁ뤑Kµ ,šl(Á1Ã:ð?w\™\<Ëaw fã­²¹¼^:¶ëÔÃÃG¥p]gQ@ST¦ÕEÉÉõ6»Îf'G•“¤ØiÑáÙÏÉk£¥ZUMiÌiÌÉ´“qì\Ü‹]£¯ðìíK©ðð8;ëu=:®ž„ÒSÐ;oo2)=™L8äFLÈ¢F;úÎóðýøË­ÜúáçÁöKAp81s¥óEWà÷Þ2lõá¹£'2Õ :µ1l!¦=%sdi[¯vŽN—|$Tó s®–ﮡèÆMºY £´ÄY óàÿŽõ*ü_úá¤=bÄb;ˆ©í¨+¤UôYÑÉáàFЇt÷6xEýWa÷3÷ßµb˜`A†¸ò>ëÏCßãÇÄ}õïëôŠê°ó™ø!BѰRMÚ!ãÑS±ÉK¹ÉsrÇc Ï™ï”Äx0š¯N§æòÃÔ£ÓÕ©?#r{RÛ¥}VËþŸ°j}:§ÒÑ#‘Æ[—0å“N³ÇL‰,ü´“oOcì;È}Çi>‘Ò¤œ?ÅŒTœ±÷žÜÉ<¾o·£™ðzkéÛãåïÕ]Sè~G¥°}W§rx­Z§vœô:|®&ÝßsÒv3šc†ž–[‹)Ã#àøEZ–ôvøxRŒxwXÞ+ÕîÉÇó?/®ßÃÙìñmJLcæ1,Š}ÎÓ¾ÞOª²S¯èçÝÿ”ù}èü¤¯Ïº2'ò~c·1íú¸lÛù*;$Ÿ´OƒàRaâc?SÝ]’} ÝËEÔ|?7óø#9+É>÷ÑÜ~O“:Ù-²7d1݃ÂN ˜dÏß·.ß \ù½©>‡Š¿=¿W”s¡_öþ“ùþ¯‘ž…£æX{˜jIÓ†-‘è^ïì}¿xIJU7Oƒò>õoÓéÆzªa"}>£îöDÐ?R~r~ÇtZùò<â:ýf“÷½Ú”ùƒøx™%Aôt~°~‡/͹ÿo“é|UÍY«ó¬±ðÒ2Zûf %òÅÈZ fæ`K¶Øÿañáû·‰õå×]ó¦3ǃôµ¾ÑÕ«UgÉñœFE=äsËKWá›ruüwÿïS:E'ý%ÈWIT™!RGØ@ÚTº‡EtuÎŽ´¼».Ýv6K¿o_Ïo~/o\È6GÏÇ­6rçrË'3Ç)Y^[»¦“¬—–~+8åŠ4Ê,ro‡Y¦0@Þ Çu©úv5?_Wí|† Î'ƸlLƤ®ë¬¤]5Ã{º¹ÊE(1^sydæâïžô²m¦ HÅ{¾ýºow±FÕ̉ræ EJÔ‰²eqVY\¬y"É9m8æq‡ûé€ 1<7XG.ÅÄ q“*™É5 ’VNJ!–û9Šš¨(+·c}!ÔEÝÆ±'¶ñ3‡ÒG5ˆè%êh9dS¡àà½à|Dè“¿޶¢É®jY6Ú[%XF³táëƒÞ—´ëó RBe¤Ømóç®n)»Ãi½rg5']K! %“YÎJ«;IÕ¨òrñæ›o[άtUsœ³w¦i&À‡ô/:9^»ä½¶Z›ñ“ÀèèÛÙó uýUà;œœ¨øƒOÑõSËî{.ÕK!SΤiýSòYä|ž’OæÜÈüžÏ«ó«“ÙÏϘux‹ŽAÉñû¦|_‡Ç§ÖÌ÷j®ãò–ç¶ÝŠÂz0úI&‰è‘d%¨… L"j÷÷C@¨w•¡(¥¤•Z)Q‚€R°PÊ´”Ù™~új»j.…ÃcÈì~Ã7Pž`gÈt¤î´Š`l.Îú6Òè /ðŠ}’CÖ>ãáê:;§y¯ð{µ#ôzb~_q>'²}ñ‘ÏƒÏ ŸF,jÕ¦bá«- I݆Â.¹P*y³ Ç’Y3+ß ÌI³ùG¬tm·ì›’B~w†ç pòt}Ž<)Ñ_ƒèúC•Dñðsx]‹Ù¥’|´ÜìS—bOŠ=?Ò_§dÑÙ:†f® €™z¸yk•âÕÅdé¥uÒ5îYîw›¦‘´T%³Eõ†ž£ Äy’rôtMά<ºÄÇeJ{Ê~n_¯y¯)2;¬VƒÓzœ~w^ŸpõI«myØ™ò|ŸwÞ5'è8ù¤ÔxöfäIö|dÔz3.ØáUŒÑ•´ÖšÉ¨ø3¿Ø‡¸æ$w; àSö?sAÏ«ÖÚKdî’æá rsL[µniµû_62òî>UmûAéçÄéÑæ?¹ìkʪ’ ‚Âp—ǡə¾F:tæÇ˜z¨/©±Wp…¸ah3ŠøýÁþ=Häë'W,vUÖÑKÜn*uXÚ³¼¬šêáÔÒ¾|oi¿gæ“´ìâ#Ÿ¢E=ݯ®ñ‹‹™¹þYËH}²,|Ѿ©· ­®ŽeŸVI¹NþUÓÎÃ_Ý=)QA¦A’<0p¿U‘ÌS­jhÆác¬*dÊ¿¯1"Hz*œûå+£ìGS„rýÓÅ}¿Úäçô‚¿î™Ë\ØÄDsËÙŒO‘ËîTv²!ÚHƒàõ1_|‘ßñöSCôþ„*ƒÝ@ó|òDz=ÚŽƒ´OŸGÌèœ4v‹É]«?€S¿¹þ$Aíõ%N!iŽä¸§Éñ?~Êìx¶"¸bý´Á¤ãû~!ìýŠ@õMÁ% ûÛÛ«ã!ü^ÇsÅ¥RÊ‹m‹`$Ɖ¢+ ŠBÐ4R}Â1PùôüÐë°nsáÛÖþ?ÆÑF¬\Å",„ˆV6¢­U™c35¬fc+ø‹"6?2?$T³«|ϲ,÷v>ªrÞ<º¥‘ÍÕ "ýH C“í‹ö ¿ò_ÅüI·ÅñÑýiðõèèŸ áÆŸ;5m¡Øá®¾$ýß„ÓGÖ~¿±Ÿä–wû_„õ^¿à÷þd?^OX%áõûM¿Ìô2:žÒ}ªÚ~GìCñ“ó<‘äØ>§ñ!þ/·µ0§îø¬|Îí5d~ïÈô'WÚ±å%Câ~ƒ i‘'Ô³Ñì?¼âFϸôÅÑ’ØTFŠŸ|‹ú¢ý<°]Y D¿´y’ø ¡…SAÈùTNÚGã ~2D°PId‡³?ÐsòÀ|c‚K£ù?5'Â{²xs'SðX|Y1©rOÔë¶“ï«|C„pš#o–£üu)öÿO™ü"yKóˆý^Ò­Z¦ˆ&NÒ˜#è®ò!@1‚F™˜¡ýmòYÝ{DkcZ°h*´oï#mæ·»§"†‘ *ù3³jäË{%h#˜Æ±þ_·õ?ø|ÿ±ÿžÓý·üujŸÜ¿Ú¶ŸëªÛlszˆ¬ç)ú÷2©*öJ™¶{-n·ÞÐ §œÔêôf“´Z…¾ö®Û9Ó[ç·U3uÔçYJ¦q¤ìö zÐešÌ1N{œ¡#Øà•Þ3fðu9Wȇn Px[¬T«ÏšG&år™¼ùÏv¾³`”r8ç7¡u)6«sÃÞâÊvâAžn­V;ÓßÔZ}¤ê1î†ÏÄ3)#ú´›m‰†l© ÚY’¿òÄ8’ÀÕÔÐ| ÍŸšË­E„Jd PP !&u.r’†ò«Dȶ-Fá\INÁÇglóõõíïðÖ·ô=|Ûãå/ôt}Nyƒ9Ñ6™1-¤¯3 -sæâ!ù²èðü™ZçÊKM±¦ãpæ¥SQk)•3æw÷{$ªPŒñ¹>M½mo~Côôö)9zxÚö kiÌ!ŽÝqvfûºæbÑ«f ƒ?o¤eÎw9hœ§r}'Ÿ%nЛ¦váæ¹òóòhgåYo“ÈóÏV–ZÙ^ß}ìAïÎSů‚¶ZåÇ5=æ[l£ÂkÊpjè–ܯÎv}%‘CF³å ¶fÞš˜UÂÑÉÑtön×3sPÒÝ5´]‘é.nŽÚ–¨FtáÛíÌ/i;Õœõz#¼ÖôµÛ‚–ïR;ï—Ö˜}XqÕ…#m)Jn£ž!3»ò óÙ’­ •3Ÿš¶•PtáÛ/ŽcÂ!Ò“ÃÏžyÑË÷ÈÉùÃR£óÄyÌ p£¶ÕŸ4^"hL‰{:o7V¬¥á­/ +v«åê¼oÉ)¬ïÎ×W9ïš+í;ó¼Ó£ÎM“ZënùÛG¯"«†FÄFfW&s½e¼ä'›x®t›ÝHžy5•¹ÒB×Ûý@ï5­oqí¢õPÝô¦É½AèÚ=œµrlðŽnt&»~›êyYñ¤×}ݦdp äSâ º óLcü±Ì? ÛüÊþ<õDÉ·ÃZZù|ø‚©£vc³ö¾ú¤Ci ޝQŒêL/“ÉF>½í‡Ÿñ‰pL²v Ç„BïÜ `{Ûi=øiÆó1ÔöÏ—rö‡EJ ;‚é$¼"/E(bû(„¨¶ìRôªoE{\’M÷»D#n] ”BÚ/Ë]f,8Y‹¿§á-ôõG¡&bžòÔú:iÔErÒ™Mnhý¿#¸Agçß :š"P¥% ti‘¦’?"ÁöOú¹:,@CØà4ûÀû?ýÿãŸÇ9û¿û¸ÕÇgõø%nò»ð0/ü€cwÚÉ-tñú‡~d k©ð·ÞÂ0ÿàPüFâ•ýá{Ź¡µ|sÓ×Ód’DÿÁ‹Gòˆøîÿ×Ï·ŸøÈá×°èÏ‚Ÿ@ùýKGqyT6?î‚tãõÿÌ`IØÑò:$ÑúÏÒžŽ„‘ý8’OáÈþ: œ2Zýý•R ÅT•15UÁ°wC¹Âr ‹êxò*{‘Ä;.½•À0ŽÀ™Hª"$SÂÁÐ8y:n:Býâ¨?%Eê_gÐ6N Ý°Ïæ(â!eï¤ÁUR#ZÌ0ÂÉHBc ¸Ì\SX¡“¸7m€-–}³¾;¡ý*îCáñTê•^ñNHÐæe4nff*ð@ ©æò¯Ü¯”F'®eÇfÛ\€ ­v•® A¡µÅõ¿«Í|F+W…’Á­$–$˸µbˆÛkÍE¼·0“#‰ÔêÛXj) N#)’´˜†¥5)kF¤LÖ¥ Í^çj¾*Þ[^›ã]9ʽë¯5æÛÈÞ^mskª•鸢F³%¶­MÓ{`m¢)(ŒŒ‡PiMb©TÐB:%P¥JT S'$Z P UÅ£lÓ%¤Òiw[›içW9—ž´lŒîí´š•¡J…L$Ó˜jÐÆK¼ªE A +², V¡)˜‰&% nÒo°‰GƒÁÃä;ºyû#üìO­[áýÔÇq´v[R{÷(\w/IÈ{<:MTØàkVÑ5%U¶5Žc´ª`i7 ­ÄÓˆyv]ŽG5ÁU% *õ‰>/ÎuŽÆïVCÒÎ?ìàúG¡Àië–v-ÊoÊæ‰m|ºÜ«+Ýnm–@êaN0ËÞl ÀF”ãc·¢&Möå‚©ôìb$Ø’™2_Ç®kÎD–ú•º,Å µš° rÈC#ZÀÂH%T؆”> 4(‘¹oI ŒD½C¡²`¤+*K¦Æx€ySNÂK/¨áÌýj“€äê;‘°ÇEBF¤ôÓsk‡{ôåÀÑÄP‹™ Fbà¡EYa 08§‘ƒKø<²DÕ·ºU&C3¾ ibf=S$ign!öÍ_xàáo¹Ñwi=µ¸W'2‹$(š`˜–©ýò6èt ÑùèÁ8Tb&Ne:¬FßY'«ªÊ×/m.Aðq¦ûYÂäl¾à‚ †®&4oÙ‡D–PÑRÈj¡bž5ZV &„ñ#&àáë=ž\;î“$îž“OmÙî²ùÌ•™3)™ú.ΙmCJ¨´KR” ·&Ë-–×1­®bÕÌuûç9!ÍpÑ2l¶€¤W ôbLjXv»TÙ‘£a¦¥”½5ñ®FÉmDÍRm’Æ1o²Á5€Ö*×i«rÕÚ˜2E¦"–!>Jpú($@¿`ÿDxa`jäó98ÈÁÈ¢J a%Eˆ|RMN˜ÐH¬L-ƒ0„ýI`b¤³ƒy?ÔÃ@*X}°ÏÌÎi§Û2ƒ$×îúМݧh(Éh°åN Óe…ÚĈ×W.„Úɲ#Üð•¡'â½kg[¿aÿfŽŠêNÂ|·#]O™ðx²­½O/«G С‘8Áòz|*Ї ©÷“ÏOH‘«¤°©Ì8v¿e;û¹±Ä¿xCb’Bu8ŠãšÌëÖ¶´œáChž„?™Iß}¿V™äüÂÕGG}YK‡?ÝyÆ|§1æm÷åŽ.œßFoPaüCcªï/ U’ÁXPÏ(à3Ø4}¸„…(Àrb±GØOˆªÿàT_à9ˆˆP‚¬‚‰¥Ý?sßåhÆaúþ›mþœ¹¼¶ãíMdþã÷‚Ö÷s7mÕŸž¹ "ã" Pª›}ê¤(¯¨_ŠÈÂG”§Õéõ()¹Œ© _HüÈè©Ô6úGÖWq¶ÊÃ&G´4_#ï“Ú* Oî”IŒVt¿+ª|Žfk¢Ã«p²³´¶Hœž:å?¡ˆmì>ƒC;Á=-¸btatÐÎS¿B® LáH!ýÑó·x1ó"–7¢õÈoK?¯2Ö´9í«Lši‡gf¸mZšœµëqÂv9²y”ânY•Û–o¯çÆöÖûæk—Z8œNx79õJ“í'Å=à¶€©hH•$H<ñiqBx_@¤iÖ|/Ó…‰ 8±lûÌqU¤>‘’«HÄ£|ñG)¤Éi5UÚj®éu²šQùFš®ÐК©aôŸ•´àn6Q–BÜð+©B•e=Ÿ/Fcâã†9–…Tæcea”Àäç\ÜÉÇ9»®œèæîRË™d¶ã1ÑÏŸ½ç­µ]ß>Ì¡'; »~†*˜‡²b¿rGÛÅî=“înìýާD·RÅ™„Ûè&æ·Úö362¤Š“óß²xšîîyèJ•'JÙ‹ù×O;_Gbhòë:5¸ÔÒyN#Oþ‹åIܨš–N®gýXtu\ãªQý;4»†i¤”ãFÒ™&Š£bI™™¥µ ¦’xq6ôpíË»¿ ¨´é:R~òôÓ¨/2¶ðñxó}ÇÕ8û›~×òç$Ŷʹ_‡·4Æ›Ûq°ç²%‡Ü—‡ÂÒcQQUIAb9Ò›¥i_[_€ßuø´;uÖ*™f)OÏ¢‘¨ÜŸ©áÑù*Gˆ?3ªÈNTÑLuÎLJSær ²»;z5k–±ØâL>‘ïì¡ñ|² ‘aY6˜+£æÚª™ö uÛêÑÑ9‡iâWUW÷Î_wcÅOÄsåçÌïg"¨*°‡B àŠ‹:#í²O³£óâÔM'éöÆŸyôL‡¥/äˆ&"û~}ŸÄìèõzŸcî/sñCeêIÈû&þ8?¨õ8TvDIQõPRÙ‘Uˆ0 ’ŸÇÀ‹ýßgA!™å”:}¨Ûó?ô©ì¥$ÿkþ/´æMÏoêHƒÌn׿ýÐ’A®þêáÂùYU˜JÐdæb˜â]eàK¬Í¤MÌÒä‘ÏùLÁ(Ÿñæ*q%‰±Šw=a¢9ã_èÙÒÎIŒLC… à èÚ¡/yñMÞ®˜ìÚ;þkˆOÎFñò“Õ=;üõï|ˆŸôOûJ~ˆ²#¢£ú?SêþBB?»û?ùC“Ðÿ¢}ò|wÌpŠÿ§Ã£—Šóÿµ}w~”V1oë1ˆüGñØÜCÌ\<`wp=åU€‘Nƒ!õd{/ó <û3y§C„~¿a}?wÇÈ‘ª|PywÔ«N•Þ’?“>,q$Äô‰à|§“‡ð³—Vv÷WmJÏ$?¹ðø>¬ú:§:ûGöì¶Z Hû0ú½ß?qO"//WA š!äùRG§HO"ÄMJ3¢š2GôùîxžÜ¾MFãà¾>¾Áú´D¡ìÿP$ÀªŽ@n«+Ãî üWÛh|d3Uof£:f‘·”ÀØòÌÑ!½’¬’]æ4Þ¢M4G‚Èå ༓— $WÛ!ÙöëÀ“±·2'hWR‚I*‡Øß¾“íü€p!ê8Ääh2t}*àÌb0ÆT¨JbÇÇâ“™…6Ðüš’:VÏ«ãIXé?Ra´>so–ãÒIg²×Äîk¼FI޾®O®šÚ=¯ª‘‡_ a$ùÔ´Aý J‰ˆƒ* D ý_`uËhÔ>Ê‹m‡†’aìGŸ¬úŸ«ïlOðø/‡×OÎS$riêæã5ú}ÍäiN±?¤’@¿Êyòz\,ñÛœH9™œÖëçÝ©uw–uÛhÚ¢Ö¹khÚÖêKFÂE©ª…%Œ½;fÒ¾fÆvÌ#}³!^dèÂÇ@½rÔJ‰V]ÝŒ½]uÉ4ÝàÈ_¾mJ°[§Ý¾.÷ÓÏ œfÚq'óá'qâ%FÇ#µ?yçx/_MC¤ÊšqúùÍNŽê]›°áÚi½üáô£òõX2q#©Ù øÙ º¬göõÛ¦÷Ðet3¿ÖË‚~âÐuެ”d5‹F¦œ,L"8)LˆÚH›M.¤ŠOqœ¼ç*KºØAhU¸pá‡3p4C˜dÔ—âaÖ;m§&uDµmXâh>„']¥ÇŠP/8Ùzg@ Ô§j¢húáËÝ×Uöãóé\í—¯C‡ÈùŸcÜi&’Q#…Š×’£Êøm,"}ë ëìK?0ú¾"|Õ$DÑ-6Çí;¤õŽÇL?¾Éô‹÷åó>3Ð~ÊõÀU_0øø¿š.yŸècŠ мøŠØw‚ꨫîvÑÒ_tH!ø~ú JB@“KGS¯å%ñûI‡Eó_°žÜf*þø™ >Eø>‹¿¾ôf56Û‚KLþ1ü·Öù‡_ÌÿÍý~ 'ú¯£÷>רíÃçñŸ:›z’Ih#A>mßµ©:#S…ÍÛ'±ü{ùt:æytÿø†ê#ò•RJþù  åY…PûŒ;$í&)ùz|à ÏGË ’ƒÐꪃØêö4î?–G³'Ñô>Ï¥´ˆ7‰E}:²$÷Ú%|ÜþÛû—‡?3Z4Šú)óžÉÚBO«Sd•g‘`#«Ù¨Õî'Ê'Ë©zG$,%’u¦ôóú¨ŠðøO¶aGOmQª §ÖÓü4Ÿíç›ý:É1$‰H±™ˆ,˜¿x7`å?» †‡NrÓÅÙ4¾¼{ÚÄ9Reÿ¬ï‡\yã_8+‰Ù㣆‡„ð4]<å9<=Ë; C£™’ÁÉ:ºÕΑÒ!–ÊʘéauiýcÏØùyOÐGiÑé¹è¶m´¦Yʾ-=âW‡ÏsDð¤~nÑþ[ó§ú~~1ÁöÂÖµQcé`M'øË¾°¿Ý&6Ò¼ ¨‰N„&¶ô«Ú²j¹tÚ--ƒ¢£i-FM¶J ¶4)ë9 ‘WH]MªÈPɉxZÄ…ŠV$#lfUr­r±W5µrÛ\@ÈZh%D¤‘J(]à   JŽ£M3U¼Üµ¢Øª5Q VæòÑVóh­^îÚѯt©RHhÁ’2ÈÈX´Ž8Ä׃…6 úmåm¼µµM5X~R(u‘E5 Ä P¨à@„ˆä p²¥(9-"¤Ê*á#Ä  êQñ‘ÉŠE‘M¥Ü"„Cû“8" ;Jªà)‚b£öà&‡N̬›¹ iÓˆ†14 à¸bŠ¡ë }$U ƒÆ7"œždp¶dIÕï4çýÏ¢v8a ¥P¥"ER&%‚AG”1€T"ŒŠ„¨$BªL¨„J ‘"÷$UòG¾ûwëº,m›CÌå©]FÄAÔÄv÷ö>1ü«êý{5Øœ®Dˆöº¾æq‰ábu¨}r-½·‹MPjMo$Ócºc8Çõ8ÍØÞ—VI#%-R5A¥4à.aºa‚¾%œœ£˜šGÓ¥ËwÑÁ¡‰Ó 2b523{i4¬Lþº¶-‘;ªAב܎ ŒR[Ð6é ¢é„ÆgLCsš‡s«ëÛouXµK"¯Îd1+ç“-Õ:&ó[8£„Ó”ŸåW†ÚnX{6Ç1%Žøx@Ò?¼É4èôûýǼáÕN³¼<[_SäšI©ø'‚ýî'°aC0æºG&ÆÙÞПÛRM@Ìbà¬ß-㳸ŸDÛ É¯ÃñíŠÏÎq#Äh§h²n°Ri˜$ ¨‚±‘Á–›*1)LH™‚msseÜŒ™Õs™Ó£7I]®²K9sºr.®×I)C3(FÀ0E™V–ˆ­b¸JÑ­rì–ÓL©ie-©%˜"à|7¢ˆ$Ö&Èàa;莩n8έ Äɹ±) ŒåÐè¥dæœw 1X–8M–·´€F˜803‘$ÙI$æÊ°Û£°á8Úļâk–M84S‰,À‘ÚR-•Œ&E6ÅLnHì³ÃL–Z[´QfîÛ…"ÖºG>rñh)I 7$ ¤!bP$îAîØ}‹¼>E¦cXšXŸicÌh±÷ó«’ÏØü;žOÈíê²G*‡Çt>çÞô>IÉ?)5šY’'âÈ(Žä!&VbOyi>à†ï Î^s”oüô!¸p/B™š˜±P4znÆgÔ^ÆÈsÎ:.z¾Æ:¸“´>(úÌÛ³»1ð}ÈÑÖO­âx¨ýle„pw$MúA’p©¨Û>F¢GBL$B ò9qhr8>äîûJÒ)öÈ}ß?ÍÌìL‹í/ßCóœþdňú¿Cõhí; v(N£l×Ã$>±Õd›{¤Äé˜u¹Ž!=%†R 48m0»8÷Òf?¾?Ûú|üº>-#À[Idd>“ò„Ñ¿Ï5Ç[“Vü«^äñ’ŽÓÐ)˜€+µ,‡¬^ßÃÝî&{ È~ëú¯åÉù÷ƒGõ–¤¼H-|õ“‘’x%FÔÖ£®]dsj±cXòÁ¡2Æ[˜ÓqŒbKnšHýe¥’ŸžØè¸Œ,íCº+zvÄÛ{RtìÂ0T¨@’#âJÂF)¢.xÎcyߌS6Í¡6$—c© ‚‚#]Õ¶Úí©JkY_S[£$›HšJß;m鯔ßÔTãNÕÖ­L b÷§çÜ¿ÇÄ»Ðê]±tLHÆK)Àd¤O$É+&7$20T¨¡K=No23:ó¸k5¹ ¸ž\íb’øáé&…K¶7mŒFŽWe5 Ø Xìà½~ †(¼.d®Cl‘CKw·b~dÄ>g¡~«ß#Õ2N{*x,ñëÂ;=Ÿ™êá]¾qQRÆ7j'‚,>ì³'îX><¬¥›o‰c«ew'V'‚WÍQß–$?ßræs'T®x:,ˆ’< Ç(ÛºM±û°#?“àŸid…Rüãã“Y¯CÄ<ÔòRw&±…|pðå½nø2 §)4&C[n..EWb# (n¢í ±Ïg¦V2’4«âf’ C¹‰¤ë†ÈùÞ<’KÖFOD¿~ã m²%Oàx+=Tüd)¼Ž%_µ¹¬X‰,•?DÍÇçÞʶdvÓ¸ND´¸×e°l#F0D‹œÇ/Ç]¢‹þ¹‚÷TFM6bsૉžœ$>eÍsíZï®»ºüf²0G7Ûsë¶í«•ËÕÙ·-WÛrÅyµ !½× ‰UöØÚd[¥]-»Ž#—suµ|lm£ßö9ç„%&Ñ é]råÝŽîç6æÎ¸ŽUS?f1ˆœp™ÉrÂq6ö÷k·]^öèZhöè]v1u¡…1˜\©* …°À5*SØÀu'1I„4Ä94;í¾°ÈÄúc¯¤k ¯¥:èÐ3s¦-õ/¶¼Ú#Û{¾ýÒ]£ Fâ3," ¶ÄqÖ#«žnXµh¤ƒA|k¦crîë¹w+¬¢/—vG ˜‘ PnÝ N­sƒI›ÃZ a’‚Š[°`a0Ëêåp«¡×p£‚8"j/%þ½·JŽ`¸d\ŽcI2x…s\‰È`ªÇ 2öF@Ý´Ë ”˜.G2>àTÛ¹#2 ¡âÅ3\ÃP©X™åd0]fl^íss=ÔT}.¢¤ß¥Õ÷Ýæç_}µåhŒ–+×TX˜¹–Σ3(×ÞLÔ5v:]ÜÂ1Ã\‰W" G"r¬€)¨,|ºÑà „ã8‘Ì]bdf_)bAç&P ÄZ¹6Ø®µ‹“fØêˆivÃ'iùîÞk¥nW.·4`õîÏ\)=Låˆ q2G,¸LsS"]†œ8º®\\Äs‰‘%Žï¶½-Î{Çc}Kãyòr°znhI°‚Y†ENAåG†Š‡NLkíÍ$š>Ú]¼°dõw½^^4î­ç9¢·Jܼ·š$%.2¬$rÙXÌqpާ$C )Íòˆœ€Ð¸;æn˜a$J‡0;zC¤ÈÄ29,/ŒÕu²ÝÔGï.d:ã!JL)¸r·Ä®g=Êx "=`øñ â¸©°6;c‚CTÄ ¬r†Ùư ‘"B.ãZFÆÀ%€Œ“­ÅɺDEL†£ æ8‘Èt˜2‡Ä“#D#„¸a€ôp‘Ó«&º7¨Ò¸5¦˜©z RÄ`ÂAH!Ä dŠÒ!’ •ª5µsn[Q¸&“,•¹s¹_å{µöêûq\îáÅÝÀ˜ußÌ{Ýží/:s—LÖ4Y Ší¦G$·1­ÝZm;Íîã¹Ý&ŒîàÖótÚîu‚ʼn¬Æì m¨"8e˜<áÎ@:ši+dË8´¸¬á™R—nXÍ-²,² LŒÇ[K :d™pÂpÃÀÐhÇK‰)»)‹(ŒÃX¹š(ËiY©•,IOÚÁl:¨q5,Œs¬f-ÒUTâÞ4Ë‘Õ2—„Þ)"È…9Ó‚¹(í/%¢‚jb"–R%8 w#uÛ:;«»«äÛ”]2›¦Ø‡Î¶A’̼"8J»…ã¢d–±¦¡0ÉÞ$°`2M‘q34Ú˜„%¸&€Ñ$X‰u‘07d¥h‹'Tø¤È¢@œq¸2ãQ;»t¹žÈpp8Á°Ó)C(8QÎef£ $¸.¶ò6Ѿ ŽÁöäòå7KUbRð¨ÞáýÙ‰;ü¿øêO­:—‡¥Z³¨Ù×Ú ¹lÖóŒ‘_€ßýƒ€Äi)B”¦–ˆRm4‘p#¥„¥Ú KÄ”_BÀ•w@@˜©jRÔD—áŠÕý¥Q«?]¡MÆP¦Øç H#rÈEŠ:¾x†áPh¤†Y,kEQ¶‹%*Q«[*U~˺hÒRFˆÅDhŸYPTk,«Lum*ÄR€y¶GÒ¼¼˜ŽòFa·â–üÔÑ M¤‹`²Ê2ÖQ¾qbÛ&Ö£mi+R†’Z™Q­j¦ÛÚ!aT  HTcEÐ#­ÔI7,˜­ ¦Û2>û#é,N†œGFÑ5ÒM™X—ðÔâ4o…ÈÃI …iËP d:µ&B4†+sky«Êܵ\«ÍŠÞëÆ¬šË&³”û[M«lR¢”w$Fš:5Gó¢ÝOy¾L2iS‡@l{a¡h„YYÜ:úU7ÏóAN«ÊZe " %`µ–ObÏ[éˆl¥ŠŒ±(sdòó“rIKguC–'MÔw;ä æÂË“’`å™AcpdÓ¬Élf‰ÄqVQïÀ{o'1]dܦ"N9?‘Ç6ÜIf7; j–N²kêÞæûs(²­jm"xa§ ÄýÛ?ˆ_жIihZµl>Û R…–"œH"dHg‰˜3A5 B"Méõý_?^û¿0r,ŠŠcÑ‘5ýþÃÊLŸC²u;Grž+2ÓQòV-‘\àÇ#‚\1O[ L6èiÅVúêø¯U¨Ñ“¢Ÿ#&P0—8‚„¥ JvŒµ]-†–¾Á†dd]"Ù?s%ˆp¨p©¯K×wdMO<Öôªjæ­æâÍmëRµÔ«k¦Éˆ+ù«»º[ÎBhÈSiszVõ3M±X’¯Mn–ÚDƒŒ„ŒË ±(lƒ€AØ1á4°0r8dr;ᦌ™T¢ÆI“1c—UuÛ2JQŪUc¤†ÑÊÁµ‰:Z»$bº<·#÷¶>Q&µŠ÷4—ÈÖVp®eÎ_sÑænÙÊ哱N§†òZà ³8Å,nÀCS”Ÿ‰ ]ð˶gí–òVê±Æ¿[;Cç÷Žo¤ýz-}íÈÏ8“Ün*YHÌÆ%K<’M¶f¤â²DÑìí?N1áQ=ì÷Ñ3Z‘Åôý9ôé›õþ½7oN+ßfÜsמ¼1Òõ›ìCGâîl‚¹NÚù½âBat1íb=‹´„˜©=\Hj­‰ÅYg šïåO¼Øuª’áfj9>Ý$d§‰‡—SᤦQ×­X€Jb¨³+Õº ÇC„Á¦ðF t‡ñIˆ¦Ÿƒ Ê¡²Á©ÝÀ&Í¿)/er¢Çä95$ª)ÉJg2(Φ*›’$Õ&$)Õ‰’?@üðCpÒ¢áå)›â‘´½‚DÀ˜ ‹Ö¥|“³!¼.Ç* ´£³¶(Èá„)É ô’¤ház,Ø‹:N÷óçMõ±{;.T\àw3zô“$áI€Ä\.^†•ØåžÃÆÜP.a°°zÇwIà&ä¡Ð ¢.„ãRF, L“µIÂY«i€íˆJ¢pTOADä%W E¡ƒHlù“Ó°˜#“’FvU˜#¦bBiZMã’¤°ªa„PE.c$p¢˜Å1á¯SlˆÞFä#e‡:É:Ñ,É7ß*ð’I+'w—"¼ Žó˜NVDûN’{©;8‰›—qð B)6c &¥5=C Ѳ.&~añ_"ó¯¶bMxm¯ÇÏÏòüÇ¥ç¢N‰þÅHR,‘*÷ý›ó— ÿÏ÷÷ÜóGþé ÈÿüàaäÔCº¼H‰ ìnF§ûdu‰›ÄÒøç@ ª þýª?¨ÖÏCs†’Sc‡ô¤œ'ûdb[âJ}ȉ üBOdþ5Ú?Þu{Qò5´Ÿ¯‡ÝïùÚ¬[Å$óÝôÿ\>#쇴O3¬t¿íB¦ iKPüÛŒ=öÔ_S»ˆg'öl77ACnUÉ N Ií?(õ> óø¼òžç`é{8I\Gª²~‡Ÿî8Œq̇§|“}æ{Ùñ¤¯«÷~)ö;~GßþõGÚ±#§î(ø¸{ø›pñø5¯Ë´CʤU“èGÕ>|‘µR ‡Ñ‡ªOÁèûžæš~×®pøO)ïcÓž:&pbø˜nzøx òÊ/Y¦üEÍ®„ I¢ÂR1TJ²‡@q~ÞFÔ‹NÊÇh,‰é]šOËQd¨}M;¼>J>ÀŸ'äâ$’IÕ$Iô}5íÃǤß»ôLÈ!$P ‰S®(÷WØüŸ‡ÔÓÞYô„u“ñvÙ>Èa“Éò“»±àoÐßÝ?4ÜÖ»Ïâ§§–EæÏ‚ø#£@‡Peà^\;>ê}õðwýéþ™÷öO@ù±ê<©ü¢–f* ¬ ¤BˆH£Óó²'•H5504ŠRJ­‚´•š £BbØ"¯êk”•S-¢­S6ƨ֨Ä ?Aöÿ˜øì`çN?úŸÁÅ_ÁöÅúÏhY “Þùˆz£ë¨u‡÷@—d•„"n׌i‘Š!MIš#dþ.‚Yñlm¹ä'çáç«ã>婿'±Sí§,LeagÎzá+ˆù}ñý¿4Ÿaú&ÝÜ¿ ß™ž–J÷ŸºÒù/_§¡ºÃç'·á‡"ÀzäùžÀýÎtO×ñû—òãèv¶Š©=dŽÅ=>Æä8¡â‚t8OÃuwÙþu¨ýõàc©;þL=Gñ'ä›~÷¬“‡ÈµøD0þD3Ô’I'æŸp•ŒÎÛº€¯%ëz —nï÷˜TÅžøŠ\ΰÍçˆ_'Ÿ'gñïÞü:Îî¸q$އÉú'·Ë$‡”ƒåÁS€€"ý?‰™Aø“L3úÖ­ZµÍæMf/Ñ“i¨a]NÎãÇeóø»CeE2EŠEi*ÖMµŒÙT•R‘KRÒÔ’,kcVlÖ#Ue†”­šÈµ+6ÅT¦ ©BÊÃ’„,©Jí%Yµ¥hØm-¢«R­…5T¦¢¶²U²¥dF–ËT-¦Ú•²l³Y 4Œ @ÐŒ@¤$ˆ2“0Œ¨Ò²K0­C²B…S*RŠ b­²‹UT®7ÔŸÑ$¡çÀ¸sX¢¹=AÒ+05Íö„ŸÞælÿ&°òchzضÙÃ:Mÿ(‰ÍΫ¸ÜêðîCEuH«'R@硈¸ÎêG<¼Sdô:«Äz¿ÈꃉÚ;úK„ßüÃQÛO÷|_ç,“·ªiîwy|¹HIñF߯v‚Ëùº"#»‡BûÛÏú¬†›‚Í“À¿âHs¸G:¹9U”yqÄN‰"ìûüTô?â}A4Á.yDª‹ô>*?c>FŸGÀX;‡³þÊ ï¤矲qþsð¦>R¾ ˜É9ժѶ©™&•\ÚôJéGki1DÌ30r¥–h l{kù{iïõóê/· år}º‰£h66Þ„\×+sgã«scoìW ×ÉiÝW6®kínm!¢"ýv€4CH"€Ÿ9z± *¤”Iþ°ís°a!än:%Å”ž7b7£I« 0§adé¨bŒ’ÂÆÓ‹ Œ &ሥˆBW»8 €¬)Æ7ÊG‘òô:‰×©0’½cC@Ù–Y©N6ÀÔ†NC¨K´¹P”®Õñ¹®–à„mcW5Yµ-"ÒVlzªójåUj4¦–$[*¦ÖÚÝ#%L?¢Nb”úÏõú¬OìIËõ:£±#ÒO9"ã øTÆŒ©ij‚DbUÀ1¾¸é¥Ø”Äuñ옇!'þk'§n¦¤þËÖ ”Ì0œFÀ <„K~)Ì<Ó1ï÷ã)“‘íÙ>²‹²}¹ã¬h“‚| “5}íIÙÌRš{Ù9K1bXŠ–§Í´x|éý”9uñxœyWšòùÎõ}Klü·ÎÛO\Þ"?O®“ÂF…þ^Ffš Ÿ+ìSK4„¦šO›Ý÷´>‰Ë¼Q*ÕOîz¾fŒTξm™*Àµ*Á7?ÈèÙA6 Hˆ*¡I 'ì;1@1–•¤hQ¢…I¤È«¨E²–¡B(b(8¢ò§$h•¦IÔѱ»‹m¹´¢©j²0¢—:˜ì›.ìÜxЦB)£n"¬tÌt$Òs/ p§f`•¼ˆÛ>Ýl~Z=_q>8ž§Å5,Ÿ“é<ñMO÷¦|¾Ãë¦AKC@Q¤ùø¨óø‚l›è¾CÅFNž¢é;§ÀyPÑýÞFꢾœC5E$A  ÖE„ùAÐSDë$cÒGÐëû€r¢¡*'Àòyëó~AûmUk*–ÅVòXÅE‰²É7wÛ]O¢xáìà3“à”ÿS»°}óÜú§gÙòø»b' $'À„ˆù¼úú¼'„£d{Æ?ÞZù³%OWÑUGÁÜ“ñ‚'ÛHŠˆ?6É_C$aú–I0µV¯›TZÓWíL1¡FjHÚ*SlA­X¤ÆÚTÃØÉBAE¬[6›RhI,Í5Œ¢fi•šÆÐSf¤IRŒQLÄbH‹JlI!D$Ì4Á¤Y,•ˆ´)1)CD©–É¢"@ÌÊ’£IE¥”‚ÁLJ˜Uš²%¥*K"“E²ÚY©šAKTÍ¢f2•‚ššš)lRŠÓZJRE!bÀZ4QŒ–€ƒH”lj$6Š1‚1ƒFÆÐQVK%’Á`M±ŦdÒb64ÓJÒ¦ƒZ*–&Û3T‚j„R”š¨@¨Å”³4Ä&K5–[H›lbÒm¤¤“3Si%VV¤4$BÂʱS(0Ê´‘¤ø©2Å¢ôÊ«,Z)MF™ˆ6Zý•Þ¯kWηS_ŠïbFË[%¬–¨Ñ³|Ƨ $’Sj˜¨•4˜¸HàI¡W8 o¸0ÊFË€ÂJ#ØšƒéûÚ ”N NYL=þƒ³ûJDð?G$äºI²>EäU“fϱ<:;“èåú^Q÷4aè±?>Œ=’N>ÔX4°J>þz¤ï;x=°'¿æuDñTù‰ÜöPúJÁ¯¥ô|½Ó²“84Dû¥–Y96ÂÑL}OT§Ìïî|Ý}'Ièó8Z¦Iü#ÓYåó’HÞ$zÛRÑU (t&DˆÂãñA¦â>N"Ssm$¥»‡ñEÐìA}—H/&#øÊ‰?Œ’mV¯' ,1Rš`Lp¬'¦††%”"jŸ¡àÐ.ÊÄ8upÂ.Æ„H °¡"›,‘¹‚fÛ ¡ôK% ”CÅFÇ0Á–1„72‡"JA¦îç;ŽíÙ×us²Û‘Ç$HG22I$0˜ ˆI'Àªƒ`À“$‰DZG*K$z#JŸ 2'ŒE°Œ&æ.ˆr–› n†*ä¬_ ‰ÃÅ~á[¥²1! äBvvª€öõìíî§ÛðúþÿºÈð#æûæ,¬iˆýò¬²ÙHådmÃñy~_ªO_T8“ÛÑòvúGxyƒõ9Šù‘÷âv’¸aÕ˜mdžŸ‚Ì>/ܯ<ˆ?Cõñ:UDS?Cè*ú*¾æÿ‹µ#ï‚ox×äY78²béJD¤ˆaƒJ)Hê ŸÆ'#D'$ìL’Êè€Ã‚÷ÒlSn0–jI ü )d¹¯ÎMÖ¾iˆ}uUÚ–ªü±208Ѝ¿ï ;#¤‚ ) ;2'X9'.6H.¸1C9ÊpŒ§*Ó Œ™6s»"­å1b;†CAÃ*ösY­f#1€ë,µ€®¤J#WF`a •Q5"¢† 2i…±3d‹i¦¦mpMvmM-£aGC Êl’`pÆÆ—ƒÐÝÍÌTX>öŤoÑØÙ]Ç’8W,21€‘Á2' =tìFƒ“‡ÿ™íƒè—ñ}¨ûlý£ˆžªyi?ü„¼ÞÁäù/™òß'<ņ"U¶›+ç'úùYçI$ûgÞ¼Xì½ä×ôuíP9©â‘$‡àšO¿è’#a‘=c²eI-1í¥ÂXcÉcçô?ã üÐöøŽœO’}½SÈúáPè‹Õð+Ó¶¤Ö¿wSB¿„®ÞIŸenvè±m Ž1LV*F)øAX&­ã! ËO]²$²|ìþ qøîäëYä»Ë¦Îýuʯ}nõJ*^r´Ó™ë©®õ3®?i§êH–A† Ìm"Y@™¥\  šÏ?·ø"3tz}¾¹ÙyŸDnª‘«…¨Ôll`‹ÔÅŠ»#jmU6¬RU5 8(‰=…€è¼ô%6;KаN‘«Sɲéç‰Ô†D6 1 èν›GNdîŽQµdÇÅðgûÒÈ;ñ7Ñ6ÒwMAÿ]„àǾW¹£P}{(`ˆú!ñÅÌø™\ñߦ)—†Wgœa‚„õHgc#æ^Îö Æ9Î@Ç7r–K™fm\7½>7wVÒ°>†Ÿ‚tF'W E~Ýõ¬‘‡\pdžúÑÿKʺ†ó9­õ,ÝYà×’„×»sqœGGÅ4t§üû|5®zõþO箬I¶†9ÍÀáCó}‚S·F¢|]r7% 8ÛCBgGA€Hq^|˜y9ŽÍUŽy^5f8~—$õûI¹ãÁýñ”«×[r㘎\ÇÛäMjSÞãÛ^ÃC1D?oo¡¯(Æót×6ëÝï]“C»W,|nnn˜´2ÉkÍå2¸¼Ö׊eŽídRœ±8TWªñÆ(v/}`i¦qøz¾œ ÀAγä™ë_l¤¬– Œ4ºìkûH¢ÚX¶e6`6*A‰θéFì¤2–TÕIÚlÉ$§/< ]Ç D@q—2Jë]A_¢NfCñXåÜßdë!1ÁÚN,*N>ÒlŸO2vNT’pUš$¤!'M5!|"¦D1ÇhÏô¢$ƒ¹<"tr|þg´8ó^ŒÏBwgŸÒÍÝ&‡Ws<íævÙè=…vœrÇ*jY]Ý0è·MÏL—6Ü‘ËA\jâK d§[,i£“«#5€Ri’%î;)‰`ùWyœddÖMTÜdس#qå·w`îsòžŽéÛÄôë9¼[¨k‡—û¸Kb¬U…80uzffcÚÈ,Q=èé(³ß?C¨ïK6x™.ˆò:§Îì€@t"ªROg€ÀÑ %“¯—´²[Ü99ñ¼‡Ê°ˆ’%‡0<þ'GáW>+ì;‰èz½„6IpåyBðñU=¬'ÉJëàÙÔ{Τ|̸D¡fY}][¥dÖÒ–¤´‚¶£4 ÙO­6µíbŒËJR#‘ÐÄñ!FÖH”µ´Ÿºx½CŽƒÕtžãñçã20ßÉ“É^°è|qè“ͨB‰Ó  _ ¡Y>2kVè@Ý’ Õ¥ˆz#ï8DÜ’?«£¥n'E&ÑR+Qƒ²Î㲦û 0hSa5Î}¦Aù1ÄŽ"%LÜénÈiT@¡¨«w<—”ò {ª<‘BR>ˆcIL$éó’ƒ%å‡~}«ãAácoŒš*îê&vÿ@Äé8;†Î%>z&%êšÓN³’§Û»/v‰]QÍù‹Æ³bø}Àmð7Þhª r‹?úh5xd¾Šiœs´÷ñëP¹` ªì»&o$ii;[ +iGt7ge´ády#¹ŸXÂÖlÆkeÛ€‡EyUó´9£†dÍz’s!O[UÏ0òÿ-‡&þ´†ømO¤ožðÑï׊[¹”ÞdƒC³¾æ“²÷ÓS]ûN$ï¦æÝ},¹Á&ÑèÔ=ºçWO°êÉó'É«§ÏS®Ýz·xn‡püï}0…¶®~ß?³AŒ3ãÝí³Ï9ƒé¯Ä@Š«¡'DeÓ@¶TDÊJéÈg#äªôþŽüõÌG;þÿÏ/§fÓÇ3 U×XéÏç¾Kasúu¨~‡€¡š‚‰ÀÛ¿¦F¸Æ«VÍóVpk˜ÅÌÈ”D9)‘f´&¡ƒ©²¸#ÀÁ4<ë@ñ%µŒ$‹£ˆ^Ö±Y2wf¢§Á zõªbǾ´¹ø#{î‰ãDÁrÂZ¨1ᨕ`réÄ–2‰¤ú!¤ÐéÚ· 9&ÂÕT Ã³ZœÖ+£†Ii £ÒWÀ®SiÔò±*¤ÜI¢6Œtªð,jeE¢Ð¼D{G,«Ýdyðo=ä˜ñØ„mçMI‰æ—G6šUzÏñûÚæ×¥ý#\Éuƒh\Ží¡ÃsÝîé>]íñ}«è}ytľ5rÉ3ÑØ’5áŽ'Óºöã¡èž%û'‚îx{êÖ¬5Ìåø›<ÅT’éWÔ êiå,:y“AAL¾°¥Ÿ¿®¼.’o¯n2zÅ„¡1d›êéJ從¾k¦"””Ù>úì\Ü’a†·ÅY= r„Á¥ƒj8Û}m½FL8áÕ£zè·xlSD:8l¦b4šb9Íͼ-TFQlÒ³v"ÙŽN‡-dÅATPIËm„)ö„s3?õ¹šå9rÒ>X¹±º†§l¬9HÔ‰»DEnn4F„\ãq¢ˆŒ'xß­•Ç«—´›©â'”†QÛK--pJ”‘jïáÐÊ}\êæõbÔRÖS ñóÌÄâYÇ:çY“7þQïÝÅÜH{æv‘Øç’ÛÙ;¤éÅÎz³ªä½9zjMNƒ¾»4ÃŽýºØ8©é½4¶D9„ˆ²F[SÜÓ«³‡yˆÛ©Iòx;êxL——a @U3PjKaíÝ·29…ó3&jduŠ*¸ž2Usˆ†RuvÛ;MÓ—*)³"¸ŠP¶ ï»FçA»§uº&·J½oí-eeU…^‡E1¸,ªŽŒHÂY\¡Ìƒÿ8¨BÊ;3#Š2-—s0Ó”C8`ˆ‘ @‰ƒ:&@ó23ŒoºÄ+~é;I±Ò"ôOCt;*<(‹0„,à›ÍÉKT¾®5£]òNÛÌáÎ3»ÚR¼,2¢t·®ÝyÉ”‡òüMç¤ñÝ[½÷ßÉâxàÆ©ƒ„‘AÂ~´ó`$w4ŸgwESËéäé:3ñÆŸ÷_!…I#2cÑ©«Rd¾ï6Ç©08RU66™Iƒ”9ESÂAÀòä# 9™Ž¯IÂ-»|ÇhN±5ñÑ×¶ì¡Ö7—;þ®bH9ïöú"ŽHÂ2„R + HC áÐUŸjtÅ¥ˆÓÑ9Hyg w«_v±4U”°©­dX“dòÆŸý~Óˆ>ÇEeNG¡¥4d˜Ñ™'µªÓXÙv“IÖ|±ù·âù•Ì“ÔÎæÁ×ôÔ?néÕóNaRuž`›;ºçÈöé>Òq·;Ï©©ê‘då>¯~‘õò2Ä‹:»çÝ`cOÈó<Î<ÇÎtÛÀáô"1âá¯ÊÔc ™PîˆèÓ$>)°åòaåáÒ<S׎ct™Œ‚kqbY&Äk+] ´O•,ª¥’‘×|8‰SGCLTÖŒ}ô'¯(dÕ4SRŽÏ«s˜ëã¾Èðx‰"L·Äð‡S¶8YyÃOQ‡1¤É2bESrŽƒàm²âc˜dÕ²&U>ûvmE“É :4ìyéX?#¿A9ò@¨‰8Y¡î¡Ç•pvD sÉJÚMD@âHžLSîZ޳ÒlÁÙãf*õpðGGÅ?«NƒhfB ª’*mõùŽÆƒ… 3D$8Š#ÙHö8g2Y­3T¶RšÃ”ßjèA°ÛŽá”¡¹¦¬k'êpiL~ãRrâdæ8ÔFêÇy˜Ÿ«upS ]ÇI24Ñ9:n'ªäÄïú²Þ¦T[¡ù&ÛIDX<10xÇtåíD›Üä&#…#ia1ç‡Ù#äš~:ûµÆ!÷oÝ?–lýxN†ê"  ‚Éç-±-¢êòÑ= –ØeFRDR|' !qeMB„/± ¯z¸lÑ7»¦*×+ñ;FÙ»#™,ˆÒ|rUß–«4vcJ¢:®B¬­&Hš*ySº|–W)v©û¬_Õü0¦»hÝk »³Q hˆAI€“ö¢'Wó²G<§ÿŠ8ŸOþyùŸŠq«jÑcX‘SÙ·üZ’?OóSªð¿ªöÒ³ƒj‘þÆ Éño“ýqd¦9<‰ÛÐò ?^O$âM4°Ðå:©ìý+ëæ½On@ÿ®8‡’~) üÁó#Jôª!&@¤f(”`"ØÁ*Sz!§ó™$òªªTÕ1XüQÇG'`ô„6ØHÝO>²7šcïwë¿R¤Gõ×OYO‡Él'˜#ϼÄux’¤}ümðnFvSîê°©}pOøCýSª•ñöÜ<†ì‡÷òˆ{|~Ÿ2Ë>‡úòTÝÊrØ=ßïípp…–{”© K}' ›ß{s+edÙ„ÿî•¥Uð}Ñ´‰ø¿ÉÐ Ûb-µiþsö~°äö÷çÊIðö¾©£ãþ&ž°ì›ìAÃìx'€ªx}œà9½Ý'ö=XøS|O±f“ÅÄÆ“c_­ût$·"¹99Ü÷¶ 7¹sÕOFð¼lLjz׿~ª4=Ÿ’É‚?Dú©’=ûœ °½$νâwÓ´’zFEªGËì—Îçèl×o¡\ÈÚˆˆÒ–È*J$’(¤‚‹$Bˆü¤m>pñ?”NRi<‡ÖH‰ÁâOÉÖ#É<x…¹úåá@BdûþÏW¬ÖÙªš›%4©íîüÝ`Ùë+÷虩Dá)õR 4J¨ì±¹þÁýÀ‚ /¸xîp$ýß’¦ÚaØÿ¡ê¿¢lÄŽÿçû§GØŽœ#·ñšŸvpú èö|äø°}ÌÁ–TìAú*úû#÷Gô{ó#ß¶$pêùzš>Ž&b&ýO¹¤>ò@xAêôTé½%óCòDC±S—™ƒý&ÑBÆE›FF€Š Cø­f C™†)?ÏÒÃFžÓOÒÏÔæHœSQ{EˆË%RªÛgcö7=uÄB4…zcÅi#ý’IÛS‰_ÓX~ÒÇr$v§§c`@}UAõåÁþßì†ç/>2½…ý¥ tþ{ABDŸï€ÂRI ™i”€ ”Å‘rZLGŘ4È&ÚI&{Wª*)Ò?Ê;[á7}’\#‡®dœ« ˜@Lÿ,á… ‚s™ßrHr@Å.pLG“@ðù„M©’§!šîyÐéQóÉÊùW¡éæìŸ_i=SCÖ!6Ð;žf‘è± š·•jOHüqª|cs»¢G£'¤s$: #Ö2Oh8ŒÇw3hN\ð³ýU0ðÄðŠ…§U'xs϶íîØøêq dâöák¡ùrð šg övQ gŸ»ºMÞŸZàšwôy~ Î¥zwõ‰=Jú=¿Sò†ª'°ç!=SSnÂ|ÒñŽ‘Þü+­îgù9•,Î 19DIy4þ*ŸAÛ“yWù©ƒüÿy' ŸÄÛØô{l‰äþ¾„!'×!X„ul7Æ –À2B€ùT¸È~JnbQ"ŒÂnK¥£ `¬´!q›1Ónej’k åhä‰)A,ýœÌ£ºYc„®?’i8gb8ÈLMà¶ÅâÌùÚ]uwÑÚ½ šM¹µ´I¨A*à2ºY ‚ ”³’%’›ní²Q›†¸>ÝI¥¡Üâ¬%PÓ$Hbq¡Ä£yèíÇ•4ñE± þöÙÙw €gï”B@=½õí&h5€²ÑÜFÃUHoSrn $ÑX›“JGv‰‹]IXâ-Á ‚cèJÒ4çM4¥fªÙ•Ä6ýæË!l’/&p#ù"$ƒ€ÆœWwB£F”òÖ–~¦"æ°Âœi§ò Iâ ð›2˜®@ȉ ¤!'ÿi$ˆ‘ÿXaÿè–SÃÏþŸ@GÝ$Ì*ƒÃu"fê<«ü•© Ä2éõOq·Õ$„ý£äü¾fÿîÃëûÑs³ö<‡ìŸä/1á gŸà÷üôr}ÍßáÕró?Ü'?Èøz|ޱðùžÃÃàƒå„(·™òܽƒR$¼*lçI—‘=ãûÎtfŽŒš{Øéî?ëUUÒå>@øéó‹'ú§¿¡òë?¯ýü¸¿‹Ú}®çÐbyûU·”Ÿ_½Ó¹%O£¹;ضŸeHR'»¢`ôLI“­€zÃs¤šÅL’›“ÐMÇ0osjëq’™"A¸dIÎLG½¦‘’tbÉïÛ¯±¯Ãê«Ê¼òõØõ_™ý­·oƒàÃÊSò{£Ý0¨õJ–¢i±òн¹ËølAàøèÔAL“2@Ê JW {áÜòª§¸t$¡¤{«²<)éà»uËàvtBc¿Qøˆu÷õïÇÍ|Cäâ@÷}É}AÊÇ™û?^T]?ãÿþb‚²L¦³0% `»¿ý€`‚ßÿÀÿÿàßÿà  Ä—ý€R DQJ¢@!*%$ªQ ë%hh4É¥ ¢J %J€ˆ ()ADŸmG¦ 9½u$„¢TªJD*IJ J•B)B€ D…R@PöÕE ¼ûbÙ}(§QÍ2‹bÖÄ+Þ=éKÚ”S#k(åªhвӬ¶³&-VÖb4Yà{½Ü{ºzõqÜ­´Þ¸EA BD¤ H¢=&Òk"ð 7.á†@:Øê”e¸: ¢€” ïnµÑÛPN±¦í×K€4­£Nív\‚•§@ 5MhÝœºi €M· 7aÖš¦‚ØÕhdPèk]u¥Ø $é×N »´îcFZ @ Q@@P  ïžT+ZWÓÛ%Y²E-U’©J T¨¢UID³JJ ¥Q¬¤& CL¶j ‚H%Tn·@Ð*GàÛ¸>€½óuå—¾ Ð络wO°´ZšÉZ@¢©¬Y ²”Ãï@{zÖµð,Àúvô| ¯ˆ:@©à:S|9Òû¢ªíÛ-JyîôzYm÷»€{à€(P*¢÷¾€úgp[D'MÝqÖ¹€ð}¾øà¨6í(Ñâ‹R¥ï\ô÷ÓšuÂmn} >Þ)0ÐP’ÄÌôÎgË:Ù˜>Bz¦©áí£ ÛÑéUG@âD/i0Q˜bí]aÚçvì÷=ÊÀy6Õ"ܘմwvR—¦’¯3UìÝ,Ð@¯e” ŒÑð>縠·½ÞPß›îs¯»’Ÿc>à ]š«\›`ÒìÑF„`º‡¶”P ºžÃlÔOF*ÐÎÌ"Ó{5TŽ#N=)IÙ¢Tª ;޽ªª¥]ŒâBZÛ7mEspУH9›.±™J„–Ìï]in!Ûy2$¢]h[ºÒ°t#j•ww7%ŠŠÑ¶…mDÙk[ë¨U tu¡®±;tØ6›hnÚggJ -v³ª›cR ©Zi*D¬ÀÒ\,'T4wnUUEF3Vš%Zî#¬–ÜÑ)šX%»¢Œu³fÓ ”æ·n¤5]lšš¡H®àgvwe{aW“×°¡BÏ%,zÉY·Ý¦QÛ´«1ÛRªÓ]†R8‰)ØÄs·,Ú½²ž=,u¶d€¡?%@L‘‚SÔÐõ=G‚ @ 2BLššL”üˆ†šié4ÓÓ(z›DôM%=$!jL)èÒžÐQôÊy#õ@hOT”šI„ÊŸ’†'¤bê@€R"LÂ&hS0(Éè)íPò5  TP‚@&„Òiä†DÑ¡aÿ”Xßðúü¿Ã?ÇçÇA_ñ¿Ò÷ÿãûqÿ_÷˜oŸýïõÿ¢5«#«z™¬ že¹ßiP3”’.û½/÷êÿâdŸµÿÖ»H.¹p˜ß—ð6(#ŠUSôŸ‚± Ü‚ riÝÆJ]›L§8278Æ^ÓœPÙvÙaç¥êØ‚Gˆv“¹Kþõ<’“¼rtj3Q48ô®‹%É-JÌdÒ‹Œ‚‰"÷/•;Æaõ*Ó#EÞ!żqâ “ÁDMà„l{AÃd¦IóS‚I@Ea$›%>ÌHê17N {…Ä¥g§P Ï bÿÊ3­ÌLÌÎ,‘Œ¡žPzTÒ©¸zˆ#£FRH(Ré!¹F]ÁÓÁÖ³k¢Ôé6Ü'€ù„aȃ´…•EFwáâ!¨¶jÞ‹šK'‡¸uJ7z"Ṙ„09õ0Ý–‘P£øâ˜s¾÷}oçO4±´#F»~MVN>¦’ Œ¨sh<Øéí#í‚表敢<žî4Ç3œ/[\䌰úåï¹§™Ç>›õ |Z€H3Vþð®÷ÌÓÄЄXl)‡âRd¢oºÎ°c<¼<Ò]áÇœ"ž’ü˜uÆ%ò¡úwé>­¡åª5ÿãeÌùÌkµº¾å—ÑÚ2ä=‹Q…g2–áödºö\óÇrÕA…¤›zTGWßPðJMSQ åU>û0è`ìÑPhêaÑ-ܧ3¼¼Q’ÑËÆe$‰¨š!tE/Z²ñ RáÍÜŒ­½…¸O…€¨ëIóqD*¹¥2Pªab8¢t?äïIª~:Sãâ]%ÐF‘Âæ”Ræáñªñ5ãåÕ=k(ç¡8ú±øóº2ÑãÙ ôþ_Hxë‰ë÷/Ü vq.GÒPqMb6G8}ûºxSËš)¶úç+Éă—a994¦Å»90 Œ¢[¾Ä<³o¥à£E‚#i6°ïœáþHù7Qœ$p=žËàr]atôân0ë% Újuè ¶ðV®yråfӀዠéf¹ÃNÕêýsÕ }Rhß{Óèáh‚Ðè8ÆÅ 7°Qö¸×Í—°OÚò‰vè·@ÆRF÷Y,ˆž“‘"bž‹ŽÁL.(áw6«l(øP!ÉéóÎ*ªˆ±øýz€pQÏIïfeÁ•šCÊFðf2í‚Âêy3eh:df¡Ü«Ã±ñÜfL‚2C¤Ò_Œ:(FT‘M¤Š„b:1ÇÜŠ¦¤æÿO[·“†¹¤S°ÃÆt„վ˟˜C9<¼äÑ%ˆ$gžö:I_&âÙë–¿»wr^ÎrlKÌ¢III‡v…r¢ÈN˜×S"[¨‰œŠ»¹A=r`uí`JÿÅ'-eœ’ \Îé2ŠBj{o§NzN¤†WÇÍ?WÖšTÏ»+›dk,#§¹÷ëÞï&xV$Ž"H{pÔÝŸ»ÿêžY§êËöSûßÁ1/ŒÌãz‚©ÒˆÞ]ÌíOX”_Ó¦c%A|¦ÑœC & ã83…JÈŠpTñ2›B `–—ˆÁè, %K«xÄ;¼DxUVæ’‡“7ŠqøÂ8Âi ,W¨LPDd e4ÌÔ=ã÷‹J œÂ™Dðt2H—xˆÆT<¼ ¼ CíÜž”ÈÁŽ)bŒuõ²] ‰8uÑ@³¡en’I:Ê‚(›Qݭ³ÌÎ9¿o×õ]ýç”-ûenÝÄ5øPþµös{À‰‰ù>Ò¤¶žy6cëKqÄr91'–å²9ŠT=I‹ëË’³§ïx&¯?«vöö^íRòùaÍd6÷k6vÇøºr:‹”¢‰!}t ~ÛÃÈ-$žc£u-0€£ŒÔÌ„B!Ë"Θƒ£ïa"OS}ùež< dèù»NÉüòi¬×lÒœ3°WIéA¸³na:B§R½iYmàžBÙéZáî~·}{oÎNF8uŠ£Ÿrb*¢Žl‚¢§õ#þž¥ýzõðyérÎÇ óN5Ó™ —#Ÿi+„@üsÛÙgH$¢,HY뚬ãqÓ¸̸m–(óQ kæl@®má"P-¹Ë²¶ªÎÅØï7Æd\=¶¿~móÔ‡bALúvo%WX"–÷U ³$c s EaD·ŽˆÞµ8á6k(\+” ³b¾­Æ¨$¡¬ ¼™HÚ‡ë:©9Ä¥‰8—”9I Â@†Â {~}ÌÜ*qÏOµyë ÏDsÎÎ@â±Rø”é‹N“¸™òP#W£$!N&S9EË:@"&n¥é»9×™†ÉláwÉq[SÎPl—“§ì<`î@vüô­ZïÍÍO“–*µ2x¨LúÏVÔŠ?ƒ†Z¯/6kœœó›¬sv~'ÇëH_ü4·ó|˜èb±™D©Îs‹¹öŸˆ¦‹Ž2~ñÛÖˆPþ»~ô'ñ# ¥)œœ|:ð°Ù“ë>®duÒΩÅqhï¥ZëY†ª ÿLC1.°ÂGdû©h& ’dK ZAûéßXòÉ'­ËE ¸ˆWv$q598ßU¬`í÷d>€ß9¾H¿1PxQ*n'4Ž2„ÂC%`ËÓ…®k[ÝMŽòÈå@ HÀNNç7CÙœ&É ™‚ c¼õ"¿Ï1PŽŠÔŸ»N¢õëdòç3_ëu㤳tôùÔÈ2Šâò"ç¥\A´é†Ò=;C`àwŒÓãOé-oU ܺ§‰Ì之A­œúTFÝI‘ R —ìíädàáÐRz"„w¥ÇPˆB´ˆrÈ’’®úqÀdÑA >õ•I‰w`D¥oß7CégeûS7'“6¬¸÷Œneó(fÞŒ"Bé¿Ó„‘Ñô³Ñúþ—‰ôÄO'å'âN^ê 9é)Ywtä‡H•ÈwC[®°©d%o¦tgâ ìjPhHjÕá”–Uúé332ébaÅe^ïDa8•ÑÀ.bÖ3®ï^ùXKw_ž\*ÎmÓvQóËéñ—–¾üž{­œòSÍßÛ4ä‘I—ÝÕ­qoT»æ3Z4:\/”ž°Ýà²ä±ÔñÛWZ!Q—FH·NÇ pÕ#rœAÖ"†Çؼ–nîðtÓóƒ×yXlO¹êéüHv'å=ý¼õžé $²E¡pSE äF¯’.UƒÇsù2j¥Çgwê`Y ?á׋W/ßïaIZ§îÚmü{î`[K‹TÑî0ù<={ÛŽvò»2COÞï¤y®š~Õp„슗£OÔ¨†T{pÅN˜Îœ–$E®¤S²—wî B'¢"Èwb÷Þk/O*/»ª,lHA §¨Š˜ùÌf49rëM¾s2ªA¦ÜÓ`ÁGj§8Às‘ „Ô§"2¦ŠÑÁtD |Q%zTR†‚ )õœ\Öl`½»ècôéÀ›YŽ“ž»TDvE—]#F߸F>еrŸÜGPí  aÝõ¹À”(e÷…=pî^ÝÁ”R^)#êZ½y31ÓÆD¸‘Q©4óÃYŠvÉG[§l¥d´¤Ž¹·¿2cUÂÁeÄBÎ"žb§ÈU vÍA¤î ¦È'ÉPR¼OˆF;uÓV” s¢Ôï ÑÙÆ‹;¡ÑxX#:€N9—Fð¥D'1‚´˜Îs_®ûé÷ظkøp[sÕœÓ\à³eæ›fÐO˜r2D‡úñ\R»ÆhY”Š2é!P H¿Ò™§gȪÙ·ÙDV`8s”¨èŒ–ü€$RÉe’ïïs$@«IŽÐX¤Iˆ¹“¹~ù´‘BU$ÎÎ2N™ø:Qtî.ó4‡£›^/3eàMÊšµ†*© qœÛâq’ó:‡$§}€mÐÍÜú6èšOHH2`e ê]ùC¹€æI4ùO2„¬4–Ì£X·" éb£sx4\=k0Ê©9CNêŸDN5™Š¥Ôó"*4l¸ìÙv$c§§0æpïF!(‘2\]Ax‰ËÞ”Z¨&aiî(‡z‚ëOW%pXYÉa!½(:áU‘%9CK.b*DSªÜÍgé3Œ[§—öS^½>Lû»Ü蘳ϾµŸO‹Ô¹ S\¸Ñ™]? õc”š/O¢^ˆs‚ÈèÍ+ÄKɉ—à°ç¸Y¥/­ÑÅb1­ÖT£sEÓ²†h§ÚBžã)}¤“dŽa.K¨Cš¼ï.ðIÉÙoFÉ@”Sž¥S¸ü[5÷,ÉëçÈU“GO›ÓÆ=ú®^hNõg¬8“Uní`ïdTÐR¹"Ì™§HÆÀÊß{×þÏÕU)T?J¡Wî6q`DŸÛô0|Ó1Ô'eÁ¡‘A ,¤äz Âè9m¤åyš°p„‚Ù•êó]Þ3x1E«wbcƒ$kKè(ÚÄù®Hà‚ÛЃ•oyÍÒ´ˆ;É$8äÈ’U81ÌkPhA±iiÖ»3qÚ§ýÙ_ŽNϧƺâ{JþÔçèúÝÖ\ÛÜUÓ©^ŸÃò¬^r X,0DEôa­? 9;‡0¹c§ô) Cœ¼ˆ‹“%Û V¨¥óÄÚ©‰“Œ¨¿YèËœŒ,åPªS >¡UKÑÁÙi0LÏ0ãÊ·@ØW €Ÿm"xp!6c)$"Î,Ä—ªJ ©X‰‰;Y7P%d΋¸‰Puгƒ48§\„ÚßTç]F‰à"@rÓ”o3•/…/x‚F +x{Ô-¨‘d`âu)ÂP¢Yܱ!ÌÐrI²b<Ë‹U—í%b2}-¸\:œàíkÓæ¾b:W‘Þ•Ÿ=ËÑÒ­ zÅÜdÛ½cf² ­‰ID,tº8#ªYÄ&éàj¦Äˆò"êœÑCº)=A ­“êa½W K"Ú~y<¦ßüøÔf”oS Úw¯Üh+×yˆÖà™ Dü?– þú©.8xd©ܺȽÔL?™œ!Y‹zÿª¤ ûw=ã×õ×ç✠Q:íþoN©zÇ«¯×šÚU7²ÙÐúåaÖn¦ŸC/‰+¬ÌN !ÉŽ¸^uZÿ?ŒoŠgëcöë­„>z¼Nº_Ì‚y øÑm5ó4”MŠÿ#ø:†\œ‰þ²€Íú7Çð7ÙPØÝ… ¬†˜3±›c• Q §{-ŠZ©TéZu}¢ßne6ÊâYUÞÁœÆ¿úÿ I/ àªzt(Ÿº»ÿgÔú=~°?ßüǪYWíÞ9÷ýþ«ûŠ·Ÿgjy§ »ÏõO#².ú1+®¯ƒÿ[”¡Ù_îja»? DH%ëHSùá" j9Zõ‰ýMúéäÃä_×x(ýý:Ä{>J>qBS„<ìañ„~a8Äeþþór†K[ô_ǵý:/êˆ?£ïÚýÛƒˆ2"@æÄàî§™é9qõN`§Ïù©ò~Ÿnq/C•D™éÙnd 2}ÛÕf¡ÉøG6åfsK+ë_ŽŽŸÓÕØƒ“韨Žè+ôãŸ%[µ¥]»ª€âiÿ0ü•Të›s÷±n%çáOï/2ò´ÿNŽŠ9êˆÔnâÌgiO¨ÍÜ}! R6Ä2¼— ÍF+º3þXþϳèó 4áÏ×Y£>}ùqTæcÜož\ÝÚr?i¸B$>]ëï“jçÝ8Ž ÷ÍP¤‚¿Xöùwëòñ2I§58¾—“ê³úåj)¬>iÇÍaۇ׮ÇãH»Ð8²‡é°T‚F¥‰3ÀlhœRÄ#È€–Ým¿§ÚV/";*G r¬úŽFa9ÎìCxZ¿lö3¼Çyór‡¾æ``ÔLÊ"þ'ü tEþÙ×Bï@bÿÉÐ~_Ô±ûòëO÷ts³¿ýž¯¥_°3§¸ºBÏŠÌg… hÛí¸ }d$©¡ =•8´}Zþ  f_¬~ŠKæ¡€[]m"ªŸ¢ó|ÔŽÔǸ½jû],>Î;íäõŸÙÐ$wu`ÈÖc›y|G>%¾c‘Q‹ÓäÔ<^¯ƒ8Fáúß{ú¯oøG|Þâ!RÜ=w—‘ ‘ø|«Ž§Ð‘ôù§Ó•ÐÆµò¾¶1ôcßˉŸŽ9‘%Ê¢`syyÕwï>–<àþ²ï¥C¾WËöþAh ±\MRq‚ïð¹î?øÆ}~œdµãÖw8éꎭ è‡ ¹YPg_=ÔVRøyêTñp ̤#)•Ì@ÇY éÿØ€™Ì×.–°ž•ˆûüÇ®è-/G׆Çõ¬×C­{Ïtæ‡xVÞ{ˈïÛ´Aõ {ÂwHOï£\9šÕéhÕàÒ\?ö »ÿ?ÝþOï#ù|~¿¿Xý¢ãõû}›o×Ï×]HØ$Ïæ¨™`H~ñ4:)&½ÛP·þ >`õÿ!ø‹`ÖLß¡è.í[rº’³pÇÍý4¿t&{ôöˆ{ÝÑB0â 6|/ ¼ g«QÝÖJ‚#çúè¬þŽkú‡ü¡™¢Ýùp.8óµ ±ß  $Rã$|¥‚Œêƹ4¢Íd;MQÖ=r ÏS÷¿YÈÒö`ÙŒ.ûÎñ£¦õÌ£Á‰½ö5«-Œ¬â¾ÇÝv=MØNg °ó¹8ùÎá¾¹ÖŸƒ¢ØòGzC9/¯<Ά ;$ Àöý{ËŒ”iGf¨¯”¾×y±Þ‰’çn5­Ä¶«ªú_U¹©_'3C¬UÎßëµõ–ê7­¿‡|½}ùç_zÁgý žiù™Ñ÷…È6zÍê42ïÙXªr+ôðïõbulwûGdŽÀÁôyÊ©=šLŒÃ®, 34nv.>Ä]ÔN‰UƒI€×îfèOÜ1÷’h–«óq‚4‹ó_¬ÈùüÜëÚ0:û'õoòpI³Â¥T#úÕBpþýD}]ž¸vû±Y ‹ŠH˜´z®š/Ö‡é×ÂË·|λ¯Ø¹íL¨Á÷È?±õœ|Äî;Ïé7\¼È[^º!ÄÚwê»…qeÊ¿`_q§ž²È6û. šþP?szÙ­uZÒdÚAè¼tjÖb±ÑŨ³*O¸û.Çø¬`us!üGÁ äqr¿deÿ™¯ì ¢87+ø„áý Aá\<õ·ŸZý»ýª€&vš=Yën?NŽóófëp[ñþ­¼.l‹Öµ}KŸªêìýgç_PàE§T>¾¦+¿Ú¼ÍúÖã¹ß…\羆‡I_«Êq¿eÖâÿPm±Ý:À.òj ™è먀‡„ ZL§>P~N3FºqÅ÷ʉì'W.|ž @Aéè~³‡_X·E Û· ÅíãBq¼.À9P ü¿xÐôz-’ç3H˜Á€ oçxóï½ã­c¬ðYLÐqO꣛íaÐçÄÝ:‚g®ÆÌÁ;^><<Т~‹—›ð¼)÷­j}«,f›æÕVýòbçíã%/eäÅ’ïóêÞ/8õËÏCGÛŒë©ó\Ñay¸H´DÂcãÏÀf <n^£÷/ó«üú <²1ô³ÝžÒÝÛ&З¸Á–dUAŒW-@Ãé(úí 3÷ܾÎ9×ÇÍÇÏZŶG«|~(¿Go…‘¢0Jé×è¦öeÛŠ’½$?ÔDç)Áž8æ:O+ô©ëî¶ço€„Y|Œ˜o©q?y劅~¼®ÓÜsu]ê5¤ÿ|¢Š_Éð}û»¿Õg¤Zˆødâ:‰síè{‡áoËy~'·ÅüR2d[/^q÷úÉ‘!±-XÈ0h—¿Jê*×-÷ÕkªGw–ÍüµÃÜ¡õׯžLtyÅÍúÿ‚#¯Z~R®O§~bþ1\©¯o3Aëxû’—¢ Ni{åuº¿¯ç çôhJýøî<˜)Æè9ýzÁbþ³Í׳¾5±òu³4~Êúû¿¦ÂÆwéþov)ïWêìÈ‹>;òœq1Ÿ˜Ý{ÚýŠ•«÷qƒ{\óÍõ+Íü­Öúá~§]ÏQÿ_2 žïÞ|¥%¤{pçx} ë"ÂQ~¦ßªG›ï—š]Mõ,³X™¬ˆaû4ñ6%NÿÃK«ë—È©§Õ­”Q/sŃ×+Xû"HÄ<ÀÇ´‡{øýìÈ%L¿#R–ñÜù.X£,Fáþz‘ØôªµQ7âK $kKðt?’G/ñ­@„ðË^@; åYÇú’² ³ã 8$bþ{ü†ÆcDÒø}ÿŒ¹šwïX÷õÇw!8^„cÃÓ²œ V7Uï±ó*6K­D&V,ÁÑ3ÏÑþa¬ þžõ#$KþïÈÈ$c³e=Ëÿµvë—ÖóÖß¿Ûw£XÏ=JŒü!iýÅë¸Ü·Lò#p¥¡‰WÜj£çÉÖŸNî<„0-W7Ö?;üœ_Zü-FHû´¨éá߈\áÔéòà¯s{-‰C[ðDO\ˆ®¬}{‹äXXIdû=óãй4OÌýV[D¬ ÞˤÙðB2©”~Õ›ÞdgÚ2 àŠ‘çžLoà|ñ7Ãdu‘Mƒ·Ï<Ì×õ¶GÙúÚÖýAË{=‘xùP$Ž«ùê¯_Xú÷ß!ÆYwêj/dÍ£•²çÌoñ^cZÁà7¹º`ññÇ!V<."(²` $ˆf¦¤™©®š@Äìá<>M ËšõË%e!¹~¶q_¬).yŒS“¼§ ö+´äó”¢÷_^î¢Ã‹Þz;Í^4\Ö Ý¦×oæ±Æ%Í?£É[\Û=Ÿ»«Kèòƒ‡›×¿;[>ŠýÙc›÷ý_Ûñ·—»Ÿ•Ï·Ë>[±ìùtÎGâ©÷ýörK'‚¯ãü÷ÎݪÔÿ>ëP’@Ï\ŠÇôA'8UzTà¯e#÷7 Ë×UXŽ]~i‰´xFÀ˜7¿£Û2{¿¸ÝÆË勾Gƒßé€ï̈¿Ÿ"H?ÏŠ£—æÖÇÔäÏ#.‘Ôqù(ý”fñ÷R[Â$gãß™‘ˆy'“[Zô³ÿ%‚üyVð¹Úá!`~7—‹¿æú?óÿX£õ;mö­ç|ý+ô:ÿËgOnºKé|toǃïãž'êÇßë¦Ê·Ñocäg^R>ÿËúL7ºþ¹PŒ$fÈþR‰„Hp]ä}¼{ú»¸ûê¨ÄA™‚Òç@§kqvb_È€ÅæIî~d‚M/í?Ú?9‚,~)3™%>›(^õÀO¼ŸÜ8Ý~9úVƒÖ@Åå+/Ÿ×uPHm ãAT*¹¹£¤œŽ:|dàê;Þæ¥ïÙÇ×Ëq{Ø]š0O\ûûóµ¼ù\û™3æÖè @Àš^„é˜Õd¡…¼Ìaj†€Çµ‚D׺3ÉVo•0—Öz¬ví>N2qNÉß×øS<Ÿ^+ +<œD`€¶=gד'ׇêQëæ~ú®¬ÚìâTòôzê n<æ}õ÷‘ó¾>59>çÙs'²¾òì†rýÔ:$zõæj$Ÿ`§Þk¥'ZŒ‡ÄÑýWÏã°î?\¼e·þúù|>¹ö¿Ûöíù¿_ÛwþŸÇíýÿ}|{럾qšô·×ür×íóÆ}ñ­óøúkò¿ŸçöáÍúþ˜üùëǯoÉéútç4GçÑÿjT }"ñ»%aGëþ&ÑÈRFýú¬!~­ýž&ú?˜våüŸìéÑ8¶vq»9ö6õ8Ø+ê_ê¤þ™ó’ˆål fâ?i)¹4„²ùþÝþ©NÝ숮«ênyïXJúç;÷÷2€ßHÿm$?#õ¸‚ºý$?âéùÇ^rùþv*}^‹Q0iaÄzݸR_”ÝL_ùñN¾¾²7Òe€S™ÚzH¹c×åÿœŠœöðÝ{a¿Xýp“öšŠ{9ÀP‘„÷Þfý6g=ƒÏP69N{Ȫ 2÷ôCrß}T2âðˆ…ð—5âqܯ›öqµ×0{ÒrÄ:ÄßE §ÿI%ÿ[ƒŸ‰øé€ó”=~ÙÉ•?º}¯¨_áQü`“È_.?c!&ý×üõþ+"€K9i¶ó_ÄäW<°Â–`J¤'ˆ.n!e0ÝÁYÙûñ^yæ%‘þ.4|~§r¹³øåÍ-°hóßú»èxçÃÀw¿ŽLIˆ”IøaÂ#ÉÀ˜Ç©.áâ÷ÞsÕþ展¦ÙQÂ9OPá³ØÂÌ3¿SóQaoÜ~|¼õßG{'£"¶·ÒG¯“ï®UüàÇî]`õ˜)XÚéüÔ’a÷ ûíÉPHåzëœgÞjÝ^”JÎodÖ‚ªl›òðXÈqÕà|õXÔo&u5ˆ»õuWr£"«Ò:HÂôEo|“há4E÷ê.›‰~£#쬪>Gå+·çÌg`QÏ""iwúãôû@FA÷,Ó÷!ØúÀ hKˆ4ÌAE„§úþí5{RõaýÊ¢ÁP õû åj¾pgÔ->3>ó‡šCUŒ}gÑx²è@$™Ÿï?Á4fÖË’Vã%%¢÷‘<‡ˆ'Ä;§«t½·õ÷=Ÿ¿¬ÙhýJHáX?Á˜:÷üJ•ï~þ…ǘ¾±ˆ9½uÖ>eC#Õâj±÷õKf²i Cñÿx¹‡ë1õ~6ÿ 9{3IÉ_âr1ŒFÌÂ.¾ò„©˜éãc¯}k-ëZÉuÚošÁ~l1¬ú¡uÀÖñ “}IrÛ\Öo¯·èzOhêY~þb·† $ _×>{ÇßHz'ZÒüõò"LR?¶Vï?q#Äó¯Ê¨ºx©éúõ÷Èuï²[duü>௸‹î ýnB"(;á o¡áhÑúŸy¿·íF,y2mùãBý%ˆ¸ŒÊ7~Ì­¨ç1ðêØÎ—\i©Aw hÀE¿q‰t‚$Ã4ý¸¸!LM( WuRÓ<*9€AÉžE³ÎJ|Éýœ%ôÿYÄÁjùŒø!Óó±s~·¥UÛ½ ž}§…”ÿ8vùZsèÔÙ§‡°¡Lz Ç¥Ñïܸô–‡(rÃÜk³dYªйô²21¸§Ç{§Ý²¸~C¹û´8‹x›H8vɈ$H.U½ö4£ç¼¤?¸B‡óI¤º“4ià 8ÜÁD?a,^G»¶GÍõ¥3"ஜ)½ø)D4´@÷£ÍF¸ÍûA7 u0@ Ÿè\;îpûrà¶s0ñŒW®<ŒcÚÄEˆÎo)ùx­$Š·#ü‡7ÓEMP+M~ßß|®?¹?Q4¯Í2ßõ€?2œ|‰…ë¿×Ir?XJgÕo?^ïޝ\žý­ÕŨŒ@Q5÷)@ò‡¾Uˆßk£úÏ7œï×¹àÀE³Õb|@ w%?…Lg¬gø;vè¹oÏÂ׿Ãð‹*·  ‰A  òSN•»þ}<á]h;’‡Ê÷ä‰ôj¯ºWKÊý._×òkG£7h³”—ç§Çç/¯^Ï6E*×ðb=’÷í_¢þ&äÐ8ßë+JEö?'Ð_£œ€ ÿSiOÇï÷KAÙÜÒ’%à6! öAɃïéÀ¾ç™ÏÐxÔZ7⎉ð†®Uª<:¼²Áx!|R|¿ ŽÒYÅâ6ûñȰ08gÚ¨ˆË”±~lo[ƒL9y°µƒ{?(£v¶å cô¯Þ7œøoæ¤Áë: `;ÌA{ŽÁœ÷;g‡¾EbIéMl¾ÖÞ[½ÔÌšú§—>ÏF¼HžìëÍŒ]:]Á=99胙#.øÌÐÑ%Yºo=yÏ©ù…’¶zG^¤yéÝD¹Íiݬ’ºã‚/û;Úr²¡ê=wÐZ™ú»æÛ˜ Kál\¸×YÃÄ/[ûûxËü*±̆‰ÅG£,óò­é»ã¾óÃe´:ùŽþ³êáñØúÆî·ïÖ» ±Ù÷GÛë¢|ÎõV¶çSÊ¡BPÑ4<÷Œ“ƒèj݉)LãORÖ!þÌAS Ý‰Äǡ?bâÝH‡÷­m|Ÿ¥µ? ˜ {£/ÇûûdKOÄËO»f69%Gû}/û "Fçèò« ¨?#É=:ç á'‚‚d‚„â—îüZHþRöID¢øµCyÆ1ðB>}b ‰ý¹õ©ëù‰ù÷ðjýê,á»Î¡÷ÍÌlGÓÁÉËÛªÚ.>¥ü˜y—ßÖ¥?Õf~b@òݺ„›¯¿ÓÓ‰á1Óƒ)s /È4 %Ÿfð‚'¯¿3ÔTú˜=ït6ý%™w?/G9åøë$‚WÞîO¿[¦•någqð¹Ô>IÚ/}aLƦo¦_É‹T†0ÛCŽ`íxÊþ:nzo% $IZ]0G+¿co=zǹ£çOåØy)ógà©L˜~>ƒ‡ Ô‡‘áýžÈdm7ÒÔͨˆ)vö~Æ8ˆ?É~‹á ?X£È€žº7ò&Z¿ï·£ñ½ÉÐø§BÉ$üÞ`«ºè€eõïý» ÖH.Œ«÷6±m ³~óÛö¼—ˆX±ôõ½ó®õ÷—êx£­àÃ}èÅ"Ïι;~±˜ ®¡— ü³y{9.2ñU®vù¤‘ê:yøÿÌYÖœt~ö7ëŠÂƒ‡&œ[ý\½÷˜‘xÊ.z<ý >÷žÎ¦GÎ ‰q.3ÚîÕGÕù[qgİ3Èù(WÑ¿Ÿ}c"ô³yw<µ×rܘ,O Ê"<Ú\®î/x™£¿ˆsÅEï £ß·ÇªíÓ‰úý¸gŒo2f'òÒB׿~/öóáý¿?ÅUWú¡ÿÙóú5•e¯ñŸòÿ%úð!œ¿!Qì={‘.‘ˆ¡!ÃÅ) ®%$úÛ·;ìõÝܼB&¢QxOÕêîqþ|˜o ;É&ºÅÔ2£|u&ù¸ä¤3åá¹Ñ#κÛ®¬ fOâ—“Sˆ™•{[ÁìùzƒËÞÚTX;Þ‹’Tb•ÞO4€¹°óúDMsra bMº×@* ƒ7Qfa©eŠÊ,fäl}Øýä•OL»%xÛmσPöLiàWÍFö£d‹žUù ¬ýâe„à»hCRx°(Û÷ºsÏ™@ASÓt‘> zººfîT¨É3¾‡š}xðcñÄ&¼ô•=ÞŸ¥³ƒÁ;ÏŸ;’)$MCtòœ|OÀl»1ï•“ÔÚªIÞÊWžåa>”*HRäˆØl¸÷•\O!úbXÐLsËÍÆåçPÜ…’ËÄÑT9ÆŠT,ˆ×@;Ò‡%„Jº;‹­N‰Ì ¼îά…õÒ'{=^^–?Y†c …6²Ä•KÇ~cØO$¢yïOà”±Ì/(Ú‰ì¼PBœrÕ§Ò$ˆ5@™ïzÌd› BÇ—qÜeùÍ;!¹‡ñ[³¸¡"*¤º2ªŒÖPq«.{,:–"(@OYÚJ#´h¶kZÔÉÉÞ·;%çå —‡||½=‘ÄœÜÓÜï98ÄDç”!ši<+co•–(u±ëÃ’:}a†w1(¶ä¼ =\¶ø×n“»Ô^2¥X%2Æ5ëh]Tg™"¾ Ïl¯"žFzÖeÑB‹€[µ[ñI•ˆM !œˆÃ]ÍÙÇAÛÔdmsyˆG.‹-wÒÈÁiOZKyæ×R;¨¬æ7”¬%½¹’!a&ˆd⦎„fhPÿÚÄ ë…ù%çÒª–àŽ¥íkIÏS’.E–öáÂ<`£ï½™xÑ^CÊïNù¨èckT :Ÿ)öJ/‘µõrOâxI.£c$º»v÷9²ŠJiŒÈ¢Ì¸›ÂmÜŒu^“ã'á¦Í:/7%°).-rA xÑZ]µ”zªhï6#9ÈMX*ôýÊhFNû¯à7Кv•ìõÖŽÁ—çpñ‹[O’Žór¼†Ø=É– %¾o @b B#!ÙÃ-±RxZàâ.‹2!˜•±FÎn=¯©ÇÏ~4ŽZ¶›B°U¡%á@Œ•Ú‰äß7¸}Üoм¾z#ïbÊë¤=iu;Zâ8Žm½—Fù¸§ ÑöýÔ¸€#ˆ”fé^]Œ6'+-"ƒnÒumÁ¼6{qîmpUÌõpEÛ ¹¬–öô•ðÒ5úýÛÍ…¢ÙzŠ„°vÁOìÆAMÔFºbBžÕ'>l½t©£¼‚)1¤nBÝ—1ûÝ ;+™âJôx$’|1#&.ÁÏ4tÁ}GV®ßkÙËžøl¿q5tüH3SE"ù)÷æO<Up¨p2n{)ç/O šzØ&ð†+qiWWœ'¬ª mHeÚþB.ÔG•ª:†Ow 9c=çDcª&Ÿ9] fËš£=eï? ªÖùÎ6©¦ã ½¾0Î50J§±Ô\]ó¹Ñˆxô‡˜vý皉óêé=œK:)–;ùåO,!UX…A¢ÒÖý ­~T#ÅÓÑìv§Žëí\c5QÌóéø$H½v1 qçqÜ%/xŽ4ÛÞÂ=ØX3÷>¢””×øZRóÈT’ÀÚàî‹TŒ‚£‚Ü6¶)2Q<Ýì YòMÉ·ÍÆpÚ…”ÐÝ 55@:R¡Î÷¤ýïXÍiŸ¸Ýû¡¬¢f<ò‹±–Ø€1%Ô˜:›à^¥$z04°>9ºäé¯yÍfÆØ^'J:;sizÈôuï²N׸¯Ö¹@5MKí \sšiœêÀš£/œè¯·Ç1àÈZ‰¾$†Š´µZÏ 3µIyDÌˉ4Ü㽋ÄÚÞ‰½†€Îe›öÕyNLKD}šŠ ºòz­;ž9V*a§JÅÊÕxç‰Qˆ#¾XÉÀÕjÁ|õ ÛïŽFèŸP^|EžŽß=[âƒfâf¼õ¾/xJÍ˽86-•º ÛfeávLŒÎ^‰1ì 6¼wë$ƒmˆ.ª9OdØ V§:4Ö®ñÀ æCW.2¹´RCzUˆïÛÔwxÁ.R§€† ]·†¥¹p¢^ †£ zóEçruIc½ÙJɤAkY¼º«¸Ÿ»6cu$Ð\nX!|/Jü!Ša£Bz;V¬ô6“Pu'ºµˆŠ…3Ë/ ²"!êåQ8ž;å^÷:óμ* ý&OáÆzÅcŒvÄ‘¶f^.Œ™­€Ÿ[!‚$. ‘Žàt›ÁÙX^8 ðx}Š ¦n'<`q³tûù}ëC>KDñÏh"[2Ð:7£€©¢°¶SÄ)d„ òÌý¨Âî¿ÐP]6jåã’ 0mœ|„¹ÓÒè«l@ŽÒhj(£©>ñv& èÍ^¡ûËÎæ#µ ŒsuB²g6 hȾC6` 42t7–_¼â.å¿){(o  B‘†‘}+;ÂÏWT+|¥éCÌ0 Aâtì©:3²´ç=AÅ…ïyí²^ÉìLâü4ªÕÖî. Í UtFìˆÈ[Zv³’\˜ƒÌŸ­=´ ãnÅFsGpúH€¦€Jdªhû‹žú Þ¥xbQU˜˜ƒC.^ÔÔNVì®c»Zèô¹‘æ?VN¢Ç4>¼à{pUºÅR=]2“„Ç(Ȱˆ¸/³Ä‹ ÈR¿&Ñ£àÈš²º‚W¹,O–iSØ3.žÃNªGob÷cß6о§yq žð:&ŒX`ª'¥DZ¾±#+¿:®´$Ûò¸Œeðû¥´3yIc¢"»²õÈŠ½Ñ5ŒØ^¢{ ºÛDêªOC¿°:;ÍØ±º™´ž"ÞFZ͹6Máv¹êS[o+öyà‘T4!9DØFÑèkÞóÙ›ÓÔf¼?˜É•}–ìi|J}«Ê"Y³¸*o‘ÈÆ*³4(KL;ŠIõAÍ%OI$EÙ³z¼ï½>™\(¬ö½’:Ïà˪øÍ‚VJ<¦õmìus¹:ÉE^wGÀˆ ðî^>`ठá“Ù«æSb¤ønÜ }ŒÓª±€Q âŸ$?Žú}ÏS¦\™pk/4›ÃŠÒ¼ÜêUìã[Wˆ;ÕlÚ fÙ¤×. ‚?(ö\‹›/x^:ð€hMÁº¦«ezYÆ‚œÈC©4‡ÀˆNBhÎéöÃw¾šoÒ‰nÆå#p(õÂ<ô±xõbsÃŒNEMŽIqÔgõÃt€EÙ\ ”8é=¼þáIn> ƒ£#%VA ÌÑÒ!ð ’’&³+ŲW²¥¼èã*ëRkµÐ¹î–ÓçR_0„_¦‘¤è»ñò:=u¡ô—r¨D3!Q86ê,ž«‡ ÜKÀ …ïhy瞎Œz›z'µÇ=z$ãÃ(9ŸV|‘R!“ò+&CötxgÍyEÐò ìóL²Ûž7ˆ‚ª‹Œ»´M+ FÍA½DwèfAÄ`i1öJY])i e„$«52¨KS“\2ó¼=·o° ‘Šã+‚­(<é¢*0T=ßcj–3*äèUZΕˆÂ¢0‘|RÇæŠöHr-‚=Ñ&3"²c;ªeÖ§®7¼í£lëñ—ÆžŽ6ôœ{˜{V4±[vÙJ;AƒG™Ì PÀð;.07Þ´¤cÚ/»‹¯UT)Z[ÎÞ!Qk‘™Ï–H%Ч¥+°aq[j»[ÕézÊÐzHŽrÇÕç'(.'uôR§ Íà ¡÷6>û,ÞþqK–0Jøø˜ð»ÖÖ©œ ^å¡Ì`oçcÕíÚÐk¸²ï©ú¸{q'ÚÔ)P¾¾¬§(Ì}^ãÑq¤©–”òݺEºÌÔ7•®K´ÇÅ ô‘[r ±™¹¦¹×Âø# KƒåÖ¶HÜ­Sê¬AñÁïcHJë·´Û?r¦xD¶]K•lPí•ý2àñžˆC±£e½öi£†© +1=œ%X³6cá‘p5^ª8y·­Æ“Ž#ºŠüÀ’f±—bÌêKèÜ‹Û8/nªbøž›•èQ\Ô| ák~抶hhƒ®¼åžô_,Š—{WÔJzã±-`drÜz¶çÖÇÙìõF_Ë7:Í2hcpòüÙ€&7Dx,HÇ B›%Tc±‘håxÍxðKB?6ýĺ÷4`;„Z,ûV’›‰m6do–L˜oIèà|)½.Òêð´x|а@ŠŽLæN.¤¨>ŒKÑc“WìytHb:÷ v7n!y œ'E4BAd¤æYÉŸ¡É5Ú˜kÊ2¬–é‚ 0ï{v¸->Ð7Ò2ôÆ’Sa °ùU]½Dx\8A^-1B3¿=”œ $…ŒÈŠÒݬâsÕøNP»@ZÚIϑ֜¸Ã‡TCKl˜RX^GÞâö&ñ)± Ç ºðöÞ“?l–U!D1-‘W€•™›¢fðsæ¹'9ù¹ë¯Àºí*f:ù™–£TÁ¨°2ý G ²àsé#Õñ…ÙXfM“QXÛ…#F¿x’S¯dkHã´(õ†´…¤íëß}Îv¯ìãV‡öŽé6ú4 "…8p‰uÞÔ¼˜§*õß\ßD:ŽÍ%æ;ìëÝÕNT;Ʊ¹ E§ÇÔÉ"SȘ­ÚûÒ«Éì××Gm,X%}b¡~Wûï Ôª?Ö®Êq<¹S?0³LôJÅyÕ ·ÝP^µog%R@¾:‰pÆ‹ù¬ ù·se Tb&cËG‚èïªV•‡¡=õ¾=Xœ‚CºÕ-0£ÝUî dWP½É¼s–mµ£XºÃôP‘1‚& -¼1ú îDÇT[®þ2U#t»ž_¶gÅZµÞE3é=ä;ÈçpΧÜ-ÒˆcZê-j×ÁWQ7—œ„È`“}ž.´Öig‚¥ ñSÃŽVÑãüdj:‘+cåÐk„_^àN7‰- ™%MºÁD(CE2.s­Ä±83‘µ;»¨q½\vLvíñüH¥¥¼…|d)¾¨³/|bŸA`Þf“¡Ë­xÕ,ö8·Ê ^ÜšãI½ØL[¢%ð*³Œ¸=›J(ø0xûzŽÐyysÈÕÄPqnòÔ¬(.Š%¥zº:.ÄP`‚Ü*âêjØê1Íâ!Šp– ²ðké‘¥B6"ó5Q §ª‘Ù¦wÉÄÊÞF¯zŒéׯÚÝ–ÅÓ3Oc­2TØ$éçãŸ>6÷Ñ!zé®ôC?HKö'ÜdwòÄNÖŒm¢÷¬Å©í¨|”»ô´gÔê„ñ]»MÍÞü;—ºÓ©ÉÙペy»‡í”!$!ÏÈ &j!5ydhïHT§1e’U q‹\ÓRðºc ·gÏÅ•x¥>;·€£X‹F­ã"ïyˆ(Π‘”RÝì'IôBˆ¯hå Ô8¼ÏÈz<þ4›iCrxÆIFeé¸hH_uÃ!¡1Ö˜¦‰D¼*³\ñÜÒ8H‘òyënÞÕX#îì6DP]÷‹¬ÈYø˜ïÃ}Xú\^ÒÕ×Za¨Ö3},óÀ/»¹Z|†‹8eF·£¢FÆ"è$¬Ê"ZÍÌpb=÷©ÁIÌ.gDE!aÄÍdMA c›^½AW ]RÓ¢§ö÷¢íŒ)ᆑ!¦vQaê„ 1ÕPyå}fﯜs]>è’·ÝT²5Ô¬ ÉâhöÐ!Ë ÐII%™{Œ3Äñ“`Dx|EgrSÆy¡èéwqÚ¡Ñ8‚äL¬OTW±$CªÜ$z_ÉŽÍC(Îa€÷ÂëÞõ÷²ÜyÇâ­úVFŽÃpºDµ,pGÕA䏿jQQ1B".‹'DÒ”‰ÇÁ€â…õ=&„RDùÅ” ySÜ* žsVgGðÑ·µQKZÏ@ðxë‹eÄ‘ m]!kÚ ïFÆÃH4õzgšI!Å¢Õý†¬>f3qgFNÕ‚ñÏ?8ª{3±lÎýf3R<ò0ï"ÚgÙiâ Œ®íïoTŒøS Oü$"6ŠÃËV~‡×¥älb#:æü³õÌkŸŒÃõü¦üKøþ£ú0þKŠÁ¡"Ðr+ü£q3ÅúÙªÎs ïüPE`øSù¼"*W,!yåÉ€î¡íÒ ÓÏöÏ–ÒÃkOIâY7ÇŠÌTæc™O‹& Æ¢ìv:p.Q2þN¤M”žaSb!øj#6¼´ nT9zœÝ>mBñ"û„õ9÷, NN!Àü@ðœ,Bm=¬ŠØ§yö4èÖSUaõÄ=›‚á Rv=¾î/—ÐÖ‰éà¹/¤*"30X‡Ç¾UãN kOŶ®ñß%ù³×?ÊbS,¢uo]ä]܉/ìu9¸"ÜYæ—X¿'UtLéWÌÉÏ]w7.óHñW3··˜$(˜i#oÔ[ÔþO“$EÚŽ·ºéä#‰M0eó‰&ƒµÚxÙÖÞº›cÑXÓ`t…³4ÇAÛm•–°L1¤ØDb»Ìtk,0ª ¨®½*p#ž"ï¼zÔSøs¿]¹g¯—¯¿óþ­ðJ(ž¿ß£Øõ÷›îtÓÕ:€}Î`/‡¼ ŒOïRð2Gù+‘R1pÅ;ý+3C˜{ÕwRÿIbDs=Œ<Õ§ÿ3åéÈ­øë [4nbâ¦ïAËóò¦üWŒ!ï!z—;ùµxê²PoßèšWÉ$ AíÃÁAà"A—’V“‚ï¼êí®S·õ® "ûáÔª*tɸ7.á)h©l¾Öž«œ£zwzdv¾Q=|,W·ýÛsÄC·(iÉ­0› f¿ð׫E}8rÌ×üüþuøÿ/o*›…j˜¨ªº+ò€z!¿=í xç"Y#liÓ\š‡Ñ&$œ²†¼U¬-a¦¦ÚuïIÚm‹Â¦ü„ÅU&õ˜?‹£ÃÆdݠë8B0>O¶?§Ëû¾ßÛßu:žJ­û~ÿëõàh€¬­~ᜠ•a© 3¶B¬%5ˆ{’Bfm£P‚ïã2mâíö&ßnÿ;¿GI€Lò8DòŠ"8‹Ýqîô½~‹Œˆd¯Ë¡Ul°¢Šn3Ö9ý9â<õ0ãéaT)0‰¤bƒ ˜Ÿs 2+­•STQ¤7ïƒÆð}TQ$0ïÓ®…×<¥RÎ()B¹z*m?쉰†7"j,Aœä3"Xy¼þZ“ÏòÜŽ$Jñêùü_Çÿ[èå«U-ªU‹#ìîŠ}}m¿¥û/·@€Bö“í‰)ù¶Iú²;:Èèâ<¬×MÞytŒØN!‰8¦ù¼¶8¤rÞ&7Ìê:lsè8¼w Š’j"®çI^|C40çtèîG QTÕIAá9A»¦PÊt­Û±!ü’Vlp%Š]ûöí­‰ß¾wá ˆé£y’Bs'‰¾¹9^‘Ðÿ3Ãìµ^Þ:à'Bª‰¢*i‰4=×ÉF—ýÿE RÙ’8„à½^7:ëø"Ƹ¥Æ­Ûƒ@…þ)·×Õ|ÛR¾V¼I„6°_õS°Ÿ[D/û?»ÓožÆBÄ0ž&?ÂÝTAÛ¡Ò>*V`)ˆa±`ÀàUæ^®aD‘˜” ¡Íø_ÜÖþ5õ[èˆß4ïó÷Mû•Ÿ<ý»ùQî‹k3£X´þz~r·íüó¨Î¸ü<™5EPuЮ Öêñ?.¼í&ޱě)Q³¾ÉécÂÌeíXNÈäñÄ88“9œò“„=[32Zž+.Œ8+ÇR$™µ|"`:^„‰y²¤øÿZÔ°'“· çDZ¤>æŸ~G¯àçƒ,30öYƒäuø$QD¿ðþgúN§Êü*ßöš2+,¦û?O'Ëä)ó þÈzHv”;'lz{Ñ0í7ΰ8|ôDZ¯N°}NÏw¹º)¤ªOÃæÿO'¤/·ØAúw Žë€í~¾ö­Wsä¸éGÈßxÈïWÓ®ÃéSÛºûseÞÏÖ£ªœO[ý"t×sÝèçÇ1;qp‘‰5°Õ®… D„Ę$‚I/úúdø,÷ôÏ­ÒNhæ6ÄR5ÝÞð.Úˆ$±°8Qdš†ªdÂÁåô$HqóÂ?Ýþåƒî.܃² &1bY*m–[Í]ÚFzùöO›4Øz‰ÿ_¾ËÎI;²5¶Y u–ÆéØ7œ“÷ŸXõá=|y;«®Pƒ²üDñÖ"h¦š0@AA …÷ž¥5|@÷s™{0x'äNþIX‡Yz„ƒ¦p“Ï)¤Î§Wü÷è;úUUQ~kñ¶®È‹F+ ú·UM³šJò@v–ÞRæÌS qD¿yÛ\Tñ|g·Ž‡€w܃CiZûÛ¸REý]Ñ+ô®¶ëJ_š'JI ±Ì»Â¡{¼dÊ—ßZ8•5±ãú¨¢võؽÅÐâèêléõøo$ؽŽRŒ$f=³q©ÏgŸçc„È= êðŸJ*žøä…8A‡¿žÁÊb<úC$›HwŒf28?®)´òTÓ\Bèö#W0PâOÓÊbœzyCòš¤¦FM˜òçg ’ç)wh»º"wh×+•Ír¹¬m·Uô‹T”OÅæ·áÿÐEu^@`O@ä:CEê)¦È¡h>S“VÓ>z“Ü0Ô®qˆÿ—cßñp&,‹>F4£KÀ3ö¬p;aìäö“¶îûµ“ç³ÖF¦u¯¿ù¿ìúD@X4‹ü:åöœá-IƒZOŸåÄœ6©ì{¬³ÅÆkÖ¢É2œ3)6ðªž:‚J'ÜÛ95ç…Mûœø½NõuÇ¡”÷’M É6ÐãXJé²32Là2’,;!½u—k¢Za\í𩘪(¤ ‰j”ßU8AÄ+éDW! J˜$>’àÏ=ÐÕTU¿8|Í?“/ÝÀïèò˜+{…Ãâg2DŽLH“$ˆÈÈ9–Zý§ÇŒÉÔhEë‚ÆµÔø ´Èí “ký¬‰ëa<¿j~¾32ôúzó§)ŒøM~¿csJDLƒ4´0ÒE¡Â6 ífŒ™‰c¶fbeÑøo”‡ ³¸0Mð«ˆø ˜]ÔUqPÏr^ººè™ß÷Ÿ\°~@‚L­ÊÚ%Œ.¤QIIcÕ<ö}*}m ó1~–á£^äð'²éCðÁ8 HÞPÀƒâETµÕÝ´ôØ&;ÏF!®‚wÌö£˜’ó{¢qêå9á!§°ÒkmlCØàÛ釰ª?xPW 7øxó¹$åOý¶žAED5W¶ ž6¥ÑÒç—FŽÖ=$Òs#ÝDë ‘ RÓTE€;*æ^ѩ߮‘=µO}qþ„>ÚˆGgŠ_}ÆŠÐ}e±T1A²• Cøk5´XE`6#F7]Ù®feÜÈE„R(O†°’2y`M‚ÉÊÍG`v.€äÀÉj© «®$pò{Do™mÁ6¤¶ÔP¯\nNäâ ÚCÆVª¬z|^»:¡jZ°úo#‹?¿¨¢¹WD³s·:7R¦Es¢Iww]Ž”]Ç.íu&]õµôSab5P°†ÉCdBÃO„xñ"`̈òrõÉYù/¯:h摜›4k´'Ãל³ÙWB޾qÅHýkôÃÞ@LHF|ûv¾üÏ›ÀˆÁTs'Ly?‡áèGÈÊC_hê§h ±0Aù U±šL[p1 ÏÛÜÀ$ˆÄbùjÛøÜêO‘˽Dâ<Ük./¶òIµgoéˆ=/«Æ^¡‹ñâ@º±/ Ì: Ú=€åBSbyª(’PÅ:†š½KˆH„ý½Ãjþöù÷¯mû¯¯²òEUTQETž{f'qã‹„ÒžzÒeƒ÷Ö3V×Éà×MŸƒäêÇ1yÎûd`긑þ—ÄÌ÷dvÈëH]±Q ϧi榇FÞ:i-œÍöÞIO›v»¢N`æNÎXê‡D0@9¾+éôoÔ÷y2NV;,;T™ŠÈu’Ü–ñR{Uó.X{ú´Îà«6ªuDI0Tñw6}¹×‡±ø#·Òº­Œwéè}Òvñ¤Ûèî6hŠÝÐÔeý{i3Ž©FÝN˜Áå7µch£EE±ˆÑ¢ÆÉÊý÷ð½^™W؃Ìö?ô0r6Z\zÃáæöÌßà¤r=üúxs¨ND¢þˆ^Êùxƒní¨‰£JͨÕÈÉœ2ôQ„ØN¬ÖÌMKˆ7”ò¥EIÅU)½I‘84AÃ:‡ÑH¢“š†h.ÀâCÌO´˜Á@z§ÓËØñåÔ¼8y!]Ê‘0ÒÅÐ/IË‘Y¬<ÈÌÿ²2fdA/“yn÷kúäSçhýþñãŠ*gìÉ:§EôI!6v‹(Í%O^[Bkàr˜¼Ï§õ0Ùѯlsœ2Ù¨ß\‚¥Á$™ p{Ò7IÁ$Ì¿Bj9Rj<4Td4(x>ÇÀéásËó(n`ìH'ȾšT÷$„ÝJ8:®z™X‡ÖxyNg¯{2 nt7 èQöü"ø8'ìïºcF9ì\æ{À¹—®qÍ9³…4NšNrÝÒ»ºƒƒ¯ŠÌß_])Ó±ª»a”Ø£yˆ2¸‹ ˜…nÚ@´ÀŠÛ™1qù÷ÜBŒÈ×`ßžœÞ>_z1q:Rëô3¢¨(r…Át¸7܇éx§ƒGWΚìÇOÙÍIÎ*êÏ¥O=žœx_’úà9¼~Šž”;ý;âw¼7PÍ<¯¨n¡©½ìßylèâk·9X¸Î¦Éȧ-sĘ5¥çY,&ñ'é™$yq³>ÈÚ(®w8Aut¤ÁàÖ±h— X·ëGA‹ªäDQ;Ϥôp}[q<8‰áúç%†3"&Jþ^ÆGÈÛìv>2DÝŽq‹1‹^㉆fÓ³Õ=8®E16¢y2ûYï¼Ú æåhÆ¢6?ñ’$ädæfy†D3aäìË Í‹fŒ£ºXD¦—áÓ©rɾX5Œ·Ñšy€nd&e¢á~Ì3…;)éïèõ?´_§ çº÷ðŠ™+BE¤¶!`6T³}îk ù\9…wú¸C§2¢ŠŸ¯éë Ï9ºò gLn±'ÿ“NÖ9çœá)òjYqŽYŽÔá½ai›g>~ž3¯~˜Ù´eªá:óúuD†ÔéêõÝ4Õu0&ߢ“ñuÔE~°ÆüË•æ?Éj‡Ä /öÿã?Ûv…²*?÷t‡·›Ñ=þ§¦e$YrÄ_w Þ6)ùýÓÓú¼eUÎɇ‡\7Iìgvoñ }¼öBs†Üè‘Ê{ë}ë&i>ŸœòÆs´Qß¹{‹Ìm¤¥F ÊΖEç·›À½Ù­Þ:¾äÌ3ቄ²w\?”É[àž±^gG9«óå>lE°×Í ýÃÛŸ%ú^L® .PLÄô2äù÷>u•ûúó߆ëv®ìð@–£Ã8/ÑŠ‹ÂaJ᥀ßBÅ`PijI$}ÅKª‰ÆЇ©sAYÃR¤pÎAE–“ ™@ˆ—ô‹Ÿö¼GḚ¥qzɉª1¬Mñ'"z ¡r ¯¿&~Ås˜åê É#ÚUÅÁ³íÉXå“`OhÇ&LÎ ßeÏr8$íŠÜñ|ÃÀ¿4XpsKêŽ Òdqì±íðsÒ.ôµ0RÃ…CBCà ‚ÁœgÓj¡"hwL‹‡ó\C(¤ #9A>’z#„Ipì°mÔ$n5¨›JS!dv$c“ÔÆýX2!òq0ã‚æ\ÀŒ°MAu$,Ä®’RRRUˆut+Íêôü¾žîÓÎv³¹ Ò:ím˳":ñ» m¹b"'¿\ÂëŠ žÜˆ¶dÅ$„îÉË ò 8¾¬ÎvÜøoq.HÁ]±¸¿ßcÔ‹Æ©fLÅî—\ m”¡¦Ø—2ÚÝHÄ£[¢Ïu"æÜW2îÝ4¨Žæ`RÚÌ,L„»)BlMÆ1¼Œ$1%|‘^!MÞ%ÜåÑXrƒ’’‚ו£víK§Yáy2G ƒ7vAäÉÑ‘²Pä»Rlc Ûy£¤èsë0={ÃÏ?R ÙXk·ò…(’bF¤V^Sõn-Zéãn·Ux@ÃTÓÍMa9lYK?¦KNÛõãÁ/¿~SÏá¦zrÿïƒJ!’ÿÂ(J¬,(B#¹OsÜå=ø_CÇ¿¨$zªti¤tùi|’7j:â¦Á‹8a–ÛyU<&»AÏúuê)½RUD“S ê´Ð’òèÍÛ(vä !àâzjO„Ï#é N³oF¤ìžrL~!ç¼N‘0Ù¶»=x„ÙˤÂlG1:®ûÉ´›­pñ&¤Ë³iˆ8Ãg±ã°»uQDDEUT&}ÐЙž½\¤EuGT“±»-žƒ´›z9¤lðxÞN÷nglc¨àÙlmÄ é6ÜÇ)§›S¶gB6“ â üú3•T}Œ‹‰äc„wÔûz®þüʆ!ð/ ©*“Ù1í E4Å¡ÜÜÕRU|=R÷P¤SDh«~¿¯.²2Ë "lÀÂÌ¥ÌÌ]©®ïwªû…¥}=~¾¦„ó䪆Šª]*ŒTDAµúY+ÛÌPH‚‚^·ÚGx“wd“-‘5!ÈÎüju‹¸8ƒÐ{H|ƒÔU4Cb†=ÁyÇ–|¾û“#“Ä„o3‹mîóF§©ÿ!Ý&ç˜ö;a‡cCÕ]]zp¹° À˜|}¶hG’È(Iª©¦©ˆc„S=ÅøáNgËÃÙ¿uº¿KW_{ë"¢ =eé E ¼œ¦t^†„áݰJmva,G(I)‰:Ç ¤lß.gtt¥Š·§©°NÐOSOÁDè¾Ð12škÆÕøŠ¼*éã÷:§ÕÁL$#Õ3àa¨ øÌ9Ϥi9ÕZ0Ll(à Týì$üÒf0ªî0™,3ú÷8ÔÙÿòâ0f6›Ã}¥ØÈ± ÌFr˜1é›»ìÿµfG Tb8{q£®7÷áSq‰pp’ºOókPœÛtð%ÈG27š…4Âl!Õx߯ ¥`g‡F)¤4 °+Ø©Gê!ù ü"QE¦î¬ ~_‚cýßðþŸøŽîý?Þ ³ÿ€ +Û?÷ÿ¹eIÿíñz¿yTél™§¥¼7ÅZíÅqï °ä ÕXšÛy/ÂLïÜâ‡+Œñ4†II‰c1 çF¸`ž$Ä­…jÆG˜Öš‰™n2¬y£˜%Éó ÈEu^´Î<_ƒ|í~¯"æó¦,’ØÃã\p¦Ÿ#a%út'ƒ\á@ýÞñ:oQÆÙµÌ»`CJ¬#j‚¶=(èç®g Td_—_É…å©v´aÛFšù³^ÒѲ¤èl±m²D•÷±Ãœa›Ñb^5¹½¨NŽá/ ^ª4EïdqcêòxhÈÚ‹¨CÛ9ë3œW†F>ÒV@öD*űϵò„J)_nLÓG j°Xx%û«õJO„p<…±Ü°ciƽņðAÆ ‡¶Äžhbô¹yê¾ywÏðñfE×hvÞ-t캠“ïC“¬xü¨ï²¥HÁ%šk§$pÜNËqr ·Ycc]݈Að53WžÅ°Ý©q |ƒïîi´îµð±G'c·p-sσ¿lß§sŸû€:Ö Q^œà¨N”CVͽD‰šˆ„[ØŒR$O.úÌ '["#iU9E H® U]{ûf¶@` fÖ7˜äœÔ4óµCȧeñ)ÀЛÕª­²}ÖÉ¢i®eªo% )Í;¬f‡#husŠZǵ…i:;õà!NþbŠÕ1'ÏïÕ6àóN/ Ü~RúïZ”ïê.±"Ð*µ—múºë F¦HüÈÎiªíì =%^²ø‡Rë·Nýs×”OhUz´)æ¡CRá羄\”Ô‚C¤ˆ>·ISÚzÊoX ¾¾=sJ¾ p â=$í §w—€` ÒY™Œ©_[=ó©Þ·ß~r«Å#Ć3ÌôFûËì°`ÌH`†žñ W7‚‡i¯¯O×]æó¤+Ú:Ƥ+Çf…Ü"û@!¹ÔÞDO:é¡8u"'˜Q©õ]Àë}ºìR¨nQôñ€=!N!SÄ!ëÒx0@¬œJ§»‘;ȧ›‰ˆõé´TÔ 'ƒ©@Ôù¼ë΀} ’/HPâ5 ¨} |Bñ(™Î´ ̈ó%0éu@ÕBj ç®$‘ª5I‹!‰S;^|zùäU;J9 ñ Ò9‘™zËë(xCP¢w•ë ¾°¾`w ‰I߱Рé‡hN%âW¼§iNð™ÉÒTLøocÊ zꋲöon;‡NŒ‡³²:ãê²/9 ²ÌÌÂHaÂÍd<Þ݃í#Ì¢aç:À!¹ArEë(žùЀq *úÂ;`~بs¡Hh˜;À¾s¦Îœ"¾eâÖI3d‘-‚qP;Ùë¾Èzï‰PÈDr@ñ=eOÖ@8”íÛ ô ‘8‘/mHjíR'~¼yñ´BoI‹yYd9‚ù•@É|Êw2¶yÒ§2ª™d‚v•%ÒMÀ‰Aô•LY==°„u#,Q $ôCfrÌ6!ùÙ‘Ò>q žÞdï™Äù»äﮈ¼¿Rj,¢ƒh€Áƒ– ˆrUS´G­¨DN$Pö¤óíã0f¤InŒ !1&V ÑNJŸh›ì”¡‰"Žø%2I„±éNÌMy]¸[ ÒhÕe=ƒOwåH9U :x™´ £çN_.‡Põ©#¼ï2¾™Ð³ÐQQ(ßÑ¿+,õgIH¯£ „¼ôbDpaãëB^8òG¢\(aÙ`xÀrx¼!ZL5 (¹È„Q~´ŸÝœø¼83°sy+ÌCO8š¸¤döĤÍãÅcÃ!~ ‡Ñ2ÅÎH‡Àé7Z°¯âq¡‚±ÉiŒ™áLã#C‘XÖª'f' ŒöÌõHúÈìÑT…9 -ݰ•ÜØE¾o8Ë2=dS£D{/û¦¹OóÀ'¨kí-¯ptù‚@˜ö]…Í]P5œx]‰ì{|{?^R`ƒ™òs냀¤²˜Ù¢{‰˜éëS{;¼Ë`“]öü«ÀËÍ;¨ˆxnJA¸‚U÷3ÄEÊR0ÖÝáú!J\ìéö™¨ÃÌŽ•ë[• <Îå^!ÌA@±.ªÐݳ¯ÐëI9O -Ÿ>ýÂyŸ¢SgQWçqg3ú ¿L¨½¯Á6¿DëRëî?ºïgY‰vˆþš´†ÙúÉ4¼Pp."ù¾éæ‹Z3Î0-³êéäÒÇÆ(pñ„×éJ áú,ÅTÑœÁ·Ý‹ôl_=œûeCH%áºí®Äš/§÷ l[î`Œ@áݨ NF“2†Žö—º[rÛì•Y Y‚—œ"Q2ŽF«ØžOdÛzþêØ}d3+û€èþÞJ’‘&kûì™Òðœ¡È¡a­ùQþÃ'Ñú^9‘EL¯ª’%[|‰Èä!48¡àozª+êV4}À¡Ôò­ýt#…œE@!Ù´ä© Ep•Y#ß-d 74Ú*Èш ࣪‹` ­")•©*®íËP![¦†(¶Æôð¶¤w?’ƒÍfpðu¤ó^À_VßoÐ@h0E³ßT@¤; #ŽwL¡æøzç3Ý•\ß©\±*W??P§¯‘NHx‡.cq¨ñ‘í×}·ãÆuŸIõMÎ׆eÁáAiiÍøàIf›@Ž ¢ @~4öDŽs_‚¯xî½ÞJJ|¸q°ý:·×1¾¯Þºïʲ̎ˆr nË •¼&›ŠÛ¾/h)8½£ÚÇn;ií‘ ]×BQ¬!p™¸@ì´ýerÍÃ%ÓS õ&}'Ú[ûý~tçß‘ñ&àô´tY ‚|ï.Ð@–)tG7ÛµZá ˆWÅKQr‘ž<4Úè³9ž&ÎHXp´èZÄ%Ó"5γZHôFrIëm¡hî¬6dêÕx(p‰ëÜÃânÌüIgã½÷uÞïâ¼?›óÍT!\ °YªPbGd{ëŽ4s‰P#~n蹇â jW>?·õ³Žqr倘CQåî@ðŒš!¤†rÎW\p–ìÙ În̈£Ž— 7ˆ¢8ìá)k ‚,å‡z† ݧ· İ˼ùS½Q7c¯"86ùQ´ù×q!¸FI:,ÉaGœRzé»>_^]‚Ìij" g<Æßny}Ð#‡ú˜GP>œÈÔ#àpÝ€aŸŽä2½C%™¯ÛS5ÏÓÉ;˾ٗ¬qˆñŽqoLuí†BóÑ3¾¡šç¿9çÎÃ\:à#¨Š!¨Ñ (€ÜßH„³ÏV{Ï3~f¸«gšò;<|¾ÖŸ·èÞ7XêØ‹ Eƒñ ,À`…¼8Ë‚:·9†ÁE…\Ä ,oéq>–ç×xvŽ%ï<ñ‰ëí€n7F’×*Œš#E®]K°@–ݦ åƒY=@¢ÀVAÙYÎkT0Zl’ ˜yÝ )‡¤ù`gϮܩñç¦P5ð@†G凓àDZôÀEÁTx¬ð/a¸• ê[{³¿;JAïœ×÷×z´B,E€Åœ Œ`ù’ïoñÀêsx‡Ÿ¾œðó#“,èÎÐ@ðÉrÍ¢Z¿#„_H0Ž‹=û GOPÎÖ]†)óÏ(ûpý ì°‚\L;! ìŽ0œÁèÁÌËyËã÷tÍe›¢0+©€“–jÄTIŽ å²Z;«žu¿p©\ÃÏ›s¨q åBv]ÿ¿ý ¡8( yÓª#ÝûøŒÞ¨´/¬RÄ8@J˜]rÿ8²ÕN5ææyÝ}EÄ£¯í:¹Þ¿jÌ×A§ˆ…7STØ@‰Y{š@ÏÇœmhdm‚ªÄ»ê•ᢀœ–ŽA4µÇ.ØÔêˆV¢×­¦ÄÌ?M–^œe{B #²]“Ø2$ÖÙ@½ÕëYŠ'¼'Ý—ä¥gVY¡½èg†Á/Voh4¯:&(liz.ÙÁMáåõôvû çšlÎÆ) œ¯;ňg§KàQm› yÌ$».µ‹±Ù׺²¦Ý=jž†©cen—é éÓÜ’sÙsµi³–òp%4ÒØçÉæ:Óƒ„– «/¨``‚x÷rÕÂP§=§Ë’TÊTdt¹‡Á¼qhƒÆ*DÍc×èž r&`u¼2²Øšæ„Ét‘h …å© ¡úErˆqד혇±ï¸ß¾ôV½¾Ï­/3’=f¼¥ëB¹uí œÏ;Üvó•·}ðcÄÌȆt,~œ'2¹×=¡é+®ï¦æ¿–q }§êÅÌýÈŒJl˜àËðèÉa)t»óUÕ[kÂoÌD0ž;°ár6B ‚³%ß‘í58øÔˆ=ó×y™Ö¥L§ž¦óÃ4e€E‚>^shÑ/Pñ]8j“q¶«9)üûrž÷Zšû©/Î¥Ôþhûqö±QióØ¥Ì-ÜCÂV_k&Hƒè¹Q°Ér![Ãç¤(]!á‚<¾8 MºkPáê_G®+2B!×}Ì\N@rŽ'‘4I¢4\›™†wQYnâ ïÛ¹ìöòìDy…g%¨„E C®åg’à\ò§˜Š$°íHõ ¥ÂyÝÑžyÎu—}Õ…Ôzro¯N2XD r(¢ý«®uaY(É.?†´O{5ÍLˆO××Ï<{™Ö+ÛOœ†#ÊŠtÖ{«¡®Îµš9 #ΡÂ" I‚6C9`<Ü8nO˜†ÑðÉ%‚#ÈñÀi-ee [p!Ó!¨†ïÖ$pÎÓ‡C…ˈý–íÆÏ§ßDy$q¯^†ß`®„-¼MfžˆÙáá!„¯H3‘%€Ww æL–s¬»If#²“GJè³\ Hˆ 9óÐÅԾǜԥí>4»ë†çRs9pˆ‡Žeûò‡´Ïß&f¼¾S\®OÜúc¤º@t[‡dIF)24C9`ˆYŠ~ŸŽT=!÷ïÞ¸uÅÊàDüOã¹b1çÏ«è{~å¤gbª&õ$•ú~œ u|ÁÉi 4— I‰`ݤÎDz‡h!ÝXyrã¢ÍˆPXÒá“’Í%ƒ<Ö I·Lä ! †F<ðwä·… ‹-¢‘ŸÊ)<&‚9YâÎ)°é† d[›¿8†HÑd_‡’Pl÷Çð†dÁm–, ÈD9?i•!Þ•ú&|PŸ[ôçoæ²=q=Êðj&œèxC@‚#¢}9…B§É´Ãë"C~á•?ëòçè!­!¢ÜǨ™ÙÍ€¤¸i "Ävy雘<^-ɹ;A¹Ün z”ëÄ ÙO“5*OS¯Îs]Z¸@EÈÅÛ°‚¯:† 3å9)Ît¥›K†j#Ñ6 l«>8E¶ZKºíÝÆˆÙ`æP´Aé¶A•à9ýeTUúÅ^ç $âG!òNÀô×®úuOxÝtòt@E€F½&‚rWDy* ,¼þ Öê` "úAœÐªï¾S :ÚÉ:À0GzL§åÍš(à†E‘m– .Ðã :,¸™:t<"LéIIDhºç|Ý "Ê#E}'#GËI`ˆ³eËQ g~Ha%˜^Ðm7:˰h ]&sbõõÈ—ž„iJãrR<—?}/Ø7Ž24C‘¢sYéHj,5#§fÉ>yr6@b •èÑf’$k¸f‚(€ `ˆDf¥Ó¦ôl‹-d`³^ðã!DtX‹l€üï¿9@h¶HY„=êÐa’Ò@ÖO;ª "È牠ðŽ®Ýº¤H0ƒ1#—, #²Þr«3g©ÍF]+œ8טHµžÞ9ÝJÌy7¼Øó=©î«1}ñŸ ÎGE¼,6dò–ËDº=cX 0pD–rëY!¦‚°Eæü™f‚²Ž´²|´ÐQms·E¢²2`´jèôüó.1XpÀ•­pæFˆ0ÉCtFˆi „DñÃ"3iœ†Ñg!ÈÞ­j¯Íy 2XIÁl=j(µK#’4Xvvd° X8#<»áÜp¼Rj¤L™[­‹ïËòמyßQç``‡¾€‚QrÌ&9"N“¸á,3 oŽÛ-¢8z“ƒ»ûB!žœ›÷ë–ðÃÆ§SÄüL=9„@ÝÓ„Â0|Šv‚ͳМwÔKl·TœôEv¾œÎvf‰]bgâqÅoåÍBþ¾®^¾=g-H@®nàY¢ÁÌ…³% ÅCè‰2A#2©&CK ä_;Æ^óä<½VмÕ{ q¼¬v}c]ï‘g5ó ¾." -;0rõžV騆‘ÑòÑ͸`‘NEsôÏ[p>ØÝ™•¶ÜÎï–?Ï!™¨j÷ófÁ‚djÝÙ¦¬íÛº,ÍmðFËxX ]8 HUwPÀ"0»š©åˆnËx{…³Ê;t@s%ßËåhŠ,AD0¡)^jbúÖpU5ò´S+{8õ^œãÛ¾‹dô€ÏL{ÀhƒÌå©rÃŽc¾R¹ŸWÓ3S8àW+âgPüògÙ®k…Cñ<ߺY†¸s“!ôáH΋,ÞpâòdAÁa6ƒQg"3|=8>ÛUÐ'Le›Âs£ìõ@,¼d·$²ë|!EvPðŒÊ`»¦î^!mIh/vÙ`²=÷·’$°¢‚2˜ 5Eœ3׿™×:àG/Ý¡¯Óšþ'ÎÀëÆXaøXgJNˆl:´ éú;,Ø´ !†2€7´ÆÐl,Íe›ÉXÚaÑM®ƒ‚‚G%.X6-[שּׁP]ÜFàQÕùgÎku°é.Þ<ë¼ÀaºÕ8È.Eº\°Ø´Âº©Aº6CaøðXxppqh ÀL<7jK–ð·fì°ð$Qme>–²Ö´á…$íxàh± –µ]¡‚Å tÝÂú\´Y `ßkE;-!åg×̬M¢Ý’ú Z‹$[/Ñ^6ÃÇBy3új!IŸ/Ì3ëḨ\qGpW‡¯\F ƒRQÄѧ²¸CÍg°¥9‡ð¢¬ m6ó„4$/—døà”zíúÔ×ù¨eƒù¾2°3‚H~•%˜àÛ wz"qÃïVù&'Ù 9I>ûöÞ¢–> Ùì‘'Ž4ßTDÞ’@rÓ^…µó=$Q‹‚Í+˜½V¤vÁµÁµî¨ ©¯&ðç3^pxP L•ƒòú­çvçTxjÜiÆä…bª9N;ÝÆA6¹#s×WÚ­'V9f[À1bÒté}·)™Dß3|)elŽe^'Ì$ÀØVk™.‡mø–ÂR:-Wm#¥}ïYwy34ë„îÅ&"K õl ¥ö7²Y¬ØHv\/VÈ+ˆGÂ>‚qŸ÷“+22gŸ„ð/Â<;­Z5q•}®Æ};ÎÅ{Œˆ ÄOµT–×î&!å:X¤µ¼0Š +“ýv/g™k”…ç¢b¤d°ÖSi;Ç3Bϰxßj@'Š˜L:=g6Hlj5›–ˆï;ÛÔj€m‘á xæa›gih¹=åÅ‘DY 9fÁ ÙÃÚ¤ýùò„@S3©Ý†ôÎÏÇ÷a®Ñʼ ,ÛõÕ ‚@Å„{íì€<2@rÛÏQ¢ÛÄw“¼{Ï{S¨ ½d³ÍëëÓÎò±F¦‡]ìmYð³jÐè³ " ⢈³GE³ˆTÎü·3R9‘öç´ý§!ïï~¹x¥@üKÏÎþpô˜}'Ž`¿i‘ O—'"ȼO|Öd·„ 9óÇ‘…'„ø§¾†jˆánˆ«FȈ`$úÇOÐó}æ4ù{Yïwæ{åçÑõ/·‹ÄŒïWÓìY ’dÃ…˜;ñÄ4XhŽ‹äŒâ¤¢' a²@²Áò™¤ŽïÇñÁx@Élap_ŽÀpŽ –9/Þ<ˆ(†¡HáA KNoiá‡)d°Œë²àpŽDhÑÏs#Ö/>¸‡¥©ÜùŸ«víwö5¨í>Ö§A÷¯>Š·¾%ý/³„1îû÷QÏíà×3/»×A£¾üÈçh3–d|í7d6Œ–'NŽ#Pí$Eósg%€E›4‡X¯ ÑlÍáã ËYëi™È‚Û `°rf£¾s¼[öãyŸ!¥ÐÙGP›ؘ¢0QÙ ¬Ã³î3%Ï)0©P®{u=¼N&{ýwÍ:õ3?RÒŠßO&`‹-%„žŸNJîˆì´¢£ðéRi|mšÄá”­ßx(úgN3@J&eWªÆ÷걆úLΕv¤HfE‡ X ™t¤ÈËôýyYŽåF ÑC˜ jÏW§:ò`¦~Ò:›îpÔŽò>ˆ™@w¾ãS‚Ò@Éò݃㧋ïÊê‡F3‡`’>÷߿ߞf‰Ä åCëa†ºç9„/´0€Ù áÉg…d71¡È’Èà§Žº‘%¤¢/Ü ¢ƒyâr¡?«¿\ó§Ísמv-#ú+ÌçôŒãêÒýõ>û}³ŠkÞÑùóâ€ügG­ ÂÄ©=ˆGF6¤É@·@9êÔJ’Ý ˤŠ 2.h³cÄ–ï(4Š 5Ÿ=KQa$Ç]îs´Ò|!‡xÍ@"‹ÑÉEœÁXL$ÊíÀŒfDQô@rÁö€Ù;BÈdh³"Œlzp$†ž',ð£ˆôWnaó¾ñŽ1¬Kx#\¯ /è{È^¦"5úú?Iw„`°G;ŽæXÀœºe# ¢ÂK?žiD tFh!Ÿ´9gD¯1*˜ –\0—Hv 0Ñ¢ÂÝ“ i0‚Íúó×5Î8jG6ýS52¡Ôø†§×Èg`Ü4äÓæOçGq{Bk¶µ¹zøß}tƒQg:"GYTD°dkUYÔxBIÒ} 9píáz¼Iõ9nq¾>UÍ¥»½/T槺ë]ï¼uw°ú8fÁ`Þˆ³µêâX—LŠ-yÉy=é`‰•“ :>‚ ’täq&g"ˆB=ë¬Cšrµ*F¹* ñü?>þié=?i\*×ËÞp>}òá¬Cyõ|s©Ö¸Vü¸.€%¤Žö…¢"ˆÑµÏœÅvœö@¿ž>‹4,õÄó>v=yYÃÞ¦_ž»ÉœÞ3ÔW3‹ÑŽœ! 4t®;29• ˆG‰žÜÝ€v@S*:,ÁËw¤Î`°wL3´$˜~µA´XAΓ7K·’À3»îEÕK´ÎFÌGf;ã‰-/½h†Ñadx@‚.áãl²uyPòdõ·vh× 4Ú 9o Ä” BÈa%¸¨«û4`Õyí†{f+‘žFK0%¯—ȉ´²u%¤´†dÔ¸œ¬–rØ9.@è„èp$s«œ”¼|8d‡ðG34D‘€,Š 9f~pîå!ÈïiÏe‚,2“h°ðè³A€ì‹2G#Ë®zcPˆÂ8'êPöšæd rw”©x[$ºÉ’Ã/·“$‹2íx ‚‰1 AJ­¯z<7¯¼åá묬´Ð]üwÚ{GIzDÊ †‹ #ÍS‰!,ûC¸Í³X^N܇@‹+)¬Ýv˜ ;!®uÜl‹#‡¢Ø„(€„ñÙœœ;·R¤Á²­ž?­ãžÞruä…p/—èÞ55Î?½‚ùŒ[À³E†H_+›³.¤± 'YÌ Du‡ÅÌ/JpóŠÐ9.9Ð(€h€lP¤Þ´ç¾ö‡dlŽŒ™+k¬çé^nÍž¼v oŽ{r&õÍoÞМûüï}ù˜W+ÒLAveIBh"!cq*Z\¹vi2`¹fç™AõhYFáA‚3®µ2ö¬°DQ\´ Zås>Ó555é“f¦eV>}ys7Kë <ÆIæë÷—·MQצf/e™°tÎXG˜›ÄcËç^¾cÌê4¸&eåû|‹áÝȳD“º7Fžê\vT¨-ÜË™RYËžÍÖê(°ã»Áa‚ÍC„ƒRúGqâF‘õéç[ž²™)¸óëXIk-‚<2X˜Ä ÏŽ(‹òysÂÙ,€ áÄ‚Ýx†mp‰ lÉ`å‚-×^w ‘ÑÊÜæ†‹3õç’,°rÂ‹ŽæòµŽuy/çœÇ9ž.ûäyªÃ΀Ú@Ie”}j Œ&%–ñälã{qxC‚t] \ò ¤Ã$`´‚<ò]„Éa4§¨ðܰ%€ìÖVH½>„0G¾Ÿ ,4TÈæã7­ÁÌm˲N#Û2öÎ$zÛöëŽqã™õŽÒtž'ɼ[X%ô'¼=Eq4—,ãȾ{qá#¢2X ;Ý9·Æ!F‰{úx׈y‡™õÔõãÓ¦Ó¤"a7†]áß\Ï”' QdX"ˆuéBíç½½n8#CÅ1‡õë~%¨ÂÏ~_†ã?Cozg¹û×]"ö{(<æ‰é&1µïS†ì³jÍÀ„zãÂÜ̾;7¾áñ¹(]di«€ÞÓm–lè±Ù¶•¨¡Ôxølú8üÌ-ånò|SB£ˆ «ò´%3@4ýÚã¸\S£Æ‘ALÓ5uœ[·³Ý:ò¾tÂ]~X`§/@Y-š®'½æHªù²=ãNºóêƒKF»‰v>«x³”žk „–WÀ¶=¦¡6 `â¿6‚ÈöË– ’XµìY’•½w@ƒÝÐìµÁ(ƒÜX$gv«uI^2aö5Eß±ñP³z)[¡}ñÜ}cèHòCùRôÐ"¤£+=ѳ&’d×ÉÊ¥kW¾õt Iw¥>q\Ç%4VË%{„EBü„‘¦²Õ ÄLSìÖé@4äÆ#@ûf¼Eê ³'­­j,íݬ­Q£š9#(øˆ·²Ù¥¡¢Ãö‰}IУö²n1iÈãì]ˆ½”ñ1ˆ ’ZýPA0CŸ:w¢Û,Ù, å­f®ŠJ‹FT˜”$Á¢Ù`øPX®Fåš‹zt(†~8$BL3Î<–bCh÷póâg„ÁNÈB, y‰[ò4Fá`¬¦@Ùeé6 t{-Ù:¥>$9j¿9™Y‰aëÕús™ì»†C§ÝkjŠ.VRYTÎþˆ…ÉØ=}ÌÍs<ä§êësXÄSÄïÂÖfƒ¥¸âOŸ(ôÀ+ˆˆ,~ ˜–i¸CØ?Eît¶et(~†÷­×}i;ëS<¿ xQ\C%°Xp˜§¢ºkåTÙ’–ó>œ¢Én·¿ {z~È/.p‚KÔúõ Í$7¢ÃDY¨0ô—¾ñN|âêL„ëjO:×]‡}`ûFIÚ_X õÞ¨O2ôµ ϯ¾ƒwE×Î@!‚"K4ø°dè†Å%ßOD77n I|QAŸ¾$蜢¸1ï¢Ñ_L¦Ë¯ºŸO+íw‘ÆÞ8éº=ÊÚáŒâ p²$Œ,SÃA¢;,ç+ñvE<#C·ë4|$Ñ[|éèÉ ”FðóȃŸ¹äF-ìµ!jScÅ£D @DWI„x™eÜc˜Æ%† –’’aׄO#ÊR< t–ò3(3%s´‚&;D‹3B&úî*“fœÏF‹>L Ê!{v» Î[?¯­âjÆÒƒ*`«fò.ò‹Ðûµ`¹HćkÁE¡0z; ×ÖdsYœGé´“#ò•ç7ûÞOQE3/®}6"²FbœN1žDeÓ1¢téL½_EWUiæÑ¯kºÚ õ1ݦfæL¯ °‰DEŒR_ÙÌĽÁz¾Ä«%/ÕZÑ¿¯,• G·;íyfB¦ªŽr„ÐfÈdfÒjDZEâ}O&ó½­ÍÚUÃÉ-«™YÁû¢kÐôƇîF4ÔnóƒV qñ+j²…ˆ{ßµçÕÒäÛ¡_« ?ÅàG¥\úî, Mø2.§SŽ>ɤFÆõ֤ꩠ‡ †Ðu˜ÆÖQ®ÿ!Ø0À~Ñ<@­y‘N£~+¶MNe§ŒaÈ?Oê}]ûNcå1>Îöñßýú1ULá齨ˆ^t)=D3"¥'e‚“.fkÕ6˜ .@YBÔ]ÝF3:H×dR,qLÅD>@HB2.–ô³±&‘áÁù1 J¦øèB»¥ ÷•(×fûJâ¥|µrà†ôïRIm— &Ѥb ©™$N"úüýncbHi+QÜd*4ШœìÞY]¤¬•O*RjI³>¡ÅL£»A]<šëò úÊû´Kty{º*#6E¥ó’º E´Eã´µ½ÂŽ“Ô'DÄžáã:zˆÔê„ëqÉx—öq#²ó. 4ú65z‚½ÇÀOÉ4´‰õ¶û=*NxYÁåB|÷09*„žÛÝ9&¾©„Ôª'Uì7FösPk±4ÌÉ/lØscØyÀ¶ìd¸OÔ`:pˆ)ªe(fÔƒÙäè))„ífЀ ÀØJ‚г9ÚN‰=Œ+#xj:éݵ6º1%î*áé/\>ÍcYФtk’[A&1zC™·Ò^X\(@š(‚ò—¤ù;K…] Ôƒ †(><*¾ôú—†:Î0¦ 8Y‹Âfä"ýÉ8ÿLj²Þ~úWKF´ \*Ùt„ÎþÁ“v’#ÕêÜܯ‰§ëîª,»ûÊJi/œ<å}5=]ÊÎè„Þ?g¤ìu\Uç 8Û§±¡£’gËUÓâ4Ú£•XH§¼Àò<ÜbìúÍçeûŠ,jf‹ –#ÉÆØåµš ÏZË~‹½Æ~õçd³W·Î¢¸{Q>•qtª˜®´It=ãJoVga¦ëç§«AÁ[ÚH5‹âÉÜY3Æò1ÔZE°w§-u„䎚ˆ3d'fËj~)Ù©yŽ=+-Î÷~«ô–Êä\Û›V‚GéÁ”ã±´—¸¬s ˆÆÛZÊÙé!ŽHOµ‡KÓEæx§–ìkoMCpOÕ8¯ŽBøáö‰îÉA_ ª½)Œ&*”¡ïÖá;CK{syWK)â{6âŠædü&O‡«Z¾æ1^ÇUÔC@/3ŒÛ&UhƒG |="q"Focg®@…•>çó’A˜EéûIiTQÄÄ®ÕÈb:äÐj";êv}õõ-°=ûq#Ô*ÔòŠÔý<¶+ÁÏÆtMÆ'~{Â'îPZ´¯[À‚Œ!(Õ醆†©|w¬xAÊ]–lYˆg¼ÝÅè0¢ëã¶*T¤ÊûõAÚ’Upz¯ìb¸ÔªH A›+¼¹ÙY ƒm3Ìí=úUmyå_S¹.ß-­q@˜@bð;—ÕJ‘ { ¤?¥Á’¦^#‡ãsHúhÖ>Hz_¬8Ç•G ¯èBbf®šm™i0C/éQE ¤ã<ÍnzúÃÍ£lã6n‘eÇ'æuKJTÖð¢Ï½ãÚXÑC8(ìE'‰ç`,QrWXOOc{jtõ+§ÑŸ~>uðgJ»ŸÃ:&7«­œñ ‰ŸØ$r¡ž¿ad®Ò¿Úwêq% ôâÔC´±ŠË…l¶#·L'v‰‘Y¯×ôòtRÝøÛC;Ó$¸\fœY×KÖÁ¸€NõQ%¥ß;íMQ>&a³€w]ýᵑ±IÜIØ;Z~S 8BÅ1Ó¾5™kA"0C0(qCR*Øèfó7•q×p“¶ÍÕhÎŒ™O¼þ®NDÖ’"çL«Ãzá¹+.—CÌ$\kÄ~ãõ2´ï=òMçÍNñœ±Å•xXð£*aNJÑ…3’cÓ-€eë#K8]N¡ÎâN$¼³š6lžƒ ô )ørþ'z­Ä” €³œô8šÑ.d–;šn>"F%Áã˜95Èän+6¸]rFbáF³ØÓa"Òc„]·àísÒx2—|}„²„#~d—QÁ,ê¬=*'%¡ù‡-}µr£„»î¬Ç!QÂ\Âp(,6 øëÜØêx¡hìÇÆmFa„'¨ª|Ž”bMïS9°Bi–óé2ƒx“ÛO®ðâ.ðì’{Õ-E8*ƒ&›„c›“Æ/F>ó­±§PŠÌ  …Óx< ƒÛðór7Ò;Þ6\ =ËN^ŒU‡¯N¹"Ò ™]Ú ƒq̯ ÛD+m› Ù×gW̨RÄõÒ‡äÝ+p„¼—L%!h/8·8ëÒkHÉAûÒÙÅÃgE¨É«™àòu04mº/x7–\WaE„…[”Û–€QÔ®µˆÙèLº)7âuÂ@ðÀÉ;Ú¢'¬ kÕÔ"Üf€#ÄוjÔl06 „÷>èžb›z´?_ϻ”Ð|…]|žR™¦9dj^TKcÃrê̹¤ˆÛªÌ)½È''ã„mOjøØ¤C͵ía‚ø=žuhñ¢SÊÛ§!X ˆÇsË0޽4»8ߨQdˆÌüåDfØJ.'eï‰#h¬yÕ‰^aº£á>kÃTG–0ÍB!g^êl›‡KB,r„íê²·õxN¾æ·.AŒ}ÀM‹‘÷ì œÖ Ìú,í¦>ï=$hƒŸRô²]{j’lÆãÉQ-‘ p·Ì[uÕl³k.Â5šxÝaþo)(ø70¦ó#/Å.= qæ •ˆs÷Ø[¢Þò¾È:Pr?ÆYt… ÔBM|qª:åÕqÜ”6¼Ùô6ꇢÖúbµð£æ®¿¨ZäWÒ¹ïcœŒôk){ÈÞÈŽ¤1“IÆf†Ñ RšfGVÞ‘ó ø(ÙÇ\ºêBètE“ÎÝ+4*< dŽ?G³…O8§ØÜLÞøæ¡·S¸ó0JZòü78QK¹òü®ë•äSå‹`fÎX ‡¸¤fÇnD.ëf¶in»+³Dñ&Y\Øåξ+‡«d¾=ØŒÎiíg ¹ÚùŒÝ®m`ÐG£¤õ°8gO  lºÒ)#Ù”†„,H¦è¤ñ!ÑÀŠm#&çWp F$gPy¶­ÞPL~EkO­a&‡Ç_mÛµ 8{qƒF°æ­~¼ßÓ\™}v­šûC• Q£ìñ5­¨ “2òúÑfÛ7¼†s£ÌÁ†i`rr¬ˆÄr´ÈÅYΆáXsÑwÚè9q@Cx$aê´Q”gX× ß‘n‰>ã’¨c•Zy!1!>—ß´éíúÞRS°BpmѶj@3Àc³C·/¨m†¾¹Ò\bG9Ô}mhbŠ•ÝyÇfm™[ ñýO`! áxȈ±{Æ­õKž&|Ú4ÿyþ誋AHÈœ4ŠX§Ù‡Â*-¤1²“ìC ‚¬‰N—TûZþóF‡CІR¼b åÉO­+¼bNÖΧfð:Ûj?zԩä§(ì|!£Ògb0X̲+9ÈŽªà÷eÅ`apNq9iܦ'þµT íÖ X¯Ý6µÂ᯦£T¦3õMùlfÛR+®Š×IËÞËè%D¡®-cúµ^ËÛäûµ²?s=Õ‰ò–üI_kœ”Gî1ïµ}e× –hv-e¨^Ú>—@FwÖz2À²>«„Ñûº”:S‹, eïz hy@õ[Þ®“LžïFâ³SMֽϮzë:µ7꼊—ô·)ÒóÒJeß\˜9ι:>ž=l?Y„vðêÅP«Å3…” j1툯zjJ2r&æA䫊vÞc ³ÔÛl`=¢ÓáLñÎ ÕÍÒc¾ÚÏ=týqAE*Ø—Õ31g*®8r湦ê}îûŠãõ«È—¢‰†:Þ4L ScÓ3+SÔ"*6Œsf‘ÎÔe gˆ²ÊèJ^ª½†‰LZG„W$c¥§Oî`,·Wc[ð!!ƒÔ" Úd« ‰vZ[Ó#ºž™!K–avè˜0÷ŠäÌ mQƒ §˜â¤Î¡äÞ|î^q-õÓ˜‹Ñz¡mÞÇÞ."‹öyJ¢SDÈå,AF\œèó2P2¥uL¨S‹=Ç“f.ì9XE¦{D‹¦Ydb± iXF>ñ½[õ›Š W0{”GÂcÝêÒêÓT|,á "„Ì:8gÇÊ©QÃðãH¾ R КmöŠüØ-î08"`&E? 2œøÎQ$s×Þ_ ¹í ÑÚûÄs&gÖZh¦ýxCœdJ9ÆŽg¬Ëìfä«HlÉ'‹½Šfù²>¡R#à W£Stñ¯†Ô`1 Y®vûÙä p-6¤“ £Ÿ ^ðÝ-u5‡–»×|&º&£ê0P©=Ð^‹Ûx– ›£tÁñqJL°/Ҁ $eâÓát" ƒ×»{v¶Q1öA'¸_Ù–&Ö€!^Gáv†°Ïm‰ dõû”8^¼ %ËÈvIWÄ h0’̡Ը3zQ^=Yž˜O>Mù$HÊoxm³ÐMå]¢®*z$¼©´oâ-DO ’ ÅD‚$££Ò¯¦ë{ÊÇl\÷͵T¶±:å'/ ‘ÞgkC6–píå!ÉÐS–ƒ_S„ðÖÈâ(žõ°e8n'‹«³T;VÖX¼%9/™-æ5Ë»|؈ƒè×põ4%!Æ5mG.)TËó·vòðÇ…ù E¹©Éèl™„ ëÛí¶8qNOhõª -¤â1bóéËœc×n¢RãÞjG®˜y7nòö¹-1zMHÚðsÏ>¶¬/J‡Š•=éWˆàt¥“;DòX@M9½(?¨…^Æ©r›±Ot¬þ >­‚Té¿^ ¤Èaeó)¬Á(cyÒ¼{Ëì8ó«{²«ÍôïO€šz Â(J*xÎËeM2e2ÞµÕ±%¦NމäX-Nòœø/rƒÇ(|Õ¾¢çß/¨s%iÊ ¼ådzâDZm)'®)M! ÈbÞ¡2ȶP%Ž † qö†F!©ÕøÒÈQ¯ÔžåA‹Òö­2àªK#!ìÚ5WœÌb^21W°¨Þ‡³Ã=É„Gî æFabÊã],<9I3å’µQáõœ+ZªS•]òu)¡¶ùR+ˆ€Ocv˜7©w˜ª‡ÃĔ9˜`}Ò^@ÅÆEÓ2%é™%"·K=R‡ä.f"ㄎ8â ñ8Iw1)êü¥ Ëîµ.^³†j å… ò…¦ Œ^',%Z¢mAX35—h­Òò‹?48øšæˆÌšáx±õ+o„%ó6‘ÆÅTöÔÏ×W…eÊe¦{`t¡Ë YžM‘+óG”ÀŠGeV¥"G‡¯›‘\€˜,® 3e:¨Ø`ˆ—çrÞp‡Žo\áú=Ð*7éñÉt¢Æ)ƒ>&Ô,ø ¡Àë׎ývYË©mœÜ*ß*2mD\bm¹¢Sg±LÕp4äÁ·È‹tB^ D5Ī¡Ë‚³b7y§/ ±yT˜‚{¹ àtÏàß@Äé|°y¨qèð+ñ+Ùs±&\Î«Ž«ËŠŠµ¯×,ƧÆkT^Ђ2½ 9³}“r¹²ò«Ô€ˆpèÞÓ)LÎÙÈu¹ÖûDzåäNšÔW÷Qg¡VÂV,½âB Ã>ò„FW¹º4â¨Z¼Ìîë¥Ná—v5N\¿žñIúŒ—Íé”——1æõòæŒk]¦˜:åOq)NJ5rÔׂH\pÎÓ½ºb‹¾ÅV"ð· PÇLê ¸:=•Yéüî.¬´A2Vž ÅÌö•¼>Ï”¥uª•¿4µä½i>.eŸ˜Ý†î…ÊÏÑy ç~çF§—Æd.Vkˆírd|/ã1Cªñž¦øÃ» Öp(ÙÜXÀ¨±ä†·ÈIèu1næ–AÖ.vQ2¦îz3â]Ë‹:êb¯à„üì¹xwÅQUߌî4n{‚à¤9¯†ß±3•s r{Ul“N‡aŒ_P<;³|*C eî³ m~ñ«j1â¹ÈÇz4Žø¹ÛÙáÛU±jƒFâ’7J…Nf‚3‡÷?Êi—wÙÛ—å}¼‡ìÈÝQˆ²Çî"º (ˆ£ H`6™_,"¸-+ùŽÀ¹L=Œþ³²tèr^ÅgË£ #Õ_œèd“:ÄÐýà?2O2n±^x±Y\£Ìk¦Z<Ÿ(5uvg0 ®mP1 Ó„*d\MH`3 Ê®Xt%Ú²¤ÐrM¬µÓ#ª› sÈÐQãnI÷±(ùÎ,¤Ê‚ 0úÓ9¢#t½œ þq¡f/!QÜh¼t‰+x°U K •d1­¦-­Ú4…‘ÚÔËq­BMhb÷ïTjP`¹3X¨è›NÏ‚÷侂¤¤af¼ï¶]­ÎmâUÑ'·ØõËGR¯,1v&®·G—’êñ‹oiW7:@D3Ø\¾A×E)Cì¿7b[×Üåãvór%±Y›.z¡l,cdxË«Þ4+³hq Õ{u`õ©Ï¢®(Á—ª»r¶04V¬§0éòýíW:Fª/%g’vñD*Ìý@)Y|Å6Rø]ù|„ˆ0¯ÐüùpJ 18²;’8Â'ê‹Å;®2-ð¦òÔhlIWTÙˆuýG8d$Ñ×3Á׆.¯¼‡´¥ÙâˆëØ.h x Ï¨Ý TÍô•l‰O-@wÚÓ¿â‰×ŽŒ;BÌÉ„i1™‡OI<Œ=1ʇçèeE,ê¾5ÞGˆ’k‰=:ʨcH/6ÁRnÜ5z€Ý§ÚBûÖ¡É„ íöv:VoµZ±¤[ºáv-Ž2xsÅpÙ~E‰iB£¾û&Fáü¸œ:%s÷GòO¥Ø†e Á[퀧y‘ñ#J¿¯ÛiÃëk¯ uŽ=Ê(cñÊ%ÅÕ™¼1ù‘æ7h\nhsŠ2ÙFjó†fEÃÃðrøìÝO9@‘½í¤˜¾òبͥíä¯HÇyÊ8ØsTH ãuø¯„Þóf¼= žγ“b.tÁ[¥ è.Ó$ªÔÒe+¯12îv! Ô°2‚3†EÐîöÞ¸ÉyËy¼Êã¦õï[Žm ¼–IFyÃ=¡í{<ÅZùá› Ø©êzZƒôÆñ ‹ÇÐZðž ;éµ0–!bS©‚'æ(Y‰ðÙ™0¥[_âjA»ÔxhŸØ‘dc¹hœ1,ðŠ"u"¿7ŒÄíçU¤ƒ{ †qª—ã¦*oF¤ƒ©Ñ¨ŸÊ~ñ IÛ÷Ž[n-@ba2aíÒ-žK,Ž©šˆÒ˜tçù>ÎEÉû~yúkœ]lÕAòQ0·n`›’—Eã©$ª=Âʦ]äñª‡½Mmâñˆ>Êq™ùZç£kyoÂÄpRiœc×§ª¸’: ÞO›$zø…›oQ"šÀ°¾§+2É=l?yÛ<æ‚ÜR2bF¸\%‰Æ4ܧ‘¾Œ0Œ²º¶ÔöXy¬RϸG(¨xyüxwHb¥“Æb¥¦÷» ÂQäÇc¡*Ÿ5“FǪÔ"ˆ<>®yT¦GhlZ8O(‹†P0ñšsÍE®Û ‘#¢PgðÃÁú½°Å@þØHžµ ÉeÔ0$B¤?  '„ÇETš­5K®SGÕD(‡qǧ@¶ÌêdÔã½Ùñøß¸OLå%œæŠÀø´KOà(ÝL¸£Ú[ð|áRW+)ö7£GÙ‡ŽÜ-K¹NE:ôá|†­êõ³ 0nû:ÂeVÙháÓºRÆÝbÆB¹I‹Àä§ÐDÖ¶ ØCEG/à‡kU"ŸP; ntxÏN è±”nM@Ä=Æ„ã»&žÃ’££s‘=K=/5`ˆ£L϶­C|ºþx-é §˜„¶{Zp•Ñ/OF—ÆBÿ<çB^ñybNH†Ô‚`»¸ÐïulC§<‰Ç˜`¶2Ævf‚ÖX)î”pó";õƃ?¬­¾1¿>G ¦ôC c/¼K^„Ô>;&ó$¡J¹¼¡ƒÌz •EŠ ƒm±À£y±9Í\” S©áTc{È£Í×e£Aņ†B¦/Çàã\^e–p…0ÎÔ¼@”Ç/u¡Ý‚ú€ËÍâºÕÀXLb°Â’ ÒÁ.c™Ç ráõ”ŒFd18®Ô¼¤‹áë[ 2뫞D`¢zIæ`YÕ!&_nºZzãßH¼¦ªù‘6¢²ß5Íkb󧇗‹3——Tw… 0dó­ÖGo¶€¢õÔë\qB•º'×D‘3AÃ3w:‚ Í´B+sÅBÛ¾n\.Ü ÐgH~ïb°žš™0Cœ?ŽÀzžÞÓÞæOx$çÛíÝÔ~ì YoJ)ŽŒ ›ONÄû"Éå¨ä‡½Ðûã¥]A¦‚u*Ù‘Ñ¥éNòÌ&ë¶ÍÉ!{Ñ^Ç+u®¤VîôÓ‰HdÒ:ÍŸo\™CU=^ûmá˜PÕïž*™Ï¹r¦I1ž[Pï”ZÖžÆð}Êö‘À3{:´´òƒ¸XQ§ì6½´œÌQçÀL/,¤=·™Fâîñ(ƒvk³˜XÇÁͬÊn“oÄV†l ¨4Õîo.°*ç"g¢øB°C‡À¸¤\„€Íß°MÆü`GÌ-èè±BõUòð•8ÂLÙ…ç—ÍžBq)Ë}XÃ,¶Ñ’m8b_çQØ_®‘ø‡}áÑi.È“9õË¿‡µ‹¹°­îÈ µϳuû6€=wqB!PHp¦™dÞb°Øaª›VU{ª0­7iDŒŸ¯»³zh¶še|= ï`¿ˆð’}Ì~‡«ñ²Ž›œ’xˆ<ÀC+Å<‘Ñ”@i8ON³f”níuqÞNxºøÆ®iÛÒ¬ÔË!/·Y ¡¦›€d÷}Ç‘[ÁºŒ2à˜¸UU[ãÕ4%È!g`Æ@œ‰2ŽÃ÷@[­™`Ó§o™>ÚÌæBŽŠ·Au6G‘=2f3mï/Å)0%èDÂñ˜qG °Õ+Z’Œ­ÌL°Ë)É) UàJÿRvJ«ñ—G‹þЫðW”Ÿêù»R!Çp”YÖ­ö[D?%õ+†ÔíŸ<+‚à<ñùäÒÂŒZèœg¨=AZÖ&¼¡ÖôUÅc“·½<UÈxXã¹$èôéÑ5·Á”•àò]éVPdÓF‘†³Wª¡»}…z•aC¥¡‚)aŒ¥Ttô/¯í6’"Rð­§.;ó¹™ _* •‘ÈÒ=8Øbœ•kÍ´{¥\þr@âÃ!³Óå!ª]beo_¹¹µë”õüãÈN±EÊ>–ÂïrÒ×c™íõ è„Úo @èø|íQ?¥dE39Om’½éUÖñ {«{,qØ©Ne-àŠ-Ó§ÏW™ë>}×5À‘$@ÅzMße ËYÌúÉyWRð¼Ì‚O¨ý6æÀPÅVŽ=LÑã å¢ÚA³xÖ†—QϘP›éà¨'F4´œDÁç•}4¶^03cÝQäÏçyÔÔOä*˜¹>–dÒ†µ[ó?kîÞÊ5z%ê²Ì“(U}Ó¯˜…ŠcÜ·°ÈŘŒEÄÇ,Öär$)Fë>6E jMh#Hð>õ9ùN}árƒfã¤xÕ1+S ’WîÂcqÓaaxðSy߯£*“´ÙØyô5ɰ \9¢L­¯Híö­îbNša½<wãE%u÷# áÄ@#ðßx&¯E ¬CH˜d½‰Èáæ aÝ´Çç£|-4óöù”c†Ø£·Ñ*²æãÐæ°àe«ˆúk zݘíbE…p¸r9„µ¸@€"dµU`åÖ00¨—îí®™D$£ð!A37šZÂõPºNÅLù»‹¶Ñ»£Býï·y¥o›Â رxF•3V‡ƒ¹æDl™JÙmR«1¢“(½xZ *ñGU¤ï8Œë’òÀàÜ‘@ëmVSå{Q†—Ï~=+8R%¯JlšW_¤3RýKn„^U²×4_½÷èíU2[wÔÇ6³Œ*A3õõH+J„E%üK Ê$ê''Üuê¹sjéœQ`!"´-𩳲DŒð*Ñ @W`Š!D#™'9RÇKƒ^<¶)wrj˜­úªU}œŒBá(v0“ÕÞeC1Â3§àUXï(‰xX=ì\`ñV$wi‘Ìwÿžƒ·ükýóù§(²9LDÄ?óJfz”Z–Eg:Òÿ†¶ëæò›[s,­6RÁ2™Ñ«ªÜ„Ä*ÜÁrFIivÍ‚¥`FÓ@l²BK‚ÄÃBÖšU1Tm%b|×}{n¤e‚f   €LEpˆËSe]mq{ÓvÛ{WýÖVúÕõ|™-SS(Ô’P`i HaŠ% A†R  цK+ Ä8é#HGœÂalÀ?¬_ý⇤7¼ ýïüøîø‹¶qe¬çÿŸ"ÈAŸúÝ:ùÑÙuþÝ`'¹Ê1 T¬b®b.J&,R# ¦˜f¦Í¬š&ÖmLŠ1 S`mM“R›– eHÅ—D€š BÍ´l„@I¢µ%mf§´Œ¦im¶ÐE‰Ý`aí¢ÌÒ¾®®JR˜µ-l€|š‘?ÎQó‘• ©¬–„%Qchó^myENë›Êו\·6Û͹Z9æÙÞõÊuÖ@Ôè€ÖbPЙ&¤ß.妇ËãÃyµåWšŽW–o{·–Ô5ÿšs“3DÌP1L®T a ›ÍQo-sr,[y¼¢¼×»«^TWÓk•‚Ûã|Z<¬”³ [Ô")EÕW$„`$¨Ú†*˜K$ƒ*’0š• E"DŠP`R‡ÿI  –€X!JË€¤ HP.ZØ¶Š•\Úëk*’¢ºE‘R?Ûè€i- Ù6TÎ ÉŠ€„ Sn‡fÄLh)«M*Y-é·e,´•\ÕÔ&©E¦Ê“lÖíºí1zm½+Ù½5yo.kͼ¦mÛ«À„’’#!A¦õ¦‰fk¥Úu´ÎÝl‘@Ž(â8°%9ˆB†`Ö Ë!1 ·cÑÇ !SØh 4LÀÃ!‰)Ħ†‘Á ÂHƒ‚0C¥»ÛRÊÙ]•)lªÜu\»]®·7U•t·jb·lÜÙ*ÆéC0 –Ì\Ói²®ÊÜÕÕ6’ݔĔd&pÇ $a‚‡ìÁèB¡ø¶üþ¼·’}È»É1fÆuÌbË¢Ïiœ3ŒþT*• ¨‹f”6¤ÖöÛC}{vÔ€4U"”Ȇ&99.•MŸ4TMšSJu?;[üÜN#)¦-S}ô®CetÅékÎ[’µM4 në­*mÃA.˜!a"E"€˜¥"ü4fËzÆ FB`¤à©@bÉKBá†-"˜)HÌÈ™”ËSkû6ï¶ÔŠí &€à^a4g"F`…‰H¥ ¸3Ešh–Xõ.«ºã;ºßõ/q#ïùÏÃï·ü·qÒ:¬¥¥`b DÆ@`C&$°ž :QõÚâšRLr)¤gC"6†$Kš0L™†)i…~@°ºõÅwIo]]l“2‘K3S€“J5ˆC3æ`û >^½+䫳m2„ÙlD1C1NC¤LÖ8@Hd)ÞÙu½²èF5¥´”´›Ýép‰àRØ«³jF„qe’Ia`ReY)!)¢ щì‡Ó¹Ÿómœ‚ñ΋¦Zë…9¡Àþh€ÚÁ´)Mb.Œ)G A‚•ai FIAA“÷î\v’@Á RÃAÁˆ¸£$p9Ì   !Jtä8F(BÕ2ŒU4®¦å–í×)a&d¶–H²»«Ò½M1U À S¤!ý¾¿ü¿¦þjyé!æöUÿ]‡„6EQäÃ!ˆ‰Ji¶]³šë*í›2Š–bb F ÁpSFA ¤±-…uKk”[-¥zØâÊ•*@H J*¤Òb› MZ)™Hf) •ü»]b–²R¥Júkšé®‚$)Á$È“(iC'%1”‚F 1$eŒ $¦…Ó¶‰Èâ²–éµvÙXÉÆD‰FP„€R$2SD¼c 1NÒWL'Y&Hb’Eg0‘£ à&&©‚‰ýì`Ë&€qœaèÂh4`däL)2â``AcœT4†Ä4.°$ÃnšŒdÀÀÉ :ÄқŠI£N4­L¬˜I’¦!M­é]+e·R»ijp M,Qh€š©)±qÄ*hÛ+t´©Et®Ù]•Íh14©¦Í›)»T2`dH"(À0Wc*hRô”mÍuÎÝšÆÉ©R0ðØœbƒ„‚ð`ð¡ $p(Y„Ü ’±.ÅÌY ¨HâSBɱpC¦£E¹díµÚ5WË­‚D † BÎ&!‹Ž.BåPf9×§9þŠgƒóÐQ ?=õì$0MÁŠx¨tiZöºÛކ¶îÕîHaê×µÍu–Jæf‰´£]:L¬´R@˜§B“©†6”·Î…‰‚«ÕíÛJQ)68BâøhX’dšòêT¦¯ç{øs)(~ýM¡&B 'ßOoØì:’’h Dš&NÀf#æ] A©0Œ™j’¢º›ªY(M0š©¹ºTl$ÛKvÍÒm)0°¬¾I ¡µ‚aÚŽE¹vQ[vÔ‹KCi¥6¬±…i­5&œÕÓ•v’Û52ÐT¬Œ–Š °àh…Æu(#‰ˆ®™?‚Žä8U ‘Àa H I`T”!qÅI¤'„’±—’1 *¡Jàdkqf‹ jLF…†¬ 10ªŠ¢ƒÃ!’ºõê‡*kàx:yä厈z+1•El·T`þ–´kÆÆ66J* †cj Š·šÕ=µË5ÕÊ¢SâÉɬ’œÄ”-I¾vëWȨ45½©Z’Ú–@‹FÏn¶Q‹o-ÔÕr·˜@ä$­p`8,… Á}“mŠDCfú»_ZZ½&ÓWf· /YsWµe±I(…Ä$!RÄ‚ƒÃ$Å"pp%ƒ b LpC›ÝØ•lØ‚¯M¹kµ—ÙiÐÁA ؘªYwF|»fµÃøñÁÈ•1TË1(!*¤”È2)Eµ y]±Lk%e´ÅÒé´Êê•5ví¬&SZ™ŒXØÔ˜›l³2ƒ[2Í%鮲Ù"•–-34˜M¶Í¦½Ø»WµuËyW4Y³lÙD´8&Œ³˜°¸ãЄң&…Ói¸ÄD 6JDdda˜Å³væ[m¤ÕcKCK!™‚˘¦,´°J®ªž¥{kôu¨T2ñ†,œf2S$Œd´jv´U5Û]J²[¢¥™i š›5–X“lÑ©D2¥MJ¶ËÏk¶Ý]iQ™-T«\øx×e¯/ ðÒN¨ÃUøÚ*4XÅ0@É‚ÐHâ) à%Wc²SB, „HG\T¤SL´­6eìݲ u¦wlìÄq”rhÉ!„1F H`µ$3 è0…¦$‹HÊÙ¬×6ä%5Sl¶­$Í6K»¨ÆEF‚-3K®­ÍWZVí¹b(Õ"j%R˜É-$Kà@9¥Ñ!âÚ@lbˆ¡H¢Jq§¢j8X¯ÖTÄž?/ Èi棤†>qFbÀ8@# `D8H*D¤Ò`A˜ b’N¡ÐŠê1hY¤1I=,d†IBSHºc@†¡Jdu& 2ÞœpØŽ LiWº.Œ‚ƒDà IÕIKu,kä©UºÚê‹y² P 4áéíøz†mùÿã>wP¡½NêÉáCpÉbª¡…v±Ô˜BÀTÆÂ)ÂÈ>(Ž!£L #DŒ(⪤iÒ,%2À¤h$ѧ)”–XIYƒÌ¥OXr)*CúÃ$C¨bÐÑCBBœȸDI“ëˆÔçÁUEüsüÝϯ?)<ûëˆü@@CÆ”4â@HR, .YIJ×ÝÔwËŒîŒdãÎÌ2fI—;›–‚¹­r‹I¶·Z[Cˆ¸¡ˆJ†!ŠâHC’,¬@(@¸‚.²°"¸Â’©€ËBA ´£‹ TÀ¤ÂH¨”¡j(’ ³ˆâ誆”$…„d ! A%fpʤ3S+-´¥JÉT¬¶••Mª&ÍBÒêÓtd¨!BdP0pÀg9˜$¨¯D¯ö‘èb$à§RešjF²Ü±©Äee%Ee;­n‚¾Ün±^QW'!0L q¢X"b‰ê]ºåÓU+½ÖõkÖ»+LZÊÅ3"Dv £6á `ÄÄ%U×YR”³+*šºd©&Ld •¥=?×íõO~˜|ùñàü<áÓòíð„=WB{URÍ4›H(ÜSq@ë r2¢q¡(ÌÄ31] HpV˜ A,%,¥©Á4H¸2F“+I±EÔÞ¯{Õr–ÙEͺï^º)·•;¶lÕË¥tͲ®•ËFÌ,Ôªm4PÕ6Š-F‡]ql´ÓS¤ EÖ®½¦½KfûîÖ£‰cÀÒj 7Š0’Ò¸²– :$4£ˆ!h«·jº»©(TÔaªßn­êó;t¹´”–Yh´Q©¨Ìå5  ©ÂÂ1ÂÌS1ׇlà)¦ "'LÅ(Há 1BÆ ’™,#0ÀBÈIƒ!ˆHkÚ"kh:4ª£€ ˆ”L¨ÒŠ "€À!Z"i!4 b˜fF°Á²UÈи.— À\Ì$R„™i&²×¦é¨åÕ2Ô¯u¥ÚW n•®L·vUÊŠË)KMI´£il¤ØVnβí+t£LÒMªi˜Ñ4ÅM*©k{¶õš¼Õ‹…‚%!ÌØ¦Pº$éÇͽ·Ë°Æ°%"Rb™I5€™/2º… R6SùëâlõUßï5Ç#€õ ÈÉI D°e¥e©zë[¡ìXŒ.Ö$¡f]·M"VÜ·iwA‰”(¹ØL)F—Á¤ 3(Ë5u6[”ë+dU,·b\*)!V™X`Åk˜i)J©dÒÖ–4Ö¢e“Õxð¿„…!Ù<ƒ¡††Ä Á …Á§S˜ ‰`SÐØi],H‹ K%$®Bl±&RCp‰ÿaãÇ5jÖ.Á JŠ/Ï¡©X$¨TÝ(Ô’ï"D]2Zj"©’L!/³€L°³`§tIUÄ(£jCŠIÂŽ9b»w8]ÊåÍ.éÜQœƒ#"äƒ1$„AHBfAŽÒ3ºæÝÑtsD&MÝu©Dp$C!)ªYaL«$˜’*E !p¡hÚ?`ÕV’QYHÁ€X  rÅ„¦†ªEDÀHVF*@1%€•Åe D”`¡7#T<]«ù~šÑûzhëÔ2NÁ,°˜H8–µI­Ø)1½fF¦ß1’€HØààÄ:$L™”£†SJLA€Á€‡ÒGÙ ˆÊX!€Ì1‘aA#† ˆÔD ¤áff °HÈ,¬ÌPÒ°Œ§”„0€’eX ,†q!½Qõe^hTE/©D’JH"j©N!4:%À@4#°qu²¶–ÎÝóÝbv¥Ôh©MvÓnXU6etÚí5\Ò“6®««vHµ|–^ìšóFVíÕº– 4ë5ÖdÉ;XÄÂPÂY‘”LÁ ’&‡ p3aÌsÈ1QS!1 J$–d“ÜüýÝß±ü]NÕƒ¶,Ba€Œ†° ,fðS LH*¤Š%€D fYC,Söå/åÿ(Ëýe!ý¸l— ­ÿ±™ÿ_þÞÓ¼›]¯®ÎRÛW$MÉr…²ž¯ ÚÍäòú¤ó­‰XtNÇwR^LÛŸõnêqVȲûÒmõÿoMØ+Øt—¼á ®jCüÝ%’;)îÃtíÝ5Ï?â%zï%½á9 yÍîòMxô씹7²ZWy(ÿËþúyþ_ö—ù»ÿ7{ÿ«ÿ;¿?³ßyEÿzÿÔ³)æ¯K<0^p#«—ƒÿ©ûÕ®Š+àcßY§CRûÑà)ÅÂÇ(UÃK"ä,2ŸkûçÞ¥5–o2w¯R½Âü'J×;Ow«†§~{ð["¿7{IŠ>Cñ(UæÒ#xbÏdcK–E^ñ1’FÔ‚…­YM¼Q %u(lx£ê’à@¹írWÝ¥Ïi´¾é·BLáA=;îcaåzú¸¦ÀÅš}Ÿ½ákÖ¼ ]+ÏW±3N|0 0ya-ï7i*Øø*ú<.’V‘Bj]y®;¦Óœ{Ú 58ž)s¿ Ç›2m3Àåp³Kï[?xºYjuóÆbíW`+bžx&V; ÐëéŽöwZâÄJ y\Ü6v{M’ìá½ÐÄ »št°ñü@ßÓø~ÿÛ÷¸?ŸÄvjˆ*¨"(ýC¼úÏËZ Uþ¢…èfaáÃNS óÜ’N@Àö’f'\·zo¤ë´yÐÑ÷>}Þü}µü¿¢?÷?å5NŸÌ«ú¿_ê×|Koï4Ü4=å¢?ž¥[Í|/Tn£¤Þ¬Ó<„=293MDÑØsM°xFw¢4ß!`r‡º¹ŽÈ9â9…wÞ“ááq >¦™<…;7£Åø¬ÞBáEE38t§âá/* Ä>\ ò”ášy›0y·È(ŠJ}1‚ƒí,ÁiBÂøÒüû~`€ñpÖ!¨YoFÄyîz’ÜÖ«¤•µ';¥ª ôpÈ2Á8’g$Û¯1RŠn¦¤¦$DŸß3«^1öªp³?½ê¥ë¡nKEp`íÙΠ³ðêÜ¡©{ˆF˜xϸÏÁ,r¤¦¦‹#ËÕÞ;mŠÓæ.Ø8×ÕõfÍ NfûRñA%Ž´É”ýa ϶<ˆçµ’ÍpK}ƒ§NL»M“}P¥èÞ]$ܹ¡ Žâ³?Bµ½Ë’ƒù|ÓržÃ'ö¤æJ—»hH¶nñ=lšŒÂƒŒ%¨N^Ý–(fè”óÀ 7-Gñ8Ô’Šš±´Zч)Œ‰Qù2ñØKýÔA¥RÎÊäCE°)"ª¨ùíI&yGÖîþ/6áØÑDN—Ÿ¼É:nV‚e¸†z:ާWª¡K à"¢´ðšn!§hùHDa8ÐQñ'•c /Ê“¤fÌ*Ø–tìý"œ7¯¾“¢k`2b ªv •@ö2#û˜lŠûÇžnòŽú\‚Áˆ%§¤3¡dâÁyŒ¼=ÅÍÌ!¹ò|Õ¼—|B4¨ó¸y¾wÞwÞµÆõ30Ù™¿¼Ì€nAרd>Ü¢ ?ÀŽçaîïᾞÈþòI§ìá>Ó,b·þ¨îŸÎ“€þÒ'H§äÊIã?soGõ÷~Îû?ÌÿSùœG¹‹÷1±-±é†ZÂæzdÅøÿv!dîÿúÄùCäôI$r±´©$é?¹FõžY˪«—wežÖ'ÕñúBDéð|]»30èÿ(VgÑ¿Ö?)2û±=àvÄJúÚÿ,F'…úVÈ®ÃÛv`fe8Y†‹jmrBSi°G# ¿N W†, )þËGíøË»NÒ_ÆÍÂNçxîøuwsÿ&›¾Ò_«ÿyŸÕù?çò'Â*¬øÙ>J²É-u,˜-[Ê*šÿVˈa‰ˆ)ÏIM™BRä9"ŽCÑI4†µôÒ¦àà $¦¿‘A!ÍÕƒ£4Nã‚f!˜ÖQUR ¡é{ý+¯Ýó1‘4Q@F-ûOŸâxѵÔÿ[:ÿÉÓŒ?iñúuzx~^›öÔø6´Û%F’ˆ¤5‰6(µcmF¢ÆÉbKc-i›XÖ±D©dKJ úI‡Q#´ºÌ;¬(‡Ö TÌåòŸíìG»t8o„ŽÐó{<>o*ãLÒ¿¯ }9?1pîÑÐJ~D` ¥•ûû×à8?X8öÄBy‡æï¼Ä¥%&Bf*™ª&*0‰üºhíø£éåñŒr=sÃhÇ­ÄÅY9yÆcx}Éÿ„W«¿ÞW—B¦rwûOã>¯Šxs!#ÊPâJ”~äÁ:ž† žµ T«þ(ˆÚaÉ&­./ð;~_/Ò¸Cñû¹}VYìùó“n½îó¤>ÑõW\ÈûÌO«Ñî<§qØàé=Nœß.K:0Ùf˜ÇfL¾yv1\4Ͻð’Aõn“·ßÔó~Aô9ñɉ³F‰€è¥C5TD5ÎK61Në£"»®0Ť™3%$É›1AEdŒC2M#“Q11´[-ELU+-7“h®ßº.ðé:ÂW^‰ìnùqîñŽý ‡+&&3I³´ƒGô²DÕ†ßÙc(ùÄÝëî‹W“sÃê!àj„Š™6ðáý·æÿ>¿Kô·Ñ+!¿Âºc9Øë(hÁ‚c”àPøŽ{ñ49ÑÄúž¯ÜÇú•R“$Íd’H“,‚H˜²,b’ "IÉ™2F)d“‘2hd,Á"dØ ’K"R)„ˆÙ’S(Pb”``&R’d‘”˜L!($A2)Ñ2‘"Hƒ„™“‘! Ê !š0I),II#(‘ ±Œ„fY›˜“L4e# LBP¤ “fI1Ea‰–C3 0&C&Œ2™ 0@¤Ã $˜ˆ¡€ˆ“%0ÄY0–e2@I‚ÄÄf$ˆFe”%’2DIŒ¨Q„™Ñ‘ ˆ”’h À’%6$ÄÄ"‘“3E“™L5H )ƒJI3i“A4ÂI¦0bEABL„ŒÍ„ÄS,‰DP‚h ’`ÉJ%$"„D‚TFc$FA„‘F±¢±ŠÁ’H6(ÑI²EE&¦ÖÖ*R‰V FFX d•P¥HFFF!H)…”Kj[Zš•3eMm-¥ Ò­  É"H0"Â# Ê#‹B%*H#+F©­¦Ú“U²)k5*’(¥! ¤#%M+TZͦÚ0™¶¶$-2Œ# ËÊ€  "B„#(“ †`†¶²Z–©ª£h1´Û3e¶–¢ÖlÛFš©ªUMJÖ55”B%(0ÊH*¤ © @))*È„H#3,Ò”¨°Œ°«)((SDH(ó}«{"‚’Æ£Pbª5€;Á,µ¦ÑæÒz‹¥ü_oÌòÎc «?Je·=&›× ÝOY <æ‘8SÉí:eûðâtÁê¯#/ÇAô¢¿^ì?ìy³Ûñ=ŸoÙÿvÇœøGÀû>?ÚÝýæ$~öH2ã%"é¨&„ƒïD¡£ÜÒvkëÝuv„¢îèdç Çn>.½ï{F¢JÓÓ ÄÃ…‘”góÁ²4j‘†d8MâfO®§Æ~2~#ogæáj,‡¢É„OѳÍ<§cæy˜Jˆhìë1ŸNíÉ;É7°²44VF@Tâ@aŽ ?Șãö<,ÄÝæÃ÷Á9oBE¾,‹‚M"}$T™BÈJǹŒ@õžÔIú¼v÷B|?xýßåVÃÝãàž§n¯Ÿ£àž©èžpõ÷Äœ{{ÿ a_Ì’OÇŒ}Ù†*Ùn,¡±ŠA$ÿ§ÚõP‹îƒ£÷“.ü€Ñpg¹Ø7㣃ò{MJgL8OyÙËšãh~ÈN¿Í@ê!¿º«ìÄ~(‹ÖTG»o‹îhúy:>¿u"<¤ÃÑŽˆõ!Þu–ž1"†v8yvnûn~ÒAqïÁœêzmªŠ)ˆ’ûx?±å©òg= &$t—Ùë©!ÒBwrùÍ™Jý~WÈ×äëŸ{ã²:³ÇÒ=u,¾SÒOLpÉ\1‹mÞ»!^jö®îY*c/çu®hÿeZá\·*|ؾœ·w´÷_iæ^î TkÊßÁ[z(·áöò‘~­Ôdšæ¾KíOâ7@‡0‡Núßð²pçú¼¥+Îú÷ÙwÏîàx'Ô-`:DCÂxÌî¤LÎ`’…ô‘8MÓ¨1œk³<¾¨Û©×‡Œ›è‡×ƲlEËNbPSƒÊrÌ'#rc–^xvfþ¹áyá²Ý%˜tÝ›oW"8W…&uX9¤ëÒ›—›¼›)¦¶ÍŒ&¤H$^óš;26õîÞï[8Sdë©“¯VÌ ÉÜcÁ5ë2N—F$w{Hñ˜‘':–ô…BbBCˆs˸ºG#Êê‹(Îînί@s ìiCÐ\ã ©Šœ©±Ò°8ŠÔÌ’… 7̇ó×Ù¶YŸ(‰å"]˜Œ³$ÄÓó<ØiXŒM¤Ïé³çdiÑ|Ø|§:}·ž“ÏÖå©-¿G—«–{g’²Ž$ê½Ñþ%ŸX&£ I)P¬ËYžôNšøû9Ìuhs:GxyËÎz;žøí™ÚM;ÏŒ£Nñð6”rÊFAè¯ÏN¤n7í´øUøé™jÌb1VfkËØáEë's¿Èô:þAæD*¶²Z1RV#I¶¦jE܇/e]à1Íôx7‰G³#ß/®°à‘ɘÉó2ÿ'ƒ®þ'_*¾ÌŸ±ìyù ”¥ $©‚¤KEX­´¥-oï¶9ú=MpQL‹w!^ÈQÕ©%€úb<£)‰8ú÷/ô*eÖ’!'=ÿuû¾üHøÿ÷ŸG[ÿyÿüÿäÿòŸúD7ûcôý|ÿC±à[sè¦óœÔÆ\Àw¨NÍtEd×ÕÒ¾áŠÐÞv©Q@Ÿ ìdQ”jë¯6ç­1fL$h1\I¼9gÜ<¨ |Ìxír9÷¶ûC–#çÓ÷ü$@-ï_w·C LâÔ“Aĺ‘öšÄê©ÏÅ;Ó\N)aºã §òOWP rÚ†^cyÍÇÅ`O@Ä~Jô›znº-ÖLÎЛpÅ0¢ R¯ R"^µeÂ8úZüàáïL/W›5V“ŽhïfÎ`z+ÛåIšC¥~™Ç{UŒ"…sZbc}´¥Nê·Ú×B[]`i`ÅUÚ÷¨m š(Q3ƒ}ÅÑ ËïZ«ª±@¼¯zùvPÈXL}K\@éò½3§ˆPv#QDÃõZÏ~˜É³k÷”Ó}á w Ußi{Öwœù¾OÛÎÏHEWÙ˜5žB®ÆXØÁCƹñß¶gNþÿKùÿ‰U?½•uƒ•D•P|ÙL¦Ï\Æ¥‡GóR>ሡ=þŸ¥¿.qðø|5ϾüXõÞü¸íò쯖ý¼Gžg58nïËÍ=‚Ù7Φ΃€’3DÚP /&f%lf‚yVª÷¦‘ê6ð”©ÅŒ SÊùHÜKÏ”DÄBT8‰„V™Iï9ÉÊÒÚɈáéÙØ7(Òà«rˆŒ^NK—B÷O›89Kã-–ÊßÝj*°ÊeʪøÏæ"øYCˆýƨEqÐØÌruxyQéW™TVEfg2>Ý–sgă./"9‘ÈÖe†3l‰s@ë1”œòù”ÈŠ œŽez–Œ&v”úïÐòØPÕ'UÛqz~$î‹4DÉb\åÛÓÑt+dtÏc–!ÚÙ¤‘“ù ËÔŒ[ö5½ˆ[™aÒ >'(ÂH/мS^S[R%q:¡4™§@ð1nަÕyÌëÉ(7äösx¢“ Ù# YDæ±µ›ÃtîrÁn¯ .¢¤öTh°ð~òAü(È7/Ûö?VýRÞˆ3ߪSùÈáwô›Ñ¿Œâ4#õ‰Ü‹;ÆÉ/Kõ÷ê˜2e’½±5?ªž>ñÔi &$$•¿¡þù2ݧrÔäºÂG.„®7Þç¶·|q¯Çñíô5Ož5¢«YFF}~Ÿ‹®?0R¦÷ÿAÈ$­Ð°YI7²Ñ¬»–ÿMMJx.߯s –úùÿåöÚD¹§·#‚ ¶¾Ö²ñ"*I%L#éÅKQ41`Žàb™ƒ—ÄM õ ááè´JªEÊYâT@‰¢ÕH< –œÊ.eTy3ÛÑ9™^h\ÞÐd·Ž¸½rÒrÁݕޓÍí¥F”SÒ_Uƒæ"Ò$’ ²ýDœÝÑhæl<8d׉CÚCrzãÜ9h‰¢vÃq*KXǦ4¥)G0Ë\0D$Œ?,-¶³Õ¥hÅ  „`.AS× s’BþnߓܼӔï×¼ßG:)Ýv–úJ(˜ìÈK=˜I«p0 pmãÈ%àfI"‘X˜Ýú?^Vy;®:"ü'3[Âxžô AÑÒle:š'”6çw 9*N\EFÍð6Æ..·„妖p²òkÆ>mã^ù±˜ZÏ×_ ÷útÖŸO®1¿)Õµx©áXÇžg¦¶Æ$XÅØ±ä&±ËÊlÞhâEd"é"**®Èˆ ŽVI’Ly-6Þo7vDSPŽ 1YbÄyâŽì«¬[$»¦¹d^8M’Ì)bñ"6’cEÅÈ“$ˆÚBŽÂrÒŒùÜßúù×››‘{·½Ò¬’DvK Ý,“\`Â3’ºŠ²Mä‰R²ìÝ5£°£©#Q’EHÎkgô›a¯$¶’2ERbÄ®DpØAÖHu¬q¶æ±‹ÂòV±TE¬y»uDÔ‰$œ`FÙrÙIäýÙ`¬c?ÂlQñàÒH‚­HÕÉåÛ+7—]vN¦4cÉ$•õÞõ±’œînDGÇ6{ÝkR‘²ÒÌŠ®I&°ÑŠ:ĉÈÅ*@q+=Y»•¥™EQE‘Rµž{ºˆ‡ÉÛ5a#vUWEMì7dYK•L Èq¸9f«ÇG&;«¥†Ó(ñ5ªrÚG—"7 VêÂ*bÙQµåÑL˜Ø'ww\'usïÜT# ßîš‹ž¤Q^÷.SÀp&Ö–¥ ± µM²¨Ù°”Ôª«²®¥~:í£Œp˜dØ, ‘(DÒ„Œ¦ÕÌ`$„%$†Œp•%…" ‘•–("B5Œ ’Ë,»ƒ$e„fBF H a¥ÌDÒ2EÅt @‡P“( $&M0˜ƒ0…+ KI@ñÁZFR‹l­«2³iK2¬ÙrPÁ‰H$d "I`h¢"… U’SF+ˆÈJÄ )(c bCrb !Î(˜ HH“$Œ²Â–Äœ D`´‹d …H(ˆ(w€L%kmFÄ% §ห4…¨ÀF%dd‘‚Q$˜bT‘2ÂN`tJI3L­îᶦoÏ]¥•2‚0†±ÂI J@…$È P‘‚VbV@% [2”‹k›oŠôDgD Œ–RA Ze€(€B':Mj_o±÷ÙÿÖ¦={ºóÑLIj)××ñ£á.ß]ï×?'ãé×§<óÇÓï‘+þ„… ’ñ‘Xªð„1EÀÐ{?Ì ½¦ÆkàH@ Ì!¡lÀ4©xÌ $ØIWºb7¾üÀ?˜À L]ÞB¿¿‹ÉÚðÊAaô6¹¯úÆ?¼_yÃp¤Õr©²eÅåúž°Õ!­Ø5[SKÄYÖ±wti5³šýNíõW‚Ç£Àe§¼âí˜H\f!Xrr&‚]¥l¦D^dDã7dP VÄÔ­E&b2 äµVB¡ÕöÛ¶JøÉ5‚«§æŠ…òKP0b¨ZIŸ%ö0KH×ÔˆÞN‘œð™’Ý;º ÍVë.ev¡Òœ‘U q”¡ºC˜˜ ö!Œ± ’YòË /¬\ߟ ) Å£ÒìŸgG~¢¯¾Ù¿¨*¥ÿ5Ãè|ùâV(óR¯7šC‹®'Þ)²ûö½*òf½ä}¦ L\ÇÒß/7‹Åötú«SâBFÕï§áû`z±p] ÿø6]u+Û¯‹åñùó}|W¼ ÄñIþY»ëß±ú‚`gýO 3Ÿ•EÑIü¯!Ö6LMA;²bYƒ×?s|ôë%©ƒµÎ•¼çvíæLNUŽ…uÉØ¹‡úôTêv G‘뺪Ô9dÑ ôýÐÏCõ²Ý¦°ü¯m0ýS†Zœeœ~­÷“µáᇟ,3{_»œ¹±4|?×-WîI!Âã…õ Ž @(E$8˜9,%qg;¸~‰½ÆIÔ qòÃÛ<Ðí–hÙÏÉÞºÞ6ØU}¹Ãß/žp./·™cçaÝÎXrÒ-¾öL^¬’q4ÕJVA;ä¾û”Ý\5"HÄâéŠ2åaæ!ˆ)Ç’¡ƒyÈÞkž·Â9ÞÕÏ&ïœâpN}J )2çQ*ŒÂº/¢Õ0Œ¸%ŒLET‡6mË”ì¬ÆŸ\™y†ž^cŸèg"R4ßQ¼‡&·B5B]†„¦8BΉš‹ød"ö:¹(ÏB´fR“!0žÀ»Žúsu‡ü‘áK™ÜÂÙ¹éáÓ S•ìY²¼UµS™g“¯ ú·cp™þS¡d{Z'l“1=ôÃ.”a®' Ž{—Ü76|yãʳÑn›“ŸpCQj¤¸9r*°f},%_"™}£¨xë±tû® rrìSªÂ¾^„<Ñ„ÁÞI“»ä”ötpI:I¯@çZä’ÿRóJŒƒ#¤‡lyFIÙðjeI´ËÜèÑe”¶,ˆì¤ã‰«€çÅ{æN­5´˜ 1;ä¹Ð`:™–Žy4õ§M;OO%lÞ6~õ™cÎe¦úÁš´Îs™"þ¿¯ñùßôÏôãÓøº×óø¿^œí:ç\oÞïá—ƒEÿDÜBÈÚÕȨÏ=i+. 6Zž ƒ ×µ Ÿý1Ü¢aVRHØI»7†¢#ÕG¼#^dcYÏ0ýqqë9ñð»Ä˜@0<-þÏïošfÁÕüÍ?‹ô~ ø8ûw8?#ùëà‘5±+‹ëü3ýÙ„=å’Ûqq³ ä–žŽ‘AõîÿJ"Hl;=ñ=½NÿsrpJ/ç¹Ó:ÍI;¼™¢’¦¨`ª‰ª" ˜ 4^çzCž¯Ü³ÎjÚÌ«¶ØÏêßh:¹b3ÕØìËØýÕQ_J»œúEù's©íÉûΧ“ÓØŒ N"°0Å}àC%4—‰GZÖ‡Á©öo!»1Uˆ[ ª«LQq8áëÏ‚‡ž¤OöÉdIê=ìr9Gsáý 2ŸÈ‡Dû|<4ÂTG’í-X¶Yë'‡öuž³<&^IÑÐrÖý…ÿ·p5×}EÚøÑ vpªŽøv: ý¼?EÎÒAÙ|T¥ÿ3ëúJiÃ;Ÿ?n|ùËÄò–i%ìÝØ'¡ñ OüÕ á¨°Ÿv¯.ØñòC4›‰p‚„µf•ê´Ú®ÝxÖqÅ;ÈçÄüîܲ a ൹îGŠŸ”™J© ´›Ñ“×h] X=òpávúÓºšVHm—ke¼º]¼cÎQÊâr’ØÜµÎ˺P¶I(7!YEçyÙÆI|w]Æ´½² 2Õ+Lj'¤ÜîÊCÓèºzõ‹ƒéxJáHœuÇHDå‡F0䦦‰q±ôžs%Ï$ÒNñ.ì!'ßWÓÌðó».ÒŠC”âQO‰¶ÑAÞeî’99Gi|O8I r%Ï^o{ÊyM}˜|V“’@ã±Ó7%7z±¨ªÒëåU4\iJ xQÇŽ„‹Ë׎;le0{Ôº9Ä“ÌPhSGHGª¼ ès²yíáA츼¢ç¶"`>CÉ ÷uŽ4ÒM·Z‘„ªïfŸ¿·ÓóþGÇãÂ/ñ¶AÔ´ÁCÔøËüÿйZö@åFã$ò\“`õ{TX4᥹hšù¥»uq(ÃN¥ }qyèEn?CÚŽY M‹'Õi}ÜçËq[(¡QÎù¾›%Ètg†wÂ0ÁЍáÓ¿!ÔJ‹”Ë`5Ò^ÖãÇUXwlz±R/åÞ&ž=¿y&žxÛE¼ëÍLý[ž/XÁŸ©ž®Ü-^÷ƒ£ËK aÅæ˜FÄG¶ðN?36¿+š*\×^h Sæ˜Wž¸ýèaD p>. ½-½Np!:¹9÷Lb¸­”°ke*(/|¥–]Q·óòÅÜu *4y2p)r].*wÍ'“,f°~´%†ßhA[o"˜Œ€KÞA„Þ”9·Å0çCS T•®VlÂE.m>³Îœ™Tæ+\Yø“¶vá9ðáÐ[k‡+©ÄÁŠè V9ÂûzÀïă^»!¶ãªƒŽ-èu²'°¦ì*ª/Ð!˜^Eß1ûÆøwH©B,p%âk*³êR%&Ô>CŽ%ñ!¿µÛÝYêau3R±êôèæ¹W=¿ò'…a73Ì;FŒ¹N]<—kçE÷üPµÈ{š à*¿bÖŠÒóE ]°±ùP:JêCÄ ‚Vmµnó¾ºâŸEeŽã…ÕôLÀê4Ù“øHxD›E ÊDÄDOÜÆç¨›¢Ä„…ïcØRÀàÞz‘©S§Áä¹ UúD|Òµ+j™ŒÚ™ãS¦!¾ƒf-U²©!õn?iT©ñ¹„o†_LÁ‘ÐS*ÚVµÜfBVÐ{:löd©È†åĈ„EË´ÌŒfYfŽ¥„‡8&ˆ"šü¡î…ˆþuŸp¾ü4 Ó•wu¬—f²ŠOx|ªèqì™[Þ1ÌÌA½uRN‚]¥Á.ø;AŽ¢5îä”ʽGOX3ƒ”P.1E(rD¦xE¬« Ú$Ôœ^fb"ô2 ]n¯”„JÄs•jý/ sÛt½“‚Þ§Uâ õñÚWŽ$¦ùaxHLŒE4×yzšÈªy}æ!Á« š!ù£¤Mž\^ðp2H×NJÕ¿‘´üVQ)ñ/“ÍnŠE {Ï[òxWÝk6†rÚ\éš“ì¤ÄÆXItBo;Q•LÔƒŒñüdˆeälÎçˆxÝ Ø ‘ŒŸFvâ. ¨•‘P”€ÉÙ ÐGhQ5u WS„àuhQHì¤DGÔ62iåFÕL®äòfºb˜§çxñìC{r¥+”Ý’‚dªö¼µïJK,š)¨ßxN¡ŽHÎUGTÏy½ç…C0Ú3D32^Á¥_<ét³OAÓ­k¡gÎÔ@"¦Ùr¸Såú_“((bü¸À¦Y²“CÇ£Œ¦÷@!”/0›ÍžŒñ⫳qƒÎæs~„·†œ¹¥Ä:”O#jÙ¨¢z®@ÆJñÔTÕ<‡FxLB0fF5r¦´å›ÐÖK^„K321zµaa !XU]ô¢_„8*ƒÄgBFgìm{à`‡ ?šÚü€y^}!}+Ésô_fò îÃ"$ ‹ŒáJ¥]mÂF Š“vDSCO®»Šðªøñlí‹l-}eà—0÷W3z6mæÒÛ&âhÅ#XuhsÇÞ¥%O%Ux nÀ_Ö =~òâ·¼9–[ Ày@^ñ²ùª¦Zxá0©Ëâë}ד4ö›±s›RxÊß«:‰•›˜%‹’c1ˆš#£;½ÜË»‡A)÷LÌUO]Õæ|ˆÌ;Û¹(®vs·×IÂ]Š"æÖ¤ L…ŸrŠóœo !%Sâ9ÖÎjmH'Zrµh-먌å«â¼ão;§>Hò³9ó¹IyQxYÍK¼& ¤ËÐÊ8Eƒsd©¤ˆlgÆéÄÅ—§ä®ñç¥Ü*ÔÚ6½›4I šR¢ªQN÷*™!sX&¯9*×½…ðC•Kµr „¬Šû.µùvô¢(Î8ËHƒH´‘Ø•æ[ôÇÏms zÂïOªÎƒÐú_2©kÈÖÃçÊ™—Í¢¨ W"ctÞÙ‘˜\DÒ*âqD$¿Z0Ù­={_…}ó ŽJÅÐõt÷Ç•õÉgìÈÅ?^Å‘>°%¿B qËÁáô%yŒÎ ¸›®f¦ê:é‹Bom3HÜRã@¢›¬nÐÄü£Òþ¯H82¢GF%ÓÌ-VøPxAìÎÇ<k0j……fWèsÛ‹™÷¦DŠ¡Áœx•FO]Ô°É©-nãd•ˆ¼À껕Š‹“]¢zî‘.£fºlRˆVy†×ܦ™¿Ëæè5ÑÜ^µ¶Ê#J0‘:#Š ª8ÅÌ¥é¹C# GÞ…Vƒ†0ûj ЩªÆ  †Z—ÒÐ.Å>}Voß`¨–LkõÎlƒ®¢?Œ=ò;ëGßNÿ1BŸžwySCå—õéo Öå7–SÀΖg®v­á/i¬iªáa“‘¨c·©vZ@‡SSJ¿:áÁ½§Iо±vOžã‰/F¢øÊQL•ßʦDf½Tö/«uNG:y’–ys NøÀ`=XŸàdX0#˜ŸØ¯ù¨TS+ŽÏú%¨‰],XäXŒÀ~ôO$-an(Çèar5±2Y¥6äšÄLÕ÷4d²s©*Ìѵ3BÍs\çHå_KÕönQrŒkKšáª¹µ|XózQ’¡Ì´.ˆ^-¡$Bnpj5‚¤Âm‚´m_‹¦¬U)W+Í›o‹•¯ŠâTËP®NKLY nP†NCAÅ«‰ ‘9“’€U)ɉU\Ô0ŠFÌÙ8H¦! Ì+PóƒÏ€dޤ8” AI[1ÔÒ¦fÌL$Ü Ä•¹¡päM¤¼œ&q¥0U9FAL&áá…”•*Ë ÿAù+‚îÄÄ9,ˆ©±Ès131¢%É2,ÉCh}ÜÇ8,ÑÐþTQ“NJG!8ãÉŽƒëÉwàb`ØŠ)Ö Pƒ]€ÌÌ9²'cùnL¥›lg-¤ÏÃ2j}¯.½»ta¢ÂF£DFØÛoÛÝ´Ú&´Ó»šY„Ù|]Mø¾óÛËbÅ”KJÕ$Aá€È%TÚfJk6<åYY9vVxÉBŸê¤S!-˜7µŠ“‡Þ[f156÷Ã%ȵQù„9NR ó h78‚5l§ÉA«šCoD‚¤×È„N*šj p¾õú÷ëßçÏxÏè~dý½Gæ3OSù\P)rϯh·À\0`?˜MzÇ~}vâí+9ÇÙõkïUÌÍp³nð%ÇÝLÆtzt—Ñ“—¾\u¼íÆSåß‹?|òüîωß=BtnŸpyô=†ý‡Øü®³žþý‰‰÷ßÛ»üŸ6â¾íËö?õ`0#ãÓó&ïù1©ØøEI¿^߯«áŽ.½Þý” £ôIÛ÷KÅQY+þÞ¡ŒwKSûA…E?ÀŒâ‡í;5@¨®ï7Ýôë ¢äÖ²ô|&ªš}K£Î³)޲òX‡¦m pdݯqøgô€üø!ðªà…p„FìÌDobz#ð°ÇæoÂ_ĺ£™.°2Á˜³30ë¯83¼ÍW®úïÏxöyêPf³×´+ó«TˆÍ<¸¯!šwݾê"“7î3Ä>÷‹‘ð<³c™¹B©¨‘šÒ‚¡qÚùTÕ"¥MÉÜñ0ÌýÞcb1,»Dò"ªüó‘ÑxÃq%T°ÞQP„KNMQMìѧfŠ$eü±œ–ÖÜMo6õLʽ&ŒÆTñ–‘Ipɉ¡—!&D*ŠÙX¢{ ­íHÄ­-i˜ÎÙWÏÇÊË&X…LF˦n•$¤Êéc<ÝDî·—¿çR÷QÁÓaù}b ¥ñ¾› ~ÁÀZº ‹?Ìüüãúû€Ÿîºüzø³Mwöú»ÏÊ"÷¥÷aÞ‡^½Aúo8óÞw¾{ê{’Qú§ŒEÔ’GÒÄú˜+êcäg»tîN*¡B…ŒX¸4;7j+t²îyK<ÝDéß Ó©íÝÆk€è7]j2s½gÊÍOàø@MøßœÖr—¾>ÛãŽ33kYž½5Ùî~ãêôýŽ£È¬ÀÍ–ÍÑʘúÍŒH2²Ëf"Jü?{¾ÅÒ‹™tà`8w4Rv7Á3ßè_6õÌ2yÓGðÃ#Y¹ÔгÓ2 #zÑ¥0ÙlÑ…I¤´«+\®2rY„r¥÷®W1LÔkÄyišæDŽDär F8¸ªq\-‘¼™ªàÉ9#n˜Ïd9ÅF\Jdñ)O$r1l¢!PÖ8¤Lç"Þ@–F¹Äã2Lª˜ÙšáŽTËÊÜã˜kdyÏß?Ö/(f¹s×¢ ámMân4ëm£nóú¤ÀnÅõÌ x;F•ÐÌÛ.›glUÕÆq&„ãËlpèá¦HoX À;6«½]¸~®7¥bŽ&jZ®¯×g³¸˜›û±Nç$ku*eÚù"4œ:òÎ}¼™™=1øÝ;š‚QBàÙ„œ,=Óˆ¦˜0¶â%”¤ä¯,°X¨ætCîmÒÂl}¼ìõ°Ã¾¦å݇©œZ–]¾ÎFÐÚô%°ówÁy:†.]ûš¹ÃûïÉÝú}?}¿+n[~ÿÑûuã§×9ßôý±¼úÁÃóüL\ç»Q4ßKãX—O¸ñ˜Ëy‘qS«}T¼èdÃÂ!O‹ÍÕAKWQ?OÙz:rcÞGó1{Íí×…†¶].ê3 ½@ÅC"½·ëÓkš}o±è}?|’6bõ±Ñ§Z`ˆ8#fˆ‹?‘÷0Íä~=4'I¬<«þãI°Ð™vñ“"$ÙBÙ2BÝ:9ÀÒ0Ä ãࣉ£Ó®Ë3˾$4gW¡]Ì8v™¾è KÝzM°RÃe‚’0ÿ8“¬[o-M”e4Ôi¤º­j(á2[ –6¶1[F¦#÷™xo:MâÄËö‰†Ò6x&ø‰ë‡3¤:\™à×EiæRyÒ™B6„Äz&z±“ ÂÅÉ" PXI‘Ö1(ø¾;Õ¤Ú¥5ÁQm )¬ö37€{>@¯/æÇY#/I¤ç$ÙmQj¬™8Æ`´„ þZ4¨Ëu0\CfÂOÀëçñ½ó|DQ©•”ÐVÕùgûhí®kð·ÏuvM;·MH͑٠"ë»Rî¿ÊÛÔ4j6BfR¼îvŠ$ 8H…Âa/$’lÐáÈM²Q6°.áÅìJ™o4í$À™clGÑw6°‘ïæ¸õ~Ë~5¶é¦&‰¢JQ[%U·IÔb21ÕÃ÷Põ†ªÇçF6|Œùf'˜¨>’T@yÂdÆ Ìó²c‚8ºŸØHÆO׸fìÿ=‚’9R? ¼T™úòS…'«4A!gÈüƒ¼Ìx“DSå$‚pÞaiyúíz8ó—"]„&LõBF–ZT¯.¾iκ%´‚"¼sy§7³šuåï{ÉÙ;:s’ØöÎ ¦åYj&óxqÈQ¦éÃvNU-ÎÒo%irsœº$oýÉMI1©ä¼MÍML8/©ã†\"{Þͬ²)ïvÇÚ¾ºÖNC‘Dä¯YÙש;•¼ŒE{²›îªœYwM¤8ÂÉII>ç›ß(¾póüoûÿØ¿ãþ†+þäEþHÿæÅàòkþÏò`þïâw%žbDAiÿ`.&ÈÇ—p¥Ä§¼´÷%~ô¿s'Þnk˜SÑ(F©è9sUÓ{;Œ½·cn6ÞR4k0ñ€‚é 3ø~wœ¬ÁµÌ‘k´l1=Ðc²+²K6Œð#îw#—I!³ñÊO‰òÌ$i¬­GÛç£lNX¤[sf„íÌ%§ã5uæ¯S·`7¦Ü´M{Éë:ÃØXL¢]§DCN™9ëôA›³çN¬Ö£xæ»Êèòþ½Ï‰,7·&ñâó(2‘€Û‰ªY¥‰U™kM‘É`JÁÇdh\À¼8„n'¡ÖYÑTF>ÎÖÈ)Ÿ@¾žÙ —¬Çªqäè˜ t9ý²þr¾÷zBýhòU`(ý™;CY4™WŠU;0d¡—V([ 5W„mW¶Ú-ê¬ˆŽ‘ºp©¸a„LA3°® “7iïZÚ«Ï´°WCP€¦ÎØÎ̞߫ZM¼/{&h[õý¿[ý¿v±rÎLÛá²-~½xmwšøÉ±"6ª H¨xT $A:Ê4êðŠ’‹ÐQÉP7*8@°Ê$Â&@ c/ä&ÒFˆà ‹Ì!‹Ä€æ` ’«¥BPY!H8Å{Â!äG—n°šÅô‚™èÒâÔèÒ ¦yo–˜i·ßµM.[øáÒhå&Âkƒ’N™™9“fƦŸ×áïçéöùü4¯Á nÿÅ?•—àGô'Q±/¿Ñ ˆžšÊèJ¼òÌÒy‹æ£±þƒuâjƒ03¤ë+éçV‚//F+°ˆS=1ª¦ýÍÎT”ÂéG޵頊³ZT‹»²D¨d†÷…“ÞNLNq#i6м-Ú«è¨êq C¸C?‰ ùœ £zP]8-ÀÈT\ÐïÈlR ˈ=,íðUF¨¤#¦%*§Åh…m@äEå%¯Cí½Q£ÛUdYAŽå álï›­P¢&_–ñ!Ù¸±“\¸$Ô`Š-ÌFh£ $·3 –à‘wŒÆèwPO¤ Èx‚¹ðVFGÔÇÐ6µËãâ®óû<äy×>9².a®~K˜Ãp+é™u¬äVÃæ3јBóAßeV5í׌;ÇÔjŸ:"º3Î-ûW~ê»ñY”ŒqP¼f¡Ñ›‰?J8É{“Ý&ÁDžŠEŽ’/F„ªx²RjnsZod#ÐFìrž8{¿?’£i¼ÅäòpqTˆõH/QØ /”œK¨Ú¤ÃH „„5ôˆ«•cOÃ3oÙû¨¤B4";ò|¾ÇóR Z=ñJ+J´KH )¶S¿[סüë70ëƒÂR3Õ‡w«/ $†ï‘š ó‘áâDÎêÊ C*'G¡»0æHJVq”EtÌz¼Ï.ô$%¦qÈ4GòfÁYàÃ;ÜúÌïÍo‰+Ä[<‰ž¿$YÝÚ{‡×ÖîŒÓ'ƒC„Z¶R7šgæÄAb"o` ¥ˆDŠÈˆ/˜u9u½Ø LËÆ¾V/燓ÖL44r0eÃ4NäX„b-‹ÐÓÈ0œ— Œbë'ž4ât‹SVk&ZµÖ;R>ž´²Nñ™¡„|CZò–m+ê`œ•Ýu…O¼Õ¨pyvžwmái˜Nî~ñ.*ŸŠìMñ€X ¸Ì@ŒàLIᙋL¯„}Éwæ; bžviƒï 2¢1šÚ/Ž(†éè=ª E|a[òZ”Яm4b<}¹*cg¾°[³?-I* –>¢Y9Ï E §™žW33)‘±–§¦d¬?P+U0·‡G»Ž¥æªÄT?Tø‰w‚øñ€x…~@nïf¢z‰ÐÕ ým`ÏØº¬—$°—N-u2bâÔå†'mó(¡ U" !¦Á¸îDš1±‰A©”Ò”»5 =¢"çQæµ %>r0f–o^UQK¾ ˆªË»üà>DDœUTfUâ,[9rn#À€öµ}¼§~OY–œÐ`ÏíóU{*Îå‘]b¸¤™ Š#o>XôÚ%}dí&™c%P5³É.fÄ!@3}®u ë#e²†ð¨¹\*¤ -ûºŠ™ÝùÊóãÏý¾—«¾í.³é×õfÿ¬öÏóý™ƒCóÍú_Kçߺ¡úCöý¾·­òàÞœ~«ôýF¿ëƒ0Ïá’Û„œZ=†éŽV¤¤Ç¾¿—â/Äç†V·,©T ‚±ÉñéAá‘xôbûœÔKM“Oa ÿÔ‡ôþð‰ lİ ]®׋Ýõޱ‡Î³¿§Ÿ¯:ë›­_#ñú§ë>¨T¥³Ýb_úèœvQNÆ$Ã'å6Ú=ûw÷xöÏ®{ºCÿYõHNïü=¿âFÓ+§<5 ´ó~id 2 ®¿žêý¥/Úôúþ+Ý|_®òzæy×NŽúë£Ö’7<Ñì¬Ýš‰S‰²®»®*=ªž?òQ¡˜õ–sXèŠ7e˜„¬Š,µË±UÝšUQÙ0ÌÈŽÌÇÊnˆi†– ˆH³Hž./Mg®±Ó§âÚ¬²OÑþìõ}?}Ûqˆ¯Í²£ö~Uï_Ó«ôГ¹ÿ^ñ™–1Ñ¿ôwÖÏäÿ¦g™×ª$Rmˆè[w„™‰¶Ñ•eÃúÈêòèlöa?µ“Ÿ4óe¾WùaèºõHO¿×ïûgìûã÷ÖŸ»<_×?·ÞëŽquŸäοä@Íð2GüĪÄÏ oü‡Ì©,ˆG§þO,Œ.ÚD–…¤@Î6h,Á}!*¥ºw"Þn¹¼Wô´p%$õæ&¹nøõÙN—­z]ë@ï>žº§™wñmü™•—óÉ-þ¿¨² ÌÜ?è±þƒÿI(;SååǯŸŸ–ùÎuž;Oºcé0Y$òLÄü•û#I—ÛöºÔµ£LØ$Ñ¢™-¯îîÀÂ1o©rÐj*4l©Ī*‘ôøßo/§ã×¶7ÎÜiî}ÿ/—N¿;·ÏûNªÆ£po¼xÃÐ 9êÿ}—I{÷FåAì‡ívG G7¬Ä‚¬ŸÎAÃú}¼ A7ÔDwí,¬ÎjÇ!j-Ð)§1_}ǰüùðCâ{óûÇî ¬o>}w¸ùëÜGÃF<Ô@ÿ@ùSdŸaõß~‡{5ŸÇÆaü0ô|ÓRÿzöïóóøcåçî÷{ºmÎþú¿°þõ‹Q²ýâCê_ø±½Œo‡üø[IžF™Äû•ç2øªÁñ)}KDÆÄzä„UíT]öù^>¹™´-zŽ;¼ÌévŸÅoësU%Æ_—ª¯TÿÐ~ãøuÿ0ìK¯Ó3´€?VIúß>õ1øø¨ûϯ„Ó¹?‡RÉ‹X©ˆþSú)¶ïÄÝû#Þjb#NWGö‰1?W<[G¾­¾uçúþ±+®ÒWˆópÿ6þÇ””#í£Ý¦5ïÝöG÷ð÷óÿteV3§D+?GõziÜÿCylp§ýÎ?Y>­u¢rï[¿5Ú+üŒì±ìm’¡¤ízÍaÆ5ò×ëåC© ÁÜ4ÄB§ ¤0t÷\ÆÄº¬7^þ}K§ä^‚›ww¯WâŒJ¬H¾O_ruÑl"»Ã«®¦‘\"Ëþ§:H˜ÿѲFL6“.O}’#íâ Â³$sê¼q=áOô1‡õULTàÖƒ“† hãg[Ih&¥JX•Ѝ£I6–Ѥ‰¾§mRP™_žlÓ•TÔL4Ñ‚H‹"Wãfº·®Í&3 ˆ8£ˆæ.*ìÄ™½¼øËɰ䗹¿¸ êQÕ¹¼´d©4ŽDŒÃòM3ô5I „y4^U@ÏsQȽŽvq…‡Œ²Á…‘4ÂH§“-Øj{ç€|WT褻<œæðàeE¡ü DìD¯W‡§¦º ËûÔDøé€DцÓÒɃѓdâ?E‘½Џ`>.󦂶‰lø%y,J“͇º:þ§¯¥µïjtèåk©†‘Üv˽¶ÅYÆ”úIµä>ÞRêlHÕC|\Æ_üèwàý³Vò¶§Ëçø®Ë3TÛzß¹ÍkÐÿ^8Ÿ}ö«>ΟÝð¡³VùžOy+0ÒÌ©›î9"Í#ón®Ac¬,eË$ ¤!$†‰W%䵋lBã‰aDûÜíÎp EÌá—ÂÀöfz˜t0ÃÕq&Xuë¹6oÒ¹™dù§;N³LNœÛXË/ß:œÍHúòÙ{þ®Ïûô$Æp“¢¹§žÓ/4ô^vRÛ©2ãìÝ6³¶ôü§©Ÿ¬P=U$Ÿ&æœbm=·Ž³¯y»·{Ûœ°Œ#ÍÏHËw…$a™)„ô@G÷uÄ>}±éÉmè÷vŸ0¾•ÅD_JâXÒD 1e¦cÚ9ãUçÇxúy±ðx{”‰ùQPÍLSD“áˆ|1χaóÌŽ$|gêÇÏìúåû|ûCfœSõàÚ~_£‡‰ïžÍ~ƒæñ óæd»=ÏÁ>¿??‹$×ÌúQ#Ä%tо]_’ö~N]2'Èç½7Ô)ô7<Ô(ñ=9öœUy¿Ù7iÄáÍ18û·ê85³çÌgÐõŸ~GÁÏˉ 'ӼǓµN“»Ÿ$ŸkÝþ».kådÅûÏ×/S :‚:iÆaºÃ´2^½½ë_—-ÿÉïxù>s[¬C¬¡2ÐlI=ø>~Ò0„íætÂx’FGªý»¯¹ó5~¹¢Ö­Züù³\gÎ.$?¼xÔRfvÄþæ0ä>£þRŸ$·IQ2p„°ý¨¡ âxÜ£üRÏò˜‹@¿’Jyaëï·Ÿ] ãŽ(hÌVMÄ/œ” ‡üÐâi¬G3Ó™4pý ñˆR¢æg‰òÅ—2·š¹?NוŒX±ú¿*wyµÄ·0×*(oÑÙ<ò9ÆB‹ó§kI^yá$$Éè‡DE³êÇ*qb%5ææo( ¶zP)gŸ°{<­¡ûò½y~èýnP}&GÛs\ˆ'“‹Ið‘®~%¢L¬K!2€rD©|:tYÍæbô“¤J à!>éá#ÈlӹѫHÐHI̼ÂTà–×$lnn4pA¨ÔÕq­ž&A1|‘Î;÷|ŽnNLý5ö‚Ûn‰)g§O®C­qøCÎ|ùÝçF·ºß~N©°'»Í†ÉÙS7Ü;±c·õM{ù*^Ûú’ïº}>ûǯvÑ‚L+9®Y vj•‘'Qå—œ£Ù2«úOÏ7ÍΉã4~ÑJû°'4)úm—¯¢íßÖœï©æ™ÑúÃAÒü‡³FKºÜ@…†½vž{TC’ÝÖÊœ! 9@»÷K]Û>Þ”‚ñúÝÙ5~BYÏV‹ÇžûyšÔH‚R ‰´ Ý—r€¢1TºË°x@Æ‘Âh:ªÅŠFØ‘ÚRQ°èUéñ{¼äSX:Ö_'FÈy Là¾L¸Vl¬¥€”ë:™6D8%¨"Q<Ô¼J%†!éN8!ž(»Bânru/¬S{Áí5S’!Þy°MÓf]oÙÍáÍóÉ\›6HÈ”Á8<„e"h 2è™\§ºåû“št…wÖšÉIñòÙ}·äÉïnnn{‡—SJ™gOfÓÂs>· M H®q«,™5Ÿ®Ï>nåÙ‘Ö‹©ÌÇQˆ‡ Ħ£.¡DcQVP‰NmPÑ‚(¦ÃòÄ™·è;; Rܶ:®S-"¨ëk%>¹!ä&x€K’¬9‹€¡Ê …•"Q!ld M,ÂÅ9½PŽ.>q2ù¼À²ð*•‰|º^MNŽKtY0Žª>zöw80›æw³ àB3­93NónqÆsn¦—™W}÷Ðv#/(zœð…P+tyw˜rp8!ˆp"ü@“²èç¶k×·¯­ßS³q®*åƒ`A;õlLÒ‘’%sßÂf~›C:j;Füªí­ªÖ º5&¦ítaÌ:â…<Ý1ÕRaÍNˆð¨B[”t4®Œ\EsÛ„d·3˜LêDàh³3„(jvcR8šFóʶG#6sƒ»—)’CJ‹ÝRx4¤q‹ÓBRvâaÈÇa8¨ gƒA"@ á®ÑŽÝr‚±S¡ÿEOcS Ð}ƒ§Uº‡Æ®]¾m¹™²¸8˜ÂòwÙí¥åݲs/–’Z»o,}NÞv,8H±ÇŒ²W96ÌfÛÅ…]…¶÷fÎ2Zr@»$6ÙifÌtk¹ÌàBÙúÛÓŠ.øžËÏs“l.ˆ_O†ó®epĹà鱎.ð]‘ ”‘€ãªd4† a¶ÜÕ~zám—wœ;9,g[» kCJ6±Ñˆ"Ë¡pÀÀ#ŠÀ¬»\<1)èARô5;÷iÒœ0þSºÄÄ’Ûšêõæµ[Gnj©‡SæýÒ´~9|!ÎMú,Ý8ÈNZC§HL+zp€ààÅ,2xØ-°6Í#!Å[Ÿc¢†Àô r¸éÀ.X^˜.Û:"®·C¦‚  w0;g ÍÛ1q„@lC«lgt)´(4Œ‡ŒŒ-€ÛPvœ\£3Õà94!Ùî=xÛbÆjÖ’#H#ƒI‘q2 Hù+a&œ›çO úÇcËGW„3Ü&p›Ä˜ˆÇgY»„ìé>qÔb~rN%‘Îc¯Ð±òviÓìññ¶GwiáƒWÅ¡{$¦|ûAßå˜?Ê:G7¨)Å ƒƒ–§_ëHš™®{rnÇd* gæo§†`ݳ´|³áwëVF7’g¦g×l³ÝÒx÷{íå.ž9 Ý”f%•lùšÃÈx;'•YÀí= ô(™sÖf±Â!8’ÓSA>å{‡30 ÃUÃøïàû~/¨’…PÔ%YóçN̵%Èò§,¼:$Ù_¡å¨~Sìèȯ”úxG3ë}{ÈãÛSË«ÓÝöv6ÔïëUÌ>ÇÐÀ oûˆ5Pà‘Û²¨KI<0¼ÔxzMæ×:Ý` RØàuÂ.8ìs—û{ž48tNYrÁS¡b˜îY¤0B$Z–IJ"­¨KPr€¦qýÃÌdO£Ž=ôÆ, úL€{Ó衎qX8mW1ÚÜs¨ˆÐè‘ѼO–«Þìã‹äÂIƒ¤ñV¼åÙÝåoìý^_Mü<Ô¿ªUv=gt›©Š’l•SdÒ&f[½2¹ž,ˆôeæâ}Ü=£Ú²ý>ªÚôûú¾o8«'Ëðjl~’+ñ<§ðùï ùøA÷ž>J™ˆw|×.ϯåŒ^ù\ç6ÞgåïûHëÎÛsõÏ3ëÀ×nke¬t‘Œ¸’x}MiW  ˆ(˜‰Ši’ † Š—j&ø9V£ävéÖY1HÔ¨edmöfdà rªÇƽ]1]:nó†ÆŽ¶-ìٔͱô“”¶`Ëm·¸ç¢ È <þSú~Žö ã'›,gׯŸwÓ¡§#Óymsö6c+ ¦Òy:?§~¿Öáù«¢ÝYv}òôsÝ€ô nKœ.Ëÿ?åú<<¼?3ÑUØ çÁ¾.»†aòGÆ?'æóŸ«öŸlõå'tiô=Ñô’¨ªRŠJuÉë¡èêœGÄÎ×o{#àtèàløŒR^ÎtNdhÌ~L¼„õ~[ÈfA±èLý#lUÆ-S#'‹ZÂ;‹_Éèv<Ž·Çèõ{ û¦s9ÛR“Ýc{=Ì7oû7Âí#uDщ¯VMu?.í±N8ý>§TÜRû|ôzÍŸÕ7r+ýÓO‚Œ_–½JHvdDŒL®TÔ®A»3%Û›³"eLfî±¶²juÛ¦ü˱§·VzÏ^f$áÚH`Kìv‡Y unyÏcÛ†j$ZXCç¨buàáþ¨ÿ> 3S{ñ®Á†Ý{ç®Íž#oFMS´rscÞZ“S äNf _݇¾WN‰èv>‰²INÐ=[pªúHMÕàŠÅV üf=Íiðš_Oи T,»3 ßܰö ~¬£$PBD}ÏNv'ó´()ZˆŠiÔ˜AJQY‘׸aÐà{^Ðäð'–‰ÄÓJßö›ï¹¼aeZ¶\ÄŠa’ÒŸôŸÙÚs‚>³ë‰Âó½»ËQþ©5·ìc·kfkìåèëŽO_În“¥m…ÂFSÜzC¦Œy‹;ÍON®žZ½•¿œÚ;:ª¼!Ú13öýçög²‡>«JáàøeÛ ÃajË81ÐB‘õÙö}M?Dü%ýN ® §ž~Ülá8 7’biG‰mFù5™ËhÛ1¾¾ÏVtÄ0ã§ ºÓïŽ8ô]½ÅKmè†s-äkœ1Æ Àñf“é§ñN¸\õ.Kºý\ÑÓàu{–¨èw­Õ;&ðùwåõ>ÜÏsN|µ¬xâ4oäZ_Sßæ/¹´³ ‰msHa‰M‹pÆå=f”xõómŒ{æ}’tœI/½øžC½-Zìû'ôzFŸÙw»\g U¥¬ÑЏ¸[–ûÂ{…‰c߇v›ˆÍfÈ*4e—ÅU¦[ÍÝ‘»×ëå’âDˆöyî}éN*I?…}}œÈ{¦þ^†"Ý;½Y}úÞ¯-Np®‹õSÜÊHüO w}S”Àø1÷,>ê•¥ É$êHé?TŠo=×ä|"O9Ç í>3ëgôM"3( )¨¢"“Ã)ï¥LÈOßütJ B3Ršô\N¤›B© ™è,@IP›!–Ø›o´ø=¾¹Ÿág—£xÍ‘m™áR*•*Ϧë'¹™ð©¯Š¾Ž¿VÈóY—øý_;û>Ûk}™Lc) j‰,ú°F =“>œI‡Ôéñþ}uñ&Yóþ“‰g³´ûõo’O.=-w˜2÷üûÎï¶&üÈú8ÔÛ÷©â'·Ç¤ÄCàûLY'3Qè¯ðYm°¯å"ÄÈÂI_ªÏ;²/„0A2¥×ŽàQÛì~²!Jk@EW)óp{2Ûh'é³fßôvù½ñÞîY$ŸW¯ïÂÉ›_×”åb:'õØOÝ6Úvš$ªùDy»;6~68û\1VúUå¶›iSýr\ÓÝsÙW^ê×.\Ø|»nZhSm*Ô¸²ûœ†Bd"RnÜI?{ÝÝÎ$f2î»ù·˜§®áÀNW7wwve¹\®uÝÇÛÞ7¥ÒŽ'w.ëºcþO÷¿ýôê÷ü3þbßî_ù2ŸüKþb%!pä®ùçP‘=ÿŸS#Pvû.”·X¤E+Ý[¬"" סµ×l¼ bè>/E6Eœjó¯xÂ[”ò=¶‘甞S —W¤Cìa·8d0ÓÌS–œ>Z¢[8kóáM÷‚iFÎ&5Oª„»*£æy(ÏÆááVC8WŽÂÃ[*ŠpàŠ“eb3†k,é"ÈÑ#UµÞÒšºÀ¤¸²ƒ¡aÚ<µdëxµçw÷§äj\v†A­†?°ÍÖo9‹åõޔе®ê/Ó¿¤Ü!¿Å™˜ì,™@SpáIô HÓ"L# @¹"PˆJH” p²‡úHPT¾·ÅÏwÃ|nþÿ{ló­þ;ü~{y¾$Ÿ½P˜Œ«s;mÌ£Æ$ª‰d\j‰BD%¨h‚B­íeh² ¤8“Tç TÀ´ò*Á²åˆ…”UA1 <.)n™ ± ŒÝ èâ=­¼LäÏP c9u'"…›a[Y"„‘Ë*ИPÙ˜¨VèܸnÕ£"<‡Bõ†%4­ê7ØqQˆíU‚:u1Æ0(C¿jbŠÅb ¡o!ˆñí)SD)Ðáò”jÕ‡æO<Œ$y"£Äg¼bÝã–Çò‚j^`Ñ", án$q'\æ´96`œŽó*1æÂÎK¤xqOÇ.cÏ?\˜LÈù ‡M%¥¸î&ÅåÌ \š<}PÌ¢-äé±nàižÆ­Lmŧsu¾÷ÊZ#-DåS,"<Μ*¥Ã%©ŽÔ€Š¡ë›Ï;1;r •ydMÖ„$bJ-f3¸ÎÀí ‰¤©u‘!™O´›Ý\™‘<#Ám²•x Ωî´Ü€$ïxØsÖ"çfðØõmy^P§Æ$fvYdª¥§Æ·r½Fî “lq·¢Ö&`Ç."ƒãÃ¥9|ÍÌŠ©ï3QÒÞVKšz…Æå¼üÚ§÷¼Q^Âc¹qZ'3¹™ñ>NÛkcÈaÓiŸ¤ˆm ä’ÔÌe•<.¬c²¾]R÷…òá¼>‚"ùª“âc2NŸ]ÙÛº§œÄt¼pdu¾kp wí8½­Zâº\dÒn’ _KFY›ã‹Ç‘—<’M:ÕlE{IËÁ^*›Õó jJ£øLëШ¶gäZ›„䪊Šé–-3^ÒQä¹OÜÝä‹tÎÍÑEA¬¬qÊD(´Ö!x(™ÄgWX³fîÜy ½B=ðL¿SÇy߇Ø<X~Bоå®'â±JÒ35tË8”Žâ fj ¡‰­F)x—,äÈ& ç„žšxK Ïjy”F³hQÄE4VN_¯GAÏ ÉÙ¼zŸ yƒ²¬7l&‰nŒc3®ÈÔÎ ¶›•ÔŽ!Ô™šQ°||´>v´´aA´iN›JXaÓóŽAøâU€Bê^-‚¨Œ© -ZŒOÖ("AÏ×v@ÊEkëI’á’ôzøcn'¹üµY^ôóX±/x›ÔÃB¦æäf!áeˆ&_ŠU”Çjm½>3^91Â!à ET(`Áß0³‘‹GŽqF âÑQØÅWЇ¤ã¦”—ÿüÕ³ª?ŸŠ<ˆïmùø¢ÄÖ‰*Mï2”¨{îßç¢`x@rÓÊl¤Sí•R•3FBXñ9EN)ï¸/¬fjxýô¹Èx\v­¦Î—îßÔ7ì 2Û¿¯ü­öÎs:cmüe®=¾"Wöž“–bk~ÝDQF±ª XÑRÐQB´*R‰ ¾ßSùÈëßß™ý?_ž¾ÃüSõcVçp…ïõi>ºŽ˜ý_]Oçd‹:Lî}îùP,¾t¸AG´6ó#% ˆáÑBÀ­£ã%)õk²ƒJ#ioC¾1tŸ3:·à ÞºŠ³aqy÷Ç¿W}-kÏQŸH]Ç nAÂþAÀÓô{)>í}&ÀŠ-OzÇ陟£Ë_‘¤M„X”¢ä ˜g.¢p+ÃÝ4W…›êXY„­ÕOަb88J(bm bš&~S6¢)C&dG…8ùåí#,„„+ëý×±-aÅ(¸èôäÒÚ¨l%j >õ©¿‹D¼̰˜ÎìóôÔá†ì" 8¨üWç‘„‘›ô^YÑâ#Y@zq˜g°J,@²MµMŠHàS•öÓÙ1­5fÐ,0@Gx€o¼ïõ¾¦¬ûüÁñžìÒþ—·¸0àp ÌmÐ¥O˜†"¿“åW"úfaEðÂüJ¸ÞGí%ܱ9乞â[롹—(ßñ®ËÆ«³I6|ËPø¢ÕýOÙL„ÄÔ\ëæ\×ëÏû4’ÙaqônFi´?Ú&ÁÌÞÏç=,´ã»Q9¬*ŸJ1>œÏíĉ&'þG:zçAï½ ²*8€â¢"¸âñ®³HI}˜œ h7S3 ö› š`Õw¤ÊRmjBØÝ6‰¹ø7VŒKeZ¶®9Ä€ö|ÿ½:ö}ÞS ^Aұ쟙ÖÑ›×æ_1dÈû¢+^$kðÆYˆlÛr숈¢¨²p“ ˆ¦ìÍÙšUÌ  Dfµ¥Dd¢¡c \u…†ltiÚcM¦Ò$áP7ÜÜhàÉbS¬#Ö@4a6èÃLHÌë'.Òbu™äÔç,ÊrZß&g1Ûk÷üÃ÷ÿbþØÿ»úÿb÷÷³}‡³/íb®ìEñs¾|õí€ÿx„œŸ?¸~ާÛú+X†hKdÂeІ4ûˆR@æyí°I)UaECÀÀMÝÿxnµL/ñ8FŽýéF½ÜIé_±w­`m€ ˜û‡û¶!øä¼’øŽDŠP¢`$ªš ±'ý™™nÖ&dÿ„LA8N“¯•ïëÿ¤8|UÑù<üIâg™ðû§Ÿå_‰7”ØÓã#ôŽ'˜ÙdóYŽphÒ”RX &ØXšƒ_7¤gM'dœ 4ŸÑÖ?9á<,–PË-ÜOÖi·óá·YçMNÏñ:ùÒ¡çGJ)i¢…)€‚aQˆ) ç¡×oóñQ %"HRŒ‰LÈ O)$ŒÂkvêöN­ÙÁÒ}묓¿GY*n™#ÌË«#ÏgwWIjZÞÝT˜™ˆY ŽÈtxþŒOFqën0åU- ×þ» eC.!xkýGשñiÜ/ ¾ õ©~‹ß4q-É ˆÈâû–“ AP³nEnm~±ÑuY7QÖ¸}5\{¹w] gºÜ¢2†°UyºVøòð¬ÝØ×4&eÆØ±d»»T2É%šiwk™F1¦_íww]ÇÆéCÝnº[¥’×uÕ¨ÀTl(˜‰HH¤‚F‚Ù ¼ÅtÁ(¥±µrr¢d‹jÄÌÊrui&H ”î³"‰ MQ?ÂâKY%µŠ4dɳ‚(M´”hÕ2KF6aIRÑBi*5ÄF1DmfâÕrH£‰– [ÉhÄ›kâ®Z*5±wv™"RmŒRFbRTh°Í±´Ð7¿§zùÕslK™ë¤ksk’lUJ¹¹‹XªI›RlA¤±´l®îŒQ“j|ëtÔll¶^mt%!…î¹%&#Aæá”¶É˾ÝÚñÍkª|îVÝÜ›ÎSÝnTL“jLÙˆ5,¥¾æ#Ć–T(-˜@aŒ†–Õc ,# ɼnÂéU—uÛA%›m¾ÝuQ ,™ai6S3D@B‘Q¬0Zi¥`Ó‚§.¢ŒÛ^šÖknšŠø­'E•4#©CT‚Òµ-i¦Õ–ZâS1¢bj(¨C¢Bi!ÒÊ vC 55á=#fÖ.ù˺±f·÷®Xb”Tâ©Øò?sÂuz±š5lôàDÏÁöw3§=÷m)K!M<’J8:·’׃Ų–ÖM·hsxªx‘×rx{ Ó—¢ÔQ_ðÀò»T{• RÛlU¨'XM£çûº6ua†Ê8‰ŸÔHaþˆyIŽéÓ/_ ™3¢âpÉë(©ï€œ#¸2@¤hZ;JÒ¹ 4fcB%(9 U ”¤ž’"4"Hˆd!‘¹:B&àL„´ãkZ·–ìe²e XáöèÝæŽÓpœD#ÃÔåÛІ0üW—ƒx¼; îÄr Ð…0'%¼Ž“»³c™z<; #ÉuC¢«©N®)cë§à~¡†¡|Žùrì©™žcfÑÙ:Xï™=Gd960‡´ðh N¬3”°=K³ ðcê|}»øäz½Çâ|Ûs>mLQMbð¯AãýÛô<–yF* ¦ ¦DÍ&”±Eˆ¤Ê-b„¸aбœp°#œȤp‚ep=ÅtFh8Ù§Há.CêaÃ{žüm(ˆ ª ˆ£œñÐŒ"Ÿuö©(‘ÔÓ³úu¿-hµŠ"LhŠØÆ4‘bÛZ-ŒjÅk"[!¢Kmkf4“Qj"+3a-FÔL¢²‘ ÊE2¨ ±m]¥´!nT›KïïW¥Rh³"‰6’5&¤Õ bš%“@™6h[%Al[$ldHSIˆ´bdh²jI ±X¶´%ØÒX¤„¨‹Ec h«_³WuWE-­#i”´×ï•Ú¯eh‹$ËdÕ ØÔšH¶1FÉj¥M¤«Mem)TšÁ„‚-[b%‚(Q)6`&)‘ä•L J¹$~ e$ÇXtuHL’Èa$˜ût´ãwnïf¾î¹iJ¶E³ýòAË«c‘×qgY& ÕŽ&bMún¶Ø¼ìÒ>4Ž8Wwi=m”§„¬¿iœEÒ?8sÃÞéœ×*ÏH³ÏQÊì×»Ÿ“sÄôpíWD(‘_À MŸgðsÁÜáîuò®`3!ëc™ýæÈ©“ÚZšC÷¼}HßG16<”ãÁ$DÅ:Â1¬£A<Ù…Å×2-`¹AÊ7÷d~K‡¿nð‡‰ÃÀSU³ûQÑ êÍf³…DSzTÅâ ¼g ÌØ mîCêI$C,B¿Màð}${p~ã þè¢Q*“Ôf\FÞòCYüÚF¿&Z•ä=%â¼_½)vÔ+l\³ˆW<òœstémšþ‰Êû]çÊƒæØ ™0D³@¥’žózlÓeßb'_=iHŠ>óœöò>äG-„dÂ8#CP(ýŽ+ õ1’!ÇŠŸ×‡™¸àŸ›@¥~yÁÔ’#q0‹1•ÑOÓ‚ÂØ:Rîå·û}9*¥Ú¹«Î dåü=iÍÈðòÖÂÒtyÎÞlìxY®gí÷ï4‡šy|+Ä´‚‘ŸD {y´ÅæÕUÔ€é0Ö¼si°ÝÍ‘¸ñµÜÖ=åËÈ3¯¶ð»¦ðŽ%H(âl' Òwc¢öCôâIŽõò W’$Ô)¯Õ†'S¾O~¡Þ‰ê±VëN³{<öóÖ¶“ÙÛÖržvŽ7TUÇEðc¥ðœ¦¸4lÐ5ÁMuÎçNgK¸_ר>>“r‡œÏf?Y¾Å]Ð>xiÁ=î@ w@¥.s6äŸs{ýªä8#‰÷£© ¤=í)ÉÛ/&â¦{æ\æ-ᆛw‰ˆƒIÜv‚È9`Ã0 €`ϯŒ4z«‡)®«Ž$wƒt˜fi¦žFrm;ooù+6U]ÆVfzžß`T=F`R$~ŒÂ"Ù!çäü'È7‡ÆÈž‘aðvcꈶ “›jU¢Álûª™k…´k–Ë®Ê×(°[ê`ê3%'섘 ÏÌâpÎÆb=r `‚$…&¿3Å2P6üð¾M˜9è`>é#ɲÄGòûü}w\v€<° ,Q$z‘`²ŽŸ,„ÌY!“FMû–5·óŽ»f,C2ˆõ#‘ï4?RÐ`¯'ñ86†ýÙL¦ŠHêaRP_†8bà¶4ÌÚ|š Å0èÂ3®:\¹lŽI:Z8ŸŽ9TvYG‚î™ãœ†Ñ2rÊI¶ Ò«#+—þÓL*¡lšþ7ÜÃ.ºjd»I‚‘¶ø¯fk pë;´“VÒ£kÍš“haí ëÿºé5¸(°ûŸ`ýÇêw~Ín5d~FŒ~.Ye„þ†ˆ¸gãß8ãóäº'#>Jûšù0ÔxÅM¼¾\ƒÂ~à„Ń0qf+¢ms\ÔsÁÏ~Jèñ yDðþOðÓÝÝ}'(´«ÙMôsh7€x~ ñ⯠ïfªCóŠe&ƒbLê&û¢¤Ëu4Ù„úpËhÂîø²ÖMMµQ6•Uø²ÔùÉý2Ú?L´Ë˜–dGóIÕ“ƒº-±Eñ §Èˆ&•PùÈs>k$ŒÔÅ«J«l6ɇ½˜»ÐO‰(¸ ƒÚEر»ã:1 Î>›åd?…D¶ «~±V?wGQtB§OÇ]?‡‡o'Àô3ýŒD’¢~Ä€×j¨žS:>éÐôBǃ²ŸÞ}“ˆÿa¡gÚI!±½û¢7îmt'DÈ–Šh(¡1”w'üÀŽþ°w,)»Á­™t0Óèõ™õ˜8˜?ÌáÇ1µê;:>…Í2 Â`„ðuEy±ù®•îz=ŽÄ©t1À0äÿ#þ"<Î ›/WÏ×ÿqÁßó!ÿGã‡üûú‘$E$JŸèJ“Å–(­3“åþ­šœÎì8œ6›=¶ÓáöÛþýÿí>)ö{Ï#ˆå¶=gÙmˆÞt²5þ2µ_ÏÛ®áÊ7s‘w;\®v»ye¶S`ëàGÕ“ìK±˜Hò>ÃF¤U1¶«² ÊGÑÅN’ÄŸ±?Ïý§º#—úûe™X±ÞÏÆx’by<œÉ÷ó}]Þâ#v_¡übB{ïï}p=7óyýŸ¶[>ÈË;¹ƒ¼˜-‘-I-¶ûöÒ½Ÿ/«w¹·f™g|fϦ‘ð~‡@ÙåàÙÈ]>§ï÷ù–ii_Åõ(M˜±„˜.&p4Ùñ9pzD0e èù üÇÊáx>g)*°ØYFuÓ;®nf“9„ø¿W«ö‰ƒ"6Éàé1$ÌÊ$I ÷‹lú“ÕïÇo¯õ·îϧ<±Êu‹ß×}l±:Ô*ó˜Õ–×f^§;ç6¼cÔÚúŒwBRVØ7L0Âí´/#Jœ¤î¿°–qrD À¶¥ýÓï³ÉÐ,HQP±Icp¡‘Õ´Ÿ îÓËç)…ˆ~ò„,¡’¸˜„CûާÄú¯SèÄU9>%—XLºIfUÏÀQ@øix9òáÊ/TúéG–òÒèy:3Ë©ÑÒ¢DæQ½ !–\Säð›È"~P:Gœ<÷\•ho‡Gª”’t56aûøÃ$u-DŸÌ©,’Ä#·ô}e™b?&sFf DáÄ0s¢½N”~Gïp ¤v>CêdÞÍ™)F”™eÐÃ3.uމ H©+»·5ÒŠhØÔQZþ×1d¶ ¯·)4XŒÉDѼ®kü‘„­~íjZÅ!–¤Å 1{âBœâDA„@ $ª²”*üÄÃáH„ˆdŽÃ/“ÁÏæèøIÌO³öõI™ UÕ¿ÃÈìË£g,ºæ=Ävt”äõ4+Ø€ì?“Žß¢bª@)ó?O鯡¿§~ÙηӜ<ÙÓY‘®3¢…/2‰þØQ‰ &Sã8ÄæÃȇ9ȸ{´³Á6ÄbŠlæÄà=a¤‡ªÉJ¯"†­ ÀœÌCM:Å%bÝé .˜ž¡kæîì‰}á½áÙ¬¶œ±§·Ÿø‰Ã‰w©‘D¬ðfõ˜‰2ò¯&¶·IÀ"ä½Ý³Ô›}>ª\VfS½™Å…€ç©wåÍ}gg±Ä¼ÿ_;êw‹ªöÎØSM—µÅDP]È.ÕSJ+킺Qfs5‰“”ø˜¡—ªº§y–ÅH™§£)ðh¹FÎw—^8 z”¸úvÏ~ùu¢ÏRz¶™Î*\\g9ͬäßëÞ!¢Ý>ƆÉm°EÁdÒÖ‰¤áÿÓŒ»»ºLˆ$ƒ#ƒ±Ý{<Í=é4Ú k‹VUY$ûc²·UÉî öwØ!ϹÓþ£×p_„ëˆ8ŒÃyÒ=Q6~OãM¼Luß¶gW¶(^Ü"Ø,ùƒè‚{…¤´_k5‰F¤,%"F°†q‚Ô  U¤‘s'T÷vKžRç«D,³wÑ眽?kj­Ùì>Ÿ´ôFK9³„,ë¢Hë1(–IiO30×)S—óØs”û§2 íâDa(a_iÌ‘ñÇD–‰MO f8°‰7JZkIv$Ì›eæÍ}>“ˆô‰ë5-b•aΉ„K‹ŽAÎlø“«÷rtü½9yõÄòºIáj¤:€áë·Ù‰(Ý7¶AÞÒ3(%áå{»Î^^ïxêOmj(ØÚù¼:üg Wu)Hr§ýR+Kù—zÃeÀºªÇº®K©í´Â$1=ľJ¢KDLÌFÉ©ÃO7äB×d„Å*‹ÞÚÚ™ ë0(× $MéôchFèž“! lÖÎ7šmó’9×7cfwŽOPõòIi@ʶ0aÙNDIÞîžEšÑ¢ä‘G=vâq4¾ää Ý­åû=Ì£êŽ|§”AÌçSTˆ‚ˆ4´ûtXŒØœË‘Br/Y›ný½ŒD‘ xœ‚é°âšVž5ÜŒ"õßq’O³‚0beÇ@D §™¤V]Øl®ÔʈMd7XVZÁFÜf¨t\‘„p¡$”抱‡Æåà쌵„Ú˜áˆE ¤„‘#rìK³©æ\ ¤*‚"v:’Ù-sޤu×WuÍŒÍÅï ÒUîáƒÙ‚#NTeÖ2Ô]°¬îhÜô‡Á$ü&fðî êެ厞xÆ<4áÙîcLN2s^º·Só¶›ÛÓ‰y`¸pØa¥–mV•g ç‹n{i‡<8Ìia<ð‹=ª¾ñ8çq4ó&‰ã³÷ª‚zÎ÷ÆsŽ®a¹I‰ Úq&9 ƒ}‰' Á‰,FeyYÃôa…: Ýúk,ç;<ã wŽjÙ*wyq>-|¼ÌÄÔÍÓìúGªÁJCòWEС R6­¤6æDök&±#ò£‚§šNü'‡¿oÝqü³6Ùg0?vø#5ÕOYMÑm°µI?‘ÉÔ´¯$¨þF=D?ž?œ à?Å{õ½­¾ÕüdI¨¤5¨k#œæCéýŸo—Ýù­“òôšrå{O®¦´ñÛe_—›…tÝ—HGGæ‰,U‹dDª ±,Q%¶‰Ï§/¸ŽïËYI'?nf¡?ÍÕ·5 ÂîfÌG #ïÛ«û'®1¿¯Gíé2“t³_¶ãöGïï¨÷Ä|^“ëêá·-¶ë*Ô¢¬µ%™’ƒ¨üÉ? $?wOq$úìãö‡‰G ÿ+æDhNû?H±1ñ‡U>R½aäÌàùrÇ ÙÅÃñóóyOÈÝY˜ÏS1ü*:P0Z$! %bCKS …$sìÚceÆç ¼„åpª¢ ô-!Êà8Ÿ#”ŽRèr«ìýß7ÕÂ’ª,R8’"ÙpØ;Kî/®“È›p²*$’0|ˆÓ2&‘Îg¢Œ U0ù™bzµ&Éf©jÓ–‘˜lª—¿Ú>š•ûÑ=ÄÜ”>Á(+±I0³¤'³9Y0ÎÚ"N•1Ò (SH”¥!@­(R„JÄ©@ ‘jKRdŪÅbM¬mˆÛFÉFÙ*¢¬‚V¢5Ñ«EIWÙËQZ4jšAJ‘R”`” T(fUÈÈU(b˜…¡J6Œ•X‹F1mQ£U“Y*F¤µÆÚÑX¬E¨©6Å´E±¶Æ-£m§Jí¢Ò[EQkš®i @R€Œ@*pÀ*$UO„ЉH é"… ʸP "Z!eDL…@ÑD Ìf š•Ô¤0‚ i3(‰ÈÈ% à ~ `ªEý(ÿ_羃)ƨÆFó†™Õ2üó‰FÊŸâ•ÄIeDQ&tMÙÛk•dèƒi˦Pö„‹!¨dËE’60F’Ø“1JPÅH~Äc(ŒPóˆ2î‚щá¬e4ÌX¬)X!œ¦i-éªåI³½µÙæÊꥪO¶a­ú9ÎEÃ…wiÖ!pèѤ¨¢`!d–c÷zy3çfƒgL&ß´Â+߇sœ/n‘‹?§¶Wf}nÉKov@dé̈ ÏISÜ6†5Ò(â6vv¢àFÜ×.W½ÛŸ—"%çÍïsÁ¡mØI©ˆ\3fIhÔ5s9Ëp#‚!\Îw¤“ àŽrÑââƒ`J\þˆY9UÆC?ï»J*ÉŠÉØ3!/É|u³'ÈZƒÄ·UئJ’1Dsá)Ýõ4*iÝ®ç Çã·H¢‡$d‰ÙpM܆¦ÔÒÈ\–iu#šš8¤Ù»¥”šédÇ2¤ŽÂÖ9R¶ Ž"¯¦!¬#R7,‡$®ÖGÈÊJ4]’ÝÛŽù<4—ÇIo›¸óŠ•Ñ5G1Ý6š¦¹&Ú+HI2é0ÑEÅ5Öév $Ú2‰Sw%E! é¶‘W5dÀUÅ·hjݹ´â4Q»V£~ȸŸ áˆbÞi 3~§§5ÌÆ ¼ÈDö“È8©Š8¸§³…447 š8riàÇzy@9eöÚhza]¨oÇ o©ÃDv' 9Mp\7äbh åñ†U˜&`pë*ŠU4ªAÈklÁÐbš!„‘hè‰Ã©ÀÞ„ãО~£<‰Ó­×"P¦ ¢µj=×ÊFñßßÄÙŽ¬¾O>aÚo'o3Ìøp<ñÜs~W öŽCòt‰Û‹ÝºkÙOgtöôN8ùŸŠ^ƒTRAD¦™!’Å]× 2úºt½‚zC–ÄqÀfº®ûÃy¶pÊnq‰2ÿ6ê,ÖØ,ÎXÐè«gE%¨b:ç †)WäÖ I¶§å0îÑ[×ú±šíL’Z™cF¢!K$Û  ‚1¨Je²TŒÅ£HD¤DÉfÖ›F´´Êjm%1JŒU+@f aлI4#¾xpÐæl´àA‚ã'š0·nL±ZXÆE”‚ X8’à q°ã0snÜt`LÓâpƒ…w<†;M“00¡ƒbÙ[¬ÚGÖˆë&íåVÌ¢ÉaFX0’´òÿ›)#еpÃï>JwÄ´º~¸>„ýÏ»Çwæðü˜ä20¾‡°c•EA"pÙÛ¡Üà8E7ÐõVy³mŸ <|T¦SýÓ£IÛå:³"èÇŽŠn]’¶Ôd5'¤žü>LÂÎü>zLQl͋ԃ Âúc’¸ù1E ² (ïjx ˜¡ˆ8n[0µ®ûÛÄ“(®Ž6‰¥ß{½LûH¾¥zE­Òßtnk€ê5PƤɚ±Ö²°tœ†ÅÄÐl4μŒ—ƒ‡Y† ¤ä׿·¤Ùü$Ö˜u$,–&ß:zÙ8}gÃS«tŽíæKšSàåîOŸÛßÒâg>s4æy5éO¥Æþ >ÜÈ ‰é&8‚`ÛKà¨i@Y%´FŠ*‚ïÙåŒ:#DF'Þss”þ´®‚Íûü_È&§¾7qéeE/™h<†r£ôø¡÷öüýïí|ö\ø~ÿÚðJ²H}•t›ÉÈG.:˜ŽÓ¾­ä$]KãkÃe±vã%æšušö[vŸ<á]#el$’‰=|%8Êï<á׊!×ÊMï½+®Â,}{œã åÌ¥ åÂ|j"3:­Ð»ÑÓæDÅwAb`=žçN!¥ }ÑGÐ|¦ñÕÞkwyËÁ;:Èèìïž–[Ùë¯FчyC J³/i•NŒ'ÂÏ“¹»Ê¶q—­+\ÑaðœpLAÄ‘´=èáÁ÷Äü^L_Ë ¬«}~§“Àt÷pÀPD#òâAßs™%-3M*-!’Ž*ž‘éêæ¥3§¡ÐزôXêbh6zÏðèO=éO ‰ä™ˆ…=•Ì©—Á)½oü$™ÕdŒ–`0Ù„­˜f¨JšäÑÂÄõàG " i¨R40(ÉDA&‚1ETŠCÛ©NÁåäç¢ãœ…³2Ù´ìŒ +“©PÐt16M0ƒ¬³i‰Ó˜³[6šh©0çpé:mÎylÄZ—sFMзøœÈÿ¤iË ¤90%¥¥FìzüC¡°WÁÂ.°,î /Íä ðYÕ`9WG˜²Þ”ÉЃ0°K¡¦ó?ñ°·îªÄÄOÒCC×…scêüÒGf°Ëòâiù%ݨW/{Ë1îžSÝ$©ãZˆ%• ÆPiDù…¿c«i,çG†JzJN¾ÆÁÓ –Ó“Ja~-úm4`¯«¹å>øàözHi=>ç^½Í—l=n»XfÙ˜ªf:Ñ.ÀèŠÄPäчx!íÐN<¿Ÿ¡pè–M®A@Ú Œº&³3 VU‰¤q· ¦—ÈÍ F˜–Y­ºÍЉ»b¦¡XÓjÐF 03MÓs2… àBP‚áÁ¹€–Ó¸sd¥vF@ò’©‹úŸ¸í ïò>êm úyÛäïèóCë˜îEfÃɼôÚ7ñÍOÐøÃÓ0È 1 … /3™ˆ¦x1FœxDÞ'Rz@pœ²N×DC§EÄ@ÒñË!’v>y»q™‘T/Næ ñOtâçH‡û¯íö>¾Ióû2f>®dIÒ¥§Zö²ÐŨd? ?Ä–ÈHŒ™‡6qÌ2"«zF ™’ÖþÅF€zZ'%¡†La)’™‘©kÓÒ+} UËm¿¢älSO]Ý\5 ¤k`¡”H×Û\Äo1å®T¼¬kîºk–¢7yÛOvôÞ[ݺïvTÈ„pŽŠá 2Ëmã¹î´å¹ ^÷½¯/M®H”F] B²¬ÒBQ|ÀÁš¡’I %…„XQ"%Y#œÄ &fþD ¢Qâ0†‰€ÿ«Š› òHv@óPVp²mHbIC¤Q4X3LP "p²†#y” ÝÏ ÁÊéÏM—ëôõG‡}—ßÅ¥>YWìkÍ*J Ÿ©È4aÆaÔÙfÙ`‚q׊=…Ô†Ãéz†!Já“©<¼(«$–š³fètvg.É:1ˆÕÕÅY—©‰,òhñF«-K$áÃ] Tݺ3$Ù±QÃÞ¬–ÁDdd‚ð„VÈÞÄsv­÷%ß(i†tãÃ…0áÎÓ€±£™9b3-)ÌrL•»ø‰ÂžOUø ®çˆ3Ç3305 ,u\e¦[]%&곞Æa£u…·™m4…^É• DÓ8‡6T}ql°Ë,˜b ‹Žo+ñLÆHëÅNˆUðé 4žKg¦?dXé›í9âGm;¹p¤&7„ÄuÁ»œ8ÛªóÕ±Áîu^X˜¤'èJa­èÖgZžç;[ÖiÆÚI“…pô“ªj56é1¾´þºÔ/>²°­4\¸šj…‡"Ë,*hŽ{í­žÄ ¾¿R¯wœ~f—IúlÌÏ´žmNÛÇo²\&&SÖiƒSÓ O~âmÛ„RL–‘˜`©0VºK·N×~F“^֢ؾ±q8Ròj9"Üô3„ÉõŒ1e\\o&8qÂy>p÷õìæ|9ëÒ°M?àœ¯ó&$éó!(¾‹ïòÚìÑëÙ=_¶y®?Ò¹Óí˜|¼aÃ"Òj©„óòAa"Æ98@Ç9†LU5»tîNÆÚ¹]ˆXÔ|ë¥öÈ–I-}›•,}»»ºû2‘#Ÿs" ‰³ ±È‪€¸¸öfkÔ"l¹,8ä@=¦¾M!  Þ›nd†X$¤hÁÉ A“½…7¬Â iM„IJ)Be¨ÉrS'¤ J•^¼òëY‡•µ}*ÞWÒ£U¹]#>.‡˜w&FJ"·M˜å»'Ÿ5î<õÜ÷Q¬Tk^UÊ1^lV*åDh¤Ù6-‹»¨Šç5wvÜ×6´•ó*äq+’K¸\¸„5!šÌƒ§7]Ç6ÁnjäVƒ]w#ˆÈdŽp˜‚‘fÐÔÀ®®’\ßÙ7½vú”x¦gtR]wÕÞ눪×6Ùî+éÃͼ¸lV¼ QkÜÖsi„a½à亃Pd$lÄN—¬sŒÈ™Çš¸Œ®ORu ¦ˆbã‹A+²Š¹QW>®¾uÛÁôOWYf¢Œa:8ÅQqʤ&AdIŒ~¬#SvBH‰3p©FB8ˆ†µˆËf6è‚­)"jAq¢Àˆ®*t‹o.Ìkwv屸åÅo:öʸ ²˜ .)â ’dEÌŸ&tÃR.’‡!Ú$7Äî êëbÞùÔkÓUåæóË•æÛÒ&@ZÃpjÜ%uµ¬N#%Ô¦¥8! ÜìÀjëK¹*"'%xœµ Íy“ H¥Ô«IY¸â_]ã¹N$ÈSDCfwHk®.¤Ñd»µP¼RjAÀˆ«ã‚åãæDÂì⫚$ËÊáÆÒgã»3\"™¬Â 2u,@ä´>!rS¹0¸‡dîYŠS]e I¼Ç3)Èæ„)•™Ha&¤p“ˆÈ5ÔŒp0¨ÀÑ&ÅÌÔ KEÌäW+‚ážš¨Ï¿®Ä‰«Ê¾êᨋÊ%ÜÄ)¢Pê0çÈ kR”&Fo5jSUqùž!Œr N%³+t¶á»5ÞâÔ~½îp©LÔÅ®|„Àü@‰®.z§nÕy$žo5slh­ñ^–ü´ä[Ť8.ºÄ(Ü!º"¢æ.9Zò+ͪ6®W-y5Ë dp7o­>uÌ!U‰•[¦&µƒJ™&åLCIOH5l‡i.Œp@ÕÜÒàÉ'†Á\xEÒœ:ZÄKp¨ì@]Ùèqð‘#¶®2¡˜q3Š”F!CC8•\“ED˸X³fŒ‡*;ÃãVÈZ¦5LÅNI'45"È“e›Cd©\Žá'Zˆ•7¸âzY+ÊwV®¾ýo6ÒUèS›%Å„‰0Ç0”)Jн²ÊjRÛÅz­Ù—›œØ¢¹UÊó¥s7ilL;ÝëÝÍyK»Þ÷¤²X-F«)ˆÒTXÔW6÷±Ñ&ABu ɵŽI¯2RäÊŠzêÝ*®—×rë¹é͉ «3&²B–”G Ò€Íä5 °ŽbK•,ª’Š›àF ä¯bCqCBl\q€Ê®É „t!#È$½‚¤£²e ¤Cd (À3“C‹€``. OLëÐǘyN‰U ЇgŽ÷5¿ˆ[d5ÉàÃ÷¡íã+“ØôÊ&èo³«‡ÓŸI—fz˜V£B™b`¤Xަ‘òw\íB˜ò‡ÂXd&ª§Cü NNC™¦—å/K²o"Ñb£¢9ñ½:ÃRËÔØ(Å‹øÚܶòÅ´HPd呜c¨(MÂa˜.n2g6áO¼éÜ?ÀCœ3ò° ™®0Ìf…ÑmC%IÂ6œ½CBl–VTdÜ#Ìz’j)&5ò9 ¨%hÂ=ŒÈ˜‡ð”Ùˆ¢¥‚%fˆš‹}ûªåÍNvÊ]5ÂHÌ1ÈL‘”X(5™wŒE"+ %©Â¬£Â†•%m¼23 ’¶‰C +´h“i³‚éW¬¶DÉm½2úêúžIªS`ßJÈ`i©JM¥ÈËI%²Q &ɦ Pé€*a(&–ê½É?f¼á lˆŽ& ™¡¾dÊÃ"˜D • Aà—ckbÑl•ÅX®î¹¢‹j,kÎZå­ÍËrÖ1ËmÅU´¶ÌkRU¤€$4à`Y²QÁCaSï™*éàûi;„ª&j‚\gÀ yñ…‚bƒµÀшÑn©Ã R£Î¨Çfi7¤>æm±¾_X›™eÂìs â».ñÃ|Ø–Ùa$1:†œ(ÃI†¼ÚÄ4(‚ޤÑJèJb6û¹·è«ë-„Ä›13'¢½Ý*n­’¹SªÉ•fÆlF-[ «#tPá/DÚÍÁ)i:f2'brb Øk.ZÊÛ~ðÙˆ®Z™“ »‰_gDq±ˆŸ|9ÞŽäë33ËžöšÔÄÁ*c~4‰Íò)Þ@¤]Á“R™)“lZ#T\­®E´îÛ°‚‹ áG£D…ÿCà©×…úÇ@ýÌÁ:<É>!,%’ZC× Ä#ÎáFÅa¹‚ª„¨´Ú¬Ûm/Jëoã.hÂh ”¡(Nzºs (qj6Ø£U%[IEZm رU‹X×uïwº¼¶ð¿Ÿsäë\ع]Ý\Ñ¢*¸nQ¸k—1Êæ£]ÝÄØ±ª¹¢×)*Îë‘—qr®î³»©vV°U&±µÂÚ±B Gdœ=£zÇ35 ȱÉõá>ŽîÆš©^a(VWeU[îµcP ±E£[›mEWNLjh¢ß–Ü»¸“cË™4Q,2”®UbÛÑ[5%d*ŠØÛAk¶±lF¬l[`Ö4m°m¢£ÕÍZåbÛ,µÖ¦Ñ«_%T©ª“xkK!"¼°BU‰²MÀ Y"iТÂɨ²&KAÌ&#áØ‰•ÂØŸ ìÇßHð/Dà5±œ0;/ê­Yz™Þf fy£³Æ¤Üèc•Ó®ÝLÙå÷`'’.Îm0.¤†25ܲ4H¾$ð¬¡ÆÐ\Èæ÷»g®Ô{»P¼»(¥Ë]‚ Èx$Ãf¦J4&ÁoäÂ;’©Ä슉†,YVf·syzîûqˆœ„8É[ãVº¸ñ ÀÙ: ðIÌ&ë‚G|Þšf‡G¢á²<ó¾ÁÁò> yšë5}<ükÛñŸë‰pó¿sQ.É„2ñõmç"EYQPvzèøPÝò%ª ò$62! >ÔЫÎ9‘u E1/6 =“A0&(c.ˆ ާ%ˆ.ˆ#_<àÄ()M܈£#¡lÕEsæù{©½}eòøK{ë4^t”‘¤Ó&i©Dî·deLÛ»ÓÛ©*ì®”šmnÝv哈GÖé}0Rç4¡”éÁ‚mƒ“.Ž…±\*=lI»)©É†MZ•bDáÉŒ¬@¤8 èÛ;s—»‚ÌôÇèþB. ÐÛ£J2õ+º`Nˆ^‰`I™‰jùù®¯”Ûór"‚L”š%¥«FíÉ$Fîá V9œqšv?²Ô¾$èÉ€?dÈ(„Š!’!«{/¢üeøùuù¾ˆsØLóN£ˆà\ý“SÜ>»tÌ5›Š–Ãep­¥tpsX´´^œz³¬gLŽ+”«s˜»[]¦É„G“H’OÇôaìm#Î,<ŸW›cgÅ>fÈO¡üK#eÝ!uDªè>jªZP(„¥  E"ù€”GÁò{ÏGÚ'ÆF'”ë†;vôð‰3ãAå7EØ]Ä“ Å¿°ûíèþqÃÉÏÞNrÇjñ'Çãõ×¹7ç ãõ¾®?zrÌøÈŸ§Ý®X‘Iù;’©-)´¼ |ê^WõÀÃ^W¡ûcäõQ:iOÄSNCè9Ò)È^ï'oƒØ4±ゆ-CB¾E|pi‰Õ‰è©&êîáÕ×øôpêÞs50“^§;'ÙRG_Ý·‡³ôýÊÕ©öL;?wEöï¤0z“X}ÂÈ a$"¥‹äãø]ÜêGä³Y?züW¦›³¹vµOWFdÀP¡¶fÒš)eD“m5ATŠDˆÊ„Š+@„’ £ J…(¥ ’È’H¥*æTÁaBP`V !dA(dP X¥…‘FQdP ‘X"’Q%$± ’ÂX(%‘dFB–P”” a€„ d‘dRU aH…„¤‡Ý/÷ëú5ÍlÝSàôÚQþ–yÛàÂ%\Q„­DÛŠÉ©Ñ3’eƒ€S’PìtA_÷aC$Eˆª¸2pEôgúÿƒŸp¥XÀhËm-ƒ1)W2J*µ¹b–Aeµ™*D’²\d’Ò1%&1Ò‘Å ‘© 6ÁÌ0Ü?“þ?Þv6að{û˜AË'øçÁÿ¾ÓÆì ·¡ò{¦¥’yÉêx®^á#ßZfaïuÿ}‚È‘øûyW9ñç›Ç‰Ýý¼¼]YO’Ïl¦¸|‰WS9›«[F™mv5ëMšVÅ{Ÿ#›V$•”rßÞ{Ö}gûO·ºßùÃäíå0òƒÙûÿLd”y Þ*_Gï«î}I?¨j0>/“6fí ÙƯ¨E¾ˆm0-1¨´jDÐQŠM§ãßíæ‹ÊK6#XY©,Ã|7¤‹Rhk¬ðŽ“ŒÂ¦³1›æ¸ŒI{±Æ²Ñˆ#gâ f´f“¶µ»[C$  ¤ Ue±jŠÖ1[®ë®íä\¯‹ZԚ܉)¹Ér¢Û‰AFÔZåpjëë®$]×R+ÕÝÜ¥'w"w]%+—eÒ¹¢>½× ÜtQÎ{¹&Lš^ë¨ÂfHa?EÛ‹(¤¨¢¾uÈJ[¬‹(H qwÑŒ,°JLŽŒDé “ºGQ‰FF$Âw0CEˆ6&8šSâh$+$ÄObB&`˜Š„`Àrÿme¶Œª+%-0V ‹%bбNÊ;]:&PœF4²ãý0/ö#®Ž¶ð ŽÏK©fø÷¸„›Ñ™ƒTUëÜàp¸Gú_÷™ÜìrÿÌú vd3+ì˜æ°`¡Ö&"É®—Îݫˉ'Mû¨Ëœš‘#fl´ë- ‡ÎOë9—ò$5Óèv’š‰ðÏÈ`bÀ’I=þåFñõeÏ>‚>•k<¤ùæ>Xx0áq†žî"|³±ûº¯hZi lƒ‰±³¿ƒÃ£ÏàúiÇ›½{‡Aîøãd°/N¦4ÿ‰™ø@¯ÁÒú¦±ÄêñòÄ4Öûû˜L‘ð°†ÞО§³¢2±ó¶ÃQbegì›c/{ ¨ÃxÄ™X4T“k¯<B}©É»ç÷·‘ÍÜåÙ„4â:ƒ¡Š¸¬Ÿ3€ÊiªY- ¯ˆ¤CQWc‚„C§B S ív0`éÒ†…‰#A¤¡fLÁÄe”¹’LÅ1"fV pb‹\Ð lxPÓŠi"ޱδh1˜6PÀ—M™„Ì}µ òϯÊÏO“ùØ¢º<òŸ‚ª'ÎR¤}ó>‰ŽÿW ¾Ý’#å6žo ‘ëE‰ã»^ˆEx_e‘U}N¨™«ƒ“c$dóR&ÒDAøöE7•C²}6“¬ã§._“§¡ß $rèÌu¬$áјÏäÁ§S‡þ:WÐØŽÐÔ£ 㫯TRcÝE?ÐN_‰(ë ñqë)©Vüç¾=Jú§êå‚l¾OÏðÌos÷®)Å'm*dš–†÷Ðûâ~‡åø|vþ?a:Ô¨ŽBŠ8R?´. “0ìXHªý)aö¨˜f³F4–)¾šäÒÜÛt¦±bj JdڢŒ²4…F"L±QK.Ô"ª1–Ѭh°PÀÒQ Å‚0I¦XÈ$ÌI¨MˆÈ FI!(Á±2AI“D¤’K00” $@H™DÈÛ##E&,C)P2RY„&‘I$¡’ @Ó!¦A°ÌC,Â0‰DR*nnúº3Y¨† !!(˜Ñ²S$šKIŒS „¢ †"K&…–%2P–0؉3 Ih ™‚$Š,ÌXK)&B dÓ)›MI&²i¨$Vd‰Vhh™‰ IJ£R³&ÄÕ6Lù-ÖSk53K*S2Me4ØØ(ÖjÅZÅk³Q’ËFÆHÕ3)©M²6Z•# [Ük]m-%´R I ²B° IeªlV¦ô»uuM\š*,–ûmàd ŠCF¸˜ig´}—,±œom£läö›6g³£lª Fóuê»7›±TÊ­Æ&LæÂHG(î\£b¯sHÂ0‘~F©(t ~|˜ê¸pصHESMGÓêQkb?nÝ`üTÞæ8Ì$ð}–CEä÷ü"r˜úèðÄt²3QKåXYpó`«ÉòXÓÑS楲GÞ$ïÝŸ8õ‚9‰õZV¶O=Iß³ˆº;¿gxüvyd~#Ûùxz;µíXÅb®¾ËYóÒ±ùm£[]ÏM¸šˆ„ ‡ ׃3>Æ£&¬tSOÒìk\æÛõÉ©öF,« FDŸ~¹A™ Ñ~+½[£N“°ë» 8I3—ŸÇ‡º|N¯“ˆžOËÑ=bÇŸã§wÑâl½óG´¿w¬,{ïšb€´i÷Ó‡©<È„ÎD8Ü6Y¥*¬‡©M•JnÄ‘ E®¬9{V² 5ÆØc›$˜?‹Ë'¹eÌV]Ÿªa¢Â9£yûó†QJ/×<’Ö•Å L¡ 0ƒg«Ša‘x´ƒÁ£“ƒdì³HêY 5Çíc—‰½¢Òˆ+ÌE’3>^Z$¤Úà åpqwµm6”:ÐaŒH1S×^z«¯jUé¬Êú¦+LbE¨LÁ„Ä0á‚<ܘ9ÉŽn¶ÉŽ%çè”<ýózo³Ùû.a¢n „XÉŽ 4„¬jOBpçÐÒa$:ÌàÄ.&£ C„T+T¡ßI0›”:1Å’/®°à´mp6)$&ÅäY4œvHzü__Ê¿k¿œÒfÆ“j¿¦¿mº~ø±¹ÎNÉÔžæ0ÂTz”œ?w.^_7æl¶Ò'í+ô›œ¼,ËÞÛReÌÊÉÃöoû?Yî"yý> ¯LFpÇÅnöãµnÇ/g<Ãö>>iæ ðûë‚I>E•ËmPEá€OÔ´O6;Cüú~„=v¯ê°†´aËÙÁvu q È(6Î6{›Ú0–rdó úŸ¼àÕ¯¨‰h¶5‹FÊRŒ•0 a‘NæÆ)ŒÄ0ä‹t±›µ‰'4r¬ØÂÂ8RMs0ÖU–-¤‰•wé‰à—Â÷(À|e‹Ð”rGÁ“@á’gh99Ä`ñ3 f”M¥µK$ª3(Á;Д¥) ’U3Zð®’FL¥%Ld±¦d¢i64ÒR‰LBgnµ4ÕÚkêï•%¥JƒI"e)…AP‘ÄYDa—÷4DОy# e\_W8N‰PUÈa!1Lc c3 pÂá”!™¢¥ ©XcÙS$§… X‘“$—L0tbtQÙ4²E“rª¨ut÷?[ðQ~ÿ¨!„*D«*¾>±òŸhFÈâ9æ¶Až€ëËw@9¨¬9ÞaŸ»„IÝRHò²Hù+ä-ˆÂâ0³%‚ª{ÕRß|0¹Ç)„ÃmªÏ© B~JˆbýÇ^®¥#¡È!‰þùy›,’‰&½ÒOYù'£Õ¤ãäô|Z^IÌ÷³òDúãA?X@ÁSL°.?Q^‡uŸ >{*w÷ÿ/ËY¶‹P8EŽÿÚë'›¡Ïê=æsúË\P2k‰:]Ùýó-l©ÕØ 3C<;ÃŽüæçÆÖ¹-²¯HH͉Ç\÷ÅkÈ}'8‰Ë-–ÙÌÙ±7]±×5i»õÃx›#ͲËvå“Rd»/®»9QÍÛ÷ËȼúMv:wu6»2l-×A–TõrœI×vósvp$7)¿¤æuá«Ö^pæïØm»±Ùššµ§);>¼>åóÁî€WÞ.P0CD@-U´v6¡ÐG×Xè,aØFR¬0 è Ô¶”!0`“ ‹ž¡Øp…è÷?žBàpãñÎæˆTnpÎa9ý¤NdïÜŽ°ÛU–ã.dôŽÇfîwrÅGœ‰ivTa£¥“Ie–V˜“2 §C©ÿ^Dž™9r¯×ó!’E¡‰ôxž<)¨Œá猥©3R1|ÕÝPsÇ›ƒˆnõÑ›«ãÊkZbç…³.A=ad,„Oôœaþ0âX)㇎b—Éø™ýL"*êq\*Ë;í¶05sï|gImÓy”ÄŽŽ'A³Í¿EŸ±ÀF‚=ÞEïÔâÒrtŸz ¨lÃOyÙ(ÁIÞêãÜ®9ÅÆ 2È‹™FFØX¢1Œ°ŠåHóžsrw0îÜB‚îwvêáÝt™&`®o8^w;yÍå9ÌMw½á™sÏ;zY%dB8¹ŠI ¶pŽj¹Š5Þn0<½{»(.yêUË’&& ÝÞë”kšòÞs\‰)<®ç÷r4«™(® ¬"‰ò ôFD8…ÉE7 +(H a(ÀÊÀNAe@Ù(™ ä*´™‰Fh0°*Ä™„TI5ËTჩ‡'ËÒí›9:F¡) hj„­ˆÖŒPhÑcŸ¿¦,kæ&Q…J|ÝY›±-tlL4¸©zV'½Òde <îfZ˜þWkô!È6E÷³Ûnš š†!‚ß˹E¾íÏ6î]¥ÝØaݺ[ÝGIbÌÌP†` žÆ/]1>m‘8—z…BÄì'ƒ£õÄëàòªXi¤æG7Љvv8x|yÇ O¢Ç‚ms—¼žé)ÏHj0nœ1:L§C4ªÊÆc,,èÓ-ÍX-¼Å®k-\ÚæÆ9[šç ±k»´cš5E澂 c\-s%fQ©1ÝÚ§uQ«V»k)S,ˆï®¿-ãÎ|^ßÖ×Åøáà‚r«Û©üOLyñ'.&OÖzÆF±§ƒÌå’øFìá2]Rìi[z:«ÉÔ˜•¥”7á¤eØÙßu¿YÊxýÌOôòçÙ6”™øCˆ¢¹Ö—s×.\Â#‰.§ôTo‚p†×¤6›#òß^Ÿ¯r¾>¤*7ÓM4ç½øIëŽÎ£ëÇ¡¯rçù¼ìš*²W?>¹:\üFLžLE6nRÌ”kA,=4Q.Ú¨¨ÂdÂ@ƒ–LqqAõ»Sa¡/¬ïð \Ò Ø8I2‘iòå9ÆgÀ¹‡ Nfœ4‘Ä̪1)ÝÒqÕ0í¶Ê‹É+fL™  ë¡Ã÷û™ì§Š 8¸ û?Œ(ÛÁ05ßFðœŠL¦3'¤œ…) ˜pÀó>«p=‚gv/,Ë#¹Ö÷›Úc¢?MNÄbmˆ N{»Î¾…žçÁëž—$ÀçÖÌ&³=âÆxÖÌYÑ™ Œ‡~Ê…><ÝR#¡Ý œi Æ=œˆ¨YB áNe‰¾^çÀb<ãÕçá5…Óc¬Ç»Å¾ŽKó0äÙ KAéd’’—%¾x?”ˆü ^ 1YF€H ÌPr@ÉCEU%Dä:#èpk±äîc£ºº 7׌ç× 5³ÉïgjË]šfPNânØ«ô:‹èiTØ-H000H"¨ÏÀ¼Z‚?¢ò}Š:ªô»¾ FŒDÙ‰Ýpœé³8TY©«lÙ³\Nqrå³d̈ÙÊÈ5S6bz¬Âs±ÑŸŠ­i‡1‰"+' ˆ”WB€§ó˜L5':=Ú¸‰ëpÒ+OŽýl,°›ìºÝÑQ·)ÜF§:ÇTVC9m ÌÓö' µ94.?ÜZ"¦~p´Ìó Lž¡{w¿b/܈m+UìT5§õÿlÎîÿÙÂr²Ë¥iø«åqEqóëÕ¤–ãY•´¥$bÂÇêÚÍ›ëy—y»G5–o/%—„®Û[²›*NÍ=Htr®LѼ“0M/y³™I…R…,X¥š‚©Ö}œe³Ç[ÆË¢eÐd‡PŽŠqÏ(zöNÕÙx?TÖb¡ …Š0_š·õÿ£~³µz÷Q=ÎÂOƒOW“œ¨÷KlZZU©‘aÔwÆøô-evTM¼Êbýi1< žcA°‹ý?‘î¯1ŽrÀÏÜ”I ÌØÙ'ÊtJW\Œ$ÕÉ;d8ŒUW”¤ÂYÖTý½\˜{Hø“ÛÈÛÕÎûçÛl>( |ÐS¬ãËÊÑ!íyÑH6wx,v¼=ÏÉØ7gúòËn–uf ^íy\:âÕ³»îlkZI(lûýÐ C;&Å{ÏÚ[co!nß\ÙŸHÃ#áÎvOtúçî^9#“R~kf†˜ƒ˜g7·/'¼é8›‰:¥M°í*Ní5$‡;°» ÊÍX…ï?IÑ»aË>làzü,`´òp†îÞ<>9¹“º×¦û,È–ýVN§“>?E3²ïž5ìzžÇ·~ÑÉí'[=1lÏ Ì|jÛmcIŽ{Ÿïgdn±£ù¡Ö9ã 2£;9b4ÍîÝÒ1Yiw[~Öø5ññÕ rêJ-!±¹ËI… à,Ö“µ’Äey‘¸Ö„ÜÛPäê1ƒ#P†äJŠa qq?h¸{wò`ÊàqïŠÐôš.¼ZÖµ‰’ɨÛwPl†ì£eM>¯H˜hTý‚Y}…åèš~dæC³(5û%Ìô‘ŒÅDxEÏp¿ÅÜRýC‚Žl$Dãhæ&ÂcŠŠªz’eE‰$€ãˆ¿$Å\#É@}ÎhóåÝŠ ˜ñ\G“[¡!°2†.@¦ º-+ Þ'[ð‡›w}1;œú¼8r“2Þ_CYø]<“§5†á³QöÚDF¶±p9ÞÕvD’lŠsÔ„ïNo&L–’mi ÂIéç|¼Ö ç›W^¯ËÍ‚ÉÝÖIVG0„ÅÄYr”b¦K AA*Ók£žýzß—‡NqO{¦ï4ƒ°¶F"´Ä·?½Ô~C!ÈyO,F~ºoG(ÃÇXÅ6æÉ‚S#yFµ¸²¤Èmñ×vê%—2™5βæ¹Ë±1¹½-/.ºøë]8d«ƒh*ˆC &@ÁL/_GÁñÌ_QQ„žs:Ù†)OhÌØçPìíË~pòbaVrÔ“È™Õݸzv*! 0üÓçÔu¬cNyçYÏÃmؘ\366›³¤œ·rú ÆÓÄ[É>ØŽŽgN!¨–hé1Ýaú>Š£’0Œ„‘˜ÈâÅŠä„#„ïš“Ï1ö‰ÃdíÖyp·wÙ™†±"¦q#„Ÿ‡2E¿ÊäY‹ôÑÎ=5Ša³>sÓÓ+9:q»S•;1ÔF4‡1òHlz“²|N¸Ç ¶wñÙ–)ÃÉdâH¨åˆê‹c »Ü‘€ôV"(ßÏ"O}‹j8%\Ï/EèÌè‡T£!SiHæU‰U&·çNXÉ„™~öâ šªªf*¥“Éß»¤gèlã”ÃhÛ‡3+X›²4ÒM¶[eœué{&ò8}ÀˆHxîr±À?xó*‡n˜Ý݆ٙwTÿ©ž/y"pê¸òÒK"J$³ܼøttjb2ÁârÏ#ø8žËï„ kÇ®?ÏsBb{ ž36žnéåŽ}Rú×±l¶KĬ´4SHUƒë&š$9â±ÑÜÎÊ‚:$FÈßԛα¼Ò|+³c¿¨LÒ‰AñHЭ -û9vÞþÊõåò(0^n™22c¹¡tœ>§ Ðíøé~p p‰ËÔùù@®$~ãg”6A¦PWN¬Gˆ@îçvë"ØFXx%\„M»z#01ýx·ËcÀ<š<ôpÍm9!i»ƒ§ Î u¢SýBÓ—.MŒmÌpÇò,m5¬Y¬.ÕlÖ6j0Ö_ã¾4‰“cÒáËvƒcvpî͉›n®½ø›’qÕ†°b):µ'(Î ÚŒÕÔé·í¶V¤ð1œÄÔ6°ƒ ½^‚÷MD ] yŽ!S–ü½oÁq8!´ýŽM¾¾X`ƒà´9qcëÕÜöš‰p™ DAðƒ „7D«„ä"¼7¾ß—còKåÀ)ÉØèaYß|qÑ[êb¦ÞÙ‰ï†ÜÌðÌ™ÌÝÁïxÖçbÖµ3³I‰GŒ0 åÞÝ`•À¯|H°÷«b|‹j-,TQ©d¢¦µ¬(É©+¢Ò«oÃ%Zܰ[þ×KJi#LJÐZD´šˆ¶ &Š5F’‹Jh£b¦X³BÌ´›D 6Ì£&©#bÙ+%%¦l“ Ä•’’L’V’€± QûñÄLR<’ š‚P@à@…Ä MÊÿ°u]nµ„Ô}gû ІF$À¬~¤\léŠOÕqL•$ àb°ÿV±èk€Ú0ÿ)a»)X8—/õȓ՗úHݨQÕÛ9ÿ¸âë?ð™±ÿ•™É»œ§¡Ó®Ã#£Ar=Ð=Ö—Ÿþ„ÒóÁ HÁ‘³ú-HÃûì˜0¸ØäL©æY †b]ê… ­IƒþK²¤™OøŒ¦Ì^èðúµ7y½ïoøl;·B3C·›b3˜ïHVïÇÔNòb–LUžç¢`òtF1ûÏyÕ?X-=’6sF#¾'Ùéý³ö®,2|zR+ïd4âN²dÊIî)÷êÚå3çÝþh|½$};IÓ³£ ÂW¯;Üb¿¶7ô°“ ;–Å¢ÐÁÂÇäî`Ûàß2uŽp†lb1?ºÂ~ðH1 |%<¤‚=έ»Ð«çe~šðpHÿ™ü_dü|ÎTTIT§ñDøáý½H+®‹“8œd!?šè9»ŸÕËã$Ÿ& ùú¾õk˜??óŸ4O¢jAÝöõBõhþXIôV_hîdS¯cSci&³"bO¤<ØOî˜~<¿V_¡Óó9•þùAÅ€_™(b‰*ËJ@+8'êÞÌ›KðW.¯ÎO”ªÌ,ÄTèñ<äì³byH겫9t³ùtv(ýT‘\þO?Ëßâk˜þˆÂ‹Ý?fB4é"_¾$iJ+ì³dª±'nñ†Twwg§å=“üŠOɹÒÉ ³Éeó1«ü%¦9è˜Õ"Cø&+‚æ2GŒ¸Á¨,Ä %ßÐìð†¤ÏP- .™/$¨˜IÅ€G•qϹ+ñu銢Eî¾8'ÀŠ~G£ðy>}‚G·ˆlWïç,’=\:)ˆ÷±$ayƒÚ«ÛO£“ìáÄÿ/Ò#Ÿó’¥IM™˜}çë'WúYùÏ”NS¨ÿø¨€s„S Çû¢K|—p…(5T%Ì‚'ŸÐR9#ÁÓQKý0à 8Æ£)ÊÇ 1éË»ç¯,kË™Hîà¹ÍÊéHA®é×$¤QÝ!™T‘ pÌå&&\4˜K5BìÝAÛ|§ùô­2)úµûg1r¶Ë0ãF¥¤å†±ðgs.ìÄè²÷í3Ëùâ9›Éý0®°aÝ|\2ÜGƒD&àãw&^7–<»wüÓo3ÿ,^sŸs}k6ݘâó"ȇ©)!XŸ†C.9чü¹ fùõ™)±²V—R½l¯Ð|æÆó†Éļ?Dî€ò¦þ‡„=‚=‘X{¬b ÆÒx÷ ÁÚIž‰8ÞVN³#¶¦ÍÜoÚ àúÛó'Üñà}aøUMnËÚ3¡¾`îv'•B¦A†Ú Á†˜:“ºG¢aXÿ}6¬ªÙÕ³8™˜48A* |ÿo~î*¸8cBö \V–!bQ_çC_ÁÜp¿Û«wöI"?Åýø„˜—ûû v#³¯‚?…_œ% ŒQmƒ% ˜XGY1˜Ù„ÈiFJ‰™5rÔmy Î;Þºž˜»®!…Êâ Ý»³®—)Ý»5Îw½æNï{\¹' yW1È@pB`ÈI‚G¶´p"8Èå»s—wN])3Îî¸Ôt7S›»¤ÝRW:ÓX0YÆ pG—"X#ŠÓ áÀƒF"Æ$©Á‚¸H˜`aÙ ® ä8#»í²4:AŠA˜xx>]¶·"Ä) kÞq¦,Òµ2kZ’ê’u£5–„¦… @8È™†ÛF%þì™JHˆ_ôÐý«ŸL;*”¼¿•g|²«VÚ]ÇLtà˜!ª1ÃH†ŒCHÓxí´lTÈ#‰8]qR†Ò iÁ0 Q¤P4þ両öÕAÒ$™¨L *ž! ÄÃ…x’¢Šæb…È`PA¸C[Oìx€ Ó/ƒJ49! q“fq«H™6±“£ÉÏ$ Æ4Žo]„%vŽÀ6k7§sRZ„v¨²˜f¶ùþøþ‡ÿz΂\‚”=Dö‡gL×­YZ&-‘º'ù÷fU)ÆcÌÿws2‰¾ ¸s`›A.]ð©*&‚™‚d”^à6šDDRFhJµˆiƒDdÊ¥ˆÑU†ê0­>®&ë5&Ú2Þd®!«!ƒf J¦OáÿªD£ó|ÂY>(Ÿ'çgâIý_«ølÏï?8M;MæÉ†ò?Ùûº¼çxüN X))`‘Hèx9^¶O3/öˆüÿÔ™8’G…s$äÖ’Ooòz{ž1ÿ²Ñ‡wGwvXk}q'tÖ'¾<&ëÏ'¥3ðKÏö»£ûF#´yôÿw·ù¾Ü#†Ÿ=ï9í>Å'&çwÁïØôv+晓©ÑS…“™_fæ)5ßåå>]J,Í¢#?ë¼|cï!»æ¼p•&}é¨í1ˆgÞë¦vyý„óú›¸éÇ?g¦ü’„(X¥}ãGSØ:ž'äúæ>_FýÝ^qÑçý‰þƒ¼Ž‰§v%éRÙl’rîÔñ5Ä™›d:ù:L¹†;á+àØëôI:§*ߤ“ª%²Hv¡-~ Œâi.dÔ±½’GÒTD~ƒÞs\<‡¡ûìÌC]ØrȈ¥© ñˆZ-8'PfPe¶¬+ñÒÜö~Ûcý¿žd/Ç¡û{¢ºaxDCÂPM1Ê‚[ª‘ì±H_žÏ(}Þo¿ÌLJîv0ì1Yt¡„@ýHZ ‰ªh)*_æad;„‡d{ÒYãN¾>Cäú«‰"=BÉób{;±^éù²Çw›¶"DóâóH‚~ž{öu}ã¤>x`åG¹Ùí'¹Xí ï+>Ï³îø¼§Äþ ÿö.äŠp¡ ¹@È aqbanking-5.6.4beta/src/plugins/bankinfo/generic/atblz.conf0000644000175000017500000000176712364015477020720 00000000000000# if 1 then values are quoted quote="1" int ignoreLines="5" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="xKennzeichen" 2="xIdentNummer" 3="bankId" 4="xInstitutsArt" 5="xSektor" 6="xFirmenbuchNummer" 7="bankName" 8="street" 9="zipCode" 10="location" 11="xPolitischerBezirk" 12="xPostStreet" 13="xPostZipCode" 14="xPostLocation" 15="xPostBox" 16="state" 17="phone" 18="xFax" 19="xEmail" 20="bic" 21="website" 22="xfoundationDate" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/Makefile.in0000644000175000017500000010534712643540061020771 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @IS_WINDOWS_FALSE@noinst_PROGRAMS = mkdeinfo$(EXEEXT) subdir = src/plugins/bankinfo/generic DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbankinfo_generic_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libbankinfo_generic_la_OBJECTS = generic.lo libbankinfo_generic_la_OBJECTS = $(am_libbankinfo_generic_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libbankinfo_generic_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libbankinfo_generic_la_LDFLAGS) \ $(LDFLAGS) -o $@ PROGRAMS = $(noinst_PROGRAMS) am__mkdeinfo_SOURCES_DIST = mkdeinfo.c @IS_WINDOWS_FALSE@am_mkdeinfo_OBJECTS = mkdeinfo.$(OBJEXT) mkdeinfo_OBJECTS = $(am_mkdeinfo_OBJECTS) @IS_WINDOWS_FALSE@mkdeinfo_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @IS_WINDOWS_FALSE@ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbankinfo_generic_la_SOURCES) $(mkdeinfo_SOURCES) DIST_SOURCES = $(libbankinfo_generic_la_SOURCES) \ $(am__mkdeinfo_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(atbankdatadir)" \ "$(DESTDIR)$(cabankdatadir)" "$(DESTDIR)$(chbankdatadir)" \ "$(DESTDIR)$(debankdatadir)" "$(DESTDIR)$(usbankdatadir)" DATA = $(atbankdata_DATA) $(cabankdata_DATA) $(chbankdata_DATA) \ $(debankdata_DATA) $(usbankdata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST = \ dbb.conf hbci.conf atblz.conf fedachdir.conf bcbankenstamm.conf \ kidaten.conf README at.tar.bz2 ch.tar.bz2 de.tar.bz2 us.tar.bz2 ca.tar.bz2 bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfodatadir = $(aqbanking_pkgdatadir)/bankinfo #DEFS += -DPLUGIN_DATADIR=\"$(bankinfodatadir)\" noinst_LTLIBRARIES = libbankinfo_generic.la noinst_HEADERS = \ generic_p.h \ generic_l.h libbankinfo_generic_la_SOURCES = generic.c libbankinfo_generic_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) libbankinfo_generic_la_LDFLAGS = $(STRIPALL) at_files = at/blz.idx at/bic.idx at/namloc.idx at/banks.data ch_files = ch/blz.idx ch/bic.idx ch/namloc.idx ch/banks.data de_files = de/blz.idx de/bic.idx de/namloc.idx de/banks.data us_files = us/blz.idx us/bic.idx us/namloc.idx us/banks.data ca_files = ca/blz.idx ca/bic.idx ca/namloc.idx ca/banks.data atbankdatadir = $(bankinfodatadir)/at atbankdata_DATA = $(at_files) debankdatadir = $(bankinfodatadir)/de debankdata_DATA = $(de_files) chbankdatadir = $(bankinfodatadir)/ch chbankdata_DATA = $(ch_files) usbankdatadir = $(bankinfodatadir)/us usbankdata_DATA = $(us_files) cabankdatadir = $(bankinfodatadir)/ca cabankdata_DATA = $(ca_files) CLEANFILES = $(at_files) $(ch_files) $(de_files) $(ca_files) $(us_files) @IS_WINDOWS_FALSE@mkdeinfo_SOURCES = mkdeinfo.c @IS_WINDOWS_FALSE@mkdeinfo_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/generic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/generic/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbankinfo_generic.la: $(libbankinfo_generic_la_OBJECTS) $(libbankinfo_generic_la_DEPENDENCIES) $(EXTRA_libbankinfo_generic_la_DEPENDENCIES) $(AM_V_CCLD)$(libbankinfo_generic_la_LINK) $(libbankinfo_generic_la_OBJECTS) $(libbankinfo_generic_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list mkdeinfo$(EXEEXT): $(mkdeinfo_OBJECTS) $(mkdeinfo_DEPENDENCIES) $(EXTRA_mkdeinfo_DEPENDENCIES) @rm -f mkdeinfo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mkdeinfo_OBJECTS) $(mkdeinfo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdeinfo.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-atbankdataDATA: $(atbankdata_DATA) @$(NORMAL_INSTALL) @list='$(atbankdata_DATA)'; test -n "$(atbankdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(atbankdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(atbankdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(atbankdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(atbankdatadir)" || exit $$?; \ done uninstall-atbankdataDATA: @$(NORMAL_UNINSTALL) @list='$(atbankdata_DATA)'; test -n "$(atbankdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(atbankdatadir)'; $(am__uninstall_files_from_dir) install-cabankdataDATA: $(cabankdata_DATA) @$(NORMAL_INSTALL) @list='$(cabankdata_DATA)'; test -n "$(cabankdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(cabankdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(cabankdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cabankdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(cabankdatadir)" || exit $$?; \ done uninstall-cabankdataDATA: @$(NORMAL_UNINSTALL) @list='$(cabankdata_DATA)'; test -n "$(cabankdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(cabankdatadir)'; $(am__uninstall_files_from_dir) install-chbankdataDATA: $(chbankdata_DATA) @$(NORMAL_INSTALL) @list='$(chbankdata_DATA)'; test -n "$(chbankdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(chbankdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(chbankdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(chbankdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(chbankdatadir)" || exit $$?; \ done uninstall-chbankdataDATA: @$(NORMAL_UNINSTALL) @list='$(chbankdata_DATA)'; test -n "$(chbankdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(chbankdatadir)'; $(am__uninstall_files_from_dir) install-debankdataDATA: $(debankdata_DATA) @$(NORMAL_INSTALL) @list='$(debankdata_DATA)'; test -n "$(debankdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(debankdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(debankdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(debankdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(debankdatadir)" || exit $$?; \ done uninstall-debankdataDATA: @$(NORMAL_UNINSTALL) @list='$(debankdata_DATA)'; test -n "$(debankdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(debankdatadir)'; $(am__uninstall_files_from_dir) install-usbankdataDATA: $(usbankdata_DATA) @$(NORMAL_INSTALL) @list='$(usbankdata_DATA)'; test -n "$(usbankdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(usbankdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(usbankdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(usbankdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(usbankdatadir)" || exit $$?; \ done uninstall-usbankdataDATA: @$(NORMAL_UNINSTALL) @list='$(usbankdata_DATA)'; test -n "$(usbankdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(usbankdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \ all-local installdirs: for dir in "$(DESTDIR)$(atbankdatadir)" "$(DESTDIR)$(cabankdatadir)" "$(DESTDIR)$(chbankdatadir)" "$(DESTDIR)$(debankdatadir)" "$(DESTDIR)$(usbankdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-atbankdataDATA install-cabankdataDATA \ install-chbankdataDATA install-debankdataDATA \ install-usbankdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-atbankdataDATA uninstall-cabankdataDATA \ uninstall-chbankdataDATA uninstall-debankdataDATA \ uninstall-usbankdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-atbankdataDATA \ install-cabankdataDATA install-chbankdataDATA install-data \ install-data-am install-debankdataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-usbankdataDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-atbankdataDATA \ uninstall-cabankdataDATA uninstall-chbankdataDATA \ uninstall-debankdataDATA uninstall-usbankdataDATA at.tar.bz2: ./mkdeinfo build-at data/at/kidaten.csv.utf8 tmp.banks test -d at || mkdir -p at if test -f data/at/aux.conf; then \ ./mkdeinfo update tmp.banks data/at/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks at tar cf at.tar at && bzip2 -9 at.tar rm -rf tmp.banks $(at_files): at_files_tmp at_files_tmp: at.tar.bz2 test -d at || mkdir -p at bunzip2 -k -c $< | tar xmf - touch $@ at-daten: data/at/kidaten.csv $(SED) s/\"//g data/at/kidaten.csv.out iconv -f iso8859-15 -t utf-8 data/at/kidaten.csv.out -o data/at/kidaten.csv.utf8 ch.tar.bz2: ./mkdeinfo build-ch data/ch/bcbankenstamm.csv tmp.banks test -d ch || mkdir -p ch if test -f data/ch/aux.conf; then \ ./mkdeinfo update tmp.banks data/ch/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks ch tar cf ch.tar ch && bzip2 -9 ch.tar rm -rf tmp.banks $(ch_files): ch_files_tmp ch_files_tmp: ch.tar.bz2 test -d ch || mkdir -p ch bunzip2 -k -c $< | tar xmf - touch $@ de.tar.bz2: ./mkdeinfo build data/de/blz.csv data/de/fints_institute.csv tmp.banks test -d de || mkdir -p de if test -f data/de/aux.conf; then \ ./mkdeinfo update tmp.banks data/de/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks de tar cf de.tar de && bzip2 -9 de.tar rm -rf tmp.banks $(de_files): de_files_tmp de_files_tmp: de.tar.bz2 test -d de || mkdir -p de bunzip2 -k -c $< | tar xmf - touch $@ us.tar.bz2: ./mkdeinfo build-am data/us/fidata.UTF-8 us data/us/FedACHdir.txt tmp.banks test -d us || mkdir -p us if test -f data/us/aux.conf; then \ ./mkdeinfo update tmp.banks data/us/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks us tar cf us.tar us && bzip2 -9 us.tar rm -rf tmp.banks $(us_files): us_files_tmp us_files_tmp: us.tar.bz2 test -d us || mkdir -p us bunzip2 -k -c $< | tar xmf - touch $@ ca.tar.bz2: ./mkdeinfo build-am data/us/fidata.UTF-8 ca data/us/FedACHdir.txt tmp.banks test -d ca || mkdir -p ca if test -f data/ca/aux.conf; then \ ./mkdeinfo update tmp.banks data/ca/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks ca tar cf ca.tar ca && bzip2 -9 ca.tar rm -rf tmp.banks $(ca_files): ca_files_tmp ca_files_tmp: ca.tar.bz2 test -d ca || mkdir -p ca bunzip2 -k -c $< | tar xmf - touch $@ .INTERMEDIATE: at_files_tmp ch_files_tmp de_files_tmp us_files_tmp ca_files_tmp bankdata: $(at_files) $(ch_files) $(de_files) $(us_files) $(ca_files) all-local: bankdata dist-local: at.tar.bz2 ch.tar.bz2 de.tar.bz2 us.tar.bz2 ca.tar.bz2 # IS_WINDOWS sources: for f in $(libbankinfo_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/generic/hbci.conf0000644000175000017500000000165612364015477020506 00000000000000# if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="xNr" 2="bankId" 3="bankName" 4="location" 5="xRZ" 6="xOrganization" 7="hostName" 8="hostIp" 9="hbciVersion" 10="ddv" 11="rdh1" 12="rdh2" 13="rdh3" 14="rdh4" 15="rdh5" 16="rdh6" 17="rdh7" 18="rdh8" 19="rdh9" 20="rdh10" 21="pintanUrl" 22="pinTanVer" 23="xlastChangeDate" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/bcbankenstamm.conf0000644000175000017500000000176112364015477022403 00000000000000 fixedWidth="1" condense="1" # if 1 then a title line will be written containing the names of each # column title="0" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" width=2,5,4,5,6,5,1,8,1,1,1,15,60,35,35,10,35,18,18,5,2,12,14 # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="xBankGroup" 2="bankId" 3="xFilialId" 4="xNewBankId" 5="xSicNumber" 6="xMainBankCode" 7="xBcType" 8="xValidSince" 9="xUseSic" 10="xUseEuroSic" 11="xLanguage" # 1=DE, 2=FR, 3=IT 12="xShortName" 13="bankName" 14="street" 15="xPostBox" 16="zipCode" 17="location" 18="phone" 19="xFax" 20="xCountryPrefix" 21="country" # ISO 3166 22="xPostalAccount" 23="bic" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/fedachdir.conf0000644000175000017500000000173112364015477021504 00000000000000 fixedWidth="1" condense="1" # if 1 then a title line will be written containing the names of each # column title="0" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" width=9,1,9,1,6,9,36,36,20,2,5,4,3,3,4,1,1,5 # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="bankId" 2="xOfficeCode" 3="xFrbCode" 4="recordType" # 0: Federal Reserve Bank, 1=routing, 2=new routing 5="xChangeDate" 6="xNewBankId" 7="bankName" 8="street" 9="location" 10="region" # state code 11="xZipCode" 12="xZipExt" # zip code extension 13="xPhoneAreaCode" 14="xPhonePrefix" 15="xPhoneSuffix" 16="xStatus" 17="xViewCode" 18="xFiller" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/Makefile.am0000644000175000017500000001021512364015477020755 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST=\ dbb.conf hbci.conf atblz.conf fedachdir.conf bcbankenstamm.conf \ kidaten.conf README at.tar.bz2 ch.tar.bz2 de.tar.bz2 us.tar.bz2 ca.tar.bz2 bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfodatadir = $(aqbanking_pkgdatadir)/bankinfo #DEFS += -DPLUGIN_DATADIR=\"$(bankinfodatadir)\" noinst_LTLIBRARIES=libbankinfo_generic.la noinst_HEADERS=\ generic_p.h \ generic_l.h libbankinfo_generic_la_SOURCES=generic.c libbankinfo_generic_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) libbankinfo_generic_la_LDFLAGS = $(STRIPALL) at_files=at/blz.idx at/bic.idx at/namloc.idx at/banks.data ch_files=ch/blz.idx ch/bic.idx ch/namloc.idx ch/banks.data de_files=de/blz.idx de/bic.idx de/namloc.idx de/banks.data us_files=us/blz.idx us/bic.idx us/namloc.idx us/banks.data ca_files=ca/blz.idx ca/bic.idx ca/namloc.idx ca/banks.data atbankdatadir = $(bankinfodatadir)/at atbankdata_DATA = $(at_files) debankdatadir = $(bankinfodatadir)/de debankdata_DATA = $(de_files) chbankdatadir = $(bankinfodatadir)/ch chbankdata_DATA = $(ch_files) usbankdatadir = $(bankinfodatadir)/us usbankdata_DATA = $(us_files) cabankdatadir = $(bankinfodatadir)/ca cabankdata_DATA = $(ca_files) at.tar.bz2: ./mkdeinfo build-at data/at/kidaten.csv.utf8 tmp.banks test -d at || mkdir -p at if test -f data/at/aux.conf; then \ ./mkdeinfo update tmp.banks data/at/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks at tar cf at.tar at && bzip2 -9 at.tar rm -rf tmp.banks $(at_files): at_files_tmp at_files_tmp: at.tar.bz2 test -d at || mkdir -p at bunzip2 -k -c $< | tar xmf - touch $@ at-daten: data/at/kidaten.csv $(SED) s/\"//g data/at/kidaten.csv.out iconv -f iso8859-15 -t utf-8 data/at/kidaten.csv.out -o data/at/kidaten.csv.utf8 ch.tar.bz2: ./mkdeinfo build-ch data/ch/bcbankenstamm.csv tmp.banks test -d ch || mkdir -p ch if test -f data/ch/aux.conf; then \ ./mkdeinfo update tmp.banks data/ch/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks ch tar cf ch.tar ch && bzip2 -9 ch.tar rm -rf tmp.banks $(ch_files): ch_files_tmp ch_files_tmp: ch.tar.bz2 test -d ch || mkdir -p ch bunzip2 -k -c $< | tar xmf - touch $@ de.tar.bz2: ./mkdeinfo build data/de/blz.csv data/de/fints_institute.csv tmp.banks test -d de || mkdir -p de if test -f data/de/aux.conf; then \ ./mkdeinfo update tmp.banks data/de/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks de tar cf de.tar de && bzip2 -9 de.tar rm -rf tmp.banks $(de_files): de_files_tmp de_files_tmp: de.tar.bz2 test -d de || mkdir -p de bunzip2 -k -c $< | tar xmf - touch $@ us.tar.bz2: ./mkdeinfo build-am data/us/fidata.UTF-8 us data/us/FedACHdir.txt tmp.banks test -d us || mkdir -p us if test -f data/us/aux.conf; then \ ./mkdeinfo update tmp.banks data/us/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks us tar cf us.tar us && bzip2 -9 us.tar rm -rf tmp.banks $(us_files): us_files_tmp us_files_tmp: us.tar.bz2 test -d us || mkdir -p us bunzip2 -k -c $< | tar xmf - touch $@ ca.tar.bz2: ./mkdeinfo build-am data/us/fidata.UTF-8 ca data/us/FedACHdir.txt tmp.banks test -d ca || mkdir -p ca if test -f data/ca/aux.conf; then \ ./mkdeinfo update tmp.banks data/ca/aux.conf tmp.banks; \ fi ./mkdeinfo install tmp.banks ca tar cf ca.tar ca && bzip2 -9 ca.tar rm -rf tmp.banks $(ca_files): ca_files_tmp ca_files_tmp: ca.tar.bz2 test -d ca || mkdir -p ca bunzip2 -k -c $< | tar xmf - touch $@ .INTERMEDIATE: at_files_tmp ch_files_tmp de_files_tmp us_files_tmp ca_files_tmp bankdata: $(at_files) $(ch_files) $(de_files) $(us_files) $(ca_files) all-local: bankdata dist-local: at.tar.bz2 ch.tar.bz2 de.tar.bz2 us.tar.bz2 ca.tar.bz2 CLEANFILES = $(at_files) $(ch_files) $(de_files) $(ca_files) $(us_files) if IS_WINDOWS # Doesn't link on windows; too lazy to fix this for now. noinst_PROGRAMS= else noinst_PROGRAMS=mkdeinfo mkdeinfo_SOURCES=mkdeinfo.c mkdeinfo_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) endif # IS_WINDOWS sources: for f in $(libbankinfo_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/generic/generic_p.h0000644000175000017500000000701412364015477021030 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_GENERIC_P_H #define AQBANKING_BANKINFO_GENERIC_P_H #include "generic_l.h" typedef struct AB_BANKINFO_PLUGIN_GENERIC AB_BANKINFO_PLUGIN_GENERIC; struct AB_BANKINFO_PLUGIN_GENERIC { AB_BANKING *banking; char *country; char *dataDir; }; void GWENHYWFAR_CB AB_BankInfoPluginGENERIC_FreeData(void *bp, void *p); AB_BANKINFO *AB_BankInfoPluginGENERIC_GetBankInfo(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId); AB_BANKINFO *AB_BankInfoPluginGENERIC__SearchbyCode(AB_BANKINFO_PLUGIN *bip, const char *bankId); int AB_BankInfoPluginGENERIC_SearchbyTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl); void AB_BankInfoPluginGENERIC__GetDataDir(AB_BANKINFO_PLUGIN *bip, GWEN_BUFFER *pbuf); AB_BANKINFO *AB_BankInfoPluginGENERIC__ReadBankInfo(AB_BANKINFO_PLUGIN *bip, const char *num); int AB_BankInfoPluginGENERIC__AddById(AB_BANKINFO_PLUGIN *bip, const char *bankId, AB_BANKINFO_LIST2 *bl); int AB_BankInfoPluginGENERIC__AddByBic(AB_BANKINFO_PLUGIN *bip, const char *bic, AB_BANKINFO_LIST2 *bl); int AB_BankInfoPluginGENERIC__AddByNameAndLoc(AB_BANKINFO_PLUGIN *bip, const char *name, const char *loc, AB_BANKINFO_LIST2 *bl); int AB_BankInfoPluginGENERIC__CmpTemplate(AB_BANKINFO *bi, const AB_BANKINFO *tbi, uint32_t flags); int AB_BankInfoPluginGENERIC_AddByTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl, uint32_t flags); #define AB_BANKINFO_GENERIC__FLAGS_COUNTRY 0x00000001 #define AB_BANKINFO_GENERIC__FLAGS_BRANCHID 0x00000002 #define AB_BANKINFO_GENERIC__FLAGS_BANKID 0x00000004 #define AB_BANKINFO_GENERIC__FLAGS_BIC 0x00000008 #define AB_BANKINFO_GENERIC__FLAGS_BANKNAME 0x00000010 #define AB_BANKINFO_GENERIC__FLAGS_LOCATION 0x00000020 #define AB_BANKINFO_GENERIC__FLAGS_CITY AB_BANKINFO_GENERIC__FLAGS_LOCATION #define AB_BANKINFO_GENERIC__FLAGS_STREET 0x00000040 #define AB_BANKINFO_GENERIC__FLAGS_ZIPCODE 0x00000080 #define AB_BANKINFO_GENERIC__FLAGS_REGION 0x00000100 #define AB_BANKINFO_GENERIC__FLAGS_PHONE 0x00000200 #define AB_BANKINFO_GENERIC__FLAGS_FAX 0x00000400 #define AB_BANKINFO_GENERIC__FLAGS_EMAIL 0x00000800 #define AB_BANKINFO_GENERIC__FLAGS_WEBSITE 0x00001000 #endif /* AQBANKING_BANKINFO_GENERIC_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/generic/at.tar.bz20000644000175000017500000062662312364015477020551 00000000000000BZh91AY&SY?c»,†üô°[gÿâ?ÿÿòÿÿú„b _>î)£ZÖö (é ¨@ª…TŠ¢¤BAB…A¥IJ  }]Uö²ktÛ{kšï·>¨(SJûíÒ¾š„×ï¾w#¦Š˜íÃu¹UPE*¢¶ A}jÞÊ_¥4Ð4(až¼ÞÌ­ëàz èDÀ$ªªo»yÏ“§¯ vÐPH9[á$¨ Eèh¥ë™B€¡ …U •HU QîÀò!*ªBܨbˆ"õc®MC@DWt&6ùõZlÀmeH(ªRª[UEWœyï•^’w·»Š£-îT—­¸–h}€ŽöÓ#=9:ëVuöóÞív鵺+QÑÌ`<žÞíÝ¥;¸tº0• RvØ5B€   $ÜÂMì ö³kMbŠŠ‘ U"l =-²-Î胶 ZÀ €Fëp¤—¶zÊ J¡@ °ôèت—lHŠI€`%­³$©R‚@$Ù”@4Ò’:ÉIìÅ@€Pˆª©"ª© °*”çÔ"¾ €PUmuXVϽºdðu·Ý»”FîæX:] é`‚n“h‘ôÕìÜU퀻Xà"ÚÒ6ŠÎ€èu±g@du‹ @ÝU€®ª:º€7`Å;R¨À ´àZmÂàÐ$-LQ4°ŽÉ€\fyð¶÷I¶ê»{™˜kŠo7}˜ i÷7a‡F[b´à9+PKZ"‘ð•c’¡à27¼íó€»o¨7:¾˜î»m·‘÷kxÝ”Ñ÷À ¶R½šDƒYw ²áà;£€G€&àÍlÝw½ÜÙÀèI@»gsVCN<:)«{$QÜIÏR=iš=Kt‡ÜÄ+àØ’ƒFR#ìêðÚúuy}óyіùjÅÛ“º}Àó—{]µiu{ž½V{ÝÞß,>‡½g_>퀴en:÷»Û½îÇ£¯yî7‘z5}jvø ¼©pï°nÂO“om/^Eô¡CY@¤BÄUðy÷½®çÜ0¶{¶ÆgLM½Ï§ž®®)J§³U±ºÐ­¸´ëÀôÐ:î %w7U%U½7lGaaœœ´ºï¾t{î}Ž»ï]s>Ÿ>ú·ÞDîçmð-Ö¸vÚ‡v6¯nªûž÷¬Ô bÚÕWÛ—hÐ ×G½Ý˜+P¨°ôÛÝÛd: 5ªvÌ®Âì)ªÕF2S纞(P-ÌYvÃ×§C=Q½ypv‘Ç4íP튥°5u©QU… ûßwuyÓÌß-ÐÒRšËm+¦•€S³AÏ0zíî0MYÝŒlçrÅOès|à8õb.»µRç=ÜR÷»švÌ®víÛu]é>@mlä8ç@=ÇÚR©3ï¶÷¶¹ñ{ëÇwwG72ן@÷í¾òÐ é•Uç·QÖÍ/nµ]jîÂÜåkÑ誴*¤cØŒE)‚¤è5¬ëUM[·XHjzHDA Ð$õ0¤ýÓDO)²4#ÔhdB P"i¢š™úTÚ‡¡©è™¦hÓ@h”Hˆ ˜š ‰êŸ©ê~© ¤ÑÈb0ŒÄz¥! ªj°ËeQŸù” ÜÑ»K!GÁü»V õÈ¿˜§·{®ÊFek\I§‡Kß¼;^êUäj=jzxûv]¨Ì¦qZâ×é¸ñí™9sçåxI;‘Òìq"™DQ2€ …?öÍ–³ó×fB¹‘RJrDòu„ò§Ör‡©²á•Åoÿç,¹‘óø|¹@¹OÁE¢^À$š#ß1”Oµ¯þgÃAϽtvxÇÖí˜&M¼}òv%ñóÊäõÄðÁÂ=`ÔõžL{Ïx2zþÉZK·åE`¤„ ìÓ{@§ÕÐ]¡PÑ I#'ìã ^ÉvD5fZO¬Ç$tûs¿$CÙÇå¿ Dªêɘ°0x‰?ažÝŒ7ˆœ*Âë& ékú5úÃ@1O„’WâR¤!ÿÌŽž£yoAŸ*†Õ«ã|s†1erÔ;’€ña¡`€¿·ÌÞ²ÛF²;Šš)¹wÓ¦±D>ˆ…ÚÊÁk"=˜ `@O=C‰#„þÉ´ÿMDýâG÷>½¡òZœõdCë>Ó‡fon÷Åä ÃVtF¸ÆjvÉìÑ Z†FV<¼Çþâ$ÑÚVHG¸ Ó €˜ñ}z?¦½OøfÊú—òSý9ýÑŸðeÿ?^µý {?}ÿFMß_5Ȥýš§ˆ ÉRŸ_¸ç«¡î=9¸óM·š}XZ߯±„@–ûµRÃ¥ ow\'~Þ~¸£ëmúEð¤LÎ?ŸðD÷¥üÍÿ·ßõ¯í#^Wò‘ëÁŸ¦ó_ÖñùJ“âRÏØy ÿwëªÓ¾µMí•ïcôë]’ÆOlÒÏÉ_é_Û?‚½?­¿§öèznÛ🟿Ҽöú[bÞYé>}DIŸáe‹Ó•%#íëGÖc?2¢ŸËÉ m©oÁÐ 25]£]þžf©ŸRä4xGÇÒþÿ“øÙFOþ,$züÞsøçéjÚ³ú/ª§=þ?,ÿ/ëòîÇžpþ‡òéèyù¤{O×ÓVœ<Ɔ¼åM ÿélyàôƒÃù#çNý8÷ö-ª0Ï®Ì.ðøùkÝ6>’þ¸¼Ç"•çÚ»îì?>Yyû•O›ÂüÜpü™AV†!¾“õm{#ÏwÏÞ“'é=½íÙ§¿âÞˆý&-Ï®þÖûï-óN„ç¯?O1úDý·~@¼9iüSëÏÒÈ@·þz÷hŠz_ìU§ŸU"¿­Öþüü]‚ûÿ+ÇüTaÂbß7á-ôµÂ7«8S|\yš úÜO棋î±ñ¿>_¯oùt§ýþ¨4Ãá/û„ :yè,üÜWÂŒ=üa-ÒÍ¿àGÿ½T`ü«ã1ë÷Ìýgø™k¡ý“ߤÔ!·×Üÿ?þ‰Qéã±?´¯ðÈÚ}|+²?o\b䃛üùuäƒôûúk§ÏÚ]Òþ~ùÂdsŸt~Öþ¨mMÆòaúþâþ}O~ÿ?¤cñ<õvÕ¾~×a¤)û¿\?† ŸÒ?8cl…«úAé¿AÿOî8YÏ}úoïÆ*ÉgDtoÐ~Sôµ8‡>³Š§ù¿ðŸg÷·þíV< î)Û! ÑOÂQ§Äýï*ûùøówÌŽ7×y©ÒDþY÷Z÷øÖ,sfÏÁ¸§¥õQÏò°^v÷þYoážE}]}«n •Súì*~7|[d‰âàµQ'4ªeþó¡ö[ìó0„\ŒÝ²D4t†‡™ŽGš¹Ð_ˆ\Qý¯y6ÊãgkÝOËÿu !‘XOòx”¡kU¿©Ãââ+e7ÙlWûQ|UP/Öø¡ÿ „ð%6PC]^CÇõêXý>mŸõ°D˜iù'ÕF¡k_àÁ¿=ýnðÈSŸÊÛÊJ R_÷:ÅÚtɺ ¦s…¶7sú5?VN¦sý‰ËgÃÕٽ㗨ôß\26°¥£euJã럯 /Õ¾9_å¿ÇœùÇ»¶8‡ÛÃYüuQož¼ÓÏÊ×¾]CþÔ²ø©ÿFz3“hožáÞ;‹r~¿K+[§_iÖOÓû5ú²V¿¡´‘nIúÔµÞDkãu=ýÒ5¯×1ícëgŠs_¯Sõ‡©¤w¼hG̬*nrÿ·á´}ãô¿îe»ç=9ûûoÖ;nçÚáˆM®Âc6¼§>¢²ƒèþ_øþ1Çý*‡OcíAóðß§7øa6Y½{,ÒŸYu_Ö·0ˆ+øSå²Ãó–ÎÜ”ù|þ¹|ÿËe“¾ÅïgÑ9üSùµþ|ÚT[×î;g®ªª£éÍ(ÿçü%2¨ž“ñʯ1îß7À쨄6|úuüCŸíùö¿IIÿ_âúñÑvSHQþêÏïLøOâkQè.]1éýžÙ0ƒ×kü|WÇ™ ùî ÷6?L=U¯ëŠSýžsÙïôQ!Èþ¦Ç„GKªý]±ÚÝÔý0þÃIoö·ðþŸuüþµ« M÷U•_Ù%¾³ì»o_®ð2+Ïíü@þ¿¨ŸçéÖè8³ûÆYP½¿Å¿Oßóýé‘ûÁæÏ÷W½þ»éþÿÛû`g{„ýÿÇxý¿Ãçîsøÿ3D£¥Sø× ñs¦këÓÃøæ÷÷Ÿã·ã ¿¿UÊ’Š?Žˆ óÏ«%7O€ÿ3OͼôžÓøª{"Ê'÷ÿ·oÞ/FMÿÇÕO–TúfÁ ÿÇùg(Pÿµ‹§TQAP·Â•¸2×ÿr^MN Ý,O z ³Pç´¬[Ø):¢m%´ª ñð„­Bª28t¤“¤fGÿLülŸegæZoW“¢¬(’$ŠnÓQ»Y&ð¨ºÓ+µt"!D’ö${(ç‘~â°S|^ÌJ"öðF B¬éúì‡ô=xÃôŒœfÔ(]Ä-â <$$ü¹(d>Ïz!°ô^ŒÉw‹Ä0w°R˜³3g|»ú¨º§ÛÀÛØt /¬éЛ©èàáñÔ«aœ#ÍŽGŹ©L£Ã% ‘tà4öItèt|2=ËŠ£†‹B ‰h¬/ððÚΠ˜N"Aå.À÷öõýMÈ4êNÑ™”kwug‹‚ï9ÊŒerfÏèö÷§ÿ>¯­yúsTT.‹z5ÕKO×Z±•AáÆÑ i¶c?𖉵Óû½ãÞ…~ã.ƒïúâËDOƒÃû¿òB…§Çµ/ìóm ÿAqsîÖ çÜÀþôý0œªR5ziöß·›ûЇµ•–âJW)_-tºÿµï¶CôZÿÙí¿Õ¿iý?É­;8Ÿ‹Ï•2Þ¡ŒEÉ#ú ¿ö0CÕü°sŒGáï.©öÇõû}ùßç¬i«%ºáëü“ë·šù@M) h>*P¯0¨F¥JgmÆô¥Wl*IÖÒ"õ#ÚñÐ \„vùµq¨Âä+ƒu°WGµ5’ ³0>1ý‚œeâOíê\@ÇR©º,Ñåée˜CçõGÊ5 ûíí'X½pEH?ãÏË ãˆ 6VÁmp1OÅæ¬,çÐ`€ÑìØxÁßt”h†ÏÔ)ë® <ó`¿sÿU/*œô»u„Ó:“T/P`3³®Ûx+“oªª Ð¥D‹<Ø9WPÓïš5!Â%ˆ¿bBpH,¨zri¡®VH0*-4"°ì…’÷€ _òN™%H–pì©ü½@/Í[.¸ÕEï‚íáa›€ž'ˆƒ­qš&"•Ñ5ƒKŽ’ir3k;JM«à¶míð{DOˆE€ X[§ªSò;L2 ¬ÎÌòŠ"´)Ffÿ"‹6n½Õ®¢’}ˆA% ÖP9ˆ¯OŽÚ¨ô#¯Ú]L °ÓÁŸx†‡‘¸\õoF‹€HCTD!ðäêNóL €è6£„1›;¢ïA4'bA£=@ ó%çùTžžM¬öv^‡£×<_ ³Ú `…j¼Œ¨¤“„ØZ‹"Ü=+M¾EX^§Ö†}Z­<õÌø‰ðj?7ðbJË O1’Wg‰1‘ìêRÈvZ¡`ü4жzf¿´°/CÕ>¨FÒ°—Œå¡½*™å½ÆŸÝ‘#‚c¯kÆ” héýÔRx°õ.‹’_ÆÜïLv|yq„)Ò òBÓ)mER©VU&ÄEtðÂä‚]#Ñóòü0/µóÿÙ(ÝOú Oû\/´!hH§­å™þ}¾EV$_ïo}¦y1¼‰bAïUŸ”±aðÇyzŒ‚çCéFPÔ}•ôÒÔCf ÿÑBßñU½·Q Ž¹¡,¾5>„P¸ˆ¢éèh³Ñí4è”[~|My.8:“Q¬yL€Cºé!ËË“H#¿lŽ.]9ú hû…Ãßyæ5Þ«Àº¹}‘V ^µÖÆí÷Ž$Žü|}Ë…,€ISKn›Œªx $_iì̽±žúí=oqÁ»zå´Ð kÃs_æfñ«‘ÂD: æÁì0ÍÇ|‰°ÉM.Ê¡(—DÁ]sଣӧ}×]Vä´)^¢òoïε!|ŸFÁ/'ú¦Öxù,¿cÈl-¤ü÷ºFßÓî†DóŽ<‡ÏË’" |A7QY2MÈ$Wnå RQ¶ì&ÃgÀ`ŠíPÐXï¿Bd©pQ-2(a ÊÅ×ÈÖåEgÊ {(—faÖ ÞS&—3ODŠÑÏÖ•™ÕÕ™zÈ,IñAC[©§¦Ž£ÒcwA†ÌøµSè®ùä(O蟩Ñ®F[ø û¡D‰*=ðãz¯ÚÖÑ·çãwQ€í’0q…‰IÓq½ýçp'š@‡A ŸžuïHÒùÇ_†Ÿï–Ö´ ÔYQ*(@‡ úH5F\"dŠ×ómùõítOuÝù¾FZ"SîÜ€zÈ.¥<´"ý°H72²<-¹±a÷N"sP[œž}¨¨Œ÷:­Ù)DdÀVƒä\ ½kµqR–Èõ:6—´œ"mý0ñ>`R=|'â¶t<!ó±…vïìã°R‚¥”‰î™éiL8jlK³Ñ£|Hî«¢ú¯ ;ÁT[2q›e¾O®A¨$tÑ>•9ô:"#Ä GX3Ò­d¬ê¤'¨j¼O>'Ã%IÀm"®Jì…P§&œñénÚ‘×yMGÛ£­êÜ„mi10ç훃xk‚ÓCb哟,´Ž…†FR·Z-ÁýPƒº¡ž3u ù#€·Í<ˆûÙ-)ÏñЬdPæEj„þ,d ½CxÕ¡ø• Ä¢ýõpitÝrÌ«áQr@ÑvÂ: îÙèIUÂÕƒ…±û\…r]Ë;C- FRFI 3ph< Q/D\Váz$}‹1»`]̧Fe`«¤aʨù0ü"ç=hÙ þß ƇcZºÉ•¸çÖ,Êkv|ãN(KIÆ@lÁÃZb.º¯HÒ3­Å?Qr8,¸ûÚÍ/¸ËvÃJŽ£ „Í]Ffš]7–!Ðì~»U1¥¹r?™÷u©8~7,/JÙÿkÝõÕX­¾UȬ¾×ÈC—­uÙVºÃ*åÃ*XPÅ-¸ ç}ú#ëù ópaì$T5˜ÂvŽ‚“¹’HÁ]·Ek!µg[ZCÙG#Õ&pþó“çšù4¼ZðyÃÉrÔCC™à]5Tbü"jQÄ x£ûf™€9¬¼g>{ë €¯?žêY éºtðW’y±(A_µŒn úÕÒ A±H‰Ÿr3£Ø¢˜]Úr…º=®ž¥)ÛøÎ·Ç^΀Ý\ËeÐ-©jj&Ù²§%2k­D\¬wÿÏùÄ¿P^p {;„’„‚O(,©B¾˜8ÈúóØdαè3J §†€Ÿ6eicU„—'ÀÕ08D’…Ì~ÑàÅkHT¨Ât±¨Ä©(–9Û†z˜'!u1j©¹ð©L˜÷ã±<+Už]”ÿ Ó.ߘO²¦á Q.Ÿ„št(m”ßõÖñB¬†¢§ß²$¸I…ÉoŒòbOÊÅC»«y‹öÂ×s¶©ÈïëŽg^\©¥ ý4³ÔÕe›YH-3h‰²1½ ¦Uçߦ0Bªý ²pÓ›Q²_ø¯ cB\¡BUd©SrZ­E¾¨Œ,›N0“Rð€ç<çÖä1ŒW á‹úvÁÕ?eýʨ—J!VL!Hp¯*ÊXªaaG?ƒØH’A%³íÇ;è`¥ßâl y‰„ž—²í¥¿ïº@¥D$¡ÿcÖ¢žjû²±`Ÿ !¿¤È$`íì\~øéÜ6Çö0ë –lûTDÒ0¨ýv¨´í2³0ÎÇç¯fOìåE+$Ü{ø»l¦­NhM™y‚`ÕlB·â,l~æêòX! $ƒBQçišõEMG%€r¤1dÐ’ú뇳ق‹°(yŽþûæKP$"ß¹ìÖ&’?Ñ(ä Z2Ô²¾›ô+%)âÆÙ‡õD âSðhÀä‡ ?)ÅP]‰éÑDûÅ]ƒz1Ep) Ä(«y»oø­ ”ßÇ3:nœô['·°ÕTôf?†Å‚cSâãõß³Mé9¨Jl9@Ä`Bé?µªøü0&òÓ¯íùÿÜ0`À0ðkýßÅÚWþ_¿ãÔ›?ÿ£]íõÿ ¶_ûZ'úb·ù+‚ïœÿA6ìmïÕ›»4×i~Jˆ½uU­k‹aZgšÎ!*#tcv3lî³À®ÛXÓ^ûÁM9ÚÉÁ·83]Ž6§•igqVŠì¼¦ñ—v&£q;¹Â°æ±¾9Fjj³ˆ¶ciÁ«Õ,«<…ZÄñKß5!s!*Ø»*Œj×ÓÃENfóu6q}«Û=°lWήÊYn8­/ŽJcšY zŵm$X"´ÖÉÍZÚHS}·7™Æxp%ù‹Xç"»®,ÃXf¸!ë̸Ç'v­×QÇnn·¾g—(øQXÌhfÚknëÚä›gy˜¹Šß‰mM‹eçZ®f÷„ɽX´Õ¦&ëV»f¢Ù˜Ý¹ŠïÞóÌN¬5RÚæ³3Šñå²·³êY‚CªYïœò¼Mínø®1ËñÓPVóeœ²Õ1 Êj¸¦òºÌÖÍ DŶ6öΤ¢¾cn/½Ï6c<¶µ Ìé¡M_DÉ•‡5Ë0åµ}í÷«Îî/xÜ×™ƒk3¹šò¸œ4ãqÅÛäÕLs‘Î$¶x•Ô¦1‘®m*ÙÕñ«áfØžE·ËqâЊRö²-_'M¶ļÌfõÍc7}óYŽ ¾4¥­:ÆÅ£{;³Í×<®µKÛ“¨)¨Ö—+6lìê·À{ÄÚÊ2›ln¯µ”¶-¾]ï ª7¥r…ì¹¶Crð¤ÔºÁÖ+·]e6ðƒ•ä ›e4«QiÄåwg[©Î-{™À¶óƒ˜{êùÍö™³#>4Üæg' ™YÊ._“y«àŠÛ˜UÕ¦WY¿1“€™Ãs‹Ä‹œ£[nÅÌİv´–:l^ÚE‡eÓ]]qdtÚ#]5‡6Í1•Œß‡ ËD^ø¾-h‘Ìb9/§ÎS„‡-˜\´3*‹ÄˆŠºË`>öàµóe¼ayƒP‚öªŠ6ökfvÙmNùŒâRb#H¬A‰–³.rëŒi[9[D¾ø–ª^×µø÷Ko:®SiR÷—‹[0šà–æ l&– ²W•C\µÆ o•ÌÏ7XkÛø•MÚ§|Qp„¢*ܾ¡m;a]ºrQlSVœ§—|]òãwÖEàjÖÏúKîçe³Þ¤["Ãij‹”Öè&Ή-­cMlòÖ“¬µwlë(—H¿î1kêØ7»ç–åÕw|Ç7åx’·Ãj§Šæn˜Ò6oxT©´¶IS²š^"Ί4 ÆíÎgò´Æ·Hjg‹™wÔLrè·Ç4‰”ŒÚoÌÆ¹ƒ’èÒú»³¾ËÄ6&22™Kíy¥MMTey8ÛŽÂ5y]G/[Àœ#\¶Šîvvm&ÖÌ4BBi-[&ç(‹ÞA­_‚ø«;•Þq-|=ÒøÃŒšoE¯]–ÜêªùÆÛi9)|T­NQê—¾4õld:ß|ƒ‹ëu¨Q-S«"(tãg[ãfl¹4Ô1½{Öñ·Þ¢f²­ÍTâwm^úgiÑ«Ô0Ä´Ög‡7Žm[.ºžfÚ»K JÛ)¬6ß•B°kÅ®C3¶¶ÆtJs‘»¾ 8UÛN KÚâ3XؼZ¦ëâµ–*›äZ^vÖKÞé $ÙòãJø®I+59!«¶›"Z§*eÕòðÎ1›aáò¢ºÇ×ÁQ™HÒ·Cs'¶æ4…áÞö®ì¢ÕáX\WÆ%u›nû£¥ª˜ß–}ÕÝÛ9M„ÔœÍfo9ÞVÑ—}TÝf'‘­¹k_r3®ƒ]õiÎvûn[}r0é|^ª5q£:äcŠ&õLUXbïŠæ¶5¼×xŽ&xÊ–\8ëÃi‹½——aT61ÂûÃKÎó”®Õyß7]Ûu;Êñ%øŠöÖó†¾ÜÎñÍj7›6ÓXÜųˆ¸Ã&‡5cZîÓ¥½‡/±³šå-iUš‡Æï2ºt3¾i¦öUÚ%ø87®W–¤ Ôb¶åqÅ<Æ6ÚåË…^ì#5g{Û¦uTÀgÛrüEªЬq5œß³¦|‰Njõ³ 2 o7t;Âr]'GbbqŒß:G;ÂC51<Á® ¦³¥MΓÀ±7\Ùø7r~XÌmí•eÖ+†;”x±­ðcG ›<¾«ÌÕNî•v:¿Ibñ,¬­ÎC»ÜKfy­ÊZ°Ñ¤‡—‡Ã@D»em†¾c™Æõ e®é“lnóE´*sv8Þ·ËÜ.ªÈ¬—Z× ‹Á©Þ±ÁÞ-<¼¨æ[l ÃvÚÞW[µ«me¯¬ä³½ðӈˇ“f¸‰Ýs¥”µaÑ|7œ|Ýt0™¼Ý¹‡J¼B&Ý[;¸ÜXo$†ÒÛ8Ö×n/+¼YøÆ7«8†yÊ,—ÆóŠon‹dlfËYÀ…HŠß³VãÞ3ÅL+âØæ¬§Q3ÙsUeÝ÷W;¶eõ–µn¼™|3g÷FÎxdqÙ³b°Q|ˆ7ß,fVN-Š£o⮪šªçÝÐ%Œo©8m%ª™½µœjC79pÉÔW1]sV¤½lœ-•ÇNp]O7Œa¬xöz鯹F˜µ¡‘«œDHZ¹Ž27#&¶ŠÑ1æ¯XQ³gÕ£8š«-yƒ¼Jéj\Ô±f]UꩵAዌTrÄ67ŒmÄ c:ÛV0/Ì]"mvÚ=¹w­ÆS:äŽcy´½n9ÍnEÌàVÇ3iâóu¾³^4¾â8šgi{ó,µÉº åŽrŒ"½ÍÆMŠÌsgK¬s:u{ׂüΦñ\Y*øÇ%H‚ãZ·4œ*2­šÂXp¬]JËX®-ÌÊòëQ¼ÆW2mEß“ƒ}£Öé”®ùÇK´»~ñë£ÞsÏoídÜ«ÝñpmªñùɨM^W|®°4Îû˜­¢#!&7©d‡Êïþëæû¿j÷<™\ßh;žuw€‹y«æ»Òf_3·¥ág9æEí6Ê3¦_QÊÄ—­¤—@ÖHx®ùœo´ß<šÖè÷Ö[qyÆ2õËj±Â‰¾CÔZû–˜¹hÖKŒòõs8ÓÖ^4qËØ%j¹Üîó«iÁ¾ËCYç(úÎK½õÅÞë®2D^±Îò¹½Åó–z¥^õÕ±hYy¼V¥*Öå˜^—ß1½ãç:ÔâÖµàÞº‡G­ð‡› ©4dqº­› \ç¨Ì›ãkQ°§’•{”UJØFñ…¶÷¨»DÄFó}ëhÖ“8Êg‰ŠØëYž=Ô2gq´¬!ó±> §_¿Ý£ÿ ÷}vyÿÏë¿·ÿžoø½|ñ}Myøz_¿g×õ/j°Ò#׫¿v"tèÓ·6^¸çÿM½¼³çY¹›oLÉá*<5íå¿w‡N“³ݧgÑ¡ÿ‚y¤r=?Ìwè•|“ÿ®dqMQƒiçà·Zøú뻢ñº€%w]”Lš[/ot©È÷óÆ`¡ô¶Ãü³Þh|jô’_·]"ÇöúéCÚì;¸¹Y(Œ~ìõ2ˆŸ.jˆ¿\nÿOÛÝïÇ|ÿ¸9ÎMÌævë^rÄ>íæž³Ôõ9Sõ:Sâ> öß)+;ór~Ë­oE% •’eúÜχ8¾qÓ¶s÷Ó¡ÏÓϧ¥'+?ë¾³Ÿ(^¥Öpžs­¸¡*Ž Õ«åñG1ãJ –Nìä.ôiôw¼¡dQGHÃûÞ4Ûcå'3øfý©ë!ƒÆÔ™7éŽd?#=Iô­bŠü³'€"ŸñåŸÏXÎ÷ÝÓ¿J|C„ñ®}~¾SËã ùÓEX ÁEä³™S$]ß^r±~¯ÑxÅ}:dæÜB!$3ź-/ÍQu¥Ürþ´èŸ‹´Sëî‘QH+ß0õõJ“w {cAaæóZXz‡óú÷zÇÇ 2Á-D "~Ó"Ï0¨×k=– ”€¬vz$Û  ™®‹Ë@A]4-÷þÏžFDÆÅí‰üªëï®}pVPˆöU!~u.%#ÿÁ9aìˆ ê‘‘~“&_Ú”ú¿Ÿl~·×OQaϽV|x‡ž˜[ÇÊâ=#9í 5 !Oy;GgÄž ¿xÏðCøZ" ûûl3ZÅòû›ñ&š•û¾¦ŸôYñƒïzÈsù0Y‰@è‡*u8oжÚYRË—‚H³IÚ÷Æ÷$£,Ÿ?o–—‰.±‘Ó;hÃև柖ø¡}j(þá?oçy †½°t×zâ1g:çF¿íƒ‹ÒÇ:ëc§²jwsë¦Q™%ß®yöÇ®Ós7ŠÁÏÇ l•‡Ûô¯9 Á'|¾þŸ/Â8ïœñ­Òwx¹’TÑATDp„ =ªp€I½œQ£„ ~„6SF&j0Yqf=õo p (”ˆ!ˆ õ(®J¥÷xäÞYÉçËŸìÓñJN$@,ZJÂÌø>Ò"[\P0†\bLÙéqgaûþ?_ßü}?çË·‘þÝÛïû¾›5ã…ϧ¦ØýÏùZ»ÿöÕ¿íª¼ú§îlfÒ„îÂÔ? ýoðßórƒ˜ŠÿÇ]_ù¹W‹®âÂ`žžÍ"¡$>3ñ§ÖwêþRX‰žt‚H ;BQ‚MàÑOP½%ƒ†* €/åuï®Ò÷Û¯g\ÂÓ×WWZ¨".W3+ðM½WN=)•(ð&’I$°„—ãç|^D~-Ÿ‘˜XÎeå`T¥µ>¾ó‚ùýw-÷Î'Ш*U¥ˆ‹HûaDø%UdD±A¸Ç¨r2ÒÎh‘…aêa©A5(3èO<,/QS†dÑ¢ÕòÚåI÷Îå2|âäI/®ÝôRT~©=áÂ>8ÅJ"P¥%‚Ž¡bLŠPªP£V…DÔ³RÄ8¶F,UOŸWÎ^¦îþgßð)>œü­Ï>€ùH¢‚Š Z¤åºl¤•%“\é%—P©[A´eg~ÄOÁöûцŠ'šˆçŒPï #àåN>yŠÊ´ F§xzh–ˆp€³r)Å"¢&ÞODžéü^}úðÏ­CÁ”~põÈç™îïµÇ½ºžîó¨ÙNÚñ¿w'VdlY˜¢Ô]ˆ%²UD &¢’g`ˆ |´<%1Š»|+峩áMôùáÁÁ«dk›ûã¹hbà ‚¦LR1{¥¦õ3]•dñíŽlµcŸ<7œbœS» C¹Jdm§ÌQ?@pd}ÔÀ$ùP’ÂLG§CÌ»x>#ÕtO3y§»ŽãöÅGî¿7Žóäü¾.|þÖ»\qÁ£0¤f)g"FsË)sBo&MÃå&qt&Ó\®Á¬LpðþŸÀøq?€RÝS‡…£’B @C#)ÑU Gr ŸBˆy=¥ûÕ£úZ¼¸žñô%wµûð¢C„Q¥…)ß®O~»™²*\+ÔX}g1€A li”ZbüÏžu˜ð¡Ø÷c%ÀÑ–Œ§Ø03Š [úÅ£)J" jÀ´}ß|sçÕ4êªüì¾VøÐKC ðö;åà¾~/ŽÑ!Gde }©½|†@PAÆ¡$RšƒD8ïöõñID`l²Pâ  *%‘80 @—ÛÇÆì¤„üY´Œ ëa5—YÌJºGì!_Çãáƒiý“ÿȆ%Þ<ÇÚñ§L±ÇÓe³I,¿Ð'“Ü?SsœQùÙ #³§^Ú³ÿµ7ù]güžF¢ŽsZà“ß1(þ¾PÁ;*lÆ­ç ËbEŸìÁáOßgXVÍ€ŽQ2™›$ÁˆÊFa£ÊQÙÚ¿›ÿ‹d‰$r¿Õ[?9“9é’þÝ>èÿ·ß©# ÅÅù“ÞŸFÇæÝ#ýÙ}ÒGY<%z‘„˜’x°#šUѲý}Æíýb¿°ëëÓ·_þ†ßÆ3ËÛ}ë}ÒK?Fn¢+—-,¥«Y%aA$* (%¥k D¡M!ûŸúý>SÐäÈË®/P½žùçã‹ÓlÕÍöw}ôºqô÷÷å”1Q-%¤ÓLwl!èCÔöUB•P¿H`RE>cþšLå…À<ºù¦ÈsÛï5Ž÷ÏŸ©ª(¤Ùî¤ÂK”é©0Ðzšÿ‹9 il‹–ñU(<š0+\§K$È¢ªÉ%ª-E[FÑ´Xª>y_½¦¹éPÒ3‰9k©Ç}sàžDL$zç|rsMGf'£û›óñk™3œiÚ«jªªØª’¯SÈì(ª}uî¶õìyzëE­9QÅÑêvÐ:5ü0в^&`ÐObZ(F‘þ¿×uU+E$jŵL©6÷5ËJxÜÕÆ·®ºÉ±dŠMXÛQEf•(mJQA) IIK´Ð6 a‰S ”Ôd-‹¼Ä(j-¥¶ÉÙÿ[1Iø=ïÃ?'3·ÌáÏûg³WŽèúûrO§³UTce'ßàŒiIטþ òõƒð‘¬ñŽª¹ú a;Œì>z!ψš¢Ý¹¹<ñŽo÷Eê×ëqs1ŒÚq?¹&aùÅ’ª#’@ÑU†fdTB?ŠN@Ê""©\ÿ‘Ô "Œ+DR¡N¡üz«Ô¬WÔ†K ¨J*|· Â_K98aÉbqRãR ã( H²xð“"óPR,äÎu=pÅ&2ÙR OÌ2(TÃ!Y2°0jAHê䙂 ©Å1K2³’ˆ¥ä0ÁAKQ^wmsG$ŒIƒ²Œ)lP-ã@©Ì+ÖÇ—t]ßÝå5 R9w_éLËÙ0­€+J#ï’sŽOÄñ>›NèǸëˆñ÷ÐÞ8\ãϦ­©¬Ööp ô€{õ%Œrv³]Ž] Càt˜8Ù6i±©¦Xõ$yù|ô<æýÒb&ˆ¾8烂OµŸ†þ[h¦âi“¦Ïûç(¹ðÃl‰õàýžü×ÒcfÇÔ>Q òåðfšÕ¶Ë m—ûºêʎ”x"¦0ä&)–_/g>W[DaäïÇ}Š^r0 ùL§ÅLn1"b&ÊÝ6*{zbc&‡àÃçñ'õñwdèþ×Ó í?s‡Å§TŽÓžò4E‰IHû:ì÷1Œ½é‰¼è|ÝŸ‡ê¾ç ¾Zq/ËÕÉ=dO§RyÏ¿¿#3ã0é¯Õ¡.ÍõÕ…‰Ë•2Ò?tOˆçð?—îò^œ½­©³ÓóéßÝóçÿ-µÓO‡ ž³Éè›Ô÷v˜baj|lmµkª››Ñ¡úŽky¿S˱ôWbn¤IvÂui£OK PêÝ÷öuâÙ¤~•œòÃÁgj!*Öó{WHÆÀàÃÀv!Ÿ€•ƒ)k†,r“û„û¤2‡‹×Í”®Îc”Ά3‰œØ$‹ÌšêR+„ÁÅ>ºÎõZcmQÉ23ø+D}€éË€m!9„³¡ô>ojyÍ4ÓoÃd ÓŽÉtC{¦dtcÅü"GКì|œsº%ÌÁò=f žæ¯²Û&ÐlMxõÉCk©ì{´§¹ˆ<8ÓMÞµˆãOͰÞg YÌX™ôåßùçÍõy6±H¢Hˆ¢o#²sðOÒ¯ÔP=þº˜IÞ'Ã2L:ïÒ6'+á#Rh=1Ž Z ×ÉôÎ?->ˆ¦„_·°w:©Íö#»x¯œ<Ï™À1 p#ï)ênqN»¯úx>^ë;ï°|;v€{x|õžHÎ*š4U‚ÙP‹ë*>Òƒö…G§˜b(ÝoÖ¾ì??n_——sœß߯hpÕLÙØONÜøŠŸ·S_S{Ièzb“ ÑÛ¿;¿Ÿ]>JB ^ù*è"®wwâg‘{´ñ×ÇÁ°¼ÍÍÙŒy8'x~«·ú¹#—DHçØË~q†'I9c„šs䙑ý´xÈÆÀu¥?ìX†l2NCý!ê½a¡6$Šƒû"˜ð7E“D>\úÕ éœ#ør}žÏg~üQM<þ>ÜÚ%‘ãf$•öyH5C2Œ4: æè8ÉñóãŽØw499­ñÆo8!™™%´±¨R?Ïý]ñƒ3?®Øaú zÓýOÅú-/¤0cÊl–©¢xy:è-Åå¡4±Ø0ÞÓ· ã|•T>ÃËÛÇÚÖº>*n4¦ìj{ïÊáNïC@ x‡ë8CæbÊAç+¡4 Ñê¥@p8IÙÐüÈB‚ ˆb*`"«y™ñj#øçõßá‡á1ƒðŸ¼ÛüÊT^1eµ, ÉEÕJÊPûgk‰’¼\·5Ú °¿n®´!®p¡î¸Ø“û=v½¸ßåÛ^*dóßÏZô·ŽFO‚ݦ㮅 µöë˸Ãdš5çWI¶ R¥yu»‰6$^ú®"~î‡Ûn·mš4®ëß›¡“½MÁºÚ©ˆfdéŸËû¶jôví|ë«òÖé,‘ŒÂ…2 ¿I×¾éAh/ÂrðÃ"¨®ösÉ¡>[ÃÃ9«‚’’¤™±o:ê뺒J,ƒ%"%¯Ã]Mö¹%¤²lb£^×I¦ãÛuÝÍ&PÑÛãÊm1•{r²Pn]4B×±v–$”–O]Ú*¼6gJåY±’—ÅËÉÔöñxÆ’zs﫬ÊÄREÏÓË¿eÓWåùò®[DX©¬ÖiRùÝ_k].뢖¡š³ÚP½GQ–ƒb±ViŒ±¥{[¤¦¥D¯Ù{¼Ÿ•æ&”ö·M¦¤‹ß–ä£ù]ûᲉL¢ˆÚ`ÒÆ¦²é|^DH~t§uÚ–/®ûó›*[ïï¯"T‰ê\ ÊêR’be5Îi,Ÿ2éQdOÓ»iA‘%IRš“/ÕάjjA™d zWP¿ÖÀÌùKDO°JÙÇbhȨÌÈÍCe&’Ö%ë¸i)4Ƥ×Åǹn „ÄFlÙ¼]½ýywuä¦ A¢†ƒ`ÕýˆÁOÏçIá÷‚à*¤ETÖ¿·n!W©ÖD¥ ºnA,fo×µÙŠ~;¨µ&µ.m}÷}÷VùÕÊlK›¶ƒ!€‰M’¿Uä¶ó2~[¢Æ$’L¥,T†Rß–çã·*÷Ûõ_ª¯Ñ_Kájeéd¡8Œ´S uÀ±pnpÈO 'Ä…EHÆ0å£hpГf×]†½>•sÉÍÐ¥ó¹j °=ÎÁ£M¦Ñ}"å²ÐùÝ7µve"i‘^ź&½õç¾Ût½½¦b)šôèô’É—­”ÙeîÆ3×ÏwÈ£oDåàµqÐÃæMUQI¡ùó¤‹Ï_<±3Yé:å®n‡BmòÍ_~›NíǵÔn‰T%9 èCÇòzZ‹Ã{ìÙ€¡­ëZ ‘$Œì…7ž ªâê…a²Ô@÷mmÓ»p³\– dz /%uͼʽÏ-¯FXÅ4µß-')ÇWÙá?6|eCÂ3Bm‚•*_Ç—Žû¨l 4²(ŽìEôI%Å‚®èÀ€ÉÜCSKOvË…A¶píLŽ1ÂÛáÓô3öûjí‡ÓNL,ä¦jÒ鈎êjXaPxÐÒÆÖ ±,”‘f÷ÃŒ™$Äs’>¿ƒM§¢{g»Ó$jCßÓ$#ݯ6R”X™pjã4‹êÿëîÇùa£¿U0©î¯Z[=Õï­¾sw›DrÝM{x''BÁKlW˰u6ÛéƒÞÑ`œùý4€H²m$Jí¸¢ £Â¡"ð¼ñµñ".¾ž™vó:Îrøøt³ çäîЩæž0ãÀæÆö³ŠRªÂÙ–sã3‰–Ï×ù5k¥+ú?y”E6B¡)UU9O4Î~Üç>‰Âõ˜óîIƒÊÓý£_ñõ[~¯íF£â¿:ß/;òùLU•TÝé̘ÃK‹f­\iDA[ZјҸú#lÇ(ØLûVtÊâʵ}+7 ÌÂVµ£|kæek…ÓÅcŸ`ª^ïx*x‡E“›‘yGeˆ¤—ï[°ƒÜï6Õõ´ê÷±‘©M& ËYEPo×µ¿Û Fö”Íñ{Ó'ÔzÒ8Ô‹MB¾»—ûë,g¶U­¶òwæ{¸†”°ÀGÊp8ºh†›i%­¬Mt¸ÅÌ”ñ×fºÝŽÓQMo#qG'õ-ÅþÚåüP´Ï}rŸ.}·ì_¥1¹Ê9ÿÏÉÜ~1 ñÚÆ?9túGdg,º²'Ü[4íŽnÓâŸD{ÿ×ãÍþ ïÚóŰžV/¸j÷Ý÷ïïúµÞ“úÜžÌJŒ¹˜>WÓ…'ŽE‡‚†Àgä¡ìS¿gv<¸£{Î°ðJ{e4Ä S9¡‚ä8øw`âa'» àa丘f6JáTî"]ª;«16H–¸¸—B€‚I L¨ HÑf·# ¥(B¹‰DUKøãY›¥p0Ôgñëò—joØîÜyxON™Â~ÉÉë8Jã;OŸG§×“©|øàL´´JTý á(¯çb«LUý;¹» žuPrćh‡„>'åÇC0yï2Èž ^¦¡Áö‚¡ôö'E4 ÷ÚTD üCç`NÈÃF‚õ åG»f¡„ Üc9»¢ÿå[ÌÀµîr—H |Áé0Ý«$^ä ˆ¯‡ÁR> èp:G˜sa• Pä*î‡õîœëÖ*<|»(Q¡å62<¨vÙ€A4:½ã\OWÜ[=œð@èx420Ú"òECÛø ˆš"Sç:-m„¨šè(†;UHif9× q[ ŽÜaèÒ= ~ÿô³^(’¤m—îáÄ@W®rÕi$–LÄäDì8ôǼŠÖIði(5…d?®vhs" ‡çÈšQ">BL”1Æ9z¢Þ„w]}d„°mV(¸ÜJ:\zy §çå¤J]=Û U êª,^§£ †ßÖ|· `VBýmè40§ÜfÈBØd}ûÃXFצÆ. â&FȳPØ} óáû¼ÏÕÂõq¡¾†‡ Ä0`PÎ8ÃQÖE+7šØ 솪ýûÄ…×¥É]cÕê gç$0² "ò%ÀdjÈ#¢ÃägઠÕ8Ð,H÷k:àǺZ÷;H‚6?«`}êÙºÐe%– ÌEFl¡ö6µª~`l6kLøçJ/;Uô1×õ”$ý|Èü~9À+¯‡ã0Ño>¾¾¾M0!GÅmp—ÞžEh?…‘ü¿|À«®Æ^÷"ùGÊÍÅl ¯zÚ°¨!saa©øv%Ez+DO¡E³öÊU¯·Þþ㤛½ê ýh‘æMQ_ŠO z|Â%Vû\ JH')Ãxp¢ªf¡Gà>`„V„®á ÏVv.x3Óövéâ¤u®¬‚þ þ"ªôiÀWzò ?¤‹ ~r>…ÅPÐbácÁåúj Dõ*î-q:aìdV 3üM~óìhô-‡ý\I>½}A èÉ&;YÔ ÍüÖê4/m úÈÞãWúü9( ±ìTŽQ€ð}uÇ möâ¦(¡°²ÆîN¦Š%œ ‡+YKÖ­vÅîµÆu^æ/Y¯æu[Šê±‚S8mCú!WD[æZ-©u”vØÓC¼þ=Z G‰§nÄÁDÖÚ ìŸK%›G½uñÑç½êé½½ñÌÜÁÔ_w·£H™èMfpG˜d  ÷›Óy¼²qÖ/üüºÖ»"µý÷¬É9J‘f&Ã<ò|÷ü”X&p9E„ûsŸŸóÿ_T9þ=à ø˜œbz? P+Æ`‡ÃH %ø–ËIôoHŸ )!L…ˆ–!µ… ЙXaÿ<Þîò aÐâ9#.nŒÍ*dÔÖ7Ž‘´ÐÙ5äÓ’íVÒ+hÀÎfýI‡ho“ô{#J´† ƒÎX7e›÷, ^sÍsšg_*æ-Wq)k¤0llÝfffeÝÔÎNLF¹w€õtEÄÞTI‰çTdL½ÛÌĶï_uë7eÉû)ÜÆ@«€ïn÷°âaïuR‡}×Z¡îž–%±6)YŠÇÇ|¥Fqòî¶©Fì…·vûË–"pG…24 X†§;Î8Lð›ÀÝ¥çŽð¡ç¡óîññ)î}Ð5‰O‡^êyiÉÃøÓ2-€ú[â'¾o1g¾o1Ä YocÍ>´ï#ØH©h%Õ¾ãÃÉPY:Ö+jšCX›‹„ZB 0r)€á©Ðy}óާ7Ýž K–ÓÆz[íBôªÅã°aç¤ßjcáž´SÊ0|ækã7KJ¦Ú]gmãzouÞyÐËóÊyÖoC³¼žx8çâ[Þòq¦,¤Ð*I\™(’çx=,óÏxÁðÝ•ðÜ—Ãn(K玓ðÈO¤7‰êhM3óäÜydëŽ7]¥í{ì}óÔâÒÜ_m…âw6éì|7ºð"ÖH) ÍY†–L‘î¬Ý|ÍNNæ1â ,ók<¡¸ûÁuNL3Ïl¾4³˜†;[瘥´£Þ3yà%wqÃ1¼ÜÛÚ·šø÷Ç"Ñú7ð¸±- @fyA` ]Ó ™Ýœíy9,´Àå3©Ð .ÄÀR«GS½yCχ†gO~7~i^ïuoÛ©áyúîë íD;ÞèJw˜”;§ðó¼*z'cÝkK® wt1óç{ÓÅ€y}=ãy°€rN=§yõOK+’>öD™YP¨JjiJ7 ä'b! ÃÄîQ@d.0£B5Í0ž¤’du’}¤¢Ió↺Èš;ÌMhß&ßïþ÷ô¿ì¿]oú~Úþ–ökõ?ß¡áÑðéÛM¹%´¢ž„ìT¢Pÿ, Q¤òîþzÖõ+Î(q…`›{†ÜöX*ѯª»–vf̦&!®XjFÈlÕ…CŒH¬™˜ pÓݦëaŽä1„ÿ¾*²Q÷²(4‚ªKŸ4¹AâϤ‘d!}$–×@¹$èºô²çÄ9\†uÞY™S'º1ƒÎ-Ò’î[5Á[ÔŽ°@È©ÎÕy|¤#§ä.õúÄxòR„.\š½È‘8äѱ]ûAœ°AL‹¦ÈÇ·]Õ Ñê!®•nkjÈ«ÒÎP,Š5µÒ3pÛ.¥ gr1^V|ÿGãÁí´ùEô»J} Ó¤);v‰B¾YItÄ+~ÄXEÿÓð0¾)}¥ÄRB©I>%ÅPëÓ¾¯ÅP‚Çn5›.•UÄÁ ðñïÅ…_—éÚP2ø‹„ø\,ç+©²Š¨,øa’§"B»­X¥"Ÿm&h\B0š*¢9B>°ÙQ°…f& I’»aØXxôð&™#¨q£”²‹÷Ä…)Àñ#]Ǭ·k=Ëe_/;qò!T£oь٢Yüɱ¡êUûðÞVç4¿>Hé¾.‰@×ß ÈôÿÉ*}b£fòˆ|ÝT›ŸWL{‘êiXb¾ØšÌò†pƒw@ƉêD¼¯®"šg¿'*4Z•¦ÖÃÖB©ÚJX—…WH¶ &¿/dÌ¥„®œìDÄr(–®R¯( ZÙ‘Gwló‹ aQj¾;ð†7¯ëÁ„¯?t]¡þiöíùÖ¹¦$5i­ËÉp;YQ@ëD"¸a¨Q/õšº b‡ 2í„å PøKK sá(B5}^üs™]h®[ÇmÐYiψŸ„ªª“<£Ö†Ì$öþ†K†|7בÈ÷ÅÛgSr+§Ížd„FEJ>F`öÝÓÇ}£g £Áí0A–aï¡õ »ð0윚MGÉž@MÔU ;UùÊV bÀ°f>kËÆ‘îîDë· :=ÀÆJ(¸žÈÔ7Ø’ri4*JRô¥ù ÔX!¢Q™TAJ.o·h¥¨«voßûõõþ ýÁKÿ3/þc®jN¹OO‰. ý“»›zŒØ±‘£A<›;ÊzÎreLÀâœÄÑL-àÔ4ØP2“ÑBŠo„a›(L¦EêUA&vd“ˆ¬2]V‡‹†}ƒ‘ #.**ÉåêT ‘1U0ëF³eò^²NqÐ:èQªb755Bî/jõáM‰@˜ÍŒ‹¼‰Œª7O‰íéV®lHYß/nï0óõg&†>nMÔ@V©Nà‘%\8s;+rb(Ìš‡Ã[NõGvªeSô¢a¬¶K½ã­Ç‰ drÔ‡¸ä…·±ŠŠ1…-Œ“o|\ÉŽÇð7öú•Ðérc£âëÕ:T&N+ :R C3Sˆ€¦JõIDQºJªä°8ÑnHØPT<4'¼Š›·Ç±¯b¦ \O§µq[•[¤[¾æÆ“¸bÚ9"3¨Ô„£€àu”rAñ\åé{WóµM‘0*v¥nÁÜDMAÉ ¥SåÉÜSO*iR74s-ãC‹ÆíÃÊÙ6ó ÍÌ´kÜ׷ p^ÞÓèx̺U:ÃDšušÛÉlÖ*‡±kJ¡38§MQ¼'¥UXó;:#v._/3j«o_Ž#”ü¨Ø ü*÷u]%8µãbº˜Ì¢ž”ïoºæö)j&uñîži t¸«z3°/äNÔDÌEd+&¶"ï't¹‚Èå»é„Bm陨õ{Sk¥ºê._ªÇ§Î†˜Âžë ÝÎÝd¤ä…¥NO¾®Áá¾uÁ·‚®ÏU.(²ª Ýôò@Â÷ì¹²I‰äÎÍ÷VI²+HʤíÔìMh«C ¨¯“C¶›N/£Uà™žžKò§­Á|¼³Ö랸þwß1QÈOy°w8TÎÝ÷𑾼àÎá\~³3åß§Û~ƒê»÷¾ŸÏCÊ ùÑÜÜÛàOð¦ò{#ŸWüÖ³“ݪ2yÔ=Þ±+Z™kÚo¶™m/·ZöÏ- Ó`±—†-Úw¹½m/½Suaq^BÛYnæ”Äw®ri.Æ=YÌß߈VpQ²Ë!ØEÑøë½P§þÿEMjݬ®•ª‹ìÖÆÊ.cë'öâÎ__Ë¿$"UsRÖóÖÌ…'a÷½ÕœÖа7‹2»ûéTâ®¶Qsí[·ç‰>’Ú¨|‘»ÉuËjY+Žu±cG+7¾¶ÍœìÆŸ^°\œŒPO‘±O t`XE\<ÌÕA]wå l”ã]‰‰A wáðàü„t³a`¼Ã¶–ë©Öèµ9Hlâ^‹LLeƒ­lįûj£zS4 LÙFˆÊ2Œ²EQX§e+5DØÔÕÄebÊ–"#ZàÛðf.'0˜!µ8±iCSË劉Áåñúñm³Ò w/äS” ¤èuŽãäæÃË»Š-0›  Çv€¯I{|î²°'u’ON¶…Ѱž…J¼OÇj€Þ¦‹j(6¹A9·%á³µBŗ콩ØUâ‰Î.Xa㎹K¤`VÆG¡F&\ÉbšÕšVGÌ4b$Ýn˜Z05W™çMs¬„¹Îaî«8u !ACÁ†ì þÊàÁ±¼î2i›Ä!TÁÛP*^&—¨:X=F”—$1•:÷^ns9jÊ'Ñ~¥Tã†:ñ;Gš9ýõ×”ª7«yŽ[~[ MõJ`© …KÕW[ñɱë ùé1ï›]‚ÞYRq®g-ªÚ’3CQ!l“Û(M d/wr9ç(taõ?*DV\ûçSžjÑsýv{ë«\¹V²;[L9Âv‰/|¯•‹ÕEαjq„ Ä’K’.Þ×?œP‡Û¦ XÑJÐ`·´E†œ0sÕ1!é„`¢ô6#¤DDÁÙñ6è2¨&ä)¥Ns¾Q])3¦*EP3\ =(tÌ0±‰qY£^\%€Ì.âû¾?;Ãeåj+·,šJ÷‘÷V­r¾û«%äв ŽuB·ªNú‰ïÒ'l!¢[YsÒ‹>G×$ݲDV䎜˜»7ÆÜÔqÍX”žŽüë‰Ä oÄ y+«‡¦z˜2@ÚRsè‰zûOÈ€:vgKÈÇ»êF”M%n,ÍO0åafèÇ'Uw„T.UÑò”¹ tàu)š8ZimñËtG£êo°a¯·îf{¨ZøÙ2 săòð°†â¯Š8èÏZ‹>:4½ÑR§Â!ø>T%+•Á±ðv­‚ @¦–²6S‚Xsã­DhâÛm#•.¥ØÆŽ-êkzò-yL‘øoFD•;D—Üë›eMšVÔÞQª€)×UÍ¥ÍÐ ?š`?ÀÑY8«°»ùVööƒ%¬´ZíÄ  WMf!%Æ‚^wlU°l@m×4¬ š›Ü¸o±Ò{À@Ñ}düwgò‡M£‰à†QÅž%OFWou©¢:fˆ :»"ÈeÊn¦s +dK£Çïú¿î‡ù/ñoãök#úîäèZ¸;ee ‰»W®¯-(¸hÚÒ&`é8mÈD:Û©Uc#.uëhLÄEiR%@tdQ„¥¦êmläM›7DÎTKÉ—¨æ+Hͬ­Zˆ;3þ*w—¿½.B[ǩٻ!ÅAܘuTÊö¢efŒUdrraG"#o‘ò7ƒ“üE8è·:ëÉhºŒë¡26ªê…h©ZõĨrÙ˜ž9Z«“o½ W÷ÃWFŒÉÜ•=çÌo#æ]Ç(š·®{~H7Ö¾tÏ”Š{ĦÖÀ$@T¥(»’*yZ2˚ݚ€ /„¥ªç‹;|æÔPž-ûñ­d6JÂÍïÂÙCH·ë†´=²Á¯‰’ÂòTSƒ¹·:¬lŽßv­Ö8~rÏ!ï˜\­U[&ÊzMÂÀDÒa8þzÌl¾íiõÍ@ŒºlRã£87M´·ýŒÀ00èÿñÿ™ÂÄ“›îü£¦$}>7îÓLòËßöüóýpÏïÓòãåÛúþ¹åøûkîû~Ûñüæ ¯Ö§ð¿Ì–‚Xê@#ŒÉ¹éÙ‰µÍ±'«hÊ;$¾DI˜1‰:§˜ÔÀ–»g/º\@Êw«Õ eªÃ¸;¯þz¡7ucm¬ê¸SK/滄ï8o Ö48§# ­¬ˆ,d‘Bc»—™·o"]瘶ƒÃ¼]Ýíò.NÇlÉæg’1ÙÈy2„[ÍÈÄòï9—›“yf"/ƒ@iŽF¡U>¼ ‘˜î¬Å¡)Ìiµpê+!­â€¥°œ",´›ÊÓ¦MâȺ–8ë^èŒ@œ9 !ÄZŒ=µ—RL½ë‡"mÉj»ŠC)Ø\;1×(Eh¸ÐFI¶Yƒôw 8¸‚.Pǂ͘;²g$=¡f©æÅ¤XÆEºfQ Z¤&B ±™½¡FX%6 \Ès’ó/.@)Adæ!¤9 Ïøé~Ú{ÚûòñH¤ñê°'ˆr°‡ãë )ÞÓÎúÁñYë/×–ž†‹JL)¸O`¨AÞœ!$nö Ê’2¥<âcz€õq684r„K",¡I`ª)᪞!F  ’Á¶_§@ñXÌX%kRÛÎ>¾¼÷ͯxyÙS¼êg¯yå»­ ½WÑõö<Ù<+s‘ç®ÌŸ~íåªýlò/ZýlgÝtús§ˆQ=¢"l,[Úd–Ó@ɇbv§,DÁE¬9ÛÑj3W&e=K\»jh,ˆŠTè\9x,‚Ø[*}¦fÏ=µ½^ôÓ,­¬VKœÝÈjŒLó.AÓšÈ`ä÷²Žgšù·?~lo]ÌúKªy|NT>y±Sé=g•¾'<è‰õ¼…½;kbì[I.rÊ…VÝÔEÊ)1VÌ ›|¢.ÊCÓŒ|šXøn3/¡WH%5¥=ZªdP«™C š"% 4¢RÇé¤â¨ƒVï’á¤ÁU„Õå(@^:X`šV}PîiUYúv×<ßZ,u&Eq½.ˆÕnÅ>Ÿcø?yÄ~'{0{£?£Ýõ|7ú±¬ÑÍÁÕïi´üÌëmߟlM(µ’Þ·uȳ[ŠŠY£K#RÓ¼0­Ø\F@PöB‚¨õñn›4nËG&ô]dèÌ=¶‘ø´ëœc6œÄv=ÜÝyàkц£F¸òZpokËŸ óѨ&4GO ²|÷…fhíµëæ‘1<bS±Ùö,Ö6aâG's¨ñƒ¤è剆7ż?vOG-mÚyßàuÂÕÑ»v…ƽ1êч75ðÝàglyÆ,ÍŽÌ;uD"¿l$áz|Nä¢ —w3q¢Ÿ>‡-^N;.FZ¸NšÉÒ­bÉþÍžäDõ0¨(¡}¾ŠªˆþúPYþŸôÿPÿWö÷òÉlÅT%uóÿÅ)ûV~ÖÃZ35šÄ)GÞ‰¢4f&Ò4‹3ˆ:Òoi£@’L4ù<c¡Ú2§0à@rÃû)þï»þ¯È]üÓÿoú ¯ÏýfgþBßúÿ½üá;+þåæÿà ™®Ð=O/êìtŸë#Å4‡æsG]5>é'wYäi&ÔþCÇÉÎÛ¿oç9§yèžÇŽîò¹ÿ­_i`Ÿë;“ûž‰¬ôq>3¯öCˆÊö8hlNÌOÿä©ÚvâvœH÷á$~±‰¬k× á7)ý7“ªÃÝ ¤e„<ÿïWì‚sõ¾feHÞ‚xéÐm `~†—ûG8oÔDÑâÉÜûÝp_2Ç,Ûè@rìÈøLO‹UŸK Iö÷Ï‚C÷TIÊÈü?gÎü¹~9ü6èÅ0üÿÙ *¬:J£4½§çú Ð:ëÒŸõØ 8“¿gã5iÇLF#¬,y"¿‚»"óy˜qK¡þR.( ¯û+aÒ‡©®N º÷‰­>,“´vð½OvÓ”ÜRPx–xo¼óquœ²?¦üß kN¿_O–Ãþ^ž.î0þ½óÛAAóOnÞ"B8“ m=ÂOCüƒþ_æF}4gùMò?æÿ P?×/ýCIC ¢ÝšI[!¢‘ŽÊ7uŒßÇ@èsŸxð÷zâÙõ>N7?7˜Â“àOw&÷ ´›ÀÞSÛ¶›&ÍxnÓ‡üÎÄ‹II,Iùf8Jtu®fåÛåž:kóëõcÙÈüR0¤ÝÑăÍ:éÙÉ4hÚOêÎhÝ¿u‰ˆWlµðÑ«7œå™ÿO7ŒéüµÖ²x:zöL´;ë¤ÜʽûËõâx7ÞOktÍœ˜‚±‡š{ÞÓSÑ66ã”áÍŽQë'¨¶êwrwgÞÁÂó±º\|ƒÄÿÏñÞŽ@Å=f×O‘±÷‚e;¹àõ<ÀÓ§Ð:½º¿¿~•o ßC£¤`µ¯dÏG/œÎ×’É5ô•̧mSÜËwSYÓªvõ— ÔsÆÜº*9žŸ4þtNè-»çCg@‹–‘iËÁ®¢/úŽ@5W,Ì<˜™r<|ürÓ^ç7xI ŠÊ—£žNM“©´çØã¾e(×C4®®MzãFv‘þkÌœÚ&®#G oºe×djgÅ\ÐÜyIv禺cUaºZvºHäço\ìup’rN $ÖJã/Ïk;7ØrŽÒ+»œFÄ8g ¦¬¶Ò:F§w¯@yè=GhN·çv_…\—cÌnÜ÷<]x¢4 “›g‰Æ¬ÇdìÒI:»Å×;Xo9ÃF 0š²›7#¶¼Ë¤ÔÓ.G «'ÇMõçoñÚ'>cnl' SÍ:š7ðíŽ~œ¥ñ‡·W“»šo§žNþf¦²O˜3€0|8]½,ßÏ?¨¬Ä3¸w; Hë³Mºa¥â¹ZÕχ&Óü2霆dM¢4o¿sÇ“,]v÷S9²L(:Çy²vš½™fùhðeL¹«¾²dö÷ÍtåÃhæÛêš~Ÿ¼xqÈqÜð̚ǂy²ñœ932™–q38Hêÿ FŽ'Y¼ß]ÓÖŸñná«“í¾š:±á¼`÷tCYÍÀÖuÎIÝ0e5šò‹mÉ´ñ·°ZÊk¹ÿ>Í&¥Âj79y8ä ù›9î,¯ã…§PDJs$Gé,"ß>c?”¹!‹ µþá·P™ƒD?·‡V®AúÝym dÈ|¶õ ÀDD“ú†ù6ìüI;É®O%ã¹Ra4eç§Ök„¯kÚå¯Gh\Zï†CI“ŽêIðßÏætÚvô6ŽÌuŽ¿ió‘&yRhØbIèG1£‚C¸MßA¾›Yªƒÿ€#&¾é¶dä?àêtôkÞœ’š“œìÒüp¶nb8ÙšÀuÿ ÐSï§ûmüÆö¨¨, ‚(   «õ€¢°mPµ«JÖ;çMªô±žÚ?ß®¼EйÂn?ÌM|W0?Ëßü|ØÇ‡¿úñçükÏÕØXçÿŸÖŸÝFþdõ¿Òm™ô~Ž¿õÎ>“_òÀŸ”ü®þíß±l{¿æÔüæËOó„j¦Žþ øºþh*>¤,}㉻/fÞrøüŸÝ~v|_®VS"™?ÖÓ´™¶/ëÖÙ§Áé“9¨C$cä¯Í'm)ïNúo¿¬G’²¿•¹öªg€l©-D{¬HøR$öõÁŠI¥‡JÆ:Bu¿ë=#>üy…ÔøÊð€í"žZ>ïü&aîü¢Å$ݽ’úàÂD~³r„•F’ŠÙs,¢W7ñÃüß3\Ùø°êɽ塎²YÒIŽv`Að²@-A ƒ÷ÏÁ¹)Vü~¿o—Ôúüzô5²iã«34ë“A¾šã¸öTú Þ³åãŽs·A¥Gó¦CÓàSþ¤çøïïŸÛ/OãàþŸYzßëܰhþµÿŸË~ÿ¸/Íš'÷Èû")öiôôæ}=ïx°ªûy ž|ÐßÀVCw^ì>½¿Ï»zú¬aG}£#™ûØ´sŸ;çåDzøçß!ítx•äÙ¿Ò.ÒoRkÝ?$õåÌGyŒ93ùçö~ÿ ñîÿ_ªz”s8GlC(‚³Î¸¤5Õº»¯é\·ÐpÝÝÝjuË—.qëPW!c˜I’´C’bdÐEË‚I‰F¬ÃS´Cþ&‡$Ì*VTV%͸ŠhK¥Èˆ«ˆ1˜# Ì1ƒÉ}¿Ž‰ˆiAê;»«”Hú^7ß̹,0@òTf[¿ë§m¥e"VÚÛ (ÏðB ƒ”O÷Å£ûc[œ•¦ƒÃðºÀÓøƒ†™2¢„‡îƒEKA©yoÊê!±ŠyÝ*/Ñ_ÜoG«¬ i×nn¦¹¤„æ®QMØWËÊnT¾^]æÝJ ¡7Wn‹—tuu(9ŒEvÚî;ºw+¥»i)-ÓbºU!»“¹.àÞ`Ä ‰ÁjC,$Él¿Y øª#„C *„‰L÷«»Ã¶ÝÀí¨äT-Ü.ÛŽë©]6át®uܺE™]ÝÍng%9ÎuÄ7J)Ý·#¹Ì˜(wmçuFðT“hZÉ26¢°TDAaÅ«C0ÃÉúª¢c"ª©J‰‰º=BÆ,YJ6ÛXÛh¢…YxuÚëº#sn+Ý7St“mÒrd©.F°s¤¨#R¶5A ÚÚJPµB§C’2wkÖ­çŒ$—ˆ.–ÒÚÒ°PTYhÚUm±`–ª…µA´OøÐÐ"±Á°ZNîW3wª×éo= TÍm/NîÝwRü^]´¦HEåÓ£nÂÅGusréN»¤ºY6R¡›k„¤a-þ+yyܩκ`€(¶¶UþÑ™0þMs›¨Œ•ÍSlîèÃn›Λó·kª1cÓnÁ^®W]E ,änn˜ ¹ÓC¸¶ÑmªbYMjV#Z‹b‡8­†¹ÙÉ6äPdˆ…U°U´¥¥´¥¶Ú"Ùk†JK¤˜6éd¸k–ì×*äÕ"¸z^<ŕ͸[s&°?â!N?ðù ™•"‚²DYÒ­Û¦·s¤¹’»»­$ÒMk(®wuÝÑÄŠ”VÚT²e~§!¤€¬X4’5ÎI%Ý×»Íw“ ¥l}°©™* AX%´ Ë K`ì®FÙ'vºÒ)J³ï1d)qd¢edj°D*øè¦šYJ…‰(–ñÝÌnW9¢å¢Ü¹r5Á“QZ°ƒqšóÅZS QµYE‰—üÜ“4­¢- (É!BÙEZ'Ñ÷8ÐSñ ÂbŠV6ä•SXÙ2"¸K¡Œ² š HÂÏx.&Km¼ë–½ç¹^0Ô/R.õ÷'ŽWR8‡M%ºXƒnºUw¦(^ºåæLEÛ©,d˜[¦æÓ w×xרèŒx&Ó|ãŒáUQ +¸¸Žë%B Åñx†9 çDY#uÉÝK'g«›É&Äé:á—wqÒE]ºëŽºã.î #—ú߈ÝÝN¯Y§®¹º§pšæ·JåÓ¦¤µÓnII©)uÛš¹ç·fß㮚'§ Ì™tv¸[·wuÚá¢:ërwræ·f§;uÝ­Ósr:T]K¡5"évm;§]ÁuŠ€²SZ—wréªêPéÛ)WJ¥/Í×_ŸUØ5<ë&T* Y+%µV{ oúì¢$:Ù_ð)T‚e- T*ÆUI~)æ¤@y”>Li„‹b¶Ï%Ú )?q%Mmh+"‘-¨Ú¤Ù±§n»·;]–Ä¥YJÊYeüÂ4€ h¥)@`F&h%02%‚² >YLR‹k«[ûŸ_!Cþ±ðóéõ’k•ƒdÍ×'e;µÍÜÝ¢åŸ]ªâðëÝEÉC…µÓs$í ÝÉu¨¨‘J‹m-Â)¿Â†KÒÝ,´¹rí$³4Ìn–+%e¶ÚÑlñ¨ª¦Ä°Úµ¨MÂPÌ×ìâÞ½sü/ìÛüûS÷ëE®2Á‘WýÒàÕó”_é~­Œ³ÆR˜¤Pê¿ã3[¶žÒG?Ü!™Šžåð (M$Q!†J–Oq‚Š=05gOp î…b_Š™/ýKÈo(ðPG™hCi=F?„¢>²§‘If<óå=Yvõ¶0ÁÙcÛ=*›³ÚúÿžýšóÉ˧Om×£¿-§SÑÏW”ä©-UZ-S8èá’?¯t;Ê}¼2A÷Ì䪄Á׈ C?œØñ ¢,Lñ,\IŠ¡• , Ü4{zŸu~&isÁÝq Šä´o~|eɬiù Œ˜ùú§X}[   ªd‚HèS‚”´bZãaXtÿÀ×]=—óÁWÞ?iDõ‰ÓÁö[¢Íj:'Ñd~˜cîjAèTa ìtÆs*¿sI•£¢Äç¹ÇÃwOöaÿ@/ñ€Q?þ»Œ¿³úk\lÿoîë§Jºw‘?캻ÌÈJfaҘ͎nFBš›—×þs_¿Þ©0 2~ÿãQÖm¦ ©ºèÅ7Éådœq7‹Z9†º&0ËȖƵ^=‡ bå“o‰\.mÎ)H½a«¤Þ†s´­í{Ý¥,†úX‰åm}=tw7ÉÅã{!Ô©+®i¬TïX‡U]Ux[íµQ½¬Ý6æ"6½ÑSzZÖl‚¯¶håÖìdñ¹¶(©;zÚ­µMéO5t/×8´&1œä+ó:V‡ˆáù˜ã[iyŽ6õ|·ïÁk«nùÉÕpï)ÍëϾ»kÓÓÇÁŠY§= ææzmU 7©ÒÄÞ®psÙ®œ·Ì6mtÛ9-™*ˆWd»*#H 8X‚Ö\ä-Â!Ž ’Í ˆ2EÇR!œ‹• äDl©­Ê{ÝÐd¨!†’c¶3 `ÒCS=°Âcm÷Ìã–Z ã5„›é‡*†Ìr6–N+­vfˆÀVÂëo*¥†'.L剾x¬”Ûä™Å™š›¶„4Xj€úÌJËz¦³ Dê׋twƒ°˜>!¢®•ȸðÄeÍ-72 ÙÉQ¢ª…Ñ….´-Ä0*ŽfS„“ªlC|šçtxìò¼'G—§nɳ”çAÐÀêàêä‚Xj€š! 50¶ôÑn×3[HØÒnMäiD·xRÈjÇ « ³2„„úöùjµ–´IFÅT²(^“N\—CÍÏ)vÎt®û8&÷Õ‹·C‡„äÙÊêV9¬uzuq†yH“ç×Ö¬s ¾Äç±*èèo¦Ñ8ÊÓPT@ÀÀûX±a41ðK !ß~ü£^î +cØ{Ù)¬gÑõéO–˜dZ‘KÂq9ÒPÕÙ;tÖóug3ש(SJÁǤ Zp0œ¨$%:GJEâÉðfX½Àüù¾xòâ¼÷Î÷ˆ G ‘1`0°°6È@ÛE‘[èÂÖ{!Dª|´pÄ>ALaA$KZm…¯¥¶½av’úRF'6S¾åÞl½Š LÒ—Ú‡¬Å‹§“Uw0¢\5ÞM\Uf½]ÒÑ2Š-nadÙ¥J4\È9Qx©I˜½ÍÉݛڨ}—{c—Qµ4âÛ`+bôÖ¬9¯N({1â²+$[C¸/„«Ø aÑ·°åã`ÌØÙL ©3‚‰½Bb4îµÄ‚Ä <ÓˆÈ6Á…E­ÈØT*Æ»êÍ4à—¯6HMjòojà€Ažâ"]u’õQ4„œy"T”EC–ÐDéÉ«u¶&SC©(¼jáËEÚ·`æ*¨Y5[‰ß+fªk³³8ßd!JÒ…5E±j-±­cTl×X‰ÐÌDÖcÌ!’%P¦³Ý¡²š…-bX@ 33·G¯^zeˆ”¡@œ@IMo3ŒW,Š¡N@Ì! Ï¢ü7>ߎ“ãmE)J(€$P¨ôç¦fk–A J ë˜)¼Å ™ÉSÚ9…SŽÎ.wÎõŠ™ jP2T _IR….q$S%]À‰Ï¿ãÔÕ׎²Žb (Òã€9 RêÉ€í(d€ä ½0èeÝßJ”©Y dP¹*RjDŽÞ㦭õé×H/yUw P)¨yñòë«}|ñz«ñ<»`‚žÒœ@'¬.J#œ[4¨&ãμ‰Ü…܇™yÔ ›$‘–:¼4²$ ) -ÞÉ[± ·{Ç/7ðÛ®‡®–‰ê=ßwélå€piÐ’O)Ü*pBk{”ËÅÛàÀB-æ‹íÞÙÈr©TØš¨T ¿ûÁ˜÷õÿL®4t$Ì30ïÁäl순q™ãÁ¿u( ´šÄu)’§»1zHä)H4‰Æb9ˆï„ã7¦‘™c?¤@f`u'I¨¢ÝÀ êÒ {á[œu×QëT~VÕõ*Ä —@› H 4€g-ætIOUݾv]ÈDH$‘%‡Ùa¯U>NÐ{Ø×ÆÌÌ£™[þ=zq«¿8EU!ëXŸ[ónž¯Æˆªºù¯Ä¨¤DþOÏÃt Q¡Ñö‘0‚ˆ°®z5ˆŒÂ¨®ù#¬ŸlׯSˆZVŽ7­{ì‡ÊCgŽô-ØÏÙ¹B›}ô.  ÎGq7¨T…ºÓ]³4¥©&UVŽ‚aSyÐHXÁTMÂJE(¬†&ÈDI›„’ÈÈSbN„5 å$6#8»i·^5ßNž°‡j@-}¿5‹éhOÛïàWÃ(ç–ìm­f¸®9û[E²V)­ó­´ìwìo¶]CœÆ¤‡¶b…Š`4†Lß§}î€ÛtG 7Á`Žò‰³(M–@DAª@\IèÒé2`p¦j@ó}•ÏP«£Ü®3À o͸ $3y91ãu´PíÖ‡=zFmè…Šûõ$¡òØ ~h½ü߭ǯ±þ4 7cKv°¦=zû¼CW»žN“P³-’Ëî÷Zyƒs@yAô„÷ûúè =dà½Ä›„;Ý}{ë‰Z¡îHl÷ç^Ù$•ÆþÃå3— z- g%m tJ`›£j0éL€ùþuE˜÷úsŽl0 Ìóƒ×ž{ìhNÒõ‡·=ƒ,ëÛŽ¶Aï–šF’…¥@¡.3·¼ƒ¬úöô×q8Ì–Ž“’#6:¼úœóÆn<¡"Ø“E”X”À@ûL?o[Bg0F/xÈ[à Kî#Üu÷uÍóß¾»!xâÑ@Q¸í…Û®øZbKQÞt Ñf¯‡È³ÍH„Y¤€;ÅÊm$1,’Ä™+múé§­ì³¥Žœ¦;_+5§Jë½LÔË/(ØÖvéÛ×|@”¡Jv€Â¡ÒúõkC{«IL£dS‡Jˆ€¦ ˆ¥ö‘÷‚àÌ’ûñ pñÈ– ƒpÅ0$p„!ȦHë˜}Qò”ÆDbæê¡HÐ$›§XÕçj'Ý×§^;DzRÖ®ò…¡…ŒÅ2bJ"X;Cåß«‘¾¯\¼pܧ>^|ùñÖ |ë'BÍânè¾=7ãë‹“¸8÷cÄõ½9ëä‰_ž5ö«ïõêùD¾®·_!uãšò‡§¯x7^¡T·XÁBtënp2O @”¾Übš€Ôö—Ryû±öÌWpv"9u!¯CPzÊäšõ÷\ìëÕ…ÉÈ„p I|K îBöbâð8/^çÁ›ÓsK8AáߣŸ(ÚrãG<\ôÛÈ„™• = P0‘ Ƕ„×UÖ•4iùîèvŒî:v Á!˜Éh,Úy'/nzôÂÄiˆ:æ!xfÉÅãöðéìwÜøŽu2{‡TBÈ#\é^'¿ëI'xŒöÆ%ãZu×F,飕²*…uwÃ1,¤-…[Å‘¿=ùÍ.²79cˆ±°uÆ'y‹²8ññÐ=b 8”÷C¹ÖóÔ”ó Ü´ž•é›ã3ß‘Ö!Ï~= ÂyÃß:Zð¸„(=ð,³,Ó<ê~柵êüjÇqŒÁ…4¶³»¿>ºž…íDŒËzå<óêó`C_6H¢ XQfñ²;¬±„Qì* ÝFV7˜áŠ*¥érÀSµÂ“ZçÆÓ¯íQ(yß·9³›¨G…‡X1¨J9Ã$Ô_^›ïxOhì LIv”íÆ7 ¤€ä\æÂ4Pш‚ Ñ¢‘Js>6hƺéÞ¼“¬§iíYæ=ñÚG´†ý³Ú_|È^$ëç½+@ûàÉ|1÷ïbÌÝ‹`Þ¶úºFÏPªG]^ Ò ëèA‘ñ×t\öYu—WI¾#C³ y1ÆfÍvHx„øuè{¼]ιå22Éðœ—SÇ¿¯M^%å¾BYˆä¥(]±C$©-[ÌTqçžÒ7ã½æqJrH.õàA‘¾˜§—C]vû]€Ž¶$Ì2¥ E9¿Y¥Þó߀:¦¡¡Á õ⑘õå\^Kˆ’{^1ïŽÚõò^\Êà¼ØÂÉi-,=*iN;q™½N÷hzIÍÅÌêìIÄK><í7)ÞY KSZ8Î-B¨U^øæªQM”z®>v»¬Y"ɈIWëÊi§l¹÷­´ ÁÄ —J”»l;?¯vs 1zÌT²Y¸é€¸Ìr˜î裿Z‰? tQ‚A&ê¡MÙsÛdNk’`"PI ª$¥ùåÉõ¼E5«ë*Äa°Q´ŸÉ "h#òüSF@ú>qÙ €rÈ‚L'cÏz7+’yzú÷Õ¾™ª¢ª»æu¸2Pí™ §†(j(_yf‡jéY¨òQXÄŽ^\³Xê²x,(Ú\ìõ£8W–wÔ sYÂæò @Á ¬h³a‰&©˜;3 –fE¤Š‘BàuNᬧ{:+g<œ·Ä–Н ºå9×jl£ÖÅë«ÑfrÔY…»È™h"‹‰ "ºÄ§RPêN’h„ˉ Y>²ôé€j©'bÈèÓÖxÔ‡j ž<™ƒÆ”Š šDÁ¹ÁÕnµÝõw–a;Ö-Î(\CÏ.¼Žõ&õ:Òr¡Ú¢u®–Gë×lõÕê<%$ãj—•“’‡{ ð¢†J<Ã^¼¤©åäg¤¡çß਽j» ¼0ÚÚ§{:Àg­©J–P᣶ xÏl|`¤zÞ$¾R¯Ÿ8B8ãHí® XO ï×1]i¨çg²Â‹á@µß=aá¹)wëy§ ï}ïVCÂÎË ÚÉ;R9W+!à²Q:tïY<ütÕÎâ¤:Qá{YÖ¢qaÚÎjF{bN¶ ×u©TïMì³5 ó‡©4þG¼ïbX»… †aè³0 Xìæ¼¶Á<,4°íd4£’Èr¡ÒoËH¡âPô“Τ9™C™Æ|/…#«/Êx,…©<,8ÚõÞöÎn½ü;_/½|<³°ÓÌ­ÎHN’§$b;ÁÞyøÊONq2ó…ò!zIÒTí'”ŠjO Æ9²zJ>>v=á2Q˜Kñžã—k)Éç/XiáÄó:¥(€¢pHt»Jaðà+rùK©{'±<%:IçÎ*lÞ ôçËÌÚz]¥íÁ€yÀ§o>žVÅ<$w!ãÿª*( H(yyíY}ÅbóËŸ“Ú¦óßÎôòùkêÒõ ½n.ÆòÏ;±ã-`ªŠ}üù¸-,×Þ2}ÛmDúh§PùÔäG'žYÈ>Z!ùÔ_o›êúârdñ¯'Þûü^Pñ¨Š³‚‚râ­aj½a„a;cÚP¤ ê·ˆxJîFÌA2 s¾* ’¯rPi )G‚(S*;õé ÄÓiF”ƒLC±¬ãÔö&=IÅ–W"(ü¤€P’=¸`zx@ÁIØ[1dÂ@šu’*Ý¥n™HË\aM#…Þ2ãnLµ‹b,¡GµM„Ë®8zñŽN”–¤£$ST+‰˜ }0rÍìÂÌ `å¿ÉÓ¢Rêæ€à??Eż§z<UÆ`Mj(§(Zë7m·–º\èÏŽõ˲7IºH®º‘Ñpz-ì:ð°@ÿRá ˆší½q׬uˆŽú°±o» dõ±Ö÷øøLw3s¯“ÁãÇxêFjÅ­jbí%“Âô½z˜/–€€8ZHf» ÒÉ3¯Î_‰³Pñæß>§hf/&ùvçž³stfÛY¶‡Ë˯]æò3iîðÂ9Yô©Òùsye¿>pÊfŒÔzx]±éÇ]ùIMi‹ãQ—޹ž$ þ¨™ü„«ëÝÜz>YÚ¬OÖô®Â³ Q€™"ÚÚÉÝ"uAÏ/}µ¡eW쵎7Pf•2 J2)dÏ™åshSS ç c±0,‘v°´iÜu7ê{åKxSáÌág}š®úÊ’˜Às2º K+Š;R  î‹ô f†äý†¡fg<Ï‘Ð~òIÖ°ÌÅu ý@ÉõÇ +ê6xÀ7Oç¨?¶ÙVÍÓÁ;Ëð7£*@ClýŸ¼2†3&¢Â˜œBÙ?L~'tÍÌœýj2 C´¨µ˜ËÅB¬!Œ~>¬ÐÎ+qV(|úö‡|½éQø{¨¤kÃ0\2¤ÇâÅ™Ÿy”öJ%ú– ö£ÙÐA÷£j’/lTç–dU53sЦ‘#ÓWG(K÷BÕÜ˪ß"Bíö‡°Ü#è!‚×1ip:ýàHn:U€ R”ºe‚b—ùAoÌÜï Øa¾ßdXNš’÷^-‚¥ ÈØÌÔRœ¥1õö)JPÌŒ[WH4\l&i½ ð¯É®êÕ53[:ÃêhÀOýb_­ËPŽò·OÛÛö ?O:ô]Gëb×lRõam‡¿¾iï©É¸÷?uµ“n–åúFÏÏE'ăÆ2nWºÌkF=®#Á»ºP4MÐIÄížX4õ1óú,±1,ÀAfÔ9ôYÁh’¦šyÕFÅòOf_Ó²Œc,‡®™ˆ&ZYÏMuçèꂌ7úz°>×·6Ák+™ARŒ;æ/7©åãæÅÛwÀ¢RÎõÆÌ•شϧúË€H½ÆUL3…•¤Fì„ ‘šÖ+VMÚu‘õéî¶= °Ì ÁÚ¥ÚÖYÌŒ…Çy:ÍtæN÷ƒä›'R‘ßÌÎÜßäÀ¶vÏ€?d˜–`L9‡ |Øë¾¬ÓGPœ0" ¼I)âb Ò”ClÙ¿vü}ÐR6ë¤9{&N$˜´‘úz¯ºÞùǢΟþ`X*§:œ|øº¢ŠIF®~cfÔ-Ú¥µµ°÷ô¦7¬~/NA°à¥Ë:;K5ÍþUÆê®rli“ï ¦AP–ûN™âeA¿,•VôÍTë÷·nE‚ãMΦ±ÝÍúìah¤æ Ð%¿rÌ¥NÂW„(’ }üó”žÚ¹db”ÊäPsH‘šG'çÝ(ˆ,/¬&7Á#»˜Š~n/Ûãþ¿Náüå(­Ñëk#p$}&— @íŸ^¨ %@£¡l¯×Í(¯9-¶j>° Ÿ×°Ëjë1U»&a4sµÂû^ %.G³ÄCZ+âî<Ãã’s‘]J …#bˆR—{–fU&! (*ƒì|³ ,ÚXY‡xèqŒ q®u7súOÝ/hT¬S ±‹‰å(ä: ITvü2|G\\¿~aF2)„[a!è;Ôþ0ëdEšW!ËÀpµ³qJdeØ5¥¡Á:~UàƒôCÜP}á¬&þ­–8ž²Žø*,~O–ªÖÏބc¥!M}ÛÂué€Qx›/R÷E&ïÛ%¡¥Ÿ²Ð8¹üyêÚ¥ªPjT‹Ð±bsö´´B®–ƒì7´MÝ©‘ìC- QŒPdÒŸF":UþñP‚ÃWY4 Ö?œBC4°X6Çßëù_|À$€# †è|PC›+3)@4_àϸ¥ Š}ˆW7#>!02ž×FXI®»qýOUÃ@tÐ6P°—Mƒ’·AèB ïw¥}'“o%üâkTXx†É•`¡™. -Û5Ùbï×f Ã8ó]5â ø„Ï|¼8«ùÆ› ¨±é»_)^©+(_½n;}ݲ·½\®¹®dfÜÀ7CoFâãÆßBÒ»@Ç ‚晪`hJyÄÙrÀ¨æ]|3˜\ ×–ã Œ-~‹½û­âu=ÒÞ´ŽnEÁÒ‹$ &)Þ&åMÈÙ΢¬ Citi^#LVPdÊJ¼¢âý¿èŽA­| &íÇ ¨—Âg—^ø‹„! ˆíQü)“M×* [8^ŽV)]Ï3Z5|=ªÐ+«<£ Û¹~žñÁSmó,§ „<âtÜUG@H7<ýøh,.¼{|'Ý©‡æ,ðÎE\¾m ‹fX¤3—uê®*o½”¦33< ÀþT[ ËWÎÊs™âfñÆÕçHWY(;]–-fÖ-¾pÚo4âU,ܼ˜]®ÌãXM5íiÜlÊp×™]ÅSs<äWWÕ“{žbÙ­#sTNeqÌXá5¶ä¼`ck–}=yŽmcÝu~h´^F9µÉa“Žq­j¦n›çª¹Õ´†Í¸•ch•fDKçEÁ›îÚž>øíy«`«†spo›—bf¶Ø6Û¯n¯DàãÛÅwv²hç›<œk°8 ¥(¡ó»çŸ»Ótà5> ‰ðž“š}°ø ,` HøØ2R|©ÝQj÷])&m ±œ9q ÃÒÔáà ìâfcZœàÙ Þ½ .#AÈÎâ^’–¸@u)l‡Á6žDNh›p îAŒˆ­ÜÖºŠ¬Z™Î¶è—An™¬bê@Œgt2J³N «Úî'eT.ò^µS­DÐr*ð³7»&©îîœ4­«ØÇ3[@ªgPð÷”!«"^^ê ÀПîJ3TʨÌ̪sQ"&§-òâB¬—̼Är†ã¼f©š¢hÍëi†Ô€©«P1<\5Í›‡ysŠmœ;\ZžAfB#jD¹¯ÖräôiçV‘×W²gøýxz!ݬâAÝX9I“¼Jò»»k™Újv»B̈‚ð‚ê{1UKõ®¿§Ë¯Æýu;Wtк†ùN~¨QJȲÀLùˆ ÉuÈÐC `¦ÃuˆuJ‹$‰ äigº üȆH²S˺V¨’ðê梥êæ$‚ÔCÈ…NË…T¦h½UÀ¡1FeB§7‚­Ó1З©k–$â”MÌI&©ÜYq6BiÅK½÷ž^|ç6žëâVß}æÜ]·ÞÁÜeÒ5S Œ(¸µP¡¨Ë’.­H¤îÎE@rHÃc‹·T­êêd˜/V Ò¼Š/*A4Ôî"”]Ê*jDÚH"2xyM5Íö¾ñ¼·Þ¿”øÚá1ñíöyä:*ý¡æï»Ù÷Ï-Ç ‘eðÄGS¾™©›IzAXçŒHiËŸ{¾œ÷·g6µCiÀÀ§fD´Ò7š¯sÐã’çŒB~qõôÎ3,p•?ñ€—LÐÿÔôx‚½ kJ ÒÚŒuÛ-;¨9§Ó*qy»kiјTÞm|¯ëvcƒ×<þòDÔt—™3®(»;{½N‚ó¸\wuôÀ| `µÜ%ÄÓ%|ÈíST_¡&[ÆM³4 œÉ×»)仟(³3¤ vbæÓ#£Œ"Ã3`Ž}òËŽYü‚™Šñ+å_zô™kW“rþ"­Ï’òEìåÒ¨)Ž©w@bî™#̱‹ãŠDPÀ<Í”ÝöC7ÞênºHËái|ו!rŸjß1ÓÀµ ëa­DDÀ²dö³õ§l ¦HœÐ¶²šÅ@î’æ³—C‘3q‚ 9' Y 7a -`‡ËÕ¤‹ü˺εmb‰öjyéôÊ©MO°%¦‹d@bÚ_¦>_ç€~F@瞃<LJ`w×N/òò£³®Ðp,Ì‘¢&Õ¡p–£3¨‘¡|³–aûÖá`XH8ätàT3šn†·²>ÔgmÞ8žÕ‚9Ÿ¢@"AQ̃Þ¢]¬Ž&Á/Pˆ„à’Úvv 7q|ïß}ï¡Ùd[ÅŽ’sÚÆ ü¶˜Š,X_¼M Ò"R††„ãïñÏ­WŽ°Ê Óº<£ Ðc'!Gí,<7c“¿›´>yÚMøãΓëÓºO¶h[¢»}µ½äg˜á㢜LÁDpÓÂt4@ðjÈ×k’pD`GîZ +à8­°¾Þ#ðaš”Pì‹óhá“cΔmþL8-½_Ûòzã石@lÈ¥sVoÀq A-÷!©AÖÃedç…šéfF@A@¨4Ô‡Gì# ‡è8L,F•òê©HQ¡ïâ»"³ÓÎ,>­¶>?¤’…ô›©¶§Z¦F´(iH UA€²»Õ Á–£gïwÿcùÀÌ>™ Å«ø=²T*\“AZaJU½˜+†÷JÂYè­ÅÎ~ò*MƒmH:„Š6%Ð'ÀY&@}(ØœX‘®4âŸZ¡#è!#³ñ)øý¨ìsîp™—̧cúõׇ“FÌ€††v.¤°B!è"þ‡Ý_`Y·‹Š*-u-‘Òã¢èóã¡ô” B% Œ˜ =&6Jë¸7=8¦Î)½îûªQÆÞyÂÁ©¸Ê 9À½9 ÂzûÁ¸Ë÷ [ý.Ëðìa~ŸáÚá0]N[ݘù뛨“ž?Veß&¥ DÃJà ³ABD‘Bnái&¸JI“ë´ÕñlNÉ%Ѫƒè ª/¾%·ÅÀO^[ùO+k¸rËš&X—¼Ÿò¥lÐFÁÈpÄÃ\O3 ¶\Ï|Gvû³K„t:Ëq„=c޾L_ê‘oTý" œH\Üd‚K#Ò¸‰Æ0ÎùàxŒqlPwÓ é¢’Û+SªÓº€ãy›ù>9ÔžòS"Öõf } ¢Í¶^|X#Û'›OªûëkÄ«³øsñUSYÊüœœ,z„C‹WWÆè,”ÞÂÒèðÔW}CDiYKÆ'Ï¥!=¤QŠ?%‘% ´svnž{f5]xP)p~¬ òÞ«|OÀÚ-eÖ²˜FtåàÓð™™«‚„1,I‰$½Ó¹² ¨¹óóÔ\øã· jâüʶDùŒ|—Nüç9~ƒÙK³ð#á~xã{Ì]ç(!ÿ6‹½ÂY‡µòφÖ@#kx¼VT2ZäꟙyóÿÐÏ@„ÃÆ`îè#ݤ(!5ëÐzzˆ$üµ|•üÁ‚@¡u„Bû<}âKÜDïìïÔo©Ðˆ [Â#M9XÐ\ˆ¾¨p$Ù¹Ë`ßh˜W:`‰!xãã¤NNji)qØt•oKŽ8skšý—­Ð£™ÙSåíæ|Ô=λ7ë“5ë„¿íK¼BÁÈq 鎊› ÐXÀ{¥tQ9kë¿ØLvG?D¼¢ý|^Whºóæ{],ÅuªÖÑ;“ÐãTÐ2)ŸámAŠBV”‡ô eúyÉØ §ªSx÷å ‹o²F,QN“Í"µ ¡| „—ô()OÀÆjJÒá“föù?~jÃÒÞq—Ôo³¨K¬ò!›÷ðÁ‡l=7L œº2ÜF¥ÁldQ„€‚AÙûçqŠ1AòU2œ¼¬z—”?_mô¦Wð®/D4»zª)J(+ß"Z« ¨ÈBM>`C]‹ôCwMPÀ µÕ4'èq|ÞÏwžÞÎöó¸ógMtùÀ{ÂD%1(ÌÀ1, žLýð}ýÜây=zÖÏ>ûúÈÞoÛ:eÑ!np}òº!…„\"ðìÖ}íºA?¿¤V±%fÙð6ìu̵–·S„½ýRþ´Ž=gn0pb'¬–^z³ñ)Ö• Ñ…)áÑÙN$ÏxØÚ¨Â+÷I†YZÁÍZÆE‚Aîl½8ì…ä%h;¨ÑÇS KF̶ q‡9=tïw¸kNžºb–Ë”¯#;Œ‘Í¥LYM. ;*æ2ÚÚRÆã¶ãw¨2ˆ8ˆê¹±eão›Sn.ïmÛª3)éâèðòds/•Àë`ÔFNå0÷¢¸ê!#£}m¤žžeÞó†NŒ%Ƚ’¦™XÎT=BOPmHéÕÑ8\‚8‹¡ÝuzŸqì¾e»½â2Tvjo]êbM`ȸ5wæR(¼\ìø²qR<´y{éí¼ìv+h¼ØŒ5·=ˆãW|yų…ÎV»:{å¯Ì»Ù4±[·8è“¥©¨'\”Ëã8Ï2*؉ÕLĶ^õlÖu¦'ÞÝ9 ­$¾øÜWh‚pï¸àâµ3žk‡1š· cqw®ñ{3ç-­žFs—„ÞÍ–^3iËñjÕØ®œG3x/tªœYoÄnpÛkk"\òÚã¯3Êó¾JÊU1 5­ÞTAs¼s" î1/[[./zÄ”¨9´UL^n­lg–KZ»Œ»[ÿiãÎ3Á·v­dóÓ^QF³&ç)‹¥2Á!DkÞaW–”Ë»º‚ïR ",I†’fEUD+p¯„­svØgZÄc;k‚"c¼R™M¢*<”ù h=ZP"H·RHt……™•k=Œ;ÁºóW d‚䧪€÷s5™pòpCåÁ¨N)ÙÌÌq6r,ÁH ¸‘X«rÕY»ÍºÑ˜±KÊ9”ìŒ]U˜«^ÞiSä ˜©©‰…—5²÷¸êViz™ÍþOcí¿oé™#5\ía¼ò0ÝÌœ^#&R>aíÞQÈ@t™í:@¬žHe)¥Ýï°ÁËGP(b²,+eäo•S%ÁBTrD²è¡)P.&¼°à¸äÜ¡ÒÐÝŽuÌ/‹Kõ)×UBŸ¸ä¾J)ÞŒ, ¢KÏU‘9pó°zÚæ ¶Oâ_àcaòÚR@E;¹ŒÉOfÄÙêK¸2S€eS«,)ÒA ]=ÓØ*‹¹±Áòl¢ ½È.q7û™™™˜0jŽ™´ò*uVsõ]Uþ¿Ÿ¦ ý%M7€àд)ƒ) ¬G€½…õt&³-z‡=—‘'¨õô¤ä9N]±Í ¢Sf!0ˆø'ì ­½„ð§b&æhLÑW ý" ”ÓKû£ 6[ûð0[ÛØQ—~99ÔË×AÀfûnŽ&¿s™\ Ú‰j 7­"‡+ŒcÓO2¸Õ²)&‰vUd05+šXnGÛ„¥ï!ò¹ŸœV–ukm•ÅÙ‡¤Gö€PJn„*%(„E†.Ösò<Ó†¥§ès¦\}†]fËϨv²Ìæéz¦&Kã8 ¦­jÞàáø"0=I¨T9Ú.ù$(W71CØ+Ý¢öôßY»Ùâw:cì!íÅžGM)QŸá÷…<À™ ´’>ô±‹íw§-‘„YÐW·~9ìé®Ù¸UõßÍDæëºÖ ®­™„à !‹^KKÁ±PX*Kêëá¼ÐÀÚ ð kˆîJPnÕ+scIu°÷nbƒÁ†º`-ŠP²äÔþ>¯@…Ëq.*ªèÜ”£}çȼÒÉ´Q÷cëPgîÊð3ô‚Y‹}v½§Û#;­Ï~ÕuÎýõÂÄm‘䃲è¿y`)tg™m!H¶ˆì ÷õãuœh4ãƒCß17Ôqyµ#K&•ðÏ—Xïsœ·lo­×Wœõõƒ %¡ã¶$gw‡ƒ7f¾}µæ½5¢ôå\.:¡e)D)=Ä@a‚¡Lmcè[Úß=ñò<`Ý‚Ìv2îm„b -÷ЀÃq6-ç~`TºJ¥*‡.×1h?–­*˜€z‚ÊÆªxrÁ%ä0rÔ%œ|Q¶TÍ:¿qµŸÇžøôª¯Àvl9…EÖª}Vݺ½qwI™•U$!F1à±È'¿±PI܇€¿R -û/·Ñ·x`Í–©âp[†¾×lÎÎÁwúˆš8•ÂKxa4fb>>Gxò燘`ÜRC/O×;n SÀÞÐèž y0rYÆ%ø?^_1LĶø÷ÚÁïÅÞïM'Žc¾úÈ::v×r›C!@H÷÷à|v¼õÈéI!ð“Ð^ƒî\mä( BŠ4Þž–†Í~ÂÈ¿Úp'‰WÂ9]/Áíåoâ¡«Ôtf!²È{Ø™ŠM-̰‚µS¼¼…µG$Kצ vå9‘Ž„‘û|¿]"C@ÍüÕ"1à}°ˆxY˜/×OªnB`0°m,0Ù…<•ž4R¼¨ÂÔ¹ 17ÆðÉ4¥i%*iÝj‘óëÎ…¾Žs\~cyì|{¬Ä霖˜ö€ÇÔjùÀ£š¼ ›Ð!1ô–‘b ÐE ‚A¨wÈ­¥ N­õ\™‘½UN|Hw ñª,™Ú­%¬©éËZ»¿œš×¤å_K«E)A IºàB:@©™0Ë•ÛÍ 2©èü ™k÷M#h>…6éŒxƒüßË3"ÁËY˜Püð!×y°Ý¸ÌÖ°üHŽävöÞ|oÁm©™|¦ap€k{ºî<°¥¯@”¡¥HJ+Z¶±ÐýÂÈA*©û"Nx‚é­Ü_f}ñ=Æ×%y²²O¦ã&Po!>Ì‚:~ ÞÛ+æØž'¼>‘WÅ ªûÚçeVuA iMDJ]«ã¥ö†„@Ñ€ª'ëêߨ1bç塲 f)AH“ß—åG†¥ÍÃ@3è¬sé”Ržö7Ï;ºÔX€Ä3e°à T纎ÿ@ô5ƒu¡Ûè@‹×Á[PŸE®Bdh6Øhë<ªYžkXÆ´*jug÷œÚÑ:ó5Æ|SLxé#2ø³jðÓk^í+ů{®Â¦yo?¥Í˨¦À 8`à@t Â1`ì Á‚dLÂx™ª»] 5‘U˜.§>(^šÐ÷Q±@±»¬ƒ‰5†–ƒ÷b…æÛÔaÁ"œk«˜°ôí´Âax´ûXóbiFP03j6îlPq¸5æ*¢ó4NeStI.o¥äÕÁ›¤ÊU³šfdcæJÌ„ï‹)ìå©x—1;›³5¤><äݾcÚW{‚‡`TF±êÚ*e±ßS¬‰“zU3Ðý¿DÖè-*‡yÓ¿C îf§—U.ð0ˆ.®ÆÇ q ¹«o"(‹éÝ&I9Šätüq¼¹€ jq8ò?¡‘5|oÔ<éÝòé4­Pš>@é¡<5j`´>f§2Ä€4$AOÞûlrÀRÖYùŠRf]ƒ'Ó0ܼÍd‰JHöuí>ÏÀGÓ§~‚pþâ”~$Õñrè˜Æ0·¯ !J 1¾Qä7Ü/UÛ‡še8uL²’²3ZML­S[Jöæ•4¢~ÿ½´(æËìÞŸ9²¿ÇG¢ÖÁ2”óYoÆ~ÅX.° S|rE+ 42ÐÞݰ_ÙËŸž.bø¯Ð·9u²Z6 =)Ù‚¿BÍ?))¿¯c¤Ür˜éB`Fi‰©Cݺ'ÃèsSgàÀ\'á|âI×â´Rvzot•ð-‰«ZUY‰½ÕÃ;ûT­p·èÖ”¸†¡õÆ kÛ>:sE}ÄâL"OÓ7ò ‘õä¡‘A‰*R»èúò%ñ?2•ãóùØj:®ñúû§ %i.»¹¹a!„¥4=‚$•Û°6°s멎´8¸»ÈŽ? ’ÐX"K NtìÂ#ötjþ£³žþwžxÁøö¥OGX§×Ý­z~¡ONÜv“´‡¦²êd7Dk CŠ»ˆû¸²C4 ßì7 ×ækÓ¡öpaSmö·ñ>0­Ûìû±C¼f©¶\¾à{TÌÎÅ]Ó#jÕfFj™‰‰:`†ÕLGìf;HÍ–ÓßMaºak®¿(ý~Sõúò1`¹ ¤ó‹ ‘QYú_žªfËc_b£Þ© U"h¹4c¿¾l1 -±B(/óׯu‘>ëŠ5àG­@dA䯫ÏÔÇàaiæ&ž ⊩}WDý¤‚>ÎQï©j@ÖšÏÚ½Üø? ÔD½í›Ýs Þ©œ Û€YX±kÀ,"¡RÄaýÉE‚ S7(Ãò† ÊB¶Å¬3÷ò­Ï£ÎÐIæ±÷½«¯kŸÇµøn3Ü{µãêB-Ökc°ŠÝüMœZÃCж‹SY@ ‰A» n®2+IEHG®“¸R®û"Ùóv|Z·ÑöFå-ÝøÈ. úG¸8·ÜG¦hQsI ÀÎ%Ò+²O—ÚS¡‚€à°‚Û¨7Gõ°Œ2ßߪ¤H–Öq2OáGß“{¿E–›ŠRìvójÇë—éªX=s8@Ì"áþöé`{Tç÷àúµkL‚¹¿¤Lùõ=AkUÿ=~/ )Ÿ‚ÔÑFüŸXBG§Nåà‡:(Ÿ…çÁõÆ{;Íê*¿hcÂ3ÌAâ"J™3G°Áâ8Y¹û~ý{ó© 4A¯Tø€Žµõ÷Ž_ÑÍ †}㺨µD³h-~€²=ÇAÒSûh$s!¬†[ׯ_§Ö€¦ß¯ŠQ# ¾ëV<µU™ƒ‹Í5æÝÿ[&q±Á7£!¢ø Ÿ¯gð¸"&¼á1—Xñw‰:…į¿f$Ü·{Ð'ŠÜꯆ’H= Ê J¡`ú¸<ëÖÆàLWCè"Àÿ·íW«9`–·}Q¶Ðë0iëÞ0*qlT§ïïïƒäØSøVÈ€SÑõoIøãÔ„¨Q^—M>|š0¿lÀVð§ÎbGÔÌ£-B–ûºxY´:ÃçÚ@. Ÿ[OÇãÚû°ôË™¬É(ƒiŒØ½§ÑZ¥ôÉ2ÁUPˆEè O׈ ÅÄeÀRHǰr4"µB P[ñøúÝØÒ)Z”ú)ÐÚ{ûóÞ0¦öù|ŠLÑhPø,&Å5LÅ~‡ÎfîˆÄ5‹"¾Wë?ñ¯Õ EȦfd"î¯ßµ«UØAp{íþ¶Óͤ]ä»zçÄOšÞ%³ßZ£Ðé+¶•pÌ©£ãF–K÷r–ûüøÃ\ ·¯´'5NvD¾C3_)a0ñY¤Ä¢#Žékeí~yÀLáïñ?p‡“Êj~üF /›­ý=¡ÿÊÓñâ®-ÕCÂ0$NŸCÅúyÒ¹ÍÌgJÕg¶“£;vø—9DSvNšùµ£q®áé‹:’¾*Õ'A4WiÅ7Åj:Ú„šƒ©ƒÈŠ²B-ŒÝ(i=Wd¸$àäáÐÅzÓÕl—'<;#[¾CÙ#ίíÔ¿…‚ÉRþo™B®ð´VJÈõ 茘7YZ#ô š<'™Ôúp;ëð= í²¤A§€{4KP€“Δ7ä:¸}úð;×bn±ZNnTA{XxU­Ÿ})Õ8©jbøÏ­g>*Ùø¥.QCf/T}¦“%Lí1Y¦šÉ˜|Î[xÎ63ˆ¬+oHªÉ‹óLg¾&/j³Ì[MTl½wlmå‹¡bu{]›q¥mÎc›‘/[suušÞ×å—1d0'š¾Þ²+…<¬UQùÇ•”•ÒZÂųˆÅ’Ï6fëºîé 2ukbÜ:Ö.7¨[:^u}rÙ+{bq¥Êæ4Xî.ö¬fƬûÖ£’ñ5¶«Å«.³·-¹Æú¾ Pc†qÏL»MDØ›p“Y†sѼÜfeÀ-†ÜV…2or)ô:³#ÊîC¾L0!«AiÚ&{aCwkÊܯ•o1Æ(XPÅ-W0Æé¤)Þg"ìƒ"K+ˆÀ5UåÜhºY›&o0hº¡  ^¢Œl¹Ì jòíßj(mзÝÂk'g`#›qNÁôýO#trÈ1£™œ;›AJ²ûH@;QbêŸbj5ÒÊÍÌzR"5Q„ïÒt6R0«ˆIuüJ€DoXO"ß`@¨ëŽlÜšwÙx ÇQ°$¢®°Á¤ D …H qÆ&8´‡4¥Üér:\µ*¨>Ï6C’šË›QÄ ¡yO,C²C”‹˜Y00ÁÚ½„_† "¢uÔ¨žd@§æeÔu§“Ub“/f¯^J_=׎ñ?ùnµ åÌ+9/Ï6lR{ГPÄY•/b¢rƒÀ‡3 ]CâÊxh’ƒÉ„X‹TÊ€4,r1ưh×-`×Óƒh˜6VÁà w•¥(-Ðbi‡Ž—wÉgŽÅHjèbBZ÷0k€Ìrƒ•aYÝ“¸ê ·rò‘ÌI!5AkäÄoÐ÷0å"¼¸@ìþÏ­ßìêX ÌÞ`÷êýzܽzÀÀs¥¥ÊÒA$8‘$¿yΜßk´_+¿:`0 ÞD:OeÝyÇrOéñƒÝO30  Ü\%Ô‡„¡Ò Ò|ýË·´°‡iäÒv¾!I ìCÇÏ]ÚÄ1v''9µéáª7{cÝËnx‰@)ï°ãÕɆðK¨9¤ .šÊR¬Þ0†»Hü+Èb¼=Þy‡s4ËÊÆ g,#<¡êA“ZüÏPÉËílmCå]\Ö¼^»¥¿  ð`/ùüOA;ÙëíË}†j" CÚA*#9µÑ@q{Ê©YoGÌö\J«ÒŒXP‰Aи0­Ç~FJÀÆÂ°{MöË‚@a¿yåçP+E³¨² ÒŒ…š ÈiX¶™3_¬ üŸ´¾ñÆ^ó¦8Ù»m‘}5⬨n¡"µVúO ˆD§A¼A~z 3âxਫFŽ2©­¹Ä­J Æ“$`LùZDQçfbÔ‡#5JjÎÂL/ÐA° ] l¬Ënó¸~j,ùBýÚàÞûáêûh¢° ÔÚÔS²úÅ+¬(«ØdguaõŒy ÛŽ¬t;” ·ØÜ˜‚akdàa,k/·s½ ƒœ ÅÐ= ÐoÌ› «( A$‚9\ÐùVV ýxo¢{¼&øy£§£‡P‘”KhoÖ}@oŒ¾9òÍðˆ:=:#2ÅGˆÃ¶ôé‡å²-pÔ>Û, žÊ“u™’»›«ˆ-ò7Šž@üÚ ÒÂŽ±cðbz2Ÿ¼zö=#Î_Ö$vX óâ|ç—¤J ‰ÍùÏ %‹<(€¾.”w™ÖDˆ\z`0 "A@ŽRƒÃÌ5$Ѻ Òmz ÀlûÈ^å#ßÅã„ñ=¨ñ£âÞ(ôPkáh«¸ßž[-6‘1aªÛÌðÍÜnƒy>ý˧<Üt‡Ë6–œ–¡‰OåÀ¡ÎŸñ‡à"€fæœÜ5Ö֣ΞȵÏR´Ðp[>†Gך)›ðTbï¨C˜I§ŒÚØä±ðV¹¯¾[¹Æ,æ£Sí®í¥gèôdXcCÞ•°}üHú„[¢ý6sÄ®*U:÷N1>ŠÒÖ¢”Zy-kabg¼µ¢b^K«Øá{ý‹[  A2_‡¢,»¢õóoBÁ·J¿Qöþ$‘Þ²Íôãºéº,·»ô5ˆ× -&%´ÏÎÝ*ù¶|‘§–l² "— ¡ŸfrI·Ã`ÏšjPR惀dS+Nšjì>ãРôJcÔ "ôÕ”YÓS$œWÎð·YÅ·µk‚fØ4ùBËc__N©@¢Á"U‘D ”zá* &1ì|4 ×>Þ>Bž\‹"±£ÌƆ窊š®"Y>þÄX±û°Ô¿Z¬Ð²Ð;‰JWèéÛvDt*¸TûJ òY„{Gâ e=Ýz×ík-la×Û3@KE\&Ùá-öü„JqáÖ,‚ï`Øà‘ŽxªRƒ™EPpŒÊèh+ïò´z×l "R·óÌø±áfµè8nðA˜ËU}q_7èÆ$~)„ÚºáÍ\ t{såÁ.®L«dÁ´Rj:·«uZñG}wÏOÂ:G!W~ªåTäìÀQÙLó ±¤?MŠ?c cÛ9ì|rÍ‹:E‡úÔ‡Iö1Â_¬¬Ñ·‡sV7q½óºÌçQZb‹©Æßh·Åo—à<”A‚°$úÐq05äÜw6® æVžp®üÇ©éÉ—@³¾2̨¶ñæ÷ŽÈו5f<]­­~1Ò^3è@飻Bêt<Äý­îêúz¡.+‘‹×[1Ä|8v£c>TV¯¤CæFÊçj¶ð”¸k' × ïêoÒ<ñD]<’žzõ¶ôÉBðþ« SËúˆKg7©ÞC-AîÆòlA sêܪ„¢ô #½Tžõ ¢Ätu#êÙ«êá,í-¸®÷9MMȰªv¨%ö7dtÏT\úB”ÚIíø£¦›ÀDqÉ /ÄkÞ¹’ê£V³x´Ž ¬ /‰…`äæã»,ÅŽo ³°z:Áj•!sЮm´¦oŒ-{Vd…|Î&ÕÞñ‹ë#6êi±„0p:2–A²H¿zxuÌ#Q85ÈQŽå4µF͈†eeÒèEÂtâé‰Jô'sÕ¥A½¯ÖN SB»ãÓª”«„¶ûŒÝ—Hª¡Ò–Þ*ÂÅ.5±ë w+YI^ `GwaɤsNdžˆç´£¤9¥ŠõÉÔÍâLV^T;Õñ¼ÔEã$š¼¾nƨúÛ>E÷Á°“Å™¾3ÊÛWi³<ïƒo¸„»^üÓ$Xál§ÊN1{-žc‘´Ý“‡0öáÎ÷\É»éYÝíªï \Ù»Ú¢bq[Æë¬¤$›6kºéÚÞ/XÚéw8[L¯3[êc eªÜ7…ãàgX-›sbÏœ Xs˜®U,·Õ–s|Ã6/~g\ƒ uJäqô[†ÎoÍ[<æ9•´Ê•­&9ª¤]㌯²»›Õšì¶Æn™¹«FÍ·k²æÀÒ€@,·y!=šc¡g|OdHiôLO7¾W+ˆnné?°u¢ ÑÀoÆ€.äTØÚ›x/yì:—»¸·«Ì œ–ÇB'UÌ})fxõL1y²ñq‚¦1¸ª¬˜|jÄä9pïñ²0dP™Š8Ž½ì ‘·¹–ØðÀ( ò¨Š‡Ø©ÐíôKS^Ãט†É}˜ô¸»~<ÑK-Õt˜â`jáÊx˜HÙxLJT]œJpê%DÅ@hr(¹å#PÃnKÏ,,ü·„—3w*¨yÉI ’;¹ Ƹ©@U0䥺‚®’— T­xš¸vÂZm5LÄËjLl¤XÖˆ"§Í¥ÝÍBàrüL êµúï-úçÌ'AædK¢ƒÂ¥Q¢äUÀtQP¿“jl·øÌ;ª\Ô¹Òô‹]Nüýð%×/¸ùÛ¾÷ê$Яƒ†8„v-iÃd4 àÓLÍAͱ®¢Ðɼ¥(,˜éÈù·å1ýU­Øàf Òê3·@3†ÒÈ’~¡ó¼¡Ðê#®¸Â¸—¼x:rpj,Á’>ŒúŒ–`m”SM¢Põ›HÚ(·Õ(‹ñEL¦a¨ÂµáòŠohûp׭Ĺ‘Ï_S™QåS­ólÕºü5Twï—t¨Ùc[qõø²²ôEÊoçzn½š5  ò]ÝäàÚÚ®j'ˆE+iaå-à€Fµð+î×Õ'3|©¢ï‡–üàk0w'ò¿;è¿84h89®Æür˜=‹ Ô£'ŒP:í.ö"á¾-„ŒPü½I;I%x÷X™‰гWkO~ðjÃá ”áƒð$lÏ ®WCfųX²[F=ÛW;ò+–ñ€LJíù#7'˜Ý¡eíz_<³êÿ9¼Ï~¬[‰„X]<¸¥[»"]Â!ØΘ2l‚>Ûì!ÎÄ!6êXLYˆ0ÁÒ‹AàÚg9±1µ[?ka‰O>{°Úw~ôß“?Ãê˜Q¼#l‹sBš¢s @n{B`8Äû¡y­ôÿ`$Ï»äžvpñ"[×}MS‚j¿Puö+Q2/]üó e28ƒá>³ì(õïÅ”x¶Èy¼âçâçe4P0(P¡>Ø)£­¯BÞ*A¹ãv'7w\‘Wð °\Ì €"НÍŽllpGÛ7ÛvF ¡ç Ô°²Qê*8/rƒWÎEÆ,'YQs­ùšàbô[¢bé”9ËìZ+±šeq\Å&°=Ûäaî* xß ¹l†ŒúØ4vD×¹†}B\^_àu‡.±P„(n{Qá&kÞJ¨ö–Ú EUÅ}Þ_Õ‡^^÷Ÿ\é|ÞaÂ{!+§×¿Š4’G»‡¯ÆXL̘ÄICÄÃÛN¬ÇÑÏ–ø0:SE¹B> ¯í‘ {Wm@v ó42àzÝÁë[/,³…Øp^û­ÖÌ%€]¨baoßnÁ䢪d¨ö¸j&> AzQ8ñG üO]Òæ"¢ÕÜùdœŠƒb‡)/ÁiÅIÅì‰Èœ9Pª€°Àr,¶GZ Þ5çØ÷˜Lïå—1<¾o/ ²,hÚÁSW@²íT@âŠI ›º³§|µ¢HœÆ…ñUtp!­—v )(¹oŠŒv22þȸ°¼? t ¯­§‹W¦‰ªë–ÇSx¨¬#Ò‡¥ßÃ`ë"[³%€J(ywc¾bK ÷„»û…öðDóÞ«°f=™ùIªWÛŽ²<ñPylyWåuj ; U¾¹ôJÌ{Q_H‚`ôU X¤ŽKéV()™¶TJí ,[çС#NEG&þ½ |¦ d\TÚF¾·•µò¸È iPFC}$|½D‚î}V±4…cδæÕ>¹°T–_Z®Y †ƒãœ¼¾H_R™±õµÒz Êz@šüŽ®HBœ(~¢Ý÷?4Óám[\ŨâÅ!UU6VÊzz¢½Dš¸µÍWêë?_TŒ´ÐÛú4õãå7œÐ#PPâ®JˆÇ¥ï^äèÚ:ÝÝD 6!8Ä 6O·€\h?^ºZ¬÷Ý ì¶1v§ôëàè\$L!•ÜÙS J#OÇZ#Yo®¨ô[$ϯN$›x¢¥séÜàÖ/-hÕp³{|¦ËäAåýï©AèiÑçCÂo½Ÿ%+€8,8Á…3‹uR¡ýuo0a‰­Õ†ýhj±Çº‡¥<ÚÑ<<«6Ü Ð{H£™µ’<J§6šèõ€O£S.ñžÎ’Ìx÷vö¼Ð©â„<.žÖšñ0@^'›^‘‚<)d|¥9àêî+z†I+ˆ¶z‹Ë ¦±)Φ¡9tÕ_L°ª«°Ü†Q‚ ø©)Lõ ¦AÚ*åx¡?4¥+›rÍÜ ¸‘äOˆydlT2‡tèàd óhgZ`:›Ñâ ÷ Ï)@W®‡‹4ç—ð‘Ï÷×8Öç­5“œXßNN!Ba¯[ÞûÖ .KàšÎs19Ö¥·˜Þ‘æ¸[[’ŽÆÖHâ>Zß[±!l¶¼lBÊ.W!q}5„íójÕ£b·|lеiou'Ëî¼½ï*'Í“1}uYô¶fõÐhĘovÀk; f¶ºgX!H ‹°†¾žj/$ܾ=¡D\¥Â«.v%öNÝ &nUe«RšÉ¨¹pçæQ¡–CÖ ƒµ‘xc'$q â%]'ÉOV0E 7 )H×|«·z‡/B¦áÐ*ªÒ׆!öªF‡ì9K¦%äŒO¯yVõ–”Üìñøo„p‹¸ØîsqòÙ=?P ó%äÈ4xEä§£¼B#\8{°ö žº‡¹£<™3Ó¨¹¹‡p#KÃÓÁIóu& ¡$´az‡‹ŸÒM(k%”M¼3-(;Ó"ðñÐÎù8-‹Y½2yŒÀkŸk†­Sá3ó{â”ISè @C ¼.E½0Ì C‹y«›žç ¦"gá„ bC²,~ÝÌSGø Š>»z×n›ãÇYµLÁJù ï.NvÂêöÖζñ»ïVs ,}ðÂÌGT '¿Õ^w˜¢0õ*M« ûûÌß];sõqÎb-­ ø*™îãˆ7ñ‡ÄeR8z4„ÉϲœÐ´zúÎ!άC{Ç=€è$•ƒbBŸ‘²œL#gAAIy^”êf^‡©¨ò]Z2™iËü`“ q !Ý8!ë%ðÝ‚K:ML„ bäç}@9TÍñòÀÏŠ|ß-…Rí;{!-ñ{Él/YPòÑDkü߯‡Ñùûøw£MkûúœýÔ¼³ OÙ'»pÍ¥„PRWi‚‹ªoåòô© ޵B³ÐŠ4öD@Ôt¤ fÇ Ò ÀEÚŒÕßÄcêœlëYgÌ…*bqM?^®¤ö8ÜžèÑeB Õ:ˆ’ö•ûahv„x×"Å/Ï¡Óvn«@^¾R‰èNrGdfUP×ÁÌì½3JÒ‚A¡$³0,ër)âßÖg³èkkz(eÐQF©Âüä7Z­° "Ïž~sq…ߊzê˜@«TPtÞ×¥ýûøÞºë²îvà/â|O[¾ÙªbÚ®£ÍËÂ&ý³‹HaWeÈ”A•ø†è€µ¶døð”Óf+&,ï:hÌš^œºhaë4µÙ€@±±Ÿ¤öõœLÙLÅÐÔ÷ÞÙ eÁ Ü ¦ú÷ÈÀC+–vÀ‡Là>r( ÃXµÁ6˜¤b£ /¿>zc=IÆ 9 Gd@ E ,d…Ë)ÅAåp¡î|ú_e“^ØAÙºEÇ·õlóÛ½ÖÀ t¡lªŠ„i~‡ EÝÄ©P?J"èwÊX怃ɑKšÅ=†ù¬³ þŸZ>ñVÁ¸m悚R×kVj ²Çž­£PqHÎGãZ‘õ¡š¼îT¦U;3·VmZL¬Ûà HŠY´¢Ú‡m sàúp2ÉåyêÃß©£™dîùGõCv·‡Rü½ÍI9UŽ:¡ A}‰pÁïŽ Ï>¿G\L,°Máë a"h’$’]u[lL„¬uÕUVž>k8Úͪ±êñ*ûúµÍMgݘQ—ƬVE53ïõõo–¯r¬@“h6ɲ©|zLOp¹JžÅØéfþOJRiJDÑ×SnÚ:iRß ¡µ+B~ö¹¿¡­ͧ(’{Ô|Š,„!I|ÝeJ!˜Ê;@À‹²X{5‡pr”¥'݇c¯‹ÈNϦÜÞñGvö2ÔÞJŒÁQç¤Aè„~M³ á^¥FÐ߬ˆz­õܸï_v[¤@˜ ó^’|ç"Õjí•„{£qÂ[ÔÔ/qZÙ°ÆÊ­¹Ï±½—ÈgÓìŒÞVžû[q-´.ZOÆwòÛ–7æÎ[Ý¨Ä Ù°1àØço¡Û¶ÑÚ,Ò0ÂJ˯­bãÔóV@ôé×»bTý,•æ[± IÒÑ[6aã×·ÃÈñ}ˆóÞ† q {^–5;ó1Æ _S–‹;üŠïˆÐCÞ»d‡"Þ£œåžy…Ø>Oƒ’PŽqg®ã¹™÷!m¾kYz®“w<ؾõ·]óÅîlÙÕK¾Då¹\cM¬iùÆV»s¬\º¥æ¶|ãLO5‹ æôµ&o{œéQ\7 —R©}QŽ[ ½{Ç*Ö{«¼|öëŽfŸ}Ìi7ÔVù“°«qôÕ‰¯=Õ_ly§Á˜Îk‰±¶58Êðâ»nrñȽŸ¾¢±¾o“vón(-qB(ôÑ@!†º,ëàKEY™²^åMS—…T$UMðÛÕÄ—™Xq;½V­ŒnÞ¶"”w Ý;#3”â2CÅF«ªÙƒòbî1êž)æaS¼˜„¥ ¬["ß›ZØ DªØ¹9¢æ –vîž6ËÝê}¨9 ö螺ÉÃ-=$5;BgÌ»¤tÝÏ9“]XBâˆhÙ)À³SH! ˆA+ãÐ-e é ÍUõ.ØD*ñÄCTçF=@ƒ$ç5ćw–!ÖÚObæA€’Ôäm‡hv{].îDUSDڢɞ?;¸X+_áÜ|Lñ°Q=ŒžË$[²ÄH™Lh5‡k’A I n‰½Í¨JòòŸfj+l‡—>W¨D ¥`q†Û4¼Ã ‰ÆnD ?.XÃ0¾Ó4?ã¡bob(*‹Lèdòì/²¸%>'î¬05bÂKT÷utLÎo‰OÕ ƒ ’5=.³ÔxrÉ Î²8,˜Õ“öSò­_ÀÞÂï4½[ñ©a1*ÃoY§'šl‰ @ÐF@·a穃v^Á&ÜlÄQCì‚Ä3 4è£?_c‚$vZNö`bkä0vr2áÁ@˜8²a5H3àéFc¡˜î.¥UM$ aû†‘"öî—ââ­»ÞoQTê`ˆ½z±.àCIx8\"‚FØ2ûŠÚD°­$¯C{P»·¶ô°í#ÃjÊ8ðÒQšÛ©èz«g;º›ZÔ&™vÀ>RØ÷8Q¨&Rö@iUhhGš@ œs¾¼5±ZW@}9¦2'ëͰ<ÄѽA† ‘{ˆ2Ó€;P=úvœw–}Ú)4 €ÒÄdü¸ ,ˆI$Is×Ǩo‘Ä R àlÒ%)ï¿v¬'jk´“Õ2”@»¯iH²¤Ûˆ:ø~ Cº±5ô¡%¨þa½ÌΜtÅ<©5Õ©í☩1æ£ôÏ·Ó€ ‰»@—C¿:€Íö>A®,¹àúCÒ9šw¼ H^åÌùÌfÇ ?>ç|‘ŒbÿÙòÍJMä* é…@&FL ñÉz#³K0>)”A©Ì"1%ò‹¿­-ð1V`Çœ\ÌË^»¬MkàvA¤&ì¨ùwääÝc“?lîô†4ç~͆šEô«Ÿ_PÓîo¿2;À_8°[èt‰E˜ ¡J¸{ŽÍ3W\ŠÝgwq{b (¯®“Ë)< Å}X¾2Õib¶oH½¥è£G‡¾Òç4#~‘QÎ/¡ëûh¶J¼6=khc*×;‘›ï9´ 1÷Љz•¯Ÿ•hnØ‚mv©„´† kóS/Ê?}ßÐzÛ‹—@ØuC=WbušøÓrz¢V³Al]ˉyy¼-ñ˜¥É¿© Ÿ+GİÄÅþLΰ–̓Î9ò ƒíž#"Á=o*#VškhÑjÊÝ“ÙÏ„c‰nŽ«®tš°VÂ:ùä8ófÒ֧تÅé@‹J{­ ¼ùÌÛÌͬ‘†F -€ÍB –ÕàQË”@p´Q[ûO6·‰§¢=-Ô(»gÚljxÃ~ô¾¶Ø4`}ñ=ᨠ¥»Ò‚'ÖýÝpÞ-wZë;‚qp—ÛH4µP l(®«–*ž´ëK_XãÈ8ÊdÝPvÛ»tÚ¦ B„ŽW:*Í››Ò¯TcÜ-Ç,:ÃK.Âêž«LàŽ­Ú 'iÁ[°A¢;Ñ€·1`ƒ;Úß]q÷Á1&ul0ÞX_»mݻղ>œk¨ƒ@· ³ÐGX É®gŒt8ݾõ¹Ê()¬Îg£U9P‚n'lPX›×KH7J©ÀNèØ^©ÂÍÜ­‡FºuåÒ!Ö,Øš¿é*zéÔÉIv#ID!Hîµx}MÕôTHè³w‰Û#bVÜê÷œ «kpÌó^1\òÙ¬›íùxÚŒ:iÂ".·°²‹ÈIçW¦˜<èN‘\pŽ)/ŽÂkÜ8íA5QÒÔ8º‹­"Ñ#5 Wuƒš+½Z·«×½SÈ[lÖî̳¤;좬ŠÂ&[(ûÅæ/jÆ lq¡‹Ææ6h¸®_ œ}®g )+6¼¢\ò2q„¾Ûšlb ãl¶²®¹ aðÚäðÝ9›s¨íkưùL½ÞÛ^jµd´ äi6õÇ&¹•¿"1 PœˆÂ¥í8«saw[;©´ñ‘œÂñ8RØÝU+‰³N!õ…ÎpÁ5dÞRu½Új¸|E³§–IœXo7«(|ÐP÷xõíáuX9M3icÏO!Rvó½q§g‡xtX†fQoqS=E¢»Œ ,|PTâ¾íî>åìUÞ›ÛÉ¡0,I¬¡"ÔÔ%RLÅ]ưÛÓSn÷[DŠÈ±Б ä»òÄz wÐ|¨‚œÕò¬Á4ÉfÖ Vå‰âs$©Sì"{ |§wq–‘™³y¬Vžë+°sf Ï­Lç‡GÃ÷?01±•ßZÔÉLÂäQÃæ¼èZ€vqø>R íÞPU2Šï =>x40Ø2|?5ó^ª¶p›{’ÁY³]_œµE*Ø ÛÛßJš­•LWì¹¥æË»s4£«ü eO£+Ï©Z;RÜ¢‹²uÄÃò©Iö6-»R™øóºd'qšlÞö — Öµ/ €Vì¾ñLK6Ãb¯çB[ÄÆÇÅ¢šcqë š¦âµ&3(ƒ‘j€œÔ*œ¨Z‡G÷EŠ 8’+N»ÓÕ§§ ';Ûkc_Üôù6Ïm莙3üîüæ0l|ªx¢Þ\ËKÐ&Œ²=ñðmîšQ™p6{•‰Ãt›s»JyiåVç§h붆«SñJ àXr/¶‚øS?> q@ÜÍR•ØÁ|ëË Þ-‹1´ÉŠÔ ~JÇ©OD>¤-=&ûÅ)eWhV5ñot˜Â tzœRê¾y@m‡‡â&·n*#k§ñ´¾hÍàë$ç»y«Fã-O((sÇ>Ëš-‚à û­„úqezÑ{bÊáF>£”š`UâùŽÄ·^å¹ùV¾UAÂ+ö²ûîCWâWÜX7¥T§¯:´ÔiÒíâ—'«6mŠN­î~Ÿ”’Ÿ)K–ÃÒ€¦#a hyW¯È6–¾•h`µ»¶bàÒ:´Ž=*³‹¿ÇÁõßœÂuAn~JÊ5©ª XQÀölÕ5ƒ\ª¿T  žS^­¦×)1ê%àŽG¯—1é£BéÁi@¸Â¬Î˜Eesâz e³uajƒ…òƒÓùpÝèFæ\7#‹Õæ\V¯½[ ؇µ’ ÛhP Â…sÅ£ëc.SAt¸N =›C"ëÞ í˜­ˆ ¶ lŠÕ{<â¨E®¶#@æ·NÊŽã+®mPÈ4ÖåGOH’¦™/´èíTw©Ñ^ä÷ÍßN•å^Üqk"Îk'WH ‘Ò6øKº‘¥@ç#x3·”tf­~ œyÚæ,F¼À\Jbã hÑÒvy†‰jêø´$j©(;díÊ qꃖ%ŽI³K ¯;!ߤ`u)@æWŒŠõFÒ-‡V™à—³3ŽëI‚—Z¦ÒXo¡$ô…âr*¡hÈ9²Ž9*7›…Ô”\ c¹êõ΄ ¥(¡aɈ ©!H’¢*$¨J #$¨€C H€ÁBˆDŠ@’95†XÍ«&¶’6Ò4Ñ$¤$"TJ¡¨PâÙ¤dE&šÓj6(ÒY*4H¢Ò±bÕ’jUQU2Ú6¶5h­eMbÓ5¢ÛÌÔ“*“ B„ŒŒ,$¥(Á"´*‘ ” ,Œ© )ÈÂ$¡J’1(­P›S-6Ó6–Ûº\T÷SSÿÐÿ³ 0s-½jâÛ¶Ò”\1‹Õ´¢¢Y!j"Ф) im WÓJZ¶R‹InÆÖ”¶Ðµ–ÛUu«Lml±m«Kl1Œkh[ŽHdQèw-¶ÛzéJî㻎ë¦c»„„’;¸šº­½UVÊUK5´›R”TJYbªÛhZˆ¶ÔKjR’‘l)K%¶Ö2ÚÈ2 BÕ²Ö 0¡JR[@·I #',E… ‡u)E^‡k/:×awç÷ºóŸ®{õõ8´ãÇõü¿ºÎž¢óõU‡õìWëgÏ^å웃q?…;Õ¦r}ýåÄiÝøáyöïíÎÔ3<úšÌUŸ3]°Þò&‚Û§¦3œf!vÓ¥ÿ¿Žºë¬‰îùTüo5uÓ·DZýó3a‰l®_3Ÿ±AwŠ®Z[ßÕ]ï¯Uf4M”zåÃ!R·Ä6™Öer%Òt»×9½ùnð¨¾æ Ro7„’bX–±ÈÀTÌ’b+ßßïûyçžó?ùé«w"OÀ{¾¶÷ˆ#Bz°üŸçùpo™ƒ¦‰¡KŒÂ3»…QĘڨý_ œQL ŠÖµòêêex¤@¯ïGÓÈkÇËòo>Q)N‹Mß¹Œàú ïP¥œ!F}T @§-›–’K÷Uã„CÓß=g|èHi¤Y*-|ô¼<¥<›°^Ö#2µ¡À`ÃÒæÃž tà¡81U Rr;xDD\/'fFß¿»<ê FPÜp‘%›`¦!ñ“ÀTBúøzŽÇ”ââÄYƒ d¢?VI$1zi‹Qª jƒóˆ|>x`óј¥àpSoyÛ)¶-éáC…ñªS¼F ²;§}aÃëÞ;ÒÒ`³ä>€ð=ñgqç“ÙFTá‹âµ’_ ‘½"áѪ0ò||0Àö}8Ô´Ðã“IGnøu#qË‚j{f¦é„ÓMYn»æË¡“ßåáëþï…?ÃâûgæäÎúu´©|.0ï–pùW‹´ƒø!ëÏéÛË]þÞÌÌÌÏïG $È”ÃOVUþÒÅiJI uuRSMLƒcFÌY¥Ó2h•L“F)ª{½rŸ@ˆä0^T‘sÌ9æ¾ïw—çΚx<þ²F?½¸ñüsøùëÚí¶Ûm§‡€"‚-¶øv´GÁGŸotMqêÓß4ÓÓÛè5óáoç÷ýƒñøüÝpA LVáÑñ®¾ŒcÔß±&štN3›{övÖG"O¾{qÆž 4·G«©'ÌNýWŽ?ó+xùâý°qJ)JU-ªZP¥0XX`â]0Ê}ƒŠÔÅ)Œ³`ÁB—”8&XœèÅ)e)ƒ0QŒJ ´¥ •LLSc˜lQ °Ct.Œ ߥf\nO´o-Û\v*X,B )ôñ&Cÿ½©ÿ‘ŸÖÑAV¬*‘T ²:(€þ Ç"±Üêâ‡J"¤I3I €‚@`$€H€B$…#0 €B@3 $™„€HHd@„H@2HÒˆ! @€H0É @$$I@ë¸:ô¿ß©nTª'wý!ÒA1Ƙ˜Çý«x‡çÀ’ÑT†˜XF.Ķ­ZL@»kVš®¶‚FGÇ{‚ŠÎÛ¬Œ$ˆAX㨟µ£Å‰ÅXb% ~q;£ÄC»ÇÉçÅô&ã—FšžÍðmW…\=J®®ÇK­ÔŽ5»`ÂxsjmfëãÄ0\2•‰)(Z·‰iï¢ú³>by"á8íþ—CÔ—¾P²ÒúOˆ¡±8¦,|Ú.íÒ„¹N(âà ÉC³ÑGÀðôó,ÊSL¢ûYY^%$KiN0p¨$¼H2yéçðUô·£*SØy20LpÒ6cÍB‰“‰•t%8R¤(!ÀTެ§J—‘-ÚÒ‡wNžyžŽuŠ o°'œz~$‡‡Ïcó\±ôm³)˜ŒMF5­?wÓóý‘‡êœ’<<Qm¨¤€ˆB%ˆ‘øxu7eI6ùù6(NlĘD™;ㄨџGÔòK„‰ééÜåý‚'‰Dª…ã²)Ü^¼óø k©ê?è=ÿOj™”ð8íÄ´Òˆ$¡l¥pÓ"1âGàNœpˆ`ÀiŽ’ÕœðSN qÄמ086#‚ÈDšæXSí)Ư䢍ñ8³ ¥›8\±ºqýQ {Ç"ï t´ãNi&€9H$V) µMlj_ùù,åï Y¢ÄjžÚ6—9É”g9 ?CØ0+pÂ/Ñä[0“¬ÅJ¾ÃÓÉ'§¾`<‘"A(žìS¥”Aoô==çÖ¾˜|Yzx2CßGÙáÅ,Å¥?EQUQd @$ $€$D!! $L$$UTTÚ‰R…-8- |›“§U1¦1ƒcO ao˜çþ}µÇ㎡Éäþ²þ’ùD¬Àíh X¾ î?K„njݳ”‘!sàï¥óå°=ë"vqξ¤ /DùŽ|ÐWC²Eö4&~xù¡BÔd~ƒ€#©2z0IàiÏ0©DM…IŠ“Áðàᙦ<™µ&¸ºíë`Ã,ÉM²4*ˆ!ŒÇƒáèdXf§ Cá´0[=¤¥ÅÐbl)[ àE`E1 Q¬¢#³(˜õ¦’p ÑFœuú(„úa0nd|'²––ZSÆ7È‘$¤ÔDµ\hÁPCñ’„ORUTíòòétµr`û<ΚÏO‡oªyja1ðÈ"ˆ :q⇀Y¦ÞKõ9Úmf†éÓÔ’Œ=Áec£¢E²ij ii’‚d:.ö3uªèc@Pé¤ð¾ªZKõ‚Ò”)Æ¥~š ¡ÌfµÏNØ ]Ž ±Žû“æø ãìø¶0âì^GlâÊ+˜ƒÖ>H|àèxOaéÓ§&k)LzÄÇF·ütfdlÝÑëˆòŸÙd’b 1K@2AX4bŠ{‰ìù zƱ]K%`Ö„åàáÍ$^ï‡Aù÷ý~ïÓŽ8÷ˆ!£õ!ùûv0ʪªª© f€B@‘’Lc»¯Ì‰«á¶Üû’_š4Up9s5xè=Å×:÷Çtåò÷üi«Æ˜c÷Yï12© YÞÎ py¼œóG12&YF&O@L²˜1†!‹‚•¢3VÑ m4àí0RÚ¦¼ð›$`¢Eâ;·v”äàeé謞Â`ñ¾E²®c#.ð×;Uðã§úžr¢0†d„·èÃ9¦.¢S£A1Áˆh\Šb‚Œ„%¸Öô‡:,X ­yâ—d~Àr£õ!aáí¼žØ'¡IJAÀ!š§¾”àéé#RbÀ’w½‚Y´ÂS)KpÝ@Y‘ÉÒKÝ8I°8âÌL-Æše-ا\jP*Pg2ŽÍXÞ•”ªãƒSTS‚†.ÓL˜Ô˜Á!èÅXAP†'ˆ'…«„ËßÄh­±¬^^ö^¨!ˆÈa¦ˆÂq`Á‰Œ¡J A…¥•Ä6D `,Ò2²!ˆË`%ÖS̼PᥥÑk ¢@]'/eç™h˜O{cÀ|Pli8¥"2‰·¦íb¨q- )lYFV‚ÉäÓ©l²£Š4j«SѲ.-µE:•KEG–#KEUi\™Ž+1çñáçr<”¦Ö8QãcιZàc’‚RÊR•ET±1 YK)‚8Ô¦&1”òËÇEª[|>¯wÂ8Åîÿ_Ÿ—ÇGÙÓæº‰«ªe|Óán·GZõßÃ÷@$B$  BBI/•nä?´þS¡8§õ¦.ÓpvÖ–#8ëfxÔÒÌÌÓ§ô1C0ž‘˜à‡K·^PÄÞ§z»¬ôm"0K,ÒO5š È'¸Å±*Φ.þÜ4èXhZRÜo'®îM› lÀCÉBœ^0Ï*œW#yîlàñÓ¬ð…Qëg %ïUÑDKÇR\®Rš#m´%Œ2ƒhØ­ÝÔ˜Ñ35þ[¨Ð‰ ùå’é”´öuú¹GÁâ‚a‚ß@ôö‚XºÆý_Ò–‹áp3ÌY)5Ë¢|6Ô´à[I¥ÎãµSŽJ/*K#-ÕmvÓÒêDÅ{×'Âä1e8mì©ÔT√ð%x/N &*6%j•;F,ëÅ‚"”ó¤Ü¯ƒ¼JZ‚N(N7¥0 LJXYOzzyã Fx0à0ŒØªR”µš˜¿óÓO7Ðb¯'"F“IˆP²`Ò Ä²L`ÄÇ»òŠyã IÞ *‹í+S Š# cqü¿æ#úÏ÷ܯÈýØöËäû=9iòèÓM·DO‡¹‡Ç~«ÝîÙÝœú#ìOç䚟¹.¢'âäI“ÝÒOo/ÃÕ7‘÷&„Ó]ñŸ}½<ÓðVͶôÝ4i¥¾›'—¾EدdÃUo¿Гc§Ó«D‘çáèš'„$œ9¼Ñ³Tö>#É&Ÿá"!¤úyǯ՜2ÌÎS%”ª³ú]%)Ð;˜Â ˆ–%XËæþ¨j¤$Ôõãñà7Ï& ×5›‡,RQl†*¥«JZÊÔC Z¥¦+` Š$M BlÚ8”û€6˜H]Bpx"3˜ÇLÉ(æ9ɳíÔÖ}+G°Çæ ªI¡(|hI·7`ìB-åa–‰ŠUYYÀÂaFÞ÷˜$Ñ ƒ’ð÷Iß?§ÓíÅë¦1‚W•º›+ÿwçéÙ¿;z~Sßéì¾K*©¿,±î$ÇŠéáØ‡NžG:|¼¾Ÿj-"ª**+ÀUqÚDšiî?hC9×—yŸ%¯—Ê3œÅTÏÒ^qMÚ)Ç‘iz˜ÐÖ†0b¨q ©-(Ô¥Îÿ9˜$þàÞŽšºá{´×Ž/ËÕ¾””V2xˆÆ`¤¢%¢Zû<…§…n /¶|xg,®þÀ»Àñ˜Á­¨àl>Òc e(•(ˆŽ:÷¥(b;réŽz8Ø(œ4Ú“0Í'ц"™jÐÑJéqZ'Š2ÕDEf3ƱMj”œeX0ˆ©€ Ђ2M‹j»Š4¥e¦¾û}’> Ke·{Ǭqi” ‚Y €ù~ß;ÒÔ<ŒúÍI+ƒ5idž8= lcÝ·i¥–ZYx³*lûio@ÈDê8µ)á. œ,„N!‹T¥–1í‘¡BÙÞÇŸaö "Ä\XX5`¼ƒÎLD‚EGa΢°}%¥¥¡1å-°ñ{`à³{L/Àx&Ë̸ÅGf#Äâ‡2ÄQ”ð='N=ðЛ"H à•(†1iV;ÃxšJÕÌ‘u¦åÄ‹0µ¢Õ°c–„jYóü/õRÓú)`>³Emç³äyÝâ›ÝèDš#T›Ä#ç¶žžæ„žéF½É8¢MtÛ|æõ2±;þiãâxoŽˆë´lòø´Ñ6oMSØõ9H“´‘á"ú >Ú÷'¸äoˆ.ñŠaJ¬,‘UT¥˜¸îëäèñ°7©¢Ž|Íœ)Üôç°qüzú‰—¶f8 ;’~‰%"8?3M¤›V¥ü ÜDãb(¼KÀò"˜`0ïÛÏÏ|{ÔâAC}ûCs†¬xybIÞD(z½'&=fAþù@Þrœc”ZRÛ~§Ø_ñ°EW:laÖ¢e%)~Ó‚ˆZRSNÖ:¥””0^"w>¤óÀñ øXPÌIÚ2qFÞë!^2œLNH² ÐÄi#,S^$8•E8œJ7Àô;ÈÒ±¢0 hÄ$@õ=1jP¥Òé Œ*šzzx{èÏiètM )Žf+T´à%½ÑÆ…ç•rZB~°‘ÆðŠ—eE7P4fÉ0H·^1#ÔðíËMÃð±»xlÖ¡¤Õj¶Ñ¤šã+Uéëööüô èòÄ’3àŸ6I=Ýßlý~ݾŸ?§É!ek]¸Û9ÎOíÂÞ>o·¯TßW%ãŒ5KÙ.ûÕÖœÉ[ïîIùµ‘'o^¡'¼”®|ü^òrx¿4„cÝ|[:<ÞÉ®Ü& x“V?&‚jÓÑ<|mÝ;&¾ûíËäðq¥µS¶¯7i<¿Áý/`H„€ $€ ç¢=õ^Z•µåç›À.òÊ(’ÆZâoöð ¤èàqÛ¡BÊFb#°(;ÖÅ)J¦(SŠ%•H9R ¬ÀÕ-E‰i‡‚H$õ|ïU>*ojÁƒógÓ8Û.)é1Ü<^19(¢q8;]5Ìq„nžLc E "¤ÚmãfÚb*1&ž‰'C¥QÊ>õãÊYs‹&špœòl—Oó÷û~_-œ–:RFR¯<ÀFœç¾¤'vÌ}>ýþš4³Ößy‡iöÑ}$&I¶Þyt%&ÞFgø¸ã-ôI"ÒMõÕm¶Ë2'>MÞBÍòÓ?¢_''UÅV˜ÆÆ?§ì}Sßïþ7ûý*&þÜKL׈ãwt ubqýžÂñeó¥œ뇡ŘuÆ€²WމÆÁã ÜiàÕ8¹1)1L£ @ó †8¨³­‹o¢s ¬„ª„/Q¥£•A,žI/ƒÂ_Í0Ú–S‘ÕD±ž€òü%”NÑÆðøqæ qFÏK=È×ÂÌÈㄵ÷Ï1žãΆ˜·ÓÙ;Éég§Kë° y7œnà´½äôâåE"ˆ‚6(ˆæí,c$é»I=öÿ¬qç¼Btíðíeˆ“áõ×PÓ@ Zª×ËÔ“·ÖºÝ4Ø>`±’÷[¡ð¥éD‡¾yï3Òy}ÕKÑŽSYgY.©ÀUM]V©J/CŠr¸i@é†4²ÑÈd‚^iÅ YPIBÒœ¸Ç§‡BSÞ <9|ØÔ¡aLH… ÀŒƒËgKYLúu÷‚¹·pp_gƒÜ™ÜúzŸÌïUTEU 'k+̯Äü¯–vçÓë]¬b$îL}wŸÓ¡'ºoGÀ‡ÜDÁOö8#懇ª*ª«ðxà ‚mÓ„õå–é,ˆiGgÇiÖÚµl•£QÔh­úþŸýaìø$;&¢&ü\;uÁÙ1$=ÃÏwÀ@T` "1ƒ@c¨ŒFˆ £h«(¬Z( @ ‹(,DQQAˆ‚" QH%R}~µëõ¨¯§5ÆÌ#Ž6jŽ-‰Þ ÇJ,‡òÝÌN–¯7—>½ÓB=w€’V«š«©B „@’˜H$¥)¥I(@ t•*hH@ Y,’HBB“M6’BI I$’$$$ ¥¢ ’ZI$„ÓI!BI%M$– Al’’I! š„V°„šj@!HÒ’’dH’I$$$ @–ˆH!BH M4’©f› I !$$’ !‰¶$…( d”!$ DC"M‚HH!$$ kjÛ @ @e€ ⃪˜È”æHb$n1ÿ›iÅ͞żõNp­RÕ`98(öœ±˜²•Mxö$¶“‹ÒYLZYJSÇB}wu”Ûòpq¬6Š ‰H@I¹Íã·XÍ0iÅ(µJRˆÃ…0N›jtÆèÁkT/pMÊa*sÝ 3'8¦4hÓV&L˜‘Ê, Ž%¡9Gal!Öˆ‚$J$4Ô,Çygv+ôw)ŠÅ…¨ Ê9‰°"a–{¸)¹÷³+ïz;Ú¸ Üt…”¥4¾ÏK»ËŠ2ËáÁ§K'Šnr”K/5Ã)†§6D°æÁL8Íá“¢iÆ[¸û;RS®ÿ¤ËøÙiûþIðI#½}ë>séàZv˜Ã»ÅQS,aš DZ¯¨öÀN`WþŽ!#ÜÏÂï"GŸdO‡Ão?ËM=}3ö¿ž¸¾NÔ‹ÙEóñÑß:©øKŸÄ~#Ï ô^¨ঠ®þBž¢gS¡ì³övä}w7žõô%øùc$á`ž©v»¼¾{qbw¯gFµ¹ψõß |úœ ¾ ¿§ëûШ>iû}ÿQß7ÝÞø÷Â{ð\&0[rcåùïèmßw£ÜšÙ< ›ŠTˆ@áÜM0Pö•ˆ*®˜U¡¸ILáî‰G1P48¬Öv˜£‹/ÀLYN!ò0øx‰âä—#[X¡o·H‚ î34sä a†«aB”‰ÀjÆPâoiOËÓÈÜ'LBmSeRQá±4(p˜-`Ï ÊÕK‘ÁPDîI†*ȱÊSDÂR“×SP³€kÈWšT^&Äî LˆRÕ-ÉCàÅ™›0Åkܸhjœ\‚Yƒ$C¡ÒÄ1mÌLrõ˜ìqŠpƒf™‚Œ8KÁf %Ed\&“Ž He”¦0P §N2¡IMF©HaE•‚ˆ‚± ]šlN…ljÜi:KÈ×B½†<]1ÄÕŃD·‰4ì„Áe©K(úzq§D)D¡âo.ôs ú}žþ*¯BÁ¨y‘b¬Ÿ]÷áöqǪRú.Á¯¢>»òÑd…)†Í¥¤NMĵ­–`Ýš DôÙÖ¢”²ŠSàpnãÏ|§Šf"®#x0·K’‰ÎAh FVH<%ç…1Ko‚t:vFx@/ÀÂø=‘‹ÄšŠTEy¯’¡&& 6‹Qi(Í"Ñ ’Ûr1¤££bÅZ6$’66(ÑŒ‘bÌÚ#Q$šÈ˜Š6Òj* VøÑ½{‘|»ßw†îâ·„qd¡l8E‚0ŠR•(R¦!!é+ ØG1µÁµ¥æc”óÑ<…)N=J–:…éiŽïgx3ëÞuGæë®—¾Ýuå-¤ZˆÛYš×HÂ/–}}>0)ŽbA1jœX½Zk$’âOª?hæÏÇá§¿O§áµÖxBß'ɇg$Ñ_ŽÊü½S¯Þ$tŽºÙUP²ÉLˆóâ&Á<èø¤-œÎo&¿”ø’jÔj—”Dõú{ËÅ^«Üú'ÑO®›5FiÁÇìlÛe?Íó 'BÇÓ´¥ÖÍæØ-8 <Ŧl´Çú±Œ<ÃáÕðŽÊqeO'újw‹ì* ½b‘¼mè@žÂ“îyß~O5Õç,Ói¬§-‡Iñ›ÎA‹ç¥É“&“Y$£6U„†àÜ‘€óò^hωàqë àÖ”‹Ûá=½1u¨2¸|NsÆ…ž[ÒÃ0ÆTX/AšP¦9'w[¥¹KK0íT¶¨Ð 5JRè3ã. bô°1KZ¢Q)`PÄCK'À/ºxk,´Å.¸¥¹þ'ýóôŸ/áôÎ|pÞu|ÞÒC›wÍ6âòðlyŒIޤ\Å"}~¯&£“£ &¾|ÑêÞedÃàRŸáÐ^îáí“'ëÆ2òÂä£Â%NDdM,‘'BâjuÄ·`¶+:.e”ÀÖÛizk˜Äé-0ñÔ§,§u¦*þ?,ð“xF³€Æ0µ2žÙ§7¯Á?ÇðÌ4qùaá4”äçÕüx>ë?põS_·÷c˜¿o¬åS츽ìÄ–9£ÍŸ%MŸ#;¢ŠaÍUU_Ã{4üž’ÒŸy(«ïO `¯¥Äã’þ‡É$ð„ÿ×ÖDõ¾Ü¦-sT·Ð^(÷p\:nQ‹©(ŠœŒä†)­·ƒIã¼_O …’ÛM1åçÓo¥Qb·½ì–¡ õ§ÆRM3øøˆ¢½/Gvu1j±AŒ‚D|}ð÷ÓÓàyHw§´öà »†8Ò– Ä2X/¢”B#H”  Q£U4­©¦ ­·­¼™b”•´`I’z¶Û[é R‘j€iJ„•P¡P&AÓ§`èL4%,cÓa¨hP'h’#ˆN€0%aòoŸ1äUqá¨ñ‚úhÞ u Ü7¸–žz{á¡o úÓÑÊ{ÈRÙBžk(š&(_B< eGÏ'Nži)¥-Š4ØÅ˜ÆÀšH+¦SK'kT²t- R<_1ï‹Ó #)ìŽ= Y¥¤”°â”²–¨ »‚¸’èÁŒŒsœ¨œÕV öÈ🗧¿¹âl0“”çLV&è0kš:ºÍµÓjÑbjë×t“9òëtü§£¯gŽ~oÌN:2"Ié–|O&<ºÃL§TκiQŒ5c2yhbÅ£6XñA!‰ …ãÁÅ?ýïzž{ÙÅò0IçwŠm‘‘˜à‡ó Ä^8ÅPÉÇ€Ù;Fpt¦Z¨h¡Al«öOùÿëþ§ùÿŽ3ž§ýú¿ðØ,¡„ÈD@2è¹ai‚·”훃™µ`üa¿óÿåÿjëý/ÿ?ûú?ÚÝÿD^÷nùËÿ_ý<^nO,“¹—À˜|_Z˜¸Û¢#¦l¶Ýªÿ÷À8¶Ð²:.KLDšëx¯5¼ê¨ÑxjÂ#¶™Æ’ãnÎ0¨øµw­Mc,tËKëZZÂ^¦.ŵãx{Äãk¨hx¨²Ð°[.0ÆãojÙw³Ëd>4c“Ë3k3^Kr®1 MsƆ¹Þ¸¯\j.knZõ‰W–[YilÏkeÓx~n`ãÀtDK®3< ‡–7µat5Ó·µëlï ‹2:´a9¼üó×ü?ðAL±î¬ U4^NH6}!GþÿÙ|*¨Q2G'>'H¿4%iøÄÃÂíó°ÂÇábH×1Ç~ô÷ù_k÷?CøÏéý+Ï_?z§ö¿hÙ” #ltéOƃ(®:§¨8yµÓtê¶dá߇:UÞ0½¯/D†“Ül(×u"W ‹Zt༦t6wÁ’Ú#îÖ 'Ä…žøãdeóßx’*šª8žÌÁâÉ+uÀ8â F:;­B åCŽô-p%;М!ãaM«„@•¨Ó*Öó»Ó§G§D)@»QÌsC=‘Ù ÓÕ¯YCs¤:ˆªwˆk¥øÊ7M¥B+²S“Õ’ÙÆ¶âìÉëàÚ¨ã¼]‚p˜ÙŲ,wœÀ^uµSµÇrzšá‡l¦˜7½nX`ѯ…#UNÀ˜ëÁ ttîpY;ZõSS²LÊYæÕZTXöÉ$sU«ÅÓå´9»t5l™èåZýJpè2î”\T)Wê~µ3ÆÖpügÖ .òêƒ%øËn Ð#3µ±ë¥è &áêÀ˜dÙÙÙ Îè3²:[Œ6«Ñ× ,ÍžÇ 2³£¸f ì é$TÄõ7«¯AÞÓµ Ò'h;”v\òˆ7}ò+]ç;Ý^ýwAyµ*ˆv áG^ëb0FÿøqmÓÁ°[Â5yñºg5ñ·Q0Æ“ýZVoçQõéÝ|Îê7ý¹JS€ùåOJ1§ãh#ž$ôWÆÈòSý@è |!ð0ÂŒEpR—åC¸‹ÿ|N^Þýúoš ïþ?¡úæ)0QR‚žã¨)øÿ½”û ß韯Óïú}:ï|×Ïí´oÓó[ª~Ú¾‡ð€d›Z–"ILÊ ‘@Ì4µþºÿ Ššïðëoù`X0ø/¯JÏcûiþÜØíó*B#ú…ö4q—똦&<Ÿ¯ö§›Êlèrv’Š?èƒý=ïsõE}$J£Nñòâ=ß/§³o½Žß®œ·ÏßíŒm¿NZ}ï&qÙ~梓 dNœ õ„6xÛ„Á=;Ú!ÿOÞB}[RPSI¯Ç :Œ,L5ùpj†ëœMÿRAÏòàT@ÒSчҴñ.[£€°|waÞOÖ8—Æ;G'ÿ<0ºÜåŠqÎŒGÇ0ˆxbÒT뽘!9ÔXÊO„Y t„æó†F‰bílñºCˆ ¡ð²^w±;3®N×F¹kV½ü°wRh©} !à CbÍépÏj›Ð/ܸ `·ÐF}<“û§¾Q"¥Kïaýè_/Çöij@ó:#D .çU)wǼ)Æñ€bÔ&y>½öÖœ§Ä¨ü`Ê(Ϧ~ðž÷…5Yªü/~=ï8u.ÉØ4i^¡ aÞ 8d@=DŽÃ¦Uä4i483L^2bJÞ&“²vÎ#¼õ cG<åéåàíð‡ ÀÅxáØŸ#Eˆm?z¨Yn€1ñº‚FÀvvoó†R™ žN?ĆÿšÖ“û?èzü1ÊHþèÿäèÞ©ó÷5K‡ñÿ©ÿÇ´ž~NR¯áù~?‡–~Ÿ–ÛßÇïúé¢éÏ?£[ò€;Rº•RÏÓ·/×?¥Ë·|?\yv×}7áúÖgíž^ZyÕþYx^þ˜ò•ý?G¬Ëù³/|{±„, ™ ÏãSoÿ. üNOÉ;ÁðûóV»7=dp̵&0³´«Õá©ÙÐ~pŽd ýñöõ~>o\}vÛÛ_Çñùçw-wÉ£Á0? qýFhðè)ó·áß?«ôzúŸð¤#ðƒ\v,·È_ô ¥ÐH§óÿ}«~üVïß73Ñþ`KaŸDx~Èû§Ò}Ö«•N‚%=sÀþácOE‹nþ=›¸ÛÆýÑï"zÈŸ&É6ÚüfÏ„“ÝÉSpô=¢ŠÀŒŠ) ±“( Œ`Ñ[»e_¯ÓËÊþÕ©ôò¼~Úfeq‹a:%þäýYŸÅàM`‰ÉÌÕåûßÖJðG$èvŸÜ“YÓû‚èþáíýÜôD/#æ§ö4’“L±D"ÒìßÇê¾ÃýNý>?_%°4™îÆÎÊÅûøA‡ÈÄÔ¹!ÏlYAëÂbH†ÂE‰!!Eˆ#·'úó×ÀúI'™ýDÿwƒÒûÈ£/95)ùûz…–UgnˆEÃÙlÁGÃNö¬ ‡¬ÔQ<‘ê¼tÜ$ð€i|Ò5áQ¹¢"b¯¹ø¾ Õ? ø]Hû÷TÓLýè¾€~¸G]'Å©ù’]0k¿<È’‰(¦=uÓ(UétÏK¶ÆÜÑŽuÄÊŒa‚îCûâJºâá Ð ˜#™cAÓ0+B£…¦aPc —U Pª‚¥ÔÁ1ú‹³#ä˜Hyï 9؇$* ]|¡åøÎ~ÓC_¦‡#îÅ¡É *1•¥iC&éµ&¡¦®i(Ø©•¿ Œ€ÖtéSUes‡Aë$s‘›"ծ߸ªeÈRo,EûOƒ¢lðU(²ET)Q²mœ0™’QHÓ6Cãí$ùpŸÚ÷¶œ“ˆ`ÂG /e?»Á毋¯ãï;m’<†L#31Cñ<ÔUMúÆ?òè Ã7#ö:†©˜ 1Ó ôc•Qz‡Ç~{~Õ£Ûò?^G[ã25Nq™§ƒ¿xH@÷ΔhÚ_|ǧqo‡yÝݽšã‹òÍ ¼Št?e ,ÜÕ•„Oîm?šˆ‚wÀžxbüîät÷áÅ™Dàj(2pƒ&œþI¡õ¾ÿ27Dö·Ä1g¶9fCxâüƨú?Üý¹îÎn3œ*–;ÑHüßýI˜¼ö~ŸRLO䟉™~y``ã‰ÕÃ]OqÎÃcþÒI'a¸aCáah|.Â1U†ð¸3V>›`Ò©em×ò{OÈúž8ÅþeA>Ž€qG_NšÙ RP±HRPP›ã E›þ`gƒÐWæ=OßËåŠô ß(#Ý…fEZ~\¦tÎsõË¿‘–þ†éªs©'ƒ8ĉ›ü¯Ñâÿ( 1’rqFOÂÃðÍSO 4Ê (18Š1ŠàŽa—/2vÝ ± ½Føcø?/ÜôÐúüÚhª™f"Z"‰’ ­’„ÁhL›DÑŒlFL JJeIHÂÔŒ0TÒÉl‰)LÒ¦Ê5&ÉS*"™EKebY«L”‘¢ÒZ$6*ÑI “–ضÑYDha*Õ–ÖÛH@ˆR+(„ ¤R¨S1 !¢µ$Š£ « @ˆ$Ä‚ $¡@«Ã*P  0¡ 0 ÄŠ’‚’¹D ¸2†(¨Bˆ‚T± tH;'$Ѓ+IÁû¦&}ß>¨œ‰åSÝ$¤|ãΖ¨…X:IïOGèH–ÿù¼ƒ·Åq7 ãëìxæ­ZÓØÖUxh¿S¨z8¼'AESâö=Œ"âÇ=ëÔ÷†ghýÀù½H+å› HÖ-IE¦|œŒFíšè˜’Ä6ßþñ‘zeïªå†)qû1ö„Ùîþ)Ñ“ÐjyÛfd­VlOG·7º×ÖI¯ ð|êýz‡P¡ D‹ò8ò*fòûðù·DGõ€ôuâcbJ>ÆyH>æúÈ3'‰;¬HZéI$Ÿ·ïŽ5‘æþÏ×ÝøjùÁ­æ·†^ÚÇyU¯«ï—æ‹à£ðñŸO§>’yðýìL¤}“«LxÆ÷øáÈrœ°Ã Â, Ì1l1J)ÁO`” '—rPŸ”‹¾©zôxsŒ*É †š31ÌÇ'Üýàzˆ‡p%=ÃØu]Ÿ}ø_"PÈ5Ñ;ª¾?„„døÙkGºÙ­™…šw¤ï£÷>²|ÏÁO#±ãòWä÷þÓ÷êÂ1ŒàÉ…–—ÃÔÙ•ZÚæj™Y}ŒOo¬ŠÄò§ÃÇð¦Lå˜Yñ¶Pt™óC¤Ž¤È€në­Í¢¶M&¨´h¢bŠW¤†J†•UR!h ³ÖLdÎ’Lˆ¯Cç0×înwí˜TÞñQØ'T C ï?d4o诱èýNÿ0ËÝj>±M&ç³òúÝðÇ÷“^»†^F $~ßý?÷{?—?¿/?ð-±ki3Õ;wþl-BÅê>8‰ÃOwưüñ“äŸ)$фջœˆ„>}"W¹Ý6Lqáë#Ÿµé/+ïSÞòPפRÌ}åõÏß5£Z æZ¿‚5™DÐü½ž£Ê"péf®S5ñÔOi:Ì“« §çïÅòˆfà B1aT)ÖV8··á=W¿ˆKÏ!³Ø<¼=þد%M-Ó(&E  ×™ç¾bãìZ9zš~[ëk'ËŒMÆÉy¦hŽ<–·‡ý¿ÍrTÑ„ ÄÁ…Ñd2;xnc¿9úV¥)Aº@@8 g–WD8¤ áADg)Á±3döÏ`Ä %&r‡†þbÆ„w¡êÇb¥!eü(!üÈôFhXE˜†·ô C(,8w§'ߤÐsÍv’ò¡çyÝW0†%ÆÀ0Âän.ÈëŽkr8 Qi O§éX±ᧃcç“áÓ¯Ö»í”Å„YÃM“Ô ‘E¬ò‹± A]…%ž•k¹‚ó `6¼uâvðÁqa±Ø6¤Àί³çÉôˆÏu ÏŸ’ûð¡È¥>þB冚-„aaN™‰ER`H”› ƒºƒCÉñUCã!ñ!â?;öžýY><“¦ÒL§yw (r3Øp6hÀ èä]†x81xfuƒàwìbÿŒií›eY×!;‡'ÛYû»ß[î—Í=ÖS‰óxyúùݼ/[1Ýpš(þÍ-ãWrv|Ý&“tgMe’5ÜóoR›emƒàOF¨_D×¹!îÖZÀÕR«ü¨•ýVÔŸ_PóSï’§y<Óƒ—ŒžMŸLb჋•Y‹™’<`\$)b];ÑŸpç˜Ð‰ª×L }pbAæÅ!*"[6çÍaà˜òdž7|ë¥EEÂaSÁÒ ä’f?_çŽýz§q®ä‘¥ƒG”ûcêúDÄ´9IÛwtð}*{§Rjp‚~^Cü>d2RD´P5BE5/QýOÏ@”{‡ûa¥H”(Y€!†÷8b?C2 FT¦`(R„ˆE5(P£„"=/@ý•ûiœÝã¿=ØYˆ{àL‘ìÿã?¿¿ü-oA¿ùšÿŸïÇûgúÿŸ×¯üôÓYߎ{Óhÿ±¬ŸótKœÄ0«¸ÿ™×ûñiqxÖôF#ý¬,ܧ# 6 ±‹î¸<h½´‰~h[v­t6r¸ß1[½µ±Ì²Îm†x½W!Mlxœ·38€d—¬ž]ë3<Ï/Êåj•ÄÊÝ&FöN¯1bÛÃÛ2p,·d:¯[­°oœ"Åš»Õow¾fÈq„Ç«b›ÇÊ0½ÃÃ^úªÍÈÒ‹c6\W»¶Ñ‚>ីLgX›ÛU¿-§^'&¯½®‰Ëߦ ¥ï¢PP‚ˆ¡aóÿþ,žøþð)ýú[ýœõ+M»¡ÝÔŸL˜= 犓 ‘eÔX-)@(nÚSLµJbl$Äýpã.6Aåæ8“Š Bò4þæ@>4ÌCêvq+†úþ™—às™ õtèoó&ð‘è‡ì§E—¾TAmÕÜ)J“¸÷à?!û=Êj(ÒÈÔóA`ƒ½³‹v$D&*&œ©8…uÐ@p–†C¶˜‚t&ZÅa½§µ¢ËÈpC—P~ ¦ªIó¡2/ÀöÅ»¢AÀõÑxE7fH;$Ô3!rã…%×—LÂQ$–z`š(s =úw÷ß§ãóǨù÷²ºÏ5$DD²––ÙÅK,S¼1¼´|ê>R¿_O<Ò’-Œ>Úx’’L‘£¥ú>( †á'; øœ âgn!à9cÀ‘,IW2Þ à±9Ç,EkÔ1´ò‡ÛFEF\ØhÙŠnwÉ97˜lئ*·@èhÐAK0÷c³!ÐÃ9»çª·e4¬câ?ûÿ¶ï˜ò:Fg'.¨œÝ8íІ§Bxoâb{ßõ_ÝÏžl»}nþ ÂB=á=ðÿþïÊÌ6TózV-™¨µ,JsÍÎim;ÄqÔ}Û3±aÞlŠ–Ø°dHÔ£E8ö5AÈs­#™aŒªî0d™±9~©®x;®ï 4²Hòû|\¾ŸŽ¿wßOá?Í_û'û*˜žD²Sû°ŸÝŸî_îàÞÃuÑÑ;zp­Pa—ÿ88< ;Ô¸§þÙþßïüø€Ù×M14Ϋ[>¿ü—óCíºyãõÆÿ¬Ãò‘Œ[™ülƒ£±ÑÙÍ#”ÇæþÎ?—S|g,ã›g@ˆ¢V™,²ÙÒLk´%ëpTÖ‡r[qçì‡Ëžáå9×ðº82NŽ¢Î xù©<82âŠ{¬ Ó;Ñ[Õ%âͬ4w\¨zúÏ-ëlÇÑððüOa1á!JFô¡@˜ ’´3SC#` f`µŸ·—KaÂ=:¸ãª^ô ìoîF…)A_¼RÇûsûÿ£}?Èÿ_óýÍßæaêËoò•ÿ;ÕU­|6pª©§ÿB¶ÛEêšÍ´Ñ¾Î ÈÍ}ßcÀ¸u´Ö_Vœó;˜å®]–û€—xzÖ[\6決Ï\„ick¢ëF4™´ó<›E¯HGdãntÝq•³È}áù/aWSkÝrÖçʦÕKµçš»s"¢Ñz¼êûÃf÷‹iïËo*jæÜ^*X¶ÖK5ôïJân/R“–ŠÕŠÂÛç1Ègc]]fYË®#SŶ =¦»yßy„›îöýÇäe¿’ÛÕG;yß:ÂÍvXéåG=z1oöb°ÒÂ8˜Ê'¸Kõ8rG!QëÕÑ6dsÞ:3h’K—~®ò§z\rqÌéR:r1ƨ;qÝ¢h¥Ô¦Mµn7\ ÍuÖpPØ¡Î-7wl¾"p^$®¥dƒÒ7*:ƒjMËè·K†MŽ„è àJk¨Ömõ._—ë] q8˜ÝÏF)k­¢X)„åê#7èu\ë®.XjµÃðcAVî¤×©SÓjqTv¨‡+µïw#¡Ëq9~¤3S; £XÑʶˆín²è¦˜ÕÕxÄìHf¹í†áœŽöu„¾u•<Ç1 ¸¾Eøí›ïšq`‰Åà^™hôƒÛ¦ïÈd= µáízç|δšU;»Ù•Unb§v˜Á<µ§ès+F4'ýøMí<Ï3Æìx iE¨d4óÄ:•ã—¢eWCiáÁ£‡Ùð1ÂcÍ':–&–ËÇA9).ƒ¼ê‡æfMX!ºm ©Ý•+Õ»:h‹u¶Û]7‡6 ƒP‰Ú ©ê[ƒ Ò.6l.¨õÖ­\W•ˆbù宽”(ò´ƒÛÄŒCd%£œŽì„r;’k”à¨O@ R€+ VØÕÓźƥÒo½ãÍŠ=lµ†Ð*ìY<-“è =;âHÒzÜ(ì¯>ýóÅç[i‹á‡ÿŸ²¾^ç´ˆ„9q뎪¾õûjŒ~ëÅ÷öƒîÿxÎ&æŠf>¾Ûˆí_§Š€,oí«Ô%88®íÓj›ÜY°Äu’*”í®¶(BÈÀÕ_dä®N:¡M"·^ñO_G-¹«¯  µÆwí´”ìã\ÎWBu„Ý8ºÒVªà@Ac¹â½“FÈèúÏmÝï¶çž)V¾RžuLþ‚œ ÑÅ“Œ„x4£×oj½é)áSÛ õT œ(æKÞG• ߯‚”ýH$ |‚”€`>Ó~m¸¨‰ðÏ9òÿ Ž=å0”@–ǵ¹öÐ6Ûa*]>?Å“3¥;:޵1léëž;ó׬y>ß<&€(Z—øÉ¯Æ1v@/Œ}ñÄîSîÌWø@jh`Ù4 ,@ô.#—SÒLšk Ü_ ÚÍlø=`f*I‘ÝÒ8ƒ‰¶2n¡¬ª:³¶(µˆµJuÔ& zêGRÑ™‚ä7Ó338ƒˆrâøÀ¨74î¿9Ñ’• ÛlJMÉ.HY-²6 E„³4IÑ'p/ ™ :íÎÈq Äì…‰ Žœâ›#‰8Ð@ñ˜ó Ê&-¢`‚‰Ï,¯Û0¢:æÔÛ “»‚N`r:A’-#¸âÂ`©;H9)@›Š ˉ⌠Ô÷Q޵ôxP8Aˆ/Bö H g¶W9\GdŒ³0ŒD°h(fÆŠFæDËBÁm'@BÂ02) ‹çÂ’xŒrÒO0#Æ‚„ÂψÂB4KY+¶Cq¸”ÉvFñÁJÔî\ ¤‚á"bJëž¶A““ vëœÖk|¨KgɦoDáŽQba- ±`¼²œ;IWºi8Û™²Ô厒ÔQ)mº9ãRŠUY¯6£‚MÉÁ\!I:ÇJÃ0¦- ƒ¥”ÒÊ$Bˆ-°HžF‚Xˆ@§“ô“ÃI:uÚ‡Y¡iã©ØäŽ²S°bB%z‡eìÃØÛÇ€L´U"`¡ ô7p冓¨0!À´kÁØð§8ƒ)¹'êË-[:£¬8e*Ž›·Võ:^¹¶RÐød•AEEE‰Á­z2¶j™5óÍZí­áðN@šd s`è•!ddˆ‘<f%fªI–ˆ$«ÈדýÊ"Jõ„hšR¨zÂâÍ*×Y$à ² ZlÉ&©6ÑÛ!¨ÀçîF•"îìÁÿ÷góOí^èwõêVLÃ׺½Nã€'ßÝît5°s‡‡„Š¨ìƒØF¤˜6÷:‘0UÆŒõÍçc/?ÂDBœzíØýøäÌ1Æ|íd/âë¿’°SƶlQ@X¿¹ ¤PSÄÚéí€Ò‚MŸ{à3ç, ÿcæF|e}B«í¤u‡Ï£nOq°>ÓÏ94ÀÛ6¾ÒÏý¶¡“ùþê?‚§÷1­?§ök ýÓ/•;5ËBY_8¶ï¯íâW1œ²Ë[|ÍTàqô«'&ûºàMe9­llŒÜMˆFkζëÕ·­JÚg7vÅ­$ìÅ·{껫5[q—šðó/{^·1Ypò‡m¼Å÷S7ÐámÉSjñöÏšâÂò8»Èků7 Ø"ç9kfÇ{a1ŠÖ÷Õó¬,NtómìenÓEÞ¹Wx|aí kŒ”j›¾·£ µÖ±G¶ëmÂàµvØEæ×ò³·—b»õðß>ü¾Þʨf¯ƒºl·£ãlCÚÈÕ“ +;îÓJ’ЉVBT8ÀpFHâ\$%` •$% ÑG,"˜6ŒPH …ÅIeU tíq3çÆ™ƒåI"€rdQ™Q~!ŒÓ5SߪI.R*¥%xJ èƒE —4jBµ ,­V(Ž¡±u³T·!*¥œô;»á̷¶‡„$uí .ûøyï%‡©êv±y™žý”÷¬÷¸®+y·Õ#Ö@ï;MoΧ ð~žŒ8òÏ|«âJÅ¢ðóCÖy|óáðÇ¡ˆP÷'ÙMÆ ÕÐÂh²‘˜29Ðö öÙ§§Ì4çnϯÕÓ¨+J©)ߺu5Ñ«6 ëO‰¤ÈÙ†æÀÀ&óó÷øüý¯§Ýú~[Ë›ŸÐ¹R?HýS0ëž/õý’“\¯xõn–<èâÔok›¥s¥¢B"t/S"¹Æ—–0—‰‡…zž\3×q˜äݳTéá›X3œnaSIÛ¦ì’h¦8Êð¸bz¼¹ÌÀ¨r+=dNõR:B¸T`ŽY/€Ü¹(§½Eu „àâÒ9’–”/uÚª†6µ£:–ÿéNj呋Ì6{ίÏXƒÐ‰‚p¶ç‹| aÄÕ‚GBY7wËc-ºï–ïP(8éMó«DêK§tœ¹ÒˆêC¦´dÒÜA΄›mi×Üa­Û?)4¾mh…„]íf5NÂÊ cUmu2/P¼4Ši ²Ù˜H=9â>“¥ú–=:'‹¥KÌì=·™™¯HÍbª3‘™h°ªHèJp‚ò”ìéfOW¤h¿$`u'£µu†[…®žÎ.ecmrêw‰Û”¥…Sº ×A&تÓfàÞºõºC'D³bÝ^2tðêz½q&Ù‡/ Øíu<ÜÚŽ&äYÔÕ‘¥ŒFvüi®¥ßÚŽ‘Ù¯n†“vwÓËž[­jÔ¤b·°é¸¶¹‡VT(wL,FT!CjÙ[©Þ/ATcÝB±cܧþ”   ñI^zmzØ2ª‘½-[ié2øä#@Ší*áp}q7í9ì%ÊO'#lC'±‘ëðP!јúúyØûÿÅH¸OÔ×(¦ºMÖprŸ¨Êt*È(稞€¥)óìçüÖŸ þß_C¯èú;– ÐÐhAºÝïÿÝIéÃ@8O3徂tyçµuyxß«§ŸgïAD}¨Å­¦ÝÒsF¯:KŸ˜³õû¥Sa‘†ú¶ ’ª:œ¥z;YEºéQ1޾Í‚Þ1ÖÐ::“:ašŽ­C É.ƒ¡icÀÁHc£HßWÕ>èš÷óø ¥€€‰Cú»Ÿ“õêúûõé,çÙGJ‘õÒ7Ê­èZ„’¢J"¡$"Ó³ÞuvtFž/~t÷bm^,cÓ—N·ß¬íwWÎDBñêâ±Ê¿·Ôü}Ú÷݉ññׯ‡\=§KÜ«,ôÈI €¼@Þ3^ÜèѨÉ%÷ûP+Ï 4. xu'‡y‰üÎã׿Æ– &;ýÝx¯´Z‰RRжP¢ ‘¶‚G³Îžj}ØáƒJÔÔ¨ž(„SÌIÐõÁãþ¶ÛDYN OêxÃ{d)0]ƒáþß¿°Ía˜17^Z狊Í]ûõäòÆ+öÑûc Æ;ÄUÎXCnŽjâۢ !È'ß”â«täÎvè¡¿9;̆²k©‹!&idbFÿÑ$OŸt_×6ì–¶`?úÏÃfÚïÆašÇ1Ë0î§Aî¯g,ÌÆàÙ(½GJõe›@ÏË·Óå¿_–µóß?N=¾Ç¬ùå·ó“µ‘Uj©§ã~ܹg’þ7½ð]»õòé©ö_Aio+ <:(FïÅÜ Ï·†ûÄp%B”‘ðSIY‡Ÿ2÷|¾g­[c§äüþßP*ŒX‡×Í?aÌäý¬í<|-'o41qo;ËÆ&õÛ´Ó %8ðb¹A¾9?©ÿãUUGëØÿyêfde-V-ø‘Ê"~ŽÒ$‘5&Á´Š’@ópV(Äá¢f¡ ”+) ÒUv6¡aë?I?PÉÔ¢Â!ëÜÉT;)VœeØé ÙÄÄ~ÌóñájµÈm!Ù’7ÓvŒcT²u‰ÑÔÕé:ºqa¡Â?]NgKmUWÎýׂ xº16'÷»pÒE¾šä—wQ0ŸÁt'¯}y”ÈÄxvŒôä2C1|]6“%%Ûr›}v¹×] ‚WÇ×'÷»”ÍzîÐgt™3w®öåü•aOûÞl±Gë0QþbŸ„%¡‚’ÏíùW_;²–Rli0g¾ïn¯~¼¼{ºº1¦!4bC`+Ï}å~®ýçSÓt³}&WxèQ³çBo¬òüRŠ‘E™x¢)š³0ªu—óJ'–Á< 66Cæ˜ChÉg¬±ý;˜À~[ßž—dÌ%%I’ÈBµçwK¦§«¹Œ¢#5¶Ô`ˆºØÕ÷AŠïÇzósôVMínH‰}÷on¤˜ŒÇ}¹{ë·åv¤ö’ù+íè‘^Ú–l‹=uq (­ÍÆL2O¦öó|mÉÎõårDÛù×`ZÊO¶w(zØÔýÄb`ÂSÃÂðÎ` È3ÈÁ¦1‚ó‡†%e,¿R»’\é{Ónü¯¯7püI©kãDýjŸ³ç–© ˜m Ük¯&©{´6¡zöýéÁþ2 2~Yœ™†XãÌóð2¼˜´#¹ˆ;” 1(ð$°Âà%p÷cï&6/€¥Ãó#ZÍ*!­‘HËd(ÿ_¯$MbäXƒ!4IþøSæHb¡/ÎÒBµY kBQ%B)+xTe¤Œ#ùÈý¢X· ÕÔUŒæ;J„ÚœkŒÈê‘%îî¦MÔÂh~_ß(T*Oû=CááL‡%g÷¡Oû¾K˜ü…Ÿa>%@þé;ÚN}‚fñûû½è=ÝÓ¢Îc"ª-°ªÄI^sÜNÿJyçûþ¯s`{ÙáçÃåaÔ”s;‡­Ð¼ É òñ×M…zŸéùý‰÷碊 ‰é®º~½ôdó”âúe2ˆž7ìM¡å  dä© /K¤¤};^wV4F9sW¥íë»Óõ\ЯjèEŠ A¬Rt CDY!ÿÓüù ÿ#þ~¾óçþ”% ÛïøÔ×D¼r±ÿD£å›*ú“xt9X")Yû²3 ­DFõf?Éááy{jðÎ/†Õò ï„T«,Š×Xç1 <ŠÍnúâo—¼Ep1—[šæ©À­|îa×Í\¦Þw6Ó3ó9*²“A0“ËűUˆJçvQZÚûÞWwæ^sŽ[FNg1žgÞùºÎ6“™—r7›Úx&v¬µ•°ÙȼWw7Œë½UshÚ_“E\L–Ýw-cv´ñ) Œ#gûÇÏÀ@„ˆ¡(„ ”ËÓp¦bƯ¶ÜK{n›×v£†ŒR/åësc^Õrþnà± Æ/Ü£^•sER¼A1MèÆ‚]f%2&±®\eFÉzn[b¯¦4ÓF‚Ñ®í‹énÍ-$˜¢$¤±Z5ÎZCDjMI}7+r×Ó^09‡º‹•ÄÈ,-•|v´c%±Îm}wZ*‘ΣlT^+çÎތؤf‹Ók™ÍF*…öÉ™¡“× ÈOmo›b"×5ËsUÍnZ¹»® m»¸ßÇ«©íÛE|ëše(ë„´”$ë¬S˜ €¦õܨŒ´h-EÉ8—PP—2{ìö±A‚D¨†8¹‡ø¡ð¥ž ’, L,þ¼É Ñ ƒBFcæ4|¤×\Ò[øº{èÙø. pÃ$OÃ9:xq™p±ö0ÖkGVy@ÈF&…³¤7²àú¥‘¢¤æÁ…¤R«›RŒ¥a%¡h¬F›I åÁ‘2v¬ 74 Ǥ ¢%@4²á‚ª"wÞÅM/œ¦¡&˜a  6dmM„‰¢Ên`Û=tº3³‰³\Í@r«Á‘½ºƒ¡á§Ü;W§²ìÐKƒáßF‘;1ÍDDšpGÐÉRþG“êys\v˦aPuÄÂbp’Nm“)F‚6^»†zE'ƒÉÈÄŽö˽ (Òý?;º™Èˆ‹/&fEý|ýÿ=?d(È~SÇîÖ‰ö`î—ÊÍ¸ï ³?ö8ž–ü¹xä†+›ŸnEˆÚ#书L²|QÊ ‚!Xa§“âO¯l>µåùÍè¶œ'Œó^êyå ÉD©ç½ðþ Ûšòåjõ²«m¸ß}ü·wv5OØÂb#²º $œ ý9Ù"c}Óåðúý~×åöùiçmrü/×§á¿ãëo÷¨ÏùšV¬¸ÊdŽ˜Ù(»OÈóÊ‚×@¸j²ÇŠ0öãéµ Ú§«ÇçqŽÌwxé0åÆ]—kêK2’FŒ²Ùo«/2Êt©Þ’*Œ±3Ó“{ìÖJtW„Ê ;Ku2ÙInÆŠŠ×œËôï)¬$Y‡z°—ëFE®èCˆÜ\å90`Aµ±9åiÕe˜µÅ^ÅM+Tî„¢o¬$°î÷Ðèã&ç(½ a˜^}¤Eï^n]ïr`æXv×Z› @‚Ø ÆL‰MÚËÍ£’xçnñJšwX^Ç)m\›êV¸„c‘bœÒ ôqkЛÊ`"lÄÝ_;ÚÞÏÞ!*©'ª›“Üëm9˜®kŪNBƒ^æP››Bèj£­³§–lÝ.˜X(ÝQËH^å7ŠJŒ‘Y†!8«gÙV¶[\åÎkÛî] >W:L[+ÃªŽªY9Ú® št]z™6tNÃQìÝÑN{ßYåø‹˜LÈë1©¹dPvF í6k„B88£Œ®—EïrÜ=K'uŽÜÃ[—¬ÙBtNí[Gp¢õœaŸm+‰FLô6Ž 8GOEŠs bé¦Âó]á ùPà’A dD!„H!ê’Hö'Ä¿œÂ|ó£éöÅÿ—~z¾îÔ9ŒÜ}ÀÉø¤}£wÉåv¼¾ª̽…çBfXÆõ¶‘üaÿyÿŸâŸmWý·:ýSÿ-½Ý=~O_Çã·Ã×NB¥{{½Û·ÇË–;^ݰxV–s¼ûãEžcäìñ|tôüÿï'²›ô}½xÿ§¦}Þ¸ò÷ûóûÝ_o•$|V}¥’cò©×ÓöÓïjÌÿÌìàþ>~žaÃúI3ECÈõí`£-S3þI$‚5¯Û׿ùü3/‡†ö@…ÿ_è¢U,§ôÏôlÿþ/**?”.ü\'ŸééGýxAý_ðxõõºü`ý#½†'íÿeŸÃ˜‰OÄ“îpûŽ?„\o_tPY«÷Ü,•¶/ø8ã÷çHZ5ü«5nÍhx"ðí™ßë³Å?ï¿—ߗߟ¯]þyŸ¦õ¬ý¿?wO×÷ãƒÈò¾Á‚®¸Œ@ª ÿó·–_òeοÈ'±ëü¼aì">î’pˆýÃ?[=—®{½saíž[3¥Þá?Cö?Ù´ªäCú J¯—Ë®“íÎ~Æ9 ª>Æ"€b‰ä¤?ÀÂýOÌÿ„ÑP¤¤iŒ’E,ÚMA¬\ a‰’Ìå÷þ??ž¿f¿ð¾¼ýßÇ×ë_«ö- f¨Ñ°L6çcI3 DHI3JÉO—†´hü|Ë+Ã< ñô<õîÚ}z¾’¿Ä'D'ƒñJP&E—¿)@•¾½·±p÷/UHöOÕJþßÛñ·IøB!îÝõñúý?Õ?/ïßÓVÌÿ¢þ°ÕlçöË_VÒ€ ¡Öi D¹³mÏ?Rr¸{Úaf!p\%;û ýh(ôgÅóÑäÎŽ¹Ç—l?s¸?áîý&b¹oõ4ÝŸ&~m5Òiæ{õ_lxû|à €¦$! ‘ˆ~ùLi‚¥ŠPú1Ô—zúÐ‘í¡šjœ£ïMùeÀÖÍzèc[3SY¤Ã^sy·IÁ¾Ýfd›˜õ:l8Ýï¾yË*جÅ+FÒ[%6–`S /_:¼cËÝ›ŒñG‰„äRœHûããBÖWžlâ='SP¡“!Räñ€r*ÀWç¶;…$xÌɈ‘ ‘¹À¨g©R{Ù»Ç$—·t¾S3•‡(’ÅÒ3IIDf’ÞèC¨F¸Òà•?¨©¥ !1.&7JèpJsú–î ‹Iû^èÀÁË„Æ4Z É-4iŽ@„Ä@ž ?^NC·r9 aê.ºæyVå»ÌTŒ‚„€ !ƒ6Ê9S)¨vtrZÈbZwÓ´]¦rÑ 8ðaÁ"5K†,轄ÌêF¡üˆ^/’½)µáà:~½Ê[L œdfÝ=Ø4èeàÓ•]'™ðNî\@$ÑRZò.œH³s z˜‰F”mHt –„D)ŽŸ‰ç»Š=†‚R¦4GqÞœxšŒóºãŒJVawZ&‘)²Êg˜v†–Ba  Hr$ЩâH~]¬ä%Ì«BœWX UlŠz DÃLë˜UMó6ÙudË£,ººº¹ –Ðá€Ö`0$Ê,Ž…ãx=‹èn& ¾3o€˜icg0Á°ÍF[ìÎú¬’l݆ít’N9C}f!uJΟ€ù4;à˜’w§$ÁÊO½ùkðN×EcJîJƒvh¢¤RI"%óÚ¯¥>_È&ƒÞoLJp¾I<+ÕIov»À("ÑtÈ sÏc@°™´ã†d@€$‚Ig¼}XMë¦Á ä3µ$ñ.ø”„ÅYT€÷– eª”Æ¥äÌ8B&ŽuäCMí<{y "ñþ¹Nã·¦l0{c‹=dºµ÷oOsø—ü¢µëë~¼« ”¬^Ýé0@%üÝ›BÐîNûW ápÙ‚g[ÊMO-öÞN~êk$ *BÂIG‰È×ÃÍÆï‡MDÔC²%ØüMåt, uG >ÍʤS4´ÕK‚!™ ‹ˆŠ!8‰EL;Â[,ú<ÂÎqfâœõúÑÌ<7è£Õ:œ“Êó‘ܶk,5…¼ Tú™Öž}ŸÃÃÏo£*o/£áÅXŠ"‚# ZL03UÉ€ïu‚‚}|ö 8Lÿu|6ôÀýÁò Š»°@Þ³ü¤ßªX>Bé|ÍŸ¦š]ëô|é{•¥Á¥<[;šzRíNòP9S= ¡÷êë¿7'°Ev½b”.BìSÚöí‡×ŠKp =µ/6hˆKÑÒíÓò(`/Žâ5 Á ¸Îè9bܽ{égwqY\PrqäE%§8¨Ø#Ø,Chb0:šôÏEœÏ!¢9þNG=¹.flÍž-‡c•ò°;Òy|&÷14±,><¹]+c-i6Þrº›©m $–Ý» ·`Úææ˜‡Ê<ïÛºþÙ¦5µ¥³ü‰ÀŒT–¢B­OkšÇ_-uÎ;ã½ëÙ²Œ: ›x3éõtHÒcØ!EP)º~iøtrš?s£k£æ~#ïúz»ç¼ù*ýäÅQqéé~E\t”߉:g,ã¤ø>µEˆŸ‡ÈþÞ¢)o@y~ø¢d¢§öþšßäJÄL›úROÈdsäóQ-qióyÜõÂI:±ßщ–HÄ{MÅ…†bdÊîî¸ýëíüOÑ'‘8>0{˜>3ÓN”ûW—·–F–<"­]1¦^3T7À¼!æ{]›…‘ÜÀGª·ßö¹Å©þ<Ã{ ô§èeïO÷ÜŒäLò¼-}H(¢'f Ö(ü>¼òû@óLéäM‘™ Æ´š‚Šˆ,$Ö;ÎVˆ±=޲™ýI¯—qè¶ÐA Ô xP³hP yDXCýñÓ»±ŒvÞ8Óyú\Œ@B ½P`¶ KâÔ‚»¿äU¥l /°lÓüÔ^E¿¦¹ºUenÔã¡xîo 6áò<ƒ;gŸb%?‡Qƒ2©£4õ† Ôz^Éú!þ§õ†( ˆ&f ‹É£_“Ë5œ²¹“$ðidŽÍÏÐê˜=uRÐ^ r½×éÑS¿¼âðžÿGõ£aU¡J|~8N‡¦ŸÔþßÍÓ©ðÌÉÈ,Îæ¬µ¬9ßwÓ9b­4@úÉøüy M=Ɖ‚³Ñ›ÓɺÄþöºíûŒî³¿6õ9+šÌ0§ííÓ’µ•íþ\wÜûK0$û8îé†O¡Ä%ÇY¦ýy•ÙÈu@<"`Aüd€"™%^="……3È3¼çG3ÀAмR6™9”1äùµžµëï¾+r¢1j5ÕÊë‘:]n–®Tœû’ÒÒ¢™% ,JNM‰Ç¥\‚Ò¶p9è…Å‚zÌ¿“µÓ3~qê72dÂ=;kó˜6ÝkäN˜­­s%!!ÍÒ „ «S¹mTáŽóÓ¹¡[8\ÀJ‰IB7{jË©˜ÒðFP1ñpä± „¡!‹dlÎÛ{Ò‹!:Ã)c]åšQË« í2_Ĺk˜¤f=4ν?éÍ“–íãç¦ G(F¡pq í ÁäŠ$“ÈN*ÇIáäñ ´Õ\GS2ÒZ^”äj(ÌÝ ysBzwp‚ K¤ )dì¥Xª~$*xÔ¢5¥¢Q‘ØŠëºÅuÎ]¯ ^E·çk'áéW$ùZþhqq(œ[^Ö.À3´&ODH0p’?CDu)Ï–ûÎ@¦'•ovªéðˆ:QáaòÌÀà³X3?M‘l*‚nfâŸÎòÚXW¯R YUÌmGW`ARµc„e*õÕÖÝóìŒÙŽ9ãâpïìÆrÚhòÓNÛÔŠ&†Üš[ÛÞX°×'òO)6ÌÅá„ÍLR8:õéŒöÞ›y·xê6u:kPón8exô<½„z% )JR€›Ü@¿ºP~÷õÕ] ­þ˼#u™®\OM惣lÎhòeUj«ËB}$y&¯¢©Ùû)¥ŽõÖƒ 2BIˆ¨† ñ©ñ~î@5ÜøÿJ¥_0è'<öï€eêÈꈪª¦xgÀM8†l÷ žWô_'§nÿ>Ë­kâì$à÷{DÏóL=Gçöçô_xzH4q aR†B¥C@@)*4"¥¦B†¦B†C*Ód³ T˜BÉ ,BZß^ž¸òzýpÝß?{Öî}Þ«{þìÅYr¶›C4B…‚€h(@ŽÒ,ÀÄÂb{nuÐñ³j‹^Ûi6ß8ãš}yïwÄ»&ß·7\»E̽f#ç]šÍ)5ƺšëkZ–³!†“› ÉÏÓÑðöãÔDEõìþ'Ãäæºò} tý: ˆýÝ}„Ã*£F*<¢¦WçÓï‡%£ð<~3ÛÏßðI;8õs’#ßpûâçZÝ«-4”!žò´&À×ãçù†MúÀ€§@ëAæšýg‡ûFZ.êÏý![ÌŠÆc%ÜpÏ‹p8½k.äy CGS뀇B- «„ÖxlINfJÒ  TDÅÙŒ ­oŠhBû Á3Ñô*«‘˜ó^ßM2ÓL²©t¦‹iYŒÝÿBCøR?1v-=¢ Rg é” =تø{6g¶„ÑÖ _xhÝTt/äî†O´ +ß©½[Içáÿ=¯úÄð·m8|-üù±ßˆ{?Ш>Êf‹%µ†ÍŒâ­ðÝssמë3f.s& dßå"kÐü¦ÏˤwA{#á§-5‰ÌýÛ¿„©¬‹â@1 õY=dêxì×aðšT-UC’È6INÓ3=9aîñç ¿{õxmÏï¤dyGñ*Rý¢¼ÄGÎ-X«cZ£hÚ5TT P­ T ”4«B²dÇI>YÁ5?dß'»ü䟡$ûwöÉz£Çñöûù¹ÌŽ5Až kì^wätþ§ñ9ààÔD!_Î<6s‘ûçîLªIl‘í3#ÌÔJôæ:gÚ/Aï>##·8òt“ùz¾ñ$5ìWFÇÎ}#ë þ-cäùWן†0µ‹#£i'ã6{¹Ï9ÂbsŸ7ÑQÅÃr…À¿#òM*~˯ډ-1(€P@T*ú¤ãù'm¿ùh,6¬¨L‚‡ñæb6‹VªÑEÄ) É&²X)R]¶<£Rz~æõ‰ËÙܯµŸóìøú“Ëw é<§Äž_ËÓçøK &±KF•¢vz~jJ§ÓØÒ@2,.€0Ÿq˜ ±¢Pùf(4´Ø`¹d¨ä‹9% ?¬RR¤JF‡P¦ Ü.¥MÈ4¨D ¸Å •bR*ZJ@¤CR…ˆþûHŒ$PUœ’¥b”E‘5£Ÿü?º±þŸÏüµþŸçþ÷üá½×£§cN5å•ñÿKŽ^ᶺºÞ²ï3¦®‘Z²ßòÒr-«jÓ…™ªáƸârÙ©½Ý“œåaiX½¦o‘ʸy.‰Ë×7lÚ-»’ÈTb蒑šÏƒ¡ËÆËÕïYÛBWgÖ«vC½â¨¬ÕHL¦cSlíÖ¨¦ØÄÔÍw»£åkÈåyzï–Ä!‘v ÎE¹€cUK§ [•%ôèî‹©à¬UlQG6ø¹ÞjÕËBMñ1ÎVÓ†ˆÐÉwY®oÕŽ–5½_m5GÕbÙX_þÓJ:ª–ǺÃjб^Îx2«‘A"_v.…©T ©“Y)6¹µ:êÞÚ·+F±¬šŠ¯M®m‹*÷£$B Rh¤J²îuh¥­¯6Š£-L¥•'÷Zc LzH`äàt!Ô$ “¢)Äæ2&•Êì½µäÆ-}=ól•BfZM¦Ÿ~ùø>ìÞÙ}qôÃò‹ùüçisr,™”eÈ2twÔ@ÇX³ùñ×gV9à댴ٺŽ: &j±P™,.#oÐέԯThe;Õ[ž‹qq¤N@Qcc @é~'*—ÖY[}æ²lrµ¾Dâ‰hVÍWd_]lž…Îå{…ÄaÚHѽR§Fx˜ì(ÎB oa«sÒ…Pmxyy+2¢1ÝÀÓi`Œƒ“fG¸•¥M«Í»è4…ÝS‡\Mž¤/C°AÞÍñ2¡INõ°·*0 vÅd¹d(Ó½Vrš=ÞÆØo¢]’­-ÈAÓм¾³+ÃeEAÒB[§w¥­k9~s*Hè=1ˆ^¬ñ³„`$Ø÷ ¢$vùÝÏGR«Ì >³]&%â$¯8ñš÷WQ ¸}(Y&ù|éÉ]•dÉÙçR–ÁHêAà[eœaDØ'+ ï¥ ­ÞMï~à,œæ«É±ÄîêŽÄ1k3·\p/A<”­*—ÌVí3Ü¢Í棳2é‡$m\Y×½àQÓ`‰Eâ&ÍÈN„æòˆ·=.fO!´;™ Àã 2Æ/×”yfµ­'6AÑwª³Žÿì_(Ò¾wedeí•|\ §RËâ¢X'âùd¯ØÚ¬!}ílš™ŠÌ¯WǬ¡d‚*8Eùà\é2qã(°6°Açü…ySØáù=?µîË7Zþ£ß'ÂC£ß1é’Ù _c‡f͘r !µ™|õß|zû¨äºÉ¬'õJ¿{‡üƒðÜõ!-ùOÉË&íµÌ¥ÿ‹¸ÍÉîÚA$p¾¤Rè–ÝEk§$K»éPXAvÍ9ží5И¨eÇ# ½ì*Ê6ù„ë‘´(F†PrÕQÚq"tÆùJ¯wËÅ™/ÇC9¸äÙŸi²:wtc³Þ'Bqjg¥*—*0V6º<µßŽjýo\ùÊ›ÙNL2ásŽ3dS­QsyO5­µ3tñ‘N>Øxqàñ\ødÝ–]ókÌ&zŸ¨()JP(>©ìþŸÙû¿õÑÿ—¾Æò•÷Ž5ëpmlB„¬·ñLZEƒØMó­u˜ ÒÌ›:e½›c|‹T¢Ñ£2©† `RÅ*tJ7¯á¬ßŠ|=óx}ZÁú>iì>ÓÌ(ùN{SÌWÊ=Jáiè}žR}FO¸{ðáóÈ:,”iÎÉv.µOû—ºîÛ•ZYoQÛY¶ê²¥©*˜†åý¹™ÿ6rÛnû0Ûn§Úʰ´žÁrÄ£Œàd¸«Oæ‘HˆNdF¢$7ÿ39 ”êIy›eazYµ˜”²it‘©5fŒY i ¦Cpžd E Áù¹¶‚cG ½ÜmâA 'yô £ÄúGU±­¨ÚZ4(•…¨VªX‹Zuy=ßì“•C5jp­÷U–9â',aƒ™ÉI_¯çúgoü~†õ®~¿o—¦¿. /Ç;ìë¯,;¿ó £_æêѵ¶2°p~Ž€æÕöGñ'd§—´$I#Øø9gµŠ±m¶¿ÆÓõ{^—‡8ò÷ùDba€}3ïŠ*‚j"5ø}¡û?YüÙÊså9òÆf/»îözÎï¡b¥r<)j5‹C˜é3äò¬š~ðø½àî=Ãçø‡E|ŽéÌû¬³×Þp¢ß/V „‘(ª?ÇÚŸìNþ¹úŽ‚^8$ȃ ž²1Ê|à<À6³8¦á³õ‡€xY™šŠDAE‘yÎQ<³ygž\ɵÃ#, "D@DÛµSm…&”³2zxóPwuîëˆ&]×MM1K½÷‹!‰M²l‰CLi™yïµy$·¥ÖÀ©xÝJL/kÛxË»¤žv®DˆªåÏN·wh†0šõu¸sæ”)©Aˆ"ÈÉhy¼fŠ·+¯_ä¨)‚d(w;²—®ó±rîºÌµÌS¤†¶ §®ö‡#&e†Isaõ@í ‚£ã {yÌÔ,HªÈ«YGöƒ:”U5°øÑzC×rº®Z^:С¯k™-z\Ë7;…ë½Oد;³f¹vdǦäî.4^w^Û§År ‡Ó—¾¸¶‰ñ•LËø…1B‘ Q… bšz›q­©¤¨B˜ `g‚:ÜôÁNuˆÈ&2b¬¼¬9Oü£•éß ,¦˜Éb@¡à õIR ‰ˆ›÷?*ÿkïuÈa¢ØÅ‘øIO~~ÿgonò}”¤òõ `(„ä Kš1ŒÄ™]Õœõèt<„ûÏêž¾µ ÆèkÔUUJœÁ´~öw½CèõP<à÷?4×§ùÑäñ†—C&f°Å4õPG‰þÏ+xxkQT¡QŒ ßÖ0"ÔÚ‰º¬j(uœ®++)C  ó)†­X®”Á²‘œ0S·BØAD„£%VrÊm­0ª¥Aßóʈ7Þ´å\CCÈ*õƤ6ˆA¢åX……ÃçøÿìòÖÝi^ϸdêRSçˆÎd¥FîŠÃÅ@üHŸ˜váùö‡rËUË VCÕ#×±2e[Ó÷#¤8ç²O) Jè5Ä?vú7¬gÝ]öÑ“ZlÎ&cMMµ×žöÉu•§k²W€IÀ4?cøz)Äe=eÀ å 2GÁ­¡o, âüq‡ŠûæN|Â4Ï:†‡c·uuã›8 )›ò<·|¿ðä…`ÑZ°qDª¤(¦rS±H‡—N¨qÙ:Ú$F1 ùeï¼qE1·í*€s˜‚A„>”¶“ýŸe†rÛÿO¸Ü¥1„¬[:ŸGG9øŽ’•Äàa$׉¤twbƒp=×¹?õ;=žW²ðœu(ž‹„­®ÏÔÒ/TxëqéŸMxï#Ÿ©?'ˆìdF~0LJjèyx6õiá>w—<¼ ŠŒúV#<žS÷‘æÈ%Øl`šÁkBQô=ÉŒ$«,,ÅG<™•ÔRJ ˜n3'9«x›IîݧoG3wåôÛÎ@ÍZKS¢æÑfhª“[\«sL¶5´QS-¤ª“BUÍr¶6±µBj¢¬X­¨‘30=eÂPÔ)B&†ë6ÔÌRÌ›i6hÛ “$•ƒRdªJM¬ÖJ5¢ óºÛD[Ádm¹V®jŒm‹[š¹k&ÔQ¤¶#Z ­äÈèvŒM¢¡$ Ÿrg=xµýÎJõ,FÖ(£h­H){þôÂF@öX1DSøþ‡ÇÇÝrå CAM,1®dÌ¥X“×ÁͤÓR5ï£Ï·ãWÖo­:gä|Ú¤›âõ7ºŸºWÀ’;ùþ¨ÒIØè5Œ@á àâ/©ñ7á1³×áDùtŒ^ž„˜†(ƒ4 uñ;xãáxaøk ¢aƒZxÀç ƒ/¤1ÄÏ®Õ "8Mv`9š‡džƒ §3 Pó„ëœò||À_„ÒPTR­{þýhi¤&Sî`ÚTæ`Å„—tïÎç¢çÑrÎ4ëÖ½)zAè&Av_’$ §{·i ;âdètø&Ôq¸ë{¸Ü]Æùî6Áÿ4ó E_ä‹ó”ª¨¤¯QÒº» q¤!…æ h"E#kM­·»wjSU,Æ-m´›Y+d¥$‘KLÖ-®ÍÒÔd**¤ˆPˆU<Ù H†f&!*!†!_r°)ŠÛÇåštAÆK<|@0}{s)M-‚i—„ûƒÁÁu=B‚S&¨J¢•^ÃÔù˜§Q³û ²!‚s Ñ"a´û/](‚>¾ÖS`˜³ƒŠT@·¶$f8å…*!¦/ “% IÃ8aÞ÷„ùÍ ="ˆ—JíIŒ÷ܦ²`r`Ô;Øœ¦9ò«jÖ4#hÁbSRpmPqWcÑŠ&êSI°^ÏîÏ×o¿ás®¶çï³Ù›ŸÖý×ìö%\Düv§;A,h.–¥¦¢ q­¬&§½®ÑJcÌ~'iÖž3;»½ðó~[€§cX,@âP>Æ[lf?`@ ‘6™]ž÷‰¥Éba7§Èb}©ï“È )ãNÌL*ýxωg'/#@ý«v½j6©–? »I¶ÔúŸìáb'ì Q±ª×æŽm “ ê’A“þ) ¤¦yi’žÞ,½É¬Ãi÷†`¯#‚bþ«ÓSûŸÚ`ãÏ×F°êÁv€iF¨q³` Ú@ÅM$Ã+Ê,&•äi‹F,„‡»…˜ò{¾Ouv‚tx!ÅNÞÞ‚wùHÀ•Ó!Š8g”TPúO³ÿ0ôA~ŠHrWƺ63re–2°¤¸‹@«ÿ Pó=ˆ¡¨ŠqŒX‹-`h“ø»ßH £"~Gþ:Sû%z"x›CÿIFQX‘ü¾¿EHþ³ñ#lˆwý±W±ÕCè {¶z'¤¨ ‡ONùAFH‚JR…IOÒEþȦÞúK´~*n¥¤¿Ã!>'dÎÔFÃÑ7 õ±UÊc#ÕEÜ›¸N¹‹d³ʱœºD|S0a¦«î‡÷¿é¶¯HjÕؘˆ¤<Ó0O~‹¡Ãá„?qc?7Â!˜±^sŸ¢ÎºÉò~`þ‘pñ꿟îqòñQüŸ°XKîW®„8a>.ã‹1 à‡ÔMsUûÑÚLI²CmúIÂ5b@ÕáoWdÑFjÜdn˜u9÷ cè;Žq8 Ì™¦7¨¿Axá=ÅWð¿(â@JBÎ bõ*h¹¨$–Ä´E6I¸OVpÓŠ"ZŠ@6Ú¡ñŸ¾1é$9I`úº¼eEæµøùÐô?? NNži¿ƒ’|á>¸ê’:cáQí"ÊŸÁßߎÏÏ¥¶Ú¹y,š‡¹ôuX=áÐqɤÓò8:Óýv1ÍeY‰òDèž9ôs‡º=ðÒ"-"J²ÇÕ…Cñ‡·íáP}5âE„?¢¼§C œ2˜Ö'Äí"Qúã’?o&©î’KS}­Ët؈ÐU¢-’Ó¹LŒ²Â",Å*˜²1SÌÌ`j@²@>eŠM¥HŸçië$—R4h‚RÒ–´P¡bKR-˜C„ €Š¨JÂÈF`–K¡˜BO¶³F3›uMv¹¼22¦R‰úUåK¿/Ä€Ÿ-‡@ç † ªZ™"”}ƒôGAßÜmÑô">Ùñ­âexfʱmY`ƒ=“ ©Ÿ¹¥r¨ LJB–ЦSÏ¥ ©'_>–üSCü—¬(‹Rÿ')¥ä¾¨'`©˜S@hþÄ>ß"ãæ'!‹Øä5²߬?¬ŸDž&°~=~•lÕ˜œOmô÷Á·ƒæ ïÉ”äB‚8*iNæ~b Ÿ±ûaßù'Hq;Iò¥²*Å©'ý؈s#W%UT!%S *$LL` )m"¡ƒ5BG@Žƒî4¼Ào˜?T6® 91ð1ð«ñý~?"?»öýš×xí÷"0øqnÛ?6!÷‹óçÄõHï‰6ò0È[!”guŸ&R$‘àK¯ªrb>RÙ„qIÖ(‡¼²ÌGÓÎ3¯ª“`x7Ìçž|ó®Æ3‹5÷r¡ <1:Ê‹Jñ!>§‘GïÒ#¹é0‡æTŽ?tŽñüçÆHL˜A-_¦d^¤g¦Ýç,æQ(Ÿâ‡u–—­gz›VQ·Q|]W¸›}?‘|›rûœLk3нO§ë¥#Šq‰DD6Ó¸¼Ðz”aõõO‰žâwµ"MíÉ>#× éÂçœwΩɠº8‰a.Oˆô aꘃ+"o,z¶mäžKŽsŒ3œ(†qvMdþä?ÃþD)ýA_Q1a=\Ú'Ä4€1$êIJ^ý»¢r?C„Ü›ëýéõ_â‚fÿË®å PÑÀ ý¸8ý¼®eRòÖ‡ZÖaý[׳i%¹ÈÀ/PíB‹ÁFÛeUŒ®´´–ƒ†›?mêꇈY!«zÃ$a’‰j±kLÓ,™+R"P"¥Qˆ5 *´ª© ‚-(‚à$(@ˆH¸J.&ÈDM :ª*\…HYÌÀLQ$«RV«ÎçNÍï­íy% ˆÁ׌Х£ªÔr™Ì"]›cq†Üƒ]‹qWC]ŠÝ‹¡…¹­Ò `BÉÖI²fR¤\šœ\ÚKiŠ•…Ô£kZZMN (J%±£`ÌÐdVKv{ÏHÙj“1V¨þ,§éE­6t¤fñÉ‘!$=ºùéÏTqvšõ’_๷ãyª”ªDDro#ïŒáŠÂ*0r™ Ä"%@HJÁ † `$¦ÊTÌkd¦²¨²[M–ª™µTÚb”ªm&fİ Hd EdNÙÁT‰¥"I-‡ÒÏöo¹¾ûuÓë/ ü»¨ú;Oˆp'ÎÑ124HÇUÅqø^Fih RRÙhÂŽ%'¼]1Dn‰ð~$>‹×츹¶–Á.°0¥µqLeÁ£EcCÖXŒò4ï˜Ê ×}^xM}æb1R%YJƒ@A  ðƒãÙV` *>Qˆ8OnÝ­cg‘ìÔ!ÅBýw¹V@=D‰ÄPì‰32wdVwmc¦k[Ñ_ç4ñ¹å(d-9ìÌìã†\›±7ZáÛ×LqŒI5]=¦Y•à`PNC—†„Ú䘨¤<ñç^B°bàºEÀr\œœÖ–‹ƒ• r{ï·,˜±2“Œä åräu"]œ ¢b]Nb 6¬IÈÚzOOɰ ð‘Fû=M¡)Îhä¼u§‡{•ßB|õ­>þ  kØ_ ü:3ÒÒG7¤šMð¼HÉÑ£ ‘:j‡$qtœ³»O ðHÉåOßnXÇ*¹ÆVÅ~Ú¦ó|›ÊÕy¨Qš™$± µ|×±ðhõj‚šñŠ)CšÂªª7¯µØz@Ê@„Œ),€C(2 IÇîSŽ… Øã»ö×P¨ŒBH.¥  @3õŸçÖ¸$9ÇùHå´H¨¡\I‰É„Mýôðªv”`Ø·ä;³†!”#²–u%{ BúêÉz¥½ú”c¸ Ÿh"öç¸â¦E7ïû :‚ž“Ó&9æúËǧðc's¤(xz~®†J"©°ˆþ <¦ìÕó.ámÎCt›IÍopœ‡„I ^Ű$)ø¦@ß‹D(¾ÀåQ±X.äù^€ˆïßRµ£BõÚo ˆ#ª*ølP’=†ÚÙÐ`]çäs.-Y ÁV€»¨e\è›H¥½$·„±ZK&8X€þ'~¬hɑݾ˜.ØY<¡<—‹ãÁã˜{€ÔeLö yë Xa«q±óZþu˜ @J!€èLÑ] 0©«¿ƒL¤hz<$a¤B%¹á‚LcHxºl•£®L¥Tf¢Š©Û6óäDÞ¡µNRŽðyMzu½#Æi;qœzö×MÖ>sîñÎ ä¹' b# ‰7Lšë®ÉH›tžú¹¢†®pÈÙ¼;Û:Ø&ŒÆš{ËÑÚí/º“,(€»fBï0i ë@­A@ß6‚€¤;½ßhþŸ&`H@¡_Ó°'ñø§¯É®~q²Ò€0ûõVd‰qœ¨‚ !ElŠYZ„ 3$‰wâpy›åúêA6a&r¦R‹@,1M…å[U\»­Ù¤”Uk&«×^c>qG¾Îï4{Ó ´CÙPÌ;#ÞYO2}QÒu“ȱVB½»xqÌç{D¡+í†T”ÓTÆc¥EŠJ”Š/„ã|µð‰ìÖ<˜[÷5xÏ‚óIü5OSÈ· ´–6Y”š‹lÉ4¬E´ThÚ,[ŠfØ TmmM+KdÅE‚Ó"ÁRTi"´ƒX¶2mˆÖA Fƒiûÿ;÷î¹]~Þo㳈ьe–sŒ\›NrOr5; ù{ç¥åý×›ý_é[æ…ßÏÎádg©#í3ÛYš50òY‹©{»"OÀûl{û‹oãQ–›ŠtÍB ú¢Š$‘›…¿a½¦ùh~S^ßî>QÄìÖ8NVãƒûó¥"­¤”DVFÓ–#FÉ)W*ÜÙ)©6~wWdÙ1#5"Y-$˜ØÁ4ˆšT˜£LÖŒ¼UÙY Ž8CKA$2GÐ]!–1‘ŠpÇP̵‘d%#,š o5×á´cZJõ‰2Wü¥¡¤4€èDä$5a´•z®ÖÚæ’£&Š´.f2à˜>èfdL»›á ›eJ©"&´ ²Æó¼ñf'ˆHî ‚jQ†Uˆhf NÒ&”PÕ³Çt™š®ïÛáËè›ÇÆ5“hv‘œ?¾,k·ÒH|ë«{ÊÉm%/ù1 ›Ò[AÄüESˆ^ßš›Ðœ0›>µ_CàŸ‚ú }sŽçÀLøæFf.ñ{qÞF6ÀB2¤¾È{ô¾›êLO4MÇïÛ/z4’RE:é1¿~&3Œ{ µ(ÑŠÒ¥-½&Àw$†¶ &÷lrÓçŽØÊ4rI3ƒ«¬#Ìpêhuµ¦\YÉÚk0j$(Uˆ¢üÑã§ÏÉx¿N£Õ‘ߺ§än€MIóÈ¿ÜÇ)K\o’ÕSŸØŸ¨4¨t©V¢¬¬e!Ú…4”ÌlüÀ±l„EUdÓîKKXŠ@«=¢X 7jÆ”Éâa¥ã‹ O¦†?¿ÞŸ×üoO–þmX£ø³‚|uÑÍ>/qÑݼœ¼cÜv{G9ÍÓw#¯ÏNù³ 4Ex½²vGëùâ¥y^@š4|˜ƒ ¬&£ñHÞl”M" ~âp¾Ù‡kµ®Å‡üRi¡|¾àa&>2BçÄD ! bÁÔÍ+ 8uN791-)Hˆ [B,id‡2Cº¼=8š%$ÀÆ83Zè频2ãTDt„CFÍòŠü$ µÀÊâ˜8t]®Íàňb¹Flqpý® ’4˜rNÜÅ9ÐÇFŒu‰S£’ÉŽö ±ÑˆóÀSÝ€Ùµó4ÿEê/{÷s/éBê(X0AJ2K!+ï ’RJ"ŒÛiò}²)ÁÚÎ;‘GLÎ[’ Æ 3Ðo?þÓ0Ñ“mêÚ¥ßÑhQWÍ9Iú'àøM=¿í"! Ÿ–Ú¥Z¥Hñš¢ß„cAùxSNüÿ"~VI5 /DìôQôn FÁH9_c°š©.Èj§‘IÞÿþ¾íñݯÊmîØ‚ÎENÄ`—.È?,3/&ѱ iN<ù ”Óõ·y<< ¯1E¯Z׳K/át‹­ÐP™°eAaó|´€t Ž¡“¾Þ÷„®ÙãÞãËÉÉúF;œ˜µÓ÷èM:b^Ì«*Ä©‹:xÑW*£óKÜ~eÇÁÏ3y»q¨ÞˆÅ3C‰¯‰×}ص$'Ôˆt>†ñ™X¤0˜¶·š›cè'Ðú«Îls? Õ¨ˆÖ·~‘ É^´Dwãü¸w›ÏiSú>j*>yÝÉ(WcN‡>~Úú^»Xáˆ,[h}j§Ê|ð+ø ¨âÕ¼ Gøƒé0(ŽÎ‘Œ2H}Р ‹Û¦„œ p$,d€žR塯 VÆu°Ke†`SÍq m@‚–A D„ó4…ª,êCŒVIÌ…2HWÆçÞ¼ il¤CRÕT·âñ‹Ž6»™qÌ(ýZqV§—<•îLÍg†”~¡Làã\¬V/œ{'ó^ŸÀõ)’ý|ʈ‹§‡nèòø/1a­‡CÃ_Óû”þØ Q F†…I¡V£¶¦14ÊÖQb@"AQ ¥‚ZJ²Õ Æ®L1až‘’OÄò}þcꜦr{Ϭ+:c'ˆwž¼«ðÇ:Íš,ÖˆªsU]Æ´DäryþO]D1ö0T2ˆ=ÐzÇñ 2<9%túxÇÎ ÎB& šÂ|ðGäoø%@üÄ*¢Ó‘KÁ{_ι A¥¶¨‚ ót­XfDB‡sI"/À6òm¼ùœ“߉:xµàÓ˜ÕÞNFcCTöÑtÞ˜Ï|>פ×7˜OÎwÑîN „?i gW„ä’³…aPЧYàŽIºV7ц©»Ágî·ŽÚq¬Ó׊J¸¼œˆy„”`>¬ÃJXV«¤çö]9{Ñɉëü»fK=¤“Tòð;>;óÙÄ3Òä>pmP±Ó9U…´Õ ¼Le9d®þo·¾ÊGãUYb²^!Þ X‚<Ó²ö<‘á8Wø¦´v™4@L“ JÑˆÄ %*ÄAA ’¼ƒÝpw°Mªy¨“@r ê@wØžl£h' @ôIBy û^ÿ«ä?'ì¨Kâ<wÏÕóEÓåcây! AT-\žŒaŒ+Aä[+Ë®o;ë+P›ƒ Ö±”wq„'2¼O0“$ fÚ´õ’õR² â¨dñ²ÁÉN• …LçàÉ:¬“Ôõ ,¦³&BwXxÃ!à• 0øu=dõU÷|·VõŸÑ‡?Vø‚Kí¹cKeQm›"¾4øzR{£jZW˜H1ú¾ûcæÐžZ>šY…ZÃ|¤ÌˆÎ­ôE†M¬‘c´Â‹'ÐÚ•ÿ„Ái”øƒ(@\ Ç@”埈MÇL*B”^Œq,ÝœÉL[qãs&`¶ NQ¨‹ Â-L°ə ¾cu‡Ä/ÎÅ`d>Ø|O˜—ê˜XgçÕ‡ª"‡2Œˆ¶Èˆ{‚³ZÉb ã=`x%öÉéCc1í'<$æ,hàE…AfÔ%” a1Ôˆ´ÓE"zϼO2_1/f-“¨¥ DŸ~K'‰ãN¨&`¤ð´ 2D5“nÒ}³2 F‡¸“WÊk4c¢ÌT`|Ež´IàÏZ€¡™¢Çæ” î<8dS4Ös>Æ„RxýT¥aô‰• kÜ7{ë›x׋\ØúQ®WÚXo)“ƒ[m($ž€õ˜OÅ Ëè’¹“×$GÄø›­J”QĈ9% ´¢…+JV¶M£kEEW>e5|•ÉÊ51# ‘˜bâÕ(qJÈxXñ.&¤&šÀB€PF”H0C 2\Àˆ‚©•±†d†šç4¢¤³#ÌŽ ÈD<‡ƒ+&±£‘ĵŠFÜ\aª’¸ã5 ."ä†0J „†JpÆÎ8ÂÙáÄ*2"c¦‹ !Ò=læ€0óÊ}'šÏ“Œ¶Íçyß^Øzž*d‚‡Çš¨¾u•ª1OQO‚| ñ‚(¢F^Àzäe}>t;«Î4c(ÌÈ–æ,A­¶yªwÌQß¼Äõ*AžZ|Öx0¼[6Äø'bÃ8hΧh”¡¾²Ãèñ,>#¥åI¸ €¥èHYˆ€¿MHýPú¶o µ<>¼Ù[B°ã ¨ˆW9øÔœ˜Ôð«YÅ+' '©™Öðý'>yT>$¬^"Œõ£$5¥cʼn¢$dR‡­Hˆ|¡I†,9$±·Ã|lLÜߌä&IëdYÂKɹ¼@(úQ-Y(’}$`}!Ruµm•㘬úO­ÚLõ›ç™Å1À:B™'0¦K/jâçÀÐOŒóY±ï1zÃÄzÓÎìC …¿ÈN5Öx¬õ ’xbÙXŽ‘@©R ÀPæ–ÃÈo©c!8>0TkÛ\é«–Wªê÷+ÔL’iOœ ‘`ˆx0À˜CÀH–ÉÒDèq*0’ñMá×|;9}ÅbÉ,(XÄd*!ó¡·Ž{MÀ˜!©CŽ åã6A ðeÀ†HÌÀ…$)OL§°ŒD’½éÇœ ~ÇÏ(ï0Mj•JÒ*HÅU€å7¸?“FE(UQ¡'I"4AÒzhÅËm¨žqL ye†b¢Œ‰‡¥‘k 0åNJ0FÅW!‹nhb˜X–çYcÉkS¹diÍB6ÚjÑxIÄç–s¶Y¬á_&'!ÝJžZVnúþœâAXI“33dý08d×l¹ Ç'+ÊEò½oYb¤Õ2«Bjký”,ÎY%DI“j&°…³Ap¦?æ²hÀFyŸŒM<âæüÅùOœ{Ü Ï-È´È–‚ƒ2K"j)ô¶Ë(¤ BТ5ªÆŠJŒhB‰Zr 8v:6A;È–ð¤¬ôõMä˜ìIå“¢¥™ÜšÂpÉûÃGðYú¡Ÿâ×é*§“¶"ƒ?†°ï GÃË}²tÈ=,BУK[R„¦°ÈÍ&9(¨í í6 ŒˆÃš‡'í¥°+˜(OŒæ§‰à¬F1€¬<´êV¾k4qE_Ô¾yܹd¤).vT£õ›Í$¤@AVÓ[©àŒµWªÖ¥¯Š‹‹Ýã9!6è ÁÂURR¶êòËyKÕm{û!3$ó_=˜‚Muòòç__­ÅE·¥\À~«ÒÞLˆEEH¯R¨ÄO¶v¢­;‘déeŠ{ÛDÔ®ª1ˆÁ5¾6ºhÞ-Âkøg^7bs¦‰m&Œï§—™Kà•™>RäR~ÈHˆMBëã˜Í1!RQx·Šñ⺾®»î»vU)RQLÐòúÄ®ËD|áR&ǸhÃ%ÀWŠ  ¥ø ½‡p2TÅT.ÏMëÔLCPRÓ? |yN‰§`‡.8òħò5ÁZ¾ç§ Õë‰&“2 Êõ(‘² Mnî uÒrÊ)ÆQV¼•©Þ4ïXxÝÚµkµó©¹UQsJž¸æxðäć²lðÓÕ?Üê¢>廌<0êèú¤B6âørþ`v›‰'‰è«É ¢Š‚Xôþßküwx¼vìv:=xK廳‹žÅÛ¶ðµ¶¿ÀqÍCõ_íPxú×xümFg…¿®pý¾:ÙïäÑwÙÓ|Gp(붘«!·3MP[ˆ .ûNHfyD#J%·êÍçžC{¼8F3¬6<ó<¡¼ÇQÀf°ãxœtVó?d×'i&{ù‚réé˜fÃRФDÔ(ŸOu€•T6¥€€à¼:@(\HMƒˆ@çÏ€—1Šf’ifIš‘k0ÌÄš'߈µpÚâèäó6z¬ଖ…°3HMGËCß4Dá‘?€hÂ&•7QQRAðë(¸!F öì•N0A3êB͉©dYÄ1¥„ÖJE@© Q´’Š+!M´&5°J…ˆ±ŒPÄÑ`¤ŠPù 1mº'˜b¼O.._PÊjˆ/©åÙ}VûoªûÞ¢2–)UÚ8ûq´ä90(ª®'˜MÉÂf¥ß óP¸؈†+‘ ITJ@†¬Wä‚KŠñÍ<…ì;^¼Ÿ—9ír9–™BÓ’(µ•MªRÀïĺ(2qü §£ * dˆù~çè_g”öî!èˆ!Ô /€áÝØÁb½ÌhŲ̈áÞøxù_~¨¦ —] cÏóäÓº¨Ý®š„Œ€*P‰B@%•aI¯§•YX  ô$ _–,D‰I o›_›æ½áLjJ<žºuO*ÒÓkMçš›¼ë<§Žæ\ùæÍh^Qìó׃±ì«î€ø€tyz;IN­&s\ÈÖ:æ45£Ö5ÒÊ[$CÓ@(fšˆ‘‰¸AU4ð¿;°M“›—ÒÝ–O%t¯´ÌÓÉ·'+¥3NîL’"£,"€31SÀS°Ž—¢bÂè­b¿ ›%­µ¿OÛ›¬*¯½NJ!ëQ2|r§¬ñ™SÖ_DE‚ †åQ†#I)J%xh…¡B¤©‹dðƒ³E&Wt!óÙø405­’Ñ0¢ÙlXaFê#ÕD„Å÷* a„£Ùu†ƒ0YU±`âj†Uhqn˜nŒÂkÄ$”Ò#B(ÉPj”$eÒŽ„g¥cNÚ†‰‘„î2`˜W/£f²Œ‚pœâÈ=NQ0¥K ¶áÒÜÕ!nª;­ÖÓ­_ç©DQ•Ke–ÒÞ4UÉ—.“7uÐÈ¢Pƒ @Å F$š%*J%*ˆ›P!„#pÓð~edÝ#È&cMð,M¤``° ÆÔ´´c?M•V4±‘k&úÒSëRSàÚÔ°œÌYÁûÏÞäóÝôù¼¾6>©êË7øµÊUîSz[drC B…þgó/"?/ž{*øýŸ¯a|äŸËèIôúm¬“ß`¶Àmîk¥±­%%,ßÈŒ&1CÑÿPØ ?1â0$q˜¢Qj©Q'öž‹hÿ6>˜‘€õ|á>i2òH×»¤IŽhÿDzÖ©dï9ÓýãG”#¶‰½±vöŠÛ1´%(UhaÚ=É@·ó?gçõóÖ~j’I>ígš8zFS¬u4™2ç‹kI$Q! ô˜4ýgº í=‡¤£”Yd4z³­Z¶-‡X‚Oø¨FOyò¢ÔO´¤Âƒö4¯€{ïÃÞzŽIG§ð‰" ã¿«ïtæé1'>Giêx?>#Ö­J¨xwñ81?Oa¤_¯Ö­lŽ\6üØY!~s‘å>’‰Áó2ÌÖtœ~XþšhÇœ·7]rÓ›_5 °õ„Ñ.¡¤ÎDqL7 5 ƒñÔ@ˆ¦pÃ8‘¢Xc0`À1¥DNxêœT“êäHèŸÀ÷D~S)$éR âi;x}Ñ©&­wú<ûž,?Då¦Ôô9CÑ„e&Dý'sàr|_ƒÈïâÿ'7*’Ôµ"ß%¥5ö~öøŒW„*O7gãá&= ~/ב½ë øÇZ~qŽë~³MyÐß óôùН±t!Úý‰ö“òƒa˜wxž?ç$îïd¶$ ¨’¬˜BR"ã -D¥h¤LE²XÚŠÚ±¶Ò‘€)D))¥=dÊ|Ã!ã"3Ö'¼>Sèð‘í©%ü_Ó§Ö+Ú2Ì0=5ŠjH¢a‘ûP!¬/D‰d~}Za÷|tOÝ^ e«Nf,ðyÕ¶RÕ±øGb¸š¼etè=?ñšÍ/¸IxïÇKø =lŸI‘>½<7: Þ6Nޱ˜žü&H¿šærª¡ì¥¦š{‹=;Ÿ^Çuø<"®¼ô!÷äˆ{W10ÄÏÐâ½° —oæ'CÛâ½WÇÙ±ôH安“ˆžo9ÍàßÖÉ´ŒË~&£öƒ 8µf§üw¸ƒöAûtûéÇæø-¥)VÛa‹#xáéÑв?YÁB;hõï®Þ=uÙ!鿺°‚Ñ$­’hjiI$–KJR[% I,›&RYJÅ’À–)(¬É(‰RII+2HÒ“R…m†!ZRe €dPvëm‰0ÖWNW ï! yœËÝÃ(õ?´zôÙPmLP4½Á3;üÁã²iÜcdãDA ¾œ¯üCô\Ú£ýéåÚ»zù.v Uêò ßÓ…à“~z¿ÑUz¹&8Gªwá8s eB2’Ø‘ |` ¤û†¼¯ÛÔ#ÿ¢¦ÀͿܞ š›Déͪˆ^¼sóŸß–Fh=0Ñïy<<ß8£©e³žaÈfs§ÇœðTSE;óÇȵ'¾SqÄx~ß?~¹Û…KMI*o1*ÔÿRˆI¡(NeCôï„A`.;NÀº’ÈŒƒ" ™^­<Ép Ä –#ˆÌ8#J–eÜ1@(†œ!ËI‚‚:Pv¢o<5ÝŽü‘½22Æ Õ¾»í£EÆÝïõxC¦žIêxHv¯¿à÷DœINÇ&ãÇþÃÁ¬‰'Í\.r'UúŒC5Ö30È *’?oöá/¯Qêl`}M8“Ü1 '”—»Ó”’r<ðBïÂGÑͻ˲MÜ»CѶ¶`ÅòÆpÆ3Q*f”ãýóéè$ݦ’¹óŽÐ[ûî: ²/" ë" '©a87ÍUZ5*x«ñdG6åõÚªªlÐ` anA5(­2Á4¡¦p„Ö‡í«ªÈ@ÒÆÛU_R¼ú@$ @;~·žyh†"ª9}æA «{Ò³œIXÄ0¨ÄŒJÔ‡‡Gv‘¦N…‡&+´Ô¸n¤õéRœÑÂ¥Õ‰/[®SD±ñSú9N¡/ö ©¯è¿Ø„ðìZSǘr˜žÂĬo48O„Ö㔡j+Yèý¯M‘ßTååù„s¢áqTøv˜ïçÍs) §—i’†‚&%«ÝØ@h~PÉ1,þ^ËÖÜzLJ¿6u:‘Ä8|#™¼•×O÷Õ6™KRʵbºü=ßÛÙˆ^ýªûÏo†dÇäÄ|æ%Âe<’:I>>"yÄìð¾ôòèžoaf¨ÚG/_ÐÑæ«-–¹‡ç-ÑÆ´LPi4P+eq[KLåšRY%–Ë û°ñò#whn)GØ’dN’k°U´§Ø~äõ:Ëé 9+9´…(Ø›ªÙ "Ä©Ñÿ­ù»ó8Uë,ŸÇˆ–ÕUŒU1v²”¤ ÐÑ&?ó„’ }ä9?œ§*LÈn1ò9˜¿sO »¦>¶xßyô×:âü?|ÛÜf~ÉX¾$¢ÅÌgõü?äá?ììØÝûñÁ!ÀH@\=y6pÀ˜ÍHð!«zÀ¸ãÔäôØöLè =ì2ÊïP÷ìm~u|-mòA>¦ªˆŸ¸áò{w>ÿ Cˆw®ç,Ñ£^×Ýkya–FFN †`hóðO©ÊrûŸ ~ªêOpuò²b¨“0Ç&“%Ü hX$%Ž¡Fµ+Eÿ- H‹(þnÝIC'ÿ.í$3?Q¤Œ¡ì±´o1$ aÏøZóþëM±‰'"+É;ýŇ˜´ÐÊ¢×_}¬b¦2XŒDP‚è@¼Ë"„5*íÒš†Hۥ؜ܚü{Ù”ml±ANœ~^YÀB“ÐÈ¢oZ0ˆ õ æúÒ©Y,mzœñ4A¥ÿ>£á|BžwkQкÌXÛ ÉŒ/Ùø²Ãšþšš›Ù…¶Ù‰ÎGÛ‚‘:B ¿ 1pçMi 'Ô¬¯#áãHUUDT„FŸ)QÜ J—ô•2|ÕzTóªÆ¨¬ZÝÝhÙM­ÝÛ›„·éó^€mÂ$‹rd99YR¿ßŽ“„ÃrÁ¥„¥‘  ¤iaPˆÀIJÈlH‚ňÁ )(¡}³¹@÷X*ayZßWדoØmÍcs¥n‰èIûÙ|”.ljQ-ŠO²S÷SVÚA¶ rÛ%-=L®|<¾°Ñ33ʘˆMØFx°DÀëùZ¸ÍÆ[–1$b çDѤ9¹âÖð~Å?Oã-‘#H‘# ÁGZÓE]µ™&¦%Úæ¢¤ªÅ±ª+v¬¬©ZV S#*qüߣà¿ÁäÀxè²wà±dŸ™£ªãœG)µ  ¶%J‰)ijÅX¯’N¦ïÊ|h´üÑïû[³¡CÖžu'E–Bµ°*qÃ~D¡«ÄťůdM‡T2&Z´ûh‡ÌHDåüüK„_þ†èãBþo¼_OrÇ”¤K÷þÇP~CòX8ï…/Ïø¿œB*ÿ·õy‘ óúÖ; ³ÙA©× ùÈ:Åcöå/çÊÎZm ‰óŸÜf„Ÿ¨½‰x~Á¿ÐøyHБ¥ìs+ƒ¾ Ë>ËÅ ™Ž› }mMg@"x`+ «ƒxþMô:À‚ä3»Çtñ‡£ÚO¬[‹{ïb{祈qÓ§wqÔ8õaO~8zÙþÿ»ã.kd‡-¸5J‡€^XF‚ˆ¾šOl.+F`Fc ±ØÈ^0Cˆ›¦æ?NP¤–иzðÈ = ±’:ø¾PÚ ¹ðÓ¼B ‘pø:qØ= v ‚ … «¨‹>Ÿ¬J:”ŒR§ˆGDZÌöHhÿ!4†iÈrìîxénµ+Ç8‘™ÆðM!3D¨ÒòÈü[`ïÞyº´ä˜œ˜×Åéˉ×]ÎP#LdÒ{(G´ÎPXºÆ.è›"“v1V iá±ö•1N bÏx¦wÃQŸ‰|0jyãN7”ðÞðN=–ÆO}Û‘«hÆ.:pA€ÁƒÀz‘±µ’°uzú‘Û^«²ƒO}Èáê¶ä’ èhwU+îq÷žŸÖ(J» Ø"ÓF(CÐëלçC³•2 0à]ÎWWaÔXMD ž¨Ô‰Ì@ÑÝhxv‡Mó­ÀÂÁ‰M¦ÊÇÌoÁß]<7DÜììœ6í££“v­æ3.†ÈÎ+·!&âÉ«w"q-—­tYrÐÁcáÏŸ,t9›3‰:V`æ÷›< d]¿ØG”¥Q@|’BŸ)3ëßN'V¤óµNWœÁ§{‹…áñÙ¼òO4ºÜfgC4Y+#È0¤üZ±š†NÛýå™Ù¨üK§QÛÃË´ýC*J‚Z"PrK‚D´zü¯™Ã@<žÈ@wUBd5I¡Ýî¥L¨™¡ï$g‡a­btðÖ({:H÷¨cȘ˜H²¤ À„)0  9(go|ë×½®úqT›³ ªXÕ à)©= Ì–¨´V3:>»÷»¿oMIÅ´í•UË{ƒOo͉ªl,âmäJ ì¥8¤¬8!´JÕÎa†uggÜæˆ†üûááŒò鬻ŸF'Ôú¼›l,ÈkL$ ȱ‰X¢"D)±¡ü}Ÿ¡ùa߃ã=‚ã©Ö‡ "þ…PX(S'°.)å/q¤u;ØcÄPµIH§è>xÞeaUP¼L)úPÀèÏÁƒ?eµ¡P…*ϸy¢iœâ·Î©;j¸Z!OÊ2Ë¥nÈIýX}ú8´R•*6(ÚZ–ü´Ñ#R7²S‹ð÷i×\4—Úkujð¤òKï´Z÷ƒw{™8â@éù`Ïì)ÕëÉðx略l‘Àztgνü­§[ÒÍÓ¢ÈnäáûÕ5Õ$é5ƒÃ-évt¿²sÉX_ÒÝ,Š=,ø3Øþº‡¾ÐˆôI«Àò pÃç̰„–Èšýúv¢îº|ýÚ€mü⥠6F=zîÒÃÞÑ/hìFÈðÌ{‘±ÔëØÒì“ÄŽcIJ^/34yoaÔðôs—/† DTVj”ùQOÒ)ž$D2AͲÂK(y>ƒ¼ë+&-ôO°£Ó€ØÞwç¹ëRY켋@)–MŠtØLdLA.¢lN< Wå¢Fl€D8vìr€ ö‚%»#Ñl9 ¸Emñ˜òUiB¡š öûíå”>!ÜAš$®FÄXÈ—VZÈFË5búúA,,´`#Éq/­h€(0ÓÂ{‰‹@‡±$*QôJ‰ã~xÌëw­lß,*רo`åH*¢œÊ£€ðöÑvÐuêè¸ÙÅãxzñÏN/!ò‚d„T8%âäJù[H‹66 ê‘_Œõ š‹¦—`øž¾{éŒcß8óÌêvï:yİ OÒv=þ óñfpQÃqîuÚ®û>aÕ^¯±áÏpüIR´O Ý´ò=Ŭ±<< •óÀ$’hBpc©ç]MÝ<sÖK ¥X1yɾ÷|5Sž@P첩½ý÷\¨36ÞaDóëä ¢_YŒ¬üéIÌT’…)O¯ŒöÑ´¨zœ‚i"a7Qç»2Ýž¥Ôœ\éŒÞXb{gmI»NwW= LrÉZm¨Úų”H2Ÿ *Íï'uëgU²z"FDðÿj"®QMý5Æþ œ+LºêÖV1®ºéªEÜH™ijEþ50ùßß1ÎÔ8Û ü‡& £¡ª^šõÀÎÝÆ¶CqÀHñ3 0Ì(û—©â`ä×C} -°ã†šMU¦MzöùÝZ¡¯ ÖD:LÇfެ‡§$þ‰WŸ¤Â:ûª°ŠFôäÁ‹˜®´‰†r' ªÃ쀃ûnÂìß~×O&"U_Ì4è =ùäö-øzÂ"ˆ§ËÜkëÞ*UÞvì¸àvSŽ/ôÙxi¢æV`–)-–˺GNðåà=éÒ;Ï;7ŸÊ> ÿCsÈ‹íÆÈ ùè¬3­UU{¼}?£TßkËáåùZ«VÙ6­Öb‡EU¡ù lðxÄ?ö_-›<_×êmp+KÜÍS‡ú*2D‘%€“¨ìÔ•O–œñÕ¨ÃZöcdÊÖ`ÛNñ¿¹Áö-Ï*¼EshfÃJ*¨ (aHEZ^¦TÊ*½C®di³f2ŒÙ¢õpÄmu©g$?‹*:`dM`‡ô2(މØ|Ó©¤£¼þ7¥Oõ*&OxÙã¿É!=ÿŸ™W~Û¶•³©&&>aÁ—Lctï\l”!{@uéÓ‹…Âr¨ÍçW£œ]YOŸ=ö&¥—o‡·êoçÑûOæ‘AÏÍšç;SÓäùçÜŸØÞþWá !ÿQX3ýƹ™… ’€Å IIuÐë«üJyý«®›šdF“¥vhÖõܺët”o«µÚ•þ-r£¬…¯—–òi½]Å¢‰"Å"Þ¥Ò¢Ò’¦Mê^—‰¯W]%&ÜÜšdš_.Û–ÉŒSåvátÜ/«T‡ƒ%H,†)0€¤”£ B&MfPb_>¼òÊBFS^¦Ü”þ?êùå)do}\£QI`I•ºW-ñnd¤’ñnšKF–îÜ2k‘¹A±­"HAWË®L½vàY$´¤m%& ²L…âæd¹\¢)4§¡!¢S7e'o<ò<)ت±"+­iÿ-+ƒ]‹¶&¡ñ÷ױ痓2*÷˜½A³XY‰“eË”jˆ¢™FëMKß×Õêw…>P ‹EU”-j4*ÒÑT”°)ƒù¡êRÓö!hZµlµ*f'Ð3 $Žg¸8=Íäv³M7›w1&Äw$ëzV1ÜfY¬?oëû2ý];´:2x?xôlw¬”GÑ' ðÚ9À«^¡GQƒàQô¾3ÈÉ*VpxJED¶ÎÛCRŠažxSØžžPàΖDüý*Ÿ¼ÑÚˆ—¬‚ž¾s0ŒËÎÏ (ƒÀ†Ç¿ê}twô²´­:5A=É÷.B;êaQÓm,…Rhùý?Ò I! _^«øU=•æ¹~{µæaQy™øõëløŽÎ|±1[É”³·â†ÝZI! €$!€!ˆ!’H¦`$HBgmgT»–ºíWpùyÀ„H€!!ug„0@ @€ I Bd€BPˆ !‰ H@Hd Q"ð<Hë[UÏ;Ó7¦fmRzr?åÔtÿ©þú–¯Ý3E—9‡×ǹÁÜïaÁºqÆkm.ÈÌİÀÔñ"~†Ë¼µa­†9„02uX§¼Ÿuzµ Ãr‘¼“tàhO×…H¥ìŠM+Núþ‹•Ö(ËRì â:˜›Èñêß<%Ê9‚mÑ„nùRÕn×ùÎO#˜‘³„S‚ö¬áž$9£=Ìp€àߊªåW$,0ãZ…p„¢›Ó²—²nI¼¡•®ó›mò ®¶û<ò`?{T3¢ãúf‹± ‘DÚ)TsE’™m3ÿ£É$aeÕ¸ÓÇE)>C5æ(‹xOfT9'ÕãÑŒº:¾_] 䇤;¶%‘K­©ªDR™†p ô_†D|¤œ„OJºRKK仡€Ñ²&ž”ÝÈP†Ôœ’„›S*í¥…—t‹ Iu¥È¤³B‚Uh`"»»$MON,Ü7§@>"ãÛ¢‘ ïæeîDW“OJ*£Žf%(ò' ”½{#©ZëµN‡5|=¿ÆŠz4 *Ea(0U2 ž£¸ÊÀµ"d¸elGM Ñùeï˜ÎÏŒ‡iÖ°ôËvÿz-`Ö¿¸¨nšÝ7YQ¢…;!— -ÕZe\*]]wd.QÉ…„V$6¥Ø&jˆZÑD#R{“Ö䢞ó#’þo™”,º•Ç!ÑœNZ :µæîVcnL¤z*8F‘BJW8ñÊ~ÿðDöU@}Cì}T;áUAPMSŠš0WÜ®h_T•<¼ê­6{¶©MŒز‚¶‡êûÃùB;L+¢uµ %J*9Æi:Æ7s ø×^Ãêžùèxm÷­•̇u‡~.òÊ"O1Ba=Á™‹»õŸˆ£ÛªâQà{«@”¥píie-ÿ@Þi0!ÚÓ0© cÛå÷:쵟P‹—@°qÛg–¿¡q¿ô⃿Óîô¿ƒmˆUg‰©E (\(Åóm®ÁPØiè”Y?'ÔOȘ}?[6§ª¢ÏÇÝ.ÝfÞIÙþíy]’dqÆIGxñMiÆV´_؃I|}ÝÔæTðž˜ó¼ Z"t CO<Ÿ4/áŸìej4¡ð¿a µ1lœÂµ ƒ÷ç€ÔFŸ”È€2zçñ9Ž;ùé9åjÛl½w«v-Q’Ÿ:ù½åšö—_<¢{IèÏw³ÎÆeòÎ|-œÏóÝ@H“ãímÄȳĖJC!99ð°«Ž¼‡¤°¼P]ˆâb»f&CåÔ6r[ËO´©©}ð °øoÂYH2  MÀL̽ Qƒ¶³{7­¥›Ö¾œ>p…«¹Ùç·uwv€q0$5†º´ha7•&»ìÓžc3¥œ\VäÖEUÒĨëÑÂH¶$J ÝÉ©¨ bÞ ¥‰¼8,FD,ÌŠ³5DÅ”BLÈ,L~½  Ä"!‡Á=»v“-$k0éhqL[bºí#‚cêzOO¨Ð„¿Ã^£ÖR€;´UíÅ=± ‚D™¦ m9W\q€~£×ÓňïLÍ 4‹ÙO íƒâfðŠšxîÛ,Êr+C*KF8IÊi‰¸ñd9ˆ&€¥ˆe…†¿‡ÖfÇåÝšÁ{»»šZð ц³\JŽÑÏ™P²!Ã}Ò:<dÒn«’ÃdiÆRÇHÛ#PlãEÊk¾.vxy ŠG®ÐÕbšóÑ1m±ËKq‰f®èý#ˆLe<#üQ´Cø&,‘ÎE¶ï2îF:­ŽR:FôEH×¼&fÑ·Z&OáÉ׿â=Áò»Ù¬×¸Êìû¦ÓwzÛÂLàÁm d 15(ÁhÅ×iPeT3•ÖÔ£ ÊÖÑŒõnêp1S¸L¢šÈ²µu…6&C†Œ9;¾à—²Šª†‰šdÓR²fJ( ±°¦“C(„Ì¢1X„$…E"°‘h¥ÀÂ*dDbaFÁ“FÄmD´ ‚KIdE&‘YM”³ bÉbÁ0Òh¤ŠdQ2M"€¢I˜Äj!6KE2XÄË2Š61‘4ÒDB†iJ‘#b 0F2 ‚3HLؘ„I„Ó)˜Èb™²lÍÑDQCaŠ,™€…J*d†ÀQ`ÐE¥,$Y• ¶‹ )šA 4ÅH&SI™i"ØJ’Œ0^€`À’âHARõ¾mv«Ê(¦Tjd„iCDŠEXÁ±FÄffÌÅ&6‰1SRfÂ2jhƒF!@IŒ%m[iVZ‚ˆ„;Dl2HÒ¥" ‘éve *Ó!¿!M£Gù´†²,×{§*æá‰ÞUc6ä™VŒBÂlóüúh;AóƒÙ_ßxƒfya<Œþ‰SÝí~ä׎Bx¢Šª¢ørª¡3Õzì<3ù 24æŽc)1½´{2CYƒƒÚÊz¯EM¾Ç¶ã§mÌ*'¿†°§"j<üó×d’C¿V½7ÌÙ™ÓIË¡ÊDé%‘È>O?,q’žPË©š(VVj-F¨·5ÊŹ¶½v%s.3CFNM&CÁ°÷ú‡ï™?…{?GíSÂs6¨xHåÊR*ÀM{¸Ê˜ÒD$‚l¶UàŽIÓ‚ðL䉧ÇWjDQùm|• Jš¬ˆæP»kÃ^®èuÜ Ì·Š¬U…° Ö¤¬pkøGëcä'ÚÕŽùæ?Wû§-»8Ïwfn¦Jíkµé,~ŒèIB} eoøæ˜DÄRξ#5˜ÂQáŒ,Œ4òlQëÆXìO9&ÂЇ`} œ“WÀÙŽ”v÷Úá´àWÄC•ÅLMš{PÐOÀêò‡Ôõªý ¢ˆc‘û#â¬)ïQÈšÓ~åOÜqÉêùÎÊk D=R‡îä!+ ŸÉE(R·×i¼íÚ*li&ÃRõÕ×.ô½K³Ã"l¨´*A ¡¤F…R’‘JThQ‘¥·‚>¹€ä&˜ã0(%¦Ë/”DÕLy76·ˆh êZZ heÁÎÖ þzÜd$ŸåÓæ³ªR+ü·Ë­MŒ{i“äl{/^t‘KF³%bH ð òIn3˜Gàþv-€I×L7é°Ç „ðSÀ¡À~ž]‹‚à½}±^°ùúpxPþ5xÌHíñ@ùìLQ9 w}d¡² ä4ŠdbXƒåœC6ZÈ*„¥BÒ€PÒ‚4‚Äù¿Qÿz;88?âÃü‰Ew"rhWÿ§þ÷OÏðü¿3f)Ð\õ?ÊÆÌeêxr2_Vþïóo4’ÔñîÑ‹U,ªY%¢3ýFx{¨ tâ9ŠISåùá¢×úÄ?ðJϘq©°ÿ˜Á ÜÜÄ…+õ Ž î3ÔsïCÁþã°¾òÉG²Ñ ÔÇËÆV idÀqÂC$ám+HOGéÆèˆ~WÌŸùÝ• §&YffŒçúžÌ¦ÄÊTá Ž³Å‰óä9¹¾cϪfe¤T‹?Õö3"O—6_·”Ë’så!úéÓêð/GüÀß䝿½%v½„ÿ¹C¡ãáä÷ü žøüIú}-èÍÙ ûAýåÀ¤ÛÀ,,x øø¥=MTBpŸ(ªìöàß¹•ù^Ùì1DGÚ_Ÿû±<±b™kùû²"a6MŒ_§öÁü‡¾Á÷<¿ÌNTÓ*¡£ƒÖYl‡¢|“À}Ì›µðæ‚|ZI©ÝûŸ©¨_Œ´”¨AýÅBÏrhîû;èGäŽ'´Rêìºc?M˜hè^Ÿqêj"$)¦¨R3¢(ŸF~#2ÅTÜ#¡qœ48¿˜‘I=#ÝZ¾òt5ü,rLX”1D2iKîs!¶!ø1Çì<w[!¡ðHO­$AÖ‚;ði!2(* Å5½³9?/qÏ8àµ5{áÙm¥SÕ?L[ñz§‹¿”bHñ*_ËðIÜQñ[b­Žä‡áä‰h·‘‚1q(Ñö$7 PÝaQ¤ý1§'àØg$&ÇÿsÃàH×Pâ]›Ò‘ü‘™„}ÛX~[B³YV¥aYhÒª(¡<úŠ”ðSÈÂD0È@ötè4Æ Ò ÎÔ҃ÔJpŸ’y+¥×Sòíc,ÐÅ3ÝëÛú×c }˜'=ëwŒâw?V‡:´kdŸŠ“ŒÓá#-RÁø$¥Ëøéü<")6^"³Ëûù‘£DšXœqÈ’B-vËdiÒÚQJ)X%¨ª÷÷$ C:I‰ –Æî„ûßôr„y"khœ‰8‘îðtéþ"ª ~åôá3àža~ŽSÙ¸ôÃWúu5í„d€Œ‘y( ŒdH€²?÷E²ŸdûÂ|?¾ö¯iJÜ\ýÓªWÆÆuíb÷'Àø~E'Ǩ+£Š)¢ƒ¢«Jàè*¦ ºïx¦6'IÓzÿ=ëˉk–“¦†xõz¬¨™ æ>¨=JzþÕVѺNðçÕY©,“gäÿ/òu‡¹=¢m8Nõj½§“×Òv‡wIË§ÍæêNʽ9Θ·S™ñïÝ,Ç›»”_O+j¬í<&‰Ï$ð”ú?)DB$H‘AˆT„!H•"Eb ”bDH…A‰Diíù#áº8Ô’ëHöxNV&Çxðéî˜ÌÃ,'ýýP㌒f BNjSn:ùŒ` `ŸçØñô¿§ H„7D=ÿÂ~˜iV”ŠûïÍWÊÏø§Þ*Æ”@ê 3Õ»Äè¡ÿ»Ü©èö¬¯†“)®Lrj:æ\PXêet´­B²Æ%¿Ÿï¿¿¿Ç¯¢SÉó£˜ßã`uîƒÞžñœ,·:"NQ,1C *¡V„ #)$˜\¦w&PcŽÃõä\ÒÐÄÉhPX_©÷ùò¯×¦38óÛœs£p9H^ÑK$ QTÓJ¦@γ£âZçŒÕdTÌV#SAtІ’?àzNɘÙ[T©d" nÙ‚NÈýÔDð„sˆÁ9­F€¤ši&MÉÄð„.Ÿ^ûé¤÷W\duÐýmO:éw]1¢Íšæín«÷½<`ßÿ¾O}ˆëÕ¯H/$D!Ùÿʨ¨ÿÁ ?ÚŸéLD¤H$EWÑ×Ïÿ¯þBýà¿à>ýN½^¹7þv$ÃJ¨BÂמ-aî?Ý÷ü Y”e´”!Ä&q>faöp 4ŒÖ3P˜Ü…:Oö0šc°°ÒÂRf¥<=@³˜?àqD’Iƒ0 ù¿âÊÃþ!øˆkøŸ|Iÿ$ý°Ëü¿¿`þç4˜×ûáü¬G4“õŽâßúß"FÓɳÊ"rþèþæ¿õ;ȧ™ª~ù?fÈÙü$nÏF’q&d‰Éý‘Æï”F3mõ›ö“ûNú§ª|RÇÂ|¼™wó#Y>/]‡}ü˜UcV2Nšò¶U›·ŒÄ"‚IÁ¦)X<§'¤#ƒÛM–uOI:ÿjÓ‰ÿ-HbiÍ–ãŒw,²£±Ýà>§vÌŸ’BOÖÒ4<ªp˜6C¿?£ÁŠÑƒ>ÖœDhõÑý¾nÉÖY=è)èë?Èñ8ü<ڲà ȅ¤GÑg "A„“(à}´/»ÕáwR[Qø`IðqÎßõhÑ9üÎÝþ7lb±R8§.*ÏÁuöxÊð‚`“”'§>ò¬†à1__˜|>!ÿ¢ÿÿ˜ ¬“)¬þ1üàQÂrX€)ÿñÿÿø?ÿÿý1ï}ñ'Ûp:Ðïúy4j ²Ä›lªZ!’ã¥"û(Ð …-,ÖÈ/yÝç^¾éJUP=ïº AÞÍ@¥Û-ó{R¢" …Jm‚+-î»@}ìöÇwÛÝì°m}õ¨(¡$œ V‰-Ó”…(è4U²"]rtլѤAAY%-PQÌSѪ€ Žï½j¥SNI£{5 îu½ÇÞØÛ€ ·9÷}Úí€|›£ï™Ò…º*¨ ÖÝzÒ¶dE Ûml›ÎÖª©åŠ#/s¸+OM±ç}oo]º#ßg(ú¶ôP£ãÝï ªª#¬Ýõo\öU—¾9[·R­ìâö7>ûçß(‡}ŠÓM{pÞÀ{&€ >òshÓA¯VžæÖå»^»ÖöÓè{c/AÖîíé®îô îýžwk¹·fíõà 0}òBQ'ÓÞ½»ÝO­ßwµö÷¾ßx­}u£žï<ôŸ>÷…UOzÔ#{Ù)÷ÝóÛ[s8©¹½ëoxöÀo¹DPov=Ú$­ž÷Î|—ß;ºhìõ»Ó»ï·>ù÷wé½3³[hÞ07Ý÷ÉTWÛ|ûÏ9ë¤ç»Þ_w»U§}÷ß}Ól|í;wq¶åwgDo·¼äˆï{«í^¾ íº§=î8n{4 íe Ÿ@`ŽÀmï%$^öVžÌHõÎë§M:tÉ®‡_f½ vÎSÓO£éÐÏ}ëï›±õ¢û{½ÚÕ†‰@@[ÅÖˆ’¾»ï\Ä%M/ŸH¨¢Jw½àÂ( ¬6¬Øm UÖP6€ÖØ M¨€@³DTH ±àwwÍàm)îßnKšy·F´’hIPš Šb[ÇÙyåÓið=˜ï½MÅUú>Þy}÷ÍÞß7Û*ït€ô à”$UX¸€PŶ!  6àp‹îï–O¹…ÉZ™P¶|áðí¹ºÕ#¼îµ®öûw“êËï7¯Zôö£Ö]ÞÍ-©¯ZFõöÝì÷ÝåM°Þà½ÀìÞîʹ ´÷›¤= 1HlWÒ·FÕwÜïFZA¥KëÇÕöø Ì÷Þ¶”S@Ym›nÛ… ¶´Ð#SZmh©9ÖàNÛÎî ÕØÐD8ÕhÛlhû¹Â,Á³"`m¤€BŠ”‡ºøúîÆ;žïoŽÞÎÞåÕç·§EíÝtw]Jîç²÷ÝÝ™¶_|õyöÝl¼¾8ÞG` ¶L†²[ÙVZ@ ÛA©€LHHž…<©Tɶ©“4ÑSÒ 2!Ò(Jzš†ƒ@ 4i„"D™$ÐȦš S@ˆô€M"B!LšñO=FÔD"€šh&ƒA&©þ”òF 4dÂ$‚B!›U6DõG‰¨öG©êÔSÿÿýuÿÏm®_ ©ê`=Kzù7ñôó©cÓ5ëh*›1Cì„‚1(D¤IÆ0ô·Ù€‚«`*‘V*‹T@PPFE"‹Ë@5²#"€„Q‘DA‘dQdEЦMÐÞ › fq. G1Eo©k@5¸ª_0I Q"Á$€°ø®ƒˆÈ2¹E’°éïðÔÏqe‹{±ƒ¥fUU´ù²€½ëe³CsM¢†ðu‚ÔUYÕÙ28Á³©AÅ›=ï§Àààw0˜èS£×KFÁ³€Ý.ln£FóÂeÚ)±°¦“!€„ :p™ ‡t(wCFC#;;†ÈmºRgcFÁ‡qË š µ„Ñ ÒàÎ]·Ý.˜Ív.îåÈe‰•ÐXlMŒ¹lé¶H›ìÚÆlïeÑcE1ÐÙ2#›;)KI”ÀØ« ó±wFÆ2ÁÝ2è)s¢ ”À.Ž+6¤ÜÂ_B\ØÝlâ ƒ!„Òn™nnîçncc[†öÁºE4i¢¬º4é%”¦%Œèkwp&ÈPݹ›ÙÀš ]l}\±,»» €ƒq Å¡.;´·q”#²m¸ì‰…Ö)4Ü 9ѲP]ÖÚ°S“}©JBá 6„¤H;¡ Ü, J»p¥-‚ð¸e7 Ó‘7Ñ­g`ÒG#°QœØ£Ðyž< í4äô4³ÀÂYÓ å¼<ݤ§z]®`q¸ìØv`&·ËŒ:‰d. 04l$˱}€ÆJÚ®Óg@^ÀîX)±€°Òš:s¡[£K°¥Â&æbbÅÜÞ]dÛrå÷7 ]c)!}=¦Žh¥ÊÐ2©0)KØ$Æ÷Ó¶æŠÎnÑ… Ò®‚¶„9¸C1cë)S­°¯­¸À”T.-B†äÀ¸e #…0&Uºl²›º7Ð4‚á°;бC1û›6 .Wq0&Ų™­ ‚©!RêU•LRŽ ªX¤ –R ÎÿöSòÿÐgþõz#ÿÄ¿àÿðÿÛ÷ÎýÇüZÒì¾è†å;›:à¤<åjy­›UŒƒÖ¹<3ä’dO¶GtÝæWI9{žStˆ´|ÑfË©u†¯›†=ºD_^Ê3-”åSlÙw–°ÏÌå8ë7Ži¨È‹ƒ¶Õ¢ê(Ö¯|b5²[Üžliø}Š=ŠgNÊ#¼õ ¯rH[€“tŽdo|Íq^KQQHY`•ÅÏV÷³lÜÞuº5 ”« }ƒ¾ï+!b×4ÌH—ß ^Zmò“ÚNÝžðòü¹ÞeÑ—2¹81 “ï4‰®6úç+<’p²ñ|ì4DÕŒ£q!‘m…÷*ú¥‰ÛmaŸ|ܹm9ÑÝ­ÃKŠãóTwRˆ„¨]uwÍgn ‹‹´„%Þ ‘.zk¼Ó.îFvù^ ¨eÑÝ›”]u2A”´É£7k–âSk“ŽŽë§zc>t‡Q°yïxªC*O½eœ“µ²lîJKZ«ÖÂE†ê†‚Iwé!º®ßJÜZ›x«-&Ä->ûÚ›Ëärî9 ½>¢†¸Ë5,Tö&8™NÙq’3ýJfô¹ßuÔ›rï…óÖ[v®Ek^-eÍZ÷Æî£EjzGÑ¡é»+d'=´MÌ8†ßo…`õkÞÊõ [.xÊLPð£:‡ %uâ+A®vÔΖJÒÛzÖƒ2j p³ÈCL¤6»—íUªlôçSåRrg±m:ì£[íƒQj¨¹Ò}w;Û§uµq;r‚tX*ŽçuÎs›»”e¡Tüžé‹2°îQÙ¸§¾7S›4˜ï_¼8\ôçpu­d÷ÞWg=GÈÚ&‚6ŸD‰Üv©ÕÉ3S¿{úÞ{ZÉRŒí÷QÍe••˶Ú˾Œù̽kWD[”TÖßG©dC‹}kË,În¹&fOE1-UÎLÑKvó:ÙõÄÐD×Eeùp“\ô¥vGEYŒëWYnÖ—ƒc}ëNùãÅåœg„¼Î÷SÝIÎêïˆÁ®,G:üjÒE²ÃOòÜ„S¹I™¼Ú,Gw«sü“ÓgIÁ*QÑÆ¾sË#Û ežôjx;M¹Dµuf…|î;Úp˜1ç-y–Eªç9®ÛˆÚCQ—M&29šØTÝÑ6·¥ÖTë1a?Rí\\õUø5}Öc1Óu§1Ío³åxØÑk™¢ãvFß­ÄÛ»ÐÌê‰/2; ›gÏS%ÍíWšËg'wØOßIжŒRܶ·©žèFgœ•ËF¥w47 «B<Ï2‚PÝ7Ã5¶5DîP_-cP¥Ù6ç˜É×&¤rbœõ&£4á뽌ÙÑÉ6áŸ"y×MôF™º\ÓÚ1ï\-f&T×5Í¥g–-íôù:&œ©öaòZ´žw´®7+(ל«)óœ<¹e­õÚn[Õîœ]çSÃÖL»˜–Úró—‹vYãÐÉu…ôÑô¬m¹ÜÕµY™¾áâäà)X¬Þ©ÐQ¦yÛ˦z¥ÅÖg«Ä:n´ðüÝ¢ß6E£mK×tûè·˜&d†Ð}®ZÖzü[‘WÈõµ²ì>®5Ç}ë½M×y£ž&Q2AŽÂ梞'żéë½{cNo‘&ÏØ‰2¸9£­9 iY.v Þ¨EÌw½#±‘šÖûJo¼”¾øH°iÀ°W›$ͼÚ×/zŒÞò¯Óv†v¥pg¼äè£7ÂtBÝïMµw׈-u‰gqÌ™ì?P™šbeæ ²Ì´\a®áô‹•9”Ûìå™Û[ÍBr”öæù^ÔVïH-¬2o¦;]~ÝÉÖ»Ñk·žÊ/9Öé­Úg¼jÝQ¢1¨¢¶ŒÒäŽS´¼ðûÖLÆ k%¦Yìçƒ6„µb“sž[Œ\â²\ ¡gp¥#{eõ{z+.©’”·8ÞO ç³Ì·gBø-hüz]ªÙ²ïvç»V”R„J^0„Ì»w.\ÊΛ§®Q¿µ³G2Ⱦ%¯O]ÐÚ5ÆK!ŽkgÚ.÷¸l•ó’û× Ù““ÓÜ7s6d·1ÖáTg’›-h4¤rs:eµêÉ’Ñê)¢æ™U9;Ƴ×e´h¸QÖõ¡Þv›C‘yÊ×#a¥+Ûa.šZ|éuu»æ´§Ôm>öëG“ZÔk$ú°‡¦Ô•΢²ÛQ²=y¹'˜çrOØÂR;^²W¢gç4ò…\×]'ÙTy®êµT퓊ÌÖ—2ë¥.DGM­_ˆ­$é¶îÒ̲ٻ{itØ|½Îc\Ñp{^ÎiÎõY8@ñ[Ñ#'3È×2ÕYYèQ³ä爢ɞ´ë¾Ãh™rÊÝá(›=èŸ$qi²}õöÊʦrup]”>o‰†'®Üd[ ˾LÛV›è‚Uâ@Ù½Ï%š_!–Ϋ¾ÀéVÌ­x]æ«’ô—¾Ž!Ñì»tZ4vH ½J9e“¹ª&SQ6Ú5ærDL¦"os•CJég ÜæùTåz…±;)=X੃´çy5Ôl¼ÕguÓëÆXfT„k³ËÆj y ·2¼îù<”T¤ß_­½p÷ÍÃß“R»Eíµ‡ìízÑ<£9Ó))@G³Îº¹Ã±ÓÞŸQ:zJëŸjcƒ½% 3¾ 7̧®nh6FÝž,ž{•´sCÚò‹CÕ–Ýß‚ozi…‚Ñë»-Eɧ4q:Ó§²ù‹Ü«×gpîö‘ÎŒë, uyM?–S®"”S§#J&˜î 2GÝäk·¾ Ö´úån¸½~ŽjSZÙŸ&e)¸™Kµ+êôp–Ôhk Ñ u Ù¯rÓc-S•ìªè-OGÔÁ ƒê$»Þ²#>ƒ®çS‘Ô+‰†~R@')ê¾ó–>©Ž1>P²º`Ìç’ð¾'E;Ô@§I@ðñ@ÿÔ"×üþ<ïÝËοó¯üWûüp×ÿvúWðÿùÿ§ b4¥˜vòÀìþ¹K¶€PWNËÌÉ=5qŸžþ\‚ÛQYË(,CTÍÉ‚õbÕXÔ»™ƒ/çó’bj/õLUDSÌ>“Dñ ª,AAbŠ#ĵ(ß^÷Xƒ")Úe¿ê1<_ÎI¤‡¿$"Q¯mVÿêù—¾+JK÷½T‰úÿðœoE@’ä I9.à–-„,†“ Ȳââ—òÇ’c‡ÉëgÇ2¹ÖÃøñÖ‘¿©2AÞ@À&¡FMÏn˜ iÓóön®ÂÏ}bö¬:ßvê™D–‡`*‰ž7왭篋ºXª(o‰ûH³Î¨hÈÞ” 'R¯\òîg®æÃÿ‰æ©WE6'Ï#Ãw5†¬¾¶L5åóøGb1™i„@«!‚NÆ.;õ㘸~.E´¶~(…„W+­òf¿÷È€K¡~=Â9HŸv³2̨haÒÖ…å€MB‚,- t_׈{™×”FŒ!ËAt †Ú=ÓËg2ïÆáŠ? ñÕ Æå(¤U‡™ˆ,OµwwÝôÌñ¦=bØÛ7  ŒrŸI¥euéútg®< Ò˜¯L2"Ö‚¢ÄŽV“ˆgôK6ƒ ˆô™xª³ä [È.!í)-Ó¢þ½õ]Íqã>ü»aÙDJHÉb- gaãHÿéá"‹ ÄÃÂ?OU5’ÊÀj½8rMg¢;:ZÊ!L¸2Ý}¼‘Wdtg’~ v`wÓ²ÔÒ@“ÿäÙ¾K’ßd3˜xV‡¯NìÖÞ…ËÓü`h£²U»PF)–Ƽ|ÍÁGíCq mÑ#±;0²P5¬6>¨{3(P™AÄ n­"ä’>u°"ÊD’é´=Ü %‹vy¨Q»° ,ÉS.ömÐÅǃzÓ)§ûŽ ¡fdy¡°l×àcö«Bbüæ ô‡_žÐ«`¬_;¹í*rdª#mçÛ €âV)ßx`Á…gÍ¢Ÿ,žwÖâjkí<–ñ†=0÷Êz´=!}+ݰ!é&ZÝWˆ? ¶ëNÆî×U .ÐF"€„Û.‰Ä+èÖâ Aul{¢îRgY…¶§ÒõNÓ>©{‰žX|d ï.§ë”vÛë8ž ’®×Iiéúq‘‘ >»AÊ5"œ 3QT@2õ¬zÕ{­ ܃Ãguf[ ˆ&tסÝ/XÅŸv_T¯ªXŠ"±É$ ƒýŠ,ð†û@zn5íùé뼦)ˆŒqè‰ ÍÙg˜ý!´‡…(‚JŒú´«ñ˜¬X²Úûêâ§ãâaói%ê íÛ÷k†-” u÷râHDÇy O›AOº ññH«Ÿww¢–ÖÐFËvz"©Q` pQ¶âf­awC²åß§^¦º–ŸIkÿ9µæ&Ó]¦ô@!YÆ ¬QQV ÛâdEåÇãŸo$À‘t1[>ŠÁ†‘ýËý¹÷ªª‘ˆ°µŠ-e[B}³0g0Ì TAeAAj,RB´q•‚Ác-¤úÿèNwTšèž¹C›aXh ˆ#LÐGÒÛÍʆ6Ù CÆòü7ËxQhJ‘6ØX3%Œ-Ù¨’^Ó&uðÌç^rw‹ˆ"±V ‚#1_·e‹¡Ö$"ÅE4ûuµÛ5,C„ÓßÔ;•/ÅJGq¦âØ»ùäà¢^sà:yéÙíÄS°ã®¾Ïó Ì2 v‰HraOGù¼üóÿÛiA…8_ésÄx0&÷.rD÷…Û£Á„@ðBÂI5ÿôä‘}ƒ¯\x ò¤ê†0Ò¸u3âZ±í¢ÇÌ¿`1×(6¶^îd°ªM`<긗ÊÈ1,7¢)n®·pÑp/F*†ÖµŠq„:Rn‰~.Ô•®\MÔ 'bš Uç½;½´„ƒDäù"_{x ½[&ǘ` ¯*FÀ˜@kœ­ÁçôÎ6<‘Š–†¢­1+ã·ßx:Ð;ld€çRØ\§Ý-Œ)h‰¼{™ŒV`ï¤3ðCxh‹³,ÖÖí"vg{ C HfZ¨MçÔæ(FËIM´¬†5†/€äc³9ÛÛd?[¯6èçg›¤â‘ÒB8#” •`tP¹q"sXlÓ€8\á I“›6Âøš’1•U¶„ìÒwçÃÈŽbÁ 'dßîª ÒÚµòˆ$ÓøØ}ÐîûÑ£eî[q¯ˆL X_ìcú2ˆÂv`J6¢hÆÀUBêâÉ… ²"­  ~€n‚eÖ‰}ÙЬ©F@Æ ö£ ¦¢ü ¼. ½Û™WPU¢ÁjÉrÞ•éÆ‹g°,ÐQf‰1¸Y;í "H$^¦až‹GRÃéú§– ¬‹S ]Âú$v]è_Zð§öz; ]:JõGn¿XB\0³Ì¦“Û.¤à÷E*ĦÄi|P>P–Hl4OËÕ˜‚ ñoˆ| ð'ç?B„F% ¨&¡Ô/ssRi esåwK8{É7M\J%c•Û—@Φ=ßû¦;~Ôü}KB”z0h?Ú©¬@PP¶Ê…Tù¥••ÿÂÒ­¼±‚/7™®2XÄA;hªGR³íohSºå‹®°×¶ ¿T*qôÉŒDEEb"Âv—Õ*EWËæÝŠ˜Åee’tœf$PYŽZúBª?Å9…‹Æ°–ÕˆÅY2ÒAAT:K½\D=5xÔzJÈ«¦§Ã$ÔbÄiR³0b¢¡Œ>/—PÔ…`ª|2zNF¨Å"ƒãI–•:¼Ê’²µ± ÃË`¤‚ÅFAĬëâãÕ,8•+^öâ(,QVH,ÖEêËÁ’¢ÅbŠvë1„SÕ,½PÁ1øf2EQW»Ež¬€Û „("ØVx°PPí§—Ú{Iât'¯Tã]`sn é…UV5ªª«r$âT•SEN’¡E$`ÃYŒÄd-±aÏÒN¨?‘=_Ÿž]ÒWë¢ÏêŠ*"(,I„ëñ…ø[[îûñ¼$¬ñÇC`ÐÌÈpà9bõ]ãƒ}™–‡¤×5ƒ‚ m†:0„óEý‚@u5@Œ$^¾57Ô`ô  Ž˜ðyÛ ÎÅ^ó0. ê@‚ ½Ôˆ+Ž,Õ1ßzdÊ|òÝrQùÏ_Z}yí‡è!rÕ„ \)RóK‘ÜŽHp‚y Ÿ·ë¼yþó@ï“ú¥„íʆ‡»ì|!lõ…Ê3[Ia÷öÉ}0b¨©"›èÙ„ÌÉ¢äé–²„ñ—ðHéÇí¨ç, è}q2ó]oÞã ‘“F¶;ðÜ6Oíi­è’Á`WOذ“Œ§vE‹2ÉöØ_ ÙHB Ó"Ë1X–ò}³L»Ôhò3hÀÛ¸ˆIñY‰FUÑ’Ky«I3wlšû‚>ÿ&ÚIˆ !£_ÇFÁKêmÞ⨉-̈±ÇÞî­¢¦¢ŠTÁi¢µ0\c=}³,yï{—¿Æ‡™[h¤z¦”HüÑLY Uš=/ß>¢ç5—SOÿZL÷[y"ôùÇÔ ™ñ¼¶]º¥(.¡çiþï‘]ÏVºV´!#ð˜âü™lÒ€MÜ»Þ]UŒþ³NÔË*Iñ]»Õ ”õ*™!ÂZŸÓfXúCåA"Ô™@Ýòâ†sCÿ±z“GI+4ÎÈh#…j—ÜC (ìÈÄÊG¯«¾Æëº•Ñkõ]Ô}\Ð=6`Óó³¥³ÙI0ügR.vm0U°éŸ«$¤Lf)iÔáPò&$ŸQö¼›ûŠ'_¬÷{@Äš }'¾¥ýÜEšõCç}ÇÍÎÊCuÊŽÁeÏìD¾úkRöÉ/ißëêù·K ¤óî(§Ê}ü†ôõôù©¨%ë{ã¦j¨®=“F‡57"wï¿:«Á<ì'2§Ñãd›¾÷qmŽ÷œÇ“ü;zödw$Ü/O6ž`Ľôì¾=|èÚ÷—ÄâÚçHF”ÈQ^$2µù•ˆggoH%øŠNaŒ¬Rñ‘ Ÿ½óÏÙóW,§2ÿGžÔÒnM/Ï6£å×É?|&§‡»ñÇ(粜­käA4y´„É<zøü§S—³áüOhÜÊ4’ú«ÍSçˆ×ñ’@‡3×QÔv¸`ú6ô†{³Ì—ñC~/Ù]5‘V–")Yáóþ."vÙVý–†gój=–¾FåF{ïÌÙúÑóùý)MÉïÍèÂß&‹âúqIN(ßâÀ0¹s‡:²¯Ã·«’mGd]¬É«â‚b2 rŸF1ÏïÝG¡´3#ê:ýyAöaÿž^;9ò‘°÷Ô­K!Œˆ˜'âŽS»¿·z¦-þ©“ùäÀ”3+¾W6ï"Q¨3Ì!Pâu]Ö'§ ’}ÝT–ˆþÙ^ä´zq™!m… DßÊ' t4“jd]ýËéô“ýñq½i ÿkTü…u û.öL>Ý”ÕR_“šœÔÿH7­'ò_±ÌßìKóéêótùý>­¢{õúüüØtV‹]¾øÌû˜¶ši{ÏféÙ·÷TD#¹I¹sì”+Þ @?XŸ’³ëÏŽÙX™LLÙͳÀ:¸s¿.dOsÿ“ö?êxŸþ¤ÿE¤û½_ ì´ù~aºr?–Êqˆá?_ì†c~S m‚ÚârH§fвîiÐ?×)`º”ŰÍÍ!ÀhûÙpàͬàM8-Æ‹’ËÅÜl ."ØL `¶›ì„x&8'ëº&WlÒlÜ º§x[à,Ѷ´¥!p€PBR$Ј€n@òøp&øÐÄ0TÕ5âh/gB_&µƒIŽÎ]œpÔ.`ÎÅX¦ÁÖ4@Ù¤¦Öü´•Ãéfæ}Ç!m‡ƒ)7Ã{¥‚9º6`aM!ûiÜÎ@Ó6£Lw³  ñe;x.oóP¸ÕÿšlßQ WNS4]¹•!¡÷¥5`± ¨)ÿ×"ð‡ú6Î-復Ÿ=ý{u[áù­Ô¸Qkp}{ëÑ¡]ÞáŒ݃` ±pú‡û 'Ü=ðû ÿÇŒF|½oIû_Ø]RÿÁJ6ôÈ!´A®}ãd@Ö×{ÛH3ì–YÊ3… äZÐ' …œ¬êR@fš¬Ñ›©6I¦eb·á[ì#7Ba ¹7F\IvlØ÷ÖÈ`æâ†±$<¸Ô°©ÃV]jS# ç-­V‚¾qHŠ=±Öh’$…D¨Â$ ?µò‚yÚ„ò‚HžÑj+ç ÆE$3¨½Ðô‡8ˆšŽ !Â!x…OH¢j øÅdW³Áv°’¡j!¡|ÀßÞÏÝówÇ¿Çò)îwœß­<^6Mˆ¸ÿ[TnóqÆ9q;ºª÷n5FÜ™[—w{™™™›™™™{™™pJB§VÝCÐÔ¬jØU&ªŽª7ììÌÅ3U1†Ñº.®V:÷ ac—YhÒ33*b&îíQ|ÉRø²çaêfáÎI;R\ÓµS»q³ ET¾FN+­ˆŒ™ÊÛ¼ª­S+!țսáyɹÊÞä͸wgst]Á¶*…#UØû]#ƒ˜¶œ`åÓLe†$°@ÀÂUJѳy»AÝ)0ÊÆ›“þÃÒwØ[VÀ¬¦©ÑXl+Ž„”«.ÂÎù rš±+ú릻ñóšAÁÁö"sÞ⻩ôÿ›eŒÚæÍ0Þx<ôžÇzþkY¾ M¿bé?Îçd{yÛóö' k#Ùó1(ú-"ÖSY4”_e‡ûgÑc'ÆYº=ÆÍ¹`†(sØ3CÄåò°•'a*-Þßˈö®wÓ${aõ»–…S,sêAjŒË@Á®5`Ç~SѪªF~å:„((K$|‡â>XPrüû]!ùú,/Æša_¿® ‡)p”`žOBJ÷¿Û—ÈÍ{XB@"Ñn¦&Í9Cß@z?‰5¤1CÛ¦Q z„ &aÏøÿ|~Ú»PXv<4ùç¥]ÎcþÖPZ…÷wùÍ7e`>[y§?Èç9üôùïGgð?N> ܄¡¨ÇÁMesŒ°rgDúŒW›2ÕðñŸ‚N„C3I¹Fž«‘þ=A›PŒp|úø» RÙ×TJ•¯3?Bš²£þkΗ-‘¬hLp{š—nT%5~GÍAÝkâUí÷:òwä ÿˆ…ó·â —ûÐÑ_…—¶òb |çoa½’;EF§r‘Ttn`ðR÷žÉá^ gWÄ­ö~ UþN>S‡ö¿E¬ˆy¿§6|¿â8Ÿ€ä¾ lªp|P‚cH5âši¹‘E18`¥@–3CQˆëõ‰ïQ®¤'Pú#”Œˆã­µ"(1Ælj2¼p“ÅõPÍÿ®GEâ÷ðá×ãíèÌ@“£L˜­«8½'“d`ˆ¯~Ùœ·j…€ÄìÄùQ‘ ^é·ª¦$v´‹%W ú¿›m–â:jŽ÷H…Õ^ÿ¸pM…߈œ&—Ûçb=›Ë¥Ý&ûEÇ¿JCŸ9[ÜBOÎoÔWõ âÖ…`ð¿Û¨G´Ëþ?°z‘bF.ã\KÙ¦uýÑ_˜óÒÒP‚¿?'³øcÄNbÀz¨úŒÅºÿ=Àè™»Dò„Èe%=èÈ)ÑJ 'Ä^ƒ2" òMø/«/ƒøúUX|ûúº¨ðÜ ­~Ç_¯È£'@¿ì«éÛ¤ðšr…1Ô>Óè%*&w´!¸ñÞ¸o<é{OÖÎqîi"ˆAXHH<¨dðv`Ú÷oÊç-éŒÃÄ ‡Æ–´þõýUM&k&AptìÊEûËÆ¢ÎæWî„j•–2—”8ò0øO·b”D’̃~q· ËðO±ÐéëG“¡ÝzŸx¡ÔT–XT;®ÞoüçöZF¢#¼P¢ñ)øÝ33ÒìIÂÑ(‹D&P©Ý­ZUÚ[•Åÿ‡ÖSü8‰O¿´]°‡ù±øà‡Eâb‚"ÇÀ`È;nX´+¬­h3ÈnÒc™)Ù m ‚æ´ÁF¹û§ìòFtªÄ[¾)pÝ6 <,iHèBBtëó’öZÊAn…Ù™ú ìE=’}=¿ŽGªq\Qþ•ô6ÙáZY•N'*Lg„êþÐ|‹Ž;„eܯ1 /ö]¶´ïÛ¯·=MºŸJÿµäWkÒOb¾&X1Ng¯J¤—­ðÐ)‚ÙÀ¶xF¬A¢Ikxu°˜~ŒBgîçL1scɧÒ¢Ã<>ž]þzóÏ>FKéPÈÙ*ÃðK ù ô‡oò¿ã?@ïG°Z(z(²Rwt˜öñhI ÁØÅÂgßùi#Ïôö?ˆ~êq}tc»¯Á\É€Ô‚˜etVÇóa`6`tRæçŸëBÁ%£øɹ=¶¹ôÓç{ßW9ØIdö0(¨O)_ëû7O,D¢6JQ`_—ÙŽ®æØœœà3ζb|¨‡³Ë«ðÏNïÕFå2…‚ÃJ"JèŠm ‹_õþ—1YC«OßûpW`UD›WWÂX±Î|‰JPk€H]×'þ9®--Ï£¸Ã¹ŽáÙŵî`L,˜PÈ'ð $Šp«sÔ ÿ3¡¢:®ASþæ+®ÂYRúGÓC}ñ°Žöã~ÈGà•ÑlŽÄ´B§ñ­@ü˜2[à4YýH9}g°i½ ‚B‚.'€âÊí³~ypÜ#n€pç³dK%ï«Ó ™ Q£` ,‡ûÝ}(zi+"ZÐà”S….Da ~,ïʼÜÕпV,ǾÍNk9’«À‘Ü¥¡d@ØB辉[]†ØŽ ïë@Ê$S$dî=B¾Â¡R‹äF ŒOõgêvyZÜaotð¢åóaÔQòàì`P·8’`õ2)®ªEK$^ðÍŒ–qç\ÿÑÔLpD‰ '_ÁàFþRGt *Wž¦ŽN}xÃK5io-dž;DzI®Ž¨Ø†å"Ó7Á‘G¤OF:™¨GÓßÛ¾â²&À-œx0’üMå~ùÇ‹,PZöéA¹ÀKDSAD†(€HhB¥¤I£Ý]@¢§ä±1A‘‚Êä…x¤&ˆ¾(ÖOWK¸$¢‰¤ðÛÁAFiOHØB$Wž}ôæ½>`§²¾ðÄPS§ç8”ºr›ÎW¸g„ yPìzœ0zéèJŸÅó¡’š|ïW¦âñ))1²áA¡,¤!ÀBˆj3>ÖI¦­() P‰”ÁCJèå%ÝÄá‹ÔÀ¶è+‡|¡È\g%mÈæÛ$wM][×FÞ×ZÒ’ýWÔ0a]žWôVz:¼²ïGÎqúï&¸L›d:0,[DˆXWaý›ç0µZÜ ¹Ü_Øn–Cgc ˆâÿ+º«8‡ÈBN G°;~¿g‡ZK kð`$:BQ¨¡D6s Qøo{ðÞ¸›Üq¡Î¢p‘ÙñB‚È"Wg=ÆÔd‡ÐWyÖ$KyéËð¹eÚŸáì‰5d0è{Ùö&Ý¢,,¡TíY#´Ý`E’H •§ä‚ƒ _-GÃqjÁ„ØÕ"µÇÇÆ1 ·¡$ñå°'Û¬éwã©Ö…ãÂæ9’.¸g~ö?M×ìZîÄõ*àùzûüyÊtwnµø›áòT"nû™jk†ÐúÊr—Æ—æâ¨ýtS€Äù±ðÁšéô÷Í?iî[Ø@:B²O¯±{vCÚ!ÂÂ›ÑÆ¥@Ó}tòTs7@ˆgIÖÄ*“CY Å] „›Î¶G¦Ð“„»®LÒsvAbeÿÇöè'Bôú:€m%Fý¨+R«l"Ò'á3ñ<3žH}£ˆŒbf£ã~ëpãÊÒr/¾‚qš-WÍ^QÁ‡ëïñøþ¾õù;Ÿ§?»–7mê·¦5§s^ ¿¶÷»\0’ðodÕÆÎhS›Üت¢p –:ñ®œ{ã8»®üsûÏFs*1âè™=?k—Ϋ§Ù’„ÕÇMA¨Ì”9ËÑ*ö’i1¹Ç›ä¥É§Œ‡ZŸPB¶*ªÞêvÕ\¹Nô;¬NyÀ¯yœª«æi=ÝèRÖî=íÈÔ¾n0$î>-Â\À[“¢5K¾f-Ü·w_ðwˆŒäíV äZEßé˜9%+еÕo%aÑ“drè}%7ÎÏ {9[а TúdÒI1NwO'×ç½ë­idû/$4Oާò‡s¶‘Ž'í­ë$V ôiÖI³¥èéGQ \ì®|vÎHWÖŽ6ôú6&q¸X|Àñ”~lTþ>žkõ·%ßöz‰ëš³ÒËç–Ø+-×p¸%©R¨4KŠôb&–¸¬¥êʈX¯€y»k ¦"#:~YƒÁWäµÖQR­SÑïõs¦ûÉ%“ËÿÏhöJÙððV{Òû³“q$<ëÈ`^'D*Y'¡.õÍïn­ºëƒó0‡¾ °æ¶6=íï}t®°‡ÒRù]7v§nwûÃÔÕ˜{<ŽM:sÕ]:ÚCº¹p©YCJ<˼ï6³©9Ö™™t YmK9–‡ªù9ÙÞ¿mè´['À½½]#tœ²ÄSXeÝ®eÜ„¸'&÷{UªsfYµþ'“ Škµ|Ù%)Wò¡<=¬MY)ç(ÌñT )ZTWHÐæ(†TíÉÑÁL™š¼òyÝXÛó8†é¼lq73A«¾z5 6†Óœ…´ =­“Y03yšÑEOú\:p¬Æ›ÉG¡sAó9èô³US½žGJj¶8±ÓÄäÐ:ž8í²&µ¦nÑCfÝ[›õ6vnçb––úô¹ë³VøŠÈè¡È¦ú=óÔ$ÞRÝ+ÃCÇ[{ºÈ0óÉlÊóÎ<¼Ÿæ_²õYœ\¹CA¾ëcœÊ³ááêéßf¸5›AÌbl²ƒ‘k³¦¬eŽ»˜øÞÆÈ9²æ÷6/‚€dÅ¢ L¤ôh© 1D‹’ê´My’AÝþïßߘµÎž¥g“jí5}xèá=siérÙ…DucÉÅr]„Tx+DbOæÑs¼ZZ™)¸ˆ@í×úÞÏ—Æi¢áHQf­ó?ÉÈe½_½å’—Ú•†W¢öj¤{'3½ôÆçÉ>¸¦¨ƒé¨ ¹ë«ÞN¥æÏÜ"ÖX#r£ H± Þ 0?ÀvùÃŽ:†)_©džÝ¨2W6€û`­‘Õ,eèƒÒÂ$/Ä­´JêÁ™1ßV'”o˜"·~ú“;utòü9ß‘ç[¤ÓìÎHæÌåÃØÕ ‰ª8{ó”:64J›ßvá4!2fvê¨àÔ¬¤3¡}Bo`ÅÇSeK:€x·ÉPsZ(Eщ.趤àÏSûõ´Ð!Š•C—edÌ.6ޏ%ÎÏÏP¸è¦0\ôhÑläÕ1ÝÛŠ ×) <ÙÙ6_&?Eß\te†?,ö÷Š×ìJ\´„œC)«]¡ì½', tÒXw4&.¬!¬m'„[KÉ6`¾Âu¥9Ñn[:q¢M–~ü¯«Yss‡^ø{9õnGâ?›>¦±_èV¡V~|e-ksÓ7ì¾v8ÈòãŨ‡’щ ˜eLAx™dÛ}gûŽüm.âõ«JgÏxèÑ&)ì±Ó»6(|¢GÐzm”>M”æÐ,YÃ5‰TÊ_À/i‰ËMpß>¬HgrUÛ!=ŽÝúæUµ“cUÔº»¥br=¨wiº’Õ£õ³$+0¤„Clw·PáN­Q6úóZy—¤¢EÑœK½è*<“#¼'lñ(G,è͹¨ˆFÖ¿Å=žx(ù¶M:ß[é!°|<ÆÍ Ê?;*Rha|>ì[]RFHÆPxŒ‡'W‹<ËÌ5&Më±y~©`#Hný©¢j|{AÇ»M†¬‰èm”?^àÀªlÒ…’E>ëQ•Èݺee€¢%0·iy¥ '–³†Edò q\Nò‹È¢B6MÓPi„5`©Í G+ööãrGQÜ?FÈ.?÷C/l¿•ÉÂ9Ne¡ÙÔñ¼øëèËïT^Ì 7!_D;xK¢ ô6}ªÕ±‡g £Ó¯'`סhv¸çTySXg#@TAÙ¥xçÑ9b>Gs½T6¬fò#E¥ì$‹v\¨>Ô¦ó½Î‰–£,YÉb$éýJ„24ŽÆÍRƒíëâüʪú©‰î”›2•eøã( ;x:¨íÏ2Õz$YÓ(¿”,;k\Ûj³ˆm‚æ¬- ß$üÐTÉ‘æ‘Ú B4C ½¸·”÷qž[úà×P~½À6»r DYþ6´“yöç±Ýô÷P Ä“èÖósÄ*=·45–Òw+© ‘,r Û*®÷å ›õ”4õÄé ˆ™:¡üÚi{¥Ý6Uúi¢zdÞ¦ÝújOE}è}^Ýé;mûA“ÚBu=md“‰‰®ÒÂþga†R)`¸\üÆä )cLi`Ç·ë%IŠÛ'Ä5æ3 °ÁŽÙÝ65ñCñ›QÈ‚Z‹NìaEèÉ埤˜Ok†Ýô+“å[>cF— ÿÑ ¡i>—?ò(rŽjÐØÈCñƒ°Q¦©B³†ÃÏý¦DÀ£O©B³Ñq ¨¬ãy“ü(Ä-vK— ßHS_¨ßÁÊoµ¸Àžþûê騖Iß!®h·F©#ê ø4J®?&¨˜DQ޼6½º•—ÔYÒÄ“ÞÙ‰3bƒÛŽçì?ߥ{T„¤JŠŸ§xÇ)S4mÐlv‘䱘ùóm–¯FVP”pCŠ<Ĉ@ÅÕ\:º÷™pÖÔ™f91ök‚Æ›òNÌ‚ûpsÍ·›Ü“áïñ!ñ¨ü­Û3óÖ.T¼ªùÕ'nAÑîdJs¦.w%êŸ*fÔnLÂiµ =ƒŠX9¬%‘Þ–×.L™k4çb :&[ìnì\í@¯œ4Z:‰0®kÓ‡kb¤Ž! 23Lœ¬5 ԙب§ LAËpâ_h˘NØrHµ•x&o(“¸¿R,T«øQv_ÜOíMLºÈ³L¨´Ê*É\ ©®Z9pð•pkb²îëüR™Ó“†¹ÇP¬æUfT*ýKü¨ï¶ï¸Þ ™µÐ‹îºíɘ®Í&&ñ;—ÙÌ:ÑƼ9ÛtUìòe(ºä®>ØókqÏNbfuåš–/ÞVíÜÊÝ@ˆø‹Îfw»Û‰Œ÷xH%!¢>ìú!u­ÝÓBFt€Ü—úÝÁ\g·N†ý9e¸\ß]äÌG4= EçSÕ¥f#™x­H±/I”ÜpÔFÚ5ªkc_œê…TeÚm=s¤ŸYP'Ÿ:šÆ&÷hîÓŒw„I1͸"¤JÌ«fb‰¦‘¢"²?º AfQNí ’SW9ÕpŽmòÌO#˜vI*¦ÞaÊ&w/pà{’ñ›“!Bݱ'Šñ­Uké!쌽¡“Âó\¨‹(ñÁ|Ér¶ç‹…¢²¹›ÄsÀóÅîÁf÷ž$·A93ä~d¶ü87’^kºS¯8”q(1Fä´,0¾˜•JÃñ„b‰þgS&Už¹<ŒÎQ·[)=ÜGÙn?AuL´†fxèè̘.æï[VŠ>$ÇžtMä{c «ÕÏ9½ÖT •7^Z~'Šø]Ë¥®f«&•ñ‰-Y$g[V²ÞAmˆÌšG)eY¹Œ—SrshìÏ3k„Þ½¤¨òçmÝÓŸ-Ü×ÍqÓóª¹ÎœqVh¼É8\ÁVk0ȸ§­Fç‰æâ…̘h®S9œFµù¼/9® š½Ôññ𹎊xúx·(^Mb}Qt—1B¹ËŒ½¬Ç›xŽž yW¸»zm¥‘;—|óWi•Þ›,¸ÞP}š•ÌW0hì\⸫6*LYŒ|Y²F‘‘nñp2%mMbOG› r‹›XgF‰ä9!à‰_Ù}Ð(œ¥Î ±Õ섺¾fs"Lë¿ ¼Ó JÌ—ÂíMAÛQ6êœXÝÝÁŠ*&v™`:³cv Þ,«(Z±º©îÔÒèÇÞNGX±/V„ÒÍVÍ'¼rnÞÔ»ç.9˜c0¬ã»Ô¨Ë¯Ý’ÍbhÁ£Ü>nħúE]æhd‘™Æo8SÈ6¹2Oü‰ns i¥_ÊÄ91%k1UYH&¦–Ê———Êsæ@Rëæ9\‹ÿ‡"¹¡âÄì¥/If˜×íìH×<2îâK½ò\Bªº9šisbF]2µ2t°³¿ñ]°i’Ud/Ûq§Ê¶j„vT23›Zå2‘ýGñk½æ÷#©\î¯]àc×U—‘+†½å#Ä…í¢êj“-eÍn‰7¨ªs˜²Õ¼¯úÚ0b+$˜”uh…hW<°—¼ïþÍ?,Zì†õ¢#¿º6¼Îx®ù eæ+å¥2÷RzØÓ’¢ð™3¢]àY93¯Æ‹îy<^;çå—:ðñ´ÆùÞ ‡ 2¹z?Ì;ò…-Þ=üÉ|š|šÈ2æz§ð«ì±$a¢ûo'òøŒÎž³¼Ü’`»ß6ùµÙU¼¶NµãNËli>柒W ôD©‰‘І×"véЗ·"gpo_[*wqsF¨±<\Šå¸¬B*ÎÚsÃK Q•ËcãÅYãÃòMIÁpÆkâ:fqC”B©WÊyXûʈ9ÙÊå9—Þu|8 «(s˜ù‹–É£¯À¶1-i «ôy¾w9âÇç6§\i‡Ñ·kbÑÇ ¿‹"OѸ‘ÎÉï­á“Óà|ÊÊÂ5ÃáÜHDRœ7¡Õ[?r ÂÌÈ/ ½ÁEQæTÅ¢ñ±D‚N>.syö%ö×í¿¦ûðÿöˆ€Ÿô:ཱkëoOío>¿¡ô‡í->µµ«'WÈöïÇÇ¿ÃXf(=*ZÔç7=$ŸØf·`1ùá¾%·ÔXwÓ9Å»Ä8íÇ3^âÚ{.ì°ò[“#-C²ÇʽâáÛmÞßMÉ}6 9v‡L wz¤çlÃèˆ-ÛǹwGœî.‘­õì,p—ÝèSPy¸¯Ãl’ Ù–ÛÐhMJ93TÞÊÒLé1‹ÄSÕ‡F‚¸9c¬@÷V}VGwY¼xúú®Öù|×bÄ —ÁliÓp¡“o7aF ëÛë'q™ e®"vîe!¸ñX d±ÑT"§#!üŒ½'š,u_1¦fñ‘ÙU¶]¶^³l@»´ÊÞb˼æáÑ×™Ò+ Q5 T)Û*9Õ<:óƒµz¾’Ô‰Nº³ ÝòìÞ¦F‚ó郊l¥|Š£‚H@$âŒ)+Ìí‹ÀúûÈÆ;Ó±¹0ÁÄЉ»ì6ÇèÛD 6aûb  ëÅVî÷I›H<(I¹”¶Ãf’/4T³Uxª”C¬cDÕÅ–õg2^æu$>@(@`äVI`Í¡B¡9;TEFHl´‡ko"[c¦Z2Þ$m¨iŠ%ó-Øf46Um¬YͱÍ<ÞwfŽ9]s¡`¾Pv ‰ w *rId‚ÈY½¸·…)“b)¬¹(ÝØ^2‰;ކœ6 ­’ð ØVŰé¤@k’B ! 6 4Óãxpð„{ß;x¼u®d¬£ÆQ*W»†jÀ ™¾õpiµbq¤6ಪøòáÙ´ª§ì¡hâPàíŒ<ÍÞœÔ&†mؼBÁ$aãä*ÐÒDµouì ]¾nÈÆ3‰ñ„µ– ÞÈÒÜ[×În[|Û»râ!%]Å6nÝšR –š Q¨@\Æ0Ä‘–âdi J¡F¬6À®¥ 8¡ã™Ûb‡2õad‹Æ4ñ.é“‘I×ËH‰½î&éð$bÐɪ9„6jùÂÄpŠ H6κÓ!Ä)…¤àÏqLq‚º'PvãèÀ‡xdøXt`üŽ„G ÿ8w?§f¿¿s´ÒËE¬ŠŒÖ’"µ^&‡îy“ïï ç°”g€“P8Â@·p ‹Ð65ŒRI|æÿõl‚‘<"677(pZøÔ(#R/¿þJYàÁUd;gÕ+B²(a‡ÚÄ‘Ü97å©UF†¡Û1£Œ%3Gï3ÉAÌÍ“pB‡é¬fƒØñ§*áõÑ…ÈIõõ`õš$ £rƒ³L*úÜö9—„û¾°¬¹pÓi7¼Øj1¥3t@Óøiœäª(Ô§ Â×î ppun¥U‹ŸáÖç&Í™! \`ð5à.jQ¸ª4ŸE4?¥?ãüCïÔœBð¬dä£ÂŒŽ×„Åû83œÍü,•ânöÝÙÖ_}Ÿߣy¡oÄÀôhgûw³Õ̹eÁ×£C >†zÈIA‰=?ƒ€@°FäLH™zšpGÏö= V'Pþ˜{'Øù2NÎì£Rè7‡ÂÚOÑRœúȳŸCÜΊ0Z”þÍ :ö…@ò({ÞäLß»EÐKÇó «´Tæw" ýPý„þòH!E;Ø´FFB·ãýˆÿÖΨ1Pª² Z×½šøßäE„JIù1dJ¸™–V4²Æ,0HBÌ?àȱe¬ÙJ|°· )Š–ƒE/HREË€°0b¥Ë Sõ>‘#ûÿCùêûú¢N£@h~…?Êïö3Vû óþ€>xÐ/ð{@ëä*X:Áx}ÿ:êþ®Ø»襇þA>»uŸð'˜ƒÕsiÛÞÝFÅûŽJ$üL!ö‡î1tOã÷NÆlÙø…Äú.§o£2SL¨B‘¶dI Ê®„;Ó’‰ Ýh¥ì8}#p>lÖ\<¥ärÀ\/ª¹Ûéðí¡íØlªPtAô%%ÄêóMùHÝìhØd§{æþó½ê©Â`€ÀúôôæmU*S ” u0 ˜‘ RÁ'Ô)€¨Áeþ§¨¤'g~ ;Bíßä¼ÃÄSgà{ò¥´WÀꩱHù¿Ãúôýæ/ò~Ëû|ÿ>Ï—ó¬þÿni¼$IÞ¿8ó¶Lí©á±Ø[ÞØ:¨ûÖ‰ ã›WûCüÜ`H#IÃVNį͇÷ýäþ Gê×óßùƒýá_Ñ46Nh†ÆHQÞM¯¬–6!1X›]Ös~KÎNðð`þÓ£åßZý*=¯‡žÛ¿æ£òâø’´f¾­R·^zÃprwË K‘ÎuÿOõÒÙw@Œ>`¶o̓¿ºd9o„ìÏãg¬çK"Ì-žA’ò[ ¸qs¦?¶uó4<»cYˆà »öÅöÚCsyçùþø&Ήßc§X N´tmfù`:…· †ë]žv8vL8 Ò¿K<¥·ªØuÕ(ºVÈê]ÎÅK1Úï8)P˜áÂl„Ÿá“;”§aÈd@¬8Š·¿­¶-‘­;š/&€S®ºÝ^U–ì1^p6×VÏ ž[¢qb4i{œ\À÷ÉÖ¼¡’‚¶åqÁµ•Üå[W;ÑVÚ^ï|Áy÷Åç2î´Ý «º<¯e0…bç— )³€‰·üß­Ë œWµ±m»}œ¥ŽöÜÿ¯½vŠrôœÊïÅžWJ¢;`²p¾Fí†í‰ÿK›Ïë ù¹+û]c:ZÍ÷!üŽÓ¢Äùý—þ§=sïÁ?lòkHß·£³5s×ûFÜŒ‡ÕžZ¶¾5C[;:«¥ ~í©êga»ù/©mC?·øãÀÇ…qæ ßúÔ_£Ø„ŠøV¶*j-;à}3z¥úlmÀ{Ë7¿"uɹӯßÚŽyç§þ7?^8Ôà+=ËõZóú Ü* ùMì.|ÖVhE0N½.·. ÁÄŸT†±Ö0 z¥N%$!‘•ˆŸÅ ?çw„¤¼@Ox )Êäø|„a ªãj¶2 Ò·€¯ ïhïD óx»ù=&88?~¡°7þDåŸö.5ÉrÇðºúÅü˜Ûdÿ_oW¨ Væ±õy¹ßìz]®~=ÜO!þPöu×$üÚÒ²÷õ̸Qc™ÿ·†³ÝÀ¯íßG™¢Õþ5lT:çgg†øï~~’(&?šO½}8¾ž—ùgæžG[Yëöþgiú<’—ïÔ2üµ~¡þ>²HübÌûæM?šFòZ~uñïÉ¡GBH·ÕüüŸér?päпÑU}Zý©õÏ©Ÿéù>±ÎL{hcÉ6æúZ¦áÈQô¾vÂöìë]9`óù~™8ÒŒ‘j,a%¥2µ*Þ%L¥-£iIV ej(ŒQ¶UH …/ýƒ)‰ZÔVb£TCü°˜`(±WR´J©þ·QEIŠ•m¨Ú§Ü´bAb¢™þ‰q1_lȃÐÊGhVhàà‘"¢Å ÖVq ʰ(•¬¢Õ¥%TUhJˆÌ`bŒ¶ÍJ¹J¢ hT£P­Cô I!9L€DQTBrˆBµ-¤¨ •*´X¢ŠÚQPm’ÕIh²HR¤÷£ÐQU=H¨f±å%RˆZ‹V²ªªE@R(±V ²¶Ú[¤ƒŠ¢d´©´²Ôÿ–Lf-²‰”°Ù)V1A™DeF,UŠŠÅ‘Š%¶4VÖHÚƒ…}GL¡VcHºËSJJˆ ŠÛjÚ[E[j­¥¶H#h²«Uµj‰XR3¤ænJ+ÙPL€Ëµ‰H5¢• F0‘KEE÷&'[C DQQÐX6ªÚã‚‹2ÒµF[bKj« üL¢&!R!Km²Ê£T¬¬U‚?¹IC‡¯î )0 ðRáJƒbÔ, %²¨%oj*•*¦Q¸ˆ’¹,F,ö\ª‚Õe¥(‹ª) úJÃ4¥Â•EÄdQYUJW”EQ´±‚‹Ìň‚,Æ‘‚‘lkPÊ\X/åSm…J«R(ˆ 1ƒÂ×ýЦÖÔ­¶ªRØ"5ª«"–ËAX*¨ÄAc"¶Ä8†°›äæ/Ÿóÿ®MÈ•ŠuÞC€ßÖŠåþ€ÖK-¡}?õ\îZ*ÅEØdUDŠñ¨"ª±•¦eȤ’¨Œ­`Û´¶'öü½Íç%ATFØUEpIX«‚IP-kK¨PVT+Õ³ 6±%‰L#*uX£±>G[òps˾öµ¼7á\Nɺ×ú|“üˆˆ ýÅû§ËýÓûÉVƒQÉjûø. txÀ €À8io*M%ÒÂ8 C·ÄU¸ù w…dyØMDFʚܧ½Í„Ä«Á7›oµœaPn ð,‚ET-i$1*oVC9É(ɽáç^sCÕ¹:ˆµ…¤Wj”mŠ+{ík¨o”wst\î„<|îñfæ:ªÎÊ@[BR°`Q€>†ë=3CÄ…xKfC£CÃcrî‡&ƒ!k€p:M&M/­â„¸ÒR†Â˜BâX³— ­†ân;;%Í®%¯¶àïg7Á¡„IjÌ´S9ß“eéCBÜ”†‹7U™²\à쥆Íô;14&¶èä£JVT²—` P»A€n&‹äº“@e Šl(mH˜ b°J‚l[¥oxµþ–Ä_ÕWÑÇùÿƒy»²ÜrîŽîç,ä2YÜÝäo$Ç:~éȸK];ÞÛ=L¼ížs–jÓ¤Tšm5Íi’!/¦CöŸ²rðubæó¼µõÕ§†]·KrSÒÙ'l±kÙ¨Òq:œ¼öÑó«Mw-kµˆ-ŽMÚóioyÝ¥V»˜Ü¯(Ñe_‘|‡Jê_{ÕÝïYž¶Q5Î^¹ÎYë¹²>&å4¾w­1¯çí¿hkÕc(E¼ 4a¸îÕ4;51¯q B\i)CaL ÀÊq,Y˶Sq¸ƒ¤Ù¹´‰‡;©çFøpÓÐH¢0P&œ°œ}sÇ #‰KNîÀjÝP…RÈY,Ra‰€hLƒBdJdÊÙZ.ÝJ½ÀÊܱ°l‰²!£a ® LÀÌX è†bsL=m8ƒ¦ªÛÜyÛÍ®ß;óVlQã\º%è»]&c=íÍwm@±ÉÔ3™q)³–¶›/¶!¼w,»œé!¸Ù,]6srÈhœPlàÉb‹±“ )”Æ]’ýC¬'©JC IÑB(°DŒêÌ3v†æ  ;›:°DÈXiVŒÑck;7t4šGÑdˆdÁ²Ód8ÀSÃÎèœI,A‚¾$ôNA8r.áFÈPn9iÑ ˆìê7LÞÆÄÓpÄ1fÑ—c|l¸laÙM€Èè0‚ìå#¹c[4Ü¢‚JKÍÛ¤pU.¶Þ†F÷Û–bPlhѳ 4eÞ¤°œè‚'¡Ôã=·Õ`|“k¤×AÒˆÀm]Šwe÷ewªTœB¶ñNÜHTI’&_vni'Ì…F´1ܪW@Ú€Š{„æ—k:ø 3rgRÁ!‡9Û½rG¼înf™{'^s‰Z¾»î±gÓÞv<‰÷sº;/Ž®ÒØáÃH™K'bŠ}hîfï;µ4à³0h‡×ÎZpÍIG@Uàƒa8£mÞg*sou{Y¥E‹ºs³£(ÒŠ‰¨&ªƒØ§zðîBKe±ÎØÙšœ¾Xìq–‘EĽ>îZÌXçIË;v¯tTT@©'6r>áþµÛ:óª†  ‚ Š)©RÕ[ãJÈ+» @LÄrmÞÙÎ7+ACX¨%D¹ËE󜠥¡lÒ ß1õÌQî*‰QE+y{(xqDÖu¼x!´RÐQ;«÷t-DîµQ‘ê".` Z(4)uÙ_ ÀÓN»ò¹×wÆü÷g©‰‰¼ÌR¡°ýŒ U ¡¼˜ÁÂ4‹6Ä&“„í+"…ÐwÜFË({½•FnÛß–†qUoðŠ˜Ü&X ƒÃ9ľ›˜ûœl £À wh 8€¥KšÞržvk©¼A™€¬€(áh C9¾úÖôñÔ‘ ÀÜÓ¾1‚¢í E´p†e¶™0¥D÷:;í‹fqWÆÕ®Qˆ¬Üß?*ã9Û` ÁÉ“mh ["I¨…áørrºÝ±Ô¦oÂE†å\i ‹Qaïâ ‡áCY½ídy•ˆ‡8½”œÖ»Õâë{P%=Õ%4™±T‡I°0*çÁŠŽï yßY£˜k… K0Ò%ÝçÁA?‘b5عmŒé©–é"H±YÎ÷«âÅä°È7BẮèÝ.d<{ë>·}žˆÒ&÷& î•T‡<ƒèêõ×F¡}þ€gŽ ¬‹¤PŸ!ƒ~+m暊éÒ#§Üeé*"È¡C „‚P$¨ƒJU)˜”»e!™ò9¶ú¡ ^÷Ó%튼†SÞ 3Ó:C½€=o{À÷(Có¦cP AJÅ-YYQu׺£:íBE¿ºIŒ!è²€ys ’’Á@ùA˜j!˜þRÓsŒÊ…}U¬U!í²Y‘dO<óíKסv€Qz¨4¥j#™I˜¦½ú¬_ÞtA™d È? dxÈß|!¬P;B¡ê ïæ–¢^z‰x¼×oVÄVIxGªMÛ' Ð)TÇ­ŽI·Ï3ˆûŒwÐàõNª ËEµã÷,OBîó’Åê @C¸ †Í+6[×€˜k0]t@•&×3¿¹mÄÜÚ&`ï²Ke΄­ ÈR*ABM¸ „N?š'âö@d@™ Éï=d’=RKkèhBÂV€ÛºH¡"õASÝwµÈÙ~ê·›ñ™YîÞ•‚À`js±éÌËÀbA‚@©”×}H=v "ÅHÀg;>Ïêúï×~ï1“«ÝÍÙèPв +{7¿Üî:DÝ­¦wÇÜ^ <η ¼à•5‚Ÿ-JzÛ{âH¡ ›À* u\Z«V¶Í>om=×w𣙿¨qî…ðÛôþ~h÷¾ã}c–º&5ˆ>]¸Ë›8‹ 4†RîÞ"hœ®•BÀ‚žGõWÔ©¨Iܰ(ÒP ÷ <Ö×k^º£·K»@#„‘ì³An†ýªÍ¸0~X"‚’)šTYð“Àõí»Üá¬ô÷"qß^³9ßÁºÃ¹éš¯LãXB¬cZ׃v`¦ÍV}ÕY¨*/·\ïF^Q‡0v‹§;VÛ`Õ !mRI¬ ›@ê޾wŹçG™ÂBH² œÑI-Γ|é‚¢q¨ "üµ h¡ÄEdóÕ3Ý)xë <ƒh¼¦Ñ÷¨ÁÈ=p,SËg5Æüã‹Õ]‘‚mj´ÞØ*HûqŒ+KÕŠS\¶í0ÎKåÈ6Œ4Öö罋ßtŽÖ¾ûVøù®s¯µ2(½Ò\’ Ð @+"’(%„­¦3 sÍç&ÍqF`/Í^H2”Z]â[ë{kmôšj²H¤ˆj©½j„¨H$Š™¤0hîá\ÂpÉÄ6D‘Rj÷,¡#¨8Óë{[é­ø­\n†%‚ Æ9ƒhÝ×;UXÍkzìò° 'T*@FY03œíbÜrɵ!ŒÌï¬a¨…C8ÓŠ¶¸G0x*Ö÷`Y¼1;—´oùÖÕ|R5õMNb5å©Ò-âú‰ ñnæ"²? i´NÁHêåàç: `è3ÊïÞã‰AçXlfgx Aqp]fMÂ&MÀ.,Afý_…ì"ëuw€ûÀN !€Aìï##߫ߙî‘`òÉrÀ ÃR=‡‹i\½µ=34/¯œ~÷†ûH!‰ c"’Gx9â;Dð–Ñ’lZµ‰¼w@„$FÛ¯Nw§ H“Ééæº]óHòŸ7­u™J@Ä[âc´s ½pN ú¯q>â—‚b&½^ÈÈ'¸Ô})ùzP¨aa©³Ð;sœçÍ9æÆ8ÆxMÓ0A/ÁW ™•0_±æÔɨíxµ±¦¤ ãJõ[pkõ®&‰H€pëϳÔGI«¸yCDAÒÌ0 ø›…û[±¾ßâTD$eé ,€Ȥ*/ fß7·& MƒCQR!ÒXœd>7å§Ç~wßæúq°€ êP2$Ð0îß(ÿ‡W·:òq¹äN'$"³0 SÜfMó¾t÷6‰D€Náõ ÖÚmœh$‚kT „ЍB(0üÐÄçIŸmì†!ŽxXxȲ'>³õÀ¬I+$PXbOŒ  $PŠù}!1†@üI|ûø¤ÉTsÜrØû±Ý¤r„ýwq‚.;g³!F¡wóÄñªí°ˆ$M[ F~ ·Ûߊt†ˆ{Ë„†P<áä8ÂùãyÔëðßI@€ @=P>]~ÞzÜgœhˆ Ç0npijiÆ¡€hФâhßSc-´ÉQ<˜ið¯5o¦¶Ëh¶œ¤Ä'—\$PèúûoÏ$+XJÉ;•‘$ìÚ…´`ž¥ ºÃyh‡‘eRšmå‚ñ<ƒÔKIáUÈ©b^Ó7Ç›ïÎÝׇ; “Ñ¡ÍbïPÌ»­®Ö¬ÁàöHa¥m̳ Ik./o(Hz×4Èi»²%@J*Ve·5ßZ…„O»j™¼ 9f‰Í]-ÛÆi-e€#ù.â$RÚÁIe¡Æ!Z¡'Qò&Mw¢Ã˜©¼jÆkˆytŽ0¹@1ÒB’ÓVrÒ/¹›ël›qÈì×& T¿/qLÀê.Р'h†° ;ÆmÆæ!á5ªÒsX›D{€>EZ€™ƒ'O ‡'UäÛºFñ10SÌœ"SO5±MǸ.Â&1Ž–5F1‹&É©ŒR6Šk9ƒÔïJ‚ë­bŠŠùù B¡Ì´xù1á˜W]\î Ô8‰/Ï[»ç{g{w¶õÍ•©äzˆ½Es4†ñÈ¡¬Dç®åƒÈ¯xyƒy˜(qòu`°¡´P·T¼Áf(˜2q<ˆäÇ[ãLí§šß]+›w9½ 'qˆ´7˜Þ”ò!xP à†Ð^o9°Ðq<Ü‘^â¦b†b1òy9´žY<ˆäC\Î{ßËíÏ¿šï§«%Gˆ Ú‡h&±S0!¼ Û~ì/Q<Í%@Nà½AsH‰´N¢‰hñ9ƒÜSXEú£x%D4ç)Öºèʳ÷EÙç\õ¼` –:Xˆ¢¨‰ÌTÖ!´«ÒóÐw …b“ˆ†‘9ÍZåi§}—O&ÑvÅÜT;ã­n‰ÄG M8騂%Å@Ö×Çz[KãL­ÒÞtu“=ÈßG5¾+äÓayž ñøOevyåqÚ¹qTÚ’ÚÀ-ÕEë«5”½”4@%kzZ¬FãH Ë½„í.ÏS+eVœ¤t—.¹ „ÌÆù¶½qºY½ô…*žŸ‡ÆžrÔs¨Hp­ž´nžÚV¶ªmùۈœÁ%÷1Î÷¹f£M°¤CŽï¾Lw£}ݯIo) ŸõM01Î,.°x pN´ÐlÝE ܽ=Äӹ¹(ذìX7‰uˆº£#¼T†ûéy7š“]žZËP1TÌG33Vîé0ˆvk¬ºkeŽÑM  {K±kƒ(àè †ŠChæ/­ŽÖ…$[h½ªšÅ6 ¤½@Ô…a6n 4i§aôhg,ƒ¦5 B[7wDÂ6󂥎UhÛ¹ÌOR°@‘T.†ihAˆÍ½°ç°\8BÐp¶E‚.šFë$h‘n4d´8ÑÐ;&÷›¸éÀùÑÍ•–èw¨Ñ׸]ÍÑne´yŠÑP ÚyŒ°1œa­bRn¸qnÃÁ|¹/+m.B/÷VFåÔNa¸…9½»xŒW¶q^Ü&`q¾‰’çbËæ°ÞèèÅ ÌÊ#¢p¼:6ñZÙ­|Z÷êÊ­ì¡·1¹¡ÈA¾‹yaÁ‡e‘ÕÓËÜío丈è\e\V pâÎ^xpŸw ¡[™/rv²ƒ¤æA¬pèšºŠ¥8à‹©Dä)ÈÌœ‚Uܾ]VU-ÉÜ—È@ųPâðµÙÇÓŽ;ìÀG€þ­¸³á®MtŠ'ÅH’z†žk #Gĉ ÙÙ1[¤ 6 1LÛ¸ËE„pÀd=p“K–»P²7« =%ê—/[}eXobNÚ‹ Ç”5N!AqtjéN2ª7’ ÄÍšg‰P.¤ŒÅd’ZK"&fàQÃ.´  rÔš A£pYÈGŠá(‹¦Ã…º•‰8’V > Êá^éZÓÇyÕ¦Æñ6114ÛíÚÏ!«C‹(î04ídÕö[4™ — É2jÂÖÂd`v@4D׿õõÇX÷ž³‹ÂÙ0d±›#\…9)Èæ†3´­VŒçYÖŽ›4i³²|hÃ=ë²vl@8‹)iu•‚²ÌX¯“A’äÉÛÎæÅÓ×gfCzü~ý–ëN*¥`c °*EœLf¥a'Õí½Ü›¼×§³±8Ó×ãC‹v<:äà\œ¡bÅ_5¥¯Vû½±âR‚ŒÀ¨n-Ög˜#Ò—LO¤"Ò$²mɪ`°cµ[æîgìª$¹¼ðô1Ýv#·“ÛŠ„! öæZÄ®ÚXåSÛßs±ñ‡„ÛTÚ"šÑÆUV,Rq€Thß23o½˜œd™ ãˆ -^~n/0E‰ã´hdHÐ≧ §Cr?[?Yš:š'€Ð…wp01xW?H–x,==…´ÈÃ~›ß1Ù¯uÛ¶\9ƒbÇ@[1ßäC4êüæú¸¾"‡çÒÙþ80ó¶߬ V Nh²OÈá².Çl kjÐfbhAQãy0°t4@@@±º¦šå­’j?ÑÕÌZ…H¸…-wÍø{ñÜσz½‡FUs!{V¦\ޤÆ`’)wp °ìñš³¨oùXåHëŸäª±]4¹Î1GF8º%U0ÿQ”lâÀ?ÂUpÌ‚‚êõ¾0Bx`€` Þcço–Q´Í´¤Al àF 2E<òXö 7y‹Ó’_AšbY¾øì_ãÆ ¨b6Ža™PMó}ìSGh1zZ`kÆÅu•°ŸÆ1Œ`Þ%ób·lŸª¡œ\yzcd‡{ÑZ—Fl(¢W¿þ¨É3 z˜Ã||£ ,HùZ["a MÊ3R„Ê<{Ÿsýþ¬Ãº7~þÍwë˜Ï¿KÙ׫´>þîô^´¤äCÑseÝK#À ã}Uy]›q¿y.WÌóæ(ØÝvRÀô åÁ>ÞêÊÞä3Ÿ4'fw šQs:Ç$Ÿµ²Œ•€ ÷ñìóogƻƋM¶ÔLh!$V!&ÙlœµÆ’ÛLðîP8@ EˆÖnJɫԛÐC,ÿy}H¬>´ &‘"€£w­‡ú¥ÿ;Á3ßv¹BYr]ŸœaËPwbëí@ ðÇÎþçÝûØRÀñ>˜( ­¥]²çTÍÖ½¿8\;ñ`0Ä05îíð[TH!öNMˆËw¦@fÐGÂÎ|úÖÜì‚(¢);³ êÆQM- Ð*3©à©æ”¯ý~°iÞÖ=Þ²¶ejÿ¿Æ¿'eB†‰ÁGêðóÂÊŽ)ätVÌb‹I¿¾&qS8:­°|KJ}Y‰/ׇr°r‘âŒE\F5 Ä·Y pñ‚oÕz”“g©=,¾m4§³çÙ­àc½Î),Ô÷mý0º¾VJßsž^3¤öó»Ýü°‚ÁESÔz:Y6 oŠ5 7¹-`Ï&^]Üé89¿Þq÷Œ«%…Ž*|‰ÇæDµ}•nàX@5õ¼cZ×´¾ÕаD”{ñØ”‡ˆÇoÔá¼\cò¡à!ìJ-¦61h˰@XlÁ•ÏÕ¬?¼5tt<3€ïº5œm°»Ê€ýð„/¦?Em‡²ùp©·%Gëìù&Þpƒ%úCýn±•#d™þ•Êýοĺ5ÙVw˜Oœ<êý!‰÷îæáëÎßÁü0P•åáJd:, dy¾&HÂ̰+¥OßõÑ8’&™È:ð JîÎûí°é$b^¶µ×‚Ö:¶­mTkÃËi¶Û›èo$’iºUH‘2ŽE/õùëç\÷¾Á˜'REÞBЄú뽩/(<ͺÍX¨q›A@Ç8¼ïÕ½CÔçê¡÷KõuÏþ±»ëçÏçB³™‚þÀCAV˜>ϯÑëGúsåÛ0ŸÃúXú¦÷Okh3ðÊOJ¤K*vXÏ©hÕf¹ºÌ툒}®–¸büd^œùØJs‹9¤/§§ÈDdþòô‡¹tº'él7VÍs½¢ë]Z^£ŒÃùj©èÔ¶‡D7'd4Qî'pOwHž-K§3Õ]Ÿ¦årçJ)}¾Mî`ý·ѹQ Z7šµCÝ>Aø¬¸OÒò$2Õí6P]&‡˜6¯T¶w3Sý1’ÏÄ¢Êõ• õg¬õ=ðÖÏÄ ²^“o‡¢Ç'H“,ž 0ç½î28[[XQĸcŠ TÌ¥BåžÞ³pk„2؃=Zè@’_‘¹Ò ß.¬ËÙh¢sy.[ƒ¶¹`šÖÝ‘€á­'Ñê5õÀ½@n¸ÄÊde£Çpe#)T ,³…´(Îõ´¦-ìc„ùrYÏ×;æ«8xÓ6œË“q±±]ÔØâËÍÅ’ðDî2ÍandÔ£ÖÛ²PJ²ææ‰kfÝ)…$“¨—4:®ۖ¬¢Lf(é¬6¦-Ó•*Íú½ä.6‘ˆiv®®„ZXe,]ÐäªÒæ¶C‚á¶S¬é‹,…„7‰—,0Ü„D’FE¸a1ŒÆò¬E䀴MÚA¬-k‘`Eà6a@]=y¥BZ“-]d³®ÍiCUPÕ20ÕCZ­€«%Ü;¦+o6m¬9k…×3ŒïŽq0QtÃ/[‘––¢ÉPŒ¢ÃÇZMíæÔF(ܹ–3/V¬Ç„”DÀuSÈå¡ ´“¼° ŒHѨJÆukÍRhÎÌDТæüRÀÌÖfû2l†3Š»›‹KaHœ`­SaØp8K! Å}Û3ߪæ{×Û±b†¤%ÔÉoÓ.>¼a†þƒA…ƒb9Žh\Øå÷œ'W ¶N²ÃbOf »0¸•ŠT©‚•ožd(¤™’a%h{&ùá}Ÿž,3½0µ7ð7k{C’˜Q’Ð@r÷L¢ª'Xéß1µg”ˆ¹ÖŽMPT•pà ‘ècœx¼‚…Vìu‹î¥‹Â’…}$§Ø–X>Ûêóg¿¡æ)¼·‰9·eÑçƒ/¯r÷¨(¼½ä|ÖÖN°Ù,¹±fËkVÅU2W9ÏGY³VÛ”Dzç\gåõÖ½sæ-°§ºbdZ/N3T1\)¼-Æ ÓÝ;–@qømBƒQ¬Ì¥Q×}F„:ÕF$BA7C¹õÏ9,¯ÜÞÞo£áÔøøýy¹Kh¾f'M(T¯( (.µiõàŽï]BW£×CÈ\½‹ZÍŸ*9Œ[l½1EùQ ,J Á|óã»õcè|îfÈóà€Ót™`1à º Ú²ä·óCn‚+·&2C GÛ¸ê¸q¿&N¾}[ªŸ‰èê†/ié:äÓ9›Zzãcsç?;òæ¹8ÁÃ6 ¡inÛ·“\"辉]°!¶3CŒíhÆG!›óL€T• \/¿'=D{,6ÌK.`ˇ  <´¶‹FãÓï* ÷×çwÜ䄳}À¾tÞmfŠCxÖ$ NêƒC —v=‰#ÎèüHQqAÜC‡ ‹Û'GHaØœ´ +õX7·±¶ŒÏ¨z\n¥J€áËóá˜Ó\htœ m‰QKbd&d¶1)ÃBƒÛ¸p•?%È=´ºÿˆð:zí_!0²‹±™ÜBHj„Ùèpa–HÒ ]'J Ž ,Œ¦àŠ+Œ_øJÈ·5\—x3œ`0€;2Hë[F:ié LJi ›ÉÝm¬'¤6ÒmG(M8²6~u\é‹ñöéŸÏ'‰H}—À/j€¿Ÿˆ[\’s…­ÏÖ§´ÆP õìè´Ä{‘bZÇ»îÊ0Ä<ÌT‹w{-±öͤ0'8 Qºt m,.C‹ã`kyä°ýyzíè8H’7GâÊs쟠IëÎ,ɈvÖG"ï·–¶f[M°`å8*ïb9ÚŽ !¦úi±P’X®ðiX@6†,Y+΋½Tº†]¯‡ï>GåÆ̨x‰“á–_p÷㱦O åO>Øž´;G4 ¤'ŠHÀÁC±o¢Ýu é϶w–-AšyÔ'Ó½ ÷ã³·ZÅ»C§ès-“Y—] å!áÖ&+›Ç'žšÝ„þ 4—e ȦºÁZkÂÝÀ“|1ºQÃZm ¯?|Þ÷0ÿ5?9ê?~'í3c>DHû½ú¿~;ÙµFÛS;Ô8@cDØÐÑ€òš…>ÐBCôL¨˜A§±tõ˜ƒö^ÿ5 j¾ðöðåä¾Iß„8»ûX¾]BÛãi>ò#UYÞýwBZiÄ÷¦74’DC§½ÕÊàÓ¶4:xý%¡ì†ÑlNØÀÂXA1²¼$‚ …ÂãÂt‡ªý¥ŒšÇ®Šy/ÉÂÊæÉb6Œ"HÜ"Wºyiæušk¾.|#°ÖÂßäçB•ô ±(±’¹MÆcÃŒßð#H† -á°ù¡…  ê ²æ!þ4§•G¤ÙZ?óõ.ó laœ/«Š~‘ °§a#íóm¿/GI͸ç7š?ÚVk lRž“äöl|Ï—ä –uw6B[ìÞqGGÖOU´w¿)– LÇš= ?e®.)˜ä§Ɋ׌†%—!a ŽƒMÆÀ¶*BÑ3;õ­aBºÇ)™§[_‰ Í= €ž®X8…J!r~=SéÜå=>âŸSßÁÛðDÊzCé3”¶ž 5SßfögÁ‡×]&½Õºv8†¤ªd]×>M!ÔìÞ¯¸Ýèè·«Xfˆÿ,~ï×÷û^}ÿJpý¬­ùSáþ~Ÿ ˜¬^ôYÓ-¯ÎÊñýž×³¨>b–²Ø•áç•>¤üÆÐ E6ɹ¥˜þ#j ­ÃX.c™ ©Wn{¢™ ®ÿ^˜.&ņþšÎ ‡hÍÏ̾¨IÑLÔ@¬3ËNeïCAŒÇn÷Nýð]¯º+W;^mlkål.üÇi 0@‰®¬(bûçœ<<;|:wk²uNîuÎØÅýÎßuO@]‚H‚IÎxúÛñ+Ëéøï‹Ï/¿Îp{Póyü²¦K…÷¹Ù(ËѧH~ÇçľcU,¤g_”}£ŽñH™2y¿¬WÖÍþ·ÆÑ “¹ŸÕèÕ;õ• ðÇ¡ ’9ü-—úqêÜùm|ó”}–ˆç3§u(“‚ö©OjO¥E¸êpº]ˆî›I~["ñšøÖè"øÌ‡ºã¹ãúKº¨VGµ?9è§F$›P­#IÇáø¼[£¬W“žWO£™‹g>¬›©¨gÃ…´M‹¶̓!³@LA­86"š2›: œ`[9Èc :6M›†‹å›u­Æ1 be1Œ`0ÃÔHÜ![“æHq½Úí烘®¦åíÞÛ¤uÊŠ3ë‹æ§·ÕÕ…«kNÍYey³# r|4½®Í泪)ÞDo±® §×FÆIJ_½|Æ¥fRq2 Út‰ômĉ‚âLM™ñÓ0\UêyÛ«"ätÍ)Pìj—¼µœõ»GÆÓGJMˆU6ͪËmyg¾g|]ï|f¹ûž•pÒße\Uá¼!æûÔyŽmiÖé4¶›k·=ÛŸ:ÒWzcNÿ()FS.i£Œ g9qŠtv&Cf‹ÌìYÖ´äБ֨TJ¦ŽãÎ>M箆ÃvåòåAÍàÔ ËÍÖ2r’;›Ð0]%´¸`€š¤P…"cZ-PÑC1ÂQ#-/p!ak„ ‰‘¾õ–hq!‚ÑpC½æ\„:Ùa w¤‡RÚÁ¤e("ï sX%j†T 8Ð$²([ˆq”àã*(HVi#5¤Ùwq0° jï)ê*¦7#3‘ ÌÇʸžl×9Iç!\˜ÃoKv&î¨ëãÔD :ÜÛ­¢^‰’kê#r—„ïxÆò^ˆŠÕÑ&E¼]ìZÇvÌÓ|³Øøx®ÄÝw¥w®mY‹Ð¶èU•ˆ½R ÞÆDãØÔ·#!à¤èe†<[?;—áü²ï½“«|{ní»²©“ªÜñÓÂÍpøÐõØShõëÁ–³if#l‘"Ô%Á}(ê´‚¹¨L¢z+½5qæ’Û¨އj€êÖÈ0äÜFòvõNizu”¹È„9„”kÈ~y¼œóº—™³È¤Ù¯vnìÓjåÀ.î ÉÌyvíÉ‹- 8Ða]ÚÂW™y¥åV¦dê…× œ½ãÞr”ZVçcMŠÑ6[k ˆÊÌ!î¡zŠÁ3Eĵaf1·®ãWÜ—½ÃÌ›÷+I§„Û3ÞƒýýøNÐXqa¬ØÉ‡cÌw¹Ø¼ŽåêtSýÁå€Íì€ ßíó”«æ{ÝôœO—¿FviË1Íi£ŽÎ GÂ:ŽFž‚û<Éà  ìy,ÃÂ{Äýå²N½Hn0çaˆ„øBbäÏͦ¡õªÖ€ÔÑOîMfÎ0`°^¼`ž05×iÏs¼ùåöD «‘-ӉȲéûxiÔ@QÉGŸ§+¤˜É‹äúÃ$1MÏÊCM ýÊü©D éSœÊkñS00xH‘óåscœ%æÐkZÆ´0h©H%rHB> b ^Ó4w$AZ4O‡‰^ÛuB¦meËÅ|4/Û9 0Š.Ia)Õe$s×ãÔ.Œ…|ƯÁtÆ?òdóvÅ‚BVql3úÑù–д‚ âh¾&³®–"¦ °_±• Ðúøk»ÏÎ}Ç_ŽRДÎÚ/†?ÊáߟoAíۤʤ»ÛT¸5¥©+i4äØÌ¼h>?Dða?[ëWñÓïÉϪg4P1 H;Á´$œ©. ¦mEµSÿ<Øôz²Ô½Í!¤‘.œäO•kWv,:õ C–Þ&£ýØÚz_ÑéÕž¶áýþñ꿘cÜ2’þʼné ȵ0ª×¿j?kÎB™˜Î 0ãâÕ!ûäìl©¢ë£(b²«{šó¦V)6£`öÌRe ›†²DR¢B@ÕĪÉêØ,ÅJŒKždØ;ÏbeÝ…Óʤ“P¥JßaŒiïèEÈ‹%QõìD0Y¾ô‰dHC½Î5ø÷{{ñß̪òõÇ]-,H‘{¥7ë Dß² ó'†{·aõÁþÒØÒ=ö\ï½ýØ1Øã¿,Q$ê‚‚@ŽCþyßœò;e»§·`‰ Cg$AÒ¤½ g“¹]ï©4F‘€B  m¿M»­FÆJ­#eyNd°ÁëëÁn 8ä€OÕ-MÝ<àvÛ`3âË$é7!`€€Â !ݨ ‰×\]»õ{ïÇvt'{)e$×{6dŒtå¢èké{A`½´4;Ò„=@hÅ.Ó½7 MKoa,$#ši Šs ! ¥¥‹" þxú¶ß­¿°ë_-ù'¹³÷ð`+q»è¢ †•†¹ó?o¼ì« °í  €‚À \¹š~¾ÙÅMô.“`Ûh‰‘S±aˆ¡W”\U®Åjg;…Ž”ßÜxj‚5IPË~–AÂ÷‚µ™eñ¸µ8†p¹Û7á®õé·D²2&¡Aª¢ ‚Dˆ ¨ ªÁ‚0XÊIõ<ôo¼£\÷¶“CñŒB^––D©›çm¶æÛ_¿|âýC³‹—ä¼å¶jHH“îš‹Kc`!ývØ`!Ó‡ž Eq¾˜apB.Þ!hkÓåÆòIR½hßdÞAmøÁž Ne;œfŒ“fÛ D– ÚÌ>½Vèp€ n—o°WcAIa¿Z³^Ü`ÐC‚?¦ó®Ýmd-€I‚ê®ú˜PBó˜àÆ¿d{ýwgâ;ž'çÙ›ç@.@ÁÜåÕæ¡U¯52‘@8¸À#?²E¦¡ƒÇGÁ|b·ÀK Ad#eD,Äר$1† 燩ËLm½Í< XtÆøóƒM& ij¶¾Í~~,‰Å)HfüÜ |PŠmë]Ÿ9q%òÞ#¸¤ ‰ÄM£¼ˆ!hmÌ÷WœqGÔ_|–±Ä…Š ζÁÍ$ó|q\om¯ƒ R)½òdA$DH‘D ̪ª¾ ÐÆý4üD¶@!"ÅUUUDUUUUUUTEUUUUUUUýºÌU[ñÑóñqô–~ŽCψ<¤ò0ý“r”òÕUUûÚªª«»Ñåh?rýx*<Ì$’KaLOII$›Jµ…’½o#ÛÈf뮇AÀH”É ’IoCó¤lç8yÂA=¥×¦†þÑÐ[Ä=7DßïvãúB-Îp°9µm{üèëꊞäùÎÓpçæC™´xŽ–Sâ?¯,'wŵâÑå8 Ãó1Ð\úÇWˆLo>ywlÞC û%6grýþ?»ü}­(3€`”Àu\d•×ê¿]^oœoøˆ\9l¥´;(·0ýÍû˜iÆ ô… t²Éûé°„j´­ˆ†TL.û.!Ð6ñ)ãáŸ~©Û¿>mëkŠ[èü~) @W;òÚþ¥s¹Ç`qÚ&ðy!D$!Aù°‡4oñ<ûAc¤aáEž†C* 3È·(ÁˆÂÁ`0@c…P„’F9~rV†ç;žKœo¼R(ˆ"0`ˆ‘'Á)b"" 0 _ŠQUUUXÅXÅ"X.ø³f AŒa‘!]#‡oÛï鋱“öóæKF?›÷mv@ÓõYxMÃjïÕ\γOE°6DŸÚV|¢³#SEöò=`^a~æL~}{öýØ~lùùv²_¯‡‰Çß¹ÁŒ?jæõ|¢‚^}ÖUÙÎCcœ®`c„îîæ8Àš÷Ã[_nqéæ?OäÂ-f^»ï-ÙâûÃ[žy„þ2Ÿ¶•zMŽ-·^gõúH\ØÓßÔ¶"»œ! "î\ltô)sÍ`±™ ‚ɉC“CTÐà}ãkJu4£kXµLjø†Ä‰@Ä£€Áƒˆ ‡œ–zO#F|(~XB _Q»ÌâDOÜ@Î4^À™2V Uâ õ¸?¨¿µÜ~’W ¿Ä¯á“ôhK €\8ÿ-ýoCªùÒ:Às¢å?p9Ü !ÏÒü4ÏÐæáOоùšíÊú§àfÍw]ý?p˜ÙIÆÀX0aˆw¸ìjkÅi †«¨TRª€J¬@/ëÖº”`ÆUùkX „"H0`@Œa±ªJHÆ1ÓƒÄþ=û®aëÑF,g¢”c2À£¨£Ý)Ì ÅQÆ^qγ׾vžâËðÃ!‚4¢²7& ¶Y™˜ÆZQ€À¶Jv›Ö~{ï³°a,7‹…¿¤a†Âé¾ g2 b¢ûíe¿½ÑWË<ø¿iÓLÙ ûý¶¯³á~Ää<_¢Ñ+,N1¼`§5Ãö0>ɸä\ßÈ£nĪtÞTûøúó>ˆffg[‡Ÿ¤~Ïܳ„…xØõº%^²Ã^x´œçKó&·çX®šäFCk[o{ïÄ r}@Óv˜$ŸQ }í+²ÕÙ¶ç!^6FËÚOMr­wåÏU¬b ‚E-–2# b##$c,†>a-õ–Ìd!bÓ$BÂoîo?¶¨y,Ìÿ²Ó×”¡ÏÑ‹ö“´m/¤|ö3±ÌœE²ªø€B’Ò$æ5/pðäzTǼ{)*l¦òcÞ1ÎÂÏ#YËÍç"œú£ZòCZ)xžÏ®záÇŽ—H…§1]sòô¼[£òá_srZxSÎ].|7uDqâÏFÉõ£Dö’;R¡¼8Ÿ#E§ì‡‰Š³9Pš0Eštå½é;·¦å*ËW˜ÇÉu)â1G¢éux—„2Í>mÙúÏ¥Œ©Œ—c)´ãïÂÚÆ[¹?FãTæý9CÎÌtÏœ1ÈjQSä>štñÍ/eì³çÉ×aC{Öµ~AŽX 0` lsQÁ,“Ý·ÚÛÁ‚©)½Ý)MôfÀ¶igí³0à˜5×ÈæRêr«ß9²h¨ô ø^¾¡õUÚíóK6¥<ÌôN®»¾pºµZ^ÞW49«@NTÍÌ’Óe5K§bÙÌAÇ6¹]%5TûRÞìí·™Î^·ÃgPZ¼Ó£f’emµi–9Õd¤gŒœjÍö'r+#/Þ§s-•5´NU/xË•~Vk¹Õjç¥ Ú®›pLeØå ÑBΨƒòz]Ö¸82ýï3•@êUºÉ-çl›®ÌnËž†æ£U¢NT®¹ž]ï;rÿ€k €ZX+ì”ÝàqB›kKc,ß"›®ÊjéMÌìÎZ¾l Dzնèïº:3ƒ›¢E%× Æ9!”bv2£2µð)° ±M%ÉJBÌÚa+eð‰Á,.ädÁÝÜFˆCªWÔæçÇuÞ`kô°UHÙÖÃLœil¹‰2öHÇÄH»ÈQÜ¡saÅLÄîf=Ü]n°¬ÂäáÍÈ»¼Ü˜Z¡æž÷1>CǽÄ6)P×ÖÅ,iä6]4V¾<(s_3¯Y ï8Væ¼ØI\ïU÷¯S-9c™#3{|¶L³z[³5 ²TŽÞ é#vq¡iuìˆ÷¯2tˆÍ×”&á“øú¿åM÷ß]Ï{yÕ§!ÃÂgZg…|'‹Œ ÍéD–¼!â£H‰m¼ãÅfb[}`ñcVF„_Å·}›Üï[Ó—|l¨Ü—v ë'zw™ÌGŠHØD’Þ±v‡˜;âu'â\ƒ KD6›ñÅx‡˜÷‚×iWxbÇ<$ݦ ¸àxµ·›GpF µ¤mœJfHðØÈ.!®ãé ­%B¢nõF¢3 †®ÂTÔx/P¸Y[²@Fîàë1‚6 ÁÍÍÉ&ñ ä¸ò`ã€mDÖ3N0 !7!Mg\ ƉÁº<0öÃw>·óŠ>.™E?ÏSé÷¹ÀÝœý=†¹É›ëŒ–›ÆÅš)°èPlSjÀh@%Ð<µ- ŒŠÁœyÎã<– JƒÉúÂü°P@’(Fÿ/C™nðÿ´ÌÃndžl:è’«'Âò?b“¾XffCLk $¬yjU¿8;ãÔ_\:ÏNBA9kpKÞõY-`°k}Úª=¬Ôßž4Ç`ì‹ÁKÚ°ùXǽó~Ä6šyÏv«ÂÝ:ã0AÞÛ>N0±½ã‰`­¦OZ²ùÖøÓU&à@,}ïÙÇôù{øc^÷*p‘ JŠ<Çšw棶´KÃk,ÈK˜÷­Ín|'תüÎáø½zù\O×ÊHBÍ+Xžiõ¿×|tü®ózÍ3°b_@ªtÔìÿ?`»à¤˜ç­ ‘Bœn ©Õ/)>18y…¡Ô­méI¬…¨Ý+|ã3u°ïk/ê_sAÙà¶”ýc먤DûÅ(i»´÷úµ¼68äÚÛ(`ˆrPC´Súø\q¹Á+ÒÑމ>˜`ºìÎDrMa¶šâkÅüÁ÷6<úÜæúäCía ¹ÌœÃ~tb‡SÆdâlØÓ×*j˜ ¾ûiƒvPe_§ò=yÌÍ~wß]ð[W!÷û}¬>¿¸ŸgÙóŠß§–laài›¨ŠH-ŽOíeôã@«ŒcX xDf`›,~"e´Åˆ=Xr¥AÞÖò —{sQ¬³jÏdç;ÃSÎpÐÆ°¯»mЖT”Þ‹êz9)ÂÝJÌ¥CR±³¾í6mÑœkÆ?¨ñ ®Õt"g@óôOè@…ºÛê\Uü`Ú¡Ù€ÂÄŒ Õ¬â'85Þ¡ÏÙ6–LTd6K@þù¦ô8çkNtàã¹c—´¤Ák•TÕU~°)NCoíñwìo‚ËF7`9ÂÃÂR`ªÑ¶×8 /5ð€Þ¬0ÞFüÐ44˜®O|ZêWß<íy°F¥;¥&–l«e]ÚŽÞU}vñ¬n… ¾lQDzËÕ3ü{øœÓÿ’²t>/îŸ,ÿik_ÙL°2@­Œ“sï½*yIƒÓä ooÑЩ ¯R¨L°1œdXÁ3y´ -ÂÆo÷, eÊAtš~&¨Z· Öºœ8ÚÏæ€´ÇIÆå^〉:%³âèRíÞ—vÏPñõ”\åôÜ㩎 B@Ü€òÙàÆúnÕ¨¶k¨g}”ʘ¶³Õìm½®ÄÆÛœóŒM̽e¦û¿ÝÖì0ú*ú#K·7¢A!'Ò¯í³üKîT°í¾; $°-!}gÐiõO×Õ_ñ¿ E7à°6‰åŠ/ñÆ”}O$¸;gO›)JoúõŸÞž8æVüÖévJ ˜0C úÙŸîpC÷+þ~~¾IG›øA?“ðÓéwõh¤o|ó¼ë©ð¬:âh/l\¦°pæ©L¡RødãÓÌ©;–Öœ~ì°ê“±,:ày7áøvwÇÆÚôP}ø~[~JÃObþašv×ÀÐö\>F-Ðz=õ@Í^ü Цý}¨Çè„ð1¢ (︂Èþ9ú/Ö¾à|ØØN+'AØwä0íÕ„¼2}ÝhtõÈr›+8X 1ÇÝOIÀÇKhâ(oÆ„<5È`<Ó;ÐRf$ÔÚ°'¯ BКîу M¶Ö‚{‰‘1±E„ŠA!®ÁüÈÛ}¬`˜qÿÁ ~_']ÇôÿÒÃÄ௠„óâ-]¾’ý¸¹((”e ¿_ xTd·Î,™—ê?4cÑf°ÃÛ×¾zÓ‰/‘Ǥ.ÂÉÄQãïè}à c—ºËG6*8<á ýûpì?É®i.†‚;<+¤_Ù¶³×1 9¨¿@‘¤9ÚØÆb Xkz1]ˆlé`<.üe²k€p]Þ<µ¦€2™ùü/ñ3Çhÿ'|DŠ–· q÷œsZ<^Š7ÝK)Ïñûýã!ê[Ü5›Þ¿mèýCÐT©|Ðõ?_Ó´-ö\ûùÏÐ|­ÀmRO>1§n2ÜXŸô‘e‰MÞ /3€HLEMK$Á„¸–åÎéç„=2{ll5Õ'}øóú¹ƒh²6z üØýZ¸­v6 ýo–ðòS¬ì’ hwTm>¶ý½Í÷×­Ï»j¤„]·°KÐs¾éøücœójûóŽ#¹\Ñòk©µ:A´OÙ"[öûÁ¦†ST¥+ËŽÞkarB'SçZ~Þ×£PM\Îlt°O¬y§ËŸ¬Jâ½s×¼ýãñÍÐÃîOØÄo‰TÁ±¯êß›þfo÷îÀœ G²'ë®ò¯½¶ÆxàÔÈ;Ž!>êˆCŽª7ù¼¨éoxÕ¢¿×\ BQƉ`*ÀLÎÃÆcñD€56ÌV‡ì¹ÀLPø‡©Éõ¾y_Pœ]9ŸUûý±@p‰!{?gçðпrô~7Çå0(;~y³éo®AÏí¿½ç\ ‘v`¼üA·øÙg.@S„É ÝùѬ"Dòv-ôoVÆÚ†‡º?Vý­FÅg»ù¸r%¢Øo9Ê.{##÷1E‘T+Ñ‹‘L—?.pÚÀlw¯êhYDRaå0 0¶•¿ÇëÂ’Þq‡ý¼òÀ1Éž1üÚÿj¸þ:©Ÿ¾¡—H~ž:¾ýu 7ã¡í©î7½‚Dá–8[;³’“4+SñOËLy ôú^(\ áüD“ÜžÈø} w º\“{yŒæçÄÉvŒA!±ÑYh­Ìž|¾9ê¯|‚{ä2‚-šñcÍ9ÚrÚbveר|Ý^á·]I§ˆû¤éhº[ÉÞ›»nèÁ¡i<æÐavGâåŸ KHÈ3þÌN™æö‰ s+óçÄ2íSðõg’²îÁüéÙ)è8§¿†Rk$÷¾`º¨1µNó†z¶Žâ~høO¤®¶r Y‘ü-ß+J=“žOöxëáÌå>vúÙ`‚]¾1ü+()H@d¿3Ÿ¯Qñ‡ÏUùƒ—IâCïéøß}þn©>šbüfÆÍÐ.;#¦¢á£|[sN€ÞíÍÐÙ.ß8Cl hІíÝ!ku"\ÜÁ ‹…šÕÂá,;€Y2`2,!­7Éd8FÌP´1Œ,`¾»nަ¨*Þi¥á·ËÞ~q'™i­Õ-bíNÆ¢þjèÛ¯µµ¼êJ§)ÊNV¹¸æh»vYÑÉߺ–¾’¤›:u©{¾keq™mGkheÉõ8”w;K.ËQÖé·#6Ú~ᜎR?ú‹ªY‡~Åe÷Í_ g­= öìú‰7·9.竺RìòºåêõÞíó×jœÕÈçIúœéEüÓÏt£âgC PƆÈ6{B» ÃO ³C%ïCAÂzèàt@ÖÀÒ:.‹ J –‚‹ß[fºÎÌãéL÷¸ð¥°ùÍ Z`̰ÀÖ:&Ûh`! p䀢ÜECDÒ—@#0 ±ÆíØ{@ŠÇm`¶bš…å>w„10R’zgdœL‰×Ô†wl±Èû'^ns“;Ý]-ðK¶:w1e­ŠÊ’ä)¹‚2µz®-)À/;”Ú½[®Ú\á<¸mñ¦^—V1u‹O‡_]`Uy´îõ)i½¸Emš@¹¡8ñ¹*#R-‹ºÏï/ˆs o¶ÔÞíí®ÎŒÝéxA/¯ 9',x|ÏÙ{ƒFe†’³é…D’t×_£êc ˆ=H_Œ#fà„Ëdßw©™‡i,CX8²%¶HÆí@Ú ®yÅ’ ýF4˜]¸Hάó[.Ô€´É¢rÎTUªîªÍœîn«[“Qʬ&}Àð‰B— ê¹Ë%ȹ̙~,)éy^õf&¢Î,•eÞ‘•v† ³»Ž›Z9¡9—„m¨Â¨•ÚW2.b a𫉓—¥“Çœ»Ðï"M„˵w¦ ñNÃÎ)ªv8³Œ‹ÈwF†1C‘ ANýtòp¾0ðèöÄyçšçžHï‰{\L¨@oŒ*îvSH„·W÷-/ä¾=ß]ùÆÙ«‰Ê„S‘]ÙH&•.c±œØšÜ§%èÁ§FôS¡Å†Í£‘CXcR–$—• +i'&5Ö[ÍN>åÞDåÑÜŒ‘QëqD8}¸Z$“àš £ù:œUûcÊ WªY2û·~Ó_¢( ʪ NnsÖî[a¤OÉ€UH$ïµUq¦NߊGc&Æs¾šqÆÂ‚­½­i0ûõ„Kñ@lé¼?tÎÐrÐ¥ªQYßσ(H_ç“$!)ñÞdó<æî×¥Öþ¯°ld„ ¡q ¥‡Ù û̸}è©YñDáÏù(ƒˆ" ë"oÑ€òö°ÌsoÕ.½÷Ø!!ˆ8¥àã¥[N¡›Á0A)KXK ‰AÒˆ!zC‘pßÓ^$yÆ oŒh‘Ðn3< Ÿgw\ˆ÷q—Ãv5[4mD®_—OãÇó£³fëšÁ‚ÚÇaŽÒØÒ…Ë‚÷Z§–;w¸3ÚÞ)Q1 „¬–ÈpM ¡uo ¡ë„ojãµqµ¤ý _X û!![;Ó½ÏN1ØNHÃçæó/íõóðo°Ø)êv{am—ý„L¯ZÁ‘´k6-øtü.þÝ Ÿ¿^»nçÙÆ· ˜qˆO ìœ¡°Ãº æ@jÚÜÐâˆÍBÛqoZøä ˜3 dXz‡ ©|ôü/ý_Ô‡`‹µìþ}®þÿ¿¾(1ƒBBKÑ䎵<ÉÒr†ŸZ•0ˆˆHHŽþ„6Ø·‘é¦ ˆÊôúZ›B€†dÞîžàVçŒßÕ‡H¤G„„e7q$B$iƒãhؽ;í§aÌ{N·*óKX¹¥“¹}ož-i8ûTû ‘ûæµÜükúo~uÐì´‡LI‹178K2x#§)Üç×_â|.Z hÉÿ>Øzã>d5£ 2}p Å?Ï3®±úxzš–Àªˆ´oŽšÏÉ:=v|”{ |Ü2?FÀc»80$‰D³¿¢ø/*!|\ S”âqŠ›wß}}iÅí蟣üØþ>²8Þ2üŒðÂzüçS÷½ï£Ó@3¢BCäÐ{ÓI’ݵgt$hˆ™Ò!CåU¤ ! çåøpÑ5†cïLê–IØÁõ».PÑ`^ãe—Ðgs£¶þ ¶:¡¯†qÇ·]ˆ'ê­@4}tý‹Ì…³F2t WÛ¹¯ž}ò¤CÓëÒÀ’cA8wä¼OÍÿÓáì>i#ÖߊBTn~çç~Ï~´ôÖP+Îú–gŽ•È<#.HX`ÑánìeåØú`7v €òÎâY´Ìý¤É–äûmÏßàC5s0-îmËѲîT0ÏÇÝ‹¡X­0mn>‹_È  ubHVgQt1»íoqfá†%†ÚÃ×Ñ]sŸ:aþú 9£é3"Ï<úyšïû3'èÛF9ö¿MsúåøŸô¶çÛ&Î2Æ}BûÉs©€è|ì’`CA¿°Q0¶f?zàÚ‹…ÓocýH¡˜|œp|6U €Wßc¼R½ó—[†È}iÐ Àmz×MÆAå™88wt ƒ6š¬v‚«²0`( f§ïíØ›L›ËüØã]Ξµá¼n¶†0zËdëšD¨}óç_ŽùŽüë}qœ¾° ó Äò]=Õu¿?©««þÅôE¨@e‘ó)¥OŠ:@x©À±õCew]}YÙò¹×óÏO™ƒŠqßJ"d OŒ™3IªkGW¸ùá ~!)ÜñKú˜l”Zè{ ¿*,ùùչ߷ÑÖ†êŽÃ$ú…Wêcbˆ6f0ª)e„‰)À·í™¡BŠ¿U]­v³œD‡®2š#ÙÑÆ"þÈrºE_¿Ù[ì×èï¦>Œý`&€ZÂãÓÔ[º^½Úô§\ ¶=Æ×lu]ËMü¦ªD Á©%¡=ܽh\ßåà ¶=¯áS¬&©OQ‹¹ö•?×Ù?åiÚͲ,8±ø[^yø¶qÚÃY¹äÙn3ZhZCõÛë8q–XÏV…µ°»®ÚìY©ýû»‡ïÖcÍÛgf¥¤”Jâwëç×ÓpºCÈn1€àÙX²®òÁawÀ 0’··î[f½™ºÖ‚)ï¤On!„){S¡€í+£sBûûû:ÜÓ]'«fÙÌpn™©Æ¯L6«ëfŠ»}­6„¦Ç¥\šÈ ÑÁ»!30ÏÍë—Fù†â¹¿jö…ïæGç}¾™P‡ßv©ÌþGÂñC®ú°Ð™Ç÷ð¹}å½9|N.ŸÒ¼ð®ÞóÛýM€ Ás…:žý°‚Íß’t=n±y»‘Ô'8”5G‘ön3{ÔX}[»4“ß—>ßÓ[þoo˜ >¥V.p÷ó¾_Ša£ÎÁN~{:Öþ¶\3æ‰ö~ŠÑh‰L$ýg­É §‡Óò!#üø®XÙ){ÇÞÎLycš+‰Ü–Ö9©’§íœ´k†Ç^AEý9øÇêê8_ úkò é¥e£w·ŸŒ¼9ñ‡}'ÃÊ99YkwàªHYÖÒ8 ÞP’pI¯#xx´áuFQ9Í;ë<ªŠÞ&·y¯¬löNWãäzcdE^òqm;§é(2÷Ž4®]lT ÙJ4At|DÛ<cñEÁÏ×äUšòŸN÷<ë!âXùëÖ³F x„ÉIf¹i’ÉOS’ò•ûI¯5ÉjŸZ;…â‚ßF³GÚŽ?@]Ì0»&Š2Sæz+»èl9¢K”Óg €tlLŽÚq«ÆÆHe…Á €0 0Ä÷Å’4$³ÏDžÍlùf;ž.ãDm­g›5zß:$ošÞtvïE›Ú(7%í8Cé?d»Kz —DlÏŸGz ®| ]áÃ/e)EŸ7×ä÷›·Æ=SÒ,®å¢õÇâ÷…–]lÞ§¶CRóÝ"w¥Üœi¸´&ç&Û¥|èlÚr#šæ{™°æµhÈËKtSüƒd*Pä„OÇ)3p˜Óžšu”Ý”‰¼ÔeH¹Prë‘8˜``V1²fép|4&̸ÖÁ1©˜d.ÙD»@*ªÚ¬CÜnß9œœ¼O›!ÉÍáàYuÌÀW!q͈`†¥ ¸â«è »Í݃4îõOyq»Ž (›ËË2¶åËÚÁšöæâ®2âÕbœÅt±P| –äàÃq¸­1@ËË^eå…› †tñã)ßrlPá} ½él­«´¯K*Ã$ăÌíTîÍ­S1Jwvà`öânì]¹”kUÇÜ›—ŒÄNgàf"PF år3üærtÑX°ž¦ÌSJ €$²Vð\ñ×]X«K ÒHè¡Õ…æ äv;)AqPxnF d#3;¸÷Düë3d_™Á~r†•ÈžsY,g|Žï yŠÆ˜#ÛFuF݇,ݹªÙ°¼Nå¬JQBØ ·…‚&2Ö& 6°t.lxhÖRA @0Ì·³ݧq^bµÍn¬ˆ0p’ä.ïa&ÒAÝ *×Å·wáf7’3TãtW *†wI÷œß’‹¥„à /a2æ€"š'»oN6÷¬HЏ>´ßÉ;Öp6\ ÉâŒ`s –ÌÖs—N\‘0h9·…—à™¾‘¹«‹Z`få'«Í9Òv•è¿LNˆX¶á¯æÜLà—µÛ¨—Õ-k) kŸ nîæ:ÃVxâÕ0jfº€ºÀýmVŒ+0 û +^SŠ××Ê·9¤ êÇå’wǙԛû[ù¡Ä=ž&s_>1”$xàÊ!„>Æç¦DanþU«µúk•QÖ«T ×Ñš÷qpãƒ>ÿjGôÌ)"J1>þÿ—_:Ì]ÇóÈŒãþ•ˆIô>`PUš­òÙæLR¨^@ *ÖAƒº°#‰¯µÈ,{$ÎëXS²¶ÐYaPP^’ú\ˆs¾Y ³v®Áàú }óÇfOŽÎäþ»íyè÷”zé s"w"a#‰èy%ߩǑÐm ÆáÔ‹! ýé–ϤÕb ¦iÜìîe²÷ÜŸo¯xEå[g¢Š#“b ЧCb ¶Ñg € ñÓÅž'×9R‰w˰ÙGË?2Ô~Ÿ!a£ñ_äA+Æôzôæ”îùÔÄwßcðr¶^yã€$Ý~v.-yäå½ÂÄC^ ‰ëèÇ1Aý`¡½õ}û{ˆæÀôˆt†VÒtm§”¢³–Љ¡”‹ Ÿr²86ÚÚBÇÑõ›=F†$+Í9[Îh'‡[Ÿ¥Ü’ÅB ˜] É üètýsᇨÁ}“Tû[yf[F4—®§XT¢=VðÆ=ÁaPI†=3™Ýëê<:²ñ0ʶûà »+ Rø´ïÖ Æ;®øî6—áÐ ‚üeøj3ߨÔ1†Ä÷á“ CÞ`£âT`ý||üCNº<,3ÚLÃ0¶H‰W8ÃzÁ÷ —hªh‰æžìí¨j:Ô#I÷Þ×ÞÕç÷4ž½|±ïç«zlÆÉU¨@æKº,عæç™ÙsÌ0fF„0 €.›ºèHJCÆ5Vy8 ²HSO. ê¨?SІ°÷ëªxÉÉÙw}ÛÃ@ô–®I†[§ Ìœa c‹8¿çK!ÁÍÃf!G6+y@EØóÝ’ÞUÞÚÇ“›œ¯:– 6³aBпžk~øç¬m» BSD(æÁPã:CL ¯©fÔ¿r¶÷a±øÞÄ7(n´8>8ŽÐRÄ€Äsëìèèt†0±Ä0`ÎNšŒ—ü¤ÝÛÅÙäÏ ¬ý§Â’GϽ'ÙçÇÀ €>ôéõîgnIYùe«d™UåB=̓– ZÙ»ŠÅÍõŠïñÒ,Ðe=d[iÄúòâÇàü úõÝ‘ž; ÀØ,jtãõPm ¹¾p{†ë¾»Œ5‘ëT3§(`°ÝË‘ bA)/w…,0TXrAb†Úì4€t„Ðû,Òt…Ö“†oº¥ø¯ìňΤ¿ÄµßÂóé#¤6>`°ØÇÞ"—QôŒí'_}™vŽ˜ïzñ¶fBí°Í¬z0íy©|CÑZÅ`N±glÙÎŒ·BÑ‚zp¿GÎÎ'ݰaéøà0ý;¡ < ”;Ûhº°àȻǜÀF&£•»Þî0I“1 IiªòjŠû¼Ü€[7´o£ÙNݱpÁÂ¥âo× ÷zLëÙVÌý}W®t·¹÷4ù_}ñ>’[@u;ú²LýmŒ}ç›ÆÁr²Í&Р¶h;–ЫÈ^{jÌþµ¬ºêñk©¯2ÖS«[íC¿ïœþ›Ä=ŽÞpAçÍ¥Ê~qX–6kC°*Ü@¢)&ÞiòÅ‘i-HŸ[¿ M¤8ÓvFiæ7r)‡SgîTÄÏݪ¶¨NÓag,X™òþçùõü%ò¿R¥ú~Ø€ Á36û×ߣOT€˜$‚¼å_HK«"ƒ¢Oåd<ú`9aü!äìŒ)ó‡¡ÏŒ+ç¢ç‹ÏZ/z¦F¹¿×ϽñéùßlHBA f×ëù½ –¢°Bú(i(þìU|›²" VmZ3#3?‘np~‘!ˆ¼ÏÔêŽÌv—àRÐ&~g‹wÁîA‹ÏÎì‘LÒY©l‘(cSO¥V˜û'œ:9`Iü7ï{™þ>ЧÂ8÷Úã÷?]ó_ïÏ·øcò¾|›?œwÆ1 àQó¡s[ÓÖùÆŽ¡°°~*Ó0\ÑF’ú¢$”ˆ }q88>«Ì\º ߀3þ¬UsÁ÷æ{¤–îýÈîhÚG|kñPÀEѹüÎM²[>HÎÿ3«íçÍ-$d$÷—àŒ8û7†£—Ì‘ˆC­ƒ^ô ` êdˆ·ôå˜Ëo–Qö/cHêû°¥ÊÊ.“Úc_Ë Óöö+!𲇧1ßž$Îß’Ý;ãƒ{ä/ÍuwÉÙûáéÏÚ4ìñF«È†ž^Ê¥‘OPàÆ¾6 †‰¯ö¾PzÀ Œgªv_+Z³ùªˆa¾_Å ©db-–ôcç ´\Úã^+|>zÓ¿1Œ†Å¾w±ò¾wçÅjʲÊ1[ÞI0$ ¶ñh¾o¥+ÒC>xâ ¶mü…ë÷ŠZÞ©®'ίQñ—9J%áòs9ÊÉxø’f¥ÜŸÂÜ2?ÐÕ ¸Ô]ó+szkgÉe;«Õ*:©ì’l½fneÎ$E§ ¤tGçêzêí®Œ´aÈsæ'_]fØDKPB¤Bb`MmÖlÕ$³qÀž›&_k¤ ¦\Ã{Q–L;›jà50¡’€Ë°\7M¯|¹C¹¡2äBƒM÷ÕAÄã aÆ@ 8‰Æ|âQøÏN(®Uùµ4I":[SÉù ’aüï¡P§Ø#¶)½&ÁtRÕj›·ÉÐHÞ¯(K²xJÊž¶›!jϱ…T©q³­e²ˆŠšã,ÙÑê]Ÿ0Ù©Ê6µ¸Ú ÖAÆ`ó&N«KZ¤Ñ°8œéöôÇ{ŽQ<¾ãvY¢wÒsVróÕ¡š·‰bz­wddŠù36›¸"BÞE˜JÎIËbße¶ä5Þõ”Læeå6í· K†Q«´ú32’úødTyø@@h:Ç7³Á²¾º7öV´&@Òkgn¾¾©ªš¼ÅwuŽ3‚VÕ( f ‰ºbÛrоÙË­MíߘMêÓ ¤HT R3—2\Œ}cëE¢"6˜ÓÀ€¿¢¦ªA‘x¸pw6¾L™ö鯑sVƒçé°2§¯¥sI­,çr™„a„óƒˆs”sçLñ_c—Xš\÷|õ,û¸/ºq7´ÙÌq—n"–¯ß·Ç ¾Ç©þO£¦ˆûž®5`ƒwj#î®ÇæÖ¬~ýSíç}v×2áx=8× î¢qÉÄÄȬ­‹Ñ"Ńp¬îé*#á¾û;®Ø(A8Ò+ö²‡ê“ÏsÌ¡ª‡¨齌É’F@‡Ìc_z6ƒ¨Aˆ¢‰¯ޏr|°*«ú s§ã£áv!¹-"ýìÓZYfølNXÀ‘àeŽk\alʰ[M\Ó‹X"2î”qBnD•ÚBÁ&.›\VØq Á3ða“œ””&ÁTGY} -7Ü+ßâ¶8JtÖ;ÐcâŠZ 1!¥÷H nŒ߯þeÞ?ŸÎ >Œ—oÔRªª@5"õ> ›ÝúùîxçoqP‚‚dIb7&uYÈåôxçŒḬ>þw¬Ì8t}`8½)£3ë¤ÔtгÛÉáü/÷Áçø‰õl”LÒŸ…ñÏóGõó;®#ƒÝm¯5öÏä&áöðçß,B6và®~÷y*“VÓ—´ðÒDÕ*þ0x²)j‚&ð¸”\#HQ¶ÊëÓ\+í! ©áÔýŸ}¿©õdóçãßmD ‘b¸0–aÌ·JÂÀH ºÜÖ€ÏÎ8`à,yÛæ|òĆÆÞ"ì­q{orº/`,Ä =qæ™&žoWœÍš9ˆùÆ94cÖÿ8?OÃÁÅÎ bG..@˜þD-ár~­ž0"-~o§k1KúOÂC×â½˜Æ `ÀLƒïywûßÏV™âaŒP p:bî: cOYÑĬ¾Ž¹J¨št¢¥m<@HL #U­c&¹À«rdÜË}>ôNn68ÒûŸ¿¿¾oø…w§;w¿=šBÀâ x¹&ši·tf%ÔÓ`MUüùÏdyùãq¸ËöK"Ýçåàp«= cÃHS+ åPÔzû–&MªÏ¯åX$ÃãCö uëý—§óõ?~÷óR¨,®LzÞVÛ0D“IA1žnø½€Xt@ѽ¡Ù’J,‰,Hç,n÷m§J¥o¶`fæ„æ,z>©K÷]ÀüýÝ€JK¢îÈ`þwήhö^ÿS~þÇù\»ñø/ˆÎ?[ºoŠ…;¯­7úëÖ·±Œûêy½”û¬Íã0Ók2wòQät»º$g›.¯˜ûõUá ‚ ˜F²ÝZºC&&¥¡R¯j¥ Tî“ó°¾t©_:Ï;éľjeŒF2;SDd#Lmïl÷Æ6>ö@Ž&f赑èèç8 0*5äL°ÃD5Ó_ZØÐ‡0M Z ×¼ñu9†ú°¡ê(#åœþÑtAøPLÇ÷¥.•·ÐO}ßè‘°À=ï~ WãÕmýdÇptü>.ÏĹо-I 7ß "(7«w`-‘È_–X}iyÞj%—Øq‹x=±K8p9¢ÁÓAV]q‘×i(>“”Y×äÖôƒá_ÐòQzŽqØÞ§ëS­¿ÐŠùYÖhŒÊÁ$(ß°„Ê ]0Ãí`ƒo––à‹~b#¹Ù›… /Õ}ç—ro²6GuøGá ó‹Ôu’Ù¦ê¨N›.¾ÓË÷ûßÛùLgçÚp‚ÉýYõÕ—Éh‡ÜûH`Äxýµ²RðÃÑ¡kÖŸ çÈòáôþ´óóÍäá‚לtœMl³¼ËuÈ0פ/||çiEøë›OAä¼AÓœQìå4Å)˜òi²rÆÇŸ44e ùTÚl‘ù³o%rsä4¸;SLj*"SíísžóNÒ×ÀµÓò•½nsSi¶Îý¦3Îß²ªÆæÉw‰˜ÖäsÑç>hø[!Òñª%‰õL0ßµq) b2P„[Ó¾Ø/<ž*mÒ=ÉÑQ,{ÔÚÙÆUmàýasr:êúUX®4Ùl¤«®œ.sÉ×8Ñm¹ÃŽíxÙÕùD—P•KÚ5Úé}Ýo˜ènc60C ÍuK%Æ›ÖÏi| C:®جŽLÇM€,ŠUt`ÌÉ«j† åUõ¿žçÛ¦°øB{Ôó2¼TMf:ï4|ExÌÓÛo’€³uePÓĸR7ͲñÊxâw­±ÂuV;Ï7+yÖ²]}3͵Q\NÈ>‘múGhôìë–àËîk‰Þ4ƒ~O:¢8Ñ{7-óxŒÂì«Q­´}Ì_nôãT+‹örZ§ËB «§vcI\ÎZÛjYGNæ$¬ u™ô„³¾po©|uÎß4“i'Ï9ï›Ï4ךã»Kyl^×ñwNö†ý®Vƒ%T‚¾FrðåÚv´wnȆC¥eä¢b£ó: ÓÛ)òîaæ»ËHÝÄ#¦!R©Ol†m^]í>§¦†FU™y·šmKv®5)§¡4´[›"¶Ê9±@íˆUÞî\zŒ1¼‘\Ú…&â¹'.ìZfFÖšºl‡´£\JNï÷œÊÈá¡ÿÑŽr¬É'¢:¤Ô¢b&tA…fƒÏV¤kDøCáôê)ià…øÕžmç¼Äc”ºWW­sa´‰‚8l×RI“†ê2žqoIÒ€öùÊêFXå µxಾ¿ ëÀØ· Åm‚\Œ¦*v…ÀY`ß-Ë»L:Nur—­Ø¸ Šmj2˨ˆ*ÃàðåtQ9‡—°XPh *Zlj y÷öõ/A°&Fåòa+Æ5ßq2r˜(.lí”ÕÈÖ†"ØT†PÆy5»°° dlÎT¥´¶;fErÅC±ÀÁ€kf@UÌOo®òÐŒRÃV)w ¿elhÐy Ä€;ßÓ9c;l`6䦹‚Âb­áGI˜Wíaa¬@–’Üï.­Š Lƒ¦ É·á 3¼ó MYm€ §Ñì‡+Gwøœ¯ÉYøí>¼g¿‰^9 x¼$‹;üärÀ,I‘PØ·Q|X#µ¤QÃFwfV¶F¸¼™Ìw½øËk¸ÌàG9¿Ï­ÒU%Us§<ᶔ̴Kœ&¼ò#_’9ƒŽ×“-ÈjãÐâmlk1@H,»±`“>:Æ€ÝÚ`>5-€ H¡zŒ¶k"q;9É£@Pû¨®û@‹62P§ Ñ(7Ÿ7}öjn ÑfüûDºû_¤t-ü(|·ÂÀ\ÎH=W—çÒrÓ5Qy a¬“â@V8Ùmà1Ã"ž áõ«å©ú Þ\ÈJ˜<:>3ïÑÉÞ"±hÞÅGÎÉ3ç~>¸P‘v8x7øUþL]µù¥d4ަ¡¼,’¤øÍ<—ãÖ^¸‡Œ,¥‚³Ï0Ø}QȸԤ|ª›f¨ÙÉ ½4ç!A xd?xåÀkYôG¢€#óõnÞ·ëã|-[Œ¿(<* pßć³!|Av¿9Òê:-Z:Ó¦j=ðìë½!ægÍ©¤òƒ³Èì[1Åówöæ‹W«s>KZü¦[²þ¸Ï×ïG$ñ‹SbNÿŒ\Ï&Uˆ!ç½("ð„ÅûÌÌáb-! "Hf#Ï:q£oýüø ‚29îF`W`bBLƒu¹@ðñ‚"@ Ñ¢+ôƒW­öÀÕlau×¾!c_ gÑ£ú3ä‚Y°p"Æ‘ê;"¼ºq¥Íoð·ëõÂpuMÖ³ŽMИ| S Îù®ö‡ÎEOª¹ °Î}š!Èüæýô@`ÒpÔÈ,G)¿MÃ¥€õh °‘oÞ¼T›H™ýåDHìáS\LìD_‹ò—’´~¾×ïÉ‹õÔ|~È·y÷6Æœs¯5Ž·’¾qÃ$ØÏ %þç«@çf¾m# 5†jñÄЧ¡ð¢¿_×B÷î@³•à´×ÙqݰÆ$_{¢ðçµóñ~»è G‡ÀI _¾ª… ÿ,™ Ä0ø‡{Bîv‰çí0¼À3,%…£µa晾w!Ú 7>Ò{õÞ7׿T„º/_Íý.Ïz]ã˜ÁŒó`´¿‰Ñ5võèwPm.Žœ‰v0•kŒš°D*$cÀ,%€ˆäüF.µ~ 4A‡»»®›w ×»K¹ðŒ‚MŸNˆr¾?Ï7µa¬‚~°ØV"apa±ËŠ(€@ká„}lí£ß6«Ãû/²ú-QרúM¦õôŸ^šÑDñ±Zƒì!ÐPÙ)™@`[ìGÅó믾½ëN­‰—A+1·´øpÌfr€%—Ý•üì /¢GêýgL8@}¿ÇQ„ßÃçè‚•pþŠp0/¯è£TCwgmߤûlô ê{¨!Txϼ“éÒœŸÖÙs»øÐW£ÑRÌŸ/âeÎIÉ\ܳFºIÛÛDøÊ‹¨Ã®<´Ë´0­(7±ä¦4Ž[ÉJceïZQ>O\®/_L3Í÷²³¹ˆÍÏ4¯î.èý^MdÖÏZG,%‹ ‡‚žŠuP^ßW×ÍÜryäÐô¤ùö¥¤1½?Q™Yp£{@åR‰hGÒôü)"™3ëN9ù!ÝÌ‹¢f5º?AøôBÎvf‡¹ªvÝJñÔL{+ï¤Õˆ•3ß'»Ð›âÓ¿!!‘%kmΕðºŒÜÚ xÖ^ìóW×ÓÏÚç/ìÇPA 7¢>W!~¥@0­í¶rA^éuºcóóÚcÌÆºxß×M¶Âœþ¶añ8 Cå´gšúªÖûg{ãÛ& ‚}tºoJÀ‚…C_=>´¡ºrPˆ¹JÒœÅfaGÀÏñh€(4  ãôvšoH ÆVLGÇŽ‡«7§üìuMe†öïs¨ãB³§ÂW¨|+¢'É6¬½¦_Þø«ž}'$NPÑCƒØ<K„nß øp_p»óâx›°ƒä!?-2%*´m·8,‘êEÂHúÜà’¤Æ!fއ‰Jgñ¬º 2­3q Û ÿ,ûµYQ'8Swá·Ë|ïu¬D®Qh@Òc Œ! -˜þŸk€í&,J¸Âdâ!ÂýixCácß ×Z¥áäâ\nDšî|éÅÒ;‘éŽ>´Š‚Â@x2C”P“‰g½pC†ß‚Dqþ¹Ý‘ƒ¶ó 4aÅÍ^*DMJŸÉÄ3ÏÌüõÀ€wñÜxˆ ÌÍ!ß»õtX~+ó@c0ª~ªœhß.ÖŠ á_ {Å®Œ¦Äi‚Õq9͸ ê7<Á‘Ù6ˆí˜; Þî˜6+9o‚åèÃÂòÂaP§Áж&ÇYÀW£ÍàÍa¡Æ±eGÎZ É€y0ÿZ­†‘:@·¸®Ài;;GÎ÷HjNÁ “¤‡1;¸Kù  •ž3{Ç=={é½™À€WÃimqûp¯5|Ø2kžløønH—M³€%R;çSÔÌÛBœF{'Ön\‡ð3s5©š¾n«Ð° ð%õ?yƒÝëÑl6¤ñÍ¥B qÆ ÛÌ7Û!£l¥dJ4€(Ïڀ͟º ñ§áq#´ƒÕr¾%ŽU·Pñð«sZŸ›é9³ËŸ¾ÇoNt¤˜–©À3wü €Ì<ÖX`½Æú3îóðW*q€œ»ø~³;ûڡЀDv21‰þvªq\dae/l}R°“üû À }Ÿ’À;õ噎*]úŸ·Ú}ã\wuÁòþj; ÌqHúÏnf¹žƒ¸1Åö˜²øÖP}ßÖb±¬U«+!•¼$:þŠPЉÇmÝ/'\ÞqÏ»lb & 0uÏÄííðý÷õñltä‘ëëâ `{dùyä}*!ÏX µÇK|?YÏMÝ~×ËŒ¤Ìªõ IGL…ý`ù´ÏÑÜnìÓBîXè°žþ§Îî¹Ó[²À}ýöº;ôÃݪ_ñOçoì]ãÉ]lrmég—:~@ æ0Îtƒ$ÃUg¢þß88B³G]õt6*D+4}‡q÷÷|˜òJ€ /ŵ2×ÖÖzÊùÃéÒÙ/à/ó%i-Å[Í>\ßåivçæ¶ûQŸ“¿£O¯7W¼ˆ]þV~ÍuÊÉ¥R$FUžS~?‰”Âê‘ØÎ t›Gñ³åúñ§4ËÒñu<—Vá욯ÙjiÏ2Zg^Ñ£õ0χæÏì*LÌÖÖýC1f4üDSLÐQ?õî…¯÷ZÝzüqög~|îúÛ'À£(ÅŠ€Å(¡÷Ãæ{þ°¥‘Oì*)S¨£%(Á"¦A¨ÃEgñ ©‚Q£X(±Ü—ª –Rˆ)H Bšfì$0ÅÒ”`(m*ÄdD7 "Žº‚¬ÛA`°¬-¶Ý€’(b( ’"˜4TD™2ïÿ]¸íQ¦èdT«h((Ù&˜1fµ›LÜ…X°D؇Gf—á…JX`¨(›ºiަ·-¨¹jÌ(l¨píïœÒØ:Ò…ÀL,hÅÌ®T0´¬´c£AaRH“²ëR2E…LÊ.! hTVE cW( `, ipI—PbÐ$•Ð{ýR)H¦¿9ý?Žy.8s韎Ý8÷C#^¹G’¢hŸA…>öxº!_8¸ ÿ|h>ªÀ0O°ùy£¸îë ˆ'$S?ÑöŸ¤AX ŒF´”¤QDbÊD"!hÁŒùÒUEb¢ˆ•«‚ä´DŠZ5¤TXȱ«2”Dô £˜¢ÆÀË Í3Sl”¹#,Žæ ¶a„QI²ÐÄiCèÉvö'ò"¼ŸJAŽ   ê襌*)+ªÈ Ò¢D^|Õ‘GýühöÐ+A}(iU•@ŠH(‡XVÖA‘!Þ¹sfK@³ÿX¡N2BHAp ”  ZX%«IûA2à ›!(ÈbJ“ƒ 0Ý4„$âS"L˜f3ìha/À뢲fHå*dÉ ‰€•2³ê×¢+£¡‘" ¹Št<š1@oYhœ dYÐÔÅq0e¶•ÍeáµçEäÁ¤w:CHœrÑF2,g ‚1%ÂâÖd0áÃ0 „b|( É?Wžè,|TxDÝâU ä%­)ZTÚRTÙ±¼ëNÂCñåÏßãè.ÀO ‚Íûº¸ì¥« ß^ݬ’HÉü{J?ž¢€Ò("„´Û(J”IZ!˜  Å—&fE´¤ hmQb𠬋˜$ $&Ûüª²$hÑ0ˆ‚$©lÕ´„eÊd‚áAc!m¼ Ú”Ù¸Š)%˜˜„´#`¦)iB¡˜ÈY™bD`àZ0RÛS"…-òª9«m¥g2 H,RAH¤É”(‘‚ ""1„PQA"J@¥¬h…0¸‹5 Š,`‹vÔѸE‚ÅÔ¬X¡KX±¸Âd-46â(±¢Å4%©!t! 'ùw"‘~é,¥Üf€¢ÅZ¢©Ù I ࡯Ó^œ¼<òX9÷Ú{Ø«! PTCïKi-¦%ˆ)‰L°ap‰ACW †Z !@e•Ý2ÙW IYB56ÊE(fˆJM¦–EÛLÒÐÊM’c$’,î— `ª,‘`,ƒˆ ˆF+!2ÑH,R*ŠÂаX°¬‚Á`ÀYdAU*‚#]Û! µ”J›t“I-(yœb&Œ¨ŒUX,U99»¢‚ÁÛHäh h)m‹C!…‚!`Ö (ˆ,‹ÍÙ†ëᘠå%Á…bÀ ‚Š)ÅŠ °++*`5e¡d-Â0Aüô.²i i¯Ç¥ú¡ …;ýì{»ïÏ ÎÃzó¥ƒÏÝQ7çÖÓ*[ûý¿žxÙI€ Ö÷æ¨h¥~Š wôN⣠GšA(FƨÜËYÈ,ŠA˜JC`«"ÆB¡!£@L%a Ë ÈJ‚` ¢!£X"L$èßÎ×kÐ8d†53LÀD0-*6V¦™.P@¸Ê•¥vš‚ÈŸ»Ìæ(Ðþ, €‘ =ÞÔ2 ÁC³7R¨‚(]Q¸$ÀB¢Ç´œÀŸ <|»¼¶¯/~—6è±ÇÚX­^ׯ%^aõAµý~gèŸéEn@²‰ˆ8X2Á¢ÅˆÄLK'¸ 3 TP×AH¦Z(,U4´L¥?{L” ¥e²%$PPxP±"Ç3 !,•TDˆ’ dTI ¢Å …K ‚–BÒ RP¡%¥-. Z˜50¶+‰IL ™HŠ…²‡-ƒHVÀ¬Xˆ3M5LÓp…pL.4›É‚¸†Œ¢1"Š]7M%$ Bª¨D‰t&CŸ¿âo®º56 DdÂ}fÜø¥µö"ç?zOj÷ó´ßÉÀÕ}”Ò©]|7Ü Ò€{Ü÷œEPµX2¦LH±ûËFÅÊcJ ˆ”%)¤&’Fþ£fÔ¨ˆŠÆ”XŒ…-š52V’¢ ˆQ ”–Á±±F´8 €*–c¸†dDrÍc‚s18­-¨Œœœ"&`¦Ú°F*–`2jìÐS)Ž@Qfe’ ƒBËJÚËU 1‰,)Mª8R¥Òª”D`646%É$eŠE˜0ÐЄ+‘X€±bÁ12SbŠ: H-¢cŽÒèˆsçßÏ\:í‘o’H… “A3 ÊŠT©)AAF€C7rÜ…k2ÐY‹sÒmP¤Bnf¤Tøý>½u+å{õó”SG8êý2BFAµ­`ŒRý`e”‰E&’•DAE™-Š(ÄQŠPjFÈ DªŠŒXЬ0UÔeKhPq„€ÆJ„ÈHä–Í-šVŒ–’ÌÃ%TÉ 4ÀQc2• AB–†™k)@Ëf AUb”¡f±q7is0ƒ5– ¥%¡Y´©ei+X¥„@C X*€°TU0°¥ŽÐ¬ÁeID)H4.¥4…ÕCè%̺f¢â XQ®²£R†å  8ȹ°®“ BŸy >á"(zߪõÕ¿· ² PPÀ†ü]y´µ2náûÙä “~©ûàKÁÀ«€yµt¥»Côª\®ì¢¥ÑAKKlûLE‚…–ŒAJÒ‡Þ9„hi…™( (%Bµ¡ ÊÌ0JÒ A¡(KILa2`!Še’h2C2 tÜ ´ÐÂ’À–ÁÁª°ÂF±eb¬P©PdÈ[„1irÁ­ |>}[ õôñ÷×·oO!hÛo?´ qì;(6Š¿¯×äû…û‡ëÕ¸¹û}Ñòyo€?¦‘B‰ü‹qÑ‘„ˆH!D?p´É©Œ±¡‚–AA MJ© P ((¡ƒ*†*¦[?¡jŠe¡C†a‡ø‰ft”b†A ËN(†„ØÆäHfšV"+K Ô"–ƒ&™‘L­=ÿ¯øNÂO<¾LTÌ( RÒQTRQ"ŒŠ4ÐU3so*ó‡µ~t¿• ÷@Æû€›ËdÄ¿Éô€²¥‹Û>Ù ´~Ø)“5ÂÛ´‹B©á˜†îŠ 5RR1£CPiìMV,¤¨¨¸”PÂЦ™Š)’R²FŒD2Z I¤°Äºi GÒ£@ÀÌK4À4Èî€T ¹@ÃAf´H•°UK©P¨Ý"«™h¥F#tÌÊdÀ3¦CLÁE`—F–e…A€ƒ$aQ`¢– Õ.Ú"´‚”‹, ˆY `ˆQdaqâ×1à‚®F šqôÃ& ETŸ¬*&–S~«×æÜjÿ>dÌø úƒæÀÃùÍkÞ2…‘{QuÉÿÀ„ß_|AÉ!$ïôòÅÊf-P©=˜b"LE2ÑÌJd@- AUVADjT*!?ÔäDu’(¢‚ÒK4µ‹ mH&R\¥‰‚ œ3Xá ÁkŒ°€M$–âX3%˜ˆÃ bdj%)iC¬•&)!hLÉŠ®B”…´B*&&™KQ«I²Ñ-"5‘MÀ¢ã ¥±ÄQ 2D,–U06ã¶RXÆ 1¨ˆÕPBå¡¶6 ðó ÍÌ$ÞP"J6˜@aa ho€O¥ ‘O%CŽÂ6éôòëãíå˨EÙWÃŽóJyÞÅ®€òTNîbL}uŸ¥T="¨pùyYB@ÛY@g‡j)Ü ¢)öº¼¯¿~gð’…Y`'â•™ü–Òc.0ŠB(Y"É ‚ ƒ&%B[A-¨¥E— È¥ ’FśԭÁBʨ䲫R‰2i†©Q&L1K bŠ,Ѧ6e"PSÅ‚ÈãT”ˆ’Ú %Œ%J"\`lAAAm×$1’Œ0¶ R$©“3 Ó0Ĩ¡²C3%$¤²*a…r‘iiTSXTƒF ,† f )Bƒ²„Te·ª&\T¹cQ£[b.a2”ÀˆÜŽ˜D* %,`°²ÐPU.…– 3W$&‰` Š¢”±AH $©2 QŒ™˜Jfb)–’¡P¡eFÔ«ˆÔ²±B–0¶˜µÂ²C$±,H¢µY`ÄC ¨¨˜áp %ŽD–52 Td¢KRÀVQ)%”¥ B)‘(ÁQIb" ‚‹’Æa2ŠˆÄ‘‚b6KJR„²6Ñɉ„™e˜Ð™ª,]-ˆˆ“$»¿ÜsŠ"‘DI›ÄlàZilYK@F,X í(Ȉ2É  ³0)…±PÀ3k°¤Ä[ˆÇtÒJP± ²±f…Da²¥Âbt˜-±–…“QH"ˆŠ"(.Z¤Á`(ˆ‰ E++ *ňÅŠÑH°X«"¬ŠH¢±#ФР"$Eb"ÈŒF ¸¦ZÐÆ‰€Úآ䥆2¡¦%™±°,P´0J!m(É+ù‡ðïÌLèZ™ h$4Ý@SõÝ»÷{"œÐsêzç¢) ôí„„ŒY7ÚÐòÁßë^¨§?±:4ø;QŠ %–Ɔ²ÚRƒûŠ‘p¦Ž2Ú\ÑM l§øç 7H¥f(Œ˜[œ%´-d¨A&›j[e)8­ˆl’¦’L c¡¸«»Äјu™l-K¦SĆL°JÁL¸IJÒÒ–[#·#ˆè%!„(Ò¦°ÀbÄ-j dª_/.2x)kïèýÏŽÁ6)IZ”>0\ùw(,„R ……E²Ò",PØÔX¡’R‘•(bLÊ §W à(RÕ$ƒU( àü­ïíáÝs*xå–;e~ÍK>œh ‚–¶¢iP‡Ó€²_µA£´iVÁØ ÑJ¿]µBáTn[„©2[02f8[­Œ†Ò^ ²–mUB£JAb¡б?’(X€D0ŒI€²4C¥æ5šÒ粂»0DE8^BÈY€©g@¦`¢X±I©/äIÔ|Í<³î‡l.þT”Ù¡ä¢Ë="r‡¿(GÂQ… ’ ˆdYyŸtôZdX‡öÛ‡Þ¨<Ý Ê©’L,Æ4(´Y4eÄÆ‰(”])Y„ÒÈÊÆnk‚”2–a˜â´"!K`Øh c‰SeŒiˆ&Ia“ 0¨¡L¸Ã-5–(²,¤a%EŒ`)€ˆ’1,Jj¤Y²éŒX¢‚̉Rª%²Á `),¥ 0Ü6”€(6IAQI °ˆ2Ad ¤$¨„”$Y$Æ4²ì†‰º lp2–iq¦L3 Vd™@PÒ”˜2†:l7"K)IKH¥-aBl¸™±™ )Rˆd–†L±E4þ{óbÞ¢M ‚h•E‹„ª=+¶·»!o—gÈ·°ójÞƒ• æ-ª6”Â…b?I„“Œ@Sþ;x%á8a)6DMÅÔF (M€?È(S,š…02–H£‘@U Cûÿ§ùÿÛÿ˜ýký?Ü÷É&öÿçK¯û¦.‹Wí´ÿc›òãZß±™òwþè®®’‘Vs•q¸Käm‰oˆÎ¤“”Í(ždÇ./[iÎ=o©Þ窌CšcÏ[‚ºÅ-¾— ©y¢Šß7ÁÞìs.ºÖÆôë3z»CÖ¬îúÕ<žÙr®éÍ&Ž•›kÙTÌ4TI&mì®MK[»-•’£LÙÏ«zvdyˆ…ƒ4Õç]U¸ƒƒó³¯œùÎÖç~óÖõÿþ?ûøˆº#ÿ('ý`|ÿ½x‹‡[’ ’ÿ¼ÿâ[ýqk’*¹g5‡pë q91• i—Z®¿Óïû~ƒòýN;üáÈÙœý6­» "S ~Ù¡ïq.q ƒè$÷{2ZÎ+æ’&ð}ÿ?š'ùA øAD¨Á¿¯›Ùñçô .)@õõùóïûÿ_·í?âOÏÛÓûæ)?ÇcþJê +M "â›—I‹þMª{T‰ãéñ!b¾2o=p¶É[0šò_h»ŸH|k,–g{=ex¶ONƒ›âG{£^É¿‘ûæ*nè7œGNÐ?c¯”’ñE*Y_Olj[.L¦…mÞI³8?xúgâ‡EXkZ¦UQ–i9cŲñA#N'{}½ú;í”ñO™‡|LäýÓ“Úz cI²&7!Öò).µÎ5(Fól³&ÞêpŠÎøF¤ºÉÓ´iÓ¾>ÎO×~¾!¨Ýöîøf…–\ýÊè‚]§Kp~x3‘Ñ®ÏÖcÅÜ‘úï ~š¾/Š#_™ÑmEì×kY÷’_½omüŒcüûôÙüK¶êø÷Ñ>PÅè?¯ôù‚ KîûñWSÎ5¾¡Ÿ«äïÆœã¯¯—ç·û?Í !~hó ?Å…úÁñð;{ý;¼ÎÞž:ý«õÌþ®œÎµŒbÒÉHPÑÜ•{5[Oç?½¼õÂÛõõÛ [²«n=v®®Ãñ?ðGú{¡Cð ~¿½ä^áùŸœ±ý¾°pHúvùøÑ)áå>ËÏS5?íSý/ö,±ðö m?Ø• ü]Ö¼®ÚêñÎÈx½:ºª¦œý þSÿ0é>3ÞÕß[WÊŠÞjŸéÇ 1 Îüf“ÖD )Ô¹Æ pGÂÂC}Ëã?ÁŸ¡SÁ=;ßy B@‘Œ¹Hä«oœ]çjz"܃ÀDɳèmj>§.2LÇL‘zâÑ*ÄïÄ2š@ v¹0% Ä«”RÝâ¯ÝGr4¬B¢Šßb‡X®‘ œÆÃžg¤×2ë¨å•†Z}&?{ÜZʧÒ)½ß‘æ–}0ÏoxæœÌFtSÐHKq ÓB˹ ‚w(6`n0Kë ˆ *LV DûM0ÀÿOüú'—Öu®·ûO—þ)M¿Ôh?L*—®å„ûŽ<}{=>?|ý=ýú³öªá«üûTùi>\>Ý—±Õ½<>ÕÛÏ:¾¶ûK=Ó¶õ’q]ξW¢\þæ¿ñ´~çÕ (Áú„„ü­”3û€øwðñͱÀ°Ó´BS(> ÿoã$û/ýÎ`þZS¯tD?{óÛ³ÏÏçáŒW†³òÿÿSqD¤ÄMý…å?ÆÍ·¤¢Îÿ½,¬¿À¿ÅÌK,É{ÃT­'üà`ñ}°Ìý¬­ÈâèëŸßþÑŸEù>áö}WÞÛ[Õ«©4ùóæ>O%áò^ï×ZkŸSû!øðTžAsÛ#ûÏ9gOš›)iÛóH,‘UdþŒ‚YAµeH¨‚'øý ÿ‡/¬Üm§÷Èñ`r¤ÿp¥,"[-׫êÆ>GïJOâöØPŸ–w±÷ÿ(ÇÝ:çç0Ь’1„d‰‡¼õ{k¸u*à;±ÈSõž^ËhYö‘ˆƒu"‚+‰¹ú`ì¾ ÐöÈ9lçÏÝ}\nXµ 'Ì>ìFLDHLa ³aìná7,ðtŽ(kÜ$ŠòÏõïA†ü.âÉ·ëGÇÆîø²ˆÙDŒ$%dQHEQPH®¥"2,HÆ;l ‚²0$„’£D-j*?Àƒ²9E:_ŸkaϘlGã”;%™XA¨²$‰A‡’XQŠ(,Š  Š ÷ P©ðOÉÂàóŒF]È…tü|:&ºØ$ $$‹À¥|À°ì¡¡;‚øƒÒ>p§p p} y-¾„<Sž†€„äâÄ!ñ ù§AÁ5“’Äa9ÿ•Ç·D¸""n1B¡öü'ýð€Jˆ‘诟æX™Iˆ^¯iVµîü°Ÿæ-¡e4d„¦Èe.6|Ê)|¼BòŠ¢‰Sêö¼Á#´×Gô°'“‘æ¿ö›Š-E¬QkX9 bùþ°‡ãßçã÷DWÕ ©Ez’Šôät­[.D:C`̧óç_ß#4µîÈOÓ,†2)@X ‚ ܪJ’…‹;}ÞZAöúÅ)À.#ݲ- Æ£¬²èÝ$D9‹GŠ.×øWý¥•Šù…1*¤iQa r ™4¸>-"“)Ëahá Î:=òOö‘UcDDTUEU‚1`Š(ÉPPF1‰‘ˆ*°UX‹XªŠ¤Pd„XH ‘„„ ¬‚ ’ !(Ä;Æ„  ¨ )%ÄyX¨ÆÆÃ˜Âóïôr)§G¨¯J@ „ü÷Sÿ'"¿Þ;ÊóêµXµ¥¬]÷uÖš+Ÿ@í{Ó!ùh‚÷ys¸ÂIB)¹ ì ŸP;;·ŸüÙkª'ʸ.½cžøzøøgÔ4MO%|˜FF!úÞœpÝðÝS÷7´ @T¨ž„j‡ë0²#!ÁŠ(¡l↘$¨ªÄAUbÁH°‚UE I "H¤ƒçÊÒI(Óàþ„?«ì3õ íŸB@‘«\ì^Gìl~pú½–H>¨n`¿ ¼$5&ë$ñ¨‰ij }"Ii6MìQdÀ$(êÔ„‡àgš,Å»¬Pob4ÀLqE<|û¸üá{Bñ´*2>!Ú.ç{Ü¿DË3ATPUµvÀø¿íÙÕÜ—¤~žôA‘I ‘"E‘B(,PXY   ’-øa90ÌJ…$ÓýäÙæˆ¢„+±Hµ¬I$}WþN?søÚªZœý«#ò0D¿??Oõ$ ÈO¨{s72 „X,_'Œˇk4QrËà OE¿ªˆË›ê`JÒ´xì·;@;Hq,_Ù<þjTªþWgÓÚ ±õH=øÿ˜6ÛpÙNÁùˆŠ?¥Q!E0÷sÊ$4ó[Ž <û Ûáž¼kéÝF-øÕÉ÷¬T>“ùï í:OÚ>‡ûÁ4þÖ–_TXÇ1ÙÅ.,B"JyØŽÐð·c¤+®Ú²a½.†Ã´ºìšÀ"Tú¡Ó›¿CðJÿcá³ZC/ vC‰z uá‡@Pλ 6„UK ÁÖ[Œ(Zu‹ŠÁ'Êè¶G¥¤r À"{ú2qž˜=Ú>zž°Ô=§·VîŸO´»Ù“(ÖU’²×ãΰùë°nÒ»3`^ cÁ›’×”˜£MTÔaŒUìƒcWRÆk¢ÍÆÀA/˱aµë=LæŸàÏŸÀT2z ðÇóžaÜ/ç–¶N¶'âóÄ‚HôCœÍÀóµÌ7êÍ-ðtÀüž2,‹>¢pl» ˆž‡ëXtà™ $‹D?*YJÒ¶É `irpè\@ƒµ X(H`Àpþ¾í*t~µ7REçÛÛý‡@oýg#çüƒÃPë‚öpPÝõ tœ}W¹Ó×ëɸv‰ããü@F*ÀU"DDT‡è +Ϻ!@F „BBE $9ÄhŠ2q}Ñ¥4¿tý¿Ëüÿïþô_÷ªßö¿îA”?ôhÿ|ßý?ØÑ¥ŽZ•½×?Þ»î«\Ýhî8‚3ÑY²Þº™ÉºhÐúZçu*ùâÊ Šêç:6»´‹6ãIO!ÁòHV{°É¾ë®¼ÞcYÔ åùqE)^L2ÆÛ·e.êºà·˜ØN¦ïƒ“6mJˆîMÞ»!S­–Ý1šq!¤;Ì ME4q7˜ÔÒ®KHŒË¥ØYš~k»ÛGId~Hö¾~ßeûÇH  #ù ©†ïD²Çðϰíîåi]ÆãÇîüÿýo`ÝöÌßË{ÞØÌ¾sýUGáÛÜW§Âþ—öóµ|7ÇðáÇß…µÆ¾Så«ÛŒÛmN…£-)ýä ¨ö½"r¬›N¯—ÈKÔBLžéY[W¼õ9ÙDÙÃÁvؼÉ=H2†@ÎÅù/•Û˜ñ]ù7¬ ÷'TÇQAk)–ØëêäMkg¶ó{HäVç¹âNÏ™=åI=F8úßY |8£oxÍÏÏ%éòinêÒÇ Ù»µ£$)/b=6Tò¦L¶dçfpÕ¾Kø½¿sŒ…]7ñÉlj h‰`›¸Ï}¤ŸkÜÊazW!ÍœÑ4)–wNƒÜ0Y>øÇI‰VÁ4ï­d‘•'ãr+êp¢ Ïɼ°ÈOlè‹9Aß{‹àZ/¿q™‰3~ÊoSàâw,|g•¿?Œù&;ï}óx”‚¤%–Uì*xºA²ý]óÞWWBé÷ÙöG'ZÊÆé[ȇ—µÎŒhÛ˲b}™?WÊòUÚŽÎú¼ÿÃi¿žQw«ÅÝÃ|˜jÑÉe‚9›GÅlÙ#ˆrNÓIó§óÇER`ülÄÙ¢­/vJ”"^a=Ôõ˜á@/Q­ëJ7 —GÒæ}åZ6'8N“û‰deí*~``ÅÝìŽ/ç´ºƒ™x/Vsþ`´ú& ZÊ ê“eæ•ë¶ÀÏé6gõnvì–Ÿç òŸ>?µgå›8ª?•WÞ©Æ-¿1i÷Úø}û,=:ë½ ›lFfaÍ¢¹C¨Q&@(åØ-ñA1D!“¹2ÁQ žŒMcBö¬HhéÁ%>ÄA!vµÛ˜¬“)3cç477#ؤÀì‘× F S¦‚¥Æ¦4Ö÷Y;mއv;æ_«P,í¸PÓ“FÅæ±F_e]3ºUœqï”ïâÎmç† ´°NË– D܉¹ð2q!°`\Z;—l\.­­_…K^Æê[œÇ‡½ôóí¯¡ïií]ü‰ï_pí*ªX®ƒ¹à<Á =¢LíRôTmcim”bѰJJW¿ü››Ñ(Žbè‘D¼ÄUL)) 0‚H$A@BAQXD ÄF ˆ¨Š¤&À`rJˆ@°´ Ð)xÚ[ëG]¿.F·û K ¤KÓßfl(äøj¥BBÏo3·ßåïçãéµ[éöǧ¶ßð“%ý]Z옿Ϛeç\?ò,™·—e@˜ ‡üGOà÷ͯñÿ©ÿ½P)€Q TÈHÏ­ùõì°×÷ôaå~½Æ•üW,±þOâeOoi NTC›2à1Î}'jé~Èl·~á,å»ë΂¯ÌiªÝ;IEdÛUªÒlÞʱÄi>dÇQ­H´\÷‰Fï)nÛ¼ò£ßýô& ƒq~>?oκKóç¸úÅyõó{×>\ï›Ø1ŠÚ[Õ>ú*þg¹wö'ጟԜH³­ÌÝ›»vìWJ¹nh†$2LaHâÿGúMŽru¤¢ìB½o³Kî¢2¼#RäÛî¾{WÌœªÇé«}nÏзåy_bc¯zÚ\ÔµD™%ŸÁ‰/–súíåÐÀÏVV£Jˆ©½ ‡÷5î˜ / P ¡g–èóAl®kª¯±K †ÐкC˜—%) ;\Eñ¡K ,ÒyÚÈx°@¤õFC¹d3v/ ò û!Æp:ËpD%¼QÒxê¥éTMk¶;ÃÛJ3RdE‰³˜¬û§‰ñpç;}¾öõ P§ÐPú}”"i@™M6tá„9ĦG›µ¬wî'¡]ÙàpUÛb›¶þ¢ûsê”û…v"|"ÄõýK–Sb0€†,·°ú }e¶-bñ•VID?ÂÁ‘˜ÉBb*}ÆEF­AÚ9hêfC­ÌU>^RzõúyÙõ÷Ú½?±,çü+=ÊQãü¬ÿËäŸå}êùŒýC¨Ì9çôsGw¯ ç¿y?Ø=û®?¿ìÿôôâ—fö…ÌKâÆ÷ñTýQm÷ÃñªhCÜîóKõúÖ$$üL(qRÏ_bÈþíÓñ„ŒŽ&ƪT9ä¨Özåÿ¶?Ç!¶¤ª ø)”ðk~w™; ¦`@.BIº³ˆìî¾Ó¿ñQ.$#‘BAR‚CTOæC’L°¿¥ b«”Ø+`æh¼Ãu:‰¿ã$„Pwì¥B’Zà87¼r:f@O?=?TÏâ~ðcµE1ÛZÜi†ºst@ØÙ£½ávRX"–…t%Ëp’YnAeH¢¦•»e"ÂH¹”`•!ˆ±˜Ú 'A S@d§)[Õ Ø¢ð- FW'ÃãôŸ^ÏÇïöúãðü6«UÞK×ü­ŸÖ¿æ¿Íÿs5q¹Øà¡eÇ\’ß3ÔD>^‰/*´ÎÁæìÏ;E–º•ÎZ¤k} ‡F Z=¡oU¤ï*8œžÛ‘F‹N”ÜTw.&¶}Ó‘†Ò3ô¥¶¡äµ®ç®uΟvÕ—éJ&å ™³.ŽW ÈÑí軞iЬ-9´Ák} G§*é>dù]¼õÖ-áÝ‚,ÆžKsRh¼Ûò"È“QÿKV_²‘0ôŒt½žw5ß{ý/« ¢$õ³?Ù仳ñhºDåü›!âÊ›—ºÊ‹²ÆÞ5Û‰ïWsÀC9ƒRñiO=–ãYžˆÎ…âÎóÕñ1jwå`FY;ΠåvÝÆÔ<=nZ\x¦øžCáeëf¾& |ñøkÖöëfý"dÚïÍDÕ¹Ë_v‡R„SãÉx²:‰é3#Ñó“1Þ1{].ß©q­œ”êt‹¢šHcBºDé¯Oδ^å2±yuã›á4W"™wénËeo}ï9¦ÓÄä6^à^£å7”‹ËÄév|”Vˆj»:5&.mÜÔµÁÇ«.—rÅÀ[îÐ)/öÙï‡ó^×Wãü´±ð„·ÄÙõ”&•9ÃøVA¸ßFgf¥ÝŸ|y[3ÞQzcR ÔÇ»ä ÓÓ P“AÉröÙäV|›Éߌlµ“ö³¦ãŽ–²vNgé1$7ãÏm2#áÖŠ/›‹&^sŽ¢Ð‡ Þ zi2FA#[–ዉ²ñl«¾@e‡šOtüTÚ!µŸOe‰óšÎ¹:¯l"©p·~GÞ’ìÁrÓ½ì˜ñIª>òMΣdöL\!îÝ×;iê®ö|%þÂ%dø¦^¤:cD÷ø½F>I¦­v`y<­~ýÏëô ¦ÿ3õî÷;´óλúßêm4ªù©\ÕfÕ­ý%}FׄÐÉ÷öé´épš·å“—‰âÇÛú'õAea'éÖÙ+`"ÁE ˆÂBÔ‡$*[)f0ÐI¨k*C‰YVCûº¦¤ `[ ¯Y¬ˆ’t5_ä3™I@í““¤’²)–’ Æ ²q€hÅ"€VPí±œ@½a+‡qè@èk$Ö@FÀã bL!.Ù4xÈ(UÙ;&ëP´ F˜:‚ÑH-ˆˆƒÎ(Æ"¨"ˆ2dAVQávd¤2A@ D –0d(sÍæÝxJBÀ5•”\2@:À€„¤”)2Ã$:©%&ñž$µµ qèÀDNua;M™¹AÑX4]KŒOxÈ q4±Lå .”![L*An®¢T¼Ô±**'¤!1 åćŒ’‰vÈaŒÄÁ€èqBbX ¢Zua–>'ñQRvc;”Q·Ãáæ~É÷þÿŸÃ“F|oëû, <Çö¯íy¡å°«Hæ“ò²¹hwyΓz”nÞw\5u…ëÏ7K¨åYÈÖà‰{Þ«¥¤Jv]ë§69¬ô*6Ÿ°S}ÓÎ_ˆI:Y¹w2$SdÙlµô—w®«fú6dIžì1·_,ÊH3ktgªÏ%wuv§iÙeªÊj¹Ù*˜'ªÑð¶—PÎ8¹{¡Í\Ÿ^T×IÍ•ëMûšñ¥ç~~¿'Ô‰$þµ¬,Fè#h)j(P‚b†”o”„Qô€PŒ„B”$Hƒ$²“þ:Wöxr1BjLìHª–¨ˆ‰FéC’aJÕXå eË–¸•J3¶ÉÌÁЏZôµ£&RŒÞŒ,ê“<ဌS–ÛxÃ:Á6ˆ4HªW·0¥]Æä´«9l¨%² jËÐ:‡§d‰F /³D,lžˆ9"ÀÆî€›éyûéÿ—ºÛÒàüûý³úýþÿïëñâôNHTŸ¾vKêðxÌi=Æ•ñ)wÜIçTs­ 73?'A7Ëói=x$F·t7nk¤¹Ýdü]!q9V+.Õ¢pýGÌŸ`Œ t慠]&Rò]uá‘|IS-“QuOĶAùä¿€ù­êy ‡7¾Ç þLëCè¾À„ý ?Ò)ú·½}ñ½¼ÏŸv¼üLÃÕW×óùÁÔЇò¢¦õ÷¤­aöƒ×‹õš?^g=ó›Ûð>Ã/͇ý–•üRGÇÎö&a$bÉ!!ÄŠò›ü¬9Ë[˜\ p‰*QYŠ“rë*¶pÅë¤Ò8À œ)?ª©I„Þ˜b*N‰ÎØ ÜýÚ/ƒ^SåôûKðáô¿w哹"lê³þTj£)ìôã†j½Fžíú¦f›ê¹ssqÒåÖr±Å+\í.Còí®{r•EYjÝ?9žÒäut7g˜ÛîR‘´»Éì l;¾mµ=ß{­+mCQlqÒ enríÂΑu›³‰¼ÑeX>÷'»¢ës£—¼Òž¬wEÈ)’ŽïK Nr|>o2­3´†…‹"8kÉk±´ÓÙwòˆ€x„+$PcïDÅGói e"’“ûÐÄPé•XVŠE€¤‹XÉYd’1„XL¶„F@QaòIX*2 UE{`AT‚‚$X°QfòÀ1€°‹,’T!FXM´ƒ‚€ I*Aÿ•øÅ-ž”©´©û¢âÔÑj $H°‚Á@1¥°*,„RHŒPGÕ¤D` ˆCᬋ& VžÄ ¢’( /ôaðɈ,ÊYa%@+EIª¤@ˆ:‚pŠb§ã`(Ùöµ‘ç¹gV> ck r\r^šbƒ‘¬ hŠV½UKî(ÔqMÖ!x ¥é}1V¡È”P¦f)IE nlU¡µ/p * Mõ > é ELIB$Á‚¥·n¹"ȱE‡¶Q¨fQH…·* À%>èÄòðLTšZQ*E!Jßá/×Úç=nîÃé™ãX³ò÷ÞMïë×ÌõÔâ¢/Y—ñá0άª.*\ ‚ÅET‚R*‘dõ,ºk,@ìÁ)aå=åë–NªxÉêBÒ?”šÀSZøôœîž’cC­2vS$GM AE¸"œótRùâl^t&¦wÃÝæÃþrª|Ý" ÈH„ >–øzû|méëñìä_Þ{ñÏnÿŽK}Uó†û*^ŽÈtœlÓ§þ> Zá…µ•uø–Ùêü/‚ϲoœ¾W|ç}²™Wßo,©¹+"§ÐRÙ‚!²…2öR·iÝ´~$.lÜ®MQžLÞü’Oå+ÝÇ ëÆÍ½/ŸH&;Ý7‹¶z£Ìß¼Iå{œéŒç§Ä¶ÝÆgUÆÛcÏI5Q¶²R’‰1ë>‘–ü®J;Îy†Š‹F~ñäiÓ¥Æ1b Ü$S÷ÒC&J ÁÕ§Tî™Êw†ÄEÖ+¥ñt¼F^ žÊ&Y*}žŒ—V- Aϰ|!’2/i#ÇÝ™‰â‘ü¾šË{¦Dhq¡ä7~m7ßqú£H½SdÐRî¶`´{˜Mê|¼-²Bꎎш×È;˜OhøöCò™£…Á3ÔÓ0ç\³ŽqŒ™´›ÑÞt-Ïò~ô¥’=F=ãÑ.L¼v£/~÷#T׻ϛ®œ²-»yT¤²A²h ¤6Q£ÙM™—zTcí{Ú^‘x>½k|î²}¸9ÜLÌú;êhÙ9 È6ß“eeŽñxIlòB˜ö¶žuëÉ|ÏÀ—@?˜Š*þ¤ASú€ ~ýŒñßÏŸ^gêßšÆ~½}üãn7»Š¹¯ÙÅßàOØ—´`Ê ³´írUŠ?n'|zsÉssÕ}|?Ûå_ßþ¿¬û{y÷tñ¿—‡•xÎïÃëõ<¼ü¶Õ{r®ÉË=rðá8uÕáÙµ¡ð:»½±ø}Ïøzó¸wüõ×Ý];ë¯ÇÆÞ|OYé$Tôg¼h~‘ð~G¯;‡ø7düKþ`=O#¿Ë¼–òëë®tTÛËåcV®åñãñ¿/ZöƬmþ¹·9åÀ®ß üçWéo~°òÿøȤÿ„_±òGðMÌb%¼”ÉRªªŠ+ëM’Šir:úá㟼۟ò)Üþ?NŸ+|+Ôîö×¾¾W½¶øN;y¢‡yo¯¿V¶·ÚvLNϰ?œÿ>¯Ñ›Ê„f ýuö¿x“ùðÔcè°íN ‰“ÿ B§û„@„åã«zâ¢B"1@=íH‡Ð;|=<Ž=¾œçž5<:q= ¢ª+QUPPDe¤©(¨ DDEbÅbÆ$`ªEc#Eb‚A‰2|úüûÌÃúÿ[>¿{òOã¿-îõü{«|­‚½f¾?…"Q¯5êmÎß/óaO¤ýã\˜ úÃìÃÏ `+»ŸONÿ×òÍïå? ?Ëÿútþlíµ¯ B‹!ÑglÍ¿âÍx[è´†t²bž;üŸðÊžþI>(ÙŸÍžñô=—þc÷¡<ÿ—ž“ð ÝùD’Ay@MÍ@þs€ú‡Ëwù[@šG¶I öwÅüÎÒ7€„CÛö H,‰'Ûz˜Ë bL µE´Âuüm þ fýQm-B}£JaôCïêOä2@`@B:Ec?6Êd0ª/­-#h'½'Üÿ©òi9_Sêƒd7 )»žÓŠûˆˆN×èüP# È$ŠH°ýÿ±Ó/SÕ7âýÝ‚ßðù˜0„¸|Ç‚ÇÄõz0PžcÖG׸|b” @OŒZ 2 ›’÷ôòPä…#düÃ/äýSMÓ*éc[6*— ¶›ZÙVãôr}ûyH}ý›CØsƒ€_›þØûq'»ö8ÖìCkƒÕÈJÞ™÷€Æ,€HÈ0€nô/]xÚ™Õ ZwÅ0>M×sÊF§P¹„JáüyUUÃ{|v×7+TóüG>JŽY ÀÛ" 1 )-ã›$œ5'=Ãã;=Ë×be“îu½hTz–ª X–Š0M¡Š;4KP]ù¼@rPÞ›)dÙl>ùæœ*imAjçÉÚï7E5ˆ„d‹,"h’•†å¡q L¤Ý{™D‘¸§« 4˘b½¹ âƒÛ½H›Dà(·ù$Ñ&  jôйëϬ™ãh¦•u0[!Bh-*’VJê!ÀkÊ7ý—x ëå†ñŽ>´R‘ÝZ ùy÷Ô”CÅ—ISô‡Kôö¤= 6κtlKi­Þg4^„c¬Ð^˜ä¡KibSFyͲSŽ3‹Ðk,c!UàD;T²8º|èµTÎ a8Êx"^ƒ^÷“C<æû’WuGE’hÐ< P_)EÓÂX!EgÊO4¾Ñ$:¤Á¦©°q~Pðì(+ÝŽ\·çíqü$îeì°®ϰÃEWm.øz9×\ ³¬aÌ.€ža­Ü!›ÔJÀP4|Ye)BÍ8ÀâړѧyÓ~epûë§õÝØ$mà„@f˜!0˜q÷˜=[ÊgHW½æÃ{¶lñ;¥Bß¾wÖùÕñ ®yš×0iåôÞØÀhÑŸ43al6)K¦¦vWíkÞÞS³K¡^vnDDxœ¤d âȲ|·í( ¯˜5Æ(wª€°l«Q ’fp1\og…ö×A vêñÈõõ½]ñ¯Å¼]¥˜A…0É"UhgBO“Õ)ÙØ{4”ìá…%ö¿'¨b@’‰Ô‰Ð”…3PDc! pª£@®œg¨¶]8xönίª·WÜ¢UÕµ¢Ø‰(‚·kÐs2f¢Æ``k¡« ª-zÀ>kØ «˜G½ 3EÄ—ßµ»ÐÖªLêcκޔNç@!՘͎¹ú½'ôå(ý*«ê2}4¼ÿ(›÷Xh0æ^Í¹Ä .¯«VÔjm. TºQ€¯0Û8·©èB ;¸9¦÷À¸aMg6màp¼·JuÌS­"a½_Ûó=' Ð÷äöFze°a&@m&ü ¡ ¯=…A0­ßñÑ|ù Ì{$# A¬.óáúìØ?€ãGõ:þårëö?D1k+²Øš[Tý¼G÷ò¾wG+x'~2AŸAù ÷Ì ›#-z ÖÝF ÷tÔ,FÉWGBh#:K©B+3Ë$žWwß*òep»È©Iû™º»2œ@ [ø ˜ËôPñýòcZx%MƒìÒZs!úaXI÷?™Nr©"O1#™”`媕8*yâ«Cõá*²(EtŸ©Ûd¿ÖòÖüÚÓö½°F÷¿ÀúAý`=Sëœÿ(sãì{†çÔ’}Çå.tޱ©#! Ãý?ƒ¿—ãS ~3¤’I×áÞ¡(ê‰ ÚTÀu#ý=4¤SéîU0‹Ð'YÕÑë?èð…=ïÆmâàv'TàH)>öUO½ª,DOá$à‚ds©ŸÆÑýcZŠÔ¢ÞÈ=JÓR0ˆnò•½¬XúPŸé9xšø ¨U"R?³>|ÚßAöåÁ`‡¶ó5„ÜÔb´‡è†¾äÉC%B}Í26ã»E/ÃýßO]×Â3¾Þ;OÝ6‹Ïmƒ±$’Æ=t‡±(œqÿ`þ’o᪣bU©±kQfÂr"ÙïÇü2tàñm€¸x °¶|_])•“Ñ¿•üªáXJBæ 09´ÖM8ï 9OA§`Œ³©…sßú2¥׎սÑr$TÜ`RDd{Tõ?]l|?³÷1Üùüw1&qý‹™KZ½á§Ì‡†¡tz™ŠÚ¯.,âjÖæ ýwÃeÛ÷Z¦—xjëµÊ4 "…qdMÞÑ$Y`À£"ÆÚ™· L:"›J$4²e] 0$–¸,5›–÷x5aõP-ÕR= QRÇ#s&Üí{‘£k• 5¡(ȉ‡ªüTÚUF/‰ú¼æv9:ÚIçRS’;(ÉEŠx“‰‡Èÿ›ª™ÄÐøD*5GÚœV²¹édÖËöÚ„!èò7cî£hs² ¶Ò ]Á=)NÝ ž6Å ¢+ žIy(6‚4k Ó 2} ¥eŽ\Àjž•] >Zž Ýzçñ8(&Ëés#84XÔÐ-Ö YaXr€&"6aÓW(@àþ†aŒ`~`ï_…¶9@XÀ ùâ'¨\KÏ»_i^`Ýù¥ÐÙ×ó½ì¼#žñ¬ZÖ%SUTÇ?\<ÃóM*ÜÝÀTÍÈf¹Á›$ú9ÿÀ@Ð]õ>ÁÛÈ?moº­<µó-kGŽö᫤³G’>~]E ä’I$`š¢¤d H’uÓR<+w·ô’E^œÇ‚1O¼?L„øQUb̲Å"„{Æ¿!7;×JØîõÜO02)ßY¾(ThŠ„ˆB Ad‚ÉA†5&2J€¡TJ€ÈQ7,!H… :ç›Ñ§¶i µžÏ™—C€qˆ‡ÀÑį«uÄ‘dèaËïª9áNôwÒªHþ¬hðäÁx¦CŸwš~¹ìIET¢V¸_¯·7‚Û$*Ì H£ÌO=O×ÇôŸ—¿„sóA!‡¯-×¹ø¶T[°aô'YÞÆyÓ²QÀµ½³yŒ&ä[Ø¿Y"Ô«±f`p4](ˉ– ²Ò¼ ˜»Ø]xzâYxÑçnZU'øÂñö1á˜AÙ¶œ/:¹Ñ¥N„5»³ Î62 fLcŽ\ܤ°r˜ÙöØC¼]£I m³•ÝêÜÇ Ÿ­nïNÉc˲¤–µm.`~T€1:C©ëhŠ­4AZÖÔÓ{ê~n~W9Μ÷Ì™¯ff‡DÃRÒˆt÷ÜdþŒiP„Ìá½Æ6þ $è±5C¹åÚåÞkÍ??-Ùa|.)FŒP:“wž§—çCc ó˾Ã[h•Í|Ñ?ôU Á=}Ôø=y³á'bçhS3 dV˜p«ŒN0°Z6&2­O„Ób;vù,õL:VŒHË=^öaÖŽO ®Ôñüé?T^h `å»´ ˆvÃCÕk?+ƒf#“0¹˜W&uýß”ÉÚŠz˜´„‚˜XudăØúH{„ìǬÈAÎüˆ0 }üIÔ§y„ùÁ÷1ÈNêR{è.B7¸ñž99!æ ã™Só£2©yŠDIùdÎüX^?5u–€‹´œœ%^a«e!¶P(œbÇg@0ri$%z–¸†Ï𻈦Éç ƒ0¨â‚ÐO§W{5‡ˆ(‡ØþÊ+êl>F"#%ÏÍŠ¨ÄQœp99akJ–¬Iñùaú!:Ç;G °þýzØ©·f1`!lÁGýa ‡ï˜qT²˜ÊcjbNˆK‡{fÜšR€^«Ôr¼ÐèT $ 0 ý46Ev*‚¸í?\CƇì˜oø· »Çù="öµ €H)" ª¤‘V‘@F„ŒE[Ï!°üÍrùFéÿµyr¤ ¾UŸ_µƒã péð¼ë‰€² èy`ÃÇêAØXB>»#kVÃuÏÂР‡O¢/à8ÔáRUU»ØaÝõN6|×pˆP6G”Pê·ßd!Hx|òFBèŒFDH ",ˆ3ÐádÐ*D#æ/£ó)Šx*—r SåÞŽÇ~Mt| oøžjžÏšß&ÉB"À¦/ßû¿Wñ¿ò>~ÿáüúyû‡‚o?¤`ÜþžoœógµÕý2þ0¿ñ9Ýn­Nž ø\I«áLÉdº¶d…ÑÅäj£qz®sÿÜ2os/wq¥îsWœ6áÃ)O`‚Y¼4òm¡˜¤õÉv’z¦%Þø2[•7œè›¼Ê ïNôªËW:gë'Ndû:M±SNœ‰Œøú‡§MjԌﳼÈîÉ(gt³Ò½Æ·fË×—Êk{½§Ÿ­¼çváòÕ˜åÇñŒdÿ”±‚/Ì"! ˆO„¥_àD¢©"+RJ’±g!¨ALB Æ@+ ¤€Œ†s2’ âXY )&ŒÆB„"‹& 1)11€J¡%j@¬*B¤ J¨ „DI=‘òî)}ð)¨›Â’ tŒ…æÄµÅZIûƒÀfÔT%“Ã߃jÑ=ƒüÐýÿ?OûëÇ%3¢ýÔæI”ÑAh¹ã¤mœ·þ=dánK]ó —¸Tƒ¬eª‘Gˆr&Üo$"øæúe»?y‹Óä½™õÓ%’Ùtû'U¿*/¹×ËÖôVÓ`éÑu)Ìž|{òj΋Ëiw°[*)“ÙGŽüè/F6üÏ ÇÇ<˜®«¬•Ä_¹’íKE²Ê›T&$³Üé›9'ÒßLsÄéå<äÇ]s^éxDZY ²ŸJ&-±¬r)ýÃÙ{|âŽxC©ÊÂõÌx3Öê¶2¹vAâg; {î’fcMÞí‹Ä· 䎮¢ÜÔAd½g²·Eßr=ã¤éÇ ´[ëŸVソ:˜éœä Ë Jyݶ—i²Ñ*ž‹…ßÍ›øÜºzEw×÷;›Ñ¹%¨LŠÆ}iE­JeO?tºÈHK–eó§ˆt»'´åçÍ»jÏT=‘˜†;¢âS²{ÝAâ,˜M™Ið¨ÇÞøÔ¢ ®»ö¡T• ëM&‰ì¤¤ë'ægEoëO…¢5„ß~$hùª@">&lü™OˆgGÕ!ñ>dçúøKÙ<öK‰QâfÊhÜdúBûñ5³Ñ_ÅL–r#]Ç>Þ»vç~W¼Qèÿ@/ˆ÷< ¿¤@cù×~Ïõ<\ÄsÜþÿ™÷R÷þWðéoéÓçùÿ.6§¬õ5_ÆÞ˜j»Å‚"é~}ˆÚýÅM/‘»Á’Éݦaíbþ_׎~Ž%Rºö»çQ ×½²úbááÁ^Ìw2ƒÝ#„?z^)'ìÏZ,zï­ Å]Œ«pø^.Q©p½ãñõ$£Ç4©dÄÙw4Ýb“öapšò­>^—‰PžCÉüÞø¸ÝÅ4+¾<¹î{æz¶'¹¡+×vïÎí¿•ÏªÝ@}ÿçÄür®ƒ¤1çö¾³«?+C²½þè¤Sý£¿9±‹xpÑǬô<¬žc}BI$6½W‰ñ¶»¡!V}Óõ8¼HÂBi¸0€H°ícÿ¢_'m Ñ{æýrm]bõÆI¾sbuYvŒƒ !3Ö÷ø—~èoÌà‘’Œú"1y²7¡•pVåF;J%j8 #bª(* å©ÓbuCS#¦TU1›ö;`oC-]п\Â[ÃðS¥ÆDæ@djF¢0©>@ø?sÖl@~«ÞTÁ‰và Ž\É(ËqŒŒÄýƒ”(¨ò×tÅÅã˜]´Ç-\‚ÚØ&7»&IYTB1™Ì˜Ö¸˜‡2C0ÔY&J–£2ÓY$dI‘QÆ\jÀb]¸"Šª¬T‘QW7 v…Œ±Š¨¢‰m6Ê1ÆŠ9™¬Ö"E½Rˆ ¢Äte P±U#PÌœLWYb‰ˆX‰7pÈǪ̂˘J˜s3vŠŠ ö¥,â`šó • mUV""+ZÃ,«ôÖı‚êi¬b'Hr`T`ê6Œ‰ZŒEAs v˜³THˆ† ¢DRp¡vRÁI¨n‚Æ1EFm¶æ6’<£KŒ,W¦¢" z+Z²s%Ó+;$ˆÀ±S¢“¤Èò˜aCª1TÉV™.5ˆÈ̵älTTMuÈ1b¯MV ¶Us3 VŠq¬T­`ŒÛx†¦(¥eŒej ²¡Õ¢ÎJ^¬r˜&¢Á:»Íã8rDS«Eé—– )ÓÓ‚V«ÆÃ* ÁÄ(‹mID-œ¤ã‚ƒ¶£+¢ÚL(P0¦”¡€PHJ i…"$¡Šœ-ö wvʫЄ`»EJ`’ p@IU†Ë ‚IþTÍ+PH‡Ë%;ªT‹X©ü?ÿ¸òdK$,A2 ª;g‹êI/y-X6öþÞ`öØyµ«š TJ¢Ñ(»ŸXTçwè éaaÿ.‚™‰4nûù•7ðÙ¢ vÿXÉ’ÿŸ5{¦ý†Çú›º˜(Œv†)Hì±ìíþSœaœ¾¼'‰òMi:YSÃhà¡0tg Ú«_oŽs|ÂPwî ÃÇêm‡hkjwÆä:å/(gT§WSjjsv'VB$5Œ$pSL…£Ý‡ –º†µï óé»èÔ ‡!³Í·*RØÑËdÉlé0Wüè´ŒV bf÷ËÌÀçG*eå—o:‰¦¬¹m½iœy:S¡"HŒ3“Í͇ۢlŒð* Yê`Á'%æSÅJ1-ŒáÕ‡D Í&ÒL$Ö{౬”7T Ä#DYÆ ŒHû;L‹i(ÅQ*XA:aÇ4¬8ç ÕV")ÈCÊe¿†¸ÖõAA-—§ÊUd>Ý‘·ÿ8 £ß'û¢A•X ¤¤ø ‚͆ÙiJ’2–.ìi±,p#›<ÈSÀ› 'ˆ@7Áš„0”œ©û=ܳû³Nƒy4Úia†K„ãdÿaþAÀ0 ͶSýÆÚÉÖßl@;"¤lGd‘õóÇYG@'›Õ 0çïÇŸ{«^yw!˜I#vZB##ÆPûJ !“#¤m…cç”2 hUÒÄ,Œ‘Vw`- È&VïŽÿSº §Ú"PEHA„XÅAa#PRd‘dˆÈE€EŠCÓ ÁŠ*,P€VAa *X ,PPŠI@XAaX ©`§ÜëŸP¸£ÿ&ìM ‚DŠ·kUKz÷ÝÁGä ¤à«§Ûã!éãÙÕFN¨2HŒŠ“b  ûºBCvZV-£à^ŒÐh{Œ¡ý›üEâ3ïñÞ"F Àã¤>§§“)tBAa]ÆúÕ ®²RêP“ö¹”AþH-^©¯ñ0¶.ÆK°±ŒböͰY/àúUŸ5G¥ÎuA #Ù|`ˆbÔR-R¥9÷ôê,lÅ{¡ØÓY£¤"‡è.ï-€[ͱšÍ“SN(p¸“ú¾…”mä4 ¢O(Y b’ B!"‹K-"2b"ÀP$P‘I„Ä$¬bT `'„D¦7€PA¹Üh  vÜlí‚TȠХÍ!)<¡ä'áHg D‘‡ ‘³”)(ØD´µ•Š =²Ô¨„Ø|³hÄ Z‚}Þp̓@V–÷{À8Nå’72r‹„!RF›û†EµZŽ˜í-Ò»mÏJb&ê¬sôçlìèˆèò Ö:Ý!íûjYë\:‚Ä } ×Ä;£AŒç)ãÉ•*Ò³€¸õ\8[ÒoÙ"*)†¾Ny‡Î/DÀ>‚1™@ P)Èd$7ªdJðOºÓÑPNÃýÚZCrà>wð©ãjµJª¤¹þ+•y-!OÄ+È&Q Ce»iQ 6¡ÔIGýȉÖ<¬Ô ù ÄÛ¦ÀøÅ[HÙ„((þ´Q_šÎÝîDä’áOæÚ„‡ì?”¾ )L0i`á—a,&‚DDU=3üÁ¶£_HŽ„°GˆèGÎ/O64©ú¢(î{S?éßD˜—–‰U*¬]°–}ôÿ¨!€û¤êr·ÄbÝçð(N‡¸ð‡ –¼ìé$CçŸÕªpÙ6‹„ Tç`â Ûøƒ?ÁáGx:@ ºþíÔ»Ò‘¸Äò£NÏý>Wø þÒNAþλ‚ê§ßíù¾|0ÅPÐÁXF+:¨(ñ!<–H`‡¸ óãÉæ›»IhB¤à;K柰nÜÝ’çØOÍ/˜uÄì[ÿ·±ФP(„Š)"­E* B Ƽ»*à«,B^®'£éáÞY™ ¡Ù E;®#Ê“tïçÐ|º¸Ï¢íóÁŒd”…’“ w6=|^…¤”iÁïI¥’@‡ í<›ên=Èiý~heÙtox. îýIô¸lS"d«Â6 o¸YÑù‚~ßs8ªŒTDIöÿ(@’çþ’XPýЍJR“ÕK@y;ÝW=ŸECì³õ»“Áú.J_14¹·Ëæüá í$ŒAàç‡Ôï)ù‚‡\(}b¨znp ÂIð8‘3ˆ°†õA@ßG FÑ©P $ƒ;²¢"°ÅKAÿ1+ Îa"‹"‘rÚ­aXJȪˆDd"‘T+*Œˆ‚D‘"1Œ#çbÍ’>ñ$+ƒW8SÞz=ÇãqØa¤’Œ"XÁd÷ÊW`ò±§íg ù0âNõ"~V{@ÿ?‹¢ñ!Œ6;Óâ/ó5Þ¥k MŠ)ÿ?æÅnqsDO$ßElƒ)$õë”_† o W"j 8ù]ÇZÛ0xD`‡eÉBð‘#›”¤Z«±5H~G9ßR n‡úqµFIdÃÂdw0(Ép!4|x–úÕ.Ï7Q&üXÓƒ£†ƒã@@¯žd:À·èÔM7JŠ1Î…±½;5Á•Y G†2Qˆ=t˜ÄÁÖëõd)ð.ü'î?0Ä-ÙïD¸zéxÅMO(Ï­+ìý«›‘=à°|©ó’ Ø]¹€¨øVÑPý )>E«-ÔIË4œ”øÐQâ¢è~öNÈ%¢»ì´xÑ`%Ç_ƒÚŸï=?Ð$³ëè>nd¶¡Z_igø¨£?a…M4¤¸PæÖÎ ¢ ¼Û1à‚âð°¬:8Q‰ÀMDlN×à„!0–îN=m¾´ð.÷š`TCV &»Rëz! –QóAñSóý|Ìç燀· ÔdF#"+Q" *)PAB¢ ‹$"0!+$H)?zID`¢,~n˜Ò–¹ZQʘ±f9ZÜqȸ·¹™Ž9…Ìã[™‚4L§ü™$$Ø¢ˆ(îBØàÜÃᙣûœÓvà¢H `æA)7nÝÆ2`ÃR²bT¥8!‚úàR"‚È©Æ4ˆšSáNðµ j°s ž™¢ ò¤Dê‡S¢þ·CÄ4‘ÏLS§=ÉÕá `ökÊËÃ÷$žÁ»¡‚[;‡Õu<4DܧR(!3i·/ptq”„,?Pæ'®ä Ç’D‡ÐŸc &’†„89æà +†m-WnÏÁNÔ—ýM6K8Š˜8?•¾Cº÷ì{!¿/¸a•„…%‹K>ñ"TTIæÀùœ z„!hd0!`E"ÄŒ‹`À€"K…øxrP´wZ˜¡íR‚ÀÆì6þ…ã"¦ººp7ñäµj¶wÖt[¢Ç†sð¾ú9ÎønGV®W¤÷Äçh!mÄ U®AM)Îʦ†l5Mƒb倯 y¼?xŸ0ï¹Éñó†1EŠü4͸}²Ì­UNÒ£ó|CŽ«*Qñ¬ ´E ¶(†wf1@=µšœE>o;½bÓÄ÷îñ!Ï)¥ ƒG,@5H 1ªQ·EBåÄŽ‰ZTÐîöXM¹ˆ*¾5YZK º`µº?æ»Ö1xÑÔ<í¹¯Eòë1ÖvCïtFH8Ê{ÁHÜZrD9³DGÐ@ëîMVK‹¹W™„æ&^= ªWiƒ %˜{ )=“è%>àâÂÄÓ¢rå/ÖÆÝ¾w~fž®-C°®\ž6 mT)sŽ÷:ð´ ÃM¤àÓŠ±,µ¥ª¡Ê ¹BDù{j”ݸw)8/ÇÔ30â\–î)˜æàݪ'@Pцõ[ýGb]"‹ùûÄNÔ³;;C=ˆž½²CÚ¢‚ÅXŸV%¥´X¤¨ÒŒ0÷siLd2ðJ>‰ü~pé$’BCè9N4×èè›$"€’()„°ŠEˆÈ ¤‹b‚È X ¤€°„X#ÃÙï{w¼±TPø—ÝMߤ †ŸÔž¸úbH߯î¢ìÊc‚æ` wl$?œwàˆ—íó»1i¹Sv· ÝÌ`•e¡“X0¢ÛÐþƒ§\ޤ!:`lD ˆª‚6Æ$EXF ÅQŒÔ%b±•%B,Ȫ*h‚"A ¿È2#jÉhb ÁTTÒ& “ĂȌ„P…h ÝÂZâÈÅCJI DŒc2[A–IBDð2„äÑÁ$ þ† ~Ã+U%רsOï ~ÀV<³ãú‡ší¦A8~âeah` ŽöjÁ𠇻õ£Î»Œd‘‘æç°têð“åBR†¿K2BÝ=Šûú©túã@~7ã<›«Dóã3-¿·öܧP…Ÿ£Ž ~H©ÒDsù¢‰T2‘Ϻ$E5ÚûâØImè°Øgsò6ãønƒ¤Ø$‘e8D‹›7(Rðmߩ׳Uat;`Q:d,Á%#7c3Bo2U¸Jå¾ÕÙ| e•wþïàvÓÓÏs8¥è’Kw—reò(èèßLÅ­öÙÄ3rXÜ·w@ O"¦¨ ¸Å–*èXl €Ó˜Kçf$+¼a±³ÏzÿCëÛßÖË×=QP©*¥ù ˜"ޕѤJ}Ü‹`š~_´¸e® 5†™ìÎeb+“I“#%ÈÜŠÔ¶‹EKI@ˆ -Â]›Š–ÉÜ›³ED bˆLž@ê`cvØ"“ç¤ K© |âR2ÇLè|kªJs¸#Ý!YÔ`RÀ; C B¿xŸç0ž¼A}¡|,¶¢ØCÍ"À¤±Q""´î…êËbÇ%§â{þ0ÝÒ  T:éìˆ~d`޾*u¹ïæ´C€añª—í^³´„@!&çÆ\címµ¾AÀÀ~íG‡Â¯÷Rô`c-šn¦–Ó.!ˆ¥Ò†¦+P£ 1 >,ÓˆæOÂ÷d˜àŠTÁ ñW¸tN§ÏvÔ­E0éÙJÙô?ÇvÍHë™\Zè—s®e¥,µEÝ„e˜zL†¨c ÐË`E$dì¡4å T¦â÷ˆö*÷÷{u£åOVý\ôÜùáð?ãfL×ö¿‰>û~wLÁ,±™õ‘eÝÉquL0¤Ha¯ á€–I$ “¹CŒÀ‚Ñ%¸f:—üÆçˉûZ2DOÔ@øÊel`"2$”k ¢·¦ ]À+2JhUƒ[´™… …m’¢£$Y1Ä †¡QC¡ŠªZÐÈ…™™×g!¼|ëÛ™p¢ [CÖSw~³›ÈaÓÔ|Òî±h•4Ãp+˪iMå:´20î•u£j(((D Z¤õöú0Í5 ª×.ðâñ)…„¸N;>€()úFE $!VEP$#k<@§Ü{yŸp>oÛ¿ÇíþÍS•­¢%¢§Ú!÷ÿN¿Ô ͬþÊŸ[T©0(‚ƒæ_ÙÔj)PÊYˆÛ„!0LüËçÿn>' _;ƒ× ƒ å´C“öz‰þ>µ¿&f¥`á¢!ì.äø¸–ᵬÙF,„¸Òˆ“‹ý˜ý᩟Ü·ÙdØð2ð>¹hm®jcìêkãïc’j”bm½Õͪ¯j3{ÑÂéúì…»9žKàõô:: cSŠðäh?š^iÁ1ç8;&›M3Na¡óý}*®ýÏï9 ftƒÂYþíBÐ.¥1Z %”°P~d’H4›cÀà×ÓýŽÎ’"B5ínî"ÂB49´ÙƒåÎíƒâdÌ•,QŒY"ŠD@B 2ì%Yß±ÀH(=ï’h(Z^Nÿ˜°þˆí<Ï&ÓŸm¯â‡oT/9˜å à’¡Ä5ijH¡P¹g»AMÉ––\Ì×k AH²A*ECaHa@¨ +IDBËHØ?–†d–H£¡’Šc$Y8aR•“)jDIQH¡Â”‚O$Æ@¬¨«@ëB†`ÈQ†1ëIšã,t´£"#lU£2ª4e)JÖË_Fe£ù©• i‰ŒQ-ÆjtËÂÍ@åw*k+R¤Ä•¹˜JãÝë¹fªV÷¶«&'ó¬—…$©ÚV vu¹F bŠWY‚bKl1DrÇýIšh±:lvîK‰m†R…N˜²jkyLC–“¡©e2ÀD¼–#fTHyÙ`hñ‚Šw¹ Ú(´¸9P Ã;1ÊÉØ…bÍvÓ¤˜ô™¶h’X#:OÝ/†¦¢°âQ¨*™N°5ÔNp¨aGk˜aY97&%J4WS»EXLG(²¢“EÜ1k©¬9Êqо5yn© aŽ!(œêÈIœ«8É)×Vr ‘=$é'4²wØ\ìÂÌ È p@ÁŽRLq ù¾¶ˆåó gIQü™1í ÒN•!¶Éé…nRvÉé1é:J=½ ss JÀÆŒr€ÛŒŠHcyE&±E3𦩠wðÑp¯0(ʼ+ŸÆ× rÕ­Œsò‡šÛ>¿¬øþ?“ïâÂP‚‚åôÌyÓgH[¡ÔBf\ØÀlæØÙIáou‹*l(ªªø®ýÎ'bæH‚‚±!Ú”Tb/äû!J‚—RâŠG ˜FAö€Å’ A‚""„ "÷%Ñ„rs ¡°(h2Ed!€i!²~ÿ±,°ßQX²@Xþ"’’V'œaü0ªT TR‡0 Ç%†RÆ…Lb¬,UD”"2‘“NìÀÏÔ@xp˜ÇN±ÈO}‡`= Dx]¸j·L6¨Ðͤ ŠYE B°ˆÎìª s†ê C*KÑÏŠ¤¯ãÔ ¨!Rú÷k½´)³ICµ‰ƒ„qKSÕ]È–[˜Òa.bl-4¬Ýw›³…y’ŒÛI¦â¢ÔW$$ „/;Ã!¹o*ñK¹5LVâ\º©Âie쌑"êyÚ¦&èbĆ좺RL\²QhC9\fΉ4:¥'²ØVcˆ ˬ1åRA–u ;Qj÷8ï ²¢Ì¡4*.Z¢RÅX¡R&ÙaŽÂ#äFôAX ‰ HŠ-ƒa:˜’R=&X B@`k7 R3@¦PK9 (ê…*ÈâÀ?ð`}ïB“r4p¶¥^·â÷WhdÈ74"àBÖJ+‘m*V"ID+-²,¬‹„)L³ ”èò\ÕTd-?2ˆäÈA˜Ùj ¸Z”D¡Šä n´¤Ž\—*ŠU%‰/O¿êrzE}b¿Ä(¡d(€”>õð=NÛòÜÿ“è~ ðbõ‡öëJ§'ÏçþgØ‹„>°ðúü|C0'ÐòES€ó{ì4#4=Šîl§ñ4x¨€)G$CöÓ Ã­lò{ú^\`Ôþ§™ñâ-|ô,x$Q„!˜÷iJð¦ /AID"¤EƒGêaþaGZéÚB=è$â |ßûŸ¶®À¸ù—bˆ–Splw©qêò "ƒ¿×zØŸRZÉ"È’=Tt= µþ< >‘:ùT9øñ,/Å—E/Xä=Š1¾aI¨1ža`"}3v0Ž;g”9˜MÈ¥»ã²§³bÝoÂã•{ÎîÈÈHþ÷Áè6•$Bä@©ñ9ŸZxšíù™’;ÞûfÀP¶·Ão^úªÛ«|žüx@TˆÁT o÷âºn/µP"[üfæéìÔâø¢?»4 Ô94÷^¬U†Î{)u8jI$†Œ…Q‘°?ÆâmÕVó樦ý#n8‘ó›áH3˜!0¶ùü_»oŒ1»Ÿ‹·?F:&Sœ³TUþ¯Hcó¿ÑÊԯߔ>»r¥gŒæXùaÿ‰ ‰©Ó*Lé²JRg³Êdº+•뮂Bóyhbk<®žqã<âøR&óméö’¥ûæ=õŸ]AdY¦wg‰Èë7ª IôÌÚ¶rý½pÁuŠ|&äÔ¬¿†åGéÆ !Zìó;e¾ºº+¹á ;/:Øv<1Gí‘íN`Dð|œcî1û€l)vpº>ƒï@[”©¶îCìÙoRIÁ,K-¿Í¡ 6$8MΨ i '@;qÀ<®Ð6?ß`3ýνíÝ&ómWŒÒ©©ÄЉ1† $„ƒHiaû)Û'2pÜå¡b¡ÒVNt¸bYESm% Æ,êHÈŒMzrb­œ2Ú]¸™ƒW¢äa,SCh¤ Æh¿ >­çí¿s•SæãÞ ˆØgR˜ RW©‡"Åì0犴ŒOÉû„O‹÷J%þÒáœÜÃDËq)ZNg9§Ü‡úØØ„¸×dós߯Ü)’ªŠ¥@ÀAÆH¤!À{ölš‘gãUþž³Àw{âî”û)Q'± !!¶ã}(pÒ4²#²@Œ I‘(}Øw73`¼6l<,…ÐÇ·`qÂÎÏHB€ú„^ß`ë< ³íÜ=”üÊù­%Rš—è6›7Á‹ŽGPz °{±×J•û´PŲË(%†¦Fá’Ø¦‹tU¯í:{û‹s—X ~@|€2% Áˆ4n«o¿< ƒ ¡"vÅ;÷=æë¾¡$‘Œ;j‚ÐiˆÈ-¤,@(BGûô’ý³#(ü¡IwÀ !„»´&À›H@aÉ$A@x¨Tlá*P‘#AnMË?ågaŠX°H@„a"×üšG0L A=}:y=$1E ¬ßö<ÁHºSÓú*ŽÙ!ðT8!ö!ºäð@öA>„‘C0Ù]`ùÅhÛât(!{BŠ B7.« ÷4ŽKè›Eð ÿ ‘„ןëãlŽc$"1€Dèú®]Ó` Šr)aöhü‚m1ßâFɉú‚öÅ£¸wëÀGƒÏÍðð½#èvˆ‚»>OX4EX ñ##Q`”ýÚ°$ˆ£$?D"€«AEc $aH¢ÄPATQE °UU‚± #"Š ( " Q‚ˆÄH£1V A"Ȳ*‘Tb2,Š+"‰$‘TEDŒˆÅ‘Š(ˆÄF(Å‚(‹QbÅU"±AXª"#UETUA`ÅE‚ADI’Ac$1`,d‚ÈZ,BHíRTS¸°h©øPÂH)£`_2íE$ŒF)!Ùi|°r±P„ðpb—͆ʧŒZ’+L!\GuS=gÔ ’èÜX£î¸&£îX)ñ-j쯅°løy!·CíçR µ‡šuûv*{ –*}¢p©)MLñðšÏ}ƒÃ²—w]õíáãl&eíF3EU¯s²UWo}ç„•FGß ÿ(OÇæ !~ð¤%LE…TUDUUBIXcêž` W0ü‚‡R¡!?ეr¶¹”ÿ22NPX ¢¦D˜ŠE>–`°A€y],=§*ªªªÚÆðL³™*9âÁëQ9lê"gÉTU¸Pîç7§œ$Cc„-"¼Ì N Í2Ûs\Ë1àÃPÞSŠáË\ÚÜŽqã8P i¶^W”y†LJmÛJ:à mNnË"!¼, F3}‹§4Ó ´·7S vCÊ9½°¬Æ,n\€¤Ã222|‰¾äÈs(€¢ˆ‰OõÃÒ@õña;‚9Cå̴ÈXSc`¾=BE/L(È©2ûùÅð½>o€uÓÉ‹™`ëQO8 Ìñ<_O} ð9¡ÇqNúwüÇiõî;C“¿{ÜW(D}%@ {Ò«×°1ˆ‹ ¡©gòc2P¬ ² JH¹ ø–…Tà>ÅÄØb¸€ ‚€H€'¼@K$3DeF!ÙDÔ@ ÄC2DI¨ LíþZuÂñ’a TÚS(E ´£DID—DùDJ‰a³E @ÔhV !A) žŽÏuQFµÃA š|ˆ´€Ï“H@€Ä.ífXr»v`ޏ©>Óýÿ%ù€ˆŒ(©aPm¢@€"² D!dg§Ï»ŸÇ:=}‘=Zb¿VV·–ƒÂ(H"2 @„#Rù¿$qà*€)Ý]F=ˆ¾Ä„ Šùx”…šõqkàZQ¤²¯j@OȰ/‡ñþ«²÷û;"ϼéçåD!ÒS|vºTÆ÷°ëTƒ¬Æ!˜#ÿ®žr^ÝÑ{çò5ñA‚ £âbw¸;Q(P3\Çy‹º×»«5ºÔ¢Ö$ú¯öyÆŸ¯^HÑ¢¦AMÓwݸ>2vöhñµt£n[Ràj¾*-7aúYPô°WR3D›p: “¬Ê1\9 "(ðtî·†‰Í(|X®uÖ2"HxxûéÀó¡C¦ÉÙ&:pËì¼g½ˆ;äªs›˜pÐ%‰`¸›àWNfÞ‡h£d½“e^ÏK´HYR„k9òÀôü/Õì µ†¤'",ÒîòªÃ¡NЊxU*FظUäzt.vN‚ä¼|Æ}\ï­ž \UR7FHa…… Â:œ ÁFBåàÈm5Ð8ðÚ¡Ó}.$æ5ÒX¼™ÈPg3$—GSp·üE)£Ñ¢® „tËÀ»Á¡0@† Ì Lc‚ø/ûâ±)W™oTGÑc—wmʰ¢³*î…¯Ÿª5Xxl€‹èlQ3@ñrÖs]V¢·tlB¢¤|®É8”‘ ˆÀbA#2"TD6qU¾à¯ÏªÌ•EI!Bo“ÀF ›­w`&Ä‚ÌÓÒ`µ2V&mŒ’ÙÎÅFî WS§e¯¯:ûüó–¯ çqí\´û–Ê& DqÁÇ”ÌÏ€m³Ãï»i±›7\ͮۅ”æþ>¢¬XO vC¿ þFÌ ì„r¨®ïŒ9 Øc«ÓrèˆQR…´# :Ë©Bì§ÈÙ½€ÀEQ¡ßÃÛ€ù Fdë* urm`5°¹4õÂaî£u~{?lO>-¾+wüôì/¸\Hp=;ÏPÓ‹4}âÏr´§”ãü?ܱïCžÿþ^g½“Û™MM6U4ËŽ­6i•‘g#hh0²\ kÝú:™¸G€Ñb:^/1 Ã"‹ÀìÌ4ÒPÿàS¸–ËZ_ÐøoõŸøñÿ±X"¿õkˆ+‹Š#b£üÄ(ÀÆÄTb‚¢¬dXUb(‚Â( "0ÿ‚TH*0ƈŒUUU:µH() ¤DF,UPX¢ª‹9ÌÈÆ"* 0QPb£XV(¢Å ¢e *²²ˆ‚’ *ˆ‚J0c"2" T¸”Tb2 " )ž¾¿.ÿ×n+*Xȵ¥7O¿õo)×â’Œ9Q69kd³+\ÂÏ·÷ÀòGàBFHÚ¿?>ýg¨¹·Ð7M;X!\=˜/34–ªþ‡Ã€üNÉRNX÷ñ É! 7„± ébáüI<>¢CZâÐôg©“?Ó¹8¥¥ªpzÞ‘u÷COc*‰È0KlWHÁ%´¿ÄÔlµŠ*ŒÙ@ñ3Å»K…¦L]òê¾]¹ À)J„A<§A #¼·jÕÙž³\(ËéÝÛKŒTè?NÎ #——sÖЫ\‚U 7œÀ‘x‰öwUêC~ƒ·l!”£ï{õÈxF0A‘¶IâËœLÙS]qǧìã£v÷wÁ+,f·oËŒK \–Gu}òw“º€µÛµ:cçN.5Ø’ò}A¶÷°â\82 4Ðq ,’Ú¹'‹ Þ`u‡q $³X^¯_<äÒØd|iH[¿8ÛÖeƒ„9r} íì&Œõ#{o§>Š€ w/Z˜ò ä$$!$‰€Ép²Ÿj×­ÄäS±*h™€y΢Óù>8—5ü}HGXTsˆÈ2'ûÂj/l :°¢ERÑ!ë 0õ°· Ò&lœ‰Û!öBÁ ¥%!×qPDª¢>¼ñ\lµ¶áÐæil eÛrÒvFËjlw`†a3r£sî‘ó7aØïÐÃÁ£U†ÃÄ. …ˆô¿È¹:–6k«p™†ï;pÈx¼XK‡Ö”à™Êó†o³êw„ùOžÏo#¬÷ȳEmNÕHB:@ùSUcØ3üf§ •2‘FD Õì¢åÄÒ6··_Xßyè·žíº7GKF,m·²,ÁÇ㮹4-•ë×Y§ì.Ÿ$ì‚ZJ{ ^‚Å%ÕÀ'7JTÜx½ô³¢ß­ŒŸ×@¨áã»väâtD„õ(¨X€È¤aD!@1"E`‘H€ÀŠ@Ф‹#ƒ ¤Œ (F"Å ŠDHˆ!‘€„TŒ1ÞD *B EŠB$`¬F#¬¥ø¨¥ÆÅ쀤dDR€¤¨—, Ý6;çÆv§à–ÏÕÿ]”Ñë åÍÝÉzßf ùHˆ™éñç0óaËn*‡…»aº…µ—@ºS¯®Úrjã1“‹c šñô¯‘q½Vò¨‚ÊñÜÉEè<·r\µÀžè@q20^‡l c–ϰŒî ti¢äáa‘.ƒ‡ƒºµª:/([}Gu¼wnõ‚„B^¾v‘`Š ú{$ÜdIzí‚‚‚ɸ}|yö P×=…K‰¤Æ+’qU°Šb*@ ª–""„„² BÈ€B EcˆnzÀÈâ#„) <8Y¶v¹V›yrõ®t¶Q „Dºå'5§?L¹A®÷iØÔk¡£¬pÐ|פp>.ÀŒ"À.ˆîÕr˜´UÔ28F‚  LPʇw;°glnG\â ’Gm>>à5Ò4: E!ÑÆX >ü÷ú4m…kç]2z+Oá ÂÄ´²[.çšj(†(±lH¤ën3‰¼ø0M³c0K”<}[ckyA‘Vl¸ Ì!@aìgLDýNT¡ßVÚ ±8„aÅÜÉ•5’ètlôù+“õ [Y‹íüH|½µz(µ9•+™ÃäòIÓ׈|¡Ó¥ IÒô 'õ€Ù‚¢ ²6uË0dä§i’R"õJúeiKO™ÐÞúÓ™!d’3%`Œ‘=ÒJk_4Ü׊M3wT»™.Ò5“„ ˜HhRf1P¿…¨nÀŒj(m­‡{:*H‚E" xi:úóôúròœúŸkõÐP¢XV…²-…U)Dû"Æ1÷û>“æ ´PËTS2•Åa‡!²@o‘=(î†CJhŒ Ù¶´>©îp·Sy$úܹìÌ<#`,«ÐÀlåzü”€@’BA‘ '}bUX$H~|)4'‰Ð"“sE<=‡[­µ¾ÎÌ2,Š M†Â•.\jÙ0Ø y*I-Öh‡úWD?ÖhÇ•5ª¨4œ‰ÈѧexDi4¦Ñ z÷ȾŽÎÞ=þ)k& f ,X°m)hs ˆ²*¢™l [J*°¶Æ»1 ¨Ê@¬m2лeT*¶Ö(î7aR•*Q¶Uˆµ¨ \¡XŠ$X™Km‹BÓì~ ×ÈF(ŒQF(«"¨ÅTŠ,F"¬ŠŒ’,ˆ€‰ŠŠ*ŠHŠ**Š¢Å"ˆŠ D`²,ˆŠ(ƒŠÉ1€¢ÄAA`Á`ÀD"¢¤D‚ˆÅY"ÄAEY ‚ȱ`Åb‚‹ *ň‚¢«¨ÄH((,Xˆ"¢$YUb‚€‰X‰DU"¨)QR D,U’("¤FE‘QR ()‘‚(«PU Ѝ(*‘A1`ªAAb¢ª AbˆÁb¨ª""Æ(±V ( ¬dŠ" ƒF" «QTQHŠŒbÄEXE"‚!$bÆ(‘F1`±cÁˆ1X#(¢,"б)õõ…€a*zŸ¯ Ù §hµésìúÆüR–FHÁÓu1;땹‰-Ej¨ª¡Oj x%™¤)ÉñŠŽsd8fÈfÏÎuðš°ÕM.DÁ®í1#!AmšâŠ$þºQY|íŠ]~Ÿ¸j¡$Ym ² (‰"’(E²e²((²°‹ * ü˜&¥@Œ\E* ÆÃÏ„Iã@H|þ…7š=€æVV¼ HE,–! @¾ÒF0D‹R²å 2’V¥2˜˜•†yÌ…¸aŒl‘'üHЭ¥BÁ0’{ª 3bÒ#># €!îËlM˜IÒ©Ò†E7Ž£A—Øh£i]¦Êap‹h P2g<;"S‡hiûõQF%š„bÒÀ·X|¡ò’þ¯ :hn€€§ìYAj#(H"‹‚!@X(H¡"‹ 1R ¬DÉ,>éù–Y€ÁR P*J2!”±´ ¢ihcŠ‚êt¤ŒK!J?2ä¦ MºÛ‡êNŽaL1\Ãõ ‡geå¼pƈ̪½Ê4Œ¤#ÌÕ¬,2†þô€w®B¦ ” D'ö€H«´ÌFE‘¢¥@¨ ¢!PX@§÷þÞ•#'6”ÉÞéþ-•KÀÿÏýøü|ŒØ(r°_oåUQ!@Ø.âûߺèTD‡oö>20E¼FH~ä-€Un7¾>/<z—p?ÒУª’d룳ôçô>þM¯ Š@<òKiR)„Q`((À¯µ‹)‚è>Á.]ðV®†lãôíbÝì5ž#ì[°¸;‡›Äywk†(Sý—;*Áºÿ‘½Ô#Ùyæê>þŽÂõÅëüãáÏðb/¨x÷ þªJ'¹SúÐ@{bŽ WöÃøœ:ËTç×ÏtÜ}^>鸉"²q?…'(ˆÿt™˜|D=ÃÔNaðúÁ[ºsÕÉOVÍÎSø¸¾Án‰j@%?4ÿ³GÑAZ{­i Hq Â0Š. °Ö0ˆý‰€ø¨P¨ÐìªI|ÊZÓ(·b 1Ud â øÀ,0U$‹¡±þe‹lõ§ÂÈBHHÊüžï qx¡Õì(øŒ$%ù ë²þ®`ˆÈÈ2: ù‚D @‡Ÿã@rF=Sõ&-¢¿ÃOûðR`ùéü¡ç!?´ýÚ•…e£KlÆHË4Ê.Âðc)ŠÅTì –Ï’¬!ùÀ°`„>Õ¿u+ÈñæŸH]ܨ]ôýÛ¢}ѱ+ùuœRÏ(ñâ !ó‡ï J)X%ª¨­ºZÒÀÚel¡©eéôtå¡OÏ´Èl ³Øp O”»þaö3@ Ø™ð¿$ý Ê@­¿W ´ÂæJíÌÿ£*2ú@¸NÈE'ÙZc¢™˜Õ¥Í*ÅéωpiÔv?Ì~œ° {ð¦ü\Û˜õ5ŸhT¤BÒ]$4ŸœÝˆoÉÅSã´‘Èv/N|d’M§–mXþ—î;ÓñÍÈHzÕxq§¡º{>%Ï?Žö7 '¾Bpžîq§=§)•U ¨«òM½@ÿX€Uíó?²ºU2L3ãü¥%åEÈ1RûŸ„Õb ]D8¾a{!\WÂþw?b¦UE ±aè®”9° á„ d%a*E)Œ$…@'Ù˜˜„B(*i!d" Ȫ‹wŽÿû«z¶5ë,æB‡õaT•+ÛÆ#ÆÈ$8RÝDÌ…IÒI‘‘Du!dÄbr!Æp´äç1zCIÑŽ( ™ -m¶´1ÁÅTzÅÌWª$®[PÆ(u·œÉ™)Ñ»m\+mеÑ\Ê$qÝ7 [ÇŽ;pËŠ2¸Hˆ‰L râ’™%‰DK… 4Í"Cdˆj²¦&Û§#‹é†ÏG =¨Éä„é ô(ÅÅ%pX>¬{,lcÙE`ÁŒÉ‚õk™ëšxw'„­Ä0J¸\\¢–rE:E0`Áƒ¢7aŸRDÚT-”,â# =ŸË©p§¤à¶‚ªÁDH”…"UQA wsx‰ë ÅÒ¨¥’Ãï?¯:êT‰"’$qòQS€ Y Ÿ Á)3v#„).„ }Á²áG5Î frlTH‘VDPTF#FƒŸ ^ø¯­i"  r ¤?à"ÿrE8P‚G>¶aqbanking-5.6.4beta/src/plugins/bankinfo/generic/us.tar.bz20000644000175000017500000404227112364015477020567 00000000000000BZh91AY&SYjÉÃÝÁ„}°]ÿÿâÿÿò'ž@duŸ}àx$û0$‚„´+>Ùtj*[ ê`6Œ.‡;6i­MXÀ£M”2h4Ú2IQI›a×(8X&Øt(ÃZVÔnÃ90$ˆU›e¾ìWkí¸Ñb¯s¸Ö[¡ÕZYBƒt7mݹÚÒÖVŒ©Ç=ç®’¥$•&ÙF&Ùl•™•­Öë­0жm›%çc¶…Kc1jÌÓÝ´é]*MVm­³Y4h©¬ÙªÍl[ÜK¢…Õ¶a¨B&¶°‹vqÕ´íѽ¶Û²ø:@½öõœ{ËÛ¬Î×{°óÕÜÚÛ=%@ RëVÂ…US&…i¡ESݤ*ªª•ÙΠUUPë]€ `[`¥ÒM°Ö®ëIG måÁÔ³©u6Ͳ–_ns6]µ»9U±`ʪ]ØhP Èz € %@!Atmí‹—AZ -ÆáݲíŽÚ×Îz힎Š»ÁÞx*J{ÆÀ=áÕ(RõO@zŠw3¤„$AÓuj@  \°K¡Þî¦<ÈëÎs ¨/n2ê¹Ù€kÝE«»£O6¨ð«Þ@E[·¨”Fî*¥K»))Fuô h­2ù³›u é 4™µ(h:{صJd4,ÚP` Z*ZÐúnf€È2Ò…›Jú×Aôï­C Õo0E:ßa£ hËJ iB°ƒEh–¨}t=Ø=ƒC3IMi@ÖwÝÑä=Ûéè9,ÃJkT+ ‹c{dàštÓ­ ¦š Ë@룠fÊQ¡Ð2èN܃‘£$µ¡TдLîí(@ @ª@ç%Æ[a³<êìîÚ©wp蕞€Þß> ºކØîÂsTOYÒ¥ˆkãµÍŠÈ£&‚Ö„›×¶zoë-¡±”Сè<žöF p WA¦ÖÅ€ªPs²;hٺݶÐBÌkSJFÖ´¡BžPuÎ÷ Ûy[Þе-¨±´PZµ7LÑÝœ1™€j£6Íâ×¶i1fÔHÄ@ *J£l%‹A¢ÕÝv¡•2Å[mw»Þhöw‹Ä]iT;BµÈ =ðúˆ;•›`«Xª®wÜ×A½¢S¶© Nî‚ÕUV%*[VP-…›­QG`Q“3M,빣ǡ‡Nà¤qÉm/:jiîp«¹J ƒkH¶kÛ²4 mž@b:¦fÖ5i•I¼¸b©PCÝÉ6žÁÄtêA  ×WVËjHTJ ’@(Ä5l/m°öƒ¥Œ{à€úP   ( @ñTü)I$€Ð 4d 4$@ˆAÕOFÐL" „ЄL“ÒfJ~SÈÔy4e1M$A 4‚@Ðh!H„!!OEC@‘@HQ¨Ô€Pþÿéûþɇ ?ëþ÷ÿ5´Ó_öή_ýë³jDÞ ¼Rå;Œªž!øtâ&˜Dû¿Ýÿ Gøñÿ¼Ñ°‰IöÿÐÇH!¤ ÿ#xJÿƒOJm/ûˆX¿å—‚¯0˜ %Ñ`¸¹ç‡`Ö"K_ôZƯkWÿE‹%rÿèGüŽÂwá1#é0ú(Gþ$a ^Ëó®48CÒZ@>.™ôtE ®7;nÝè]aOÊÐJ"!Äß  CΫzðÅëů÷o.•D–l-–%E‘·ë)P‹u-0®@~z4並µwSc†9QÆ·¢ ¼9Ü,[ÿlHܬ*ªôU˜íòèÍ]‹Që¬/< S–sºVgñ`ÔÃ*£—RðØÿè‰uZß9Y8¾竊5›³·x† e\ä‡ÒIjV\L¹Ä˜8…ôƒ¢H “ÐÕs‰¶™Â¡ÔW‡E»>fðÚËVÿëÆ¥ïsBƒfÈ£h %(úR6Ž£ÃÊÓWsƒ®<¯Þ¢?–ÞþŸé]ïJ²Ý|pÀñTL³2ÍõºÄùBÃ>7/œ#©ï3Îè°ôÎÙ>ÙYïM%ózNû°˜•ƒ!¶>>{åmi¯£Ãè€ÈöÐëhžÎÂvÅ‚\èq{ë¡ñ…QDqê&_ o9Au–«¹Õ²9×+/G!hà2œ*“î¾î&UY´&Eßz†4Yˆ…9Q ̉*Jr_j«‚Ü^]– ®`uÜL® ØÆ²+&¨S…°ÓA“½Y¼XÂS$Šßg•NAVåÜ‘¼8,®®œ_Æ«'g”7©’êÏAÝC•!E¿…¥D@.ÂWÈçhhÞeœÑÎ02¯½õ³r˜8;·2êÇþ1ì­ï·_Wrh;eŸœRF´°ù8l5¼TRZ+Ö*χÀ{Ǥ7L'Zð‡Ǻ“|Ÿ/ŸŠ£9iz}—…,(°Ö!î}‘ÜcWMˆ/!X,ãÙ€Ïj!±†§>ëJš4®ÅÝ bpîéKàx1âÖó&®7ö„ð‘ñ|ÃÒ¾ ‘³Å`ÚÙcùõ¿!n!®¢è’Ê,Õ«dð—9è¾t™Æ§ ƒ*ÂËAžN9YƵÌÚd`ëÀ³ÉN˜UÔÎXTÈ/Hb$6 …;f¥Ów»!Y Aá“æc{úºÐª(€M#Ç ÜÏ$ÝH|±³ÕöJ86!º½Ø ÆÁ³[]ÝÜø‚4ô_¥[±ö‹®»8)m|Rž³œ9dá©ÇÝÆpûÚói( ¶‰H’´£F] ŽŠ‰4àð®.H™nD3‰†ôð†[cj\$´š(ÚrÒ,Ne:sXÊÄ5nGm‚m惡Y€TVQt§wºXÙUªC—X–© ê%¬8fiËH ¢lA`Z›]o/yNµ;LÚ/ðÿ ÊsÅïª]rÅ‘ÉU Ž­‡5‹$NŽ]ŒuÞúñ»æÊÚpí(Sé¸I=c`5 ]ÄšÓeô|3µ½b»€B‹iDš 6ÚÌePOš¹)ß×ÜÏ]'5ÃK‚0ÍU½¨ÎÞ0ÔâûÓIŠYPFˆb vi„Øê¶Ã<šž*‘ÏÆm§wEv{ˆÇâ*¢A…%“w€‚“*$2²xÍ«l0®©Bèéï;,ŽN°£Ã| Rë+Wñ놼 „¾%È7rÅåbHÇñ —™”¹ågß‘ I¹±Œ>ú†¡À™‚¼³ôy×\Ýì“£š—ë¾JE«7]Ô¨¥F%ÍÄ˱¶f ìCU­3UDý]$s°UÕu«"$4‘ Ð*€‚Èì„Z©·¡¬eD·ÓÓï•Êj¯HF„áBb…‰¥fjfðÞÉ™WÄã0’ G©èòÖ[æUßiMø ˜²³y4’ØÛ?r㽄b°W6™=rœ;c-ri§ÖµÚΊÞç†À7c޼ò[Št€ó¶DbafŽr%6¬^G­IžoP7œ…HÓEŒü .†§âqzšÍYº´®í Fô½1>~Ýë”ü™qåF åœQ¦ŒKö4bíåvíf%‡·œt¥NP烒Ϸl?¹·UËH-÷­¶ÆUõ(;Pmw*E'Ô‘?+K þg¦C©s&@6&À€#wC/'çŽZÑðñÁ¥éXï¦óIòv-(^µÞXÈ!hÙX§fÕ0÷Úh¥—_0í$1.í.íŽÎ:»?)1;äëÚ½2 á÷óYT²_‚š‡eIðX¡"~•púbVãÄ#ÏXªÇq¶yWøN™Yt¤¶%›ÈW°½Uæ{ˆ¸ÎqÎ0¤v!ŒŸ><’G9Ìë VSwËY1J»pI0Èh,b“óú.e¼äZÄb„X¢(&b àÐ&bZRAŒø´ù—+‹aש“Yû¿1‘.»:ö5¡…ñã -1ЍÕ3+ ?ˆ<µ§æ1´¡§Þúî®+yKçk\2%Gæ3Ó¦P_ŽØ\¥Ãç^Íé,e&YðìILfÚ[éeÔ¶´w!š†·Ìûj=Ï̵5kfU™™¬‡É¢xºµ{ú?‚Ïë-<Ðúì÷t´RF5ž³<›B™÷vZã°uyÅÕã(Á ùÂÀ©d·ë OÙû]ª'È>ž«ÒÂÝ2/yj‹uarh­f}b"Žï°†Ã9¸LVçêhŠYbÁs&¦,gÌ>Ôï0+ ¡÷K#UçÔbÿPPqÕ‚9¢äÊfhÊÁåo7'ÌlècLìOJùbpÐdÔBàÞÖÞCÃ?¸,XÁ€ÏÐÛ§‰1‘¦“‚GëåeTÓMª¿’ûÝäñ‹&†$Ý&ç^‘ä«wúë.Ôwk¥*Î#kÊST•QTT4"ñ€øëk…±œÛðÓ­Û{““Å­ –ÕôÍ1»ãvÅ·Ž=®Ö â¼ðõÊô®3¦k=o¡½—!ÚwÛÙ»â°äXbøËèG­xóÒ$ε†9¶ó3·g:]Ô(¶®³ªíj—‘¸0¸‹w¢ÄÍ0qÒ(f ± IµÈ0QÆõoéY…¥ ¸™¹ ä=ƒíiÃft‘"x?·zbѽ)Ĩá÷«ç´Ö¼¾çÐF§ Î¸ÉNø€Û!Õe‘]Gêð#kÚœD±%ŠŒ±fˆUŒ¾ax(½V"2µ7ŒTÃ6b(« ´ORÏ]/›0¹­TB•Å[+Ô3eà™ô¢Á—šzp-µ–Ár1MM:Ù3z:7LØÍ$9 #Áó€yCʦ¨éM :KØ!äq ÐôJ16‚<¸‹Z)‡nÙŠ‘Õ,úp¥È™Šª•7UÝႉJH8QÙ ë†ýÞɪޓUجTRºÇ‹ƒZYÚççܽõ"ú¸ß¿/"ÖñÁÞ¹×ænƒug ªšPž´ThS ¶øeÆqXÊsÇ[P3 eK\¹ݨ­÷V.—í¨à©&6´ûkÂÌΣgWòTåA¦Š+@@†LªéW¨Á¨>)0ì!Š´„:2zWžÔѼ6Fä8•ª¯±$P}YEŒ{ÙÖ',ø†™Jøô F‘eB ÿeF7Ú.Áa”-ä´e~Üæ«w‹qÓȃ…|-~,štô¿!æaebˆy3µˆözËMÆÃÞ…PüA &±°We¹%5„@ê`MwsŠ|dħ'›.&êÕè>’d×.ÿw½ø¸=®aœžB±Õà rÂØÀ®0É_äpßy»vos/°ï.ù»ß|%ÂgYŠZ»Ü¹x_KêŒkZêÓ›r3¯îàµIºRådM yY ’<@s䀅yiEUp¸2±6Z‹É ±*7¾o¹¢xËXÔ0 xX¸¤‡èj¨‚W]lœwÍ9—ǪŽU\Ã3Ì­Eêßy‘ÈÕk\36¢:Xï E–Û Í0­ÜzôT®j™Á.jЯH›µ¶ÕQôëï{Pé—ùµ8½<ôÝ'†&LhÇÊëHž>_6¢$=:­L»¿^(ˆUN2¹1KFÈc%„.g0™qÂø«‰ ‹¦|í‹ÉjÆ(;›«pÇåΊʌ´Œk ¼®„©Ëß©Oð ô–=V^2¾§sVSÚ{Cp†ÙðÝ9fž]&1@öRú´G¼}4]4¨…¼–gʾj\¦æaèÿ¼@d1Ŷe\Îj”ÛQjUJ<#áû…þ“^8ù2tí%iA®ñ`@’K5åDHñÞD¼:v͉`ñÊdgdíÙaÈõ›Ò˜AšD;‚Ùß9qq©&±³/Iï´ÍÑ„-¯=àÉM\…ó¥qzNiè—å¡ ëoG ñI±³Õñ©™ÍÇêýI#ßñšyWjê÷Œ+âxÙËÚv‹‘ð4¶ñÑÎóNÅʇ/R¼‡|Û¾zÔäa2%œ\(!Šu!µ¨¡2WZÄv#5«ü‹að%(†r•u‰ Ž5ÜÍ­hVY(שC$îa}ÝFk{Dq×Þ³)‘ÉÕCÈ!mÂ``å–LH]Úü\±[•YÄû¨›€Å½÷39nRúáa*kø5~Šƒ¤JjµÜf6Š(’6Ö|³óâé˜Â²:°Û õOwnÎ<[̨nj‹ 5í3аÔàWé¨D2Á¨|C X>BÊψO9Kx®¦Ij& 纡ÅÍ}>ÌcóŒ"Sz¶æm¬&Ä®+-D½’ÎèÕ­ÐbƒE…’± +`+ý§ìU¯Fò9…‘u  ‚Šžä+.ÑÜŒ V|õ} å­k»YÍÇÅ…Ç+Pcå_e ƒøÀHˆ|&߆"‘¹rÆ)+ú¥œmÀWÚfÝE8[™î#Äc|Ýðë7‡½¿Ï#Asy„’ÎaDå!aª<@Ê»°Í#¼%(J)"YXm·çFLÕhïi¦]1Ø^ÊCL+ê*W3æ0=>J m: ¼¶‹ÈUN–z   Du‚ü0µÐ¸O«9ÚV­$¬÷‹ãupž— Œýòìh4 uÍÁîÛØ5úÌR¸ ˜®{ó¹­Yù¸¤Û·“»*!“ÍìKºqóˆ¡Átz†ŽB „Œ9Ô>õ›cZêÖ%žODnzˆŒç‰PÅó<œ0—Ì \Ú]k£\Ø\Ž;N&8+hbî”1ÐT¬×b(‘ù"ˆMœA¯²Ì< RåN¦œop*·tÆÖG Ú†`x%ähÃd)XÖpæ`5 4ÎÐÕˆ°ÀÊi=u £]Úœu4—ùp)Žõ‘’„Nʇ7µÅƒ/AD_Œ!Íš7;iòÄ3l¾‰vÁ¦ìÁŸ¨§€u?pmVGðˆ0¤‡n‹3'êÂÁ¢O¤‰úïÞ›–n|ÎÍÄûÝËI¯‡ÏH#²ÒÏ–å\4è÷ÚËÖH$2ªBSèˆe$J1£¨©Y¼–«a;eú+!Ì>OÕ®£Ã EÇB%Bó`Qòi^ŒRè;r!Û®uß㋾qyÀ‡YÈñ MJXžAÈ ˆ"çxE™P¿£A¤,›öJ‹g”P`X@`:hÝ¡®YÀ§+—X\NÌfÊшÞ÷°]1â†*qh>¬ÚÍrg5N5~ßœ]cx`Vc&3*ôØ®§´3”æ¸n‘†X…(Ä™4méõ ©‚)8¨ÆDXƒk™ª[«VEƒnm¸ 1F޲iÜœÆl¹½|WVD@wN»çh'ox¡ƒ§=DÑJ‡”ÞëÎÀ6‚@…ѤH4 Sv%ÂЈ¿Çnq½Cjð-S°j*ïÉpë†*Ê© |ãRÎwãÇËGx0…ÀãšÄJµ¹Ë¬óVC¶çPrší¢Êý¤Úv˜‡pôöɾ©9…ãÕ¸Uq«òVUÁzSRüˆ §OCP;‹==hM2½évm™0! ‡ÝÛ*Y@o¥ÑA¦I/Ør‰ Œák¡á„² 8~o×|ç¾)Óm¡ÔðŸ9ìöøæÁHÚÚøa—&8ðPƒsBŒ× )D`„¶öpM$ñ´‚-´Wivþ5Á ;Q“ jm‡wÛašõÙˆuíˆDâÒvs'‘@ «ï¾xÃŽ³Ê`1\t¬‹—â4|AÚÅ’h Ü®½g’æNoWZ1ô˜ø“Xç¶C·«OK–qà·~2øä7`¬;’㌋…{N\S`fÞ<¾ ˆ=m´ÉgFµ(˜GÖ^@f„½Á ‘š°&¬i!ÕËZ¹mšÌ´ÊÐ_2÷Rô"Ï# H¯ç<8(OPàTÌÀdˆµ‘¡8œü ó©va»}x&$¡té<&Ùùeñó½A\)¢€)–!µSìl©¢MM¬3ùÚwÕéa^8¨ðqÛa£ˆÇž0Ž<2ñ ¸µ€³¼é\¤u•¡ŒUAà&Ë“š&sÔ~8Åxl¯(~ÃL©ñ<8õ9L¬²H>—«ØÍHeîzE8øA>Êj\7¦ìãxEÉr6mœbh¡ç(7|qjî%aç,XëX>DÎ%XSˆ S£´ªÏªRLuè›TP•6¹çï­/WŽMOrõ Ï0mÕp‘nõ˜MoJItŠÔ`ºˆ§Õã>;9¦´-üž.¸~q†|õMå9Ž6*í¯=ö&iâÉyÃeë¹`á9õ@û)XÀ^×0Ë4ó ä,4A$ì‡e‰]-Kª…ÀƬT’µLÓáó¹‡h¢k×v1]FÔÎØ@±)aGG«BÈãKKg^o/ß.ÎÂÙ¯0Ìbc Î1:¥DG-Dh…ƒ<Ðí„í½xþ³G-µÆà²hÌ ••̹‚¯^þ¿öüõÀjp„ój_Ê«ËeLüów5ãW ²”Ü^MNðÅöìõN~ON8Ï Yõ¬¸÷&hv ÕMvïUÌCkЀÅÓ!¢‚HˆÖL6fÆ$exŸ"q˜w­öh#*Ýä"ôϵbæoºÊNø†Ñ@0`„ž(Ñœ)H±;Pãd`iïTý J';!¡N š ˜†(x³n+#œpÔ¸"™„¿!7ß$,Žp& IQh¬þNùÜÒPµÄ=åXÕ$Q>îÎ7‹K ˜õ©5æí¯.щQm"€> H&3ôšñëZ[OÉf(H`Á°_T{Ð7ŠÄŠBIFÄýÓˆòè OÁ«œ°I!H™›ožm¹šü¤Ê2w.?¼àÊ× E#ºà;ø1€£°T.^–­P9Ð@7¼'k#Y3AW)$0»°R…5^"}E´ã»“pÄ&H¥6Ù×\Þž|¹­Ù¯_ S¡ 6 4ð‰_šHgDêRDðôl:%ÍD:#î]ˆGžxÌ  @ *޳ݎõZèÃò³¥+ñš~¸Äç9®{[ž |vÝÆó0\NõëŽò¨;è*¡Ÿ]N±Ldy7s µâjÏÄM*Fhž~^ür´9 Õ•ÏzÖ·®û8¬_}VýP²r5„¾­C2y¶…ä¬[i˜ š(ôá°nçhê¥ûµgÐÝÌ©¸ >(Ef‘ ÜÓ«)nI´.%ÇQz‰\êZ©Œ[ê΂Ebu#-¶£€ú¯¹l¨Þð3ÑŠbqkÞ¥B¾˜ nܳ¾ ÕÌCŽ È ~$½»ø (!:ñ©í 6Ì–`Âõ÷IõRRô€u†)F@D²75o‹U®+£j˼gŽl ›hù _L)&\s^üÓp®«,X8T"¾.åuJ@¡lB1ÐÂM….,ï;eb9¥ÅbFNÁka$H³0îœ k´\µn"v„œÑÖ¥•áÕ bP„@쪂‘9Þ.bàå·1[ŒZIDÒ¢Z` Ø`Î6™Ä Lp€–@ŠhÌxºÖRoÍ4¦UI:BðïX$*sư¯–miÑ·é6ÎÙ¦Þ0°è˜YÊ"ÈF4ìF–ø4IÌ ˆ2]ëPq½ÐV_ˆ¸Õ£®Nßd¼tõjõuÚq®ù\ì‡aÁ®ÚžT4xƒ ú$ a¬écÇ1µÆƒ²Æ¯Fz ý~™[#;T>êë £çÙv,zC…Îïý`̪ÏC°Ä Žÿã<#‡&_ÏU„H‘ª¾–2¥Ô£¢Q¹ãTäÙ£‡¬Ù® Z½<#ËÞ58%à húWM¡AE²îȧÌÇ狲«t±Jø´VºN>ϬÁY^2†=Q†ÍJOŒúÙCCA}1_p@‡OyIv9f+.ߣf¿Z''ĽM¢4Þ‡:.òš#=¤ÓY…§O.¹å¸#º€ø/j°ÑÑ$šCÙc€†õ„03ÅApN-GÛ¥žãgÒÕñ€ÎWý]kˆ1‚)Ð ¢!/_ 6#xµLqõ̪†í¶Fès kôg“ôŠSÏåœNýûÃŒ¾é”׌8â™>‘ažšÓÎ\±UfÏÞ÷ž8¦È±l Ñó㛯5ה΋åÏmÊú×riÊ,öŸßQåû£UН»üáPzIÑì™Wì(ý Tú5Ï¥Á,T’-ði,³qPe0üÙYÊëjÁÖ¸ýS„»ãýRL‘ެFTæÓ÷i)X;lôxw½Mê©Û_֪ȢâjïB¢9žÚ“˜löh tPa,*²œ7ð¼e‹M\DÃ6ƈá(X9ÓvE‘„ÃXY´ÍZxIDc–‘¼ýXxÞüYj ó`›c5ηÎ!“ë”èú3p—C”Ýe*Ÿn¼ñ“Òi8"ˆ¯ÒYí…ÝGyöçÀ…I{ã)››¼:õÖtS>R5º>þ©€})äÙº#Ó«â|*Jõ6®qpÃ]$mO&?’H«$>‹Á ®›J®q¤–’²×,~ÃjX+N:l‚ ú5ÛwCúä£ÞÑ-ÇÇb0G賬méG@Ij&ŠJ*šh(C¼‡ç“± ¡8‡õ}Zûîè’ ¡¢$… Hb@!êIZÌGó!¸¥ýþpæbë ‚ŒUõí)jÅ–ž²ŠÌ¾ó6«º@>Ç×îšœ?Y¡ŸÐ=kŒ:‹ô’&j·• †=W©¨»ëâ°g/[º¯»°$L~ZÇn¾Ì0wYB85jý,,„¿,WÙÙyìëÖeâ;/î°z¬:@™ È¥ Xœ¬©nQÀw”ôòU?G‘10ˆ$ã{ßÉ«>÷Ä`†cTüÓIíÞûÈw« ¡o¶è4Ò‹d¼‚Ì-pÑa‚Ö¯X hÂð†H‡¯¤èVøùõÉ룈ÐöžÄPu:õ©x¢ÇìÙ†$úJ‚Â9 ðF‘Æ(DRîøøòxÚÍ0 +‡Btà¢0à}iQ$êþ<¡f-Ÿ:lÚ¼ "‡ñù¤ÃŠpùJדÍö“O>oþ?W…´Ë¼SúçÖrŸ‡õ¿/f…Á—º Tù„ý åwç†xÍ$:!Ùµ) !k»bUŸ±ø);/µÙ ÐÄŽþS•œÒšvSSä׬ ¦§íÆVøO¤yµý±:¾^Tû}EŠˆ®¶,òÉÛšg¦¢?ˆZ¤™ oà„oÃL‹3x{Ö‡:EìJ€ƒ2iO Er´±ÅJ…ÎìÎèlÏL˜é:ñêä½÷v, ×N5…à4 «×xdÑDÕr–P.UÀ£,k"AKq*_®qÕ(Ê‹U9j%õ§8÷yâÖ|OiáøwyqëÍÛÇŽX*ãdT)xf"jÔ1 }Äô¢Jú>ÁU^ÎÞ:’mS+’·Ü5}ËÑ@z´(W%âH~XLá¥zfso‰Œ¿¿y€•]`µ‹7$-¤ÄPéY1;v…ÂáúÌϦüèBà>›h‘„!pÛ,l$:òrhEÂtUN{2lB³ôÀ>ß·=^¼Æ|d¤Ô÷lÚ+ìOœæ)ꥎ­ÅÙ 2†¿8oEëzÑ¥rýd¾ï—ÈÛtr)iaJ©ÍÀÀhs|-e£†Y (1K—¶8Î#Ž‘ù)£þ…k'T&h„v𢖔xA6FÉ„(8àWuGì!‰§·¾)Y¢ö_ 0Kç¼Þç‹D£É…¢Äìì1‰}–ÒÓO4{{/¤”òZ‹¤×Áoj<`‰=}éÓG™¾ð·æ§ûãS!ñ%î†9묎Ýed>'þþŽyâvò÷¬Ž÷²¡–ÛDzX‡²ÆV()õPAc?Â&Qà(ú\ÞY/¼ÝAâcèyŒ=¡d3 “ï(hÒ6vÌóÎ]’ã´÷|\²ã $öÌÀýÓ¥ë×\sÃÓÏ"ÀÓR*#DAg¯[Î7æ’¬ÁÉÛáÌ×fV±äFí: hV:X>1‰¦wá½buÑ躭HÀTGBžòÈúªWV¥E±·ç¾çß<º¶‰H%;^Aš}‰£ø‡@CÚBBùÈ¢‘\ËÆÙ¾á³?ÎPÌÓ«™I ²ÐÂŽ‘W å;ñ¦ê#­Ýh¡€J EÄã*á:._XÌV,Á¾(d_Pþ©Eú y“¤[üûó}æ1ר„1‘äמ#*ˆH UÑýE¡¤Ç f‡R‚Cl>N×w“å&k‚7F·£>¼\w¹ˆ¦COËûóx›òÜ>}õ‡ª…YìÖ jù~m‘WÍoÄbP$€°•+Ç!½uT>³1LsÚ÷+[RU‘aq 5@<*­ó€ah°S@­¥Ï¯åNÌê/¶é£hqmeDÂùz?Œ†ò¤8›ÙÍìK üh¸/x.¥“‰÷÷Žúú«|=¿„•‰Â£ã:˜kDËyv—ê‡ädàa%  FLaߥ‚¤~¼¢¦‡‹ˆMiõP)Ò 1YoJÎ=PéÒ¤~ œº³F'¾\¡×åS¿¨zù¥O(s]m@~Uõ&öƒOÂr†Ec-åâéLž)åÇŽ¥6$Tü]ñõž#+N­W¿™M3£â‰Ò`ª¢§LááK=8;Oå´><°étŒ"|ñÖ¬i"Üa‘é]:ߥN"š-64¤U¯M Ê šn™Îó=°±êï%´;ùc|˜q¾F6ÇL8, úx ’-Â%R  ¼õïU‡ïÓ~ZE v- Íø>Õ9Oœ‰–õf:QèŽW¬D‘`h}à>ž~RÈž—.G§–‰íða˜Ú6ýG¿ž@åäãŠÏ.ÖñïG;½ñêæ:ÿZÍÝ½Ž‚²YPEDU=¸@&¦“k¾^ ÍX÷ÃòGÏ ™¤ºbT×çÚ U¡¡AFxñbæš i !„A) í !ç UâdݯdCç„ñÑ…¸0|7¢’$›+Üž†ì ÊïÖÁÉ„NqS[’J/^‘3€át Xvˆ_#>¼ø(:(¸Ä#’9„x_ ’ð€›cXûš5qI8f*fr´é£Áô¶Gõ.g& K’¬ ·ÄwtPnºWĸUT˜г ð }ñóîìšÃTFHc‚.-GC|¸DÁôžºþØ‹–Æ0ij޳.¬QE;ÕG)Îd"P”œá9Hc:€þ.¸£+Db?4èsÊ„vxš2+HN$à™åÀöI‚ '¹¬àë!]P2…³²*4Éà•¤¢òÚwâÿç§-Å&Ùë‹£‹š¡ów›b-Š}ð1–L±Eí¹gêàªëšB¬š ¡åA«èó,ˆøí'v¸ S|¾[ýà!]sëC‚—ûãtU¢Êßµá@>¤l}b$ù ¶£ªû{CÁâïöòªëE?”4£÷ÎoùÕåàw-£ x`htý¡ŠŸº£î•úêìгxáÖS¾Ì2ïÜÕy÷îéDç´¬Ä)r‘bÔ/&ó(ÚÙM*AæÅzìœJ#í(ztˆ>› ÐÛ­¿†¢U^ |D ­±úÝ{zàû}ECD¢ñ^!É¢pØ#çJ™ é~Z¨H8—ÑÏ¥ø³ÈNÁD!Q½$\8(Ô{uSM.Í×:ÁdPhwã$áFŽÛs¦ÂFŽ¥ïË8Ã+²È¥»Èu×J¨|~†×Ô6÷É‚*§çï *u P¹ D5BnBH¤ZAx#S½AÏX´' €FK*µ×›œÀGg‰Ul&ts3Ò°¥º9J.(?;Q¬á­Çøò2Õ¥ùj#aE‚ ")Ʊí3 È•x¼9ã‹øÄMJ ÄÈ­cÀŽÐ³ãvÆXÇÃSëŽW þï”òÎ<¬ˬ»ÝzÒˆ~mójm£|Ú*_:N®7¾3nµ¼àéä=R«»Q†­wGe¹Gï'kœS‹ä6äÒ,4íÇïZœ]T¾løÏË®""o'V”ØÍ[ÐеØe(Ôf6ÛòIª·N TrÂä<ÄX,Àî“ûH=*òj¼[£Už„†yFì’ ì¦ôkŒ¼DK=çz‡ ãɽ}h}ì"8J™;j¶‹áß]ß'¦(©Í°¶œéf¹5èÖÓ8 |¸GÉ 2<+ F„ É.T£éƒGÇÖY0ˆÎ¬¾0/Û@ü041 3a@$íWäì×è5V‡nmAÖ¥LòÇß×»9z’E@XÙv‘ù€W1³ˆ=èæ!†ù³ãqã' ”¢óªb§7LÛ+4ÍÑF–Ý'éÍ}äÙ‡_Ž œSý2‚ˆ@ñå–­gà”÷KöxZ”y+TM²À)E ¦`-ðÇXÖDûËÞèVâ—3N€?cSk~ØVi(¼Ü46BHñ¡ç‹þoˆÍЩ~_٩ǽSF Š- h—É­A êAˆø•ç~µ8¼ó0˜0GÂtºšTÎ 9.ÕûÊÙWbÉ#^‚³ÁT5­ Ü*é´©ËDp§ 9@Qu¬ÉU©åx¼0èT?>4&œïKK2§V\²¹Í™m:!$œÀ n|ïÖu O4©™+^uš”ò©,·È‡ÇÅe¶á ÉÐÐå§6$²1ò—lGÅjf À8Æ›IÞš2b”³¿8«s~Ì=ûïξ'vþÉé‡ `±¢8»ag†ßa_¿¬ŽZɳ]aoÄœ¤ö…z"°j•x4í& ïËÚáu$ûX|·¸ÅÑí„°ÆÎm¯_~²pËÅËèÌËâàÃoGý^ílφhQA-(x<ˆÚž×SOÁЈô¡K 5é£ÃÒNާ9÷fe¿Œs<*`˜>®g‘Ã)… ÉŽG¨îIB”2$”Hà×\:E‚„ž™ÎSí¿5ïG¤3Õ7ÑníçmÁF®‘ß~tsz²«Œç)b_(9\°ë1ËÚŠµÜ(‰dΡä¤rTFïlý·1F¨:w®­³å¡ã‹ô•ã=¦CŠUDs¼°:B vvRéÛ< ÇYÊ¢Íåш³ † ”@Eý2Yx’ê ÂE· ùpÈ>wŠ¿gþOí>Ó…?T8Ï·<¦Ã<áaù¥ô`a‰µ@m1 iUQݰŸíÝý$!%aKj´6Wµ§[= ·AÇîüjQtüæ]3vüýzÙ®kË ˜‰Z¶5u¬‚­œê”éºOTŒ~¹Þ㎺yv\¤,!D"U@¼‰p“Z“ßW¹œBùêÃÝ>²ñë&8ŠiãæÍ÷ÁGlª$AŠ–Îe˜Y6€,¡xQ'TÏ)¬¥wnéþŠhŽϬwè’Â~™&þŽKl§ï¬O»iËà LGµc¾»¸ösaÊ^OyÚj{ê‹‚Q`¨ÓMA˜0¯“¡¤ $ d 蘆Û}8Û½lß5Û8Èf‘2¤M! .¼ ìzÏÑ­_ÆÃ†tÃa ×Çx<àTiÞH#BðQ“~fñ#£@°¤‘-þ|P2=øÌRÊ$õtsjxÁ­ È ,µà#H×&€‡…œkœeoÄ··AÝhlëŒR¦"NHŠúµEç] ®Ku|wzyÌ>³5åÄð¯h¢*ìÖqž3‹OZÏ4ÑŠÃw@ò‡‘8ÀQEÁ>Ü}ûÅÜ5~nŸÖ˽9ûn©ççÙ‡‡‹øÉ;“yШ®[ ääØCOƒB‡N‚€2'òi9TÑYø|®m~à¨Qe  _Š<ÄA$vεÛï;­, G<ÄQÛQâM–þýšÔ9±XÚ»™ó_7·v¬È¦ŸÞ®ßêÞ‘¦œ/4àõÇs\µy¢ÏhŸ)¸öþ®dmY9£MrPšf1@QŠ5Yž8vœH…üز%P}ØS¿0¯Ô¦ÀªZ2i“žXi0ò +û³2Ûh]ë4‚!TÌÝù×è’=½ ×s–NãÊþ¦µë?8|ë_–@ò˜2¤‘°O\q’¹X¢^2ñ÷~º¿öO?WÆSÒu¡^«lJÕ­Y«K)Uà´}kïZ|éOo!ǽ0䉢mŽfÞºà‚/Yi!††âùǨ©i~Š„dB[S|»ÍüGúÈ`“U©GçÍ&‘->}?)Ãüñg¾~Ÿ/!á Qš9hq–{|Sñhu CÛŒŸ‹Õ:Íà,ÛgœÞöÛZ¿½üL>·“æ©Ò  …h’vXj0±+ÏÔ6¾© ¨úó?–B"(±••©c:S¤:5LvQ4Eð s®=jÙv5:„;A—é²,fÛ‹ ×AÚ| '·L3`‘ßvˆB;hpFqÜ Ãá©¥B!y8FC†¼ÜR; > ‹ïF>n÷²í;g—«Ìù©ßºÄ8ðë8H~Q]Zׯ¿Ö{wñ¼<®ÿŸÎ„VÊ}²} b÷á¢ÛrçQÂýR`#±4æî8‹ÍÜz·Õü¦'ŠWºi:ž7-é®­(ÐOä-;h@X©ë´‹6‰àÃðm”@‚¨W—ÑÀ½I¯ÛWõvch‰Ì‰Zú‡¸×R7b9ò¥"‰<,‚Ö˜0‡doYÉÁ‚´¼1ìÓ Ž[줊@“Ëx*o†Öðôí¼‡UÆ›Ãh¯¤”Îomo%Ù$‚ÃT¹yòk÷uÛ4(ò—O9ûÉ}ÐòïoEWálëŽE C8¦_¹„Ó§zÌbv“.Ä;ûùšCÛïU´ñŒ> ²‚°1ÌÄÿL¥HÛ/¬¡ìb­ —vM9Ÿ]ÕD4ÄwŽcæû¸ó:Îð™’^Ó_ ç.Š(QÈÜNüÓ 7IËóÝðœ¾y¤òš|ê÷J‡Lñ?‹"£çhM‘Äu…3*¨ú<õ3J‘eXѦ’Ùá!Ø$Ù¥Î_Œ¢ùC×,»é ¢I%òž!å/0[q§Zíãw®XÇÀdŠÅÔ‰HWª·ø $5¯Û a#dY«\ŸÇ>_èÃÞ‚ó¡Ëžb@8‘ e ü^‘öb1ÕéÆ[^rêÁT$GLºC »)ëÇõ¬š¾ ŒÀm•üáS Ê’îÂ{LvŸM ^ˆöENRI%ª*ƒQ‚ƒŸŠY!ýÿšÙø³òœimCÆS*9Ÿ5®ìôm§¼²wx2f¡1&~|×Çbc çFNüíÀœú§¤›ê†•òšÑàLþ˜QwŽ]´Ãc‰‰ÂqlÕ¦uqDcz(*mFÛbòÐö‹i·¦Íôï¬ÊÙIÿÑKTTaß] û9«ü”¾ÃH!H'úñ}#çkç5„YŒ(‡U³3ïRã)QmAçI€ôÞD†ÙÊàÕÅ^0/Ƈըeü½$ÆiÜÓÇŽÇì¾8Ö-süï1YñùÆÏ­O\¶§6™n²Ë+RdužzÞÐêì‹3ÊæšÈÐí0ØÝó‘ïѯ0éFÈÞ—%Â5¡6øaâ«*9BB¢£(Âuã*šŠ!˜§#uòs­Ñ~`<)9Ö$ÊG’†e.®a5Æ7Ygį(¢Hwzèä0¿2®AĪf0©‘j:lANÜ(v…%)YSF+D²$†Œþ½lãshßÇ>w]Dûø½1‘/gÅ“7,ä†e)dK*t¥CÛ‹ Y`×N¸ûû`‘ÎqâP×”¥‡ƒÄ¹Ñg&(a Ë´“F’ìA·çÏ–èãפ•Ÿ½›DGOc"–ŽÂx½èÔr„áýÿÛÿŸþŸãýßßþ•§ÿ¦¿öakÿ_ý¯üv:]xß÷rt{kLõV9¿Í§X¾òµ0æÌ±˜':¦œ†…ÁÞUÏTdÓyi†Ã(ÖÇÝΩ®J³ S²F´ìˆvyè®&*î`/K=TN奯;>“¬‹nÌtíJ_ºÊåÖKÅ….×o‰Zƒ4‘wégÄL0£]I\9‡1õ òÏ1‹ °#0ò‚Ž·hD»Õçq=Ú¯>²EJ„ü3¹¡¦H-M«Õv^ ½<€‚Óp~=Û£†gðßq߬²Èîk¡ Œóƒ¢WyÔvo#1ÅC.ÿÒ{Ò̪\ì†I’w¤åáGŒ4®Üéò®{”“Ö‘û„óq†4#3cPæL拼šÄʲV¼»¾„s ˆó8·ÖÁ‰6zÁ9_šiGª‚M. Éégk"WúeÑAKÀNÃAí¨vÉ„ëô-ÔEî“gBQÔùت²„ÊG4Ä3.tª¹K¼´‰ ¾Ö2èÂ2{€¸ÊõÝŒ دº³Ó©3Á>Z“eeàå 8\ÏpàŽû Ý'Þ1Ou  ,zh+`ÜQ.›ã ³|šJÈ#+µ· Lù>q•0HMž\ QãI§¿@úÑÒÛÙ+¬#'$àãû”'|¨÷`¬Ô¹K£#&g’\•]\ R\Ì\ÙÙ‡¤ˆ& BÅ“&UˆM˜´*Rˆ».ݳ:zwôdO¨ˆzžo½ñ‘ž/åÀô€bzËJa ÷Ä/7ä¯<t£º|±äcx˜o7šÅÛÖì2JÍàñ"ÜJy|'jeb~hdº_^ÁAsù°$+¬€—ÇÀÅ$T÷¢õ^'j Ë{X‰ô>•ê8&v0øÉ8Œtw#z3S–¼x(.݂ъ^Mæ ðø‡÷܆u^ÒY›ÖêÄtí±¾Ï÷Lxá6ȇC’'{ çeŽEaÖÄÃcÎÁ ¾)_RQO¤•öDòŠtñè “Ó¸œ¦¡‘h~·ÐðGˆÈï݇ץ^ÚòŽ/·/>•[_E"ø3¨ár>hÐUë&øÝfódY”ƒÂî{´uâ&µ"Q×ÔòA6°œ‹rãë[Ÿz•¶¿½©GKÔ]ü qµ‹bB·¯ÐÇ}Òþ`ja*EŒØ„Šæès[׋Mü+q”…½“ 6« HÎÃjÚø¹Ë:Þ‚ ›7åe¡]`ð†ˆ’—-ú«X.‰]E¦MŸ ±M°âÏ’uDjí=Ê.Ù×!ŒÃ=â¹›:Ùòôó¦ŒèYxÚçÅÞ–õi"= ¯7³ÆH {g•±f–~ôÍúa ¬Ñ=ƒ{tŒÇ\”R˜ñ«.AIœxßnÍTLL„c9|û£*so7Aºëßc„o79ßw”%R¦áš ŒE.ZOÓ)P Ž*Þ ðúåî³| kwºøÀø²y'À!©»5g³4Ò^ ~NEî<,zò˜ÈªG5ŒÝš½à²ñ²“ÏÞHJK&òc™¸úVG UbÝÍ/Ã¥E·Åú=·²ž¯r‘n»jøÉÕóÁ0ž¶ä¬ÙÅŠ1 õóË×׬ü­”Ãà YÞÏ :ng« ÃzÞâxš¹a4J…Óê‘È샵„eÞ’Õ0²bÌÔ°9òo)LË=i[Ny˜³ ”¸Ž©£e Ò·ƒQ¦Rd(úŠÁ€¬Ó¶g|XûuÎ:#úyœSÁB£w‘p(ÞÌ9”žÓÃxð  ¾Ò Ö,jMùìûŠ$sѬ0:~ßDZ’måùdv.KT‡L`QÜÛE®yZž‘Sò Þ]ÙBSä*¯J/c»¥È‡ †[œqÃD9yv<ŒJ|¹bSÖ⺢ÞsGÜ<´ÃÎX¯K6› ½ÚI/x'ét"c=¹“ÌWívT$%«8Žº&ÞÇÁK«p˜V ñ¶žô&À¬ÞšG*æÛly´ŽÃ†“zSµ"€3½¾7LŸȘ àÙ²ôYÖ5˜•˜e}•çNlQž´Æ»šÛ ë.šŠÁ8ƇõkÒ?ˆ ΣMÊ4ö›|>ÐÅM8¹w𣠔0ο[Òéé¬xˆJ(/‹;ÎQpgÛÕRýUœþt¤‰ëL&Už›ÉFy£Hß Sd¹Ä–ꞤݭQ¨ï ¼×nݘõëyprŒÎ¬K膇ƒêÅ ë}{?rf‹@#æ f˜çQ¼û€q)¥îÖö·, ã&Í5ôª‚uÀ4Ç}d†‰€x1ƒ¢kì\]ï&¾Jø_Ž%z­VÍ_ëÅà(üàt51MéÞj*%*šeo/m¢h•®­î !J‚Pp‹xv¨Q…,$;Ö½Þ ó$G›»xæyÖÌBeÁ%©±@²ª©;”k0AÕÄ[ ½,ªn*'‚)® 9›Xvµ”µˆ®ïèÝ—|¹È§©¶”§á½ÈdW]{ $mtå"*aåzmåêÁ³c[0Müin„жL¸Ï¾¶Æ€–< ×ÅÂñјþÐq?Y¥ªUyJØåç׈ïÚvžOs’¾¯Sãzà‰„¨HŒÀîŽeÑOö©“&„0ˆSxë€a°î23i#œ:kGŸo¤é‘;'eã`ÂcIîÑϼû¾P‹ ÒJ!"Qhª(f–¨¸l'gGZ cE0‘a»GP$n)Ä4LåUÚß8Ãz6:©@êýìWŒþEx© DôLjÇTp”jÛûyÕ|.ÆÄËâU ò …„@Ý3¬Ÿ-Ó("•-Aoj®]w#¨€·,¨ö.4ü&Û/´­™"Í>¸¸l(M‚>ˆ¡ÍuTŒ2GóG8¤^3î¢[îÀŠ“' w:rögÞ€­Ï)3 €¢Q룉s^Ëuð‚Þ@C¸^³2Ð*ø7«“ÈÛ´±îí#§O\»]^§®ahºÎ ŠM}#*UB3Ön‡£ä“ˆµÉÖßo [ÖõøÏhÙ§" 3QÇ×}Œ µ/NÍOé~Ž«ÄÕxïËáÀ¹i·\f1Í®½S Ï4¶qK•6èg«‡ÄÒјf7¾AodAN ǰ`×oÌ6Ý†Ž –ÛWÐPežzkŸ!¢2fiÅ‘ôxèrÈÚ‘B; 8S܆‘Q±Úòvp”,¡u4zŽ:¶OwIìÜÖ|é;5É~lÌA«‚Ü ¶6p†¡:èª^”º&ò_µ[Sy­¢çÁC\@D`Rå÷Cl7®¤ú0ºuÇ€2¹4GÉÍ ë ôk›Ê²ï ùÑn'Ñ>UïA"ä¨ÎÖ8_"]Ÿ¦Ú23ÃG=îœL@•¶ùó6óñ߆6ÏÌ3E=yÒqh®NLB¨¾gÐ}SïJ]í>á^Û¿˜â Õ $Þ»³oÚ·áÕ©Çù¼ šu&9è?uˆƒáR-Tyó†;MS–Ãß*7|óñ .ʦl–¿'Øæ²ŽM-ESŸlIlèc`E€ŽyqF=­ä%Ÿ;%è[Hz Ht¡éGµVjüLú˜º/®‘LS þ©Yé0_ M¾?Ìd.f’|¬ôÛy2Ù›êå dRÐoOePÒ2tVl`Š=̽״•˜M=WN\ß™ÝR{ƒÐb/VVýŠJkˆ‘ã!Ƨ` i%êÒ§A^þvH=INס{Æ ûØÓ§Ñq+bLö„Π D}X¶Ê¥ë„¶å!_W›Çäô_„Ûáµô#÷ÕF!@3æ‚ùj®&”Ý”¾”VaΆsŒO½iΞ7N^1ö 8ô­.âr.ùoÍÌx«•cäÀÓ5;èO;uUXÊ©´ÕÔyÒÕjÂ,§«1nêDÞÍü·4´³Èh>Œ=„÷ ê^,0¼S ëæò#ëÆÉÅn]–jÄ2Zfëwpц›PL’–úâÌøý¬YD®ÙÛ@™Ó H•SH<+šš óR½yŠù\ y!~@õ¼XÂKC¶Þ)Gqˆãa?ƒZXF:hE˜$K+÷ ×c=gÞÚFF'ôCx3¶!q-ƒ¡ÇÎÊ3YÚ.𥑥ÒÆšâŽ~pFš•Ü™C¥ÇóÍ·=Ám¹•° t˜tæÎaôöÒ˜  )²ØPÖ…·Š)Ÿm’Æt kOÄzñFtB,›¤åörç/à_j̦ÕÓ})Å_‹÷ß-VCû¥¦ÞÍ­aÙcßwÕŽÙ¾nвˆ¶™ gHv@îíì¢Ø]&ƒZôi ͦ¢QÑ€ûÛæ×}7Ðai`ÓeÄ ×ÆÖ:·Éìîò'DXÁ´û]=òêÒ7š.¡u/Å%P®êñ„& b-ÓžÔÌ)7ˆƒ’ MP=u‘Ì™I>€-ò7ŠZ¡Â]<]žA`sÏnÎÀû#¹ËA½4ÝáWî•r Ñ‚c g´ƒíBo`H‹ClwŸÛzN£HõíÔ†ØWÁÌgÞ:ßl‘ VÍë4Z&Û°¤¿-5„4 Ú˜áœï'ãOêÛ&Ãõ”HJBz ü^³™¡‘õQz+À\C¤¡=·) œ)Àð–-™€@ðå0 yª¬ê‰=¹ÓÂ…r ÚáÏ:E}¸ˆ¬t"ÉOäN¶övâm®ðÇ»k¦ïMÍÍ—„L ó]·²Ìæ"ÁMœl?T…0µxZyTc , f†ÂÙŪ֠àû(ÆÑnÅ­ÄÞajFny[N|…îj4;ð­Ž´÷yP8T„‰é"½XxkS•-|.òSæÆ(¢‰¹d$ãŠ<’ ‡D 3_jï¸ýºz}éîÊ—Žd“êAÙ=Ê—µ3®°­Y²kžŸb;²Í»Mzžš¶=8QéIhSÛÆŸ`òfPl(" 9©þöí*ÍëW­goe/œ´¨Ÿ^C+ÇÄO‘ÔÍ Ù5‚-åj~Rv@$á} Q-ð)¾<ëƒ&p€pô¬‚´?!6í¤’A)Zê?âõfWn˜¡Ž/z æ·¢àƒ ÇtèðøFø•!ùû\H¼Í(´ï¹Œš ¬ŸsÜ-­ƒ5 Ç9«haÝ 2j+í0zÎ¥(Yü:òc¾~DDÄ2+o?å6CkÝ¿>ÐX‚;7Kò?1¸(áFt=5 å'Vç(ƒ°ŒžEj)ª‹µåz³ X#Ü<AÎSc Œeê›xÌÛ¥d¡ƒ\YqØB/+Õé åm€RÜå! ò†êÖåÝ>C͹ËfØ<ÄÂjƒGrÔ–ë/NÌéYêú²–{ÚX°W’Ôæg§ëÆDX_LíÌõØçb–:>,–öçUG=U½´¨Œ=Áî"J$ð˵Láà€©’+µ"°5l PsA¦›Ñf­oΦl·‰ vKÈ,͈ùçìëÅm]Ö/J­÷¥¶ŽM­‘Gèû–rpf+@šW_$fñâÏ 4TB§„¤eû•D½<’i®çˆHÍ­ì†æ ±<%y;áCm(·ec¿ uƒÜÍfm“예 ‹yµžR¼lð-2,†g€£Ø›œÒç DÈa´ cá ÃŽñYßxTBàûJÀÁú|L¬A½VO|³™Q¬ËÜ÷s{Iž—õ©(—Ãý¥½ ÁÖƒE’*2Üá[„f-z‚œ¼;,Jˆ¸Î´j÷oëjë­¡M¢¹-¥{VW>PË‹Øq‡nG¢ôËŸSkÕ—f+í ÂEF«nåmeŒ` Ð#>8`·õ±ÞþàïN»9Pxƒ—”ìDWÐE .úóÙ¢YÇœ9l“»_‘ŸÏž-Øí«1Ú.Ï(¾^P{58W©}.h~ÉÐaò W¦”áa×ËtS]Ür …—²|S4÷ƒ"ÃNpk"œLØCrÂ×§Ã×ÊuÁÞT<µ†‹ÒGêš©RÉ÷z­Žb–T߮ǖ(v#E‡¹ê ×FMâî¨à5ÏSú¥ê­|tû79㣴G(ê,¿Ey6=¬>ìR ±X\,º³^¯ÅÊha©0}€ê+“'3¿x¡|A=lj¶©~Ub0@(ZÁ,'W2¼íMöÔî)­ð«û‡Çë+¯aÖ—˜Ðó•WˆL^Éd{AÆÏÔöw„mfŠ ìgßîzÙ.y¸<Õ<=õ6!Ò‡Üu¿¶žÁ2ôæÅ ¦UÅ3Ì¥AŸŽÃÕæª‹—šæ‹©¸-k×óE 8#ÔT™ùixS^š›«Ž­ÇÊ—,q7Øî™ÚÑT™]OæOIàM7•Ê|̓ ž‡Œ`©óÒò%sÅžš‚Fy)X!´¢ù$¼%àäRxö >´NhõVUHÏ8åIyØôó‰ -1¦ý |N!’ÍæN Àj,¹Tº„GwÓ_Îûëö Y¿®z7µXóÒ¾ÓíM• >­Ð6«’TŸgç5PÙ tÁ½fh£’ù,Ë­vÀë*ÇÑ8gc\$BìH`póR-në•Hqçñš¹âÛ£½f! &ç•fhùÄüa¹A¦KR™ÀÏ£Êä³k )ŽÞ=HíÅU¡d§QT"[·´?Cu&Uô1W#ŒÙ9ÎÛœM?»|‚k‰ä²˜­\Odò úùÕ×ÁPT€™/pâI´Qn 4@£%¯F@1tãÕç×dʆ¯)ì¥È1Ò%hšx'Öq5¤{e(5BÌÉ&§<‰œ·ÅÉ‘êV «º<F­ à}6¸ëUñZaÛùEâºú™–7ªîšfŠ y b=wwì í3ºÕ’Ž'8š„`Ué K pkðõ¡Ù î †µ J[mô]ø÷8ªÅ×Ò'›n”ù££žÀuÚÈvUã:œp˜âÀךֆ„™¹LpÊ4ˆ,¨âÌéFYÕø†ÃœUéë¡Sޤ0æ:=Å^—TÏYIqÍW‡ÁçŸ‰Žædñ9­"ÒŠml»1/ …í[2¬NÅÑÑÛKYÏ0ÀblÄÉCÙ°G±žPS7U6ùëÅdÙ°åñÔï246„©ê©1{:ecN#kÌÜ93o¤ØÖ¶7–øNF«Už¿_m%ã±é `é?_àÖÙm!ð/~t›Øa¯V A¡gàÇ6ä7'µÙ7¡ ›\òX²‡w|7‡ â#ãc Ç,™Ð€µO'µ9-„¯iX’ý;ä4-¿«Ìç’ÉÌàAŠ–ÛÝ ìªDxf3OŸ¹Ñz¡GÖ'/æÔ‚óû)DßÌê«ÝÅ´61í †À]Õ”?VW¨ul¤cµ½ÆàÚ:[‡•zDª¶ûû§Z“Ûîl†g·¶[³W©}L¿U­¢g:E†Ü×M œ­—•¥#¶½yæô4YšîÏž]*ž*¢,CÁ©fC;q]Ô)¢³4ZhÉ´yÛÉéH `Ì?gîP9ùGCÆZÖQ›Æ¬5\¯àmæmÚô˜ 3Àq4¦KQùb8†Ûféèy=мÝÑ™x›¼œ#̽q‚€ÃÓcr›çe€ª-¶ehГ'çQ°ßYn PUy€W²—Ø@Pl²ûÞbžÉcñA%`îê2`Ã2žzåa}P½Þp3½É¨nRì&Grõœ17Ìë!‘’¯ª°mÓDv|ÚòªJ7àN¤½6xñšÒì°Œ}é%p{g [­^pá®á‰À¹-+Ç> -~kʨ|¶DQ¤pZsñ EZ‹H#záƒðz,Ñ<¥15*Og>æ¼òמ§µBF 2‡.”AZÇ3›p!DýÛQò‰Ïôø™^_h·¶y<0µªžM¼=ÜÆ?cîsúœ±ôAõnÑ—"É2\±ÍCÓ¦Öä]Š©³ ¡¦kú•|{œÝÝÓ,|³@¸1;7“LØ]íØ<ˆoÄnž#ÒTA]±»«ÊZ8¹áá6–5%À¢…r?:k›‘qÁ蹎¶;/vœ¹ú.žõr‹<®âÎxýÉrQjUŽ^BД^X/ò°¼¬g¥a¼L³Õák?scµžed{¸.¬²ƒzaÝðƱb¥‰sPj 4“¢úÅYW:@ü]n<]Ž7;ïl(]¯”ªdpà¶ýw 4XŽÄxýé|4:÷ûºEŽœ|ë±TÒ©Gå÷o >_¨6QvÆeG¡Z,\ïÛ¶Œm3¬§ÛKS%]’0ç£%šf'µjF3x È®T~~9Ã9S tM*èd_SûzÿOæÄ§7düL£—Aª‘“AÒƒ>*¸lÓó¥¢÷– @m+|y«D‰‹„¨h.†ì§y’`¢%pu¾WÊ/bÅ‘ÕÏ쥥VÝžxœr8XY7ÒÍ-" ±öñ”rLËᵹ䴵n%Š"³CXhN˜ôz›;ÒOë ß€Gëou!cûp!RÜnÊ`÷N¿ š¸äøu­Râß…<ëÖƒÊâS„±1Åp9Âõ«y'Ë^[q44³ðIŽ1A¶#%å™K_„$¤D ;&W_Ò è ó6úßÜ‘#»mÁË`·>ì$á…Ö¢ª“ˆn5ëM÷Jßí°Œ»*.Ng8UóöGŠk/ƒÅÖÍGâiš¬Ç=K©§cI½!æ/7z\5Ì—Ö=^³Ší3F0r1Ù ¢(§ž2ª Ob ËJ8âH8Qo×µèÉ©D7¡¢b|Õ#؇Âò’ןÀ#K ¸ªòögZ >zU*ì!Ÿ4m¹".&û‡Èaoi#—jöǤp«Õ¼h~(%“R¥Øñ÷®k¸`±+²Ém·œ AcC9kU ý:îß«Õè œe#´l2`W.võ!Õû…Š¥ o(yÂÄ!}>U“½ßK)ZÍ^(sq8HÆ–å[*xæd#ôS.¨®éK³Ì¨þ РÔà´7> ï81·œ=¸Ù\Ç€&;3¢RÀ×^³b ŠX‹ºUË÷oxϺ;T|3¶eP\5.¾Dg ¯m“lT…˜¤> †n8žÆ=Nô=Ø÷ãsÏJgŠ:»Rb·€¡´ý…×Âb«2øç§2Óvîì³^6Éš:—ây‰Ò¬v‰¾ÓydJñxâ eú<â©Þßwªô¬¯xJ),ߎ0’(|ýÝà¯dø¢å«”ªã!qÖÛ*{¥_Ÿ¦ópåšó6¥½½eÉwLgÞ°švé¦K¡ÔÆ,öK0-Y´Æ%dS»p®^›È .†™…‚e“28¤¤JÇ iE…©îiçПkA zìÓ¢heÉ òn\<>!\#h3>eQß;’ñMšÊ{ zI;Øþ~FgAœoŸ–æTÉíÓ=' ªêl^µ·•G7•˜çyrBË|1±Ì )ãJÅ6+?X6¿zõöR!"cÒ4CÍ)x£GeOQObÀ1ð*!:K+†êŽÆEE=JÖ–ç^ ô³:¶,í„­¥÷›SÇ”ŒÓ¨BÞ¡qÑ/c9­“@I&B=“cÒSƒ„ç«<4ž¦Ï;do—‹ëĘv~_–Î+Ï÷“ã?€±üØ]\‰Â´#_*â~¯ôfà¸GLE#£Ûz±y1ÂWTÖÇ¢O$Яhݨ~QÍ1}ô•µêTÍ dzDBvèÐbW½) |uɺ’t{Sf-ܬõ¦ƒüJHî¸7Ä`@"öj@–íŽc§ õ€þ1¦ê-m§å&dͽRÆÔ½¥&r°Mænó÷­„54“Ôˆ&oYì?Jíb»3 ˆ6y*¼*rÈÓaŽ}OE½ÙlÐ×ì¤ÉöxLÔœqWÊ“ì[Õ”‚`ŒŽY :ñE"{I¢[AÝfÆÀðnʪiÊémÙ¸Ã×Ò¨@i¹®v¼¥)ߟ(‡7ŠÊv så›kÃÚÝ 5Ú¤GtI=ÀbE½~©Ô)¤c»V‘»±Æ²=ö7<ÑR즋/_J q+¬VpÉš ¸¸f‰r¹Kç¬^z@B¨h™Ÿ‹#Í6§~‹Ñë‹xô#Žå-:ZKg’åû¨â?/ƒÚŽLâõëA¥þ:šâ3ZøÛßZjwyýð¨Œ)Œ$ ±5&xrKä_‹\¯fäÙ@vý×û tRÍ9ƒQæ¥{ÑKQru>½ »F~kÑæ-9'xl™}—GMb°G•jAè•Èñ{ÀFrà^}¡=q3…¾²”O¬-–šäØÙ4j£YÄ£0‰ES“б]ÂËD%àn]Ùò^ø¡qL*ÍeC=¹°@àÚ ƧEÆ3ç "NzO%œ†£lÙÞ¾QÈl*Âù|òÑŒØiëÐQïÇGŸÌ¢û~Õ=”oÛº\‰ëQ¤õ(GƒL4`U×É"ÆèÔÏH £39é„ÂzäÄ¿OnW]‚aœ£Ã©Ðµ~,ãöV •r™lŒÌ, zV,µ<)/‘d5(ðKìóÝ·PÍ4ÍQ*¡?‘üz‹Aàƒ“x2_lŒ?ûâM–‹iìJM·ª)|¤Tδ¶ÔÙì, †A-ö.ß³y õRF ÎÒ`›¹¢)ó¨Üð3A¥ÇkJyIý3Ød~i’f¹ÀOÝaË»á¡PùÌŽhl8ꎌE=3´”-pÑá2äĘ ±ø\Ý>Ò×hò^=‡”ŽŸƘ}cx§>0yŠú#%*`„÷Ö²ÜNfœÝë°â7 ,ó ÙNÝxóÓ޳À”[TvØE`ß”QÇ Wùò  •’ca­‹¼Ò0=ƒU|†"„‡‚©ä„‡´w‰’qó,$è0‰*Êz Ýž™çÈô]§L{fß\ÏÂ#Yzs]ìÍÔÊÂ7… Éúš×ºòVsfXÞu&ª˜\G$i$ò¡ŒV'=V,ìÝŽ#Å ƒa‡éçñRâeÏJѱóqôë©Ì 4ç'‹Î!§²z¾O8ìê ‚ÊÍ2ðÜ2xí0£(x’ÐY ŽÔ‘š}·èCУuxÝ´³2È?ÖXt>ÃÜò+>L™à[ z=²À«~yAó3ÉMOs`A-˜çãL¼t –Á½tñRÝÍ(Îz*åÕÒ7¥*0´^”×¶KŸÔ3ˆ3Õ¤RÐ9ç¤òuñVk½ò;l^ 6*M£¬!ÇVËŠ›fåìM[Ü B3µ- Æ ލ‡ZàÃXz^Ÿ*û—Ûw¦ðJ–=¹ÙÊËy­d=q[åÏHö©¥øC ƒÒÞÊ1S¿sHu"O*bEaYçBVƒê ºtߊ X¼c¦åf>!”øSí“K ¯3Y]Ùk|'g#eŸ®w;ƒ—ô‰aQãœvõâ| :àVo$gR¾uñ—yQÞ|OþŸÿHE~@ÿGý¿àî?ö_ú¯Oý³ý_ÛfÛÿeDgøÿ‹×;O€µ"ÿY¿ô…¯ð^§ßÄaºKŽÿõ»2rò]›#çü´TÑŒo]̯sýÂgÿ/üô†úÅÔµÿº)Ÿ~:ÿñœ¿òãú0Ó[uHþÜ ÿ^¾Ïãžw½ÁÈóWÕÐ×ÅmƒtÿÝíìægSoîøø´ $?\ooYP¥´'æž<üÅüÚ,†H™E5AMýÿï"h÷ 4 ‚~~÷úûòèô—÷õ~þ3žª“ž(øë­mãü^:ù¡Ï×ö=— ñØÁ?“§/Ÿ§Ÿþ3Þ [£ý‡É­þŸÝyñZ—Ä:+󆮿Œù×$Æj@?_ðû}ôðc±æv*ûn i0™Ë˜ÿ=A¼üÙþ@þSfégæhOÏ;Á1S–ò øó¥Ãç½ÝÙ'óØwÙ ÞÖ ÿ×Úãññbôlüïû:ÍdT€J¨PGø-fè£ù+[ù Šýk:ˆ“=©âí2Qüt2÷¦ú)£á´3êç¥}ƒõÚwTéú¼ Õí}S¾U" áOÒ/r‚‚?¨$ÿ@˜~áöAñù:MÝ£J h ‹ž¼¥WC[§ù@´s¶°ËðU'ð‘aT†þ°<Ö&@„ëmmùð›#ÍF#¿eàÇß÷5^3{ø ƒ•²F]͹‡{þyc•=²Ž¥süÞϤÕëÛW;ê>ä¶@J"¨Qøa_AÑ ‚ÀõàVÏ߃olc+#§LÐûKàÆ¼œ~³C?«¹þŸÐyBWòÌO¦aõ½évÑZÑZRü"¯ª²ªšJ?Ïu«”+E$—𑺤g*™÷?µ©?[œø_×çöáxViàõÈ€8¾45%ì8nøt>O I“–@¤-¸ ][NY”Ûb]~E´ƒ¹”Q‰°Ë,ó akk3°·3òg§¬5œ„2!‘>ýõ—¡¡ È ¤%”,†úÄ/ò²Õ»lÑo"g‘$´ïùuVZˆ£–tÌH.Zò={W8Í68#ñbÔÔ ¡ ²x,kMJb»k2šú d!/Ò]¦²„_߬ܰ+à(v#Ìû˜^^0¯Q«b¬€XA.U:‚Šyk‹~Í»¶Í.éÚ&è½ß|<ø×.°©l;_zù¼8ã=h…g±*y@œeÐíPEy¹Š/°Wï–ï*ƒ|xåêô :ó†›b|ŒJ[¶š~³;³;J9ÁAÉ—8ã&*Á„zPàˆfŠäÉÁ´å³eŽ"x«lÖ^c`ØÑCHÁ¥aéäAÄŸËF˜]…ÄÕ«@€B$s¶Ù•­cPGÎ!S@’B6]VC©—Ù°Ï’‡»#°ûR²ìóáÓ˜ØLÍáÉ8¼ÂŒ@6>_¿Ôýà ) ¤R5Ãâà$\"º(ØŒP°­zkäf@½1»‹apƒ‹ŠLd©¥ cðv~ïZ_¬Ò¦m†i™Ã\„0”%«!„jÙh ½&d­4/:7›r–™óFpíò7úÆOÖô-•ò§ªBðNÍ â²cCÂÈ»‚µáa7½RíR?öéMiA¡G…+‚®éÏ™HÝØ¶3´q¯!xš°XP¡ÆLúãxH?â.¶Æ]AðH•Ì”!cm+iݰÍL Û!ö„šu>3 ãAÁí" ¨òÒ4ŒTÂâÇT35W #…Ûvëñ—1496á×?ƒ°ŠÌUØV.¼•ã9Çvé„L¦9-Û‹¬Í/F¨ä»•˜_Þbq).5#|84E´0}šƒ[²4Ê6HgUR`€YFÜXS¢bI—W:·>šhjú²›; DÎÿf¿7x}1a”„!%D1\íó^3?žyªqVUû¼8üç4‰êìÆÐYÕ þ3ß>r°b„¦‹cÜAñɪ$Š4LFÎ+^5Âñz"õë‡cY8½g1Òf·J›¿·ˆÙ¥†-É¥-!‡õ|fh”ˆãÞT&ù{–ý²¼”Þ‚§D‚B@ë¤-»çäˆ/-"LÅ4Õ«éÈàêLŒÂŒdšZ‡g ‚YËqˆFÅá3K«†’™J¹#@2Jð›Ç¥Tä-W×ÐVGa„ð1·<êñQˆqFç.ÄŸˆ¿ 꺹#Âp­˜»ù±Ì+]1«Û#ãJ!§%‹nìü‰™àÙ‡·Fˆ'KBÔÉlDEÂ. ¥:™Q¢(‘ (Qç´Ô«†T*(oæÄ˜Zé":;ª­¬ð}]H´¹X²Ã-_~¥&•ªäÝе·Q0 ËÛÐ 2)€¦|Á¶/¨»ÇÌLMøs麵%…D«ž@4®Ð&Ôr¦E†‘€˜ÐÝ­•«„ …S Çq¢¸·‚X,* ´H|Þ﫳 ¢DÓ!´HZíÖç9«RË&! Á'—HuT–„šM§í*óiP®Ýêηuv%5«°ÜÙà£9z•¬3Zxp"§…(ÕWkp ëK!Ó‘sì¾NÍýú‹ä®±ùƒºð†  úw޽‘àÁ-ˆ ÁZ§íámhyêÙ4–ÑA Eݰ÷74s“zIFèêép> v:_ãƒ1Õ·#3:™Ï(eèò&þ¢–`›K’!ä!|(ƒaDq‡ wAô[€ª$HðeA¾ç97~®Ì£Ñ*ðíÅ ‚8÷¸Ÿ/ß=Úä,®½Â{4§©e9Æ<ªùÀ²X/B2Ä^užøÆµèÂe-<2D|[|´A×éœñ´‹tÑ'ÙQÑñכͪJ–6’  B wWµ¡ƒ^¼ùPßê¯ïz)¯}ê¦ÔW†•)Ó¶˜Û`Û^ÄUÆ®(°–­Bø~ cT%z𯉠|縙<9êÜØuUŸÞóó£¬Ö¼ßY7žÞ˜€æØ öSUôYÕ&Ðf^0-ü9Î^øã/IhA1¢:§D"a ¼§{°¥Fæˆ,Ÿ$Vf™bã!š*QnspØV=!ä$1Ÿ$NŠ«æò9"‰Bä’T*…Û`é+ðÉÏws±JT•4Œúë8†a †Âˆ!ˆÕ®yXYQÚ…í]•ˆƒLpz’¡šŸLJb‘²±VùØÖe42¦6b ƾ0ש£ï‹Þ¨=º/:q.­i¬H6 cc%’wÛ•·r2ÃØPbEè­@Ax(86â&5Zæq%—b|8±f%LB*P‘“-ê9”7š- ˜”ì-ZåcVÊ5NLã;3·ë t•àNz_f­Í”O[/tÒwC|íëT Ô»mà"%Ú%ø£àLü•D‚MÞÙ‰Ëo³mj$íªƒ¡•É,g $3n¦%kÁfÕÚ¨ tÚ*#£`=Ø#Ï8ïk ®E ìÚöpð‘$‹W²‰‰*WÁ–o¬6ÇM*ïòá¸ïé³EJ O´;46Ƴƒ†••ŒR* öø±‡‰ì4,͈B|‹<­è‹å°öÐIeƒFï3}{Ñ7¶˜öàzŽ˜öXÏ&ÑIå'}DLý Ïó æå^ê’†°6Ô<ŒûãTNïX]yÌT0ßãw•å6·AÄ>®îª†/§AâÛÞã<ØSÃv@çQ¬4VÒÆcÒPTnîÈœâ%ñaÛ5bPJ.ܵ VC( ïë0X±‡vÆÝ"m’ÈsÂé妚é9Mú²ì¢Î…¦˜ð Ã„›BRü*DF‘ëHo|dC 2QEZ |L:@]3c&× K ª'<ã b¼*$Õ°Š" cY¬Dkðƒ·9¸;Êrl6ÿÓç¾y5–žÙáéÔB‚¹•¯ ã*C– k00[wª|Ý6Çh§ùrĈ©Â‹"u! L[PvF0®Æã_: &‘(iF_૞ˆñ¤;K#üÛüºÆŠ³µ[>h*—Y’”åÌõÇÞ~?ºØ¯$îO$uj^•YŒ„¨ŠNÅøråh¦™!Ѫ *J3%^J )øÕ.Œ9×W¸ÎÚâ4ŒÔ{4†ÛlÄ›{~¶kJî—iÝÙüÀœ¸³m k=a†Zt°ç<¡©ŸÞç¿#%Ûê7®…/RfúÁðÖ‰gˆ ® rŒÂD%Æ{s٨¼±F¸(=öl"%›Þ;ñaµJ&IðÄÊ” 4âØ¿OF?’0ì,Amp*ºV ã$Q¡Xª9%ãþïß ‘¡å?ÒëësBÚ„4¨R.Æå/<`Ãm@”U]ýrîÁ:Á®†Ìßݶíÿ~^G®9»5D‡‡%ûà’ìf'ôí•u2Ùa€2 °ÄÑÞ ÎÁKök*1({•p'.4Mƒ—4‰¯Úq1Iæõz®2œcrUúá°ß]h¼VQZ«cpS¨ëCFb¯?M^¿=büv¨›û÷ãýi~%õ*Ù”!±c,2@¼!‰$”¡¨Ñl¸NÞ@1ˆà¢-I>"¢«ÉDغIcBÀ™j‰£¶ EMW*ØX&¸ÑA50pdÖ!–r†]jÓ£d4-j+“Ì =ëåØÙ;–pƒË¶RD˜¨ì@¶/µ À‹¼mT"ÄmÃõ%Öø_5ô^¨…Áq܈hX±hBÛæ]1ÈIéá,™³béˆáèÈ DRLC-#8¢Èì¢>tðaiPDÞŒbTE0àäˆiíaÞ³-‹"@P†DÆìÚ•W  ž<mÛÄñv2^d/ j¼™TNV‡ðT“ÂbÒ4ì.Ž:ÂG:â ÅÉp"ÈŠDëP‘Éc2•¤„/µalïta–—YŠÄÁg3¸•u•Þ¯gææj• l)ÌÃIVÌÖ^`V`$*L¾eZÄ—NåiaÜ BJ’ȵ_);zÓI‰¥àº„©j‘ÒdUš»d´O‘7â]€‰7ºHÐ%±¸m»®rUò¹€YE}*cgÝf0y´7h»Ižx¬FÙÓqB¨Cøá«Å‹r³[°ÁLÎj­ðN ôV ¨nåŸ"ˆ>ÇÆÃ”FÍówýoÃ×?5Zgæ¨Ù>vžÔSÁÚ! £äÊ*Ôøñ#”g :j>kìú;ÚÙ@“g†[YE- ›Å£CZX„« € œ› J ôç,¨ª ;JQëô,䪪­SÒ¦ûF·¼sc" ¬o{ž Sgì¨x 4/¥íbXiQ;N‰¼†u"„=@(PDz,>67`/—GAC¦ëÒûH‚LÚ²,'¿ƒ]±êaÉÊÚ6@yuËd`$ü´û«·‚¸áe¨æ½Qœö†PYµ¢é‰¦©Â«0šGÙDù:–Kã½5Ù’0ºoÂy$\+–€'w’åÂÑîkKÂÙ¤~@kW,T/!vo»ä‹úožò€]‹°NÄá°`œMvJ´Q$ÙDu îÐ&È¥¾1«v“dîÍ˧-°ˆ4E±Àó͈1qÆì8ÊÈP_²†ÔãóÆ- Qq9^¦Mqš¼?q#§A$z/Ö1”m®Ý6&m€á °/Üʦ´JàœA*mX’x õ«¦\c)U]ÇH”›ê¬@A`¶6GggÀ_¸ŸÖÑ{+¶ZãøZÌ¡l&?ÆÛ~©Ç¶ç÷øM¯Ï0ýþÕ£þ sòþóÅýívØäýzð~,¤{9Œ(¼'k–Ú&Ö‰z³,ÛKñ‹ãT‹÷?.ô³qw,`“„g¯ó~¹Ð½ìr”×o@ö°pǶ„‘cÀÚäÞOßv/1ÂÒÔÝÝŒüiàGÞpïk#ÕÞZàölX±É] ûY÷¯Õn­ –H$€K]ßïÚM2Ÿ“¡†6ÒROìÔÊñ„ï ÷¯ÇÝ|ìGc-#ÜoòX‰?¿ÅþhÊÖ»¦#‘ÏÐ\Rˆ¯ÈV´ ?pê *ü§üÍ¥ABPSƒ¹g»«L‚Ó“G 6ÆÜ”/Ò†€B»à8¼a¨W÷û^?,[ÿi¡#{·¼_ƒ±ý32•±M÷îùÁ½ÆABH²lú‰ñ÷úÑò»`¤ Êjô,L#~=“õMZ( ¤ª›ð4n’_kóŸXwãT?˜Î<íX¿ ýyëýwäì‚ w¶uTu*îúóœx|`9ñN7™³§â\džá +˜Ën®ÿåâ¼–ñÇ› ;Ìæ±±9Òs—McJVtŒè(<^ƒË×ÓÀä´³¾ük·K»‘†^ïzdÓNk !RQÈâkm™þwß› h̼W³– /aEµ¨"ù™Wż‹@PqØà¢ ¸1ïC"7¶}÷ʃ)ãÐ`!]†»ÚmÅîåp˜çÖð|Qº: ÂÞ6:Î%6ü9¹+ËïŽLÛ㾤ªÙ®p¿Ó"JŠ0^ 244ï•pŸµ€°7*È2÷ô®å *àn~SŽ÷…R¹cܰû‘ä®ymÈ[à (mýK¯¯ëåDL_í1®bñ â0UÕH·‡wŒÚ~Š¢u÷1_3Æ *&Ã1¨ýäëãn½äùŸ¬þ+{ùUøú®AçÇBh…! |Zóš¿ Â(þ¢†_]S›ïZÎ ÷|AJʪ½õ£f-—¶Ÿ8»t"È ‰Z‚†71.}µÄ+ˆ‚Á-YÙ•Õ–¨³]æµsn(¬`Œ¨ÒÅû¼8'»¸[b¨¢¯L•ŸâM<[¦úa&‡"z¼?üý=þ^;§®nÝ”þÚ‹1‡ÕË#‘üöœuBž›W,ÙyúîíÍM8ïsÿ7UZ\Qü™a@޹®¼P†Ír'‡%ö¡‡e-d¬þÒ³z =ÚÀYYü³Òk¬¸Ð d WPˆJÇ﮳Nø+jÏãúÀá†E6 ÊÔ#¬÷;ú⬿$ñ=ªÊG¾öhÑ\)ÔÄß@|mËuLÐHJ „‹,˜|ëU†&|ÔÎ5ë¦ÅÖòýé›÷.ÇZڪ覎E‰™lÙ…21§æ–ë|Þ•¨¯Þ‚ëTo®vŸ!T†Þþ¹ŸŽé“ñ¾ý‡êU%©gĨò{hНã>Šcøš 7G öüÖ%JOÔˆƒx q_™ºìÿÅgѶ„?¥,¡w sÆ®ã°ÜbøgˆRW,¼ño4PÇœkf´¿c’_J>åöÕæU²o r¨á\Kôßaç,ªRØu³ŒÄÿ™Î!~¥§}ÏÇÙÌÓfٺܧG¯ïÇaˆ¦þVjëÖÂï`…Tó»‘ÕUâÝ9”-,<¤€:½YÞ—ô¬"ˆ‚‰K–IŒ¾  ÂÔÒ 4ÐýÃðüFl„ªŒ j —œÆš!"ñgC@…k?\õ‡ÇüúÏÖ·¦ç×ë‘y9lŸ9;Â]vî}æ-_oÌ~×êw‡ÓïgÂ?Z,%ôžNÆ¿7÷/ññæú?ÓØûG >бàŽm'~wÙÉÖNÀþ¹ùïçîáVD~<Ç¡¾‡¡^ýø:÷ñ—Êþöy'Zùãüœþó¨*ë ³. ÅA\h½ÚˆÙé~*ççôó#ø À{BG’‡FD 0aþ»†þ¿gß¾´õø–×ß\V_Ö¨‡Ø!KZ¶ÕH¬§£ÞV«®×%Z!š$v`é dß|~ ×hëv‘ü–jØr-‚¿rm8}÷˜ã^[sÏu­ÔE9JjšàÞtTRú´Íg ˜pž8Ñýh,Pbt‰‚Gõ\Œ2ÓÁé®–…?¿®õcŒ_åÕ1³´|ö¾÷lABbU2E©Ò™(ŽáBñvƒµ»¨aµÇ([ ½.C£Ÿo²Ò#Ì»³©Š›©ä5©Á ?اúe‚"–Ï¥P°œºªV" íÙʘ‹·üâÿ †„ð¦ #daÞkIç?Ž®¡QæÌÛ4“Û §‘U*ÀI¡ËM*ï¤GàmFÎòÛƒ— ¿d2¡Äqߎr&=ª`挌Ÿè€tDé@§ÏŠ/vÀÀU>–4W •ýBÉBq'ißcÆ{3F!Ri‰»kLš±qù”UQ¤ª¥…ç ñþÃOÜ{B4>R i31ð§èŒ½4‚œ?’aþ;~~79‹æ¤`ƒáU#•…cxaôF ñlå/0ƒ˜¥`E«MÄÝÐüÌ.ÒôAAê3ø0ö|_º]ÒötvPü5¤B0lûqÒ"Î#þ ÿ•E2js¥¶üÜÇÉsö;mJFe…+ ¨fV¥–K,½^ò?‚+Òå¶Û¹25ÙÊy4Å­Ùz~$ÏËáÆŒü'ü?nñ}quýÓ¬…O_ëõž7áçÆèš`)ên÷ò«ºgóð¢ É[ƒì†@¿›``\¿¢)>í×+ÄÁ4þ#œñuP¾¼eÁæ£~©v’±¹ùÀá‰ûµi~ÓùyT×Ë ›\uNúZ RBý,ꃥ±0`C†ôògjÌDˆTÙm’C•AT¤ôþéyyaŽâÁúZòÝ$þŠ­ðŒbøCŸ´ç–¶Š™Î0f<>F0H.ëßðëDM-%ÐÙ+ ÚQûœÚFÍt»ÊqM«8m>β$ãŒ83UÚWB÷s‚Ⱦy¼5ÏÚCL¸¦ïåí˜' B€ÇÒ,¥ÎT 58Ww$ÎT¸*ñ4?fÃ4–[·aÇ@Ô+Ék³@/~]ð¸æ„æ y+™àÌ(ˆ[é0&‘AŽÈR ×õŒÆMI|+½ÐgFavB» 2 Õo¹(Ä#wEêÛv“ßê9üV¢›@˜ØÂRÀWË&7¯ÀÑôô}Ÿ‚$Tx}ãÖü|=#á³ÀPh:g%?“£ôgìÛ®=%Ϥé} þ¶Ç\mH”‡ÉÑýZVCHÀoÆzÚ.Æø¯Ì £¾©ÿέÌOî:<õõÁÛÙÝþÞPï3•놇ž)¥H¼v¹|!hCÁ ?I„qé†iK…À"·ç]sÿÌë™°¸Ž»üöþý­NÎ:u].®&Pà²(nØ•ˆÉA­­ˆªÄ( lÁa Äyÿ©á¬#„;SaÔY"”6B¤Õ° lïÄO³W+—H€5ù4 /~x]œþ%½üü-7ji¯úW£4ˆ¥ÿ䢙[>{òqYQ,¤!Dq±"%¯©wGA¦K×Ý¡d¿åÿ£)Å]Œ©("‘t©%$ƒÒôÛú.&Óx¼aÏŠ†m8LVÒ~ùëî”ódùå´x G²!ù"²­mÐ\»Âá®+4*¡›,\§ð¿„á줃øäk9Å@À‘]¦+Flsj‘ânƆ§Ê¾¶0Ѧ»î¿~0æÒÜñ†»œÞ×6¦1 ^õC~‡í†0’ß{ΖXwD-É!uúöSsŠXÞ–³ýÝœmr~=âF%ÊÛ0Ñ@ÿÓ9bȨà§Œæ@%•…:ýÙ­C%ðß*Åá†Ë”DÚ·ô£çòÒh@ýàwÜŠ¾Æ¾ o+£ ï_¦w!cåÇ#¸Î?g5¦šÒé«Iê…Gì]„=°üJ¼½yå1€öQzÔ„ˆG¨ÞvÄ×Y!#j“y©g\”Ä #_ÐümCZ?æôœçmÎx‰’ô"nÚ²/ œb¿¬ŠÁÔú_=ë‰O¾ßØ?Eg­A‰ƒF˜5ÃÓ$^|ؼCBv±[ àbw™¼Àÿï5¨†È㕯' SYZÅl`–Q…ÚôCò•ài(¸k×9ÆïzožÆ3kFʨ $°Ù¡ÑJ…¹ƒ@’оcL ä®…ýn4DËýžs+ {L¿ÈlªäfA;Úci‘"ìÆïEºDKÆ£Sä¿ö™¿ ƒLèçÇt˜sì³¼½^kŽùÌ9ŽÄj­ƒºÌê2 ,é#‘$";êÕž3­[ÐÚ'ó°ºpEpÉvþn*¸¹®H.»0(@ç˜l™‰UðC J·a FârÐD?;»» Šd¢F÷“z±¸ßœÔ6×[¹¹Y…-â±Á×ó¥6ácœá|˜õ~¯HòÊ|#üź‚„±êŸò¯“'¯®ƒ:«ßAç%6Ü´®oYï5Kò~D¿>½ßÊ~íEiB¨¡ÃÎ1C ¹ ~ qeº!=ë²ìKu‰O¿ŠêÒ¯u°{Ý-uäK«‡ 3Ã*O~Ø?¿>üô€yµ»K+|+’”ÕýpŽ ìÑO„#åSÁóâÿ¹óê³åUaôæhl….@óýyöé_k€ƒþôˆ£øú‡»½Pö™¿õâ¦N3å@ëùìúŒZ?¨èœDÑb(†?Y}î>´4ÿÄêJ¯–7GîXë½q_`uY ÿ•,~þ¿”"ÿY×?Õoõø_ëþßÏ5¿Êÿ›ÏÒÍQDTøæO_ÊW²?Ö?{ú°H"ü½ÿÜwñÝIÿaüßæ¿>ê8®ê©¯©TH'Šá]Ÿ}Þ×”ò óƒwA¸pbãQÔ(Åq¸VABΊ,Gý¥x:>ÔQüo/_=ÍGÍe¿^Çõñ±º¹õ†õ•ìeü§â…¨ßCN©Í*T¤ºÍÒ¨?íJËWÂ6#ß>_›–Ò}_ÇfÿôbP‘Ââ ïÉçú?¤ýŸö#ñôÛüwiÝ(.¤à÷ŸÊûHüŽu§ïéŸëâ‡üÝkú0ØDA†M}zö¢É¯¦ùÜ¿è±ñw•ÁCXã{<-S®?­Ë¶…Çd¹i|ÃßÞ$ÕÓ¸sB"R=™u!EÀ»ŸâÓI~ûWæ.ߨ¼ë•L«? #‘ªý®Cœ?†Ì[#_¦ÌH.mÏëßõÞg¡ÄÿWß¾GGÂãÔ'=ø/i‡Ö¢{W‡“ ˆ5õ,Ú?C9½?&{Ó.Ò|/ÚŸÕ¿¬ëÏŸÍ{ÿeû9çÐWÑÿs§çâ2CF_Òô£ñŠ¿˜‰»¸Azvð¿ÏÎç:Ðü²®y­GóS¼åÆž™Oëªß0§Uö~æÚ4=‡ÇÅú/ôbjø3yfÄDü2¦ÛÈÎj¥ËÄD~b9?â‘OæY¿ð»ÃaYÈ,ªGH<EOýmš»¼þp\çõ¼`ˆŒ³þÿm'•l?]‰Ç2lÖ¹HÛý ãWæ{“¼g9ü?íŸî£¶0q¸ìG9ø§©5.b~~ðÁÆ÷uóõØç¹ïB¿™ÿ“çãúû1ý}üÿáü}‰ùÏžW×Ð?Ûf¤C°ü¼n=«Ö{øç3ùÂDÅ×ßÇì/ô>8 ê@^ýÈÐɿФbżÏVú–oøã0²5b‘¿_t)ÀžIŠ*ªŸJÍÇo¡¥«¿õ * þóLQoNÀW0Ó– £ÿaˆýì@oßÍ}€t£^gKôÂ镇‘mïªù>÷÷Ú?£ÌýOái5õG3ÅUÿ¾ƒZøó…þ4î³.OÎW2£?ôé´²¬mõb~'ù‹æ^þV5Ù°¾ß\,´‰4õV–¿Ì hHITbî¯Ú˜]ô3‹þ»øTsû” ~ßpòàªs…S!¿M÷Ž©)}ÞØÛR¦Æ6¥äVg &0ãh*ä]£¥Û¸¥¬;ËÆ ¸ ˆv`;þ c«EŸü¨šþmùͯ°?']S³Žÿ¾¾…i x->舮küšÂ΄>ѥØ&kAf³0¹KKüóx,–ߟÀW0;úýWð}0£æ$l¨Ùóó-p¿Û}É#íƒD×]ÌŽ|z FÙøC¶FÃU‹i¨Ó½áNù*3¶‚çâ÷aÅÐZßÓIÜóþ<‘©>Úöþ¼ßå?öñ‡ãÎutðŸ鯵ü—Ä´…üfÛr¾ÈPð°??ï}x±ø}¼ËþÊk ¶•§‹éÏþç8?Þ7*pµ—·côfU–¾W×sãã2Í0ëšÕÊׄoý¿y£½61 aÃ/ü:}:$·§Æ=U÷„)Þ¸rWýà?Ѷ³Î7‹­Jé®Ú׫eþÕ²XäÙÀIúúä=ú7Ü>37ßøâ$òI_ÃÃéK\§ü/4d^ ;3÷XW‘ÇùÃw¿µƒ×ÇYù@_zj4>?ïñ,·.E×âé§‹‰Â²f~M¾&|jî›&²7òAAãâö¥“‹_ý.†>¿ÝižÇñ\0ì]FÏañbß™°3+rB£ÿä¡þq¨¨W!‡ÝFarDŸûñÿ³ú¦˜]ðòêïûþªg€¾6HQb¼Bˆ.1ÿp'¨fGüÑåBu›7xØ´¦$––pÇíÜ¿Êg €ê›;—ªl¢øi(¨\³_/ü¿-Ä­ç ,w÷w”ÏÝú`}‹çÏ‹ñœOùŒ`j>üÁ^Xn¿kyv¹QÞd»*Ly‡ÿ47C^>\jNÞ÷WðÙ Ú>=°¯ÊûÿO‘šºûwR‡Ölà\>„D¯¹¢­QmLł㮲’Q”Uï#£?ðæÖ÷á s´_­ió÷ç1~-ºïÃõ^µãë¼-Û0y¯Ì ÌùÌ[‘¥žÎ1_÷ÃŒwç—ø­NBÏÎ?vK6­î.TVÞéVÀQ¼Ì.¯á±ç'<þi»™v¨…‹ü+GŸå‘߯a¾ã ] ÄIWŸ [â`‘üeùS8ðƒîÙèôõ-†h:Ðjã9:yÊÀ´ÿsMßÏü”æüÝ~¶¾¯ô¿ËÇÖ(Èé¢kOTÔ\zëXP¸5õ¸b"—moì9 +'þ̸ÿ´äxr+þ¯G”dQ¥}ùc$w‹KÑãú6óCõ6,lx`t þXG„¢ Áiñi‘ž#'¦ÎêðÌ4(ƒ¿S×ßõæï|Àß ÜÜLÇx+8–Q±õÏz$æ´«õ,fÌm¾pÿ·=ÝœyâŒuQ¦—ëÃôm|O®’K:¾Ú#óï=ÿO?ؾþßëêv>u›ñÃáü—ø´…‡÷Š3õ9‚…·Ô)j¿Óm§Kú¾h84÷áÿ³f¾•¶±æcÅSé Ï>—ñ¡/¾nw_šðUH_ìÁü¾õYì †ÿú9Ïá¬ùú§Zÿ©n%)æ?)3Zü?Ì×sy…¯>“ì/â0×ÖÃ?¯ÃÒ‚³ú¿ƒë1ùêkÒÄ|júÁ›xHýÉú»Ì‡§§üú]޵êEcíþýYîWeà¯>½{"8ÒÅ[ë @©ÿƒéñ9‰$ƒã턬³zÿ_Óÿ7mõþu³Ùšúx?^Ç¿èûèÿÏ÷úû÷’­Ÿ»^LMÔ»|Ç̱¶—ÁˆX-7ÚWñIà0Qur1úðx÷ÍyŒ]OòùËËQ€ÿ*ý–sÏ Oµós4Þý|Yúšoûù×r#Î8éƒ÷ú{ó·ïåòO• ùÝËål3¡üŠïa 6nÖÈuFþÔþ?0(.îã¿ê9ØÂ¶¨còßÉU^³|oðùj÷õþe«ûµ±Q†#þR’éø%—Ðëüðm…BƒÝ}/:_².í ¥yMf]Ø_åŸþ®çüñ†t¸ê©Ïȃ€D ,‹æcAÜÔø’÷“V,×¾uо¿„Å®ëÆÝþˆŸÂ¾³ï`‡‚<‹}+²+ô^[m?ê7Œf´öXT3™(*¾šYI¨ëf‘|Q^+bœy²D ¥ÚÁd$Ê£;ðýy,>µøúj÷ò†2sæóé.¼Ú¨o¥óʱ̿ýGÕ´Ÿï|o½Nð0*O«.ž­ €…ŸS>¦tHO_Ë«„ $5EBÆÐÕý˜ÿ˜8mC)ùg:¹o4Y²vÅ“ükîý`_å¾»•s¿æwÊÂE4+úø û´á_WÈŽ!]þõçׯÀöì|1ëì;bö¥|ó;ñü||NG$¤4ÂdW£@%nŸÚä¡<)ú¡`8 >d=@(—ùßôÏ_®FÝÜ_ãœ–Ò 'ñÄÒ Jõe෻Ϟ@O™hîv…ï>¯õ×_]Ž»gwŸŒ“þC…«.šÉ#ÄÚ°=ïøgêã¯NðìhÒÇô”EÓ^ì¬?Ø•óxÂÏ+ôôííпÕ(¦2X'Š~p¢¢ã*[gwØÎûòËýºÿ8÷ïŸïúû>|}_˜´æáû)ôSð-xÔƒÀv?P6&¿`wƒòyamãX ¾¬qù_~?oW6¿DlxS)TõDP&E¨‰Ij.|¯²¼¢TD6H¯ þ»7Xyçã®~3ïJÿC,˧?=Ã}ÿ¿øúß8=ý»}…×%ùé!Tò’Žfñ,÷çúZyME<î/ÿ–q1^¼TÇ‘õù‘gÅØ¢ŸŒþW¾þzÁ„†þõŸLûøsShR«ô°žcÇQaWe„_ù cøùú†ŒáÖ—ùMà»”õÛ̆0!¿‡?Ãìd >³±¿¨"Ù|±™JÈx¹ý|¬þ¾ÿÃóó<þ9íŸ=ü¿Ïá¿`J;-…ͧÒJÏéyùúóöšý~p!ü 窒B„ÐÁ§ÕNæÅ6w ˜º/ŽuF‰U™"rÎð­ßAÔm_g²62-Ì™i“Œþž¥´ÒKgúâöG:ã’`Â>¾ò ³çÈ€}ÏŒªFF9Ê‚ZÔo'»¦ñ>¹÷µLÀú‡ŸÏì~ßÍ¡÷_ ø_Ä:’?6ÂZj"”5ö%¼ÊÊQTToTgþ |—OûÿèÿÑ—ïþ]ø<ÈÐçü°óæþ œŸ¶pKÚÅ¥/3_Ӭƞžþi¥°ƒ™ÙBQ¼-—`PX2âÁÈš¯?ÃÊógŸT-¾#¼‡%ÐÊpd^ò%:ô‚‹Ê¡é^Ј#øŸ…ñÏÏ{}r–ˆã þ>uîþ5ü玲d<ù9$äøÀðçèEùEƒ}U ˆØx[Êßp>úL oöÚùÑþ¿òý_Þ»õ?øéñÚ?ŸŸÛ¹DðáÆ¾pý?¯µþ㬯Ûö`0?~‡ÃDü#«+ü4ÇÍzûÜ_òØ?¸­÷)Oïê‚¥Ô¤›Í@´Ö`ÿÉtš·«ùÍF q’B²p×ûË®®á úIPðÍ œe”W¯ïvA˶†Òå7»nßY|Ó”ý{ºñÈþÇÝ@ŸO³ Cê¡× pxbÆ(PCë¥GísóÏÂémp±Œiñ¯Ÿ kÛJ);Øý?žý|‹éÎúÒ£¿ÆÙÈDl¾>Œæ‚ȳ@”6R?.8ú˜<©¿¥›Ì>RKŽÁü(ñˆ•¿p, M¶b+Szdæ$|ß±õ>tùxª5Ê$ê_Í?w]ˇ¨ƒ¾{7ÍünSª&cZ̯ä5˜Ô¯‰ç<Ñ-*=¥$üœ?¤DÿâÛÅ HT$$ $ }ÛwîDNÙ®7Úq¿·ÿ:¤!ç‘ø¯XüYÙüçµ ÇÁÜ¢ãÇjwÅ2ɱú·Ü.·.¡‡ï}ç£É¡œe€Ð\ñÇãS‹ m1ß‚<0m‘ì¿”Ö?ñâ ãÛ$ÿgÓÐ}ò_)W‰ïÈ»Øë—øÁgœÿˆ|tsA“o\ãìû©ýkj‘ø“û¶þ Ü¡òŸ?ª›/+¢ÆÒ‹53þv£J©½·z'ôGõóñ1Ø_>W DÐÊý{TsìªZ*ŒoŠÄ£ãBŠ)þÎh?Ó‹Eý”ìóóWߥb­œyóÛR1‘;ÝñÂ7ùõ˜N9yÖ$$„|ÆŽssõ€üý´`ì9ùÎ/Vë†æ`^jCZò¬þäpª fžŒy1ó4lqìß¶Ç®«c…Uýò~»Ró‰!%UÍ%öPÖïÖúÖö io.EPÜ?q) ªŸŸÎåž+ãÎî(›ŸŠ×²>ã’}ëg=ú?\'úwúÿ¾=÷ãì*¨i&¤š")(¢™ªJ*‚"¢¦Ø¢zápÌ5zèÔÏûÿæ€[‘]Sn¨·Õˆÿ$/ßöÁFýÆÝäà/ÛÿšÖÿÆrò—ùð0ÿD°¾R±À]/á†øâ0G1t<²°¾ñôÉ×ÀZû á"¯Õ7ûP–)~‡Ÿ3Ž=ßû@œnjb‹š’/&7üßm’D«v0Í¡ÓùÈ9 0'çôÆ|t‰{Гùð¬tЙυþýO#ò°ÿ‡üö¦¼¡¶ÀÏ›\…Q¥Øü}ô>7φOÑP~ù^j×ñøDmªGJ)겈¦ÆªE‚˜­FÚ¨ËrŸÉÅ DBBgç¾÷Á®z©–úP¾/~Ô&öÖ4?á¬_ð~+-—>~ä„Ͼ¾ª?Yd£ç×ï÷Œß×)L”$=ça@Ì @z@úŸÝß#ìMù•®Yg£`¸”l³iööN=ͼ¸¯¯›Þöþ¾ÔŒXÅÀ¥Ûü¼Ú|?nFõ?Có÷”<Ïr)(HA ZftCöÞvØ7ºnBB®qÍ#þ ‚ˆg †.„€äF<F.,Ò,7Õùv½úDÌÇW½õDßSºW]Î*ÆBªÃ5öÝ£Û ØÂ…,œ+øÒþ_ç„f»!þE QXRàŸÄ¼*ÿ²à†|þ gñ¡¶½ã´ÿ;c/ú?¢4Gç‘ŒÎæŽõùþ—ÁÙÃ-OÙ–xƒ<ÒÖò×-úÖµ…­3xñ"}Á êä'è‚kžÂ2 } ¥ãåWû}pù4Á úˆ‡:÷ÃúþGׯþ5ñe`”N£þ¬¯ …—‹ xæ°R~˜«¢Ã¤–õeeI|[|æúK—êrF…üÔS’”… CAA/{¸•KL”!P(P´¥)TʱI ËQ!¨¤NÑV\FNƒ UT¥ K%Q ’!PR,»r²©¿òÏ÷«ö¥xù<Ãí88¨WùqÂ(øµ=µuJ£è²Y1,Ó¼n& ­ …µƒ Ú¤?§x}`ˆ5X å•yzLPXZòZÀÄ óu_-Âá‰g”˜ÁAÂØ Ðã ”Ç2XIOø¤ª¦Z'›Ž" )äebÆC?s¯‡¤óú~ŸÚw÷¦:N÷+pÞu?8 ±¬I­»@ŠQ¦}=¡£…á|®«a¾~eC)?Úƒ î`öÎ@•å;ˆ”*P)ËB†Ò"ù5…Î_û¹"ù¶]µˆE¶:åBÜP âˆ9(–)PP”Zòü~|éHB7ý°Jm.ÙC‰ûÙ^uQ—ÙÏÍ-'òàagò%eþ¥aÿu±ß¡ñûòñ Œ~rîhoè/bUC°ÌÌÐ+J`†lñ|¦µ·©RC™ Ày¿”Ž`©»‰Qþ¤'ó;½ÊŸwâWÑ ý@™*}ñÔ©5> â$÷‘óB|]NHÇâ<Ê䇶û²¢zŸP‘hNò¯©P íÝìÈÓá °>F†bµü œ!â£ròDAðH™MA–†ÒJP¼á’wªOœXn/›%·_u_3Ú;C’s?ôJd)Ú $O1Ìó&xÃR¾ :‡ˆðÌà¿¶#÷Ý0<[CõÝÆûa>2I]ª ¹<Î¥êÜ'ˆø{AîWįrïs"ºÐ÷¨|î B@&Ö}“âMGôBó*üIñŽÈ ñHeI¹€ÜâNññˆŽqÜ=ÈÕ—©höBv}ÏrÂ`ê÷"'¨OöƒõD©‰=0ž“„âxj:OªR@¿?¯m÷ëäÄrU¾Ý&hOü4 +ƒîDéY±o.°~ÈS%¯›üw9Ô71 y¯ärUd Xÿ7Þw½×åTÍXþ©·?מùèýëð2ì[ý`KQ¦8›Æ³‹K›ØœhîÏüi¿Ÿ}hÿ‘ CóÏx8_Ž>«ërƒIª*¨­÷÷Íû‚®ÜàñŸ=9Ÿ±ò %À(]mpúŤ×Ê(ˆVˆîá|…cÒžÒŽ,P(¦›ç?Lt¾¿ïŸbÿü,y÷Ý£!û÷óø{ü©„«ø“ÆjöGÑa=ÞrÂ=®n«d|ÚʃJ£Lž§5¿ÏÇÅÕ™b¹ñúf´þBü[dˆˆàv,°±ˆÛ#`X€µP6ì(W‡:$Ùãz’Ÿ€õ!írî­ùƒ±¼ƒ^Œ±ØR}w#¨o‘±l¹~K‹¬2ñÕ8Ú€£0 cêBˆ‚)iJ"„(*©û!H¯ÀùË0Ÿõçר}¡À_ÓìÏêÕ…ŽaB™úí´ùóE‰rž ÷üyþþ½×sùüýQ׫FïôP¡ I ŸWùûqüÚää€åï °r&~ÙúÂ< iËýÒï0ïÁÏqþqíöør_ÒkÔJ'ë$Ì-Ä»ÞTcþ+ùzò‡óz_^~€â–©³œþ¿MkêôÔcµö7¢Î•Õ'ôù{±ÅTQã)ý™áG°¨É€BÃc2Syw“ÙZÊ^äèÓó؉ú^ß7«_ÝN?Vâ<¨÷·²Fßá÷%D –Ûïx–Íu}9ürýA£l~(zÖtþcáïýÌŸó–æÈÙS§*>³ÆÊ^.e_úv7Øïþw/ÿãpãOƈ…ü·Ü,-Ó£ßãå3¨_Çì{ÿ:ñzc;T×|ïâq…›?eNCD.uú ÿ/Ôv诺îYÍ×.$SÓáÕ­}KL©°¸>ŽílûçG;Œ‘ŸÂ©cê¯ãˆ$cÅ¿ú¿¡C+ûý(J}þ¾˜îÉë~e3ýƯ“úßæŸSÏÁ?jÌUg@:1¼¨ðâÇõóáúÞ=ƒe2>ó óÞ|W„þo?Ä¿ë*–Ü. …&`‰¥€ ŒCÏØ·ãìê`a”6/ÚîjÀàÃŒ3P™¥ÃÙ©Ÿ—íçÕ÷|^¾Çƒ¤™`: þ wãJ #!O3„”\ tyð"7£)Žàà ð¿ùjÿ`¹•*¾Ñøƒ,DÀyLÂuí¯„¬ßÌøÁóõ–Ê\ N´•2†‚©?\ÜŠzûP¡²ÓÊû"£v?·d£üC>-A2Èý‰­gó?œd< ßú¡ôMOWÍìO å/á6GƒŸé׿x8øÂ-ÍCÆerrtcFSDõŽüsõï&σ½—÷¾<ø~§OoGdN",Œ#SùUã÷[H_á—;L¬‡V}Ê„* “_Šú(N(b#m<>b=þ¾¿=(§Aþ¿ú¥Û0}ø*”ë?ºõÝÁ½@'„d"©õÉõs÷ð>=@¨ÈbË­Ÿ×Áî zÍV˜gþ(ût?³û™Ö¿šÁ­y¿DÇGŠ`¢ì¦à¤T£ºl=-Fá‹ý·ßß?¦O³yý÷=-Ÿ|â~x³~Øà„,†‘ïge:“øŽŸDq2é ªìjWÊ_Ì_Á#U£÷lø¹ÄŽÐò] áàWì†"ˆRz«ÝqpÆ“W3³‹ ×¬È„H1VÄŒìWÌ]…•üjåÄ©ú }Œ"ÀSM§Ó)§™¹“µN·N•I¹ÞÊLLË!//$n•ÒŽ MʸUqÂò±„'æ"7~:A9|þqÓškÍ÷>Mÿ Kc†ž=ܯ„õØÇ±‡+ÞÞź?Ðå}˲:yµÑî<®8æAÞ\Ô2 ÃÛ«¹rçô=béRØ~Û]â}jÌ{4˜QBÕ)ï×vX'Flëõø`Ö+ê™ ,4Ba²ëJX1Z˜k–À¦È2Ÿ_ã½¢´‰œþ¦A8½Œ–!M«çœ‚Zß­OK–3…ÀEzCƒ´Õ4ÎŒ¶Ê §é¾´ØO4XP{dÖkž/Yx˜í[ B ¾heüœI0,†ŽL‘fdðÛËÓç}æ¿ ÷Àr©7ÖÙ¤^w+õ?JÍ•\™ô®ä›YåÝ~=‡™ôE© ^vJ½)Òÿ™vÃ}t´äQ|¿Ç ò6ôÃŒáwúäoÅDûC Ž~9øA¸žcÏîþ}Ž ñ™ õ|„QY[•¬2ŽY`˜q¿îæ…¨ƒË{KPíÈ!QÝm•‰(¯ü§Ù¦œ*{ñÇŸKøô­*2­ʲG,¸bf8FA€{:¨\y´W$ì_Qˆ7÷õë÷>Ìý×ÑÏôÿYêÂF½uõî°Ðz |dÞe\ù˜Ž&ÉÁ÷Ž¿JÁÆçþd{—кÿ¼œÉ½\fnzÐÛË5æï¯Ï¥þ éK¡@S_W@ì9¹íãì“¢x_†ªDy;3œ–(ÄU̽m9¾fÉÖã™Røv“ðæ»õÒÓý§SIM- äÛ{ê.´`N+a~.2®¶¦Œ.ÂÙœL&Ê Cö¯wßb7p¢/«9—ø›õw¢´²./”·ŽúàˆO :#Î2d»yÊÑi¶Ãà,‚¦T:+çÊb@©Ð;¦'}ã èÓÆÏUÄÐ+ñ¨5¬g‰l$<·Ö|•žŠõ®ª(=ꮌIs£Z-Tå0Ɔ6û¿v¯gmáÚ$AvEè‹×V^$‹x„AfÛ‰Þ§±s{À!d1œ¼˜ò“mÃX Pì÷i­žZÊI ¤ÿ~éê)¨p冔;rº0J&³J\4ÚÛUcAãÎ3X±^ m,I÷yc@žôÎï­yÌ:RšÀ”›AÙ–'´,;âëo\ËšP¯l:º'}I¡óÈ×ZÔ8oMlº=EÊÕ¡×âÜW×¹²^Õòö™µœžÝô´øðóZX¸‰¦J¾uÎòqý5ʇZá±²  ÌË Ø/mµš¾A¦H!7„;lîýç¸ÖÛÆx!>ø3¾,`<^É[*vQõ3¯+Y«R&% ]Ÿ`€Dçnþ]µ­fò* 0£m© ¦L=-PÞ¯w­[»¶ šé83‡ËÛ­±Ž´ýGP “‰W£Ùaý«òppjéjaØ t¤’!ÚAcC ™ç(Y0i¢—–¨‚fiÔa ‚¥j3z̶.Zåš·Y‰…]¦8Œ*Œ/L³cY¯¬Ÿ}qß=ºuÁÒdÀü¦|ü67›Åâ#ÀXÄ(éR¼FBüN7dÏ8ó (¸Uev¼+…U­¾Éß5{,\šÐúù„€]QI¬ há èþ}0ÎèDe¯oÉ»÷RÏñÁ¯ôùð(¿Þ°ÏÒßž\à‰*5ÃúUþ*™ûÒ#ŒéyU$Bÿ·FøB‰ª ù¿ïw}ÇßG3´8;,#¦ü~=Ñ$ ÿPÖr’UR?B4@úŸAÝœ¸~$À½ã/(,ƒê‡çÛýŸ85²G|&z!+‰ d~‹û?\=—̼NCã=v©‘üh]P‹Xœ§£ð7üa¹ô 'ÆÁ}ª¥ôŸÏšDgòŸ¾üëë‹ÇŸ3L—½'æ>/eB®ý·¿¶©ü}ÿÌ:~•âóìÇSöÑFÇ_òÎoU÷Z£ù¯üJ×3ýñe]°ò£Buµ”&L}ºã´Ÿö}N}ÒuÎZ¿ªÿÓ€ž7…þ¼³Ïïp7Îy˜,øJÕÇú䈯J@ Z?ÑO­Ÿ3ؽ¼ú§{°õd¸ËêÌf xŸï&$×R{ºñãã®÷{:7ö’ÎyЯ̦Hˆ “ˆqö`˜Ÿ[ãöÏ;zï£ãSr^³šÈU`È'°)ÿg]ð¯àcUþeÇþ÷dþ;¿¥¯¹óÚwÒë?øÿ|P=¹Ö¶ÊmEn"\DüÇÒ€ô©DtÙÇÂ?@jɘãýo%þ¿€××ü5{öCöÖÀ^°'ßsKŒhûýWðƒ¥Ýu®¯Œ¾ƒøƒ*)Š—þpa15L±”PÓTDLP4UPWÄaMETA4Ó1M%KPAQ CTSTo0ˆˆ(O_¨ç×ÒJhy,?™z >Æt´ö­¬gœXp`à‹t£J½F#!UÔTÈÕ€p|BjzÌWHJ’m¬ "(Ço”Ä %W›Y»(Û|2i†qb+½¡ ;`õ¿6ŠR §´oX,TÁ`ÂR ï›×¹8á*ô”F Ä9‡­ë@«—F>S7K7J26”wJi ±€°DŠˆAí½ÜLXðÃ" bˆ”S%ý€‘À±#<šÊÁ€üüΦ—›#i¶cŒ+™K÷>»ß¿9Ç_Ìm/ëšÃÜã¹8Ú¾GhH÷ª@í3ÐóýÏ:ñÞgýÉ®|Ÿ•ÿ3ádd‘ABL!T--%U M 7ãÈhfŠHjˆ"’$"F}Äþ»ûÚqs"a(”¡HR‰H”§¸ C©Cø“R%A-̤ iS$G ZiJR…^dQÉZU(JiPÔ‰¥)A@¥*ˆ•’äBõ¬ êDȨZ@  F…ÔåJ¥!@Ò "´¢ÒR €4 IBÒ…RÐÒ-+@R4µ’&CB44HÒ´”ó9!Bj2”L”(¤Z)¥€ iJ¢„ ‘D&äTÔŠ”nEÈrQí™Û±Ešø7Ænêf‰pG1$,‹¨ÜEýÛ6üCÐRÈéãáÅH2ký×cü×úzËŒÓ6G_^ ŸÈo¢¼*7‘†y˜ì}PÖŸ‚ŒO:°>FT1ÿ·ý‹ü°ªÅf1O6Ìîùü=ò~³öaÒ‰>ޤõA\e|“õùÆ?v÷?…oW!®ŸycG×5r+g QǀʪeÜ:ðØj¬[æ°j°ÏƬá^G…røv/‹˜Ñþ=‘á½Î_jÕŒ‚½õª‚Õe€ÊÇs"L4ò5‘þWÝ@ç `r=ßÎÎLù©kœ Vyÿ{Ω‘šA~E‹xCoîó…uÚ\¼^¢¯ ”†›Ïžjøóº`o)÷ý}ñ¾)Ýí¿Ô A2Qr~÷ñH¢ ÐP“éÝž˜º4üöL[ ŒX¹2/ (uE@p>Ù+)_Ç`` Hc½xžkxtdJ ¼ïýƒÿ¿ý³¡ óÖ÷×R‡û4 |õ`’´ð£‡ ¦ý‡÷ô·d>mÝ~[N,ÉúerÃ>yïÖ«ÕkŠ»$ýγÐb¦>q|Ã:éÝy³±#co1¤@˜£cEû•qïù»Ï×m«1ÍóßÄ9• LC¬–n9Û¤µÌúæö\$ñÒߪWÎî©Ð‡H~Ñi 1ÇÏG=?~§A8É'¿6¡gǺÆk7\¬7˜`rðSÃd2±ø1縿À{0ªÁ@v~ß~à~,â5¦85Ûni© žþ¸ó·<ʙҢw Müø°äí¾· _V|Šïˆ‚Žb¢z½æÿ¿VR?ê ÈH! 'æbp!óä9ññ£…äíŸÇŸõçá°¦¡¸Œ/¼äSE3ñx¬c#?"A Ö×rUA)eõW´ªùå¶_ù}|§ù>ä¯Ä†¡ µ üOhâP=Ã!âÍk½¾¯Ÿ®çûÒý}Qê?“F?¿õßñ·Ðùñ÷xìIÿ?ÿ'^tˆU(ƒ+ñÃìŽÀûá9‡p­ðßwþ¿%ÿ_YúknÏ Rðìf…¯øV¡Åª#ùŽ0»W~†@ ßð þAPÚ£Î'm (ÉFKµ0÷Œ(Å<:)+ Ú«æÈ7%~pgç;\ØÖ Z©¾ô¿óßèoÊ•Oµý:ޤÄ 2Ùt®¨*W|ý¨8 åvü0Ú±W“µñ€JÕý=b)Õr8g¨~•–5#Š%…#íïë~a|Ÿ¶×oð¸ çÍ/ª£¶y6êG„a›3¹êßTÖT÷;ëùò¬žãl3Nlxª_?íˆû?;ƾ FU×pŠ|uóÀïÄÐ=¢:Ú‘¸¨õ3æ'¦q®^§ëÏÖ8ó%´ä cŒå  #ªd‰6¡`|% #È¡KÈ:Ÿƒå~ÆhõÀ]q#ʆï<)êyO6ü==ÿ£Å•õWÝÆëãí?«/}Hõ- @`S!B T\AA ˆ >sZ÷뿪™¼ðãO™Íü¿‡ný3þ?¿'çÓåÏéqõð;Äæ(µ¶Ožß‰öW<ãùÛç石ãÙ<Ú"~<Ì~?=̽+dûO·}>R}õ_äo;ã÷>[ 糋çߎùðw>gÇžPÛ×WQ˜^ˆE=x3ÇnqøãqDÔD®i ùîñõæNûûþsÿïg¹ó ^øk™Û?Ñ>:óŸæ¸¢(Öû4}sÇÚŸ§KûOÃüb oý¹Ž Q²AþÖ0+=àÚÎ.:¢µÒeσêÄÿ§‹Doz›Ü„ôžðߨ3/Ôl63ˆˆ. Ú"p"îY¢ÉèXè(Xh²£Ì©M› qųk VÍÁvVŽºÃºÇ¨UÓ°žÎñÞX°‡ÅÕØs¡JjØH^l[R”Á†°T“0ÍZ'Ïù«+jÔ¨¨Që2#Þ¡ôÜî`4°ö3Eb[$Ö-;g¢ ”vPHëÀ«_††ÑdqýuˤgS\Ъ=ÍF¦åf*Ó6‚íÈ€¿Iì°hò†÷U2Í½Š–TÓŸ—ˆl(ø%«¼RáAÎ3äS 3oÔÈk—š#Ô©±Î ³X÷» q¹ÀL-P $~˜{ŽÊ ½¢†3Ï*Þ!\Pä¦ñõ,@›Ná•xåí¦ö­`¹ GÆUtÝãOh¿^ëa V/Eš„S“toGu:ncHÝ ¨sa’\&‰›Þ©±>1×hóEBœÏókã»øn.ôàŸ¿yq‡Ã¢rЄäF§ð|m<çñ¢-çÚ,µ{½qvÏ2ë;žRËG7å÷ÿ5DUü¡õ@þ?ë`ÿxE’ ¡\MEâ(ŸT<ÁO¿ŠÞˆ((ýß×­j´¾à‚È­@Ò4­)J­P…+H@JÒ´@/Q…+JÒ+JÒ´-+Hùƒ%h•¥iZ  @    @  (€(B•¤ @  V‘  @¥i€(„(€)R(B€)Z  V€)€(€)„(€(B”(B•  ‰É€(€(B(€)Z@¥iZ@¥h€(•  ¡h•¤   V„)€(€()Z  @¡iZ@¥h…¥hJV)Z  V€()€(•¥iZ¡ V•¤ @  ^ð™ R´!BÒ´­ ´@JÐP…R+BHKù€É•¥iB„()@Ü™P¡@­+Bx‡%h…  ¥iB•¤ ¤ V€(€)Z  @¡ @  ¤ @  V)Z)…  V•    ¤ V€)€)(B€)„)(„(B(B)€(€)”(B€)Z¡ W™ÉZ@¤   @¡ @¡ ¤2\€))B„(B„)Z¡ @  @¡ ¡ ¡ @¤ @¥ ¤ @¡ ¥     @  @  ¤ ¥ V(•  V€(¡i‘¤hZ¡h€)B•¥h•  ¡i(€(•  @¡ @  ÏÇ:øü{ïï;«ÌBÐ…+@!HJÒ´H­R´H-RP?¹È• hZV•  V(ZV‘¥hZ¥i)ZV(„)ZV•¥hB€()(•  ¤ @  @¤ ¤ V—© €(BŽÐ¹+HÐ#H­+BJÐ R4-+@-P=A’´­P´HÒ´JÒ´Bд­P JÒ´BÐ4BÒ´­+H­ R4!JÐ+BÒ+JÐ+@­ Pû”È(€(B€(€(((Z¡h„((•    @¥øÈ€)    ¤ V•¥i€(•  ¤ ¤ @  V€))€((€(€)•¥iZV…¥h¥hZ  €)•  @¡i•¥i€(„╤ F€)€)Z•¤ ¥iZ@¡hZ€))Z¯P¹R´@­P´­R+@R´ PR”@JÒ @BÐ#BÐ+JÒ´JÒ´JÒ+@@-RR @P#@@@@R@JÒ´JÒR R´JÒ´­+@BÐ+Bд­RZ…ÉV•¤h€(•  ‡˜L)Z@¤ ןz È­P´BÒ´­P´HÒ´­#@Ò´­P´JÐR´-+JÒ”­R´JÒ R´­+CÚ @¤hÉ2F•  V€)Z¤ ¥iZ¡iZ€(V‘¡ @¡k´.JÐ+JÒ´H@­PP P…P+HxÄ )ZV•¥iZV(•¥hZV•¡iZV€)ZV€(B)ZV…¤   @¡h„((•¥h€)ZV…¥iZ€)@¤ V•¥i)ZV•)Z¥hZV•¤iZæ\…    V•  F)Z)€)Z¡iV•¡h()ZV•¤ ¤ V)• •  ¥iR•¤ …¤ F€(B€((€)Z¥iZ@¥i€(• <@dH@!@­+@­R´@'ˆrDhZ@¤   ¡h€(ƒP™+@+@­P´@JÒ´HJÒ´­R´­P BÐR´­P½YP´­ @­R¥P… @-+@­ PPRÈ¾Ø w•;Bž~pDâfÁ`h)´AKˆ¥ŸgŽ|j³ÛeC¨9ˆ‡1¨€šŠˆ ¹@ñòs¥J ‰êG™@ÔJ†å@÷àÄSâDãœTõêP¤Ôîs®ý»mA:ƒÔ hxkŠD ¢m9ßj´Mà)ê(áâóP"óç­'P"ñœÂ¦¡ƒp¿§©ÄŠ{¾zë@½äWÄ)êDââPùëSÔ¼P|ÅMçœqƈT;@Sx)¾ô mCˆ€oÞ(><ù±STÜÔ£ó›zÁí jQC¯Œëx)©N¥y„>dæQ;JœJ.ÐDÔnÎvß]¶œP:Šf"& €ˆ'jˆó3Ž V5®ï¦®=¶#87›Ÿ83¬Ðt&èᦷÅ6@'ro–ËÛŽùTÄÌDóí D{D0ï :μq² ÔLÄÅJЧF  À`©˜ ñ£° óåSÜw•MH‡xEñ¼Â…ÁïˆjˆSˆUêL LESÇŽöƒ^;ùã 57qD8‡`¸¨@}@ :“´&àÍðk¶”ñ"'P (‡R™!êTw/ž½ùÚ õö}@¤GRŠŠìqÛŽÓ®û @æ" QK‚ˆ(cŸÎݺÏmÕ<ÄÅ@Þ DS´@;@ÔAß·>{q~x+]g5ß=üx ŸÖïÖ}1ŠÌWÃàÍÞ‰è«.ØxvîÞßTáïkÞåû¦nVC€ˆˆÚPƒ…$p€úS©G‰€|{õ¯^÷ÛÇžW$´ª@=@ˆ`Nòžh3^`´KŠ ©ç“¶¼üüt‹H)âhëçó‡¨Y怤Pó<À6Š(ff uÛzõ"‡0(ïã5Æ#Ô4©Ï«<ñbȃ¨æÔ ©ê& "joç¶°ªbÄËÕåüѨ™9(„ rŒX¦–¥;*6Eaqã3$ࢗ2Á²µ|Îs±ŒÅJ.û›s‘aƒâ/D Øäõ‰3Ù¼ŠòÅÞTdyÿåO¹›ˆîŸ®É®¨* g_JEÞì÷´(„Á!Jt£‘éMö£:”`¾hŠÒ©"ePZÛ)·¸ÍæÐ˜ ‚Š :‹å;E8ªÙÙMÊ áZ¯w×BFHG‡¥0QÝlÉG™Z¨)G )bˆ<ó‘ (:PC®ö¨¤M=KgšÎ¡h %Jh Ñ »Û±£P–RH›aŒ_=ÐY¤6‡×;ÉÆ½kU9÷k'×›ÁDs'!Ç-¹ –SÂÎj&¥\‡`¡Œóâš||ãß[ÛQâÉ´+œÓ”ðžÕ×2ÛܵTÑ(Í댅óJú¿/nµ; RÍB(u~“‹ƒd T .öá-ö€„_#]žŒ·(®mWd]%Ú=÷OhvϦ{g)Âw”áíæ}<§ ‡ÎfÝ©vv `Œœå,àž(j$‡êÁP<®0zj{)á ‚NL”JvÞx}4d4e•pðv½=P´ØÔÇÚžêEFWÏ/KގᦲØÈYûb ‡£Î‡¶=ß(lE'מ»Ôçºt‡Y{êÀáúOp¤íׇ…³E¤´´"H!ùÔ:Ê\·Ä× ¡¯D"5Úpо8rh h !jœo°"”`¦ ÒŽw‰a%^oËrÞT>$ÓÒNÙÃç_4N^P÷Í;CH/žñî:!âpGN)P 8"ÇpÊEž²ájÜ Ó-šµD,¢…çÎÇ„w«Ã¢6E”@eP3ß)äŒ2RÊ"b— oÒ˜uÊYÆúÛ!(§1ŽgzßZp”Ñ’Šl̪‡›dñV :S%ítB Ävæü“µS˜|=½qûVÒc‹… Ÿr*w^Líù¸Á€r³ ÷ÈõMêð/Ÿ-¼‚w¾û8OMŸY@NÀ†`ýt@ÄwTÉExÕ\Î-ÉO6¹#0¨š"¼TŸ[®„ô‹ ÚrøzCâtŸ=Û݇O,• C2œ¬ôxQK‘¶Gz¹"NŽÊ jXÊáUȰ@(Õí¤ÔA@1îísJOȤK®²ÇÂ:rBlŠ9æ‡k½xÇeJ$0IB ßw× ªPYÉ@FNHÄi¬£ Cx†¾gnУà¢`€üÇ<µ E”~. I c:ŽcÎÚ !1kgÂÅ2S$猌l ’‰²º¢àÓå¼qãš»óQ¿29\ä%ë`ï˜ T¹PÀ#Ý„~¨J.л”Zæ/¾óBœ¢2Fq ž-SÅBœáD—4R» ÑL Q {Ûbê€b‰Ì­x 9“e(®·ãè ÑNƒe A¶ÃÎ[ô.e§H“’:SR¸ )LJù¥Ì®å(Ñ@½¶MÙJ"‹.Ù6PII)1 óq(Š>(R V{-g…²š>¨0¸Â¯;ªX茘Œ²t ’2j¹×AŒ*'Á<1*,N9æÀÓôÎ'L1ñÍߟ]ê)^S-:­8Tr5xQ›òB‘á%8wµÑ„QDÑËDš6d¹N–8 h‚Eo!oR€‘“Zô?y}ð–ÜÇ5ÀšÃÝô+IÏz°3Ç€¥oßgW{{¨š€r2CðïnU øO¦ù¦Ó„6‡ÄÒi8÷ϽIB%õ»‡Öíì”E:R AH.Vvè_‰Ò|z@öûúñ¡Ò§”Æ~3Wf‚4@r<4@’$¢LTbg%,ä…2ªFHH…âªr¼ $±I!$ÁMõxE TsçþPÇIËË=¡Ë7üíw]¦Òw*Jr®@½_Šè‹0P>r­dp¢QTc‚çD)A³ `£ò|ÔÝ%J%tw*òP1’|Q$‡(´ÛN1Ì[.Ê (2  1=žäë]Œ>»æhùXÌÕ×aä`\¬¸èfï¢={êwí(ÎqËÒöÍdŠf÷¡b³ ƒá’è¡<#ek0[–Q  b‡!Êw %è©ér‚Íš)!Ô)qÐÉÅ©.8PQA²ŽD\°ó*ƒ†ˆéÁA‚̲†Ï–édY)e ' +ª’|"¶£§v©'‡E œ-ùªGP¥4QÈ‚*¾ad²+¢Í@(Kl"²*ÈÕªzõ®uBHávB9AcÃQ¨é8 xÌ:XŒž£:\ämÍÀM’Il„s5ÎŒ@ÆØ9 S.Έ’ŽíCG+:”Ѥ‘ (æ’ ¦YSE˜êŒ(‰#e #ƒÂZ¥â¿ :eô¹”ùÞA£Ø*w1¼Šœ ª ­ºÐÛø¼_(b0ï®éüä (¤” 9Îs€ÁÓ§ÈÚ“’œâ©\ç^;GSæó:ƒ¿|)ï<õãÇ<|^'q¸¥êtÍóMê…õC« ³huï6}o–(rí'Ñ#%$®_Ž,‹)‚²—8.îT&v¸)'œ r.å Š:•ÁDIª&žƒ&ÈE,vR™E|#g$\ŸÌ0Äiƒ9#¥òÖ5¶²J$Ä#ⵌ2%D`=T²œ#±K|®µ !+ª“ Ž­ò9,@ÇTxtvPp‹#¥^F S*9HÊ©R‘h¤ÛÖcÈaÞ×4Õ¬ìn<Ýõ‚Š•Ç±(À$x%²¬Bè…”r·QÐÎQ?؃ù2tPÄ2wÕóÌÚjÔ`ÉAÒ'J”A( ?[ÈmÚet›îÄõç[º‡OŽì!¦&HÜf]K2ê’@¢”S©&8þfhߘ ÛNŸ ßEúNº¤ðŸ;¢øñgiÊO¦n3Ø|yÚΔ:¨;*¦MxrCò¡„um²ê¹Ã`Œ‚š)’6yjM”¹ÆE퇗–qÍ8q>ç¿­á é='hcŠ¡µ«_9)¢ü–AEˆÁ!<}¿‘d 2¡6@ƒ‹À|‘ƒ’ˆ,œ*;ª>²ù€Š0 ~÷î2sz}Æ÷pç‚ï.ŽÝ»AÉNØ ˜Ýè éýÜÒril9ƒÛD~6Íxšâ¦8¢ÈEڣ̤&Ê ‘&LÁržejÏx@‚5¥ T²(Ú½‰ÖE ‘dRY@¸V!<…a® rS¤ 2Pd¦ˆò—‡>o.;¥$ ”9(Ò Aûç—‰ó:Pç/†xH{í³nÓl= ¾Ó»qóÍJbU ƒ †{ŽF™RÈYÃY‚ˆeÖužâ¨ (á\±ÙRÄhÑ ^FâѲ2QHQ8C—ä÷ÍH’–ýÆ` b›#9ËæmÜ`’  d‡; m´!è¥eG…ÉíhxóLâ¾Ó~~a9aËÊÝ‚šNÇ/ÒžÍU*pH¥"4Ipë”®ëV–îªÐ­ñw`–)ÎÜE{Ê£ïÄÃí•GÒ[Ã%TõÉAÒ0@¬(N”¢ÕõÕ”²W¤ÚݼóšöýpvûaÂã)´Òo.·ÊB”hd¥m¸³ˆ mVÊl„²‚ 2ˆ!ˆáÑbÕJêÁAô ¶˜ ±6‡l>ÔœÝøØ¥±5½§Á8ñx´ª„uïaÜÃI©i5îË¥ÛÞ/"_¥Žù "b´ ²…ÒvÔˆÆ"ã<'¡z|‹ ¬lE“ˆXÞh+LŠð¿³lçÙââ¸(é’ÔéÑ;ëb¯A™#xÀÒ1aD¥ªbèrŒ”ÅŸ+o¼IRXü=«î‡铃LaÒ? ö†ú‰ 0¼o¾bÂSƒ’N}Xò «÷†&€6µƒÀõÔ‹x5Œ ål|%ª±ñIåôÌ_ŒRÅehìpc§ …|ªëV®T­h~©_wVÛ´ÓQsŒ˜Èžó’ˬTÖ!˜ÞìÊÍö-cßtªñ†×Zøº`xŽèVU…ÔÖU‡Í»Q‹:¾¼géjMÚ*6èIvœõÙY(„T[ÅÆêÂ¥;óC­a‹1Œ„+ЧŸnµñì êÞ_®îÉÅæÛœ+Ñ\`>@üÏ‰ã …Üç"ï ƒªöf+œï¾I,„È©÷Ôã¯ã¨ÅU Ûñ7»lÍÁ°sÊ gwsÚP„°— ª9I /+2Œy—t7-Ó/˜Ê@…Q«ŠÚ×"ŠåËŠÑFM½³Xe5'’î’ßi•G¦ªTÅOFG=,ÀK3žÜïo§“¹ßRÓd˜8àÒÅ”zh¿u6v4ÂOÛo±Ð’å¶aÍ)Xüð&o6k±£Ú7æ®&Ù¬bðx°gÆý,¨8a›Ç 9¾ ¶ç<ç&3ñIä.cÐ0rPoø­µ0¡{šöå¯_cäƒvŽ¿X}ýõ2‰)ž(/ nŸ®÷g»š ^ž—ìo \ªlyƒð‡î‘Ð@6DÊ‚DLiÑÊ-m€æ•1’¢ò¡¦x¼ãõøün¡Y÷ÁûÆÎ?¾lŸºˆ6-èÕ>ÄX묨²ÄÂ@ó#Qe±9úM…}®äá69Vp ËÇþ~ýߺÂ1#Eb3¦VN)AðÉPAIì¾1ÌZQ@¤a”)FHRüÖw?1ïžÍ06ÉÛá1¼Óô%ñC‹Ò %JÊÑÓÈ`  Qidô‰(3ÙÝ@ÇTbÒ ·ögªŒps…óJÁ#‡„g·ØM8!=)dd²‰)éíq»Sn‰‚ÂŒ@ç•MÑYàû•A‚H>‘EçzÐAéÙ­dÁAË"ÈáAeÎJ(™ØJ1“d ™#ðò%Ý%—EJ‘Ç[Αe<Ó0e0C ’ìW\òjç‡×c3 óëµkÎRLÝ1q_T¯±Oý4ì3QÀìá“æuýÀ±Ï´>……QÝozðÝ ÂHF/ÇÜ\  âˆ(h„®*‘ÞÅ:' º‹)áð¡4G4³oÞdÕ ’æHRÊ)Aõ…à³'¤DzÃ$ ‘áe=a‘ H0Q Ž”;~Þ#å‡>ä ¤ ¥HŒ½jä9Aé‰6PlÙ“áAÞÉ…p(¢1y*xã‹ÃòWÉ™Qƒ¢™(/*ŠiðÎúµ‡,Ûôò¹zk1Ÿq×x» œ¡ A$0m³¸v䢢ý+‚›nÓ®Ž )æT%JµÕ(’(ŽõzS'‡d £ókEȳn¬}!,‹©ÌxÔä®4Ïìz£´tKPAGâÉ„íØ­<#L[ü ¡nž‚ 8ÙFËy‘`8×˪Eb?ûy\}ãÍϸI( r’PY³‚ˆ‚„†'„øçç:ÙP凗Ã)´6ò•F`}Q4 dŠ!5¸ÁLåh¦HU=#$xE”ëâÄFHb™(œ0@áG0h±ÎÖOaC¤¬­1øÊœßW½»Ç”øýºdðƒ/Öl}6HÉÙ.B !H‚Kg{Pþ |TéA£­*'¤(ì¾½ië¨Ü}2 ÊFÈ‘ÒH²Óä+¥ª€’SÒ¸)æ<óP(1¥Î z@O^È‚å(„…ÊwεwCÊ!Òuòœ¤ôδåÚO«exNÉà{~…¿<* ÙÏ‰Ô d³ÌÐ69ƒ­½ç {Ú]—½ß6 ÎÀF—Cé˜Ü«÷ÏþNŒ<4vEš)áEHFv¿þy½z½™ å“Ë&3:µ>Òm6ÎÛÄåÆž>zÑ‚(£#ÓÃ$Q“Mí,ˆÑAdÅ$„cÍ÷éÐÝQ÷•• %:{¥h¬·˜o’<-ÕÞÓí*O¤á §LÚŸ¶{⇧‡„uÝRHÅ¢¯¸ïuËÉL”LšÚ¢0Ò8DS˜+¢=4&Ë–è›ce0zrpzsyâ¿r¨ÆUQÄ0(«ï^õ¸§)Ã&!·Ï¾ºÑÃÒt"Âc‰† óº1Ùð xPYÑÚ Ó¬åyO®.*0´û»mlq+>»ñßwZŒ –SH—Ž|ÁeUC±8ÊÞ‹ÅÈdž»Mw·¾§`'O…$ï*0@ÙMŠ_(õ´Oª‚ˆÛ¨)ˆË ‚7šuÙ†D‚”G§g¡Q8|ߎš¥Aƒ³e$% ɨQ&s.š)Þªh ÑLB_on(H¹TQ  snñ‡lΊQ²N²ÑDwìÓ̽¤þ.ÒnyúÏsÔüÉÕÔ2q?«Ýb]èµ@¤"Ú€å‡-`»p Ò¨¢žœitl¢=)’8º&µEŸ Ab6FJ #…>2Š]pf³å©S$>G.@ð…2ÍSñ|Å¡,RÊ@ ÑL¢”ºd“²¥+е6ŠaP9áJõlŠ!ŠQs\Pš5ç6ê»×˜šOy›§âÄõ“ÆñbÖ±œ£ i¼=~tzÈÄIñæ;Qsùô%í@ÉDé ¥ X3ƒ»’m“¤éö龯¦|N“¥y{H}³{Þ_©ç’`ÌP¹ÔNÞ³iæ5µ;JžbóuëDé8~û/ÇÆè}¤úf'“nòžº³Êb 83…ýüQ/ÑD}®JgŠ䎜åÊœ‡³T°ºmšCIË×çÇÍñÝÛ1í1ïóH0vlòÕ<úU8!,¤DS(%u̲ƒ.¡|TÁ$ ìg7ׯ- ’Åú¹$€¤ !2ü¿;$ä‰6P)b—ßIÈM$p¤ž,áÑ$€ä1ž:íßXóO/¥‹¥ºî#Ô¤ùÆ"«–2A4C&]œ -ÅÈÓW/šíyÀªêsºâ³pÔ©$k Ê.ŽKƈÔíÝÔRN ? V§*ú#&&Û…7 U.ßfàQ E…> T ó¾:!Âô «P” Ê‹ï2®zº:=)$t„Ñ‘DxÑn6G %”ÑK2Sg%)r¡¬’|´1*r®Þ4œ><õO^÷1<=«'hªÞqo¢2BQ•ð„ï‹u;´ ½04Ã-ôçË6‡¤ÓÚrϧHp¥„’iAÚÉn”'„7T6”é“éK A’‚Lmd™†Sj¡ˆs£‚á’—x9£)ó ’Â*:)çÐÎÛYÔÁ~î‹IÀÈx="1S Së:ÅŠÀñ}£Æ¢ÞhgÎÎuÆ¢o ‰mãuÕÇ™I#¦ˆ%(Dl€M4—µ¢8RAÛY¥:èß‘¢œçSEÈH!ˆÏ‘aÇe|) ¨–@,ÊäïÔ’€Qˆ …¼¾r )e÷ ãâó¬Ò („cÒ¥ÒâT+܇C‘Ò›…DI! ipôzG¾¨Á6úféSÂ0@² Œ(‡Í rQ,d%Ò„r5–äCR¡ QPlÁA7#ÌóNJ&t©¢„ˆ<(¦Ü^«Ícc¸×xù®/BàCÇbá;$ÞŸ¯4ˆmÁaаŒ#:ÓZóJm·à‚ˆ ë$h # $‰;ŽaÇJy¥%:Fˆ Gž²sG¶é“²Œ@Á€§ÚY! íÂT*lŠ(—j ZŽ”¢’ä (úQ’žbhÕoËL”ÎU,gG€¥%¢œáîàYrÉK(¦B£Ç­>*ä1FJt¦½µÕJ5øÁHƒE4*,Ð4æS§Nؾ=õ½-œ%dò“7ãÊÌéF"Ê][ (•ÙžóÌó9’ž³²3Õ¢ŠQ,Žy.¸™œT¶J"1Ô+’TÆ"wä€/j0QHöåWŽŽl¥<9"Š$Ÿ+Œšç„ðÎ|È$Ê#ñ-$ÈÔ½[¿Þâ7»Ð×ä;¤°ÙœõëûxÒM0A…È÷g’gSyaÛM‘«j½ŠU›(€”æWÂÌ*W<²#;§iÓʯ«ËËïš ú§Äá:zq¢Ož(bÅ,¦­lÁ@ ८VÝ,¥6Q äÉD\¸@Å™TqÈèñ{ÜZx@¨PíïßÖ·¹Âñë÷P<%yñ«qe´:î,‹Ê„eélúËéÁ²1[ë„Ñ õ@žÕµ‘g˜(˜)~-(€«ŽMÈÙÈJ"ˆI¸x܇!Ì—4S„&H¢$ªŒõÓfÈA$Y®ªAJ"1†ã*Yê†$NHLœR‚"õ,¹K"Ê µ@ƒ³èæ]M¨c5ý}á–-bµ¿FpŽ™g›÷†Jp]µ/Œë‰Xª­¿'È3ç#[(Áä{aPÍß,švžRp‚©§I޼Ù1;`%JdœàÞû›}à)JgTÉe,ÑLªäŽã÷Ï7<(§†)BzhÑ ¿~ë/dð¡Ûá³ßslöêýwçíà<§”Òc Mw —È‘ =!‹(„ðÌ/Eok:‘Ò, É¢‚HG(ä6±w‹¡gÂ90tFÍŸ-¸)S†D Qô¢H‚5Üø®¦H fÕ6B¼ö´D€el„Ñ¥È0ëÜ–ƒq !Ó:C®,+Ó0óž]}'¦uæ÷B¤HÁé5 EiXì„ÁÙDôÉ«PŠŸãüêùçÖüP#_ëäÈù'ü¿óøWdAè… ÁËiª¤ÿ½ÃèFÇÈ',É¢uY\Œ7u²Y¼?D¿¶¢™p­R –…u: 8Cbú2ØÉr×Ñëj jö;ÔŒ{ à¥ìöÛÉìÅõµ³y“ÌÁáìÈÕº³­äËVmäðÁß{#» Ï3=m3•?”¤Çؽy'‡ÉŽQ£>À>0…T²¶ôÙéìB² Ji»“Ca½>ÆÂ{@lód¾«Î5AÝJ¬‹¢ôœnPkû.˜}…èwKý€£HÜ;8ê¤52OA·Š·1´{רÒÕŒÍj{¸uR%êëǦ«%YX–†“¬œFxïfÌi2r0DF°2årÒƒ£Q«ùY¢“5L“±éNÐè%/Ø9¾6È9Œ¸³‰.ˆ™m>@L3Èaò“„ŒFx¸Np*°¯­øJ4ÜQxú)ïÔ Ufwq•S~Eê$F¬.pVöèM3Qå6¯ò—º£®ŒeÌ…ºÆ.b| R)íª%õ's¾t¥ßmð€Ï=¬ù{†OK>Ò¤ ä„ßKûÞÈÖ–‹¶™(€*Ž}ñØ eÊ©9ôkm¢Û0K `ßU¤Ú¦^¶Ô°ŠQ!§Hï”Ø‰d‚(‹#D‘™Pʉ•×; fT„ “¢"×e( }ÄážÞF Ͼ5ÛRpÏNßm·„åÎPÛ++å;ÌwA¤xPE*”Á '„#šÔ8sFHðáéN`Z‹#áÕûÃHÁ#d$%€Ÿ9'.Ç”9JÀÒ_^¾½l9î›ÊC¤YDo“SˆeÜ_sœæo?%|—¼&î––]„B„s¥TÒ,Ìíe䣊ˆ"UïÕzƒ¤8Érc¾ù½®¹¼òeß™P×[)¢`áéºäía,ŽÂð§ ts• Ò?µ¦yñõì„Åe€ÑH ³g½b齨%h cÂ='Þóê’ST)Òb3ÆÅJ0Qx¡O¤<ªIcùÙo6så !3•„)8ß!éä R‚Ê¢„Ô.ö»ójÈ2P|94vDÒ茑 jç…QÎË”‚MŸÁIäÃÑ!D…éSp¸×x]4xvʤ‘d(ôe$‰ñE&¹å àñ–.fÆîñ£Ê| 9ˆOœò+묟Ær“ÞÙŠÆiÖ¨xOlœk½]|¡ŠPäHÉDÉI AŒûW0Q2k ©·„;t†&ÓI]¥Ch÷azçïžÎZípFHpRŽtàó 0P²¤å@Íó_p”|ª glôŠ2RrÞ+ì‹…“T¨ÅòðÁNù®Ä í³Z¤”K)ÖÓ1ŠQE$ ÑAðˆ"ˆ“¡ãzè=!,‹.bmkµ†¡¨jŠbqïF¹¥ï n\ølŠõ@R9MÌǦZ;Üe¹‰­óÙ0õwV¯ÞMºxᑇʟ_šÓjûL„_À>V)ÆL¼Œ¢º:tì³·Pû€ü1•ÁBA d9«g “eè b•káHÚ¾” ·;È vRö¨›)$Aðˆ•ÖwÅÄ &ê¨)5Égš WNÈáº[=Ƴ×Ík²4@…èÓŲˆijtRîÅj!‡Dh¦ ­çÜÇ¥3Õ(ÑâçŒBvVÊYD‚¥<÷—p,¥ʧ QSfεqö’Lœ0IA^¨÷xòD–@’”tcj†"WrÉD2DžIäV¦XÚ¨LaPxoŠ$ÑAv»Â€ä 2B9K)yj‡jêlP‡öLÅ€0©÷\ÙlYuaÚ¡XzšJZë7Üís²4}BÁ6i÷Œ =&î$S¤`¦È‰Q¢6B6¼ëT%u6RBYNš!ˆQÅ‚’SÒO!|)$õº s”€6„æ×9õX a}!ˆ! £B 7ä3VW˜ 9é6A( u]€0EáD”ýV#¼Y4CÝœºÄ¢5Úa‚‰Ìç=…)GÂ0Ó=54Ï;Ö»ÜÞéP7ÍáòÇ鱂®š=ÚÙÑHéð„‚NˆãÛYXX#ÂSÀ(4­Þ9Ò´ Á²¥›7ÕÙD“OÑŒÙI!²å€bœ( £1âƒéA[[Ò‚~ù'ÙªwWvx"s•¬ãu˜÷ËŽðûXàû^d^?í¶ `«ô»e€EKì†ÿÔÆ¬_˜M”~(\‹(ŠC™Ð÷Ÿ3 d€¤ ‡ „‚›½Cüø¨0FÌ”LÚ¤%6ÜãŒáN|]NíÓEHŠVTÉO QtÌ*e]AJ0@ƒŠTj“5ªÄˆ,B¤"Úä§J9MQŽcnØD®Ø¯ =ÉVD“ŽP×4òܲxÎÎt¾o¤á9ú³´öÅé'µw*@`E ¡8/õ¿©ê–Q$€Ä$õFKujT 4B1í@r‡“ <ßw8 %(±A‚6@œyæFHÉ‘DhÖUŠ 7jIÞÕ0`¢QJ¥@¦Zó|ïš–¦šÔ_c&,I €Ñíy%'vq‘Q´QÊîŒPÈ›»9Ý{<•þ[OgZ½¡ù„t=ùT1¯ÛÊ\°ÚCo“ëëÞ;ß‹ªø@ðµŸ}SoÆkÎršezO¶oêÎÓÒN{¥ùÉ`(¥”›]üQ0¸¥ f ëNHK<¼0XiɻӧÄ凄4íôͺõëÇ:Üú@¯.¨Vq÷“‡ãÂr’i˜º¶žK(ŽD"ÙJ‘¸¸Åª9Ñ¢<)è;2h¢t¥Ï5îå(ɳ“’ÌE0\‰#׿¯®÷bÎS”ô›f÷íÀ¼3–zúTçzg*ÊdŠ)~xÃ…0Fß6µâ¼(µYÕ2|!(±BÞtuÌj–Îvó×§ÇI Ø[Ûooz=5Ü– o^r/IÞ=DQ –ˆ­«Ø¸Àî»KÙ½vÄ$1¢e%•8~ӗòó†2¤4•1¬=|Ö¾þ¼r°ç)Ñô¥eH øÉF’€‘áD|*˜#S£§O G,¢O¾Þ«<´‚Ò¦Š ”‚Ì¡È9óM¡óÝR§NÙÎìøœ¡¿»ÑÊ%PQJ#¤#•§«’B’B ”r‡"Îüyl˜ð$fXæ”dŽL×›¨A…TæW%%åº@ɲ"n£f2`äð€˜(Kä‘5E߉^ªYÂ$±I6|kÓÏ–­”Hñb”2FÏHs:ÖJ$’0@²HÛÞ™ÒŠIH4QÈÓ£…%ëxÕ^=;vÔ侇¾bÛžp0wf¥iË 1§÷U Þå{jíóU‹ÔâôS #"–/|drÈœOh˜|ñtòø}³¤å"çòp×ã9a3Y“àj˜í¤=[9I¼§/³ëÞLg)SÒ!ôy8G6úéú”ðG„:JªÈÿBÃÁê7|Áïßzåæù·Üs,Ì ÍoÛY„’¥ 9PE* ÷?30zSE0q¾ß(/H§.Žük忆Ðíœ'i˞ȭ´“r¢ÎJR¿=ã }ÄÙLáK"Hé"Í–#¥9/„Á2D‘%ˆ¢HÇ‘‘ƒ‚¥‡0l´^\ (åÊ’pó½!ù¨x?mꨶFÒ³ìp;èDÉ'Vcß‚'¥*åÁïÙb)ç™/Ó®tXÓt¬Ïá$æÈRåÊ$Lºˆ…ðu¸P%¥ð€¤ñüW Â즊zPAO&4sc ²b„%Í‚ŽDOš½â‘ŽˆÉêH=®ófERUs• ŠÎ¹:Çr\HÉ@Ä 8: KBý[f¨âX¸lÚµÙxFÚi† å‡.Ÿ=>Ðé:LydïëÎýì3•³dQe@ØU)G&È»c9í'† ƒÒœÀÄzç®°N ox7&ôb."u Ï]P’ %RˆÊª œD)CÏXII>céd‚’B&”H“}6}Înx¯®ËÖ«2üÖã°É`^7-q³!'i°WÞEËP!j†ñyƒ­yâË îc$EjÝRY@’‚Š#6ó½&HE‘p©ÃŠZ¨\Ì1«ÂPkÅ GGDl¢•¬K +$ R\L9;92B x¢¸¨$¾ÖˆçŠ(‹eD³á¢(à¤ÒÖÔ1A¼®-h‹!<6S»'ÉL‘‚Š"vÃlÛy÷é½{à2rΘcé2Óëá 7Í<¦=0Óo¡;ºÉ‰Ç>;~“–c6¡)Õ®¸’È’ô­§TM2e¼6d¥ƒD9F!a®¿(—#Ò#G»Q¢š)\ž5YÈârâåï·¬™ÇÖH–brôÏÍÚ´ÎE&>e(ºÞDÓ0°·õ»¬ˆŒËr ª6h׈ˆä»ÚRLå.ª5~åïÄOLÜ5k8ÎJ‘‚ ˆ2Bdð§L²ÙÆ)ÁD‡.Q‡<®ÇeHÑ#$d„wxÌ,ôŒ™!=(4R%F%cÜL”BU«Ò‰5æ=„•ÁL|(„¼ivBêãÖÉ’ŽTŠzÕ1Òuâýoy´ }³—h`‡¾<^*P`èåÕ6:¨(‰N-AˆQé dÁ'¥Êt§„5(ZPF î®GžUeS,¡.Ówzg Ýoޝ†ÍŸ_ˆ§L>®žr0\ä¦J&ÈÙN˜9"M¿˜ÞF “g$Èí÷nÒÅ0qêŒHI"Gq®î1#Ë”Iß?9zÅynN¼K­ãš+ëfšB¾3ŽŒu}XSµnÖsÌO…Š&©lÁD˜e±›³ÏÎÎÒ²ø¡\~ø˜ùî霼¤ž~u‡†L?^7œÌ‹(ŒO‡D` ²–V#ºòrE §l C×ß¾¹ÛÍ›IÚ§OÚxyæÊ·žòb‚úrrC¤³$at§¯(² ¢]u€r_ª#JÛåqñ(—•áDž(šó”¢šâ²–B5q‚‘ð’’h„’’Slóæd6GH;!aG®£ž¬“é='l»¶;Þ´œqAõevϵ}zø³9|ã¸#gÈÂÌõlˆÒˆ Qü@¡ùÃß$Ôé¬lú•5f&ž=¶v—d‘×@¢|}Çê=…Bðèy $ r “4¸ŠµÛ„ð ¢ …wº‰€6R\ÖÃQ@ÏŠ!¬6ð£*$Œ”ð¦r Q Zç¸Ä áLÁAemd‰×;I1J™)g½Q¢‰Dx¸×` "ˆéOmBœ3ÛÜ^Õ–†HéÏU%¥A0C¯½.I“”gQËT£f'ŠÂŠAJ(ŽÒÉMï¯&:¨#FJ1 zB<¬Ÿ T%i³^mõ›H#l*u–/äRJ)åª)©QÒ.éµ¶¸bÚTÁÊ¥: £q«ãÌŒ‘¯&ˆ2ED ðh_;Wžy;Åy0A´$üín7ç|ã>ÇER«¼[XîQÃ1³»ísš\FºPp¦Ï„œ”’HÉD‘¸[)‚(Š$­m€ôEŽrì,„ÙI”‰t‚(’Q:^ý $ŽR $ ¥ ê†×YJ¥ñs>é½ì‚ áK xR\hù@¸PBÝ2$‘šY‡¹Þ(%‘Eˆ‚ÈF´×ÖðšgLÚr›êŸMúÖNµå™« QH#–©1>efpP1’4S%2d„“|ðçpN-Q,¦ÊAß­î@¬* "ÌŸL”Á­ùî·A{ÖAÐvQÕP ™"ÉxzNø“„5æÍ§gßF’tΓ‘:ùa´»“ù«t¬eÛÚË,^ Ãs‚¢ËÁDÅÉXÀª|m_wx{cãàwskLº¦ xPÇYŒ:ºùNŽ@ár†Èá£(€îù/‚È‚(‹(8RNµ ÚµBE”‚W!„ðiF–Y“–§³žnÓxñç;Gwc;gLP*”lÙÇ=kIáñÝ¥O„ð‡Ž8ÎSËé&ž’}§]k¿°Ó*³ÊJÌ´=¿}õ÷Ï[àÚM ò´h̼¨¢A@hÓâñH0GJdDpè¦H$æ®dQ ê•j¤AýûÆ?\w_È~Yív¿16ø¬ÉBvB\%q…ERXBÁ¼†Çè>ÍõÞV´«z_ ß\Q»)§·Ç†¶¡×Ì› °¯ÇÐ(I²~ÏAD’D,ãÊËÓLŒŽv»R]½75q¬Š£tN'Ç<Û}é&)”Ní-J˜Ï£5»Ü«Ym5ÜÆÍ>0‡k=«d‰Ougvǰ5’4sƹ¡-Ï|S¦Fâ@í[ͤô³¥•‰ƒtÂ7^8áî<¯@ ÐZ&kØà£ÜâÞ.{€ç!•¥3­©fŠÎßͳ´8ýuĉ8û¹>)x £ý‹áÚÈÒëàýve5Ô€q˜ N™&þ¼qÚSXr¸ÎtçÚB°®ÕÇWÄÀrÆO(²ž ´x‘ÂLjÀp‡µA> N²êD+”™T‚žêèq£™W(ߺdJ’E¶Ï]0d¥—0l„q5‡Úû²³“Ò GÏ78:²bµœ¡ çw¬¡·Iß4úI¢iRL›ÊeHr’rRK3ß5pí`¥ÂEϧÈTî¹êûìèr'-ë¾.ðï˜m‡T\•n²W²ÒB~ÌéK8öa ”FôõØï=/ußÞ¶h¥àå’ÈO dŠ" &òÉʤâÞ¦’ú¿nüüÃIÒ}½3¶JšF±9]ÂQðŽk®* )&ß'®‚·L‚ÈÅr‚I挱ÀLaC,‡2\+*˜)g–£¤ŽD•-çz?‚̔͆—ˆ($QJ"’G#OìwðõÅ#„¯‡Ò}n†Ø)Sž}`¼ zõJ=1vIH9Ú‚SÓ¢,ÙAeÕžÎ52l†ž˜~™Âr‡/¬÷­i‡Ó/Ë9N^8¾ÜE…ÇiÑMžq‡J>ÅZµL®¾7±‚ˆ(Š º¹A¨®Ñ<¾ê5½¾é®Ô-Þvâã›m§w%´«$„jî2{EjÒ>âösR@ y$âà 7G,ˆ+XÛt4[ª`¢pÈ’ ¸_; æñ–Š)dYSSëÒÚ ³ñé—)<'O ç×|{f!éJÍ='˜Ÿ7Ã(%`£²:¨' å©PQJ!ÊpøÊ•(+½—ä(áÉc‚÷*‰a¤¤x1 éÒ „ÁŠk*Œs+—~ºæÈ‚“æ•õ»YôÒª)J y…D4¾´m‹ß1AˆÅÛ(žiF¢·Ø:vÌ é¯L”FJŸ3§Žörõª xCI]3Ư–p†1B.@­åî8­n< 1‘$ ;(s »@Ú†`Hܬ9K£×¦«Ù¤pµ¾%UÃfõÒw£Ã¢k´®Ô‡0pÎQ›e½! l$ô‚’$É‚”`ÆUPÒ¨¤`¨é†|îÁ{{@¬=êå;õÙ¹÷Õ9OHÊÓ”¾Ë¹A#%Έ)Tô Õ±k š=$O-%e€“áŒ,úl‡!ŠIqàŠ I³³Ã$Iâ 6R $£žâ»ä£¢‚ÊT*)Swàhd) e,¢p¹|s¾[Ê• { ‰dIðŒÜó·¹@2@Êž ù3™m*t3J†º(g¤üú¹­ñ,‰ HMèÖ@—P¡UOe\§„ ÷Lãb<Æ«]zÛìºa«ïC߯¼NƒÑù.{k!û2‹ÎŽÏ-ž%äò¸Ñ2Ü®®â•±ªZrG Äd¢‰T-ä×ieR¼ëeH@b÷ãÏwù¬±²–Bh‹ê Á“%=ðC÷͵›A£fˆ%‘ »C¶÷O·†i&Ÿ¸Í³o • g¯«¨X(Ýï:`$ ¥J; vº\%›#0\‹:(4\§o¼Þ5‰Åñ¹áÆ6;O!Z|=¬Ñ}­G/ªÝ™:Eç!³€IÁ=žyª¨äÊêâ«ã.;c§‚ ˆ("~(DÊß+ ñe¤h `ìàO€ðútB/QñZã‘dUxÁˆé HéeQ-Š[Œ™"㌀j*\ Ú¥—#4²Q< Wš8ކb¨h †°'¥CGѲFœî¼Æ/•œŒÚ¤—#,£Ò€I ³½øµ0ÈŠ[­8P>#n<6@˜T…È/q¯xò0hà¡…ÉÇÒ‚ehŽFc— lÑ S' Hág¹ä…%%ðÞéðÉEõpF´º.@ò}Û“édÙ³Ò2Eu@Ñó7ì :Q¢œU!È Ø`ç„k §9Ê€4FJh¤™"tT ñž²é?•f[¤…AŒ:Kd7÷Iȇ´€‹ÄúÃ߃Ì]y¾]8nμÓÞ ñ€tÂJw°2þ?LDã|A{T’È_>B”&Í¢“¡¯çÖXrô•&"…}õËÞ„š>¶©t šÏ¹¹ð„R2S$ %¶º}Ș ~%ñ@“Â4l¥Ö]H"NK,@jß< è:l̨…TÑG¥ƒ¾0Zymõ £0²RHÉÒ›<"ð¨; ¶¶@ôá·¤ »CÓßÖxÔé®!ííPÄáá=sÏ}ï}ÓlSé'ÏÓ<‰Êåéá 0î*¯ùxy#$Cf‘‘Wƒ½5â VË”"¶Ë ¢(‡(=µDƒ¢Æžw.Xáà~bœÆõ¹³šLVo v8Ç ¸*û½ºý•< Á2ä‚D”£]T2£¤R4óÿybÈM™!2D†QG/³Ø§op¹Ã@jٯŒ]U,%€rI Ú§;^ÜCáwʱ>î-dÇ“{0B œ(@n˜d&ËÒù…¢?V‹›!ÔéM™)¢‚í@‚—îÚ )d)ËTH,R—Ï&0¨ >°ÒzÊtÏÝ3”*i×·Y+¶ÖYÃÃ9âížö—•~<£ä¡Óä2 uN’RJêí80R¶Q4lÉAgÜ-ž÷mZP>£æÕõF #‘ÅõòpDž¯Òå›KÍÓç}zÑ9C¤éúCâsœõÕ©åïÝSŸTPö‡/MBç§{ÜÍúB "§ ¤Iª4S …)f­@’ˆøƒþwü Uü¯¿¬-ßOHç&‹ääwš,ªˆî+³çåëÎbx^Ö ¾{ç…NB’PQ(2|XñÙ¹«îŸ/|ºcÁÍáôýqÊ ­'Bõ*,”Hâ= %ò ø ·+«Û×K†› lš)=P¤YDhTÉ’Þ¡ì¦ÈuK(@Á=îÜQˆEÑH8$ÎÔMu‚1DðÉDÙrÅ©E'<„K(OHE-N3›¾ƒXQ’ €¤1O‚© Ì×”×(:|)’€ZþpÛ·ŒÂ¼Pž0l¬¢»[zA#$H‚£ä?@“¢‚O„ ú¶Fål€Þe€‚2@¨¶‚,úQ¤÷\B U†«ÉÂ!Ñ§ŠŸ]ér@„k£­ª¢€áS-®(†#®¨È²n£\ÄÐSF)@‰Q¢†î±ªdÓªy•DHx¼b`w‰\®»›qš ÔE×Eü+ìÆ¬ŸÖZf½Í$;C¹ê×Ó`“]%1¢¨çŸX÷®_({CÚò›E>±Íõhi »JìÙsÂÈN®‘ í+4-KÏCQPøkQ,=(>¯X-—6Q:E’“ê‰SŽåg5*êνÓé~ï ÚfU~Xrœ±¥\'žï[x ’ÎÉ#&$Ÿ L”Jó R¢ö¶í#n®2B9ÉÉD8Q¶nÌñP”¬õI œ/„ "ÊIŽðÍÃvüVË­í]ô¢ãTõ[ì'L¤ãVŸ|Ìá6 ·u·×N:Þûß$YÉòúè@áœÊ݃» Ý?u. r7©¤0KhsÍËà?P‚{3›%Õcø vJØú*RY¥Ô¤…º ´%ÃẄ+*êÌÞÎ#cJaDp£bÖ=væcÄ&t3TDÖŽFbÓòµ1)²¡{¹s×15La†Â«+?,|îî^P¥R±Ïeµ7¤‡Ý}Ÿè=@}qpʧàYní¾!šÛ¨ˆ© C¨?Gà#¦bL#~¨Æ²R½‘855 ©9Íh˜Ÿ—ÃI—‚ôÉÆ_¨YˆX®Rš㈥hØJ9˜{§š%¢#¢MU|ˆƒ©Þ“ \‰9¬c5ã ;ÇoG Ë@-ù2Ù Ð˹ȎÔZ5.Ñ÷‚GšÃ¥•H ‘ãzçDO¬}G+”ºdk!„ ÏÝì*àla>Íl¨ÂìQ^^‘W$ôªƒôMò,@P{ÔÛÏêQÞ!vS¤öur—ãœ&k¥– 8¹H2'?€iZa2ÎB}|Y¡‰¶ðˆÛB.Zí’ãWçéðìŸoyud¸g׋ o—âÃíuƒYPØÁ&’àoT­ƒ*Uõ\ÇI=%[‚Ì’5ÝιO„\p<ž5)¿CG’æIØn óçÛU‚Y-ß ]¸Cä•5ây¨ÕÀ•š+Öº©Ÿ§ª-#–™YNbátÑÝÊÒ"jÌ9[½c›( lvJé_xµ„]ATÈúƒÔ²JØÎ\Cû~ 󋿍¶Ð–n&˜Ÿ¼ì:jÆ|Ôaèê'r|õ`N2"ÓËd‰0“1<û-M'–M2o§OJ‰û3Ú3#eâ„ìæj\»'ÙÆNr*à1žŸ<í°Ð=¸l}œë¨+­Hq ÿc'å oóŸùOç+5ˆòÂ[†¬ BZ34 “€|ŒhËdDßÐŸÎÆîZî6dìÅ©«àM;Z² Î -iâªÌÎ!rÜ6±;ɺQeÜB ½‘"`­I2ºÒÃï-OÉwÉ/Ûð+[Á|pŸ,Ÿ„ È[ÃñR6·|¯ +^ã:‡óâôº÷¹5í$Óy,™<€í·úù¯i™[ªãÁÈ™'!InKb`#];þƒ`°OÞ±ÛJþ~5ß ßžã2Õ óK»: š±l™mäôüøäãŠY­ÑiM[įŠê¸ûþ3Jä>®MGÍB¿0üÿŠ1àP©íT–'Õ KçA×ZÁ‚w¼?2²•z<]u ÈjÙuèf’>±›!èƒv4ò5¥6“Þž ²„Cú°å'˜œ8Pæò©Ï›ÔûC/*0Î –눦VXG»Ð^3p‹d4­.´ö½§û‘ûeS…u4§U_§úfÅÕªcçØÚMhùƒü¡ËíT»=›þƒŽ«U"˜yé™Oƒ¾7‰„’@•Ì[iYËÂìI‡“‘³0‰É¢‡„Ç¢Œ&•å½zx‹Ó[$²iScùuñÖŒ\Šä-õãái"Ž `v_bû;ßMRJ¬R‡µÐ„ƒ´:¿âç’c›.Ò0+bu|c,ÈRØÀ7ŸâüÞît´¿»_•Á÷›dqün΢ß‘W ÔÛÎÀ¤ª$ާW[ñ3@Aò&n ÍÒ:JÆæløôNb–)”®ígù‡Òg òŠš,®Ôp£û¥J'êO±›5­~õ2DÍ!*øµFÈQ(9s *… ØÎÄg•¨“ƈYí¼p£^ªB8;Zp§¥µŽ½a5ÇeWjæprêÙ%73 è™·¸~²ÉDƒ0±p²T^ÆKª˜‡w3_fž“»#ŸÖ™Œ60N-HI÷ÈkŸŽ=$·è¡ tH5f4òüµ«€n,çò0{s¹˜ÞC·±iã[N©HŒùs¼éã`7;ceÓ3˜LÔuwÄ˧ö³ÇF³9DØ4­A† é 'È`¦“Ž—÷¬Þ~ú”ËÔI…uÁž?¶n*-߯t¼êZ¼ >sr”`b]_wœEatm³ÕŽ«O1MQhkéKí6ÙÖ£öÛ8=„¡ÊO)•¸Ë‚ÝmYjZ‰™ˆó˜Y™ˆ€”&^ÜYÙ“‘»ûl©ó¢®Úl}îöfå¡PÿÑ{üà[XO$¶5Ê´?ß>hRËÙÉŸÊ  pæäüOÁ­ä`xz&¨"Mm‘dÓé½Ötª/i–t PmµZN#ñ¶§‚†¡ Ã0¶r‰@ü( …c°ïùžÇ&EÇ~õîÔ‚”#DDx• ~áùÒ CªdöçÝ“A^׳mguE÷%£da3qDøDî9b-Î%?¸›æ²—ÇŠJ+\,¹]Q©D¾t;ÏŽ=¢}Lç´ð ál’¹­“UW.ñÊN3ï³\‹d|è'Ï"t}1B†~M@Í$Úr1Äã52}©ípxÛÆ;u{³j“ÕdȈ£måD`6¢?!‘¡r«ùb[ÝÜÆCxU¥+ÊËU§Uð±ýTC<»kùÝ¶Ãæð†O¦%Ìää>Q#so)©ü!®¾ °–wN47\“P<аŒÈ“æë•œõ:¢»­ŠC14§U­ò%ÔVFÚÔù<Ê+†L*gç Ñ"•È·šÔÁD²Ü!ÈÞ”)È΋;ŠÚE“;¹‰?SžŒñ÷Ûú¼*«Eæ‘aµúÒ"9F7<Éù\âÐâ-èÕôª&àÑЈTÕSÉãp<Âo9¸D/02×Í>Ê7I”O\«ƒ‹H72"Þd33PeôtÏ_®F•aj6%œÄJÙP>Ï=²(øÊÌÎ £ÅËëO©~¯uR¸R"®zbÞÎåç!iõZ}æ=(ºªX‚ÚÒÆ²‡EÞî‘o+ñ†i9H2xi33b%%ùä=1°c'IiÊñ^ã„z5ÖA‚Tà&ó4« !Ÿâ 1I:\º¾®Kº•™ðŸœ$]ÝO©UUqÙÙ¬P¼…ó¥mRW¦d ¼P{)%„l­`9jŽPü(Ì.Ï 2掕GÄËå,4ð*©)Ùr+2[Ù”ÝH±Rú+Æfl¢šÆfá”éç ÚqšC “g‘«—MpC>T"o- n#`/¯¦ô›¯#Qî'<œ(ø¡»o½^‡Ä Ñ—ÊÄ$o—•ÜEüˆã–ÿš_ÌIq¾vÇêøÜhQ¯˜U`ƒbÁA è……_/–MŽFžÜÙŸ25üZ0Àpb2hDgîàhêN^õ ¦(*ŽõN¤¡e{3Yžþ¶V_RQÊ$+!Z9/ØA¸Sa‰ÛδâÎùòëKõ;rN\\+î¾èìXìÔDV IÐñß”—TòØ¢Ó›eçCÓ:Q>=ŒìIAõ#´>O´Uf`8Ìδ}h›McUV NëP S}KÍä«‚$GtTô¬(*˜z!S™cQm%jþ‡ÄŠ]gVu7p9'5ûE€Ì•Ÿ}Ë Љ GÏ¿R ÔÜÉùeåý×i!À(žñšçRGçvzyÂ^^u©·xtVf7Üx˞ʞ~è‚b€Q~ò­tùÞ9zÏMÂ0t©lô7ÙR)™iñ«Ù€MÂÆª÷%¹•ÜD:b´‹³ý72ƒTqT.î ®‘Iè€úÄUA ¾5<–ãW1\¬ˆh¤ú€ÚÿÊúkÕ^˜ñpà|º`dÍÖ`ülÊ,Ædx¥N¬p2É™ Et“ó³Þ¬?¿ ãù Šü«o…ÑE…ß͆…àÅã`tBÑ<÷]¥Ã*Èü>—Š‹¥?·µ(9FN;SVû“0%|¤|N†vá 7™èÅx1"ôxvWÈjý²³·ã~ØÅ÷]R¥ð"*úÄŒôäá¼ÐãˆRªR|ûÎ ¡çƒjMú#{=·òd&¬˜ú鼪‰UMDì}[l¾)ù¾³`„ç‰aê¤TRì#Mñ™9—8'4#:Ž-@\Q—·Öƒj…²•®õã鵫޲—­â&ãÌÕ72…Où¸dñ£ì¹‚)â6?3ûYß¡8›•¶Ü”øõ§Ì¨ k¿ÚsUÊ\Ÿš¿0((›‡ÄĶÌé!1ž#tƒR‚bõý ÊŠIäp-w`gb6Ÿ>wLÂ"$'R¢R˜ñдJÕ ÐÕ"‰Ìã`—U^Ãø]`dœoÝîÆõõÞ?$ú1X!og OëßQõ ØVåy VmÉLC Œ¤ýòÑØÊø§Iè’×K1$˜ß·Ó›GŒ ‘›HÀ>ÑÅ”Üõc:olëH˜èiL´õà~ÆUS(Ì Çœ#§*ÆÝÕk™žªXä\çu½ÚLÊIÁ 8Í§ï4Ÿ¡­ÃÙ]n´Èëî^Cx?S<$3ò ô§*ppâPk“b]™¬ÒQ@³€½,ƒ K®ÊÄIP%t:”U?O‚lê»™©1òó±#5pxëŠfVö£5ÙÄÙX‡ ä‘×€’åöë´."Ö¿_ù…n•ZÆÆÏ ‘¯¹@äñÔÀW…7U†šW}Á¦mtgÄŒ¦æ¶gÆä ZdõÉÞù æ9;Ÿ·ºðEúóÒ^†NÕF’Îkõz0Z¼÷ˆE¤åéc«yÍÙÆkWÊíÀœþ#X4Wö8 kº2:/rÞº˜¾m^:øõœVL»ÙŠO™v›¤-î랎NÉ_ÞúòۂЄLÞ£ÂX¹Ð¾€WÁw\,W|h“ “xæâa.«s!m,Ñ­V·©s š~°üû+î¶Ðï(WÄÊUš¼_†ìWŠDÊ{rJØÌ°t'Bˆà¡¢&#Mú´¢õn.¢wçR'&î1lÙ4vï ASÆòFùÂm1æxyá®/(P¤O‚„§ä/ö~O6u¤Êÿ;OñAn¼»ÓOÌxÔ6*³HøËeBeéÅdZ?5>ˆJúØî°Ù¢™5**ÁI£Ù ž£õº¸¹) Љd;" ®Ò÷™°]Í´©ŸÒ‰HžµÔ€åv‹)ó¬Ü3¾U€¶éÌŒ= ½Ž¿åU‰m§ kÌY?Ø.jènÞwftU_Dצ>ðKOD™™/’U q0SËê_˜TÔìdD/ª±ªœ‡“Ïnò¬Õ¥±ÜÁÑÎT䫲3æO!—)ÀgZÙåÂl˜^F¥6ØÂ¸YEEäû’È€̯yãV©”ȹ”´š€QÑÖXîî]±TuÒ³é'g“G1—¯s¨†#ª »%dª ¨œ´3ë™á»TãÌ(Š/ê ¦cꙌ”ÖÎ*Írù ÕAŒh¥CdQU½,íª”RÎç–¹^8~¨5µîND.wÓ¸ió@92Z(W;‡l‚•‘étÂ7t{å ƒ† $CÎ×™MùÞ’Ô®žœX«å'G˜$­w_ h"×ÈÆ‚E»iGÙ/pí.ÎøÒ«ï[Óº;ZH9€3qJ/1 ƒ™ø-d’tòχ~”M2ÈIƒB6°ò ULfðï¬4èà“S¦ä³ÐÞgÝ™…Sm‹D,EÄ ¨X†,/"HÐŽag!¤¯÷ľ"Dú~–ò´ÊzQ`týäâ&¤ˆ‡YåúR^a–ÄÙCíṵÓÑÆ2ýˆ›Í#Zó#2‹ä‡Ên+â¤F¼ÏÐÿMU"¥åoÊYE¾½}Ïîÿ'g”…¥P„ùÈŽ¤rE]q4Ivh4ƒ^>qÇ(èEÈO¤M¤QgyÝN½Wæ‘5‡B¥‡ôîIЈ !—ùZz^jðz*y<{õjCC)ÿä{ø÷ú$gëbû䵈o\|šªšËòªfî™u2"%¨-äË}ð¤“09ª¯ÌÍÌÄõ#®*E$üLН§wn+÷‚\°]ÝŒEnYY¸©\Í”Rµ0S˜ißû%š~ößêËy”ª©þ'š¼~ŸáYo´íSÎ…"ÖÏ_ÂtåÀDWP—NÃå¢a9Ô–ˆÖ£¹–:kóHˆ—’Ï©2(=¸>ò³J(¶1Ûì;¹7—À„‰Ä›cÒE0²ÒN÷/iåUg³~r6p)#NAIy–Ix’˜ÉDŸŽ¸U›ž>afÌU`¶…ôÂ:€ù@ì™Å…Ój%Ê% ëÜ;~úkI—™Õ½&,¥Ë“8îðÏ~uqnv•ÃíîS/V%O¦*ÙÏÖ+Ö²½µ¢jGãFMñŽXôªæû#ô*¶;‘{>[Z$Фjp›Û0lIp+`ʤ†­c¿Ïa* ¥¡Õy˜Ð>Õ·˜ÕrÆèÜž˜ù¥d‹·d>ñæ¤û:Šä]é#6S íAÊûºÖaüÀà}"ösƒŸÚ"ß™}(äg¨¯ø¼{®‡Ïi& ÐuJ·5¦çÔ$‰°®²Á\-è5ú€½‚CŒÊLˆ€šx¸¬fòcÉ3ÐjÛ{`êw ËCZeE³t×fòükZyÒS^>ÌRUUùˆ®XúJ KîE ¸„‘86<%$ÓX¥¼guKn§=2‘ ìõÖ?Gˆ6ï»TŽEN ÊyÖ„öü“âB#@øØƒ³·ÆCéàÅ÷x§tಬâ#É]ÍêÀ‡CD¿Ù “ètÔdËX{?'–xHÂxØXŸ#Êä£ ØKÞ8 hµ÷sÍÓḒQIRãG%P&o’RŒÝqæ“»/DEX¦@ì‚N|ÞeßuæìŸ¥i»1ÍO½ÃƉäÓ:%sFåó?`rUÌ”QÄ£LÁo<,oZ¦Øz±kåK‡ézÓP‘ï®Ó¤—’p`âo•x„W˜v$ªÅ³ªGcÆòî•¥¿©XAÅÞ»UÞ:©dßÛÚ±ÉwZqêÁvC>§ $2#;Ju®à×hGòÐ÷1®„¥šÎÜçaÂ…9öW„,𜈶û¼¤áñš«ÕfqX Éwîµ:îÄ¡è 6"¡áæ äªC¤Üy‰-çËG*{’7 þa êŸ,Èx^6ù’ö•JØÖñߢ}[¸ÝÛí`’`3ÓoUêˆ?wµp$¡H]`áaàek†µ‚óS)9EÚ3|l'‘•œLC¸ÛÈáÅop¹ÛªÉ½¾LéI‚YzVêáj‚1©ën­À¹¥àONò”%°Ù-]"¥¸6ˈ÷Ð?wÉ÷ºAZG ý˜®žÂ‰ðÇ­”myuý!@—ê¼1žÛ¢!] ÷Wä}ƒ<}œi¸v1 )LAô&ãY¯¬[¾YX—¦üÝXíê#3æá‘®’£ŸtM¢g²èE,5úëÀë’ÂY×9 í†r»``¶þLo9&Õ¶%ª, :ôxxlMˆZì­ëWOW¤S^)9¢ÂJÌû×@ÃÇԔ̫‹åÑo( =›¬0r¬SCÏáëøoÀ‘ž-úK¼ž6ûªÊäÓšÅÊü¥ßf€Y^ ú'ïKè¸wk‡Ã5o^Zð›¦ëT ‡ú–)ßyDU9•ìðÎxԟ̬eÙ®ÿËÃ+×?Xî6«Ï×9a“Í3"sxZ´¯-·”j˜Xkßâ©Ëz†¿Ä\Ùu"Dz&<´©çÙ—ø*J=²§ ÎîÍ‹–ÔոƵã5D¸¤¢M˜(9Oª‰'×·9–^D3+4*²K ÍJG„#2Öv·lz±eåCcËÍ!Nð¬’#¼ ²ÆZ>¥Åú!Ÿµ.ŠD œsq¼¨+,"$ŽJÕÔΠ؇½AÇ-õÚ'U?+jÅ࣠é=Ý“RXNýS ÄNvˆðÄêLRÐßÔAÛ»²'鳪B&Š$©ÆY-?›šŸ¬g—ƪž#˜cu%8Ãyk7~€¢¡3ZwƒøŒ—CÍŸ;¢ÖXtòŸjѨuÀD>}¹\ð¯Çë…ž’¿y/º­êûx…;}K¥Ú‚DºÀºÜ$sGn¢Tx°¾Uª-x‰v€¿&µõ#Âl ÜèÌÍWQÈO×ÒÌìä©äàÅ9Vý…AêÕª²ÖñÕºeç €tÎr»nõ4‡!g¯êò_¢Ýw ÍWÀp)Ëò›÷ ‹D ?Ê‚~©C×ÐÁ‹,ˆvÝ'pïäuL÷. òo“ S©z9¶_ÁogL¾pÄËmR^GºFš'd“cKbÞ¸ì^< y«Æ8¡HøxÕÌ¼ŽøeΜfð•fÉ[*öòY–dÍT=rI¹”=¼*Åyû.˜.Œ_dM¾'Úù¿|ÂâmÓº{ŸA§»:IÉpfZ±;Š`/= ò*fº@ëÈ­H‹¿n¡wƒ¦ªF| ÞR"¨9DrKTLìÄì·˜1<Áì6]æˆaD%¹Úüg³÷;•LrO)!Gz}ò² -¸I_‹ì‡²{Ø‘IûjJˆqFâ«gQUWð`©½žÝ›;Í4ÁšJÃ3'Îê>‡swðJy‰<\B¦_{ŒåÊ!z]e{ï½;?{.îÔ·³4TL¸W}¶øâûVóO¸ÄÆ)Þ!iY©õï\H~{I$ó2N•בY›ý!Fm$7ñýý»í£zz,›Zf3a#C¯’%Éþx<%çÄ»T=Ê¢/ †2ó¾zöÐÉÄg‡¶ç|W/¼P̱SÏz€-|E4пíöƒ¬òRsxšÁþhv,e¢}£ødfèÖ,œƆ ”ƆÌmuhþ¯qÖÈ„”úœÕUZgùê—‘æÒŒÀçÆÒº Ëô:¶¹¢J9·.À…©.h*"Qí"™š)ƒ¢ù½ÃîŸcÇ„™^áæ²ŠƒN}O‰±/Íç:¤Ôö2TSGÔ¥ Ïì½uÛ—’3«Ëí"úàow›«É*v5G'˜nÐj+Å¿ÇÒP‘¯žzÛº¨ÜªÏ§Õ™ ºeC ?kYs³ÿ&A€;³A +:4‡«G2ÙY êŸË6*w,A‘DêDiXÔX4ÏàÙ¥&YŒzêö¤±:d]Jšîoס}?+¬‘ü5,*w_OB…œÁü£ÄÅ©®àIЬÍÒ€’x•¢šÃhdË|íí¥€œòÔ2X ±39¬¾raœ1ÀznƳ!4â½³âÓÉ7˜\LQrk’žXöæ$-BÜy! ŠÚ¡Vâ Ä’lÙd€_ÀæË=è(‰D-T Í7¦VB匹Øï9×íw5¹Öibñ}àœæŠ§å©ª)Cû܃¾5T½­FajÎej‰ODÐò'.,VôDÁ´N>DC¡œË”»yŒ¡l<¹ îâ€AŽO'{$¢Ë¢Á¾eò#mŒ³/9P!67•’OΑ™˜»PcÈÊ–!bòôê":O‘æ>Øèˆ@_Ws2ùHˆök"¡qL¡€ÄÍFÄq¨¨Ìkб02wÛ5LŒgD ãù9RÃæ÷]Cé¼ÇÆßmQ=O¦gï›ÌÓ®¼ ¼bk.”½Aipw ü^¢ÎY –Tcdò³.F`Èbb=ô±°˜ Æ>µBöl¤˜ò±«-ØùlÄØÈÏ‚Õ},ÝãŸcãµÃ›¢ë‘÷‘Ì<îYiÂu$ŽÜjàJ¿óÒ©ÁðN¿ÐïõJ+ý¿ÇË^ÃþDÚ_¾7qwø%ZñŠâ8gœÉ6R`¤—«nJBžôtö˜å]Ý@i êC$a<ó†’:×CG-®jp·½T>7÷G©ËÜÏ3 Å þ_Ínq§õU7˜y2¹ÕÊ©L錤È{Ȉ…ë?‚}´NϾ‰Êš 8ù …8ÏˉÍl{j0fq°àž÷)‡¸ýLŽ¢µ–©¤æîÖiêÏ1éZþìãOA·w‰‹¶ôtØ`_^¥Öj Øè2`ëdw-ÈqŠCÈù)9ªÓa¦ê¨±Ìzjb÷óÌXÚÂD91¸&º}p¦îf>á4µ37¿›Ëk4½\9dÕ«„¶´¤§ÍfµÛ¡‰ó_^$fLK€„âÐ0Y,Ý €FÖ›t2ðüÔñD[¸A „ÉÊk£â>^†uùæ`+àj‚S}_·kꆀ³ •Ž4QL‘oÓ¥†!òùæ †‘t8ŒÙ©‚ëz™ü¬Ç—Æ™-c~3S0‡‹šÖS±v;íyy4ÕŠ™©˜ñ‘[êÓ^›0@ÀJ«Ùì ˆÊD‡­‘óŒV%r]T'JˆZ8$r‘Ä#×1|Ÿ2Çtw•ùÐüf äTR.ò“r%xÒˆÉÈÍþ¨°ù)žARZï4™/®ÊÀšÅh ÜXŒLõØ]C2äÕ°éÍHB¿iãU‰ìNpžÒYŒ½1ºß°;;Õ³à$ ²ß¼jpÑxlªÃi³$ýNåÄZé\ÎÔ¦-I*¡{ÄœMøÍ~Eï‘{|3Cíh—nhzûų0î„>U$YëvSX¿TXØÒCÊÚÒª½oB ð¬ ã’B•ñùf×o!äb?ÕR±-øa“ÍTôYõU%Üâ}ê™’£¿"|¸kïíSá–IˆJ‚ùVþ`»¦!Á/ü\x–?M×¾ÒÌÙ¤iTYeé±áéôÔKeùK–'cÍE=XÞPôQJ.ÆèGØ ”·7`‡¿18mÐ#á d«ã?rt»xÖ–²‘;@Vz—rašë™ˆTV*I%æ±P»¤lϪ›Ú•êýJjhÑ B^vrm˜äñÂä[¤M)¹ùJk<Ò~Fç{ó=Èñ]½ÃùùNà}ݧà+º’TƒÞÖ"zÌewÆuè >äVFsòÐMúM[P;¯Ú¥e|G ´äüWîœXCrÊ™ÉÕÖ¨‡Î»‚ºSN ;¥Œ‡~ †®f ÄÃÛŠ8ð Ù¢Ž€rÎf, —ºœÁzÛ T ›;Ïbª= IÃëé ò® ‰Ël¯ygp7×Ü»1(‡Dÿì?Çü %ý§2‰޽úŽìÐ|‰ð_‡æoBøÁ3—ù}Òò±g'§—¥7¹4Ç:§FowKO.°ÉeËóú#¦Q0g_ÊlS¼áˆÙ1'BC“/²y^÷iœ³™¥áßâ—u^p>¦ðHŸÂáòÓwÐJÎç?â|JÍ©‰ô¾OKBÃ#IÌùIT Ì BÍFTü–©.)jNNHwóÎáóŒB;F¿D4™ Rùñ€3lKaÇ"˜âœÓ6RX¹ºW\°“†£n(<äCé,àÂæ%Ôœ¶<µ¶°_mG±ÝÝU?¥‰qb‘T»Ö™ƒåå3p:ߢIËøº"b"tk¿ aÒS{#ÏV2¥0Àª2‚†‡(¬²vNçYŽ/ñ–LÌHà!*¤*(­áÜÇ­Ó"T=ʼ¦¾4 Ç·e`Ãß\ÐþV|)„srD¿—Ÿ”ΜëÛqq¤Èá' ö%ý‰â+Ò†O‡ÎÇ=<˜”ÇI™éUÛƒVÿ æxbou_ªa<ÿ=ytšvºGÎæZƒ¤¨Ì¥h¸0ŒÆ^ûÄiéçv4fgŸ\#IœJטAe…‚+úù€>oZ PR{é_<–ÊO¹:à×A~FU£Aöú±}nÅS•aÕ.kÅ]¦ÕmI¶ª¸|‰ÉÛ½•G>“™ç[ŸAA Æ’¯#¾Ã%"gdÀ0" &wÐp¦|P?ÈÕó’SÄ<Ð’Ê>úEE"–ÚEØÿ"ŸLyÍô[]éàXú"<ë&wxzŒÞÔ™BQ2(¦ká[‘©Ž;¨Ø3;gVñ¸ë;ÛÜìˆF’ ß°Ç•R¸'Á•¡[)5„àx¼`)“%ÝŒ›œøfï‡áƒ©@„ß«ZU{ìî˜ðhÔ¶m<¡¸¹Õ¾»¥³Wo¬JærÎ(-›?¾óS1<ÙÌʶaB;‚$¹‚­¼ =³º‡à¡T]¸†Ò‹—QÑ'Ã…~±š,~GãO¬u…+Ó.ÇœÝYúŸ2ð$ïÁ­ ©§aî/vå¦Q?‘e„aßø b!€ö°èůF.ÀέÏ%òUz@¯ÀјÔòyNÁÍépx æÐ(Õ‚® ô@£¯ú~$Ú3–DRU]KKz\ c_)Ÿ‡ÊsŸI³$’XYÊåIÏ/¯V LA„?–øbO`þó1S yÉ-O-‰¶:÷L;;ò"ÔÁƒôZzlGk íWϘrÆNÐÝ×&pj[Çn¯Ñ4’9jjŠf L´AØ<•éØáòÐóZéÃöy$Ίiã;§y›ú«Ó_rpš”*©§’æ7&QÅÅcï˜\œ]Éç`ƒ ¹³£¬d78ŽêZ֗ɉÖa‹§…ñc~h(è^HüT†ÇZ,¸-:‹xiÆþra±˜ÊßÈïñ¨ñA™qˆóÚ§V'{Æ&yp#"cžpq]…kVèÇ1_X¶¡á—zv»d²Ç›±Š9bÕ{]NÆ»ˆæ#¤:GƒB…ùä­P¶mÁ¿G˧4yùZ2ãuœ©ÎD¾õ{ì™r¼+PBûR¸U_¢¡èÎ;8S·ŽÏÏk-à"½Jj0›þZ¯¶~­Ë† bð=h"§Ðæ…þ{û½°çQ Í„EèH(O!¥ÍxñÝ馿<¢1õB*†úuˆTHbeg¨Âq*^´Ò‚$=S~{êt;SñÝUЋG‰ç°ÇŸ¡3½#0¯áô¿Ž=¦âE.–"¹e†: Ü#ÒÓá³v|Gx„LóÓ{™¦S›Îgü½¼ÝK ¸ˆª†›®éæb.ÈE¡…givê‡|vpÄ]''ú} ´²ïZ W¬w2a’KŠÅ]à…zÊ ¸ÀÂC(ÌÒy ö/¤öBØøhû`zÝõÒùF¾…#[6‘ò6Á‚#·ÍbÕ •<¾cùAI€M>ð™}Ó(y&8†9ótQ™€qöwfJŒs’P£Ó7¥/z=±/YŒÄ±MS O•HFú ÅÞ#ØŒ3(Ã&ˆ3™s2^”m×7(8¬5‡r¸á8`Û‹gIÌEb 0s3–¦áO8Ú¿‘cv•>{Au†1+&LUS^éò‹/¯édƒß¤ [ Ý‹\BD5É50ȺrÚ­tð8Gž" ÊA=xäÈ_ãùK~û!«<$ÆtáëÞ@ïYfI@y6½P‹‡êkŸeˆÍâ²À&nòÛe*‘v 5"«¤±˼Ë69Á’‹ $œoO¶j 5lÌæK¡J¶¡Z(xg“+#Hò r¹Þ–¿I×2ÔuÅ›e$̺~†4’ý.ä¬k3;Á¸3C“ ™r©ª”›Ñ¤0Ü#§\ÌX;ƒ8i"÷”Ç2"ãÍ.2äZ2`´¨ 6½1äd³Üª< x×W¥zBȼ ~õ hl¯„ý›×¢‡WÁiÚ =¾£«ܾ^ˆ&a+Èî)æê+ݸmù˜ÝÙŒˆ¹¤3ìh9°û®$~ˆo/ð8ž> žz%eW‡ËâOâ7R‡Y”ŠñV©ÓÆYåÐoÎWÛ]²§*Œ Á©iæR>BæcH¢m§€“Ý8¿êÔŸ-ráý&ïi»ôC€8¦^7»Í¦óok屡ruw7”ÆbŸ1–y ±×íUít›04ÎÕ"¾rè‰ã=‹vÙøÀÜLã ˆtR™Êf½ª~2„V’§9’àÓ3dÃSµùéå‚e\ÅkÈIÒ*º…çwb0 ÅùmüÄX–ÍW·J•ÄKê5âhyóA…PÄDýã5¯‚²¸±©‚ø ƒÔÎ a.Ná7“45û™eôB© »•»±2ô¦ìĦ˜ìw ›œm©UÛÆÜÅdã_£ &×659M#†£Á•pzBè†ê1îƒG=Õ†.aá^ C1ƒ‹-𠳬ý?8L’ å±£ {œŒmÉxS·ãxG¼/éeÒ_*ªý -¯R VâQSUÕeõûÜÑÁ%éS /ɪ©|½—§1CiH}ªTªfE^ßqš‚ã ¿9üOôAB+$Ëx|¡ô¥ñ¹³ÊJùÚj¾x®ñ¯ËLÒžSõa÷t­…mçTؘDbn1Îl’麞<ãe±+hÄ¢BLŸ¦ ;xHf0]§±Õ8z„¶Ñ=e¬°ýjWTt ¸roðèHè„O2×RjIô5ˆ+Óö;1§p¹›(1‘‘†LüûÒO倜½3+™ ˆ»¢)ŽPÈVü“1ô ±¦Ú"ÊêÇMµ9U•Oç•j°¢ Ù4`öd¢lë­e•ÚÁûˆ£ÀMØBºçÆ9‘ÛÚž\ÌN÷kF±‡<ù™/Ä€“„ »ë…Ööm!/‘ЈSê·voè„•—•ŸaŸJݺõêx× ¢î–½±]xö›Öjöóö_]ÃçF׉˜Ž ‡”Þ#7ÂNµ³â†Þgd±°˜˜ˆU^· L™XkL©è}œˆVõîrâÝD ‘œ$%”FÏÐ1Hæp(J¥ƒž¦UïÌÞWÕÆOŒ¼–üHbëö:Ö-0¼¹Œ¬ ’÷,Ï0v¶,c âðQºP™@B->Ý;"^ëͪuµ1:v†g¸º<Út~¯ ‰ˆ0´ŸÅøïÇYãìa´n4 Õb±…§ÄÜŒ#¹')Ž ’Aô¡…aÈàZóÀ­­B·±„‡–¼çömpÊîÝp¼W4©‰ÉÊöp×£g¢Ú"b¾äÚÝÀÑã*ñÈR:-dy]VjM®i¹ÅaT©\î:eð¢ºXF¦"ý·5¥ |úÞº¶$€Îs«’(T@çãÛÛN\oOç„!œM=ˆ9gƒ«‡¨¸GŠ;—Œ@tñ¯xŸWN,Áú½YŸ48)úBUÊaÛîô¿3wÚ,ʤÞ%áXçÑiàÇ€þ‚`7kÞ8ˆèd orÁÓá’•¦f`Z$ó[<üª‘(÷Ê•â’%™Óò§+!Û·‰@„ÅÝq‘›sS¹¤öJ±ÞËϾ²ò3ˆØâäGZ=ÙT ¬¤Ýp×xØd”Œê†äy”Žàé=Ù`õµê<õú«ÓžT…òcA35-ø†”•iQU¢Båþ‡DH?b"˜ùtÏ?‡Ø­ý— lÁÙr¨Îc?$‚ßó¯òÄ–|­X÷^×Sñù \CUUFY%C”«•RIaK•´R9‹,Ë¢w*캒–å±é—»0ÂrøÌÍ“ û&6%õ{í–ÇÙù¾?!U?ÂÑÇ0G UºÁd¼[\Œ9DŠz¾¹[ô77÷°}nSH]ÌØ…íc$Õ{Ð-«‘µ™$>9¤Ó"ïK0DØÌ ¿&MýpÌS…g6çzû($R£.è}Ö:º†/Ž£ç·fTôN*±X¤Ã:žËµÔ?ôÝU„4Ê]$Ær"ůÁ‰D¤(ˆÿ%ƒàYÁ ƒù€ñ½ðtØ9³Xê/\¶ãê2,ñÇ¢éûÑ:`5RYW¹: <t9/æ †Ik‹^a3äRE‹#ñš— ×KBœŸ3“K=/—ËuRµ…U£·cöMÒho$%’´·çÚAO4KfR™BÌŒø?SŠ®±‹”$Yš›±"š:í¹3ƒ¢¢… åÄdÌ ‚é ŠTÁÁ7‹v·Ð…l']0n±¦PªDtNæ9wUQQ-Âĸ èH|‹§Ä«Â $ÝQW⺗¢{ˆ¬³jœ~–œGŒ¯H!= ^;Ì)4'eÑ?ò´Ò.·µUÙ€ü|âþ·ιüŠGLˆ×ÊËý_Aÿ$$›SøÔÓìúí6ìI*üñý_RU¢ìC¤#¤Õdõ—!åž_Ìæ’Ý'faâ4i#O9nÊÈq›Û³R¿žÝìÞ£ÔÀj¢ƒâð¦ÁsH“:´\÷£éO¥åz´MÕMbØ‹›£ VN‚Jñ›-Ja¾Ó„A ]GçÖÎ'Ý]‡Ì5i, Ô¾e ™g؇2,ÁOÈ{ÚÏ–lyD£s¤=iiÞÙÖÁ²ªóPŸV‡.KÉõ(ŸýNe{R[å'ÃRFSAÖDv%,úå”ìi ˆ™URö–:x&]P<)±®‘2h~S]Çû¼‰mý™™%©ôHy¡„õR›z Wè%ùÜP+C˜Ÿ¢ò¥ØgrÄŒ-½"Ø(Ez^PJ|R£0•Îü¥àpôMÆãÁø+2—<ú­‰u”°`Ü xåeÒ5)…uå]‘5b°a2¤fQŽHÃ÷WŠX™˜MÈÎOµcrÕºÆçëgEo|†„Ÿ*ª¡ü¿3| ÷A‚}m(þ’‡­’žV¹–5޶ÕB†™;§;%D–@¸ä÷\LÏs»1;9¡ ñ ¬—ˆ6N6wÏ~I ·Ô®q<›ØvÇ,EúQ¬þôöh\´L§£rÏéˆpG¥5Á%<¯œßça‹‰=Òª¬DµO”eéQo¶d ›)Ÿ½¬{7I&Y â2ÎïçAÿ]åÇuô8™Œï’Õe‡Éß”á~•òù~lÝLÏì½¼ô°çbq·,þþ•¹‚6‰ôøÀ_ =1öü²¿`)n'üŒªŠ%QУ¸v±·CþžÏÕâDåû)ƒdþHèZÚúQé$µe‘$Â÷qÔQáȱkìDsó»vS” ya‘ÍJ(…ùç™ L3ö%xF[úJ8ÍGŒ¿“Ä{-É1÷ÒÓŽÕ£¾wò›ÇØ Û13% ò¸¿*13û€qÏqœQßõÈÌG "ÕyVÅÍËq'Æ«²•m0~ƒÇ½Å;c’ío& Ó͉60kÞH¯,$Kkö+@ã$ _&‚êExx‰0SÍ0 x…ÒfÈ¥ÀéphÖlEgˆ€‹ŠÔ«ÏÜ„€à$:ò¤Š{õbûç‚ú%Ã>kuÔ…ANPT³ÍÜŸ–Žv™íäååRÝ|Ìw¾L°L$D&Y3ÆÌР 7 ÚŸ’SÇINt”ægø¾UC2@ýXķñï|FI”o^Ýt²Óèe˜®ìtlšÅT3å{>CyZãõèØú ^°QJ ö!œ1ƒÍ'[Š“ÁÓH:(tÝ7>Â$ØQÛ7ÕKqqx5Zê‹Îbülb“ß"¥±qÌÂk³Š«’#Xšƒ)Ê\ *ðR!À'¡É˜ßÏÆê9k\Øu± ìÑ›1ÆR¢¾/*BÙ‰6ŸÏ‘Íѵ¶·³ö=¬F» Àü!/C‹«ÀPõ–ò‘ž£Ì*š ¸ !s¾°/˜WÄž,ò&.„CwäÇ¥ì¿ná§N]˜1‹²Ç™yœÎ}6 ¾Vo:y¡¥•"5&l(Ü«’¦cvä·yhÙaÇ "o]®ïP5ÄŒI„ZŽË,Á¬¾TÎß`_•ã¦>ßhžà¤Ãz=ó7“~i8Ex$X!eÕ34Gw{Ž+¥Tçî+yaŒTÜìD  ˜‘kD{ €æÌ‚j›{+Æõµ/ fd¿6þÄÀR)¬fÏ P ´–“… Åd'4L¼«Ç“É?TÆv%K©ó*çVD;»R$ï‘Í<ï©à>š·òìtŠ£0ü{öõÝ-r’>2>­¢ùEBÇ”¼)N8ECG¼^ï¶¶D´Ï7­— yÍ´Îí%v!ÎÎ 1PykOƉ5C‹™ÒÂÌ#vI Eç{{˜Ã‡ç\EâH<·¡H{a*q‘ èä½ÕX›©½)¯@РÛúý¥k•OæÄô¯lI°\°oÁÍÏ·^1£–#ÖÒÓ_L ƒË¡¥‰Z|‘“ç¶Âú«Èä‡Wm°`îFú Í,à‰rÕÍ®ë¹ (K)äsÇi#ÞNÙ»º”ORB¯š<&fýÕ0¿,já|N~8—.õ}‰èØP \*>‡UO$ªÆ¢ÍÄ$†¤<}mÍæ¶—³“[Y´ê*œ0)´½?˜ždˆ9íjz\Ÿ¢Íe`ÀÚõ¢Àà5Ê&ß"Îä' ½Z‹†±I^”åU£n%QOIgœ]†xL=8¶‘ &fx„Ù^¼êd+·žÆpg*÷Àw9Ûõe+†!ý_Q /üL‚¦Ž\ø]«6U}˜“/%è5}é#\ç7ìçßYÑîTÒ…y¼hnH¦H^æsE B¶MaMF4Ó BšÍ&ŸT—‰n="*ž)!ô w•ó2#¯eñ”oZ—‘ï ¹×k´*u¥z Å[¢¸_ÀR©\ÄÌ=z«.1$ñÆwi,b?K·™+ó\”µ’<…IkqjÀ ¼ñŒÔ“3£ ¯·ÈàŠÇP/9ÅRÑJªñMž) “>3Ó»³J`8•cù™€×˜Õ“ˆÐDý˾pCòD{íy•ˆ'Kø ZÔy}ÛU=eHÃá\õ{¦ Ò­¡¨¶þ/®˜†l¶–4Û½ÄËM(~·_Bl›bd4îyŽ ^o—'ÂÚ2ɳ‚­qN&¡fûz“OàÙNÔ'æg/äùiu¬ê†ªZ§ˆ9j2c©…JݧvUúVRÃXktÀ™/<\”ÍÔºâNÚ$oàã¦X•çÔ]TEX(Ñ!°D\~ã j~ZP:ÒF?ZÛùn_\® ûË^VB¡Ë«9XÍ“íaÉTg´^4N‹שrèŠGAŠÇÉO[Š]Sã‚Ë^hšáÁî—×ZW¾ìÇžL0˜èQ¼šæLT"¯>z 4ªª6e¨c”z¶QºqÃrÄ=lüÀ½`•ÐŽ.!0{È â«Ê÷?›h¨¿¶”ˆ'|ëRÊëØ(wVO=^î¿=Ãç“!ëfREÓ‘¨ZmÁfUe„í®aR=ؘ“Ù¡¾Ä…Ÿúmèn;QM"i:x–Æ‹ò•P;½ô”ïVt üY-Y%œ$%“˜>Ú²% ¨õ–#‡rº3ÂÞL%׉"µ22e<žwÉÛ¿ 哉Dz¶}Få£~/Ik¿yâw=F¦ü¬tÔËæôøÎ3ГÜÖ½ ØxÕ‚Úµ®ÁRÍ®RGä@%ï2ö Ê¡$’œ›L{p_8{Ö©­4I"¸Ö­Ò+7¡Ó½9ÉÕ÷{C»é¦N´mÑôw¹¥¾šVT¤æ˜àS"ÕÈ(|¸Ó&·Äwã‡WTûvÈà ãËͷ'<©ä stñÊ3Z‹PªØ]°ëF£4à §9š=c<˱òœ³kǺòvb`„£:7cÇ>›3(R¢b²ƒméþT¸ˆ?'Ï"-Ñ ß{#Ä+lËà™ §Õèûi•4Ճˆ¹\ð¹3:ˆW®ö³Vノo¦æLÍ@…)è^Q<òñ²!Հ̓¾ã`ö65î+ú­̪Á¦%(ÁïèHxx®oÍh5Øv=îÂ7ñµ'Œ\TtH|¦à›Ø0溾$He¯•ƒr7éYJ_“çùιZeÌÑÀÑJUÛä¨ìPÃÏ´£G‚ ÈÄŒeá­OfdʤV·¼1.€ (ˆÆ]x謈™¤MáJÃT2Fb.Q¤O p¼jCùTÝ\\þu(FIÀ¨È{æ#,úÑ$>Ó[ [6E%>Ó•–Óü1ür8¥éI`ŒÏó%ßíc•…' ûÜ® òç,µz¹BjU­Ú®°hnàÍS ­‚ËqÒþÀ‹²ªb½€UY3 ¶mçsG–÷p«9À¤­Æky†=n“Lo@ÆéGåSW×Þ"P ‰éÇ3‚ˆœÞ0ôÃÞÚZÁ¹;”¿§ˆ4€xÀ­òaåû-»}Ãîósê¥_BÍøU j+X¬¢ ümO—ôN;oÉ~Ço23ó:¸Eò’ª«ëªòjE=;:NžaüÉw ª¦+ ,Bj&ŽŠªKCÖ’É †à†è­Ñk„µäÔÂM˜=›«É?*©˜Wáî= ø:.–D‹æET+DUQ?“>Š˜‰‡3TŸ¤¡ZÑ>`|ù?•ùút_ï‘@ݱ9øy+WMV†`ö]Ãv[¿ ÚÃcçîc‹¾Ø¤ò"SkK»€`-¢©%Pªà3,šÚ±±é3œ@×µ7r¼(A¤–À܈ØEW¢•¶ih‡4]¼l³wÇYlvÀaj$)â.5÷yhØ%SÚh²:çÕêXF1('Çô9]“$ÎÃÙeÝTÍü‰äjïOŠn!È£Òx÷v?DNtNE&úªÄ‡nͶ,YµÎ½öÞ ¸ÍÖœ÷.Ob¸E†SÜN{kÜÐï-ySçšßhÜuÙÈ- 3ÃÈL¿‚EËàC|6_ê…Sûë_æ.wÖT/ëˆßLùå.f¿ -e ãùçÓüNêÚ‡hÞïŸÝlÒ”Ó‚N&o€òÚÉâ&õüj½xð¾mvP_,³í‹CC(_´3~™_Òª„–l*¸ˆ# 3ѹ0úÖ~3;3C¸”˜ Š(¯™7:ËèS G±›ÎDÍi8üÔiaF£ê±ŽÇ¤“ò•Bna8•°»Bœ3U3;HµLô³:_VƒQ@;Å ´¼”4,<{Q!ªðå”ÅSÛŠÀÆ´Öª ’²¨Dpl­GpäZÎ ø¯ííc3ü üVµõy¡¢Þþùª-&ŒaŒÎEk¾æ” I…ueÌÛ´š3²Ë$V]WEYf¬weùÐpÀQ~帜û’0Àt@æû¨>¨Bp÷@Îrð­ƒk1Rî½mëIDwµ×õÿ§cWûsÖËå ?°é4“ÓÌ$Põ:x^G&3Ç+6Kð†v2øÐÒø_ù‰~½Ï;àl2H¶·Æ?#hT¿1Ê\™ÏÒ3è:§V59%ß ¨CÊÑy<Ð0A\«Þ0]>ff…UfVZu\Ñö©´u\Ñ0#:"ˆœ•<“ƒwK‡žûÑ葵޾|ƒoPCg‡Ó\W€ôO‡펖’q¼‚þ´1€ó>Œ§¢ºÛètg¡¥ï—~òG¢gA>/½Œ˜0¡ ¹:¢Àtyh‰z˜7­8ž%ù”¸T‘SÛèž‚'vön¾à`\ÌóÊ#±5€°Œ?SEAu”¼b$/’¬V ÄÊ>Eò§‘º{ßÀãã§ôo[Å1·N!»‘J!Ê_¾Gù”LîÉ7nI¾r”iæ^Ê,_<¥Iû%·Åä)9zðEHnÕlx_¼=WÑáFöp)(ï‚£#f#C2s)õ@»4ÝÜ¢ßg™ܤωc^ÐɰgpìSiÛS fg"œ¢]Ë€ÔßÜHOcË}ã¾H‘y˜øÓÉ0Ù%®d)õ$H6ºž0§|`ÍG&=äF@Ÿ,•º«í&:IÊ&ª¡=úRXZÝuHŸrYÅìGj½'¶YoH0ŽèLÄg¸˜U*F‹ž:~YtR/aÐZÙöÓ] ¶à:ìÈz[w 2IʉËÁJUU ªÜÐÍ0ê!Jªl>…Ð_KËGÒñõ)È| Ä ˆIg€‹írw®ƒŠ©%—ô£ýtïHBy„ÇpU+KÐržÅ|CùP¡@5­•a[q+ä—B{y¸§¡V®]tk›yz¥OLÄ6¹Ùªˆ¼j¿@ªÃøüÁóYKú¡{Á‡æŸ‰¾ôC€ þ“’çèÇÏ\‘ãÑÔ°db 5ŽW{ Ú¤û˜ÖÀ†lçádzX8(óͶvÞ5M,ʫȩª‰´iª…n2¯(1¡™Ÿ_’¡Ü {eá±›†ìigÐ;(µÎÒ,¬Z“¡5]³wõ».4ŒÈ0‘”¡}*Ó“{îéú%¢IU|ùSËÜæø•ÓŒ‰’“Æ +&Ù* g°*˜¸^%U‹”úó[é£÷Jѧ²bÕÝæ.-XW>Dù!f Y?4¬CÁ)0›=ò*­.­q9¿ž¼éé<Ìl]b l½.,ò3ÞD÷°>+ʘ…ð òë äçñ3%Â|žº~Þ3uÊ_wͦ¬Yú‚ƒæ¹RÀH…>ÙÕ~”^Eàñ–ç3lÑæéqj³A40›3ߊYübé~¥U,:'Ðî„d'ê¸X8/t«2ãR+ÜC&89ùæÉ4ÞQ.å$ E$AÜÔÌA!“26ÈK·Nèw³z H,ê<ê¾*¥%gÒ^ª¼¸hÐ.«Q쟯'Ûoï}Jfpì}ä'£ä¼ÆqO&Ÿ¤‡KÈ]Ì Ý^{A\;Þ±­ogkÍsÈ£Þ¾‡MÞºÕÜ´ÐØÔÆô™Ô½«sIaDɨ•õhª+9b ùY¤1|²Ø<‡(“íëJ5[¤…X"‡íøÉÁ~„8\øU,E¾ð:Û4OÓæU-'¿·zj½`ŽÂ~$5¯¯U̶ܨX³+Ü€¡²°ª&ð«0À‘Ò©r.œù]_kýÿëþçï÷‘þ_ä(#þpJ+?¿ý¶`lžÆ½ñýãT?Äö8æ˜å.0¶èqDZ„Ø ûOû<¦ú;´5ÿµ7fH›dÕl(p ’î|Nš@}”áW”UDgÅ.eí³^,è/÷žô í† î¨×}ÌYƒÒ [Cý|èŽ3ã|RÝÅ©M•†‘!˜P«sÆÁ¾.}ZhoÒg‘<¾5ΑÌ6†Ì‡Š¬¯J‹ëF„zì8rÒÁ½à#êàL‘RëãÿéÓ%=®`P~˃…»©×¸%^¢£=¸ˆÆb<ÃZÎï¦yìÖ%¬`÷Ýo–s+Ý 84y™/|63ÑGæÆ‹ÞäC×Êœ]>ˆ›ŽÈ“­r°ãeSé4A3ýÌv '75$vµÚqnþ¬:ñOHvôÐAqy½ß©A!Š´iú\p–wN»{£6°Ih0]¤‹+¦’ ]…¹¬×Ôb «DÐÓÒ‰ö'C)¹îÕ °iúPè@€ýïÜìýÌdEëƒs_k`ý(A&Ê,!8=g*ÐýCÔ€sX XRcc½»âÙGr¸Æ`äßæ¶™ŠïÌ«\*üD‘EZÅ“ê@¿¾Ïš2›}ï¿|Ô³a1®­%òruްR0•‡Þø‡:1ñ>?ï¡ÈqõÙa€e—ÖGŽ<èÇš[h.4þ;˜9ÙØAà ƒù¡jÒé#  uPšÙ?#\›7Ýâ8ßrGMß«ßeG²-›òmÛ^ǽ»I[ñœo>¡¼ìÌ>} ľ¢ –*ÚPéô\hš/tˆÙ(°ç³{¹©ý>^£ÀúPë*Én²èOϸ`#½`Ș6ÌÈ,Š)ï}`È÷ÕŒ©#ëjìóã¡l°[•o©g?×C½×­³ƒ®Ð§ã ™>jæt4é‡Å¬›|sØf°öù°!rku™÷ÜÌrjÓ℃€ÎK±* ,IäˆT`Jœ˜”Q*£óÕAF~–N"Ǻù"ŠÜä¼ÏPâ&ÑžWÁÛ›™ˆ,Fnœ­C±*«†“ƒß ¨&ð=>ŒC ø@'Ú. ù…Ï#ØðA(‡ûˆ #BoîŽ×OX»Bx­¤Âï¸ Ås’M<'ÎeX&™Uße8X[(gù†x/ÇËÜlìú¨»tÚ;ð> ügÔ¹$’ˆ$F½ ûBŽPJã@Gê±ûûlÇØºÙ¯½8éLÌ×£B‚˜þ™vªGÖÿ÷ðÃó 8 H h…M_Ûž¯üe}voÇ£™D“DÒÀ‘ý€ÏŽëûìþl§ßßåGãøðžýúåwTÌkp€Y–®È®K©Öû•Ï}?ÞXÈ@/ïv€¿®Ë¥/1K\ê hù¤Í:øÍÍ.=K ÅG6æÙ ~òs·!“LàG­²­‚ †/àI®Rr|jã…KxÅwœ<,ï° B'jÃÆ:×_©ÂÕ#‹ü ;%ê‹BI¶°q]Y£‹Ö6b©œˆ*ú!Gçöé×IkXÃeDL¨Ð3z{ó£'Í×Ghü \»Ð¦a®¶¿º÷Ükë"–õ9ä?v]˜ƒ ­*¸"eøßoÓeøï´Âr›P‡>ùCRl0H„ÞT{’ÒN½Ÿ_ëkìb;©Ÿ¬q ­T÷šqê·ôô[k¾;x|¿3IJ"E{Â2éý¯ßÒ½apT†Nˆ÷áƒäL_vÉvרüÇïUäi†ÿö|BUW?œy‡_1Ÿ£;#~o…kšaô°ß3£?w&=ñ™úÏ„Üå÷¸¾ÌÐ]WËë§pä“sÎþ?)ٮXì}+Bï«¿µç–~â£óXÒʵéöuäj\ad2¢ î’"fä]\y½P¯hÄ|8¬iãì¤?Ñx?Òy覂¯ËÂõO˜V‡dgÁ¥Æ˜c…¿†mª@¯§ ϵ·½¦uó|ŠÞà`¼'x9à»ÛùÚ ÞÔ(ø¿­þŽ8»u7«ðÁ¬?£‘út¡ûÒÒ'}P žÄLUcàéM}Þw–“·Pš.<¾ø7ÌþyâÅü~'h|¿'Ï(qL)˜¸ \=i˜ÒÏò备oÑ¡ž?øÄ¹öþ¢q‹¡I¯U¿?5 ¿Èûù]Ƈë±ëÏóKYçÖˆQ(©ýÿìÓ¬{µû÷äm>~¾¿3œø°ëæ_ 8ÒP~ „~ƒƒ]mwúß  þ›-Ì^Lûûß5}[ÖG·ØŽoï~Ñ•¡j> P¯çøŸ˜ñµ®^”fV“¤LÌøÃèžc¬ÁT6Œ6Ó ë^Ç(OΦ…8°ËaƒŠ?J'B½¡ Ùü÷6±ÍyjÙÆ´Ã²Ç=oçgT)ýÀÈ" ç7ø† ‹S×g”·fãfBèK´«p‰bNU§æž\}_3÷¸ÍƒŽµÀ¿Ú]—ÀöG}èxà'Àû‹;“ùt³Ôþ¾fq”}œšØI!ï,3}Û ìbœÜ†wüŽ~b$7Iö8Ÿ«©Ýþ€d*”"@©PÂW > ÜÄ )nCó"j£˜žÿ4æŒ!ñ“Ô¾3O?òþgX5Gù_¢=³'Zü~ž¢gŒªæç×ãï )†Mqã°ð!ä©Áço+cì ñ×ïüà±É]?éˆlãˆé]œf_pwN‰ðØö ‹¥×ÝqïèQöÕÿ ‡Þ»ògüñ÷Ú±±Ú™¨%`·³í”¼†Oï÷¿X?§a ¢+¿ RËÓò'¾ÕÁáÛ7‰çWòÌïØ£H<~<²÷„Ĭ•(ƒŸï¡×µ†øþpîÐò××{Åþ1øÉ$ühû¹Gáó SïûµÇáþKØL@å›R¦Då ­¿ãø…)¨‡Ú"‡)¸üŸÌ÷e,·¬Ã)O½ßlÄ›LKgÖí燘•&’I JÀz5× Ïüú>~÷‡÷ŒGóœíu «¬†“ë¼z,ýEAÎéò~ŽâÃ'Ž8òwÁ£ab¦ÙÕËþw½wìäÂC‘2HrÀùo)Ц+Áó\nª”&ÏÉ“¸qÔîl{”FζýøØ@AÁóýù}ž"ÐøLz|+üËìïȼ¾ß L4T´vð²x3§äñ‚æÆþü_ùÑŸí|vÉ ÈBaÑÅÌO³ä£„eÔñÿÅØ~üÐïì6d7 Ö09:!:ìI½ðÖë"í;Gx`4¿½¿¿$üö‚o;ö4õÑó‹³·„ •Wj~?9¨ZýJ'†²^ÉŠÎE×Ç<ðBÆF+ ÚŒ!ØžÐj vÂPw•âsF¼C“DÌ›8îy4w×ï :¿§w¥OéìPÉúÏcÀ”óŸV7 #! —Kz{¤ Ü™Bß]x<5Ýx¬=ÂSç±¶ú’d¼€H$ˆ¾]  4~”ýuü†‰šûÖ÷yÀ‹Ï[Ë7º¤ðÍù¤ï)Ò.íãoaŽåüåÄZj¡?îò å2ž 98àtOì ÿ]¶õÁŠÌ;/Áú6žÄDN;{ÎÆ¤7‰§ÉÜküô®þËÐvÇÞ9ýCåBùOsôyÚ£ú²‚K˜ý·ºà'_¯?]‹°)´QÈXÛ¤…B¦$r¬ 3NeZÙ1 ¶Aî*6&Va€zþQ&SZ ¼/›T¡&CÙQ w÷ÛÙé~`ÔIÀOHöÛï¬-¼ÑoÓé•V—(Oæ=|å\ª>Ÿ€edhS–Pùñ&!º±úuš|UXðlüþuà“\ÇáIëÍ9d÷5ŠcÀ@y€(@À”)³*PhÜ”ƒ©uŸÐÐÁ1ü!5?NQ…¡Gˆ‚“§ö߬ú9 ýŒ€÷ŠŸJ‡àý3qísI±ý“çß“ïÙúúÑøN67 ¼û¦  4¼¤iÀ‚$¨ñÒbWÚ2öÁDŸs¿ˆC׽ȦÛ4âóÛB¼ósñ˜›éШq˜‚JÁ˜…)’á ¸uA¢0Þ2S© ‰•Ä„©)YŒ“ã3HVd“’%üF›Œ7.M˜RyÚÂ9êÖˆvÃ’›jrá0$+&&0ª€VZTä‡d%)¹iKF±pÐ:aPЗ(âT¬%hÂcŒ‚P…kYX(`É+PF0 MC‘­. ©¡Õ§ ÉÔ8©‰  ¡‚Aa@YÕÁVØJ¦2¤•а ‚Ž!P2e“°Q`LIŒTJd#@dåJ…•-!©r!5™ó¼l¦ô`ê v2¸&“ ÛÓå‡#6ÄV%KvpA¢J0‹˜L5(n JPrHdE²–š2L%¦$ÈJÌÉ2wRC:j‰d ÅËH‚¥ÅÀ¦(á—hÐhlªˆ›d‚ÙŒ•&Ä̧ƒŠU³lÇq–²¤14ÌJ“2ÕXtšÆÛHcˆ`c¸#mlÖ/ˆÔËÍæEB0‰c }ä¦üæØ1Õ¯–âî“§ÆÏ&üa„…4!BQÔ “Ô¯P:œ79Re¨ZWp¿¼r)8„ Œí Aëx'5&åɃ‰Sq¨WPPu¬R&¡^!WBs.åu jÔ'6 k$ÜjÈ Bjw jEJ@܉âž 2EÌÄ30G‰rSR™ ¿áu;¤C™'r®Æ…Ô!Þw"ðHð@†@¼IÔ!üÀ‡Bs R䯸æðIPPº‡$2—ˆQ¸æ8’µ ’å¨m&˜Æ¡ 2c¬£WY¬¶oy‹Ð ¢+l¢(¥eÝ ñ¬Áx`ÓfUš—5šuÅ£2…jm3ZÇ.–Ù)KsYŽ’Žœ1 ‘¢j+Tà †Ûž ”æiÝ“H¢ÀÃ)¤Q)1ZuyÁë[kZ1´‘ÙAà×Îjð&-± 8*„¬‚ ò:ÐÙ­± Š|ï›Ö“ щe‹Pa1m.—V4•Km¢0Ä—Xf>¤±W%5u‡(,'¼YeRE|áĽä¡rpŒ€ê2DÔÓYˆ!“QKï¶'j”Ùq.óU½Î‡Ã3ã,âÑZÕݱ9¥å›Ësó«·6²æüÒf9‰ £ŒCÔç^àkòÑë¾o³ßÆ'£R$`úÌÙ4pmªPÖ×EB$IGœcöUW }hÁ¶·'S "*À?å4aR´4ÍÚ¦ÅW‹èÎH°Ôkcè<$xö}qø£©¨»5ÓäÚt|!Üáþe*ýÂQ ™h4Bj_Ñ%AÌÁTŸ¿³„ð ‹ÈqÿÖÏßÇÇO³¾!mCÑ+®€›‡ÁfÞ—×xŸˆŒ‚0{Œ9ìs;ë_‡íÑ—>ö ƒ,׿߮ÒJ]æV^¼'ouß’‘îà«Ñèàûw~Àûølz ô‚þ©¬V.‹«*oÞþµ@žÏš5òlUÉÂ%c0ÛzÑÎh(ž[k« x7ÌèùŠn|`öCæ£gý 3¸J&VäÄăÙã~³¨BÚq,åPbÄPÄ*>Kë M0áÃØ·ZÑK[<ò™ã÷ííÚ׆xðìUéÄ?*  â=ÕC>:)ÓòlÏ»¬`*ø‹ÕV+¨pU\‰Gçãhž¾ÎÐõ£ðDíG,5Ç´xÃìÕž~Ç•ñ„=B¾hU£Pã×\€éúñcäŠæºþXu÷IÕÉ– >¹BO‘÷ñÞ;âÞVÙ÷^·%G€  GJ9îó/îÞú Î7ÖÚÆß¤Ð;5M¢ËlžÏ²ÎÒuºþ æ»3òöà£2‡ŽFug,1 Çá/ Õ\BôÏ=è⟠8åã;b!¬¡Œ-ñz½=ÉùwuÉò)`À¤V@¸_~á-ø–îY˜dÆ0 …"jpD#íTtÀä>}—5P¿ž6mz“æ×“7Ôp€re(*Ñ"ºªÊ'«Ú`¯Y‚o k¿×cå8nqz†Ì HdU‚0!{Åœ+4,.€: ¾P‘ñÆpë4 a!É]™j‘û42êœ196ê(1rÁˆ-AN*ᖡ•Ý`í€ÌìW;ÙÉ¡m’<×z©TqÛ/Ñêx8?9MÞð5v¶RBF@æ/h;É:3vž£p“h=Ì×Ö)Ú©ÏÇ五~|Xyñòu°kô§¿ƒcÐé= ]óËññ@w>=™JæÂ/U9òz 'À³¢_çn=F:‘?‡š€æ(MNKO¹¬:¶<u%U<¤2Ÿ~ĘÏ(v\T9:b3‹²&ÇN;ƒû&¤ªQ QkêA3œÉ]Ba%S˜KƒQUIÁNAŒ™ƒ,†3dÖ(b„)[ VØOyL`JÊ)˜c  F¤ &@+’ @Œ@S ûÛ ¹ !\9Ïc—Ú˜@ ÷wºWü¼œ^8ï;Ñ+®q£¯¹lï’׬¡ ÜÉ(Ya‚r¡û?`vz÷ÈÊŒ©ì]u4ÎO¨B&áБ´Ü³ïz>Ï"xÈð¿’Îä')…×Ù+ñ|þû}£wf‹ÿWw?šö~ræO=Á5 A<¸!ƒÀq“o€´Ü/¬¿ƒÏæÛu·ú:®M;ÿhêñœö(¤¶p†·ÿ³ö<òƒ·äéØ@µþ§‰ËøÖóñ™lÒ§âü;‚¯ûÉ>ôTÓXWYoÃæ;3ro~ù8“r­hÇŽ[3£©¤8ÒQιѸ@Œá„± ²‘- ‚J?Ž3@?§ÖÓ÷„ ½>ÆÓ=é¢ Eœ™ò‹á}Ýç²d1$!Q?;Ýÿv–:R#ª.%̆z':È}sôÑA"Êï䀽}R7dFigçKׯ„Mj±Äž÷¹6ï¾øÂ M¡WMžÿ)ôx§o8„bþ˜ Ñ)€D‚º”rP¸‚:³8pHçTˆ 6Žÿ7æ²µ¤ò@è®HÃê|m?d«®™ìܯiÏúÛ_ìüÑ:!Ðý½ŽŒ×¿qMš qŠUND¾>ƒì] Ĥ©"ïëÑÍšM?¼W"D†$ ¡Î?W]»^Í.Ý»[…tѼœí@–Ì/ç£ÁÛËø¯]às¿ÿÑ4¿áðæ~»ÝM¡÷"Áêóh@¨/ö6‚PÊKã‹ ½ì,‹Ìq¢ë8Ø;dï°í¾Äö؇ÆÅ0C»T½/Ê ä@ËåäЮ5Úcà(•Jú ÜàR@÷$¸̉ßz‚l!e.–ÛþÔOÇËøÈâAòŒ×axiL‰Ù4AøÙ£“F {C\œN†ÊÌäÎÐŽ¿L2; ×Í_šØ÷½¸!ÈHÏáé?П?Çù á¾[…¸&?ÛK¦~=ÔA:Ü2‚›5Z…³›BA}S8Ù\-íGñs9Z;êÈœÈÅç×5­?o‚¹=T‚ýD/¸€0¿Û>M“÷‘Ï~1èœ  dõ…ÁÚõ/âlCÇ\¤Ík ®õ”Í…˜ iÖXAm ¸Ê úÜÒ´¿&çžM vŸÏ;ci=}…)Á¹èþjˆ0ÏoZ 'nÉ£oç}ÞS16*c¼ÎŠ…v°ýîøpíñ?+ q*@Þø#.‡1B%h)ÈÈ/ÊŽ£ÙÑG~ÿBý5üÿ}颢¨¾ä?P'}&9"dï8¶ÒÊÒ2 ‚1DÇ!¤ ƒ«AeeÓ d)ë2E5©üåCvÄug0`±W Xø,ëöÀP *‚±GPéñ9–eGØ:ÍW„ ™OëŒ ËÃý'Ò~ÿ“Q™Ð?ÅÀ"ã; wÉaïÕè¢R€Œ$Þ66ŸÃE2©('êÏ|{{=—> £´ØÔBBÎ=\¦ÄdþÚ‹èO8»˜aó6@ŸíÙêžÕ ‚›ú0pã,•3H˜,‰¾i \äãáì¯kõ<ð¿!Sº<ôPö‚¤NI¡þŸa?Úã#L¡:“ mDU¡U&òù;×ij²½0B =>1`KYëŒ ìøÝ٠ȡՖl‹ÙLjpåÐ4m>Çw·tɰ—ƒg F Ò=ƒ—@}¾|E‘ñ³±®5¢ªúÚþ»þkü:èT>þv›qW/4òxÑ‚ÖaE™ ¸ÜŽU…þs·dݺ©%ÿ*ÜùÑôéRNw*¨²`÷¥¦»ó<g]ÏœršeQ"†áÿoÎs¾­ ¾\Ö°Dûm5Mkà…È@(À…H¥¬k^SÝÑÖƒ:ôœ™ëyªÖ4o¼ÞKN|ðÓ7Ç· *Fí/›ö…{@Xú³¬Xg}SuÑVñŽ~¦Áäß\Wät¦T0$W3ù®=§€3„¢%!¶õûÅ÷ÔN¨›þjmòWGS9l4cô|Ýàýºª(Ó“EªÈ%ÙFTŠË&ú»&kY†àƒç G߯yj×DC¢« ÔOÛ…kFé¿ Ç€>£~AH{‹=þ…å‰VƒòpvcR>2 äMeŸI¸á³yªÆcì£ÈYºø0{Ï_v‚µUD{Í‚t-Ƈ½ÝP8ë)üˆRª“Üèÿ_G×!ÏÃÉ߯ƒ"šbh ’aˆŠ¥aš¢‰HHˆ¡)))@ d„”(IR( ܦÿ ýàþDú!Aý’ ©Jª¥Éi)Q2@ ‘Q¥]Já+J´*fX¨†H&*äĆV°‰Ô3LL‹‘}f1]A‡RšÖì8ÃéüSa=ŠÈPÅi©Ly9ÑÎ'ÏGá2Ð $TRÒINF4¤ÂQ,¶Jš‘:!Ÿ7×…ÏéP§²H$„®»²¬χ®W”>ïLœ§Þ´ï“Ãç‚Ú >‚ÀÃÌçîþ‡‡.Äpg°¢>¼”3óàÐnÀDö Ã_gáCüJ‚—ˆ*B*‚‡ñ½K£ 褹¨‚ÝZ–Ü5záÝfQ„!! ¢ b^/áwÅ&¹kÎs(Ü'xbTŽá  I´üýG×åÔiÒ"? ‘Ë€H¤õxL@?Ü ©*ª„î}eÆOÇcòDùºy.ûy<ýlQâT:¡ª÷EÅ? $ÙÏÅ †¾S©èÚŽ2‹ÑºÝôva3¸”`kñ{îëÃfJñ€óèœÞÃE2e ¤(VCã–sYûâÂp¼‰ú³£'£rDô&Çn£óàÜùJ )¥¢Ÿx}ò}Eزc£ïïÏ/Ûà°Ç<ð¾ÁÏ\©,ÀvŒzü|wÉ|>¥(=$9ïÿ7Ï!÷™ø PÈÿhGʪÿ ;^pN¥®Â‡ãüìgðlu÷ä#È͇}ˆ xó³_8FDc†’3Ó»MíHþü‰”ptž@uï‡ ’ÑA'à´4wù©ÚÝ}_¡öQÝ4(u³f³óÜï0+9á¡G·rß°,ÒáPš(ìì†Bv…|†âkîruÓ÷Þýlv.&ÑAàÖ뵪éï¶ýÒ;r›ˆ-£P`lC(þÒ° Ð~Iý¥É¦•¢Ü²¿÷¬]\ZžœökÛe¤¶¾S‡‰.ÉiÈBï94´˜V 7çÓ¤Ü\($SEQ‹8PFDEFN ”ÄÓÜßQ§?×µ lxÂÒ¡m¿Ys‰¦ƒ>â}ŠúC_ëæ±Ú“^¿ççÏs§“ ùüëë6¢3AOÙ€ãf0ý\0•¢LpALa×íë^þp¹0R1”(k¯?ñšÚpžS­xÒž¿NõHÛìЉ©J ‚…,a°Ù.Œ¶¸bTYÁ 6Êöû\æm‹I(ÆßŸðêzJoa<æB}Æ¡ã÷Àç³Ü ˆNÒ\œd¦B”k…\‰ö]‘†ÞøñÅ\8n½=ðs s¦y]qɪ]a`öh,OiL0’qcŽenì{ÑÌ=Ó³·x(q]ÏÏjf©h5a¹ß0oFN2G`Ì3POAÌQxÒdè!¤f#Bã…ÞLYD8ò®èã<`=ìdœsðÿ8É•OC€¸QSäƒëso’vz.É.‰F 5d‘9TÖÿx pè±,>ò:Ô¨ùãœVR>‚“„ÇIˆ™æ ŠjµÝ gnGì* è†ä•©Z˜ˆ}@d´-, (R!ABPùýu´‰`ÚN’YŠ’Å´ç=:“8ôש5ó½ßFç6#îîëŽTw‚øâc‹¼«¹½Y¨ ˜I (¼˜0)RÚQ-¶‚Yj`a!é%’PE>gOn5÷—C68ä;ÇOiÈ‹5£XuB²`ïP˜5>¨«©G`¶´ýsÔÛÌöû_Ý¿ ¶Ù}r ¸xª—©tDÍtü £X R6î’šÅdEÑ”¦dHçÐ@I£½~bPBà+û-9üÕš8ÿ,RaÇ9¥cÄ¡ “ÎøÎFïšà¶á«ãžâ¾ýktH(¤‘^Üe*ëäísõ¿³ƒ[< £…b4©.ÀÜÏÛ üq3¶R•§ìUað„Új.ß»Y;OúÉBí'os’ô#2.»2™ë_Y ì¢|@`¤µCY_ï'‹4¼S^–šw†P=šºfmÔuá+"À2Ôüa˜ ²Ý†ä0ûö'ú,Ð\“ö¨I—m to>µÉƒ;óAQ1ˆ‰dB±IB¿gð†Ór1츄‰Jj¡Keh²,£y%“A—ófe}MýÕö`'##ÎÅ£ùá ¸ÈìöXYF ¡A¥ÖÅ”B¯¹’€¢b2T+¨eúú÷¢iÒƒFJm¥ˆ–Ê¿_÷ÿ)×Ðöyú1óΊ7üÒ ±["!¹Ï{³æOX©ùɃœ˜PÈ…)d’+X%K*I(ÄÙWÒLMÚ ÆY @®à©"ÿ_Ïã')›§ ¤¨°¯ü30 %n7©Ý€i4É-…FA’ÈS(MDÂ0šJ˜˜Ëªp3mÚ(¦ÐÆÒÑ¢㧦i0@£@Á¸ÀË% –¢¨Œ?ƒÇ‰ðYîÐ4ÃüÂÀÆM›ëüî©p«å£Ð ¾A[ƒÎøiú¿2×ô“(г¨ Â ø¹W4ÍMØÈÅ´ ½ì(»ÄÇCÏ]Ë<"œÕ1ºGŠBì¥Wöùû¡æÏçëôFDQŸ±ú‘.F µ†kÞn[Gÿ/?þ{Ãé™zæßÅò"¥­²ŒPö°ÉúÉ¡þÎpÿO‹ IÊ1 £…ˆõKúg=oÛ³®èQœ¼'žm”qÏ6õ£iÊ,oÍá’ê£dIDAwŽúÞ7þÌ€Aæõ?ûˆüÊA@)ñ½k‘$7­èÙn0jMé\´¤.øÔ:q>œ’§,èÂW¡!øéÖôrþ˜o¸a¿ù2•cò̯!AOÇñpQyþ~8ëüdÈBº4¶#¦Å|™ô°áš¸:;;µG…óеjäÇòÇ·ï®O“ßÇÖh3ÑøS‹b]m†ve8hŒÞ)ð›ü³—`†4@kQ}þµõaƒMá>´¨hßÒ 4›–jK麦߷9ú„ <²ü&ÎMIÎRÛm)’—4eq‰–¸×<]:×\’MM0DfÿêÙœ:ã Í¯æ‹ÆQ%¶‘bAC»B‘”“ÿQNPH!jØÆµbÈ~ò ™*Šš€ýfD¦ÍcDJÔ«ZHVª¬eEwCT&ªI‰¢ j˜Œ(3(Ð5l©m±€¡)ã?z—T¬ß€ß\oLãëR©…­ioäi ‡°bÇú(TƒMCF µú|ýÃÄóIÉ5EÈMýNB`suYE²åÐr{E6SmMT$Çó8ÿºÎ¶1{l}¹k¹žÿÊMŠf^º¿ÖçFÄÐm/ÕÈüh “ªhtWn1þg6;lóà¨Da넳 Žn鬚ÜÛ·R«0Hb»‡DÆ’Þ•ªt`TÌDUP´lT¶‰QQŠÈ ƃZyeRjèEDbŒÇG"*±Z•"%µF­ ÖÚÆh,b8Åʨ™‚B©¶ÇE¦DÂ\‚ËGÚiÈ‘ˆ°UH¡Õº¡D 3¦h¡R",‚ƒ¶µ+Z϶Šá»mûC¦«o 2ßåã&ŒÌ…r–&Y‘c0Z+,G]¦À¬… h˜Wåü|ï~ŽÏ$‘ \sÆû>â^ÛjÏ@7Íìk#œË>ªŠ$ ;œÉýŽ˜•4@8Y9†AA>?ÆÕ Ó0P’RLÃ4¥.ÿ½‹¨6@eI¼Æ "ˆZ¤(¥ÉÀ ¤UX‚ˆ 9OéÌIF”È Š*¢EÚ¨Œõíà…HµTØuÅ&9θÕ)’ƒ˜0ª—Ÿ¾Ï´s›“¯Ä`½–îïµ ™Á*Fª²ZóÏÖûý)ßã~ý`onIñÁæ}cú„}›¸ËNn@ÉDÕ$Ø>£"£³ÊX‡ŠXr‹ È"ÆŒáF701%ZBu]䘕„ºýÖAç' Q %6B"(¾évzC¬472b\C~[½ZV[ÑoÀúÛ¹=ô&ˆ‰#fÒŒÆ'‘ƒT×ì|¤‚R™áS{‘ñ‚‚Rd;áêj¨ƒXÓª@Ô²ÊVabZ`pªÞƒ%5N!˜KD”,Ï ìh¡@5Ä¢VP¥æ0ÁƸ]oª2 Wœ2+ã9™u©ª™ÁÑÐþ;¬!½ÖUÛBU©‘ÏçÅY"$ed ü qÇÇÙ¶ì§¡z͘ä?Ÿ•Ê$úfq ‰ä/{pDðÏ£¾c§$?:ã!®n Û†IF(@Rš+Ç›w›Èk.W¦šÃP'%¶pV)¤IøB©ÓꃹêÎ<ÕÇ„£¥Ñ,n t bÒÛYDšB”84dÑu8~fù朂)˜Y)8ÎuM7: :Ëh&ªŒ¡"¤”c3+nÿÍP:^å €çÊQ„Üã<¥‘Ì÷,‘Œ-0¨·  bvPEähÈЋM¶Ï›NÆ„7!eUVo㢜p\IøÇë÷yìknçtxÙ…D5IQCTL°P15IL40³HRU$‡ v¤ J>ìe(â—L ¤=ÏRïIPè¼@=õ:Çuà9dù<…; HJ"%£)àßtˆ=b$²:a[#¨<^ 7¡ÛQV@‘R·7Ú‚ª/›ÆŸ2)Çi³ ²Ä(¢(Š ¡¤™ªˆ(f©‚ ‰(YR†•¢ ˆªŠ’h(©Š ¥J¥bjJŠ)J‚„¡L€2c> PÆ"i_Ä!”MPR3ÆJR”¡@P ”´T,AØ'¦Š¾aÍãaÊŽŸTð!DÉ)ƒ–É:JXÝ‘ŽYH;© ëi)»~Œl º Y>JHqhÚÞ° •‚¨Ú«¬ªbn%»J"Ž´fEPÝ¿¶¤ÒE”Û.UA37LáZj»±v¥™"dÄœ“F©¹Xä{ÚŒ (±†öa0„–KbP # š”“\›ŸW5`›ÊHèÕ&fÝ›ÍèÁɃˆ"–À£X@RE!2à i·­jÙ"”RH(ÂA+9üóû;¨ú¥j¨Þ¬.ÉØ#-²1±EhQŒ¨Ú‰ J[6g­4Çþ÷Ãâ3•·÷{öÇlqë¬ãëôAIÔ P°JQÔ¨†³õØs´ þqhj&ÑwGû‰q_d Æ×YtS1RiÑêèhé7f¦°!ŠkPÔ¹éE{á0Íúg<´9òœµ˜S~Þ·›‡†’ZÙõÍ1Ö¿žÉÏVT…m%©mmÁ 0­$Yká„ÈmÐ` S¹LÖBÆE2Ê ¬C“V*X?ã4¹ 1…eš@Ã#™p’ÉT Á¡ÿ]„Ň<ø¶¶N?›^ç&hóòk‚©—vs–ïf„ê¸Àx€úüc¹?ÄõP•]d-$Á LDJņ.$DÃU M5QÁ1LS534-@ÀDÒLDJD4CA%KRP IHÐ1 â J€b¥€¤b©ˆ”" ˜¥¤)™ˆ†™ f*Š A & ‚hª‘¢f–¢‚€€¤ˆ‰?PäÔ"ä#E#@©CªÑ@4H¥ HPĉIAC@´ÏÉž´(¡ˆÔáëŸ ù¦Q¸ÏÉF7=²q& ¤ä4n®ÔqË¿.9 8Z÷,™i( Úœlè<ìæ#ïûÂã¸) "(¥Ê5£gS¶S­nÍaJž<Ê9¤¿ZMFŒzá FªHó(Ä)J@¥«'ÃÐ㽸e„vݾ߯S³žˆT²Ì’„Âÿ †º·Ø{²‡ˆ*ª’ØQeÓYå<ÛÆ¯öUQ@P œÒÈ01¼}|ež©SV‰bBŒP5õ/Œ ï“™zmöo›¿}v€Œ••¬Y+Øtw‘ %ÁÄ)mù ²Ž™ùCá……abE¢Ÿò¸tæ$¢›ÌG$S ÈL…Ê•‰úÅÔ¾!27)™”Ð9eY!C@a U’‚dQqNš08!‰ E¦¥ôy,¼v¶¶ù¯á±¥þQž8Ëɶ^f¾´¸„ì!X¼K;¡Ìì‘@OR ˆ$Å Á$EQ üC‚…ó ø‡†;7ÕÇ$ij:¿³Ð2laDôaŽ(—ä0¸²RóLöY§Ä?£vUÔDÐ*ÆyHŒQ™D,9N°ìL ã(œ%ÂÄȯHÿ¦ñþ üøþÆ÷ýüäý{†‹Ô<—ÐËíM|ý1~1QH2F~zýÛƒrªG­úñüÒôïTgâÔ¢EaŸ¬£ ÝnŒð;´^.0MÒ)ä ’„ÍØFÁÚ¯R'ø˜¤‚¢€„wjˆ(,‚5’ÄDX ¦˜¦J¡ÌÆ’š"˜¤ªˆH‰˜$†) ˆ¦’¢ˆ$¡(i‚ª`ª¢–Ô”B¤PXŠŒ@hÒ(ËeZʤEž­Œ*!IIÅE–”QQ Á¨ † ¨¤Š˜(d‚‰ª&ˆ ’‚ŠšˆÈĤiBŠ‚¨¢f*©*&†©™(ˆ¢™ª‚‰¤¢†h() ""*2L’jH(–b– 22¦€ ¦˜„¨š˜IŠZ©¤¨¢ Ššsª!¢FRB(ª*"ˆˆ3(¨¨¦ ¢s šJ(%€¨È1¢ ©¦JJ˜š  )"–¢¤&(šˆ™˜ˆ©h¢(̨ˆ(„¥" ̘‚ ¦*h22 h¡ˆˆbJ–iŠh "¢’Š¢(ˆišT(b¦ h¢Ì #"†‚¢" (¤ jd¤ÌÂjy”ÍYSQT%$ES$•1ATIQPQ–EPA-TEJ-”%$DÕE50ÄM‘­ý§*Z¨Š* ªª’‰ŠÔPQdQDAxYo¬ãýk‰ôßóóNô-²¢•‚ÊŸ›b1?Éãê½}u%ânz¥¾îapCÚj0ƒ ëXwg÷Ff1wîìÁ\ïËS¢Ðuœo`†Ç4hãrRñ ÜÉñàhߊÀœ…Ô…E‹ ¥)[L¡r#sÃܵFßEM“ò"œ"¬^iI”¡Y,Pb¶Â[z2Å4¢O,8IÃÄl»¸¾l3mЦí1 ê¶¡£WL·MåTЖɦ*г »­°4…u…¨µTW0¨äÓšÔ' #h°†[[UBm€¥ETC&ýÛ h·(ceÊRVV ªÓckr¤‹Y"©AÍæ…©©š¦ 1ƒM!šn­m-3.e—\T¨ôÜJ ¨¯Ãyxa‰Â‰,Øåª®% ®\´´n,&&snkE4Q®õ›]8ój,É©…s Ëœ;ÑMîó½M%87‚¦é·h-´¶ë2åDbÇMBä@еd LšR6Ý’hªKI’Ul©"¬Fq¬°Vl¨Ö­Ê%Ê\G2àW-›Š’ªÇI1^u\l†Ù2¹B¤+Ž©GI& (±M\ËIK‚;‚3ÆQVBÄAÕ̵]æ8Mj˜££nA‘ˆ*"ZVŠ”´´¥®írˆ‚¹‘¡‘)s…¥Cª()Ê( 5”Ú2nÛ`¥eâ†Ë­"ÉFꚺBLÑn„,˜eˆ:jŽ‹)bM £h\ªš(Õ–¬¶–erÉ®ae ¤ÌhÒ¢,o Œ&‘çF@-×f—[³„I­Fq]óÅ&Í´R©‡3 ÈrÊó¾2ŒD%ðYÝÒ#Œ¸«ø(²ò~håÒRžò_9uÑQÛ&º#мàëKíH•a†“¡ŒÑ·vq;eSˆn¨2G¬UÀŽ jµv¨Ì°¨X2¨X¡@‘M°Œ¸ÊRÝÃWüÃQÞól33%¢ÒVÎ2ᬼnn®é´-»K¬Ù™X[QQPc§r”Äl•„›tƒšÂÆ¡Ycu™ŒÞ.îv3Y¸†î†¬46ë&µ¢ä´8îÂ$7{xÓUâØ×‘fË[.C'ÀÔ‡lÎr‡IÏ&…6ip¦´i©«FІ5 ”BÁn…2"ãO–¢Šãr6m‹0Ðní%M5LhW1Ñ ÀËe`iLwøÞh7L2"Û4’ÆÖœ&õLç1a¦]Sy`‹¢…`(VJ’VEÒBS}ñ¾üã]¹™s$IzjÂŽÈ,7ÖôoƒyLT*®Ú—VÑf2 –m†íÛtÙžh¤,º§v¢ ÊÊ-Ì =ï—\.îÞ3yãh4.¤‚*•L‘1bÀDA•ZªËl%@L ÙZš  £«‰Q œ³–îûŽŽ£êSŸ–hšñœq]N»¿ws''LX¢VÞù4f±BtWc¸¢À{FùÍ2ö_YÂ.fjç ~( ‰u”„­ºñ*?Û•À¸ P=9µàµ‹æ4jM#¥¡ÂkѾ'Âù?Ò>º¶òlð¹IߊfŽep¢,Ä2R* i¥<ñ31ÆðÂ"bJ¢ƒTØ’†/æZ ý?ÛÜœ…Fí*–W©ß° x4ÂÄæ˜c¤éýÉðäcq)H0RHpðý!ŽM`jlØ<êÔÔ^Kÿz8Û _°²U—¼ä2°áåSpä!9>6y¼3E;™­0°“4Êkå’ã`ÚªHU3½£´jH¼dOÙ5Á0ïê/ÍØ[ã»ø6ÎÏÂÒ’’T7ËSF˜lÙ\þÔ_ÊBàº`&BÓyäÆÚò€e¦·L~ÓŽJ'J(~ÚE†z ñ]Çqá%ל9‘&ů³D˜ã†ÿ{ÿtl…œ.öôÆ#ûWBDFêˆ92SSÝÖë×QÔÔ¸ePÔS×=ñ½ÝÝ5Ðk¯h¬ïtN©©$œŔσ—f_ï.²èß[<ÓeJ«ïÖýpUhŽ&gc`0©Ä¥-øÖµ ªÝµ¢‡å+·¹¤àÍú°Ã¾åç €Ø&ÐN8©ŒA``C¥\Ð2†…ƒB U`!ãÁ(\@À„¶iž9ß7Þt'h÷9±j3²Ðœe*í±¬ñ»ç/î•>ìÎfJ‹Q‘ÄdJ£fíÇq[Ç$Ñ)[Ѧtx„†Ã¢±yË”RÔ3ÀK膋ƒxƆ´ÎTçp’ÖÇ©ÙÉ ÷Nï- 4e¥ 6ê˜L–7›u©˜ ª8 ´•JZÁA¯\·ÃlAá>˜j²æ•V‹2º¹ÁO_ë›ýÿ߂ͫßTóç•™9zÞ°+Qÿ‘±pÕ]³0xïOéØÎzʤÒCÛ¤åÒX‡Á©îÂ_ù·¯f²¾{»UE‘ÿ³7ò‡@½UÙrs”pbNЯÆ/†Ne%ޏ¾-',åjœٖ’ Y¦4לH”&û`#B’…›|Z~MzÖkã¦)Œ=êŸã+<3O³U,X ŒU©×ÂêjšKÞhÞ÷Ÿ’*òÔ‹X!‰‰*-° Òꄈ•%Í©kmëé¯t¦ÙÅg%EÞΆ0Z•Š2E?fÍxßo“*å ®‰)eM2ÉÐúQf©ŠPvšŠŽ¸Q[Î&½‹rFD¶ã€½EpoÐèa>šñBòWGZù}"<é"ÉÌd=óŽÊHÝqßbo}®Q6>±¦kM3JFô•ìeÀHÐMå l0CâÖ±7VÑVé¼ËeTA0B€¥U°(˜Þn7Ržî·‹ûüsÛk󙿿£]±iW$’‚È 4iÉ1M€Ï&ÜÒŸ>S´3އƒ'=0zRô“Ex>#epˆpx㹨Åö îl@ÜÎ!T…6Ÿò­•LÚ¿¯:õŠÃé»xz0ðqžéû8ÏÞ/XfɃ"›à>KÔ°<{œAðMíŒÇëvóöv'0Ìç†H–M0ÁÉR,¼¦Èúq 3L<×›‰’;SdôS˜ÖRoÙÍô±¦Ï±Õq¼C9#Uœá¥<‰È™.m£ž-.U‹>mÐ.0pÄ{4u…î"» 2™¿òˈc¥ö”9”Ê…UFñD!Èñùo㣠DØg¸79 1VRjÒFž ™2 )ÿ?ZÜÇÂŒvSÂ4ñ=¢øf»”xù˜tÊ¿H¦ì¢ zÔ ùô®R<.‡\[GmÔìÆÂ«“’S³rɶD_\Ý•ñ=Çí ÀG <µx§N.]ŠyχÎ8g}vÞ›wy›PØsÂa§ÝÀ³\¬FqiÕ.-xs'_»ãBe6æ 'OÛ/ÎJØÄr <Ä:ç`2’ ‡l >’ÐßtÆM¿¶L\P,·”Åà}§N'¤ù».0DƒRú)„¿¤ Qø¿¦ñ”TÒ2Àn²hM!¼áÃ)C-oí[É wbçi’R¡Wabˆž¯˜~¥?dqŸ¨öS!°³Õ­X›`š=™'ìöÚ¦<2) îû¥$˜àÉ~gN¼îCBÄÓ¢åãÞH()¦I,:‡»ejL€bÍRì´Íß«xvwÁõ‡{6ptlÞ]®Õ¡m>“Z§¡!Ø,:}\G]fpšÖ±"ŸY‡¶f3¤èâáç0Û>FsÕ"òWGã9úÀ3J*‡‘PìÊÂ8`;¥>fƒ ¸aÊ—r¨wTFÊ.Bó#Ò@ß+‹Ÿa’rˆ +þ/}£­„ªQ·‘§EÙqJî•+¸`ù 2·dÎ8îx'P »u0y [œ‘í®® S•;BJKgÚh¬Êª$(ë¶HƒŒ†§|ü¦áD(Ua€šˆß¨¬Ô¬qNâ|šâƒ±4æ!Ð P鮀¬ Š@Ç9zº§ÍªMZ¯Sî­šk­‡`ú™ØÝ¢=¶GÀ:IŒ xõ»­¿N!–ð2·« La{¤œe—jŠ“ñòÇ‹Nv2Œ"˜÷½á¤wUaÓ3)¤Úib+1c îÊæ¬ZƒqLy§ô츎ÛRä€+ °Á\\N¸¾kHm·ßF¦•—å…2Éãñ,9v0úvœ!Úe=°:¡íé©1¶Ã f”ChMÿ¯=è¼QcÝ%“VIÖ]Xb{dòž5E“Êø» RgKÖŒ‹&)®úÔY´7„ø4=ÈâNaæmÎ!A¸Âc³SçuVg@Þ8q)§ÒÙé“”ï»`¾H(ƒrœ˜NðÄ ÏÒOhm ,`Q3»¡ÒbCOÒKÝ" éå†2^.ùñpå¤Û9T6›ïyÖÊêï(r0ÝJáóšÖ‚ÉÒ†ÉìØ‡)Îu„QqÜD·ÍƒÌ£%óš4)ГÂO(âÔ8Q‡‘Ãz¦kÞv›ä³oi×E6œD9@Öo$YÃùt<ú»Nžéñ "7ÚT9g¿%:o+~¹«¦|aÓÀŸ3ÅÎX°í §ZðÌ8y·ë¼Àð“±LùM&wã vo\&˜mœ(…¹tAJ£q8sפœƒh)E ¢yaθݾ6píªÅŠB"xîÈb V¶‚P*¢²ÙF¥cÅ*,N¯lª§mбqÃ3åóž²o( [PBÑ‘œµ+* WÉæÔÛ5Î\ᕨQõK<õxMH‚(•—‚ƒ8ÞÎÄ«âÌÏÝ»³¨ëÆsOÜÛz)€&W{€L(‡Î÷ŠÎÝ¡çÅ<¦1¦Ñ „\LŒnì·~½Ø?ëIƒ… ‘!Düa¨l'KiP¡~³"úgƤ1*-âËÃ"†r²U~ùÞ)æ%Gyˆ6}2€æ;íêntÁêÙÇZ ÅL—äuã‹yÓc¯ç¢¶É°Fïôù¯Œ°:9=\5éWÀ'zœý'``ä·Ì…eUBè»X]à_žS4µ×‰U5 c†-§JYÈ‘øõIUÅ«+b&ƒìe3æ«¡¡`ö™¾?#+ÜêÖ­êǰ±àb3¯ïÝÈœô> ŽZûçL*’ë¹…B°>îîfùÔyA³££GS×É‚ç«br¯rü«Ü£ ½WœÔÃêu¯¼Ã mÉQVºdA8iÁ?ß‘I1½w_{K]q*O!>¾Ýˆ ›¿¾ÐÅSªã"ÝŠÆ.à|ñXæqN•Êß›ºptýÌIeVÏjïÆ¼{Ìñ¬¬ag²-v é È…¸!i-Ó$Ì,ÌsóîOæí®¡X‰õ(t„G F¾Àµ7ã]´ûËš½& hΆM*Y¬õ./eϹo¿™i>ð0Þ•wàúíÊ$äS @T†`  Ë?Ê|c jøq€mE»u–ëTÔD‚F~ÕÁ‚J‘|.Ò –Ñì„jˆíW¸Œó>2üsg}l/#7Ë(#Á J˜‡ŸvÐÛv¸1ŠA¢0ŠB¿™!lµvQ€ ¥eu'Â0ë•“e›íØÃþF?OšÔƒÆ}´ÓÉöÅ|eþ&a,lЕ‚ßµx+ôq›Y2Tö›…ÇM£ ú®ÓÅgý~×ð"ìøö!<ú‰ªxd!½3ø=i¿¬4ãPáî%àÝ¿Íe¿¶ûº¯1›~À¦ùåO÷ß¿§gããŠïøÛÅöÄ ·d+Õn-J¹†rÝZ΢_T„QðËkI–[0áZâ^6>(¢‡£ql¸o+xTÞwéí¹­;S´ãè,¶Ø$<àÔa‰ÎvÁgÍ?ëóèÁÕo4\™äˆ´Aø>\“´ÙÂð—+ÊX•yZóø<¯L+óǤ1Œ÷N3´˜ùŸ‘ú}Óx>P*å/v¦ühûŠ0 á~p[W#¤|@¤_Ÿb|ŠÕ3áPù@Qû#’$z¡~ÓC/°Û"Ÿ˜—~-þ.õÅ×ãhdAHȃD~%ƒI¥A⽬†"¿0"û­Åì. õp9ãc+9Eø£e4ýcZ^K’Ec¸°°‚GrÂÙS–dbE`¬`amÓ·d=΢°#YÒ}Ó8!M‚uÈ«A—"7¨@4SÂå(þ¯EËðÄÎŽªÔ9WM–C „H,dÚ1QÖ™PÒ!ñ~µ÷ e……ç>¬†Ån@ó*®£Œ¹Ý†=ù(ĨO‡žæ°Ê$(¸Ñ%À"þíw¤ô«HøEUgï’… “B@)]âŽæ©¼¡Ûºù´Î3¾×¶º$ev‡‹úOužMdó*è da“ƒ ¥6Xש¹Þg4“–»»vKgM9З>=(gì·È]qIv¯&.®ÇÖŽsñÙßÅuAš2&¾;62¼ì7*~qàzSXà÷pHmŒyâÆjê mU(¶_]%ÁC`öºæF4°:ÓÀ0 íhÆ®%P+kÅËtÇô«ÕÊmB}ºó ¹_kïsOù­<éhùµ,ÿõ â¾icWìÜ’ˆ¸€Å6T—Ãù”Hùµà.*Ddæ  "¡¾)º}ν™:Ï¿ªï APï:,¾g%ú¼ã=xG'Éñ^ï\gæÍwÉPo~÷xÍ ·>›«»}¥tß~ü8Ÿž?ÏÒN?ÈSIõjyíÎ|gøCÁýnÕK xT žiÌV½ÉýIø¿2Ã{I«,(ÆT²—â º @ö…Ðó ÖÐ$nàl/bÉ¡ =4|ì1xðñC°z#¤°àéL,€sɇFÉ·ºìa½U`­O“ªý°ˆ@V'Á¤‰K€;Ï¥ðW÷€tÿ õa”!‡zÂÐäa€Çäíäçý<ÇÃü¢’\T%ùµŸ ªûü£ÙÓ˜‡™_¯*&Mµãcò|p§3%TTAÅ'5£ÒLnrÃD©®~i–_5^NëZéürœrRð˜Ü²Œ \S±Õd1±Zþ‚`D¢dý"qÄæÏsÓn=¾æ!9>)í׬Ýi%ʤ+![þ™ 1p¡‚Pl"‚…`fxI¤†$Ý 2I=3[J¨b93!o1jžd%LΣAÌ(a^<6¨C-ªh›#MÍfP°ï|ÞäCxul÷\Å ‚0r+gI´7b.KKR¿ˆ F'û¶¢"ƒ„›d !0£êsæÿ£3õšP2€kö|Ÿ®º>8v¾O“õ¬®ìŸ·T^Q3ÖyøH(b¬#2®Nãäð7 Â\`üõ<"¬î!'o(ÁN)ÞX\ìE§î«:@Ð@~~ü—šzy8ŽÈx9òâ/w¡K‹aÂ!­°=àv|?¾·ß/or¯Ã Ä€QC@R{€>"HòòŸ´öähý&S××ï*C­Ð×G:г§ûa1¦®Ûè~…¼EFÆ¿</`wAñ¼ì祃^ 09ŸGmñÐ’IÄÓÌÿ7ž^ùŒŽ/´… 58Ø*µ¬þiY¦•×âÁº¡%(—‚ÂL-‰d¢ƒ$4åæ<ï+-3+iÓ¡œËw ­¸:§Ââ2 .¼‡Ø´NÏ1úãäé¤Cf/ÌD{­ó È›'Á}Á¥SM‡’O™²N)x –$qH@áÆ¥nRb¹æIAúP¼F*p@‘ÄŸé ¨?&@«J=@ìŽ2ä¥rÄÅÓb@¸ÓðŠ´ ;hÃm"ÉÏf®UJíàÄÀmãCngˆ>1…?qDâypGÅ¡Pò¤××£ugÞþ¾ª1è²0]`ÂkÑèÙãDHfªMâ`£±zÏ®±õ ŸˆÂÖBižØ–T…˜DñÜ0¸"™ –0?T›õñjÑ»ZUPÕS'ÃçÁÒ…’ t2²]ÑØ™Iª$<øÌC—èì‡};OG£ßp—fÑ"í?ç_Èro>Íöñ ¯úƺš¢4òz¼2ÑN-ç_ÃÝGC_EO†FN ¢—dÎG®ÃƒO³_èü~>ž ©ß\Â?H©BÇùEB¥B=‘v '±¤|i½¾ldÄð¼~+ó7ň[!Soç‚Ì PR1ÅK ùôscÄŸ×Ö y¡ôÜû˜…êe.~ñÊ…ðàf€güþùÅ­mhä(ö‚|’ÁÃ2˯Ïè(¶Þøù»J×¼dÁPöw†z0PëÍ+Ú˜cj_|6 h8”¤¤§î\ªû•ùÃ×üo®xGóä¡y²òb Œ¤ ¹z»#-…šH¹¢îÍàæãœ+/9™ÍÀþ­ïy‡6v¸d:Ïí£&n•ÈPPXâªL¨!?Ô‹Nz1;(6†s66Åcʱ¢-U±ÞƒõÆU_ùFH}<ñÇ„_‰6Æð>@÷ŽaKq÷—žêÈhýOðgï¿‚©+!!ÞQgCXÄ+}‰ÁÔgî¾é)$*„̦„ Ø ö¨c£ˆ;ËÑ€>8‚›¶@~ì’É8ã`›ÖC¸qЈl—°<Ÿïëüï1â}nñôXô¢wPÖzù8üm&£YÚÿÙÅ™ïüY ù€ûÑøpI¯>Œ¥òíSÜAŠhH0 t‡„?­?¬»´ÒÄcÃNéë³-Lxø¾*³°lñ5Ì"x;*»þGñÿcÏÌãßSç6þyæ>ÈÑ=íŒÂè³?"ÃÒW4=²$A×A²©¦x?âð|væªIÉFÜ¥Í~0`¾Iz¯ól0a1z´Z…E¨_/cãØœszØ?Õh{"zîªötÄ"ÑýXÌ‹ïf!B´ !0޼†h¹¡Û"WWÓû$üÊ$Ûì=Ú¬šrå­Áø‡\X}¼8sJ™ÞDL-—ë_ÞiÄ…÷ÏŒÍrŸ«ÔSÕ‘…z”Í \¬°—á ‚éýgI€ìu€FÒ_R«FÎÅŠ2ðfz÷¨då+[»ÞWæ°Çž Šž>8du‰05s§¢¤¢ Þñ¬B)@ OÔËëŽ=#;|µoRž j‚ÌÿL)Ì1¢ÂëäçJæÄbå`ÎUi1ñW7NÅÙh—Š ÕéÏ)Q¯ZA‘ïÏLMré2¸Ö„r5‡AaÕ#¡ ®,&þPaŒ`—üÄ"B!=mmÅ_uüùüßà ¾˜Pópþª²øôú6øVè%œ;÷ž×NŽ%?GARqäüy óïU=lÄöö©8[;™ðÉ»Hl÷2<{ HI‰!QAòH½þ£°ƒê½Î>Mòb‡d; :\å°îyýBŽÇl¥,‚EÄ•mw ž'ìå6 ¹òüü©ºø|þ‘ HFŽ|V߃ѶµÓÃ㯀 ÿ@B7Ÿñ žJÛ¶a gô'¾&˜G¯Fûð‚w5ûåP|Ž=^ÿ³È<“H}ÐÔCXŽŠDÏr“É:.ã¹£QZˆG 9 Èš•ÞbÝ&:µ ¡QÓÍ€ˆñ1†~x€”¨<úâ×xXÛƒNU—øGËäø×z,Žÿà`_½å€û?{—pÊ…”ý0çÆ1$1ªY¥Ì°LÁk-™L†ZêÂ.0X¨Šsßs6°ÔV‹/o”ãp2Jª XÍô ?çìEU §sPÌ¡ü¢S³ÇÄþM1>É9/:“÷üÂþD® IÁlÛ©3Œ2n•"ì3ÜQ·£¢I5ØÛ‰²zP7  E7p†võó ihS kößrýA”Ñ›À=üà=¦*`†Êw9B'×!ÍêÊó>³ž—3Íd俎„ø6††jê¤è¡¦ ¹7@Ø*BZ-Þ½Þ®ò‡Ÿ¢ëJ)ì@ð'í¸Ç×ãc°zÄ|2|{° m¢„*ª£È®{Âаãq9ƒÑã^rw€Šgzò€ø¡ÒþuþËÂ~TMP]ªC8}q” |­²äì…·71P¢JwÏÑðRÒ Ð,G… ùï<õlÁïJÀG~ƒRá‚¢ÂÓE9ô»Á| ÞòÉ4†¨:|•[4)Œ(v•ŽG/ž,aP¶6xjÇk—»­ÝnsR†ºði hœ]›6,…´›4Zø§ŠøÊ¨ð¬Æ˜cèö{Ûä8V`6@à(Þ8³}¹)4Z¢ fq{|òCq¾ñÒUT!cÆÅ¹L᳆¬$:ÏYÇ´;ë‹@_?½ ‡‡xúÀ®êÉï[Q*Å„(E(¥×úWg@¨{‰Eí0DJùÝûˆU_bÀq˜¡¤€Yü Ílï_ ¤õâÉþýκ>Ã…1W«²;ˆŒ(Ñ»l^|ôô02£çÉì±³£pR/h85¯d"¤†d™vK|g‘FˆÙÁI2èäk*–òóì)gVÙGÊ@(©uAçˆ À?{õ©aY޽kÄ(:0`î”îwŠ䨼UöÃ"a¡ÃCçGÍn¶eÈl@ŽjfÆÛXÁñʲU)4X ² @«z#qÆÜ,ˆâ±Âw«?‚fÓyúÉ^=^@‘.›A‘AVŠDD QH‘™d„Eˆ fð½ÏQXï6Aß\‡÷òl0g*Eû+ªõ˜x7ÉÀh0 < hÈ€S@&–@£±C·žM€ö,«®à$@DA#ì;ÆVŒeÓ›r4 ñ>S¾ |¹­Ø¯]ì ²v,:曹O$„áÒÂêk;-¡ñ©ƒPnoœ>PÞ.ÀcKœÐ (¨~ ÂþdÜŸ›fÿ¾àJ6+æxÜÏ%1@Çmû¶oÅI½ž´óë^1¥<}Ò'" l@úOÖ묵ԧ™hedÄÙÅí“€ pÄ 0£Dìkˆ;õz,m°`(¦½ÂY7 ;3l¬1íÆ7{ ̤IS!04ÕQ#Tñ!SSÍÅ–PAÆ;ÒbQ1E”5TD…T†cƒY„ Û‘ƒVDRÚ@U·b0؃hØþ5¨?Û)Ûì”eêËx€ù; ¸a×÷'—u=¬#£øë’ÓÜìhØPèé„-Dƒ{ Ô^KðR&ŧæ‹>· mÂæì" Ë!ÕEH¦$ RϱU㩯ºœ?ÊÝá®àa~•g·&.q  :çâ^;Âñ" ÜŸ›¡íuÚí½œQ !‚D°G *B„Bi}qs¡‰ÑÓ žÆxaЊc3E×pto–p J ¿¥’u”PôcZÆݤ¥;ÒRY8¥ªh¸!Üvq0Èd'¸†ræ2H2ôC* é-u™LÕ÷<Õ]½°ìkÆ»ÊÄË k+‡¤£1¯<^˜.-2þbd"0§ì¾t‚î!ÍnyãD»­oÖHX4à­¸Û}æRÇ`LnV¡ôG$.á;Ïh H 7 B¹ m2dëLâêÏ>w‰+ɱ×p)*x÷EÞ®D8öÑ”†àÍ™­¬¸`Þâ9á ‘؉!­È8Æâ€~»úØH<ËŒ+ ܸØ™`Eúk«F ´¿’Z¨;š ÂKȪ «vƈoEw¨ryÑ!­Í±wvôDþ%4TÕ˜8,NÍ C‰çÞº5üÉ<À0‹³ÐIA3 3$4 š×SÒ¨²ŒRÒâ÷zéuà<¸¤Sr(&PѾågéÛ‰yfÚÕ´F"ÄÀd¹ww{G}HßÏU×IU6ùÏχàüÈjÍüÛáàùûôYi8üÓë˜~^ž‘!üXsºUŒIø¶!Õ¥k+Mµõºñy¢ò¯äNY:oî„ìùgõ`‡„|—Õ([=–Œ|¡M!(—šÖ½[5ÑäñYv yå\| ^ȘtâYH#аFa’wŽõy(Q7ߌÓ0dÛ'/lÐÓP4Æ '6ŠœÁ¼Ö¬)Žüí}qM Ô¬å ÝQs» §V†æ¦úë ñÔŸ™Ÿã,ʴdzÊyzfÓÚ”‡{§\PcFbbV&ÓLé6!¾ìœzë—ÞÉ倠%aR0†Òó¯ž:Ïx‹À¼˜j 3«$í“–q M¯Îm¸!Þ#pðjë¯1Ý+#lÓòž\déž’mßůVpÓ›äE6“‘˜ö?‡(}‰·“—îÓžø5!ä5ÞíJ…ó”È¢Fü%ˆwOÆÆ é-÷'>»÷ñ¾J™ÈózH~ æN`9œAJˆ=Ns·.>6ßh4òÝÎQÚ¿Cóøîr8|DO©( -1îun2%≠õF.a,gzÛσ%ö?+~&å[ý¡í4ú ß’bsü>¼e2xÝ[A2äðžC1‘£ ÛVC'Óà) §mjö¯^½=òÑ5‰\n½\üx¾ÊΕ>ñ¹ß[Ø&ۘдê Z™ ˆ³{”Bel¦ÿÌf@Gñû‹+±ñ³UYòsñ¨íö”‡~3óñ¯g~Ç+T/612@C2 L¥WRJÄ`Ê.T¥!M,•R QQd ¨H²b!Ž5 ´ Q¢ÌÆ5ЏJ"ᆯî| x|nv7VEŠ¡Ø€QQ‘„Úb˜ Œð2°\Hð )6çö°®«áÜÂvï\‘C—Nlâ)'3ù¶'Ò]L0Ö²C ÜCùÒÿ;ÞÇÓNˆRÇXñ À÷?ZÕ¯˜?E…\*CéáîO7‹ù×Ós‰ÑyÀç”UdIÅ.©&ðÜr]7HZK¡ûPù¤HõCÑ\\œ®²ànµºJuuÇ>¢$:E1™øühδëwÃzast‡Î– °1Ûtq¥ÃzÏ­*¤¯xà;±¨ÖΚõ±ß}O©¼É¿ ¼‰ß©×t47›A† ÆGv¿l•?P î”Ĩ&¾ãæq }ô Û÷·ÈɪPý=ø¦¾èÞ x¡Ã]5áÀvÌÍ}È~M?¿£©ÜAHxֆН-bæ°°£êùÚ©ØÐ!^|}žá9÷/jQm¿£É°šÞûàКº®øÑK¬üEXÿ¡%EfX_Rîw£ùM6êµ’Va¬’®‚“î‹Íb™þ]jµ³Å•ÝЯ¦Þ6ï@ýãlòj¥ý}Ÿ}.ïËääŽßÜßÓå­¨¯º*'ÉÛ¨_Då–ºMU$ÿ>ñØé9’n¯xñs›x&Â…%æóãN]Úx‚jà©Çhã…Ç Ÿ<îBÞÞÚh¤ ‡¢ ›þglpÀñùÇå¦ïT‡ÄQ!IeA‚.-õ¹À.IFºÃä¦Q‰¥TŠþRÿ]a ‰fz¹Ð˽zi¦E Iß(î—êË­dâë-â´É;œ‰¡ƒõ"¡¬_@d1%TKUPÕ®¨ýs¨y±Ì ë¸̇?¸£V´žßnœ«þ±lf0âaBT4&:`¥F0Dµ¥á(¬vÀ¡ÍÅCñ5’Ãmp`)Ë8ÕŸ7^™@¨ªDÕœ ¡\Jé¨v„å„’°4 ,*mÅt‰Õ‚åά,f‘ «@E ÂêXeÙ„…N„4À1’¢…NTˆÌu…Ä‚ÊðÀÈD$Õ²tæ^QÁ6Àç5’:”’ù¶ÍT‹ ³ø3¯!8DöÖÏrr½ÀÅÚö-É«R2Wˆ á_³ãfôoQ=>Còe-/£ûÏ.ÉÖØßøHVAUWÏȦ@U$A.*ç²f¨÷…ðH*@¡æCP)´ â¨3 ÿ5ƒm¸é  íE ÈŸÎ÷œÞïY‡¢; NP>$€T]â)˜ª\])t‚Åh "râˆæ@4Ú2í‚§Äq"R©J”ƒ¹ò® !Ñþ{ GÓ?íÜ,å MºA` È”Ò´ B”” KHÒ‚ŠÚrÈ}$sxð™žÿçáþ*ò7ÿXW$ ) VŠÀ­5e)ÜÂPR&KX!Ÿï¯î[×Ô †r‰Hôª˜ "…)(š"‹–WOúþi‚£¡b@`HU?¶åF¤ªZ %L$Y’&„ªZR¨J¨‘Šh &‚ƒÌáEZÁ „¡hT¤€,’*Z–­Gþa3±?Çå‚’"²üÙ¬Çôx”¡N`.Òª†<ꦀ¯ôYù‚iM,6ñ¥ÌB4ŠR+J4¨zŒ¢EZJVJiE¡‘(J@(€)@¦š?˜S! Q ¡)b) ¡P (¥¤‘ˆF…¡ZZB–’‡ç r“èŸ?¿&¼Ÿm») "‹ÐRÜÏù²‹“ ›¯a{q‡ÌDø` ¢ÂP€R¨ ÐTIÿN*d6äAÉDb* *îÿ·óØÛÇoûq®ÜdÉ1—Ta™k À˜K ï_HY¾s ìÄ  nP—‹˜]:Á%ÂÌK€Þª”k#üÒq º„É´ @ –amhJdC `[¤ž‰N-„4dn¼ÿ¶·~Uã<öO‰AS=eȲd‰$2>uþëÞÿÏ“8ŠÀôXØ( üغô3ˆF0´¸x=‚ëbðÖÉHü+ºË@›í6ñœ&M``…Â`Éî«ÁÜNŽ¡ƒ†÷M×®ç¶7Í£s0‚™Á´v@ ËÊÔÁV£TÔÐ?*‘1RƒK1䣇Ԣ#ê…<ç1` „!ÒÕo/¬ãPÁ|†æ3(eÍ{̇xò"r¶ D(>¨w‰2egÎ5‡…ú\ üôÀT!{i(¤(ïõøëßGÙß.û68Ñ÷q×¢ (ai$&þ1LEÎÍz.ÎÀÆxθ2Î)" ‰„&ø ëÉý”ƒG4ҬʇÄ95 4±ëW×l À쥾cðZH*šX€¡&&B‚šª)„‰ZVHMÒP?é†"Ä´¦A’#A@R€E/i3Ö8Ë!R-Ú?rš?2‰àW µˆ!­"‡ó*á(D´!@Ò (P²T¥+@%”#@Ä D­%4„H3ÒTÂÕ‰@R \¨22…”¤D¡?÷``R%¯çøOãdjOáõ‚ë ±}RüØ?Á- ãûŽ$‹›P¶‚=˜\3ö6bÑ›Ìà—A’ÊO”°†‹ d!D’“GåŠÆ š$ða›sö…üf·›Ñ‰ :™x–ÅFøK«WõÁ?ˆ $AP[üïÞÏ×ô˜nhÿ6f žÅ5äÉ <‡Ñ±dsÿ–g×™¯Ü˜ü;{ø° qžÒËÙA*V´(ªÐl|¯ë¯ÔŽíüHGš‡eDwÒ)¹¡ö•':Ë`Ô[zJ ·Øl{•¶&«°F4Ê®ºWKƒV$>DA>ÔgU«ù‡ð£Öaù*Æ}¬mG<–.f&=4©¶uÄ|†Œ˜áËÈÍu{Ïg¿Š$b<Ý\evÂ]à7`.¼R?¿6s“ ºÔ.O‹4ŸGÒ•T÷F k0ª†Ý”D± 5 +HD»Ã"/¿¢Òn8¬ÌÃ…द D¢ÅÀCË4£ƒ?þyvmžÉV "È(Ì)*"Á ÆQ‘âÉ™˜ÿ¯( ‘7 ³¬-_™ŽHªHeß µ-†}¼Ž#½® ~OqçFÙ8pac-½‹–°ª€±KüÙ$)Óòǽö@ÿy“Ì9M(¡£Á/ÖõM|ÿ‰üãίÊTºh@£k%€ï/Ö…Úž‹JÙe7=‚3Fñ„B;Àª/–³Õù ö÷ hš¡¡(¡Š ¢’…¢( J©)I*¤¡ ª¦P¦ªD¢i‚&Š`¢ $¦¢"Ji*¢¢B)$ª…¤ˆ‚!¦Š("¢¢¨j¤H ‰”e*Xób‘yÿŒÛDTP~-³£xS/ÿŸ'¿XÔªI¹@˱j@Àµ!] É¢'6¦10”…V¦\õsV£â¯ãåÔd¢üGú#ñøQúV!=â€Aëûײ¿ã4æaý뇳ýÚ’÷q„úi÷˜°6žÕÛçTçIkUù«>Ý!Õò&E“#]Ù~ ñpDÒ–ê‚*<`v¶É²¹Åùè»S÷{ñÿ—“Æ&Znþ±“š(XÎIùÖÆØ´.”/fOß5¼Roe𦹠ÌÜÚýV®8õZ#±YuA¼ÀfŸÕ¢Hfþ ØŠÜ77ñŒ<™ ž@á8ÚªÄÌÁ²ø Â" )ÖÿT…ÝŸö¶.#i-?+2ÐE@N}É; šß¼ÎQ5)hUÿŸ®0aT ÅlñÃë®s€5Ñ[EA¦h(iuP3QúL¯çSjÛ5 ãy4f¦Æp›ÉÉÅç{ÎSf®”ˆ€Cwz³cªyü;Rjqg¬¢T¢Ý7=ÏO§Í9 þC6Ĉp•(Dgàìñs(UIL‹†My˜t~"â‚gß©á‹7­ ˆl”t–Þ‰DïÑÁ¤3 Õ®OjE´=Þ9@Пöþ5ì Y‹N'É£@êPK]f–´d¨‰AUVZ[HÀ(Úˆ$Y—.BFDX> ‚ƳTÓ1®þµ:víxkßœu,dŽQ Ð$”…'à@PbÐ$¤™re˜d(f¹FL”úÀ1 ‚20 JÂÊHVIòáÒ2 %âaOXv8`…"gg”.¡d*lÕNŶjÕ§Ð’„•’¤ˆçîÖÖ¥Ô|jš*Û[äOé þX,1B±4­SDÈSêrhD ¡RZZUZP¤T•i¡f(Xª¨¦((Šj¡h ’„#—Ad® ¨~I§D "xCðq2lÿ–=ÓQIS0P”ùnB³AäÄs?–Oq‹ß<œó£“{äÝkŠäû?9ÐZ^ŸÕÍ ‚:“ùLÐ Î8G0œå´ÝÈH¨C§¢kÙöŸ?7pr‡)+4ʨ,«”¬†$ATB J4 ‹€~ó@\ÕÓHŠqJì6–Ò«N¨j”¬ÒºË™˜KºEÍ!¦ëEtšÞö™4u°1Öé2­ªÁtÂåbL¥p-eŠ0`cŽH‘ P(,³jAÞ–:JMˆN·ÀHÂO}pšZ¸‡‚Cž£T ª'³†iEæ…b‹ýe` Åêʳ›|ÙYxÉ€‚½$«”Ç64DÒQmªqJ;ÖÀ‘†U,¬ºÔ÷œ°Û #l†é)&e%C”?” M;b „™Á¬ÂеH(iÁÒb™K6È XLݦ%EÉ—.ér¦‚ d;U*ä¦\I£ÈÌ(aÅÁõÞ3\%׌ ]åV¦Óø»ð®Âo'?Ø¥¦FÈÃ!;hS8:&\Hhˆ\J½%ˆ"l‹ñ¶ýsƒw¢0n1Gy†í¤†8 &YŒðÍlºXi‹ ¼)!¨Í»·ƒFþ&œ¡9f;F´#)QãzÒ¨c #®ng¼ß nI6…âÂa–`ب»hÈ\lÞ÷„$ chèa»3f”ž÷4`œ[§þ¦%Lœq¾$mªÌ$j°,’6–)6‰D¥¨ÀgM þæîù uø5”÷Z¬fªÁ™‹ˆr2ºÆú)ýkývÆMþç×ï(ëYš¢À1†Z~ÙςÝSidÕ5ðùãä暤”ò€RÙ ”j!WW?zЇ‡ÜF¡CP²NÞŸg;Ûvæšh¸'/<9$e°€mŒºÖq·›§KÕiÇæÜ’u½ãn.眙Æý…Ê'x÷”uJÐX­EV$´Ùìd Õ„º?Ï: c%8ÍÜŠâ/]@ó9ž½ó¾[0I—Žv}w^‘ìF¶o°@ÿãT“ã²ÿ`ç;Põ°„æÍf RI¶À*zë&oDm°§ÉUžÙÒ™’F¡Lô°¡ù%ÜÖÃåKϹ§ûÚ¢Øäd¢¦žd-Ösš4",€P v°LbïÒ[Ó¤ÆaÞÅ‘T‹ü¶qPX•eI¡¨eK 2¬ ¹~Ñžþv]lí,­·ó¥=‘Ý´»ç7Á˜„Çfååôþµg”“Ó¶¥' ÓH‚°ðX\hm;jN~êî‚fCm„­ù ]$¸4º”)³YºrÌý©¨%Ä^@ÔÛ6«y6¸Ôñ†%P L­¤Hñ†õ¨Ò P Â‘axøy½6f&nhúÍ¿2êýïŽ1¸Ï~Ÿ4DE5%üÙ)DÅ,Tóç0êÛA-5CÜÛ /N˜b)EÝØs$nÚÛ3šä¦ªŽÐÝAëe ÝÞÕæ³kUÉÊ‘èØ«™ÈMæMŸXÑØZHC}w-÷ ‹ÖÕGR®YjG"D7&&÷˜®Á2ZÜ™©6„Q'â=tN…ÿ²•7-œ¥1KÑeUšã[sƒ€*³H„‘©bi¥‰¦–'X“D² à‡l•˜‹”Q#qnô¥ÜqAbë2„ €¦Ð¢„! j–_è°ÞùtA'&Q‰ˆè%âT!ñ:Ï~;è`,æïFhö”$ÊXQa(Q¥•hT”í—Ôw9üÖ¹þCÁÏyxAû†éÖ´SZ)¬ª+`ჂUZêhBóÑ•0Ãb¢8?Bô& È\†P¨…¶Õ¬l šØ5”0…‘d‡¦þI@" hÁW !) hqˆ.B(gêëÅ5¢ªl#…V‰Ðj?•HpåáÜè›–ì§LPAdJ)6:Ù`†Î(0/[æ&[çJ(`&³È`õ*˜'”&¨(‘¬óÍøª¶¶—4…J•’ÄmÃ3 Ç ÖffkVJ®÷äoÞO NPëÁ¼:`@&]†‰Û&kt7aÙ²u0hWŠ Ðùꘛ§©ëÅI³aÔÞ™ä'[ˆ>ÈO9wÉÍ(¶o‡i¸åË’Ÿ¸Ù¼>¥SF2·Yp(±ï”ÍC¢†æÓÏ&lI$¸îŸñ 't]E54ÒJ@ÈÒÎ 7®ƒ‰ S»}fºg$Ðgµuy†éÇrÕâcaÈj4™ò !¯ ‹½cz’;äÖuk6¨ÕcD°æHÚ^ L„üføß¬,T,`€¢ëè«[¹05I;€\˜u}æYnq˜ZçbYƒ4T?zÇß“ÆJªó8Ud'˜nvó|iÉ™*B¤üÕ’žSAæ„›£l ìZ‰”`¬øÑõÁûýg•^ï²S¹!t¨x xÛ½l¦€ÒNF¡ÔZÂÀ4²hS‰© •Ì.{:4wÚ þ®ÉÞS}&a ºCQÓ†hÍ“'9.ð åaYPX“( à¸m ò£ÆÒN\œ¿¿ïìïfOœLCŽ?oÖüõ(*(3—5c³ä› k!³³% l…x8œq4•Uç[™ÓRª8>¶|AK">I'`?·Ž šb¨¢ Ÿf*?í˜ä4þÇ|Î~àŸŸ½ï¨‚ýrvð jv Ë1Ñêg¿ý‹ëÙþ™láÏÉ‹‡ˆ\ñzi }àGçúk°à[:rƒGö”Šÿ¯ˆsžH`W ލPH(Kÿ£–ûªÅñçž3‰Í§ c2hà¡"³*U¿f¿ êxÿÖõ`|Œ®[ç“ñ£ÇúQ_­^÷Ì¿ ¿>8å¦$(A^@$Gïƒtr"-§;¿Ê³¿A0çsCUþØìv‰Ç=|›À09¹ßÿ·?Y¬¿¸òBº¬OQú÷ⶃmo³¹Õ {¼G¡(„n˯̫’‰Í++H!„_åÁ«’D†­& mR,Èm|äÑ °h’‡-éõÈІÏÃ"·ßœ–sÖðâ ÊU8hÄ: lÕ¶¦Ñ¬mhi&1fr™Ÿ¶°ÙcθÛ7©Ï;2zI‡A醵`qqçE^:.T>\Á6àö`&«ºà-ˆ§7iÝ쪢N%"€VÄy°Ø€‰—Y@æ¬Û@Œ|ÜÕÙ}²#\ì¡zÓþ㣗’÷a B-:[Šû~/M’ô>8Ô°ˆ:A„Ät£Â°ÌpZã hÂ$Ñ'ë%ºçóßu÷ÚNÅ=¢Èçs:O÷àèãÇιH;©FBd PU,Á’ÒГ WˆPjˆ‚Ȧ4†2Àd…Vd`(€V(Š*,PX*W(—$1Š\€2Crj_D?ë=üþÑáháÝ´Ñ5u(á×ò—µî!çžlª|À 0óÕ¸,Q@ŽMfÓCåÌŽ5í6“‘$ê]™Æ 4ñ•xJ±/£ c¡•€Ú8^ð@…SQ©‘Ä mŒ…¶Ž oÆ‹æŠÞ·%—êïmÌŠ›{¤ ’ß®ây>yòcå Ä‘Âb Qð§ÖŽÇÜ(2oż}üÀåxq”´úϘ–vòÒö:<‡ñç’ 4{ºöT–œ99°¦¯æå¡sóqK[–tštPµ‘ï&…ÄÕsS3ÞŒE˜5ZÞZÌÖJqn6u²‚þuËŸO'ƒÆçô?XÍ”< ¹o´¢ÐçÍØ2¼@<¡¬­XL—,¬9:r !4À £ÞL”r <\ïØ¼ð q˜% UgÎF /iQ<óþÏwRÊíiÎ ª»)æ&ðQÒG ‰«3iÃFe¥•ÅŒÁ¸Ýk ºÌLqb8·*L¬UFa†m­30¶Äj\Êâ*›6k «¢“:‚˜4Ü×±›ŠÈb?ë\o^Á¢è²}ë(Ì–Äâg;6(ƒÂqC±óÛÏc£[“É–Ô^S *¤‘Ý‚â@LUÖ=ÊÍêñ°ÔßKØô>ôÐò ÖñÍOá•’$!± ¹Í0IÃåŽÏl޹ÉÀœ,ÁNY@ÂíÝ9ºá‚1Sq—"r§Ås³ …ðg`â)P!ë ÁÍCïz¾ ÔôˆSñ”ÐU°îv€ÙÍà>€ÍÅü`>æÜ&LY]N‹Vf#ý‰Núü~ÔÃv)Gª=™7;­*}E‘T ÛQ(_¨€Ãóàüœ èôðDç~gìG%b ÔOÔñÅ—æYŸ—U[N{.7€™ÔhC¶ŽÊZbráÙ›Lˆ›(”C¶NEYµËšã…';Òõká;HB{DèàM"â¶šTÌDê-EÇT˜ƒë]­MÅ€t:/×­éê5¼ñlðLE]aŒÌß›œª¾Âšñeq¥|d½q›æ›ÛDêGà{\&¸ßi”Ô¥=ϼa*!Ë0@:­½š±Kz=bU??ž/ÍH’UjÓñ9‹â‰ h}î£Ä…gUtö*àyC§CwÇÝ}B(Þ'„àôcè3ÆÍpo&Lb~MÕLRPÊÈ·W4h½lÂcªd*x=˜o^í‹&íd!¦^’¨ÚìqÝ]Dh>ä6’bý´‘ØíÐaÚ~àÏÎ6ד¯‹Ëd=zÐu$PüuLi~Åtõ>B8ƒù€3ø†V  “\Þ}q{o´ D@Žçç¤ÿŸ¥ýy¥õÇê¨î~ˆ L›§?½X¹¤7‹s¼J‹®õ5ÛbôPgä܉ü¡¦~W'Ÿ¯~®ê IÂpgÁ÷—Š®ÇE`øíø?¹9üSÐúO‚/û8GpñD¿Øõšµ)ÉÕAkö št~Í Â0‹¹5ùwaOˆÄ(þ?·ÞpŒ`yÉâÅó¬\M¬ä ò@€‰¯ãGc ÌÙ&ßQUóò}IØûù;€s‡©JÙÍ“üÙ¼2~økæãÝOÉ>Ž9rç¯ÊEr]˜B*‰`€Š ¨E‚¡Ñ†d€ˆ?ç_æˆ}°‰·´ú#CDj~trãÊ» }&Þƒc]Óð*/EáAh¯rˆ~GÙÓêþ8þd¤9»½ ·æÊ%òuùìr´C¿ëÇ}+6*-1õ}kH&Ú!ã>’hç'> GãœìôŠ'NÿÈ[.ïÑD^ŒþÓúèØú5€˜5„mgó‚?^õûŒ5½üÜýØälñ~ÿG:D‡TÓ´B¢‘éji,T’/¬>nÃceîÃï$5£®„š>kž Lñ@Ê$2 A 5€ýˆ`£A›±¬kúŠÃàe€‹\4O§DbC % ÔÖ…È­¨x‡½ßÇ d†/“tG$! À2¥À¶OÈX¿€·¯D€8~ÙvhC`†.Bô¹nLººÈYÅ2`erh£yÂýà@Ùñp%þÖáQ~‚ꥅ3 d=QG~bþ¸N|ý?¼kàâÀ¥q‰p„æ†bù í¦±1/® YJ<óéù4ó d!„v\ƒ…Jàu× ½ú_ú%„Sùø7­Í” w÷Ý€û}LO¥PsŸÉoë"!’rjϱK0˜ègiú"ª¯øÇ`Œ‚Ä$¨ˆe¦b€§ƒáôM¼â?˜–‰Ú‹AM%eìl`ß[ºÔ‡€(à9ˆ" ‚z!Íù÷ø?·‚—æ)íŠOÍgxm) L—†Ô£d1szü0Ù·õ£QD¥*œÓœÒvÐ †žu3‡ô€c‚5«TÃâÞ@8$ź™õpj:ÖòsU¨z.YS.± °ü›•øÃ°÷ZÝŽŒ#ü‚έ»vkëiƒô¦· (ŠuTmpãÜ ) 'c¨:hé<‡ëò}ß#Þ™±ò>VOsð7ëÔÒ‚IÚó5(jëo9Eåv`)ü½ˆ6SÁ£ÁórõzÁ”i'£Z¡©ÀtÅa½6ua¦s[¡`ðãáënÖ^!‰¤Ù¬œ Nø:¼žäáîñÅÞ^ÔÅ¿¤çˆÉ+¨ Þ-Ìã~[-Ôî½á_]›ï]T—M†Hx5T“½U]C´N»Vo­»¼ 6Us’† v㹤(ÔÄóžìeõ9¸GÝpüCo““—vîÐ*¬’»xH©÷uüõ¾ðš;ø¡uZ}ò^ ÷À î@9ÒrB¬,L@w¢Tx÷€©•|À¡º‘Ôd|æÑ½½KÛÐòé;ÈIwàÅq ‡E“JøâÙsÊš]ÀútA’P뢩jš)•)B”Gºe¨ÞŒûÇ%ÁÙ‚ïv¦m;æm 2‚+D\Úo¬C?ö&Ùaw—®vÜ*r°N€]&È8-<Á¹ß椳O—*kfÂÙ£xV;ÞOß4àÁ›£i~3 jŠyüØwÑÉÚ™0aßÉí‰Ëˆz°¥ Q‹oÜóñ…NaõP8 Ðý)3£AžŠj¬Ú%&§ÁƤ¨’bP–h)Z(ï$K¸”J¢’U;ý{ •À¹‡Ï_¹Ó$nF‚""Û1( …/ïÃ0¤¸²,jºÀvÊ~sàäÓ¨¾¥úŸÔ_Qýir£´<Ƨ#ñ+Üí=‡‡á§O°ðjHB1È6¤Žp7£7óúü]£8Ä?™TÔ?Ä.?UQQ–6nÄÔÍ¥‰¨k™ xÕ£èåÐÿ\ƒ‰ÿYL|&ÓL0ý]âUÊÖٱѾxØð …)@¡JE +H0*R£þ!)2 ¡)OÜ(‚Ð*QH« 4P…"̲¦B¡@ú•L‘u ¹Ð…”f Œ2Ʊ@2¡iP)‰)B‘J&h hTM”€¤‘‰Àÿ¤*¦[˜|ff²d—–¥9Û¾õœ,›¡4²Ež]&·eÞŒtYÊAQƒ5¬pfa½S6cn £Í ÃÖ¢:œXc4q»2q«Ó¨qĸ†Ð&¹¦œvãQ@!‹¢¬¸³{Úº!6C¸8·³o23iøC©DP¤xrÉE²Q h¨Ì*[{V*ãTµ Q‚2YÐsoº¦õù_­e@”¨¨ã* >¾0ÞA7 Jxß\|ð”-ÖO|€óæC¡ô TaJT± ŠûuDž«~½Ø—çÀ«¾ÿo'Xß}½¾`N÷õ9'G·éÎ8–4‰½ã¹|ŽÆ“4<Ûø<'Ü[•ê¼9§Ôj’DLj‡+‘>OG*q‡€D1T4O™jHþ¥$`ˇŅ¥ÝÙaGŸÊœeõIBÔ]GqGF(âv„ò$Œ€‚b_OÙjRÀó)}¤¯\…kq¯óÝŸñðŠDŠx>‚ÄëÀ\…¬žƒùC¶,)ŸÍ74+ô£Ix׋¤}ÑEV”&Ò~ Š?¶DŸ¶{{´ÇÚM³ÜââUåÖslžP1!>ß~u³¨ît˜œ = °yÎUxÚ¼—=Âö àEÑIÈ ¶†…`äZ@-â‹ †”çé§:0õ!—–Ò¹ÄÝÿnNËa9ZÍh(º- 3*r—´fË]óÊØ»×&ú.€³á!_sÏÁ>CäÏ‹~LÓÕ‘õÚ™°T‹d0C¡2ÏëZõ—VÒ¤†jòè–,N=—j7¼ûüc>N9øó ^wê°ºÀ.f4]KÇãÂwÔ„ŽÏ„88ôø>~9˹íùGæ s…<í8˜€óú¦¬ª›)̓è|)ƒ×Úüž¦Ñ$ñ n†žë|bÊ …¤%A5† LPeaURš t¬5LãFM4QH¼põ°ï°y0}LCƒ±6üúwŠá"|õèïʘEATÁDU|^Àí/\õóTŸžÕ·²QãU= 7ªæŽn0„( J“fQQŒ§|„ž®6ÏM±ïÅq.*ÝÑp8Ùëí¤ŒY Œ3»qitÆjÉa£ù´G¯€‚ SÉ ð5(>Õf_êXGO:ƒS¾L„¶ÛÆDT¼uÛåB‚m*©ª¤;%à8TÊ¢åÊ¢óCî3¤P•;Õ$íÚÈqÂýSð¯p ƒèbëóÖÇùðù†–¶»ùaŸPñÕPÍ7ŽÁ )t…÷b§ãœùðP7J—èFŒbBpvRëÀ©p(cRÖPmDðBîÈHÏÚ@ž¶¶Iù`¼ò$Þ€9™4F86÷d†,ߎç|ýŸÚËèæ%þ¨Þð—Ä3¸uä15èÑ à‹úö ‡“؆">´y„ÔjDŠŸˆJÙ÷âà še`…,•q!gV 35tÌi—û["2¶, (”,:²­IYT9Œ•0´•ÁÅKe’ Lr’娫CÄr–ƒeHV¬ 0ÓlƒÅº² ud-²« ÖÁ•ƒÝ£Ê4P­hŠPŒ 4šÔ¢«KP*C#1€b4² 5J2´V&%QRÚ9Ñ f[“dPÒ³TUNçv¤"J(Š 1™”“(cbêÃXVA´A¢]Qk1 ”E›d*ÀfˆÍf÷ƒ°Ü¥èƒ#%MB%'“BQjÅ\”Éw)œfoL%tÄÊCWIbº€ M8@˜I‘’›Þ1A™2ŒFAc”5™ÖcHi$Èé !¤A`µ(Ãl¨³7K›ÕÈCB€Á”J©«ƒ\QqÖW 3a­USHMG m3&²àƒFŒZT¸…TÖ²d –¥µ‰J2(¬TRÑks2btÊ“-­­Dm±ZÔ•PªÅÓX*9-HÅ #‹Æmeð†OÉà óuùØO1íä#Ñý¾} âþ{IPP±%ç²ãÚY`HNiÛï0Nó±[±Õ´ u-óxÇE³ŒÀ#j²!RT!â@ ÉŠtñãÆÝ§¾áJ|t!ÏFçÁã·í“yH•Fņأ…®LÀ'ž6-éË51¯Zî°r€v0~¢mí ¢Iú‡û(>ÏۿâÅQ þÌ+ •¥±F'“a¥7,ev1À4§ß[5vä™Éaè4?õ˜o”1™X XËdŠÂœDÃ’— ÈΰÈc8Ã!–H6)KJÑ)OÝBàøí=RtÃjUœ )¥-,’Ëd¢•mbKl²ÂD²©iL(Dɬ,f’%32hz ¸ÛÈ'_¨VÅ\¤[(ˆ”ŒÆüÁDšÍÒÂŽiDXe*Ÿêe×›ËS¨ˆ‰-‘rÀĘàÑøÝ:0¥ÄÍûs{Ü«$6Ñma¾[8ЈÚEa·H¼²jã2ä®›1…‘m±kXP@‚2M¼¡ˆq PËLEVrœ¼(ìªCC\& DÁ5ŠìÃŽ yþ¥X€(R•ä„ šJ¥ )Ær@)J¥‰¡Z@ ¡j„¥¥ŠhB( ¡¥hJT(© ¡B• ¡ € V†¨F¤(…&¡š¡rD $iH’‘9„*@ ¢–”C \…¤(‰Jh¢€(F„H†’€ „¥¥*•µ!’4ˆÐ¥PÒ”R @ädˆRRP““JPÒ.@!J#BÒ‰BR‰@”ˆP!B™9€H´¥ SJD4ˆ#1d!„ -( SBUR­"(P±Ò¹(%aЋAJ:ÌBš(5"w%u Ð IB"4+0%ÎHR(P®H”0”4¶±rU¤@¦7d J-*!B4­!JSĹ” ´#ăJ(4œ©s,(&J£*‘¡¡( F‘ Ph) E0 W'R²Ü+¹•  F”¢„ ¤"% ‘¡R…¡@¤ R€ˆrih¥H†š”ª)3FQUâ¥rB@@RÒÒ ICBÒ+E©Ê€¡b8„2(¤iR„ZP ¥… W˜TÈT¦”i@¡A¡(@( (hS™ÈF¢)iQ¡ ¡)¡i(Z¡ W‚PÃã–šjŠˆ¥b@ …‰ ‚i¡¡ E¡ ª…  Š¡„˜¦Hi(SÇ^9Úqvƒ!ÀÓ³fck § ÒSQÁéX*±h …KFI½h ˜V l„-ÑœÀqv—l’¦íX‚e¢ ju¤±M νP9HoŽès9â§šf5y‘@kÊÝSï)áïÇ´Çúß9WSž¼&š¢$Þ\ê×ÕÑ…EÛ/~·ÄÒk‚ˆŒh­ ëÅÓâÕÝ…V2{c½/YÎùç›­hÙT‘ ŠÂ×p @Š’¡ÚUQDÖSŒÒŽ¥ q0t<™­ñ–ðuU4”ƒT¥l 2ŠaŽh.qp&#«WŽ Œ\CQ†!EE¹­&®·µŠHZEâ$ HC[IÏ)Œã)‰ŽÄ^,F¨( †!J)i(Ri––€)S´dˆR4”KHSHÕ ÐµB%*PASÐP‘!BÅKT…-KABQA#CP… IB3BÐÒ…R… L…R#@…% AM-PQBPЄ@U- P1#CM A%"Ä)Jµ$£E(Ä¥4 P‹T´Ò´TÐ,ÈP©HP”‰Q*ŒÅ*СT+ @C®;ã{$è›iJ¬—XkYÞ`ñCk›ƒ“‰1"‹«ÈmA¹µŠ¤š¦-6©†\.ÝìÛc JÀÒJé´6ÌʱˆnsÌÙœóN4xã[O Üäó™;í8œM¶Úíå’ºrؤƒSÄëŽ uÝý¾(¬b¬¢ê7h ©˜& ˜¢J#¿ÍîF˜”)‰B” ZJ„Ô!’ (”ªÕ&@9)QIRÑUK1ChÄÈ¡5@—"—¨L‚"©¨ ãìôm5M.}}_Û»ç×ßmŸ;'I÷¸L¬æW“gŒøìÑÏ®c¢ÒMÆ#–œ^r©«¢äÄ\·–ºN·¸Ãð~O~tvd\¥Øû„ƒÁ•·Z£GùXùv×~Á(jì%«|æâ2+tÕ © Œ& 4R‘†˜Äp “ÊhÛJ_®áÉœ]àtNF p:ø5: nøuÎÅâPº nÎ%•0Iµ‚Âr‡{PA †±LÌ7&TªÖ‰ÉÖ¾ko*dño{ÐJdRÈÄZ¢”¨c•á!{xѦyÜ E‰€6HT•R•Öb&ZtLŸ6q ]Ý@¢ê•Ç V;üè1Û}—§,:ãêÉËS|>-[Ø2™VQxL. š4®´M¬22%©±jZbK¡Ð hNÌø­ü^à RÃÓÏ:Ëàª-ÌxïÂl4FC†Cv‚"º JÁB~`dè ¼ð&Ôõï‹: ¨öypÐã ±é^JÕI0ú˜;P6'Ÿ†xâ’üìyHSEFøÑ¼z‹P9C* û6¯Z”¥H±MÌÈLyõû~øíëù£iŸÈz;¾þ3žlLhÅiNo¢©Ôæë” 9Ñ~’iÒÚ¸`(ˆ¼†é:t›6Ëô‰:¥Aðñ„4ëT§|á za¦=ÛŸ– G™QܹD?Á¸ Žò9:d[Å0Õ…b¢ÄYmQ]jd€¸ãœÊóð_½Suªr…Aa3ÈWèqYú+Ëb¨›k]1µ¤É™((¹P¬ç[Ú§]úâáÍòe“Ò­ %1)PUÿVšÔ,[9©ÆlÑ&›€©'èK)/Û¸tÿ&Ä—¡¹”B¨¡}Ç$ÚâØÔö"Ð%$à¾ëyoìYÄ…`ºåÁDþ8\£Ë °Ë³×w;ÖTUƒ6Â…c¡¤¶Úãz,Þ·78ã•]pY"H•_â—ðHšˆr4T!=Áüè¡NJq 7ª#ti&6"rˆ_¨g}í|Ó%˜ŠµR6]ù^ÚÅ<6ŠR;ø àŠhP3(*MŒ¡{;wõ¢„äý@ü„@דâÂäBYAB0œj“# Åý:À¤’4dYŒ )h‘ $݆0qµ…|əĜ·ù²Qd4fa2 ,¥÷‰ix |åCÙq¢ÒËÿ«Gë„ùëåû+óø¢ñ]WÖççÇ_Qöä$°ê¥{§ñѤžUïƒê_õ™èÖ.VÆJ†ù×–¤-‡õÏ{•ç3 ýu‚Ìïr™¡p 5|˜‡½¢Ý‡ ÓÊeùbrªÍªŸò„³»;¶§h¯’¢ÙÆägJ`T08/‰w ãQ`4„.©fi”bqK‹²Òì5ÆÇ–‘P†’­¡õˆ=*eV‡:\h8«i‚ÁÃë5¥È6šÐîԸƲfEkÍ.#‚¨E™WU¬S:çôÉR¹oû-f4iI ÌõÒX¨óm¨ïÏ×è{(Â,†QoçÊ¡Od~¡ËCЗú8JE±Kñé'Iã7EL Œ‡‚´š³äÓ>`£¢o{÷üw„ƒÁ¥ºh¢½µ~åÌ.Ê "]yB€º=i¢ AÓƒ½Å ÷ÿ¯]qøèð{ŒZð–ÈqiR*–– æÑClÓŒ3rà -—ÞÀØi!¤6@1 ÅÂ7.K¹D({Ät T3(i429¬¬Ïn`FT°m°¨²¨ÀPË&8‰-¢”SC1Fd±Z3 74b 1Þ°ÀCQH¨1GPÔ¦ÇKÃÃ¥kcé퉊1£i†´ƒ(hŸåèÇ1P˜—R§xhÔü½ˆ()¨„Ü"ö•F¬0ǬS¡{äÎff9(ÒRj\¬ÇûK©ˆ”:•þ'D4´=@ME R¸ëtý3h¤PXYPŠ?Uï=êgÝ?‡i1*¥b¿÷k»AuC„!¹5  F ™¿0š*à QCë*‹ Q„¬Å„ ñ‚Ž@P3ó‰¯9‚¢¨h 0¤Ng!j"&i‚"šNI¤2¢DiêÄ8BQ‰¿¼Á‡ ù– p†"!ÒŽòi4Å‚èdòÊùµtÉäß-¢pIjêlaQTð‰!E-‘dF ÚT •£H¤"ZhS>Ò›=~GãÚGð(¹õá4ðÀ”’6x .—£ Ño›¡DвD¬åm)ÏÃâps)„8O€ä‡\P+J‘šbDÚ¦MÙZB‰¸ApñÞ¦pñfZe=¬ßLá6‹ nîéƒt´à`4–»{ÕcÔuUɪ H´¹Ã¸éؓӇ‹9a|[æN¦g :eçÎ0ò2óMZ~½;|‘éóÖúמ\9³¤’ݶ©è{}]Ñiì}ã¬Ü6Æ{A$¡¤à@à›í…üUë|1 }_œOJ|÷-à‰ð¨û> sÖp÷ $@;vÌ0qµç¶½ÃŠ(™IæœÈÒeŸ€òVÖW¯,Îæ6Ì ¢ÁA1Sذ ™¤üµìGB¡âx†5é +·_:PEù)÷§®ú“´“øJ%0–ÔYiS½<™YÕly«õ»'$_¥Ë8C|kK°­4BÉ‘ëú0'ã wˆr»ó#LeH0?Ú$ÈtkÛßùcúþÜ3‘Ø0ãà¬Àt¹$Å××òÚ겜W1ÁñÑ”Úz>y>”ä‡?‚ᑲœ¾ô‡ìURïï…ËŽä À›×:‡ûH¯D<Ï&t[‹к½RƒÃ…‘T†€qR°¡@g»Ò†ß,šg(`nñÎu°j,Š„n€‘å4kr‚Cäß¹ Î¤ ÒéAáA6yB:?Þ~T„:üþü ϳ×q¨÷‰çGð3xS!Û§Iñ’L»?6ŸÃq;ú´eOâÿOœ 1 î¯ïñÂ÷ 3¢GÇc£ŸN1u¡Ìy€„nÂÆ¤ö{<ûl„ о|ÌóÞ„^8‚„y¨–g·úü¤±öCìõÿ~Gø¡ø?–Ìbí~rV9ýíq(8ÓvgðÓ½jœžq€±4á;´ÙF r3Š£:M¯<àne½Ý½ÛÁêíæØ}!HÅ–@ó(x‘h O‡Q›À_¸]H;½ÇÄóhóÖ´P ­Ö/ŸŒá©=¼§„ø†Ó´üö^‚wï;Ì¿ÐT“ð% ,#½Sp¨I²Ja,±ÝEšÐí1üc¯Pm;`8$%ÐxìvkVQK2âE…-Ÿ:ˆj¡ÓĬAõ&A@J²"£7XÖ±§ˆîz?‚wRŠ,¼£"‚€*€¢"€±f%{}¾f”&–„;4”EëS™À†ºãôO£ÎÁÌ ’®ywÿÊ._Çnõ {ÚA^4*МdÛãóÈú˜üEŒ‚åÄÉ"B  2<ËrÓ/äyµ§¦´/ÞPH—ÖK—ý¬âY¨Ÿc0EÍÆœñyÝ1‡Ùm‰Sé;N®ÊÇŽœS‰Ïp Œp—÷˜ÁÜû¿_‘é>ê"¨ÆOö‡Zi³­ã)R=Aï°Àt‡ü¯–,ÓA?kèÍbøìïòÌ=%IéU ÿ7ÅýÒJP 1Ô½e‡÷L9$È…8•ĉ˜„bF Š'ózü^‹ÎÑ^ä%vý(vF{ÃÚGm˜/!Ï>Kl«½æBC¾×ûÁÌn18Û‡¯C„¢T( A¡H”Z† ,QA0†° ­Ãìùó€bü†×|ìfÀÝ£dÛ'ìÎFÐÓ‚žrDƒ1)Íò½¤i̠ȕϡÀhñÍQÊŒ€]–%E/]•u®Á0J¼˜3,N4ed(<Øô ˆsø%!sDV‚DÈB‰i(Á*¸…J*f´"”b@ªJY(ÔYX¸™*B¤·3C­¬E‚åF––¡e@´´©D1ª"É­b«ŠUK²Ñª-[Ž ”)S0I\q å DE©k™F"媌´QJˆŠÐŒcLÀ¸0…¹˜³Z¸¶•ÛY‰SZ· )Ž «¬£3Z¶cªi‚ãG,(@IhlqÒfÖ„§T]ÏÐsÊéA¤”æˆÈw:c@á•%€nRPP @‹¢0Ì •ª¥D¡QF”  šP$"Q*rBI¤Ü*GR.DB±CHÐä¦HÐaŠéFF'SF¤h6Jil”ÃVM.“1(t:ÀÖ6åWœÑ(” áEÈ' @7€ @ÌãE`”¥p[¢c ¨I4h„²ªFK”…ÈÐ))D¹N¢MÆäÔ„U‚d¶²… Â"-!m!i‚2–Û00QËD¥‹!+©KD($¬© ˆ$%«*£U–PP†08‚“m(Á¬¬¢F¬‚0fÚ¡F¤ „PÀÉ -¡E¶K#5˜BÒ0@ÒÉ¥Á ÒÌk¡( £RÁ§P¦Rˆ;³z³ šÖŽ È&M9@é1•rmMkrq¹5!’k ‘  ™œË¨6¤©f£„¦.ŒÖQV+¨TPQ´Ï2˜ "*b¡eV!"V¥—$È ”5­fœe¶< ŽÙ´S0Ì©‰µ\}àˆÓô?uDTDÍT4Ô^»ï3ô|.sý^° Ùoêæˆ/ö}d8)¾¦ƒÜׯé{1þ,'wÎOÁá·ãjXb—'†b¢~æËØ ÄPÃ#20ƒÄbv¢íCÈkÊ+3A²¯ž9Cé+¸‡ Ð"r‡fªÁs òj#m®àP§â„8`E !môTÓœqé}Vkȃô›î0Mª¿êD¥6–ìœC*)ŒqÇì2È_ ›îWÖª«1õ:t6¼èê˨rì+J¦˜ª»Ânè è™Ûfð £{v ô|˜°hXb!„(?‘±Ãó÷úÉà4/`‘±‘T‘ ‚¦à’tU°HÌÉB#p9£e•ªÅƒ«´1`H2fì˜82¤a¤Ì£LM¢“l<ià!&^•63¤t@wº Ù0]–0²šk TŠ]#§ŠUrpS °[²É 5‚-°ÔV!"\“ŒÓ+'°sPó(¯6¬‘Bç$¶å³jf²˜éBëÜÖŠ—jeÔÑk³Fy£tÚ«‹­˜W oX&.³ˆ­ µ-Õ¸’E–!ysŒH¬ž¼ü ~0ËŒßQÔû2T"èØŸ@?\ýs¦”EÈ­ð†íšCVwø/m‰ô ;ÏÚïq[MØ´I4ìcŠ|BçW¹t+€òâ#F¢:+UCÖ(’à¿âÜëlós´•\ )¥!Š3lvÔ .-°Ï»ûÃXâTÝ9·‘ï&™õ"S,® mÖK(Z°„Þ&"ÉC Q¦¦BW—ǃ“ƒ"î¿Ä> ‡1í;@K‹ƒsî):?2É$»ûÂG‘(¡™'!ƒ¥£à>ÓmrŸ26H1% FN™IM ”@„ÔA2IAƒPÒbA1U IBÒMÚrRˆ–†ų̀ )‚ 0²IŠb‚Š¢ Š‚¢ˆŠh©h©¨‰¨ ƒrd9@”"qÆZÇ#VL±¤7Ž¡p•˜¬œ"’š)J(­IYØàäê0‚i¥"h‚%)(¢%‰†*„‚‰¦ƒ0¦©b”20š¢dj  j@š¤Õàµø† í$õ±Þ÷É1WÉóz@3_¾2 þfüA]“½ÏíZg•vf“–›Î#d,ÂÊAÕMMÿ±íˆ Í*õ<* GMJ¯ê»àtßyØ”Zèó7ÖƒD·þSõ&J;êá![T‰kïjŸ7ð|ü+„_ †‹}ÁƒJMƒáy¹üâ4Öƒ…õê_• [ó Á•x[¢dzO½ÖqQªÒùÏØ0 Ñç"í'ųXX?Á•Å MìiÓ0콩=Ó'æüPHv?«ÕìHsüëuç^ß„ø÷'¤Ç[óÎŒ× ™ÍÊjF”YÁ‚¡ïwÞò=á­3iEc$‰"äú¹?ÌóooÖ¤Æpóq(yn“?вµ<¹¿U d—ùÈ)UQT¿MH¤;ˆ) c"1 øÐw6›Ôø~È)æ¡8â-uÏõq*TEmÏ}¤mN—GšŽ ."Ç?Qì;~?×ùþŒ_ò§½ãöu“²NÔt}jNÄ#SB? Êpb œ’§Ÿ™ŒGFâɾ«½æc'Çöóìø>eU>‰Á'Š?}Âç¿fíåùÝ4ƒ«%Œ› ÖðGZu}"xìp­¡ÿ¦v%Ê¡'’ÜÆ i¶w;.@Áýo[z:D²R”ä…¹¿ì¸i¶Î«~~O¸|üzÂë˜?¼™¹F2àgãìòÉæ•Å…‰N 9úoê`\¾Ë‘beZF@¤úÈLÉýc÷™«iQZöÖ"s˜»¿ÒµŠ—ïèñ„J\™–ÙÆÊd2¥ÅzjÈÛÕ^Â;,ñXñ½y777‚8½°˜í?±»:ßÍ3iƒ)icmVJƒJ’Ô&àižáß^Y9SÃr7››¸CŒ 8&Ó€ä…!ô¤‰LdÌ7a$Ú•"X” š2P ÇH¥­—\1-—W@ùÍqÏ|ï¯÷Ý|[É¿îÊÂ{÷pQm 2¤¡JÛko ™xà (!©h†4þí÷I¢§E<ü\öθDéÊë¬tnWÞá/4 '–9eŒ‹+åïz7§¬=è rnûâÀÆ1€5¡$RwçÎðT2”hÛ½õ57" îây×óÁîYÑN ÅÎÝ*‚‘\,Rþ> † |é ÔÎsÀb0™k g«½bRB *ÂB‘¨ Š ˆ¢4ŠI«êoóhŸÀ‡ëù o|—. t¦\`.EDNø9ƒ?wßßèúÓª]eþ…L•(é…®RÑS1¤ÿ#øÁâÇB«°3ÍFü4=ÍH¤Lóªe™]ʪÇãq¾8%'¢¾7lFR*2ìÖ,CCB”~c’ˆË„([­‚:7%y>øí¼.TC¡YREÓ(ˆkkF/ãž‘ùÝÆ½œuÌ“!™´@~h)!Š `0aæCÛ¼6„4„Œ‘6³êYUä®eF±“|A°†0¡Êyœ=ö®=ßžâ«K²B‘„é¶ßÍøP¼µ”EAAP÷ƒ‚y ]È×'^S“bš4i2ch y/F´Œ‹j½~r}ýÞ§ãÎ>¹{¤8ˆ¿1þ§”ŸˆòóônE&e~‹û–„Ñ„`lú¹|b'Ä]fåN€Òb11~p\ßul^ØâU@”3ÑXQ©ƒB°i,´š „™©â…’&Tа`±v¢RÌÁžŠMtªFî23MÜý›ÜÕ¤êùL“JÁE‚Pz‡0°>Ó[ÆX‚,¢RÞ\ËÀ³ ]Ò÷u¢¬HƺHŒ®@¢*ÈÁÔqx ÉF—œ•—3\†‡@\ÅaEï\?¶9˜–¢X“« ìH©Å­|ä œH’€TX‚6”™€¿‹¬BÛ9$¿%ãÈ „!ÅñÒ¯Ó Ê`K³EùMÛà,3‚—ðC=TîzÐãç ãP £2?ºdE€šrDû,ˆ¢bºøý(˜©“@Lh«ÓÇ)ÀØÅîÇ.'\ 4Z†b®w£FLX(à¦`¡S#4èË`n¤Ö¶‚¢5Âé )zýç`“Õ"E˜tjrs®®ÁÑÝõ16}KŒÕÑ–žÖ(Õ 7âÃp *ß0qù ÁvUçE²Hà0éæU¼à¤ÉÚ)]Jêø OD€îmàK[³¶¾ûã9Èg:Â1JŸ7˜äËžXe–Q@eÒÄadëÛ ™Õèñ=i(h…Ñ|iã\|fÏ»$á;u2ö˜J]¦=½à\/.e¬[-Ä¢2å£Cg¹ ÅO5}@Ä-(T(ª´M;Ëm‹(kh}ÁwÅ&½]Àa£mͦ°W›·¯ºî§—µ·®<ëHáµu‚DÅ 6ŒKRij§Ó(‡8Vç#Ã(³?P!+"’ ‚+ÓÙõ§V–$«BÙh#RTJSüeÀ¨˜Ì$V¾Œ9ŽzëZLÓ¨ú»Ún–{‚Ô 4è¥eèº D¨˜€Øš%I‰0C Ä+k…¤BýšbñJÓY;ðYø3“B] Q0>ñðÝüÖ¦‘ÉjµŒ«( ¨VDP™`ñæ6‰ô¿AŒbûÒáp®p¡,"%PP"&¨ÚoÓ¡Zé²$…¥”fÆ9¬Ú™f»ÒÊÙ´aµ/Q’Ê#üs©´i(ØÎ²ní²\at)%ó%¬œÉɘKýy¯rÒÛTO¼Ì"-¡PÑlÈÓ¹2q''õœP©WÆ 6f«'âÖ0­Ñ_‹ó2l.8œÃBPµHãF[@{B :Ó„œk;ΣW'|]ÃJY³·°ÂL‰û²Á`«òó3Åÿžfûéød>r“Šjc”h¡àïˆ΄z­ýS?ˆ“ê1O6Ÿé£Œ :òXNrÛdé“Õšd8Ûf1Ö²ŒÆi&l+ašÆèÝ+Z’D[[AQŠÅ–®­Ì¨¢êÖTP¬£&’Ú"‡S¡&õ†¤wf3IY´‹¡ªÐR,á¢aT’p‚í%dBТJ!þ1j/hÚHÃ_¦fP9UTƦ 6陪Ól†2:¤3TšÝ ^Œ®o#—0´IZä[U¶ŒÒQQrÕ†“ bbñE%ZØÛ ¸1q”QUYjPSI¡;MïýäÐU – "#nØgMPnÜe[R  Í læVQ.ÐTc*¢bY–.;Ãi9dÒ,6ÁÞ°;Õ6^PF¡­–,ó» dÒ9fÒÅ®­|¼¸œ(Å$ÐáÓ áCH/h¤ÒpñpÈ,˜˜œ2mus6àmÛ 5ݰѭ(jpÔZ5qÌ£šÂm Yd7h"nìÌ7‹*ˆ£xÖºxvÃfÒ »æ˜éÚ*ð†jŽó!¾µ£Zv©ˆb,ÓÓ3MÞµˆ(š`Q·˜šfnªÍ:F›ÌÕÇO–š°±MZÍ SvQ‡øÊ“b¼f99 j 6[‡›G!¸;îw†“X  ŒÆcŽ%݆1EÑ ì;bÁEbâhÐÙ½-YT*°¬šnéVÓHe˃mVeI™eB±ËtÓ5nfIPX*ÉY [a+‚Vš3™J• Ñ+¦â9”B¼ˆ`˜‹)P8@ñÅÁ¬ÙLÂã†T\K–e.»BE´ß.”R7*bÄ05@ÁQ™Jr;HtšÞŒç)YˆQÖ¬32Rd)4 iœ]gL“¨À×FîB­iŒ©”·WN™¤äM‰0k ¾,*Ã\4N9Íš‰tfh’¦Š„YŒÚ,A&õp,D KQ*i“‰Í(åƒ#Ħâ¢MÚ3ZÊ7ÅrT©”„Õ ÃJ¨h¡u02E“Z)1Ô™Yš—*‚GˆC%ï¼á”7 *>3!{ÊôTðå…˜g8šŽ*×5eÍäÍÓE*ÀEwH³ZõrHùa™³qe¦É†tìDñTº•–f^qÙ(Ðe¸4°hŠX†çØšt®:I¶VÄ•¬†´ÓmBnØ9¼ÌeQhÌÓ Ø”¥1Œ(ž˜±Pì[» aÕ5O|ëø‚•˜R¼‘Ì&B9"dèÌ rXÌ1j´`xÞ@™;yèÀÕК¤çt¾(TY´*)B(r¢ÀUE‚‹‡¤RvΈu@ÜœÀPô@5G$ì½øÄuu#â €;æÍÐdå܃@KÄ'6¥ À¤:øÁu:g´…j;I¨æZÈ7x· ´¢§päs˜i¼Ø0X ˆN†ÁbŠ[AHó`i ˆ\°Á…Ê1"$‰i¥JCR’”@Ć É{À¡Ôì”Ô䆉SpHš„8•æAïÈž7 7ÑnÔ´õ:@…o9Þ4BQ¨Ô(jiZvA¹%<Êœö8´5þù¸ Ô‰ o_{£¢'À‹{j®ÑgH~§ÙÛ¢HO4áˆx½æÓQÉäÙAQ&YB+Íñ2¼feˆc(‚\à½Fé.°ÎSDzÞae)In³f´ƒƒQ”±»¡Â™˜lÞ¦k :f­iX‚ðÁû»Mî,a(¦0Öòé⡪ ²4Z(“CKeÚÃxЖ͚o„ㆈÀxyÉWvÅ"fžÀ.e„ œtƒ,$^·uª ¨c|º¤ÃE,iiˆ"U`¢4ï fé•4Ìri•Y£Q! Ý—Áå²&ƒOY£dš `eÞTbXB¤ l‹67w{¦€´>“.4‰›^Á¨"蛜›°ŽÁŽq´Õ¡²ŸŒãB]'3\i›ÌÎm¶|†ÅÈÌú4¢'©»’îˆJ1å¤ j–ÒŽ3ÈäfB” ޲áa”Õ— I´1B”^Óf‰ Ѩ…˜“l1¹s/œ%››N_­ÍŠÌ”Ñm­Z „ÜVp±j7# ‰Q²®Íæóy\LX¹ÞÞ7ÉÍÓ*ñ7ÓÅa´©šhUÍïé!µWéõvóœ`¬èŠf'mòjŠŠØp UO–!³VwnÒ¼³‹½eÃJÆ´QâÖc´ mg”8#d7‚@»|rKb^ c°¸§(:ù¥©˜Y†¯Yƒha1:ÓÍÇ)q¾<šaF¡ä-›¢âc‘+ …oÞý§§ŽŽÌá*G¶/ ¥dædB(Ël7à±ëîrÓD*ôhX4 <ËåõkÔ0Œ:"±[EΛ,Ë Sû¥L»9ÒQE6ývÎlÛ§FëléÃɬ™dµ&uzN7k4ZÀ±SüÕuZtï >[´lwG?|Pud7¼ ’²f©Hä5™ÕÞpþ]HÏ „9#(±âh(&çL»ºàÆ*åO|\šjO‹°©@!fòòÀ µÆ7–¤]ßTݲ@»³Í3› è3)†òc$ƒ aÅÍìàÓ¶Î-xM\c% 7D‚bbí‰`¬¡ ”>ûã×7(j'¡SYw£h³K¤ß›:îòÏ|PíFWM¸†ú5€V ÎôŸ6øýï£ÕÞ*UaÚÄø‡S2Ñ¥Ýw,Óà¶r™ò™»û¡œøÁ{ÃkÖ¨¿n¦7q%ñ3)…5«uU²a¢…5åýó¼œÙËZÍ&™šhDHràô.”Q&)V1/¼ºGÒL°li+—z‚l„-2u#3¨8\wÖ»¯9ÞëdÒ> ‚L{»Ãsši1SYAas-´Ñ­XSY–ؽ¹º#8âÃhæêq˜( §<ÑËA¶ÛŽÒj%Öï:Í´ ³hR¡™ LÂï i…-7…çFKxàÙv¦(V˜8w„¢.Áˆë{wšTÅÌ1ÞRkš9ut×X¶h,•’™ ›p ¤U”½° ܵ‰@ÒÓŸ&­³–zLW› *20ç0|ž4xdàñaVsãÎ ×FødF+¢ÞÞòx¿ŽSÆ`C†y@1SwYg|q¼÷Ìç·òß»Ç%F?iÜ3ÁELµ‹÷'ÛóçäÝâ;ñuª=ûfúÿH‘ hP)B¨¨hŠ@¤”¡¥¡Q ¤‰R·‡úáîÈŸ_‚D¥•€#B3×êè7upÅk ™£ Q }1¨6 !:‚‘lãdÒ6‹AË¿âÄ&ÐYvfÍé4n™’ê® vd%5 f] ‚2’™ÉMfÍ—E%îVºB Œ"É—~ô½AkTI¦AB¸&Æ KVW1D¡bN¤8¹ßC*4[º`É6à ²dT…KªH 7K¹ÜjA­3Žr•¤Û¶4o†N(‰K– ‘*¾#„ #4ÉŽJ¨ ÒD‘v«¾lÁkYzÛ“F§)S0ÝÌÎú¡À0Y-° *HQFÉ8Øt‡âG¹ÑFg IvZƒ!¯uþÊôþ»äý¿pèù78 ³mXrÅñ¹VÄãŒ!Ä3¤`H‡To-ØþèÇçŠÑBÄS¤bD¤RŠ ¤x‡Qæ ë AÝk5 o.ShüæMäP™ ÷uôXlé=˜EÈ÷ß´±î»Æ^‚%4@ªà8PŒ$dþs”ÒMÞüŸõª»¥s³QgKHlÝ™a!æÂº™`_á1˳`Z`Yè$‘d ¼ƒÀM˜õRKE"=H‰¹AMʉ¦0ŠP‚d4  ÐD*4ˆRd”¸ÊJ… ¹&A˜á$I™F.FRbд INC’´ÒJPÄ,J%"Ðc Sl Q˜,´«bÚÁŠÔèpü–ꬂ‹ Ir•˜ríQ1²9®0d²`„£b©À¦ÐÑÒ6·IþáøÍþˆ~lͼO¼hýD* dOžþzý]4Žïôrbõ®M²yå9âÃh<„½*ê(˜d¸”¹`tÌCD ¤9@Ь?^=hƹ¿Nù^°B5:tÜÛ‘ÞžlŠR&%2À…%’hJ3 *&‚©¢b"J™$5†!@D6›‚…EX‚3rH`aÌ’±ÀâP}À9*Ž·‡¶.ˆ("”†"®; ‘ H cº  Ÿ1VÆY…BœžlÚ @õÉœÙ*0¦ÇJ!ŒìCZ6Ê!²|ÿNѪàâ2‡’sfµ=j"hJ¡ª))e„)h š ¨ ‰¢"T¨)ÜkYTP†AANV@Ò35$¢ÅjJV˜Ü ‘ƒUl‚‰ˆ¢µ‰ƒ10M1RÉA+1RÐj ² „(™!¢ˆbJDd…ˆ (!—Œ)!*( ,F"¨ÔOe¦*)&%a¡˜Ìa§RÙYŒ ¥%bÈV @˘XÂì³ &Ì !(¡Þc½ç<Âd/2­!”ÈRRº0ÀÞPÅa_ýü¡ÛHÍ `b'XíŠGd1.oX¢-&£áÚ™H[,¨XÃ|¹™˜`ë ÃY&0¦CñMlÓÆs5ã+Z¨2b£QÃIĆæ¥Ô¨d  Hm0Æ]–Ðé h.hшDД2 ÌF01J€cC Zá¡ )SQQÚ¨ÆCl&ÄçPKM3ŠQÐj¸¹©†‚ nžNWLÊ®Ýc;Ö&ȉ§%Àƒ1ÞFs{ÙË®w¥"˜jÐã# rCÛÇTцõšVƳ„ß•Qtm%8Ø]›l£XÎsz9qãynps4jÆŽÉ9Â+BÂ&r޵&‰xnîÆAÔ Tˆ]fX¡ ±j…C ê‹D¨¶„y—"Ä9¡ZÉX#" ¢‚–•X'‹(D­^PÐꯆqUÖBÝëA¶*ªê–-Î5¢.ÑhÈí¢l²²¥ŒX¢–•5¬0þ¬¢ (zhª vÃË%>R‘5gxË,n²œ;Iê—NŒufÐþ©® »ÿÕj€e‚wî]“aÜíAw)©Ã ì'hm¦Ù¹„ ‹Üæa1€Ò`èÑmš `1,“‚¤ã˜¬µL/ë9ë£:0rÐÖû4¿Ï[ †?×x=ÈÞ¾8Ñoqñ·Š8íz0m¹Y¤s·ii‚‹ÈY1øO­¼Ÿ¼?J À8pQ+J&Ë>]©?®q¶“X½9÷Ý[‰Q‚LÀ1oä"É'É:9j\L^1€¦ÚKüÙ’:§¹Naa´x­ÉoãXxj%5@HL5úƒ{×ë<(ç»È£¡›ØH,œŠp3^/8@Ǻ:É00 R šþ=,˜Ãñà:Jj ˆ` Ø›wÖ—±DtÖÚBìFVÖGƒöZ‹ÍÑF%fn¥ÂÝ*ÓÇVTˉ&î‘¢‰Â&{¨¬€@m)K$¹ ¨bK͈ÉózRAv0QS#ªˆ†á˜¥¡@(|]Mãß¶yâk¸ª…hžópð“PJ\”1îÉ1ˆV0Û1$Ã8*à¾;tôЀÐ*Có(ä#@ G¬PÉi¢• ¥ r–KQw3Läx{Âãÿs'lÚiT)̨©’a˜L‘”\î0V"™Øí…(у¼s\ÔK€¾öÀj7X(¬h¨šNˆ•òþY@æ¥lÐ Bð‰€›ãAû“äÒ¼\ ­…MÕ!»¬U*i(ãš-i”Á…(‹D ŒØÜ-¥!DŠ,ÐH (L„D˰Ð`Èf ”QI2 ))" wcR“F¦…ÌVÌÊ\!)d+ —e,Ó2¤©*n„¬…A „G%-…‹$•)²Ö¶K-tšúJÉþáCe@¦I|Ï¿ xiß]ënwvÜ'æÁ{m؉_šàÓŽÝuÇhì(ÃëÆã¼DînscÝ4B<&¼Ÿ?o*ÑØl3Ì#‚DDAE†3ëƘ*_ÝojÆ#”¼°õyýù²ëaæ«‚ÎðJ©J’ˉõÌ;vå c›Ö¬ 2”¬D*¢¤i†Z4X A ¨U¶Q»o (ÅÝ»d£ l$LÁ ‹`ª ˆ ª"ˆb§8Ók‰•јÑQBDÂ-Ha-¤µJË "-äøÐMí;Ùg{§ÉÁ°gG¸7‹ ¾•aR¼E½zÆG´0ïp¶£j|öxƒ††øÓˆ"*UL `©ì•…·*ä²f#„bJw bR£,$ÝÀÐÊ&÷])toZ4©Òdó("'!¤”i*i²c,7l1£w¼+"d…kXTïAJÉfUç)—X4¦Y†ÍÄÀÓs,Ö¦²‘†®&Šæ`\ E«–JˆSˆ  °G„¥v£!¶C†p˜œ0•$1ÊÖË”¶ˆ¥JDÔŽ™ ä”j“X)¦ÅÀ •(»AØ3vˆ³¡­™Û(‹&’iÈÀN&Q“2ŠrÁà™lÛCïœì#o¶Ïd5¶  8 p¤’ÒÆ‹LÉŒíÖ´C4, 8)¥LsVÁÇìÐÂs@ðêòj“i ˆqЮadP€Ž‡Fû„YlwÆ)‚”¡§›˜V äLm æ0¥ƒ8Ìȇ†3YœNC –ó ¼©›*ÐÊZÐŽ…¤Ä ÈèGE!0W.†4a«­)2•˜8æ*JL²¸âÓZÔªB¨¦™ƒ5‚`Ž%°rêã2 e :ÆÌŸ‡r…»Tª ª" !H¹4J²c.c0˜Ì@Ðã#jÉsY£Tu“5”DÔRÖÊVˆëRɬµuMeL²bÛYFe¢çó£ê‚Ù«[2MåÑJ[–Í ä4ë!A˜*æS4:† ¨4 aUËÓ4fJ&o ,K7iÖæÍ“B¥!“¶D)‰PÜÌ©¤È4@Ì !A& ¨ã¦RRc‹uLͪÒÜe @©†0DpGVf e𢠥vâ.òG 2‰iMØD°Þ`¡·6„„›Gn 1Š™.%ŠA-0EDÀbïá»Æ,¨.ná JRäÃZ¡¡‘ut,þ6ctfÆ¥J>˜WW\TK¢‘Ì+‹d¬MåU1 ¶S!B).Û£‹0›Ke‹,´Ç5u«4ÌJQÖsuŠ”´å8tm'š 8‚fWh0 ¬”…tÏC´Øz!’ €ËÕÄ›ƒa@†ÉÍèÑ*RÓT”©½„ @Ü "dFF+S;ј9‚j” @d¿‰áÐ`sÄ@4”ÒZÈ\&”I†„( ˜’‘bš&©‰ ²ŒÌÈ‚r€hRd£BêU¤¨r)2Z2S||úunUüõïÔ99ã¸üÿIŠßþ9œñzNÄÏ lÊG3F’› Š-FXZ¬£æ¬‚8.2ë$rê—LZ¥m÷BÆi2â,a”‰@TÛüf¤1²XVVR” ÜÞ³%¥¬usIt—¯‰.õ>dþ†zâÔêH8ðîæÂ^xƦFâ)~p< l€ÄÀý@äMÁñP9¼B ¤@Ó$†qi¤š3ç qÏ|Wª³„Xeç ØÉ÷1/4ñ®Sg#ÎÓkt̯=1kè­¾~ê¿ó—øÿÄ©?›¡Ôl‡Lë-·]Fá4k(…Œ/WGþ58ÊèÿN,út(,¨vÃçîS™·xaÖ¬¶UÉëÃ$1OzòÍøLñmâIùH(C¤ìì¾zÆt˜yšÌ´ Û[álˆ ƒk†×  BÍN ‚ºº0G0,ô"£€ó<"žSœ9Lq¢yÏð×µNºµãT¸4­ëíì;˜RûÏ:ÇMM)èÓ dG…Œ.¬³ ’¿é­;}=Ý‹7&PèïÁ‡j* ¡Õ•*)«˜ ¬& Î3Z¨½Þž÷¹Ã¥M!x»ç DÖ†Œ’âðÔE€²m"×!nоYÒÑÞ"Ã!6– d[ {B'çê®êÀ=ÅØÃ´yzŸ[ûØGÔ ¦9qHT S¶n`xË . @ü;ŒŠj|0ñbcà ›“áäßK±,ÖñMö6ç§zyÏÁeO¤¸xÂL<„ÅCY`vÃj'Î)­—Ié Š Å!|ìÈrÅ!á0Žšì¶Ÿ®0 ³`3–µnãY¹=Ðö‡,›g~Y'iÓ a¶bø½¦Òmé•ô—)Û8HÝô†™>©Ó/àNÒr‹<¸Ï=Xxl÷Æç 1ö¨&üò™ÊNý\©RVÿ‹r‡'ÓžŽ»àæø¼ôzÍk€ï‹Õö—”=U™ôyÂcMmÕ|á+·k-`lEBWh½à}s6ÈþzÆv©¯#ëÏMpê×âé“Ö)ºwüÀÌAÏø"3a”iòâ¡xGPšý«è8ÉF!ø£p»U?<Žhä ÅÕP‰Í„ª‘’Ü[Vþüä‡jžÙXýJ†@jÆ€] pŽ”‚…´ÍÕrbÏŒrËCŽÛ7®Ô& ˜Ì ‡˜êê.Ò÷âôÍ3o„‡Ä?ŸªzŒOyÕWí<ç¶@§Õüõä­0Åáÿõ‘zà„Qá1$YQï&ÕÍ»QðáLªÎ7¬~±íØÃuøðSŠ{«[€Oðw Y²pp¾ñØ—¤Å35­dï#€7.бµûçýËôÈ’(d}#Ø×&Å,ó±°CîËÊç¾1¿óψ{`Ÿ¸™§Me³pïªb%]¸Í‚!©Ç­Yßs­ ‚˃׀ߕ a¤G÷Ea®óÃþ‚ÿj9âùÓv_Y9‹Í1Óëm‡÷-æ’I;ÿª}2úi?¦l@Ö¥~+Ö|ýrgªP5ëøÖƒw‡>:$”‡Œó Só B–ÐPQ¤ Ûõs!)X!VDj™\§Í+wÝ;'à¥ïã U®è?áð%hU,…ö·ÑˆN]sË1¸­©E–ñ¶;áȹÝ-Ðä1ÈY\|ÀÎaü oIOòTõž¾0gú}ð臑CÀù:Îx9šíBÔ=îGÄþ6¦Çà¥ú¹EJˆn?UpÝ]ñlðQA®‹|à§ SÊœs½»$£Q•;^ ˜o &’MëZÔ6ÀÒ–Ê)­´<Ê™~ PĈ`ÑŒ‰ÌUoUéʱ‚!×£Û`õ£^‹ŽLõÑɱÿzTWxH©ýƒLUvíoŸä2¹ïw|ö÷^gž¿r0ô‡pñØ'Qhª¤ÚÜžYƒÆ{ñ°5¥LsÑÁ£±$XDõd÷òZJ2Ú]CúÕg›-=ài‹ jÔ '¶ŒÃõiø·–îÓiW\|m²¶=˜i|‚ˆ5¥Dí©Þ!Í`h¹Ù×TÓ&áê$‡?P…~1jO‰±1ª0™ž½÷}† ñÁ‘í¿F½ÕÆvG.šjñµB³Ç³£ë„xeßç‹O\ÊK‘L?w¿ß„R÷ðòe|¿ .üýÍÏù¼ô"wNï±ÿ¡ ¨„(iÐUÏË¡fÏv11ÍyÌÍî ŒþO¯×g¡Ý—ðù5C&ÓB¢ƒæ3€Å—¯í”’Lk6b¥ÚÍÜX—ù†ªÉe h6 >@HZÐöÃQáÃÜ|%à þ¬†¾gmá´R{OàËß²£ÔãÂ>ù@‹ð¥üq=ªêHÆ èá7\>BBC¦j­DOжð=¢'h#P­x8mR§P;n¢/´!Ýù#|“}„é`>{õ½jrܨd Ðd²ÅWœ\§oÏ?;DðIÿVã×YÔî9Ëø… üD¤m;‰?Û×H¡šúÊ7åÂHÎÛ—áÝ+6 u˜d¹*®A’^ÀäüoP\m\X£Ï°SäÊh#°&ŽÛ½ìG &ÃüJÜÛæãÅV6@s•UTîùV´0ˆtVOcƒ iÁl cæÃ · Ì<ïýÙüEÔ\EqÍ]·¸s¬í+“¸¥v}ÏVŠÍç¸Ô•¨²±+RÛ+Xwo9˜å¥UˆVŒ†šÔZ¢Ô•‘f-`¢ ˆ±S‹(*¤XZ`¤R$ECbujsj*Ã-ŒW¦˜]4©^iX€œZå¶Øqhqh j-­µË*( ƒ“Ê !(ƒVÃt¢2¢pQ §òrÎûüªê¬V¢ kç|sëx!Å„´ÒN•ùR¸·\Òb(¾‘C{ËíòÎtqeа;|îž«leæËo—Ÿ4ŸÞ¬w¼x§)ˆvf*¡²×iPå+¤ÞSmÆ\W¦OïASt£«Rz}&"‘õêäæÕ¶Ãû醸-•…:w­rs¿ç(xv†ì°FV)[ÌNP£ͱâÝÓ^IÃ%cªp b§àT©Ò¡\Cf/.E‹=\|h)–B³¦õ«‡å4é‡Ví£å+´º¡XIÊJ%?Êœ¢Oƒu7ÎnJ9º€¨;’¾pøœ”â'R§RôA¹ c•Hdç»<„žyÂçÆ‘ñBÐ:¸'„“®ÖQÁ*”’ÙO¼çQŠ E"åÏ&N¥Ü1½Š—RCú°£-m ¤„!ŠÌL9Q:|i•5TXe…Y(Ø¥¢Cœti£YßNL…xÞÜÛ¸5èÇÎÓ‘¬r', Hþ0Á<Á¼lòé&…dgvŠw˜gmx-2ÊB°xµ$Åè:‡d.¦)•˜‚–•(¡ ¥21¢•8Á"8…-Èš‘4T©¹0• B!Ô‹f 9}0¡º’%2Ôº¥‘ç0ÝI¹ÉPÔ¤Ò4 CâȤ& Ñ -T*R(d£=ðZÄdŸ«ÔºûŒaJ¥Ž ;0Q¸P˜H¡B Hs"ä"R Q”¿ŒÞ²šþ äÕy[!/}lÀI+ÒVŠ"II"¢Œ!„3ÓBþÑ-Õº XÝ_ˉ”ª÷›ÀY8w•T?{q€…kí"ÈÑ”‰sÚÃYö‡qtVÑk*4ü¸"8<á8Ë¢òçí?{Ó`¥ž3@Ãô×e‹ÛŸ—Oá=&Ø¿˜Ë ªdRãH&Íl[ Xò~m÷ þëP7TÙ"! ÷UdÕ KÇ¢ò|uàç…NÿÝ’þ½qBWn·È¨pÉ·çòpÜGz ¶&+ˆpÞ¦Žû8?_£—çDh‚‰ ªƒ" H ?ŸAd½ß|¿5Ê•ü y }¯Ï4ÑÁt!Bˆ<ÈT•"àHH Ã¬4DüM¯Ñ¡ôùŸhÞyw¸QÈ|ÉÔ6¿Ú6B|E¦Hpÿ(Á„ÒvÕ?)¯)^8åЬYÐg7-†”º‹D¶ÙQ¦˜`å­{qí1.X/é 'õxpäs€ÌM•(´Ñ‹(çöÕTÛû ìø6Ày0u»ÚÍä6u~Ÿ)+§Ô³ló»X‚Úå§ï{þ5D}€Ì˜À´K†y}À‰ë½‡ƒsÉüï‡ï·Ñ°ðþ;™q©ùdˆþƒï¯ŽÇ_¸Ÿ±¡äû“ d܃Œ#·Ï° 8 6Zk€Üï³°0ˆH žƒ')½RˆÆ+üC©É(*T¬ Jqœ94…EáÑ LºÎ·“_½® > åÀÅOV|E‘ê! ¬v V"F… “ü4R/×èù¦ñÞ Li©@<‹!<½ÍôYžò4H‘C¸FŒGã‡×ÌÚˆr4b½60!Ž™(ÁT¬3 Üm; ö~¤$t@ÌØéÏëì¯Áœ.¤1ÓèAÔ-ß)ÏúBñ"ºC –!R«óÂDPá&LBì¨*Ì@0„™ Bƒì×þIÛ7Æú`.“}ÊáLD²J¦î”“f0ÕÝ Š¯€^ñ ´¢äg×çJœu¥‰î=!)Àœ)ÏoÀXqº"v†ÐT(ØW`½ù‰ÌV IŠ«—[løä´ï÷ÐcÑSÏ|%¾âˆFàýF?ãHë§%¦LûÉü†Š›h¤ýÒÅX%æ9.6ñ¢P° eÂb•_&W Èò$8 wª˜Š"¢ŒÊƒ z$wÏ>`ûáäA?Ù8¯ r~´m©&}}ž]sçO9죀ÒL°~¿Žõí¶ûEÎp–]ïú 0íû6ÚÏη/$lf~· 3W NžÇ½®39üñ’úÐK³ $* F0垤#Uœ±ã l”κ~ö1¡· UÙv;²Ð)w|øõË×!tgË9ã2?²Òh2¨i¬†«‹ˆWX´Ô @P °ŽÏ§;súü±ËùoòkMеÏÒÑõØ8Á:w§Â´|ã³ ÞÝ Òö€R—‰QÂhT¢dÞ Qx?½AÅudæ%-|ƒBýqÙ}o<õȇ²÷€‘µ.¬: bZuIbeáÇ-EÞõÎãßýBÝb<„Ûó6Pq¸>=ýæ»Èö­ =„£ÖSÐûUóÛ·dy?%°”¯ ð‡žÀôòÇì“Ú! DàO{/­«X£\>ƒÉƒ‡m©w×òÿhø’T1~Ø ” $ùÄ ‚š$2\0IHw±œ†ÇÆ; (`Ø9ˆV?šXz~z;¾ŒV@ÕmZØŠ U`I  ²?O™P~&€ø€.œ2S£@/ B‰x[ç~´&V"ÙFøW}ñדS\Í»™?Ñ'æÔ'Üä´ñ9?©=wñê1ù0Ø|=×ô‰Q LUI@$„@Á!A$„1BÔ?¹2H8° )„ ‚š™ €HG‚&' ì~DÜ… P*"U"$Q@$B+ -¾JZcƒiRÏ×ã°r ³ÎìxcÒš€qÅçÂoñßêb‚JÜŒgð¤»HèÏó/²,“ðúùÛZÅ"!§û1ÎuŠ®/_êºüŽÄx… VÂ[.UK,5&0Xü?£³GòÌOŒ¥×úúSëï.—œø´ú0j ‘îÙIQCüB4`½½|÷j b¢È?a‘}hõgpçã³PôþÐyŸv7ÄçìÂ9U òR)Ëx"Oól§ï'éþ¥Á<&i".«Båt©Ø–"¾K3A¹Î^\`ÜÁÙðD&Ë€Úî¿sìñt o–¡¿‹¶>·†þ}W ÊÒ›“ý¦wxÎäîçü@ëøþÿŸ½“")ËEV ˆâQDE?× YN§ø•"1,ô‰M»ýgÁÁE{4xú•+×»¯/·çt;“jÒ¿}úÝ17ô¾Løz{@>MÇK<µÇψWƒ¯>ŽÓÕ»@¸Žú§Qw×Xt®èATe~¼ó©ç_ñK|Ø/M¥:Þ¸7ÛÔ_£ƒÇ÷Ýù–©So§XU>"–O »¼Ž…ôi%¨XZMÒ{ð›5ìU 2N¡a[.›håoò•Ä!F(ð! ‚9‚$P †ÎÙWî­c–Q€ÌzÚ¡,/É‹0XPÊ;íè÷Ý{¢ŸÐïÁRà qÆÜ†}vÄFb„!÷“ÎÍX@! ² EhJ)¡ Aˆ "V‚*Š®9|þ€;ƒù„Ù›-u²)"©…:«dlNK‡Ø üÁ |ÐRŹb9¬ChxÄiÅÑPÛ||oéú™WÈ»koí9»ÜÉ”‡ÇnÄ$=("àPã^{gó‰]ˆÁ{@ ¦]hw4;BëMsC)€DeÁjÃvé\lÌ7…õÀ~˜Ò„èM¼«Â1@I#œ¼d8K2ëx3Ý¥9(»H8Ý ¬?“Ì"žûux„¢•,B¢Âõe'"Ïó2~CPìuçœý®!о#~D˜Q$HŠ€ˆ)HˆÈpš‰"—.§Ýøük—”—‹… ú¨n½>èäçï4m's½BzõìÔÆ­Ejaäªeð‡¸6ÜË{Q‡â Þ”‘vˆWùOÞ ˜­§{+j£\ï{Â@X óBïN°`ÈryÁ®ƒOp=y’#4=þ3ùýÀ!'öþÂŤ &±¢`Òù"pß]e2­¦wLѢ̯>}çž`W„!e4B²ÃôpÿÈÅ„9ذqJÿK)[" !IÊYWö ùÎÜ™™­¦&a<§lÊ\Mõn¼Xv†/ ª¡‚VNÐÆ¥_4£3Y ¥dyÿżzãž¶[üzjÅiEP% ®GíPÍÕS÷.ùZ “o£,›ýïÛ—·Ç‘©þª£TÖ @ÒT1 d™i±œÇ5¸N ˆGWà!TòNã»vJK!Þïê¾ùîmŽ%J¹|V¯A!úÐ8Êî J6[a?磓­¼B€¶>MÖº1R´÷L|ZvPÐj!æ°å9ŠÈ"m¸k˜p0Þý˜ÐA¡RRÒ4¡V:MKpóbul䔲¨-šä­¥æ?­ s2»èƒ6 àÍ 8|®¬iε’§ö…aÁtüÌ%°É‘´(«òqª+I5…AdVC=¶ ¨6!ž”5ŒI±ðf´¹HxhÍ@ u951Çø¡sÅÈ Â x_(‰ì¹Òº|Ù&™ mÏøÿÀ£¸?Ÿ_…ÚëKk}s hÏÙï¦ý‡Ù¤Ÿ¦À–ŸÅý$Òzæ›—ðO¯b"Ø–&É)N¿Ÿ¤ÖŠ3éàÊ]XNÀÜ,£´ÆtOœ¨…å)ÞßàdÜ9c# ¢ŠØå$ÈXþC;ø•>@Sù –¦?ß-`a€˜¦"c™>Ûqo Fdh*¢¥ˆ¦* ª ª(¦‚"ˆZ¥ˆ ª¡(€  HA­b•òI¦xÒCŽvçÓ}˜jö • ÄK†e+n8¿€7UÜ×à×Xl&Í#pbžwØpm™»Ö];-ðkƒ|ž z“p1,QvW!zó3}ÎÃÒäÐã´ÇŽxêv¿/D#!ª%Qþ©(¹)(}ú{Úž9ÑAÍ–`óïø“ZÙÐ:àÃÞwL!$T±ªX>‹dK >$Z„4JÓ6vRœdX›©;P:]ûMýXYׂfÉ^R0*"ƒ _Œ1˜‹oëTÑIN0,e/¿.|–Ø[”¸‹¶Õ¦rÀŒF+8Mü.v©H(åÈÍ«ØèÞ¼%DH‘, CÇZ8hbcEU6)„guñ2SLªú•’í˜@Þ0ü0í=¦Ü¥XNüMeA 3CIAt×—zØFz´ÒÆ$Â>‚d³ —N$¬-¥K–›£·ë{.ÙªÁKHåC²]e†VG*ð ¬ñÊå‘™†e†g$ÕSRWxž„Ebó×öAbžaø¦œUbò°˜º-z8CÿÁA2Ú!×zï„_A<]~ã ¸w;¦Ó±_Xèˆ3óõ‘±ÔyÖ«9§s ÊàÛúö;ü’¡Þ(Ñ©>Ha”F¤Š)F’’O4ÃA™â¶êþpÇ9þyÔ1š ëÖ¢`KsQÀ¡]Š\æ§6£§x|¯cíþ>Ë··¸fŠÿfhÇÖ €`¾¡YŸXÑ“jS¹¾4º‹G©#6ÓO&Ö<˜v!.\]aCkæ^£7枥} ÑËC¼0ÜÆð];Àbƒ%/d½Ë×sD`êÃÑXT„!B*Ö AF!÷]K–WõÔ Á…ÓI2P¥*!A$"ë Ë•¶vƒ€ŠEQÊT‰iGª¯Ÿšz½­µ#¶@ýk¦X„œÆÀÛjÒ¡™›¥Â&êþfç†Bt‘,µD`Ñ÷mþa|ÿgÄŠ&bB“•ÌÂ,¯òÿVefa¢Þµ£Z¶ ðÊ‘$¥¨ÍiÃ0ˆƒôé$¥ÞÅÜ;¼5ìŽTTDD3UH§òo[Z3É¥(322›i†€æ ÓF… †ìyç÷™úOód¯Š"B„mÊ2чA_]YH|%G[¬q¡£Ñ÷xâxÉÇ)™tÆ„ç² D‚ÌÙÏãÁ%BŠ£%%)}ýÌеZåFœ&D˜OfS| §âeÏCk;:`ÀÁ·²ï®Ï‚l‰aŒnj,í<ÿ¯&´ë=Ò,:>Ì À‹+%Jo¾‚<Àá.¶W…îsÊûoÝ:FfëmÉF¹€ÉEðñ¨˜®Bƒm§ÓÁ/Žáž Œ?HAE"Rm*ÁÇ“Y†à¥ˆÜ+¹§$GR%Vˆ›È˜Ë  ‡s¶Ñ"›ÎM"lˆ•Üj22Ì5@Ä1ÍX®]&3“bV’i0@4Ák*ÚH# @Õ°¬&2ެ¬"" ¢ U€!¹ÉûBñe©*ŠGQ»RkœÑ)›Âb˜’š)B-´‚h£ˆ!ªRc!–¬&( ÐÈVIÿ"]_ÀšÝíÎl©£Y’¥å¸s˜cŠ‚q½âÍ iÇXWœáã4"æ¸ÀIJ6™Ñ Ó)Œ6½jëw·ƒhŽ˜¦m++!È‚ÄL”ˆzUKj(,ˆ1 Â+ƒ‰(‚•*LE jÒ1eÊÆEY5©rʤVÒF5¡²¥‚›§§p ¤ÿI-¢çRuበCD9:¨Yˆ°–k0£+ *`¡FL´Ôšã&Ç´—‹&ÒshcŒ*ªc Æ`9göÔÆ±ÕÃ*(ÉTeM¥EaŽ/T4‡,c!ý3"¼Œ¡ˆzLqó–cŒ©ž¬¬b 8^»ÉЇ †2–†¢ c !m‚$.îÃ4ç§þ5f÷ÆÓ^©P6ŒA¤fÕ”®[Û‚)£3 GtŠýïÆ¤Ò±år´±…X¦D  ’Ñ›I¸6’,Øî—ÀláÎ+b‹mÞ³//)„I+XQ'\Øh‹\fe¬.Sˆ_6†Ð Ö-EKl…vÖCy™¢ÒáPÓ»qÛ/݇±PhPb`àÿoëN¤¤J9ÌÔ|a`žLã+£w€úÍå9¢ý Ÿó±ñ6ò [´¶Þý>¼»3 iˆôÆ´APDD„E«&*a˜(¢bBÌÈ a©"HsZ­(„BR"R”‹B¥"¥ H"¥ - E (¥ %2¥+HÄ£H ” !F¦TÀRR†”µidb` ˆ "ZT¤J*‘ÈÀ ¨Šf¡OGˆØóž /·Ëôd¼<ù¯ ööîwÿZ.èÿc­Ëì0>OiØ<§x‚§nЬ—Y|›ÜYx»T$1mö-hàmÄk¸f xÓ”…ÅÖ]#U4¡—æ…{ð#Ìç€î.9î§tœt¤BƒÇ=$Ɉ6¯³Š‰$Õ|«õ’Îw÷«¤àÐõó´á@Ø,Ü€S°0„.‰îê »S#èïã!Ü8 888òlô]¡»È Ö-ñô¼ƒiïh/ùbTJ¬õR 2Ha,;”\ì½)ýûŠHtêgÛñ†(–(crjÚ–¥Ý "å"ÝáPlƒ " ’¹f-¨ýï…nŽCBPu#“C,LE+J1FfL ¼-h°HÂRÃ*1lý°1Ö¬ÆYÑ”Š&Çnš¡±Ã @ ÔŠÏÅœI½&'Ù­³T:Â`ÌÅ"h¦¢ªfF”(‰ÂÊ`¢Kvê2…RŠX*$)EeeF Va*%µªÒŒ•´¥ˆÂ¤ ˆÈâ-GÿE)¯ÖLˆ¨ÄÅ«(Ö´Jˆ´¦-Y˜1DC\FTTEKJ‚F ¤B…; ŽRY¦ëz,Åu ­bé•Ñ)¨cQ– „)†t†*aK*cB–mÄùgå†zËfMŸá¸v†Ù°KÇe 1 °6a³_Ñ\&'Ž7:Ñ/wŒD¥2ÓmÈñ“i™D ÄLZ&.‰eq„þm† §ËtS”؆yƒ°r¥SU¢•¬êvuÄš@xE嬉âÎSk«,¥ë ̸җ,2öÍ oWvÓr Ì7Lé 5 ÍÃi¯¼:¾­ó³^e €_©x€9þJCmwïZÉ€(æ @ wC Î“0ýîtyÙy ŸÇgÎOM'¯Í€—+Tš!+/s&3¿%VŽmÛ“eU9"…öe •cÀoú¡n?ˆÄ,÷¢‘ŸŽöh6€Ç`¢„%Lï;Þùä{§tL=džU=>Ï%È€QQBˆ÷q÷ïȾ×ãɤæäÀú} 9G¤üÂ'3’ ¼šôaöä•U `P㿺½ø²4­P¯µS÷Ú8zž>”‘¬)kl-]yò‹$ûd‡“ò> ã©ÚX‚%HXŒû2Êe¶ŒÊHe ³Ðy«ë¤õ }Lš@ïÝÐþ{ìñàÏ)3Mgë¶/cšà¿Œß18­€6„±¾ÒEBÏ~ÎÎiyÝL5¿Çc³¬É ²ÜlØ%ãã©2úó“RîÐÆŠÌ¥!·g]ÓEÏ,Èí• £Çw%‡@ž¹ÙY…+rÏG­x>‘<ïßýXxáÊR6&;n¤:sE½ð_xËðü;ObŸó‡#Q•‘£Õ¡Z Ê[mWHÓ€ÒP R"þ!CQ¹MÊx…È«[AÂlrB–„²Âê캡lŠ\УknV béRéJ¶…‡‚ó ‡'ᾬLÞ YwÙÖ‚ "”*а'à Ø?Œ† |a62(4 "!tféu5¬œkˆ»-w&àÃ(VQ‚Š«i$çÖWÆÆ×£aÀo±R÷Êz2Ÿ2ƒˆx ªPrATüF  Ø‘Î×ÁGÁ~l¿FË Ý¶ZÀ€¤„+€Ò¨Ö*MLÆ<œêNœBÕ§w½F×'ï|ldþ猙"Œ´‹¹¤yç«9‡àñæ>0$ ’H}PÕRT‹¾\~·Ž'òñ›,ÀŒQ2Á°Ä “ È—tÃF·¬ú¦˜‚ª Ý»ýÒladžÈDZˆ5ˆ_H¡"{Çwç}•qÓ øRÂ(@A‹Iš´´(Û ŒSwXW¾_8îGŸÒ˜<˜2V'p‚Ø 0zîîuÏ;ÿ?@bsÁµ}0ø;{úó²œø…ŠZùùòØnÇbž\ó³ÍU#ÜØíÕuÚ2@Ðx'RÌ…¨Íž¡ìïN€V ïg@õÉØÛF˜êøŽßc¸Þ9›1;%)%êé;(÷`„¾;Èx¼>5£Q¾ÁârI”˜è `/<Ø«¿  ðŸ† V¦2Ž-Gƒ…<†íÅ;D ™Ï;R§óò!½aÒœÏèè(¢ìwÁå,uyïÛõëu=ðVÕÐ\Oä‰z÷¼©ÞFZÈ ATލ”Ô­9j )rí£NH ôEìòiû~e¦&¦e$ ü@û`Ó$´Ä•‚IjÂŒ°›¶d1IšS õáGà‰¢&¢úÀʉ"(b¥Zb̪j³0  ed0&´¸4@P (T!AÃP’KT”1DÒ´!–SE$’H²õ¬ ¦$º(@¢@Ô†¨ŠÑ9m™‚ƒP¬ýåõj@Ð &Á#„ 1’Ää®ýåñÖA¡ÒY„Ë  !iÂqP&Ѥ15Q‚#šÐ¼0E7i…Ú4Q¶%ÔˆFŽJDL1MPU„°DA4LÒ¡$©HÆØC3^$ti"pÌ‚" Ö„2ˆARªt ‚°®"éÖ0PTÔÁ©Ä±M†Ì(VØ[`Ze¥)P™™HÕ “Ò`Å(d©P$£- …a«Dýé°Ôc†BÇ7J 1D÷îìËJ”À¢fˉ.š£4Á:BŠ’L‘qÓk£` „ ŒC¶H¨@`”.ÂP:dœ °›Ñ„!ïe 늌:`N„$ÀB.ï¼9q&÷Ý; ÖæaR¡ˆª<ë1:»:Œfk¨Çbæv>·÷ý{Áÿ^³"-,Ÿ¬ˆ?Çß(0ÒCfðX‰HÒÇ>&­€GüÉY”ô$%@¤Ê”ªîšêŽfÆËJtc Bc “@µ#RP¿Íž®´fÈbV æ“²å³ÅŸ€S]¶û0¹Ràt¿Fæˆq²éœž+ƒ”0|D)rüð{œf« /IÚ~ IË(L…YDP8 çúnÆ›_¸èÍIˆ‡‘441 ¯Õê–“E•­hX ÓÄuq±­£^§’ŽÇy¾‡ÆÎ•Úeƒ´QͽC£ÑH(|‘~TŸŽÆÿUæ³y¨Kñê‚MGZÐ µìÈ© @& + ß]m7¢É ä p"(A(PP.VÉ#¥ƒ3X˜adÑ2ºeœ" *I ¦˜–€Š°2Ü$ Ê5‹án +#Œ99SE’”+ù1ÁÔ™„¹^ì™ï(Ž¥R”Z(FŠPûƒ›p;€¡ÈÈ?µHÕSBÑE#CQ¸Ë>ñ HDÒ”HD”…RÑ”w‘27d3 ™…ÞȃP¯RêB Â&<é7*¾£&¢SNóA/ˆDÙ¥Ä"ãNC‰ lè²(Zh"E ”…‚„5 CQ¬ätH‚´ j5" º… AÔÎ(&jw"ê_s`†­QDEl1ÇFJˆHÄ7J@¤`:lËIZ¨Tª „)’ËÒ!jÇY‰e@•B²ˆF¥–!Y'=Ý ³´¬Úd©Y‘Š(iHV XTid$m(T«pif@¶ÂuJ*H±ˆEÊJ1Ý €)ÄÆC"†rS! !R€ä‰H¦±H b‰¨¡ F)R*®(Q¨Y¦d€¡mTB#°NŠŠ9’b“›²*-2òÃé£\»Â‰l¸]ºEu,¥%)AÌè(3aA€1(("R‹Pú‡_÷ìãÛFRÏŠ¦ŸÞõ…é |@šžvî͆;Ù@gf*÷Ÿƒ¦ZÎ_Åæ:½œõKØÌ¥d+ÁYUQ‚¥5fŸÄI;ÎGR_&`‰DR JJ ö… ïñHl@¬Ø†‡J2a‚c$¶‚…c¸BÏǸ À 6œ8.ô2¡5jTÊFc‚ FŒ5!Ê_Ò ³³/Tu«à†°‚?+Idjå „Ñ.Ò6fÁØog[ªiÖ×+iÇÃeÎ5 áµ Æ;´bð›Â‹+fýeV1NJˆ$W{Ù¢ Dà…ƒ½É»' —u·Z¸3 vã•«bÉ£ EAXP.,ª¦¢`+…)DS8ÃÖ]‰¹$:Ä;Ÿ m÷ƒÖÈi9¾áèä¹'OÈ{7 £è )ˆ|­B3kçÇÉõ£ãÑ™ <ƒZã[c mGh â‚lrS:o&ud1‡7¿Éç£cø/kƳ§_¦HÝøO EµÒJH¤…ñ…vÀA·¥ÖëBïŸóæo—HO 5—ªë1Õ(¤ ‡Ó§°V*¬[j¿]˜øñÇÌ6ð¼é1 eø'¥¨G;U^ q®›Â+pž’+LÌxu@‘ÁC…§–ÚÌ9ÐÕ9˜8!ÑÉ7¢i²ÛÍ…Ó¨ñ5¤Õ²pÁ| QCN÷m¢™[BÍð´hÑ21,ì‚IR¢Úª 2˜ &bŽn믚Ñã[Ðf­¹QfjÝ5«åsD@­Ë"yLr6µ‹¬Ñ¸VZy¸dÖA³‡VÃCã=Œá¶1¶'AGkGàÔ±Ã%sÒ²8+ã–U®ç¬*Î!rñŒ#2ø™{¿>—³­s<ÙH5’@¤-I­YÖ  |Ú2úÑqã§M8ï͆§íØÞ-šŠÈl‚­»#dý$ù= ¾%ˆ)g˜Ï0!ÄX”ò÷byì=ø/“’¬ËgÄ® Ú#&’ $Àˆ"¢‡M¾²9yñw \6uÇ’kËsËLf¢ê†}ùiœóë|¯•š¨OUÃñ”„ÓÙ^'vˆµÛTá`‰‰ÑGŽÀÛXŸˆBPH\²®A²DiÃóQuk(`wЋ¶¦£]uó @ʪžª’‡.)m—¼÷º×mÝ&}è5 òúE Ðõ˜5ž1d!mU’õ wÉ1ZtoZޏÊ.‹B›:iQ Pl®K4ø²u—„à줓Îáõ“¿=d§=vøzN²†µ ç ‚é®ÝÀd¼šÔz×Á®Ž–ދޠ¢€5Y`"Òùè–NŽýÇ\iŠê(¨@R'~èw‚¯ëkk¥·“”Åp„N‘¡Obª.ö@Æ‹úh@EB¬ãY}ÐçÞ¼†tb› ^.êÛ†,©‰h5B 8Ù 8+ÐFI.¨+±x7Ú„BêA(u¤žÂžq€:K›cm‹@ÕQˆ"ªa]Ÿc0 kÖÂ8XN¦©ÛĸÌ7TÕ³yW ¬‚œ¸ÊÅ€HPCª®Ø2l…r\ Cë_½zØ“_ö-ìl^ØtžùëñÞm·½ûé;«>˜¦Æ)ôtsпÎà­÷‘‘ 9°¤Ù ¤â½ö×' 8ïÚù¸A43öY)û_Í~0¾+ o[MF;àsYŠY¸'渧}wû×ƺ3²]]Ñ´ø¤hD†B¨ýn! R–¤M¸«ãy1äNŠB¥Õ!ÇË49A (Š ª*šŠ¢Šˆ„bQI(`*)¨Š˜‚Z…"Ä À¬aË$ë)][Z!¤2þp)¿à§‡A‚!f[zÍ&™Èâ™d=è°7 Ÿ§|Xm1«yFª!$üª·¿ †‘«1ªa Žó[¾¸¦Ù€«”ð˜ÌBV$£qVÁHà 1·Ë!á'ì¦I‘„j#–ïŽ\Þi9 AzaÑ­2‰g¬ËMìÌCc'I^¼Ýë¦p¢9—ÃTÒêz§6ìví¬Ñn3yLq|[fdõ—“ƒeÀÂò&0ÄSÅ ktßVxC|ñ¢…ów¯fg†ž7dí8εx‰¾)¶¨Ã8¼µ=:w)VQ8x5a«N\#}dé9aµN^Ó¥gV†“ú=ïwœîµv›f—v§‹VuÍ.Ë#™‚ð›kñ–09fÎn™¿¨†µ—òâ…ÝÃÀœˆÝ…Ï݇Ѡ|¡–ºe.D1h¢Ëˆ ®«Tøeæi´ìµ¯(NÝ€-¹U¯YÉt>:€÷Czض‡ ™’’I¦Ìà´];0½¾nõ¤íäg%p(´E×­Ì+hšÝLvNéꤹm ¿jêÈC0èBB„ ôí.$½*Р.öâRÚ­Ý"@øX¾æþ}ç}£á§rÜs±k“BÕÙ°GÆh’N4Œz8lšP¸T…ÓJUIPÚ%fÞ(8ÉyCÂ;ÒÿHÁ }æÏ„5ˆAÙf‡^ì?­úš°O´ Áçãç­#WprBï$H'¥HR*P#egã†ÚDHC”!ÀÇ)«Q$ $«»X8–‡úk¥”M YÆa4F%r°_rÖC×( "²*ªÁÁšÞ–4ùÀ5¬_Æ H0ªû-¡x—ÂÐú`œÀòúÈsâÓ«.˜A·†_+ú 8#/=u·-›P§åýÓø“L2jOrØ/§3zÔYˆM3ôÍphÃ8(<(ÑŽ½eRJñš~×íÐYDkU§ãâl+D*èèXó¤DIV-?mA§†‰-èßÇ]´ìH?w´òí~©ÃƒñÖaíÿMùÎ}‡ÉŸÀvo°Ÿ« Q3 Ð&‚)"rÙ÷Å̵6›,Pãæ&c\tshͤHÑò&>«V– 1*!«ò tkÆ 1,MµbŠdóÎ~½×§Æv>µ ¦U!,…#öªti‚~Ë +²¤wù­??'BÐÍþL»×ç;P·È¬ÐË6›ïŸ„ŸÏ/²¿÷¸Ç‡_œ.þk·&lõøÒ.ÿO×’¯ßëSŸÛëïc¼Ò!Š»wõšÞÿ ´Ðªw¾ð4‚›û²c"ÞuøÝ48AN¹Æó\ìWÏ6ÏUY…T]…vÍ0îœ&e•âú‰–àýá¬Oir×YLWœÈ®»o7­šû»LA}zÌ_ §A}q?^ݤ„ "‰ˆ•‹Ä—[¾þa¯–l÷»çS뻥ER"yªSmC `µçíkØ*Ç›}š° ´5òzjʋңñGžgêcèìѲ”CØâ:1`YUÔ cQgâè]·Ö!heÒáÅ_AÆY.ªùJŽrˉñAÚgÊYúèÞ?]ýo]ŽA2ÂÇÏ#ËÎco¦cõhЧáE«¡Ç¦RŠ¿yD|Ñóòõ ùéï”°/@†^p-Úäˆ¾Çæ®X¹¬}>2ì{˜pûU'kí(=Yµ¨­6‰¥iŸƒ>÷7qºyàç™2ß‘„PpÍДÎÚæklDdÈ3°gt9étÄdeÇóŠÐý:°ÐÓΛ:ÞÎà ;ªÌ„×kð?šHñ© ”Ñ[e@˜ÆöAkñ÷yaa:ØÖ‚0@ƒ¼©òÏáññLå‚›5¬pDÚÛ‰ûm7ç‡cþÝ®kd"” 8[µ(ïËnÖ¥ÒlÈÄôZ+"Ú9ª¿ÆSyƒiž“ðš>ž»•÷Õùô÷9írðÓ<#ÇØÏáqŸ¢>¿€Ù ‰ïÑóƒ·Cñ[ ØsÓ ÚhÌC{ø³…=Qèg$8±Ï̘^.úF­O0¡rëÈÕ¿êô×ðËCW8¸r2²‹mªã  ¡UT2¿u9Z¡Í(ìf"Ø¥mv'áhCí€ñ@Ë_3 ¸øÄ ’aCHJL‡¤%”@²W-+-(d\žq‹1ïJ[ÄÊJ±·Òx‘¤6ƒ£ÂF2âp†…€J®RÚ¢ Å¥‚,˜™‚ Ú®3ë+ ú¶Ì×2ùÀŽF™q­­b–Ê£kG‹™A`ÇXgfµbÔüsÌèçä¨`u§ªg¡4Ï¾Ž»ëƒÒ§ §ŸTfFfbdn8gŠ?èïm•³‚iùµ4þÞ , 8!>1±s1””@þ¸¤ÁOÆU -kÇæØø?%hUTH*` NÂÍ‹±™'7`Ø»*ƒ‹!Ïç&ÞÍøó"~Iâ?S}VYîéù‹„ÁOÄd¡MUþ¿ñƒ¿ëö~¿Oœ|ZžƒÏúyý§Óüó‚o­jŒJWr~á3;sN#²$&`IþÏõa'6 Õýê^^+¥aëÖõš²c†S­ÕoSM¨µCžòyè ¤°Õšü䯣ÿ0É‚Ði ¢eó·³Ù Î`ø‡†7{iö¼äR×'Ù¨ÑÇùZ7"­æH¤ÂÑ0+89Á‚¥µš2 T‚qž…ú7£q¢6agÙmïìÁ5£S ƲD†Ë$(ÁEm!idˆVj ŒÎì5³›ˆˆ<2""",±" o² Ê)fÐâI-µ+!B­%¥¨ZEµ·êèÔü!.‚ú¢Ö¡êÚ%Â÷ü/ÛàäïGuE0oV¡‚=ó6%nf^…4’Ò’‘RE¡;@†A@0?Þ~Áúù‰Ñà¼ÿÈ!£üÏòÐXxdP¬ ±dXT”~›”%¶ŸÛ*¤‚P¡(mãcñ*‹/ÊŠÿuŒÎïôJ ú'É¿ç9ÍüÿÝWïÄôûÃ’p|Ë"+ÂÐ5?vÆh´«oý^5S‹.2,¡–îæV]\›ÕÁŸ“ì¿SÓÍs±8ÅužP“ú\À¾#v¤E·Lø{|ÉU|Â5S ‘Y\/âèÙEáš+~v4Þ‡KܾwÁµmæ.üHÅ%Tc¶Œ<ÙQX‡-z°Á»ï] ;Y«ˆêõŒõ§¢ô­XªXj«UAZf%;B.†BU|þd>³o쇊}ùØc´_Þç—7xÎxÀž‰½ïÔ†8œ¨ÜÚàõèÃþ]æ°2&D¡[1QÌ›,r˲IyÅHOž£Æk _ûÖfûùHx5Nƒaûµv×<‡t0Öå‘»l ¹ ÁF%+ ’U†˜õp榜s±ö{27‡‹g¶¼ý;ŠÈ«™—›ÍœŸcÛ<žBýÏMêÙ³w3)e„ÙeÛ¸óΤ7´8ÞÞŒÎDýO 2S«!¶J@jfÀ„T8ŒÚ†Å‚wôŸÀJù\5|c™]¶«#iº$™›ÎÆþ¢(—£õ™2ª¤Èª?¶p%3èÌ› ³ÌG+çx”O£40UŒŸâ’R”4$E0E0UIGøÃ*C´˜BIJP4ÐÐdµ”HP,E]zî÷N*Ò‚uÑ*7ßsé½Ã^]c!¾üÎ’D!!=ñ‡Ìs ¥0><o®Û{0ÄíBó?€çëÏG} Ë0QÉâ™ëR¦Ï‡Cîw<àÄùç•çnqÔT> ›Hõ8rJ•-^_ÇÊçv˜ƒÙ룟…ÇݶfýY ™4ÇçFØªŠŠßÛ~~;ÜïZ§¹ˆ£[PÚ›9Ne·Ü›ÝsGÄ9²Re* Ðæ$ýV/6d'ß>öö°¥¢(‘ý„óè@Ap[å(Ù³Ó»¨`@¦o3{²pÍ m,šx@Ðâ‚MZk »¨Ž–RªÚU´§ã½þ.Küu1 †±;¼§ôpÈ7c“atÁ{þXc½™Ž ¦X‚–J%¶>A“úÉt†Î]jÉj|˨–bÜ£ÙrgC&¨Ù¬ƒ’:AS0ßì`þUÿ<9¥4q߇Ÿ³ú>ˆÖßÈ_F}©pñæ™97a²Ù„:ˆ~êµvVCÕ…ˆ¤ ´à,Dpä7ªIЋ!ˆŽzðÿ+£’Þ$U¹ü,«©È`׹Ìv aS“Å~Iïµ"…ù>‡¥vŒ|äýÓ«ˆÁþ'vIÏ:øÖ¥“sŠÛÉäÓý…‹o•ó'±÷'kù“ÁÙÏé†MøJ1ƒ÷ ëa¼æ9•*©‹ ž3bÿÕ°-Åh%-s¿‡øAzYÌ?š@(¾Ý&µªeÃ)8—N†’ÒõfAˆ Œ1‰Z# ÍÛ‰û7Ñ%’JzÅr‡S¨CÙ£ƒf1X:åzÛ¬p ìð! Êâ¶v„$QÖ)Ý ©YP1Cα¬#¨çZÛáçFÜ nþãÆæ ÉP˜?65{¸ƒ"|ÄAMÍfŠ­ïÍåÜËñÇdçôzÁî@æ)Nwá’sŠvN=¿Üùßc ø{Òãcƒëßs;÷©ý0S6Z†[ZñÃÏ2poŸfèbb‚˜”ˆ¤¦ŠŠ#U ‰4{ó¾½dMx{Àë™a@`)Ò/œ¡’É!# h€Ã$ g½bššÖµTÖTb8PŸ©€²€0{>ßÑýþJUÂÔí‡ü 4ÿ´¡Y‹"™rËW}1Ò}|ý–âuœár$fS£Hcr¹‡ Íæ–±wrâC7ôYÓŒØaSùÿ2Ñ[j`øìÖ¸øx…“£ƒÅ…Ëó¢òy¹ŽxgýqI‘ ±Úö‚KÙ"j©£XC˜*æWiÁ[©µ×kâVƒåyá‚:ºFÓOèã–›f—Áô˜’„δkÑ›œ”6ƒaYm–K£ž%š†ÁlF40çáx×Ã/Øö¹Ä­`€:Û.Ú´ǤÍßMslÐbÍsFücú€!„u‡ëb !ãøâÌ ùz&|Í?IrUqÕ÷Šù£E4*gTgº=ûùÁý‚D)ÁQrW=ó…OtÖY»(¤ÙÂ)ÎÓöG‚/·ê5EŠD‘˜üÜÃß©çVù3sv=77)*ÿw@¯Ón»f%ÐfÂÛ$Åeþ )‡žJ{M;RÚY,¡XØš¹ˆ¯úK‚"e‘!gûÌŠJ¡Š(h–J*"*B)¢í›Z`ˆÔ’‘T´,HU7¿î%ú1Ðá„J3WSë×à>²& À‰ªàÜIF1¸?½+±¬@æR¤Â8ÊÜaZ%ä+žÏÇFÏã ~,ÀåâÏÆ53Œ°£Ã¿ªf1 ýKʉ ‘ؤ˄·ùqþ{½„p… Ù©I‹Bþh¸\`ˆs¨¡©(D(U˜)UÒAS „€õ(JQ¤“ük¨ª"md™˜„D)´ –Ðb‚$A ÅE$¦"„‹ p*`¨)¤ˆ‹$ª"bhfb ©ˆ¢" rFÌ ”( €Èb`Š ¬ƒ?Î}2– Qç "¤)ßý©YÂpŠò°9IÀ†àˆ(¢ Ì¶|â œ³Îåì\M&Å„¬ùÞ¾îƒñ A‚È®ÝêëAÃÐuNM^œîLñëb€§–4øäŸŸ AüÓó:æxVó;æ¤ÖºÑüY}5»AãsÇûÀ`±1aEZƒT6G-ßëŽ)6@›µq(nM¸Ìyã`n˜¨#l,A…’lÄu„a¤YixéÞdÑ å*²’ªX—7(§”EU "Ú0@Ôœ ̤P”% 1%ELÃLÊD•UQ%2JÓñÐu;0-(!“K6¨Õÿ¸óDM‘¨-vwÃà3ï\wÚVrDDۭóǡJ”—ð]wlE² úݪ,î›×¾ßîᶃ00…èI_Šwš²´WÒ¯`þG’Õ|1’ÝØ-&Ä«ïQÔ0%t¨KƒX.z» Zw Œ V·ŠÛCD9"ø'GmjÛH³–Tý³ÉxS/pömJ)J+À§pY×7Æ|+×ËÎs8¬x+< ÉŒÕS³ÌÙr–¸`m8z²§Õ>½—ž»úÖM˜¨‰îÊó$F‚8Ñk•5I:¶Uð:缉†ø™¥çF4Z ú†L S¢Â¤Ëel-"Ûj@±"¤öYœ%AE7©ÔrZBó’m“9ª $ OωüðýPä~4»W pñV"¾†÷%nvÑoŽ~ ÑVöä ED!(Ñ!pxjÒj`°…¥DÃ"`©ç'fkL(d¹WË©¸[ ªPxÏõ9Å!@%E¨s £ü:Aô’Ïœx¡§W‚‡O îzà“Šxi›È|V‚¤`Ф|Ȩüéhdá”"á`©ÓØ:¼\Oª—S ÇÁ&ú;§¦ Î$DVu$Ó² úœX¤@@í8a —VX¤A2aÒ‚$°"ŠüØ>5T¡ô¨ö¬õïÞðÕÄ0I!hcÈ® ÃݽŽ+ãŽgp†J¯Yç}»§¯ H§0a –GÑRˆÈýhB|3®‹¤vèaXV¢…AÆ¡[á5µw J'¨(|»"ÁGàãÇ Á…æ=fƒBi™›ˆ)ƒ4 ‚¬Û‡WK„˜ø5rÝÞFT£)4¬Q4Ha%úaÕJ0p®0y%Gð–ÔÁè¤í=0å;f™;z:zÌU“§×?´äÐ5„&CZ🃉3AYÀ`hÆ£]0–‹bj° âg|ØæÕ—kÅ¡xkЉŽ[(&a)h ’´ظöª K‰†Ëv”]µ%u+¤,—1Lpƈ‰—M´“ ¤á 7» tV("Ì^.m.©{Ѭï!¡§qK"Š£'»CΡ‹Ë _^x+Fe8Ž”1ÆqJ>%xíkpÕSZ(º˜©Ô.HÚÏP|JîÄçëœ|fvâ8!ë˜ µ›ÿ|¤ÜšÞ,CÚ"à—1Þ5®×Ïþ2ˆ›ÅÕSâ ÞÔ½®(„À€=J¬z¶AG˜½U’s–žEˆRšÞŒ ¦§¡úaåá„ëŠýÝG°tþ­ûϧ?¤!Äs­ÙcáïÚˉ¶Œ´ ð0CÔ¾ÈZü\|à¾Öav ±†l‚ÄNàza el<ŒÓ‚—y[aEXŽ­íž™¡4‡á;sD/Û‰8ê©h—ª)¤4Î-$¥º;ƂޒWÁQRQ>p&nSh8èãA’&­'6[ø4a )Ë í˜a`b•!«Z1Z è’‡fÔÍFTÕ. my7óRPMÚŇš *JŸvÆõIõ NbŒDRž ³ ÑæŠa×d¡3Ä3Q1T»G0ÂË2z’„£ B—¼oŒP»q¥¬4˪Øb°}øÞ‘Üm˜ ¨/i‰ Ê®rm!¶T’Úµ‚0å…‚t—Š¥fßÓ ×÷Ï>÷öí4ÿ¿&.ìщ iUù”_ž]ë_‹D}ƒ½CV‚ºÃhf²1T]­âAxˆ8±)h÷>.§¶M²:ݘ±Òãg“´ñ;ƒÇ9Ì´uëµ×Æo¶•F€PÄ:ûÞv–º ´N³Ïã|8éwaË¥0l/F‚?XêÈ» 1& Í 8Id#« Ó_·7QÖÚh[3¤›í|õ[8ͯŽÅHÈ ÜøÕ|{Ø|G=@ùÛâÄØõpPX¾gPÉu_YXŸ‡ßŠîª¼Ó¹#dbÿ4úùÁúaÎï¿ý? ~PûL;hþ¯Ì¡â3âbºçxlÄ¢œzÃ@¿W¤ÀïǾKí£Rcµw…]5Í#̸¥7P6€®3l•^ÿ6~…;¡ãøiQ<]ÐÑë:`afšnËé!ÂäV! é¦<SÓßÞƒ&w`s± ¥@D•‚ÂVñB&>ÆJaw”‡Ó;Ý€ @Ñ-èõf|>aü]”'ðù{PN¾a‰¯¶ç‹M:ó©Žè{vºè°Ìd’MýÃY!ãy‚-ª,"ÙŒbm6{Qï_ÎVŒ®ÝÁÌ’^"ÝJG‰PñpAH§< ” dö4~'ÓÉ&Û‰%î¬ôyß%¹Äru’Àe S„¿R•‰à¡®5¹¢Î—¼€oÍ ÀõI׫S„ˆ!\U?,b&- ´€2@õhïT`$Ø7±ŒTA x@â/æ’¡é‡ÂX{¡Þµàç±2•Ö[ßß­†ºg8“Ä…â’°ì¨€ê ‰hµ~ ¡(Š¢Ö´d<ÖÅóA 'ƒ&ŒW5H°YÙ;î… ææê—›1†Ødê<Àn^ îqïxq;µS—‰.]ÎK¢³éÛ­YzO¤ §ÅÈñ!êzö ’ ƒõ(".@ @J„({³ÎrGÆ÷«¼só¾¼cêúåEF•€~~ü*à2»ÊôRi"㢂 È¥ó£h Šˆë\¯¬âò±"Û,¨E'HǾØ|ýdQzàû?Í´:dq“Þ°uï5 ÆÖTrÖdfoúÖdˆZ<™­¥uf“ôý¾ß³ÜtþŸÎ¨±‚m“c °Æ£]â6Fæ a?EIJ–Ø·Vþ©†·½¸ò~¤1ËN:ç15wÏà8@¨5“ƒ—Ns$¨ ¤Z•([bÁBòÑÉ|êñÄÛÔb‘¤ [T4pJ\‚•Ú²š£ðu½1„©Öfõtf‹ëLØ›’~V§í.ÁÕª¡£*˜L€ÃuÄ¸Ó €i»€E.ä̹—`k,¨¢h]ƒ+K4óÔú«¿óðßld§œÝ!hƒÎ2RR”-Q¥d™‘¼*(ňÄËjY÷@¨øù Dç'ƒ“<{}÷zH”í!âA"6‡–Ö.>`ÔºÌs12˜¦s)Õ€”æIQ©rh¢ª‚†ŠZ(¤pŒ„*"gpäEDÔQk Šaš²µRYm‚&Mdzóo\¯Õ<àj ”xÚŒpm½W“}dCFžøBÇríÑÏ‚y¶ áRhf%õ s°7°(Å!z)?ÖáQ‰9Ö°Às© BNAàâ§aé&£“  âTt±è W>olâ¡ä7W¯P43åNàÐX²Ú[¯gƒÚ˜o SFbµÜ~ÿØÛ¼SB¸Šô ]‰ Ž´@¦#³ÖÎ;a^ O® ô—E¾‚ýÐ&ñN‰S±a@¬Tf™Už]Ì´M³[å.¹Ø˜‚s†ÓFÍcÌÁ@[Ç9Þçg)˜EëXª’BˆóPЃ@("d (J"˜È°©hÃtɶ„ÊSªÜLS0 ›u²›vœl°S)‰’9-¦FãÄŽ®`ÜšÌj(ì¥êäEé›êFðqCHšh 2Ú$­…`óNSN«,JÉ/Fsðy€hi¤C<}öàà¶1¢Fhrí;ìüž†ÙȘú—A¾Œð^ò|Td+„#A"ÐÃLÊSCH )3K’V±H`N Â\ aƳ7†`$ïýÕ¡Æá×ði)hcÞÆózªûñަZ Z«×§ÛçW®LWž ï BY<äÅi<øwÆŸÌðN8Nd€ÿ¸­"dOu ×Ç1)æ•âL²(?…NÍlù‡ ŒêØã-i_­Xk¢ÒšÉ–ëA“ l]ÞsÓQV”Ð@±Ò¤Bö±†-ù1—F]d¢ 5n’Ô¸Gòk\µv¥6S¡s"HŽj(ã6hZÿ{¶E!Ñœêëƒ䓽c-1, ¡Aµ÷žd+ÝK 0ÞQ°½R$ªog²ôp¡&²Q;ä××Ú„JüB@ÆK|³ÀëtÚj’ÃLÓ1‘Eµ™¬rPvB%*ƒ"P©‘JdRîE†'®çb à|ùçïÕ$2sÞï¸ xçñÏkÜ·„8èA¥#î>dÓ¯gB(öA¨_÷”‰Ai¥ñ“CqDíÆtæË$àð ã†M±Ý!¬¤¨¨'­êþq\@‹µ’r6.„DJÒ%DnG¨aìaÂ0a³;͸óäðsúýk®63À•æþ\.û9ÅIÕ wŠîó›Oéïè?ñùkpMü÷VúÐ¥y鎤ï¹1á³(ÆJ‡ˆŠ¨Ä(Ì"ÈL^w|ìR,Xâãê²q›çžȸo%nº²¾óß®º2<š¸^PÄvÅ<"èæ%Ï\çl멨sÍÎfqÌìÐq7±þL©ùkô…UEbDCI0÷™í»·ñü™œ¨f-ÝR{#ù£93n³<ïÔšœAÎ+‰ù¿Ôfî‚§9£P´–"ZW–çyDøé‡,Е¨ó˜xÕPŸò~³|>\õ|=ñüä¹9iœås–fßÁöyëî¯"DÌáÎÄ[ebê >X °¹§K)£5yp©Kå+ŒQ•üú–žEææbr¡r …?ìX‹¬0…ó8iÊQO?£áÁ²l¤pËÔ ±1ìÔ%M`¶ÀêÐ_ƒÕè¬\«“ðÙz›7öÞ<<­Õ í¨¡¢®!Œƒ…Z–”wXԻɓšV$ô ?xå†ù¬t¥é—l5$Pw欎K3m$¹‰WÁR±%‰9UÕXþ€"5ÃO\Jd‚ ›gFDTíx.-,ô’ƒõJ``dS¶N·Aâãwçjk ƒ>®²hEóB‘V/ªf=œæ„¦õÄýS|ˆ¤67 YsZõµÔÜM89³¬ý'1YÌÖ‘ñ¾,´L»;Ô¤5¸V Âï@f óM‰ÅÓ’ˆÈ´h˜LaŠmÁ“>ï—ãÐq«æ(ïg&1¯˜0Â1Ø2!J°ªª Píßv/q@Ñqò¹ª‚Wt’BáÃF…ÐâÀÁ„ ¾%Æe+4ˆu !´à«W²u -²”ç ¦~•¡ëM™Ègo Á§KÌChz+¤o‡ªw °_xÛ% 2 1Î#/ráX¶Š"šÐQ‹åTc Š~ËKËŒC^¤«Š…DÉ«=³pl|³I[”ü8!DV‡ ]õ —ùc7¨‰¡²¨ ^‘Ðt€EÃ_n[ºðªAXT…ªÖãÝÌ¿s…Ägˆ¯!MqÊdÎ_uHCŒ‚ׂ9ÒAƒfB;5  YšÄ븜c¯‹ÜØåÁ Ñ:ˆB5¬<+æïž[8‡ÖРحd&˜ðãÅøß^7îðþ¾ÈCñPçQ÷wT”VÈžÿŽÊLh~×øÔ„’3Nfj‡"–ã¿þdÀJäì ¿)Ì?gn€ü¥FÄ~¿©\U8ä…(™¼!ªøù³qâÒJö˜Ï‰¤¸p/xfe §C;äá,åx¼N{ÞÒdòv(Ý~Aɹθ Û8.Ë ¸}]¿7W’Ì¥ÀªcËš³¶³k7ó&˜¼:á44ÓA’ àTÎaª–Q"o©ø :*èñxX¦j¸ªÞÜ11uR.ñìb»=1`ì ²a”>ð/( å„@H_ôp uÊ€o”NDl"4 !™îý±z¢`Ùª/nØ0RfŒŸ[lñ—;øŠzŸyçÀwñ¿ä?~þ¤™'Da+¨ Z&šZh(¥ˆJG4™–ª ’Ôd•‚~|uÂüÿ*? ÿóg¤PX@Q®´:«8QWßú1£|%L0ÕŠ™ÌK£F¹ôƀѰ¦¤*0X]U~ Šp{˜Î>¥ùáÕ›ÝKŠÆ>¸o‹tÄ4RD®ã=Ý…-(Ì¿„ðCštQ£àCVãbàHÐeS^%p@â^§gíèDÌ Âf‡BJ€ †êQej„ÊqM†” Ò±.º.LFT+ÏZØ2ÖæöïUU^5¡Eè!Ô‚B¨uÉ'Ìñ59Å\†iÈŒsÆ{¦o ùæ—âÒ…ƒŒ3 ÂÀ±f‚@þ$P H=³fSiXXœóI&z``ºa R@ø¡þ¡së΀=ÉÅÕnù•sï[7H”2EüÂipz ¢´µÝNèUÜ Ç&@’PTR EdµÑÛ½ƒ×jZˆ€~ŠNï€ÏŒ5•Di¾8<"„}i3þ„ZACâ7ï£FM!éê>u°š&üsìÿ[aPëòž#üT| ¥3Uñ(7ÎÝ`«ã@kAŒ´îß'ÐãњãcùZCb¥ SbFAl¥ Úùîx}ñ¹­èÜqehÀtÈ2#ê|žzÖt÷×~£(˜Hí£¨ç&ÌÔ•1ŸgèÆLp¬S$Å$Ã×pîPÛ†ãê†&Cÿï¢Ä_Åx˜H'PÔÐI ?i^ ¬ „ÿhþF÷ò¥òid !üö¿ƒ$1Ÿd2•w´Í^åþ<~Múx£ù²~˜ù1Sû#°l`ÏéÅ>´íà;ã$—ø"pöO˜´9_LœqÐÕž:>kì†Ï*’SÎ\ŸÈÈC°÷ÇÀŒ/íó@]ÃÖõ‚ò_ÍþèAj»’ÆÈCßÜ_¿ª5ûPTy=‘+Ç”ŸÈa໇kë×äìJµëžÑ¿¤ iqAD ÏG=!•P<ï¾äÈÛáS@úh³ˆ1¥‹gmû7‡tM&Û²— ÏDúûëÈ¿QMâj{ ŽM£\• p…†ÍPñ°Q?å&彆'è3õÈDCˆó’,éþd2’B7Ó¢ÆJè=¶ë“hÃ!q#Äד߇¨wœ)¿ªùïoǺãÕ–¯ÜUh8˜¾u_²f™TüJˆ#B ‡ù”æ!¨–"€¥¡&·˜I`˜?ó5I¤HP›,Òà6² Ai;êhÒþí)O EE÷`DM P4U1U$C'ö ™aiB‘ï‰(WQÜ"dªP 4¨"*‰B!!AJR"hÉ(/`pÑQ"HT˜Ö¹ñü=²~ù¶4@üãÈâèÚ¤)Øú>à v`?¡g8 TMW± ¸£)ÄA³ŽÔÿˆÞ80W¸â¢õ_ÈtÁ~„y7ñŸƒ× N@¿p'-;Ý$Ô6/ÉÒ\ —ò'ÈH^¿>³ÂÑþ Ík) …-ûÀ¿v“2ËŽh¤eêòšÍH]ÃF†ÿ~¼¼È)¬÷§° zôüß3ɲŊ>H'h¦;V>Þôˆ“ÕU®ô{V"Fà G— 6D"ã¤Oï¼=¦Ž„UÜ £â*Ä1‰/a¬MHdŸiߤ ;¨žÏbu+åÑÙÉïæ»Ä2¡EL÷¢‚4¶…Ýü^IÛš X"¡+mÏ&°tZÁYDˆ>¸Ãè”zŠúÁ>à5.3MqÀcQ­Ïftnl€Tˆ’0¬©¶y½K8S˜zÁS`‘‹H¬ŸàV÷Â{Ó£y@gª‹÷l‡Êa>2¡e™…ÑH­23ï–øI)éÑÀ®déÿË5rrEJ"`ŒŽòƒñÅ÷ÿ½Aˆä>‡€OWáà óK`sÎÀ¼ ¿Å–’FCóÞ¿=Ó '|”z]ÈHÖK(jÓ‚ÕBɳØ;ª×±)fG¯¤fàrR t@µ{[:Ÿ·»"÷ˆ “¹°h1°[5CuFcܨ¢±!D ÈiGVH¥\£@|éPq4˜h}¤»’ ¿¿ì¶6TN‡w×à{þdWOf*ƒAß"ׇ͹v{Q¯/sÓÖß«$ÐÇÉ®FÖ("+’;ã³ÿƒàÐû;œ‡Ñÿp6”ò|À¯À9·u‡å9ðn Oûk3h ½™ÿÎqõhd½ìo·òZZ\%Ó&nB—¹Ñ慨oðp_ü%ï 8ÁÛÎxT0òÕ ³×kÎ*¦1gè™NÃ/c,ÏX··«þÕFD2í'ëëÁáßåÎÛï‘°²H£qbiiB‚"ƒÄ‰TMQ4ÅÆ(JR†Š1 +‰mZR¡§üË(ºj**.ÇGÕ&Ýk%O®|\Lš§>±Q&2•ÜL0…G~7m绊D{õ+œà4Å8¾‚ èüu}ØÚ‚cczNZ¿çÑ´Ù7B*m8ÂT…Ý…ˆ0Iƒk „H¦T­݆3Ã%d]Ð5EXNŽ™R.’²³M[Œ¨1¶¢Ì&íð ˜ç«’d……騚ް†Y?Úm€H9p 7†Ë­@AÙÎ\`—d¥¶¸!HÝX±ZÁJÛøª¢ðÜb bq‘q6 6k Op"ZÌêxÞfÚÅ5Džmï3qÈ #4˜†2ˆ;6àŒÜÕPTeLeg.Ý,Påå.ŠmƒŒ2ê—"ö"ø]°úØQ}ýaåtV%§i‰5ƪ€Mp­ y¹>(¯#’B\ITJ3MAb’÷­j )Õœ'vÑXl×ô.t¬6"6ÔVl$— Ñ·“»¦F†•Y9Ó¾êS¶Döa9à°LúÉÎXxJ¨>tq•/fÙägÚqÉDi. Ò”ˆìÖÝ»>ܨál¶€f«xI`óÂoi½Ê²å’åTT²Tv‚m34§¤²gváe’F n[™sœ™®÷»ŽÒLΙ[Áš`iÅOm_Pu<êÉs—T¯)nðŠœo[n»nɃ ÄJ¡8æ—ñ½ú¦ÐíÑáêì±·TÍÇ Dˆ¼²µ–ÈW¥ãzy¦$7¶%Œo‚3ŽžÑÂs¥ kcsw²õOïišÏØFm²H‘ã["ôPŽÚ'½æ}s›‡Â`õ C©µ^3NM|­œ¡Ç¬:‘°Tåa½E€QßR%`ÆX@û5VË´TP Q€³A¾MÞG_ÖSf®!`[$B‰0[/D¤°*k}A‡ò“‘¸L°+­w³‡®6 ö Æ8šB ˜ôUK˜ù5i‰Ì;ô™üè|&Œ˜R`Ò--‚,e‚Ò•YUÉ,jZŒ€Œ´P¶ß–ƒ4ŠYU5JÞˆÎì iûg”Ï6œ­œŒá¼ûÏüø)Rù§…r]ùýâ?ŽpíÈé”MÜʰh©ìj¬W{Å>%ÏŒí Á‡\bñ!Q.HTÿ û,Ŧbš`ºQS¶74]ÿÛ­uƒ…0?ð6t{¹Ó,š t)–,7ª`%öY*ÊI¤ÿ=—¦’‘þ2…¥”M„òj˜Ѧ~üÄÎ÷ Ê¦íéõ…DT0c~äþÑ£_öÏ?ÝýðQx`ˆ«+FÛÝ+Œ, UòQ>%Õ¹bÄc«ü‡k0Ãè9^ПÌÉŒ¿(ts³L áÒLÕ³P€Â¤¹`Ï«L À¥l¶¡Óë! ‚ªdCž2Z)‰&ikDfdz×mñJ˜÷Ë È2B+ûqe!1ÎÞÐ¥W¹½Ù­·ÇLÓ(%)m80%1Dž•1˜%ìŸ `o 5¿Éâií’ ·$¬œÒŽRš¡¡S RûILK´CŸ¾ç¬)Oÿ¸·|×&lçkŒ±œ¹¯t˜þÞ…ûðÆóþé‘×më>w1—·mÎÒL˜2×ïG”õ1*#à$¤("m^þönÍ£µ)ŒPQóœÅÄ åøˆ7·)2Å ¦¼Æ¡Qä³9ñÄ!ô„äüƒÒ$¼Ö'^ý}½ˆæ®žtC‰«'–rà jp)LqÓuMÞ©üºŸ«¬ðÜéÎ:Ï'£šJžÁ–BAYEÃënô/xÆâù„2V‡ä—²ú4aÂÀ¶ ˆl>ß1dÈLn[€[ëNM­œC‰&ŒºNµqñäÕ×°ÐS€ÈŽ’æ 'Y¢hˆpÐ4YsYRbx‡WY‰ÃD#iš“@TÖ ’nD#N¡rᔟdL ‚ÑD†jð1þˆ‰P”Ú«ˆ¦ÌUH‹×i ‰æîJ 7°$8¾š(ƒ©3l*  XP|Æñ”ÄÕ°TM»€’!în ¡æ”ëÝ Œ5eÄàCF™ýè»×xŒÔ˜&®‹Ž(%êöÅα'oiÒ’€O—&|ØÃ:½d–œÎV(Â3€ACl00²T ’´jVÍ@_Wûþ+Z(öÉ'‰,9¬Þ=?Öš$Ï…p” `ß÷<ù¹dT¶·Y˜¨…@+ƒ’þS„#øÖ•…À2 ¾¹PH #¼mµ*6Öèf°Â@¹“K8éA5 ÛDo ŠÕ1–»k`¤VAT4%”u öË{·ÖM¶C ÖÙnÙ¹ %!BØ:•UD-ªt†Íj)AÃè>¾cþìôvª•U3GÎØÞõVÔiÒ±A‚Ï98|ëôH4Né§Hb×4CH³Y²‡1]¥“zÕÒÛ…f¾1bÂd:LVŠÅDO(»a‘@ÐÒ¬•uÆñæë„U¶Ø*7Œ+¬®3S5E‡F ðÊð¶“E±¶é§œ5ÓÕ¡ 5ƒ`·ÅÕȶÂ,)£¦ÓƒŠdÐ Ãw/ƒBÈ$µ íq8,¼w¤LJš[QWtÖwºcª4ËœŽ¼YØíCv^µœêí‡(Lt‘M3 ÓMõ¥r@ÚCNž«Á»Œ6éÈÅTkSlªõ¬™?šQž7šèPþ?Hòs`)iÇPŽb„ 6TH×…áåɤ­Ki¿@Ò)Ó&˜d)° ­&rì6 UY„ Í 4@ŒwÐT6€wp¤µ H9^PBbu¬p†s•ˈè/"MpHAQµK >@Y>4nh›Þ'PÔ† e;Èc/6¸Zų)DNRe•Öf0XCÜ5ëN¹qLƒ†Í á—§£`Vd“(´”(UÀôZB*(œIF^iá8M§(q¢cN‚¸ËÓC@E² hªTH)wÂï< hÑk*Q” ³-Ùa¼ ªe›µ5©zÕÊÓ„¸ã8M ª3 2j¢hGŠj¬Òm_öÍ &‹"ÔDF'-E`ÅÖéô8h±Ó²fhq\e`q\¸[3ÌéÔLMŽïU^Fßn:¡–å%-µ9¥4Rªz§èä¦ bÃ.¬:Bt É©Ë=qWÆªÛ ™–ΣtÃÆ\Ñ3W/Ô57å«J‹ Éöã2Þ C¢í ¬ з¡þð H¹Ž #RQ©šâ‡Q“¢AÈõ¬ V#ã6ÈÁË [QM§ha­m 5d€)1â1·D|FLÙ‰¸Z7)G3Å'!ëÜñ5o /˜^Ó¸Ù 5ƒEy ¬Ëb‚Ôí Ciƒ ‰Œ™ÝšHbXaŒ€Ä1 J« m˜ˆbTTV ½7Y‘˜£keЉFwºªXuîèá寰¾|àmR°ÒIX[j¤æ”Є4 f¬ÓL†%[Må›ÝKbí ‡ Í´Ún¶c"—, MÇë%a±Úù²²i¨Ýä+G„ã3²N.ðºÎA¬Á0”Éwäó½i .ŠQ÷Å œÙßaê˜;aʘg§¤Üóžbñ‰«rjêæ.º°ßY‡èá¡ÑðG7e«}*Ë…‚p˜å²EtiTë)R¤Xi8aÛ+ÕžÃÊa1’¥FØTñlë­ç.Ѽ%a«¬§ $ÅK«%œj†„QCÎZâA`oš-|8âp…IŒðÔ^¹Ù£¼˜©!60$Ïùü«`ª³Ûމè…{óHÉI…rZ…T HìÔÊd¹A$"Eª )A*:OI£Frsya† ³Mh‘)ÐKz\©Mãc` Ž4SV| u¿–"ÏÛYâåK]‡‚K¤Ð`‰ä²B^9ã§­ÓÊNZ¯[Ål%f’‰JILjF5%CoÐÔhuYå!Q€2heHèï!1Š–7/}îuÍ;fÒÄj[Ô¦Jºh?UC0©Î³×׃„ÓÕ ®fYëTÛZÊ”õ³^'ë\kt^Ä2zºdY1]b¡ÐÂt¬!Úr›æì2…õÖi'ç’ê‡ÁSu¾„¡ 7Ý¢iªM2þ%3,•¿mFzÕ;´Ó^™:E ¦å¼T@D•‹S¬6œ3P‹‘EõÆ`pÓÝÝ×n‰–€„’H’šûpÁ4¶1³z5RÚ^aÐH%öjÃÓx|_yˆ‡BÂÕÀÞí§á„¦ÔIˆwÁúü쑯×׃mŒ`ª,½delãÚTóö>¬ wÂs¢¤åBkØúÙæ¿htfyÏç_Ãì𓊒ôvLdˆd5¦ÝJ$ ¥oÆ€wóæ0óº'; ¹®Ç)¨>a[$íÚÉÀc|„AOäOS({Éõމ¿?Þ3jQ²ˆI½_o©ŽÛÅ„ím<Î|€{zåÛƒpq-{HD‰#¹*l‘¤‰V”臄öFz. µˆ' †Qî²#  × ¤ôìx¬ìI€<¡\|9èHeD=™‰'ƒgüyxð‚œ=¬a‘YPñPXBE”îªèërÛÂ6:ÏGãÝä<¦á¿ÚýÈ!û>¸v|rm¹fÂdøÀé;& Ccχ1¼Í%·ƒÙ³=½àÐm_L  œ§†ã k0£0|my] {çbJGãé !üá“sµNQaz3@š¸3 MdÒ&µ3Óf´îëi˜mÌÇEuR‡û7Lþîð¥Ý+r,n²™J¦¾…`è‹Ùíás—=ô3 À™A¼Úï¾ÍúÜÎÔ¸Ý3ÿ°ðþñþ¿øÿüáÿ%þÛÿ,ÿ–¿ãÿ;çfòïøtÂ{ ÿˆˆ²Œ·Jà !Í-W SJ—þ,“6?4JjƒÜ×jiëšhôÝP$øÅ“ž£}pÓUªMᛀ´§ у¬Pž-ÎÀk¾uýˆ±ìqÖÑ„?¥,XüUœHŽåºr FÁêœzq wU½ÉÑÇ)§µ{§~bÃl8½í>±–qS¤´4; ãsß.‚ Žc4~¹@[7í…G¶€gƒ ®¿L©ÅÈ’šérJ?›xï`LéžÙ[™Ô½H|~`l–pä à;¼ò3e§›‡ Ós¢k­5:fíY^áô Wš§Á–ºvf½’Nfƒ/(ë>¤ÒÒ%˜»o÷c&ëÛ A=¯›M¼qË~Î9ÌŸvLy¶Ý11µÖé¼Er„ü'A åðkº‹·ŽŸÐˆÇ}MEÁˆ‰¯‡ –`s„nc^¯.öˆïB×[sbpG ˆuVMFç]Ø ê·Â425s=À ÅTNíX>Ý.D&Bê2ÊÞ°Íh*ð¦9Ú8 ÷'Ô¡µôi­F{)ØnDcÕ3°%dÕì©ÈMr_V›À¶m=otíÆ’i`&Ýšn>@–¸2yp΃^ó tóÚò MÇYRËÜ-4úŽpÁSÏd[é(mžâ#äÁˆÞáMÌÚ©OLÛ‹48ùNä9ÃbÈ.ƒÚ”Àú–ÅñäßyW‰¶A [ ¿ «…å¼½R~…pñÌ¡*ï(Jèwu¸ôúƒÇ~§Pèhnò™ï%¿»BÁ©œxòWº£ÙÞ$ð>8çŠenÒn%™ ˜#Œ™çÃ-yŸ¯=—cìF 'ž¢ÌBåÃfcõ‰õzŽ"Ž áìüëì[P¨9[¶ö”Y c.qXûe±Ç6#Ù£ïeZ¸'‚H{=ŸMj!ŸÃáDñ}h¥ÓëÞjñ5P:,Ñ©‚ø-Y^^³Ã‰óCˆ¯ýE;>UЯ¨î1P*!u%’ãgÓ£ÐhKè4‚%TDN÷!3¤›B£ºšìË99=æhqL¼GÌ“5uqúª‰ÓsƒÀo/ð<'ä\Ù[’Q}R-€ K&öJí?ŽŠ`1f˜„–xF›ÎhbŽÆ¹^œæVŸDdù[4s'fܶÒ^ê²ýÇZôH0Å,üïÒüÄ«}9íʘ “ñâhX*ò®F,ñTSŒÊ[%Ö,ÊÕy`À¢ÚÛaSäûÆÊJ‰¨ˆd‰†È.þtHáD{O»'èiR•o·FÖOÔG6Í·&¬ÔYK7“O Ó{n…j3§ºc€µUåޖͦÛx¹“Ðþ›@E#竵¿hϬ)ŸÁ– ”á\* Ç3ªZïÙ½bçâŸËZê $4±æ÷¹³ ó¨È©-ÔY †¶V/ÓîyúœÀÈ›™~zŠøLAÜ^Œê¾d_pÁÈK) sÌcD¼»x>0ÕÚ .fx—^†@=òË]ÕjÙŠ¨™²mªÈÔÀ™€‘çÅ=Á ïªÊÁûUU°8隬ÉD«÷›é¸wpÔDRS&鈖χà7’ÉÖs`4ÓtôdÈßÇL‡·jÐ+ëæ`=—:ÃRN”ó6xn/NÆGɧÇZÍÕžÓ§F‹¡¨NÇa‚¬• Ê™¨‰â¡„V¥ŸF׆^"ÃUæÎÞœÜ[&Œ\eßÌÜÅ&AÛ•é˜s3ðü>eEõå˳4‘™ïVÚ7Ö @²LaÍJh¢Aôû3¶&kRüñ–þˆ©’>»:»FZE€—t´©W9#[Þ˜Gbö‡Mq,z taØ0ÝqAmÒïLgK͇OtìÅFN qá›ê\Ð*%¹9CFÁFˆ¯¢óQu‰~MÅ­¸ÅñŒ;ýñalÄùHÔèÍfJØ>™º¢æÈH©•š^rM‰óeÑfÖ¶ºŒfîÔ\£.Œ‰EG{j!Ü2®<ô¾ƒŸ++xÜ«¬ŠK,LªË÷ØÌ¾ašŸµ´R(˜ÈÓ] R?zQ>gÏ Œl¯‹£Ïs;@›x߸4¦ÓÏ€z*>•ÛÕh_nBt:zôÚÿ[šjèx‡]Z˜3,<—ÙFY¨@ìUs~ÃJ› (ªbüìæ{ó6Ò­óºPÜ¢:p‘—'ËöfÌÍ="'²t¦QŽIÄê@·½FŸ<+ÇàI24/Z Ÿ™!i/äy} .ñuêµ´ôlördR[MÚ‘Ô:ð) ž((˜ˆÀY:…WÖ‚÷\iäÓ'4èWWÖn4o3Ñëìtòo©lÅÜß_R=„°«uårEsšÇwuD E]#t°6¦ª©T¸J6D R]dëÁ+{¥<4ȉÑ;oÏõ|¡BO/ (V¾¨Ù¸7ŒSŽlyŽ×‘’ ê Iy¹žˆ ø ¤Ñ°¸-Ç_ÄCAç"ìyORÄÜï"Tìפ¦õ\HJ®ÈÙèñŽñšª] ôþFZôúþHö9s ©w´d—çŠauú-ÁÛåÖð:¨34¸M^שæ~*aNR'}¯Byš_Q—Ã$no©~DF¢%Å8BL-µ¤¶3»±rxÑi£O´±L«&ïôª`eADüp ¿ÎÜ£êúg'Ð% ªìþWuSà÷5Ón×/$º›,9§¾g×?#Å,Šcœ¦ü‚…Å\Ê÷1£,­é¡j»¹8AQ#Æ]‰Í0yí„Ù¤<‚uÕ(ô©µÌ,1‘ &&¢z|o •ö3•l‡/7y’Påò¢‰D»£"¦¸ ÓJÞÛØz>º…c+uåxø®dLã5å#Ûtì ¤‘`-óÍ å•"^XFŒ¤EBøÆ ÏØGÓÎ5å¬YK³öIÎÑ$D¯õ¹ôl½ 2¬Jr·CœP š'±Àn~3´Í-áwx<ƒÓYç‰mUYe…A>œ‡W'‹lŽƒˆóHCù¹:òÌâ*ü åaò±íòt;:2:àKJ7ÂÉ‹ +|ìÍ ñÌCÅ£B1y‰”‰}) ¬¨g!D'Àµ‹| ~Yås+0Ù——¸öF¹"N©ä§¤ûyËÅLº5ˆK!¼c­Zµ‘ƒQÒþz!ÚöôyÕ´q,ü-æòÓöµ16‹tz¦Þ:¾*?¦°áÛì…‡?—}ô×]‚Ûx¯ké™[z)Vâ6)x…Å$}R…H)žtvuCµ b½“•¹H-2}xó¿¬Ô±Q¥mBV ÒÔ/x\}1è°j0 %$@5uú˜¯fb21TÇå€ð4hA¥Â.üU¢9„ÞúÀ½¯D®(·«¹x“Iw+¬mF«^(éÛÐ÷³, ¼/b Ëí<†§a\´ˆ'´Š¾H£U˜ÙC>3¢5SçJ7f³S??©Ý›a"DaÝÚU1„™oM=äñ‡t Ò+ÝvEÖÌ͈¦‚2ý²­(¤nß8/;»(~¨¯&8˜•OÓÝ:¤«ÄÞ)'nÑXcKÕ8ºº”)*¡‘ZfàÂëxÐP•D^°ï.m(ף˶ÌÜÍ2Õ••¾†&ÊñäàÝÌ7¸/¹Í#„”ÔŽ©C¥" ËE)Ö`¹ÒfKÑ|–Ûr¯Ê·õyq…[Ä 7êcgÏ¡ 4›ébfWmÚŒÐ4ÊžELý¶Uc>Of®„<ÇÆ …ÊÔèN ™¾y‰K·‡m7p@AÍãžØd{N†/n#±;ßTø*êžëKá£ah?²°3øË7ê¸ÁT¯¥M\ãU\%Œ f©p,ê[½oäb3Q‚©³×ÓÈsqˆå«ñ µò²§¡c4:ÐY‘³nX‚á\*œÌ½·j‘¬¨‘´zÌàù/çf—C8m«77@‰¨OœFø"!TÌ‚ ùM(•ÛM˜Á@…ólØ[±"Ëί³XÇì9­kuëÚ9„“Ÿ8¬̬ü¢‘$áÆÙzeË]#&zɆî©2ùàüýÿäýÿ¿z¾ó{;°Î~úÌôàÕDM‹±Û”ÜG<^ÙÖÈY‹ æ!¹£§bQH!í|yÕniIôGãF¦¬B•#+1Ü.d- ôÈh=ÃxtnÞçÛ¾Nk3 uÂðbŽ¥<ãìœduhÒ 2Ç’!¯aü“F›èÒ•­ÉoÝjS* ÷Œ‡U“;¯€FQKÚsL„%©ï0)ÑylµeFx‹sJÒ#@«2­3h+Îù¡FJoê!¯syh¯6üzQÐdž뚒l$7[ŠÉµ¤¥Öy²é·Ø7>ê¨ôÛîU+h^̤v“BÏ/‹±Q’ð£=¢)Ãè·Syôïl¢û´ÇœY±ê.z(]Ʋ}«¯ê_–h›xeéÄb^T ÑYÓp6ƒ«Ñv•6’ r…£_¶ˆ)PImiDM»–àP ÛÍ®MÞ5ca»,pôƒZ,o$=ûmfíP.®%ö#5¦Ñáh™n¤ï5$èô¯šIg¢·Gu›ÊŠº†Ûr›»ÉM+ýuêÝ$\üfÞè«xëEZŒ|½?ìË9Õö4@[:ÍÊÑÑógºƒ{Åå, \Þcö¿ Ç<•5jy;Œ.j‡Ó¾^ó+ùÌ÷Ôw‰á¾:»8ºXË÷z†ÔDŠß|VÉH¹Ó›´­¦Ê„$ú7V@9»jq*ýâ‘“²IéH_IŸ5pry6f³ÖˆI£8Þ4€°Qb$ëõ\d6\z³Â ¼TOœÂ“³2C,ý,¾–ÚODnLûˆì©Ú‡ÖÖƒL”¤¦¾¤ÃF‹ó¶¹ÙæªêTÛ’Ãøô®wÝÈ)qû±Aý I¢Û¶Î¾¢~ O·-7Ô5²,Fo,׈î^0f»WôÅ/D‹{³¸§‡&2FS¿7”×VÉ«…9áUÂYŒè8ËQ@‹‰û¤Õw³m­øäÃòhܪå ÔÚ,´IÞ{(i\W¡«ØM)Ts“*€”¥‰ü.è"MìÔ$F×>Æp]¨à5#+cáeÕw‡Ãc‚,Þ[\ìoUra0AÁ§s+CÍ)* w¹REÔcÀ©Äç¥|†~ËRä÷•‚™¯hª¯•Ít¡1ßÄèl›ÕáìË« i8Ooʪ€M¶íMqõ¥3Æ.›~Y(H PøR¾ášë+fq—Ø'ðD€1‹ÿ³¶¥ü„«),×ÍåØ ­ˆ„Æo”~Ê4_+”–× ¤o‚vƒp“ˆÄ¤üìñ©ëo6¤ø\Y¬ÊŠw›`üuþ†Ÿd‹ã*ªAöæÉÕ˾‡¶Ý}’‰“jÀj§®¶«ïúð÷ü¾4ù–(ÒÁbžƒ@ÆS4™{2æg©û"Êm¢fƒ¨OšÁÀ~Öó»)7™¢2Z_Ü fDcœAåæT‘2åñ¯Œœ·2'ÑC3’®£è¸gBîU^R>6aÔiA0¶„>Ö7‚ J73AÑnQ÷]s˜ø¬ÇLÆÀ»Ðæ][út¡™ƒÎEn×å»Ùí°$rl I¬Î4›ùóu§Œ¿ )Å3m²}3‰3nœoOQ@¤Š<ßoÃap±P½à%„7Ir>·±ÙN uî 8áÇ­£ªæ\x—ÍPÖÌÛ×2ÌDá©ØˆÇªèľ%CµšŠòÆ~¡û©Ûåúp"=óü¬ *º“,Áµ«@]Îà^R+YÍ'ªï0Æ™‡UO\š(ËoË;<Švœ8¼ñ™“ÊÈŸ'%x'nK„æÍ¸o"jq#ÀÖž^Dpî'•Ù¹R¹=•yžÅîÇ#ëÌ¢W±À¹ÑmlAíÑrþƒ<ùeå[W§†"+éñš§î^c?´ÝžÐ÷ëdL#^« ‰.vò®{Z@Xç°µ%ømÚÃ2Þz‹+ržÿveRÏ´LÖj6=PðwÆ/©˜Ñ~eŸM¹¥‚‹+ ÄöÎËÆK|å>ïlJŠ\W®øÜéE½¸/*EÅ' Ëî#hƒz_£ÊHÁ>„NsuròVÑÌFÍt4³€KÜŸ-©>q”T|Xœ±¹Ó;²‰‘NvÚ zò{\Èó*ÓÇ=•“ÒÁr¦¡ÔÍ)i5¸±šžÂ°Myšôú]àîu™»ÍgpJl½¢ìÍèèê§wyØ"ç;™š5·˜b‰ÝK¹þwwx/0/Á¨<ðÈ„!ñR¡´ñüídOÔ'#´Òh4š‚LÞ/2v ²™é¼¿‘CM‰a¬dž9̈ÖXxü視yJk[Ù+¢|rö`½>–ÜP7 B²ò½Ô²xd{˜‡w«$œ\–©ã¥zÆI¼ÌˆFlL½–¸ñEüЏ®&‰òW)ùÆAía±íe÷ßI½-*4ȳ|â-Bì"¤¯å êŸKň²M»‘w°$¬©Ý–5WH ªwÇM”ÒÍ®¼‘jkg2íè¸nG`'o’Þvd3ï»ÌŠ2“¡ã!¶x÷˜è„—Xo3oæ…íŒJ¼óœç†Õ[ Óc¯Š4‡ÃÈ?8„µ© IyW†KB{r„w“5V¬Uy”õiãZ]2y bâž¶z©Á…×…WÁ6-äB‚Ã4JãÇ%“lÞ”÷mÚ×=Qd*äõ#ÊÌ"Dºò| ÙeMQNt'ò|x#ð¡2ú˜Ø¾"UÖR½R\`4@ÍÖ5˜„hâM†×nzm#­Z]Ï‹jðÜÕDOÒ„#£.þwï* , ä^Õ(Ý“\šH0˜Ã,Ùû1%õü6Vc1S[Þà‹¸Ý:Å5ÞãË*ëG鿢­êÊUtÔ|è‡6ðš,yƒåiw<å›^ ây‡7b#Ù øïæûÛ@‰.ñ:Ц¿ :ŠJç(²ØÚ@9ë$f©³±¨¡þ = ‚tA¯8!g<¡‰C¿—°¢Õ‘9Ñ$ÎÚj5ôP*>¯{O_Í능dƒÏ]Œ|d—–^Ñ{ï]ºìÑáCMÝ«*ÈìÃÃ(>ƒ[³ú#”Vݼh‹ß†p˜•‡åªÏ¦à"I}{T]DeVÄ#uæž}‡Ÿ—»ÖÞÕx1O52ª÷qò²Á)™(ø:“Ȕ󢴹#Cv¢ÛꪗqT¾¹ Ša‘¯îf…ŒGÉ “+ÊLE-måk™;8~óI+zä|¬~Û|àòºà ©šyಠŽð%)ØšTŒ½"Í aɈ€ª®Šâ8àduÍôÃ>@MÈšq«èBƒXêoÂBç ÚÅÌÄpè ž– %U £ü*£ äx¾ç{švY}VxŽo ¯ˆüh¥†dˆYã‰M~yGÈ^ho9+ŠwkDZ ×¢æUE™“ÙÅhQ£æ”]8Š-ÍBw;™ÞyýüíAÒæ&¹üÐQ&Èqñy¾°*d@bõY¯z-¨¦çêÖ_ÖsMoëêH#¹ñ[n9¬7ÝK 9pÁäö O“ˆÁ³ۮ6•‚{LdÀf”ÀÆçPjçë´7-€ö¬@Ú©ùÅgóãCƒEiì:¶ÍVÑG`ú9Yp(Î’lב¡ò«L=Ò=žj`Í{<ÑÞHƒë>²—¾Rsð¨Sˆt—è"VsÄP°`8†(a™t@rÉÐxSÙÌ{å…[ß'zׂ'.Êï§ÈJóú°îˆfâwɉ æôËy Ò ‚âj´p˜s¶rjÞµ™ý碸'ÝÒ]e"µg•¨KÐ܈a¸Ë’5 Ò{ÜÄk¢/,ˆìäðUø»ÌȲ¾Ó'5‹5Ò«,xèõX€ú]ÈA1WIteæÓŸB{mxCQßÅëq€¼¸Ñ[½ì–Ë£Þ‚lˆïaIÏ‚„YʽYÏÒ¸Æ!äŠCˆ¥ÅË‹4eLè•ÝØs8•ßw·š²S¿O"÷R[bzïZ‡”x Û+A¯À“ ðÙ’ë€M[~ŒË' iQ¸¼Û¼›€L¦±»£«PÕ[è³;ßTL ëˆÃ^*uôHcž3¿xw…eTÈbÇ:YÙH_&"ÏÈ C€Øï2,!eM˜˜5áöz^ÝŒI|~è#CÄ{ZšÎ+ï>´k ò¢xHNlÙ™Ú²5é¦öm¥Pæ£s¿ˆûc®½H²'PÜD»ìëNA‰R±}óudq•úw °C|1å: \x 7,KõæŠPñu@bjëd›EZ…lÙ™˜ T#ô@§B“.¢êO\Fæ^OÊ!à3À®/­É¯`ˆ‹Ú fº<¸â´""$,ewÍš>ЬÌ-;̵Óä£ §CRmøm·$† þ¦GL&™>ˆVXúsÄê9"ÍlÊzÆþI&*W*_²Â3£¬D/ž±[ÝwQ^ébæ7NKƦ‡c4U38?k+wDÉ‘ërÚHÖQR·Q÷›®]¤ªmW ³Aí\8¹]{-}q½6ñ€–žúG[r½ÞOBáVÈwWqifß½(ç%åo °‹³|8ÚûÅ=ÇäÙºù*lNü„'¨ '©†ÈÆêè–ÈŽgô.´GÈ¡À–ÓxWyÝ×¥A Jª¹ãñ׸šYŒá»aöh†¨(í=¿’!Þ}² ‹¸î…•«5\jHôàoðÇAÌ¢_ C‚š ÙÛ/,VÌ2C#G;̤¶áÿ ¿ÕC‰m\»AÇàFóäç„­hîÇÛõ<€N¤ÝRC-1z£Kì……&ƒB°Gó”h•ì‘–i-*ìU¦K*ü¸BÄèæ¹ !¬£Ø&ð¬&\‡.tý âOêó²|Њ²??Gž¯¸™Ð.,;:Úkmb½÷È–1fú«—-à´©™b>¹‚v@âˆð@r!`„¨’1’ÑÛÛ°-* Z{yW©Éch嬸T®zœ§3xGNrf_ÓÍ}17 ,ˆÞ×ø¼Ì~^­Ú“™#sH)–†‡žLUJiwè˜*Šä!ƒù48I™‡ÌÖ^Šf‡70¡–‘é‰:‘¹e›јù}4þ8X„@LDÕòõ¢éË5°k‚ ÒÒIŒe7ÔÍ]ð³ž}Ñ¡ô™*?/Ü8FU»áyT­òjã_.z$µŸk(wÏ€kS<ÝÈ.á‚û¯r&® ª¬‰Š.Î/æA@>¢2GpS§ŠV“£†R)¶òÓ7›SÐÄY>&ˆõKÂ"Í„™âYuˆhLÞöþoŸ…:¤óÆP¶~NçOrãBÆ«Rû5 éN!WÄtš*«Q¢$é¡„eô©õ麿é^B¼O±bˆÕZµ»@ž´Îbô$.íƒùD„¸u'¬Ü6'd‹÷W33¦À;šôj»ûŒ’Id²…îb “ÅïºÔ•(°À¶ãèkŸ§%äÖ”¼ñGh\s;ĻÁ 8F00P#€òÖš#¦E¼ËϧãÎN³\—‘yÎ@AÍu5 j1[§xDÛ&a—*?=#+ì{]‘&E5åÝP¨uñ ü$ïÊ*š¤H»æM]ÒcºÙfiò»o3`›¨H3Ð(¦>Aü ¸¹«%êa:ÞœŸgš¾H[o|‰;ôXÆ-*°Š¡ž™ø¨ç“çpÈ"G0ó]*1·Š+eÔLјdèâ§.èŸÓvŠhY0ŽFŸÁâA¦sx‚¦g±…H'·æEë|òñC'Ç*Tï^Ù!þ§®¯K¬OˆuØ×NåFaÍ;kPº´ØÅ´¬5O-°cø™GÅðž3ÐzŒï\57µ‘£Ç LâI¾8êà/g ­×U‹'BØÖ¶r µI ëQËV^5iÖ12ˆ¶RH[J;èíÚ٘8ÎÐ;+„¯”»Nêm§Ó8«¾œ7\(#ZY?ÑAVzà¶{œçô>ò©áIÃÃ5;3)ÝT/È\|dtÔf £ñ› $#x“VD+]â#™ù¸Yµ9¢N`Z’›ÓBð#-F5]e²qQB¾Ö%¹Gð±c•†ASW,ÍX["ß‚‹…ôû¬j*0p¢ð"i 6¸'`lqgŸnѺ øÏ§çŸº83•˜Á™Û ß‚ìCò´D, À ûèSçrÑó:!¢4¼S³¹\I"‡ÁŽˆeÞIw†ˆWo0rò ”Â@¹;7§="‘åv4Þiê×²ï· ´uUv ËÓ=ÆIçS=4ju6KµàÕx‚s¬‹×él¸ß}oe Ô”Ç!U˜)q4,»Î"¹…Ë”TÆÛÒì’*/çB4Eïl¥;Ñ©((‘É(¨¸¢£1 R£jÂ`4$2sW]®Í_­VÛƒE–Âiaɵ¬ºM^ µ¡£ÛØwaò'ÊÕ~ëG®ç¥Øb”øN[YU[1½Ÿ‘Þ¼¢ÉV–©ðASI"©)±+Aö`Áûœ*³®qˆÅ«XÈË&ùãCvúDìÍë·}pô;WŒàñ”çiÙ’3µæ R>ÉUôrSE±‘Ú&>l£MÚ<"9ó¬u;*_•µX>wØÞ?®x-®ž”þ›÷Ï1\µDQô9­É,c@'Ð,s_söIJ ¶fSdÌ…€úÔÝŒÌLdoáZö¯šG®<¾"«}žªxW\b—ƒj~ˆm4ßd]ýHÖ¬sÇ 'Ï9C3µŸSj!ûtšgR­1ëÑëË!ôübnx:m“h¨9 !µ|=IŠâ}+…v•Xs3ÞÚ•57ñB©ÖÈvÅÈ b½ƒ …f«Ç•EHqÉo]w$–ì±óД;‡ÒD°8spyláKæ g¢*»E:aÚØë4Ñ_IŽë1û’Ú{6&Ë…#QM‰îÜmð[Zw†C‘¶ÐªE‘4tÑHzù"‘í(€SÙžXÁC—i¢åo Á_iÅ­ùËÓc¹1›PœåíÑ=¤·w‹¡$À×Ê^zy¼?MËQÄóÈZÏì©~S°OŽ:ÖJù±¦cÅØû¦ÕÛè:qöZ; ã§ǃ)}^PÁz°‚‹Çh5:Ä€sŽádgʼnD‡·óÜí¤mTxõ…84½9~)᤾˜9ã½â˜Ùµ1aw&¾Ú iÏOâ%¦Íñ dzGͪõƒ’Q@KÝ'Íš$œ%n´k¨µ.ŒW@þT4)¯{¶–Xl[Ø-àžJìÜ{:¥P–¹…Ezܨ¬V,H¡VÑ9ƒ‰Ô&Ѥ¦˜!<Õ±¨d.Ï Ý»]âTÁqãÖ£d>+ª TÄ2¶™ÛPx% {DBámã9Ép/h1x(·"+›$ö`²n=F0™jÉÔ .Se¢Ú4KÏkpIžK&-ô¢EŽñG·–¼BÆÎfñyš—Õ;ìu²™¬>ygH3Ý^ƒ«u¯´ ÊçÁjhm ~gR_²OË–œb¨]DcA^¸,@ô[ÇM¢ )3±EÜ Ô¿>‘zັ°•*ZBÆüN”K‚3X-õ™¨ÛQÀoIAUÃ%UH±æ^©‹Êɸ¸Xž)¶fg=£môª¢  0*Úv:®v­í¦ÁÇN[ G«DãÌTœ,íUtï}j\ ym¨ÃÁÜœ·x@ˆf$*2…0'k×”—¨°¨Çp…f¦WP§pEY/"AÛÏLt©„3†Zñ«ž"9„)÷€ ˜„ÛÆETÓ ±9VóY†9³ëöÎííOS¯*†Øëᣰ²’‡åçÛ)_<}8Ì.܇N†}BŽ©Kn!§2,>r‹væp`@&Qñ’£Ó­Ñ'jQÑÔòg½‘%­Õ¶:Ö~´’Ó¢4$Ä[x¹ý)齊ãÄ!"£âP%WØØCu'´tÖ`´$ØFdyãú{ÓàÝÑ%O\ô*/hTSÓäk VCþEf‡FløPêe]ÝÆšRXÜ~¹4ݨðÛ+Ù<"‡ˆl™e¹Â+É.¶ÎK<ûGÌñèաˉx™ÒDU>S, 4H•ˆúT/Ñ3¯^UGM%ñrE{jÄÙ½©eóš>Š¥"LB¶Á»|÷uD±•à$©N#ªÆuÇ9dÅQŸ)ÁmO`_#âí£5g‹×¾zÛ§C…v5wC×Vô;¦ú, æ.<ªiãç %U fôÐk¹7Ÿ‘<¹JÓu]mg‚þ,$1R”.]ƒ'ž]™Ã³}‘ôÜÂzQTŒýZÛNµØcH·ÖG¬FfE$ògÎç-Ñîf—i•·ÙˆêpJX<àr]q3&±:{{ílQ´3&%àÆ‰ÂL,вdýf|†b• Dþ~!›T›ÏUZßJo ¦)Ð6˜I(Ò¯tBÕ˜]ˆÆÐ¿7”¸cNB‡ÛÑ  _!b­# k)Nô33&cÑ*|N³,ëû,¯|‰ -KÓ¬àõÙ‹8"ÎBžÆTé|ö3ò7IÀ ¢’ñ®±(kÀS«¹5oX¾ÃÁ !¿É«{Éô«·ØÃâ&òª{—bùš¼ÍãjÉšŽ“áËÃqs€ ¦K”z ë˜èAVWG%Bm/i·¡|^\ao3-*¿©ýµS$QÙrî€Nxh†E3z)PÇ̨›Á<¶&ô³éé\Ÿ1«Ïò®†X²ùH“ìµgí4…ºêfíÃÝÙÝö5”"8øåL>ô7MªÉÎ- —†: hµQ¬ý‹€snÅìG„|ŒFªÞ"Åñ¥1rÄÄNf³3³P¯n«6ÛgV0¸â 9e¡Ç8¼”œ“!q£–£*ÙËÒž‹ ‰Xà"j²  Óž²øåUD”¦¸ùçj•Íl£ë„òÏq¢zønÑ™#¡i_Dܼ&f’ˆˆ&Œ~¶ó»šoÒ0 ¶ÿr!åÚ¬þDµáv–f OªPƲ© Ÿ#eͱ(b<ßž÷­¦ÂÔ¸cn÷d‡)»’’Ñ'zŠ[œ±ðŸÖ!äì7ÆÍԹϮuIåšædE&-ÔimtVÌ/YÜÇO>õ$`D!|Ùa®íõ.®øŸk*ßÈîÌx‚+ÎŽïe´õ-10”ªú˜µ#BYÁ¥äESž'XTSóº!‘ñˆ"­Ó·Žî+(‚œjqÞàS?¬«úËž«Ì…Ìmò8fÃ0.¸D‚cË"ÿ'÷ Æ[È¿ ;‚[²?igYÇQËùU9E&äêÅç¹=L³D¬°m´¾pe±eMÜV¸Š€S³UŸ1©Ìä Â`LàU•8ã¨1m#ÄyÍÜI ÝET »”ºH·t+Ýbîç M\ÉgÌoµ4ÿ—Þž2aQOΆC_6B³Zê p—±ßårrš‰²—>–ƒ4T˜uˆ„&ê"d¶ö”™‘+R’:!V­ÎÓæH£Te‰Ä±myåçg,ªÆ¶©´%|t­<|éãàH¥UÛ1ÒŽûfzlíÇÉ¢)­ç}V<öù—³B&ØÓ~TI°ƒæMžpçJ¾G6­Óæ„D,­Ušt8{†¿LK[ Ê.”Òd‘èwDÈ¥©§HÓ‹ˆù ¨‘atá0¬Î¼#(ƒëT ñÝá›õf«r¸?–Ùöÿ$f`L‘/]´ß‚#|«ê„N‹ *æ,Î\|Û²†˜Û§Uùšœe|ˆÕ-äV—Ïž+¹.”±ÇÆŠ_Ø3£¾½;™ ‚ªÖ ÔádÉKÏPÈP”Ø2”“Ê»"Hª`V‰ò³ ƒ*>mJ8”ÙÓ2x4¸ÁV5Kß3|mæD¤])ûe„3Ë3åE×ûÊÔ>¸ƒF ï º¸|.ˆÇ³1xp/ÔŽÃ{Qãò@À´­-1˜dîžßCt˜ÞŸ‰m”öežæ«ÝkZyŠm¬­˜æOGæ’ªÀÊ7åWåR/*q (a™U_µÝÙáü.çéN°rFaƒCE@ó…#¿Àdé½e1¸(meJ¾v€…„bNÏ?Ùç† –Áf/§‰m©éªáT ‹U§t¦]Ü‘<åêi\l`ãq2\‡…Ž6‹È™Ô jŸpõ¹R¦ºDrÄt1ÆïˆGhF¦EC°S"̆>ôØDxeF=½~3§ýTòQ LFùß-ßr Òˆn|ÆŒ!ôІ?]Q…|nìH0,À¦ÇvdñªÏÏ]≜×@"§Fð^z"![Ñ Þb4´$Sji!¥r4¦Ã¡J>QœRøéÅQUò àÞÌÞD¼‚ÌSÞ㇨ˆ!x?–%+µš ÀÆü,Vl¼Î¼¼¾èòf)ø²=4´_c¯–  AU›ŽüáDîxÂr8Y€¾_Q0•Û n2iâªédJ¸[Z·zRÐý°¶Ë¤}ŠØåÌŒJæþ"ÚB{çz_(R‚©ø •,ˆÒÈ ¶dŽÉÈœ ˆ[å>yòü ®oƒWîÇv9;÷ |âÿ3îù”MñÏr­¦LÛ;5]ˆ ÒöUQ4o¯5”¢M‡vjwD)š Ÿ,%Räªå]És™ §-k]Òt‰z  H6êâáX–™‡ÔBYÞ!×à6a å·iäYcÊÏ¡†ò&e¾„2¿—Ô ù¥î˜’¯•~Í, °–q{ï36À«ÂϺ¡Úæ>EŒPø>=ôtÎØK…Ÿ³jLVërª¯*l`/z5𳆙qG™ÌbÞ˜báõî4 ò™ú:ˆš(Â3q3 a(ƒS_òÁÌYU^sJÛ÷ŽÓÍ´À2€Xl@Áâ!lSÄ‹58¢åeRìeøí=_8çɼSç;[35à$Ű¼Ó|Ó{ŸMé`ÒÛWUùõ s á‹[’ˆyèÚQ!IUº’C® àŒÐ‚’ÈÝ|(ªR€´dlÂiHÚŠw‚|ø”.< Ð#)ªÙ/AQG¬–ƒŸˆ#îK—+\Ó9mÆùÜ„Æ$rÄB‡¼µîBOH‚ðÒŸ–X¹Ì}–l»Ï “´Ï°l‘eK9²³~fŸ.ÂXcº(û¹•WÚg<0XÔËÖ’@Ú³îe8¡2[³Dž2•gbuì™òxô“áN’A1 6Tñ"âÍ¿¯Ó.³1éfmž®ajjºž§JÍúêàtDÏ_,oÃÓwur~UA=?óÛš©õóVò"–7ë}š¾óøq4›GF©1@š¼²òæÕZÞU=Ò´ªŠòJ€îÁÆg’õæ® |³Z$„F¯½qŒ·3²99îªÆíye§†–)Æ.Qˆ•ŠSw2Ì´Ì–ö>»x5sL'Y¼j2Û•³G;;voà­¬$˜ê×7`#k¤»a}Ç{Ðyóæ£š/pŠè9->ÂΖWE*ðÞç‰ók=}g~äÉòØð¢5Nà"·y oÕ8|Îfšï’}y«áÍ9ö…ÇL˜=½’õŠõ˜A<ìc…¬áí†àÖ‡Xˆû8+¿ Ìs6ÚnÛò^N×bE¤˜Áâ©Ð·²f ë;3×Þ‘Ëõ”z:üÑP¦„ÄŽ "{/ƒ` VÚüž·r·®‹{[R%RäÑó''KU¾Ïc=Œ—gªSy.ëCÁRc:wë5õ>#G§åÚmÃÕVgöv$W/–mö¼pÍ£›çÎð¤œçH!› ¡F•º˜d®ù ñ½9ö[Q ½ å¨A J› 0Á:O È7 "3ËÂéë÷:ÃPÙÕxü,-L[)G€šñ4Êyºõ¬¾É«\±Àj7[³jo õtðúí»ÙeÃÏÅÕ~$ĺW*„¢Í1KKòèI{NïðÕT¤{«×Az¾æ¸!}nÙ»Kñ¬$µòÊõ¾&ÖAó_¯ÝÈ[yR!¨Y^MÍܳ&8«â_EzµmüìÉÌó#eb÷[cK×°ÅÓ¶|4^bQÀ <ýY‰¬b«³^aH»>ú’³ t!3ÌmCtP!ë ¶ P¯NÛ …L_Q9úèßÌ^´Öœö€ºç¡ 82Nð2O7ÏÑ.ö ÷†LéfwJ’¾’ ä'ý¾YÉéðb#ΔldoîƒhUZõCFðøLFaíôŪÜQ«w)ëjvxº„ÌP_Åã(šc¸?¼†3Òb«ï××fzŽîDÛžQØÈ‹ž=ñÿ(,,¾ *üFdдƒÎò"sY<Ð;­Ð؉Øà›†e|ßd;‚YÕL~"Ì#Gzò9¤¡ÙH…§C =:ù|4Ž++ g[axKæŠ9•ô 1u9·úG<&¢Ô™‚`dž¤‹ Ìøe¡vÐ^—hñ—©TzÛ:K`Ù€6„ý>Ù©2Ÿ°¶ýÈRÈ"'÷™˜QH˜~è?KßÙjnÀÑó'­Ȫ¥çÿ;1y¾L–޹t6O4æ+& È“Мо™gñˆúÈ·¾_i0;*‰Ñœ6qÂLAæ|¦& ¢"~ˆÏ¼é蘘9äBpÛä÷›j¹¯5òx ×6’,hM|ʪk­# Ê‹2cˆÍ‚×.û kÏg öB:ìäõEŒ¸ªOÇuµ(å‡\›,å D®C©°hé¸è£oˆ“¼æâ)ÍÚ9”~í¢,QV…åœQ 5çÑGy94fíQ‹)+4Nöô Íû˜Á©Ì×É ft¬g…ÉfnˆH½%Šªy·Ö ÎgW™Ý^¤¡&8¦aE(Mj M—ˆÅ#¶×\ô`‘2N­q‰à6Ô3’ 7ÐN8²VK~ †üȦ¦Ù ·dnäŠwhÉï–ŒTl9yê#Sn\㥯j Pf*ž"óÉs*¸õì&!=5 µ+”¹H1¢³$‰‰ ÷³›BPñJ ¼d^p¦D¤©vD–Øl4ó™ßÊ 17ŒïeLjQ…-Þ7®4f:†Vù‚ü™Gøoãb‘»5WÅ7cms˜EeñÓ8ç– p[@SÌÂÝVjjµòjÏ)¶¯•›õÒfØ×,ÛY5 $·Z"ó½¥_¾g Tð-˜£«Fzgb,ããSW.qÚ¹…5ËL¼DÅÇA¼<"ùÃ&<ú^žHòúE¼Ùâ@n’ ˆˆ¬¤Cì€9ȈNĤà¯D&)Þ“q°³0õ3û ú‰™ L¦¶ÀÂ20%ý/׿jˆ€FjùÜ\â*ß;ñôWÌ*,Gægo*}ñŸ‰XHæù¼Ã®ø©7è|™„DÔ–.êèª>Ǿ¬ë_Wžüã§™R‹¯aP8Š€>Þé:ƒ••:ÎÄ‰Ó ©c%\@ÙzüüfùªÈcw®,d‚¬~7¤“¾!âxH7p ¨ü† pWòÒ¬/˜ˆ°¡¾ò.‰yHÀßéK—ô?¸Zt6Þª¯íD–£G¬0Ø•È<Ó†J˜µ<õ¾¾øž Íì©<;Š»¯i‰îõt)ˆˆË@h‘__Å1ÄôͳË÷v€¼ÂFH@ &:nÁƒ«,†§¾O;­_Íõ†Ÿ¥‰ÏÝ~¸—xñwÂS¦ÉÙ0Üc,sQ^”23dU-CÑ~R§{…`ÈÓJ®wÞš¶:_ßböƲ†é݈é /ÈxÀEËŒé¡!‹O#눎áo$­H*­±«$¤¶”¾:óŸ/²š¦Ib¤½”»±Ó*‘íAðí¬ƒüqß%ù=n¤ …´q—‹â>õª*ûZVú(ÅßálV&Ô÷S“‰³å¤"kš B•\X ð™CÙSz›·’P;[È4š‰n@l²P³¯¹—„hÍoX $—S¶’…[î±3h€…\(p¼JLJ"×uT³‹ !o˜š~à`çfûï>̼úHXæ„þ†äN|Vš«ŸÌ‰ÈRªBù}8Wç€DF7CCÆ*òŠé!&X ½: LòCŠG„}S,;ó¼ ÒW¨QÊfÁÓã?|:hbió-jœÚ í²IG¾$¨W„J_4yutÊåB€)“vô.vRãÚä­™„¡‹zõ'¸é hîNAËobJƒ)oÉ4ÌØ–È\ÃY¦):!&\æh¤(KudÏøòÉ•vL !Y Õa®ÇNÿDßÊ´7m"pÔQƒêeo–“Y*"<J9Ó èäBËçŽ[_t{¨[D€Ê8µ§ Ö¬@Ðô}†ï°´¯ÈE[£È—€æDÕ®™Z¤@ŠYTœ "¼ lÁ™ŸdºZ âCדӿ{C뙊M¹.ãšµ.!ñŽO•ç¶„ªÇÖá±Khp¤õâ\ÄâœS9^¦r ‹iÂö:ùñûǼÕ^¢eXë4Þ¾z]Õ²¹W„!•îÀ5#j 1wË$LŽu¯ u±Ë›q˜9kÎu[dõäTa•ª^3F0sÃ.§ð’•÷aôq:cn¼ª¥:åôø›Ã­0., bô1Ùz0jqOÊ®>°ñX°ù†%ºµ¯—cržóŠG æŒ9<•ølÑ`Ómck$ß#×éT禡­J.ªÓÒ!pjÈÑ_ G‹$2mMÞ[Œi©$B%¯Í,ÌóHÝí95JÍ_T Sy Ú´Y¾~SUB@2© wb` ”{be$Ÿ¼H(L2Ô·™×˜¿#Ãx×Í?·™+®ÞÅžˆìÊKÕ;3µU×*Æ*Hgz Þàq¡3ñ¹6˜'Éô™hÓŠð42Ñ\)ŸÊ)º >å¹gŒo»e<Õ]J¦/ä”ÄWISž[¹r±T.>)mœà rg³ÎàsYW3»_dPÃÀÚj¤råÉ,Úy2zZ%ÔUèaÙ7†Ô«Ö]“Ê ‡‘K=2wC «ö-§’½Ê»Ëû«–<þe/·AÇš'‘@ʉÆö¯©ô‘{±ßÑ»&njÂv&ÖÛð‹»9 rã°üäCQmŠV–ÿO;ÈSã.[%(jEò ÀÀf—rî õáû~Ù‡aA¨¥2R)Ûôs•ûvæ¬õñ턚 kwר|èÍ×µæ4ýTë‰m‡’O‡(é $VeWˆ¬€—Ç·£«›ÚHÞæ°z® \Øq7Ý3Ô¬y©ß"üÃÍ;Þ*{²ÃæÚ~•4Õo”9™X0ÃÒ(´¦vSÆ~ï&€ê?‡„R»%\4 ¸9›¢VR{"×À™ŠÚaZ[Æb>mh¦Ž411AݶGéîØFzà•›æD=„?¨ÕÖzWä–´!½áúô ê|uŽŒ¢D%RäÒU´úDnMסbÔN¾K(ïÂy‘°Oâ“Ï ðTf°… Ûû¬‰B¼Ø¢{I+AJØï'ë-ÄPX54=ÖÖ—\*ñöÃà†ÒWœ™˜ú”!šU¡IWÀë„&%`MU û䯘þ‚Í¢h"¸ (â!xÖÈÉ`D¨½)IÖ•Ë?Dþ) c ƲxÛ¨š/°¾#\$Æ Óº5‘Œ;¹,=×R—(oUÑŠS8RÜÇuf E-ÆK̦Šm‘³rqSO¬A‘§urQ˽¨ §°Ü ÔPf©-H7‹÷Æž±è”'bJ¥ŠVU» n¼•V8‰|ú#&WßszªªôÝr^þwS¸HQQ6ˆ¦T:{ÜØ…oqû" –6U˜€ÅWÃFé‹ç 5q;0î‡ßê"Ô$ ¿Ž ]‹“‘vžþ¾²lß¥Ú áA)Å_L€Ï)V>¬ÒŸÖF˜öç°4c(¶Z Ž fâ˜8ÓƃΆ6ÊÌV "±ÄOH~E‹Öë™’©•[!jìd²„÷oÄÉÈŒl£&Ç6ÅK”ψj~Æ``ôê…,*üÉQ|_{)*%¤Ô)Ðü.^_$©Ô“ºböý jþ|¸ó:+œ,Ì¡3òç"d8ë·iCÝlqÀb(ûW'ȱ`õ©¾È»6g ®½ö9Ý?$lmv]”kåáy-ÜеDƒ&½ÊOñ#£Äø¶ÇB{åÆd%c'^R$€T㸯¹¡#Æfàcì61ô’ž¢´s–‹1“3ÈÔ¦è= ‹{3R€ DKà„b¾‡8ÜCÓaK1Øšn%:]ùÖ'ì?ß/Óž›™íGù0Jý ä˜x¿]UFòÆ>¡ùTïÈv556—oÔ­™2¿‡€È4…Ñß½NNXf#æ÷2[³›¸ø[KU|›J6;ú^¦'¥qÅØháRfT´ðÇÆÎ1nÓóiâëZ…'E½„Í7™´ ƒT ቴŒü‹Ñ’’eówb3‹8×Ò{+å”ñ[ó2xQÖ!ç©RQP|–¯ ¤&Å û¯æP(3ó'£x‘´VÎî´ãAýÈdÐî^iÔC‰4µYl†"]{{ÈðA" Ào.ë^剟ŽlÌALИ®™…R¾j7÷?2.¦ô3/›ç^VM7cŸUö>?ÊÇp×£[£ÂÕH!ƒC÷¦¢ª^Ê"•û#jŠþÆ¢(:C£ñŸ‰sÇJ¬Å«$B®Ñ¿"ÌY¤Ì[›>k›¾Hø/"VÈ£„Eg€ èjˆ®®L–ØóÛŠ¯Ïà²B¸–0Ö€òf3'¿’hwj'ÑgžûÊß>|(néâiBHaO8á±?Ašo×5=S2‡,ÊLÜpBf^Ý•Œr±¿o-2íšy×Ë$‡èB(C±Ûfºƒb…K®MUu'ŠÓ3åEQnq¥r¥$Ÿã&<¬~#(Q©Ÿ™öE†C0ù®~ã§æg”!ðˆµïêóSH ÈgcÑ6G˜RÎMÙó›|gGe&o[~¦@䞤»Hè»¶®;JQ³ yNj\êâ pÜvnwwHReE!„èUê'VŽï™×Ê¿| ÞSŸÙÐŒÑpFèÀÉ3÷µj8£ãÒÆ@{+í[2ˆ…ûFÂÙʱgÝNÿŸ³±AVè Ýê8xž=Ò„w„0@ É25-r¤ ‘¨ÎÑ{èó ŸEo*‡)höÄ·8·\¦XãäxD–ý5Îä ’†¤Hÿ*Ê…6£†8¸'Ât–ЫYBó Æ©«&÷9¿©Ãæ!nSêwj1íAI)ƒòÉž2Åqs¿¹aA¯_©•©ç!ÿ“4³21½™P壧ȈÄÀ gßo‚‚ðžÔ.ØŸbzYx—ã#?°KÏ"zF~jðM–#©kÔ–‰>,ƒmBƒfѦªÛÚ)aÛN„Pl•t}2»u”ýŠõ$±c††Aeé|Dtò[‡ øÉ¤Rù½ÉHª¹\1ÊWŠ'xNÖ±f6¿)ük˜Ž ùD~;5~µXeŠÀ) 3¼ø€[ŸïŒ1V©:––S'96!âœUeÙؘ5Ç2+©”½ãRžüŽ,Ðq=¬Ž„ÐGƒ1`V‚¶~3'לáÕnŒpk±Èe½¯BÏyÁq°S³Ó/$ô^–@P²)0õë¤$´AoŒÍ³¡d2^B‰[âóßj¼u×’$¤'ÊLÊÊÆ­ÁôÃJ‘øï",C7DƒR}¾QÄq†;oH3.‚›Þ’jSý Às™å;˜Å2™Á¦úµ¹Ó™7Ï6q rž|“døìSꦥö7ØäT¼³3ß8ÝÄ‘‡8™[n<]åCßzüà©@}MhñÑA§å u6 UU£…`hYem¢Ñ‡›Àc£à»™E„%¡ÂM§/tbÂQ–Ï+ºÚšJšyÁLÏ‹,™˜ó »³®’ ·0¬3õ+:fþ‰ŒsJ1Îo ù>cûtê[qŒPÅn!µË™œc-˜éœÿí°Ÿ¿‰ÿöžþ‚?ÿYÿHÿöýý¿þ§ý/÷>ÿæ(+$Êk!lª@›ÈŸð† ÿüGÿÿþÿÿÿ@L¤¿ïO“@)@  |dö5CAèPt$7cAÑJ1Ò€³ì @W@x€}²NÛ2ÖSêC¸¬©²Ö¶bŠèDRÕ(X :ÀG d4ð4O¸¡Tõ)¦VØ ²—Ö»;s1ÛUB!VÎ'@öÀØ:é¶:ÒØÐ*‰€^àzz€ <íôÎyÁÈù (¾Í(è :4@RÙ pìvMm°Rƒhx¾z¯§C›²P™ÍªŠw1FØlc¦îà8¾/—Õñôwi ŽîÜbÌØGKmÖ«V4¶¾7½¦&Ÿ#wHØfØlÝ››a´[»”ï‡ÌïßdtîwÝ î­³¬*lÚÔËXàùž„ª„•Q*@©yxy½Qìݷ׸¬EHI-«àùº½‰­m–š©5¨”’G¢˜¥Tn;¹<ꫳ¢ª’€¡T¹¼|oS¼Ý¦*IQJlòutÅ̸ã9rºåFçtR–6»[Tð<î¸Â°{rz{Û( *Æ   Ðh­lÄ¢°v©T]+Ç›Ê÷ØH4ww l9ÙÙ§lƒlª­©%·&šM«¶Ö;`=óë÷° [(+6³wcªª¥ >¤ë¥–ÍWÆs€ÆbvE &àÍ‹°îÊÞöñŸ+Æõ}>–ÝRR•D|>=ïføÎ© ¥l)V—Âùí=†¥*%JÔ¼<÷½”EO¦… v°ß›ëåJZ5}†-ž»…ò¼{ß`úhhXíÁUW9ºÂéÜÍ]ds5(íÎÖ;&â ÝœíT]ð à‡ß;ÇÇݰúPÖ–ÁAFû¸iÕ;±–j||Ç€ô¾Úìëve¦nÖ¢K·\V¢—ÔøÎûâYvËCUIvÝÜ®_™Þ4ÙMlÛcJðyÝ}O™vK-•ìÝTÄ®øO==5[T)mG—“½m%UT­ ðñ¼/lÓM°‘U_Z$WÇÆy{6±ôë’§vå¨OžïŸ.h²`óq¹E1°è7FS¬swk0çnÛm¶|ÀÉãÖÛpñÜL´*´[}¶îÎuÕMðù½ïµ.À:(uj©G[»²«ƒáóÝ_m$¤¯¬¬ÚÕOƒç=í•*‚[k6¼xÜÖ÷wU+ž;ÑEz»7•æ:» Ð>/'ßZRÑkJ&¦û¸¾ÞûM±vÝÝBë·s=|Æï€ßt¬ì3¤òÂ*Ū¨ÍŠ®nZê*åܪ悾€xÞk×ò÷´ aô@®×Tê¨+¾5áô:>VÅ-k»ºÛ`ß+æsïµÛ6LÛJ•´Rú¯“ß_q•¶¨U<Ÿ ÎT6Ͱ4âЪA‰Æe 3šÌ:ªow¬Âg{_Xíµ•z%ðÌøöú™PaB) _À ÃÞÛ£¸w—¥æûnÚ´ôݤåðǺ@öÔ¬µÇ„Ýëðfz•uf÷°N.Vg@‘Á`–,ºÐ“‹@ïlÊxLñì­pà Îj¯®<á÷c€.úÕÞ>½í¶‘èxÂ;°§Þ§·J4Ç‚cÕÔq²ò ØuSÍ3;k¦Œ&÷°uA ØÕ ÆÄ@ÅʽõÞú{ËësjÊ š*yóX¸ï00¥P6[׋^[mö³Tt$ñŽå¶«¡lh{­ç„g¥ ¤W·^¯1¡«XP½¹á´z¯Y*€Oª*€eÅt*T,Ü3` R¦Û…Ê,¹öá纅-,¶ °q„n6îúíµfÕè;·=¦0 t[›Ã0T§{»ËÅ—tÄv#„c¦ƒCvc`×l+C.®à9a˜µŠXáƒP 5`9O}½ãæ(ª¤I"…L¸få^ÚúÔÙ›[4Ûo_ ܯ™-WÕ×Ã0DRL„XÆ¥# ½ÔN39RŸmIT­¾óàœùìЭhsÂa­ÓðŸV)J¥j€eŒ±­¥ŒÍ= €J$ @¡ˆ h$ ê€h‘ аÐte¨u§u@€—8zt€h(:"@F€´ P   Ñ¡@’[2ŠëvÔ)I  µ qìÐòª ô$ i ­§Z§µ·@ ¡”$€Ðôí¤4’C JkEƒ› €ÐU4sÀdÐt€PÐ  €¶PÐÛ°»P€ R6 1˜2Æ’RAA@(€(Á4MQ•ØÐÐi€’€€ @ A@  z(’ô€2ÀÄ€ÈhSð$©ˆ˜šI2i‰”ö‘‘=&=F4ª~0*U”Õ@SÉ ˆ"‘ôS5=LÓÒ=M2bh@JbŠQ¨i¦£ £ £L††€4ýIÑ SSPÕ¡êA  I¨„ @@€ ‰ &DÄ&¦“Èj4m&¿ýüÿý}Œ`Ì!÷ýn_Ïò·¯õkõ6Ö1úïömµUYƳ¾ Ó¦Wxd®v'¾ŒÄA*+Ñ€n’@Y"Ü%íD†âÈ["‚„‚*,Š("J’³8• “ "%LžÏ/'),VJÈB-™-e’TÉ–[%`CRRGR ˆ"E3T¤9!ó Ä LË$1€68LMÖ´%E4c#±õ-:•Žª[›Ûv ̤n¿lÏ݇G¼_‡-™¾a\›åÀÞ“D@7–…¨d:›!»åW<Ž3°GSÞ̓£A/plöaD)Û(E'kóG³öUÃsG%ØŠ Ô÷rï©ÛŸ»T‚µ%É‘c¥±E×Û™ãé¸{¦vo=軤^žG,ÔŸìV îQß²eÂ6v$k¡*×CÖˆÖÀ/.‡ë ±I´÷+!"‹à9dñ·:{œ"žWY×v`À»p”I]¦Œ5÷ev<Ïw”óa´QµÜ¬ñ”uª ‰«F…ü0þÎ×>ŸEÈ7tßÕ,Ål’ßÜ¿[ÎîöÀB}â·œ¯x³FŒ-F@BöcÎæ;0µ“²Á£ËUãã3¯Õ ´ëY싚3o×Û_›ë $ý®É¶@ÿaZø¯9$¯\ßi~æYý»zâÎÖä‡Ïwݦ»×اãwz>(’¤öac™«éñ[Ùe‚ïÚ1Äþ;Ö²G¢ßÉ 7{{;žëÕšÞMË&¼Äòy=<†éV3ÛàOöuÉ6f)3t`}ˆÓÓô`VS±y8LV(²&—€Q%äK{ša™#‘Brí©wº>5KËzó[Þëçí¹à|Íáªö¯D¼¨YíšûR3Î$ÒÖ;Ì)¾ÓÚjµÃ•|“”ãóŽï<;Gk÷^ñ©G/Uà Þ-âÒbÜ•âÑÌÛJÈZÐnJ 5×ÞÃëyì”ÌÍmcâÞdÌ¢o¼8{˜Ídóë¾à<æ~@M7õˆLüNûyã<óD¡ ÎåîßÒÇîݪ¾Ÿ»Ú5[w%Þ]Ç©zœ¯f°¹ñ¹æFM䦻^Ž/ݸÓ$»Sn0p²æ§¸ÑOݽ„ÝöŠ"PéÙ¾n>éàI›©Ù ­·çZ YãÙ¹¯0.6m´%a»` )•è—–©`R™]î’µ3º[yfщֶh^×[ñ0F}O²/iÿ»{ncÊ茜âÙ=‰4b}Q¸°ßeÝö¡çF{®æÌãG^@"•[‡ÐLÍWÝnéÌÙwŠ(±¶b£v¢;%™=Ì.¤3.ë[qvï AŒÝ†·ÝÁ»Šº÷9]ȸKÃ2žW¸öÚql–z¾›{›’ž%y½$–ȉ–•óvI,’F裸Y=$’[}m¶Ùé#nÌHæ¡“¡÷/-Óë¤V%gs’’u·$2"ÆÃÞŒ¾î˜[B½žæ\’VÛmÏI$‘/÷@^‹A݇ÜÙÚS¯gfJEåfà6.Þʦ$oh:¼Ï>Ábd Z&vŸk‰ß(Ò¥ä"€|(냖^*åí÷ ¯/º¦Î§/ª3¸.öa7nOÓJY.º‹ÊŽ{[†}ôì™÷oÛ'¾ø Ó’-ÌÂ8ïIe- Q¤­¢IHÒ/»M ë¤“K7Áóp’~$•ºúÏBF$1¶Œ$6•F…ÕÝ—I‰Ea(Ù·7¼3®9µ®¸ òíì‡I¼ë¸¨“1f £m؉«wÕ£DŸª¯¾U%óûëg›hßTj^Q¹$’FÛ­Ö\|èáÄ{¦¬ƒ,k3{2)¾^]Í´»Ho¦ás¶ Û­íðÒ@ò&g1¡ëºÕP¢íGÐb/6xŽ86Å! [9ÕÒžš«°ìzØc°/ù6ÜÑç&6—±÷W‘n ™¾Ø{¼]çpf)¯Õ¾†ew À5u„¡ìI½¨ì¼¼ÓB·[Å<<À5¯S4•|ív×QôJìñÜ‚m#=€v1$^%M2ôÍ>‘BÙÝDÕ¥zñÙœîì16¦ìJÄ•´›h÷-ó­#´_[‡_˜&™oº$2¶ŽêšUˆöcôZùªü^HGÊ;‹ ÷ÇïbÉ¥÷ÇÛ 0Nözºòù€SDÞL™‘w°›kmžÝŽD ¾;›<6ê»íC¾‚È©š•>$Çà "ê O^@ÕåîIB ¢k7¸®·A;dvH¼$ë$I#º¹P ”ÕÏqÓÔØÒ©'Ü‘òðšÁíås[ö,2¹ÃÌiÛ¶ÍéãÇVÃÌ49l»á™7ÂO#$›fÞíÆ.b¿(‚˜€â<ãõ§l»— ¸æäMìëËf£’Bq5wJ(Á9»g.ä'\¨îξQî_F¼b'ž?fÃÇ9¶(—ãð–š²Ü>8Jeã\âÄû€øËîÌçÌàÞ‡.ø¢¥»ªvs›¼†Ç’¾ëƒ7²ÔqËxÖ;wjv57»Ù;q ¼Þ$úý¹å±û9`@óž—7Øó½Ë¼ç„—+¯º×X;Û¶uQá¸h€Ê»Ò£=Ù8`;¶_mÅëÚö£â±öb¥aÞ¼ù·^Ò£;Û¦Þ´š–;²":,‹Árcexå8½{®uí9 ô¨ *åX¢/vèoï )åɧÞñ}:Ê,–.‰]™²P-\“Mi!D«ív¾¿}ªè羋 ãÛ‹ë–Eäˆo¹@ëd3»±U4ÀʼzQÒÉy_N÷ ­ðn÷X×8î²D+BÑE£€í²X\î…Üv”lm¨ÍH2r؆^¾efŸ_Pywµ¬³Úò†¯Nl®Ý<÷cK4]º&÷¶ávß Í»jëÁ £f@=»ã=¢¾7#ÐEfɲã×Û¬ÅEò¢w äË Šlš\7jøÆFÔÞì;¯#7C[ÙúÛäëÝæF?.Úzãz}½4ÇàŽ¶#t½¡Ð+¼™®;å‘´ …†Þê-9˜è»^¾«ÆYÙ³€-Ÿ†Ñ•Or„ÕÚ"ÇååCy»@ÝUléiìÁKw­Å˜±Ì˜SËi ŸhÏ#·‚ͼ.AôTj¬i{º^Gí%SÝj=4îž“jGQ1ÙÝÄ*¥cIYY¦úÛË‹œ”;tj{µm‰Ì¬ª…{º¶­$Ið6ºøVµÙ»½™w%܉ëuÛ¥I—¶Lzc6æQ”1Ö»…^Ý·Ág=‡wVÈêZ»f­E¢<ë¼¢1¦ÓuFÕm·e²I$“ÒFÑ$–ªU¶ïžæ“×¼äxÁ9ÛÑz1=ê!ԞБŒ›§d0ÍCH´jm™Å<òÕ›ämé8.! sïv[Ú8ž¶v.ÇÛ-cÒÌK€:çIÞÎåo¡ÞóÛ;ŒÄò;‘G¯Á‘eìCß|º}ö‚ÁƒŸÞ¿úîuzïD®“«B÷o·®Å¹}¹}¾î ‹78~t–Œ2£0“é,=I4W<ãÚ4q[m¹-Hø‹ò†¨$ñ2®ë]Q•®úI%‘¶ªðO™ç1ÄC:\¹]RÜŃzÉrùÞó\õÜòÞçzâ¢*¸‘*`Ó’ö+ꦙíÃÌŽädñÙ»Œ󨻦tœËô4…;‘=ÉwA÷Ù³·žyù÷1ªw¤;* Ú†¤Œƒ¬š‘Ý Ö4tFê.¾Þ± A‹m©h›æú^xÖ&puà^ ßg{™»RUÎjwwwq Ruèw¤".Ó:,„;°Ò§uZO¯±{Ù„Í)ñàÊvzž÷z@÷}qL&À€ç3!6Eäm7ÉVíØÚðHî ÀOUÄ‘õ›§T,<š/–Og†‘ºÛMzÇ·L?6ͬÚOÝFÅ}vœ·ƒv?.ÈûOF\».]:zÉ£YèA×èÇ_=µ´ѱ¥…kË“”»ØV››•ú£ð¶^ßùÅ=ÜÃ÷©€w’ ¸Ò÷ÌÖg?'ž~_²ç€è<þöy¹ÞfÖì쉢¡éRÎN Ï ê²Žw Ô‹;›H·ÇÊ»xI`ggJ4õ«»R]ʺï•CsÐUuþ†u¹‹¼JR‚Îû¦S3|»ÃFWÌ÷¨ÇMW‡ÙÛ°w¹ódšý;½Õ…$ù“j4“<¥–$MWÕ»$¾†X¢Ü¡š‰sZµiö¯ZjÝG›=ÝÃ'q´åíCׂ©Àfš¤p¯kÚ-ªÔHa‘ƒIÙm»<ÓÖTð|!ôËJz¹¥hÜ©U¾ª1à€°KÛoµÍÞeÆO®[@ÕÑ‹W…î:<5í0/_oµÜÆ>/%Á1vÍk‡µâ¾P^ºÂ»€<ìyèuvhß)¹rÎÇÓ ¿ÉµìÙËC{Þg³¶ †3D;»ËÜ!›é·g§¸¦ìîj"39qÒ0¶”©nq/Ý$n_©Û‚"•íëêõíÙ»NvÚ ]ðЪ>׈³àmÍlfu<>ø%±{Z=î _”›Ào±¾í=‡½°;TæN,›ÅAŽb0Nà§àÿƯsk–¼Îàô@“c¦¤¬ÚG `œ1€;o4êëÓõ³sžìæ1±¹Õî?¨îOÒÓºE¾ƒÏ»Ë”pÛçc«É)<:Z«;«’…æ¶ã²ŒŽ‘£™Øgç€H¬¡æ.^£Ó1Áä©Ñ‡Û½ñ2Tëi ~%`}]Ù϶ê2ŠËIO†.Oò÷t6>ÚýQ’yêü=röz ¢¶ò«;Ñõ}<øJñûÈ¥æÖÆk‚6bð;Æ ªû“À7³Më¾âh'1f+ôèö­ÜrzéÕ®öÄôÀÈÕÝ#W70ú2]EÐ{›§„8òçQÚ·Võñ“§3ˆx+€_ËO3L+/"iÚ«öÔ´N!v4–’I(žiÁÉrå„€€œnÝ–M’‡Ù:¥…û—=ëÝ7 —NaT$6M‰$fÝž‰º¹tÚ_TKZL¯q«¢K÷{% ޳Ä©%Âi¢Æ÷½£äR¹¹ÂÌJ­(Ô-š[öøín >}Xr€'uíxy±]J¥zµ¹d´a3ð}Õt¬n²»UD²`¤ÍoU®äÔ’d⑳ %¸fÏT4ôž¼„ô(´¼¨AÁí6œiôSFdã4j^WÏ—^‹Ðm~Ð8ANï¥ Í¾›,ö÷»Ãwy¡èn)ãÈ£çí¯FA|iÈ 3Mž'ÊãkqoNv÷Ù믺øø îJ¥ œõir á]2Ð:{.ûƒ0±:Œ>>˜uÃÜrz÷ŽëXÜT‰g>}Â];Ë ë1ï­­Y@ñ܈—8v#¥<ÌA¾ ìK»SyÔ±v™ËÌìYºm<]÷$;&ud êgnÑÜvëÄeפǾÂó`]óÒÈgγÎÙ£‹kÐe㌞°Åw¯äßC&µM:7ä4)«N`ò·C¢fÛî}Ï8Œ=“nÖ|KÔ#®ï¥4Õs’ÉÅÑÊ)zÃÝÁ+•åHr˜m:>íÞª |_Iá)$@¯/nìM׿ßqï]WÉ08Êá½×|žTæwCÌ£UFÅîe¦ Þ…yyÝ^澞¸žä)sZz,'·p{›˜W7ÎîªVè jõJ@a‡z5W~ÚåÚ»u ¨®gk㺌ûuo@o¸ùùsŽiäúï³™±ˆÊÂI‘»ªˆ$¤§"âlÔná´^»0µÓª «„ ¹qÞ¤vp£·_3<òv ˆ½zâ+)Þï%InÛ¡\W6îrªïy9¶ËԣƹÉmñE2‘ùuñ©Ñí8À|+WCÍê^úz/;”NðÅè, ¶pÜî×ÏwÚ9]»®¡²¶û*²Q-…7:PÞÚÆm‹¸ ¢UyÈ\c箌òÞ7´rD 29¼Ù/rçÕOH°ö¨–¶’>ײ²D-;`ÝË–¡ øÛƒ·QÕ¬÷žòã_о~~E…¿hÛÃ[Ú9?)¾5î.=ÐëÒ¨µ[¡½£^áÅèMú¶ŽÎ$ï3ãé'ó¿š_=;ð;ò+묂êpâ=Ü×vU²Ø'F*o™ózCfŽyy`çí‡ÃVå½éÞNœ8ïµC{70l;ÝžÛJýK r:4;”jŽ^,œîÇ£ïfBi¾èúrëmÐÀí$âìš34¶ù';æ.>yË»#ät³Ì…w¸–yùÈø/ õ¼Ë&‚|™tì÷­ܽ»|×´à8®è£í~ÍñÜ/fÁ“&£ÝSâèòÝ3bðr%€x„ônç..>¼óÓÒ½ ¡‚ ÓŽÒÂ$w-ÝÝ ’rà]í+“§;^»­¹˜f‹ оÛ5)qÍÐÈÙRŒöÜxhnG bjñ³®¥ËÈs휽,÷fŸl°¦UMá°"SÌoˆFR,èöáM{tv…šÛô¬3!}Ü/a1 öúpY{—7— ^Ô8È½\Å™”âöæ#0ÜëûñŽ€[¾×GY¯;¼y÷•Á›²á‘yvMí}†­ yÎÛœÖ 9ÐM×{56üŽe;Ín…LžiïÓtï=×r{´r‰éTó0‘Í˼PÍÃ|ŸZcáÙÜC鬜‰¢ì/Ý&iîåUÞl(ïLd€Fý¦)•Jâ‚MdDîëu¹œÃ²khïlÎíÝLÎŒ}¾î#Ã0.Ͷƒt­K­[)çÞÝ”ïW噦½‘vðÛîßdÕ.¤1ês{d'DO_®÷<QEYÑ»•xiGtÌ*Îúh„ÃùL™²°ÕWAÙ%ß(«ó}ð“?tfÝÁ¹é»´üD®­»0U¯w9½ë<ßnqX—klî.€¾›0Ò½¢é5—ê–{3Ôž½ÐÝÝk0áué6Ú„½Þ['HÑz“XƒÍÉ7¹\#³#+*Ø"¾ICßlß<ÏãÉ=Ïg·:uÒ¥oÉ÷­o.hž'îÛwnø­É¼Ü¨Q'µrÉ$óvI$¶Ûg¤m»äªJ¤¡2¶ÝJ4Þx+é­°öù¡Þé×uµöƵ|s졬LÜ*›¿+ÙÓuñz·wÚNè9ÓPÎTÌ…nbGܰ_YLÕCÔÞíË!ô— "uåAå§&4¬[IPeZ’€ ²²ßj¤,Ï^=¯‡w)ÝÛÒ@ZÝ’z%Hç™…Zöù­g°”{ü®®Zò¼¤gpõ ræz¼V*á–LU¥RJX·:BG–ÖuZ˜öxè€sË:y)ÈM€Ýß[F£}œx.ã^q5g·À…ÜYrg_l¹y3:!y™Q9îN³È§}n·<³žZ£CZñ2GÝä ÂMM*’I&ݲIæHô`?2å=¹³²VÉ4ÎéLi,'ÇÝx¶=¬Ùç3v­*Äôyëªx:ݶØÒJªê8Bß.Q+=$vH•p\3‚V߯«“¹¨ØY1ˆ<"ùõkÄùÈ>—Fõ^•.Üëéd^6èî^PŠdø“LËi&M$²Ñ#KâÌm·WQI’€$Ð6÷Fb”µÞ|è|šIuCÐIb&O$¢SÍ·mÖ¼h¯šì¨ ȼjJÛ$’I<€ÚãHA66ãlAI‰|,¸D4­Ô·D&½<µtSkQä÷PíFõóC_9HTZßhê|¹yET$Õ·œßvIy˜™=Ú{—a¶;Ýö}Ökb'°¢`̆¤úß7»{„η;ÆæÈ&í·“ìç§±ÊDÛ"g½/PÕè÷`=fîØžÍ^÷. Br@_FÚ{‰µ[/m<±hÇ®wq>è½ÏÛuNÑG-$ÃÃ}öcîÍñÔº³¦¼*À9åA˜]¾—¸JÜé¯8“ 6Áë»·@ÞЪòßbBÙ!s'jQØÖùÅ¢A`ÌÝÑհɤ‹$[1­CZ¤›q´ù(^ â^{å²éÝd~svç€wv—ÈvµÃb_ “n¬wîƒáîܾ—Ìù«}ަ>9Z,÷E8ãy¨WÔhQ—Ê×¶aÝŒæqÓîë#öuÛqF6m1ïvu³¹-1 ×HÝÞ¤îà»î§¶`ѺLòÂfbòÅ9ÔNû‘“Á¬ýÂkHnÑäñí^$ÕíÅÑÄ -ë}·ƒ:žÇÙ$2Ƚl’vª_AÛ`ô]»™ºƒ+³Ál*dMGzùÖ„z3žèp(ÆÐ€ñxù@=y>IX¶ÞÓWZ9BôqsÍU¡ôƒ¹îÀ¤¯u›PÝ~áÌâ§wé‚=oÌŶvÖ3£~SæX²—Õèww®q…FS™žÉ7tÓ9ÔÒçËCVOD%áâWƒ,v6¡²û+vy.×Õ ZñW°ñ¿3ñÝØ—`RåÌgxˆ¼[<æÀ~lÝÙé!Çz¢]0ÉjÌC»Ö+ËÝÖaôê»Ðâ%ŒÍ»B]ÉÛÅÅ5ÁšCâZ³g§nì'¸ÅF¼W{ƒgÄÒ l Ënúz[à Rðê½ulØù>¢^ñrO&KIÌ º6 Ý<#°B*eÞ{QÃ]DˆÉÞ²—dì ¶ttJªR6ÐÖØ¡I»5 G§;©$®è웺7p¨ìG½¯œ¤ì€pòª9ݨ§Ìé,|ÞAÌ‘ÑlTÃÅ¡š»Ï°Úôg-íó=*”2ÀéÃ($¡»9´|WD…|Ég·Ø\äEë|Ü2˜»R%P×z;ä;+¬W½: ]o’„F”NI³, »n®Ùnð«uhÎ*²„Ñ»3Ò7ÌñŠ’uÑ eÑ퉢ô]¾Èuwvî¢M£wòPmÄ<ó‡ ”V§›1r’Žæaa€c³wTÔ‰Üi–PÀB©wQ.«^¥‚–—K†¨uôI,–ÚíÖ’@².®=‘ ¼™æù i²xé:ª$qèÇ5ÇL¶De>Kmu+{˜sÙàüº½­Ö ÁZ³–ñã™bYšifi9l°%ä‘1"ëë‡ÞÈúýÛ“×Xq<Æâ4aÒý[‹Œê È9Ž›Iî~<×ZhÝ¥øÛ:"d¢ˆ!x&ØcØÃ×âBt–ôÓ&IÇv!·€Õ”mÑšÚ +Ý× u¬PILBÐq²\‡´?s·_p _[}Ð+Î-^éI8×ݪâK·TìV¥íì$êw]~v6Æ[IT‰-¾Î®¤vU¿XQ÷pÝk³Lš9=Ðé'Üíb¯Û¤ø©I›äH ´öÑå°ìªæQˆz U£ 4;Ûl~-$ªZD|€0ש~P€nž¾(UvcŠ>å"ÞŽ¦=ÓšðM'a(o™3¸óÉË0îôºsÈ‘g^3­g²‡ƒ„ž{Rå´ªË;qK'xl•ãöÃÚÜtò±¦Çê±öÀ¼Dèx`Jóþû ¿L$ýÂnÀ÷ßw¹'<òg$ó¦Ç§õµ¬HMlïM`^÷)jpóDè Vfx,Ö>}Íïv”;{¦a\@læÏ]Ú³Á çîç" VW’"çaÚ_a>=[èX+‚ï2£»²3 õµ¢m_¾ìtnÏe>ÍÜâ–×¾ÚJмø€ éÜOiÕhL9)kÉ z󺓸¼zÆ«¦BY”?I/›žw»4/s « ñµÛ$î÷t‹’x½¤]zw)´“ãb¤)¥âHÈ}Ô‹\ùÑÞ…Ø;¶Nl'´ëŠúá°no Ú‹Ô™Ù„ÉN·ÕÖpºb8jû=t{\½Ý^§€/Y™Ñ· z‰Çoø¾yN÷Á{¾ãó£©ñœù€Gu{¬†œI*~¶#|Å•¸Ï7È(ÕÙ²'^¥€ÕòJÄ“•=쳸Xf!ºü=ÊnÖƒ)øhýÇ-¾Ð}×=Pªï€Ûèß¹!&û}¾ÞMvCwj«kÅJðÚŒëëW>ziuQÕ¿)-å]ód>á[ý¦öÉeNïM• ¯lé²mêw@väAÎáÄG·Riÿ ÉO€·¾ãΉŸ7öt8Q/72YŒŠ’ó=oºW‰[Þ<{[ëÛ°+ !Òö¥éí¢¦Ë—ÁlhžAVX Iü|Àîß¼“Äò~Üž¾ÏrÙ¶¢Õ¼:iè¤÷A¸•+)©;¹{˜mã=ŠÊ¹$kc¼À‹Y mÌ™à<1^îiPçƒw·Bš¯’D÷¬a¶»=+vHêz0t’à Q±øfÎdqÕ.ŸíÜ|ÁW¬æh~îçI‰gŒW2}C]/v1Ú·¦Š3!W_,“Ý'³ls¸@÷š«;“5®Ýwt[¦o+îM,¤¬xîzn¡ÊGv…«H€†Šß£ØÑQu,Ú¶·jèQ‹¬pŒXtžzE“Ï·À.ÈæpGwŽáÕ ^=!½Ê³Ø0G|Ž’ÂÛYó(›|;ø«§Õ™ð„’Û sJÔÌ9)õÓÕi[»&¥|Õ HÜóªqψl{<¡N‡!˜Ž/ÀXæ$}‹Ñ7÷è4@‹5%[s-¹¹ÇRàp’Wp¼w¡›_kÂ/p½Œ)<&S2¾œô™&·V'€¡vó9ñxR.Ôèò^ÆÅ¹¬’üÕÌtû»UWÏ”;£˜ “Ú_ÏBØÐ6º;¹ù·ãqdßΫM¢7«€šÕÝDLÅe›ÿD ÿñ×þƒÿç¶Ïýoÿ‘º ?òá혰·ÿIµ‡áaaá¡HÃaa‘±qþ ÿöG§ç÷»GdǾxáûÐSÎ2>ÿÔðùð·ø?åýýÿûŸùêéOóÿßñù^™=šùþÓÑÙÙÙ¿Û<0vYÙßßN,ìì£Géf ý“Â+ýEûYý¿õÔgßÈ»þßxHlt|*2*06&&?ÎSþ ‰ÿ$æpðóüØØÏþ”¾þ³ÿvn†F;ãøßø¦ÿ0ÀÏ•µWýHÿ_ýÜ0ÃwüÙþ$â>¯–D„†£¿·ÿ¾ÇÃþ.E…‡¿Î Œtœ‹  ŒVš“:Ç=þq¨¯1¨à°ÈШÐÈ  ï”ôgÇÖ²8.:2(('*v8;Óü¥1_£øf°ãƒÃƒ‚Öâ¿Ê4à¸ÐÕ|t/S™ý*»×ôÏæ«î,©èª|-üðÿ?³Ø6èdRWü‡-dtDbìYãüˆ«¿gý ÚZ©‰SÇððtl_¿ŸðQ†®aÑð߯û®Ö?ˆ¸¸Àÿ9‡áqqùïóýwíýÌ~œz~‡]kâº×ìëÛÓÓÓ÷|zIe–YƒG?n$“g~8èúwÿ•דæGŸïÈøyùç~ýê0ú~Ÿ‡³³³†K,úpᣄýßú²~Éè“ÑèÙìôYe–I³¹_üYÏÜþþùðþQïòŒb㣢2#üÿJiþú?÷ôÿ‰ú³øfÿèÿƒŸ Œ§ÓyGø“FŒŸÓ³düƒûýŸðö.¨õãˆ4ýŒ‹8hÄ^::ûpë?¯ñOÃáÁðøDXdO ÎpçÓým;ÒøZ/ùXæŸÊ®6u¿»¿à°§ðÌSGõºæƒ}”_Ô·Ã>¡¬ð—ø¹öÈ÷ñ³Çƒýê®ûù[¿Ã¡‘Q11QQÑQkÙsðßaž¯ûÿi¨ŽŸ²Š¶ UûáqqhÃúŸû¯û#ýŸîE(oùþßÏò­Ùýô*>}4ëÿ þ°k…ôÊ¿øøääôpß¿¦þIðÁÙfË6Q“&M2wçìYŸç3w×!“' žÌžbøsþüß՟ড½ïøq‘‘AøpcßÁq11oäÿJ·þ<8œƒ–OëÿN.?O÷ýLÈà BfóØÐÿÄöÿ·4þðFÿ¥òÿj³ÊÉðШÿsðØš7þßìkèÑþöd|<<"5_Ì‘áÁaQ¡AqaáA‘Áa¡‘ŸøÉÈý¾5¯§Óéôû|xñééìkÅüßoOoh×1œY|jë[z:ûÆÆ÷þ‚œ“ßí§‘ƒ‚Hg¢Ââ?áÍøÇùþ ótìtb=niçœQz®[xÿVº-þ†osn hZÍö<)[>:oîªðz³ýgõƒí‡áª{oùüðý> ŠM™‹C´+¬œd¬Œ ÒDšUÿnü6'ïŽúGŽ-ïé¿_Ûå¼ùÇý»võ|úc×oüßÛW‡˯{ø}UþÂp§"ÂÂÃC^sq¿ùËPèȰ¨«Wúùˆçû?ûaõŸöÃcÞSÁ±‘þ‡á˜o¤ÜThP`J[ý¬ÜwÜ|8?Ò·Ø8ÑþßÃj~é÷õ/å÷¨ü)ßÖ¿Þ¿û*|?ßñÇô·üç˜Æ¬G ÿÂÿ·ù¯Mbÿ‘oë½ÿrž/æ÷Æ\úiÛç¥pú»«³Ïqßõûöáõöéé¾µ}50ŠgôúVš¶²?àLŽŸåÛ  ùê…Çù·¹¶4Íü³îþý»¢âÜãÂÜ¢£nBðÀˆüè*Ÿ¥ô>*¯õýQ“þÏX× ÿÖ…“gùþ#úîQ¶ú¡òwûúœQÌ_ýçüÏò¼uíþ÷hEkû¡0¨›ÇðKïcýÿ5¾™½=œ<ûú; {žûGÂOFÍŸ/ìù1³'gfO –pÉ“á£E…·¿Å÷ÝÃC·¦ßìßëånøÐhgùÇ×ôp0*²טBl¨P_ý_ôßâ½_öŸ¿±–»aÑqoñŸíþ?Û¶Å(ÅÿȪ‹®?õý¸¸¸ÿ¯èkÆßén†µúôÿ™Ùsÿ»#ü¯ÃƒýsÃsï¥ZU¥þõ©š® °Ëÿ¦5Ç£ä÷lø}1_"`®üðÙ’flÙè×ÊŸ†L0xlðôv`“¹1³ÃGg†EµÆDdžÜíÆÚªœÿ¢ãÿ[ý*ùÜkÐß+RÒåj×óüý\~÷ö86¿Ø¨ÿîÿA½Rººç±G¹œ\múï¡Xýý68ìèý}þ›ý8ÿ_ÏçûððàˆÆÿ_çúXþçùü<þØÿ˜Ï«÷Âß³“°îïN¾^ŽîîîÊåáÏÓ=qóÝôyiéáîá¶Ÿî5úuñð|qǧ?—½ë¯OÇ]{zoù7Ûí Ç#cCƒyCcj»=_ÅW¯ ÚŽ "DÿÆ…öÿÔ÷  uìf†D¿Ëÿ¿ Œ ‰ÿºwr 9ࢠ¥N¿¬ïüÑ×ô³#<3z¾ªïùm}ÿEÍÛå_W£‡o¾<çÎÏmx½œ½|ÎkúQÔøpToý™ù±a1±ö³}ƒA!açÙ*ßîï«ý ŒاC"c‚ã?G"Ã#‚b¢BZŸâý?Ö#ýõC¿ô}ü|Þp»ËCðü,Íkü3ǯûçøÿE‡ø8*?Á÷£¸ëù?ñ¯ïx÷NGßðsÿÃð§ûW7ù}þ;þ’îê>…vOð?Ø¸ÈØµTÏ žÍ4I£†Œ˜7óég…›«.ˆ86663þ\ìièTpd_žþéþbßý”~ Š ˆÏ¨ùî_ñßdçùÓÿóÿðÿà?üŸü¿ÿ“ÿáÿÐÿö§ÿÿ_ÿÀßÿ{Y1§•ÿÏÿéÿÃɤVˆ„Zd0>ÿôé?¦DÔÎ&ÒÜÚB$ê„9ßþÞÞg?þ¯Lž‡ñgÑÇ£!PæBÈH6xfÁ¸VEæá›·ÿ©ñmÅr©œy^ɬâE©'ôÁKCÈ ‰ Nú{¼ŒK[‰©D)ƒ/þ¯¿•?Ö½ÈÜ`ÐÿlÁ#÷›RZ´SE°£ð‰M®0`dˆ˜µP&1…-ÍE¨µE;ö 7F`[A‚bË_Ú(¦oÓH‡OìšÏé TƒàòäLp†k[Ø5™Š×úU¬Ê Éþ¿äÙtwá…"!dtU÷å3`ÁwQôcªÕ:­U™(ÿ ä_†Öá„J¹A—ĠȢŒn¨¾§}PsC_öö0… Ø#°€º¨wf,jyû‰»eOV˜F ÕB EV&ôyÚ¿ŸÐñF¾†|Ç_Íw ߣÆ*OŸUúy×9ëçX1í»âû “4nÍ‹»™|÷>}¸GûT”ôÒĤ¡Öýu×X3¶ÿÄÛ×ÿù·ÈΕT˜PPÅôhXˆ‚ßÔË Kp“ûµtR1== öõí~þšü_7çE¸íGjªˆƒcLýyýß\ûg~÷Üøàß³ù×»j‰êÐ-Õ!ïXxpÁåûÖ|íóºÖàL³éDþÎnMçõÜš„D @‘„`­âØZBa#?¥ 19r²J¬£ ŸÝj>rÇæŽÿL²[ˆ Bßö>À¡½Xñx–†s‡þƒÍ9°îzöά~™/æ>rp=Ù@ЬVFyÆNg{Ÿl¹ÖžÚ',°Ã1üì°Àš°#f;6vsŒ` eÙ!ú~}þŸ~ÿÚão ‡?‹ýǬ³ ÊG,¼v"¬X¢£}*¦WèÔ-‡”¡MKý8¬+þÙù¥×§¦õZ2æýo9ÏõÞÄÛëUݧõ¾f’$z•}ob•)%$ÁRÒïîÒ´þO>k¥ó~ž‡oN.§`{-£ãè&®…Dú§ ³Õ²ŸVR˜kM( Çž<2š]ó‹;ý}60"çϙ͉û‰>Lû˜Çíü³ô­ÀTÊ!ûZíææÿ”—ÆRª$ÿa?±qý·;²\H"1ŒÄG•d¨DÓº~þþ3ãôùmš£“åú]V,÷ù5>I»âÿ©b¢”‘õªXþoµƒ(¿ßµ×»nÎeÒU/òôôÿìŠ~ÓnÝéö÷ßõ²ÝRgŠï€Œ Å€³–B}¯ÍÌ(±Dº¡OÁ*°r¾,öÁÚéVTº£!‚ª”cf.CÛ"UY¨TF½èµGv£'9»ÊƒÆ[E9a¶®ö÷Õ²[”€‰²å‹(ÂA]%:R(=¼>uôÆöiº¯?…ò‡é9ÃoþƒrvVöØ#ýÁ_÷Š‘=¡'BÈK|ç=¸üw˜oW›³¬eÜk4W™éšŠ¿t¨?&½éö©j©å)å¨*i Ån\¡ŽO±ý†iùÐÏ9ýÚõÉÖqCETN™(gj…3¶L^"£ÅP£-~öYÕvi¯Á*#š”;þwôðbÖ}|Ÿnôc;~…Þþ£^¯9Ùçljj#¿çþŸþ$ ?øþ$™(‡ÏÇÿ/ï¿ü5üõÿõéšý§û¾6Û÷ÿ×þ6?ØÍvî×8ÁŠâ©ã r ýƸ½m{;ÕhHË“p#.G¿û!ê‘432’iêÁýú‹Gp™S‰¤‘Øš½®®ÉH«àˆ*§8§÷>˜áƒ]›ðo%þÂÅa-dN³‡œ%O ;kq5‘÷´fÄ1§ÖÔ ?„%HÑ<1êƒm>Æ×Ò?OÐŽ{\‡ÄÔC.Ä·éuws5 ôÀqNæ¹ ,؈ä7 Õô­âC yðVk%q޼9£a­äöUæÃŠQ[D™¾ôÕ+–þ'd³æ6ÏGySF`²Øü€~F;/T®ÀìèÀÌŸF;{ÕØÈr;@’D&TKWJu«[cãn_:špòz¬G<Ës<`Ûv‡UÄLv³ra2Xˆ‚ëu¹Wª>‚Ô§(Ä^8\ Of1âùÆB|ÛîçïL¾ê0¸)ưu0V±‰"H"ë±qø¶ ¦*¼½n|Ú˜f<#©ë ¤Å÷MQÁt[)ûÑ4·´–†ë%j®Þ]Çl-H8 .i9œÊæn“¦nÆØvË_d•lYPÑZÀv…óŽÊr'¼'j³¤§æ‚êÓ&¡4~x¡¯{'YöînY6õÌÝÌndø®çiAf¸^Íg=±ìg Ýðg‡bÇ„æïOsÜÅ–ê>®Œ¼F” çOîcc?µÆ('Þ”|_ܘ7ÔóÞ[ØbÌ£çO'•OÔñËå¯Q[#^¤Çdì øjr‰Õ©ú‰³Ãêöøs<ï$òâ}J˜î^dIј¦>gN)M@Bœ5±¤¹V‚{Ó,à·5>êhÈð;f½ÙMå)#„‹ÕPIÚM¿™ÓÞ¶ ’Êõ,1^ë;À<4„°Ë®LyóLg ­24&¬Ï¹Þ2\ ì÷éÇwÀ)GÏ"Ý¿· ÄAÍŠ”q§¶5Vü'½ eu^ư  ÷èðb'¥4Î&òH‚€ïÜÌÚȈŽì#ÀfnÀáqvEìwÌÌl¯ÇXê.»¢ÀÁ™—qs"*˜Ʀ¨Á3"&DAnîïwpo¸8;»ßŸwt7}ë»°fo×}œgÛ“ 8U]T¹í83‡UÖhyE…<Å#v-X eFÂäŽea«ÌØÄ‹E-z_a8ùº„´Ýá£Õ³`‘CM¨Ó`2îˆÁ”pa¤‡öøûGÚ&·/`õÊ”Œ)·AìbdÎ趇Ñ9Ú‰Sæ1€€O (`ê8?‚6‘õh_Ì^kÏ3c²œ,x¸=ÍDK (¼ ¼@ï ¡`äAžÄ0\¨F¼#±ÐÕ¯q݆:ã÷—[ýjk¾»€iH~%Ä…´ß^tž~½^{qã†}sbf);š®!Æcø±i ñGåiÉ£&·_Zr‰ÝLjÛGLuxm.Bç†ÑCÖñç»bßK[íÚô3²ðÅ!†rv^H\y}s›eŠþ¢Ñ |lÊ"z8OóÍY–ûu,rl/u(¢7,æREŒ Ki!™úé7=aÓ{åõ£_%¤GÏ ùý‡à=[:S6Øm\Žœã–$‡í9Œ-rqðÆÓ¥Ñé1Ƕ/íÙ„æ5:lŠº‰.l%›Þ–Ÿg)ãî/»ÐÕ›ì,fß-üKnNØ»œ#ÙKö¯*b7…?)ê¾I› ±(–Œëwxà ™LܵWÀ)Z9Ø93VþÙŹ{FÖwÉô ÜÁßÂ7[»<Å«0m#îç½¶'FÎ÷JTCÝày¬ S3Ör³l¥ÑB™ÿŠ/´ òK1k7îPó„yfèlÅn"w<µø0,k ƒÔ4 ÞÁñRUæeúð|À^àlž-z ¾¤bq= ØÑ_+ªôyÝÂé.BÌ~~§\/²š“øšõ™|3|«™éàÒ¿%÷¡³·‰œåËw­ú¥<بèo¯¥1#ï‹A„?3 ˆ–Ôúý6à7^ ÅÂo[¤)fåÃrÚ"*!úoÅÄçƒ~CÊŒ*+-i›7_R?¹a–ì a·'zZ'ZÏÅZ …—îU}z\&ßDåðè3Ái‘x-¯Ãî Ctì*¦Î"¼8 ùÃÞ~Wµ6$ƒ{Ä%=^ôEÌóØÕ%Ø¢D\ŒEÖø•_A÷ÕoÕF|wb1äæçëãíbö²w–Êü²Þ”gÑ­Z­—E,–ë8@-©Éï8àÜîùLW¯Ò³·>õ™7¹uë}àS™%0é?w%È9vun¢ÕÂÔc“°Œ_¡ÌF‚çÈn)P´)*ú’Œôo|º‡w:ÕPÖû“aL·ÝÞg n[¸÷6ÚUR);L:ù•K·qù/ÛäÜ“¬»kB­ö­èÄúÎ(”ž·r”uÀÏ9x[*ü¸Y~í$Óòê©MÁÚ 0í{ÉpPp4£Û1ï ENTB7ºHÕÛñcš†ñh Ó·Uª©Õßï&u‚—î©`›ØžõLÙÏ›œ™§jGdü~Y,!ž^]gß=Olyü‹ ¯öþ{Ój@çßf*”nT©Âƒ)ªi)w¨ƒÍ\Ú}á3ê²xo+{x'ƒÛAÌ*î~*Ì ÁÒ1Ýç4/‹ÀHûî•n[|R䓘„aò ¿³; QšXS91,ºª°dC‚ðYÄÌ0ÞÉ&%ä(>exçöPµÏ«f´<È,Å}o ”~ê¿5„l†´UOg,_aùadp¹*ÞyøS³óùe÷†ª¯Ú{#Ž ¡>Pox.ö<®'XcÇ«=åíg–&®ÝvËëëh¯Tiƒ—S‹ñø5·Ïqk¬ø"ŽAÈߢR”ð]%Ni ¹5Ö,`Mé””Jm†Ò{nyq_B,Ä|¸œ<@D1i9MçjH%uS_%n øÊ§‘]ÙVÆ­¾Ê<'’¨8ý©~Xzô#ï¼U DC+ ~‚&ÅöSd©[¡øy½™6>‘¼÷½ª¬‹:TÝ;&½ûuX-„´4U$ V=žy˜¢üTtD–YÔœ7ypÍ»k QjnE+q€ÇsBum­^ÙêÓ¯x¡´á¤ÐhÒÒu2ª²p™ÊÓ}Ù×poP6ê8=É¥ò¥Ó(Á_¡+±X«;FÂ#£†Ï'%BÐÒ…‹ÕeM”´Iè_Fpy=éJŠä_qªJF)õ’ùÒŒìÜš.rà€œ¤áðÄ`š—b³º¬G8ûëvòµdÄihD¢6ê÷¤~ ¶¢˜ãá@¶D¼jr1ú¶¼¯ÙµˆÁ“^6A#«$&ªY“6)¹‚ ™I¿Ýj6ë2,à¬>{¤x¬JY KÖ-F,‚ñ™ù–*ºüG'@g3Z¾Š¥r¬³Å9¢µNËzÄèêf ¶5°ChcVºw²íÂRŸ ,D¸š{ ˆ ŽŠLƒ œu𽟰nÎñÃwA,ÏI¼Ù^õbz牰 ý’ñg醒ˆféâòï9ø»P*ÁÙœÒEéµù*çÅ7s&[ei ™Œ‰)0c@žºA”œ‰dUôLŽ^ƒûªwËÜn%t1% Sè2딉ŒQ¯CfµFñÅë<ÖaÁc5R㿬¦wÐ(A¾Ý…Þ ÷¥CKÜðœ¾;55l ð«7x7F$ýÞöèàÃdOnø[…’̃ Ÿ² ¦M;‰ó”-—ÆŒHqÙ >±¢lYñI¢øEóbF’šÊx Å•»5`ÏFTá#Šúá8ÌåjÌ|‚>óûH™¬=ØqÉ”¬sa½lK x±—7ç÷¶qFÚg¥Î¤´—p8êžÏÚ]à@½´ˆ¨éƒ‡„dϱŠç³ön†¾ÉVùx ÈtýºÅà”/,ØÉ†áü?|ê7ŒÛ÷‰½>¿t‚uf ª &|núÅUÌ©Å>A˜ogo¼ú¹T'„ÎmÒ+k»š ˆÏ4o`šÓÙš'Á†û;Û¨³‚þÅÏú_%J´ÌçR _H½¯˜^~Î[™–u}Qà4Ö®'•WÔZ©Äˆï\b7X«¶Cjƒ¡&Å0muìykÊazÿ‘¼„D÷ÃÞ6æOdÌ7íºóx „D€Ü4œÞu „òšTö ga¯…¾ +_ì {_eß mw°RÚÌ>·?x gWo$_Å™nK7NýgPve°Ñœ»¿–Û)[œ±•Æê"}©Û$—|¬. £š(ÚøõáËìGÃÈôdp< {˜Ò‰¤˜ê: yßÍé¶òÐ Á.<;Q£VÎG Ýt®)u—<ÌJãSĺA{Vg‘{«êòj9%@m`t½JT_žÌ’ˆa™¤y=/wß•\*.fÈ=­Õ°%~ш³›Õ– O%® ùïkfýÌ€u4Ã:–½_£Á9áWŒ‡‚è,X)ÕG LðcnËë{1êætì#†[ÚA9éÅñx«sÇqŽ­ÃPQ6=yp&l£¶˜e1ŠŽjÜgwyGTD’{åÌ÷›Ž+=šG ‰5ç®ôbC{SÙ%Lm®[=Ïã‹hhk­ÞNìrÊYpÕ2+jÜÏjåê>¾´‰ŸéVµ>ÀFó¬"[Ó´Y;ì<Är{äjZ€Oq@»¿/ ’´Á²j«ÃÜÅÕÆËÚ½•P¢Úå2+‹KëöÅêŠfC·ÒÁD0À©ª 3—5d«Wu„WLl¹AvˆLUçˆ&ç⵩àBüñ記èC[§é¬KH:0Æ» Õ©D×¼¶å^x}‘;íh?ø€kv—œE¤•²ÇtT§ì‡ò£áÁe¶Ê± 1RÀž¯y³AòépWQr1F&d¶>¸e1·¥õºýiíyËüæ éÕ:g±å.só)‡’bÈ‘Òá&ëȈEˆ‰âB“Nj£x˜)Ǣ¹á¥.£|?™"gj&{-ºø3À÷Ï5˜Â:ŠÏÀ@Ü~ŠòsÃä C&~9o%"ÜŸ”ûp̹\*t’”k„¼T½¸5TÐ&L“A‘4qœlŠÛozÐ8ö)0µ¶3–XÌÛEÜàOq¤ÝA°Ãcҹȹlá2þiÑ#OI"#’?²¦Vy”9c=#ç£|7Wrë  ­:ß~I’Ú±÷RØdÚÚ\pæ<¿F³35Mo?'-ξ¥kïO-û‰?%iž›H' _L‹Ë°G6Ìð„阤V`àɘÎy«j Ã<úU8 æ‰w˜K¼¾,/L y#“¦ØÝÔ‰Ÿ¦$ç}Þ€ðf„ǃ0}h¹Ïˆ&ôU^t˜”;hÒ;:râ9çc/KùxHý©âZ,²J$´^ãLûwcð¼Q6 ùÃÞÖнÓH„Dok[̼уOÀQïHL%»­ê°Ni/§Qú®»a$5ËÖz•‚¾àMèÙuâ{·ðá ݱ¿”‰8ÌgGÖ“9ìcc@‘xLÈÔo‡×˜ ¤^;ZxLðe,§.k""sMs™Õ‚ècAŠ™. Eü×ê$KODƒÂV0”3jíìU¶Ç§}ÐUjF"6›{±ËšbÑ*=áwÝ33¿xFêê÷ÓÞk ØW÷P‹w¢êV¿q¤WªF^rré7hçº[xÆ ™æÚL¦_#À«± ;í®’È®•x °ÝG%Võxl—Î Å‚0`ræÌ¡—J¹fé±Ó™^¿´jÙcì‡ ®ŸÈÿ÷ŽËûàITï«æ?ĨD} ÿ xþ_Ûy=lôŽ6Ò9‰8õæïKsmøŠRãªILµOiñ¸Ýd³7)½*U^XSÎ]òuÕº œ)!œŽŸxÐG)¢DÕ‚÷‘âÕ zdÖÖ}œ"O¢ñ8 ôØÏ£ÊaFÜ ×¬€Y~ëUcÚ»—J¦]i3vTž^¶ðD7‘½Ý\¯è¶ðWt7«LТ”õW«+¼O§ÅRo0»éä?bòU á:g¢ƒ½M>ô-åÕÂU—²;w™ò‹Ñæ+éJsÄAX-ŒÑT(ã[SûD*²®ZõAÁ6mb` Í8.:ð È)Rp¤ª:×B±¬l»‡ô²œN‰—AËØNU°úÌm×ÁCÔ{SÀ4òÁ<¾({BYðÌ!‚A.K#ak9³ÃZ×~AÁ½ºnK&`bkßC#¡XóÖUÑÌÉÀÒz8ü…Ñ1Ðp׺×ÉÆêv•]ãÜ5™Ù椌‡¿yB K(-2ÑòÙüÌjþ}ÜÆÖeˆc¢£¼†’—µZä Õz3P‹®¦%|Ñ(˹8ƒ“àšl ®’„ÐbÒí’)2ÇëËð1"](95V$óbÖâäÒÐzÁ.=aÝ{ òXã'€·›9.¾¶¹Ô2Eºnš­ÄG™eòÓK^¶à%Ó"Æù¢-ɨ¸: 5 ‡rpR[dâÒgÝ=6zñ.®•!Ž.YhiéD@EhzZšUÈIúÖŠÓrðšÛ{ˆZ¡KWËD"Û~<:ê 0èð„þˆx;®ß+Æ÷yä[¹oe㉠‡Ýëó€áÃêz¤Y<Ìx§'xØÊYåÓêñYbQÄ`¬ÖÇ6[°‘Í;_«Ð—sÓãP±¹”Å•¥m3˜|ì‚1$¸Òr ‡]ãìòɣˊ+—D'¶Ã Ýñó/}ÃbÊ&ÇYi‘´˜|eÒ³‡x‡ZTW{¹·ã³½ó{®¼qŒ:8¬ú‹gnïïnÊË!æR8w@ùßÌgLÝݤY1F¼;4â »v#OäÀ*NÀk4³È&¸uŠ* ‹4Œe-ý¼è^-ÌKîVÁGÆÃl#íJá¯m‘†n/›¥ã‚i«¼ Ž¬[ jG±(¡u×Rû¡7¬~{0â!B¯,#?˜ÛÆ:%jn¬H"ÜK‘doÚP@=B`Ýq¹íÁ¦Ú€†U“D½Û™ol8±Ñ7d`®½"ŠHÒ»Å<ƘÜzŒ|{àË€M´–·ÝçÐðÉÊ— le¡·“ÀYoè” á´ //§Î¨<…ž;»W“)ÜÇÖ¼AçŽUWDAÅU…'X›¼D¹!ò&GšçÕ¹DÚiºã š#ͦ¤ðP›SÀaÆ2%’GŠF„;ÄûDµï ÃV©.ùv†ñl‚“ò”máö˜o…l¢I³"8sÞSëö–Î8ܲEÒUõ.Ä'0_¥Ô2ÔÝÚà¬l/UŠélj٫7æÃ1JÑxŠóFã1×ˈÛR7ã ðÎ/Mþ†0ïdàxÓ=¨`Ñ7ÏB¾6«Iô˜Œq™R%Íâ„ÉéÄl$kÞj𠵉™Þ-.ù;tŒ¨¸S’±ÊO®×Ñçä³å÷¬ø›=bzæU]<¨¦vœŒ©Ü‡60ð'êÀxZJ¾ðkZ+=3Ìr3r­ ¼ß”(» rºÑôÉ ïÙ—¬R ¤»³:).ôtg›":Âb"ïÁ|6›é ðáøS@×:|èÄ´‰6¼‘ +ñ•åw!" é\`4—h'n­¼#µ±û­²Ø/ɦ´Åa•:žõ¢2ø×¶Þ“!J`…t¸É*ZÚOU‰ã“5œC}<]V)Ì!H.-"®‚Ør¯#˜úhíçÔz;‚ó‡²m¨‚—27ÙìÄY5Xc8tõí¡º„V¸Ebèáî¨!Ÿ”+ó”x¸J‹ÇÓn0jüH0""5žÞæ? dzln½Â€óì¤ÔDZyêô킼AÛ‰ö,ù|W†‚² À®Ç‰F£5ëÞ"óÃPÌ8¿«Èº›Ó¹ÁÌ`l¾óÛ9Û6åætZÏ ö¶1ÀÅøVÍE–‘‹5ñÐâÞG9¢ƒ*–Od]ò€µ¶;}àïYC¶ê‡GªSŽÂ·®¬rŒ@VÜÚµ©Æmµ=jHI-~.Zñcd™fä6T&ßxiÒs C g£ZÁ¸ËÐL¥€€-‘“MïcR<ÑÞZذo×g¼Þ…”Šgh #Øým¸0.x̹×PÏmˆyÞ^(IÕEßÔ® #ˆt›^N¸~`÷P]= 36Zˆky}IŒç?4¼Û gü¢zóÏH›À•ª7­@ãÂùolYuM^ƈ^asÛktŒHìØ5®÷!W•Ô¼^­>[ÚéJ9]Ë’L-õJ æKÇ"dÖz*ýžØRqˆÕaw$îÄk“A,IÌgˆ&Åu c„ªGìæ¶ÜS“s(&iÝ^À@V±Yï×y[}ÅüWØSóo@›·ÐJæõò7*ºFMâ²^³+e™Òe&ÜÜÚç§ìõú½.òý¤%·QÖv¾t¶¶ÝèôSr9;­i57œüöÝæŽ²ïy³.&P²N˜ÌG=Ï#½]˨·‚‰Þ{ukœcßES?ŒðßA0!ûxeñ;9`³DÕµœÀßSHˆê0‘  “—BÏ×>Loo=ëù3}®[})ÄéÝPŒ­¾ñg ¬\ÊÜ(—o“Z(<ºóƾ “ÊWŒ`Ÿ{Ùcl¼h5‚„ª5BŒQ¥¹M7ÜØ”¾”’à –ÖîxU9ÔÇÊc¬ÔÕa$ ´Õ=•vF¼y?0ÙÎ\¢‘0 c&Õ‚3V̽L>Ü«ÛLÙ“Ñù³H^s_fp®²^ ó#FÒ/E÷ÂTV&àõZSêH&ŽÈtíªC>Vžú˜©ŠÖͽʩ-!»$ÂÔÉåî 7ŽÖ9Ê[ØóK"6;4zËVº=2o{"Äyèñmcö„Ó%]´Õ}N×#mŒÏ%’ú,xbi5m.ØÔÑMe”£.eÞŒ}µò>y»£ÑH@0y&Õìx÷°µSy2;§d‰…8(àËÄ X›J#€5¨ÌMF,r’2½7b)&qy+X ÒX6wE© ¯§Œ§aìWPî\͵f ³ÞP´Pì„}âl‰ÝB…ugAlö*EEÑ¢kay×§8‹¡I ¨¢píEfbhé”=DFˆhq˜ý†pÆÖ}ܰŽ` ­„>Í1ÞcØÐ=tæ×Ô>ÎÓ'çcc]®I¯"5úÜg¶o8cï7‘µ¤|„ ­Í†bT7R„9 ¾kŠÙñõ4À‰¶Ìô±#1œõÊņ‹Vë q¸$´”mG‚_4Ës;F¢vóÝvËÛà°¤MZ¯?-0ˆû4}‘°*Gl>Q=¤â{céqž˜÷w£VðD)‹™O1üÑ0ÓAIzÐÇ6¢uº‘a’©>î\ð+¹Q•àÐqÚóéÂÉl'õHycCH¨HlçÞ_Ö÷·5~]Ô@bK£&ÎæûÍèô0à{©›× b#Þl¸º‹ÖÖ 7óœî½>@gBR 93(ïq!a->Á¯‹À¹40U¬x}m¨WÎzê—I’ÛÓ ·{‚~ÅZn¤–ä¾óožß yýãŠ'&%¼OI&‘qÜT,E3d¹]VL³9);ë—rÕFtÌÜ,þ“Èçr4» Œ9laXƒóÅ*øÂ·FwíQ¾Ïf Éêý K³Ef"Ьq Â!ë!´ú;ÞÈèZN–&wvª!Ì'KðÝ)÷Q_y°JýîWó5Rµ³wºÅîyyíÇ™àt²lÌð—u£¡ÇÏÀ®¦ÄÄiró8r£^½÷¸Ü¶%1œ–ù×Âäîñ}‹ßu¦PM-_϶´¨¾ïÛ‰ Ç¾–±ó‹-š1øC¹ÅV‡§´d;ÉÜŠ…,£ìÜ7T´2¡ÑÛ÷Šï××*)Nœ3Zøþ¸zafš?*sVåÊNb]  Êǹb²Õø2tñyËËÙ çdº;È|@u§>V)ÊiÐñ.(‚ɘQ/áT÷xZ ا6¸tÍ[3ŽŠ|(=ëMDò–à†¿ž¸¿ ­"N<¯{Zœî-./¦›ÎàݤöÔkäétoÞÈtB¸h)æ×æ:qœíôú»$Ì­Ôü©Ùc„8¸’¹]x¨ |·´r[HÃḠµœ÷54w¦6½åð:Ÿ‡¼Õ7ìBX·8úŽ£³$ 5K4ñѽæNü!j”õ¼¾€ñö(’.LÍ,ˆò{kA4Ñ Ò*ü asu±ëf"½¿Ú®t¸7ÏÀ—ˆyä;j½M™kp µ‚w£æË£1üàRÞ'³ÛÀ9©n 6cBO ÑÜFqû}¹ÙD,^§ßv©;À™%Y«p…¯e¸ý›løºùìRv1O+bh*ׄŠÅÈ–—‡À íé÷· ÓÍIp`NÁ±¸&RWë]ß—Î-œ·61:ŽæÌW¡|ä¾ñM^õ³`u£Sò),'j¯LŽ©y6ÏYà¾^õëU2³ ú…]R0­`¤@ž!2ßÒÄ~pÝjw0´Ê2ÜzÚ‹«¨S†Vƒµ·¡ß¦ò£‚CzÄÉ’üãd6p”ƶÚ|$S=^]Ô&›°1;Êò«¤2WuBY›øå;´µ¶Òj–¿!z»)CëúQíY‰39tÇêý½%äjv0™ÐÞ»Ù.MÉ«w…!WYtª¶ûA-YF¼Y2zÇ{ç옸Žó!¢§¢¡Æ/ÅÙ“æ8ö²ónÐÙ sg¸]s}²^ç¶ì1s–fgHêv~Ü∱jèÏh ó°Ú $âP/tÖ9á>¥²Û§NŠÚ úñÝHzÁáöÍMü ~mue ói'‡v¢¼æwÛË 1…RÚVHÖ¨k8¥êô1ð­n…ºsDrƒ†ïebä©|b¢Xïæ¬¬âØX¥­ŠJÏ-1²ÂŸŸ7dz¿–Ô€½ 3’à¢SÇ]N†N f CL•sDP§Þß[Në„©a*Lù¹üçí+°¾jð•Ãùû­n%xšð€W»KŸ5 ’ÀVŽ˜ÜNóšØ¡^mÆ3¬q`.üÑâ­)Z+emk¼J1"VÂqqd å[Ð0 ¸M#-yËf­;K¢b*Æyr#ÑnñFv\lÓÀuYÞóú€âEhƒD!F4©u^#Øï‘èË%g…ôœ Ÿ‰ÎÏ$ è)Šn¥OØ‚<úÝ‘‘s’˜Ò}¢%ßœ•¼ºèuΤVIwÂf,ð×¹>¶íÒôÈÁ׆º|¬BeëÄNéÎóöŒÓ[¨ä' Š@ä¾B¸% 2+çCz ‰véÛŸîOiL(¨˜ý>WG.^.‚Ã]ë®Å2I?r“fï¯OÁÔË4üûåžTÀ_*·zÛ^ÜÛG~_AÉ%ƒ–mµøLÞ#ÖóÂ—Í ½`{l¢Â[3Œ¹&Ã9àÂ*µ¢ñ±4âl†rûXhžâ¬¨!h¡ŽH°jX›ê'‹¹Uv£Þ·ŠÛ¿\Öbk%šTã øëÇ9ž…cªd\Sº[é–+S´aéØUw)§–ð`Nçˆì}ûÆLN“´éQAhîQ¹²Ég'&÷[àvΊ(Q½÷™p{}i¾å‡A¤>oi2Ãà<Ðï!õÞqãÎÍ=ÑP@M±¶\×ãæó°ð@pw°äne°˜üB}–R„4ÅääɆ2òZ'ŠhL·«§°ý/†uËe‰©c!‰IžbÂ(F”Ç ÒI'œÅ_ggæ¬ï$wœ´.ÂGã[÷ n¼Ä~?“ÔW3õøí•Ü…±ñdóÃ,ˆµ8ãô˰V‹¾ENú6½D÷ /ÓTÄÜ[@ùqé¸ñØ+mÏ ãÔ·‡^ǽ#7äØj¡¯7Dîšš4›vtg®#»V»”ÉÆš®S\–†},qìÈá¨ô «à·“ Ü‚yA‰¸ÊHŠÈ‹K°é ÎæÛú¢øÖ'ÄŸœ^Ês{©+`¯ÞC¯jгmNo烿_Eùˆ |÷”×}rˆ;Ò¾y‡žÝ&hYü:¹ÂBvß3{è~Q^ûYI¾bôß.)ÏÀþ™ú‹¤gVŠ» nwÖA² fË /šáÃÝÒäÙÓ• tÈÕ—”ÇrÚäë,;à®WEFh¡^")ÎY3&ŒÕˆe±H•$Ç+n 1N¥?²ÌfSÖ.ŠUÌW8Ê0\iLQ<Pæ×ZSË51-¢›F*Âfíˆ@–°×©£x«¾ö/·V›"£G¹—CÜÄ4"ur'Wí%¦ê˜¥’zÔóAâ[.\ÛG)g”Ò»’ý¨¼/Gž\jÊÒ/*îg¤ÄBè±ll¢ù@ÖêJ ÆTrÇÆ]ç¸:¡Ón 66½S>²Ž²Æ¡#eZ‹¢Õ’'5ÈPcÂàƒ#‚ðõs¥ožðr 3LáæP÷aVÙu™{Ò>?X÷¶A7öo_Eç¼aƒ² Ø*!ÜÑéßbI¯,ŠÁÝ©œÏ¼ë)ŽU¡£:$Q–9w¤në ì8©YÕŽÄT¡ÖOàåæ„¿a„`¨q[&[R§½æóƒìæWTrRPß)n{F‡™p43œÀÇÒN~Lô®¤ññŸ„Ê!4ËÇ$$§¶0iµ ¥¸ò{ºÏrR} 6î1¶& cs¡{/äÆI®¨ä¬qåmóYDºå´X†žØ_‰ñðïƒ iã…¼CgÙé“ÂÄĕЯ#賜ñhNÕŽÚ²sz–‰+ÒÉ®Æwà‰x¢äáXàñ¬ÙH£ÕXŽ#¦‹ãÅøæzš@κ_ˆÐ09æ| ÖýçãdÌSƒ½Û&ä´«8Ã9|µÐ#ÇÕ>Ќ܋ø·ß "]ŒªœqøözÇ€M#¸³hÒeÁ}â˜^ˆL÷NoŽOJ:½™ªÂF6Ïp¾b4ſ͒öœ» piÛæLãŸÉ^fÒÀ$%"]"‰ìeò˜LÜ ¸ÔNî vÒjO‹ªÛ`¸²’o¼òDivÓ9{<“í/_’¿-3³'»ÇÁI Æ) ot1s4áOØÅF ]6šó{¹°>ݘ/v)C³tf2¬œãK0Jë* lçá´CKs½«¼H|ò‘*VoŠ3,Σ¦ ¨jý"ãÆ©çIÙ#nÐû+-õÖ •—’‡!3‚·_©Øß¼R]›àhçóYGá)zò’ør]Ú²KQ'²”vSŽ6d“8€˜È/2¥˜ÓˆqFâá’Å;<ÀÄUˆŒÞJ6o(C˜5~͹}nè6JAs!á.›jºê¢öòO‘õ-†JÂnX×B}ŽÖj Ú NÞ$$d)\x\•’cKšÇFT^ñõLè)a(ˆ½¼|ƒtc¯nIœ:~!¨ðò½ CÉFtÅœB.V+¥±‹ã5[xÇž‘-6új«œýZï©ÙÒ÷{<>kw§vgì__R-£¬«#_Ìñ=8ÏRï6¬¢µî»–*ŽéíïË¥•æ¾`½áë§ÔymÓàî]EvÂÙÎÀÝqÀà¦N¾O‡T•:±"+u¥‡]ûu£Ò[ïyPF"ò 4›0""Ù[ .fnJP®AEAÌê^)°zX½nëÛíÉò6áЛù{”C£Ìeue&-­AÛ£HUªÊåèÐâäïsºX/5©U) {º-+3bgj»¼±CÚþ¹Øõ™™ÓËX¿¦i`P¨®G´Ý˳px{Þ“nˆ¦àŽ•o×NÈ@ ÄïW ,ºÙ@ï4LDï½]íÛnüënÚÛ[óùÿò$ùÉ$€ŸHO« "ÂHE€*É‚„„Š@€°X’|þP’¼BHh$ŸÇ÷ÿÉû¿^*OÖùÛÏùYÿZÿ/¯öçý¿¦okßÓýüqñÿ>ÿ·oßçãÿã„h¬û†>¡ßN½ëÿmþ¾µñ¶ø=Lýuyβϗû†ý¿÷¬Çë‰÷oµ?õüa>êÀÀ ‡Ì?’a$†Ï§¥|×hå¯þ?žºÿ¡þ¿åÿÛÿo÷ãþÇ·×õÓçàŽç—î~úÎ=¿ñ¹Áõ÷2~¼~Ÿ³øíùOÖÍÏò/Aÿ£û;Ìٷ˃;!ô΢oÞ³u†øÃŠœqúßÒ·>úÚÿî}øçöïóÿŠ?w`ûú½ºCáþ zù°úïõ/V•Üåž¿.ýk¹£‘™J{Öƒµoì~’}$ÿìùù§yUG×çéŸéôô?˜†´.¼·~wd±”öqŠ%¿µžÿñF~ú°Ê~·’ >ß»k;‚¢ /Õ?±Áéùóg¾ÿoÄ?W¦¾IåóÏ¥àYŽ®Ç4Ot¶X’¡»=µ‚Æ?k yÿ~Ÿ—ûùÜåD<¤´ÿœR„ôNåÑüS: Çd ›b[!HRf{w¾1b¶j½¾_LÃá†Yý*ouToFî& (,-‡«Û ¡÷£ääÙ>õ]'âÍý*CXí{ˆ)?;s^¨(KõÖ~Õ˜°Q`èòž<óÿëÕë\z•ðwJ'çuuESeʺ*®­J.ª‹ª- ûþßäï‚}ûÉùzÿŸýœzwøëåß¿Ëåã½~¾sÛö¦Mß}r8ºYñãÆU~òëîwàÛÿÛóþ¹…~^fݧAòÛøþž¡æ~ž‡ìùïìjB]¥Bž7­m1šúx0L9ó![y>Ÿk ®g±¨ÂqLíÇwë~ǧ&³‰ù…k~Õ¦ö^ï÷äâÎ^ûk)©rCŸŸÚGO×ã‹çõíÕÃ>kþ?Ÿ5”¹Ò£çöGýؘ-íPò¾Ÿºü3#EÏåùŽ7×zÛ²ºì6ÊS¼¤Ú¶ü³Z® ¦ÇËy]åmxÜ/ÆqŠàúÿ§áûûÿîßø¯éaþ_þ¿ägæ¿ô:Õdöÿ]f­¨?ÐÖ ãßoòó®f6ÿj?Ãè}Ýý?wåûòý#wÙŠúÙ+àÑPÒ¸qû/V)ßU«œeÉ'FEÜ$U?òBxø—œÈª+=2ü¢Š½Åÿo†—‹%).Ô¸…óþ݇œs—õÿÚû¹wdÿ¢úwüúξÿ¨!±nî0·sØ—ô9Ú¿ɱ½s±…roíûÃ_.{nJèÍ=&ùáŸS±QõD ?ðžyáÿ°ù+Xç]¶DX¤.16;F+TKgù0€,ä*â’¢˃5›Épaš¾óCè ¾½6½³:5âGŒm!å„w¸`ªÊÓÚë6bÜÑCŸž%…Ö'Š!.J´èÓ ûP;%ŸR%Žª¯ªçõg›¶´H¢¡„%’y‘ãåË™õ,æD- Î‰¢’@¥?ìuZëcÏjÓ¾Zá¶Ý²gü8P¾¼Ô£[PÁ‰4tòªÈ¼ëÁÑës0òåÚÿšçW¸u\XëñjL¸”ïCübê…Ëè²Gcý®ü™¬3m²o]ë:Ѐ(‰Fºõ°ÆB8>Re(×móíƒ+¸»Ý¹„¦¬1|&ç¶-·ùëŠ=³[Ö*ªv1k!dÀã&@CBˆÄ‡^F®ªŸÉà8DïÏÞn«÷¨| L; l·®Ì$°‹=É(¥z>÷íeÏ'aŽ}Øá˜R…œy©{ðv;îŒhs¬žTì·Yþ»õÖÁŸŽw¡XØÆðó}Úûr= V§[Õ{PÁ¯Z킱[šÿ_ì}‹þÇ®yߣ÷!¡£óÿÞGúûî…óœþoóâ“´¿âExêGgþÓµc LmvÝÐrÏ»}:³C)ìõ϶³W>+ãçß!ÖýNƒ}éÔr®Ão•ÿÒ¸'oÀÜߌ·Û½LþŸÓü"DOéh€É‰"ÄPˆÏìœÙ@±ˆ±#(HIz¶ a†B# ›eÆL" åÊgð–2D"2 V,1DbŃCõ R®O!ÇÌ1ÿ?CíùýAê`'ÁNè>ßëœ~–zâWúóŒñóuµúk3ôù€;þ_)úûüþ·òôŸ¯ËøÏù³ù_ÛͪÿëUU¶5…©¢ë'þqœåÖ ØÁL.!°±Oûßùì^›±¨z3¿ûG¼æ×ÈÇ„LZìÿë™­Ò0Å ‰Ù#þªEŸü°‡D w6~Sƒ\  (ƒh?ýÝHqkò<­ßäÁ70§`ƒ¢?î÷­±r0t6-DdMðeg¢bµ0?…®Yù·©×îöðQ£‘¤¢cQ€‘ÿ’§Ÿiðv;Ÿíõ]ÿ•r¤£ÿ¯âÏîsŸý9÷ò£ý=޽¤xôÿo¿þ¿oòËßùÞ?×ü*gøSºáÆ+8Û:õªõ²ïÿKãI³¦RÛSøÕ†Œóõ×Üþ?ëýNa¯Xž‰ü¿¯®v'ùÿSßûÊèÿ?òÿ"±ƒßÒ¹?á¿_Ÿ‡ÇÛœOÈ›sðs7ó6ý[þ?××¾x¿æ™Ž|ߎ7ªO8Ÿöÿ^~¿?ÇÞ§Þ›Çã×Ç6v.¿ïƒžØ+zì/ž'¿¾k*¢¢¢âè±ÃQFÚ ¢•' ˜1E3,7dôcí[ý}zrWã>fÙïÆçË>l“nónº6ÿéðkõŸ«±û}¼ÏO½þ=è{þ‡‚^?]mîlãGgÎ}{þ›qöØÝ4ó12f?JÏ8«Öµ¾¶Ó±ËöñúvåìõÔç3ŠjßüŠ\~Sx`œ”þDßåuÃý(Ù³æ3 QäªÕóæ³Ûõ|q®;öëÖ¼í¦JF•uPH(ŸßþD¼<_XçOçǬþ?ìU‘ú@í_ßéšRúücý°?úPDø•—S•×ìÉÿëÿhôóýÄ”bAˆ/è㊿]õÍ|«ÔZ -Û×ûkþÖÀ±ùþä÷ÿmþ§·GÚùdÂoV°Ä ¯j©™`z]ücWƒ"º–µIëwÚ¾·6‡éS"lö0Iz³?é +Χ~5ª¥®eâÍ9ˆíVÃd0Äg 6YªžõXAx3SI€ùQõïA¿:³¡õüêxƬ&잌âó©ÌáS;UUO’Wo¯X>‰² Z´“³+j÷òщâsw²Õª›vün?·­¸Ï^þzÆÓ«ôaÊü°¾±¿—!Æ'k¤¼7}™²gþç¾ÜæÝb´ÃµÓÆo^_ÒË3êyõäìþ õd´øÔÅhåÿênáÿ¥U9°·|Véø¥¾ž+ua†lÝQÞò5t-$Gý?ñp;¸ìˆa’$cÿ´hÏ \ãÿíѳN(¡Á[ýðcΫñÄû!×~4ösßÒìëL>Zß/R%§÷ j©8êa8C¯ïft»Ýš•#©¿±“®Z{7”ÃJgᆠDYM﹫±£ÒU«2oþu¨Š ×Kü+|xL°˜*ºa·éG„óÅ Öõ· »f^we ðlYÆ~”CRƒÿïêãcöªž~Ä;CûíתxÏ›s^¥tÖ±‰P§8ÿOñ¯õß%kþIö¤óWo¢–ÅwüGü¥uÿe`#=¥Ç !l·ÿCªc»’ÏÛr‹ñ¿¾åvôú·ã˜×§ãã=¹ÿ¯·±èzmÌØÞÏ—÷òaÒ|1WwìW¢óµgÇ·ùûóî}ÿÚ|¿ãÛ?c??ù|_üœ},.ÌÿËÙ;½mô;†ûv5ÿcƒÙìñæÿ”CÜAʉ$Sˆ¨$ÀEÿ÷[¥©ÅÿѤÿÅQ‡n¸èÄò7ç®{?-}0m®4s|¿µYâ[D@ÿûˆ…h<Üÿó\W÷L ÊÉþ³ý`ô=ÓËÑŽ[ãpz•2mëpÿÕ™Vqš!|Ql¶la¢¡¢­Å59+äÙi):à8Ø®w—sC(K``sxF³Þ?ã×ãü¾ùý4§ñþ;oóxiJQK°¯Âçñã÷팛Õ@ÆÜ‡oúßù˜ÝíÁÏ?Û¿c°óŽšþÓùoóØá¬9}9þ›U|xŒO?ñÖkûÑÿÓoo|c±B›Ê“;Öÿã®ò¦F¸ú=»gÓNƸçþÿIöÎ?ïÿ§ßéç,çð<`øºù:u^žž÷œûîÈgå†ñzæ»v׎|Ÿº?OñýŸµýßÀ‡ôþØ?©ü§óØÿßû'êþ~ßËõfð}?wüýï÷þ;³òïf{õWÛ6$†Œg¾ 6?Ö§þÒÏÛ_õdŸñÔþ½¿‡ð=¶çù{ñü?ŸÈÃVgù眆iùÖç×cðu|g Çdž2z‡Ë¿^?mY柿^ßcçßðòíƒÎ=Y㱟ið|zeÛn7û`¿ò 'ú!¹ŸüŒÚ¼òÕû%7û³¶ˆr@—ãÏùW-¾%­2¶Rà–9Ó‚Yïþá–oúÂ|¥ücûë'vUþË?|²&*Ñÿ?é¨êÿ±Cßö/ú‘ù¡ïüéý?¯ûcøcùõ?­Oõÿؽ?·ù辿çïÛôþ~¿_Ƨçõ¬'Úÿ/Ùáû¿ ÿö?°AÇ=ÿwñòOð5pOá]óü»Öþ«FyÎI×°†&+¿ðúm­mÇs9Wõ}ÿi¯ÞÌÅ}“×úú¯GäÖ¸<¿Á_Ïüokûß'Èëåþ=øÏÊ»~îiÁò£Ûß¿ëž<ÿ-Îù®×ßíXÆJâêýû_¦ßd¿5ìòãþ·xVWÿ–¨?ÞœBSÿ‹üÿæ6jgöúÄÿÈöGàáþ·âÛµgÙò‡÷×®1övy~ž½kçé׬öíÏíïG¶×ëÛ7ŽûÖÆÛP¾Ÿ³ÉÈžOÓÔ矊ä¿F²Ñu×§{˶«.‡MäÅŸ¼oêVÿ}}ÇýºÖÜ>¼×‡óÕxësý«û‡‚ýÿŒþ¯òྟ¿ÏöC,ÿ¹ÿèP?áGô¤Ê—颓‡l›øÿ/·Üù|¿·;þ~;ü-¾Þ›þGŠ··ïëž²ü¿Ó÷~FúÛÙ˜üÿÏÏò?gõ§Ó‡Óñ:üß]¼×ŸŒsúÌÐ?þ“ü†®I?ù¿ìÿš¿¶Lƒþ*T@œÿí¥?óÿçÙþ쿪‘ÊMk¸ÿ˜Ö-—Ž?ñséÞW÷ä¼T¹)î?_ýê¯ïM|¿‚dÿïÂ1ÿ‹Þ°÷á *32þýE g_ø2“ÇW 0¸¥ŸùÔÂôE¼Ê“ÿkèý÷˳b߬9fϯÿ˜Œ7üJAcø¯¿ØÝ¢ ‹)– !+ ¤É¹¡›'åGRg?üI„Ccþ~†j¢kÿƾßëÇñû§ñþŸ¶ÿ×õýïý~7ÉÿOŸîè;k«òrcüùþûÿsÇóô?‡öOéòñò¿>Or÷þõë5úÃùŸ-cyô·â>œÕ¯ÌýGýŸâ ýgï|~O™à1þ~¿—ÓÂ}/ï¿ûÁs9û™ÿ¯žFê ~¿Nß÷?/J¾ßžøÏÁÅo»t›c É׊?§ÜÛñÁû¿gê×êßϟϪæ¾W£¯lúu×ë>>{gÒ~¿¬£ßÚôúêgó`°ý•äÇjÿŸéþ¿³òþß¿ÿ??áãǯù}>—ßûþï·Ëñ?,~Ý¿nÁZŸ¬ý}{øÛ·÷ ¡…€vTŘÓ\ž‡â}O¥‘¿§ðý|÷óûŸmÕþ—æ¯ø kì?ÛÉñËòúþΟŸÌõϨO¿áüjÜdøüzãÏ>¹­ U|½þ »€Á®øñôèôïù÷QH°DûíãÐ1&±³Œqõ÷'éñê:xÿ ì`ŸŸøyùûÿ/©Þ¡ \ú×A Ç¡¿îr”þ}Ãê!í?Ã×åþÍh£ã¯ßÒÏc¯rÏÇíòÚ{œ¡èpwëùú~Ö~Ðþ)ô¯Í ¾åÚ üÿ‰Çïÿ_Óo¸ÿ¯Û÷~ïáô6§õöýÙãmßéþùþë¯üG“ÿ1\÷ßütŸE쿯a"û÷ãë1WQ€Í'lìç½uGW©êÞù˜Ë\÷æçY¥0úü|g÷ÿÛm~î¿o;y÷ðé'O¿Ç¶¿?×ÅÿÙü?…íý»Qßü?·ØÇ¯Š®çç¿}³\Ÿë_ŸÚ|ÉŸ~:1ëç;|}þ ·¦¯§ëpocÙãô®Ç§¿ãaëþÏ^ÞdñÌæ‘ùó»Ññ?ß§å×g߯ÇÍóü~¿Ssútk >Û_uûî/æ?÷þtWøÏÈþ¿.?·úv¾¿íÜýžõ3þwþówOr÷ûŸ¿õÿ_Çßø~Ø}ÿóíùãoÒ¹9³÷ÿŽºÈâ±þ"ÿ)(ŸªJ" *–”ôªI£ 0J(*‘d(Bá ó©á?§£6,_•Q”ªi}*¦ “‹­«‹øKƒZ?Äçw»ý~TwíÄúrp.]Úçê'"³4]Ž€„Üfð\ÐÏ&ÀÑceEÛ$½ÿÕÿV=`J—“ŒðÝᕉW8¸øÛ²8ìjÉý‰1¦F‹Vi˜@yTsoï°åÿÑðg™È™â«_s‘nEŸ+:ƒdã?õÄ2D{ÑÓ'Û¬ÏÝ/02‚·r>¿MfŒ»mFìYô žÏûû÷í·c–Þ>7úú~“®§êý>¿ëÛökéMÿnZ•?ÛÿÆsxîø¯¾¾!sÓåú«Þ¨ú蟖2~_«;nšíÿJ2þ>g]~‡ŠÛN}óþ¿Çüëþ¶¿Äÿ}^\¡¶qýÿÆ‘ÿN¸Øœ$Ë>¯x|qþSŸý _ü!ùÿ ÿ@…Üý_o¬?gçýÆQøÏÔ6€C”º‡ýÆ›;?Ù›]eðͱE‰IåÙ H[$áßûÐ$2È ¡ÏëïþF%¹{¼$©ü±ÚLB˜r=Ý0ò†yÿ*ÇoM»üÞÿÛ?ßç‹>^þ·tóÛÛÞw=q~ž›RøÛí¿]«ùóŸ4þÃpüÜ~ÿÓøÙ“ýñ¿éñþÇÏÏ®Õ.:-6ùÚ]þ½ïŸÕ[ü·þ›R§%þ>Óóbl}¸ûŸåý¹Á‰“þåzoL£ó¨B§}†uúðsþWü}úœÎÿäôùu·Ëtý>Uñë¨~u{û‘þè?Ú¿×ü+þŸÜ6?Ü~kï·ùð䨸ûwÉÿ¿|ÎOôÿoMýÿä{XþCÿÛü/ü?xm¿úþ¯ðþ?Óüå?‹Çò“ü÷É_Äß}õ8þ]¹Çñó×ô1^Ûv>¡üzÛ¹¥%k¾<õ>vÇ÷ùƽ¶ôýsÆÐ7ßÕ$çé¹ßcœ”Ž {˜ô¿óõÍŸÿÿ(¤Fqøù?ðá…É3Õݘ#Ü1ØúBG\oÁR¿`Äò6ßü}ý,I_Éf¿ÞKaÞ‡ÿê²ÆŒóx'Æïáãß××—zøïDöñ+b¼ÝWÁçGƬK¢Ž¯nÏçìzž||Cß~Þï/·¥{ëßíƒÿöŸО¾žŸ#ñô÷ÇôüàqÑ™XÇj™qìíšû.n'óO3¹^·ù{Éóÿ–¿W·¿s±ùw^ÉÑ bãò£ó׿xýTÞ3¿ŠõýYºkÁß?«3Þ%UG­ˆ&Ì/›=ÆÍ%kCs&s>E—ë­où}=ûúw®ÝvêïQ- IgZHuúÿÀõ¤/îÞtkú}·Ô½¼ >È.à©7æã7 ¢FÍGý#ÏÞ<óOüþ×ð¹± X~4ë·¼¿oj:zÛ˜ðGÏÅkÇc‹çßFíÛúaÆolÐv"[Âé1ˆ%Õ'Ž>·öÖÜàˤ~mj²j4k\K˜ô¢ŸË?¦ôq3Ì›6Úžø¡i ÁÙ-;^冲VN+0j·t"à5þø5½gZW&ÉF$©!4åüxÓa“+½(¬¯ ’¹B¯é83+þµïü¿<ÏË\~sŽÕ“ßêç´70u¿éãë‹5íìví—Ï™Ùþ?Ëûÿ›ÿÎ}Âßï¹sû]—ãäï¶«l]ìÝt\^§öíþ:¬ÑÿVà>Xÿ¢à}ñ÷ƒ}ÁŸÑ:Ë^žñ~ zP—Vß¡ÿ¦þ7¯NÇmððQü¿Ëãò„éþT—ßóý­¿—ðýÅþü—ü;ê¿-hqSøçøÞßÃ'ð|køQÛœÿ~÷˜h<ÿ)Ä\Å=?÷í¿® lÿŽúÿ<¦O]¡>JHyÁ?¿¹´ûí5×ûûŸsýûTÂö¾»þ_‡m½ÎÞ¦Þ³ŸîV¿<ý·ÁÛnjƒŠõØò‰¦ÜççvÓ†ã>½ Nˆá¾'Ö½Æ ¢Ç\?ñcv¨¶,ãý>¿ñãsý8óôöÏ9ïü~Cý¿‰øŸàYþEg'ò*¼Éþgü_ö?ӱʈc¢Ë= _éþ6X„ïEbª?¬ýL’}~¿œýÿÉþ³ùo¤EZR ±¯ÊìxHB˜E’ 0 L!8AH)„†Wñül'ôþß²ÀÙSL„ªçlUµžrí8ûöúþpþñ ÞÊgíù¿jöÿ¯xú! ?!ý/öþσÙñG¿~1ý_Þã\c}ÜàÁ¬dSŠŸ›®~8ü5>\þ„2ùóØÞsø¿?<„ׯ×Ç}ýsÂpYÛŠä¹½ƒh|¾Cðü?Ëþ8ôïï_³Ïņ¿¿ËñžÿרŸ#>1ɶ5öïÁÇPÆ»~ß)³Éý¯÷öóŸÃ·ßð?3Çõ€ŸHì‡ÓôùI}¿˜|üzëçòã\jÏÆwíéÇÓåUôóçÖ±V™ôùßÓ¯Ýìkê{qßæ|äÛøÎßý=kÑ¿­[¯ôLð|§ìð×â^¹õãü?¯ë?—îâ¼7ãø~ìQþµ™úÿx¤ùÿ˜ú+åóþ^²Gü{øÿ‹ÿÉëƒWé¿ürÝ'ûnQýÌ)“=TÙ'a™@- ñÏ_(~™É Èy!þÄ?T‡ôþßÏøû~däõ4nÉéý'«?Öÿoç_ßü8Ç÷·¬kj»¯_]¯¶ ¯.=¤^;Ø1›Šèe8¸{z¹s¯ºó›åæÖê¹;² ž[gt~ÜYt½ÿÀ=ß«>3‹9íXKÅã÷Þ¼3¤3 “7Œòô܆&ÌãåÐà³»35úîyÌ€ ¥epðü‹/–«ã±½öûª—›¾ìÆPé?o.îäwÎim›fÌàÎaó<Ç¢›•,¢É~yÞ¾kÈáóP`±¹¬Ê³ÝÛ›Ý6öû‡/tešÓ÷9WsI¥Þm%eì`ÆíçŠàçÛÒLÍXL¹í×;…};²ûJrÚ_=Ãä¯û¿A;ÝîÐ¥Èp½xˆÝC{¼‡qLèYæÂ8ñæó›s8\Ìɸa‘ôßokV)“£­êòɯSèÖn±áÞ^8müJ(iQ˜ýwò#ÑÌo(Bý΃çÎÆû1YÞFàD,ì½¼¤Ôpñ¾ã1ú戹”;{í„{М80xy®ãq‰7NîqJþ,´M.­õãw »@H$$çO=ä±3ú[£7ƒa«}Ï2ƒƒ¹8ËÊ÷iƒ<®ysĽåÏ0šÎ¯@%v V€®g·c®v1ìô·Íz¨û|ùν¾”°wÀÞg”M´&9ÌŒÝÍ)¨p¯$4dàxZÓÙ”®¡…»Ån²,E'‰s¶çL›Þ^Ò°w¥ßIìïoÝ…D½{};Ý6Íí‰÷—»·)’zÒ¸’t?o35¸œŠ¹å{—ªéÛ·'yî»Õ`ßÛ¨pÔøv´îÅä{q=ì[8<ºûjöµÎõ—t»=¹º³Godì>'4yyTÆeªz¨~»vÏ#“ϼCËÈç³×yFK+SÑ9 •âò;4ÀRe›Ö÷¹:Þ-û±%ËzŒeï¹B5¤ó½0ïÀ·¬.ŸcÙ’Ä=Ù)ØY‰5DÎæ{dòÔi …Éäâ"I½êãçŸ11ðöpÎÅg9)6wc÷s£nhÚwK©ƒ·v÷\òs?i¥?,öõõí3âˆc¶I&«+!Éí'^ù ›1a¾h›ÔeÊ,Ýl„Ê"L¼8ÞÐ1ÎöL&ã ²JÍ2C, @Â[ ˆEÂsP±Vaåœ2v£˜eÛb‚iÍ@Ë0Í3I”9vfÉURlòÊC_%¡j9` »j¸fц6@Ù’o¡!l)' ˘¡'*2Ç5(E†û”Am„»nä7dÓ4âëv™&þù­žq—£ ‹¾»IZ³£J’Ù)Ã&XéL‡va’Ló\%6Ã*‚’Ù¸†éÍÑhC—WDÛ‰½Èr“†X°E6 ¢»¤fpÍÒ8¬°•Ê)„0L›3Ê–>ØW8È¢)[(kP4®­5E«6dÖ+‡(lDÚ¨š _ÜÊV ò5A1…¨ªªJº¬·Š@R› H³ ²e8ÅlÊÀs½mqüó|›ÿcüÿ¿¿ù C?·üÚÇá”’iiª@Þ‡Òå¦ÛT5þÍgU¼m“‡ù5u4òmfÙSxÕ̳f‡,¨"n¬¬²bóŒI›3žbóýÊâó0ÿó-æ¾;Ý ÅÔT7ÿ$ÚAöŠ ×^y¿[‚ó%”Ln[§¨û‡%yã»Ê?éá…ÛŸu®Õ!/U =®Ç 2Òcž/¨pÿLuÞP1½«-Œõ·1*G~Ýñ§Ú£¯ýÎ!©ÎõyÆ®C?ñŽßöÌ=´T÷NÏc—~†MüïˆÖuþ]Lõ@haÓÄÊÿ:`ŒÓŽ#ná êcÎ~U5×÷ù>‘ÑeŽÅdi°¢ëüzÇR)Ëá{VBß":*,†#6⎠ÁlŒû‹×ÙÄ'«C]ûÜ}¹îâ¥Ñòn]ùâg—FD2üC_©YÐ †@'÷¼Ü_Le$Žy|ºõ­_ÕŸùûuÿéýù3¤t7mþÕDi+¯Ïòg^ ‰OÏÄÇÙü,¾^û¡ó¯†Ò5Íþ˜ôÎ!áÐÞ™ì ä¨a)Zg–œ¼ñ¬àœ4™MóâìBõ±b¬Øî–¯nL^Ïd¥gž©Èqw±*z÷«‰;ÁƒfÅá²2P«Þï+C³Êq̈ÉI ™lX "€zãVɦ¨9o!ÉVîb<ÿ‡U}ÿNªx‰ª®ÚÛ}ÑÕ‹°ý˜‘æF5ãû1vb×G[ >hœ‰ÕgøïÁØ6žÉß4Žg5ÞèJ„9ß¶Õ……=NÍÜç¾öæõ&uR‰ÊNsFîß*Û5 DÍÔòýª¶óDÝ;â¸ìö{f³V½µ^¬-=y¢KCÿY ™dì“Ðö.I:`S=ôI4¨È¡Ú+'Ëÿ! Ò3!2’™æ+^r—(* … ’ R›Âb` m²Qd P’]$šd2ÄD3rO˜I « =Ö–H[¤hE;}‹± d›˜òo&ЄÞÉÁ É9/rI´$â@âII%HÄ –œŒkYÁ"Ü:@.L)d”À0Osàõ¹ÉÂ+¿$qP¸ž1ƒµå.ƒ~ÕëØ­Ä-œV| C8ÖÚËú⇙ÕÂPÙó¢úÖã}PŽ.§øÝ Ùø#¨Õ¢ÿÍ3…Ð×>×B”é1þ v¬0­{ kP@ÏêÖ>qÛž9߇~{Û*¡&“n=.IXΉÆIÌ!+ÆøëªôìRŽíÚpç±SüjàèέÐqôfÎÔ‹ÍôzèocÀWGD‰:"‚FdÛœòÞÅ"Œå"œ‚_9Bà °Ä) t‹Û§méÖüuÎ$6ôãêAíÞ½:‹V@î!‹Byqè¾€ŠÞ´'û³ýb„¡ø6‹Yûô °(X`ú0åúZ‡g a^nFh }ïïcû;•½Šÿ>}íÄîëœKóÈPXgSU×}o¼ëD®ßk߃· FëµÐ¸Ü`Ž`½èb"µPœªœíïEæÚ_éÁ±&Zü”Ëû¢’ 6ݳèô©Œ;¦µ£²poMq|¥)e(•){2€XŸ> óP’”ÑÁAÒ;bÎc¦A¤À&J4~TÞ>—üŧ߱%.Ñ Å)ɇ ¥Bº´5Tê ë1yí0øÙ‘î àö0{íÙ‘¡­fÄëÒÆ‰[2˵­ø9¦èUé ¿Ij¼ÿ‰H–å’ ŠÔ)̾5~@ŸÝ[ R@Õdëjª¶Ì©f%B—ÛÆ5¶|éÊ7o>Ž÷לѶŽþ1u Õíÿþ¤ìýqþOì¯å‹ÏðÑ›ÿ»¦Š-MSNoý÷RÏýv÷ËŽ×ýø³<ôá®pqÌ[<öÌBS.5à’§Û•wýy·•j8V'ÁÁƒ%¢¯OjæD³¢QH”˜B Æ $`èm³ ITJ”\Sˆ2ÜËÙ/™¨/XyÍÀÉ ê æÌ”Ú‘Â"ŠÕ]·‹–àv²8ÆNA'‹ŠHø¢Rc숗RùÏ’é“‹æyåµ#Hö1q26ëâ>d‡áøU}êÄË{~xìb~¼þ‡çùqƒŽk~.ÿf~ß׬ø_Ù¹g9*=ýÆÞ™Õ »mÎv•û½9HnïÙ §ðü_g×f™ò‚·»Ç¿P=ÃÜßûŒþÒ8ͧDùõ_w˜w³™Ù´ô^øè>½é= øóƒŽ¢Äï¡’]ßökýèkOW×i'Ô Ås(Y¯?+R^¢­5³¢D,õó.Ī;r:‘ô1å'}®Ž¿‹?DŽ÷î Hô»½wMÿï Eê8sÏZæÆ‚$q€ŠÐz§ÜK¥­öë@h÷f§7|™Üéã‚Ðüóq"ù Æ9­m~;=o»æ¹#º¨kú·Ö†~/µÃnÛÂO_Ç;rη„#¢Æóþßãü¹µž½ ·‡^ÆêÐ_Þ~¯ßœ o &° N˜ÞÀ\ëC¾ù›ˆ½~K’ú" ïc%Ýlj£Zçâã×^Èú:Gýw!éyßä­ì\v?»¸ÍÁ̃~UÀp•.ßN<‘ø®(¯žïç‘I¹0Cï“Z:€áF)Kó#Pλ\Þã œšåˆè†9Ú ¾¿Éîˆt ”×ü7+68c0|".þ&M; 9¢9 ± ›é#uëÖ5\p:ÚÃìöÌϨì„í5º{~jö3µÿ~º&H¨m.Ehj¦ëÜ=sëŽÞê0‹ à~`‚vÍuwô§”|ï›ç3ĸ¯Lˆ[ èê?€®y­L{ìŽÎá(Ú×O@|ãë¥!E'U• cz©ÓU ÿ£Ÿ›§¡Ë˜D}äÛ€þmO‰ ÿg²ú?ÐÐÓò…ß9P1|®í×·P£ ~ ·¢Ž<¾ ð0 %©X¡¥ˆ×¦Îð#¿íÚ‡ìªÓÓökõ~²~¯ÏõoŒëõVõãÎ?Y³¯ËÆ5·óßÁŽ+¯ÒÌÙŸzªùàëÒqÝûûäü;ý6ôžÎ€óÕÖ{“=¸ü:ùükŽ»öE^˜©èƒÃ×ëÅùÅõgv›óF1™¿†ÈVûâ¡äJÚ¯µ<«~¦ðêr_QñíµÎ§ÿ@ê¦S_™O}­©W?éþYjК¥Ï®r͉Eób˜Ä>ÒáZ`¿,Òڂ?÷R;ü‰:=II(н×ÿ.y7%iÇnù9ׯ+Zõ›õçSÞ§ÐíæøÕ•cïW·µ—:ÚÒâ»UÚqbyÁX¬U-|ÛÛáÙ4˜Jö«Ø‰/Fý8áÓÔ|Cfj2õ®;ñ¾HR>œã~9Ú–ý c'·W†E€d™‘ŽÙ©Ã¦ïŸzÖ8¯}¹êNQ ª£ ù½ž *û¦‡F¤¦E<×­Ö²zèb·¦•™;nÑí˜Ýe󃯶z~y¡üv<4sù@HÕVÏÆ5‡‘ïߢ>~xÌåY@#ìøcÕG :Dm!ØCéþúâ;1ߟDußýŸDðÿVŠkì lïñw(Ùiøuþ1ùÅ…‰25ìqG·:ÆnýLLìpqöç_^$íñÊNûÐeíÇ£Mˆø ŠN2„ž^Œgõÿ“½Zþ_ãù QiH1À-Gþ½ý(@;ÖnuuŽÙ­ëË1›(ÑóöÖ#E¶º>w ö)dëþšf;|€5÷sÌÓ¨ù¡?£ìßûê¶àÜç†àOtì%ï­ås©­g¾½…YuHЉf‚ ¾ß7sӮį/·Åc—^¦JÛâûÍ ¯Ž—ì 2ÈûˆtvGkz"Èĵÿ·g ‹ £ 0Ø“ ÈzTþý2óýƒ÷üYÉ<ÿî`}ÿéúH'ÿSÿóýdýÿ÷Oó`±`~ÓóÉú¾R~gižµ£ð•³g«rû3¿sóïéüŸã¯¿ò䇩ôò öîQ÷·í­¿^/cl&Ú]cjŸ¯×`ûI!H¢?WýJþÅÏý’ó?ëgý´çøÈLíþšÓEÿ8po­¥‹“l¬˜¥à³fuÕò»K¤Ó›Ü«0 Õ³—.$A$’ìPFàfÚÖ››Í·V©w¨‹¢¯uqig…UFNñW4ãÇ‚zXÚð~_bß7”&¯<1muU+æŽÌño.‡äª;gqÎÌF]ÒÄpžy£YYê3½†¡øŒÓž^ªX…ÒUÕ¢£UÚǾ+€ü/‰ òëço­º3Ì$,òÚ¹ Fs ‡IŠêy~)怖œ¢k@L†è{ƒ1n°[ZpVcÌ™C0àyÐ}¯ V­óµæœ+´%\ó\«ž1C0*NîJZ²•µ½î$Ý¢ ¦ !q9æhÏ0Áp^póžs)ÓîcçGÇŒ£bïƒáá/•CîršC È•©¹ÅáPæ;¥ˆYe3sT—,ÊÎå÷ÃÍÔ„£ ÎñŒz‡·– ¬BFi9{Zšw½]ÕÅVll¬yZªƒ[(‰ÂŽŽ‚Õb-TEáu)&k\«³¦œŒ¤fåQà†#o&oºê¯2Ê­äÒ  ­²¡I©Eüãì«|´z¢Q,§ íµ7tY¯÷ZK@kþ•fú‰(­xˆéHxzÎsš÷ç¶Ac9ƒž>w¨f*às‡ šÌ@Ì]Ÿþ#P7MPÛæ†­˜ÄX4-&ª4ÁBRÿzÒ®o45¡×&u­ß×ê˜Ä¹½NqN·A ßþ½Ð¾qÖ#‡Ûä7–7ˉ¬/GtVüçn°¹¬*éú©áUÛdëð¢ÝT|;dÎŒó^I|Ð$½À8ÁζÍ͆naÞ]^²FÄLŸ5æîáºs8³h&K8¥ï…”E3„EÙ*¶+ÄŸGžyYÓ.U;Þu#Ë“ÇáCÝ6ü¡O9ÈJ+Ë‹˜üóÈ1F>õ]XvÇÊîï^àÎUa‡—TWz=G'œÎ.oN^_…÷+(%j ìv¶/+Âò: o(¤UWevøÑsÆ÷Ž2ßyU@. æ³ž$õï:kY{°qg’«tÞY“Ã/:yÚOÜ¥Õ¢78÷–jƒ‚Ýï‚ñÍí—báÙ×[uÈiÍó8mUåîd£CeyÏ/‰uew[Ú‡{:ÖjyÒ.ô­ïK„y‘mq7uX–`[¦"¨ÄyÝ´À½ðr_|×›¤<óxˆ…wsww»ª³‡_žfãÜÃ¥à°`„ÞBg^+uØ&*…ó—WK˜Ž(Xl›rûWÒ¨ Ts ªµé‚”ŠØÎ,ª)¹¤'yv¼‡EâÊT W kÌuœH¸CÅESJüÍæñmr«REßo!Ï*‡à¨Ô«NBªÒžFaÈîñø–e ®ùt)Ùm²mÛUÍ©|Üç‰$—'jlVÇcÍçZ-­òN±ÝS› ¶ “¶²&÷•ª,ª¸J«Cc˜ºbç[Æ5[Ùj‰ 0¸«3[Y¾NK ‘!mhµ›•VЃjƒÝ5w8.ˆŠ1ïǪCf»¾pr÷9zÏ0᧚ ÏyŸM•/pÛel¢kóúÿ3ÐþŸƒ÷Çá_·üÛüvú~›?oçú¶ú€cÉ~·ã?g¬¢?ñ·'Æ?‰ö’zËÛòû„¹çëëýñëÛ]wäŸoîo3ÏþåÝËAuâáX0 З³*ÁªLR\º?¿Zf²“?¡òÕ•Mwù„íž[à÷ÛÔCü0lÿ¾ÿìsÑaس‹“·êïî|` »ÿÞøçӵ·ÛoÔüß__é~‰ˆ=‰z,ŸáC$ðÓü˜×àýõ°*‚þ×Þ¿ÅIŒ§;›LC¼ø?γÎÚ>1ëâÿýë³³hÀç6™K\ˆÃ½doû—…afjfÁhù{bبÿÑÆÞí  U]%õ]Ôtï]¨NdÓôô(z*‘JP‹P¡ª—F;¦sXVR?Ïk¿ÇüIÿÇý ¤'²î„%$€‰ì?ž?×ÛGPü¸ý$—¹žøÛ~§á¦sóÿ·\tI hCÓ=oÇ飾$;c}¼@‹!†ûa€?ýÿ_ôøþÿ8Ö«ø'ÙÆ3ÿ?þ6ßc†¿ë½óý;‹1¿ù“ùŸþß³Òk©Ûüå'Ÿúý>ŸÓÿ_¬ÿÏïïÁît¼$Cþ‰I?çúÝÖÿ럽8ûcZÚ±“þwÛ7ßd]ô‡Ôvè웡23Ó6èJ¸ž^å¾$íÚ5 ÒÆ{ Èâ¢ÝßÒáøÀxqs½ ÒÇ«îîw[¾æÇµQ¹žXfÁºSŠ=%‚,%¦,‚îè[¤Õ´`#LgËÓdÝÑ$ …á3œ/v»Ð Ô´ßB‰˜K…ÁðN÷Ž­BŸóéFg èñšÐ õRµ|ÈÅ9ieu‡¨uÙ¨õ¯ *¹Œ{1zv)¯I}¶k²x*ò' õ4rÒ·Pxk¦ûx÷4Êyh‡È¬¦÷vøoâ( sÃnùz×4’áÜÔÇ’ÀÜçÄTE,·Øî=¦ÕyöÞ/0@ûvžÁÛ¦@ͽ²æemÙ‡4V{Ö‹kz^ ,-C*Kg–¼=é¥. Nü{fvîxe8ýÿ£Mû& ½ØþÝGä¡fk|†RBŦLÕ!ØÀý‡ÑǹŒBçnqžÞÉœà±K_ck·ÕŸ.èý/Og1ŠÔ5vQwׯ„Eq®—z'0‰ÉÖ«w|öÓ‹ÌøKÉUæ’°Û[éÙÅžgO€=§döm^Ëí\ Xé¥kí|¢hîÐêÊ7R^·g«Ç¼© â•bÓ¢Þƒ×êíÏjÛÓÝä[Ì:3sT,è1w]Ý¡gL&ngXüµ©wÝ=)9†ÆªÃv9¼N›‡{F†Ÿ^ío¸ŸNxPöèÄ7Í.ç¾”y&-yÝN #J,¯Â56Òk§„\ݪøLöfåôPà„æqmî{”àvw¬gl]ç`gÅœwÒÁÒV.š" цàeP¿äC¬KÃ5ñÒèu%··3 ^"N5‡°fè“ÊosUóvÞsÜQÕ¼×Ñìª7ÛÓ»e%g¯Œî¼ ëÜ…Èu×½{j.Í8 "g )ØÌìšvÑ÷)¿›°ý¼›|³Ëޱ½¥éU4¼£G?ÞÖþ‘[{ Ê! FàÜÈ62ówº.$íemsFyù¡ŒªM—ZÕVaë— ¼=šÆSé¦Õ"Ú^øÅ鹄÷®â2H½ kTŽa™4ÖE`:}GbýÚ8Û„u2È­4¯gN3¬„Fb9ݪ|uKÏxÅ.¼ÀÂz9ù}»°N$e#FãôÒ8ßoˆ3°ÕÝ¡¢—d| É™á©]Ý]ìÞ=Ä—‘Ð5éàïKÕ’¬N6hiòõ—’LîœÃ¦©}##¼ß %—Ñ£›Ü»Ù“sr;;qæ÷¢áVî‡]Ü%XDŠ%Kÿ¹ü¬?ðáŠ}ÿ’CÛM!±³¼boÿù Ì6}Ï—”ezšd¦±ª51 ÞŠ®âð,à–;r:'ˆ£<íËá0@‡(Ø T›±™_ì>=²X»lç£ñÜWtzG¡U®òk¹=®Ø^‰Uæ‘Û3Ö¢l‡jTIõŽLë9½Áˆ‹ˆ1_¸âµ.aý‰Û§—6sžëvªðOs,Áxè“Çqì~1ØW¬ÙkJ,Ólëbòz®ÞÍ•ñsÊ>¶!³›œ%M¢ˆ+×ãɇØ’/t4ôBQxcÀsGÊ@õViÔ'g.m*-¥À'š÷ ´íLýQ„c–c6òðÔ¬ò^"»”O’{«/¹ý%Dyçä»:î2ê½9N¥@¹Éìáƒâ°hª‚"“—öoO‘©å±Þðo¤7;Šm6&¬Ü5®¦¼2…™½9:5êR\æðŽøœGÖÇ!¢ ƒ•y3pBžîºrb•ä“Pê„P)xíëªâÁkßO‡}Àø.e†x…ª% G>¡ðe›²5TßïQ%ì ð¶±åÇxÚRó‡f/‡w UT‰‘›Âobˆ¥Õ倊kÒ1ú΄‹•W/מ€Æ¾÷{ÛâvÈÅ0¶óÐT2ra¸e-4tÌ4@ªŽ“Gl ¢óÉ/ã3²g¶`Ol–ySÞÂÄt;Û,ú·Ô1t›¶Ï—f^—WgE[¢Œó°ÉŠºåsø"¤Z¢\È PšÍÑä´}X#PbEï­öbïC-t ´“"Gš)|¯’Ž·¹"cÜ;¥U#)xº–×Úõoïq¤=tX•ÂÇ­ç:D® ˼;³Ýr¾{_?œZ¼žÌ¾01òäè¦#ù[¬ªCÞ³‹ðÓàÊÜJ!QÊ–ŒoC ¼0!¦ZP^‚ðGWŸƒtWƒl§Y÷,²I­i=ºY/¯½Á&¶ËÚõçÕ6U.“àLÌõ „Û_?]C4òÞ°Ú×ç[íæÖËœ¾×FÙÄi+EQçˆò€;N­ÁÓP¥$œTˆ Hb›Âà—ˆµ8F*çžby—¥_wB;cBYØx­ü¥ ß¼møç¥ùû›Éò\±(Á­êµùb8·Û‹ TáÓ'³z÷èâÝ÷yø`jåUºâ=¡OfL™‘í$¼g âG?Û9ݧu—ŠÆâ*lÔÁ¨ÞMS``L]ÆØÌ(iä?³•ÍK¼ÚâÕ]\@4¨ˆ¶–/Ë™\d !'¶OYñ’ĽT¸TTx¨ÄRUy‰]£³›ËÒyº­¥™wBà1¢#©ÝÊm¥‹É’R‹QQQÙ²Õç`Š«Äw%ÙEë¢+P“Hê¶¢«ªÇÝÚH‹ªmå´Ü ׈}òë‹Bã­ñö u m;Ôj-ŠãCCÆ‘ÔÆÓA9Û!U1 ´Á@Zk6ÿøgsTGZUZ‡¥¥ìÇâœã½ESªÚ¤EÝ: >{+rC{^S" óí…^·™žx:蘨å ' âªxÈK~#.ÏRC»íŒZ«†Ò£¸\Á—ÁÅnûnªùÝUSê"A”S9BÑEaUµÖ¨+±D—tU·.’ߥnü®…ÞÛ½, É2Òà ž\Àª³ jU#Ǻ )eDÓ%UÃ0SmÊr< j¬y%ÕU*EÂèhª*%bŠê>ÍšR5´«¢¨(£EUÙoÌÜñM—Üòu.y·;Þ.Z9hè9a·ÁŒÁ6·%ËvÆúåk2`dÓ¤M¼ð‰w½¬ïw^÷0í#€É&¤‹‚®^Õa+wŠMKÜÆË”í»ÜÆNê/ ÉX®â†?/åuÍÏÆœFþx¼"ž6£»(zÅivãæ£çÛþ ™úMæ2»²] ï4RÍ‘M”#CHŠšH bþϤQt^ƒ/´[Ò_Ú8;Q‚?ôxúŒª¼ODDÑ„Kk‹çc]xÓ2€¼2RH¡C–Ðá¤%¹Jm ,Üe²ÈÆCWPäHS$Y;0)’hJa›¨i†É` H  P ¹òÎ E«©- ]H^ªBíªIœ°´-’, ÅIi1¬Ü 0˜ND½T8`ZI»I ª¢ÂÒ‚̳”-Y"À²E’,a6IGOm5pC™"ÊBS$Y NXZ¤¤6[&9º³„ m†· Æ*JÉGŠ“8¬%°6æ¡„7BSX€,` °’,‰¿/Ž š@Ñ“d¦2S"€³¤…5µhaL˜dé%0“(à é’÷ •²ÐZ[X’€,"’,‘@‘@#Mãhk5!l“7wL¢EÙ¦Ka¦BÒØÉ‘CfBª©$Y-’™"€(’,‘dФŠdC¬3W(µE.·ÖUª‚*¡ª¡c®ó\ɲ€·a!¤-&6*BñD+¥$&Øj°ÍT‚X)"ÀH²EY"€,‘` N½8¹ 2Áaº4Ã,ahÂS IÒB’б!h)„Å5)´Ñ42a˜a)!–ÒZH¤$P (ÀdŠNNLË!u‹ HˆS)„¦„/Š–00ÉL›%¤™J@=599dœ°Ã$ݦØ$¶ pÀ¤&²ÐZm¦¤–ÉH²E€(€,‘@¶917Ê¡¤` P’²Ð“mêMÙ„"œ²¬¨7@X¢ ŒL’š`     Y"ÉH°qâl`†LŒ „)¤'PN¦H³Z­0™ /bŒ‰%²õRØiÝ!ld´ d2˜’,d‹$X€(´”ɰаY"’,‘` ²E’,I‘I` Y"€-¤”€,‘@dФ‹$P€,‘@@H¡@d@d‹REP$P„REY"ÉH°’,‘@H°’(€(’(À` H  °02R°Š  °PXEX„PY"ɲE€(À²EY"ÉH²EP$P’)"’,‘@¡ %0‹$Y"Â(€(ÉI›¤)€,‘` P+Þ¯~)»ÎI‹|Ìþw¨üIyóÉ]eW_«à%FD¢⃠a1†¥¤Ž·°:@Âd¦S²ILFЍØR³ `# šd‹¡H²EREY"{š°0€,‘d)”Àt݆’ÒDVAa6Jg ËtæÌ-‡,6Il‘` û$¶H²E’)2¤`  ŽxÎxCL圲Z,0LŽí@XJJ@4‡#%²¥¨,å$­Ö¡22Ùê^íîRJiP®!ny¢KB(„Y"Â)` H­]cËHa…!„%0Öx«!†Hâ¡3T[&é dÎ6«!†LÆ Ía„½š–ÀÐ’˜³) Õ@âÚ–…êŒ!²CÀ€  ²E€,×YÙÈqP6a+4®B¶H®¨–l‘d›Õ¶ÈS% 扬PÉIЍ0¦H²E$Y"Éd‹$P’7žªûó©lJ¡l‘Io|ó‰L  $ÓLAÕ¤H tÐ,P)!»% $Y"€(ÉH¤‹$Yˈ\›¶†1»F$Ýh"a’˜MÙ†ØÌ¡)a†Éi&ša²@´6m¶É)–„¦î‰ dвE$Y"ÉdŠ;ora$P‘ ²EUÈÝ%0‹ ”)“„0…âÒ Z† $P$XE’,‘IBëlßDfΡ4ÀäBÙld4…0ÊB™&j  8a)Àé’ÒMšBØJI†B™ )"É@H²Ad‹³Š˜À’)"“‘†ÌäÊú€,·’ØpÈRI¤¦BRCd”ÈŒšJd‹&XÉH°’,@dŠÈ€,@H ²E’(ÉdŠ  C))„"’,`   ¤Š  ¡i dа‹$P’(’(€(ÉH  P’,‘dвE’(€)"’(€,‘dФšiRE’)"€,‘@H(‘@‘dвE€(€(€,„RH €(H¤@ @€)$P‘@! €(¤H€ IRH „ô¶î¬©;y¹XO=®°÷Û5ŸiZÎíú÷³ X°PX°R((:毎,¶y²ë±+Ƕjí¬ù}_W™ÆO–Âk+©|²°˜a†d"yîýuy;%d õnyÏ—œÃ>¾.kDú–TêVB 0ŸL©a†à ! 0„„„„„0†ÄC 0ÂC a!!„†B †C0˜Hf †E‘H²()Š„7CCÞöX–X¹‘*y50?ÚþÌCüÁÖy†\ö£U§1ZcT8Úh1y˸jÞÍF,¼…·ôµLsŠˆ€÷ëâ£{‘®¢'5—¸ujç1PkJh´Í˘‹AxÄ®öTEk \-çnWE5ȧWlì b1j:˜Ý¨ŽGwÔ)Q trƒ7ÄÒÎe(ã¡$[jã=|ËÔu,¸Î8¨¼»µèª)©–߆²Ñ¨k¯«ûÌŠ’òIËbñ_Ëõ8žFEgë(èÜBÍãÎSz­]§R¾\ò ¢O/|zª1KXñš×‰¦ò$¨‹É36Z¦ÞãLêï^±D˜@HÂCa!+=&yá"[ÂÙÌ›þÈ.oŒžDAš]BfR`³lJúê‡;"æ§Õˆ´£Š*êIAÏ×_K‹}÷ÇtýØDz‹ŒJñ«}˜jÈ_a "ì§3oZ˜6¨áœ@pôˆg¦p8AÅÙ'©]bÑ0D`OU!ÐÞõ”ÈÁVcb·:q(© †-›’´ÌÙL‘Sþ$I dëv´™lR«ŠÉÛ´dn:Ñ* íæ¼BµšìY­2Í&¬ ' Nû“†5ŽöoŒQ  !¿o}M楅‰j}\=N“¯LQÅ\Cë´Šš´‘hâ’(˜÷ìÑžvO5˜ßªÕqj èƒm8Äš(Ô~ÿ]âkßMÔ~ª9£ÅE}l<½Ö|V’<Äâ´Ñhk— M)|SŒ£+¤zÜ{ôÅO^ç6ëˆk£Cãï|•Õ¶–Í’DàBeL¥S\#  àϺ»ºÍ…µÅ—wrq—m 8†,^·ňÑ$=L-6ÆÙ˜èÔÔ~ÿ]Ò£N€3›hѾ‰ƒòw¨#W~\aèU¦@£øµO~Ô‰Ðô_¾ªƒPùÒyÞLµäÅô’â{g/Ä$㮈ÁÐr:¥TCÆEãvÆo¤žºÕ´[¬¿2·wu¤5@¯Ë½[WU%­™¥<]BMEŽ"éV*||MbÅ5…¢¹õ÷**:.®®’<#SŒÞ Hzs^¸ÌŽíÕ7ÍRXòÐÒC+9ÕíiƒL†žÖ´88´&Ím¬IïH¦új6aZ»Ši¦S˳)˜Bq닆P„™@‡d’"†NC¦ᄆ=üíðÐIÃ$DRC³$47d ½ªIÜ`@Xì=%j¶õá2bI 02°;¡!I!¶õ $9H&è²ñßÍ’C $)€nžRÜfS¾hœ „3ÁD†Ø¢C †Ì“I <°Ó! Ù!¦BM’Ù–€ß}oÆÛr h`HŠ »!–pÀ)„<Œç½hk` çÊÃÊ8çæÙ[ÜM¸º‡q3Oµ"y©ÞGr;Höél{‰ÝiÓž$Ÿby\À¬÷–J%Æ¥à{Â^Ù¦°1<ô»ˆN× n¾ØúÛXïM;í·mA‚DXuox©ÁV¥? n—sÐw»··eb!éÄÖT¾é°A·˜¦ð]ÃúÝ7žù[f+Æ»[ƒ¶v?6ÄŠêZ=º…¤¾Ð?-ØÔ7ͲÝî¦2€Ñ2‚6°ÞѤl’ÈØÞÎù 5+nìŠP¾ï¥’€˜ùwT…UÐ=§hg_h·ÂŽ90^üŠ ›m7º#4”ÇØ8b ƒ2¨1*ësÉ%žÛÂóæ;v²bË?¬¼š·±¼ÁÄÑŒfûh @R ,Ù¦ ×®š:--´Z£uº£ ÚGU˳VËU™â^[Œ¶ùëwn|•Fž>$§^jW"'\n,Tñ÷›¶—yn$6ò‹¶˜í´Z‹½o޵™UFy˜‰Vî,Á2¤å¡ªeQGvµ¡½ŠþÈ<­}mî’s—âuˆ)Àqjɾ䮦¬b}ëm”HüFWlˆIˆñ1³©Bæcb x‡B¢¼¸‘U)QBÏ–ùÓ'$r®!µ§-Ê‹‰${µ d6åñtãf]um bŽžª­EI=XÝ’CÂIIuÚ¸ºëª®z½õµ-Ñ–ÿy{Á"ÑÜoºú~ê$ÚH$’A"I¶Ùhж…ö™‘å“öfLÔ °!¢p€0„á”:Î-!¾ëRi$Yî¥U\‡ƒ}±­+-Ví ¶Úm¶€2ols€­„Æjp’Ò-$7mØe À/'mÙœ›·<õ²zL—ýï=z×<¹;îäà[vË«9üoïÊø“|Üñ2{}çÏ¿¿~ÀÔê;åØYSÚÏn{öwÓ2á÷-çdŽyòòd÷Ü:ëŽqÇg{«£]¨á\õwÇ Ä—ª$:Ä‘H †±VÒ­ÒU[禊<1ÎKl ÈG€Š„M¢tµ¡ÚÙ=tI$’I$Õr¦X™;1Ɔm …(¥½©ÏŽ]q¸*´UjªŠòÄ3ßoìµ—œ¹âò÷?¢óÊ7©¨ RUKnz¯*BÊJ`¡†’.3Ï2Ž º­Xø»NŒ”%ÎÖ;E4$•&“Ii'y(¹ˆjŽ0«Gñ⾦x†»m£h¡óÙ˜ÌI{Ï2»Ô\LñEEbúG·ìˆ=^ûˆ5á Dö'Ûµâê«îIŒñ½A¸õSE|Èž*ž8z«KÇÏüIš³|œ’ïʸÓò‚qU£´üeÎN"‰yåÞnHTTé©·+m HQµ ·U"&Q#C?¾½ª;m6Ö6­|n·àÅŽ¨ˆ0EU`¨(24k¨é©q'2/ nkVè×úçî¨B¨ëSÂV|ùòBÖ'Œ‹rõD–ª¢ùò}ñ<\Hlû]WšHÖ‰‘•¾û¬m4F¢BáòÝX¸§SjÅA7åvÃ}xªúÒãO¦4­± §ä–-‡gŠŒZ'ר)g“j¨ Ä¥W‚Q•½~. [;Û6=]œjq;„(Ò:ªªŠ¨ªƒíUQÛïÉÌæ¹åÅí—&I¾ÊÊßøÆ¢¦Õ#Ø—¨2ª¥Õº4u ¹Û;Ì»¤QÜ"UÎΤ‰å÷Îo1òðþç—ê3 Ý©¹nWÓàvʉ Ô.;åò2õÒÇzâÄÄ%EZõ4b1îß2A-#j*ñEk‚â Òù9ÇX©ß!)-uqÉøåÖº*'öÿ‡/ž_IãR^¹¼VLµ*Ùöìåã,mÇnŸüú²b¦Å²¢hí¸’¬Ž ¥‡&‰ßÖ§g.bä¥8òüMFëCjôd H˜I +nÆ×xãqYle$‡_›èíoQ‹L#½ò‰ A4–»I2ª¨…ÙV ††Íbr “— 1)¬2ßòBŽ#~ÛF®¶”M={n­C®!+¨Ê¯s“γŸxÚ¯1âq!Ô—-=UB%;C±2xÉçríD7ÔÕ sÙlÝÀÙdIM,H®%,YyRÕ!„Qï<Þ¼ÕËGs]5⤆Ӫ_Ý[«Äõ‰–Ö6/[ոȨ¤xzÈ’Çp¾æÞ'!z]ñYÅJ\Þ^(™GÍpj°Öª@9d… M¸©ÈòÈ­í ©ÍÂ*²DÌzÿ-—Î`½ËûÑà\A%__|‘¿˜¶I±G¿ÆZ(çù7p‰#—ìÈub µ béñ\Ô&’”ßUQÁQ3\ZÇ;I´ÓiþceЍÛ»vE L8©ãÒ‰ÕñZ–½U¼eõ6‰øÃ5YÆQ™ûËz¼K|ˆgROW}ì8ºŽqIj”oº¡-Õž~¢4µGZÖ«Ý­ó«“jkÉEQ'ëêÿw®;ÙáÇ¡S¶2Y̶™ w8Îh3m-3éWT±ƒ@r·¹¨´•\m °op»Øš„SnQ‘&Lq m"xËA#óÄêÄxŽ ¯$ÅyÜžˆñÍq»ÖDfOqý\¾“ß«Ä[ó’ᥳ½2ˆ¾6b3¤ƒå¾c™wfÛ’ ñx]“fFq §Ïm:£ñòÉ¢5RWuM¾®í¡ L‡BIèÂCf@˜í­2,OŠxD90-8ï¿aær4ø™û­-϶JÌvþöêOÎnÌ bÚ~öV ¡`îW—¸Z”ÿ†ù"šáI—ñ´Q-mÚBÄħŒ’8Ë®]QÖfÚp µ!¡ª¢/|ÉF4ëª#¼‰Ìi…w¾ii ŒÔFs2EÛ ‡+hÈ2GLF ñLIÚ<ÔÊ$øåc#qÄHâ1w=÷wN|tZ´Îã´Ü|F¡âF‰_2³¯e˜"r%¤šö©¶“ÙhM$’l€B€¡gI!×.¯>œ{d²[!”Æh ålÂN†Âì8HaûÕ_7!Ò‡ºY²ÀðÉ ” ‰${uÆ!l7`NèCv–„ ÆHI–I\u½ö®»–í8C–<$'L!8’L$ÊHk>8æºÕö½ä‡³lɸ€¢I˜Hv`d’C"Bm‚ Nf$±íî—f¾EÖä#ŽQšaÍT‡›Ò©ÌÛÝntµïf2êîx´â3§Ë;j™»¢gRuGÖ9aÌñöõ<^”ÞèG“C®Õ”•á7‡pÇkÞÞçzÔ9q“{ˆnIÃQ­ÿÈg:ûŸfûû.Ç|Ñú|_]/Ñ’“óʼn±[£1ý¾ ¥ïAsžpæ >J Ð*ãü%ê¢p_46#pDÇûNê­ó@ï„‚ rµ¹ußÉϦBɱWµ˜É ÉcÐÆ5½©j¡‘AG¿Ÿg%ZÎk=hßBÏã:’[^ksQ÷d—ÜÙ{i´+ƒË½IZІ"6qÍíÝTG8Ûzø]EWŸ_¾æ{vÙ=Ç*Ý¢{©Ä`ª‹óâÛK¶4“n»$¯õSPñÕËÃÚÍY)†™U³‹4(PÀ´…Ï <ÄŒã´mÉ1—°*VË‘4Qç|•«|gTÔÐDIŽˆP—Sÿ‡ž²ÅKÏ;,´?$Ê\F'¬UELtУp¸¢Í ’¨“íUïûn3ûó]Nù¢+_6?×ée½ÝÛ2jf@Ã2HÁ¶n/Ï×DTRûku$¥6Ê´bõ¶Lß©ý_~»ë<[BþMÐ’!ßáG;8`Yˆµ“#¼S e24<'Ï‘ûÁ˜I$€9ïîçÚ«¿^x–€“==}}¾kÏ=y7@7âs¿«wõîÔã~ïy8ç¶dÝ- “ÈõÙîÏÏ ig3;Ð óÅ3»g¶Ï΀}òûLŸ'õoÓžý€“ë‹•!>és'{ïî~§Ìš…çF׉P‘߬>¦ô ©QV²<ê]îàIvỶúŸÏ~~¶€{úïÖ÷ ­.öÇn|Ns~·’Ûç—Ÿ·8*ãmîÈiXú JfXCÝ!‘½g†Ÿ;0Êù̸ýÞsœ„€“j|ð”’I,¿3hé‰WÓ¹´ˆ¹¿—iU\cC[$ÙÆj‹jS˜ÈWnïòvвy_qgçyvk2{ËÏ¿°í YïtÞ{—âXôÉãÏ ™7Üïç2uT~y(ˆÝU} š£¢ù2U¥6ƒª_ª®l¡>'ã0QŒX¨: f,h~–Þ²$ÛG:êŽÿêt‘ë_3>^IòÙRŒÈîÝÎÔ¾¢N'j¨Y Õ“d ²IUZÎ×Û=¶—ƒ9ÃÖs¾õÏo®4ðV.IL‚„b mrÐFºt+nÚl£‚";›ŠÑm™$¢ÄÐÖ>뿞ÌÉQù¼^j£¿|%yèQT¾ŸÈkhU²ý²ü²wÝgPÛ»W'ñ:ƒeÍ_0æiªj•ó±"ŒÇÚεÌÝç MSF*1Ò+ÁQâÑ«ˆìwâun¨Ÿ×ÕX–G+‚§ê±V1D6Jàñ|Ž“*Š«uFÃXJ ¬¾ÿË0Zƒ¨Ûoã“nÓE $Ñb¨ˆñ–Ṫ›ù$$gŽu:ñ-ã‹…3à a… `d™Õéα¿8ï¿'×Ûåç¯×ç/¿Ï<üþ¯ä¶€»vÐ ®Ed÷½èÉhNóŽUëü×KD5㤄!ƪ¨êµÎ½clÍÄ1tlÌ¢–Èq¶ço:Ѱ«Évq\ØgÒ^õfÉžþ]zT;ëëxà”¹ÉWÞ8$`Ø—¨’ûûa]³ßeú«õ:ó×YÕ¢“Sˆ)w¨š«r@hâµLDGV—5ÊH«šáIÔDRúàbšÂRà # { @å4wÕÄ:K“»£Ôkª)Öö‡$¹¿}&"¹ é*ée9aûzØ`DŽûUÍ©¨L5-ý"Û1Qž¼Ö%X¨3Ëòó_Ä ó#YB;‡¤F¦‹IHRg|RµccU‰õ1£ÄEAóŸÏ÷ ùÖ4DxИ‰n)£âCª£,9J°é) ËΤ.èY é‚Ž8vu¡…n ·áD9L]™mU@%$Øa<¤ß‹“¹“Í凸ªØr,?¿Ÿª¯ú†ð?¾’I$öÚI2»¸çŸ‘É¡[ªFD«8Ä/ïu=×*xËEåx…å™ÇñU4_YV"¶Ì»hÔüaq¤b â[Ä_½•Õ]B2W‹6ºEà M™l‡5[nÍ‘ðgP-uG5“ÞN¢Ö!Û‰*õSŽú°êab8*ôDBÞöêŽtûÏéë[õKÏ¥R奖= @Â42H>¼ouk'½ÖèãŠr6žÌë– ­SC† Á ,ÞÙ^¡cö7áT>ªªÛŠ=bWZaK‘Iižk5‰ÒPøjqq1¬lqÓñ‡>ÝQÞû—ÅG:AT@¼e¦Š©ÅMb0CCêah£S¶Õqq “UWL7öîtfp•ÕJç›™Kdã±sd/%Ma£j£,’Im0…{v¸Õ„¦Üd$è@žÛQ!è„ E’wà¼Ý@ÓdB@ÂHz°±$< $;°Ù“a„—ž}öÄ’Ê;°$á 87I!Û½Ó$5MÒ@곿 ’¦Ë è€nÈI<²4%xﵘ4œãÍÂHvïP9@;$ºŒ’Hsã}ŠÌ!Ù$†™&Y7HE! i’t’#µZ èhG¿.w•–ù'od¹ /ko1ßçz: Ë´é7sÛì·6t†¾ÔµvD°:úêÍÞöŽœ”ï=ÛĽ»qܧstÍQÞs cŠGÝÌäOö ßb÷¥ƒ‘Á}HÔ}ÑËázçiÌÑÎxø»ºh,UN£ ³ˆŸF.ÉÞ±ÂNp`¯b^<â((øZsH”™<6+têAÞ¼¦@¼SG”Hw=êt/ä)âr§ƒ{Ž„\e¡rš‹Á‡v Ù£ucWÆ•”p! 9p¬²[ç•b@ EDP`ú<™ÝkN0é6½nëÞ_*1ü9ó‹lí5|G'Z*Òƒ¢F‰‘+j´r•2%5E"‰ ½o¾1¡S@¢ŽÌŠ[;]šu¦ƒ H-3Õ!ÚÙ+Qh‘šˆ°Vp~*Ì|@ï—t\eÎ"ïíïIBo¢ˆ›"G¨¢ûçòÀ¿í±O%Q*Të·þJ¡ÍP]*4ÐÚ¦è¡6d/ší˜øšÂÐ¥µMnÂÇ¡PÓ(f»ûÒèÇ®¦·*æ*mèã©/›ü¬ÞìaþøI*«UJµ%°Y@[ h Uop’Òl$)„]$Ûj ȰYT[$¬Ä“òù3'Ÿ¯O]÷ì¶€3S!!0’a˜“®÷ ®¦O?=zå –€n½ú¾{bÌóÀ¶€ó½]Éžþ7œóÀ¶€m.ÄÎYï× Û@=uɓѿ7OËõ¬6‘©¥’Z¢­WmJÅoܪ—«»L¶†éBZ\;Ô8°Fªmµöˆ¬i•Ky‚Ĉ’$n0¦¬¹ iÓDÖZ<^ªˆ)#ÿ{qžPÙ Ù¡FÚ“²C#-Ʋ—¦¬ª´¦WÛ;g=³xE 3d¤…2d#žÌÂÎ›ï±Æ8Æl4œoÚ³Ë3îwËîz©<ÃSÎçÏ"ÇÒ8AHZБ\åOœâÐj‹ãÕ‚ ±V¥Ž¢ ï$bb¶Q:\¢úÁªÖÇ{¾aÕV¸©ÆÑ¾>ЍçwŠÊê¤Þ!¤ª«ø²y ë~º1P£}yÆSe 0UX¸®nÖ.(ív«-²™”j¦ÂaŠ-0’),-{²HbÝ>.¸å¼˜ÏaÕÛ{Ê«¸¶9°Ø`3©¥  ¢!IÕù²Ð} §®q4Û>+Q=t’D÷©i„0ÁkEHfvãX¾Å„&œ%§ *7\ŒÃ ˪ÑqÕBœÝZl…²lͪÓ#£fŒ"*7v) íRÑB‘f™ m½‹‡(jêZ¦’Y Ò5­k€ 7œoú&]u‘–iÅ[Ê ã|Ä4¡÷÷ó»å¦®’"¦ª…ÂÔçYÁq Fñ™¨=X…·"3öCŠ­b¸Â¢¯<ÚÂÌ[n ¢hvÒ*·èJ–=ñÕ®![ Øâ)7_ÈÍMÅ]åd1uºQ‡wü%X©(+ÆbÕ[l+W_W›œOORil3'¹m½Ú#ÝDÖÓ”¤ÐÀ˜@ž‚i T ­©çJ.ψ>ºQ%þÞ}ó¾÷ÝÀ íŠß $Ÿ Nn»Ûúäº!7—~/¯Ao]w dμòÉé‡ÒSÝÏ“we¶¦ã„bi”ÝVÈS!ÖœãVz£Žžˆêª/C˜6=äq4¨¬_ß6©¤›cTx"/¤®¢*˜Én¢Œ™Þ{òó°xʤԙë—é=jÖB# d[95YÄY§‹k±`lÂHDUT.÷?œÃ•vy׉w|í÷8ˆ¿¬›œóÔÌ:#‹ˆñ“aZµUãÄÒQ’Q\¡!%¢Û(æ2 ´$cuBG1ÔÆ Qunå·x†ZJ­ '9½©ô¼ìÍèh¦ÞR•XG[—¤1à©Ë·fC9ÍîšaL…sÃŽùš¶¤ÓnÉL ìÂr }h€R5^-òãË54!ƒ|J¢ïÕáÇÌùŸÀ×sÒà@‹VªŒh+=N.ˆê®¦ª!®s²¨¹·le M…M»ihLñIJÇa2Ša‹·TEª#tÖ*αO&nbHjµ— XªŒF*/^­bn0ÅX¨-EIM&»Þîà”ãˆâŠ¢Þš›2¾¶Â†+ÖÌ 0’ìÂ’BiºîxJâæ9„Ù9ƒ%µb3á A“³(düJö’¦<ùÞN»Åf},/v¶Š§¾)—ÑÊ**â>ߺ4±â87^Û,HroEª‰„dÙ&sI·µäÌS„½êc—|V 7ÁE°0Í0ŠŠÝ›AJÌ6èšðTçÐDU(ïy T+jiÙ$=µ@E†™ (C)Ï5¸à ÊHìé’Ë '0€\d‡HÎ}yè®ÞYØÞHwa$é d‡((H¤!"É îÑÊB2BÙ$:@ !2„Ë 1Óã]¸ã¿Ž B¡„‡q„; NX²B)!L'¼XB‰:ïDzÖÞ6å Л$ i MØHy@9I6@€i©æÉ7B™da„4 [$ »$¹¨2@á $òëCCÜë¿z3O·Dñss¹ÖÜEÌu6ííá˜2eYÛÊùY¼ ] ”²Åì{¾l÷´w„uiTt™{)Óä 9—jÕÜð~ÌP&ôJ}¹"ö]\fJG»§¯sÑ“aÓ¸Ôìγ%Ѫ—ºfÍÕ?Ïò‚ÞI–¦(A…'ˆšä-¯ ¿³„tµ¶É”'¨©7Ñ×쾆k-èäQU>DXSëÆM?©¿ka*‰1µX„ÉÞLÈ ÖêälÎË“BÜVbO9S¾â+{cf ”&´c°ÆÚ ¥¤öJÅ[t܂ۈ¦†‚GAM-B¢­͵uI¸ÆíCiQC_Ùp,BF" "* SSºž†¢!ÇL$Ù$/[ÄÂF&ÉH¦ª…!j¨U2†3P¶J€ VR‰k"2f¶°QgBÃ<™2}{öV€s- - 'ÆgÏk“ÚOžxüõï{Ðâ^!5ÈÅÔ¬/,MDHNmœÒŠO d`T63œg9ª†Ì˜I- Œa†Ïσ¿:ÒBrÀÒRpÈdhמ3&4†Fl“¶j 5 d9g£ óR :ñž8—Ö‰Ù!²6Bi!¸Í! RCd†¸îó“ÓD UTáéœ0Ù<ãž®»ëµìt=&™LŽ\1çgòÏ:£¹Úç"€uG„º¾ðXž¥ßC˜†2ížZ=$ŸKJš€ØiÇÊktyàFì§ Ç‘ØÌ¾/ ìÄQÎ%1wœ*xY¥wyÐ:¦uO¦m3ǹ_Æç”XʺDˆ­®Á|½jð“K:F&ªwfóK²0ElàÎjŠ)–çü'?¥ë‡ùá'ÞŸAÕÏE øø÷ sÞ×ðÂäëQ·6rÒ?«òŒš´¡µŽÏšE&'§-oÑŽ %ívͽ߷M½^¡æ ;À´+PÆAÔ ¤n`–Í<¶\^öÈsVQYK$(·/ç€y8Ô_>{ý®|¡khø%*®Å†Ñ÷¦K:%9Bu„ Ý:ýqB ¾²uºD‚,¡X4àš¿kç[0[;†J!è…¢ÉG5ã‚iV¦îmïcÛ…RãCp£DuÉ~ ¬3m5ßï×Õ ÁÖôWðÐeº‰¤ª<æ]ÃëíãE®§µ®¬ÙeìW¥¦Î…F;o\5²‚«·^£Û±AíódïæYшEÆ¡ïtelVŸJv*3ܘü(9eÕgb?ÕMgÞ’Iðž‰ï»ŒSýÛ¬EWÖ†§Þ…ÌЊlΆ€ÐMkZÑ[ï†] Kç<Ê *öoy7uùmG‘i&ÌDv‡vÏ7kqÖ$rØ–1¹” Õ¸tªX3.E¾ÖdóCQg Ûz’í ì¥dwÄ+~EŽÍƒ±CBR×ZÐÔþQ§ÛªÞÏ›ÊÇæ'Òj†]©-œR$ŒnHÙö¨ÐÁ”åÄJ€/òî’»PɆ^ÐËS¦‘mËrqJ·f|—‚ºÑÓV*ï™ ÍaDŸÆô>ý(‹îzÜŽ+ªêñÉûû×O­Tw¬˜@ uödª§£ýygÂÿÈÏÛ¼3#â\ðm,ùfþ™v·_4-$Lí‰J#D‘ÅØ"ßów¿ß§æûLBþê=ÏõNßYwXžRxÝ«nUˆQ!z{‹á؉·QS( ‘ìVNÍbæÕ'H½Žî¨ uÕÿeMtw‡ãr9àVHä¬êcPEµƒR« Ÿ5O"͹£ùøçÓßy!×~ÛBá$uùAÐ ‘%}à–$Ê’!”æª'¨QêY8î-t*D3©lFhü.I2JîZÖƒQ©%ëšh",URüIlš³båœÇîyûðG¼ïâèl¨ŽptPEﮛΒA"?­½˜SböäyN—ƒŠÍóO55’øì³ƒÈ_Õð¶bO]¨îGH-}<ï%%Î0'Vlaw1£_%¢/ñ&µ×«µ2ž ûì_|’ÐîÎöa—­ô{ ÝsYx¢1C,ïÕ|÷ÖÛç 6:º“([{Q²tp.ŸM{ÝÜ­tGgZ€@fˆLuZïŸ"Lßïænw·fƒÍ^OBuf'm³Î̼m{ïÜs&NözгNzsv10æn#Ðúu^Ä:ñåâÃÏ/aå¹í{ >ì|dÁnÊ߄뼓÷py®ß;Q¬jó L^«¾å¬rG1ŸÃ=çOÍ™ž±ßšïe¸qÁ¯ŠÉèÜ„k°î϶Gc™Øqf)ÌõTå/~@ýø"î3 OбÅJ#ÇR`%fYÅ“#‡êR–^M´w9Þ\Íb”(|{ùÒû¡ÜžâÂèþ·Õ%®ÏF±U(‚O,pkÎ[]2‡‹áeˆw¸¯Ìx"N¼ã†G+c[TŽmlÍK¤30OÈÝ1ÊØ€÷‘z%Éd‹M-2>5Ø"¾¥™á>Gƒ¯ ;wƒÙÞ÷´åø?€­BÖºIè2°V3œ¸!Xæä$‡C! H*’ãåÝ"ïÅaUBŸ QDûÐpÖÂŒ/¶kI¬«àŽšr3y15RŽûËâSA³Ñ) \‘ˆßJ²à uÈdða)!-eÀqœPMÎ#Í—,ZŸ~ ß¾ñCLÁ€Qå¬ÈÿË4L £O¨£S12u¤ºƒaþ\–xm—ï§|–xûËÏbrO}»:•¼M‡Ó`Ñ踤ï½ù• NÄ—5ÖäìF6"Ðë­þþû_GwÉ!×V]×k˜¬÷ç0 4$5ßÍoˆVê…hüŒÛ?¶o&Þ§çR¹F‘<– ”>3}ȹà”'»MÒtúCap32b¶apNbm º€òíyÇ›üÎ1ÎÔÛÍûxæõ’½Âx„1»Še{âIë&HÙÏÔá`!«ü¾Ì™Š[Kµ¼–$)¶XéJ­¥<Øò¨S…Ì€Ïñ’) †ú?2; 2ˆ$":žUmN•¹0ES‰þÿ}:ë,V?Á­O‡¾Á§D·æþýÕ¡›ÆÛ‚ô€UÏ­¯†á GÑ„#꺠¢õao­¥|7q_Ô°<ä[Èâ¦Ú©*‹¹I:üÍnÄ•¯ên8ôŸ¦#ŠúäêQ[ù“ÊJ<‡¹Î ¸.Ûµz]tÄÕîBð ý@}½¸_Ü]uÑccIFv”à §Ô1Ò¶$‹½6ÀŸ W,„b}W4 !å”ã{eâŽx‡™¨³¯Ò–z3pÓPhX¢ëÿ9‡*ø~UUsôæáq̪ ü?4øk8“èùiÓ·)?K»mƒÆâÔ¶¥çÍ1xdš»î¯g5š”äH›ÈâHf¡æH±Åú®ø˜{¼òr,Mîng4ë{K‘‡ÈˆÖÐ0å—ª …<¾]j˵„8¬€§«Tº³¹‘z+h À,¶b®GæÖ¼Š¹õ-¨s™zù$èÈ£G#£E¨#úlÇgÌÌ_4W+.yÝ¿ ï«› ˜¤Ž %Å@wÂî…A±hI"I‘LÃc1Û¿( Á•¢w¹dYtR¾S\cVcÌàLã¯âÌaý^/íáwUà‰X Ù9ÕOD=üUp¥½ù£ÑážÄÝ,…´,ÉÖ½¨ Ž¿Žd<ÌãÓ0Fl.ÞÃË9N^Ï)†p÷z†oÅ&‡°Ìx­#d`:Šzö•v«_ÖÈ G ,:×°Þ_翯ë²7_Mß1n”m^Ø÷ga:„ôN–){PRvωllêïuÜõ˜û(-Ñ«Òó4?¿Æ}BçÍN-–sú%x¬°XŠÃÓ너[Jt³3•Ëòâ÷ðnt‡޼>öÊÑ“õ3(R̉ûœõØ?~|'»ÁWÌB£7›œØlëOüæ˜×0¬ñ+Ž1¢;KàÅBT ’E2·*c 6*9O ŸG/yÎ>äkZG×éLCÙÅå ¡ ˜Ze„)›ÕI»ç`ùtå&µÈbQø‹>¹|Ä…Î$(Z³zé2O+2bÌ ŽJ"S8SS¤“ a!%$„…2IZÉÀ5xÂaèP4G;ñgReÞlCŤ:eoq(6#ÛW']w6òH†“ ’º˜¢ ‹œÃ6õbs’íï¢q.(ÏµÏ²Šª§ž$Óc (+Õ§Íî§ã¨‰. ‹”%7=Æ£µ–Žá-á2üðš´<æYb6ÙÕ+CpÚˆÔJ¢åfêÈÌU7ß{Ç´»D]–«ÏªŸJ}«×f±OºÚ"©æ!y•:íE¬Ç49jVËŸ1Ök©oMÜQƒ$š(ˆ58Ó ÎYŽEÕ=PšÃQ`Ä8¶Ë 3aÚ«« É0Ã`)ƒ+lÞ³§g¨4¤R0„€oPHVN„J5DiýB§|Ç<;ßNƒ‹7+óÏ=÷U÷•ôªž²ºÅòP&¡ò8Óß½PŸ:ÅÔ})řѷ-ªÕdÀ”áÓÅjLœuäÏXù×8lÅ[oÄ5©v›˜£õÌãÎÉÁY¯Ù{ÃwDZêÙœóŽé÷Ȥ‘ór[ê‹_5Î\ìçRQbš‰ýëšæ`Ádz¨)˜Ûˆ§×Bf‚(… ;„yqæ´4Öµ­Qknañ¾ÝðÅ™96|Ü[uÏwÛðó|¯ <祀Š[™w0ÊD‰›ÔTqM;ß=œß—½¹( ¹Hñè! Üžj ª,–P¦bšÞY‡~¦_â„ñÛˆâîÜËpH˹ƈ»^>÷|èHLwÚlónrdÚv9v¥6¤«AJš¥:°DI%Ée:1N  Ð¹Ü\šŠJî–áé»Ê;ª2•ÞLˆwo¸âȲM®}UPPu­YÎó¸äÍ€„eXÕüZà©^u7³Òq¹HÇ‘ù¿Ì²:æÏ$ž»€b#y.`Ì€I)’Ò3»íïX¾>‘Ž×„¹W¦2xCÖò•~ëÅq¤Xæ[¡¡$¢‘˪Åîí¹Ç™LŠIÇäù[µ$Ž6%ÄÚiŠÜ‰²Ô´Æ˜ý‚‰áÄveaĤBNÜK7¤‹‰&ZjŸ³Üx*3XÒA$/¦¢ck[™°Ä]d§#–¬¬˜ðám]ß:e‹Ùx߃{±0nv7Ìï‹Å.üË&ç!îÍcØ™*‚ÔÊÆÅÊ@¨©˜Û#o/ê³RéØ¾Î »{ â=Ø×wž®È¬ÈààÍâJ‚¦Ç¾7" PãB¹5j1=ºxP˜¶ „FY¢H¡ÐWós¢Ô›¸‹Q5:S|#ÔøŒÎöªIÜb<‘K¶ è ÓÇXÌÜŸŠ‡¤î~Ëfô 볜ʽÂÊ…W2$)‰äz «£ó©èôqƒ3¥ÓØ*ÄôtMLJ¸’'Êô^s‡‘¦;ãÄËæd Àì¨t5é(­yBÑa…´•IÝýÔ“,"âá¶ÇYœëmmë¹jdá4€¢ªÄXíFË–ã*8Ù°÷=ï9¾Žæ2çTµ»«ÞGžßM=Ço¾ Ç5o%Û4ú,¦°Ôch÷lîÍÝÝŒï{øŸ«óÝDqËçyà&£WJLä‹"rî  t”Ð4æ´_+v(h9\$åU3Ílct.b„zçl¯RÆDÁx”¯Rw”’¤ú™k‚:íÂõ%D1<ñ{tõê÷y\í[ƒX;_´åÝ-‚ÂÙ"ÊBU~œ~}\½}oŸLq ½hxfN”“L ¥`(¡…°…ØÛQÆ®&´áʨõÅKlä’®]ð}9õg+6g6n÷’Èn)Œ{Tª¡µxÖõMÊC‹Üg¾ð‹¹y…ñêJ‡¼Â¤*·µ¸4ɤ³w3%"RP 3ûøýóZÐu­†àuäG Nk³GCÀKºW˜ü™À¶b¤ÁóïÝó;ß}…ߢú‡Þs€#W¨ˆ¤÷À Ý“fÔG¼Plfô‹~4(íA-óæòs·Y>#—qŸ6ÉÐW§sªq%»Âq5æ33ÎÙ›5ñ™Í‡‹ep0|u’[ÞÇ-j~yÓWÊ*ªª«@kXÛ)Bàm)ÓxÈPAí€ã}ð¸]¸!Ë0¿%'¿µÙÙ†z‚8ª­âš¼‡Pã¯[Î…àœKF7›J‰Pà /{t(ìîöÒ’· Uz+’6!Ö1Ý2²ÍY  ‘Á l ƒª×Š-”)w}Þ%ÄX#­îØ¡Q;Y¾5–´˜þ€ª¢"¼½áà ‘öN²„2KÌ£>qÝeœ1Ï[u³ô8üO&aöE|EŠ¢ôß8¯k9Ù̪®"Šóo ½íÎÓÛ¹ôÒ~V¢Š+{ïW=•Úà…–à¸kŠ•Í7:PP¯—2'ÉØ7­À¹mÍfª ã º(T¨³·¤*¢%Bu$oÖr37ºaÝXüDD""w¹éyÎB”‰©×8ýËÌ%A…G$ª&oütj©È„õ»úx·i Ëz,žngÎ6ùÉœ«?PW1˳%ÄnV\wfYi~åæ9·Qî™HÝ“Z3Ï7wÇN–v$yäÙ¤Zöu¡ÂöëÅÄ.sK°¿—h.º‚[$ŸcTÔ’kxéH¬ûæç* Ü5½Ã áf 5x†®æ,Ô¾©âP ìØÏ!‹0IìòùX³¬}½¤sHsÉ>áÔÍ ß2CvŒ=óÊÊ@ØÈq D1ª¹—×4ƒ­4G™Q×:ÙåŠNÞ11bÜ]…ŒÛºÐ«Cû(ÎeB06…BD‡„8½iä™Õ›&ÁàGŠâÝÄÝŠ©ˆùñÅbùÐN>Xçjk%‘ÿ1 Ë,‡­Â™Åµ³†eEhÜ&Te…&,&eD&Œ¨iNEBbî.'.bÁj|ºLd–JóÈBXN昄²GOÖ¥Ïa!ßñËth•FÛöujLûëåy*Ƨ†;ðÏC¨GÔ†¢B«”nfA2csqZ£Q¿—.vM±;ˆšãî9Z£ÓãÒøQØL„‹ÒS2XéÄ¡±ùRïQÅ´ÒPrc£e´»WÅ‹aXŽ!¬CWò4?¬/Mî¶rgò~®}òüæúAycŸ4ÌŠƒðZ¥óYäN5pÅÌj‡L‹›ûríç ©â›lÙÊ™§†ÜÅièÔ¹žŠ¦ ±JX&«%¬6Y$|•¡“ËcÙ) »#µ ’;<'çÍž:ˆª%Œµ[Ÿ'ßϯo¦rª y3Rr†xÏœO]èÄMØz®¤§F¼ç·~úîxâIÎÕ»å´àzä©l×ŠÑæ¦n›ƒ H ­!×®#©­ªBgåY8Ôº°ö íÍBa×峇ŒÖ¤>&M*§Ï¯eYíÇîÔY4:W3 X|£?·½WÛ×ÂÏjÀeµ#ÁùŽÏOOkÊO;{Á+ƒ¼8»Ê ˰ݻ6xšŽð‰“A`q§¼Ìç.¸.Us{°5æ˜;:šîÙé«Tª~k½¬‚º-4Vf×#C–âˆvÆHƾV³ íÜe=ðŒ¡³SŽäKZÕ€•$¾2w‚̽떳ðƒ=Îs³û7ˆÜgNÀ­Ð¦.ÒZA'h2·NM@š¨Þ8Þœqe—™jðåµ7‰í¨AK¯,Ü<Ã`üTX¶ÖAí™a»Ü@Õ˜š'ï~Â’Óü7Ä2KÊxcÙß× gþ7åÜÿxi’AºX°£'m·¼À6a›©Ú°§›3 L$$”„…fÚv£n/¹¡sªÆÄ… QŠm°÷»6Š(5–qÖ¬)*Õ¡¬§fiid©rÈS÷¹•¹°› Änñ’I2€;áqŠÚëcc¶$Ô! I¡Ë¹ÉÓÚ ‰=XtsŠ;c„8Ctì–†ã—Ã0‚¤Û²; M>Ø@2,ë[QÖç;èžÞ¸>;C^7^£Ï±ý¢·zOÈëoª¢­T]-(ë¯W¤XÅ©".£Þ 6%A Š#x@³€ˆ÷gRË"Hð=-N¶µ°zíI’>c…&î\ˆuG7ºxdÙ5æ¸×âÞÉ’ê!à 9fùïã}oÜÜ”ÉicïÍ÷q³ ;3aj2Í%³7vóµsۊ⻽ràé$°u \ë~TQÛáöFuæO<ƒ\ŽS"µ¯Q="ù=¾lõTîy^ߨÜ+‡"2NÌðuæÓ:ÍLÙÍázƒôŒŠˆ(èþÐ"¡ 73¾z—SvKÑPÖÅ e2Îõ«Çe×.9+ûžžY±Š)› ¯7e1ó¶œS¸ÍÝÄ<3I¶6³êë‹ÐÌ'—†!Óµì^¼âáºn3v&†ex£ˡߵüWBnÓ»'Ïßž¶ž;V†ÙÓ2šI‘»£Î+BvI—Ëi‘†S¡VV® $#XŽc£9çï;òüïEˆ8þ”29aS\ðšó5á9yNÉȇ^sgŠÂtáÓ4÷ÎÁòŸa AÙ’HÙÙÔƒ©+7ìnu`÷¾@²¸ìôF${Ú癡Zìö :’‡gO_7ô=y]ˆÔ I þqüÔsUf%žž;ËL|»œÏHòöT¡·#Ï'4(œqôO PA32š˜n-zѾ½±[ÛÂÄeGRvq:ó‰i³:zysÍ 7aµñ×9ìò|u¨âªê0Yƒ8¸Žc¬9úàƒbþÍüYÕ]­E~£é«}¹¸iã8t'd ¡—/:)ÉâÀïÚ¸f^ᛈðêœÞV‰z¥Ã®¢XAZÖN×xÔ{:ÈC ?±âè‹ðzÀ»˜î [—¤ßr yâ»mÚøC‡aܺ“tÊK]wÇsª8pœ'(sâ<0¨ž7ç;q~3±†çÅIÀîéšO ]õß¾yt‡(òîu]˜wNË3xêÌ›Un&Ö©i"šLÆ=¼â ¶é#ÃçKæ†õÑù\ R•n–ªSm÷žT<š-Ô6Gó°ë´]++ þÎGû÷¡äa:¹ß<÷ç~<ï:×›7xb£i¿U6E¡/ǦØ1jÔ©¬FüÂQ¼ïÍç³(ݾj—‘šbî˜ë»¾FvÍŽÈnëèáÕ™>'ï#åûï+‚ü Báds°¬ŽbÔ«#}!œZÙt0jOgWïÌ÷Ãînzæ—¿E‡<\<ñTÍØwz{"6î–“h@‚DñBîùì„FÈlŒ„wÚãÅSË9Û½ÅéG»»6Þ›O(n_5ç‘á<'(ZÍÑ;øîàÔé ç½ÃM©ä®S¤žsßY³!Ân–&ãžh!§\ø.ÏŒñz¨Ž¥ãÑŽ£Ï>aV‰oõXàD  ?¿rsTº‹›Ó%,D¸ÕT1‹á“ŠHá½öZY™;bœÝ•lñ¢­“Ìi,/u¾çxÌמ-sÕàévF›Z‚(³G¢…t0ðäÙÙÓ9ج¡WÛ‡tÏyCë¤5=.:øul<çYòðtY¢ˆà-!«¤ÈÀ@ò+mäíÁ¤ š::옼Ø\_.¶’å…êDÈïM‘»@Q~›Î2ü+žŠ2Îvð8åáゎ°–€À^)2>s©÷Ú×-j5Ž ;çQòŸ¯["_"Œƒ¡¨! ¿•מgƒª‚¨èÕa·=n³Êvãε•:wN™IÈš@ƒ¯H““óÜß– Ð#k~õ aÓ:ôŽ»äk`¯‘Œl’Î…9A >pvðë8‡…‘áèg‡”;sEíG.É®Þ0bìÃgfvïPA‰“O<`Aq ¾ŸaöB¯™çD¹Ôô†ƒ€}†Ü,J½tD•|€’”Î/K+ÒÐØÓD”Òʵgîæ@ƒÚA”_d 3‘«¬¡ì“¡ðŽ 7HiÏ=Ï\^¶F^Ž(†„uZ{猙ó£‡Ã0"‡„äMšø ‘DöüËäX‚(Š[wâyåLf·Öú«éQÅFhîÙ¨ˆû_UûŸr¼ªÏC,5ÍÞÛ]¯l1C†»VîÖâ‚ÈNû¡*÷›‚>ÕqÉò¬8~mhl7Éc‹^Ò#ß~+Œd¹×€†DSuÞ‰<¦Ûx¹–nïUºnžSB0™TC=û»êD ‚ggÞ!ááòk=¯}­vvwzf_ ¤FÑØ®î7rÃIªÉôÕ-Aù¿Ž´ƒ@ñ ÚáÕ^µ`hkAÏ¢%¢³f¨u6ÎÍî÷q ªqÃZu€,küw1!qù-ãX=—)¶·u3|Aתí«<4Êï,ƒ‹õ<ÀyŒãæŽzx¥¾Xl:ΫqlÐõ^•qƵ Ñ> ±9<Íï%’¶î±:öJöÕ‹Ec«¾Ü~~DçsÛâÀ¥ñÕÊSóßw²Œƒ{ÎiÑee2²çÄé‡9Õ““ž×ÄH…$6Idlð=)°ïU9 θ—Yð¾¸ûs¥R¾­ËŸ·8î:ãô»YbNýÝn¶€‘¶¥+Áæ';s̵Zd °JnÉ%êßvCçyîß4ÉÆ¯bæÑó9LÎw˜öΓ–‡p«¸Î)Ï_sÜGÓ²8y5™åww·V]»Ôîîoj˜Á×¢½üühË©ÏÚ˜Ûƒ®D»Ým§²Ï |F=æ³+§³:&Ï€ÖžÖQM®]¹›’2 Ó¨€—ÄJ(í¡ ˆ;ݯÐÝÁ´{ƒºÚ—í²&ûy—‘ rÎÕÍ,@§²Åª67Ç^E=ÙåÂ{«ízyt]}ªõ+ä¢bÏNÞšüºúj¸y®÷Oq˜%˵·%á¢o1œÕ}å­÷?C˜V(^àô÷§³Y×»œ3:úQÎ}Äà= }“FÒö}yƒV¯j6m¡K.µèÄî |ræ°ðä´Ï:¹)åÈÇLv\ÊÉíß# ÛèKY“t?;å=Vò8IÞ®iÙJÝæ5-ì0;ÈP)Ö…ÌfìᯕÝv{ˆ4’b¹e¦z[î§O´¿&[wY#¸÷6?QÖöq®ôÌê}ˆßt².Ú½x€éÚü®Ð“ÖŽSm§;Ý8r»‘èb¾u³³=£YªŠ•·qj‘ÝW¥ß*}NKæ‹mÐW3Ýìd]Íé×»ŽóœÆo]£Z•¬ãìÛvÍ:7}ÎMá#eõ~;4š¹_s}Äaž9Ù#mwÜ|‹+ÎÝ^•Ý;šßÛÊ<¼7­•¢Ñ½‹X›ÇÇÐLÉ.{Ey›æx¸5× V˜Ù²säåÅÄÓl~Åq:mêã,ÐÄ9Àt^,—¸“m*’Ow3^÷[1W[)7éZoѷ˶s‡³’ççÙ‡¹ùè7ŒÞC3@€¥íï '/ÙàÏ{k±¾ëq¢!5Ýö›™Ý‰´¤“ð^xÏ\4%Ùk2]mŠðfÌ‘Jc{íOÑô±À¿%µäâ;Ü[ö›nm»ØzwºªýÜ0ÒV€4=Þ¹bžÇÍÞIàTªy$ÐçÁ{ƒyÅg…°%êË2hîå1„yŒQÚT@àÔ¡‘Á” ¿Ð l´oKësý°T€?$Ußõ-Nû·¼Þf¡¼WÕÄÌ\š¢Û©Å µvÎ>Û®,±Ä½ÊBÀ7ˆ{½=18¨×á¢ßÞqÝ„j&)ÊD«oP·±ü[I|úk°CŠ Â4Œà‚cçÓÌÓc 4­-`¬POÍÍHõ×ìE7¨o5$çËËGx9gÊCLažBá@©¶|/jH&u< Ž¥ø“'¹@ï3ƒ¢¦±´î.Ò¼vÅã±t^kÇaJ54Ê;¥ô#$G¨¼UAA>9µÔs|¹©=J²Â·ãàûlgÒ.}ŒþÀîl+`/:weœœ­2ä+¹l·*ù À‰ëe½®1¬U¢“å6qÙçðÍa @·B³v˜öû) Únæ¹E ,ÚR)Íì.;¡£ªP C“¹òÚ»R Ú¤¬‰Šaý „ß¹Y;ˆulÅ󳄿n–¶Ð!1‹e9<7¸z&{¹­wšRM¶©e7™8Š;ÐSìÔ—vÀ|ÈÌyôèÒ’°6ùi*‘Æ3 ÈbÏ¥J(*ùU#åDÞèEk°!¢rBBFÉRÂÃncÐòtàÚ»w­ÆC¡(~èoÙ†;Ýã#|À8§GÏ ¢ä¾Ï Ñ4” ÎùGÊ>ÈäbQòÑS¬ïz©Œü«âKBù¶“ž0bHßÎ;“Kä‰ÜMרÄU+sñIX1{WqE ¦›Ú‡®Ÿ$–ê›4ÆÄ;òµÉj&8Øg£´Ø}“Ï X8{2°8HM¯#’/Æý=qèvÇörÓ…bd:ˆ.»‰»:¯²ŸÅp㙆’QÈ^ñ º'“ÛÇêdO0rxüþr¶H7\°-B–KàÛ2„!ùY|¤$t#cAn¾Ò"@ÅáGªcô³,žÓñ.Ö«@Åwr3¶%G;B rx¥•ðAî4I¿o+ 4øÈ›B—2!*ñ»O¨T‚wùKï)Î Oãöù4ª!êεh’Ìihú¡Ö”_‡{‘­ @}å-'t fÙ16Ö9ÞsN+c­QO`òꟋø³¸”7Ëgqûo[N]ì4ÞÔó4çUzƒ åÓ@"Þì‰, ˆ´q3ÝÙã·Ï¾Y¸ÝÓ±æyö‚¬ŒGh<7Žöóó«ÝÝA[ż¤rnˆGQ–‰YJšˆ½Z0F+àFUÀ©hˆy5xgccy[´Ò@—.&ìVðÆPãH™»PÌ‡Ž Ë6l¹‘tTÊB$d#r `’rD{´‘Ä•¼/$Hþ®xùö¡’èkËú£µ¬©ÜL‹]Y %X™äà¢ÿåëÒržèU·QÇ@­´Uxí6çK+lïyôã¸tÀÈņíßYݳ»’ë%w#°Ç1“ lh?'A‘Ñ«}l.¨!˜>{!8e{›eõœÜç˜]ËÀwÍÉ^—YÍ÷‡™ë¾¿a½°óÙž®=&2*Û¬*DŒ`1#*ŠÃÇz‰âa ÊWÍ…”8õMm…Ƹ3ÜybgLv,Ç[¤r֤ݜ$ÑÓ83E wåK4ÓØw:–ø—»M ìHÇÒð„¼yU—lh´`ùç9•¤“,æÂÖ ]Ùu¼ÚÒò–ñ±@ãL^1 á¸pó¦ž8`'bì8œÔ‡lòÞzëÖPŒ»,²[¤½÷•ÕÍóló|¸Yž4¨â§JŒÕ¥¹D9+ \i­LÆ wË#w¤¶$MÛŠ¸ÌºnÁ†b 2Iš7 °n6rZ:ƬÈ^2pÅ™™×±le˜Ž Nq¤ßi0I.õÚ´ód"õµƒ¥|©a¥!$ˆH„$Ž6ÐÉ Xu@ö*÷µ¨–â©;lù¹a~d%‰Ø4eÛèÒJ YLl ”¼®Æ¶÷åö;¦;‘Ôx|?ì4NPÚ€¦)³L–ŒEI‡vƒ/žæNDt†u¶CHñ†øÆd’L$Ù XÉ@¤€ÝHKd »F²EzƒËÙJщ' ®«W6‡9„3ª’DL‰Lj£šÄ¤³}–ƒ áhynbíÊï'5#xÇF,˜"#ŽDl¤,®<Áãäe—!Ï©–µm¤ÁÝ¡w&Tme¬–Ås^æ#uŽ WNÂ=g--æMwm%‰â^Ýêv,HP‘7'3ý÷Íï&ºàÛH.y›¹¥Þä1屉ߞ7/e/R[2—›ÞÛà‘hÁ<‘ɳW5ê±AZÔbµw MQ‚hÚ·vò™&² Rž[†d5ÛBâ¥B_(£H1CX¨«U$º±2gYlÎ)×ÐâëÍ݉¤4jR TUŠÜðù9{̘™ùù?‡öãæ´s}u©L9æ´ì{BI6;%Ê\Áñ_[KE‡ŒF>~þáµ@Ç@qEAÌÇ‹ †„ÈÉ;QeX¡ý·€4`µ¯WÂjwZ-_Y2JÏŸ7< Š©¢©w¹ô»Ú@ÇLb5).ík̼e­£|á+Ãß8,IœDµÕQbÆÔÎB®îUõ•zö™ͳ˜ Mœ¤Ú¥——2/5ÎóŠv¿ÌÏÓ­ÔâC±¹•’_E8Î!io…âŠñ¬%.G§ ‘'3šGZÚÉ”¬ðÀaK@d«KÁòB%'.˜ZJ“OâiTËhâîLC"2n¸'½´š9ÉLSÔ=ó-¥Bÿ^êñUÓž(”[“˜vݽÃòïŒòks1¹´„¬™XBg ½5#0æpžHs3vÒ Úf6}˜Ï…Nåé<;Ò×áÔhD_ ­}ì߸Š[ØN¿xúœôÌöcæ²Ë&_L½ê07BÏV1 [ñó4bŽd¦/xÑx¹‚Lhh,¯»€¥vS›¾ŸS‡©GKÕ+b„,.n!P›ÊÄ{€¼D}kZ$gÞ«i cño¨Þ¿™^ìóËtvy=VÇ~¿(1 R·&Jh¥è¼'Kt³>B÷ÎõOdX{,|ç1ÕÔmüû=Ÿ¾/<ï¯áBôd'ÍÖ®‚AŬC@Ò-’ˆ$*¾]–SX˜APŠ Dˆ(ˆÁ.€rn`£)› žÙrvÜäBÝ fÊ—Zõ-®=;Ø1æQb´141±¡(!ÁÁjÌŒVE v7)¶yÛJ õÂrÜ$ ,BÔ“µ¥ÂèJÞ‘ Z¼æ—´„q4µÓ¶È4.I)6ÐÛ¤ÌE«Vˆ¸¦²pê6ÍÚu«àÇKµROèí^ ¢H( ¨J³.vÝb-¤–·{ ‚HCÚ.§‚**yµ¨ÎA$ÜH(#Š˜‹³[I"rFÚHíâíË)¨²»j‹jnèBÔ;xXíŸîCEŒ­P‘Ú±[b*Ê–[* Û7e’¢ÄCÔ·® 5-KeÔÛeÂT¨NZÏ}쩈Ä^åÙˆ-±¬R6$$D¼²+tžÌv]â1³üd!j{o™-á]’²ÙºÆ­{¶j¸™Šc ïŠ]@îëœè±[JH«iÁ–Ý\eËm^c”Z¶¸àµ¼äwÅ•%ª¨¾w¬à‹)2Q°ËAT—Nלn1¤Úc22W&’$x’¼¿>»|§ÙLùѦç…ãÛÂÝÐ¥zõMÈ“‰'ÈHØ©`Ê"ÕjÓ]U…D¼êÎŽðíPï“w3èÖ¡ÝmmÆkwbãú—ù¦†"eO‰¬fye¿{6:¨Œ«*ÄIžK…±„DL0ÉÕ½få%@ZjÊm^“´x2âsÙz_(fŸHúÏ šT@8¨/e($$ØÒ탱“„vy‚ÚsÍ!çªÌ-4élq$âˆJH¶C]MÉCyUh$´ &FL a’Ä”ËaL"ˉ$²ñQ­œ©ÅуÚÞêJ¶7ÞXíØ´’A4!P RUI±š|¼Lzq9«5 Ìy<—€IéSmìÍadŠ¢ÀÅP¡ÂHTÍ a’\†ÈÈ¡ ÃçÎ\îÒmE6ØÚ¦s· JdaE’Hš¶@´RÙ ]'or‰j›j‚Ù„¦’QЈ.u©!¸úuÂñÛ¬6êø+3Ÿ—¼÷[mëÞ»÷R4’ˆH!åê8ÌAMDC.|e¤Xª‚0ŒÊ-´Ó)0·¦LæŒ"¬5{bÎ5yB’œ5u´ŠSHí½Ì“E{_' Ù'YñFg»±ÆV©·?¸íðßÖ—DI4Ö¦ª…)`íÒÕØ ]žºŸ1Ìuí)I(­ 4˜ÞEË7Rõ‚˜hKZ­81bm“,ìÈi±ÓêŠÐÛ-ß~dY("’*“÷$XL’$#,() -S7Ÿy»ÄÒ%.`„•©ëáô²Å!@ôÓ}Iޤn!sŸs<§§oHO '# $‘EP†ªŠš"¨*FÄ8Ú!Kƒ"RÀb¢!ƒØÁ±€ NήPa() DA#T5BŒF"Q’RC2f¯ùs)@Y ",%2L¤P-d D‹Y!I(P¤ˆ†ÉH¡²-ØÂkÅ^(lɤ–©CZ!)i†aü¿Þ¯*ÄA " ëdìMí%5V&ò}Uo8^CFZ³7M¾Þ›¼,º¬ž0BM!0ÒI $…²×Ka2‘ÍÅ0Ä”˜HUÑ+*¥Í»32´Hi…ˆ*È(¢ ZILà -!lŠˆ¨ÅÒ’1ˆª-°nïT«tnž55™dª)x£A V¿ÄmùåôNj ?˜â»Ÿ_'mñÉâö,Nzõ;âŠÚ‚ˆŠ ‚0F @—ª˜¾×0ùªÐcAßÃþ4ó­N±%DñÄ%UÒ×inÆÊÖ®LÑX²­‚Û–Z¦$ä£,ø–[WQPÓX çés%Cš;÷“RѺ¢³wh²Œgß•ThêöÝË-™—J ‡z“µ|$#ÖÄ%TÕ5D9õTQ–@†Y aLe’ËXÊ$3,Ê÷ç!ƒÄ gwƒ™vâјÿ*ÿOÑv‚î/â±¢* H^·­°Ãwun±«Ó¾ît%/öĉ°u.®EbÚBˆÀ21­|‰ÃfË îE*ã²ÐS\nÒvnÕæòóF3(ïiÑE–ÕjI‹§?’³ÇÄW«.*"fI¦%î{¨f¦å7ëë©ý?›à¿{®×ô kC†¾JY¡3ZlÔ(Ôâý {ª ¸~»ó>GóȦF+‘7ˆÄè»L¹k"&—p_Þg ê*(¢ÿU? žF#Äq>•-æëÞ=»° @¡-Z¡KJEå J»Ã H] ææ*vÐ’hö[½™…‚VÕ0hädYRqÖ¸ËV–úóšå…•,¶ºJZÉDô²vÑÎß[ÎòTÍC±d¤ÔJS׊V$Æ…$Ü‘·l””m¦ YT>]ÁSISf£UJºnØÕZ-°u)º†  ÜI–dž!•7ÅQ!ë„’»m ”aÛ¸¶ƒÕÄbH¥—,>Ya,’•$„œV{æê! ê{͵~&Oãw;D„_°.&•¶Ó˜ŸcµmäCb„ Ý;ç·Õº’)°iªhKShnjµjYRÕªbÅ,òîØˆ…JËVÚJ…«Ûm¸^,›!¾Ð«ÃT¦ùØÞbb¨#5@o§¶è- ñê᫟¢3Þž>›Ò÷EÚċ-ÓnÌ2Òá´ÇÂÎrÝ’yœ¾“iáy³ä¿ GW´ãX[µ#¯ƒD/˜YˆãW±­l~ft½‹ üZ+Ä™§ƒg&Ù¶r3–lã|*@Â10a\I½ª2ð1‚1ˆ >Ž Á–‚ ÃË-õq8nD÷‡80,ÛË'Ë„ÉÑ>ó,W„—¦»»õþË,ãöÔ,M˜ ˆúF ˆXŒ!# Û@¸hØ#ˆ¥¬ ¶"‹Ød) rš(Ô]5Ôôä;Ç]‹¢2YÔlvr VÆØåû2ðŒsÂUu`µ“jP›„ïaC ß[´¥pèåÝyï_çA„M„6MÒËîє₄ˆÚ“X"ùcÜÃçÝϾ§P¤‹ßkï×¼^”Dª3‘¦±ntQ2mÕÒBÇ@ÐQ‚@DSHºL»9w¬^ :·}¹Ó/œ5ªd3oZuzZÑn=Áí²þ<ô»^`G0(z:‚>c˜æTc˜.wf£*]Ç_¶+¾žû„xײ¦ Ÿ!û4Ø3ƒvTVõ%åß éËG9dê.=fŒ—¿Fèbçe%Ô1 ¸9‰¤ZWþBc¯»añ ›=òÞí9Ýwß¶wG~oÞñÑÙâi(" *ã!„“íFC ˆV[sg>ntêÂÜ–$!$a-ñ²ÓêÛ»²¨±¶ËTã*Ny›ã9ÖÄô• é”#Ó/›fÄÀ•äMìµ:©j(µÕ:Zo3¹U»œjõÖ]vÕ—‚¸H6“hHuÈ:ÄěҚ¼˜‡]U1 8aihÊßÔ$<È^Mm@[Æo€ä÷„š™ˆ‡Õñ4`‡Õ–ûŸwœVaÕfÕ•€G»AˆÁ€&r%dFdŽS&¦1ÁèÛo'4N0g9ÛÎÛ^o¥"0ᨭÁú?<¾ë7 /³Èì‚BH«Jµ`K)rÚ Û»dbUX»rÙ­ÝMVÕ–"RË`÷™.Wêîß6êT TJËe·ÑòùÞém%–ÊKVÊH†…Fª® jqÅw%SB>ÐçAŒ—Ë|ËÀK"ƒ ™&Më‹ÞêÊVVXcRõr€Éé’Œí®Û ËDäQÃb$ˆ&1ÁÆ(¼1"ÄUÜBT ÂK˜Å‰Ûa6÷êÈ9lŽzãˆÂqqâ\ãZðîótàº&WdANïòǯ˜MòÛPQ–I¸¸ §Tÿ'ɯ“X$~fb-ÛÝUi­q#'T@&»vt"¼í‰&IÝ)†3Û"HjÔVø¥¹nú¢/;û˜ðPV*4>ÃLËèÏO;Üw*3g»Ãu]6Ëf¢z3m[ƺ4›¤w*¡nïŠó¾z¦ÍCq) Ù¤œxk–m-k¿UËÆÕLóÄ5„k`ïk¬BÈÍÉ0<õzuÙúF ø>.ý^ÑÐÙþ”,éq¨Ø^‘­=:m1;—ü˜Á#ûÓü ™x³×Ú£±eöìÀ6&@ç)}„1³¯gnÞÚÝ[ì¼MsØö(Ýч…>-‰uYœUboš‚NV)Dd‹Ü»†Wy§›¿¸Ü\1JΪÖÌVPÑY‘ ÑEG~ mÌÎŒñÞY¥ï [­SŸÊö‰ž—ŸO­ŒqÚ9Ø0¥\BOÇz}艛<[RÖ•"R[ä’Jˆ™êŸÏãòùÅïqúÇÛ¹¦XøW탷PÌ£¦ŠR¡u5L`Õ4Õ>kSÖyãï“/¯`þBÏÝñsŸ³X¯H ùý^÷ÐRèˆk¸\«Dt“õ¸Ú¦ÐéšJcU¶(ÁÂTµ~æØdÞ%„ï%/ˆø!’ÌCišè”’ ²F©¤¡$M؈$’ 7Þ“™õ $ÐZ”’"¬EK¹oz1¥ lafªYu*Õñš¨îð•ÎH„—4Æ*¦˜ƒˆ‘šrÂqVuœEñˆð’;S{McŒ›ÝI‡q°ãk L 3."DaBÌö©2¥IlKg:¼;-ÉÙl›Õ(ÆÛÎA¢:] !DT4(@š$o ÞᙓÈGon[lDŠÒ¾Å£)4¨»r‹~O]¼.1üÉtE˜Z,»„½`wÕËmæ‰ÝÖÇÉ‘™•s«®bsˆzžŒYíVf1j€‡Cø!âòɘí9ê&i9îK̼¯¸j~WcÕêµ{?Jmº¬–ù6HñÞÝ!R’´QAr3m=*ÚB㦭µ¢Ø5|–„­¶’V>ó À’šd#TªÑ„)ÃÑ+_)YP‡ÍƒÚu:* ¯K{„kuà„µžIœ¹ÄÕq Æ§eNäPÏÏöìÊJyZÏÚ¶¾#Èуò=pP‚#À€6ä?Žâë }ϦGÛÀsc@0úš1Á Y?=±vM“@ q‰ûM³RMÃë?fï_rZ-/´Lx¸æéƒ=Ü ý˜=Vд HèÂ;:3>:â5mãsƒßÏç¡æÆçƒ„¤\/ *PC¢èÏ|ÎÙb™wk dÅ“ý;È'£DP=ׇHÙôÇa[=iNý9Ž®VØëæöNÈZàÜEïÑ¡IË„ ®‹¾¢Y°ÈHÒN%¾2N†ºŽN±dL +ÏéÒ#‡#Ãd]D,¼¥ß]¿¥ýóæ7Tié~…¤(Æî"O³=«E Àn…+ÂÂèdá±îΫ—Æ_–²¼ñíyNl©+}ñ]Û:*j)*oIªÞÇ|aݘϥãr ¤ 0j¡Ò³p†bó¢”pó¬wç~}o;tÀ51¹0³ºC– fg}ìa†¥[©)¾ìîã$}S™@<å”b éËK ‡xqx×3™áÛîì𮪶-äÕ‰˜¢ç¬3Æè¡PÐÑêJýÇâ–ófXæw“/)îzb»ç¯L½«ŽÕã8Ìšd„È€–øK 'vIá€\Ía FgWáʹ=l³tïžK%zøíƒdÞê¼u C [;÷*Å (JÖjñe»Ít$öOãßÑ÷xößÐ÷»>>7¸ysÅ|•IðìÏf{9Çš:~3­VÙ]N†ì¤ÃõçÓœî3|QBuAo,ì͆;øñ±žÝ3 ßUÐÍ3ÇËŒâ²ä 0…êF¼3ÀP»2®Ð×ÈZGÀ Eƒì»ä}ê»0¶feÌ'R·ï“à:á®JcÍÄ» Éì›Ýkõò™íÏ4,C(÷µ)‰¶¼6ÀÊÓ­®Eêøé;w½Píó V±Ýæ¼2[o§¹ù`Y5LÛ³^\÷l{3sŸ¼V-—@ˆ‚'@2"p›ª'Ž›˜I±~ÅÍÆ¤±1z@Rë6«3–ƒµL-D#ùëÜ6áq«ß¨Ü¡‰WÇþÅüþþ¿Þ­ý$Qùó©•PÌGìv¿Iâ‚BJ—ÊXé·*þù&<uÕÙ‘:kã«îGnÕµÄC’UmÎ/Ó%,€”ŽwÁ3œ»°èK<‰.8åÄwv#7ø7¥ÕÝ>É Ä$C¯Œcë<\ç%L+qÛ,¾jlHÐê¬eÈä6™ú ßA ,èl¥¤Õ‡-)#ÓÉ;®X÷¯œü\K{da癩uëxa s¼™ á›(û»Ë7ÞÂ!ªhÓœÆgšR dYÖÁÖ™7Ö±_©ÍÁH÷±¼/±ü4/ôo§$w5"|R´(B’’ÈQ– Ö®e¢^¯§=;¢QOlN°°DWJ!qdb³D9?Ÿ«}…Y®žŸjºS¤ÆÓ:üêê‰F¿Î¾1$Úµ¾y$”~ýôöè]!ÃÌ'ÒùÌ‚Á‡$"E£†×¢Âü„úQ¿6ûœžEW%WW*·{Ã_¼Ýk_¿Þ}¡9¿›Ó›ž¡È:ŒP zP= ɵ,YŽsKºšô¼…­ª´x‚.¯½;÷2毠ÀýÓ]õ 6»7®H ( èň)´³¼¬p‹BÓ*`xºµkÅ]ÔtŽ6¸_žei½U¶d—$_l´aîÓ,®k¨¨ÔqU;ã)uq&uWzì[İ맷Ùz;çÞs«ßP»C¥A„D`UÛYÛ(¦Š+Qc»vUR@M"‘DE7M!0†ÖurS2(©UFŸ_E¼dÜd!ôäôl¿ç×—æ¦î*WUaÒeüvÎo»œÉ“»‘w}ã<û÷Ñ¿ ë}NφÈZ‹—½•/cW—>‚¾¤™m–º*;[‘¤ŸdQ×ê3ŸpÄ_ZÙ L§;sÞñ¯>6'”8CÝÙ7:IuOL€þÌ "~žŽÏGœ÷lïìj]®d@á0™SÅö«ôÝܲ¦éìqPÈ™Cgw³žSp$0á0ìõÏ?ùwÐø…Aв:=ö€{žErÅÅ?œíâ,xŽÿpŸ/N¹wßΟ$ôeˆÂ½Ä'é£ç£Ô½/·Q^í‹fùŽ_9D|>åwoŸi h=Gç¾ì‘*(30Í««HÌ{ÛÜ£f“Äû6GG`W7 æ4vj¥lÖæn·-^(S‰ ¨†`˜9U}«ŠŸœ9–ÆÖy¾E´·VŽ>£ñ¹ðoŒ…‘EF7c)²@ºux=â ƒ0þAœA¿¤ûý?>³‰ÇüçlCʨ»ëSƒ¦!§BADƒæMÕ›¬yŽ"¿ø¿=ØðQÎün ü?“ïíùÓ?(õj @0Š@h+]DMD‘«Ñ欜\[Ál¶Í´¤R3µVú5ŽÅ>kkVyp›vNÞÁ€ /A*.ÄI›|®°wó}t ±Ñ‡~Æ¿˜üº· ÌA‰5ÀŽ€ &Ân3“²•Ƶs?٠¨^ÅÆ†ÈŒA=¿JªÅÃ!-ȳôßaÃRLç»ïèª:Á¹÷%4NÆKG;ÂÄþÖª…÷…‘,àˆð) ˆÖ‹‰†2ëÕ ¢äwó÷ËÕóènA£Ï"V˜ˆÈ³˜jÍûU?v­ã§ !Øs}îù¨zC±˜„u& t†÷œ…¶f ÓÅò®=8ç?'ª}_¿«íK˜S•Õs!œþ£/ˆMÌSú·]urݦ$F+8à}$«úªæå“Ç0éãÔ|¹ØŸ·{ôÕðƒ•¸t žŒ‘$šbâ¹ó—‹M¸©nÔ-–Ùâìxc¨Õ‚$èY0l8±*y/{3“¹Xî”VQßÐnžkáñp~õ{«-ÀG[‚¤RJ!"ì)ñ 0W‹PrÀ˜Ã¯È]dt~ÄÍSóÍÓÕ³öÿ„µ¼oÔ/eÀE—DX:<Ã? 4G?n»¤jÖœé1b­D.ï.ÈøQÐÃ@Ž–m¸˜òÍ“&Y%šåªOõCEÖ}è£ú÷ŠÃâŒN*é±\¯G_° ëgsÔn¤̨áÐáÓ±¸>BÎI΄‡¸Ö´"¦)¢M R?–ñEý=ºgWxS¦¯üÉ(ø!Òç"£œ:ìêHÙà}ƒ ÂU¼ÅÑÓ=n³â·wC²dõ©Ê;¾+ž:Ö“—Ñ’`Š#£Ð aÆ/ÉB»ùÔu\Þ2ר6žReÊRšÜ¿n¶óÆç#NìÓ63Í™Å6fÝ^±ºŒß½N÷ÞúMÙßš†y+Â<hGF» „Q× ¤4"ùŠ¡M¼ú¦d¾´…J§ùûXúçnûìÈ#Ä Å?·í¤v&Ÿ»Ž‰7‡ty|ûŸ‘R}NŽÖ7Ìœ“Üeé=¡úk*J´~Àìï"³o½R¹ƒÚÊ>v%Ú(òr¦“áÚ`K Ãæ„éÇPŠ}ƒ`(·xÑðß»F–ÛîR,Ó 7UñLÞZ’/8ˆŸ¼ )X£ZG››\ßÎÍ[ç;™æ3pŽªB[;Ng…! ¨˜L X‚0ª±ãb­æDK33¼ˆY»¾ç:Ìè‰× ¡Ô1b!c<Ž' ‰3*š2%®š¤¨±SU”@ÔDÆÒ.'X†Æ<Ývˆr‘1ûMµ)A »p „QÑ”|òÅHƄߊlíÌ®uíç1÷- ¢pnëO=7RãË~G€õæ¼lÁvb”űÁxÔšwÂÝ»m$“hþ¢ã4F/_æ²ásFr¹»ÃmÎÖùSžÁï¡ßóê  t€êŽåÚmµ^„é›§Ä@(¤È‚H€˜Hª· ”I’"æ\¢ Åm\™#¹MTâ71.®¥Y¼wuÔMm®Ã„ˆ É‚úpèÇ C¼hµù/¬BÕsÎùô1îBÛðCËNdH¿­ófj"«”#·‚»‹ÌVsÁ=âG8ŸPñ‰¬·&Û8š@s·ß,'Ååε—‚tKÄŸîä1‚ÓTЕbrEÂD…3%ñ6¤¹ºhõI·ªeb«‹€G:À¤Z·lÒ6]l~@àh0âdÈ¢êH±³³în45îÚã꘻VfÍ—!ï—všXéÇ^&ã‹é»t±ÏÄÍË=ñ^b§Œ5°ˆê«BÅpmÄEõ´tï4ß7¹¥ðp²äYq w·™jú!QЫ1Bi¨<­Ê2°ÍÄŸµÏ'~ÁvøhÇñ?Q‹œúÛ*5 D1%CEZ‚ÑbÎS­¹f¤¹Q`„“×)&Ø%N73qâ¾­¸©Hê×Öeéwn’³— ™ÅF+¥þJÜgjê1:;ÈÑÈÌÝϵh®õ×:FGZ¯TаƒS!ݰ•÷ùì:Pòœuèï° ¬ïÙvžÉœA¶’Ž›Ô[·Ø¿®í‰XÈÅê.þc‰ÅV­tWw©¨%,[v%äq¥œTÑk¨Å#_;MsôxFr‹ƒÈ–åL²DŽÁžwµ'Úp!%ˆ4È«SRT`† iî¶àÈg;ÁÝêóÁã X‹ åÞ=l‘ AŽ–¨Ì—~TËR»g݃«CM6Á7M)ŠiïÚóškÖ1-D¶“‹:Í{§C ¶ï-Š;½©Žör{=bè' 4,¾-j$‰Ž0i:hߟ¿WÍ]ìDõ˜${ï«sqêãŠLy$OY_ì™B«ßqÞ  ‡ ºôñˆ±|Z­%0Ì»Ë{»Ë™q‰ *Ñ2ÚT›m„œÓfH’Gª¯nE½@ºGp!I Ò’L@¼Ëra77 °DIJñ¶ÕNH‰K˻Ȉ’""˜ù)Ÿ8!‘Ü£;S1›âžê6*–Îñbn„|îf¿;iCï}éó±!ê@_¤J¸®%µê%æ2Ñå‘ågžÌ5®$6P73“uP¥î‹fPò*È2‰.ýî…‘ÕàØ@àPÊèðèAúu³ ¦+Y-Dxj¹j3.n<Ý í?½2×Ò€è¯ÑGn6.:æäáÍ\D±»×SW"‰1a£7un²$õµ$çÏtâÞ8¢I¡S•~søUk™õÈnåˆdK09 "Š/Z0¨žj™²G½y»Ãw;ûÒÏ?-^8ïCv‡*íÓ†"„ŒÝÑEe„6¼2þ¾YƈAgÔÙNyçsÛߥ³Ìó»:P{K”?¡ÏP.ïòhUqiz‚éiƒ&#+œ¯ÚT•`ß*_÷bødž>ªv¹Z˜8ª÷ö¨’ÒÃf×:ý‰h"á÷!DhCÇrÛ©–J-ƒ,žaºÊAÁÑü¶òºjƇØý¯™mæ\ŽÏúѸP" L3Û;Ÿ„øo¸{‚^(q)+JïŸXbPÖB³Û%¢›µlá®D¢GvRR3£²g†p(™£¥¡0}L~šÕö~{àªÄ:¿ÕŠHI [Kn“ÀÉ™ºmnÂ:”3Rð1P2íoš 6PC€£¦V™¨@ŽŒ~®ášܪôÅ*‘ÜÉéŽìÁ+h>ÖöÁ[¢s'E\F:vqÐ]{ý—ôÚÝb‹Å~\[°éÌày¼åi†GˆÉ$ZÎ:¸Ž÷»Î mÑM[§ ã±0t,l‹½Äîö…êæ;?OßU~ ן¹g`JBËzl;0á(o)ÀfÃË4».¢›œl#vqÚ2`¨Aå([»Ø áÕE3‡¬¼úzx?»é™j/¼öV#‰ÙÛ@""¨&€@dg˜^]ôq]ºdŒ–7QÎÈÒW<…·têˆÔE¸«1Tª7œ‰&ˆ!_¾±3–ךžS®sDÅ{>κ½N3@eÙÈ–®oÍ7^”X쇪f<¡³=!§a7yÕWv¡ºx¡ñYL¼ï\Œ¾(óƒ±9}ÙºhMšf„]=»Q¦W:³wq;]L½< À´úß]($ïâè|!yÐí'‡VyÞûŸõü㹟7‡’òªr_Õ¢a¿Ùúù[8>}(â³DøLû0§N÷ÍC ÷?rgá„®ªÎJÖLÛ ããy›Þ>.có2Âßo5P¨¶bK=}P Ü£†°)ØáÏ.Ò"‰0 l¢/ÌNVÑò¹r‘²´IÊ>Ô‡H†«#_”«Ù×Ä´mç\T“óÒùqÎHÞ³Óa®xÃ@\\…üŸè@÷ö·ð0¥?Fçó}u]éYéžyý~vW¨7ëÒƒj6æíêÎ6×9Á¯ln[ªýs´œkGt»½™®Hüòs/{žzËOÖ[iòñ:Vn“Ô¦! ØËJ1–GBRǜϨaÂÆ>%Ìfý>QSB‘÷§¼cKß‹À±ž–€F1@ïäuSQÞ:•³òâJÁЋS¬—dÔW7%D?yk™$FEçÕÉ~k»à£?½}yòvó²«XÖÁô2†´u‰¡ ÖÁÆÒí&‹¡¨«>¬”ÖÆÇýPt#½ˆßhr‚±GÔzŒ®£ËUŽ)-Äñ-ãß=ù~߈Ô83Á»†ŒÇàƒ·¹epÞïŽóIéi,xœƒ3Ô‰ëÈ•‚ å·.B2y×'9å}¥wšÜ„Mí8ÄRÖi¼Ô³š<¦PßcM”ᑨ"ŒE‚&N0¶i2\Ö³f*¥Û¥¥±*ˆcÐí¡ˆŠ‰à©ØÕ@ ާ/yF•ãˆÙ‡ò=ð`’£šæµ-æú2ëÎsXq]júAÌÎY5”dÁÚè·V5TÃ6bÍÏ{Új'dIJŠ;3aÀ‡.LºÏ è­mª¸eA`‘c½]°jž¸»Ž*ö¨qЏb‹ &J®69î`У°²Bê)¥ U¨þ/#ÓÞYòrô™o’Iüþþýzï½~ß\äÊ`ŠæåFd½›/o>2™i³UàˬCM/ÏǧÒÝÛ8µ¯êpyÓü¬³Áüv¡ŒÖ'úƒéWÐ=Dæ¯÷ØÙQšƒ­3ßÄ6:@#æMCÓNœ¹’šJÙÝ Ù§}½rŽEÙ ŽžÉ¡'ûw{dé §~ývÄ:.“Ù¤ÓÓž³Î‡<'¢vgBf„g ¦žØ£]ü÷ëöÁÁÏb‰„˲\ˆ}ˆxþ$ø÷œ0û üšƒ-)#E2Žy÷øô¾<·ñ·¿¿ŸkãÏfA\v&ÿÔÄÅ[þé›ü¤Áo·Ê*q{}¡zïÂêª ÐiÝöG„SZG¤vÕ(}rïˆ ´´½ÄùðF†t9σ† mFáŠ[á&G)á:ï罘垙4ðú  < õï íyH¼vv{".µâ‰ºziïäÆÂ/w–r‡,åN·,Ù8Ûl®¡*â,GÍe¢´ûÎ˪æ´.. õÒ3ÑÝóç>8×]ЦKM™å;ŽŽ«f[ñüïÊìøQL. ܰÍ!z@¨ ^ÄF£­Ad0–/9ºŽ»â­èxY·Ò–yï]†¼VÛgÏuÚºI‘œ'O†mµ{šÎù‘5š2ÛO.sFï–õÇyÑ™ÓÂe <¡ß¾æøôxxNùh±—Ú uæ°íÀAÐB ?1` ¹´KÓ-)Ÿ¯ÎynÙ<o_{Á,hŒÔ¾ ºküËÚNdëm×½J­ˆ¹™ò{¥uæ¼#z<"­QRuóªù+(ÞY l/%=QÐáׇWʇvGT 8a»§Âi{Çyó°p˜wvÜfìå<œâë­ö'^˜QÐu†šö7žz0tgˆlöt’’l8…Jv|÷­Õ7NÌœn™L¦««Þï& uÁ\' –Zp{‘i dÙÐÞ/N‡„j,+6Q øß{ê€è@ËÛ·Eð!Òwí^Pí¶+ŽxÔ)»­ Âz0îüÑ´îíšÞöô³„P¤Ý žÉ2žŽ)ôÛìTÙDÙÝ&YN3±e#öÇÆèüTúûÈ«Du5õ×T•j+˜T`:“ª=oé©éÐG‡\„ â(öG…Љ¹¢÷-tÕ«ÅÝŽ^ðï¸öŒ¸æÚ߃×å7„†WT&÷´“¼KCSÇ*‡ç­Šò>ñ@Wzž^Sqì™vÏ=¬9NR„àfÏ,˜rmçI¤:BõS²rÞ¨í­jÜ 6tÌ¡²d|¶‘\g8;í‹4̉ºŽ]0ÙèïãÆL'Cåãz9 µ¬;:ߨpõ[ß›Í}3™ÏÂ5 ôðáÔ™"zúþ9ÐúlˆXuG_tµ–»êºß*¬TÔLUGñš#­ú3¹žz:-QÅ]´A¾–‰u¶>Mnû¶'Èð³ÙÀGDÂé3é¹jvf»jø/w)7{´œ³q›º{yÕgÇƒÎÆ|T´é‡OÓN™öâ» Ý Òoª&2QãžÚÖ]ê(n0ìåäI¤ñζíã—¤Ðîõ:{ I³á“ÏŽ|õŒIc-Þ Ð“sôz‘£,I¢¦/¤LڇΠþ^çjܸ …i“êµ#pDÉ[÷ Q½huÝàgX­“»(¬3dÓ߯ÉÛLóÕ,î!á úz_ =øìfv{³tŠÁO¤U™¿lÌ+‘×Üj«½ejï]~ôgPZeŽÌ®¨×O<÷Üß~;ï:zæ¦ènö{ŒÙ›S,®oŒqÅ9ldéàNnñª˜žþ¿˜´6D„vu‡\#Ë§ËØºü€ÑÕâª4½”b‰}ùÅvÏx<\T'ÏÏ«0E˜ëW¿¬¬Zœ¿nðlÕXG«7-j»¿y{ùç9~-|:³áJ³ÀDkdtJŸ›=v,}=]Gg]‚™ò”’QŽî«~vàd?¹ç¯©ÑoØt*‹žxëðäi8Ó1`w¸p›È’óÂx`x6ã¥éW¾/”®²}nP€Ï àî‹uÔðDˆ)ž1]%:Á›šíT&ûx³¸Ì¦7®YòM 8ñ[»½÷òXRx£“ͧ/-¢›¡çŸ¡)¾ œ3¶«„òœ°3±\£ÇWZ8¹Ã-åì8ONɲqßU¿FHaœ À‡T8oÃßo>:®7$)• µ×ž³£QFA3Êë0Ñ€)í¤ ÷p(P„á<ö1t›;¾—^^Ó¿;ùÁ:zÊv =sØÁ´6~pë\:«V )È|­õdØìªº*â<# I™oÝèù£ÕÕ_h' ²øºãÁÖ§~ÅtÝ:xÞ¦SCÊsÖ÷]è8yñEªz='B=oCOmºÉÃLá7\$ÌćGöø’=‹Géq‘XŒ³{6ä ›%SO¼ŠbÅ®’Ö;a˶èP »í{¦~÷Â8ú¯‹s_ï{–³ç{«TlI:ÈÌ;x©2éw¨°‡†ÈQ×ÂùŽ×ú½¨)ö ë®êç åÙª¸:¢’üøó·žÛwalòïňz;œ#U÷q|û$p±ÚÐÙáÓ:Ÿ®xyö/Ó¬è:N9ya†;ºðvÏ Í&æ¸.Ç)NPá'‡lÖÇ]³ÁÛ±±²nÎéÓÍQ 3 ÛŽsÖûãcwÊLä£dé Þ“³Ãð‰q=ÈçÕg#Zê{T ‘Dsßž®pškâ A}~gÞ ¢i—ïÎgcÓ¬¯ˆ¦åb´xçU’¼¯m¡”9g,èz⺷¦£'lt›3~¨ãj2%¤S‡ÂwwÎ÷å9ªÇ5—»ÐÁ{2z:v榆zžðI™7Hs«†ŒBßuÂvÔ1ûS0[MáÞeTä›Ì¯6äÜãS/¬eìBÝØÛ|iu#v猛bZ¯…dû–I~Ò»d Ý»6ˆjÓæÎu‚Îôâ’Ñ·È[Ѭö>®8Y]ìQ²câtÍëæ’î–i{*…x×6›3¹d¥nwнÛéÞZ©ð{ÅZ’KwLKÖºLŠi8P¾æntVa“»§BŽèPB2= É[Þ–…\½h úæ`õ6½n@â®n1’ìRž;ÖöÚYheÅ zâ¯u%7'7£<w‚‡®o»Xƒ^gˆ·Þž …ÌÝÒòÌ®sW9ÜÚÁ­Ù|Ž’^îÞÓKÖvrÃæ-%…bÛ3¦b4ëJÌÍ´žl@( x9‚LZc2rnw­ Xúµ{½Xɸe^ïžï.‰;"ö9¬qZÉ»´ÙÞ‡º±ã¹“b”œ'pB5Õ÷p˜Ú'¿j4‡oJ Kd8»ù_tyÁoÇSêx3gh œè ›«}8+Ýã=6©}‹’Ï[ÅÓŠà–À°N˽úh gÁxE£Žr˜Šr5y+¾ÌÀ ÝàÇlŽ$·a={eßl£˜øQêÐc¨óï©k¦´û¤—»Ï’nokOvMŨ}«ƒöm%ŒÎ蟯uí v¶'­lçî½X…h\ðå h€GóÜiœ‚Y{¼FÝóòß.~“É 6š¶Q‰Œõ×m 9»ø’I„ñšÌ=–ë0Ý÷Xgs jÞ‘Ødgg‹Õ[àŠwÒJ’YÅÜÎE6ƽ­Þ v[YAétq½7cÎǤ]/NÝÙz3›¹8ÞZ7²L÷qÝá·™0ä¾1vñ™Ä“@Ðö&.O_sÁ·›3’9[Å¸Õ ×ͲÆO„y«»gæ]BóÝ’¬!¾ªk½švV8÷4k1ëbù*LJ^BÞalιÆqÈó9é=»¤YG[N¤ØÅwØ1ʦ:ßÙ(S§ÏË;«a¦ý‡yÍËíòݘÊÇÚ§r(®Tæ“Ýà„™¾ØVâœsgTxù}=•ÐûÆNó=Ò9x#º=jõ0Í•¼hp¥ÁG€â°çœä{³+ÓêÛdö?'Q”̦ջ~S„ZBœä–.2à§iA¸”†bÞÉ"båÄà šb)P sJ´Ù³³Žµ)Lõ §³Çöbf~·9"ÔÞ÷4½ÃJÑ»½¼6g§²6ˆî¡34aÜz¹`“T9t['3¾ëo``Š÷u[à oé¹HµN5¸O7zõ®Ý|Úž£ŽžÚŒß•2hö ö<}=;—*u{|—›ºÃ{ý›¯¹3|Ýœú›Ÿ"Ý[Ž~×–«'i±_°?­hõN¡fƒ)]'\õUÒ{«O³ÐçÇuA¦ Z°¡L$5ÙæñøÄÓÇë剃1(š˜ŠÚ±î¦¹ómQ¢¾(´Ð"·t8ÓÐhÀ¯¬¶EØf_º…yÓ i6¡‘­=ˆz¼{̸æžìLŒ©‰½gôª÷#ê¦Èº©(ÃÀ£UeGv‹ªæPe„ø”˺`ô=­™iàÝ‚à&zç>Øñ¼­†H =®eäõâ*×=Ð÷ƒr½âÏ@ÝÙ§ÜBùk`V=uêaM,{¢sÎR£!޼ÙI[…sä$©8!Á¾>é+Äû7íçWÁT¯%œ7п+|2l^høÌ<ËÌÔ,dø™Ž:,¤õ²„-{æ )uÝ+³ZÁ ~°Õ¾`£&=ªz§Gܽ/~> õH#LLlcùk¦¼3Äžo ÛPp̾¤®žd9ÊâùÐÛÅÓw†­<ˆ#–ç?IÐÑ1y-W¯Þ’ë/+9\K¾š íÀ¯6ö²×½ŽãæHIˆnN6{”ÃÈß †z œPˆÚ„ž–…,žœ’´PlbY¥:µ­1“$½a„ìJ[¾ê 1îæÙôxƒÞœ¿W•5BcWHƒ ¶Þµc^½êñ²¥¨•ÚìÃûףDZÞè#% =ʱZ‘ØÚàÖC±k×ÑiRm”#˜Åó§ÞÌ‹Ø «àvìóÐé“gšO(0 ĽÙé—áD{‘fÝR ™¼sõFÍgM ˜ƒÊ`;’I«™¦%Ÿewf«Â-ÌSªÆ—EöŒËåL¢÷°oÞóãˆ*md‡¨^`3ˆH!ûQŠ"LcÞ$bäÛ F‰g•ò‘U÷‚´',HÒ|RNiË)Èîü×™‚S}ë+ˆ÷[@%é,±1yõ7IxODG<Û~©Ó}÷‚³{`›‰$YeíöÔ.éFå°äÁçÏ-¼ütÍÞÆ¤âó±ó5 ¢¶ÍÄâ5úÔ RÇÖF›(þ‚Ê C9·¾Ñˆ9 -]åT.»±Q+md­J”›éÕöSûÆ}"³ý€x€( @X@ÑSÿÊ@ZŸq±ÖÙ}=hgNiˆQhho'q²ÔL)zß9³g.öA¡$YAA»WIïow—K´{ŸFi W¬Ç ¯ ÊÄý«¡>9é³ÛëÓ…IÍ«xÌeû”/PŒ{Õ`UùA6[ìI™,;ž“tµñÌy( Zý¹w@Ù"&©Nùd<I“h"²Ñ;;LV‚vD¹Æ"½@2ÙÓþ†es)tïý™ÿª*3(÷atX¥\âª÷,+M~^í³aõ\J"³‚¡VÈ.d?¨Ö…q^0óyf³5½u#½•„⡱•"Dˆ`ÄÍ“-³’bœ²Åƒ³yÕDË3 –‚’¨ªŒ’# È4¥ ÖÜcÇ/‡|ñ¾¶Ï6YS—˳|‘‡!I»ÜP¨ÙäW÷Ç4S%·'6ÐoLð’{‡g³F²æn92§ ÌÑøŒtÎéd½ñ>4I“èó0i,ÿ’ýXŸ¨ˆˆt¸Ý#ßß²;>¯T¹õ1^¥ÇQ Ðûå®*GÍó’VŽönñÛtt¸«-#¢§;Ý•x†gXУwMr>^-P—!BSÑÛ$ZÚ6´És,×FD?JCÈÉS»¹‘ËʹõÿvÁû äs…4uÚÄ–†€ódWãë®|A@ø„÷*$u8¥½Ö[™ÛÍq­–,­®Þüûçs­ñ!¾ÉÛypŽÔ÷“Kˆ\äˆ&š|¼3¦’œ"âe²ÐCsXct‘ÈÈL¹QÜ-‘.ZÇ3’ïR AvÝ"ó·e‚\× •7®(®[o.’´GwfKT ‹¸:IÝÛü3šÚ†7™wŽÊu˜uåï¸üY¯7±ÍÄoùߪ=jê <~·äz¡!˹†O.¬`¨Lhz‰[߇ÖbàŸTI9eæÔ®QgŸ.úˆ„ôK/­°“çdºËÒØk­@ñÉb‰Ûø+Q[N†drÆ,e+bS]ßR˜kuŒq $5I¶ÍŠÞ—’—šË«ëi8ù ZË•¨2cjÄS¾½˜£ì®ô²bgûçÕÐüç^uÐðF´ÝhjÍ^ã$].¦±È1]ÏÞæâ*Œ\¾LkTÇû¦G-y¶xÎlóç8Î2°ÎÛvT½òY•Ä]Üó<çpÜ㋪™Ôb$È`pš0˜Ôc[„†ò`¶ŽGZ’C¬õü·“¨ƒÝ*x–qû|æÆD9õ¹¾( YÔÖ¢L72‘„wSÕÑ%ÇL|ÃÔgÙ+Ò6Ôòµ’´òþKE‡öE‰«@Щ÷÷.vo–jiõ4–n]²É¦¨µˆ°ðÌ«ÖmÝI»ï/qjí²#±†%Ñær S[®¶ÚAª­Z³fo]Ø•-t%#tºŽ]\ÅÖÅR„HZ²"Ý͸f¬¬"Ýë0OÌæüرƒ8hï·~-¼çÅÒ7Vb6N¼;׫‹‹Ý{†ËŸyk^*Þ°;Ž«뵘j8Ø‘ËåËvñŒµIP9È)-_.DÝ6ÂÓÛp­G9†.<‰œr7—øn^°±El¿’â«*vÊrY_‘™l‹Þ2zŸWD‘yð~B™ùUÒøàîäC# :@´'ñÛâÃ2lvX¡¶Ó®su)y*Û¶5Žñ±±"Ô\cZM9|Ípd|Œ„!Dîën¥‰ÔDl”ƒ&¹¼q`ÕÄ·ãqž.ıÝÞú¼‰Èö%k5yª¡¬Mó²ÞM3QVKÃ:a°úÙX¦x÷›8f%ɦmuBû3:oCTtÛÓ×U¢<ÁScDc©ñÄ„"|¸YØ™ºªu7UkÓ.ä<cbBÈñ²ÍARXÈ>gKm·HZ'H¶„·¦ôÎvÁ“šBIüü¹˜g›+€³gcGL º¡UÊ\h@¾›H‚c¯dƒ!Ø!@ÔibŽ’p}DP»¹H±AªF°YeX£mlNýûìï}‘ŒABê6…Öî긗izðÏØÕA>*pH°­%–â%•/›[œsßyÚìE¤¡jÆòÌXY…·vâHIÖ""¤mUXØÐ9Œ‚8­ûk«¶_P*#mäÓ?Þp`à‰u€Ž Å¶rᘦ(·ÕKU½Y—¶þ›gZávng^ƒõ‹Oák{3ÊÃy ÑêëæRǧˆ»17õæ‰ Ôdb¨™¨qÉÛ—xî¬7¯/ ÑÈõi#dIÏMr,m7 fþ–ñïLóÍEï{¡½o÷ãº6xñŸÅUÅèGaè3lŸy'¦ê'ƒ …s®ÌFª€Ø8Æ’ªKœÝ¬ÏWil¢œ¤ÜÞ¾Þ7;yíð½<'ºï³;«š(ñ½§Âv×oŽÎ`räxN²k.‚‹ðjTâk•ûº²‡ Ã8NÌ9óÕ\èCwC±½%Ñl ¢îëçbµ@çH]‡Â,ëNÅÉžâ=sç9pÝñ‡ Ûœß8ªÍÚ\­nª íÍ®TLßrõÍî=˜šóJ¾îûâßÏï¶ŸHG¶H‚ ÏaâÞ|q—½Ù};{ðž{8׎­âv¹…ô2œöfx¹3zõ”Û²ƒŠ”ߨC¹£Ö0¨pYÆÂåD(ùÞn’5". µzþÃvdf›–6x:%R_wfÓ§¹Òrø ‰ Cý ¥þ§ö}Uο‹÷¹üÞú0l]«!óŠF7.,Æ‘$lÆAB ‡äTÀ5c7W ÁK?~ºßí\Z…ìmN„$b`‚þÇPH¡ˆ@Ð7L;.ÄÆ6Å-–]'¶“,C¸Ù3÷,æpÜ‘NxŸÎZÖìH!)I!¡! h)Is‚ÂÙŽ™– Ø„4ÅÉ_œßÁq„&OZ‹¶[)!¢Ñh¸A¦qBÂà[½ešË†ÔçRâÛçYS‰   ²•¶Â¥ÆÊb”Ø”·b]6eÛxÒh„l#¦cf–]Œeì,2ÞxÚ46hŒñ¼{ŒZè²Hà†ÄQ{QhÝݳBÞK¦",X¡†P˜›7qËœXäqb"q ã·dâ`© Æ¶Ì%±8ˆU˜TJÄÂbYBȤ(AÛŒ˜#“)ÝŸZ†1W˜/ž^®ß~s¨šF³Ê Ëüì]g–Ç]ÀncN*–ˆ$hè€A(£'Ä¥`EÃ;5¾ÛXi ›Ý€¡ n)$"ƒc¶ú³ ’H¤;Ô¢Ç;|cHI©"'(ÂD#HH(FFAY0¡íD„6HiÉI–@Nƒ—òi†”UE^q³•¾3•T]EµT³I ¤—X©pQ4K ŒH„A$$™¬Ìà&ˆ"Å€[PL–¸4‚3@: CEA›zyçwm¡GGÄÓ~‘蟘6éNQ—bîMÿ΢«y=r`ÜsŸNþ{¤3¹®×g"AEŒE$ IS.¬&5RB} ¢TêuÀSܲÑÖñxˆ× ºÊËâ»;& jøíj£‹–%UEBÛ @¢’FªI¶ôøÑ 9†€²C’ä­îüªÎ Žl Xu$&f:M:}ì9|CcG7| ¤ ¢'HTŠi”‘B @D†@(u–‰9*kªÅ ÇGÒªdb¯Î8 b 7 0–׎ 0!½f|{k hB†$)„ÒŒ’XÉ䔊ŒPDPR$I @‘† „$…†±Rá„@cm¦J ,Wc(H‚)ÒAâ{°ˆÔ=lµhh¦G웳.LRﱟ½ßïÝßSæ|<DF0F36§­˜ MÉ Ât.¿&ªˆ;¨wT£Ê"eeY䣦¿§%:¶ø]Ñj¨«´[‚Q¶ÄH>"Ïú PÞO«¸<öèm[»vä/·ùÔç8ô7¨KZÐ Š¢¹~ª©V™?±ÔÐZà-–6’83/35DZÄî;TLç6Ö?rF¬#µ7Û‹«(¹‰>çß6W#¢ÿ†1ß{ÁøÂOˆB•‘×®KÞ~üëõÞEÛÌTbÄ׊*ªÝg޳ZÐR¦Zbˆ¡TâðB[rŽ,2Æê„c;6Q°eŒT•·ˆ˜•C H´Ù`²ÄkÙúEœæQ1›ˆ«Ú¸ 1ÌQ'ö7ù5}ðs BGƒ¿.}æ`aTuŒ”xÉ4ù( ó•"fÒy0â|ç £Š­bo¯÷„'.rÚ#øª­VÊŸDÆÈf”L4UuDþ\ÈcZÕ-uh›°¤!ÕT’œ»³a¦M e'I D4°â •}lN‰Ý+jR%Å_ ÙH `¬01ˆEk§ îsSŒ‡†«®¹ê×@r“žk’ÊÓ jï^=Žç9݆é°ÎX½“/Lá;ïOxßhv»:‡³g²$狲9À…?'¸‰òæÎ¥w|ࣄ oF³Ÿ>L𞡚p3„+zòœ3œî_Ž÷㜮YÓáÅÕ*nŠn~0v6µd?ˆ`Ñ#@oÕÛ=ó~"B7¸mg_w`ÞY«›4ÉVøù>J fïË1òã9c‹#S{•y°ì(Þpädrè$f¹ƒ ’N½·7|3(CǬîÙ·ÍbEõíM¥R‹N𠯓»¤ ÄæL¢@Jë$&¥ÐÙHf6‘F‘µí<Õƒ}ܬ…»úgRÈ#ã¼§¨lB‹Xa®=•³{ÒdÔ|ƒÊÞOv…ûØF£DªÊ`¨ÛøCóû¯Ásï¿~ ׆(>©îiÞ<|ÿQbèl:éÃ…º1Ô#9n²”‰šƒó=ùø?À;ß^ ôŠ3ÛÉF<ˆƒ"JC!œP› °ÖT⽬OßÔ¹ÙÏÛø÷Þv’‰‹g½²&£t&ßC¶  j}ÅeÝ+=Mm`¨BF²A$14bŽ(ª¢±4ó©Þ“’‚šj"U´£'$C#¤äÖ¿]ïXg’ÄX2„ÍUT‘$íäß[¼è¼³•‡„”ƒ"¡‰¢”ßÙ¹GU]ÔØŒ¶PÒQµÊªß&ð/¹)†ÂI²BÆBÅTUDF•UÖZƒ1Õ”,«טoT ³Â4zµœBˆS*wBjgíþ÷ß§ó|ôg'Ì A«á$Z.9çž´?2BQ±ØæÄº9Ì”U “ð±åE »äìÜÚ :0K¼1 ÂŠ01xn̦LèÑÝuUN: ¦Ë»È´x¦;>L¶r:vÜ ‹®GJ÷–NÔ+lȉöÿ×ÏðÛÚ¾ Ë#¯ñt†SP=d³;5f•‚Ö¨w×¾$4Í.*Ho#$H&*$‹ °"`T´!#U[€[â·çšÎôߦq£Åo “ „RPlÐP:ÅÁ)ôLUW¦Oá’]Ïퟚaú‹=@l‹$ìL€n&ÕE·Æ¯',×¥aºfúS’¬ØrܺµS}=øô\ä0ÒL÷~•ÈM’(Jo‡,€H!ArÕÑ_H¬ë¦bª—½Õ—î§‘¼˜ý‹ÍÉœyç¯zç·!/ƒµÍ2C¶EH.‘`[Û·YÆQd•ðPlœ ÒrÓ&YÍ·* ¡×ºÜª¯î]mo2ýäN«cÁ4(mÀ»O1M3ŠšŽ*Ô;|§–T«T¹ùîõ‡Ÿžµ;íY'žwaÍæŒ¥~:ÍÕ™(¹C:r"ŠòàÒÖ².žø&ªDR ÐÝL‚DˆËîðáUÊsɬæƒÚsµç}„äiv÷’B-﬩udÒç"7A "í, W–)ƒ™¬!X@‘Ú„2OlîÈ݃Ȟ æ"å+ULĘ!Ò‹CRGÔ´87ÈÁ»£ÖE,“Š¢`œ¼˜ùε¾=x:õ·]Uó²ÂФTíT*ªIg?!XŠ3Ìstª"€â§vÎ4ø­QnÙ½¿½ ê¬\TqVr̆f~‚&>»`2z¶îú•Ë‹TÁQQE"è¶ËK`RLáÊŠµU8rUÛ‚Œ˜–‚²±t…³áÓ'…ÓŽ'/žïnåëCKB5²¬ëH€ Ï6C„†Ö4m™0È Î~/l‡L‚ÀQKÖªD–f¬XÛXe"ªÃråÂ÷8–&ÞMï÷,ä!ÖÕ ¼bö’óÑþm—«÷®»øÁÜ|=w,î9ºW&g¯Oǃ`®6VE¹T .Pé+“<]!.Ìe­[V|‰‚DÔ”tMqóoŸWý"zõo]EXz2¾ãÄ>š:öþw3­0Gú½Á;Å«:Ö./”^!,Ú0ÊÉ5‚=&ÏŸ[î_žšÔòž‰;v(ìÎXrÇÎl4Ðé4–Øf^pT×_‹Zúuí—vvFx€D5Átä¸ë—ºí#MјŒ'Y:)[žïÛŸ ßfùt^soŸ°ð(1îJІl3O¶çš¤ÉOô¤¾ìŸQRóÌõÏ}Cg8¬=ŠîRVÉðzìÍÃB<ŽU‹TÐöövîRÓïváôƒ›÷­]_®|áò¬qt£krË/~X£J|§UøÁß°–õúUHŸ†£Š\%Ã)JÓb›#Ã>¾Ü·òû¬ŸÀ?×zÐçÎ{Ñ"BYÔeþ%O& ûþdG8wÍó0¬qN]|_ª>¹»NŒÜäK¢h‚íE26ÊꀱPÔQzÚ,HB±j±Vf¿¼0U û,‰!–ѧ%bLf¢+·y!Œªÿ…E!Ü3¨]þsE•çZÓ¥° aZ°Lu5Ô„Æ(çÜCÃÜâQ®ÆÀ!ØÿPÓßìý«óÏLªôô1PUGôå•@7YÚ;¼ ü@%‹î5ß©)ÄçÇ _½¦˜Lèw{¦ý³—H6†ýÊ6ºÒ¾Ø'º±eÌ*rOr`êuôìæñ—[ it·¡­jf`“ʉšŸ~Vòà#îó’£&ÕŠñгr@5‹ÅÞü’ó‹’a/…F(XÁÏè×Î×V€ôÞº]ûWFê2òfnæi§þN~ÞkQ÷û±ßbBD³ cŽ2b&,.Ô¹|¿à]5Ä”\×Xˆ³†¿‚Ô¡i`BkìQFÏøCÚqœqøÖ¡ Úš_g¯Í§¼ÄBžþÀêÉ@wYƒè3àäPCFíè@/ˆ_ê“£ÍÞVô· ŽôöGÓßkf]Çvß “6Ôóç¿2ú=ô9×"â?ÀŠ£Ö¬bcîçë¡­‘C§ ä@_ÔÞxô7þ&G-m/¥pÑ×\9Rç­¨6®YËÔY,ôg>¸z¯c׿=fõÔ„íðöñï\KÛ—Ë™µRi%™…ÝXÝf³÷•–K³Ÿ¹Í_ØœuuE:oùu†#<ܵÄÒy*ˆ½epT=öCºº5vp]åEe%'uþ ’.¿×45×ktïÛ%’wC(Å@¤ uIðÑ!±T§•ª#²ø‹ˆÊs·UTdkŽÂ"?ÁôTë-Á ê`ÈÙb·RüûlΆýýîFuÌèvx{ÛW_`U  B‰1¨ ÈŠ^â硼¢(Ktytê$ä€E^31xTœ4Î:çžþš–<3wÆõ=}JÈnFðìþgoåx°œÕ#‡\$È oêKï~  N„ƒ¬ 3«>ñ0@‡eùT C7íÍ §tš|2xÆûv9ë}òóTNº¨y|v¢º †m=  FŒƒ¡'Vt#âÃÓ¬•ûj²ý?…6ÿ<¾h š®ï¥Ogº}Wu­x‘zš;3Ñî`ÅÓבøñb µQ°NP€¦­YâÁ „|~~ì Ép¦ šû–ô3àíÁ<Ò½¾‹¶8qÒû¸áÍ–¦‘½Ó=†Íë“•Þ½[ ¹Ûþ~o$0|†Ìµm!ç’r?™z½>SY²P)Æ7X·´¼mºÜÍŠìãüñ‡çÿ?åïÂažþõ\ÕxÑZÖÜfn&¡¨†é% ÏÛœ÷Ñ™mëAnc{­oD ŽÝíbšK}B*o…87çÛŒÈJ“–ˆH.ývê·2_lmá…Éã4{œüÙÄê{OIÄHB²°€¢Æš2K/s›pa‚ÌãE̳`O¦½8ÉEd±–*JÊ“¯Ý9',øÊ"!³}_|ù·ß—='„™ÔÉ*¢–X]»*¤gÓ+“L^ÌÓ?OøØG­þ§à…'q?o†kœÉÌÑýÀi! ŠÂ6¿2H6Æo;o¬[1yl7ª 9ÞB• FÙYJB¶þe”sTM*÷ƒÇq#'¥U~÷oR¸`+R ‰ˆ&Fªæ«±jj‚sq[¿ñúg£mpõÁ¹Ë&ÆžäÍW­W„–É ðoõÑ Á ¾ð’xß«í¶wÆûÃt½Ýyíª?æ@¡wÆÁÑ$–!X/ QøU  yˆ2 $‚ÈCáÖ"˜’ Ï¼uŠæ®Œòº—Un*ö=rC)2È­|„00ºIý¯Dj½ ~Ëâwâ *Š ³Û"­ÁªªÂ÷þ7L@ƒ™-V¬o ßªUX`FlÕéÍÜ ¤J[ÎTs²¡¨{Òƒªè,éö*”˜tyÉÅ@‡œšþÚ[Ö@×ÊGÂ|Câ”`L3» ÆÇ oðUðùáãêâ+­Ó¼€ñ:ßìT«Ñ¾b×0K;?ëüÒÉÅ[ïèÉ.£Z³Ñ2;fJ2îþn–«˜Î;˜¾ÄMÙ_r:-UÑ” EÀÁL'û.»áµÂ¬Áqc&X¦}Tyhl ±`ßêŒÉb!kiá )™ 8Ö®Tv´ªyRyìGÝÏŹÞûR¼/%™ø¨£ÄQi,¶ÕˆrB6íkj@"–…• VÕR¤ÚöQWUSÄ}ãôõõü¾ù õæ­»XÆöÍÛœÖ< Οˆs{c®Çt,Ó­GSTU"ÇøÆ —„%ÑUy¬2aí¬xFa¦#"£ ¡)ˆõª…²º6&Y„X>nWYÔQ‚ˆšW+Îýì1í|…ÐòvœÃª‡3ö+ìøuãô' }²Ø[<0Êhpåך;? 0'Ç# H)EHB ÇŸl{fɽ1v ³qêþ=ªWyÌ-.O «Ü€›(Ѝ¡¨ÒÙê­£­hÐ#VtÍr.·±/ç&-ì“ýŸì÷Ϲè´E°h!Ÿa@YužaýЪץƒØ:Á“E@Aû1`®^}‘º}àÐ^ бy;+Õ踫økwãS³ÙQ’Þ¹ÛŽ(×O\Ò÷ =8zº÷2@Óó‹:êŒ;½ ¦4µn6¨Ê”g¨}|ù<°—"ÆÑãeÌ©sÇ=kZ_Îε´¶ V ñב èÞÏR­ Ûèhh¸Êcms"’®¡ƒ«b%…Âò8#bndkôòWá¯óäÂà±ÄúÉ}Û™”ä~;§¸Û_@ÐÐõ“DÚbùjþ8„¾…Qç×ó&´§¢§÷ªnlù룟×W£IüšKíó/O^Ü›&EíÍõ9˜´GŠüÖ´t6™¾y©v]ª ÏÏøçšg;t/9ŒW¦îçˆt QÔל‘x†áÆ ;DL¡_ääÿtþr6º\ˆù¡¸ÝF©vØ:qï¨GDWƒ”çzW£Â%"¦BmjÿÄd \ˆøa"Ó%*ZUÈOºNú{‘´:ã\lŠL3PiˆW}±Ñ½B³³Èî¬Ýs[ªæäìUˆ¬&Ý—.܇yu¿"9<o®²"›ˆèÀKOÉaÕþ¹™¶õ œ^ðq ß×Ë5²Ö¢»‚gÏ>wèŸÓuD‹IÙ8NG\<ÝxxßiøÑZ©ÃbM!†·Ïò–°8F™×ÃT€’+å÷^œë—±ªxÝ0´äê˜uãÍ÷æõƒ¤é=Ódìö/q¡ÙÐÙÞÖ¨“ç‹\3À´f-höyìø’È;f§­´U䈘‘7NG7s4àÞ!Y0œT:ÙªA‡‚ÎgÓ6ù–¹Šç•TK•tÃP¥%Â}œ]¤ÑÛÙ–½Mmï^`퓵H°b©!žTliœÈµ¾Þ«%;7±6¶âh'¼‡±7²Q+ïvvºç‰òþý°ç‚²Ê(—6LÆà íÒšÁUð8Jà%õW-QÄøÏ¤¼~,u:ÛV;Ãÿ ÿ"$¬hj=_(ïÐnz6!Ö~j÷µµ{'0‚ ÖhnÈ3q©Ü@jÝd¹s~.{}{؆«±Ÿçùa'ˆÃ$ Ò@<½VÛq˜Hè«W®Ô€ë«÷æÍ.åçÛŸ¨µ÷ä ¢* 8`‹#$4”ðÝцm±A†Í«6áÀ\©¿ZÞÄþØq¹ZÖ€ffoýI WS"~+ó•@V÷ØfE5U¬ú^ ê¨G;äå[ ŽF–Ž©O­‹˜’!.ÁÖOd{Ð99îqa©š·75wËS#åõþG+9h±Áªž–ÏŸ¶‚‚Úû» ²!•Eoù—PM³y%©®/m!üfm‘£ïéœ]GE¢¢‚}šo"¢ª ¿$½œ3ºÕÇ]ègšÐô’Ò “VÞG¯UbñVÉ<‡Â+}f i&–¬èoäÀÓõÈÇúܨGdÝËöaj`¿~<õo„‡÷ÏÑ*ª83ݲ€"ûD-üš ˆÒ7Ÿ6ò•ì -ÖË8<9ü*WŒÕ¿<¸ìûõÖŠ’ÕKEø÷ÔîÔä"q~}ü‹ÐÖ¿83óZÖ‚#±Øhßv^PU:ú³á7×¥I¬D( Oncc~Vh%eœV¬Ã؉¤: µËCjâPN!î…JJŒ«ôhG@hL3Å=mZ»Õhðäåµ_5ÐELE­âþµx¼PêF ãm œ?b±àÁÇÂÝÞsØwñ,ëUíâÂOáš3eËíe¶S ³‹ñÊŠHR$ ŠI°uGB/ÇîUY”bæÍgøÿƒ-fÊ×\£³È{jHí y1ÁSË“Ùz0F¸uEx †ßì,•¨2«½‡µ{¥ÜnÐé J˜½U±Ö+FÞL‰owC”áŸ(Mý³Æ]¸;ó™§³²ygÝ×nÉìÍÞ6øë:›:fîNk”™tœ3wóۿŽ=3Ø`[qÁG á8f¼lX ±u³8ÑP_=T0ž£`îÙ:š2Ïjóen÷#»º´²O7…+K]|Ñ ´u¥ÌôÞËëÉçÍ÷%º?c²Ú¢IWƒÞ,^’ÏEyñ‡†îË`°Gàþÿ(ÀóÂô»ì2h`$†ò@0ÀÁ±1éHñ]0æ•:açÁûÔ|®Kìðü¿¯,‡ÓQ˜«VZÄc|n-Ù¾hÀü*¨E¢ÛHÏ˽k&‡Ú¨¼óï¼Îºäh]cT)Ñ}+,B+xJ»iW29C—óÓÞô꤫ª!‹ØZþ?è‰=™Â;­#.ïÆÂ¸ò/Š&äÉÀTß5 ±1tr¶Tù@€¡ ª±O]UážRrìE Š$ÝšI Zn‡pÑ5A%`ÖŽ¶v™JT5”Õ;­ÇQUaý¢Š†j|@Ô©n­ ¯íÊ¿dˆBžZÚBT›œô*«$[L0% Kd [~¦£M0Íp£lES]7*Пõ×—<Á‘¡¥øë£ÂGYùESEìÝaçŽ2XÕš,Ãp}R;L×{ GÚ›k]¶G®&ãÚ¢¤ÆÙÆs¾ú-Ò–®Ï!a$›¤’@ªÇ9Ç´® ±ö›‰[¤„†Ü¶ÆÂ" w"Yª6HÈȨ"ƒÍó‡×w¨’Þfkºßêû¡ÒÍš du¨É#Ãx´‚TþÌœV’H!ãG_œºÄZá**‰¡'W—-ªZ¡ˆÙ15j3ÎÔ²èŠ>õ‘œ.k-rÖǬçlQ³/©$“JêD€ÁV‘’-F5YF[¥QP$W='{Ý?}Ï=ãã:Ι͜ϕ@d²PÇÛdFëi9†wù/±4ƦƜ~[M/ËG÷ÒùÄ6ÒŠR›ü_ŠÍ‘’(߈%ÜT’IÉ|ÙÆ¦%Y]kóÎ÷uµ6°YSbÙ›•¹zŨ‡Ò?ԇ̛~i»“¸ YK”ÿ¢ëÞˆôEy0FÉà(“„…‡ÇYlCi«Wi6˜íV ª±»Ž˜·m;QXÒƒ»µƒfcÄE¬²$D™-bÈé 4Æ©NH]Ö'¸*ºôhá4´B8 – #† 1ÒUä²/ÈæOæóñŸ‡¸g3`ÃŽ“j;©™ÐD…U1ä‘ÛºÃÜ—©$$ëWYº·cI[]¹i¡Ú‰F!ICPmÒPÎjæêÎ/Yy6i+ –ZUKC³­ 49=žà½)x=©4©ˆý lá™3Ås<4x}:œ 4UEÇ*›ðoŒ{²pqò¹Ê‰³l³…__+æ\| Ï`€Î´ñVÐlØ>C9Î/~ªJNS‡#7Ii·c­±7f·*lîÌ ‡†‡'ßgåuÌø •#rŒàÑ+wNXÂ劾ìð¸5]ãO¨9‡åwy몷Žš³uâ“£3g–hýWv³rTjcê±ë½ð›ÝÛ™09W‡ŽUÎGQRQU)f“X#R·N׿¹+Ša÷”Æe¨¢|>=wˆAòDÄóVX÷oCB•eâc-%=ÀœøeÓ‹m‘_a“úþóá]!‰1þ _&Žâí…2·½ÃÖ†¯éìaî¾+Iî¡Ç(KCÏÏÎë›±ÒGZÑ'Ž>K-DEÏÜI¡­m*úNèýu¦ßS#m2Hˆ˜šoû"¤F¹Ý¼IaÝ« jJk· ‘Š þüI‡„Ú}‰á&CÙ¨›yò®· Ÿ%!!G}jÌß]˜º¿1ÙSy qN¹Ü¡ dQ+BQ¬ççû›è—#ò¨µ@‘Më½ù9Ç’=i¤+›7$ô.™uùÝ$I'J8™!äoZèš‘ÜÁÒE©ó¶"Õqe¦y9îvâkSËí›HR©]õY½®‰Á Ü‚ ,œˆ`¢‰{6åQ 3ðÑôÁ͈Ü%´‹§9‘ŒNBEP¬ÕÔoV)VɲËs"Â_Ò̼åóA2ãIj©mªIì !öLŽ¿V‰pÎKèܪݩ–,óËçeâ`“â^*4þ‚•×Ò_NRD; §¶Þ©…¦YwÕžˆ ME1¦A ŸâA<š32ýí §Ôó>~+Ú†9{5§0ÍäHT ”‰‚Lâà®llÝ5/ȦÊþ»¨fç¬õe‚Š8ªͪyKpcX¦“Y”‚©…|ŠMR]V{‘Žÿ¶:óû•ßckˆ¦±}Û¾Ö¢k‹NAÊ`Û%Žk·å„W« I´¬E4*e .ž±Ð:»Z*LùÈÉkx$CéÜ»ŸõÙû?èÍÇq '½éAS¾õhé*¡F®‡\ûŠºlC)¤eižHgý€ïÏó¾¿Iý8 “"tÍ'I³&“FÝ÷Íóz^.Ž’Œ¸˜så3¾Þ2ëvpžÌá88£Âtœ<6ÙßXíÖÚ'JmFÉ–ÓtšCG§Xë]lròá†Ìär™tîëõˆk%EÃO8­Ócc_œÙ¸é[i¨žù'þÌV °ç—þ•OÆŽe@ëŠw² C3p·K{$Ñšž$¯uŸhÇ쎆¨ïv}ß §Š¾Ìü['+™ ÑÜï·pc¹6uá®o^7:1Y[ÖfÅíÈAÙüÿ_ìÇð¼/õý¿p™u¿ó|ºÞQ‘ç‰Ü¾Ä'—¾^ž~=¾1U®ŸlöôÛ¿Òm:¤;‰mAdCVÂnþbùX¡@¢—a ïÁ9ù›š`É÷’XI5 ¤WtËö0‡€llöu©:n"w¬†tÁ’,€(Œ¥®êÕÝüR7•Tƒ½!hyÚÞ³DvtŠÎþ $<Œ#A7íIÉVì£Ñ¢47Ä/Å`f{XGŸÂ7 C`³ðáxux»Ä ƒ®%¼TF¯N`ù>ü¿}ó5á‘DQìö!¦iÛÆü•¬î;ù**Xà á†Ì|íy½‹ù0Æôp–ðÄ;½5]wv¹”ãŠK+/¢qÑS ² <âöÁ¦`L&£šÙ+·¡rsgdàÇw—vr“¤;lQ¦e¹äý]?ðÉtA¯:CÂ4M7î6FÑj:¤Qbh–ï|'~÷eTâ«V(ߺ7ÆŠ‰BÒVÕ´Þ¶wï]¤‰9Þd…HyâŸÎCÃUCжnÜÇîïM5º@úù§ip• RŬi|±èñ€þðЃÀŒ8F½>QT°÷Î@V†‰ølÑÓ¤õßž&O¤ÒvN“¤ë¢ˆo}«¿luU¯ ËäêºtÐÃчfgj9Ú·ãfγ $ߊ´ð–P#îþó©Ðä,:áÐÃïÖ‘šì!áäŽOØéÓ2YS‘0‘NآܣÅ묘ô+&_ ÝÝ2&7çÆyÛÈm^ïY¨mñ³PÙ5á*l“a†{Qá-Ó¦h|=&YÝžR÷¡b`4G‡±ÙßÌØÞGœ!¦@d#š­Ù¤òJÚ§–løE6vãŸ>žZzgI8;*xrîšoÏ·äéÚN„¡ ¢±ý {ØèNãûþ Á  üâ9­ŽòsbÞRßßU)÷ä¾UC¬¸àè˜w7j»Èô ú2ÇÓà²{#$A$A ÔHù¿‹Ó­E­m+2t,°Mf|^•ßK+µv+t7K{½±SwvC#~O„Ó7ÖuÆEUüòÊÅZ§ãE3ób…Y ¼ÚУ®íHx€ôU‘ž غ aµ®Õ­[{êót8GÏPÀ@è‚ ‚6E/>.êý«öG~µ=¯axn +ã:/U>>Hx}ä édíœ-™-[#²W>?K¼®Žã±Öól#Z!àÖ?”| x{³fl2ܨÝ-;¤çšáàNStÝZïÏÒÃø«¢ñVñÅóêáê+õVæk!gE¨(ÙÖ¤êA†`oÔÅ‘î-tÁ¼AýAõì3[zvã¢ý3]üóÁ‰ÊlžxfòÍ3!ßc’¦p–†¤…—°@²<Äã½ï2Eb-jèµQˆ¥lÏÜøXpŒ®*ê®#ۚпWåÝJʼn®*˜èBÁU¨ž:Ýýç³k5à 81GX*rÎ]’aÚoÜëÎÖ:†žÁŠ“w"vfž|ß]üé{!¿Už„<'.Ï£³:Oä)VA¸õñ*s¨\=³eéE¤ZÈó0gŠ#>@Þº¤ |#€­üj ØOÉ·ŽÇ2‡‡d<¼§*mYfÈuxÍc”›¦r3ˆê£ñWžýo^SX.ªÄˆúì†šëŸ ê¢ÐáÖ¸QÖÁÅDu‹U×| "8GjÐ3–pÃTÓ¡|u¾s¸–ô–ì‡vi\v ÔZ3ï뺫FˆýX¸Š7ï’kƒ€ÉÀlü"}@nÖéÙï¸úöFº=qN¹(î𜡮¶—ºv{¤Ã»ÈÃÊl†9Ü÷äÐÔtQ%_H¦¾Ñ“앢̒{½þ}bˆÕ7JÎÉÒ7ÚkvÆÎι´‘@¤ÒëŽ3¶û3„îÎS‘6Oë ìð"ñÆü:¼›&µS©L²n!›"†<ñÛ¬ÎÍ“qèºl¸Ûí(i·3¢ ÛË=Ä%æ÷I°Ûš¯¶=£\Õ{äÞs·ùr1’+¡nèq\óÀŽnf…Õ¦¹úì&»‰û²êV!^ûT]³zw{,+Íêe{On¨ðîïŽÖöÙëzxæ7é“V ٺáŽå-qäMï)»,“Ÿw®~íÐAæË±“VOdA“†à^ɺó71tá\ò\lžTtTw±vt$ƒªu¡#˜…]¡™z b>ãç%îÌêÓì ŸgQ˜lDîêPã±=íò¸äˆ†`Ù@¨MÞKÛÝ<ý“‚—ÆW`‹ÝjÎ-0¶¥4­vôK[¥zó¿vu{iï\xßbEŠñ{.{_˜AÍMÜÊÛz½1æÍÒ{VÞ'ôÝÀ¢xg&¯eÀ})Vï›÷ž,²ò‘ÛÙ¹Øñc<‰á—»»[+{‹µj×+ró`0†žרJÊLòžYªqDš‘uVŽÝuï„êƒ8½ã(OÝÜðs;çáJ§JÄÌœ±\;‚ [¨¡ï’wo`ß ¼Öf‡3WSèM¦{±œ;£ãÊÒ|Íì6dS^ëîFñÃÀÝì¸õC»y éÓxãä#ìÏI L{H|·B;§ÔMÌØ;×ÏÚ´x÷K4¬²oCqçm¢gQâ|Knꜻ­ ‹g÷l䈽Ü!ÎoÏÙPåxÝSK¼gj^îlo[™žjöÔvM,ïj{2+žÍSZÉÙ›`»ÝÓÏ…×téÎíÚo_g·Ûä’f¬àl¶f¹ºuzKxŒJÝ×dr »»·GwpªfWæjö€;Væ÷ƒ×·%ÞHBô0ØÝ™–I»Ü6cïn³ËÕ}á=§Ø½É¯k‹o¤2†ë³ClNß6%Vìë±$G\‘ˆ;=Ûƒ3¸Â ^z<ˆJZ“·FO7¾BÑsñÈó§pšÆmÅæ¼QÃfÃè)]'b!¥œŸW Ý·æoS§–ê݃\ç¶Úe;¯HQnŒ ÍZá¹áÚÑÃ%÷7Þ•îÓªvûdí×¶×s•Ìž>3ª¾%»š†sy9ûquz𓇆Í7©›#Û„-ÑP¦;»¤œ¨-Óm¾FÞ”ŒâÛ»F«a>y Ž]ŠðÀÀ¬8[/É ½$‚žÎ><‰*#³ÈÈÜYŠ•œÓkôÀ‘»ïŸn%çnô[Ên±]¾¶åVƒ™Ýwv\+=Ù £#ÆûŽ÷³Yñ©èù÷vkÆ×žHžš(ì°tc·Q.ëï=‘xúº7w ‚?`]ÆGÓ¹ë3‰‡©‡ºŸy¼4H Îïk5³7Y±jΙcaïgÁaŒOUAØÌåUÛ+Ú‡²õŠïëïÃ#øâù}yU^›em¶SB•‰‘,k Æ&Å©ð¾ÄºÂ«¬×H)HÀÙw%2Ò'gin%µ%±©ž­Í¯#¬LªO´õð›¯KÍíF@8ƒ¯iF÷ è‰g½¼Åìg*®{}$~ç3{ƒ´TykeŒýÖÇêÈ%ˆ ÖÅ¥¯óÑkàLzΫÅEgyµ2V\JíçMlàÔY¡nÅ%{S“Û¾nÚNï«vöÙáAqúµpá¸$zÛ;Ž_BiÆDÚ}î}WVfE±ð#žùªA,»¹¼•¾+(›WžÉ.¢#Rœósn ¾¤aj˜[t ¶Òsö½4ÞÀ Ñäf÷¨æ(§[ŠûÞÁ«of†ÆR ¯œ­zçÆE\,§¥¼t|t|£¸mãØ”‹ôxÐX°ä®²OÓékM"K³¿uVÖLÕfíp™Ø;ª<>—°µ¦#Êê§„µ®Î\Ì‚el]ÊUof¥š­,1·kïN¦$›Y?.F‚P-{2÷Vr3“Âéß ”•Qx=9FŠ>o\&僼(°Il¤çy`lê‘lxKn" |‰…¨0!ìÉÇÂE¤Xñ£Q.éò—_H—°'ÊOZ§…-ÑÝbÈY؃¥ªÎÞ€Ž,I}À£¬R¼‘IZ ÙËÕq+Ò–˜ˆ÷‰rëéO¤èK"<“éó(ŽÜ:<˜‚nu§aâÈÀVa¥‡¨© àá4‚ ¦Õ¯=OJà°±0, nB‘ÕwYo¢j·®²üç>^?r„Ñ—eá%ILÒO×¥Èmçi»÷W_A\cöK ÔSõf’úÎá|+$¢8Ú$ئè´M±ìU”X[®LÎë1nÆ ’©Ùjynn"DõŽmñé=-êîxkÈQ±$À›¾££×Ö«?< õVzGrŸ\gÔ™m‚ Ûj‡¨eÓàerÑæ‚ªñHgF²kd ]šø ©”ÉŽÛ\â™Jm¼¯ì¾²ªÜ1Ÿw®[X¤ëblý1FT^L‘?-Ö¾–Gâ\.Ý•6éÙQÕò!Æ,‡{El„iá¶«÷” rI{oý`^ï\ß„$o£|·a:´½Õ¼ýˆï½·aûþ_üÃ~D­êk wróA×1l•ïijÆC«}5)gc~iYðmí;¸¼‘î÷2õj8¼:çg€Ç¾ßÙ/lVèö,IŒáÀnGÂË%ö—  Vn88ÜÑ·ºEÜåÀ{‚' fNWg•Æ<¦""bº;9­¢*b *¤«Uï3¹#Î&—và— x÷ŬxÀh1q/9 ³‘sr4ë‘8®Ì½Á OK•’ùåÞæÜ ÃEÂhò>Ñ{¼W·›Ð7ÐÆ¡»Öö¬2 á“y÷²í´ÿr¸ëïàR7øÉOïC‘vø.—‰ô‡*:°™j¿ÅNÍ ï­'žvèMcE–£ ͱ-Ô£©ñr¹ÔÍ0Ýÿ€—Ú€#Ió¼Á†Zœ‘·œ«A‹?÷Ç\æ/+ï§²ûÙ´¬åU¤t Ó=mÚË11Înnv§¿»ïgB®Q‡ºìŸAM÷ÿÓ5îr 4÷BHjL uD] ˆJ;½œ ²*|an±a…Äð×h¼tF†”Ùze%$­UX¬_K«[^û|3=òDŸo\i¤Qk±׋ªXe)%¬Df¨°Q»°²¨6Ãñ%ZˆZòì&L²ÐÀ|’ìˆÕžFeB®à¾'²²,Z#µ±.4ˆ„ED­…i…¤DYøFè©ÞÛw¥ï dU‰Œ©Úýï½ùÏ£ÊÑ÷Ë®àõêÈ'ÓPF]Êö¨Bªâ¢ÚmçÍœõšƒQx×b!iwæî]t6ÙTR¦`b bE¢ê‰uUòr{ž6±‘ãîœ9ÎmSë ]DUWßïžuó²¬T%j¯rV*i[ íIK.Âð³wdcš3Q~òU£kP ¼k4Y›«ÍvËÕõ¿k½ëŒž;Þ NÞn¹Ú>$ðÞ®,™H¥¯j¨$f»e¦ ±¥ŒÀ]%«:Å"ˆ…!˜,Áš²E‹—P[л·JµDÌ\b E4ùF(_7Ü1°Ít!q›»*†ÎYb¤pX„¢£ݪ‚¨6s^N;¼×bä¹›‚û¿¿äþ׺ýԛꥈ‚ã°H” £PŒè%UPBѪš1‘ù¥4W…·™Û—crLnûN-}òÌælv½Âá`Ñ¥Õˆ¹‰çK2Z«Î,åùTT;ZïDAâçk«Aõɘ¿£’.0g€htÌ4mtzªŠê%«Úsn!}K³Á±"Zi{cȼvZ\&!~{ ­ÐˆFŒH7™çïíf÷ÓdÉÞ¢¼@lhŠø¶pÁTùÎîê겵؅CïçóÏïïæ<þúÇ™ûõçÁèÛ’ضÁ‚&Fe¹ñ«ÍjškàÖ£»•ó³ÌoÕ<Ÿ{}Z…º¾K+O$\^ÕÌú{¥bò‡iLyäí·µ4Þ^òþþJ‡±ãuà“tÅKÆ ŒÏnÓ,ûl¿:‹ÿrž7äpmÈK¡pÀ»-¾ŽÙÆ8s_—Y]Æ5z¢HØìæBÕ}\ÁPת~sæ)Û˜®MÄxß:ÞkU—k¦ÿ:A #FmºØø/™’RLFo«$”µìÃÎ3Ù±ºT$d•B›eloDÏÏ_;Íä‹Nĺ4*Š, 6*i r’µ³p± µ²BŽóI²,•¥ßUtr•*«6' 4€v)D‰µöìö“ù$äöÆ·\˜&mžÃ˜7®[šDj#HÔ ;cŒf³TI¡E´¤E ŒD2òösºË²Ô[}Ûí)Tr)8‘oqå²!‘ e&ˆW'.ÔÝŸ7NR¾>AÒb*çÒ핉˜rPD¥>“ÅÁ ޤ÷4f@n%c_<ít?,ó@ä‘_H!>þ›¦~>?Y,HŽAQ(Ex  X»ñp´e]…°Qª˜<P˜‹exÒ”$Î4ŒÀÈ žº´3üù÷é•ââœ;lVï 5×›~øõààÑ«(ᇗÑ5#Q9#óöè"¦º#¨-uVë~0ˇav£ÂL.ªiÒŽüÊ›´˜L‰²Jyp&œ!¿>|ñ®Õ†lœxªÈÍÝ?í-?+¢£qÉ—ÔÃq€…AïpÞÙÍÕ}¦! f¡ÁpÌ=׌!2ò]½ƒ6]Íï,™í^e5ì‚[»ª§”n°f¥ÝMðw@³ï žÊð³ŽS½¦‘jUŽ/¼®›tv(å€ |[xR‚ÙýWæjô$Äa:œ-S\o’M2F4­ ER!¨†éIÄœi’£'–üñ彄‘5M¡·Q$8¢Œ=Âà­ƒ.9i+1Ôtã˜éd|—,xÜQ>²+´ÜQ¨Û$mÀlq6%3YvðŠ!A41¢¤Ôq¶¤ Š+Ž0”ëÄŽéÅݘ¦ifzÂ*õ´é5…ß~`ÑE¡ B D@7’8ª16ÙøqETÕUQrKV‹–Ú¾'ÉvfSKŠ6¬²n›i5ñt¸ÕQJE=v"ÈÆûÛŠÍt4ÐÛi¡,Ël‹jT]ÝÛ-²[-B±÷v!„ÕU¿3-ØU[YN٠ĪËV[ †A'¸JÉ%`(¢”UI H%7Ú‚ÁbÉè)$YÈóÍHc)R#bQ@ph µu¬Âá‚„@YC…s›†Ø ß|aâE $D{Ša+Ó‚ýš–+"L.QêMJºüÿn1ïÆ´ˆD‘¡¢! à¦Îüà“B³!C`µÙ7²v1Œ(Å‚í6¬0›ÑÛV@/Y!bV%ýèÌÉ%2!"‚ƒü >¹þK½Jö ÝuSøüü]}'Ÿ~µÌí¿ž÷€ž€#EOP"HÄdFDd’‰b Œ ößl À€h‘Œ‚(È"" Äb(‚" ET#Šßƒ Žùÿ‹)ßd\g£%D&ªÛGNv½HC FL‘’[ÜT1(h´ÅDUÅÂ׳ –óQ_=ØRù›w³oV=†úø5 !š¢2ÙQþ¼¿¾Ëí;þʉ/VJ¦–Ò¿}ßE]þǵF×mBÇÑ­Œl!]Jǯò¨•T>_r­—ï¦ág¯„m.OÛî ý›à悽>Þ¶j^$zÚƒD yßO«åò^2þ6êç óª/9…˜~Г›ý–•Ü‚‡ÇPWjJD4½þ¾Õ¯XH:D2ˆ"ìÌ2i*‰•Lö??”ý%lóß~drA¸0)#Ó㢢*ЙÝ-!%m±¿Ø5HZ!º¶N»¢N8U3ΞÜÐ iÐETA$R ì\NgÒäƒo¬Ú‹mªªËqsdÜJúH,·MoGtZª]X¸Š}}Öõ²*"É5ö¬+ùû»¬ÎHëF¿–¬v3aÉ$Â3zŒ4„EEZ͆q =J”²¡ …•”ª&ͽ.GNÚlL`Ñ"ªR™hr’’ZE.êE!M‰iEÖjÆwÎe¥OvÆé ¦5 (á9h|!Í髾¾+¯­'òç›yîsýßX÷¾s­ ) H¤Š…"KÛׂ""*ŒHFfªO7s‘×ËPQÃ-Vgæ³5y«ÔÕUçûd0Ó”àe&“Û·ð[ÂRqÉ\¼!$ę̈`‡!k³da±+^0ëm$5»üþî…IÂu‘¯‡ádaö%ì9Ð÷ô-GÄ,‘³{_ 4QÐÂ+Úp] áÕû܇AØ_HI^-tºôýhlb@2¤èJì´aTUGžJ¡k¦õ˜bw+2¢¦Žö7/`ªOv%Ü»GpÄÆÏî÷h£.ݟҎ弞г¡ö|üo݈ø{8Dò®wwc\ò'ëÈ{0`S×Xý¤fã3ÜZíìÕ3;Ðíã:½}ÙÃrÚ0x['Ü¡Î1•ô¾Ù¶) {é’ð«o&£g¥Àº0,ÞVfÐêÓ‰%Eî˜ñFÌÉUR›8…·_ilDJ·ŒI„PÖ2!Ïn×Ó1“zÙÃŒ]LÅgÌý³½îΖ¹@G¤YFþ&nv‘’/¯±´+0G2Àâ´¼™äï,vuî-Aë¡È×:®$Áe¢‡‰¯oBžð¸ÜŽZ ¶Ì³wŽÔzš®»v´dèTì%/âÐá€~5;Îüò¥-#ª ~ô‡C¢~‹¿ÛÕâÍ&üqe³BúÑÒ¡Û¶›j+;a#H…yÝ» Ɖp€ÈTPç=®„Ù bͧ;o±g¿~Ç:žzºz:NåÒ#0Cøí“w-Ö¸ßÚ·¬Ë˜m¼Ðïg{„güyÕŽ)_vº¶XÇ%ݼ¬@Þ0bÛ²dÜLpKÕ„að…XZmÃ×O¸ëÌë¾¥øÛZ÷XÞh‘º65.HE¬vûwÝåÓÝÚnΪfêÌîŒÎïhQ‡rîüé¯ëùùcƒâá…Ý7r¿¯É~c »ï%)¡KöÁÄj"àÑ¢†©-äÛ[AKuTð?Vö t«ï0˜ïÊS}%sEoSz;Ã0OÌr#* ÄÌòŸOÎ_Ìæ÷šýìkC]±J¢Œ$D§Â쾨yìÝ)œm?¾XOþá( ÅAHTÆÕŒ¢5/ Aˆ›9yvtUL%è« è¹ª“Uœ¼,T~ ÝrãY¯_< œƒbaþ±ÁùÁye¢Ý™tD*— ŽÑS¿Ë*Ë]ЮÜ){é<ºdpœC²•LVf]Ç$9Sœ ¹©Œº×)#Š[1G¨lÑhŒI)j0i±Qƒ¯ÐA±‘sC|†wrmLš®ä»#~ʘ"Å.AþéFÐ}f•™³nL_áÇEâôª›ja~[¤&ºµS^L¿¼šÒ3ÜyùU]oQ¦êO Bû µ×EØåFÅþúy«OçÑßEXŽÜYa×_ê ðÅïëùÍkãÁý…PÞ݈â³[cïàÉ:²A‚ƒá,d$†Ágóq³¡Þ Î0ÞñÍøÇNÉùïDˆ"¨E½(üÖ IDGUv&ˆ©˜ß0=Qœ¦Pa¿ÕÑDlèè@)¾fø®!T)žxz—ÐÞÃÿaîdÑì˜?¡Nè¢Ye»ª?GDþÕ ¸û4”ÕÐ P‚×õ~/Qg¬Ór—­Å*Ÿ”Æé¨+Ÿk”Q½5ÂH"*¤®8°%±®,%°ƒ°´[4B´(Ty(jª“U‡öYö*£¼›-FìHD\@µ¨:S_µ=8éžmNÒ>~õÉçöþwÑʇëî4ŒA÷%Qnñb£<òQ–lûwìóãÅh;%$áœ2z¸o×}>Þþ ¡¶¨§jNwÑ9{¼'޳ã~{oÐ3u<½<§? >Ð=9Ä‘G]{TLZޝ>~áªÑœtuÑþ¿gj´l-Ro¢?œRuð;#ç½v=_6qUÉç“ ‘†bÞ ‘ÐdY·ÄÎɲkÂv,Û&ö-Ü’Ð]öeÝÊ;¹®Ê½’ßxÜ€ìï.bÄw·zd+7x®î$¸ûÆž'ÏÙ|›$8TpS6TI2pr“'¿• ¥çÞͤvïq9]vY–ù= cŒžÖ.es|jÐ#Ì>'~¾»ñAqq·±PŒw¥Þ!Ç¿¡‹÷ÇiÍñ9˜þSùÎ@¬-e‰pÕ‘ï[޾r@Èès½uÃ~¹B@ÚáÝåiA¨Óç›–,`ËYÞáhU™Žÿœ ’ÄË^*©üu̶óÏÎóAæ°Ž†énÓøJ äà!Ž0"%ÿ?–À¬1¢×Ïéñ˜ ‰£cÈé ‹;7Ÿ¾u¨»W~»©ŸWuÞÅ7Áç5Èn ÙžÂГ”B(Áíxpb«8kHvwwfõÐFÃC3 †ÏKéÛþq};äò—ã#P¥†ÿ9ñŸ~SÕúxø¼ÂAÇQ µâ©>Ì“ßH÷•<—&¤‚ÜOÆ­Ôƒ-q½Žš‚1íÙ5a,Æ6ôT%VüѸ|É›YYt~\ÍÁ€" dùžªºlèY-±¡ #ä²>dµâ:¸Žcçªï±Y3ª6?`ý;ÞtuÐïK^vÒ–¬‚IgHJ—^ÈŸ„ÔÌõ yTÏNì`$ãv£óó–g°kÃkHèBˆÔyq%ë´•w_jDmP¤£#_…þ-_HQ´ÞÿNþïy”϶đp ?O(F¢KΠa•Qm€"3^" f3Ô×z"÷žÿ!xÔ슦·DuÈYû}Átº"<(› Žœ CÙ(I Æ‚:%{kC³…_ÅúX3ìþJê*«YöÌ·hçdóÙâ#ïú8pëo6õ×êáßÉPÙÖdk»6l†wúÀnÄIìîé‡|Ö™}¯]ò!}U¦˜xNS–uìsFÖQ 0±¦Ùh­×o&{®þqêüÿÈo?¸žSÐì,-gÝB(#©š…(šZóâ“bãÂðŒ:ÖȲ.6¢ “*BåU^ÉìE«¨ýåô¨Ï˜Ÿ¯bo õé;éÒès¤::Â8@`Š ‚ó\F Kâ8*¹MÏÝ/oæùݦٔá;0ôaÆÞvñß¿[Å™N™Ýîɦiœß>»oäÛ–wgJΦZe9žüïÆg´ püp²6|:–uâ{3·»ø’Ý¡Qûg-½¹z¢ }í9Wí§Ï1Jj´wq7MÛœ¨ÃE÷5ÄWâkïM­"dе¼¹ÆŽf9„•ØŠ2ðNdÄKº8ÊWK5,O3}U¾Æð>#·”~^þ,o<e—´;ÈÒJY>.òêÓÝ!¦m‰6åx¨)sÙîñÊÈ¢¹M‹:1µö±Ê"×_—}!¯‘1Ü®)¯™Bþ-æèÈD¯ÓbrB:ÎP²-BFmç/+mÕ^Ø«1W ‚Oi£ 6@Ó7Ùq­¯Œ"Â) ŒíR.õVÈ¡"gÅÀ,a’?T :#œBÌ:Ü­sÇåæö û¾}n= ßâàÖµÒö#Pf?võÂMDA _hXvé…0"ןÔÉ#^Â# ’|³Èï® ˆÞo.òpFëú'¹ÚŸËUõëW£“ûCˆ¦p”ÇW,Þêµ ^¿Çª tvG¦ó­©âÔdÖjÆTÄ×9çÓÌåUÈDø¾/«:ßÚt°ªÆ<< }GÚZŠkSWx Ê0¿H€ðÒnB6 ¡Á…ç¼¶t;vuÒ@}õwP©|aˆ “¬ž¼‡\+Zü tgŸPêÅD ‰ƒòüGlòWñ <1×ìy¨Cé0Ðå_&@óµX2A@„8tG@íØ0)Õri¹ŠÜüh¯¿C^ly3¯ª—Ñp\o>Çô¿KPùä âDè0B:6b £*(Ó \ɨ÷>î¯æòÕsÀQëç‘¡ÂLÚƾN!.„CÜj“+P¡°áh !4Ênñ|…ÅJJž+üûºS~ƈ¶¿húÒáðÈ>qKŸŽ éY΃ŠlBp‰ Gˆðr2®ÐÔµôúp"V¾:öß»>öö9"½Î{h£ª>ùû\ü­‚8YáÖÒïð!¨?§Bía ÏŸžù`È“­fÐHø@å|Ïd&‰Õ=Ǥ†Ž¾ÂÙtº,ëÓó½ý©fˆ‡ŸPè‹õ #¢+}ýû#Ã¥â4‡gLé{0ôŽ—8ÀôóˆÑ<:èêê飑<Üýµ–2 ÄÌâøg2^FG¸ÅÖÅ2¡‘ÍуpÔ2¯­å4š06´Wû¸û!`BÞÈ‚×áܵ¼}¹ã´û@ö.q)‘(/³¯:ùKN*vÍîÇÚ‡í4t½@Š7ÔäÛPf"áäJÁ¸vbèÅ78>ë¶b‡-ôs+„¥ c ézãh¯‡+¹µu{®ÌÊ=ÐØÁPFM“²[X«6IQ+lx+:'3¯Î¼#¾õîD(³X¡ HÑס–—Fjå§d•ÂcŽù!ƒ·W%¦ÌY›ÚÃf[ »ªÕó‰„Â*îJm¦‘*Ž¡hAA:1‹rß ¹“U¾[ÿÇ~ÐÖ´ß®ÕfÊJwI²Ö¬-™ª‹Êî9Æãró…JK®D¦ Abe¨ƒç¢¦º6ê _1Cž§Ã.«—R* KÈ1y°Åb1JC·"¤ÆìdIL‘A²£ÑÕ“-…I°¦a“ü\’&j5dv@£R¤SP¸ ÔÍY¢[ýö3Þ«ä­÷Û@%ú@*5O^füBÄ©(§j%í&*®nØ_ØŠÕ5÷Z‡žï1½Ë™§7XÏ›ë|nmm24ÑN\0ÁÆOŒC ;%3Lο¼ÅÖÔ@´"dÕÞÆ ÖÔ#ááÔ‘Ù>UÔ1&Šk7‡·;öÂào\¨Ä½±“ã0 –«ïàÙHŠ÷®ÿbY%¯Æðc\ÉÕl\8†5ÔÖRM­’‘gM ä€7Š´hÌLùœšxèáËV/?PÂQçM%QážÆ<ÉZmD'–]‘ ]{HIªs!5Ü‘ãäjYîû˜«|÷³ KtºÜn*év%ijX}¼XÛM¦¬ÂJOÁÒ š¼hyÔ |©´ XwÄÏ](t¿®\q¢ Ó®‰\¤:Va×Xæ–’B&í(­k¬wJìæÂQU 2ж˜B+ö^´ÈÑ}­ëÁÝr¶R¶,å-®ÞŒÖ~8v(%ÖbÅ-”­¸*±‚J\sp-™¼{Þ2Ïi^¶¹„7ªŠæ¸ ˆBšýœó ’leªi,yÞîNª¥Dí¢þÒÉZ©Ÿ›×¬ â’Îø€²"Í‘2w½Îì"˜§«6g¢röfÂt‡­×.¶v°D3â®»^ïdÒ(°Ò[)Æ*wuÏ&2dPÛŠÜH¸aÝ2•§8†É²6Ô;bÐø£Ñ­ª'“RTu̙ʊ¨&ž*…ûwïzÁ™l×.á›å1{må7<Ì[ÝU%¨¼º,}¢êÿA÷ú¸ýÉo׎o•O±êüµ~/óSØöJÈ@s}ºÐßYj æñîlôÍÛxLÃ*!5¾p=}ç½éÊâ*&Í0 íò‹ü-]aáø*ÆDþ×b9ô¨*÷ƒ&['òÁ¯»ôºe;1g˜ÇQŠòn“šõ®q¬ `e%Éfcû÷` é:Þ€ ‚(ŠMÏj|‡¹»Â!qÛ2ùà³a4ó§•›ýˆâYŠ#Çh—¾²ð7’8A$ãIªÅŸ.Æ=Žqîìœu†·Dçnâ-D›¡6ŽZI¶Åj Á,¤£_©–B ¬Ë®_gV$áD”gú˜z"GLô‡gÊè;•"¯¹ÈOîO~½±|ërØ3%D„¡&L”#èäuº£ÈòqÕþ:Š7VÓ‰ h¿·aX­4ÓCÆ ¡‘7$HCñ’ÝJÂäB¶Û§p† ÆêÐ&ýrñV"Žª*69A)…™2Q½æ+êÿºåg#‘°¡DÔ‚qŸCi+ù-$‘Éðöb·ê ´¬œ;tÒ¨žwöó¹Òšrµ]Ã!yf¤[³|Ì™·–¨äO|s8äR#Å$EHçÏ"½Ü@¿yÓ]]ÄÝÕ˜¸ž¼ýçä|9\ê}Ä%ʸHX’TͼB­mÔ–!«Ï©˜Ç©¦"1>ÝNÁŽ ^}ÞWП:à“IZáƒÑGŠÅ)8Q:ê¼ë¬7ËÕ•)v¢tÛª¨¥Ö'œÚÕ+—«z© S2–¬k¯-\^»˜•Ê¡ØB_”áUÖMXýˆ6^ó^NpÌ÷k;\¶÷±¼â!gg{ÞáÕGŽ8Â3<÷1” ö¥%#²P´Û,wqtÂá›’"«WЏâ^2äûk"߹Ĵó^¾} «¥ç[ûzùÕT”ƒÞ²Ú Œ5 –4¢¿Èõõ`—ñÑ•õÌÅÄÄÌn4’‡ƒ%±*±AqÓJä»’çšñ3TI!hçó$±ÊI‰äu?]~#Þ5Á\žÜ·ó¿×x¿g°õ­ÒE@•ߪ!Cê~"Õc®Öøõ9ÔËæÂÙHÔ<\¤º 6V‡G_‡óÌC‘r)(š÷Ù7ô˜Á™l¸UPãœæajîÐ^Y§s:s‡²Ⱥ¯{%Çjýmί,—ˆOˆÖ¯9Ü‘DÒêde|p«äwðUáë¸ëÙJ% ¸:‹‹óðeñð%«¨Ìaùc¯ÓÔóSI»ºÃ;føCoÃYOg–ÞP櫾¼s\f!²dÃHqžª¶îyX­lë^œZ²(ŽÈ·0ßžïÐÕ•ÒáYë‹JÐô…~]Çç÷™Ã$k³„k¢(êaŽ è³ž#"¨³8ÜJºDÌ1<’à UqîM;<Ì® ^¯8ø2·ÇaÆ"\óŒ*¨èÜžƒ¾Ì«%×½¹äiÆë:Qò÷zY2AYö{PÖÆï·Ëë¹ÒºûÙÂÊààhðëÆÏ.êÜÏ]½‚ǪÅí¾$±@ØBôyûËë @2ò¶Lñ—0‹‡Ÿ=„c;y;6l©+U16#¬ÀIï9Ü;Ïà®ÎE~P„ ÞXqÇ‘**,ÁÇÖ¦:»3îvèÆ9报(UQ-¤bÁuÆøÃž’£Ó.rÞ^>÷›Ëba'¤¡FúÞÞI½µËe¹X1d:–#*Ê=®ÜÄ$%RYd°˜,KˆNÙé¯V;˽P1NZˆ¶²óòÎ'Rw·*DˆFIJ$@‰‹n¬¬âT©FrØ%g¥ßß“:Ídï´Ïˆ.'¨™ç.Ý8Úˆt°½p›¾r:gRtƒB‡]qC™*EF' ´Z…ÿnÄ“&™ô«²«½ÔÕ†ÊZ×|¥zƒÓBfª]~­Xˆ¦_¯;¼¿;ÝfðµgsÛtmQO‡RT$@'h`7D mD–Â@*³ÞíÇ®ŸP!ìÄZ‰ âÚX™×ï#šTyéNÑ×ÞwÅ#KÅÿGœ¾1(!f ÔŽ£ÆºÄ-Æ¥ªÄ5Ã'V[þçTùÎ=•PY„¯ñgåñ÷gPÖ ‰!àAÉòN³©;»Ç´R².ê4O¥ 3å@a‚¹Uk9æGó'#¼ZðñÔ—¸Zð½íYï󽇠=SŽÕ ¼QÓ݆ÛÆžü™^Ó¶+ʳ¯V¤ˆÄûæØÏ adl‚C z@ï¾¢qˆlìú í@ðg ìt¦+Éë? ž¹ºN7¡ÞŽÌÀ”ÍÝ· Ù„¤·í$‡ÂI/ãN 0“o;àý.qæµ×~³^Ø®Þþ{îq?ÛKcÿcxIy‰¤4_Ûÿd®Î†^‘mPYY4Ñ®§eÑÝïBÃ4ă(Šâ¼PdW‡ ³ÃÖÍ÷Ä<¦â¼0­è´áÛÚë""F:ùˆ ?Ó< _ž˜ÖÎòý®È ;:Öñk­:Þg=™Ÿôt$æûÑ×§@a“ËŽ“Üü%FÌ; ‡S fÎÍŸ6€~1{Ê‚8u”†úµôü;<ö>뵸7sº`Nì-›²ÓkƵÇ<טanS³9C ¦eíÆÅáÙ:}§pΓ— ì뿟>1ƃ†vg]T 3,Åï§ÂN“)¦u0·ÉõêÎ…ð†@ÙW¨FžL #Ò$'q)]ᶨ<»`Ýåë»–ÙÊlÎÑ•¡“à½ïã M pê’Ú>!©P“ÍA’ä\:¢ï7¨ï—Þµ‡õØXŒ¬-0„jî©@% éÏ­+¤º{v¸-ÈŸ;ÇOÂ5DpÆòk&ÇR/viaè÷ˆÇ÷íߌ@߸ž}ò5ðºC„k‡fO¯¶¦ïÉÜÑ#gG‡³7Ïj;&û×…C]¹óŒ²e mVθ¢†å 6pöu©Ê L¡^ü©åIíÀg^·tÜM®ÕçžýgL›0î^å™O uïÏ`YÖ¯Õ¬:ß©‘Daוó¨«ìZ#„pÙ4Ã|Ö¶ñÛÊcÆúÀRtž‰Ãl݆PãUvÍ™ ³Yvg”Ù&ìÏjÝ2ìÏD´X_š3æ©1ÚƒL¾:ß|†Ê›ŒÙ†éá‡+‹õ„\ßÇ+z²"–.ïÄä쮤¯.´Í襟$j,ãõE(2z“&ý§«äžÄj¾„4CA”/¡ñj㤵µÜ* ^M<:èëSvL¡Ãâ¼öó“t7CI»;3/*ëµmãnG$à †Ç–Òh{:N S8fÛ÷ÛlÉÃÜJ|!–kn9Ï=oÎEã}QÊi Kg”ÉQ—îý9ZŸ‡\:j`üó ö'FüDò‡èe‡¥Ñϧ§'' 肜¡è™K:äµã¸@QáУð÷¥„Ok#‘ ¸Úò›¾Œ–Ï_“&ÍM™<»&Ùz£«Å¯7‡wâ Aª¾—=}GU ºöœ0HˆýîÊ£眾ývpÅ~*:8Ã5Ÿæn÷Ûσ4>®Èð†gÄA´0‘dyŵÒýJÒ[s™â’î ²\_ Ï1=Ô2ûºˆˆe‘¬ÖIîÔ–ï Âï©ö¥šÜŒä|#ÌQjŸÉ}òþYì²;„$‚Cy'2Ó­… Åˆ¯Åˆ¥¸ÿ0˜–£õQê9ˆkÔ¨è3æëBéh}…“P6t*~Ǭ,pîÉá7f™¯4sæ÷·k]êÒÐÏ N5G” ú¬Ž¡i/Õ¡dYÑ´(²»ç½™–x{*pÉžúÎ$ÓåÙL›yâÃ[TzñÛŒí„Çl$Ùé鑿Œ°ëgƒ%ù¨(a›xípÒMü×Hn›³H§†xO)å6ñA^|Ú¬±^޶<;©è-zFµ€B{»v*@ª ›$ñÅHež*… !ÂwMÙÓÓhZAm÷÷öÞˆà>;"HÂÒ,?| ⛩۾¦¤¢.nªDÉ6;BFxYûi¶^&À-²Á¶KÛïí¯'¿19‰ö¢jo{3Ö7›;º‰›²èÑQˆ9ëªñA¨~|99õ§Äq¶uê%2lÃÊ’b±·“’a ’r†ÉÂM&é<;²«‹&S²jÍà ”+«ãOñÄW?P~ñ•ÅA÷’ s®ªÐZI2™g„6GŒ_˜Ù'HnÃÆ¨ÔqÒ+ªœ¸³+UŽìgê?P']x|g½jIÙéÒCIºãÁƒHi”ÒC”ïé½Àôã‹ ÐßÎq€Qdj4˜HaÂà￳ۊÞB«Ñ°ìžˆn&éè„ÐÃtùóÖ;s±º p†É[Ðe†è²UÐi yçÏo%ù¢e‡HRx£²„oÏ8˜ïÕÊOÐK`c~ÖL–Wu!«:Ђ kӠάyÍœ¼ï«Ü|Ù›’ò’†§‚G–…æxZÁJBXL²ÆÛ6´P¶Ríò嬽æZn®ðÆKV¡Eø<ÃÂ))¦CnöcÆ·Øß½$ð“d›‰å“t7Cºp‡]ÙD7Ü© ÑÞŒ¤á ¤ç¬vñ×~zâ% (LsP. fmÆ…vUíë¨÷v²Ìxí³®Î\2ãM9ºÑ‹o+5Âfåmwu”͘“)›„ º°v¥Ízex”¥a…&ëÞä³{3Wæhæ Ð<Þg öQLYá»3Û<Œñh}î´»Z9µÓ,ç¨èÃÌé{F<ÉÞ<0û*òK¨È ˜}lÙÈyóðÞ\N,7‹Ì33»ÜHsÚµûß<Î|"©y*ÖöO5¬Ê0"üWWØÐÒ·–ÂMˆ“,‚mÈUuýÇbz•v¤I-MÆwv,ƒaÝÝëØbÙ­ß!®»äÃx–7j:•xÈNèÂòæìÞ<Ó<×]ÍÄwžÐ Är%â×Zy–>îⲤtò$ÊȹŽÂMñ (ó( qiÐ|Xoo3}unõ½žØ:Ÿ;âÙ wž¥P ¾Ggcð}‡7"UkòÓí{­§åºx¤Síì²åìä.Z7Ë6ZÕòº”›-CÉ\õììà¢óÁc¥âö¯(1ЮZcã„bq>ñ^CVÙúÆà!½³r¾\ „h£¿#ûÂÔµMÒø¼ûøü0è÷‡q ·¢A!Eîo©y}ƒ¾ÉszA¾Ë[sÒ˜ÞolûŠÅ³¼õ–OD%[žôeP{̵¥¥ ÷ë>õöe–+yQð=I)ãOT‚øìh¡ùÚk‰*ÝdVG”¯M1®{i.8Y÷Ò›¢ß “w½~â÷‰Öé\¬ç9’ïçžžvº7ÃÏãõë®dö–§´Ûq!Àú„©Ç£¦éŽòä¸'n ¤cD#Ã\JÇB¤^1$Jm1?o.°Æ¢i2>˜Џ´5õ™†GØš’{“×õòÔÓ8£~dŽÒa¤c®ù\æxv£!Ãua³\JJ“Š»{–ëHIMÇeK9Uhu’Ö §ž¦XÌùg)Qf<-¥b"G°Š¿¨zóÌ>deìŸWÓyG6Â`è Y®& g7í@WiX%H¨e¶ÒPm Bþ]¬øiaíæaÎ{§}]K•ÂbèìR˜`Éã§fÅâ_P½­Šgƒi$ÏÔ} ¯Q­¶ýû8íü'Ö—žÌžïÌ­Bã!R@¢‡ЫÒÝ@]DE£ía[m¿µçüúLH‘÷Zµ-j"'“âÊÚ3 >eЫ›ÌW™™3ȲßB¥9¬ ¶iñÊprÁb”·Ùj™á–°³B¬`Sý—îôÛ§ìð!û³ê~ÑȨ Ì ]RÑ܈…Eeìì z”æë a76糊œ…ímñºÿ)Ýù)9ï‹Lˆ¡ßlAÕf±•΃¿€Í7J)Tð™%ÓUÓšuªòà>¹ñ` ™kÈÿCÕöŽ8}¯»Ù (àŒË5Šï?´¹k®…:2à9 ³•Å*:È›Xÿú¸@ŽÃßž«5¿.þ/©¨²¼ Æ;m-2ÔwY·‹"¨±T·c. Æ86˜Ý<¬dT‹L;÷Éôc#}TÑ×Cê"¨c"‚BBTäˆêñ}K&¾‹ˆµK¯PM71lVÜæw™R³Ý¼N1rÕž»ãrn *ÎYg1–ž}~Þã“éÁ…‰ª¸Ü²EâéZªä Uul§l(ó$bĽ¶^ňŒ±4.ö×÷9Ž«U#Š˜Ø•Æ£ÝsëoІÑêG**¯D4kô…>s†% ,‹3Ýw÷km vD‘Øç"¦B¤Ñ¿™÷¬ñ3P¹ù-RAñ®šñÁUP¥ÃáŒçü0ˆÕaÄx,VFqú¸<Ê•[®­ŠõUb’_a9ó~³’ïÎï¿´Û[éÙìµ}Y"Ь‘BH[¶µ±Ðf4&È„¤¥EÑÙ¶º² ù¬ÃëK³_qá÷´ê%ïIæ´Xލ(FIx²Â`Û½‰Ô‚µ$2ªLyS1Ì­Dlw»zËç/ìÝÏ@–¸!RæLù†­SUÈ G,Âagf"ïB‹*ÂÆ FNËZhî÷v«î¸2àˆ!¦$çÆU6„pF1˺ّ–6ë󘬠L×ïºF¤T#t€@ø}}YbF!唼Á„K ó¹Hn¶Ù•3·R"¢+í>o·nf”…_wL½ÆüüßïƒØ#¨F5׋Cg\©ê[;ñYL{T8ÚÓBha³-=ÛU¡­À<¥öj„ï'¿Ÿq?zu!tµÐh4UóvÌZþ Ö1×{¾;-V)ñ•œ`íÁ×éÐÒ€=!¬òüÎèÈp)ˆ„9ÌýŸ §ÍŸ©ó_•—‘_´„0FØ‚¢ZÄ¡‘`0`ˆ™R‹ÎhÍäÒVÊ³Š¿”¶$`ÙÒ¶,D²ˆÏá«@¨•mÔ1•ÝOã ¾}|àó‚A@ {÷ BÍÏ« Yû–Ïö¥MÓý—’“hòŠ2™éª6„&8nmù¸ •íQ1)ºèG.9ùyz×^€Žn$7GÎî¶¾LÃÝÃ/¯÷ð+tZ2·ë—4†3‹ 'Iê&RÃÇ^=4a)Ê"o½´ôN<ÙçXšM»âáÙ ¤å4à ¤nuÞˆt€³lÐgTmâ€ì×l›$Ra‡¯n{8¼ìá8Be&XHcm[ÏnÆnž6£º„!±>(ˆ ÷Þêb áŽmáRMÍÎVܨ¢= ˜¹Ø{­·(°ÞÓVìýØÔ^múZã j ÷úåê»g,\þkuîêjgÛ† 0P¸2±5b7;)8ÞåFÔ(Ü¥€æ‹ìo—«œµv7o‡< i»Z $cÛç›·ÅG‹ÎŒóš×$ÇÈÇ í)ß"påØV®(ÆТfšŠ[1«], »Õ^;‹ýî»æ6~Ïsè²9Šn.ÅZöë{–®¨î T^¬“a¼ï¼wιÕ#ý¨æR²(,k¿:5‘*‹ï}{õf•X#Š”µBVÒèe(Š-""Üë«ÒU……MŒB¹/&M¸Dz¹brv;šA‹–64:I"ÔÕ–5@`šf¨ (ÃRæd `²b¥`HB‹Jj­V„(Íþ>a°'Yˆ+¹k©Â»—J(y¿øþ~ówøIø<™dv€Â42!HB™! êŽþ±Ûl>=ñ,sXK<Á¶ ØÏˆÍ]ªª€ FY{É¡¦ÆECEr3ýAŠ’÷ûß®öóçp÷ÃÌÉß¿zçã)t;êù©–sòXzÐ4_ÈLm“¾¹ÐB`—ññ)›k $…®BzÙ)Ü:À ¡„7MкqÍ:re@‡ÔEþoïß?VüïzÐGXt y¦ÃcÒ ~…©Ç D³¨¤å°Î¡öÞ¾Jt ß±Fxü¹ãÇÝ™bÉê3 íó(íQ|þ~Ò³´aøËAžuÊ»=pNR KTs^lá6ô¨m­_ ʆy¢™Žº›‡åUµ0.KFU(¬ýМ” Ä çˆ†*˜Ã{’µS\ÞJ38jÍFëÙ!²€óêÐÙV^qFfUYsZQ“þsdpßd5¤(Ó 4‰‡?KE“Û ã1V7¾³îd­— F! Y¢9®rà•™òÒCÀ®£Å vª¨"¡N€ÙÝxM½FâY…Øj°T2*õ‰TjmÑf¶/Y[Uj˜e°‡<Ó2˜°KzoÏ’ñÕÏ)ªØãÏŠ%§d vã¾j&¸:ÌÃ3IÖ©N¾ùÎ "& BÑ!»w¬ÈV(¾wÖ¨é oHÈ3‰®Þ=hA:Õ•À°w5ꛤ.·Yub+Dj*1ŸÁú¢S»ƒƒ2𪯫®ù‡œÊmn‹0)EPTîEª+â@¢‡ÎH;[Ý÷T6jgHYµne´ˆ*¢Žní”qZ(]Ø/ŒÇl]˜íF61¶. Ý$*$$0šÐ @…Ë{Ls«’¯3*n‰¼Ì=Ð#B¼UG©‹²»<¼ùWæÔNþù)%ª¸ƒåé¢0óêä¯"õTQö„üýüëuîºÖ†këÏŸJèCý‘»•×ǧ7SuÚ'"YªæØT™1ˆHˆ>-•>þTtw ]º»¸%ºåFoÅ}ߣ]OBL%Ù‹àšŠè¤A˜B5jIl(~Ê5^‘fRö IáÛ}¸…〩B÷òÿ;ü|yf(xŽ„5çµ ­QÔÏØvâ1UMÔ¹»¥EVš›Þ_v«>kÏŸ~rÇ$0Üo]Ü…ùWùó‘{DßÍx#ÎÍü€N®ÎEþþ;5$VDåDT6×õ—‰—‚»)ÿ7#² ‚"?"æ[·Vì‹33Þ9Õr¾àóòŽ´z#ÎàòƆ»¶é…Z::h=4o˜–$“ú!Ñ„ŒA›ßÙð¾"Qe“|n8ÐØ¤ý„9mµ¦9 ¸` :‚ð"ê¸ù|»G;¹0¥äYgÂ;޵\ÍÍÃGaõ4&ŠHX5áP*w~%æÜMb b–˜ÜÛÞ^᥋Kqn®Ý·X…íÎ’<«%]¾;¸T»æÌñ—Âÿ¨q_}ô&QñÖöé­l>[fnüËÏMnyc$û;œ´Îì[Ö«hAé ?N¤ø¹Ô·Äb*†º Í†1/{2ÝP%TŽgŒFþ}Š£—ò öCäT‡çØÝï…hˆoúµgµóÊš#(Ã,&Zû2¡È™ Ú’Ò…êå'eîr9 ò°=T5K÷ß‚¹×c¥Þ.;kNƒÒ \KQH£¹’ ƒûýû»Ô5 †2,vséþrŸõŽ)L^ yüܱO¦Åù×S!éõX¢»¥–uóÜ|ØÜ™}ÆÍ]H‚ñ»=LÁ0IÛmû0#2*Ìï©(G”Tòüìzl)"Õf¬äï Âê_¨Èý3?‘ª¨ ²×¯$9“WÉŸlá蘧¸´Ùá’U[¾:7¢|²Ê6íõ“Põcï•ìŒwÎ@÷þŸ×ÔìFÞ(_Š·"—쾜ihÔ2}qá|„zSö:꺑qujœþýý–&×f?…Î ä“ÞIP…ÔJ¨÷<åhFС~Äú¤Ž³¯$GOÄAsà|©ûe›’¶}]wz%‘‰ƒn«"ÿ_]äP¢±D³n:_á 9 ˆ/S›€ J ÿ|„­ÞÐUÙæäQøm¨ÌÛçrG#©á'ÈE>óg»Ö(4v²5EΗá³Y!Ú‹Qi©ËÈ•à̤gô 4 1–ãWéFårO¼|ß»(Ìè¹á¹—Èj|øúLmÃåÚüó,ZM~ Ê=ÆûyÊä~=–ó™ <Ô½ÖéZ1^TmK¨5»Å,}>FïØ«jo̱߯³-‡\Ä-úŽw‰z¸N}o~N·„féªÓ1rw^ÄY*!ÄÌzŸ\’£¨ºú8ïpƒ—«.–°Î¿ÊŽ÷Í`aèk­¥ÎJ+6ݸtèî;¿3ï@<½Õÿ/ب€K '­¦Sz #1”sÇRhظôýH~ëïP«Ž—ƒù_Ôÿ ð'ä¯m«Š¤ ª£ÜÈŸ¼Ð*¾@ ýT?jÒ…Eö QÏ;”J¾?Ò¹ž÷‡}Xhâ…È;þ`dþjϧÉ(a`dApL= ÚašJÁ×Îî6c°„•ÌOdµÔ8óÚŽºZ¨Ïêr:÷p)ŒóB–;nÍTxƒŸ„Ndž*"<£kã«óφGg]Ðö ˆñ9ík<ØõŽ5å|¦ß¢‚-LpTt…LD×·ûž‚„‘ÓðFª|Ô)¾ÄmÈG C›P ¬¸Ù±hSû‡ûø3ãvpŸ«OÏ¿ÎfG÷ÈÒÄàP‰•<+IÕŽÿ?1Žd3IÏ^ߌ_Ãé¯azL ^µØä˜›Í1Q^«çßõ_DÔŽK¸?Ïx-tï×29ðCxÙ"ãeö[þþÝðÜóm±µ¥}bÉ,¹ÝÕ̳EÜsÝÒCŸ)ŸÆúêEb €ÿ%¿•!·Sñý÷qöµø!CCBB?Äí©ò`itO÷Ì×wßôòöv¸+d ñ@À–¦þ†SG º f¤,c¦® Y­Ì@|î|& âëܨ’÷‚ƒ;zdûÀcî{aõ"¾,ž¾9ÉÚxŽ(ƒT·|­ÌÖ <Ž $F‡É[Á³§¥5’A­ƒkÅFnìÀ<D‘Óìv{M¥ƒ„¹Y@ãÃ×=¹×ÏÎëyo4ò&œð£|9,¾±É^û^ã¹eݺ7& ‹`* f=_]?Ð93ë;©Yµ“ù%Au޾ä{i-k ¨Ü<v ´ðŽ•okŒŒ‘þU‘*^`úЪæÞçcËÒ×óš=HŒÈ‘” W[¥ÅÚ ô îö‘ßîÂh±¸ƒýÔýb¿x.NxH’ ¿¬Nu¢‰Eá-¤Æ"údY~=Ø@˜*tÛ6XdQ‚ )Ú²$¬ÊŽR‰È›½§Kû¿Þùƒ¨¢:ìsë×w`añn0Í­ñ¸LOW7S5–¢i ÁeŠÊ' žr„êÒJåhÞ[ÔquõQó}ÇSÈ…òDww0_Ÿ(œ$ˆ¤бñL¾0ªTŸ:ùW4µvpUöè‰kAîš{šKå¡ryÙ&u4udaÄHíO>]lÿYu^>oNA™g |B "µåÌÄgŽ{寳å[Â-@]¸wÖlN„­)û3ö|ß\bžšî÷!(€l)ý.ÐÞ• ܇Úúƒ‹»–Kˆê^Ý »·;UÚµ–Ìfëhg|öõTóˆ¢yñC”$·"‰]ncªþÜÔûaÚç*dd!yïÕÞt´v¥KAë§ÊKçk"ÖŸgò:wc|ŽÛ¯ÙÕ1™YÅ;Ühb8D+j©a‰Lçù©/¼â;%^Î.¤J¥ݬ`ã&E¥ƒëĈ`TÉl4|8Ðb©þµùœ¦æð‚lZî˜ê{sŽÎÕŽØ÷è5xû4RFð¡¿lxŽæ:¾h2· ÊÞL( iÔã¸äAš3“4q¸öqG­Y âhÑ;™´-Ãä&¹2­??ßCü“Y¨³àˆ`竚-Û ¸q<È>ØøcÞÑ8G3Ó¿Y ª%4âtgc ]y»‡ÐÍÑ›°¢Î=ˆho-ÊË;Í¥Y³Dªuìþï6÷44ûR„Yì}À~\ ˜`@‹ÚÎ"Bü½_ôÎ8¯èûê UîÎÊE‹®ñÇ÷½}tßÄà úM]66¢qý«–‚O—z„ð€ÕS"«õ0ÌŽÖœš÷Õ7¾ÄcØØOÒ³Î<Ãsæî;ÓjÒœ~Ù2æ"›u_J§=Ï6dNíõ“…9±WBd.¡âÁßíйfoZ,Ä'1–$}ªwp¦5ôظ0yÒ(#E¢KĘ-½|B óu1²6w=N¾ò²&¹¡¸B {vnÿ‚ —Ïíu¨ê=Æû§ùÞ¢‰}ˆo“ñφ‚äw"èd¬s#‹ðXÞq!‰ÀÇǦ!>œ]DS§òɦ8Ф‰› ‘ŸQ)£¿›Ï9Ë—9r{ß#óíwövw×5ÑÑçlUÔ•R5+h$‘)Žr¤¾9£¢í2ÄšaÓøèš1¡ŸK–?>\¹ ëVJ¼°3˜»g™>³{#þY €Y’Ä@mÌ¿FĵB²PTàºîïã>H\W§9—XÐß냃…Ø*7„ßQác§²På¾#¸úcë1¿þUn{×|{Îoh‘»£Hež|ü¬ç7ù”*Š#»– @vHYu-»=¯ "‹6Å™ÁJÒÞ,ÆE<Õ(Å[9ßW×>»&ˆ™#}¨è0kŠv3Éüˆ“æÍÇÁO£Bs²™&˜•<ýlT‰É£¡¼ %‹Éžõ^œîs÷švžÓnfÜ]o¯Û!v<~ü~9E‹m@vá'Z Ð ûHcݸKjë*“6—=|©K[pU5|ndÊ*£™½Ú)o9¼¬E`!´Ä„ž.Ä©Yžo™¨J¡ô@‡8 £_Ì Ô®Ðº‰‘ۦ϶‰o¶Ê»ü>=ù¾ù0bïò¯m¤z¤ [åÍAÞÝäæêzo~vr!‡-Íb#¨j¸¸–ËÔbI#™pVÑ’|w5gÝäP¦ó,¬D¶¬†q“¹R²,a4‰k2àd«¼üL E&‚2‰ ¢ èu IÐ#¡ŒCŠWIl½ÝKÏ9CÍüâÕD{‰@…Xp^Rñv·MRöou”…ö«ˆlºrÚ¹˜ŽÝ(1S2cÏÔÃ͇®€r?·¡$Š(h¦c7"•T¶Œd£ÃGN5£|A0‘éF„‰å8!1^~_ÞçÝæÇè9ÅÜß\$T”»»«¬¯í»ü€ÎœÃ€ªTP‹®EÄN¤$ñ² Ù(Jsa^ßÓß-}p|GtÓ‚èo;ûË¢´¹ù1àì‚z h:ˆ—s,ÕŠž53ã­Dõ+šö?Ÿß¹ûÝ?Üž ÌÇO¾.Öãí*áZ§òÐEbé ^::ƒø GL¤S,ÔŽO ÜN=.îg>u;29q¢–Ëñ #yPsŒuÜòL%s7 îö×aûÎr¹OÅ Àê ™:ÑëAh x¥ÔŸ"DoÆÿ"ñÂ:ù¼ ìÄÌJY<¤þ<ˆ©ÌÉßóa2•­‚´„lŠa™6dò¬Ñ@‚ ¢ÿ3â}Ý' º È.bi y$YZµáŒQ ãÍR-ù•Ñmš…f\P¥¦ÌÜ‚r„'˜g»‚²rð᫼צköñ†p>ÃI˜0x àÿÑä\ÀÉ©oÏ´^3ÂU®æÊ6‘=ŸŽÈ9ÖhWÅ–2¢Ñ’ä˜"ÍÛåÂTgõñ¾ýÍ•F!ë×jwÆâîÈÅ1†0ßGaíCÏ•zLeéžgÆoQOŒ_‡Á!ëͺ‰ÉW7ýýý¯~ghø<Õ} ÛPš.Q««§38ÉÇä9Þö&(Gæ[Ùüáö_‹†Ú\¶~!RÆB¥fz·$ÖJ’Ĭ‘•'»ãs‰RZ[Û’­™XE‹„‰HÏVÏ«,õ{9%‚-°³,¹læËª#*!d(ßçw 8U[Y»m²Ì¬¢T["²‹7kVÚ‰Vç½—^þüÛ%š}@‰Í/a;#7ò÷Êσ^ŒbYl%³óöç!8Ê%HBKeQ=s¿\“±é`$ª±ªØâE:¬œ»µV‚Ø4‡kêN!?R#¯–Ùïçu|±Q}T¾ëWñuµruA£Å óæÉ-…i´)#¢ƒ›Ã1^oQK«BkΊåeÜ–%Éî'¦"÷ètÆÌP€¶·-ø• áÑŽâH³+ƒ™&ŠèÙ±ßf1ÕLLf^gSéïæÆù‡8º§A(1 ŠgŒ0¦1j|Z n#ÊŠŒÌÕc¶úÇ×õ­ŽZ Už#Œˆ[Z€Î˜M Nânn´ª§ª7v9žˆ<‘RZí2!©ÎželýÅ»¡ ñKOÃÜÏŸ+ófÎ 4ÖŒ$””ÊP*‚)…=ж)"ÅŠXÐ$Ž1ruép1’°öÐC…Ór…«}ÓVñeÜ>ŽÏæóñ÷½Æ¿4…kµÖq$´ë¸ù¿`$gj*[J w@$z¶¶— @p¬ç6Å4ý•s*'Ï~h<»]±Øn C]ÂÔŸbŸ²÷+Òòÿë™ìá…þ êµ šö5$?T—´W[U1‘×ù<ÿ+üÎÇêèÙÂú\2u4…ïÁþ7Ë6VÐc:{•=Hð‰ïqD2ÏÓ&‡@GaKù ‡à!MáþyL‘PToïçÅš>¹^,¤œ÷–¸0’®ú³*÷ß­³§0EZê=ФFjîl7u}¡¬a,A§ÄEê"ì,‡áP5zuu#>8î­ë÷€ç|Z9r¯¥º ÁºLÏŠ¯›»nœ;Iy:bd)ýXDäu÷¯£±Öú#!xŸIüçIܸ³gf}‰íÌa[œ©WK) 7ÎoŠù{4 ¼`Î{,ꡪ*x×ÊWèXgÌëÏ: cÎ÷Ü\3"ºZÜÍiÉìÙmB‚T#a®è³×ê2G¹à°¬Ø„r Q›3\»n+ÛÃ÷°dɶ<'©Úâç¶Î.EÅÃè#ë‰[ÆÕ¨ŠöêR-EW“±QëU¬N ÍÒœÂ$(d/‹~Ë®OÙ¿ˆl¶—¯¼w÷ÌÌR*'ÞöF]T7÷¯¹°eŠ•øÅÈ’5¶ÖO”Ϧ¾ó™<:®mD•°b,é }DoÏÃ&Î|]]úOª÷dË+„Ž&dˆ¬‰Ëʪ¬B1P@ FT>%ac!÷‹*¸D%è˜ÃÉ»ÞgÙû𬔔±1%QlàtuRÞM¿h}:©@, êpcò'æì³P‚'‚ù‹"¹¹¹&ý喆ŒÕÑHß'¯™ŸÜ’¬Æ+Ì“‚·ŽÄåuFu³¬Þ|ï8¦ÀR1𒇍¿ ã… dÞž7ê‚’.HUaôoµ[Œsö^Ч5E;<œ‚Rš'˜„CÎÙATï./ÄÁj¨ç89Q™Q»…2½ç3ÜÈ:®•íV}Û߈a‚9Ýz÷L^YÉTda êì G|ËÍ]ÑQú`Ì¥óSç:”ÆÎ·×"ˆØ€0•ÜÝ'Þ˜p—Ñbü2BÅ 2I/'”CÆ©Ž¢£Át! L%Ñ×/¬ù/hŠÈ¢0Ž¢7Û?;÷K‡¼Z'N yˆ&÷Äå/Ò"†L¨2ñIkGj}Y9‹žaH«›ó»MT;®O¤q“ejfÚ›š•¨Õ˜æ`08šã .BàrkoVÏUL£M<|÷¬4¥ItöQ¦mé¦ ’)ì!T† e?ö üŒ±„ +r1=m¶º?úûº¾ Àº÷ÆÖ¢‰ðà-7ŒUÝÒ˜îÒŠI®3fhÎLïTˆ''é‰nb¬†ä›OÌ•((ÅõþFrˆäS$ÍÀ2ñÛ1·ˆ5c Z¥ÊÕ²§O¢…ÑIö8É»ˆ(‡©‘|k@‰JÜ~¨C Eo{»Y’u&SñÈŒô¸2<‰Lï£õ Lú•"ãTü^.l»tÏ «0g€ÑUí¢ BÂ…MGiŠÖÞદé,c¾'O¼N6ýUï£C4}àmëF'k£ƒ*®h6ä:l¥ú-‚PO®#æ>ôÕÙCY²·‘´ÑWäÅE¼â¼Šh—³ç³±¡ž±Ër~#3ÎÙ)3³Ú7™´Œ¹½õ$$™ð/GAÌHåÒzø¹NLDY€ë$¼‰riÚ ³x6“ú5ˆ ÊT¼]ñ×FìdÚÀzà<ЖêŸlGÜ·lÿŠk‹O¥É)ÅÄÝt‹ç6­ˆ9`峪¡íÕØšâyϡأ[yßsáË«’‡’&öâ°r…4ow›C*Ra]Y}mjùÏBÑø¤P!Éìà4Nk¨Û]þWPE Á"ϳ»õè÷Z†Óâõ¾ â‰)ó 9RÙPsFxH©óšÜ[è;G¢ºò]ön…jÓgëÓªô=îõåRŒ)¼‹ç9çâÝG½Á7¼1ìwáÏù›œàõä§•‡˜ZvqØ%õID.7Ë}ªôâ;†¦E¯Ó01¹Œnpí¾oŽ2×–{'µœ‡ƒxË=€‡ÉÝìnìœn Õväš.f7ÝÇÜ|{ÜÁÍ!ušsÐèÞh/qç]rÅ \†cÀ®ö“ÅP±¥/²‰·F)k˜{ÉyÉt·½nû¹Y'tÖ÷8Q%¥øã{Îëµ~Îô*÷;/{H‰úÜF Žfª»º—Ÿ—¯s„°ìÌâËc±“ M¶ñô…ÍË·$qí>lÊj] ÊÌÌIšq^]ݘQA`CÛêƒ0ûF®òtL'ÙlªH·»Úœ;ÿâþ¢Åô8wB8O=dûµüdMª_/#WÖíãÝ”å3=׬\¼Öråc¼SÏ9ꆨüC*¡Ktœ¾è\¾ž]ØYg5K+PØ_grëÍûYeúÜm¯gš+ Â%>ßF§=;­;Êú··Ñ÷—A¾BL<^å^錃¾·†ÜÅP÷<µ×`.Í݃۠Fg`Ø\ÞCÂ5ëÊž%3ìì¾™ƒ–èZCÞ7½‹²ÕÕ`-3'?d ±Úœ½î·scw#/œô!q»: Àæ<©É€= ÞšúwrôÎÀmiî=nFO[|ݺÆ-P„’64”jÏJ6ôLQ˜aNÉê³¹A{Î"‘ꇱÇ ä{‚»Q$™¸¼ˆ°{º ¸+e¼Iîõg:ßLà7pÂsm<™ôwU#{Ï…·¥“wÁ–'V’d‹Ý³¹{œW.žZxy<IvÝC²’¯0a²gjöÕFæ2ˆ-X6¯em‚¼ˆd]{¯‰1x¾¢l,é@«ñ÷< TùGføsÞÏ.øÃª–s —¦s[0Õ›In.ÞÞ9û_>ÌSâJ˜½°èíÛ‚½‘Z-wtßHйi=º’)Þë–xqöI §|x’yn ˜ó'bÓ§ÆÒìÍöób<¤®…xˆì ŽS«œ¶%Þ–Žrœ{ã.‰3»;Ó?dGkNã#¹r+à kÉWd¥ùg?J»t©¾Ç*nmÂüÊšÕÑ!Ý‹¦dy;õŒ$üâ;‹Õ-ŽŸ9Š„—7ðöhH²¢qÅá½­‘˜|ë%Ãa1ò¶ú.ÇJÛܹˆ`,äØö&—XÍŽ£…é O8:!৷ľ³R]*(›ƒ]ô0¹2þ÷/'u¢M§)ª`à“yé<JD>?u€ûr.¦ú¼ár@Ä(ºj—`˜¶Âî¨Zˆ¯²yí>>óÕ@¶\ú¨<‘~“m™†c’ò“!¯½¦Ã5)²-"_Ž/:¸¥A«x®›n gµLMtF_În²ª©NÄA`Tã:Å£ 3Ðù1aJ0«DA‹:¯Åè°ÔÎHÕ0—ºBœÞè½–žr~,¨â³œ(w?7>3ä—±*åÑ<…î0“é4¢SJ_-‘žü‚ ~ï œ‰½+¨Ù¸¡×sî¢øG©sOLÓ}eÂ+V˜œ;´5nŠ{žs´g6À3jØÏ¦ ¨]7oè‚Fíˆ{Ofì‚KŽÇ²e5aGÇuž'¤ò uõ†;„"¾Õ‹ùÜ_øM‹ m÷×*ªJU)ï!>]ö‹Ì¸Úy)§i¶×šÈ*ƒ¯ˆ!:ÇaŒ·g}†w’=‡›3‰í{"j¨–ñ‡Ǽy¢À½èZDnßl¶Sz"È ƒz+Eœ(íÄžf¨k3b UÒhb:w$¼îQ˜o Ðé´˜üg…µÙN^ÔÎÂ<ÇŸ"¸µw§Êõ¾Ö®"4ňÝé`óù–S Rzû;¼°™ Œ1’2zÄUƒ3f¨ds‚ q qØÈ±½ yÀz¬KïY¨xg IÙ®ýãd½l!-ú Èñæ¿;Exʼnbð\[˜/µßZñk ³(Ê&=Ð’Ïšp”oäÏ\ØdAŽs¬?-äûÝçéikª%Côµ±ð=¾Q·´À½º,þ9Ð@áTÈðåiå(V¼Bx9cÝìÖ<Å;HÍÙÀYŠÎæÃˆ®ö¢BE¤ BkBàë2h&+z’-êú”Q—À“ŽQ¤²×œ „Ó­d¨÷yú—hêœ&,J‹ØBiƒk×)çÙß•¦Ôê0}šæÞC†ïD£µr@LxØ3 ùÂËE‚Ó¶”Ûâu,÷ñåÛïJýïË‹’êj¨ ܼ½ ˜©$Øüäð×k#hF‰H¢ Æ¢+m‘-%Ž3AýÞg|[ï>r*Æç]µîðÎ÷îê<µçSµA84‘Ö7Ù äjiåŒêsÅ4“go$È{ªtL!XÓŒÞëbãý…SzP!UG¾¯sÝ8Štª!ô(Öêº_ˆ§£±xê§JÝpf\-xóÆíé7Ä;N˜ÑÕTØéAn‚ÉK)*'u‘0 Uƒ@Œ&ÁŒ$n%Hå¼@ËP÷‘Á¸;{·ýÔ`Íõ{¾™Çƒ^aÍñÁî\õI=%÷geDŒÎÛÜÙX1C¸vóßc%Gq¥é¤g`}}— Ỽ.ܹ{!ªÒ}«$ŠY%ŠÝ½È¢±¡ŒÛ…[ƒ2ÿ£ñ…¥ze–èq-XaÌLû¼5ï„ÏK¥Küw²wÚ)g5/àQ 8KÍçö„Šõjò™c­Ä/àË…Èxð{S¡Y#‚r±^¦fr®0Ù{Öè‹iºâ«Õ缪wÉæï;·E“u{º³¼TÃÝe4SŸœßðå-kS=ëöiôä TÚ;‘4µú2f†âò`°§v*ˆ#ô• MÉu† v:k,u¢Y¯~u‘` )‘7cªÒX“Y[QËÝèëc¬iµÞï–Ó•h S1¥õ7=ÈäòäU¥µõ ¼…it\ûä’"uI>WÏ峌=ÂÅžÓ×( ¬r†!‡¦Iy¨ÊWö\–Ìñé}<žGr9°A o~~Îyäõé>øB׫ZÍ ]¿’>ÓJ«¿º®ÀR"gñ:´xë8£œ—q` +æèËÇŠÆó6(ÑNàrjë豿W.Â2†Ä|š‰(­uvNž’ŒÓÕ²æÝ·Äé ¼;ÕzÖN€H½t€€j1FI;¸‹‰“ÓœxÙjøLëÃÕHN:dúóß”müé*¢¡ˆOÙãü:¿ÛÍÐ&c»ê·5ŽéÝZU,»bc¾ºk=Ö¾€+}‹@w]B!Öâ‰äAÕTHì(‚;ÒÆ •-0$һƒ§³ù®¸AD|]gz"ü`$ò– u*C¤Š9÷#noNH›ÜopÛŠštñMÇìyßScPk‰G^h’¯z±bª¶L”¡ ÁZtjµTošØHmŒÕÐê¦`[„¾õ%“tPkM­+=˜hAË÷Þ¯«Â®ç‘¶ìt]†8­Îç'„ßo½$3‘Š"ŠÌ΢YŠôC(¦ÌÑëRa&ÙAT¼x­Ýwe&´$„*ˆÔ T|Q-ŒÉ¬Ë¿r¾ç߯÷Þýw¿Ä=ƒà‹ÝFʳ²Ÿè!K‚°¸(AêÙALù|OôdøãûðB4H;+äœË¼¬3Ý\¦R½G©ÍÁÕ”Ë]ÁGJYĈ dsókÌÞ'3ÕG³òº ’Gvö…Êeåa•m³ý{,óbnpþû^K¯ï¼'J¦…ÚHøh÷~¹>’F¥TþK÷w—S!²{RôRÚ÷´«Ñ‚v><®ëÚûV³ØGµž<öáÏ £y/`,z©ÝÖSêvƒAÈÄ7LvÕsP_[Ï…"QgTòŸŸWUMÙ.‘~‹‘H(ZrHì½Ê]Ý!å´Qf^i6ƒi"‹0þ¿¢Þ¯µ –MÌ3 ZZ@Š?W#Κ¨72ç9~…Ió"h¨îÍòî×áèz&¸uÕ=hƒ„A#„ \Vuı¥é bE»‰ÝÒM>eÝZä`‰y½+æÕo]ìtDR¤P!r?¶³®šk•C õ’~¿ã]oCq‘ÍÂâ!T$ZˆDtà4² >ÕVû<ãݼËâ¼ÄF:ÊQ¯lËÍ]æ†ôt”£ÂH* 35àp°äSp:ßW á6§ªàÃY™O7µIŸß“Kqó:@85'Ÿn;˜bcP >^fô(<X ;…â|ìÎFím¸ß’öx )‡)JI$ÑU½ûÙ‡±¬ùÎPÆž{FËE U*˜;Ÿsﶤ3 Q"å6êžwîøxxZãØá k†}4üƒ|–"ü+O.¢(¥J¨¥kù¶ÄÁÛ~'g!½ÑG..UR{`±sü7ù­Ï÷Øè„.@û9í§ÂÊj ÀsÚ""òƒÇÛ<úÎ.ú|^,ezák¬G…jªö#@‘q¡`uä19W.‹²”LCÁ|Éûõ¾gŸL¡Ù€¢‘T‹zÆš&‹.Ä’t˜Ï½Èe˜˜9¹‡½VOª," î¹0rÖ¢U©|èÒ" ´Þÿu?rwÏt¯TÕBxÞ(½f.䬡0³ZÕ˜Õ¿xÃ>n9CÑ0þ¯o~߬ÒÓÝwmkTÑŸêŠDãfí•öxÀÒ’vÒ˜v<K'å„nq6& Ÿ÷ ‡–(à$¼lËìEV¡¹#Y%'%¢'V¦f1…§‘‘¤DùtKî”ry‚=w3ONZgÚÞÑ )MÉ4py§š¦ïrß›»wš™æ?JwÔ®î¡_aó0ßöÅ—6õ^ Ĭ>À2£íÞ(pò 硟&Ö_W}‡QMá£dß ÷BÞM>%—^V©z•ؘ¢Çô‘3Ç¿_óÀˆ b]häïcüý¡÷áhWë©qSÖÞhu¹ $H›Ç[ËÚQÌ·ÝåN|ûúçœùê(õI-ÊEZ¤Á"V1ï{„/u©%lä«)€¤ ³¹ß˜Râ.TEUtcÁ‡~¥Îþ lø‡Eì”ô¡DþGÌóÅÊš°L¥½“}­ kÒË‹ú‡Ø´ù•Zˆ‚¶;‰­Ý kD~TäöÙ…ßÆéraï'µY¸®F[ÙÍÉ×sà½ÕA®áo7C©ÓqWt‰=—;ÚꪶgP®J2óÉìxPÖ‡ôù*v;õ¡ˆY o¥©OŠ‹SamßÊ«™«[=yœD*÷bc²Ï¾.þ®BîjªÇ‰€ÍÀö¹Ø‚˜8±ÁÑ(˜S-  ™0„•oŸÞ3^ÐëQ¥%½D:$9ü1¯Hrƒý0÷:Ž7Þ@s¿’þ⚙幑Åc';¸¡Ègc 45¨_¦ô5u©5(" 6¦b¹SÖaÌ8W̼8gª‡|àì™ç|D `¡m¼€5#q¡ª–¼z°ÌLjGitú¼˜ŽŽáÒp‹‡SPÅÜlAŸÌˆ[±¼b§CÏ,Q×GCòaåõËå!ÃÏmAê[(ò+äŽÚ)/:BENEÐÕ,ÑNÌŠb?ž£‚þAf¯ßo =…ÿizÀ"¨à¿Ô,›‡Ù£O-¼Yá='‘0P{WŽæ–R<÷w†ííÄù08òÇîdö¥ú·G°¿ÇñÞy þWÁýnûj„¶fJµ÷º…îöx+©;¢6s›zßZŠó;Ív"ú¯‘Ò.àsf‰Ç¸Û<;ÜN#Ä·_‡“·ZÍËj#wÝéüÛ(!6ÔuÜ}ó·Ä`±cZYû#¨¬å_ùûßâûù4xü3YbBþ=ºHÔ$ª”?Î-ˆˆ>þeÞ"e-¼R/æš;uá„"8bXæbZ Þ_õS*”†Hw8®ŒÐottRF-±Qx?›á39dè6Nó⹜Îi)ÝÃlÑö£'ng?­Q(M“osbšÜßÜJ¶ÉçTÀÁgÑ—Õ¸ïDÁ Ü (rC‚‘[T]úIÄápþ­3%ÁXà[TÛK¾I©5×Þ%¢€æk}Tð2†ß;±Þ¼_žGqëáJc¼ †}àr9Šv«~ÙÜs æ½ýÞ)Ãݳµ]T!$U*¥eÔ—ª¦FÄÅ”2KÍP9w©½z‡´`g’1QÊo9žÖE »Þå6ÀŠ1 Œ/᪶;«€ÇIƶºÃÈ{É5FMFÍ[¿Ù©Qö¸:2MÊž÷Ü/Ào)ùR~H¼’·ÖS²±'Æfã_¿‘¶) q!É4z¥ ËA-ÌÖ…ØþÐAâï`3äÖç¢`AÜ=ÄUW€á3v²ƒšéÃÔd¡v­Ü œXb¾@dsÎûÞÞÝ_7Qh‹•&G×]‰8ìîØ\áˆ]&Z‰”ê}Ã܇Yû­yîlâ?ã§ùáD:_(Tyìþé‰2{ìsq¿µ=ÂvEižÝoóäc#æ×ôç}Ih– <}Zù¦?~Îëû4ôÑLèt…hªU’ç—”/DH®_°BäK¢©Yõ³f*·ý¼¯ÏÑ×OçÁ@kð0ä€ßÈ$Kîx‘d(üïåZ"Ž]·ÓÜuí@Ã8µ×dÞ Ll¾B`©˜ápA…„ËË ðQë,G„[#÷Ø_uCÖSEÌÄλ3¹ ¾DË3Î+Œ 8@ü–Ïñ:‹Ä¶ëZè8QÙ6¶÷eáï&]ÒQtî½zöùûrï!5À6ÙÒ7Ry>ìá…‡Ïežz[ßô4ŒùŸ>ñ¥“ç>‰ä(a›ÄVèªv÷•˜„±ÆI¸Î`QàæÙ{ˆß.à ôÔ¹^þ[üñ|‹?Óßá Vð$OÖ4Éη¢hö”n4×½Á‚ßU¦yجBPŒ¬nÅý¯¼ !Dn‚V‚æþXEH²Mksn«y“¦ÈT3¬Í!½Ð rƒDì¬ õjóÉÜ<®ú3¥³NÄAðó\œ“;–YÜüÎæê$Þý(ªŠ@-h 7A@cGGÌé¼eç“9FÂjYÞ[4k§çËç[릵èÖâë¶ÄQú–Z¿½eä"äÏ“óîqŠâˆôõiòã³£Y8¥X|¡å-Æu Täß{îäŠ=µßJi ­¸n·}Þã#®îf¸áþz¯Yˆˆ«üþŽ˜˜ðø>!ì±.£ú`öhÔL]ÔÁ®ü¢a8é9åsç«/®¯¸Ø‚Ûô ¢;¸¦–ì)%ÿ¡×5¨“ê")!OÚéÍ{ë20¼ÉûZáÒ(†ŒhèÑùj‡P…‚Â4zÊ0f’Ÿ“SqbzRõ+ðC5¸r¼…ARô†üÀôÅbç+y1‘1 ™ÝùÑ9ç;€àª@à„€j~ÿ9ñdY†š;Ž™»4»Ë‰‹‚3K²œÿ\ˆù´^C-ÄÈÛ¥Iþi ú‹ eM¡ÙNñ8¼ëè|à7½ˆ1ó•u1<˜–1ù¹žþ|*u%úÈ!L˜åfø>ˆ&:®íY\4çïåÃÁÛ Ýý­(øè“ .ä5/A2µ:(ïÜ´Œpï•‚ Lš„¥xÈS¤åò>YöòSZ勤?ª:9{s½®ý6R;Ý2äíÝÕÃè@8hC=§!ÑÑz-ø…šxð÷AîÄï†BuCã=-óá7Ão¦}·|7±¤1?g­×“Û,DÔA8–Rñt…vô–üýÿnÿŸð/ò¿©ôTšÂ§?˜Û°Ý—6&ó }¦Æ>é_‡ŽŸ+uŽä ¼[Ó׸¾¯µN@“¤B:Ò"*‚%qƇg@j×L˜y53uJÞðL$~yœ·Ï™äîÎs´4 Ä6¢”ƒå×RIwM¢´b@ŽçÞ^Ù÷c r®ÎnUÇÌÊIÇÛ€Ë*Ô‰šqÁËP3µ†×\’(ä:ÁRF4‘ÜÄ{óú½÷|Íž²=î±Mû¼¤Â˜q橬¯ÚÍÁË‹‡ÐEˆŽ»"¯¥²(Ú¸ë.*£2o00ˆ±4£j±]5^ µg§ãï™b;·{“œCñç£Ä 6â /ÝK ¥Vޝm']4ÂzCÊjÊÑ¿ÏìàÀ!þ5ɦâþGþ“óK~?óVìK½Ž+Êù?oÌ­z5 :k„vµ 'Ë>ñþ³ó·“J•Ö\¾å¢g4sŸ"“ä²”;¸jŽ®£îãñ}&÷kÓ%@]¸#HˆŽ-·”)5@Ð]jÜ¿©å ð ØÒIJý{ˆ¸ŸV§BH'@÷ä ûŸÎuËÞ]Ôªr黟bÿ¬àc¿²4Æ-€4H*Ðrß™A±JBì{/sì &±—e'O“"{ÈùÜqó9¸QïeA’”™ÎæFȆ¦h{+YHÐ(ŒJÍ7«hñI¯/áóßë¿ç}8gnØÁ>(€:튢)E¨J4w'ãã/íwh]š‡2ˆ› wMtvŽ¢4MäH†.‚s÷“÷8ï6¹YrøY7.f!ŠÄcžås÷G§ tÅêQ Ô…óŒu7Flü5-Êòâ–Ó±—¾ºÃö¢½Å³©¸ mÄþ˜=U" €ã<—B=Ú9 ÅMwÝ„£ïwÜ>¹ÜwÀçO_H’Nº ">m /X" `¿¶ÙŒ'’Ez€Wù…Qâ–3Øœâ†(Ž Á|ÙÓølj, #¬üÌ00kJígÀ™¬;dû{±MßΦ0ÓæmHw‘&á94''{ *£ÎñÁ327üY»’ù»¥r§L(0¬Ýprýż#Ë>ø-HñáíÃÏï…Ì÷ alÎQE®19W³ª/#—IûÞAQû’.MoÂvʉبy³7y4öwhÁ6þÃðäúKì)‰ÕæL ÓgÅ'ŸtŸ'ºH6‘I!¸%"[ß1”=ñý¥òÏñ߃¸žº?<µöVb¨EË¿íÑÊ¡¼C*ÂT‘>ÈÎ}ç Ð'¯žü¨(´":øÖ™MHHkC"¿£A–ŒW…yѪ¼¬´yŽ‘p·‘~~×Yòaß3®¿më¡>Ã9¸ÎбÌÊs…è{¸‚A2Vé|ÛøF:²jrv2h1uµý÷}O[;×Ìzù+ñV©·IüÛ’©ßaàŠB Ec«±E oÎ3Áìs°/Ÿ|zsCÇß‘3!?°¦„~s˜9Ìô`4µ­vGÀ@›@®²¢;2Pn€Sùûgû7ä™6ßc‹Îâ69ý÷¿ß©ISªØTØ™ºšˆm‘ÖÒÏÝÜäÐÅ-y“â3urSý½]Ÿïš‘«<é8ç@=ö|ˆÚW†ìdŠçHò¡çÄ¢‰÷î)‚7²/Ðwt5<~îâT'cܧƒmèâ ÜÎ_2ò÷F’fIcÊÞ8ßSÉÑ‘=–û€ˆ;&!)M?ÎnÄÖ¢OTà¬3Pª]<ºÿgÙ^²&àï߃¼L„H@cïÄÁ,ô1PM"v¦¨S+>Q„Gwd28HZ".úü7\ö{ùsÖi„œ÷÷Ï ¿ÎÑæö×­*ùÇãi6 ÌBàKÕ’f¾§xþ¿ÛO×¹VÖ'3ü8œl ~KüfäD,<D«3×;4æÿ°úïo²,jù°n¿¸îì5’|6•·–˸ߧ—,]ÖsÅXsǼ²ë×Ïw0È¡Ìvèéâw39úEº„ÚÈ]ž©âÑ]ËìBÈû.­žláÕLÿ’‡ôPH1ûá9v`]Ÿ¦$ÛNrš–íÓâì+©êŒýcfRÏïÓ°¥äÛË÷s׿&ÕÝÆLÄÅ;ÕM~øîAÞ´®QÎox²FöžÃ½ç{¡ò—]8–¶VàèC„©‘VYœ^©X)`¦X/t PQd(KŒ; h(ye o›Þ»ùÍç+Û¶KyúÛòñî3Ýœã÷¨íµWû( £Šª˜ªvZÖµ¤´yZÐ'B×~ÞdDM>ÔÉÁ,˜c§/«šy—†²ö-VEh‡ìÀµ¸2sT9Dšö#“ÃÕ-Ù®i¢"7МÝXIÄlœCÚEÄ¥>EIÔ×îë;ÏÞpÇ”3&]cD#MŸ‘6EP¼²Fħ†cÒdúcÂ$v|Þþõ°Ï’ŸnYªN¯¨ûîy ¯(F‰;4Ü"P*œñ÷ÝR²gi¼31ù]à}lÇXö&r8`‰”ȃçÊÈhî²\ÌÇ–7‰fÀˆŒäÀ60eåD4Âh(u‹ÅòùÑ2+Dí@Mºæ½yó*}#¨ÚÙ¼QâCyƒ&Ü™R+wAj`ºZꪚ?‰‘~öxêºú¹ž^Eœ×õ"'µ=ø¶Ã;ßæãL÷Oœ®‚e……>’¾vKó,°d«0“%˜2<ÀÂ*ÖÅ+LaÍ- ]Îá(Ê¥fN<àˆôÊ9ðƒ]¨ ‘ÏõÚDD˜ûÓûñaþýøô5òç;˜¼ã"éJ¿Áz6aŸ­¯‚HC+€Ìçr *NªÞæ- ;eÛ µZýQ¨3>EH þÛ `¾–È,ì[Y `ºY6‰&Äv3Tn‚×û*–¦†ÙËça@ˆ…I†a•=涘+@’Lô\®<¼£Jƒ´„›K) Ÿ#[½äz.`¥—` CÄl ¸yÓ+úf@çu™›j¦@`«êùBïs` „…ÈÖ‰ÙœŒ–}^‰#ºïd+UŒïߺÙ›W´è†IúÏ-Ôvp}Ó]~6·O /™=ÑϧáüxIIuta C~ØIlþ¡vçOzú½ÜæÈléºÈÎÎ*>äàvôˆî!—aLÏM~¼pXŽåÑÄòÞzªe¬]˜C߮ެÁaú¼ssÊ„" ä­^Ì''X¾ïJÞ…×YŒ`&†Jª£·¾ug''Øðþ dµmäôFÉý2ULw2ÀA 1 Šƒìw?yuØD" ô˜ÒÝáAnÜM]qU¢èU4Êœ1¥¨‰ûoB²JvˆbëÅh†Ö½¼ËÅÛÌÄúQV+Ké´`¹9–˜gô‡9#Ë™DxJfËÉœ‰ªÄÑFȘþÂãQU*§^pZ§¡ØOÐB°8ü›L]óÔ›Gã3S%©šgà™E…}‰^én¡ú¿XÕÚ¢/¸l®d aJšî‰ÝD! ‰#)¦=pZµ—'càW¡&²TXan}–3ˆÄkWDޝ!ÐJ-blŸ O×Só¦ˆD}H–2‡Ì£Ž‰ÄÔ4õë¶Ù‰+‘»L¯ÏšèòâŒæì­ljõj˜ù¤S=^›uPº¸uq‡‡‰Í©ÚÝv~LS„zhë³aô…X•eª•˱w]„ú.á}4ì@*Dô)òàÆî¥‹#)!4L±m´}j4˜h³»ÒXàa@ÞŠfdº`±˜©Ö`¨á ÊG‰¦O’êèƒë±¸R¥(vïvAíÜ’µ¨<¡œ.ÐKL}h¹£)_uY¬š˜ ¬+û¤ž­¼ì“wn1|¨ø4PûÏŠ¨©7ªÚxÀ6ªÐYÓ‰Þ?`0±ûÆ>Þ!_ ÛWžý³Y)™…Žç€&'Þå÷šÙ‰̤º©®Þ9¥^éÀ“•æý,˜© .K`lÞ·'²w+S}Uò°99Á£üЬÐn#ð·ê÷ÑÂQ\·H @Ÿ9G”fÁ–™fæ~¹™–‡ÇÚ ì Ș–f¿Pp¬‘;±‚Ë7’ ¡¡³™žµ 1Nîw&â£Z´*fxÒoB#Ò r£ªT¢l¤f·à+ÐPN /–Úø í+æ¼É[h¬Ë}mg⎭i9Ÿ±W<ÎÆ~)¬Ü%6|¦µ“•î¶·aB°Ž9ãç^SU#KÙ @Åó\@Ö~E‰$I4_+DÄm¿½çóS¤8O3é*”D‚f3Þz¬òt ´3W°‚ &B0 D·PMAÝÝTWÉÃ@Ï“^S¶ò€åÒ¼cö m̦"¢‘5««aÂô!»ØЯ½É&€ö“?Á7Ü`ÆÌó™­ŸÙt…™¤hIòûM{ix­oÀÒÅÐmÊ×ÍØàd/)®hÑE%ÞÝ{“œÂø½eëÒŸdœ÷z$Þái›=Ÿ“ʼ¿>¬èF[ óÉxd’ë¶oìäî{53ªeG4_ó9øq ·ÏT ÍÁ½ÇØ•4Ëìè.¿Ëh˜ü»¹“¼2$·ÈfW35Y®èð°ÍÁ¯OºƒGc(f’N✞¬Å}îQb4À«¶FY(ªç3VÞ“&žžyÓ»±Qϸ÷LÐv^ÌõÃ=„{dG4 "wvËpcÓÚ|rê7E Ë=´s…°·uÞ»hS$@Ë=Æ.VLß!wIÈv)pßsîròöùc|›³TäŸy]3ÂÛiµ«ä[Ã(ð ïgq5ë‚KÁÙqÊ¢¹éræQl1'£Ü·Þž’Ö8ö\v.W«:ÞV²ïqØzõ7³4ghØÃ¯¼²ohCÇìVe¤Ö¶00sKÜ'‹^¬`‘Í'fûEs;ŽkÝå¯ÅΚüÇj›r²i‰Çé;ÍoE={ “9kšqû8FÎÆ§³:\…nt·q®íÇêŠ Š:”Ý|:ò«–ƒ§1vmèŒ:Í«ÝÍÝÊfíÙ¥òíºû3µ,tr÷ Ïi ì(¾9¸¬™ä„¢^ï`‘&WÞçÞ=˜Æéhik¯tYÐvÏ= âV)¹µ÷œ‰[sZ@w1nò±êz*\Ÿ¨¼Å––´ñjß  ñ¨ô k™šQÏrBóç€xûŽëÞ­á{»–†{t—=3Qí¬%]•y^8›ØK™J(Ò9ˆg–‚mn6ÄÍ|CǹÂKZD˜F-ÑéåŒöä×Õº;Ý}NÂÉóÝÎ÷›V©ÒdÎöhVdÜ®¬ÞÛâì³¢™îT^.¤ÞÜ›q2Pî­#*!æf#Õ*ü’ÜŒûQ¬w¯·J8ÔJîÙ}Û*ÍÍBò=Œ1 3ÄòÞØ„Ý‚/ìü—wYÝÔ}KÏ»XôUs¤ñžÛ˜’P%¯:æ²zI#fŠõEìÞ:o®¯¬EÝsf,åpoM\Vö¦‚/wžÊÞ—fcž¬qÓÄMJ¥^o°lç½7Ùº@—ÏM=Ï&áF ž~„ õ.A|¸aÔåñ¢;•Ôò¶× Ð=Iꌌ œ:žJï´ðÎÐQx,é'+d«sd•µÀù”ù½7Ðv1 ÷n>ìåƒÌ'[Ôñ(_1‰&ƒ]‡†ûh¶ß5Um„µyN½8A–ŸÝ—Yñ=á½ì5ÛÛåÇ”¹z3]ƃ´=UÓguNtC«¶o{'ë‡*1œS˜Iu/YÛ[GÆôi²cêN¶ŽN3Ç€=«:ãØêFAé‰\ìh/UN@?Æ>9©õÏæ,‰L=T}K‹ ÷ž¦KÁoêqà<õBO‡{ÊÜy£hÌwãíqÂ,ãP…ì‰5÷§Âg–$—ÕµœSé:ØEЏ£òF@‹CñR¹°‘,Áåw†À‹Ì JΣ51îᕞ1h"‰Ÿ]Á·‚6ß}ÞÊÝrÅÌð>)Á;ÈË'+_ªñ\{%P2b›Pœ¶M׋@ñÞ/„2®“$µß‘ºƒ¼~1±Êä õÅŠñ"uÅKL€“êŒi*Yêyùbú#ÃëDè§:Qdr6¶rØ‘K¥K1ÅQo~%°ˆ2èWšö2Ü=¬¢M p,ÒçƒU(H(ôYIš¼¾£t+¬ÐF×ôï·5e Þ…©Õä˜ßwƒ‡z”ògÝ^!Z¶óKå ÖØíµ÷N2ª‘*]bD°‡÷©Ð"{"Ç}+íÛç´f~l5lÞ]^®}Üeä©pñHS8griˆ#ú½pa|7ÞV)åXÑ$X­^U¤(ÁHU÷TѸ6›ˆ¶ÊÇ%—™U],ˆR-+¢•L<ÁžÔ}<;ÂîM;®YÊzné™tF 0E;19%2÷(¤#^…È6º{»<¼˜<>¶vÅä¿IS—¸•ž®#žCÊÙâ”ö¤ÊkDÕ ‰`vÞñcò{³fàËÄTÍ…–W—YÆÒ¥fð;Þ/xaš1Ï üGCd¾v:±éèSô`ß‚â}’„ú/›[4.ä*òJá¼u$wKn¯£tYÂy<ÐÐ"~¨}ÀM[az¡Fñª¹Î­ððbÁº÷»Ûzƒ¹WÉ'ªk¨*Ìë9VP;¯gvõ¾ ¹ã–@M©Në ´”E`³|†žxÖÉž4“›£‹2ÞcN?Bö]È 4Õ„ rãgß[/A^‘9(‘ûäòDÏ[zÙhÕô(©ØáªL¡…Gn»yÚä=Ž«ÓÞ0Eqô¹ãum+ÎQa z#OÞÛE‚(Ù&ªáÁàéÛšEzµ¤¥óù±ÆOBÇÕÞûÐ…è½×õ&ŽÉØû.qÃáF—Uqù™Ã:©ÍÔÀAçSœc‰wcðØÿ¡Tã!þ‹Âïü§q~žtà+ ùœæAQ:ùÌ“IÙ[À° ®ùÅ|µì7óË»Ü䵜>í|EÎ Qö|žß`¸ûÐï =qðsÚqló˜p•\àxz´]3ˆ]À˜ÂÝÄTÐ$ìÂÛÈ6&ÔÝ"X¬”Tº¥[¹W©iÎbÁ˜³ ÍQ óKÅ´šÄ—gNoœß5wŠì¹–T…5–÷V·aê‡t2aWCkšY9+TH¬ëã— øü²f$`Ô§#æÂÞƒ¶ãJFê·.&3znhÆVÍZ2°™v]ÇnËc¤+” ¶d„J’`‰Ã*d¹{M„h¨„œv‚ RóÉËž8¼^wÉ~<ðó¼‹Ý»ùßF÷7ÞÙ†¸£ äÅ^í.bîïYÖ 0Ù‚m Üîî÷Õsævטš¼ÒÎá¯J>¼‰_‰Pã »A™ÇHX¹osŒže/S–h8"iM-0Þ”ž¢þWÍZŠÈ³Œ;–?ÈeB?Ó \^<òae{0ЯyÁsr)³÷]UaU‚½'ýK~ÿ6 u¦$Ή?X¹ZÅP Ì”-ºX†µû¨{»îV†îó¤tÿU±]›Ú'p'·÷öÌÌgÐ-å#èC{<)rUž•å5U^âÒ<´ Ã‹“®¼µ]XDpŒUh¨WD E_· VC<³ÕCiŠ`Ùg7¿î¾ºèšè„ „tç`Xƒ)›)îBÑK‚D@lŒÚ9lDª#DþêL‘LI퉔*hV\å«*”FÆ`,÷¦ÝCkÕ_åŒ,e&ÄÆs{f`©Œ>ÑgÚ† C(aÍÈP|ª V T_믂¢‰FҡÀwØäÿæê8W[Û•ÓÌ™à¹ÞnºÏ·Î© HüÖ„/HÜ…ÜÀíé(Á¢œöÜ8D7ÂâøTÝÇó¯•Rày qÄÌ{æ2ëŽãp'¼‰+e0h8ÒõÉd|ëüù½E« øÇj\Ív«¹Bʪåñ‰¬ç§qÕub…%¢”™ÄÛ‰#yÑu²YѺ˜åCp*ßÉËê"N¢ÇÞ_+‡q÷TÁ#EåC”»ïï/l½ ÑØŸé|*|¦'õuðWCò¯öþ ÇcCkÈbX§‚ƒI\Àžž)Oqèrnw.ÞëÖÈŒãçôý¿3ÞýPS&{Gê ÔP¯òFõ²Á!{Ðkv§¥LŠ ‘œŸ·=ïó/©pÌïËœr[,ª”$¤Smž+2Å ™7X"D`ªI$“3Ø b|Ý3>Ag†›„³/ýçsÖ"+õXʼN¯z!„8 ptÜÀÁ#®ˆª¡HªÈ¥¼ù ÌÉ[)DæY3-š—J]ÒC“WôüçÞ+ïÝ y$xBŸ<¡§èüLpßÐôÝýý_ÅÜo°?¬uQ ƒˆw÷ŸÞBi˜õ¬ .I ]ÐõeG$¶¼& Ãª÷SMUip©*žâµ<ºk5¨#cøè|#FÝ÷ ‰§žaÆ:o–ާ}§"hƒ;Å»”†öM)ŠÈõk'[¼ŽÛö½™Ý>% ÀEæãjÔÛ肈'H½ÖåÞ>ÚïíiÎÆ†Y‚Gh‘8«L˜Õj4³¾ñ$¡¡+¦K&“ÊÜûÍÛ&7æÖˆÔlO8/;+Mä%ÞyoÁÖêQ‚(ˆ ¿Ð9{ß2ë,Z«!«€Ñs$v65 FêâA;Ýí¹[4VâúÙÍnuV’K$¸kœT› [Òê¸I¦«µ¸}]}0Ï’Ž*ª æ8)Pø2«l*—¼¨L×;²cç¡#Ö°PÖ¡ÍÕ!!l€Z”£Ë~oÎvÕ†‰Eæ’‡|•R’(7õΥܴ¾¼ß¯7&näÕ¶ådç×罎«Ÿo‚ ÷×±Ö€Ð( 5M¤öÙþÿ¤úÕÒ¨¤¨[%@óÏâßæíšõ/½¹çíùÐ>ÕzJ¾Sp‚PùlÚiLÜ©“L]@3ÑJN:ªãæsv>GÀ40o¥ÚëH‚H¸ nz?¢n$Ož4êWyùÍüìz²}ðIpÊ}Ÿ< ÔEé%ྯt.ÝÓþ{|‹­òþ)}ìrêǯQR˜e „k 5~sªt¨Y‚ä›®LÜÄõu?¹›‘í€àª:C4ДÃ#ß/r2ú˜"1)=ñ×Åмú«´N“"ÍÊüîŒe>,­Ç¸øÕîýå8ªçÁŸG;ÞÂuú˜4°Ì@Å&6îzÍ€ÆìˆQÒi!’vVj1&t+ðÏž%%3úEi.P(ïâF0žü]†ÓkÖ¶‚ ’Hi{ „]dCRjEZC®êËìã¾á¾ç¹áظ˜wÉÉéËÔ…;Ý7iVËÍÓÚî­ðö‚ÿcÙ·žÌá»›UÐQÃÙ¼frر¸cÑì„­y0â(x7ç•_0†2Ñ»¬J„K9¯¤K#—æòµ7¯È¢¼+ˆG 3&|Ôð Þ\õâ›Ñcf$ó— ÈË´ð(²­[çdò2³ßóú[Ìs‘æþ"/Êãü<ò¬8"•W7£:‚·jY/Äó½Ü‰bÇy8ån2&ø“زB`5¯Ÿd6$Q(d±0p‰=x‚º§äô*M[¸hR‘ùÊÏüçs]s@ …Ÿ'àÖÓ‡¢\G³€ ˆÿ~q$c `WÜ“69‚xúë<ï˜EQ_¨EPV¹˜?‰G÷6òúÚòB1hkBå17¡[»ýh¿f¤I9÷Ó÷v]yñÄ«Z×]0?HC`kDÐM÷—>z¾`;9¹L.?o½Ž‚âýb -/WÖ¼õ û{>”Ö€r1ãf¨wB6ø<žuä‹0»c]¾Õ J‡_01RB«Ñç8àG¨™ ó÷îñ¿Fõ¾ ü Í–¨z˜s_s½ú³>ôÚQúñ†ƒ%(ëŽObº»Žbùó÷1ÉCû͈˜ì/{{:>WáP,ˆ¬üaA#‚/ë7¾»}M~uŸ»íuöïò9ákì¹PúLÖˆ;"ÀfÚÑzýd ή¾¯î—øn é?‚æD&>•ùyøþBÎÁìO‘N¾Ö÷Dò2/{QŸŒ¤wŠN¥ÁýÕù“cùiS ºð#œ~ñð.°I¶Ä)ß‘ë}À«•©™Œа?ô³VbÝß<îåà4ÎKwÊ´pËåv6œW·_oRݹ|ì •í{Úõoà½ueAøëΰ¹£¹î•ûKÍÂY{»&à4@Tçv{sº€ý ÈôâFìkÝìw3„‡‘"„fW(ÌQMm³õ¾ˆjlå8ëí “¯#GFh´-H•4ú–_Èêé[NΕ8È™*A,ÜÉ1´Š•‚Îð¿Öx\>)ñŒL| j¡1ŸMÑ©u­Þè¨;Uï¶Ù¡Ú3§¨žæé÷fAÏ7'º‹AYD]ìñ*Ÿ#mצØ+ÞÁ‡A sy¥¥õë{L}ªãŽb8‰;¶ZO"î²îÁ”uõ6æ¢Ä‘ÎF³°.? òÍ;§0¤C{Ôöƒ‚¯±uéÞÇð^ˆÛÔ(ž„;´ÿzæ­oœqg*P7.mß%r6·òG¦ùyl ÷·¡¡ÍZùŸè¢u¾ëN‚Ö´ úÞ¨Äò©Áº™:¨]~ayãxI 2¹Ôªg«s+Xä’ZÝßÞäQºwõ³ OžT•RáÔýsЪ¾T2¤„ËUÊxÆøÌ{glôQdŠ@ÑÓàˆ£˜O61¸u0kº¿£óŸu¬ò("‚}$%w(_z—8ÿ·;º¬^Æï’1î¾Mü5ΑrCˆ“¯¸ã°JãìMMí"3÷ŸÂ]ó㮂ò"ª§±Éò·ýXãç]uìvÝÈXPFht‚gÑËÉ$Áé@~ê e:èâˆD¿àµ¸¸5õé $«ïìö!ŠŒŽÌMf Q1v…s]ĘØ@ ­°Ô’ ›ãúû3jhò{š¡*ŽÈ™ÁˆE8‹B!k* ¯ÔE $njæ[KÙsR*К|ëv3qÍä±Ðý¨ËH©Ãj˜Æ­LêUÿÙ gß[O÷Ò6_Ððd\_èMÊuwTr4Ty_šáèÅ6È_UÀ\®†Û 3zU´[ˆ®OcU`…ReÄ áNwñám»²1@™¿éòù¿»·Ù~Ísíçrxs3ÏH¸‚WÜæ¬Üæ7-¬àgq}îdh\oÝ °w8~ãDŒz*Áʦvp˜‘MN÷rWq*ÄMÔ{ÙŸµ×Äc…Ï2SƒÍXwÞ*¨b{õi໓ê¨úz’ -GœRüGèëß)3³Ïö,ý~hui Ët5Ù{†t…¦˜Ù›Í„ÊÛmRc™ §¹îq™Þ?U$RI!jgªV’8á7å—oˆéT„PXØëÛyÞúŒ›1cpCûW…Uïµ­hlò˜þج¨ùŽæ|îszú“7/"wåTIü™E5}Ç›6êò㮆÷™ 3 5¡!yíOFq[hh YÙ±‹CͶ÷ò§õÛ¿«-Nýw™—‘yoäÐ$´xKÁÆæÉ…NLÅt$£Oõw}ïÏw‹wIàÜÙáŽsF6ÛlwÆuå )’(uá”uÜ©›¦@¢š…ÈfÆ´yL Sõû·LRbcä̸raDÄyí³ù°¥{¸Ö¿ì>U}b-iÏíÓøâ­hUʼn™ô[:7›0e ©¯²Oϼì¢.³€yËÛ—TµGÍjÐ멟僻يì÷íɺsÿÏsæÉîÕÜy#ð 0³¹°¤T8¿hÊ37ìÈañt9šà¤Ѐ±§­§Ž ¿§Á1 !KÆ&%C—:EcY9e?ÓPÁKYâó,u™±±¥Irâü¾Þ÷_6‡˜ÛƒÚ/ó‚ ¿íoµY<ªÎ£ áUxjq 櫳1W×ìT²‰ÏR3z) ãû¤hf*ç1Ü¿‚ôü4\ÝK³o-éÑí<8’ä Y­A퀜ñÚ2qê õæ-qêÅf'U[×#(™®G"\ò’ Bç0•±Kp†ï´]IâÂý[éÏ=®&a^…užÙqg€ÉYë-žþ¯÷ükþþü?ª»¹éÉi,…cÂR'u¨¾*¿zÜñ¹ê‘öÄ@èýÑ¢$c²Hª¤ ¨¥ýÿ‘þ)cUx7çäô%åÕ]y­ :Ö.ù¾ZPÖ;Íò«3nÔÞ$"3s9¸ŸŸ§Ÿ½‘c­„†ƒƒj„> 2M8öâðnËæ¥7[J^uÝøøôÙܤ¡Ùf%–Ú°À´°`&INc­7¡ðŠÁEóß–߯SWg»ÊðX½w}·Ë²œòk¶ÇÅ%ãˆGèGC¼{»cË{FÎÄø-¦?¯¶5Êœ&ª1ˆË ¯öµø[»×k…v“‰R«3ÌÃ6´h&Ò1(\?{ÂDG§":á7[¹Áˆs­@P”s‘ÃKPfwiæX¼OÞóÁùž?UêŠ)ŠŠ«BÚMaºÞð]XØìª )äDÞŽÆXK§V©šóóóîo­ï®Ž¦**b¼Ruí(̶MF‹Pφ}›.z÷­ìrOjûT,Ì"°JÁÚƒÙ DâZ'›"ª«»R`—R ËŠ‹3%wrýóñõê[#œ¤:0¸ˆí1>DŽ-$Es9CÙžŠks¸dôPˆ•C`[¯…ßéª[ý”H¬´ $@G9‘ ?cç,nEÂÍõîc‡Tåï+Ýi#etø Bœíýpjäý|×¦â ø ¦HÕ! œ×]ÆñÖ£&—ßiÍ‘R}øßy·²e¡â[¨ö?+èŒ)b÷¸’gk^yïLE@ä2ežéî‘—·ÏÃqø/éärëó¡¹Î¸,¼˜Hx Àê[• a§•7 a…U\2êÛÇ)ÕSüßáÝUà'd!ˆƒŽœÛŽ˜/ ó‚úés“DWkŠ”… ×""žúÂì©öãfP&VhžrfB\DÚ‡FÁîBf$Ûð ïÖblB ì¦{[ŠE¥z¤2F’Sv3ÑÏËEà&ݪ½¦=㱜i‘0*<¸w,i.²¦n!œžÑrûýÄ>é¦MÖ¯}óìúf"¼cù">®â$hï_°yhX}Äh·|‰¥j\S<ºv W†…`Y NI÷}™ÜÔŸ­±a¥·~©?@ß9b’+šºKª"8²ÑÉ^ÄòǼfSœùýx~Ì\.>£ï]ÜÒ2bªƒ§ÏsV]°q<äen¦Ôþ ÈŽh(ät:›é$ §KNœƒ²ç¸¨úÌÏY‘®~à\rP³?7tŠ‚À z<‡åv?<ˆ”…ÿ@ Ž))¸ÂÜ$GÂ`a8ª´—*®cñÓËHû›{ãÚ))±BJhþåß.8oêœ>þé¸Ï%ò¸¢—݇€±ÙÌÚº ]Ð[ÍPòç,F£}˜ª»ßYÝFÍU3¦ò ¹¯nAްP+“Rg³ÈZ#dº­ñíÜrÞö÷¼ÞV[¼ƒ>°|@«QÐ4q_ìϼn{3Úî)ÜÄn[ÉJ(Ψ"<…äïÍÒ¦A€¸ÜÑçˆ-lŞΦúó¸×è«£2)”‘ÑfÈ‘­Ëƒ&ìÄ/;«­v¨ädmj#Ü›q?¯HŽUÆö‚ÅÐfmFRÑôz'vM•C‡ÊåÛ˜çœÏ Ø»Ì v ½ËEèMÛµ™ø7#œ5[úJ±OvŸÅ>gv4̉٢™"ªKþ@7Õi – œ¿×Î-ÌáâË ©óM×Èþöa( EÐUWa|ü1®ry´wf´·øÇ¼¬öig°vÉã»ýÒÖ=o 'íMéïhÛžè¾7·ÛT…ßdàá½Ú²0À¥æÅÇ:Ü\oÄýÂö6u¥° ¤ž5‘1[B-Þ q²#IÉVñ‘T*3KºÌBA4î½½|#(ÒjçÑà(„sÔ™x Hh‰¬“®ù 3î¤qœƒÕˆ@×ô…ŽØR³5Q‰Ÿ€u‘ˆ[cÈÂ6vì¥Íoƒ#.v4ÝO'yÆÌÍ Tô¾ùçWÞè®s±´ãM¦)v”HÖI£ª·^U3r©Üù?G»¾”êÄLÄâéD Ö£ F…ÑÒ!óô³ÝåûÜs3¦ÄD¸t©É‘ìŠ6rœVé)}E‘!â ¾TåÎë es{·»’.ëá5ʳÇŽŸmÀf!~Ô?E@{†°¸ãB€A.dÖu¸¹îyÁ6ªòokûѸ’vG$ ËÄLëjŠTÇG3£gjê&S­ÖçÌȃÎ,’™ÛF6Em ÉýmŸ´è]DvvʆJŽçÞFïnŒ?„ŸÓÊ.ff;Úûýå<Ë5ŽdRwbVAQ06skUGþ/€ÛøÞ£?ߊˆ e‰%CPEcùüˆþADÛÐØSËEfT$C©˜ž¢~HjÙüÓ’šç¯p`¬èùß3/Ÿ7ó7a3†Ð×òÁtÀ}ÜÏ*7Üù2ç‡án:j ”’‰mÙïÀ:/S×3wÌôÖœÚä¢ Ô÷^ã#ò$¿6Ý A#o­tm¨À‰’¦ª·ÇÒ«ÇáO°‘ I)=Ó_Ûµ úÀI_…öÁ·ç󟊹Y*f}¿0 ÜɨK(¢ÀÐA7iBfd=MÊÙ2«Åù飅æå¼­P¤Å™k2NîÊ„bDŽ.꒪Ϝ·tvè$ãAMÈ t×í¼ÐéíÎÉ»‰ŒõR½3µ¿´`P åe$®‹«·Ã•A¹N³O k.œxµÂh«ê©%¤ÂUò'¼Ešž‘ag¯J“Ÿ Ò…2Ï÷yvÊj€Æ M¯ÛLÎâ~€nañ$H–lÓ‡°w×wY.ÎŽõtÏ‚7Rî­[$¬ÎIè°t猗Nr¾¼£`2҆釭Ÿ3%]úÛ[ñE¨Ÿ£Û'Ñ´J¾»¯Z\ÒWỖ*¨€‚ ­Y¼tÕµ ª%*«fÍòŠÅ'áp¹™i¸Ï[l…)?Ü"‰ÂΖëa%ó\$Û2FÁ ÍóÀðd¤XiOï'ƒ3LUÎ^Õѵž¨%Vì"Î%â2Õ$U6NÚtñjëÐ4D/ãQ²ûBéÁ¯³BS§­€ñr’›²[Þ\0B²0Ißyà‚ajŽ_ô Œ‚ýX}ö&0fdù$U¢SÊÐw‡hî"… J¨|ªªaŸ(POZL~ž Ý›e'˪†KäDH7òpZ¿<ºŒ™¤Jþ†ßLŠ€ª¼f¨ŠÒË BÕ¸@ÍÉ 3”Ê>ýìÑ©5ußøªo}»F©DŽ(0þVBÂ4»ÅãYiJ ÃRwS`2xL-MV{ÜÕ»ÑĆea,ß@ €Ç}4ù„vãS©ºiòÆÊ¤B'ÇúDM[ M!_>wokÅôÞ]žˆ<>ºésÑÓ8ÇÊÌVX…Â'áç•™«å‰¢ªB?%è"¿î8>HTZ½Ÿ(øæ[p7›Aî·}æž ¨hF°c}ó#øB…ª›ïnÙŸÙY.Ò?½ìì—‘Ô©ùÑÑùkÄÏR3˜*êGn°;Ø nZêTÆ×><֯הkˆ>ˆO&§HbÈFx:ÁôoePØÀÐÛ¿y’Jú–_0 2²IkZsu¤+nèO+Â'.ä»åVr“‰'¨—]L¥RB"ÈdzY/A/U¿dµ¢¼xdÓc@ÒÉ£mÜA«é ¦>oªA£èDu/(a¢°h+›|q_6;2%®µ"¬ýÔ\K 5é g˜½™ìÃB8‚ȀQW6/*úF%ÈÖÐ+ºš‘j-¡ü…½7„ž‹ö–“ŒjºŒF{×ä³IeœUP÷‚tlÃYÏt¶ó…[7Ãé„{Ñ—ÌÑeíí¢Ã9òôÄ;‡:kS4xSµ¬È“ùݾVÙó‡ÉAÂi¯GÑŸ®åG ±Ð‰(»3·ÙÈɧK¦ Î¬Š²ˆ4ì`ͧTz…+S¶PkÖ«ÿ3/=vÔm £‡î±uн5%õˆ¼¯n%ïÊ7^»L]S6lFæKxÐÁiQYó·Ì7Õ?TŒÈ®þü#—ù¡d†VDÊ„NPH¼ÀÒdû3a=Äd¹˜wvÆwÏ»Æÿ{ß,=v‰€3òsŒ oVæg¾[éש¬nv©frãâtå——…xþ‘w¡ÝÌã ¾‡|I\˜G›ÝiÔ+pžÐ9¹ºG9:P[ìÜ¥¶çšñ&k ¥šëÜsvÕI"jP¾Ìhd›®]ŽIy-1*ÊŠDšMb¦§˜ÛmôÁÒM!Ìâß„r@ž¤˜—ŒÇà‚õCꜛ)úÎå= Y†„9ÓÑsÎm-ßbåäºO*uˆ}Ù2û4åh˜šÙG5n¿)ÇJî={ŒðãªaX®9̾¹³ÙÕv§¹‡ÄÌ$õ6œo°øtǷǺ) ôé{ן{w_@Oºî´ó»„eÎu§Û‘ëóò\°Nñ΃&ë\&óéPµêq¹›Î•Â\3·ÙÁüëßË“qï óèpf7eêÉ‘{=@ïyôG×o»Ç—ë6ûhœ6E¸,À¦ãcóÜзyÊñ©x°ˆèîAo9ºP\dã*0û’ä.X ß5v;l~ê&W&ìË »&t”žÑ½mx‚ždLIÎK»©/$æyžXyôîɹPÞóÕîyË…[¬é9´B&wN-Üæí0.—cu wQÛxu/ÐåÌp¯OaU^›xð0­Ù%ºjK¤>›½àó@=]Ýðz°…˜TÄ›^×­Ù|á+m§L™‰!|%Üë‹Ê…íï÷˜ßÂl%ÂÌóãz¸W¸¦öÏw»²•ž!åØP;ƒn<Å9ÌÌ/C Ceoq¢hÏpa”‰9ªY_nVQîÜž[qöxXü·tõìO™”uFúžaŽº.ÜÜ/tíœd»AÙ¯3m1kÈzN5stæUóòð¹Ý0\Æn±yÛÚû6áôí¡Mº¢åŽ¢Ê9Ü€ƒÎd“·§A†ûsÄ›jY•rä{“Ã{‹L{`4¶{·1ºvJ»U]dÅP¤ rBp 3íâäc¤¨ Á%UÙ <³2ÔÇ Ï«³Žû«Ö¥ç™§xI‘¾Þå3qßaâÝžÞä€bf•£@ÉǨÄr‡ëÆ Ç: hùlõ«šù›tzíKBÛ£·ÓNО-k¡Ü=é"wŽ»sQœ½Ý¸µšáµëëשiZÊI=ul÷kÙ¦ø÷‹Y!kó "LCÙ—v¤’ôLµOGØ5œ¹«Ù‹PÇ#ž¬m3’Âä}ÔdX Ÿ}“^Ï Ÿ8ÊÔ¥™Lµ‘hªiÅÔËCfIÎHV§¼Ž2AJ]…í½! 9¼>o(Èr´­¢áÏz ÌÆ¢„Þb»—yûÛù1¦ZZ[€ÎSieд]©íê…Ò®:¯DGSŸÓ^z+ª‘ß7kÍ4è½ÌÉWÌ>¸“©©’ób¤0n4BPþ5÷ƒ×M'óÆ6òxìTDÛ¢ ¹ÅÜÁwg—$>vÕy¦Äè€ç,Ãß@è´ukUÐ1ÁOh»léóxÔÝQI·ç|Ä–Ö{°IŠ‹ñû·©@¶ï«IE¦uå´}â¥ß`¶÷“A !{™7¸ÝäÒòÂHùJü¡^ ~ÏN€‹î¾&Œ04—ŒôM—’iª L¥ôÈ]\s™(«®{!ßIªÅ¹I¸ãª7˜›Õ|÷%%asÄ«™‘Ïkï"³Œ…,{_UðÛÐaés|¹MôÎxi°ù¼’HeZnÏŒaé‚Ïy…ôáj}ÎyÛ¯Ëà%~Ô@2¹p¾ì½E´ÐÈìó©œÍš€†Á¶6C»í?ƒŠW ïLÏ(dàw̬U]é5óµO½¬[jŸ¼f¸.yç’ÙôŽëº‰¤0nã{Ú$<‘µ>Ì?$zF¹Œxg á!"\'HúNw…é7¢Ͳ&§—|«<,ëÞNØyX:MšŠô¥¶Òo ùâ§Ì£Y+[EÈáH÷¥O¹çâf„SÜ3s4+c>’õYwuÆfØ„vº°À¡ ã\8úXqîw@ ‹ÐMlj(᮫rQ§â™@òÆDÇW«•¶ÛsØb óYg‘ã€P"íÊîu3ZL5ð¡+YãÖO5Ѻi^Q°÷Žƒ†b[Þ¶2ö©cm¬;°¿ xÌ Šö N«À¯`Bqš{F:U(Õº·î°¾±ßIÌ'x<0æ qíB§ç˜ÑÁä YKöÄ£-U©ûk}.±ï3Lì…q“…û«"=šq –ëàJrKîìey”$”@[~²æÉäÓQ]=Ã9èíMçϯH¸’×›ݘ…Eì=z‡ÄO¾7‡›¿%«]òšÈ£Î{MNÊú{x˜K2yÊ]GA”N‘ßV5Y¯»¯çùpÆgW‹=¹ñÝ ‰µŒKkOt;À.^Ášbž'0 ð>¤é΃ÀÊ–7a¿¦a™#ÏЗsݧÎç®…íˆï<9û|à•[086`Zhíqw;Õ¢ ÎE›tÒ¼­(ï—‹†eù€8 >’ζ)|ÌBο;L­ýç¶>ßRÏqØvÂZ0õÓ³=¿‰t7 «7,ÛM¦¶ÔËdÙ£!”E¡ˆ;Ømâ ‹ ÕVªu‰ÓnŽ41Ù ³BËdÕÖFkŠ7a„‚"ŠÍñÊ®x"7©Q¶÷û“‰ûÔÉä’Œ›Å—UÈfxá®LÊMRŽAŸ?bö‰ìŽ>¹Cä@3RÙ b;¥4•Úˆ,íµÊC¾eÍÇ?¨UQ´¹Žû×Y#.¨jœE"ˆ!•eš$ªR`(‚›¿·vï8™ }uÏ,^Çîè>äIòP•¥ÈRI'’ýw¡C†„‘"¥G•R™‘ú„‚*¨ÇS9P(†Œ€ÛNLÁ¬AÍÝ™Sn=š ÿŽ·»q¸o9òqàÍB ØA))@‚‚:uŸhUkÈ‚I‹Axàa˜M%%µv&4Ù&PìÙfxS}ñ'+Ô9#ä1,õÂä/:[ɉéÅ2!Œ›†cóX YGˆ`*D¥,JˆH(}çôdýÖ=`;¤m høBª‰„ †~¤©3n*åq8>nöw3ÕâÛ ÊšÌ30;©aùØÚŽ”¨¸nB‰”¡*àbÓ)#¯Ô¤%ùa‰Ã ÷]Kw~[6nø‘.ü¼“×9YB jf¶É×5­jªµV‚3I-¼”Œ¦e$Y0šn:Ì·3rkUV¢?#T$V ­ úbµYÆVª´ ÊXÛ'¥÷”ÍöOû¼µe ¹Xäóg•¯¿¿Áûß3QzèõØì¢<7Œ?Ôæâ· ‡=ÌÁaÎ…K,:ëÄc"9û%åB QΙ1Êj àêfXо»Ñ!êŽSqÛÅ& š"ÔA’L<Û©ê(»ÉÈ‹j¿B¨á­ö2Ž¢ÄÿrT)’*>Kç̺®«%o»£²ÕCc÷u’•g‘­f~:rT”´iŠý¾]oìŽnÏàÉΧ‡ªˆÒwvª?Ð7 ,':S)œžI~„‡ƒÄÈ/L ¦Týï6fFøŠÈŸ-p[FáÿH»Øz<ã²Èéo‹ ZäHž°BÖu„rÏg¨ÆmôôK‡LðXŽî` a;@ X*Ïîød¸¹¸ÅD:áË„¡ ³1Fá^W.-[†˜‡NLñ»ïCí33×Kw]¬>Hûu• • X¿kæµÁgŒ)õV~ijF<ø;}ÑÏDŠ ¥°]„˼4^x­·™v³/q9L¼¤H<Ñ’–þ)5C‡Í|™•Ii1³,¹®>èŽûÇÞícP|s·$ʨÎï¿{˜÷_°ªH <ã¢**”t.!É22Žc*²ÇTø3ØÒ‡Ü p1ñù$Ó‹EQjÈÚ(mÕ…º*kªÄ_†}}äP7áyÉqC’j§•Ý ÅVÓ«qaë½÷c¬ïÏn*»4C³!6HHj€7d&5P%2 ÙÚñ†@)5AÅAZ‰!ÅseÛqF›Ì¸$qºû‰òtáÞQ\T¤øðûfîJ ê*"‚–¾*#C-ýÜ|Ÿ$™Æý¿o{o—ï<Éæ15Fñ†aÙQ ñþqŠw¶j®»B5ØýO¬LwD>7hÍı/^rí]eñp¼†¼Ûê{É¡UÕãöò““J2!ˆ¬¯Ë¯¸÷9ÈÁµ !]¹n$LËÕqÕÝÀª>DÝS´pFDJ/³?åápwµXÝ¡”• ËlII¬ËÃ0sò?¶"íÄ<3Ãäå!φ!Ï8×q¸Ò„”‡É»¯5÷eš7b37ž²^?ñ²Ïƒ"<#/«ýÖXÃú{ÇcÀxbèÔXƒSm͘áŠeâœ;ýü™äÒÁ­ a®zsC/³!šLæ ¶Ë–ðÅ#Hvõ¶¥½Kq8Ò8Y ‚–Ú(%4b®²‡`#×ßÏŸÏÀ+Ï©ìù>b>4óì¸31Î9¢“±ªXM¾®­+¼‘à*B“€ÄP“É& È5^(¹ô¤Q³ºq ¿ƒ×‹CZÕôêl‘)S ìjÅ©«î•C$)(²`)2Оœ[œ9qHA!$žÜIªÛrwà‹…Þµ¡iÂï…þ‰‰‘0”\ˆô«×VŒáˆ›M4¡«€‚¬Ì:wZq¿1ìæÍ-ì|;c_<ݽûÝõ]wíÚÈvêˆRRI3»P–±U7’ˆõ…UàÀª¡õÕUn’ÌWJ^4qå[«Šøïq;EUUvè â@ U¹iJ$Óa2™ß5  LÁÏS„¾ûDÁ‹ºò¦‘Ííñ Žòzi„<Íüd`EÛ˜üìã¨)aÖEbÏw+ ¯Ž«÷Ï—Ÿ*yŽCûDÀ+* ût©É#ÓùBìnÈNXA‘g°õïkÌHy7œYÇlºçc˘ç‡$L:û)s{Ä^cësÇ ½á˜9'r.+œWرìÈ¢6ð;¨Ãk¼Ž³ÃÜ1x7Ô×|Pì<øš?i:O©šÙÚ!;Y½ÞwÕ^ÇÝwóŸ7Õ2—ý}Í!itR2÷â¿uƒ"ÄhUÎ-îjñ‰'½Ãîå÷Nù™ðõv ‡2L©k™Œdk[C¶ÕÆã;/évÿͬ DeoœÊ9e C@sQb‚q÷ù÷~]B,€B3;#ïºY˜è¼ÁN j(ªbFþ–eÊ{Þç{y‰ìÖ•áXÅxa ™Œç1Ýϱu€ÓJ¥v3¸®nÃ%ÔøÓ½µíÁ…ƒš¯åzÐ$^,=’Êæ ¤ÿ˜TÝ\ܦg[¸ ìÔLï.dÚŠ)J“v?*l{".œ2S¤!‚vœ*‘b3¡(͹xú[\Ü ñ‡½ãLvÄþuÕçX¶ô{nË*`m\I$&«ß×f¬i¸3EEUÁ«…úasp²¯Áù]Z˜ô¯Ê`¾Œö¥Ž\@ùà#Z&çù¹î€æˆ°"’MÍ®É!_4Å/…µCæÜîEÉ•¹‹y%ròøŒŠ(’T⤠R $© À€S­ xTÂV4ðõÓÝÊŒ3@¬6ÂÄ–nùò ‹¨çäLî#a/HÀ’0'Àa,솉òÏ/‹›!®q:ÔÛÙs°ùeÌ~_óÔÞùÓÜ®›öÍ“wZ™9”R¯!SmÛg&P†¬Q2âcN”Çˆí¿». °·›öfLÍñ–ÔQDA&a¨õU¹‰…þ[zþ˜ë¨ê,Dƒ©|~ŸHн%¯AF!8®ŽV® ´+™néKG‡ý¾kyGWÌq'‡ˆ²Pß¿ÐÞU•],­Pš÷ýÒ…Äí÷ñ1Bu£¿”E¾ð‰n—›hÙOÃW@×3.ô$Í”PÑh”¸ä VíYåONuÕÓà~@ù‡ Ý™šŒ¼y-Æ AB° ªk%»"ˆº‰»ªÅçsyPÒѯˆ™ñ}°gœ …³1ð~ QøÍr¾”NO³/P®ûf{lß<ÃFð³2ùÜì^ÙwÝÎØ3žæx `Þa?Ð3&®ÌÌÆ‚2n²j¨)=µe^Ÿ ø.r£Ó¥Î(ZíyÜ·B̾ʃò%w]èG¶ç}µNW%R2„7È€%Þüæ´Ô †,hps¥ÕGf*60è¿m® UUrR]ÄO—WºÛ6ëï/|¯ìˆ5+@ OGe{ N„CéÑÛV’9‘!¢'¹Tc%ÑwÉ@•U{-Düz~LÄŽ3œóÕäT’6—âY3–`yIyFºŸ}ü4ú gðV®“©†$ŸAÜLLYN IíˆÇPngGÚOåÜÌ"ÚôÏ5cP‘ÍdDIMùû¾ï™c½»[ëíæy¡ —ÎHιلfaòí–¶1D¶3ìÈj9µ“½Þ1íG—ŠC»ž*5*ƒÞLåÅdB&±ã<Øîçv9øg\3Pgò`þtcôñÿ ɇ;ÕRä1IÖl™åˆIªÔ.,Õ[qz¤bŠ¡PÂBO~_8”ß\!ï˜àÏØšÜnû7œW1¬2xìÊdå] w—àI“É\d(™Æâ‚\±%’AdÔ,u]X3÷|æïv±º(ZŽò"ÕÞX«ê=O#ûÞw;/‡k|Eü™ÇÛáÜÁîß›/™7·Pq6( ìzÙ&Í׫S9zì™ÈZ' Ðl´ÍVC«ÝDrâgõuû½›ŽÁ(®­0Ê“ÑíöE4cÇ:ŒV_ˆQ¬¸®¡Bž8‹—®/"d&jm±i]ÐA yë}·Ÿëâì¾dîä?ëOÕ-s¯±S³¨ë´ÝÀ§q295ž¬U‰¢·‚#–X¨þÍùȪèùÛ–z»@ºŽâ9Byû´8Áœ–Š@cpˆR“•€LLÈyøà]ÐH&ž¡§¥ Ó‹*{çbî.ôӛƯºÖüí¶ ) "YŽ*ª­nŠ*FW#7œ“ÛipfÙ¬<–pI ° 0 å4ã(®ˆƒ‡Ï®üî¼¹r]™Ï£áÈŸ¬%½ý|.ûN‹™kD Þ?[ÀS…’Áq¡Rˆ»÷Š2¶)l{(et‘”ˆv€üN0Çî¢ðx.Û'ÝØä—â–vòω+s2uÙÚC<«òÍÊ.(™µï»ƒó=ê¼µôÉnï7Ï.Kó{»j¾¶i‰o»3ŽÌèy±áEEóï†Rqö›H¼; @l5¹ÛÈ#yz÷c·Ø‹6¨Žò'²|ôáË)Î ¸^Çk7ôù›”Ù„Ù&˜<àý$8é"LbQëS{3º³' Æ8ƒÔyÓŽ†b~ ¶º§Z›/ðŒ#Pјíƒs ‘4(ùgìÔw«–ÎáÞܵÈng&…ÿŽŒªW¬H sŽ!V©¯|ªuŠŽ ‹Ú4>¨íþ÷«žp…Óí»+NR×§&UÊB2I’snô˜ ök‹·ŠEÍÖ´BÝØ"âÈdóÔÅÕT¸—S?›Yç~óðyqÏî~ϳ}º"¿ŸÉ—™‘^Ø‹:F!ÆÆßâ©¢*Ö Z24Äj1AâWãlíE‡5kr0Õ+ëÓ÷c•Ù:ï²C;íÝ.æiš´cðÇáãÍáíðÖï_¨ÌÅvdi¬ i¢.Bh}¨"LL½Æ®]¨¿Ï쇑ð\ô:ޝIZ%L…¡¥pÿ~¤ÅXzg‡ÝÚVEÀR´ÆØ¹%P¯M‰ÖX¡%‹{„¾Ä{ÚFâß|£ÔcûnIÃC‚Ç&„“¶­'V ç²þÅŠ·’},#¥r8ÌŽË8ßÅQYuy!n·ê|Ëøö?Ùß9¸vLcíå˜Ïa™Ý8ðÙЬåŠ7–˜¥ÐP ¥«€ƒ#áêTÖ̾ç?tz®vÃ×[K«w#Ÿ_73I `͈›}½!B£_q9D#1°K\¤Ò|WZ?=Ì*Èé£Ò¡jHŠ R(}ø >Ï5sɯ*(3p…^D: àñ³=`$#2DL|éêyÀ„nÑ„³e¢sˆv9|Â_‘¹‹¦5Åwt‡«5ºo&ªzúøú¾Noãî^ö Äp€ èZ⪠ÄR>§3ù †ö8â$ãÁg^kýÚ¶\BBXXII ³W€ªn‘’ÌO^ØeÔt>Ÿ}4ÃËÃù?8äQ¿ƒÎŒ;³¡ëoZ÷⣪XùZ¤Õ¢>Y™qÅÃë¾ïØÝ9…\Pç®ââ-D;ÖPà1'-±y›”×vQFÝ3Ç»½Ü.²Rò?° »†¾Q9"<2×ìÕ§†€¨îó Ûìôzu—–ùK w‘gK«ŽùW¦fræyÄ÷ÝÝ[#².ã(i¯©™Â…ÏùŒo\Ž©ÚIþAwid­àQu(aP™ˆ;QÐè›T,SlxÖ¼¡çÖjMyDÔÊ®(è8ÿOcðtï¼sP;‹¸S[Í5d)tˆ"º˜ ‰3Š©£²’ÇE?ؾ6°]¥uÞU£ˆ£ÕQ wRs^ª,W¶âF-Æ , ‰—óά$qÑLú×P($~«f%.¦ ê9×YÖ'”¢.Ò½ÅÜü¸ûçÀW“±G´:0\T‚$Á0'ëDYuD?.1PUºÐü±sVÍ©¼z·`ו?¿80XŸà>÷ˆÀ^Ž,ƒTWæ!>ƒEûÍêê:! „4‰5²¥ƒÛêe%þXÖ¨€HŠ­lÖl†ôüœ,E†ÄÈŽÐÈ! •`„pMEJD(ûônlŠ¡¾—©L ‹é YÝo¾s8e|äêÍoå4`Á†ÛÒ§ê”UT6⊳éÍi { ¹$'Q«>qÃH jââúmD_w›ÞîÍ…Øž@§TràÓ—4Œ´;ËjÖHí|× „ÂH@gìP…:uCX6ÅRU‹P7ù³HY‚¾MB.H}7lú”“«K'åê>*炞Eì“6å'%J Ä™ze@¨ÝÈéÁWqÛ½‰œóðoƒs‘^ žï0Yˆ³G©£ T:xåb¹2`ÜTLú >t›$âx%IZ„ DG™íÓ¥NÙHOŽM©ªGg ”?veᓪï1eÓSooVÅÕRÒ«úÝâ::Q ÓÞÕ9™èõ2n)¦øÖÜ8Ÿàò:ÍæôzZÓ;2TÔiJÓƒT¹•r(übÚ»Ze™(5&ba7TÝä@Jç¨P»y7)Sœß~ʾ¯¨ÍèkZ@\:Ö†ŸÆZ "N»×”“SåæbQk*Ú,ìêó!,*‰LéeÉ ¤%¥ bó]i±ZšS“IO++áØu¾ðR¥QîúÛ5-$4ø"• ´Á: h⨗ésЇ0"ƒ½¶¬¾²È {„¼Óµz‹Šk$­–OxñÁâˆÕ<ÙÓЃ¾Ë™©i@ (z¯&|I7’]öò›·ý«ô8^ý¸²=ü†oƒÁºŽ>ÛÙï² ÇžÍä8¶×…¿q¨'±UÅ.<±9zu„YÇ6ls€… äÖeà ‹b±¯žg¿ ès¯8¹ev>\ˆˆa‰» âk…$UËä²s¹úôlT·¸çÎÍÀéÔ8„ߟı1‹Ï¢–º>çÛ¹ƒDÔ­Áº¨Þêöê#6¦)Yñ ¨BÁÔ!¾Ã‰Œ0$“†‹z¶ÉÕ‹B‚(°‚kC9‡ì;”qeY A’$KKx¯‘ü`¢yR|ÏMI‘F ú™ûÊv$( ¤Rˆƒ îeX‘Šé4’FÛ¨…ôÃóNav‡¹°Zk "â ¾T÷=”b¥A¸…ºyß¾Ï?®läÛCÃ|â­;‰RaæˆMVq[%xÅr¤e£—"ƒýÉÇí̵¼K6ïg¹˜—é¼ÕÄ»çJðÃP•j7NLCÎOÄL|’v>bp>£Ëž\\\¹,B‚BRwµ*£—ˆ]Õd$‹¤s¾Wgªx ä‰Ã¸å(ºˆEß®|´‹7ê7åÅÛÓ7ahï8¡¬ÜµuLwNGoe9 ʹښÔu+ï?†ã¥)wÈ2™Ô¥ô­^o²^,“V«íQŒ]|½x#5ñ¸Ê4N’Fs%Øn§¾¬fç„»¸ÉJuçîwsÅóðŸØëy£)”=¯}©%Í2qL9)Yœ„ÈsŒúQkeN²a´Õ!©¹R‘J ÷rEVÜî¬^ؘ˜û~_ÏË뽎Àî; ¥¹ñ Ìw"@à&ý¶0 'cŠ0­IAm Ý+P²©TΚÝ~u×|'g/R骹W=³U–ÞÌÜy@MPQ‹h+ä «V-Ë÷CQ‰‘’ìдeÄsÚPåb2CÉUTHâŸ4ed"A?'f Â+ýÚ7&ø”Ö¶q6_;ˆ„ƒ‡2$tæj¨†‘³feÊ1ó[‘'.û;äÔBš´ì‹§FTu“vy=O5Kâ¯7ÛÁH»c\¬º‹î iRëqÈŸÆ™öÅÑHÕ1?E|ûqqä1ÑÜÏ™"y­+¡Ñ޳7/‚ƒ˜‚TFÛÜ«ºu ©O‡t½FÓº’~È#Ñu–([#³úÚÞ·ï˜ÜæŽýðÊw²RÙö¬aL—–‰ADw±¸Öþê«Õã’Ü—&p*-4Òñ¦1ƒ†x%hƒI_xÜbWz|ùð‰å[4ÙËçG¢Ù#§o¦£ÊEícëãlpð³H‹¡Ð󢞓^¿"2C;¿õÄ eÄAQ{Ï?/pª£Dx$F¬ÎÁ©»ß8U¨9S‘.76oÃ_lu £Èp´:a-’¬•w’¢¬j\·-¥ßm¼’)¦×2VfÝkV•ÒƒFE㪸žìˆP~Áʬððȹ¬Ä”——¼¶%êyŽjÞ\­ºz®j†³røî}õÝ÷®ÛÍ„ŒËkøPDÓùŸÏ-¶í<á¬úÊœD¢Ä úÿÞ«à°Öb{¥†¬.Ǩï 9ŒØ¸ÙmËIÆ¡1*}óälpíò‚aPPç‘.bê=áùØ;±ƒõϳ±×´t"ü‰™0g¦©‹;˜Øìóñ=1rVë$CHa“¹‹¾È"9;çÌ©ŒÞœÆF%¯Ãªê£°uó·»~Y'›Ü\±¸ä'6Tlݰ_ªœÄ€Ø¸èÝ74wBdDZo°n–r,“¼ ãÙ¯>so®gJU2ÂÕßçäH’)vtÆ!…‚$îm‡\PCÉ«‹ºÙbÇÑD•/Ô|›†X‰üÖucµ/mÅç1u#µqåéÑpŽ£D¥ ˜–ÈfAá„5s/l&Bù–­"[’î/^[Íß»¬•zе71\Jtyåý8ç,ožu³! ezVÕP†Ì*4bï°š''P^+¶& ‚›zþö( ”¢ûÝ~×ç½ËùÄf›s2Ñë®9ÏWçBíŒçRV¡¸ý Apf Ì`½:³)é‘ Lº"AŒ¦qËÑ-ÄAA¬9 P¢(©éÉ·L¸‰î$°e|üßÊ©=,\6É€Y ¹ˆçšODÍÁ`ºj †\†èÃJ„âuPæ>‹÷.<Ìæ=j"Õ@*-Øøí0â" 2mÚËÂL%3ï®ñǯŠY˜Á7fï–£Qëx¿S°Ï Ë·? |Ý$Õâçâ`Ö®L0¶Ç* :‰Üå ³“øýéö—jé‹y›'¡µÊ»îs¦ž¹J.ó\}Fçnß5W5á¤È`XhÕO·Û½wrá æûõÂ^fŠBš¼í«.\ZyŸcß3¿wOmßOªr¾øÌ`]’Y[C“—ûseÃ’ðªËJüÇÏÝ•ç¿6æãô»Šâ;ÇfŽ‘7ðÁ;?1S„;z©*Ƥo*n·r®öž8Ú’b|_(æ<þg ¹'P‚, Bi±Á¹n«Î¢YS’&‹|©ds,¶ Í§OPdLV6êÚwÊͨ4ëÔB6YÅ·r?u­`Ÿ…o›êz,QÒ¤3 ‰¥ÓPœN"^.X³u,f+W-¢ûEŸ Ô…ø=˜ ¹âv§¥±º¬»"Àã+Ûˆ¸È칸4aîJ››±l%F¢Jý„"– )¬LÀ†Â2᯿“ùOïQ pê!ZUG¥ñÊÌɨ„5÷&òpˆ¹HÜÒ"E/û¥ßÍ…ø½G¼ŸM«Zé qÈÁZu7u2Å‚-¸Ô½¹ƒ<àœÞ)éU÷œžž2ªøðÇ‚äClèìŽÚBÛ,–óeE$ÝÉLÖd«€š+Ô}-´ù"ù³˜ü\ï/8âçhï瑾¬]Ž éi¨Úœwv7]¢se·hÙ”!ˆ¿­6ï6$¹™1ÎM™Šîätœtqœ’éºókôÿ ß}!ÏZtØØCà à Û˜4CŸNÿæö0½§p¾' ”Ê’(Œu –¸Ú=ÔR¡]_Îùû=|ZÐäZ¹êz©òf €t„U2~1{Å:™ŒyUsr¾DPÃ.Ò•jN!Â"jáÉÏ]Iàâ÷QÊÃ4—ÇÏ;ûžr»Ò=øP—¥R͸T—VÙÏÖyúø¼CµžpË\ÚÉÝ’ —V> bM16Ë‘MM_.¯™™=m‡9ì½_ÞÀ|+ kq¨:%¥æŠ‚¨h­0¡µëÚÉšÏÝÎ}-QGÄ’ö©˜¥,cé)¨ÌIg÷~ql¿Ð0xÚaá2YÐ(Ò#I›ÏcQkìÃPáÏç ?¼—(úØQ£å‹ cõ0ŸÕIyŠ¯Ñ¹n¾Ò|bršHÂ!¬ÉÏ·—"6îó=;œ¿Ðr|.ëRRÖ9ý±ëÇÞW:ÌÙi¦û–ãðd!=ÅÄØ¹ìOy¤thn5 Ô½Óvù‰P‡PÄÛÀ½x±>˜àÐ<·$¡7=»sµðBŒÍÞ¾Z¾D(M'—sˆôw€Ð õï. ÷ ²9#P¾› ˜Æw½S›7¥SR±W<,ïYÝ+šzQÔ·Ìy¤,-PUH5ÄÊͨŸEù¾üÞêzïjgÇ^H0Ú: ˆ2fJ)Ì£=(¢ªuåÀý4vSK|*™ “¬q¶CiXd—UljYr ˜³çn¿ùñIð~Y÷˜%XñD#›—tò}ŠfL+Št¦%ÌiÍšdî–°©“Æ=@7Öì#1–Ý¿§±Ö¶vúCžLgu½È¶¡£qdñ2q#U$‰ÈŽdëÙÍZ˜ ˆ„a …ÓXœi81ȳÞ]Œpò/%Ègyï®öÆß#\Ž¢Ïr(;¸¡ì]9N ‘ •°Üó"Ĭ—ž,XÝqa1Ä\ä1Š– FWyGåÅßßv`&:T¬ôË‚%2<á ˆÊ¹ÖHyf$ÄK -€›yrËF±e ¦,ÙÕÂfŒBðBuÇÞÇ\"¯ 5Öt»îþ÷ó[ Elá)\»zw!«Ù‰ ÕDTê\ým”…%IÃ`}£UÔÀ«SMÂXº6=÷ɯÂ7"žºõ?ºowKi¥›6l3ëû—ÕöÜ­õm¹ˆ DÅp ÕRj*¤DËüùèÝ Þlµ±SÔO;Q:üüñó±Ò›sªÑ†×tFýˉÜzs.Ë„GÞÈ­9åÕ‘w' Š(¤ˆ AÙR:˜«“ *.·’iÏËk‚Øž¼v.Á¨[Yôœlõb™¯çjϦ՜˜ï¿YḩøBA{‘ß̯xêDî}Ï Å„¿„Ä3÷S$3ò`œZ‡ô;O­­ó¿|±v ÚÈ)(ƒ#œº‘—ž‹•1e-s-ýÎly6ôÇŠæBEêÃýqÌþìEY û‰Ð# ¬ô´¼WFQÉGÁ ) ÃÒk˦BO×<Ï<çüI•™]=Õ wG3/߀? Ú÷oÁ<ÁäwûÑc­z›ì6‹¹+£÷’ˆÂã/Ñhg×^ò¢r<Ó6¾–áȘ|èñ¡í½ÎµfЇqêˆ:ÚwÍ8µ¤G+ a`/{ݶyR+¦d…L³ Óu¾¯êÙð'ØžCÆW6¯Šûâr«À¥¿3]{'ñ¶Nƒ-|!píú¡0ÍÚ~˜&tj„fzIq…IˆIbñ³¹3£E«?áÉHæ§œÏbÕ HøÕí:f\Ò%Á:§ô qR Û+aW¤ ,Ýuü‹Yåo^ª¤%̸w˜M[SS΄ëÌ5lv­Åî¯'‹#µ á3Ùà-3GíÇ™/W͉Q‘’àø3'ÑËó’<³â©§ÑƒßsÈ„ùÌ@šCäɇ9Çð §Šc‚­¥˜dXÊWøi ©ð§,²º¶ðD\ÊH('0¨²“ý –ÁÙï@S©ÌÒ²» ÙshÈ =Kš(€”7ŸÀdíxsî›D?iN/Ë@mâÍO¨V"3wê †(HÝÉ/ÜŸ“uð:ù‘ÞXë¾Çlñ™lƒÄïQa“¯ƒŒÇUW‚z¯º @Å&Q*È"¡.¬bî£W!,Ûûª¬­Šo4®cæY–cL%f‚—¯:×ÙÞ/ydë8¯Y‚ý} û ñœ}'ŸtîeЇ¹méèÎb ð±ÝÉXÝ••ÿ)ª¨Rû sÝï]ëNˆ]]L³5lν4É<ëǦ:¶C<Þ¯(yü¸Wdihk=˘Mú¾¢«W4Sf3î w´ûŽúOή/s› éÞmîv§6ñƒC‘y,z\:#»¦Î¥†õɸO¹Ì]ØFõÁÝ8g€Meí 5;ºöÜÌ#Ön£·†ÌŠÚÅQ01˜Ä0L"æbh˜»J{™•kÅÅcxh¤•âIY¯\¨Íó¼§<ÜÝóG' Ô“´ Ý|¤ñšöW7|ZG½™g¯w›·oÀ ·s¦ÕµÙxº5õfl ¼hÁ%¾’I™!‹1EÆ9¼Ž*s¿Z£uX°©^ ᣠQé¾ak>Çnš»}x˜à<{nlìY‰q݈BÎáÈé¦óŠæõZœgôÓQ{×½±³jGkï1ÙPm;Ùí¾uÉ» ™µŠ/BæêÂùé=zÕ~]Ùš’ÔèO²ÜîïAz[Ó±ø¬®ðpeµ9e«Á2öIç©\äçhY5—79&"ˆï,‘ðò—L¾AF ºGRƒõ½Ür—¾ã7}¼ºÙµ°#òI^`’xÚhŽ59Þú¢'¦‡w0'Öçs/× kPE{ÈöëX®ìVm}’ÈáárM ){7jÄ Çºï¡cÔS±óßUgV'3;¤;…ž›dÖ—J¹]˜÷µX­èw‰ªRéƒ$ ¬Fv ê“¶Ã7OI™¾m‘¼TKÇf]î>ÂO ·±w^çLî` ¦žY½¨ô”‡—xƒ½µÉÍ‘‹{vþ]Ù@×ÞyÌ`¦à=u÷‚Í‚n!Ág1³žÁowîOw>Z)˜Jº{;‘>Ïfã(¼ì÷<¤õ»½¶döƒ»¦;CÕÁÏ9%ñ>$–ÝËcsX*¦w±ùâ㜰š»¼3ØT´W›AÅzðhHn¿on"bµÞDz÷({{Ôà)wGF›Ä ý™_]©‹çÙ®ƒ1ßu– W®Áv"6UoAÛ½ã§MFìÝâžl烎—= «7§â¨c¤¦Þy&õ^E˲/.‰ô'Š1ÆÙPN¯·rfžƒÛÅw®{¹eš³·eg“\ V‹ÌéàtÎÔ£–íÖˆ7ÊougµÎ{,ß*3píÎÏg£7F¸ûŽùW<‹Hs×E¤ÄnîuÅ y¯<—«çݾ‡f™}<s'6HöÚ<ÓPžWt(Jw-Ý ¯.¸½Ý7wi5l¼<lìïv!†€Ì>cR‹öŠ[ØVó˜_—¨É Ì'Ï¡¹Á)kjãô*‡×7˜¸uÜp².œÇ㺱ž.†ÀÙŠƒàlS°wr†]M‘îÜw%f½%z¼4wóÓ©©ªöM¤î¢â92Ÿ1Õš›o“HͶB·SnÎɽÌ2y( hÌÍÚW[j^’îH£UV¤¤]԰躬c)íJ‘.dìì¾½í×_h}›hÇÞÂduåÏ"ûÂÀ¶kæk_L?vš`«^—xÅŸÂ}VžM§Ø²å£áΔ“8ÁTVCûÈÉZÜ/%E£ê>]«žÞZ{’ñ–q«ÅžSrâ‰,ÏÚ|T# pŠˆ©79ãzä¯Ý±ë{·Üˆõ~%ôˆ ôç9Ê®÷…"ù¢Âc¶‡Ñã’£•¡Ž(à×­FM ’DލÑÊ"#ˆôÁ§´ …úŽgÅc!|/Ó#åfÓ%m¢áÔÞ Ð͆9ê™±Î+<•ÉÀ÷¡;͘ê£ê—›*·aímN†u6ùäâÓÖ+3¹°uΨ“íNf¸¿X¾—*'›Öç¹fubS Ê\>½ÉÌ<ªž\õ¼x¤ÊËT\_Û6K(îuÓc²Š®±.ÛŠ£gè_ZÝJ÷~‰<‚ÒM'–(Òª§•“‘ÍÄnÊYø2:Τ qŽM9Ï}Œ™èµä¥ÑåÙè^K½QÂÓÒI#=kR^8Cò~ʲÓRRóéåÛ/¼À–i}mÝèÖ0¢vèê€ÅÅõ, ¼ÐÑE%pIÖ y!ïZée|¢€;Ë^³3É©( ï4#Ä*̓1òDœŸUQzx byÌúdôcçȳ0Q‘ÖL¥v"‹¾sÝ ÍN˜„E{¶óáìÕŸM:î„û·ÐƼI“Ï®Ô<èôákg•¤zIæ{ ?©õá*Pö^CW8¤}æf{½¾ÞÂq›;i{m"4Mäò–óEùùoÈïï˜:µ^Šcç4ÜöP`¤Œ ІϚ_.½eUT8ë×F ¤…2F]ÁÓœ²‡ý>ÂÜäÜ9§°¬[ܲxK=76« uŒªÛö7žË9Cmw!ºÔ%æ–I]$¤P ÕTt¤ªC]®`A³ÎÌÏìͼöâ‹$…|§7Z(1Ú+¼ð€ñÌ" ȉñVÒŒû­W¾Ûmôá·Z"!UÆÇHB *fЫ®­/–=Ƴ‹p äøý,DÏØÃbõôOB²ñ „h”Ç¥\qTäÃdBÕ@ßzsãˆcÖcJ% =ÜU³p’Òˆó*z$k3€õ»úrQdF`d@¥?ðHH’^ ïfªz{E¯ \ÚØ×ûa"më㙲[÷&¿+—wÇÂFØzQº ®ç§z ¼½@к;Ç=¾Ù¸¸­°ûj.:ì{Ó{2?4W¢ó[‘öÄá"'.›3gí˜Å¯ØÛ¨gµwhðö¥ãœùk%ãÓWfrïj¸ J¡™Ÿ…HÚ:³zúg¿\ý»Zû;÷q-n:e!Ç‘U¸)¤ÜHÀªÏ>qX¥¬ó—[TÔ^>ãcï¹bé{ç2ÆðÅr®]»za.#%8ϲMA9fY-µ "s%’£ KA†€vY¶˜rl<‰{©xÄNãõou3·výõ„#´$=»£{ÙCή߷ï¾PìÛô‡éÒpçnd÷LóºÀQÉfZ– Â׎dÞ mvEÔÁøy/_lñÞ~«Û&Ðξb–{¹ña‘?g¸$ÀH¢¯Ô§Dãü29b12?Ÿ×aªîPTxõSÌ%!"§yÖ2 †§ç«¥èT… b5R‹hG秬_Y|ÌÕñ‡¿:2øD$wCŠO$] ]›\<ÉÆfƒ•Ózàý¸ÐÙí5\Ï›zoÜ>äûùUEUwž†Fož9B-'#ó%ÈWÌl–ª :‡ßÑƌʲKIYJd1‹¯®ð!^•gÙ¤á2¿>F¥¬ÜY™#eÌMJë+‘ªƒX?;qsê ÷!ï\Ðkª2G`ŠåN ÜD€èÑv Ý9y•³.ȱÉo嗎јIÎyy«›M1fn½­›šJúœ¹'›MI³KuÊûÖ††¦¦`®£ŸãÎŒªœIɈ˜RâgJtM4ݘríbQ×2KQ¶ÚF^<˜¤† ! -â³:œ¼I#JˆñÓ†¸n6=<åÇ4>£·bXÑÔÕãxîux¢V›ymÃëv[휾)Ì‘Eƒâ›’ !3oé• $BÒƒ‹L V8WßÝÝÉa3‰ôlˆ™ºïG£ª¨±˜†Z¹6& ‚&r ûsRÒ†‰DAaû"¥Zä µ’¿óøíe6d0„N/&,§ðÿM‰>‹<ÀŠÍ?Þ6¬²í‰²Ô«ü…˜áÁ¾¸1Q¢@’å²E!Ns¿"±EÆ<ÞÓ¡©Iö®3&ÊB1{ø7ÝêÇ$G>cŠ BBâ ¶Ðí¶ÎÂtìÔL· ÂF7 ôEL¹]+ÄJ¿2"b¸æ‡dH¯Û\[«7U©1h£po*ìÑßÅ­äκ֣/É®ºæaäETÑb]-é9!cRê*ó‚`ÖêlÔTAcXsl ,‰¥LŸCçήiê¾9Sj.þ%8F"L@ÆFº=Ü( Í0ÿ,A|¢6] ”hÕGÂËnþF‡Q2r‡·ØhaZQêÈ8q¸Wp“3%™x –jÅè$›–Öà÷s~2 çåÙ„ˆêÖ·sO)»€ Ygµœ¬fópj¹“ž¬: 9wvx†6çP@‹L]ǽ«³·g§í 5ë¨îuÞ¬f1»ªeY]J&P„äÁÈE”¤MLËÔÜÃMY›Ë:»¾»å¿I0¼Š‘$›û¼ùI6ÖW€/kÄ=F¦Fìò3.`ð’òàŒ-+ZAvù~ç[›H330!.f/·•­k6Ïr>øü÷»o³|ööõQW¨ñQT­”ЕUŠ+·]‚ú¹¼gWs$·Z—Î,³ž~t£Äèê «²¨£Äb.–(K00ßb­ˆ‹˜‘›L$… xùà¯\Ntæûê×YØÞï4äV)kTCŠ7XäðÛž[ר^±3Ûü¿@¥¾‡±y˜»¼ó’f«žu÷¤ê—ý뎃 £Tƒ<ë°i’rÃ,/z!y©×Š 5ŠÇmˆù~nf5,x‰oˆp£c¢*¡3d”@˜j”ÍÝȮMPqœSužbŽMä“| ™jØ [ÓO†ÛxµÎ0;±L¹ÇÎlmß'2£u>>ªÛ%ð“’fK®¦ÞWQ¸çlðwå.rÇ€kYé ô–»½Ùnc<Žsñ76·T×ÒÏîÞj™Øÿ6!Y8NâHlÏ"M¹õË=Qgs'™.OS^ÅHvãl\ b¤”ÂÈ@”á$¦E„’U#wžØ¾%Ó¬cÅÊdµ¶æb‰UÅ ï*eZ¨zäbŒéÐý‘'÷U˜^ìî¹Ì¢›€k´Ì^€…«½znMnð·/ªm‘ãÆüxw¹™‘w -©1\ÕÝÀ—¹œ¡žH‰}Þýü‘Õˆ=Œ"Toʶ$î`~ªoå ¡5µ)ŸŠ”aJ]Ý)pv-—*½©™«G*ãQs u²‹“FffÝwå:2€L\cÚQi<‹o3¥—r:ޱÝþÓŸ9ݎ쑾Ô>Pæ¤KÔ»—3OÉ›üQh\—Ìã±ÄUA20L’Ä~ ÚyhÄÂà³Ot"¾™„&ã²ß&˜B’ÂÒÎpÁtÞh™u¢P$iv®KËrîÀÅX·£/T"hèâPîc>.råGC¿ËÊ]Ýr{®ñß«ñÛ7‹¥'+Õê—Ì?[3c .{¶ýª5«œª¨—ŸÓmj_ƒÇ:‰·eX®e ¨‹ ë¹ÈûíûªáÏ~{)y…ænfyرò;ŒY ÒÈ!ÍU8s%Ta͵¹FŒXï .©¾î^PëöŽXžcdêšoqæò±$¼ÑÁ ßn'aÔ¥ì\¹±í[œÆ(Yr ‡2?IýôƒüƲä­öz¿pì¹c!è7¶ƒÇ ~Ÿ½°ÒMÐö6E5$ʪZ­<1+ŒàVx¾ú _Эñ²£þq7þ‘,,)è©]ʦ% /±gpÕá¬È[@Õ-ñ) ëTÖ‚")lÓA$nbªb”ÐoúãÍ¡gk{„Ô5ª§9TîéÒݳràJÂmõ|1»×ìeœ¬âÄm©n[þÇsµaìN4¼ˆ°í¼kX¦u:i#%Ù^Z£AFÝmÇV¿³ÊÌe–i…ÈŠò%¿-Fã«&7ºÑÂyʇr—;‚k2ªE]§¥b²]àùs$s‚ý½÷­IÍë íîÂÊTevÔDåÖÞ2¼¨Ä+Ä›¯+x¿:Í(´r·ój"Dh3ÇR¸oe%3çP:}Ü·Û=L’C&Z§|4g2î¤wF&îø–f<àš¶®ÎqÕÁÊ®œò·;å*Õ·f¤+òBšœu%E¦®›X \üÉ©VvËaC¨ŠzЍŽ3{r.3&tò}¿¿ë£Y|Tªeø;—pfÊa¤>8u¾Ó¬6fM¹!ŽSåÛ)¹°ªyQaJ!R …ÙÌ¥›yCmЬ©Ms 輬ïà*þ{×]òÅéöíÊÂZ•B帗äin‰ÔKo<ìû¤‹ÆÉíðJ°¦Þ% ·'9[ž«pÚÈ™Þ)É÷îëO 0¾¸%ƒÉS¡­úÀ X»-«±™q4©m¨b ¶¤±,Å-QÎä;›ZJÂÂ÷<ŒŽPÓyÔKC{UïÁÎNïy[l³}‚)ÔþÕÀ¸£ß»Ü%E¨5Ó§ºž§Ã¹£²b¹"d‚Œš»šˆ‘ÄGÉM_g6h¼rë;Úg×§ú››œW†Il’N rF†´‡Þ¼±zªó‹ä…ÊaHÏ{dÍciU¼ (ìïjWwfaµÔϰõ.m¼'µÛº—e[ëܺ€Á —\'3öÉÒÞ]O§{7®·îbl‹{ͯ7ÊÐ5ï¯_téiî8ÇÙœ@>XÓf=àû8`/<{?É­ÃS*Ý5ºéõ}ë«$Ü“mÎÈG±ÝBuöI¡ÙKkÊÀ×Tiù'Îýµ&ËSø,p>/³WN¦”&$>…„ x¦³÷ºx°¸ÁcàžBìy·á|Ð@Õ÷ 0£:c³ e‹oP"NS¦¥0d%…»W¡J #B´¹µ3°Ÿ™¾ú:Î>—Jz¾/7 œ×8%¨Ó¡ng$=ÝgÌêy¥°Å¡S<"nìJ£[ˆ¢ž±C6&JÌÈ™&”Äê˜ECWx*ÑJã‹áÝõÁc®~s© Ö̞ܲþ};Xßk±F«â¨¯¤äÍ“á;Û&?¥]ùäÅóá"#ômd~2ݼ½—ˆÉÄj ¼ûÜð·âtÅ2»..àIŽÖWŒ:Óš]F`…A‚Á‘ä rrùPB{¥Ã#9М,ìDÜÔc!ûò½Ï£&¾竃±”}õ]‚¥D+AµV¢ðEéijqaÒ¡³•cëŠ?“ò‘GbÒÍÎèLFù»žÇÈc®½È$v.=~bYÑ6I:sÃÌ}ïoFžšÌ6ÄbíÛ¢ –eäˆ1ˆ€Ì¦HqÏ»} ÞçšPùX‰zNáÝO9Å–d;ò¡œÚË®§ ¸0(‚$:z³"öë( DG~&|ÅŽª*˜iÓ}EКihËÒ}ƒ:îÕ “35bé´e«FpgNÙźIÅ‘Û<;˹ÉÝÞ*ÓsA¦CÄ#õŠ:É]Rbvu}Mf øéÐ¥DEÔB-Ä€ƒq¤œÒ4^Þg¡ï"" øîväïäñúöÑðåµ9Ý„ÒI%F8BNX²C‹¬»0ÕfžgÎw—ÀÍÞ¾=úÊ-eù "†RkARI‰ãÓ‚ˆ%®Oœõ*‹c[»™½‚‚$÷Õ]u$Ÿ™¹1._’© º âüÎwLêÞU‰Njc3¶€rÖB̹ ¸9¯A=[1ç±ÎçÉQ}ÑW)E æ,[qS46a`ªz6Œ~}1Àüs‰ý±!]š²çÁ­©.#gÚö úû·JÑÏ–òrê^^è]éÃ>`f´ ÛîødßD—m¥E4¦c.\cÛSk>Ÿ»óírmùó*(sfNKzøöpƇñj$Czà6ýáRóz)mÛœ*¯$"ª15ÒòD—èB‡’”·¸ÊÝÃsÂüò£:뇩ZÖ»:ÐJ}å*#×kŸ&ø‹Ì0å­Îåe*kv誈Xø"õ —#˜½œ>Íû\S’:P‡üýU—ºöçïÞ´+UTj­ÿ4îg-¹æ+•Ý“†¿>,²æ–¯xpÿ4äµ3(¢· Í÷—·¯]s|Ø™Á/p,z}÷à¾Z^p…¦5­kÐ:ÖµâZü"}‘.ö•-’:g×ù‹CÓ« Ÿ†F‡Ü6µ ­/åDuÓÏ.¢Í2áßç ››ö^ç ÇV**ÑUIÊ»$YžÉ¿sgªHj¾ÖÏ ˆÛÊ”Ž£c(H÷HBâä÷üù÷·®æáÏW0à½MÌÓùßÈ`¹8± `jÀgà6q y- ‡B ’³¶%sé±sWzá ‰Ø€(¨Vu]1±p«$r\K˜ÊݬèLvàGî´}ŽVÔ¶â ÄxÌ!%”¡­G“e4 âF&<Á06>ÚW–£j¡Ýè8VBåC‰¥ùßMþ êpÉxÇ[‰/.”™.Ó)¸Ò,È“*̶¦\|¼‰È>þ®OÀ§[šóŠH‡Œy+YŸOìÈ€E P dEþw^=­àF ÞLÏtá&-‚Êv óç1ÛC‘x “¦ü6û‹¥(ìÇŽ®ª¿Œ5¨F›uxÐÜÓ÷#PEþL¿›ð® ëì-§Ìv…Yª©m[ò2wë½Äv!q®al¾@# ˆ¢1ɯ–¶#"†%Z?›FPîåü4X´ùI‹$ê—ÐÎù1ócQÀ“K”hLƤ,”„ò~¦ü¿ÖL?øŽi%+S­ibsQp¡ÆfãÝ›ë¹Ô81X7;Å÷7»ãm&3·–]®Ýïc,ÜDD_°eΓ9í¶I—é–{—y¶YY.g·¶ í¶”ý%sáîÇîBBrŸA»©I4w‹%¥ä„Ý)Éä¦DT å`}¿|²ÑÆþ*âƒÓ…xÇñ÷l½T‰Ã%q<ŽÔ ÎÆk.ˆj7g‰.öˆÖë¶ÀÑ"+«Žš— LtX•+4>7]Œßìè m å].auSï7þ ëWÚžeÌõ®¢ÛD Ü“•ý]øèdô`tC0z„ùðN¢Í÷Jy¾²˜š’.ë-ïò¼ºµÁ¯ ¦z}]·ŒÄí96rÒ–«-l4 L[,RMDU3"3jXu“b¯ñ×Cs½pQ'dä¾£¦Å6袗&¸f\mžëáq¡CO¾µ+d1š2*c`ú¯}E7Ûés©‰®à‹¿hÞ¦õsË8Œ³_ÍfâGú¶ Ù¤‰B8Bm/¡¸ZY›‡Û!ÇÙ¯TûðqŽQñ¾‡>H£ò!I»Y ”9‰N0W’äÜS+ÔŒŸ¦£˜Ú£ÙÜ]3ËòdõUç“»{Y3¬—ÆòÏÝŸÎnÿÁÍŽ4éE¾“…®®ä·Î=üsÍŠjùÜáˆ;_G¢Âd~íþs¡ ,OÁ­j‡Qä• ÒéÄ5I±(ø¢¯´²Lä†Ï›lòËÑ€b…h’èÝ«ÕÌsª¡»ƒDôƒ”'ÛuÂn¦!¥!Ý4<1—wya(üí~ÐÌqa_„ÆÁ }úŽ_3A`Ó½Þs½¹ƒ !~í…ê:p¨_°j/5óËÖ=Ó=Äüfg3'ÑW[¤Éù)΀ëóZJè s´Á†ýù0 øîKF}sðîÔØá&aì’¦ÂIÄÆ>¥·+©õ!‚ˆ3ùÏÓJ7 þ=»ûtåÿ¥¨ø”[|J­ø­ûÚŽù_Q·Ñ¹ã lrNm£Ü:øF¸¦ÄMàd$ bG üÉo„Z½¦­KS‡­ó5t-º;¸¯dÒ(sòí×çè:Õcí¦+¯¨ó¦~ÞÚóÍ»£w:¼gr¹2ÎÍö̽¥½ë¯+ CdÆÍ ðŒJ,ÒD0€®¢Ï×”ºÛh÷c¬T9~¡I÷äɆlœªfý«bщ(!\uÑj ®ìÎêÀ\!v ¡Œƒž[À—òÛá×ÅKìôQÊhÿ?Ç{÷²4S}í¾ã¡L…TQÕÕ™Q2¥M ·¨šÖC¤J©;ÝŠºXwä66›¸¹§N~¤æ [aJ䦑 ÷øqç_r†Ç2#&&ý—æçh\%~'ÌêÚœq¸3W5VŽÖ®ãÛ–ÕsC] ‰ ¹˜yV+&#kµ>õ hLüʈ éÕ}Ö‚y€,PŸÑï(ögN7%ÌÑdÇU5$rVa}l˜À3>¹, ‘ã»òCä"s–Ëw†^¹;‰T‹Ìëðœ‚3Û1Ž]©dË(:3¹ª¡Ñ8ª•`²dÚ‰DqnBiÈ·0‘ÛÜØ 9O¡ M!B7>x]ŠïƒÈðëZî¤_N*éÃr8ò«!;j%+$oBSƵ ”4®¥šî)¼Å´§[޳**-ÇìFÌû)Ã.H¾ߌ %÷ñ)ur«±€®ŒðDk…LHýR,ò›ù×íŽur/ ö%¤—f﯀ò3ª&¹Üç;;Æn&A Âs°"±`Š‘FV †ÏÜŽH›¦˜33û»¹ ò?žèô”OQ¬ÜQ&AV:„ 59 ÒáDmk?EÁÜEØr¼„‡êÛ"sx©O䊭E!¸ û‹7ejÇ÷åDèÚˆ$PH2m ‡5 ÿWEKG1üÉ4ºú>{¹V·Çæ—Ì`›p±,7U©\°ò†zj´+Þi€¢„›ÈêLì5R(·Æk{Üm?9y Tà<ƒ-Ih+<ÞÝâ}´Œ4»«Ü2nû?ŽûvöËÙÞÇz5ÐX滊æ¢~£G¬$†åìöôÚ÷DSr­+»Júðöök O-³0Ô dÝ™ÝÀåIþï2&¿Ž_×ñVÖã>öÒÆê„ÞÏm%"¸ÞD_¼{îÊÛIw~?k®Fù°xw6êAh©†áD ƒÃéï×YÛ«v„Ç›³«°5­ W†#/0o{ƒfö…8ª¹ì“šC¡{²Žº¬+§abºØBÑ™~"ÄÆbµSò}üH x‚f •S¤Túxã'ÆóõÊ¿æÃùƒÄϸê#“—òïÍ0K‹WÍf) D”_´~ϼ ^Úïjñìš§hãíÄ)Vhž™¼ßenò¶†]ÝH&\Þ{ÛÑ„„Ä"AÓ"É— æ ï+ö–T…à‡3Š0Íýü}üß|<ëéžÖ¢rØ+ãSr ?QE²Ãu"Ì'nExú¼ ûqiu×q¸{{GÏ¿/ó¡Õ÷Æ<ì(¨ùp=ÇMñ´à!·l©ÙÑȃ%9GϸûÜŒœ]]“ÕÉ$_xáî(Ø$nÖXË™Ht¢¼§CfqJº‘ ̴ΣɈŸ‘SÕ8~pîXhñî66ý8—Uן?7–O¾ü\ØIZ1ãOI’EØUT4Mi…$ÌžO*lÓç.ÍYH·ÃOñ>— çëŸæµ­X«ê²<äß$~GyÉ`þ]+"™ñÌé'M¢œbŸÉDÌ<~\ÃÀy¾nÇ29¸ b×ÛŸªO`Ð" “v'õsÝT*dNµîÌ Q¢6üDR*/Íל™8O/Å‚ ždwÒhP…L\ÜåÔ–Ž¿‚¥ÅùâÀ:‰™ _ëùávˆ ˜$Bø3ø?¢,‚L‚ Á–_ùl Ó÷·ÞþûϾ¾ y#çýgåÜÕøwÛ´™6æöžy Òìc!y#z¾ »œ°Ý4 œ_ŠÏ^6Çã”îäè{nÏ%7ÛZjÐÎóöéì—†Ñܳ›.jñ¾lJ7L£N_mH=ÖbðBó\¼}Ú-ñïqoÄ{3fw™ŒöþꋘÁßó0v8´VYà £BƒßÉS²aF“ÛŽ,`rеð`.)ðà´±¬¿öøvLD-à6`›ÝÒ6.W²éÔ— õ®^ï{äUÊv…©3>yÍËÖ…ô2ÄûÏ-ôQ˜xĨ!ú ABÌê&âú”¬åv\õ¯Œ;›¯Ñ2欸 o‚ù¹‰­p°FÏóCPÄ,`ïp  m83þ{•ÂDFuUÃf&å_°kÝÌ@µ°3¼3#‹vù9MÔKÔ@®:.*! l=n ϱÔ:»ãµfÑ^ý3É»æø'çN°A„1ámÀÈvW&¼æàQBèQ‹¦jDù™®þe™ÎÅܦ:–—k«Ï>O¶oŸ•3úˆ“éNMß“5A7p·¹ <¨¼ák‡"ˆ*Áêóe°™•ižT¾hKT“Wùïl1¯*PÎ7Ä›¬¹>c´U³å‰î§ š^|äÕ‚9Þº¸Ü;çª7"p8tµ´Å—ʈ)Í¥[]äÞDN‚ˆûrN¤tŒŽ™îx'Åy2 šŒhÁ}-¼$TðÞ^Å”]/³|ûŠ;^FœÐvoÒgܨßïöµ ²©:ÜL$´˜ôŠòÙ¬²àS׽“~þÆn‚'<º(©‹ÈôP²aþfòçÞÚ†CÇ™?Ü?ß#ÜÿÒz¿{qP÷¥ðD~G þañDV=uvöÑH"Qäg7uo !ç-bTÏ-KMHÐ%¤”ã7›çJz9RðÒ*›ù™Šš‚`¹LâE‚ܨ^÷<Þø¢À½ÙéRû7i¢&ya•­[·FȨÄvë™:s¬¹“´ñ¼òoïx ‡s2˹uÎMö,ÜÅX§;»»Íë›"y²q¦O ùïÕkÉ㼪Èú"ÛÆpšÃOñöèz̶ÙÜÏÙÅVñÝé0ñ0u¼Î ,©€’öëºÕ˜›‹Y-6²:GôŸÌ|óæ @²Aª™Ñ¹â3 ë’N÷Œ'œÝí½ŒÌ—¹ÖØ\37uðEI¡Æ›B"‹æè>¦&æ¡ô ô·µ¸­áxSK©ûÑ¡Nç'wuÝLèŽx-ÄŽæ0¦)æã;™;.û~]ó®Âî.¢ÀëÛÐÁ9!izÔ)ˆ‰‚L˜DB¹˜~Ï›ÇuCuºðF††°kDö.£â“]L²ãmqB?â˺ƒ w“Ëšë(DéSžÛ3Uû XXVÌÀ·ûP˜‹¨m?W)Lb–ˆVŠ ŠBç•WSx_}øNæB`ï­‡}— ôœ åA áEÚÖ)?{ï=¡½ú;'òƒ?,oÏq‡_SømЈŒ}H5P'¨°çï3bÏ Ë°ìD¥¿þü”Á0R¡„XR|a:†7SɼWH~Bä)c(W;ë¸r”lnœ…+ïÙød' (ÄM(¸~„ÓT¤ dQ ~< C"D£’W71µudƒ·ó¥€½ µ®1£š ±‚§ë›¤ˆ0>RipJ‡ù~/LƒLÂúc¨ª†P:Ñ„I޾3LV…˳˜(+„¹ËôªRÜI-W»ßy†´5?ßËì0—òÐÎg?ŽÐÿÅè2$þËL£xø¥|úü¦ÓŸåhz8˰ø„a³ØæGÒNÂÈC)ùkó¦ñ/’üƒÙÙ ‡Hô0¬0—ï3çDWô€ëÿ¼ØÙ œÒ³ ê5o¼"Uö¹Ûˆ JáývѲž[±‘ò‡¢ àÑ^Š\aÕVC*ø^‘uJ!áF=ã—,ëUêê™Õmªjô¼T„”µ,ù˜˜Äxšõ á“ä‹—òù:û#9þØ\G…Ò°Uˆ£û™ç_CêrT³]ù^lî,MˆT0åýÁ¸F”wnZ8¾\7¾/!\³G‡CQA]¨¹ @ ‘ MÚ³‡Â¯@¥š®“ïj œH¾?eVó_À Îá(6’ë<àÕZoeÂaç~ÖD,¸5¦nÞÏO¤Fu*Ñç<Ós#ãº@uG59Þ$rhHJtvÆ÷|«%ðLÑ»ŽØïÀyÚmS”ˆá¢Î†Uà¥ZP¿;~¦B…Vt£iq™=æ2¨‡{Œ›Â¢)±JSéTÏzÑ¥ä‘I­ßN'M FNîAÉ7o¾\úq(l¾àûâÿaîêäB¬ ÂgÙi׃dŽ˜¸$_QtEA3ÚÖÀ~KYã¹ó^ùnå‘|;°Í«»ª)ÅíPS“Pˆµ _ áj„l™yi!¢BOêÚú>÷ÝÙ¸è*×Å"“åï™ÁÉÆÉ™@Y—ó]ACj*7KÈ)øqù£®ÿ-ßžåÛD±¨’4t»Súaõ×VAÝ‹Ï<”Únò’È»¾—'{<Y|@… 0ÈšÊתõ7,úpáWÕÚQpÏäÞ¼hSoyEZ‡Z`­›šÓƘ×mMpgÜXÎ*­]^‘·™š¥›¶ S‰ÕÚaï…>G¯ ¾¥ôÈkÓ×ÔÅPK53"¡^-ýDµN`·³€¥ë°D…5LÁ Šž¤ƒ…âw{xRP!ðFôCt꫚QË»Œ+l‹_W½Y-Šª Œr€*j–«LÀòŠ³îœ‚õÓ|Óóqñ¼*ŒÔ§¤¾š_€ê‚½8mCß¹S@¢ƒó1~¯ _UGê”@jm^4Õµ‚¢:VOj˜’è˜ìóh¤Ÿ½•yDRýëÍ3/y{Åü3~2FvÕD–?:ŒË»„LÁÍØZû[»ªj^“hkÇ)-*á@¾mf ·•ó2µ¸…ß$Ù5À’. ‘¼UlÉ¢s'I «·™6ç¥ìAÄÌ‹ó>â‚$Äž¯’Ùó„žGª~ÉÄ`x¿ ½‚’BôüG0û]LÆ <ú6”ŒE…àL8»ÐwèÚl]º¼bÀpVC%$ X€ô< ã¯L*B9"¢@¼MAhÉ5rìµâÍ+ÆŠÄ4²|]ÓüFqéÈïÜ*ìõS¨¤Ôú>ëuÉ/c]«ú¥ø—Y“6ÚmO4~š4 Ìa©Üñóôþa Ÿs5>ƒ#/¶©¾§Z×bÔ+$Ž†Õ˜³±¥dH%a B-„U…ßDtæpüs`¨ºws´·8‘1!PÕø¢äâ!Ò•9‹‹·BÔú ÄYÓÆŠ>5µð@‘‚̇Ým32Äô)$ûôÇËSß³'ì8[$Ai`BñÈ¿ýh’ã:î­„ÞÞß3»žåŒ®)QÇ—±±—;3/ >{|[wayŽ­*a·g&@œà®÷w«ØN.îž}•¡xiTÛÑC£¨¨_ßNìéá0S7vw»¼Ù…mžÑÜC^Þ²mÜk‰]Q>0!¤>êó Ÿ˜¢EœVÒýÀpÍÊxðšê…ci1õÇ W3»};Öl1+¸Ê¾¤›–!äÙüÈ0 çчK—XÁ7Ðq=¦{wzPlÌã©®<Ôg@S¤.}ÔOy¯hI&8>ØÕ=÷8»8ÒsÓÔ”õÖ9Zën5drÞÂüàÜ~}:nïŽfãª4ŽöxÜîävXÊŽòç£Â¶Úíg†“íKçbÆ÷jHŠ1’³}20<°;í×ì0Wر”òI#Ú\§,÷t”,¼3„>Ï%h}ç,IÊ©+7L¸ýÚýßhŽ>w}_žyÛ=HxŒ@fKÚ¦U¹ÒÂw»Io•ôWóŘÝclº7V†pÝò­lë„dmu¾ ß-lI¾]»°<{P13'¦x/9¢ >ž£w™^×@¥žl O y SÐcòâlSÕjîʼn2†w®ìÖIâ¼ó|®UœÕqxš+LõÌ]¯3±Q¥d[›hâq¼§©yN¼åwÒ-Ñ$¯Ýʨö÷Óº¬Û¯xl£{[q¹­`rTíWº×êŽGÏ®åÜ™´g™&Úz^\||<`p~Ïv/`£¯^ÒôGn=æNdFÓ|ۓ˲yPÕ4—&Ž]ñÕɇÁI&ìëÄWîÙвrðÏkôØ’T¯yu¹[önnñKúzš HÉCyG~ßÓÆ˜éí}_½“¦®¥·F—wä¼´ô$(qµ>X^9¦B¥ûXõVKŒü3É;¯Ý ÐxU³ž)ˆJ><РÉñ‡®B²áTªg¢ÇQ÷Õs4ÁSƒg'Ù#Þôû:2x[­É)÷bG¤«Oz¡¦º«!XÆÞ.uýž%¨ É÷±ïÚ£G;Hi6úÄ'Ðle§ëIF¨^E)õÆÞ¹š4ÇVFi™µyUYN ¹lˆ+ÖëÊI`$JtDu2nCgx>Þ>l+Ùz:ß*–šã¢ …_[^T `js:c£p]8yÃÙ˜yç:m ,‰…8sùà90â@|Ç/žìäç›_5íõYL¸â ùÐ=ëro ·qùmwyÐ[µÆ\mJHÈÉÚ`-¨”ŽÄ|/'ç£Í÷ˆœôª Q™kØ:* |k .’X ïBÕ¹r¸Ö«èÖ¹o+ª‘©s?SÍx‘cÞ×Ä8qç=m’d­±¹Uóà{Œ¥ˆy6Žß—áÓ™Ýì\vr òVVgÛ.â`žy¹Z-ÅŸvkŒL{¼¥$²>dõ øªjl–.ב+X®"±½:¨uäT Õ¸–¾¬¹¿¤„X§®ŠòÂäçÃÞõŠÅz¯Î% ƒâël[B[@]ë úü¸>©¯Æøôüï1sh¥¼Ò¾Õ2\yx`â%0ë÷A5l©o‹Ïk£\6¬ãÚ‚Ã^-ô¿'±¨Ÿ­n‰û'P݃º®¥ài“ѱµªu§å mVg):ùU Mž_Xz|Øn8àùíhŸXz³cSц°ÂØ×±<'áºót—¹ dêmç)®]’ê™=U äÄ?Ûྦ@+ê5‡$;Ÿh¿±oÙè^™³ô Ûcyq¶Ó×WÇo‰ÓϬǥ—ί8·Âœ%«´ Ô'mÒ‡•Lwt†ÇôÂEHywŒBRtÒe[n½Vþ~F/ ìI6TaMúÐyºÚ†`šü/%Ô7ÇCìõÑ÷[kiÔÜw¬¼©ÙèÅWÔ Ô$Y³e«òzðˆ.ciX×%pü‚ø«žy×Aü¾â PuùäúF†«Tª MÐ#¸ŠÐÉÞ?© b‹ègHÓ=UÖó%Â|àÃªÍæ—{|¡Òo1NyrÙGœ=›'añ'ÀQ˜ö{7Dj¼½Síç"\ómvñ"ü³£Êò#n´æ%’;;BÃZ•vWM,/ˆFosÍ\8ʼwÖaá»;Ûž þ¢~òȈü#òü£‡¬‡Ótà¶‘;éгo¬ó}åòŒ×[ÄùY¸¦NÓ¼ÅáÊ :Ò ¦q\ÒåÛ¡•ËhÚ·ÝqŒíº ÑXu«… ±A#,²ÂäB²«%e¶EbIr%I§IR@#$uy™æ^ç—7ÅãÍëwIˆ&âþÎ5¾&8r8ù"b!òs0už˦%¾{;Cªê&t›,¬=Åîvέžä¤»kÇŒÁp6îçfÙ»ËÊë!wžÓy5žÙ˜û¯ —þDú€¬€ž óúåíÜÞ˪!æ\¨{þ³Äîè/t{ãÁïn Ÿ˜gŒŠ}(Zià…*éÏYn~WÅ={Ÿ E™é”­u%(Àçq°Ö Í^-kòŒ[«Ôp~òdr© Î)©÷¿Ÿo&'ÁcÎ.Ò^?$©|Ê^¬Þ¶$nóP Ú€´lÙ†£ÚRäÏŸXäÕ Ä& @“(ÀZQ I€Èr¤‰ÁýŽR6JÎŒ,Išÿ•U¢ØØ­jЬA˜„'I¦³9 ¸š Þ.†-Äg/ï^‡¬Øƒ¾‹¸DÄ Ž³“ ƒ=“$0…Ž î‰±íâ&Z詨©[“mcá˜Ô-§{7o*5©;»ëkˆÍ²RC/¶ÓÍ‘Fôý¸–&Œ[nb„LJa3¢"¹;x;¹”q½›Ë÷˜ö/07ñÖú€‚DmÆ[ŠI8P”jX¥2(Ç/¤vÛvÌ–]ÄÔQŠœŽâ’Ñ4Q&ÜFV[Üj¯S´Ö`õÝÙ®k"eLÌJ«¨°l…FÕî"¹áÝù×ÏÙà<çf"#Èq  `™`k ªJvj®jOTm,½Ç/“rÆ¢Ôܧ"‚N8®WrïµiqéØN9y’87‰•˜Âï ™onÑk-ÅÆAJ0µ‘y/" Ëv¥ŒÅP|ﮣi‹Ùü ~ P>¤ÔŸvêé1O»¿¥p1Œbq8›Û¸Òun¤iç¿—x5ö¸¢SÆàÂI0œ?¿Ùy­7Ô•4ïý~^Ĥ"{¿Ÿ»]üoÁ88Ø—YnA¤é%Ýc¿kHÈUíOà^À¿9¹3b¯ªqUç|à¼T¯AçŒ5{6Zuã‹‹s%2ùË(–™Äp|È èI4#bD6ÎÚ™Il[MË„†%)\3S@ª 6ÿ)ËŒíOc¬ö gÓ4á†a›ú1z®·e.F Fo=ì-rU[Þ©ÏDKfì(ãé•”çJ Uˆ‹ )]]FAùI)˜™—^Wj?ÁËÝã™;29RÉsŸ?|0ÃÝ™Žw+ •GáÛÛ«ºÑän“çιíuXøû%û š§'`™› DõÔàíŠÌ>ßÛ–^¾3xp÷ ÷s6pd*ˆ¹8¼Š–fê]¤vùÿt`ARÛta?Üʱ=}ãn KÊFŒFh5ÝÜ©®¢WgÑr¬¢uùznüD fƒK ÿЈú߇sè˜u°ÓkÁEUr ,±ZDÌlQâç'gs&ž|Ó¥fø?¹9e1ªxáLZà—˜K¶Ì ·ÙE UŸ..6ÞÁÕ±«ÉÕ3)IC™k@'ì¼ÙlÖs‘*ñv†ã(ñPTJb}-ÔUe±Å† u§?j³2òp†ETíD_ǶBõß$Îd†Ù•“òÖvýÛ²û®ÏåyÈzyâûøõ7KéǤÈúëP@·ÕÂÚJåF¯dh Ùï*8De·›M­q[ù±ÖVx¼˜»…®b~é<ÌÓðתÐx€ˆ t¦uš˜H ¡8Õ@-JŠ£Uȸ~wtxß×-iaÏZ¦îЈûé]µÒØÜ«ceâÈ…n!"nvâ¥î§Úm£šT 5EÛ*Ò†."ÅÈnâÞ ± ˜i*d¢”þ:Š3}VÍG·M/ÏŠ³™´ÅÏ'CZgZ×#8`Z 0¬¦JBšBÚenØ¢¨ÄS1Uâd‘ÏØÄ‘Çj¢Ç"_„‹ÄZ‰÷™¹ˆ×—dUJÓÏ“QͧŒcZÐ'äC:uÖ·AGìG£Û¶k#Õ¥Eú”bò)~Åþüï?|fyßš hQÖÈpˆ°IC€á†~9³ªâ©[õ‘TCI s”Ë·Y±½Y2ߺxÿÚÌ w®1¡D€°œ²S ®GÃ1u2ˆŽ›é·"L“*çi°Ðësîïxó`hqUŠ8¸ù¢J’kнíåÐ&›È¯É]Xhâ4]ÈFðZ ÇV„¶6¨‡¨¢-°›ŽäœÞ[ñI—qäëO7ÜÙï>æéá€zÝuP‘õ©×þmØÖMRìÏîbBTOLjæ<ó°¯·œ¾*¨#ñWÎU†ŠÆâ ÜÄ ˜ßuŒ}é“­b–[,ˆþ°µI_Æý§hJÑZ"±b Y™)øñŸXqsU¡Û͘„°Äí͈xϬÞOw[&®ïZ»J˜C„´’S¤–Ó&U¨¨3—jèX‚c.̆VÆ©ªÄDœÀ…‚^_ ¢èŒ¢“± –˜E¨#3Ê›Év¥˜*vD›ÏÇôèÙh$ •RŠc½¶Dk¬”ër•úåß99("¨Œ× ÚËÅ?Kúçž~isœÆMª™7ö_žû½NS¹Ÿ)J² ž¼„ÙJB ÓÐVªþÄå@”épfT^™ oê^x'Û“öî&zFñDtб¶ïq[B —¢¨’£K'”]yÎãÆÖ7 îÐ4ÍË z…ë/BpxT-(sË–ùê>ä{n¼n º;;{ÏRòz(VŒ‚>ÑÛ}PÜP÷"3g^¼žÁ¹< ÐLjÎ[üÿóýÿ‹ %#šö§at¤^eòJ¾YcìVˆåìEUCpü©˜bÇ` ‹=*H­[0LÎãß_/á±òT÷‰ûК­…#PSf–«TÄ_GÞy·Çüüö‚¸¼=dq‰RiÇòck3ä†Ú1¢ÿ<Ì5ï¿S0~¥%o„€IkLuÔjˆ B.š]Iq€¢éNOŸhÚ¿2U5F±tf1^ä²ÓI®jçÊÞûžnz«âƒ?{Ôâ¥c½ÝfÝsŸ$ÃS%½ù÷볟W×-Ü´6Òú·Ž •{S´Fú¶D^VW”x*´©Vl‡4ŸÐè± ¨Z]ùHظpá#%Dïã½êŠDûÏ—B0Ï"Û*3²Ëâ 9}vç'ûúœú°`œ®¨LÑ÷ã•Þ,øìÑÑh?Yk$Ò³%ñ–ª+T,·ªòe]4! > B’µ3ÇF®Š^^en$€úˆí§ˆ®ª9Ž«ÄTŽŒG çå—ÄÒîô…€%iÕÎ¢ŠŠæÐŽ•‡÷™ïk¾tqöx@6L°³nJ´ËfÂ=P¦ *,ÂEkZœC]’neF†×27Ëù6ÎL1eÆ9Öýüï¿SxnbN_o6l2Á&Ä*Â$mÀône%60O#«y‚j×Ù ïŸnhs¸&ÅÔB+(?c¸¨•btÇÃ>r©û#ž;œ¨`VH(œSª¡%LNy4þÀ³ }Žåt`Ú‚ÈF{n sÛ|÷bWS¿Ó–5­k‡CC]ÉB~À(Šà¡ %e:÷ó—>t÷¯žÕr¿wÁæ~´õ7tSÁ‹»ÿ‡w Ù¸¥eþ¿³äþDO;83ßàQqßÝÕSÅ31®§ØJb!÷!^âŸÜ¡DŸ,ÍןšSBZ!ßa °ÑÜ«x¯T}Þ—·qŽ6ŒÁî@bz&°³bÿ`Å@bÙÝòX÷èsèVeÚ/~ÔÍw–h»Ù™Ë);¨ÌÚ7ÜÂYíÝÌ iºúø¥¹Ü;±¦³;¹ËßMúꮈÏâ´¹}ǧç³+ËÙhߨy›"à\À‰I ÄÏǸˆIý3v*äÞ]­‹„»à9NíW)Óf¡’Í%œâŸzv+:ª3{ÖNçÛªÌ5êžG;ÛnÎC´Ø¼ïœu¡BôÉÒgÑLºÇáv#Tú»™Ñ ¨ü5—²`3|;U!K¿9Ž{Ú[á›ò«½XÁ¦AdÆý§ã¹dò¨ú}¢ìðh¸àß¿ïÁ@a©¸òrn²ÉûcZÞæ.˜é‘‹÷–#G«³›Ž/½ê  ³¿Çfú10mræ,œ áýýwô‹›IjÆ$œ$H ,¿Ô‡Ä5{'ø0¯ðª!u² qŠ\ÜM—T$͇7#é@Y­Ÿ rTâÄö_­}»ƒ±ÇÒýÉãödîîw°a˜cì¹WªL< d•;ž®µ#iÀÊq%ÂEýùÊ\Œ$ÎÍr¥×}rkuÈÑHó8½eû”Dâ`|5ì~[;5,ŽG~[8H¾+9Sm¥÷~Ï\½ôŸ#!Ÿ…¸øs8¥µ ÙõÉÚ2wôAÎþ©Ë($0C‘ì]Wþ8(qÕ5¨Z13³•Ij“R®]¦ÿ}zæ·D»z[™gR ˜ã—E ‹27oôeä ÀÉBôÍŠäN;±ŸÝ  Ø7#’«ü iBt4W}«†•ëMbïé¢ÝΉ»c¼Ö`X–ÉÖÊ,Áœéí©ðvß`[ ˆˆÆx…v ?¢1 J˜4$"ùpz*.Ké~åCÌèâÝãšý¿æ´ås3Ñw‰­÷yž¨µvvtÏW“,ǃ:úB9gŸX/»F26É”±g»bE“Áçž%päg‡‚9V\ÓšìPÁ ¿À3ß×öÿ±—Æñ 8àÍÚe}Ù(û,ûÖÏ>Í,¹˜F_7*WcIDõ³½À+L4žDª‹/™õTde‰Èñ]«–ë™Rf¹•8}¿Ïç¾ðB(ŸüŒª‚R3ü¶,ú—®Q@˜ÄGÅùï™WÝý‹¢Âä.ŸÚŒðÉûîU§ûcZnl»þUáJ~ªakÑ™ÅßÈèð|w"hu¸÷Þ†ÝkÂGÃÓ“Z…:Žª¨ÝX¹¶à¸š]¸³[ëØÖfGÕÑ:d8‘}žLÿxü™ö¥0|ÝǦÊ(¸ {ßËuªYÉ£ñÜ¢0y}òÓÇ]±\ßæû²zèÊàà%ò^ºõ´ÄŽó YØ+ —9ãU™{– ïj$ǡ붟SÐÔÝuÁä\ò’c`FaBØ"Õ›[#‹k³cC2„Æ!) s4êB;O&#¡×ß›ÊÈZÍÔ(Vcåy]R üDòl5r\ZMÊ+JBêq qYãTVãÂÕ$üÅRŠ¥zj|Í bnòþÞÍ0G¡쇵 ¥ê)G¾Ð,ãñp]¯è™Æa·.{¿”ìFñ_æ{Àë5½`õ†ßŽ*§êò©˜.z5~r‹«·dT"#ln NFUÑ1i&[~Ýnç?*»f³ƒÆ6înœÑÙÒ‹ó£,Ëå.w¯lû¥ð*ÂuhÝ&Å›‡ŸŸm•/tNoNîÅÞ’¥ÉÓ„8Çræˆjò(Ã-Ôñ±÷ÇΕókÈÞѲpS]ÚÉØ©Ê$«"ÝÒV|^‹rÃH‹l¼rªª» |Þ?—Š‡Ý¦}6Lw­U¸‘![NŠ‘ »w»ó÷®g´øî œH‚á¨î5ìu*ˆ•¡Ûw¡tƒ¨²0Š…>rËÔRmÎ'­ìƒ»»b°„k™ÃšºE 3K¬äHç[ž‘õß’ÒCæëÁ¡hš’ d¿îz±U$æ˜.b¾½’EŽF; ˆZ–Ë$«åû•‹3¨Ûî ñ@3ìo¹±f´ÉáDFÒ$Ú÷9…몈ûc»t˜Òc?Œi%)– íˆUÌÐH"SJHè÷±UïOx‘¿:b²ÿ´‹àðÈGÏb4ÊZH¢I*°¡a–¹wmµNzÙ®,ï§3y§©ÿ)—28’©Ây`ÒUc¬þÏœrL«¸âj Pê§>üû4§:÷}’A:F‘:ϯŒŠÓbìk䵪šÛÙ˜}ªÒk$$B%‰$¥S 2…GP£Ì½šÅßfš‰;Ͻþ0ç¼|+d’)"I'¨‰gH LnFÐï%Ûb¤Ø‘ˆ’›gñ»ß½Ä,tÛI&$ÆÚ\Ï’ŒSÒ»!#QBv"râ}S—Òv¦èd8G&M•‚!:B&üì-*ã6u.vICñHb…@…§ò[X²!r—jФĖë>vNjB«m.‘EmÆí >Û$î1KÞ^®1´6šjHǼáÌÁNLæ!Zˆè™(è˜(‡KÎß¼˜YÒ¯Á§/½òýa‹¹M{ßé3Ò^ù7gµx¸Çéä;}[¦yó¾oë¾$D[šØº–'Ù Îwwaïr5+ñ¸ ÌôÃéEÒ¬VøõµÄY£2ô.ì¦5Kß½_[ãÑg÷õÖ q±½ÔUfS@‰ÃÏç©âÃ^‹vž&xù­&S,ËUœ¹áa­ê2Faþ“ý óá§øÿ>;÷ñÝ cÍ»Å2U+Õ$×ÙèÚá„ ;‚ÒM}Í»Ë7]é—2e9pIƒºr3‡¨ÌÔã=#=·N#g®\››²?3¬aç&fòðƒÛ]ï?f“¯sµèðַ̻ [w´_3…ëd+»Kïñþyá a#Ó›l×jžHI/6H)•8¡ÀtŽhÒn·cç‡à÷ÃOEÌný<õá’?¦ÐÆÚËè®Wl¡¼xp“f Y¸«3Y™zŒ-e ­Wʉ?ÄG^F :äÇa ±ù"u©$x³lUÛ/)ÈpÔ|UÑ*ÁSG‚_¬žyY×Ù“{¤øä±qo§ëžcöù‚NIUCÆLûç+:»ŒMª‡oxtšÍFŽ¢eJ*¾O_M{¸ý?:¢„úßSý÷ól›Ñ8¦Õ¤–™–ÊdÑÙr&Z ‰M±%ñG*ñÀ¿¨×s“K;©Ìn LC&:ÜDã†|¬™PwÁ}pFuª6>HL-ÜëBŽ´8|Š?Úâ0«kŒó™#Æ«+s<¡Å\­€Î¨îŠ Êø  e¡­jZCuß\«…ÝÚr"iƒOl Ïåá‡8}g˜Zwl7Út!%ýÖEŒù(D%d`-¸0IÌ{Š.·#©kÈè_›ó~†±Í8l< tŠq’êü–R©k^}LbŽÁ¡°ýnL¤f+&á£"8}©5oäðgëšõIë>é<Ï»´"éDCÇ)Ì@z* u­#"çÎTmÌÛEŒç•“Íñr«q%^ß©éU NŸ¥Ì#§];3¸¼*b[˜tøbN…n#­pÔÍSäq¸HÚøöžJüï<¬Î¹XxAMŸ3í¸ ·‚ÓçØˆ§ ¨ËÞàËÊ´÷lyójÍ[BI™È¨£Á‹.QMJ. e°x÷¿ÏøÒûÝ“ò“_PÒT ñ|ÊÝ Jâò©òûudv„N÷ j¯!ýÈ}ïß.ïP‡‰Ý%/⻸J&bΔùÚ³qxÑÈ4QjVKxG%—ÐË3œ÷ör5Ä 'ÚeñYоÉ=U'eIIîu;yüµüø‘Ι:|ÿ×HÛ…zY9iFºö q!\˜éøtˆª©Ý'ÐvêXœ€‘?Æ*a*écJ¦¦m{&Oö@í1°ˆ´(hãäëçÇÎÄ‘\ÖÉ‚¢¾ëçßœëzûÇp½|pAí¢?-H.ûö{XïŠûƒR× ER¬«*9‹q… Áê a{Wìò÷ظêj£(K‘ 3Ø4+°µQ‘¦F ?wZcðgOçÅÀŠSSVQà&f9\/í?ƒb´#!^íšÇGõr¤A„ S2&Xÿ~w$MÕß_$øñ-‰ÀÏûüÖo9IL~þ ¿œ 3øP+ùƒüt´@V­K-7’~‰Oä0Vã#ŽT‚ ê˜l*Šçª¸šçm­ 7x&gÏvË· $(¸ÊSu›ÉÐWàäL%äBgIåÒ˜xºªÀ›Ù¹“ð¤:’yñatf³Iü: ÑUý+%;é¹×À­4/ÐÝ, m"`ƒv6ž˜ƒ61_ß1VsCÍøºšÒÑX¶#=#ƒ1º#Æy[ܵùóÇ)!9¿åvœ!_ þÒ_§YÚª<í^WŒ× àÑû8;.ª“½*ÍÑÉ àþ$ÆIGßq"8oÞo”?¤çŽNV4¾Él _c,ÔŽ ÑÄÏ]RÉ3Õã“ò11²¨%ÃV3ºwäeÉÕ¢Á†aft-™©Ì 6{ÊîÆáSì iÚ5¡vŸ£Ã sc¤mSt9B*P:ÞÅ£â1Ô›%« m¨»9C™7 ´(yBdR!½êó°³ø¦#g熈 a ÄÊ 5¹%Ž™Fø¾»ÔXv—œ;&Üù;"è6Á4üRa^ÄÞ´•/w¦É·Á°MU4ýé´d%4xÊáVÍ¥Ã~2Ð÷®Šnht ÖÁŠ ,dÈŽ ›¢ Ã7€ÄÌëÊt»8Œôüerþ»ašý'ù/ÑÖpñ4v zÀÎö3×±ãR˜¥Z˜‡HËFÈ‚Y4c7|÷ß1½P¯Ö¨³}Hí¾9Tú¾@è‹Çø]˜ÇEnûÐÝWa>ÊAƒbüä j– Þ½Ûºxí[ P7wCÏz®³Ã¼·å¡Á͹îî*kÒùk}oã¯ìR ’àI P„I"ȦBIC¤P!L ! ²1"ÈA"H‚@„‚Œ‰H0$P‹“ " Ÿé‰J 0@Q ¨$ŒH’!‘ˆ°d‘„dŒ‚ƒ©‘ˆ#IŠ„DRD 2,!"¢¤H1AH©D`¢ )RATY€À’(ÆQ`¤ˆ!,a"0Á@ ¤QŒ#!*Š#$Œ ‘„ƒTÅ!PB*À*¤€PB‘€"‘„#"F@`ÂE ª©! €Œ€ $"ÆF ‚‘€0 ÁX2`DŒF(²  !F‹ÁB  ‚2@ü P Q ±¨ „€1€„HD‚2AA(B I‘ƒ ¢ˆIFHI!H@V2)a ²$Œ` ˆ B ’CÿžnªÂîèªUDªˆ ‚ÕRÔ*ªUT%HJŠÆØÜ©#m¶”$ ÇN• eHA”Ûn6Ý:m²ŠcUI$‘’Û%¨Œae¶åÀD·.[m¢!¶„ @“„mƒ(e ¸–Ù- kmI1$À¶Ü”QUT ©"IU@-¹e•E¶ˆ‚dL–Û-s6MÛmÌ–YmD²Ûd²¶Ì¹p¶fK3%Ì™%¨ˆ–Ë&2LŒIŒb(@“ ¶@Æ1Œm–Û–ˆ–Òå·“%\–Û,·.·dËrfm©"IrÛm´.|™ÉavÛI¶ÛI·¥HÛEŠ*7C2Éd²Km¨–Ól³m-¢ Œ—--Ì—2\Ù›¥·r[m¶ÚÛ“›eSi:¹*¨FR –‚!ne̶Ùm²ÄM¹ss-ºÝc ÜäÜ“‘7-c¶…´²­Q"é´!€Û0I¡ HIm mËKmÉr\‰[Q-Ì—2 @„ID %ÛI$›m¶6Ð.d–Ù’ÛmŒdµ™#2K%¶I-- [vnæà™%Ë,,Ƀi6ÒtÚII1URaLcvܸ‰m m’Ë.KFI1’LI‚©UUPuˆ˜00`ˆ[%‘Œ·.Ë-¶ZÌf2bÝ­keŒb±•TˆÀ`T©b%–‚!·$¹&娈€n&fe™–Ù-³-³-,¶Úˆˆ˜˜Z‰n\¶Û,-––ÛŒ‘–‚"D–ÑŒ¶Ùh‰mÁŒ.çyÁ"F3–…¶ËXË2LfLʹeƒÆ$H"[mË–[e¶Ûe–K’fK’fDFc0-¶Éd ™%ÆTÌÌ‘–Ùm™-²×i"¤m±Õ¨bª((M±ÐètUÉuJª€EÔ Ûm²¡TB IKUÚ ÈÌ–ÒÛl²Ûl°ä“&jITZ¨ˆ ·*T©Eª¥UTªd@ª¤‘$U«K€K€EUTJ .»U°²íT¢Š¤Û`Iƒj•$”’1ŒI±¶6Á´Š@€ J6’PcH+‰EUT©rU.]ÕÀÝ-¶Û–ÛDK-²ÝµŒ-Ì™s&$H[’äD6Éd¶Ûm¨–[d²Äe™j%´¹- 32Ö2Ûe¶·C€ØÅJ’m¶Ûlªn dm [m¶ÔBÙ–al°c.K™s-»£]ªÕÂFî KTP€´UTTP6Û§M¶Áƒ¡¶1¶ÛŠHUT¢Š’H!DªP Y d–XÆUR±Š(AJd#$%"‘LÄ!¶éÑNŠB ±·T;l°DŒË- e€ÉŒ˜Y%¥¶Úˆˆ’æeÌËfY–Ö1“&2dÄ@-¥Ë—TB±‰"IUKTQz&)7 ÔûÿçñiOè4ûÈ'íþßéWþÇ~ãÿ&CüºÆÙÉÿòÿÉ¿ŸñÏ6–Š“‡Ql¯Oëæ¿ßyAІî1^¬ËL݆hÜ3xÁBïuOƒÖG“­4DÖ´rÕP¿ë.ìžnîêïÁ?®ý»›m¨J?üßúñô éûɹ|ý=~SÞCí q¹óôø>§Îþ»lHOþóÆÙ½%ÎcôÐiy ì÷o™ìG|d°˜AuÄõþ´•ô靖Òëì<]j R•À ÿ˜!ëijA `Zúøü|þqÌR@ÿ^¡Ax*?áñl_Ÿëî€ú&¾÷ß?¾ƒ}N0óôGZÑÙ_ñMäË#ý[=þþcXAÙº® ’bð_ÿÙØõSgâË}æÞ†ÇÇšøñ“­óXÁÛrPÛ¢öÖQެÇI¿³Ñyëž~Y l 6¼ÔBȇÿ½™ý¿öcwSÞ€c ¿ˆnÿÞ ü…Ê‘¬=ZÜoó¿~¶Î~Ùùžç·Ç­ûg¦ýóñ¯¾ÞYiê³ °»:£¿­nãŒÒ(³kt••ª)Çç´ÆÍL¯+Åïj™|ýr‹ó:ñ¯`ì>I!,²‚¤@Ã(-¨Œ’ªáº…U–à´"O@ß”Jœ}`~Ë=«y«×¦^Û_ÝÎÇËÁ£BS UWã±ÇŸ±U¬mæyÀ8+ ` }òvðègÅ/CZY!gݦ}§`цœ}û×ÍÏ>Ì ô%÷ ttÇ»‘yõcÊÿ—üùMþ„ç‡D“P“ ç^µëéòõÖƒ_í£óô×}@bz{\ùŠú»üz=]ª€'B@¦I²ÿî`O¸OÃÓ²§~üôïö<ï1O“o9‡áÿ¤ø?3îq©âvxª)ìoÒvûYÕò~sê`ùÕ‰Ssñç/Ç!^ À4O¤!Û(€|]ZI8ü! @zù£˜H}>~ÿ¾ß†ÞŸSˆN;Âgÿ¡RñÁ'}Lï­ä‡¿€Ió_Ò9Êof,P@…èú"{×Ïb†¬>C¸xßåªõ ÈOQ ffȘʓvêþzÜKžñá ôæOŸ±âŽºõ‰™!°]öùNîÿGþÛ¿¬X­1áø#C¨¬^%Tü7hUV¸÷Ÿ±Ï@úõ ÐY˲pÀ·:ØÞx¿SÔá8í“Fx‰Ì¯"Šo5¼ý“cÄúq›g„¤ ð¿—‡y±è6aשõ!Äóé>‡i;ëÍü5¦ž ýƒŽN¯åÔÚHsãoCàŒ ï5 ³"ˆ×µÈBÐXR+îúLS~KÁƒaC“!Às1éõ|T´*Š9ž2d1£ã]»yšÉ·Ä=ç»$?>µÉà!):£_$#ú@¾ ONÿ0 îüuÛÔïè}ÅT2”(4_КC(ó˜­Ö>¢ÑY´Qu-…w ÊE–ÉL–’-‚ÂS-–À2QŠHªH² „-…²[ˆ¡"¨H?l2¬vM®7nƒPeá’¬•c—0È I”’”‘d hIÀ%ªÀP¤rÈ$,QI) ¡U$´*!9ÔÅ E¡Š-JH`«ƒiµÉe4ÐÚÁÐÃ&Lªâ à¸(ÆFl1hÌ£o­ÈÅÅYiãÁùVl ïç?sè¬tÃÜù1ЂŒñ/è|j}vØúãPXl’~~ð„Ÿ|÷~_/‘ÂCÞh’§€Ä»6Á—s™Q.Y¾ÒI£™/î{ûèÄ–I;õòôí™èrzÈBöžŸ@òOÛ_#Úu¯cúCÐñ3àD8Iè•êûz}®«×ïøoè䢠{sÇ·äg+×ðó%OÏD÷­˜ÛíÔÜâ¼g¸’AŒ 7PSÖ¨³åVÙL© ìzvü$Á!7‡c¯¸xˆNM!Áø¹Aaò èÇjœÝCç&„(,|×È7ØIgö;j¶ "¼Íóé»LI¿ÎAïfÛ1ã±2:tc!´½]ŒG=îËõï]Õ®ÕàÅn—ÉaÿEÈ‹:â…QBU#ç†3ê`ÄCl‰VÝ«ÙÖlßt+'⹕nÒ”«Íæ$2”Šp9÷ä`m‹¿_L¤!¿‰õCÒ=´¼„”ög¸Ë˜ ryĈeIóñr¹$ä °Ò§€ „ŒñB!H„Egd,BÒ†R‚‹?¹ˆÃóã×Çàï!øNÚUîq>a{I…,›Ió¯± C¿µ߇±=`èµId‡¤’Ò¯žæ}å‡Ç| ô;=¾˜ûž“™N‚!î„IAzôé ÔÎOÂáÑÄdžôC‰‹®ähúnÜM¡`XÃééTv!†( Éò0J>;πɱ°†`p(ùB€ô“J h¬²mÛ?cÎ>GÄP¤†ÙRVw*zÃð×Ï×~8ó:ö,9=6=k}plu'3Õžþõϰ{{zwÆÞØ!óC²_`©{4fëgPÑGÏäK-ŸSFB¬rYõ!Äñ7;‰Æ‰ï ‰ÐûoO_sŸ§ß¼ïnj̙ö¿Mϕڶßñ±&gÛ´ ÎÐü89YgnÝùÔ›Õ¦É.« RLänP®þÐÔü!´ú>Þ¿lß'ÖT÷M¤Cu>I@11Ð}TÀI‰•BCÌH‚* ˆ¬ûl Å1žgSæQ!ÙŸcìy–$ö¸T*#oÃâúÔ7›ø«÷CW¬ps%gÛí¿ ¸MP†°X˜¸toàóÍ·päyÛ‰&»zÏe3Çs4ñò÷¯IÍãð.B”ÒrðýbFMã%!è…¢vRÂví¶¾‰žµŒêòU†ñE:<É'D=OÊLfEpa&jQíWËÏmäŸëT’MõÚ>ìE‚¬AE`#±# ULÜðK™1¶IÅúÅ=«” &!ü}‚?$ô:û|¥ýxû}¶ìb¶è¿I5ÉFø¢,ÐX f!;öwb'§™ êzÈ¡Ñ*˜‚IÊsÎÜXo;ær†óÁ!3FÎç5W8½¯ºIù0,œHBL°" “ÆÅ°àê|9çÁ!óØ;ÍÉ$3Ï©—2ýCˆö ÀbÁ q$ $†tmަ‚½òw9Ûñ›à0—Ý òàêL×F€Na'›ï|óÔÐÏšô¨bÍÂYE¤$‡mo {ú÷2‡:Ù,'ÁrC½úYD¹£é×'¼–j>WED1ÛC{H @í·Â|÷Ì7„Ä“v‡É’R d–Ë0’… eRJŸŽ÷f9HA€„PŠÄQ!#‚ Aƒ3dÈP¢‚ˆ¤‚j¡0É M2@†’=RI;‚Be$¦œ°ü™-’C¦0 pÜ`²Ø<¤‚FHÄë ¢QÑ0 ¶g!ASèÓÆ0º?Œ#4%€†Á8Nïçùú¾|õù^}ûé V?…6èò:…X(*ÚÙH] ™ ›•• ïê/·Êæã|E¢‰DLÜ݈Òv$/RdÜ¢o|74tï&‹>XÐí®ø‡ð®IÇtyâ@=Y4’™¬t艴|ô+­Âw•ùU2é5ŒQEi—!ŸÃøc¼%Ï‘ãœú&®Y8›ù‘d«äx›~TLhÜ×µWÍrzŸM;Ñ#fÒä,$ü*« ²B JB RÉŸ¿±€-?Q}‡ÚŒ›K"&§÷í2'‚øÇá¶•KF`09È”X„ú¤„!b†õßéjÞ&éT¦¡ÅJ,8»@´¯^ ÊÚ<Áø¶¦òs9”¡!·k*bîl} Ÿ®ì—êõeC úÒÄ’›aj‚á ¤=)ä8‚O>Áζ‡ŽØúV)£ë1xX—^‡]¾Tz–¹ää:!ƒ"Ñ$Ÿ©‡Õæ„0Êd!)%I‘ Ì! „˜€“ûª ?þJ…ÿþª„‡,„©¦QMB¨Ú¬‹%Êhý—E ¥-†©h©ý›¶ üÄ>ž‡ËÍ|$¶Ïç¨ÀœÑ³IF˜Qù’ UÝÁ!aª…n4??Æá½’7@éœ?]ï8;6oÆÔîóÖòüQ9ç«?Æ©O ÛT͇‡k¥:N™iP©sá²¼ˆ°d$Ö¦çõýÙŸ·Ì“¶½ãûÄ4NÉ'{É’…Uˆª¤kðý–ç©_»ÐÏ¡0Ä`½2Ë' 3ùÑ QÅwûcÀú„ú°<Žn †Úƒp³«¹‘Q5  *ÍÂ’}¥Ö'9¹,£“Ò`0˜g $IQ‚16,í,!{æÔABÚ¢i²)Že3 U¨Š"Fû¡±Úù!œì*m^„2„ñŒ¸ß›Rx&Ñèþ°»ÏRm]öOmqѺ2:¶UT,XÄbÙwå]- @€ÔJ²ªè¨”“m´ ¤”Ž@©óĽ›ôææv×T¿7'«'”€Þ=¬Æø=¬’Ó ˆÅ(AO=0ãÆ&Ù= =€¤Ùíp³òþ;ö=rt@?'¬Úí3Š8êˆÏÆk&Wm°\Ý…ÌR’‚}›d,»ÆŽú_¾³ùAˆbÉ3RQ50ú>ÿ›ƒ£Úòú³CËùÛš´ ¢«Ï%Pϱ ‹¦ÄuÄ’D«•R¼4Œ—ñ^¹Û±:'©díÕ@Wi.KÎühÞL’¤D9„&! ‰³,Ë( 7Ù;Wá¿=m© 0D„J£°–0Æó¢Tô1´ u“]ó“´$)OçòØ’bI òUJ°$ã1 0³Uc XÂEAU€‚Fª¤ot@.Qå „,ùÚŒmÑ%»¡ÁP2àÂFZlø£$©Rêa0Ð`#(…‚É{}­sP_é.Àú½ïZ¡Z›`!éBI"‰ˆ¿-¶ÅJà“Ö@èN›ÑÚAáÐÿGí¨ÿ ÔjS¿HÝiR™¼Y'þ<æÐß »T†n£Ù¬Ø „0=î,Sët~•$rzÑ#(­ík®x÷ǞߎƓ5°É,®ÒÃEâÞÅPüyÞýÎÙÉ&Û)À2¤<ÔæÊATR4U!*ª’P,Œ1i RIL‘`°$¨TV ’4 \%o¯~ê:“[&ÝŠÜ/Ï —´|á­ó‘45MB}_ž)EÕI(I¬ Õ믌÷Ô­òA­ê©l‘/ =Úºùì]öb*îád—gãU𤠰0„œ@fSQFV'¥è~†Õ‘ùö$68Õ\û<$íµ€t„€aEAd=]ÄÐfŽl©d©&Ǧûoó$èâ,úT)sUÞ¹‚aŽû\œrT¸ñÍ E ë€6ÉØcé)DŠ0dUe4!íR’+" B dÿ-3ü6‰fXÄDc E¹.@ÈÁdŠDBŠ b2E‚Š)EX¦RÅ$Q‰ õ«`‰`L$30ÄHI©+¬•Ff™-³Bd$F b ɈʬÈÄ„Ì$ )Tº¡,šoÛ«¦,‚É ¤Sf•{T§Š¤ú¡óíîcÓ£9‡¤ÅôÁëê6†dÖ¹›OlWMÉÜÈrVÑ@‘D†*~ú –…QTÐ`10ÂU‹ŒLˆÌËe¸œ–Ù(¤ù¥ 0ŒK"0¢¤‘UJ D*Pˆ ,QQAT Wâ×ÿL]¿•X_ÿk› ¡‡üF“)ƒ"QEU{úyûÝØ5^¶ƒ@D- WúITDZ˜ÐŠ`6‹§Ê(‰¢î¨d>ÚZÀý§7n!FÖVÛfÙ1 ŸÇŒfÅ·dåQM¬·¶U•NŒe2ª—ü®š»à¬¶ÛH·eZ œ’¡°j«þeT^ìÿ§¸¨³˜«{’ÒBm%“ŽäOZºbÍÿí“O.îø£N0Z°‘a"QHQªBº´K¦•[[jãAiË$ž3 ±Q3!ñîc†whƒb·¨”Ùi¢ÊvÞîÄ4¨iÐ’1Û¢±¤p˦ËH{ Ygßý¥ Æ4…G R x$+ ’œkÚ Ò±76G8:긻­2®¦)¤¦¥_® d1Fåw ‰6NÎ(þULÀÄJßçߎTý$ è”‰‚¦j‚Q´ßÛ9Âå›u±S’a#Tn©½ä%S.‹ ƒðØ®+ n2L+$µMÈL˜ ë&÷;¶rúÊŸ‚e Ù2*q9ø@…ã¢kÖ©ñÞ˜ý\¥æ”ÄÏ)UErHeF,ž CB+¯|vîtgb&ÉY­‹ç2A›!"qxQ9Eï$%J“ÓA§ä¶#,¡Â³r‚m T ·žLaP€¤„D¢m±2aű¿\NŒ’o!ƒÓ$ø!Gð³pfMj/t2,ï¼î1ƈ]£sa›Š(˜îÒ`LA!T'¯ÿÇílÒfzI»qã¤F]@Æ× ß·Æ%Ìæ 6jñ-.ñS<Õ1b{q2Ž`ÂE‚…ÕMA :˜ß¶5?¿~ œ]Þd1iÉ2`“¹ÖÌêöÛ[N‚¸`a»Y(œ³a¸Dëºz{: ±d=E\BÎu‚€Œ|êOs[ÉÎàäĺ3'9„\Nì4‚ÊÜ8‚ò2ª¡PJj?â~û ¤ÊQHµ[vìý„ò̦:ÃV[U(Ä¢ß\\«×«A‰wr)bÒm¢”ÙÜ1€¿á3R©ÞÏÌ3í‹a¤p~G;Ú3u6¼æÉ©F››?몂Æ×ëe/|¹f3ÒÔ{Sõdfí¡³"ÀÂn¢ÙÅÀ<¡¶ _[oŒõ¾åzùï©\Öw›€oøTÊ;$¢p R„Âz¢`:1%§Fýœ^Æ»Tlé{øÀ¾U¥¢`òÆúc¬R~æÑ:A½hêFöÕ¿°‰,Ì D~ë¥õ良‚ óx7ü_­ 4¥; ý§ûÒKŽq›øT~-kA`9ÁŒuÇ¡ñ×as·øaõ¨Ýu'ý˜ùûð‰½x:×PW‹ªèƒæ•ëñ ÀX…B'Ê[¿ÀHnB eÞMØC”8݆-]OÌdÊ¡éŸß£Ìê®õ¼þhÞ1øc ý´ÛW$³¦Yrj¼W7ÎþÌ¡à©LöÛljV0tT AUzgq {|ÏŸyl<C×ëøùPøÜà|ýd©SÛo´ÿùèàÜï,Úy;óèCo•?ÎìWš+èʺØ6ùëÝ—‰=™`(õ„ü äà5ä>U(¿ß‹+õöø! ýõá3 ñ;ý1ï^¤ö¬žÐø­ØÁ’Bz°;ŸsϘü@¹ÒŽÇûDè¾ !>¼¿CËü:½@ßùÐuHMT!?3Œ¶Ò”zª»±ÅHûÊ8í¶üsõÎÆÓyît`]_˜sÚüŸ-Q“ÓÚVО€ä‡°‡·lœÀñùì>µÑ±Øù Ôï¹€=ù’óóí=Øú’O`¹'ƒÎ‰¿¬õÒ"ã¡Áü§mô4/ñáù=^æŒV’#ih>GOÎÐÓ u‡ÒôT?M† "¨H0@4LoUÀÜu]ß¿0<Æz}2þ¸QTÕ ¹ÏÀÂcÉ™;!à æ¶ñ;Ô“>˜Û¼É “p0uPºêXv˜8¨¶%Cæ|ʳª8a*CpâèM R2‚Q*ç¦å"Ì,õH’å <08›˜VJ‚Ë». nO‹sPÄûN5'áÆÎûlw.~3óûNI Ìñõ”Á‡€à(úæc¨Ô(>¼c;Ã…y©†q’ª?ݵÿê˜Ô¹†ÐP†™d  »ÒŽÖ€Î¹ÅðrûÙ\ØRJ.”ÇÈx„>¡&á;›f"!t|²HNg‰Ò¥5Uö“ÜÝÑ<¿9 ôŒ=+ì¢ ó»Ø*¨6ÑÓ êÀO{ñ7HMsÜÆíÂ0B]ëµW§yx±…ÈÃÒ|j±îT“&µ½”¬›1w¹vª•ì-C –†(ëµtQ¦/®Ø•?nÇE WS·BF]2š(äáÙê¨1µ9¨ÁYÙ&¹¥%]+3;z;Ä=^w䟪¡ù~\ñ"‹9ñ!rz¼†Œz¹ŽQÇÆ²ˆxIÛÔü?žes“©·ËéÁôšžž”$"€{:@- )°BP>(ö‡,D€¤[’M0ñ ³€1‰„r‡©F¶6.*‰´>Û~À žûLòJ‡®ŒD,i~¹fÈ zÕžûg;z|ëÏØ!®x8ðQ:“"=`{Ð..P I@bs[ßççŽá÷ ˜tzrv³´ã“ƒílþ~ø>áó>¡³°g3›æ¡øŸ£¢üç'áMööíç>ð ïnT“oÀõ&$ö uÜ8´€4…4*%BP¢)$„¢¼ã×2Dî3æ|3ö£“Óð¸Xœ$“Ò…l!‘íÖ‡¤—°Nì 5î|0,ÛDE÷œhÌÚÂ„ŠŠwgDIÒF@Q™dXLàžY†GT¤Ð˜ŽmQ¦ SÚÎÿ€‰’æ@5°|ÈçûÆ~öR%Â’[U—fd4S?m÷ÇÐ wCñü5 u •¤¢I%¤R˜° þÐsíûÔ”€¦#`çäü‚ÿ,’ÚÕÐ^ÖByEÁÜ’5hÕ(¦0èº[d[e/Sˆe&ð•ç7N1WyBH,"¨,‚’(),!B "€¤"ÈEXCÅQ€)ûx™¾9¢ŠZ«ªˆÏB‚ö @NãoÀ»Ì{k,1&¤ï~ïrHcR6Â¥Ë;ƒ(@¶AdçÎa!Ä7ÏéÕžŸLjÈy^µG3%ëë´ûýGm¸nó®65¶iUïP1È4Õe¸šÎºèk΄ÇôH€¾4ª@V"“­…ùeŒÐ‹A*¨r̲ZŒÄ¶¦C,µ‘–Ùr))›ÕÚÄY*¨¡¦—U°T´*,¯Í,.D¤Úè—í ÁçÔ¨Z 2” :©'Õt³'¿<ÝTž§iíEyªÛåGÇá>&¦LÍjeÉ_«ZÍçW5£Û eÓN/'O É=kå$—ç&% aWSØõ*,Žhý‰i}J´-þÉBMÂTÙòàøÜ`Má'_‡ÞI¶Ù£,On¦Ó& Ùï¡dÒW~X»/q£>œÃæpyìfÉHð,¹“ÏCX×0ôÛ£‰àHk®ð€fUëe%JÀº:_¥Õ*ªÓa¦‰‡øm“UB+ú;b,$Ø>vm'² ï|¬Ú‚ )®Ð¯Y\¿äž±1™+Ò DP×ÏŽ×I_U[}˜œ5˜ísúFq=3¨VÖVQ'йÉ*ÿ3VX’ºO·3QkšëZTrQ±‚¢Hͤ$Cð$&¡roU)$¢MµB.x”|ùñŒÌoÔ2VÐÖÇD4«2 }Á¤TTo¨‰¨4qD ðªÐÔêMBì®H3âMX‰@ !ƒL @tx—&‚†´Y(½g9Æÿ® ;òJÅ|¥P$E^ûrYØùy$˜<0š˜ &ñ”'aŠñÛó½fFÉ…ë„Å”’ÉÔ©¾fHd'ëÈÆŒ7EÀÅàí™É ¡‚Ey„"Mú04tÔïœÀ7˜øƒé ì~º¶´oÇ⟲§sQ…m<ÖS;["…™0>ÿB½|LŒUÍøOKèêc¡5(Q=YªMFOår‹ … êt@ûû{·Ó×ò}þõƾÛ|cGcÎ{ï|s¾Ý¬4Wñ‡í8_ççÙžRë>Uôw1xïâêå+´ÿ"ŽÙÖºæxÕzÿÁÜü'0R‡=ÂJI ë´Çé_ËߘuíÛÁßßàÚìÅå<¼B|Âü'=œYÙ:³}÷«W-~U§tÆõ7Å(ݧl_Ê.¨úE®µ{øðÁã彪ÆÐb7eµv?–×­ÓyZ7üÏqÀ[„4Û.2J`‰‘UPÅ„>‰>¥NÆw“‹$æ›Û£ÂoœíaWØss‚‹$ó°)=À/c³â9£+Î ¦v,’h|½ÄúX{ÃÆû•ó{yíy¡(•T U«'›†îx+(µð̇­Ø£¨lŒ¤ -ÄŒ{ô€°’’Û•øìýÕ6—Up»ðÌHNŠƒ«`B“¶Þ“ šŒÓH ²±˜N.ÐáȽñ[˜ chtxN½ÊŸ†È£ï1øÂƒŽ§ÐÜ’quŠ$‡¬äï z²*¡<ž’´ gÓïß¶O§ãÍç­ìj”®ýDðN'§ɾГрD÷ó€õy…Šj[í;xkMö |v¢×6wÑ2dà $š„‡Ÿ[0§_Õ ‡Ïæ{G©$/åW.z`2` >PàGÏÊQdŸHÊ·éP,êýþsÉѧ»“Ã>>T ªÐø‘8°99çvOC€ôö35€Úz€ìó^ SyÕj_@­Ñ–°YÕ{² ?¿õ¿uòKfù1ÞöÀ__NæˆjJ››ìV„&ˆaYµqÖÝ”%f>ÆT¨ñPr¡Hžçäg' H…#®/†Pld Œ÷PÐ_9‡j‚Ÿ“Q' $(&)4Y’‰‚£C @™¹ÕÛ!`ÈâœTÂÅV1Q%Öh¬ɪçâ‚þ2oPýŽ6û·Åý~¤ìÄ+‹{ׇ>+Pê‰òìzÔØ‡Ô²_Ȧ ÒKÇÞè÷I‚”Dý‰rú<ÏÃŒ@è:ã~<šÂhï$/j©@¬®Õ.{²ªÊ ¡i/î‰R@a@q@yCò¬63œÐœg6áR] BÔ`S)"–ÉP&* (·øQWm¡š…~Œ€L ªNªˆXßÚNÙ1 °ÃÛ˜}P2m2ÏuRô|Tð{ž¦¹@량çr<(Ÿ´*¢°ŸXÂÏj´Bà}<ïE ±þF0z\÷œÏbvä1G±›¿‘w¿Ç¹ŽÐ«Ó¨tÖä-•÷_EÞŸG1SL z_0‚Ø®™5;BP{Ô¾S=>ï¼ïTx%¼þ(½C¡7óFÇÓÁ ¦ÇÒð]Tª®ÃœÙ¾|üz@——O¤=>XŸL`Ôó=@S­ß(<–uÊ”"*e" ÈÑ$ID³µy¶Ò@XP'·¶>¦¡SЮ*eãU•+ 0ë±€¼“ëjè¦û“I!ßs4~¤|Äï¿×!ôæáµBv8 ì@Ã;Âd Áј…ÐPȱ‚ P‚²$XŒ’’Dm…2 EQ-lª©-0ÆÀ¦QQTZn©Û ‹aVœš"L„Ûm¦ê©¤¬Àóå›ïâìÚd®˜ bpLV`hB™"BGDa µHS9˜˜šööØ6 ïVyÜúBÂI ‰'™ûBuíöªA•(ÿµ” Â[EBïÔ}eÉ$ÓãØúpÖõDªq@§º° ƒXo?B`ØtÃ2%’І’¡ŠA üJ±1PˆR“ÒNðÚTùq(åK¢¤~ íŒ6~I AE,“¶tm™ ÷ØÔ(Ä2Õ©IY.«ÆéÝg=¼µE ¯ˆvˆ* ¢Ò ÂMD’’ ABÄ" Ad†è‰©&hofÉ›™@À$S )E"Ť¤Aa bÉ’il‚ÀŠ”… EZJiD’X’€I)„)’IJ‘@‘bŠd!Q¿µÃ0a2Ð*JB·¢‘.€Š$ d”É0… ÀH¤sš–b¸í&—}êÄ a…0†É¤’ˆ…¥öÇçÁ7³Çt±W]t]/®Ç6$5®}jí ¸4nÈC¡ÊF¾¸ÞöØÜûïºêVÜeì(Ö!d¾:Þ´Œ=yã`e["6,!ŒÜñ‘„‘—ÉšÉêxyË MÍm?2x Ñí5,6ƒŒçŸï+™ÆøWצúzï±rŠ+Ò¬Ý÷h ý?é}õ˜sßšxh®shà¶ž(Ù4jÉQúšër«íQ¼&°3=dãðž1k}y)* ÷ $²|m7à6JQý„(ôÏr…;ñçþnaš¬|òa”ìɦÂbô›Ö¨ÿÙ†ìÃ!(b„AI…¥$…´É-”„€¤‚„E€°’®‚à)$P¶ì™(1)Ù¬Œ0„&É $O)˜(,P˜ÃTÀ¦¨(b¨¨¨švÄ¥hˆ¥E©È)_z\´Ÿ“ý‹ –eíµoU˜ ÕEå0˜c1aŒÔ—ƒÉ’ä@¥„¦‰š¦› V(6º¶S)- m(ùI¶C¢h¥°b–BU2²QH2àJ–FÇÅa”­8Ö­kê÷páÌ5ØÉñŽ3±·rºCß8˜šÎÇÏ&ÓÝQ7{œã¹.Š+ ŽMwÛ®óh£¾ø åp»øíÚNƾZâÍÄõ… ÓRh=Ô}%JHø~§Äêpp‰6ø32-GÞLB”ûÀª=¡?ôâ¡ÓßúûÔvTÝÌ•‡tÇfµŠÈïsKÚïÞÖ›tNº ÖÂÖbuPË,ç’v‡[3ý5y‡É>A؄קÒCçBЏn¿cÅφMþ7>ž¼po±  å'<&įõÂNKô5ßÂE;,°4Htàç·%ÛiˆL;[}/è ª(~1t*X4$ŠC ŠRAR˜a}p⣂ŒBÅây ¶N„”2“Ua,j¤D.‚KéËkt?ÇØÁ^s~÷òe@Žlæ$¼Ù[££ð«Ûq ‚2j«!òzƒxëTU¡*«H Il¡Y ¢‘ ´D%¤–ó­¨3NÞ}=p^Ň¡R`‡¶¦P~^ÇSo3ÖÛ&ÐǃÒdúCyxÚ¿r|Éýûrá :…Ï‚)c$]¬ÚrbÜ~“FÀYÈmôÌ}ŸŽ9Ÿ›UÛŸL˜„òÀ;°¾ˆ{ü¯î”6ÕØTÞThjUc`®LOš›”}¾8²IÏŒ!.àÁ¤Ÿ9dz€§€É0yÞGê?D£>BÀdÃΤ•æOe>RwšT*]Þ‹ÎJ4I Tó£Ñò5wk?(n 6ÅCÇ~NÓ[Ï;¾Ä’ä‘.ÞÁÞ»šëŽÙý~b¡ë5QiFÃå98D 2h6 z(˜‘‰H *¨J‘D v³cÈq Xú= aÑÈwêQ‘É4kcv@ySñ8ÞzN7!7HE›Lœ5%‹%YE´"ÓItPÅXÈ‘KQAE b±J–¶qH Ñb€Ãh1eQBIEÈH @ ‡¸2V!0Ø¢ÊPâñ ”DC"ÂTÆ,¢P&FÉià ec%É7wt¬5ƒþ—c’”C}e\IRfC8Ä/Û®[sò—¤ÅÑW @X‚lœ?3´}³eR…%:ô¹€â¹×™=£çãÃ9Tz‹<(æÒUrœ !듉é’ó¸ ˆ;€ðÁ.ïØùŸO%›IµOCÊ3ÑÉÃÉVr@“ÁÜ„= úž )†auQ#´¥TX³*†»’€´4S ¢àPj¡‰‰"'n€«••ÿm–£ŠFãvÈUï á^ùìÀf$<ÃCsÕâö'Ù’Cžî¼ÀÞIgާ€÷ÍÐAždÁÝÌ'U¢ŸNòª·¹pÖi êhšú'½ Úê›Cص‘TžhFR4)RTQ”0¿ô¬ ‰ˆ”aÞÀ¨Nüœ‡iÆŸþϹ×›±7ÛL7qxÌÆ)é‰÷pßË|K~Õ·á_g8é†qX¯¦ÿ"ØËï ¬@óßlÌ\”‘aÕP¾ß÷{—ÿvÏnB0ç7oâÝÔF{Óß¼!<…}÷*wC,Zh⨡%i™X(Aa CX>ŒèÂêh0mùzü}ýׯRc}|ýN)uíÜîIè Åz H=ñÎ\” BarF©À!÷ó¿Q1mU=çýïîa”Ø|eÐxðfq1PÕOLK1SÔ«D5¶Àï[Óá,¹-ÂLQE/2åx »²ò‹¿n…^Uˆ UWÕ=ÓÆ>WxK ¥aø Ê«À—7´s‰ã¯ÇåSU'~‰ ŽÞÜzÙZ=\¯ÀÖóG%{¶Aaþ~f{g#Mºh(Ý!H+¬ÚÝC<ÃÉÓàˆ1’ï ‡u,ăa†IL•‚‰ ,:ÅæîC?ª!ßïfŒgâ‹pâ‚Ä }ÓÏÞTIfL55‰Üø0D„Gocy‹Y¹óë{£×‡„cé‰ ÿãÿÐKE‰:ll‰Ê’ßì¦nÜ©E¬XWýÛ›16²Ú\J¦˜²“ímÐ%1 ÿ&Ë*õ²FÃC'í€W̦$cUbyº¦„“ E‘V 0É.hBÀ¡ûÕ+ gÃø`ЦH H±`°øaLY°X,ØS,†‹"ŠAª)”ÂÁHd dT $Ã"!"ÓŠB ª’I Œ‘a"É"ÀP‚É&é d‘[% 60”™g*3S#ûXB^y¹3€?íª¤ÊiÕÈT‹NZ‰—–ìÅEbt…µŸ÷9UxL´faéÍSJžß;bTŠ˜ýV;˰e*ßù_][å%´*¦ZâÁ:s©ÍÔC[DeÛxÁAˆòß0µ e*iÍ]p²€XØ’:3þ¤5QX1ŸHhvzÝ2ã‡I"‰©I+‰¡4è´U j¢¬’S*¥]Üx¾‹:}wÜ×Y¦7„…\+Ñjê©ABEÆø™9§CwE¬Lh#ô–†™ÊáXC ØËz˜Ñe–Áü® JŽù†͹|0b\>6|À¯Õl[ ha5Šfñe™ÉB#‚0̪ÎÅÛ¥¹Y¬’‹“&YCE „Š"š¨ÂÐ!ŒhŸVDšó±h:}5Dé„;!”mJ(t—u)EQý«HªÂÈ“TTtˆè·p « ¼ŽÃ¦HDÁDªÕÊŒm¨ wpƒP[.CK$Á º(+œ\–]U¦-j(•´„ªNŒb䋃mY”Å#–äUÅT¦#„ dÞL« GS®>!'̘Švê¥,T1¤ªŠn\¢ã ŽÎH9*Jtá)ÂUÑRlÔ6”ÈeY–…#tÊF$ÑQZ¡É$¡ œaÿ·Œ\qWÜ'î$…íä£'Š¡ç‚)A!<7Õ>šó³G§s®™$±C¦äôQþ_¶‹áÂ7åuz4(¢,°}¶uÃßø™³ ×_5XôÚ~ÑxH‚àn‹‰6ºúÝM&GÍï½V2¾›|Öµÿ˜©ÿ ô´™ÄLÿ½˜n’þÄÇßòGÿoòZÏö߃Ì;Ê< § ÂOd†‹' )mGÏP'ÊÜÜõ£?Ç?¬pënÇTÕN’æ6oÉæ^ÀÞ-¡ˆÜÿÍþpýSÐ>qUU¿ÄÍíõ82A`Œ‹* (Ab€# ¥©Û²àëå|VÔm;ö€Ï" à$¸A,Í:'D›ýû’ÏÑ'h|ûš'°²w@é“­oM¤©;{é77 ©9K®¡?gÔ¦Ízö1Ÿ‘rWÌ•´ñ!>rç¼áTq©ãŸB\$)ÃG©G(‰¢Àˆxˆ´‚0< $"ÈE€@`„t„ cð=,Ë$_³ˆ^F½(¸ÅQÄì4Рڋö¼lÔ2‚—D©Æ¸-…‘H$1aÁ¾JÏ—¢#k‰í³ˆ¦‘Åàm2Ρ¢=!EÂ|”SE0ša’‹¤4™b€ª±tÐú hÿË•"O.èý_ÁåŠ×ÓdUTZ¦#CQ„qRš•ù2DG˜2HVp£;à2ÄRy@)’ $öû>ç¸oÛ'‚z‹4ÔŸr«£±çŸBŠŒ †Œ ö…§ŸfÛðÔqõÒ#ØôÜçÉ&ñ©ã]¼’úžX„í!õ!ódJ©'{3>©$úü{w½ü@3ŸCÑœsq^s€=& ¤‡ ø$î‚0Q‚$"A’,° ÷òòAE!AbFI ‚ÄÅ·ssŽŠ’~ 2öï =ÿo‹ÉÇßwgŒPOTó÷„*|ƹ+ÌÜõ pŸuD—†Ô• wÜŽM—Þó±[/·tN´}ý;Nµà&ø™žàqßS”žbq13ÞcG¹;ÏLɱ¡$ô+iô<ËIL `!Áæúó¯]É5Ïd£žR<I6 t‘d$Ú“ÇÄ  «) ’vŸ?®Ó¨B0˜ð§ê ð¨]HlJÛU슊Ív.gÞ7Ô{ HseÂŽ îq’õ¹ÁÞrm6Ý7>j …À$°9:ç!ÁÁøñüÒ`, *î“Î ´XJ>³ôxº!ó?/®uŸ×uƒõÖß|\ ÝX.é,eû¶c_)ôCŒ?_&·ý2µx>Õ;$ßÅVÕòÚÖîÄ€Ì Ùbf€=&Ò]cÒ츒 €ƒ$Šç, ÏªÅ‘_Å)Ÿ­ Õn_ƒ’¤¯€Ãœ€êB íûABvZÏé•vUQCTQêÊÐU0AÝÎ ž``1Ÿ¶ä˜H°Àb®Iø0: VjÑ•/± „¯s½;Êïxúš}&¢tW29+œzMð!¯A5ˆ"Ådž ”2Æ™=è¢e9õçßÏ&Yâè Â*Îᣗµr;! üçï$Çiú˜zyJ!3¦rH÷8Ü$³}Ð|š!Ó¶óÄ¡`) & w ¯JÀß$ºFÓxvôbF93«© ³tÖ&Œ’µ%)ŽÕU[ûÊDgò¬®Õ]”LÔ!&@Ú¥îLõ÷i“AÑP›²H~Œ%'iYýW‹Û¼ŒoÐßÓŠôÞ”šUó=.'’UG¨j¤ê:õ=‰ œ¨nͯbŠfG“ò ]팟‡Öƒy™ ªøÜÑÄÞXÍ¥~ªJ§&%ÌJ™2/3}Ž.9>{„ØÌ&?:†ÏªQ×GÈöÆën‰mVð›À„ýµ6bÝãGìŸ&Œb™šô$˜—å*| /EH…GD«½å¾Ÿ~=7=½Ú>¾Ú0Hsa™ ·¡ ©E=Ô`V¤0~:è!´ØëÏxá,ª¨Q ¦P8’2Åj„dŸòm2$Gy/ö§?Ö+7LÊ4±FQJ•ðù*}}O\÷Ÿ¯‰´“Êd2E(Èý™ø !· î'¶üJÉí½ØR3Bå$§»LÎ)DAD`¦’T1DšùÔË “ó$„± ‘å#Yc>­™Ô—ôžÒMF$¬õİœ¹lz_Tž¶í­¶.3üÄtPbe.êU¥”€ªS F½P`=Zdãš:7©¹ùÑ‚@ÿz pUW ¦˜ZB%²,Qê ŠRJ`¡Ä@…0Y T¦ˆR,?g…A·Žýú³8ÃòâzÄõ;÷^ÿ³÷aKûÿ›o¼?÷lÕ>Ñûðd‚é°íéŸÔ àÀÔ‰ªgnCÇôo¯F t5\š @Û»ñ3Ð,†h Š"¡=’H¤ ²H°‹ H 2E’, E$D E$PDDL«öhDÎÝW>ÝÉÞÜsóÑè…õ€}¡åùI'§É bT2“×(EÚw6„ïÞl©¸0Ñzõíí‰Æ}¸¸™;8B’IqÔh/ÀΓ¯7¼6ó:Ð×ÈlÉÜ!˜™_šÀb(L²"Æ+ª…Âì¨\*v )¨K–[p#´˜ºoÍ ` ƒü¼Uë %Ù¹ 4¦%¯v• Œ„X¤˜(XÈ¢ƒ"†,°rÈÌ@¡`‚Œˆ‡Ö" .ŠŠq A·r  ^[”#øáLn„Õ4›SÊtQÊ< ëhx„•˃i·>•š´¥óë¯8›™Q…À’T̺§ÏVÙ¹£7“Ä»d$¿tx›ãõàü¯0ɓǼ“Øù0†O~òŒð ¯$ö“iñÛSñWžüuìO]{Øcà0Tæ×éÛ¿2ôoJöõ’T†¤¹àÝÑ‚‰¶)×B»óØñ™êÍNÜ(`‡˜N™$‚B$n4áîñ „4`¨6'R¾×·~ ÉßE#)[œ."T¬”b«æË@‡¥T z~¾ °XG°°¶:ž¥|V&`vï¨âdú8@Ûx‘”Â Æ ]I‚Ou^©sR¸®Œ½X';#åÖ¼/c‹=IX*mà²öO„$ïÏ››ìúrYg&K¨q&ésCå¦D†ÞýbO¿78$l2÷Ÿ#Ð1&ÒB‰·¯‹'¦¢h=^XÚPŒó±âñÚ¡´õ‘¸H_!¹ß¢fˆ A °QYžõ(a!UDb,‚Á 0T‚2,ˆ¦R,d 'zocã8†?cÖ¦ ùÈÏ&Òƒz^‡xOyžÞØÀœü¼Á¹AøÀ1ØÛêý‹ÀzH@çÚC½ln2wù·y©®çÂrf{îOÁú0ÔŸ.z™„Ö!˲)a=SçÑ%Œ˜ôÛ‚W~C™­äÂ}YCéí¬ÀS§E 4·C(f$ëá¸aRFJˆ DI„R Š„Ì$ H#$3 Ã$•1@é¡ d(",Ë$’‹*HKd.0QdÑ! l¢„h»”Õü£Û¢ŒDlH¢†©·T3AÂJP‘¥àa‰¡#*Š „¸Œd[¨%Bð©%„R¢SUUA)ÎþôcóŽq<úxd§ØÂ¬þôÛ‘“D‘EdEbÑ”Sã/àFlïGyË@iïÚ“å¬ÏâþÆØ€|˜g‰Ø¥çÖøÎrÛ üù³¢²PÎ…Úg]±·^O{Î)š~@7&Ù¾}¶,ü>XÖ½½{ÿ¬ÛÔîuÆÐØÀ·“ÕÉSc–PÔ^ýpÒ:¯œ²Kþ4oŠ¡hЙZe/ª <˜$(žqÛ=¹ÈêNúÿ®:×\øªzÓÞ–Î¥×ü.õ h]ÃæÇùßðžÇÓAGÚï_gž}³ælx)GYQÇôŽþL@%i‹èW™Ž/gÜx#àˆgÜìt'!õóW ‘†òx.uù¿b¶´±r$—‡¶7Í íwd‡¡â·Û]½5¯~=;ã¾o<˜>ƒèŸsze¨•+)Fº‡¢@$5ü¤±éý1bl,ÚT•ÅëU‡æ•µÇ4ìÛ¿|áñF¾1\ZQ¢–Ò2¯©2ùHÏ¿ñI¾ýQßçM=Sþë ûPïŸïùâ Hþü¯ô*Hø1~ÿ d³\†€ßûø“?Ö˜¼!7ûø5P;Be1üý*ª©. S ~:£Á±¾¾ÇÇ×Û_ÃÌö°öãÒ$ƨöÿ@îã´Sa)CÓÀÀá…ã§À£µìeÜId Xû?ê=‰û¿ÙÒûùÕ½“ƒ`£%ÓbÃÐôñrçć۱°ìwñtÆ»ÎûBAã'8QÎöGaÃ}ë[ª)¯ª6³ŒK0jêëTÂŽwÆk±øHV> ì”ñ›Ïž—ŸO§ê¢ÇÛåPòlTÎ]x?ù}=ú!Þar½oƵ©†c%7«„Þ°K!É‹‡T›ÿ)rµ9’M&8¡?Uñ·‹ø&£ õLUB§¬K ’ò–pÜ„,Ë .tU!Xd lÁJlnI' \ÃvYyÎ I˜#©AÌ¢Db‰€iÁw -Ä”}6¹‰¨ÈY9 F¾³H‰Qü„…VÒlcÜž²úWèíçXå¯ÇÒŒùÇׂóƒísðÆÆ°KQÞÌç}o³RV¥Q½—f«}bÉ J ]SG¯¯íž‹$ö ··¡ò®¦>!Œ|ª€P‚ˆ˜„6b€Ïµo#¶dBÍ&$²lTÕÃÏ©Š§ìr¨OQЈÆcÃŒz}5yG Øü>š;Y bÍÕ/Ë%þGç¬.Y¢¸—RYObŽçOúy¾ûžy:²bà²ÌÜHß—M M™¶ÇvÂtÕ%5Ÿ}åa};õ¸xŠ0þ³yr~ƒlCÓºªRýª¨Q@þ¾=NM·>ž¬}lô;zÍøƒèx–yöôã™ïIGmOk=$ûÜ×ßêeËœ„…ý9˜á‰çWò³ÔºÈ¥%Ìv—Þxݤ„Sb¢(†ç¢oV{èwyÜýœu‡áIéàÕeÉÞB$ãJe¼„*NåçË3¿¦þèqxâÞmÂÛP”‰N ¡°Ö¾ß(oiœÊ„1{õ31Ϋ8,5ó>‡Áö ÇH‹ÉGÏ&.iùwøàÁ­UÕßQ4L`‚Ba@`óòüøä!=axõ7ø'àÓ¸še0óF ”WóBÙj© Æ,(©L•Q(A¢F|§†ŒgE  ®,.Cc!I+G>‡a*)´  d(Ú…’'ÐW<÷o!ßjX¨&:lI±*›Ïüh«^yFNP”ì(§ ¥Êv~**Ð/üÜ,Qg4t!‹2Ó!`ÖªEš.YvÄd—‰E\»x#Ží¶…tbâ¸*àQÄU4V4$IaT݉Qiƒ%Ëc¡Á2Øé*DbciÛJ•%€¸‹…Ôh×E‘Õ1JT§×o+jþœºG>æS3 MÄ”˜©BŒ`#µç ЭªH¢PȤEiíྠqzB³ŠÖ¬%4†r¤€$Ø©40®±EÒ×u*é²*cBM±Ò5UC„ª¢PIhHè€b1’IŒ !¹Å”¢ID˜o#¾>úÛH$l“ (<ϵèüÏ¡·Á¼b}ñGŸ7Â1h‘E5¦6}ðX[d¿Öõ”ì}¿kÆMϬ;N§üé“2ÕFÙ+âËŸvåÔ0SAm¦.¡††bõÇÊ¢:&TH .}„ΑÆFN½-’LMq+ ÒœÕa6ø=þ k9 £ëamž~‘¨*˜µñ%”†(uó¼[X+ u$ îB'ÇO&ï£Wž±„=‘6<,ü'$ÏcÖ»=¼ùø1 ºô0•M³ >X;… e’BCؘ€Í ¯'=jmé­•(˜ ±+¿3'>¶1&dX°è*zQw3T ~{bX%ÆÅÌÇ¢WW@¤a|LŸ"ŸT¯yèåíz³bÍŒìd¯ÏÙæhleE¯Ðe¦ÄLÎù:Ê&«›ã‹Ç“Ô‘Ûä0<Ï^ljí {d×6 8Bá‰?R˜¥B,‹-(VJ¦PšªjQHˆ…Q_ïûl‘>3yJQb"¡HÊ)û]ˆ¶T”(RS)´Ìd‚²S*Oø’J̈à Ÿß· C*Ê m©IEGößÛ¼ž“Í|ªT¿Z¢¦ këTб^ñºçŠöþ]»dÿy®1ʰüz €²§Ë·lLLÕA„î o×X¼R—j1 Wêƒ-œ ó$6;âÀѼü¥Ða8ÍÎÂR°–]N^å…^š¦yLy*°!H³ÂpD† a$ÓÝz`¨rù ¡³"ÓP¾¨ b1=bQÝÈ_óõ<õ©œœÖØžjÛÑSŸJÔn˜ÉW„V1ˆ¯› ¤9ñZí›¶†.SÔ©I f:%CUߘ”,¨Œ±Ë2ÁÄÀ¡e"£$¢.á#Bxèþ#©„$!˜ ÁHL³.H‰»(DK©B+šd‚“!©(01‰âd¨I &d@H;Dbt\„H!‰0Y!)% -l-B[Š¢KL=™oy…v¿K®Ú’á qËr‚b‚W±EvÉàÄ”ÉA‡ò<ììöoOPD1“ƒQ#'¿¦®˜¬ã6¯Æõ\«c·kšØ ý;\ô3ùð¬U>8>n@6¹íªG½ÀÁ6×PÊAEX bÕP‘Ö®ä¿Ô yCOö¸ƒµIyÚ®@ªae „hÊtUÀEsÃÓÒËEyÌ‚ƒ§ ‘£Á·%ÑVC¢ntsG!¾q‚Ù,¥`+*¨#tR˜ !2„–‹eT#¡ÄÐT@ÑêmÓJ 6è¤Rz×D‘;íÛ± ‹ÛkõR( ±Œá¡’Q[¹ŸoÙòÛ[è97­73™ >,MÉã¿i1ãŽIÌé¿z ZРU$ª¤ õ¨XÚPý.¬ŠJ”F€¤#U"Ê` LXÀ_ `„E2`±g5ãY¨y‡g›cÇ! KÑZL>Ñ úY”@Ǩýü÷¢}Ú"Q‘VˆŒ]C©ðÁ}Î¥?ïÎ.{Shz~ú<è†uì%A`Ü•EæË±£Økòü{mgµ—þÍï_øŸäÕúÖ¯ o]ˆv°ER"ŒUBxªcàéHÖ—çõöú­_Š)Q-k€½Xûç@å…}Û”¢qÀè¨e#®ã–ž6›Ì•Û?¦ü”o ›ýI=<Ѩ&*‹3/Ë¢îJn˜ßéÿŠUÕ¶Vœ2ïT]Â-*2@®*hÝÖ)>E»³„†Lgí™ § ’õµHZe$‚ceÓY ƒþ`ß]j²‡)© V†™ Šªg=^dG¦Jᬫ âŽŒJiL.¥ï¼Ã;_%QsØpúì®Uì¡dºŸ!ìÂ{à›Yèz›Yñ·ÖúIç¯z^ÇA™`$ÏË9Ö]+&íCf €ß߼ܔùØÓå~ ã4WÐÏëÍí4l˜aWD’ÈÿᎬÇrܧ)HF“F!)ƒiéŒF'櫱ô”ˆ˜qôÆ=Í¿ûâO›j@*eŒ²¨º”3À„’B²¹þµ¬“6ò)€™©T ”î™5‚É,¼Ñ™°;g>¬Ý™Iz|êRI¾áž`‰òI_>·>xk0|ÖÔgÁ½aª´„'áâˆQpÛ`­È‰™¿ ŠUe*£ì uPÈ‘dI"€¤’ERAº…$R )$)))%"2F¨H²˜J`A`dU}j¯Š¯Ñë­%—Œm‚ß„ßÁýÏH äRŒ“9©€èù™ÄWGéÔ=þásÙ»LÃA—%ñd¨âh©$f5 dýy/±<›HfVTB§¡±$=aÌÄIðY=@ø×¡ë?|rÓýçÓ°oÖŧ°{zÕ2v’¦ÐK6ýjç¿[$׆fgÖCG'ÈE$ðþÁç˜õsFÜÀ“¨tYûN>ßK‚§FþüêØ%Hˆ©£„¦+‘£y5¾3ëí! 'Ö]BÚž7÷fzq_sÚqFò&rcà»éÆd%T£T²‚UF¨Fª@(Q&.—ˆX#Qˆ2–1YM U5I!„$!LŠù¸²…Eig¿Î}¡äžÜTjˆÞm› zŒ”2i!_‘còñÑÀÏHÆLkÖ›«`§Üplú\È 5¡{Âp„&k ‡_!¨UVÁ±äšÑÄÚ)ÉS#CR®»‡·Ëóõ ƒ¾Þ¶§ÁƒsXÅô;ndÁÕ-”„±Ûƒ³—ì€~"N§^vƒÛ©'oˆš³Á>ß tO)!'L“ép'¸%ã’„¿ûj¦†¢=V›ö$œòT’(BY@T!•`lr;ìm8“ÁðNYs¾‡¨H|ÃÄ ýNç“Ó&Çs_,‡õp bˆŸZ2þÄÙ =ÎwÕæ~íæÀœÐzIèä¨|ÂBkñÛÈG·x8hÞÔÞ;}¦Ž*þ?V/¶PÛnÙCÏŽÜÜ—½ÍîÛQµ¬r?Q”­|› »Qðá6¢®¨¹U(“4S#›²öÁX6¸dfßá›ú2„2¦×e1Kª(l`å¢Á†íê·LÈ1›ÔÏÊlÌäDòXÉzLà>mL ò>Z4]n0ï¢a£c8ü°LŸ2ë™3ÑÇ!MDWþ÷VŸü³¨Æ3òõ­™”2’Z³tò?êšÑ[#娉¾eXÃb31fsR†fÑÖÈHJØQBþ{VÒÝ VÖFöÏ”Q_tSþSyM©µT0s!]¾l Uor¡ Ú|~›ïÉ,ëb|Мܑœ„ª>od“˜#2!BÊ>/ÆÙ#¨gQ´®ž‡ñÑ¿ëœ f°Äø5¢êþÕJ²’ÆêáÔçr ¹ø~ž¿cö{x†Þ‡@~@w¢¤£çÞÍ|[C[,ϵäÌ3[M¤5 |>ã íD¥ÉvÕØ´C0«œ}½1J1OHÕm Ë`oõ!n©eŸ’à̦$dbÊ*®™ÿ$èHoUÙ‘ÊÑ©UÛ,uøLtÕÕd$P”æŽ{HPÈd™œeêƒ#ùs8Ý•$R’Ag˾ÞQ˜&æÆÕÑë^axD!5;ÀF'Æ‹‡)B JÐa= º‹ô»×ˆI-J•éYùÛÛ×n8¯\ç7Œ·‡=»­R‡«H ˆe£»ÀËÌjÌïFR剱ԓÖh©è§ SdØ786v 7;†e‡»©Z©# ,–ÂØb2Û’$¸—ßäHvHߨ2I ô@ ^;©H%µô#Q‰$œ(Ùwù¸K³… òÆa$ ‚l…J”ipé´›°÷M"+ÈO[ ¥²*¹B†ªˆÉ02hú~¯¿Ï‰Úé©[cƒøân`P5ô©¬˜²‘iŸW ke %TY Âm3pÊa”6ÉTÉuf0a;$¤2Îí«"¨Ûvð9ÿ)pw<ò®ªˆ.&Ÿø¦åë©7Wî’p“g K‡I0ãTZJTµÓQEÀ–š Qìüït4„6Hù¢>1ã‰ØzÝ9ö=P_Õó'µJ…QPª%sC´»~=áçØµft#³Ø¸ûT*‘âH{¸Ä1UD’Nµ¢ófd'».lÔ®OÓÿ¯öþßÄÿáÿñÿ?ø#þ™ÿÑÿŒôÅÊúºXó®”ó¾·*?ô¡Ûà€š ½Á6Wg3#Wÿ“ y.þÏü_ù¿úým†äÄõÿâfËHãÿ¿ÿzÐÇþÿýí?ãÿÁÉ» 2ñåyÞÍt#»T£¯ÿ½Ezvkœ;} ⊶»{uÛ™©GB”u T‰ÓK}—mË3XF„ŽuZ¹± m¾Òª¤æ(ˆqʽj­œnÔ̦f‹ÓŒ ¹:¾]É›cÔÊ ;Ê—=z{ýg€Ý¼bÊn<ˆøÝµí¶Ûëh5P· ~¨¿iq—¸Ëž^ éëÔ.ˆ¡<ùÝ¥å wÕÞšG|@;ô ÏLÕ;‡Ž OdÂNé^ÝÍgТpç4צö™å¼ Ån~°YlÂßãw™B*På23È v6r~ˆ6n_™:ÁW7?s¥ß¨(Ñ3ÝT‹Ñ[gà}îBhzÞ°¸‡]g?Tgª˜Hº ݈BSU&Öë¾7 h>/p¾ ¬‚l𧙤iõÂ3Žàö³:×Ë ž§&‘…mb-AéÓ»Y§Þ9 x¨³ò§“°A¨m?EÉÚQT†B‹¼_X©ŠÓžîÝÖsu|4‰·Ä0ÇæÊ=š%í}wBŠIqxŸ(HûIC^çÞañµ¾ì!˜YƒFµB–¼*X ´uö¢«r0øžQN˜ëœ#Ûú }½^Ã}ÑD/`úïFýÓèôù±XÍ£"BÞZßÍBȶîe^ì5œ3Ây42ݳa(¤ï*ÑNg¦ü ²ìÍMb¨q “¢7“MfÕ'=Ô¬Ž0œÉÒªžS B.à>¸TFÛrLð¿CKw–#Cd—£2½9çca2áƒC¥!‰yµÏ»Ôx9'u^Á»{G40>PvêÆèWvätÙ<§²ÓTW‡Œ2pX¢®µôn§ ù a0yªø²`¼\PY)ÒŠwì^Ê%ZIµoC±¢‘g-›ãÞMyЃæÒ¯aÙú}ÇS&9ÚɯÝyŒr’þ#B|6ñ9Ô û8íWÛÅ-1)»£N½èl“4Õg†¬o5{ºŽr(‰B‚ýé,"ªµœ–ö/„ñ÷9M «Ú¹sɈ€d^YÓ¨ÕÖ좳Ù ù¹ËÌðåOozóEc3ÿ½þÓ<ŸY5ÇØÈ^qÛ2§F3|N /®Æo qAøãð·ñù|cçö~ø®ÿKúýöü/Ü b¤#þ#s7ÿ#ƒÂÔ)é'0T/g!R¤VÑ’TGSäøhçk§øùäNQ ­rKÌïùëæùÝ(Øh ˜é`ç$0þ{K±…j% o ¾‹O¡Î£8$‰i9þ«s¦3(¯Reê¹èã{…KJõ;f[¦Ðz«ØÂ3-êE7¡³-¤‹·+™t ß§†öûÜ´“ ›ºÍfý1ŽÁeÙ'·+Ì<•±Ô›ÕgE¡>>@J\³ð!ÓÕš“H›lz#«gÐŽù~ã÷]Hõ ñ¯–…yÙ¶t—ÉlsÙ&ÖÇÑ}ÀÔáC¶ Í(° ʪ‘µ5Nß7ÉâË̼ÔªïjCŒ³¤«Õ_lU€‡Ô·GmK¨ÿX á·¬ˆì¤g¸=Z¨×Ñ`C»€â±{7õ{Õ³eÈoÁY/¬vè»>+€póˆRâ©_´³ãZû¡” Ã1LïÒxwiá]¸ ¶ãAЃLBÜÙ^*â;Êï?è1ß*©‚š™â…W =ã™ê p =y^$«u«Â=Ê_\ ¡˜ÏÕòàdÊõ`ÏÁÄq‰·¢î¨Á§kCPfhMè™Öj©‡ø›®©¼Ñ50Þ”~R* ¼ÌæÖS"·€Š¹x||3–7QünøT¯ïbë)-E „<‹3CP³2ø ÜaBN/Eôa³7Ö®©™*¨Ê#s#PCxÍXóÛ´ßSžû|i:|4g‡šmT4^Ÿ5ʸ%!o¬=0â<ñ´¸Å{}!y(°º“àc:_+8‘’eךŠd=)ÚµÐïuœ†¨ó–W 틊º2ª!ËŠ¹š#/\x՞ئ¦‹ˆÿTL àó*Œfdúï.¬¿GhR@ä@;[ ·X,*ÌP —>@‰x ­Éw{4D¾ûwõ¿ç jDAõĺ³é ïÝÝ7[Š+€9[8S7SÝUä\€´¼ÆvÅ`¬„Šgº¨¦3GÌÁóÉzfWÍ%• :ˆR‚V× ™s2ðôu PPJˆ-y¸¤deÁØd¼¾Âˆ•cE‡gK¤òx”ßËX‰£ùT Xœm¨GPØ*=ÊÜæß/±‡ÙY`$@hu( oà÷Éâ[º ²‰S€WDÔFË =q-ù³32®ˆÍ.µÀl¤^zípún¡R'{/Ù”¹Œ§ {–‚îmçs^BÄÀ3MªWÝ”ÓÀ*®:°xgÀQP¿;Û9[¨;³;ý¾ðD8A^çÞXt/ºœäGR4 ) ÁÁ¶Ë(D°ÄÓì\d>…í0,ÕKì¡6®øÏÆoàuÍÙ“T¯Ug³\ À‹*´¤#g„P5—˜#4#ôPÈ`Ê/SøA8ãÏ:ÏZ¼¬hÈÂJ!ÓrfŠæ”»~¹X»s/9‹ƒ{Ë"t!»›Ñ g³PÒÞ"doÂiåPø~íꪸ‹fi]¡åv”#‚I¹ñªy èý)òß ¥0ØhC’«½iœ%ÃÕ 3"¥sËÙjÑk…^sK?e?,‘[¦)ƒ øö·”\×M‹ ÔpšÀʬç0ágž4 ÊèªÙ1Ò+W ••Q¬C+Ðôî•Õ ãkX„Žäš2Ö•iÔ°g5i¥½à™™ƒvÁwh4hp{x†f± ¦c9Ù–‡<]^¾Œ€õ~’~ v¿{žf'î¿ œ?WÓJNxá>§ì°i®„¯Ÿ£$~-3ö50è-Ë,! tÂ>L/{•“eG*ÙÕ­GÅò‘ÓPÀžÊH `¤ždô}Ûê Yç "rI×ï6x‡ƒ äã†j´Þá\î„[}\eP3žm„&ôüÀ)Â^‰¬‚¥úÝ_H˜ ™ŒËL,]ÞøËcv«Â vKå3šê9PwÄg>~³[¥§lwwHÂ8Ö8YHž%“EDŒgì>™Ê oÌÛæGä5¶¹œ2~W‰vi:G©—‡FçôÈÇÍ"Íáú‹Þ®ú‘—ÿèj¸¸_ņwM#ûA¶`ˆ8W%¾o»´+Âbê‘®4y„,ZŽ :®ÞYöúéô¤êe}A,;Kî3ñâùXFmÍ£¸å#ò”K/­£ù÷Õ(Ê5V±´nÐ\ö Oû*MÚÈ×S•C²¤©Ê¤@g«¼Úe‡€è > ÂcfÌ4þ²Â^áŸæz‰Õó•RþTéК…òv0È–…|rø9U²µñKº« ó"—ŸÜóÜ$Àß”ùtå)qfš…}M ñK>e8ˆ9@n§sæ´YCÞÿ‡þsÔ×Üã§Orë´¬#?ñ¼'¿ÅÂþ{é©!ÜJP•.Å*S0$8 „y|ó>ßCE»xÜÁð!%$Œ=·R¥D¡rÐ ŸÒ˜f»ÄoÀW?oÕNŒ åç31wêFjØ‹a»„h<áf S7+E8·È `TÛn_Êü«ò3ÕøpM¼Î©w0ŠâËÌøò-·Ìa…KúPPÒ4_ªåÉ”NÀO y/ÍñíPÅb• OMµ5ÙôK¡È§§(E”ÖŸL·Œ µï¼j£[1™sj^BHš 3œvf’2Åxð…ù}¹ÛJD‰*¬åïÿäߣëæx¢—f•ù½Ð6U+R—ÀĬ¡ªŸ†Á,bƒ.³ýÉðÄXÅÒÝ/&CøÌÚ­Ô8Y¼2,0t"ÈîìÝ=êz ¹à¢»õDÝòÓ=ÔÞ—xSxlL2H¸¿ù‡ûÿè¯î˜j0ÈpsûOÍýS»ÿwüÉþ(ŠÙ…TÖ´ Óþ'GeD`¿éÍíÞYQ?漎B1žüßîÐ{1¯hu_äþO¿Ì4_ÞÐ>Gôg_‰o‰g¿¨ÎM(–ËýÊÃÖ8þ¦Ã ž©Äw²è±^Ot<<Œv•X\“4Qàg½.¨( ãÚ¸èdN qî7sQyBLj±ÛƒÙþ’pd&Ãy&öZSgßBUû,퉕°” #¯åj§é*vôB:2QœHîOT$‘­{!aáU?íîx?rÚÑm¨Çû} à_¦€%¸R ‘Ï”JÝbM—XoïáAÝRÂ÷ÿPP, _JÊ‚Oº}üߤÿ™Uü¯›Óo0ŸÇýgÛæîI¯ûñ³ïü<üzz}þ¾ß†~ÿM}¾ÿlõËyë¡¿øH^ ÛÿÀŸÃôC_þ2 å™A‚¶Ë­ö`=³-ЊÉ»Þ &WwAÿ í /ΌľžÌ}<ÒQI6Z£6Õ>©D€ùÌñó§¥Mì|‚%®¨!²ü–òÁ41€65QsæQÄh‚D) E—‚‘æñ½9SX$ß•ÕOþÄÏü?þvöŸ“ð<ÝâɧôÏ/ò$;ù%ý"•þ‹ÚA³KþTÌyë]íà×½ ž7ñER/ôƒû}ù©*+¡&6NgAÖH=Ÿú¿~/ùÿù[¿â?ŽŸ×øo¿¦¬á¿£€’CŸèr¦BÜÞve¢‡'9¯ûàG×èíCÆ›Q4õ*1S¡rÈï~¨Wš+ù‘ŽÇ¥*F`çò‰mÚ¬=µDZ¸9ݧPùûÈÙþ,´›Ð 1®”iß~•EñÐ…Ë¡»´HU²è0žn öf.¾ üC`Mâép‰RŸÌñm@Mc7^Ê¿?M¼Âz`TUŒ=ÞÂn—üc$±—ÍgÂîr÷^›ÙÌ­Þ?‹QÉõOÈ¿½öÆ_i#2Mùn¥N/ìùý ‚Äöè§AgÞ¿\ƒØÈµ¸9¬¡†jÞgœê¥ü<ÎxéëÇËêµS`fYx=±¿ÏºÁC… a¥BšPÏ^¨!¨ykiO^P`Ì¥R„ñ3táEó¼ [ØÃ½B*­½vÀ?¤‰/‚,ýÂ"ÕTÒ‰‚ ç;>WÛHe¬Ë ™~+¿[„Â@p¯32BU2&Xw³ï¾¤ù9/=±ÿHèßäÚ¸ŒyÁ”y²þ€ÙMóAÕ‚Û{9[\ *§ñô*×,ýEyAšÏnÝ»f»Ö»ñü¸ãÓŽpcôŸ2mCø0,ûÏ÷ô$5 ÙŸð?ÁX'ø&>Sb}²8l@ÿ±Ä쟡ÿ§îŸöëÿí±_à‡éý„7;QÿSþ°ÛûöGüþtÿîù±¬Ý’†S `RX! ±r“æb¿ŒÌÝÀÅE¢­U Йb,‹’ñiZÑŒIuû÷1“&}¿¥ù?‰>пSÿuæM?Ïîò‰û?óÑ?ËP6:òuÁRމȟŒ }ÍÈ{|þ§Óòýœõ<'þ 8 ‡éëgÿ0ÿÙðcoöýçæþ:÷çl|Ãý^QÞcmÍëI¼ ÕÜ—u)•‡‹ÆL2àÿÍqôÇ’o>÷>çμ3ì2ÍK T™à~öKa·y&,}Bäýô¯Ä1—êsô?ÓÐÇ’HIa)‰ @E 4ÊNc­D¿ÈùÞóø…úÞÿÃðúMòÃÔ4? |§™úŒü~ÿã yš?9+òžó«é'êý¿Ä>Go¿áɱÜý¦ÿáòÁø ²cø?hþí¡æmúŽß¼…~5ÿ6SùžÙàœÚ…ž,4…ð|m¶¸ÐãGiñ­}þpò‰üÈ?a«4&q%_òþ~OŸ¼ŸsùúË÷»à³õÃú2–µ”~á\'ׯoO§éûB‡ãéIÇ©çßàšþZí'߯¹Ú``@M{H–4w+Qœ¿F :õŸ¦~Gå+Ölno<›OOÛÿ!àxÚ?g°þØkŽlòà}O¶¤ÿ?õ×ý>Ÿõÿ½GÿWþ•óÿýæ¢ ÷Ùÿät/þ{&[ÿ¿Hf}Læ§nB^x˜ºÉhS}—ñ¯sŒO¨Fî¬oñŽŒ%ŸSÞ÷£¹£¥ÆúÉO¤û=mv¹™$“ié½Vò­¬" Qœf“*=šÂÞAeº+ò’%.UÓ{!\{Þr¾Ê Í7u‡óx_Ìa€Ëî¢{$gxõŸ³/]¥³Sa+t{´BJ¦{GNWÂ;%l"ò;7Û|8éÌ^Fò!©ƒ™õžçz2WÚ~spµLš‰ô&Z;稴DäøÊF¹Éhf,±@ß¹CVð N©á"¦˜[)ûf/^Þf+Ü÷N(E‡vd¯£oËE°NöÔÁ†^ƒä/ •\.× ¥eQª¥•Øû×éÙæóã=vŸ‹²ºœ\KÕÓÅÃŒÖNéP«ÃâÚ­U à¨RFCôº0:“sÁ».#X ¢%í¬œ®Rg=,—ç« ë-ñ–ЋrÆ]]UÃû°¤#ÊD'¥¥vvë¥%xÝ•Uà(wdj¢ðñWd›»\^)0ŽEEÑÏP@ògƒFyÅŒlA{<µ/d)†Ã¡–Äã6ÍqÅ¥ëï?:«<èñK¯zq½ ZWLá[ +$ÄùÛï:{L™@}‚;jÉw×ã?HÂU$P£ù‡FÐòJΞȗ’² ¶J#©;&i3ÖƒErÉ©D%˜RÊ|®¾’üñº$+„:pÖdb =1zo!"»°kËcÙ%ç5|…ÃÇÞOq]ô ¾òh£H_«¤Ývé7¢D³cƒi:¢‰œ‡ÞÏ{ܪg*EµÂIt,›øOÖ¶–êõëïQ+x+Eà*eß’ Š{6=7dwã3xÛÂr[—É"ð“‘+S{| #6¡Jôõ6üZÀ+Q~¨Ò˜»šwÜ8ð[M’±è”.¨«wὂÊB*zyñc¦¨ý ]ÓùqU<„8}U}di¤bŒÜâ¼Mf ²NŸd# në`¸ééܛߨ€íD­ò(n‘SzHñ„îíʼn{¢Á|1®E&Qw>4êã/xÇ“Ôû%Ꜽ©6ŠMºÇ»<§„+ ðûÄPæ5=°w…pží7l?#"m÷L™ŸƒüoèŒ'šlñ1úkñÔ÷üf{»?¯0ýÃý?¾:³O™C7úÈ{}läßéQÑ ×zÔÓ¢ï%|bEç¾5„tš ½œ¬R,ð) 93®¸¼\Â#8Ë0yÜ‘]½`rÊÁK1qª92cÀ°+Õ¹á­{6–ÆŒˆºVt¡ ÿ ´A„´/ ýßV/I-(5=¬Üƒß×ñÍôc4Ä×0eBøž×`Á,´Vl™•ͦߓ6¯Ñô €ŒlkÕ‘ßœ“É¢T¢[×›²ã=šèÇÏ›¹.XŽ…ˆ‰4Ÿ)ZÀ²I° ";ì¨Ö½ÕPp@ØÓð}çZ©‰NÙ#×''J˜ß‚8&¯åKæá#ë{hü]ÏÈ­† „<Òõöl™;Øôá‹MAb˜·–UÌØÑ5sÝ=|í3˜yZ¡/Ué6ªMD5mPuÚ!ÚH‚ܯy€ÙNw×2Ô šÉ®jG°$fW>¢òô<_¨‹Ô¸éF uS ¿CkÌñ’±;B0rúœ7—“ÕWF´,]ö÷Ã÷º#˜Ã=B}u>ñVJUé"G(ª4íñ©ëG¯“Œð\<ßžéaýA™l`w aRù‰ƒ„0ê†ÎÈ¡€ÈÚDľ܀1roB‹Cë@Óº%‡üo ˆÆK«Þ¯{Úû¾$ÉÌß ,»Ûé>¦$$cLy0³<%,Sƒx§ë7f«#5 hù …ÈãkÞ1ó™Î‡¯‘/ݰdü(øå…Ø:„žìÉò¤»ù2YÕòq …B½ ­$ˆ"˜U™æ6nÂЈ6“Ì9(*D”î@;`6´à@èAç0ç_. ¢_¨ ˜Ê5v yë½'ºø¶tŽ¢,ß|®îÂ|ÙZœ¿µuÝ Öd´¥%€bGÑðóMû' ª;ÇC?²¬F¡ÿeÔ/˜NëÀ(ËN©rû¡Pd9“3+®öÅ÷Ú ËÁ! *8¸Ã .B»á¡¥…ÄÏÊøCIšÆ:K¼nJÙ$-¤éµä³¢ÇëZÛ~2†¼¤SËU|hŒ]£ôѪ¬Ï€ˆ.ûÉ©Üý¾ySw\5)£FjKº˜è˜Ïã*Á³Ëx-£ B‘œ‹Y’íâ…<láÖ<Õ^’]‘ùæ¤Àþè‘—dpw¦ª¨©05»®LxŒÝ— G|êà(K<®«œZ.¶¥¼ ›œ–¢KñÏÊiã7wIW²U-™7@SÎT‚­r;[,Ò$16~žêÓP`³TÎç«„[ Oòo°a».: #B\OrÕÂ(µ´ÝýÇ cåU@[¬ï®·–#e©•ýM ¾Úu«L«!¾µˆ¹±]¯¦D=0žJÁÉxÈo°"“ P-¦‹2™ÚF!Ù6àë£öLOˆ %â`r=övETÃ$L¡ãhò› ";QâÀ{ˆ*•ÌúK ¼Ž\¢^6eHúÝôóL/Â_·>ÒnlÅo<|ñm¨Õ@õó8äB-Ü@ßLÓsØŸ½&6v"þÈ2•ôͤÃ+?üzB†‰BuèYíñšÞC4Ï :Òû†Î‰1D¦íëPÌ™YÜ™3Àî]à]{zƒ1/Á¬Œ£nšñ³ÍM dFÄŠÔ€°á—箺¤EÉ`ROT³1d`L$l¤Š}(›óäÛÇ7¯ÙðUbP"*0˜üß:'¹â{î„Ôh:­–ZÝÊÍ“wÞBfR Å“ »Á`bæY•©„uëMì-دY`ݵ‡3;veLÊeÚlÀ¾>›ÑÕÂ6,ÌÂÂËrú‘ÁuJYXâtrg¢Ùå8\‡ ãÔ:v€Žð4äòa3´ô’…K}í%7ZP—EÙ8Õúq;Ħ7¥åàü-¥”5Y~Ü{xBø©I>f]8Õ2BÌÄzwª¤+*_™­D¹â ÕÇx”ÃÑ~¦¨Î¨¤H"¬êÂÀ;ò/ ÐDƒTÏ2•/å3)77¨üŸ¤NâQ˜ >y=¤t'(Òù¡ÞŸ™ìkæ¿¶‰q¨|µHjq<:î¡ô‰]ˆ‚ï¨É‹qX 7ƒúôüsÉâJèïÉÃäð¥–aY®gT,jg沨¹‰ÜÄÄÍ`ãÑnz¬: ˆ”Úó»øÓ$ÚÀAaýZ¥ÕvÐË R™™ÏIr„@A¢ªéä•Ä1£{H>Xˆ‰0ð¬hüh>‰…üº&/Á¶”Ÿ;ÎÞíßÅdT•Ço&¨v\!ÊFî¾r×b>H»hoÖSË,©×Ä x^Öˆf4Œh8€ŒÝPúlÊÕ·¶ ×ô§.ø„+**ñÈYýá΃µ ËY÷A¾ZcmÌÄ[ ––ÚJ W£$æM@ò.xv¨)ÚW2ýÍ>iÏ*EÕAÇ'•s¯EumÞ[Ä¡ÌqR}wOr1ÞB£^„mf Ü% c¦CUæD½:dVßyH³Ì»õIÉëÛ@g%åóÏ^½ÓфХþ§^Ò/Šw.Õ«›ÉqÌ Ü›ÄKT 2ï;F—0ªÔEW?Ô¬1àr[ˆèPsƒ2ÌZð5?²žùÃÀ3G äËøBüBž¢ƒRÐSEê›^Tj™rÆs_B˜-"×3Aøá¿+5;Á¯Ðý:“è5uZ6¼•-m¿œ‰Ç0ó[Mð à·]4‹¡¶Í‰}¹Ä"Š dËû¶ê8}r“pËÚ¬òkÏ q|=¥#M¦¸bï4 è†uêÆYÕ5óÈŠeA8^‚1+øQ2¼ [‘ú=0»œÌAöR£·IóBT1k6®Ì ·œ5•"¤!‚d¡Š3™Y‡ïG;†¼3ð‰ ­Ä"þ%/MQwæUôRËyiõ‘Ë 3l•çCQ*{^EXʪ*T¬2`ŒÈ‰J+€jp;‘(ë…"¹¶5 ²¦ \n'ÕF%êÙæÁ8¸À¬th¥‘œ:w|ï{«xˆ™Õ™„H¥4[Ö-Æ]žáèäL|É2v¬Ë6†fr÷ÓÔ8£Cq †AEQEkz ˆ"\-•½G†*îÅód‡¦çfAq•›•YŸTÖ#ÏèԀ噊ù½ã~–5·vnðšy|é_ÌìbÃEä[‰ì7ÇÔ¶A²Ýi8 ÊÉ‘LßV̈́̀§mqH$ÌŒ&Ëh(1º2Br¿ûƒúÿÎýßõ _Þ÷æÚÞxßÏïðÔ²§ô×Gþ?É`ø¼}ŒÌÍ͚ݖ–À6}Óƒ‚ynjš•ÅRŸòϤëç×a†£D}L°¡s‘CGϬ—‰ªÞe8Žœg‹ËãúRU!g\AßœÐ<ç0‚ëûÃr6nû)¢Ö@‘7A5~¨ËÈïÑ,>‰D2pFt0%GjD½ÑnŸE¬âļÉ~p$I7¯¢%h ,'*ˆ9ÞX•ÍÕ\^Ô#ñýHŸ[zoÅ<æ¹VM,ï¯yñÿƒýƒíè~Ãnr\&™»Þòj}ûÕ„3û'còáØÙ6i¤3*¿Ã×êÜ>?Ëò®&ÿ/·é¹µßä+Ø·ú2'ÿykjvŒùm'ý%á!¦1ÝÇ.fe–5"? a='ý'BË\ǹ›Ûz$½€ÚNyPú¶n34ë%T’2A0øÑ¼‚Ûâbalh÷¨©|n>†2Ë—bDT†¾EÀÙz !Y³ fÜ>Ìò*çêõ!_§šï£x@uÊ —|%™É?d.ŠˆmF¨ ÃXT÷ššSaw]8#W»Æ)§ãí‚[_5··–ržm¬¶².`– ÐZå f!€¶ÿ®V”Xhç_ÓI=ÏXrÀMG)Ìç~á„ô ¬”í +HæÑÊd£ å×€ˆÖ›V½m^®Ó”lÈh°ï˳x¼HÚeÞFÏIg D8âIÖø0ôSDX…¤–穞O̓k…YëtÉ)/m"NS±wo›i’}ÃÞº¨ dE÷>æ«¢y\4—È:!CÊMwì„„Ùì6ÅUlC&³Ü{¾ó:JøðëÙëJÎgÁñô=u¹Ë+Ÿ®¬ƒÛ ;m–¬ÚÝMœ¨SY…>ôùŽfí%+¯ÝáÛƒ)*Þ½³nh«Ãâ1öÕN›æi¶Û©ìcíœ: 6ë`ˆ ö¾–ŸÎrÁàn õÞ /¦¸kz4;L2Ê!u--y;‚6ýb5‚\AàÍÚ]_ES6z$hDÈË´8àÒK|º"$.Ìí)æùcF@èG;³ùdY£%¹½4¾üºw 䯋尞»ý`†j•Øõ.2žE¸ƒ:'Lå õH2y1ÚF@ÒU}ëwhãÔ~¥¯¾è÷ÊpT§ðLQ<o’Qaþ Q£PÕbª6 Zb[GuNbk¬ Bx6´îN{&É=UGÓð ¦89Á2ªŠ’OEßK’äùv|,÷ÞÖô3«K-çZF‹;xá–;ôo`=Ï•æsÕ`ª äèLLéELœ–hA¾¯AjþßxfÄ¡Ëò&.3¥;s<³*ˆžm¼ÐõCÓÂÖ–G±Ï×GK†ñié–wœ¬€ÚÀöžá4(„o$·@ ‘ìLk×`õõ„›_E+ ï¶`ûo¬[¿¢³¸­Ûó.QÔÕá~‡MUí_ðšZËG”-dÖÐÒ£šëÌòtGlß½6v;V—3EHZ-çSµ('¹]ÔsæÕj^K„÷œ/y¦_ú˜,‘`™XÑ\èjAŸÛëÈîXwOŒø‰0¦K3º·$,®©Õ+*³’êæîä>`6Û\‘KÈ¥•$ùtÚLâzHL“À•Þ#爘6½ÞRǤ¢‚9P3(6ë( Úgšó-Ò»“Ð"/XÕOëôoY³ ݄Ԃ’¤z]‚€ð¤'£ïTým u7·é¢¹vngñÔÝU*´°üèý*MÜK”}s"ŠÍKE8¿YúÚlë}ÆõÏŽB±e¡š.UÂ9@òØÃ£j7—Œ.a] Q@«;‘¡ûMäÔ«ù<<•Ðݶ êû°{Š«Q‹È |í.`qø<§.ÎÊ€ôWâ釄JÚtb3bQø5­šx))±?S_Ë3Õ ¸Z Á¥R˜þ›VŸª—Ç!õÞÎ\vLÐý,˯¢vì¾›«PIª›ëˆ¡½ªX+¹ðÄ1‘ˆ«†*+A'Š.%ˆ=$‰5íŸ%‚åÖáÍ<_ŒÙ JŠ…µii¹mZ”&†·tÙ30êͨÎÅx^a t/\e–Ñz‘wif¥ÐâãÁ#wA SƒÀŒÄµN…ຄ³i“@rHuøµýÞýë÷Áâ½ÅC¼p‘`QE–E…z^6ŠEGj`Y—|¦¢ûàÅóÕ2°Ðx›³k7«—Ï7ìã¬s=wvÜ‘VÐßãº!ú7'Õqø®ð±|ÃÄR 51t4O¬s‚-µ·ËW~Åt¨YG”c‰ùÈ~K;/ÀДìâxG®ß-Ü÷ét•ƒŸ¦Yd²Ï ÞÎ>–äɱG6C§ŸWPÈÞWRxæà¶¥äS¨¹Ul)šìtkí輓5"$BN;æXÔc W@ð=¦P<Ô½ŠÓe*¯^¶A¸Um§³G  ÒÐR:—=è(c–‚CO#ÀJ\þÚZ‰( Pr_žY[ìÉæ÷ßKà Y‡y²ˆí !H‚þ[ò€¹$ÀƳmf[Ø‹(ÝU;©Í_žLäÊr#å^a#j wŒHçrn‚}€/CcÂqè¶Åjì¾>ž£—±d.æ'Ös÷ Äfˆäm<@óx²¸àVµ™ÈI1V.uÕpƒXF<4~ª»£¹¼ï!$ˆ6ÝÜëƒóï«*Ø: ©-ݸf~Pˆ¶"ΜàÛk³D•:;§§Ÿª ‚D̘F±¡¾iúÑBþ³ƒ¥ò÷ˆA‚ ˆ!óñ†;¼Â@þrT´2NÐSYsB˜ÈXm|f(E´É:™U"Eª7èô«S€ÙFÀñ„’ž€ÔÎÇ`jý·{¿ÁÍÌÄàý¨"ìi5¶-‘{çðq³š«¹záVÅç#C'z/t½½ì] ²ˆ…o‡>ÍŠŠ’“þºÁÚg›úÑS"á(Õ«MÛºår d‘ÑHƒA€x&O¿~ÿ»éºÙüÍ_sD|/¨à­Hõì›pK™Y6Sþ6/E0éÖê£ ÊOFŽ2¿Åm<£[ dùš–û!áÎ}ç1p )xAA6þ‰íAÝuAâr:*’ƒ­±‡µ¼wå@6¦G[âUnå€rqØjÄv.3É™Æaí'‚ ”ÄÅv‰ä:J’p‘UÿÀÿõ°ÔäÜ'¾­ˆo®RX "?þ ÏäTOÝ_§ë¢/×4“bqëÓ_1ïí_,×Ô?ÙÇù¯èÿgèE™‹Š_ërÏü/ýæ&H.ö·¿—ĉå\/KeõM¹  úÏ¥ÌSÆ«*+æ9týßðo°-¾ûUL©ýðH¸äìÛ/Ðfì‰äMB}}ð<Î'¹ÁÝdY'«—D\‘’³ÖªMÜénn+r­ÆÌ*ñÁ¥I[bîžMå‡@ òQry?pM»RÐWGÐÎÿ}-à3—nJc¸€ŠáþÃ߬š¨“é`xSòÖ3¥!ÁB¬<¼[‘Ö`ËöÍéÚ¸á9l»¹'Ä/+…’›¤ç‘Í¢ÇY0ä‚·§{ÞYEQϧ¸îFQ|†¢…Ô.í-ëêxñ_K0#;=†ü‰º ±o"ãÓG>‘ÜÁþlD©òZœA1p[ƒ¡‚Çyso^Âë¼õ¨‘²êYÃMŽ`Vt }í×ýôÇyšD—BâR‡#Œÿ4ëö_ã—¢ƒºgñÝšö…ð3ÈÊR²Ž¡þ×~™õQÕ}J«ï¼pOæú.Òå_ôþ‡_ø…Çç̤D¬¿X<«ß«Ñ‘=ï¼ÕôúÃïÎñd% ²&U:-^h}:Ë:"¯óép…¾ØñÐ{Ã’Á°¦cŒÍ›Ñ–ÎR\Vù3ïeL´Dª·yÕýE}~ÏÔÞ¢x×ô3¨«0Œ#¼>ˆ§\,ÇÔ ž*Ùèœ+Ïêd’óAÑ“ƒ’A¸+*ÕÕCÄ}K¶fÎ:/ ©øÿx1Ç«Ú#yw•˜öàô¤~{:L–r'‡pË(G (]ïAͶP{îÔ™Kâç~ 8IY„l$ö~§f–V‹@+ÿÿÃþ!üõ}ý×/ÅÅ/ýªY§ßd*#ú i)`¤õ‰%ë>’Ž1ƒbSÞÔtKŸ9ö7‚óJ€ÌÁÿ»ýûü’¥¡óžüù‡Ò×àɇ8=þ—Üç[¹,3¯ñ³‚þ;ŽU«wý¾=5õ¡`4ºÐy$”–UëûËkëÏÅí v²pø!xo\*Mü/[gÊÑ'îWõõHùCS2ÃÇoþÙ¢ô=Ë@a7æÜއ/-†¹ÅÑÛ¹Ãþ€ù¦pŸñBö;®ŠõN_áj¦¹]<šF®æÁˇƒŸ"Îsßšô¾LÞ;qÆxí³EãØüOú•€I±òöñëБ/óp —XÇÉü?¿’9ãÑ‘êwúzpk×þ =2ªïã£$O;¥ w_s²Ç@uµ-!§9§ž¶™ëܰltºr¤1^ÆÈw~@óùh‰÷ÉŸD ìâÝ'Ó"ÿ XmP6<ƒ3¹aì«í›;\›}EÊ_§ÝV) ȹ«¹úh+‚Ð<ûúâÓ«”íŠMŒ½%žõÓGX]!z!ƒSDZ1d¢’v=3(å;à‹1=ÔÄϬÛBž<•)÷ÆÅø?¤=–¾m%p~?;×ÏÜßë·ænb¢076%†wnÂÆÀÔ™2&£ùHhÁ§kFö+ Í’YËùÇ`?pvÿ‰MóaãõÈCc8‡™@þý½üÊ2êOFþSòã_¡SOŸj*ÚeUE-¨‹M S(ÝŸ_Ëõ÷ëôüÓôý={óƒ-þ™³zö8Ûn¼xß¿^öÖkú¸„^ºm §Àç‡ æwS¤dþ@‚ˆJ§t°Žl#x°Á°þ "çÛ3Z<Lúf9›ÁiÞe½ð¦ó^›ÉD(RR5íÃcÆ‹ÜG'ÍÜÛW•ƒ¦Îë:/YݯE‡e=ÔJûe[¾aјB/$ù5¬‚ÚVý “l$­dä^s‡ñß/†V_‡Á7¯„x¸ ¡‘]“ŽGVâ¶í56Ư@æ\•úøèÄ‡Ûæ™ÅH£LØÛÙÛ_«§–¼x\~¨â-4ß+ðfÈa©ÎÂ2¯˜ˆ¼ kZ1# è.ï¶Rñte¥­¦°kÓ’íê¡aêzÚBÊKf¹ÇJ±®„Pª¤pB@^‡ aPnoq×’}åš› Œ*ãEн^)´èG¤× £smÏM ¥&ˆÑ×õbýŸñþ?±oÄÆ–XàÆÉ) pÄÅUHU¹+þ<ÿ²|¿ƒòoص/2þ& }±ÔÊß¹×…g< óü{½×ù>ö7EµnâÛ!¹ÊIÐM¤Î´'”&‡kfŽÞ ¡Žn8!Þ-@iy&4Á™®[=S´Ž Cä{#±‹Î0p%Êbª©)+Æ0$–,M†wž©€8’ζêé .îCÜ©9oû·°x»m®½{/çq[)%a@˜HCwÏ H–Ñ„OÏG}þ4´C¨Î •T w¯Ðì¦ó“¦æs‘^xRÅ,@†Ë›ã¬ß5SJºÑ/PUY¶ŸUÄŸõÉÜ ÛDIBú Ð<¸º¬Œf«}Ò‚-¬ddo"ÂŒÐN²^$«0—1æuó¾’/–YÝã- éðQá¼bÂp•3è…opÌÜdtè9Mûƒæ"2 ¯ÐÓ6aJï^'%LŠxx‚‡U›H\¯ÐcÀÄð6…ðçM©\@ËÚßUU˜üµ ¦ÐR>÷KÄ„þàÚŒÌ>š»GAVd ”ô)‘Í,ÏԀŵEM'?,à;²„Ư×\v|S€x™E¢ó±¸ò¨Uê.¾ªtÎÝV¾´ð–=²‡9ò‚œ öùÒ1§QÑÍÝÑÝ®i½×UÓRØï‹gÅá->‹ì ò%Ñ«2¬S$Bó8LEÌ™NDŠ!œ˜4ÙXÜ^€nƒ¦aÆ|ª›{o1¬Áwì|NAÉüªLyF¾m¥Ô!š÷Ô .ó<{Æ€Á?VJ©Rª; žáäq…¸{H­rsâ{]#¸Z¢¦ˆ ¨ŠGô‡éß©î7C2Òý°"D ¯æ›TªU¶œï¢AHÄé|ÔòµïJ'o¡1¯Þ;vÂp¼¢ÈcɪÇ$xµU¦ ðªåÒŸ"°>sd°ç W–û$b¯êkŽ~{è(û·•nlÈò°êÄ<¯Î jEáð‡Žf˜~Bf¥b>«”ïT;ºªo&+/ÇTðÖ<'!>ÑV¹h†žç‹¿.í !<;éƒ1z£]ÊÐýÕ¶¡ð1±3Ý‚ÇAÀà*:O¼€}4ó)+à÷£¦$ÉÍ|Ë  ³6tþM†}L)ªóRÛÃ|pž c³cœwFÚÒ·œG FVúp®‹iòsÛt²¶ d‹Æ‚bg~~ÖàP‘6a¦†ý‹erSc"*9*/8°Yþ¶Ÿ‘44:™? s°ËߘµÔÁÍ­šò/”f­®ð+}Û20Âpœ4À+ îÈt¸…í ÈZ¡Nà§f•«#o?xIkE]Bîé´™×[èù÷·Œ×íPöôÓJÖ_¢#|š½µÈXrêŸ+È+Ë€Ê\zñ˜êËl¸ÏÓÂFOY¼Œ1¹ŒÖ,Øþ)‹wa@I3S¦P±NÚ‡RRc >Ä5ñ™¸ûÚB=è(=îÊîh4‚Áã™`䃩Uýï14LƒÞÍApÂ4ߤ+ŒÉMªi³Ìã ‘%^‘íâ X» «¯3›1#—s;Ô³þÉ`ÂøÙâ ö~óKN ºž}…=óž¶æà8ïÜìßrÄ;ë‹0ôDbƒ­sÏÔÔ(3Yb÷ƒ®ã£Ã =¿PõŽ ¼Éï㎩Èy’.œÌoÂ)DZŸp%Ó.RúÐeÂÚFçfðÑw>ÿÑr¾eGþ t¤ „ŸÏ©çgÏ6,O¡ä7¼šk“Ÿ æ@²rJ¤îIí˜bŸ=ê sˆ‰ØÏbFú“[ÐQ:5(õl€ê›Ph¯i1¶á,>v\ß>ÄÍȲj><„+¥R]t‹- mØÚ*ieC ˜Ÿ±Xa4&M¥t, â¼Æ:þI÷a0`ÄÂ;Óù’ð8Þ9‚æêãä`¿h鮺ed„3Ÿ¥ñ¼¤ä2 ˆùªfÙh(qi“Òðˆ­:Ó’BR’Gé±7\pêF¸f‘FÕWYÌĉ!ìXGî#jÝf"_DTظ oë"TEx¸/}º"¦«®‘(žuÐÛô¸P¨& ð( 0‚eøÒ¬ gªUi¡t‚<›,Ò6§ÈáˆÉ¡ÀíÌù¦ 5‚¸ ß36hhÐWLñ"ú•Ç1ï–Èç”UÔûÌõ’+ í¢9m šu(VÈ•À‰=T*¼Av²3/¨„-ÈÄÀ‚$ž4eЃˆ™†uZœñ‚Ö O¸™[1=HƒqÒd§±%©Mk=k©8 àƒÐƒ†öö´g:°ú„<¥¤Dù½WZ½yL¨Í®ô9¹¯™š@ìÄßp4\–8*Æ^„ñ©‡¨Æºprt„I‹?}ø€þ]€ï•çŸÚ I:êì\@i5EU X°F˜…Cá5ç.ð3{´ à$‘ö'™½‰Õõ˜Ã=ÖL ¸ê©Î²p²³ý‹x³Ò]ç j9žÒTsL¶CÀ„rjø ÞÚ*Oæq5‰ÐRYƒ°ƒw’¼MY 1/y*Àv}¯ÛAUæªÃoM¯¢®>Lie–H–ŸP,×úýŸà?ñÿŸô`ˆ$`_ó™á‹øÝ¿ÐÒá‡ü ˜ÿ ƒ{þiÅz•§ü¢HsB¼1ÂƵû*ˆ”¢‰ù”7Ј‰Þð…”YÌ̱¼„°Š 0€ÿ¤@ªÌ™®ªEÁ=¿¾ (f‚@º/ÀG·j7©™¬C0¢Léaꢹ;à:º~‰hUSpÁ–xg§1s5Å5™‡+ƒµƒð=öÿ=†=‡›N6BqÉÙ›ñB·#3“;7´­ˆ%bcÄ Iú)ÄæÁà¢×àJ„ ™“(Pþ-?ø;Aì§¥Ù>ˆ?{å×ôŸpÈã«Oþ²ð5>x ¥i–÷¯±Â¤FÇ p¢W|*ûæ—¤* ÒÛÂ_Úf¨¾OF•ñÐL³ª‡º"<‰äȪô,TGþ¶ÖP_ÒØìgÞ€Ù¤o0m:Á)ª¢0WVÄïÏ’9Îì^’ÞìZ¹¢dKªß طp9ìPxä"_òû`–õ)h*e‰LËépu¤°øÁŒZáëØúe×ËðLFœo0V¥ÅÙ#Krw!;œ“nÓ¿MQ_³Ð îD$¯µˆï¸š¢@„«¤y騯Þôm1Ekè¯%•Í„»4É•MyÖœ®z¸”³™÷8Á*F•ÕâŽLÀ}lm”¾58S w4F-zÖ|v‘Ù¬½„ì,( ù} ÏI`‚æœÀ˜2¢$ølªñ?}ÎÝT]ÐLšoÆh ‹ 'š”fËøn¦6BëîŠï ‚Bm|ƒ5UØáIŽ–Á½{`¦ogK%¢g°ƒ^ c¥o3è2²0‚ <· ÝBd%˜³A˜AÙACþàÿp°ü!ô¶x|U}íþ|I6™ñ.{š@÷"ÁB:… Õr*ЧÛj ÷¶ä‹1B3ø?x8|Î2y Š@G® RD{óe3L[›¿¿}Ö]ˆ¿Ù™$~_C¹9 Y„ß•ÝsX |Ȱ/t!n 3ôÖt}X\º±žÍpÁô+1ò“éKlƒVÞû±búÏÞomoþ:ЭHóÜýS½Ž:ŸbÅ ö9&¡Z´.ªˆíOÐòHg»b²ÇÛÉ`üôõZü›°ùÅ Ÿ±Šý°ªînsûC¿÷ÿ¾æ+ýò}Ç÷Q˜/ —8ÁíõñõúoëŒývÏÓ|ì]û¸rþÆÑÿ¿ë3Oõ슙¤íÈ‹k×—=ÃÈa§&<¹þÍ>اÓ÷T@â¶y,†$Á `W•€d)Bîs¯ÌÁÕ·¡5ÐÒ×wºÍtÖ÷Ó*˜‡°Aæ µßy#„…àU}¶HN®`àÇAåW€›tdÌ4W@A”ð‚²ÄX62~{X*(Wº¥)øòDJ žTÐ.‘l±íà ©Qj€Ùæz¼¾x[{ÊöeàoKh)WÔ½…¡ã5LÌŽ3†ˆ^8¨v—X¶Û5ß>x^O”û ??àNÇÈÈ0ÏâO¶OÉ:ó!Y£ò¹¿Ý“b~ºÄKüx!€Ôg4JïÅÇnäÑÐe—1­hçðìþïÕZ.¥öõþáÀD³k>±•¨#®ŠÚZ ÝÏÉßQ«K_O%Iÿä#Iv£^2¼¤%¡s**”r€%NÍ4±ÿŒ!‰øFÁœdÃxéÅ@@ÄGþ_ôÿ‡üìPÏþÔÿ¬ÿÜ1ÿoýÑฟûi×þépŒPÂÿºÎˆ?æC$E!R-½4âî–T˜3¶Ñ¼5“æ>ekÛCÃ9½ÇŒ¨/L_³Ëéï a7¤ÉÝ픑="G…¢™–ÛÝíöÅÛ9òöϧ+|£el5"~ñûÌÁyžã™Öö‚q8¢.Ô3ŽùvzØÙ‰Ù×½îZªÃÅñ™ô@EùhØÙ󑙉ޅŽ`ÝÁ4ëºbÁÚˆ› —Õo¤§OI¾æÝ§óåT@yùù%j¼ZFªÙçmR ìF¤¡Zö¢˜¼®PC,aúÆÝ¼ø”{kg°åe3é¿w£ ÍF}£ç\ Î]tˆÊÁ‡8ž4e¬±£÷O*G;ŸÍJ„¨ë¸ÕžƒW?Fc²ª@IÍ–·df[œ^‰¡Ãj{žàËkºÇ YœRÐÁ¯½ì°tS‹3/{¯‰nìÌ‹VýjÚ;œTóæÑè1,¦®Ä_nKÍò¼ô6ã²6ô0Ö“)¼®éÏ´S4*…"¸ÈYìXò@r²§¨Õ´¡]½Ï(fGî_K–°>¦z ›Š6ãs†ÖŽ\²q´˜517¼[†»žf$±=›l{×íz5YQñƒ­6Õí•Ço@ùÓb“+_ÍG"©2w’ÞÚÐKðeòjûvƒ¼Éå¯3 ]YäßÕûz{ÂÂFq¹F8‘¶roï/÷¸tí*ºâ¤ sH÷y„¢ž¹6êŽ|e] >2ðPW‘·Ö:Øvbù"æçÙâ÷ˆ½âG×c¥ojŸ\)Ó_-ô)ëCWûp°÷hvÁTzÃVóÍé¾âñæ7·ÇS”‹dWr¢*¬3½¼#''¶«Â9éq=à’•EâK<u’ÇüÃéß#z•c•ÕÒΦóÏæ”6ͦÈ\_uUñZ RGT_•E½bÑ_±M4Ô‘)¯4¹GoKGi‚<£~u¿r “œ›XO ™ú½à÷¤‹D[2ÊŨ|ëõê#У̰»cgXG¸j#º¡§ÔæŠK.ª h“ ÈÆìá/v³Ê`ƒ.® Rùñ„Ԧ͠ï9} >þ‡ý¾µñsìçï›ÇµUýÿmŸ†3eîQļ=’mÚ«¢ˆfæá_†¹§gG²M›ä¿é߯Ï6;ßãÞÛ(ábØ-ßýÿ[üaùô}¤AI·øùð)Ÿ÷ß[á]!‚fÊ‹>t$’¦¿¨nö™&ÿ/·çKu÷üϾ|u¾O¼Á«¯ÓãËòëôñÜï\=ñUÛOer ’ íCïUàL=v¬>¸¡‚¤9ŸIð’èÒö¬òˆ³¨š›»‚ØŠÀbXÍJ± li¯™c_^ U[Aj¨èôû®%æH.½:>Õ?÷&.B¼Bó‘âvýBu¾¯5*ðõ!ó3yñÒ±E",°sI¼ AICجÿjèj,ƒ@]Õ@0*ÀŽì\ÈKŒÖ04຿€ƒ¶¯®V¨UQ$…ÅÔкäWUÆ ©ó«Ž£¿CÚ'7Í.«\Ê s1|u“­çÇ!O.nû»Ùò£‹Ä~8M?ai&ˆŸY ®¢5lò»LàŸ”Sñ†ˆáUCmŸ¯‘Y”å™iS¾î7öÁÏdc³ñ¯3YÙ™‘<O¿3YŠ…}»c§K– _t‡cŠ$8¼ýŒø/ àŽ¢Vã°dA.à úå`CQ~ª %)f"ä½Ý˜nFjGBQ™ó‘¨}#ÙÃØº­\ßÀïWv/r'ëXº‘,w‡î¾UÐ÷?ïsóÖ¸ƒÍ†T6Œ_åKæÈªÂpÏ¡—ο±`øhÐps\l kín2Œ¦tÞ– Sza”2q•./H^0D;ßû=H~|óÄÞÉŸllk‘ªD<<ëv˜ þy¼'è Ÿd¸¬·.,»Í]AR´^f8ýËNñ©¼uúbL-¿ UØëÊ®œÃ7ë ’>ˆÚRj…|Jd P%Æb¯¾·ˆ(Iùîèô¸G€aà Xt]4Ð3á õUk‹¥ûÎÞ˜Œypfiµ%ƒ w†°Ô¸‰ %`i`f˜Í£ˆÄ „qâ*½Ÿ\.¯£«Þ@™ÓG»#o »BÃ}º¾¿±;Å]½C[âð® ܃¡\SÔ“³¤³›* ¿`2%aŸ—ÈÐ ŽÁáÓ ”5¬Â·±¯È©é•‹ ™I~—Ýö‚˜à)f)t¿åp{|ÈŽ–I{ò8L}µù²{×–áx¦’JÙ]óà†ÙPJjñÉ+n ‚¬b›8åöÒébÏUÎØs[¶†­"à<2,fîò|L  ±Z‘[ Þá‰N “`¯1n(Ãv×·bzH•|kâPE]ÀˆA‰•WÆw`Ç`8Tå+£èI48ö»ºî÷¹…‶› o}^ÀÈÀ#‚PÚkˆ%sË·uÆÇD3¨\y«kF¨æ›@†›üŠÌn ¸ÂÏ«ð›þnU-YøÖÈ’Kgõž Ÿ@Ì~ˆut`qŒ&&Ì7eDl\_ÊÁ÷åmRÎ3/Hå8Gw°ðªìjåü{±¢a¨´ž¥Ç¡lÁ ­iÅ”Y2tÓÙŒ¾ÁjH]CÕ™‚?öÌÅÀô9»~㉛[üHeН”øk.XžŸ›5~ EUÏœ…¢kr,"]b(|ÌNŽæ¬¿²ÔQªl r"‚$p/é RÒZxĉ&…0ÍXZ08¤Øà“’“¹gZÕtœ]óÚÄxIB  s“ó45ôÙ¼M£â×§oŸ÷ßvÕ†ð©ƒè|©L1bᦞÉï¾Þ”¥Ô•æÞÕ‚Çk9‘ôØáÁX kØNÈË-y"s"8²Ë/…§Z“{Åñ¢­Ý@@²6úÁ‚ Â< ïˆlY~`ÀwwñW MMIbÚ‡¦ÐfZCQT7’о ™DÜ(ž‰ñ$CQû caƒ´ðÄ.“öM½ÌÌ4›q8¿@˜GÈ—Þ´óR'ªŒ%‰^E€\¡Üæ_šÑà@g‚5üK@AtÈO>àÅ€Œõàaà30'/Ô"#éñ„ªZ>$ù¢Ü Šy›}Õé:XÂ]òn»…±Z{—,äù5¼:Î#U>‚Bä „©Îˆ8‚ˆˆðR˳8p2NéŗhNhÁ0ƒ—»Gaì*)?(ÚÙ]“:û,Î×GîxW½ßBùca†ß¬:ø_àù …¿Þ=F€Ð\ÔŠ~+vÜL狻߹˜¶ÑcuÂåBŸ:úEJà€Ç2ˆ‚Äqx®y %$qI9A' Oè3·Ì8ûÕI@èÁI|5@³Q}ÛɼWØA~Rb‚¯½a©Y³êH3Üà(£õJâǤh¨–<«%Úxià*´ß7ïdR磙A“³ˆEnDyT+/¶dÙÂpY'XBÂRQêIAÿŸ‘Á«ÍisÃÈ aog«h°Àä& ³ãÚñNbÀžÝ¿KËI†ÓP›³¦›gyé –ù§ƒâ ¡PGûϼ}æ q ¡+J»¿_ÍÅ‚Ð" $x¾ô>ª† t¥¥„þ¦x)ó†V…Ú¢¨,«[¬ù[Ä!BGŒmk³A!JÂ‘Ì Î’:†>L-_ Ê¥¼*ƒmÐÇ*å…àë6‰y˜Å,ÆbÅ‘BD‘£íæ÷ÈRw|ûrê¦l ÕžõUݸ&ÁëW–A },úpqT† ùêë}¢=^ˆ°†°Üž…| : ˆÑu•”ºuÏìTw”:Þ«#µ/é³3¦Â—÷S%OÙ®þŠÀgp~æ_®<žJ“s!âoÃæ ÇMNQ‰ìg`fêV`6—pHl²9?'ã©Ã@[Ã7 ÷•›IÄI}\ ° ³úWþUøð~d‰ðBa$Œ$‚ÈHÀŒ!#ŒBE„ˆÈD!‘ˆ‘FA€H2 H °"’!ˆÈF2@¨BæA’ò>Ÿ†OÐûg΃ý­Oëý/úOçúÿ ß÷þ×p.ä$“7Ygbî_嘴böÆ3ýF<ÿ±Á™#3-x#¼Ã™‰cb½z †ã+.~ëq ÏÆD_ð¡öyáüÜcÚCîËó>~Hÿ8q°3øª¼ü'73>sÄdT²0gŽP<&ánè]D ÔA§’ÒÐ" ªé ‹ÀØ¢nBÏçófÐeŠåfP*…I² LZœÐ}a§PÍ#Q±’ž(ëýø?ôxd?éEýÐ*‡ýÿù¿Ë/ø„HóOý¶ÿ-”çúòVåõ¿&®hÇ_‘þ³ý§ß™ø?”ý…ŸIùI»þDüIñóïߨÿ_ïþ¿çÿ/÷ÿhk—)oøüsþ$²l‰©½’ ¯wEmþÌeܾLÆÃ‘Ø\ð¯ˆËž8±À¸ß\™ÌüP¡¸üpÀ}­æmkK ¥UPd£¤wp°Ï=MØÙÝßãJ"?yébT<µ5)áä¸% –s@@ðyÐ,Ô"?é(œî‹‰Gg³S„ n@ü°þ0ÂðmÕ„²E×-äRÐR$R ð‡ÌÛ/)ïP}ê•ÇàòÈ!° @›»†ü´â =2 ³UŠ ;>·N;mý,Î1ö;yô¯<ͶàíÙÇWÀúÏŸð>óŽÞ9õéÿ;÷ùëø6DâƒCüÊ…r"TŽÔ$mtgk$—Å @³*}ÆÄY3TÊBg/+þÒvÔ®Å4×q$Éc™ïv¦5ßsÕȦ#Ô>|)00XZ_¦&%KŒ ý¦…xصAÀ«e$ÂfMùÖÁ8/é÷ë7µÜæzpG·y% ³äœ’à‘ñLýjt€”MÚáâ78-@TJ¥Q §+å_XiÃÿë–ì<ù>°¤‰ªJ­—µR@3*¥ 9oàƒ4 á¯å™>°ßSÎöVüß㳃gb±Ž³úϬýT{Ÿ‡ü~P>¿‘ÿ‚§ì?)õ½¼þ?‰÷£ëõú}ïð? qößì~xÛð»ç¿åƇCÞ?Fz½æ‘ÞK-*1eYÁ6ÏhFêžÛWo.sç·sz¼˜Ï¡ûOËì,}FþÝÍߟÏçñŸÈòÿ†?ô ‡à¿È=¸9 ÿ•ÿ0@¯?è 6žZ³Þš†îM °PXý , nÎÉû½:Ðû§m˜hrŒÔ¡+Ñ>éºä÷¼Ö”à¿õÇ|øåt$$„þO°˜˜ïäÀ@6eêJ<©hõŸüƒþ?ýu›ýîI—í N^gôŒHH?ô¹ý8%²ÏòÞù±½¿<ÝXÞ{2ÿ¿?µKÁôl?{ë¯OÖÇé÷ûÈB€nŸý?r?Ò{ý¾_OŸÏéôøãíž8ÿsBPˆöÿQ— ¹²•þàr‚˜ÍžòRÚ««1Ó(GrÉ¡ÈÁ¢½šÿ¯ùþÃæžç¿£`þjOñEÑÐÃú_ú+Åž‚¿¡¨wpÖO lÍ¢k¡K›×ÿîÊyl[A‹©òî$èR2CY~Z€¹® 4o‚Yò¿‰ «>J³€tt†ïHwxewB­FùCú*4güåŠ~UøÍùY;ªlvÔD™UÃ`ÿ®P±_ŸÈƒ–uü¢`BÿŠ] 󂓯BÚ*t)AÊ› µŸü~_3Ùþiýä“·Ë~¾-íí߯lzs¿??^ÞÍýŽ,S«è ÓòØ–õò?øæw5RÈ5RØÉTh~jÎtö¸ x£Ó2ÃlŽÆåéŠ S²ŠæBt‰ôΰLÇšsÌ”'3A^Uf`ßNDùÍ«òU0k2ß‚!Q|¼ ±¾‡j¼ kê€è@¨_Ëm@°ú&»ÑøÖ¢?Ó…lûݾìë-CYßÑÙ7bî_nÓŽL(½Ûßj»˜îd}H$O9xœêdãl,,:¯=8ÞÜ Ša¿Û¸‚꣟ð"®«é £#¯—ð²ÿíkÿÿOýìïå%…³RŸ‰üaýQKþ<hØŸâûÿŸøèàý ü'ÜÿÇ·ÛüOåýÉãcÁ¼³ðøÿb†Ç´¯ûÿ—¡¼>¡Éþöý«òÿõ™åø›}Ô?ê@ë€òeLa`zü½»ýö”ÄKhúü½z0ué·©ÑúŸ1ÿhç¤Övž¿ùú„1ö$÷ñõÃøí=c!þÌ…þ…„Ççüxù~FÒ@Ißîl ½¼“çþº<>.w?<Ÿ=öü\Ôª øº´DiöÎqÖKaSRÈö²ß3{ÃbI’Açög´û`A˜çiÛ÷xÁÄ”î@ÜÉ[‘/àÈo¹˜œì|_±"ijòÇψ zþGí==;ú~¿Šù_XøI馃ùKãNƒ_BöO~gèf @‘ 'Ëo‰÷ÞŽF?ÉqF/5aù‚!”? Tޱ_™©N$ (b¿ËÖ¿3càîä8d¢ª‘añAûxý*62“ò ¤lè%KNMxãëê•E•*@“ýçã-ÁÛŸØÏÜ÷›O|LñêO©ÀãÓ¼œôI÷ßs¹ñíó­ƒëÌú¿Î~Ã׌Iøîÿ*ýrQòàÛGdñct&/?¿%Ÿçþ¿Ûóù_õÓüþßéòþ<ãnºíÛýyºãŸôÇXró·uÛ®õÈÑżS άB@ÙÈmÍFj¤¤†:ªñ¥PšKÿÔT2Þ•eÕf ÝÛ·«–#ƹ©VƶÛ㺬ÉëgáQ~áfa“4ö]4[À•Û7³u‰K)Ö¸¥œÚÖž¼dù(‡«^^‡Z¿'*ÔZu4ÓqP=`ºƒ›¢½Þ9n\k næ{ó쯼2K˜‚âÊg?j¼G çRyב/yÛ”;©æ;ò¢»àØÆ19v‰±å÷œ4|… ˆrJ¡x„ãÖpíI¶q:tDIF-â½?›±ˆß­ñЛÂDjt¦,ä&¡uÂt¾½´¢_,à6  ú•Žp#ÝQUr.åIJASs‹g¤´ó}ã–,îpðgbê‰Pˇžn„äƒh_£9Ra÷¯mic@i÷ÿ@ïèðˆÃûðˆ‡ïÀvâÞÐïÜ +â£ýüȈQ%N¡ÿ À¶Ã¹Š81VÒ£ç&ƒfCøóë|´ÓÿÒ¬e¯í¦Íö„³ü•/·,U[C@°\þ0àJï,‹‰>^k¯VXω´¦¥I\‘/žx‹¬hEž+~ ÀÆ÷“t<)'º_j,×Y'ãŠA„ÀØ cÜŽÔ ’ûçî>zšãA7£Ð˜éY«@Û¹¾Ì@m¼!8ÍÌÔOÃY ÷…z#ºÓ,YyëàWCíý܃ ¬Ü''ªd>õâø"¦ØšÇvVuâÐ<Ájfx4-KBÜö®õðÍñ¿ ಳÔuѧ›ñ¿*1a( Á-{ƒÁ!ñª îñ£âL¨žb®.„î =rñ­¿¥žÃ¸6vÄ„tÐ÷òôÅK©Î8ÕF¨œÉú!n ÁÉø)»&÷—E×ó³}ÏûÀXûvËÎ .Ò¸x¬| ˆd@`hˆFöeÌAFy3Z  ›—ßEüÍ ]¡öǨ2U‘¿| æˆ1Ò³ `'Ø€Ud÷ŒM|%Ë |dÞÔön ¯° Å)|ÌÔµ Jj¾¨ uM#ˆÔ€‹¤„7[d1¨ °söƒ`¨ƒçç.ð;‡CM[ydG©$Ø$zÏÔn]AHMýpykìýó¨æyœ;Qûõ|X7P:a,Ç ‡prä4ÄJE¸3ì ²m›;—e™REÙú1Q™ÃÞ1K>¾‹óø0aׯÙ'Á¬`Ë3ÍJèÂz/*tø×8éÛ"2½®ø¯®¾è˜x·à# òÌ0o"ݨÉÃ@3·ëðÆ…ÕPDà! ;¸OÒ’ˆÔ3;‘ýôi:iOÜáö~i¡?™$þÊW¼6”ÞØæ ò‡„óO§ õ;£ñõy P*,¥]8-@ެ¹«€UásžHÚi¼,~ ©žEPã 1Ÿ='Š|òP¢pšt)Â~g†™ ²|šOD ×g¬_ÎÍWyåA÷ÀXgúuEÅAU]TÔÑ m»²EÍÇß{ùÜŒ¿‚dHª¦O±1ñ”- 3ÊàoXÒ<°¨ˆ<øL¡ë,[W!XÓwU@ƶÂcæEX,€é :j{¬$”KSBm¼3o°zc°#ß@Gê[øÿx*¡O¹ÊÓÃWGä¯q±Tð÷¶üsÑYv†8µHÞv (Œ‘)…ÐpÕèÃVðõÕÉÂf‘ÝçüPÌ é†À ' jÒö¢N`Â~ {˜ ΰŸ*|Ëɘ„zݧЂ0.ƒahÀTÝÕ¿ d®(Dš.­øõTýDQ!'¬¼«µš! _? Â€¸&¨2§!©ú^d|©r¡/a6gÿ©¡½ïÞ:‡Ñ~a b†1ª žf^UV0fHæl ¼ûYÂÑ âÔ̹Aô5™AÝ:(Æ[èyðºNKKUnT·¸¥Û“öA¹ò±÷iö"ËV/š÷=é§M̃?g¢Ä ñ°hÈ‘ÁžÍDš!94".Ф´ÁŽÇ˸OM„ôÌ~\‡?@íÈÑ>–pRºtd±)¢ãsj •VéÉ¿¼û.ïƒ&ž?:ÄJ;*3 ‚uÓãE!{Þ‹±Õß½: n…‚œÆKaîO;õÝ÷ÖæNYs"ÇØÓ#À^iâK@}ó³þy„CÞŠ ›œv pšÛ YHE»hÉ ž˜ð¡êJ±ävi}ÎÎ×åÚ<>‰+>}Á öÚNÈ¢RjÃYmXm¼›Ûغ ¥oææ1ÑôÀw½¬²\H  är¥å¶BIxžÍÈP W!%!!/OmG—J@§¨˜È¨" 0àé×úQX œ"ßÕ3åUZ Ï|ûybÇÜÏ‹ó01HN¼¿bªÊïnotíqŒ’ÒWÁçÊ¢y== ø1•_ÈÁ¤…µ&¯ÃH ïùÑ ´²|1£Òíqw`¡PA ñaM5òTpc\ª Í ¿^‰“Qqúý¾Ë7QÑ´ŽÂDÜãÁ`^ÚoF”%æšXïHz±c&&µ¼Æ „±/> xÉÁÖæ©\¹û‚ï«qÛÌ~ºðê>§©î)ÝÂH+Nn¡à8(£à39©((7¬’.Æ€q•致pNÖó"±Õ"Īìú#1ÀPÒ¡çX­ †’Ÿ((h°95p¾éYøD€ÀjY.)Ý•rÔ5M±“Rp>¦°w„¡ü"Š Ÿ'™H“ x€‡âƒßºÊ„06¹u#ò&b ªºe° Ç@Ø5_ ίL«Hm›ë£t Åá}BŒ­êhx!$uvx"â ~ —~À`Š™2/?wì‹°NVhîšH Ë>ËÜ86•Ò4áoçl`*a0v†ÀõEˆ©¹¸…­ {` <» Êîž OÐçÌÅÇà5ßXX=íF0jB?Î{ÍÌáD_œÏí”—€\0€—ƒ Pº2ZÒ(™ @4!*}¿+ö`'±ñí|«²5¥wÓ(!uÎ##râ :æðXVD“Iž>5©0§2ÏS$$Yzñt¯ÎçÊgÕu¯™øá0¨Ýt- Œayñ©õB}Å)Rp¼F êÏÿ_%TÖ™ o€{>øø¾†(² B@=ýóKõ‚ ZÈU'¨*¼& 9´´ íà ¼„ÿ»§ÔÕ›réG‚ã˜2òóè¡Y±Ð?,wÒ7‚{{¡ÈâûÕÌH[ÉÐ[åðŠ;†³„œ’À‚H6½Ä+*êQÂõƒOØ Ü,òá/ ›HàÒ¨L€­nèÈŸý 0èú™ñ»áÛH )ëð;Œ!…/ðT¯è<þ7-pH jû¤KÎÐü¿ZE*ÈdþRþÉÜÇ&"XÎMQÕÿ\Sí±XQ=ºM†|‡hHõ1.;¸$SŠšéò¯ͯȀöú³¾Æ+Œê (½G²œi: †8–6½#Pêˆü¾=xT WnôD®?äTŠf ` ‚vTñÙoHLË÷¸©¦ƒÅÕ;ªá…­€mÍ×ÞÐßX–`fá³@ª.àH¥ï¼ÄÁ¯=åÍDª p£•R´ †:Vy¢ c4y¬×ýO‰_ËöþæüýóœÝÒ‘ûf~ÿÏÕëö† cõcŽhþÉÿÊzÉúŽÝêçûQæÑQD)%!èȾY—Ëo|p<4—'ºpäߨº+z”‚Ú²S3OUˆbQЖg\E‰Î`XP…â2‰P€˜ÛùbbÔTZiI‘»'µûœgÿ<I¼ƒ$›uEŸÓøu+»e5vEX•÷9rMDˆÒT1TEŠûì™<2ɿȠx ’†ÑärhvŸâ2Rª ÿvàΪPŸê9éà2%PHXQ`p,Lw“!ãY{û™QÏP5¸™'2›êo¶7 êp~–%”ä’ÌT'êbǪŸ)GÈ–Wòówô¾³ò€Ÿô¬ö EÃ%ý¦Œ ÃІCˆÍ¤ð•5uû/yE×8ò$(Æ0'Ð{†“õϱä?ÿ~C'åþÿøÿlÿÇÓŸð?1ê¿ïIãh(ÿ?¦øý­5ó=`_ÖH\ý4ìïõ‡ Ý¿â¿)Ìž‡ú~ïÌ0~DÿŸNå†ÄýǧsÖáõþ4@ýÿÔ}7L›qâÈßé¯ñ›OöÄ—·c³+>d'χ/ÏóòÀ} þr}×ôÛn­?W6Ï­ãðq?q~Á ¿xqÖ'Å{þÇÞƒöÿÎz15Å &(¤xŠçŸÁÁî°æÊz¢Ï;þ3M·é'äOSsƒÓ’>“¹ð|Ký;OjL€PÊ¢š)Z ‘@d È!# HÀ$`!1D$‘a"I"F $ƒ!#$H I$È@ƒ#$Ƀ HÀ„a$„‚À’)HA‚!‚a S’ÿ"¡úƒ×ÔŸ÷$íðÿG1GòŸÆ}Øs1ùÆ~§÷HŸ¨ÄAïÛj¢’©¥eS>Ï'š?^K5í'ß×/;SÐö‡é?ãô“‡ðžr~£òŽÂ0!Á¹<ɼùínMäýá²ÀÅBdäÇÓ׿/ïýðùŸYÐàä@]Ùj27R˜ˆwÅ1e·wX*õ I_Ãþkyø>ôQ™îÔ‡åÜÞ`gHtÓ2Ói&’I!C"8ü(ÂJL1Œ§\L(Šª2: *´ü@ÉÀØøŸ™&sŠhÞŒ¯rO¦?™61¯ð*ltf97 [†aì5AUE?ªZžP‚ÂØOü³C !I;h¨`B˜R†” º’шŸ…a4@c§}%î?ÇßíÁÆçÒCúZ<CðõO¿[¦Š®[1E[þ~5ĘâÑêüzo¨lh¤‡Ô¶¢Ë«=Cع‰ÒœõF Pñ‚›J¦ "*in“ínÝûþ¢¹ùο÷ ;Hd…ÿ­ÜzëÍãeÕü~óF'c¹:qÅÁ×cݽçh&vŸ¼³jN¾Ý¦ à~ÃrzA™Xjª:‡‚抢…j'ÁçŒÊÓ(¤š‹Qa ¸UÙ+ÿ’^wœW$j2Škÿ–ÖË)’ŠDçÕÓN1>?öI€Äð¨~„?"ùÌø5æÈR _Žû’êPfö·Y3 }æJÈg†Z^î߉óÉëžM„§{”NzÍâÌlü™kEœ±í²¦U˜ýçÿÙûµÆiˆ &?wì*Âuðx7–§À”"C!RkÃÈB¦ÐCA»Ìq,Úµ&¢ƒeü?i×:#×Ǽ¼wG¯ˆƒìÀÔ!,ó.ý.@¼ûÍÏÝÉëêt-ª¢,?SÛš†S„†2ž¼Œ8¨Èèi+ÆZ¯õŒ´ ², l'²R’‹¹!2’‘d°»„ÁeVMÊuEf²ÄH‘#×)i:<·QPpF]â ¸cNU5j½²ÄeBJtƒlr«Õhˆ™@ œãÙ?Q\c'¦‚‘´ª±‹ 'Hc!3F¤ë¹gccîwïY#¡Sa u“½6½¬ 1ERd DÉ™eA˜a“%YÌ®·¦Ãìc2­i²‹¼·iir‰Þ(•½D×Î<`˨„ú~éþ¹úëÓ€ZÜ;O%PíO@jóÁD$º®öo DÆïÔÐk¡ý’HC%Ñ(›$h.Cò6„„™‘M§¸n)|¹³bÄFÐCæ²ÏÚÔ5g¦Þ©óð3sÝ3ËQNAº*DlˆÌ»ÍV3%{ß®¦a®Ûf½ (í 3J £ËÔI„…¸¨( (±ª-rRO)‰³)ºTÖ+þ„«ÅE ¸Ê¢¤ªA`Œ©\”I2ajTCöäXývK¿Ç{¿~·}úü÷ÆzÕj°XŽ«!iuâŠB­ؽ¹¤œh…V×ý±ÖýÏw­ŽN N/¾ï}¾}hàÒR ÿ€bT“ý’m¯ð?÷Ä;?/ö?®Á€€ŸÚOi§ÓØ(žäí IþUüu_¬õ.ë!_Æ@›ty×GË™îC×àäüC‚x,ö±þÁAõ5ðåÿc«àØà6À—Pñ óÛe†äúôzÑö?.¹ N˜Cý–hÓ'q’Re… /fa-ýBS>”0–@d‡Ô`B£ i1cÅË«G[,nÿè²»•ÜçRàMõ’€Îÿ~g¦"3Ú@“‡Z›­ìÿ_í¹ò‡Á¹æC7Á0Òº®äþaþ±ïçŽ=ˆþ’θÇ|íò?33ûùëõ¯ís?dØýÜpáç÷Y9Ö§ú¯oBü9‡~©=$Ÿ7cöÊöšY~Ÿ-èïð~ðR¡B÷ü'I“ª89ù¬‰×Ïø}Žá¿Ÿ`úž &ø?.çíù~\~'§×åR޶??Cä;žÈNdšŸÂqøþØO®°>æÐ>Gë7¹Ë9Àõ=½=¡»få—*·6œ)ØãújµþH‰?Ñø¡Ríú% Ić&ŽyÜþíü¿.g\‡¬7îûH&1Sý.Jô+rQp‡É3=g¯_¾qSúíýÃßþ?ùö$öùÈ™Éþ¾ÔzÿBΰ =¿?)¹0‚ÀÂÀñUUIÙ“DÄDJä”~oúÙ*C3ž$£g么~¯ð¬‰Q„ŠR+ ?Óú¼þò?áò½»ßRwQ5ëþÿ} £ÔT±ÛÐZªü JÓ,.Š¥¨ Nq‚Ô¡š(¡({N|C·}ày¯ùçÝö$Àxâ‚ýÉà‚ÞŽ¤ÞwEˆ¤Œ–0ùIÞ©›M Œ&¡A©ñ3A”¦( Aˆ2Tº °<¥b–üþG%áý»Aýff޵/ðôNC_Ažú;Ì;H¥ÕT%*°) ˆCÀHTy¹Æ„„”DÉDÎB”g;ö9=ì¶B&xd$OOÝeiçLpQ€­Ëð'¿÷?…ÏÒÏH.ï"íwaÅqËiZgb8ÞabÎï3—dÌFŠåøÇ©@,k‹NœGþa»7:^D’Ý]™:LôõŒ`ÞߞϠ꥟õyk`ýÝ*"ÒÆ|G¿WÑ•|mØÿçƒ1ýèó¬ÎŒ‰CîËÿ¶ž7\Ìø 1"•n˜4€ø/ç5åÉiz?ÿ}Û <ú¦{~2°öC¤NÞž¼ú–CbÓ.»ÚšÆ'áÖÜôd|q£0)'g>mܾåÜœ£UÝy5¾;â¶?—ÿ¶gí܆LsÀþéJ6ÕL<'hõ'·““£&°ÑÀYÀAt5vÅÉx˜'ë+jü¿ØØNC!r_øñî/Kø§Jaq¿U2Îg%Yñ€…±aêyàJ%J3ô¨=lHh¯ý$‡©‚L[ŒT]$Á¢™`Û$,MЍ Ç Ä© j Ó,G)Ÿ˜]˜+ûwÎ$› à6¤s1A.S ÑÉQh=èÆ¦ÜyvàùH^}§Çßߌïݪ>kŽKÅ?ø”k9ª²¼5–o|æó?*€ª¢5ú›%µTö°ñ±¤ß`¯á±‚æ¿›)½èÿ®Ôw2l›P†!9IÍ”{Ô¥šJ9¢¢BÙÝÜìJ£ý»Ž!Â@È%-‹Þ®ÊåR_m¬šJMCÇmˆjÈrF•ò›$¾ÅWŒSãýO“é_}]Ë•Š!&´% K_êÓ½ª6Õ)´•ˆRÀ‚͆Œ2ƒ8ØãF2DÙ]Ó=šJ«º:`³fXb +‹…™ÇšâTú¥Q“ôý^1?a5;ö ÙBÒîÌU~Ñ:4DQÑÝ‹…ìg®(ćŸ‘} nÃl'I$ >å}+´ÜÞY§PŒÜÍŒý@z|¤ÝÆM޳ïS‰Ýwðl~iûv?×û þUï;½º±âŽ´™D2Ì/{·4QÑ$ÙÒ²¢¶ÅÈ­x< ëóèð7Ñ£º<c©,‡ðêX{{fÀ9žjÞåå•É‘ 3>(á™ åãzÏŒoºo«*•%Öç“7€§›M$¢ŒE‘H¤X±HÄ‘b! 6ª©þ$+^a£ñùÿ·pþ¡ñÿù,Éýϼý’v2SÓ¼×ä‚>Ç÷?ý,>æÏS|óû¶ rû›P`ÞÉþ•…Gò~9ëúüo7ûÃãEKsú¼C‡òû¤û~2(óÑëùÊt% ž>¤ýÞÊs©øs™´“ÏÒùËg‹zJÑ_Ïù~¯¿oÖZíûúŸ§ð!ôöptI'åþçðáùœ‡ýXðT!óœÿ/‡Øýa¸d!ç2?à>š”J*O#^4•ENü¹ ­ ö Ê›ÒI|¢Š©Uÿ¿wÖoÓuc*×þ%±†c²Û¾a¸CŽ%˜v•’– þ°(d+éˆjd>ßç¯IÆîØØÿI±Xþuþ„Ÿzà<²wïßÇ^ŒzðNr’¾ôêæ\¼YG Cù=wñûˆœM¿hØA©¥¥QøþÄÂzÔÝï髺 PSL?6ÑLNûT6 í}Ä- ³a›¤àb›3%AdµþuéX<6`ëìE_óà3°6b• ³õ¬¹î÷€ œÁØú™3¦@ýeQýkÔê}YýË2ï²CŸà~4æö…ûó‚ÔÂ~¹FOô„€T€"Cùÿó’e5“4ÿ€,)uø!wþ#ÿÿÿ ÿÿÿ¦$ƒëÙôh·#A â€<ú¬÷}ì»=%ÏfmÝÝÒÍè8>™ë+@ í׼íØ*€@ 4==Öû`¡´‡Ñ¦@ÌÔÖ;µï7=àݰ/@ @"€MáïoY"Ùu«F­«$Ûwݦ^^ô¥Pïl´rûÞḭ̂[¹‹˜=Ýïo]÷qò§ˆÖ²ª*”Dµ”TZÒ ¤ác m¥ ¡JJ>¾½ìÍwôA¡ô Q@MËæ<£_>÷|=è‚€èƒ@îÝP ûåÞûo^÷ow<øA*€@ôbW˜äp ݎ銑@Ѫ)\v‚…¨*mŠU³A…  ª1:ëF¤—Ò´)T{ÒÎ])o{ÐöQ@‡°ÁÆVívØÔµª(Ô¬ØPíu»¸¶Ö Ýn'¼Ý.´-^ÇAFqÅPŠ¥Îâ‚W±æ÷¸ïr¾÷vÀ ¶Ûjûn'Fu¦µ‰>Ìè¶¶b½Ìr—¢ƒÞX’Ömo1Ò i‰BöVG£lH¶“R±V;†w]ÀklÛKFië;ÓK½yhz¢çzuOw¶s¶ )íÓ‡¦²hBõ›hB•Öz2‚€ãÕç=¬SÎãÍíÜmª4½Ê8#ÐôrÐC¬*õ¡U@ŠÛ]7C,Á£ÓNØ £A¶¦ÚÛo[@èÞoKÞö÷”›»‡ns=g;œ¶§fí…)E6Éì• ¦Ù놼«;ËzðÖÛÞÙÙÞ1РÙè¥:zê¤@sØÍ-Ôõׄ÷pu¤¡ééèè 6É*Ž (hÌc  ²QP$¶ÐÐ ¥‚•ëI§ZÀí®Í¥‚¤µ¶Ý@è‰Öƒ¾¾FÌR²@38$@j‘ªíÜnÐgY.³q÷Žö’Š¥æÝ´Öˆ¢QC5u×h Âç75U†4[¸ÝcAF²J€®ÍÐÑE=4{1^¶™6åí¼†}8…zr7·5ŽGHðËvËf­±­ÐÝ˸›‡CÜô÷±‹F·uuj§{ºð´Å[ßw”îçv÷ 4 Æ´BRlÉcP\UJm…o»žÙìwOnsM—ºjjæè7`=Û­†(Ìki÷}ç»BëQtû}ÙÝyÔö ;œä·}ïzojÑ(ëKQ´À}ÕØzr*«³FÆE —7»»7„ƒLp zoTîîªf”6i²ª-©mlMª*ѨÛÙ :Î(%­òÞGޕϦö>”êú}óìÝ»v_olÜïo¶ûO›;w×<½^ÆíÝî×ÑšDW݈Úå›Yr…hîÜsµ ìÞ{¬ëNÛ¶©RæƒJw¶ÙSs”öËfìh›ïz^½^š>ƒ¶>=mój °®€Ð6ƨQ• SB„F‚dSeG¤Óm@hÃL’TB‘“M ©¦L"¤šA›S@ 4‰ˆAL†¤ôÊ"H@ƒ@!4)ˆ#ГÓJ~£ÈM£FF ‰@‰¢&¨õ=  qyr­å­ ‚â#×­d†S¿‹ÛKZŠQzа•]­BüæƒL™!]3H,¬Hw§£b†<¹”½5ÉÆÁEô nÀµÿáTTC ?ðÀF"ÔY$’I$’P#ÕTTB" ¡dn*‹"¨ŠŠÈ Š H€€H(„‰" ¬‚¬‚ ¤€¤‚(ȉ © ¢H"ˆH€²ÈŠªDD d $VE$@d@dQÑDEÛ*¿€~ã÷þ?ŸáûÃû8QÓy{×êãíÒÿ´MyIb2Üx9C•Ž=ni°~ù ~vS[}k/œÌ}s_ÞVÓ,à½X~éÜŸžŠGí/:jÞÏh€aŠ@‰Ê2ãZ$`£QU´üó¬ TL@§ë⾊¶|öˆ?ßDEùÅA¶ÈìÀ}£GüµüÉODgiÚü F A‘#DR$ ”Ä‚¤ƒÝ¢‚Gëã¯å¦NC”j!T™,›ÅÚLRëíÃiŸÓT(\HAî‚”Ö‰e‰ ™"o_ß/Y‰”Cm&1p’Ñ}¶vË)€këKkS#ñµì1Aþ¢[ ×Ô4ñ?F9çß½þ¶óü{ß~þ½¹åo<<ÑÌHûÊ TÆ$`²fˆ_§1h¨|ÿZ^`&@Ÿñ´‡áF¤²èLŠ‹Q=gJ8Û=çšý|¼óí‘æ¯¤¾àñÞ¨‘Ií1Êb„Ê•¢k×R‹Á/*b ªd<ö¡BÝøßKô豞Ð(ŒH QÞk¤^ëRà€•£ô9í7®úä… TdØE F¸  $>vûýïO©·s»ŒÍ¶É¸Gþ³Sö?ž_s{<}øå_“?“ìÖòßÖñï,}>×%‘¤YXîÝ¢×Á^˜IûŸöX»ö®®sâáÊI˜a¤*ª™?ÞÚœ yâž/íïx— qŒ"ÛnÙ}á%¶†èa€½½}~¢ÇV릻žÿ™ß‹·ÓÛȆi=ëÜú(üIø^Ú~‡ç2ÜîXWvºûóåS›oä§>Ðöø#pù£©tkâøÍg=ëDÔÁrŭű£[Í>Ù5µ¡Õ]¦m‰N„:>Qe3«vº + -¢i„0d¦þú)ùßA–Ý8AQ…é'kN¨køö‡èÊ#^!˜øRñX»¹¡ ]!o1ÈbY~ˆ ÁÂ÷$(–¤$ ABU¸êлbra¸ÁÉÖˬ„ö çUËÁs½Ü¦×ñšÆrÆ@ÉýAx1Ì%Ù°,5ÅI‹»®¡4Ti/Y«ù¶_ŒÎs´VL$ÎftŽçûhvÊ|(Os˜ H0nd,+bËr©Ã¢r¼é07w½&3¥h ±A‘”0ívÇ6¾µøŽ}Šç>$*¨|(Lƒ™xxÜ“SÚT§ ˆíWÝæGñN­Æ}(* }aC7£4dˆ¥äü5lL(ÄB†9YÔAµz!ÚQ]››Øv³wE™ƒ4­C¤Šf“á ~ÉÎ"~lÉ͆ÙDO—ƒ‰ßX9´·|Üœå…Vâ+J)ó_ƘuoObL ¶ ƒJÀ"öSIëN%!™l ~þ­ôù›ÎªûîÙeAÔm—(œFá ÏnKÅý$Åøa"xFN{¶_÷0ýuZ•˜‰Ò·üqtÍÕþƒó—yÒÄÆŠþ:è2U…f ?¥¾Š‘l½ ñœ6íÝȘ âДzª Å­F¶žk,,"÷p^…ÔR¿“(áÓlëSfKj“Xîó. f˧¼6wÕ–{‘ -\37Òk½Ùù˜–B°ìæÉŒ\º.8X¤°Å¯P?²€p‘ éËÒ§2Ü«¼¼YíbŠTí=^ÈójÇ ¤è5‰ÓÅËáRtõ|RT¡Qr«›öÇl`YófcTÇãôý ýÛ&ô¬Ž}yq£õt¤Æ¡«aêìáÈ#2%åëA ]ë1#ı/X˜ëãÃþO ¿‰ˆ÷™ñT*5ÏæŸo¾m'ÇlG ^íÝ_ëôxñïóñ^åU7Âi„ì€}BÜP6þøµÐ´1v>ucFi³ØÄ«bæ\#øŠÐCo#j n³õ'Ÿ_ÂyÖŸª3Þiþ©Þµü%T\£þm½ ¸¿eÏÜýh^«M~«6.[Kû{B®Óºgw Ú¤VвDÈDGghP„)g^Fþ÷0Ô_o›Ÿ ^˜ýÐññÉæÈƒ¯,ÜŠ0óI ãÝ‹þý~ù¾žy]¼÷ÜX}Àîo(—íhovûåbcÝßåã^VYÎ…FÎ[¬R»QÏž’M?ä¤FF?Å”P`‰‚ª1EPQ Š EýRŠ"ª‘Š(¨"°Gû¥T‚1AQÿÆ–"( ±`²,‚‚¢*‘T€²!ÝU‚ ŒX~šŠ±D`ª‚«EI$","Æ*1EX²"F$ˆ ЬA@X‘DPDPdD*£b+,ƒQ~­NÒ¤*À`‚D‘aT`ŒŸïµXŒ`+–U„ˆ(¢±$b* ŒX¬AY +*‰"‹`ª#**(¤URAUPH«DcDU`±Q‘XÅPET0X¬XÅV0c NÿksùµkËÿÃìóÛ‚ZÜZÿ}¿ò³ý0¿ [ýWm¦>ÜÓÄ{ÊáX‚9»ºý>-E¥[*¿ñŒÈµf¯+½iÙ™¼`ÃöŠGç;ßw¥ÿ0Í^³·üÀxõJo·Ò™'²c®ÿ¼û>Š>m㥣Ì\|{Eþþw´ZcÒà rŸíôŸóéöØ8“âõ—ú‹ïS!/¼wñd}|½íí×·õH>Hñsïö2b%à¤Pcí¯|Ñ?·ÑÝ79ÑöÔN²Ìz;¹ù#â=í#£–?ãßy‡ü«ûgoß`ô Ì)”Á|Qšˆ !ØÚÑJv{Ãê#…׿õúüÒÁbDR~P² µ È!j(P …GòõÓ[Û?Ÿ¦ÿ>öéÏo8»õf¾»Ò‹?¿¼ïöc^Š(׳×UnËæ\'çë5£²?ÇÂ÷1¼Ùéý@âÃÑQ{QîøQ}ÎmJˆæ‡ú¢[}§§àQUNÚ±~«Þ¿W'¯×ÆöRà¶¼ùø¿¶–¬ óÞiG“ðã9gª²t:gó0ÓaBÛsó?~ÏO{š¢ûþ?{Ÿ^þpS¿-‡8î•üÊÜ•ø×ZrËÜütÁ›3ý]ŽVr«%ŽÙùDú@žÃøf™`|ŠîÝÄÄúsÒk¿½Ï_·í©9 5Ú4‘Ï׫ûdþ>þ1ÓÛ t‡ëÇôõC§èò@>}Œpß·G¯h®Ooï¼ÏÜWñó¾-ùÇÁîý…Þî£S¼°¨¾e¸Wµ|vŠ`f'B“$ÎRŸ×ñϾu ˆt2|T· dEÈhÄÞ¬Á³Ýî]‚ľÛµ±;ÙŸ?·¯Kso‘¹«6?þ¾ÅùU%Þ®¦•_ÍlÔóŒ}k„ÕToÆ¢š½f(‘"S‰1¡y¦*®[6›‰ŠBNR^é}9üI{áÄ? a ÝB˜ÞÙ< ~'úïíè¶0cÅ9ൗ‡î…‹|äíù}£o˜qÓäF™§øž>T­#2v™ÞíÉÛ­&βâò³~Îv”¹s‡~Pc²/ž£ WÅí½A¯ÕYþ™dÐ?¯rú´+zé¹ù÷Ï_œþ¼s=‡(9À¼ï©xÕeÑæ™xÇcå^î„÷í®Yf~ ã68­^?ŸŽ1ΠϹ×â¿£‘&· úŽœÌ‡Ê”JŠR~‡ªö}uü~ØøÁ±|vc’ˆžÄ·§;çßâßYúfd¬û(µòÿ 6ö~´Køcðóâ(&ú šíBRþñõÍëO„ê^eVµlÛUaÚ‚hLC?¿Ûûööú}9I3ÝnÏ}PÚÞrÔ¯¿U¿¥L}™þ;Ú¿ZWN~q>ösßÂc•ðE½¯Ú¤cçUŸvJé­ +[çÛǬ³qìîÌÇåàfÞô ߨ§Í,ï_=ÿ¸…Ø÷×äú¸Së®On‹ÇóÖüV"3¼ÉJ=q>ö2'¶¯Ï./ÃiÐY¹¢oT’»_u§¬Ü–§ØÖÔøx/uØá©ná+sÌ$%–5ù=ìQºÔ™·=Šôîs–b”joÂ<kìf‘͸æ½sòþ¹ñ͸·„ /Ô‡kî³wäf騱0çm׊°­×ÅèÔÃ][76æì§m¿¸§–s¦ Îé! ÏrbÝj+XCN°pÙ8Ëïñ-û»å¨ÚÿS_Ñî ªè»Î_oåA;Æ¥ t9ÅõjaE7§âãóÍH$bãŒåÄÊ•µðbؤcZ«B_6ÜL ýŒŽÈ_On{ì=væ× ÁPè@$ÂW0e½Pw¸âïñ Dr&hø×gÓF¶zJÏB¨öWú;½ F))vÿ¬A. ƒí¸4¼¡{—5{~ÈFe]2ø1SrР\LÀ]d]t¾3Ú‡o»Ž· 5“ku)N;IØÅ®W°(îm! é3 a`²?#&?ïRˆª© ‘a$‚óÏ•ÐëÔ;îòÏ"üx~$žð U‘’ÒŸÖßòÐ 5*ˆÅ:1Ó¸Ê>ÇQΤ¹œ£åÈ8¹¤Œ–w¬ÿ”Å×÷RÏÈrG¶/wÉÄ„E Å ŠY¯IþØáœ+ó»»÷Îùû»‹í䯤œ¬ƒÑ¬¿‡fÿ†œ/ÄÄ"Øw,kù¶æBLÖ.P6<íZܽìö‘<( Þ9‚j"©ÖV¬-ЯbÓjå(¥Ê?¼œR”.‘ü¼©½¡»¾+ÅŸŒŽ]‹*@æEN¢ –¼˜H÷‚céoPYÆ-RȪ¬;ÈJk¡¬‹;‰ BpéBƒ§”Bl+gãâHæ`fÉ—{q©_ïMm[§j¥ ÿÇÚ{ï?Çâž±ßÇí¸P¿wµîs̽`¤;{CüsÍd´»&"i —zºŠ9j~æÕY´sºÆ^ÛøºÆG¤· *éwœpå—câ\Æ:ç¨e ISâ«åTÓÙTôݼ,õ¿¡[‹'ÀZ^Œ°5Jfa›Çè€. )¨r¡´IæHÞûë9ÄqÊH+h# ¦pÊ#P´S”Ò)PB ?²*؉Ê(g8À¶ëöÖûûç«ë—_|y=>ÄÇÑ~Ó‚{iøf9î?dÌÍ®»„ùñ¿?£Oï{’A“ª´x– ûOoæ¿Xíj”=ÑŽmæoYè²P·gE«Ú” ‚Ý[_º»Ûû×Ü)‰qVSÞ¯ð†ìZjÃ`M8¤àÍÁk63ü±¿ð?à õÍÉE¿ï«Wª`ê–|ç«v?ûž::“ÂWÑC/NåÃÖžtdoý1«šZŒ¾t:äuÉ4Ž“‰×…Â<î2×;vÜdHL™%O”ÕFgHkÌzOžØëÃ\Òn¯ÝºâŸÒvB‹üEænìåRâç@ô«~¿L°*}8¼H¿n뱘šÕifq Q™öÇOolâZÊ-ñÛÉŽ‘ýðk=¸üAۼǶ¸$£ ?šø*ûüÿ< G䩵ëGÄäë?kÂ>ÞŸñÉìÇ÷O»‘!ÚQ?!^<{βf$t•Êcý&=Ùˆú,¿9¦JE_œWÂÍâïð_Yð!E‘ŒU†ûË+¿’Ñ^øÐðB-üG¦ÌZô=~7l[q›SM×À}}¸×;³æíï {Éýû%iבwögüC÷˜÷wd‡Yó ã¢çùë>üÛtO§E<Õ+‚ÉÛ¨jôÿÄñéÿ͈Ì:_‘±4§lHƦôG‰g–øzÁW¹¬_—<Ÿç ÕÝëøC).Õ/µl]lôç½;ÃÙÔæ3[5•Ð}Azû0ÙU0lßBÁô¶}àÅ~ÇêÜ•ûmÜÓ1Á^ùÌûunr—YŒ ø÷ ©ßµ-æž<Ð¤Š¶­þÊ;)eo×3Êb8¢þrPÃ2+¿ß‰ÿÜÌÝëþôæEpÑqô1®‘ ów#7|}ùoŸo7Ö¹Õ Qá•jé¾çÛ®LX÷!½»ÁðV²ßcYþ×ã£~ïtÞÓ ÷‡­9©ÌµŸs{ÐÀËku1†Y;<Ŷ¬†² FÎ%}ƒÏ¼uØÞ†NÞ=??ÿ9ï àsëØ?KÛ?£šûS5zQ B þNO¿<ðo‡’ýôiû÷}”L;Ž©ã·×4ý£èAîÔÅ»}2Œž}?!“ÉÙ”¡\;âwð›Ï¨ý[A»ûºZìRÇÂ]ž=«!Ýu}|þp}ÓÜÃ#í$ëïïHçµîC¹w¦•Jf&h™äyŸÉ¸B 3©ð÷®i0k¶õäHù*‡q'Ÿó×Ý5>?ϵ?Xjͽù6äþßä?‰í{ÔOaÊDò2¼CĦŽä¼Âõž¦ íá6åø¹pPÛvŒ-E*öTýÄ.»R®»>úíhâYx}twý¢ªxwIud6–â|Gu‘m9[½f3lÒn®ÝÇg¤åäCX Öä§ÏóK€è$¨Ð (qƒ8.È!–"KToñ¯ˆÔÕÏÔ Â6™CV£oÏÚ4äô 8 \üA"‚YJÖfàÀ B?©E¤© üvW‰Å|£w´ €ïföõ÷°^Ïu áÃáxBTI}9ÐŽç¶æ«±²¦BÇP)”Mš  ©\1þLÖþ©j·’÷ÿ$Þ—/˜wS®±tjj^†lê-xˆƒ¥b5‹´zͳzýpò‰Þܾ´$ŸÅL5Œ?ó;vÒkâæÂÞ¾üwÂw€¼ŒnÖ·Ñ0ü´À<Ñ ³¦§à{Æîr¢f\!,YàE23Æ-Üœ(XÿyNÇ Ð¾l v Æ–!lÚd=è!U‰µhTª­*Vƒ½7{ÝNßÛó‘ÿ¥þ-P§Ø~5lé/×ã$WO¿ßfÏëù­_ûô$õN£ú}ÑÏâ?9óïÈÍüO°Ä?ãür8÷oÝ(ŒÎ%…,VFåÉ—}ô§O["z†ŒQ¨(rˆgÃlVY"+}:lø¹P*!~ï6$BjÁÿނ՝l=êN!Vf£Ê,;ÕÅcSJ}â‚‚Çùñ@ëßÛ ~?· HÈ<é„oùqÿ7£ŽÔ¬ÿvs%uéÑqÑñ˜úNþ&<…˜ GO/­|†—BÂPŸèýÈöDª?0,ÐàÁbH_ÅEi0]½]_ú«¯Œ>žcZFŒÚB8£mÌÅ I½¬Öm+CÞ“Œoß½: Ø_¿¾þ§S÷ge[Dsü?ñqy7÷ü{‡ˆhð¿8ót9Óü>+oáùÂñeäNüûglÍ_*‡‡}zipïÚ¦ºr‹T:ñôsÛçìeŽÊ HÈD´ax ÿ2ìÌÚÏž4ÀÌIãÛ†ï‚üI¨fÐ÷¾S·´÷¿3ÁÇ9zÄ™ ‰¿<ÎI%kP25mèæ°Ÿóùù>/¶9s”eq:f6éù‹5hïËÕL|oÜïü{HÃ1nþ_òRìé""Õ{EaÝW¹R¼êÞxyµ R,°}¡üG8â•Û[šÓ SÍÑ1\?òß`¯_?jÇE¹*­¼û.{ž8øø—«ðåTÛÝW«1)5}]Y©Šçb¥UפÌ6¹hz ØæÖáø6ÿLÂùã°"šw_'ÕÎQ+“½ô­áÜ%Mc=ûø¼þ½âü>’~†î¹Ä¬ÿ\_«GÛÁðí ËH<Ò›>7ŒGfpf d4ÁúqÎ4W‹>É*&o­#éöÐÿEQQ P#°#àð}ŽÇÁÐÈñi|«<±}¦*e]ò/ž™j'ûÿåÿÙTÿŸQxˆ óç¹~|9Ÿç&ŸïL$´£ö±ÑË^q…šËûïÃW3 *k47b¶¥¤‚z'²[°ÝŒGó3‡hé²¹§¡„ÅcžÒ*Ñ७زzfêò©«1¾…‚{&h$Ï^à›TñÉUËozî¯/;³›¾Lrá9=:ËOž1Wϯf姪 â²·o°ÊâµS»íë-a‰«£wJèM÷kKÚCƒŒË`óbù ã‚^æ=KbÖ(XÔö;í\‘@ð¡"úÔÁäß^îMérÚ6GvÞÍ®ÅÚ^ ¾gA¥Ìrç†öq¦ë¶öhmM^îck4ÈÒï7a°]±V7 ñÃsµ+vÎúFÛ*ö˜Õ–%áu{²YľÝÜnö…t3*DÑš—n¦nÍOÑ}B·XɪiU,íslÞ%˜´ôÞ¬5RøîîÈ]9S¥÷î±îíAí<òQìçg©ƒ–g)…msGs7G¯[æê;"ªú¸*жfúrºFí[¢Šß9æéfv×)*·:¦úYmÊ̼ڛ¶ÔÜ:ºYÚ)ŽíáifäéTõ,Õ5Úé<c›’úÆëší»ndn Њy:´Õ¹*ç:øîݱzó‡atíu3ا/ggª¶× Õ×M>¶Îks²æñæ pÊJö³_š×5³&«·u­ªÝêÞ·Ó=—£Fdæ®ëaWJªÌÀàƒXîN<«iB;nµÉÔâÇ«²[}ŽÎÒkµ"rÍŽºJw“«Á—[34µ÷NOi'zeœy\WeeREäÒOèÉqÚ°Ë/:²Oû¥Î„I†Ô]ƒ[2Ižî­'­"+.®tçdíVNPªÍëf÷ˆá¦˜;œò…Û="êø¥5}…rw3w•{R¶wœò´­TÉs’ûWYÁ´±¡×•4 Øe;žÎ9#°äíݼt-mTlîL.I=®|;«KÁŠoJdbZF`á¼.Òî·Ïnê‡9™«ÃxõÝ6¯–n)ÛsuÖg¦Ó.–ÖËo‡]Ðé»’ïk—M®jÍåuÞ24ækW'²†tæÑ®U›’ Õ»]5xèóx·.dwp#ž‘º¦ìºhë¼ÞVUô÷j”lîtiÌ–IKÃ7jÏ Ë­ëÝbV¢æÕÖ*ÕC_U¹ë43W]W\I§@‘[ ­«žÍÁk³+2ò2øMd¶g3.gTfìš{ÓÜn²òr®Äà›Z[bê¸V^ M,7z’.zèk”Ì6.û;vïf³»*¦§x¼êìÄîÅpôzì×QË7qÈÐŽá¥RÁíëe+·ÇGIÓy’¤–sCÞ5™ÍºHõêš’(çeìª[–‡)®UÓí¾5MRÞU§\Ýî³Õ¬¥§o¦ëÝš|цcJõÝÍÉå¾@µ'Á7‡3!¶&6ö.¶‘ºÎNEô¾Ú~{ƒ7}¹jשÜ;«ì½ê¦UΛ¦‡XÙ»ÝDP±Ûšzf÷ =ÛS|çstîÏ=Dx“ÃVïUâœÎ¾rö¬]ï`6KÜÙ™}®jDÓžËͺkq5ëÇÓkÜí ç,Š>ðGs5õeÊÙäÌ9qÛ<Þa#ˆ¤4_lõÜ›™¾£¨qsšlnã3u)ÆNòðåñ<ò51!*|Ú*Š‚Åd;aÄ…N˜¦©ßt ¨œEEDâ¤%‘LÀˆ †Ø«Ã.b<Äâhœ@á€jut˜ ¡;ˆ/gTŠRJÍêÌdR¤5Ĝް8jX¤51‘5ü¤&|¤éb¶v€q­Ð'0SS¨bq!` Fó|D+$šÂ`’c%g¨t†€õ:EVE’ûIÛ„ÖxÈ Œ’^X‡iPׯ! O'tŸ’§lÆMñò¹¤˜'I‰âC¤âV™C±†ÄÓhLàY”8æÓ±†µÄ>wO‡¶CͰš×¡“‰ÆvÉX*e¸ÊÃݲ@;ÄœˆlãÚÄ8ÊÎéP:½ÉTÈŸ+>!] ˜ï´‹ !êzöÂ|@èa©^Ó=P€¡R{Õ5óh,+ HB«S™aÒ¤í‡D:)yIçW¶C‰1¢ÍqXMdv¤7–q aÚ‡½Ù‰ðê©ÖPß=˜B¼C‰Ç¤«½íIÛ!Ó=N²XzØÉì@×Ô†1dšÎ“•ø ×ÖJ®Hq&¤šÃXV(V¤í8‡Iªž| fR³Œ¡YDWÖ„™íø3á´|9’cÕ²¤…å!ñ±"šëÄ5 :C{lÜ÷­ ÛXÆtyd4Ûk aë$R,"r“›CRxÂÂrÙ¶LIÚI5'i*¡8˜"Æ!Y öîYë î…CÖ kzïøñ†"rËË1/tß) š(ÀÖŒ$ìNs¼»CÒFCS6ÉF¡âɨ@”*¯vE!‰ Ä’´`xDâuå> !Q@õíâ2­x q3¶tøÀâzÂxñ“ÔR§ ϰøÂy5ãt‡¨¸âO5ñØ$í!¨§¿,ã @±!¬à¨¿cã>°:ë~l¾÷ÆjN bCÅÊNØpkë!;ì3c’qQ¸âÒàhŠ›ŽŠ»ÍV¦ s0T8‰¨ˆuIÔJ€\Jja“³Ë+¹x«XD]K‡Mdv{PDzƒwÁ.’¦q£æÛúB@²ØŸð)¿´7ú÷ÿeîî+Ágú)þ£þUÉqöi(f!3$º/.oUŸ÷¡ SA/ý_ðfÅ0´_oNZ\”öxÓ®Ûš>#“ñc)Œ£ò¶ŒÑø@â"»Mv¼•üªZ:¹U³dOÖŸöd¦8k© ›”é8¶ç08äX¢+Õâp!©Ù¬i¹~–!Šaÿà§Q¤Q™–“€à¸uWWï_|ä{‰ñ•Õ™¡VÄõÁG,¼ ïvâù®³žÚT<%WjÕÅG”ØM”Á}ÐûÝ Xº³´ò—לs'©?£¢$é©;ÌÅþÔÔàž‰îÞ¯9 éᯠ6ŠS*SzG„ÔE8©„1´±¾äØk ˜ *®Â*7BóDÉcNÙ¨ôMT·sö»øù b¶{O×·S»ó«6 «}ûLó®"©*+pí¥­Ú B”Æ.ã6 §,¢ŽOýlÔJ²Ï~)Õ‚¦ž "™Íª;Cˆ8Tîå„YE¶žËÅ5~ó1® «C¸]0ÂA´Åù²Ò ¢Ì¡g|@ôvk ŒêÒE¢T,(TšÄqËÚOQ؉CB*°žªžˆUÅû†¿vŸpÜœV£ÜN„¯¯«ÄÄ8Å?^Xq<ìß4D̳£Ìë z‡ wÈïÙÉÓÚ”ÛöVZJö†j"R„xÛÅœíÃÊfk.PêúŠ)8ZQš“ŽSô<‰ùú§I‰ö›”SÕN“z§Â"žÞÝUÐE|?ˆáß4ü¼ {˜‚„íé‡ÿjt¬ûôµ1+‰1éàÆt@€ººðìg0XJCüdê›»kQ¯Ûo'‘'LQQQ_Õ±E>\´fhL '¾÷›TuVL—)²^ºý×øw;Æ0að8{ûT$Áp­:²!—áÎ$uÀO ðáß¹v¸™«ÓáTE rtg#“— G *éðq]8Q5¥Ê&JUŸ‰jŽDÕ‘¥)š ðÕš‹ ŸHê— Qà ûm=Bˆ;O°>ÅCðÔ½oZ¦|OO›ÃMUÀ†,‹¦Â¢<÷xM<»ÔqÓmp‡O‰ÅO±‡Û–ú‡Ó–©™/ÓŒí¯£c¿×RU°‚J±.EZ#:¨3@²…®èÚ*Èfïk¨ ˆÊlJ^·^«x¼ }¥\)ª?´ƒ¨Î‘—ý™U³N©„®¤ýóïÚ.Yex^Ownc‹ºij°ïÂIó0d$Yü$Ž_Ù:îøþñ *ÃÐï2xìé=|ašÛ7çÖO{Ë1~S{mǰ¬¦ÃŽšŠS;¾W(ª7áí›Ò3Aº§ˆk)[M᪬ŠöŽg(å¦!"/Åúgáõ_¤ïÉC‡TA:åÖCÏ0ÄY‰và}f¨9E©Úxœ{çmxêˆu¼f#ëbø‡M’)´6F/åЄ2—ÊŒÒuÁéÌÒ©tH®ú_DÜœ½ÜU}ÕÀ¹CÖú u×00±¶‚ÏÎ?„þ^!˜@È@쇾iŒ5¿gzªšõÆu$I°-Ʊœ×:Æ 4®SÄõhõÝÑqŠR”Ýõm@a„ϤìS—'Z+æy^¶ˆñ—_c’UO; ýþP÷7A(± TÀùAd$m3#(57í!å6[nÅÜÃ&·´G¨‡×~g•J9ÄÔwI–ÖQ¤j=aÚ#‰ˆ;ÆÕ×n˜x™ÐmNC“2Ø; åß„ÌUåÔùæ^ë®]šì-&X ‘úÒ(ØáÒ…qYûêZýbÕÒì0‘˜r‰YË ²j¢V¬ž©¼w¿¢1Y©µ½[¦ok¿·sCQGwŒ˜h*‚¶p£¸q£“Ý"é’)Š¡¶´ö¡_Tí%yÞÿm´ý×ÛŒþÿ'»Ó×Ê^ÙîS?côçäબTQ"Ì¡Ä,ð» 8HjÌ V`Ê=Ók ×"DBP1«ÿ~[õέênf&HHäóë?¹x»ÆL* ‚‚^éÐ/ù„äHJ•bF*9‚ý«¤H8‚Ж†yA‘}yP-ÄhR*¤¢i%ì £k;(9°‘„ÑÁbÊê Övp€!x(i1­”D°*ACHƒa 4¤à†7(æQ;,æOÄ@=@ Û„(¨+œIƒPZ±DØ„zЦH¨Áqw´ð  C”(–#G˜À¸)&â£)W†Ñ“ݰ,Ùg6 5™­Ø l(SX…ÔPÚí8Ф ì@í ¢Ô`ȃ:Ú¹"‹˜€Ã"È€RÔDú€Ø€h+ —GŽÃwD2-!ÍwÁÚ´òâ p¤mF @XŠZ-D Bâû EMñg˜ú°`šGÊ£xVI˜ )m’ÖWb§®jš°ýÁÏ*æI–å7Íž¼÷C¨HƒõÁ&¡…ÿ@°ÕÊÛQ–Z@ðµBPöÆà¦ ÔLY‰$x.. z|(¯ÖŽX b‹„Œ¢°}'ÔO=$§ºk!†ÐSöüó\…†¤Rù÷ $! „ lÊê–vú#¼¶Kmø›rúJqÄïyp<† ¼ýŒ #×ߣݚ±¯:Ã/ßSpLÙŸ8)°ÓU¬Þj®ŽùNcŠaÂYÓ\zA,ÆNÕ ¬}–·ÁH)cœ¸uH&9r­0gµ!W,Ö4.Œ£…ú˜‰½êù…¤`b~FÞ°l/ú[ÕžÚò5Æ\‹×áâw èÀu4±Ü%Mnç9¸Q¶ªª:æ¹$ªÊHï‡éhE–HgÍž"º®@,vè5XAhS@£ÙcõˆE޼tãâQ뢊s%À˜FÑPõôæðLŸ0$[ÚšÁ¡Ûb®ÀØž†× níµi‘ãÌŃ:( ¤B]Þ†]ŠîÙ´eÍ(ºC؄ˊ@ü™|…Æ*‰³ ãµA.·ÜSy0h]=[žÞ˰¥ߺ&«3߇ÞÕëù?9ÚÐqWàÛ(*æÁ²…‹L"5· ™|U‡Åæs ƒ‚ Æ8ä¡r£ø¹ºYª9‘Û4»AKf– Zôž~|õÁ»ÿe‚ÆÎpU¸zêã#ÆÿÎŒ°øöºù£À„,À+ü8¨ÓÄÿ²§~ÑhkH¬*?”-Ö—êÿá~‰ƒÕ¹7þÁŒ¿ãš5æ,T´7ËnVDÌðB~¼èëœZ~ýµ_&6®î CA÷ÖKÚÚÀ«Ç5µm£Š²¡NG³±DÌÕΖ.žî™üðÙúsάúg{ìŽÒKŘCD"£•1´ûúgti¯>lh6`Á^Äì<¥õ–¬ÅÈqÓq‘î–6<^J7Ÿ0cu¬¹O©w@¾qd¯/­ú7|«Á\mó]ã-¸Sš@Ù9ü˜+Á%qƒ4qí–f¾Ç½¼Ñ®Ÿ&sA3eƒ{a˜µNJV áfv9Ö÷(퀒o†¡hÙ7£–£-€°Afêl׫3z–%Š[ͳ̼ur«‚éP¶äD! ¥!–•Så ÆU~hР`@Mk9/Ù€dÔΕg ‰ÞݕŻèÞª°ú òqêÖuÙ­Ö§´‡¾qЬÅI8Îr”•¼j5^"ŽÚF^J^Ø–ÎpÁ]Ñíb|v²UÀàûÑ©ÆÇ­£Ûš•Öfç|šÓ½Gàí"›0¾µD|s°²â¸PÙY"ûºv5UrÈB øÒb1–åUª¡íêýý£|½Yaû¿$aái8Ïc§Îy6]¤]LE,½mr@•äñ­m,ï-æg“ÀД¾4-ÕoÉÑ¢˜sòM™ðÅtŸ½ãå“´EæÂ&…#›©Á ´Ši í ¡PH!ÐÃywZXÐùQ~Mˆ'p9àƒËÝ =uN_CôiºÑЬæ¥+j7¸•‚e•N üÞБ!—üŸÿªËöß×ëúõýÿ¨¡þP™…)/k+-#m‹ƒü ÁA¡»‰¯LrÅò'tRÈšr¶Ãc,a(ߊ„Y¡ttSÞ(,²ˆdáFÕ¡’e éÀÑÞ›#hgË5ê­ÖK4²*ÍkA Æ²¡cSêY[õUŸd‘%@O!$B™Ód ˜CÓZ»Çn¬£d1¬^ Y$ƒ…©Înœ’˜·TZP³Âå‚ ñ|À³†Ñ ´™'MF¡*ä¨G_ 1¡#w¹Ýî÷´R-¦ \XºÏI¯JúÃ1“zlù›pͰæ–Mœ~mï…‹êv;iâ÷/É{ßd=LÎVï®káA}òe51ìœ MzóÛÙÍ6ãédlÕâÙÙQí^ÚšÊÖ°¦fmë »Þíï¼ë‰®½=¤i‘¶†æØÛA—D‰‘-R‘•]΀ÉZQƒ›6œ™42eKÓÉ›¦B#ˆ“c^hªÛÅ·„Ê…«NPª»“YÿÞÍ`Њz³ôÍÎB­­ioí‰.ë>2OÖ†gqœÚª«8Ãtƒ…÷)·•'Tæ^"¬lÆÚCJ¤¬Æ&2äDMu~4îèvÔØ<\×*gS¤–Ý«À›—«H…öÄ'ãzSå¨P…ñùå×U¿v’™Å&¡ÎûV{.Ô/6™”sn^ö“‚MÃÓëiêëÅëƒ,K6Á1Á™pÜpLbúT+k'Š/R¢°K3ã³6³Md½ÏX8Œ‡9-aºÙNãÉÌfÉQÛŽEhc:˜uÉ9¥«tÚÄ5]*³vQTE±AnTåƒÜÞ¿bÿ‰®xŒè'½4YªCžåé8³™J´Rg+e‡™#ÙÔ)BÙgZëz:Ï’Æz{(m]µL¼3Jêä&ä\L”ªS^—±‰èÌ(ãÇ=A‘!xÕ*L§ÒÊ«µ²¡Í®ÝÃz•q|Cšyj(\•Å™1vޤÚÍuS7¬<5u]ŽÙhÖUvq Ç4w ÝV3­q®ßH&û—;úÛŽûÑk¬j}’‰Q¡üúÞ¤äÃS„g~¼à'àÒj+Îë :ãsnöÿ5Šô;ŽBà³))£'¥ÙfºîJ«JWÒ4S -ëm37–R›ì”¤‚FÕ´ zÄØ°èmd]yeš+XBí–­ÓQ80ÿº„œâêFÃLÉãñ’ß=[ìÞ>IÞ\RG ØzªNšêU¶€G_=P‰ãƒY¼G!S åÚ.š©¥=[På™§­‡¦ó1;µ™*‘0jìÍÓ1;ÌÌ–®QX^ïbÔQC7x[ßm>;ç_úS®T$oNW HD4 !#oüÎû´ûõ^r­>pÓ´ÁÛÝÝ”:¨’;!íë¥Ü + +Mô衈JðAu½£¦w~Õ§XZF3Eº›FvEä£ ýsV£ª¼§O iEÆ7Û316c$ób5¶ÞDÏY’¿]íàÏ0h”WKRf‡bG±Vah›'jZ¶ÈdZ ´’H’ÚZKWìRÆ€ðùÕæÛâO¼‚½9—dÉèöVa}™a“¶%Ú¸K)ýÉÈ­4ø!„†™;O¶L…䑪¥MSˆfîNÏmf'ÏÍñøƒQ“H3Ç?imB,f®X¾þ½»½ÌWþ†¸yßǾ¤G=Ìß¾ä{¾uûÿgåü(xÙÆ9Ü^Z)jS—`·5¥ž¿ìöÍNáñÄrµnb,ç¾$9Swâ¯Îèkq6$›yŠi9xëE;[µ5²|Žb-­w·VÝkK= yU%ff·ÇíbšŸ*餡9†ƒ‡§•,h«¿³l˜tà|Y?ãݵË;À>`®,ÉtÝÖkû£WÐBœy†Çû<¶jè:פR,0jz;Èñ^{róÄuuØTŠ?dädŸHŽ’¦­˜±JMóoú²ÈíNy~¸LÁݘt\›‹|-Ûj´%96°†Úá¬<ÒØþV@ÈöÇà 6‹åù-^9`Nõ{-é¥Qð«:Œ=u‹ÅÏæ¼Ó¡­´Ô³šªZ-¸™šú³Ó¤Y(ˆƒƒ€M¬n³H´pUøÎgª3p˜À„„ôOëÝ•7‹KÉíbø¨&ûŽÂh³Ñ»xwŠ(ðCAZÔ§Îk¿ÀÁßÒ´ßPÝÒª6¨­¬E¥óš”‘Õ;YÊØŠFEŽÒsa סï׺¡˜ÚÙƒgÊ-‰™°¼]†p•E;Gn-mÙØQkÕÍR§)áÎKî ®mµx©N§u œ[&¾·¢P†gˆeÆo<ãœ=3ZÓ»–#;UWÖí‘B`É™q&êã1θ¥®N&¬6,ô…T—¿Z}³%Ø›»6löYŸÛøî³J´Aô@¹0)™ýi?Ò]òJEÖiãÅ,_u‡eÝ‚&‹ÔhÇ{á†,éÍ_cp ¢àÌ^·m+U´²ÝrÆHkI¼zϳ…L ‚,Üý˃ w—» þ³ôð¦÷ÁÝõ–ÑK²(”Y ¤ÄP¡Wu_~iD]…ÌY®^¦b<ÞŠ¼­áîª=v·©z«‹™À@WqýöAÄm±{þ¯AÜHWߥuÄmwùUÍþö;|4+!_1bRÓ „ì@ÂP†IŠîøä¡G›Û%k節3£šw§°ˆlàE{n<¹XtÖH$i!h!ÕýHÁ€…÷ò“Â]ü·ã„²JOl§º/w›õSnÇw[Î:³Ýô¸p»ó>iºUéb—èŠü㾞ž®5üg–zF8ê)¡Ð|/• åqW\ç„ìê(ˆzxTi¡¹Áh]Re~n·…Ú¤Pw)jR=ý˜5´PʈáÃ!þSöû*Œ*ÙP ?=$Ÿ_woE8%éœUCYWÝÌ´>-Ú§ª[Û\X¤Xô‹«’üªˆ¤Ò¯&•Ï1<Ö0Òê芸Rï„]“=´…ó,LºeÝvx!‡2Ê:~9+ÌéóŠE),Ù ÒJ2WñĘÃÀîx癨•oguݽ38Hï‹#}QùdT»’·{EXÂ19LÅgˆŠLR1%Ç¥à0…Û ñïaÐ褟:•HªküìûüyÎû)Лñ¼òq ŠPÀ‹’JPwOrU‰g6ómÐ¥·ĺI6ó·¢5Hß-?ZE~¾Ü‚†šhyÙ+µøöîHº~ÿ‰ Él•„+ÅÐé†^1ókF]gIÍñ–qêá»?Ù:ü ìšûIˆ;c>ÕhGª7Ôƒád8‹?¨ð&6äÔakJ§™ƒø>;ÁÄRÙ£}ãF Žú›ßŠ·÷î}¿äó™àûsòÝ>œ'•Ý ð ctW’¨ú35)Ïn¢ü§HÅßæ ÇÜ· ³žu%åè>;•>ÑÙ5g’Çz|XÊ»ÛÜ燢µûGe´9=¢•ÍcáÖ¨Ÿ”eu^·½U¼jÐ"É9—Ò<Þ‘Wb²þ¼n3q9÷ŠADÚ~"Ùy]¬Vd¯b,šK¬&?3KüSÛ?^Ó_ øtþ{:†ëç×o^ê½ËzÎåÛ¿XzÌ}nvÉbÛ^–¹­nQG—zÝêV¢Šþ&l;÷¡=þk–߬¾öŒNaR5…Íz£–¼vrŠªk~ÓÆ’½~Ðô¡ôÀæ”­÷Ž/cLMâkâkDô_ž=W+9‡×+c›TÓÕj“(˜Ëç{¦.Õ}{Ùϯ{tèêZ£n¯Ä©Né5¬ 7åƒôÛút÷ÒÆtBD¼+N3™ÍLJiÜUþîÕy|·wY+AŸ°= ž´ä-'\-‰”ë3 f9Â:¨ýâzÉ4Où *¢^#üoô@rÔ!iŒËÞ`;C_Ëä×÷„ë)R6ÇË¡4jX‘_ôaE –£1ùÍ9÷Ï×óüaÒA¬™'HŸ­{IO ?~…0Õ¼vÕª{[3“v·Âdaá=k½~ „뻌ÙUÞao«Ìˆ÷\CÕ]{sXò‹püj0—‰´Õ$ÈÂqÎñã/*Ôý.C`*!52P¢4JŸ`…c.è=§1'þGHiAÚ’e:îЂÁ_Ð6^ Ž´—àPŸËÍþaî»Q/î>0i k‘Sø¡e ¹H­ðs·â½ñ•{׌ý#´5ŒLyŸŽÖÔ›:Àgà¨ÌÓnñ7ÒjãóÍiDî-u<²'Êqmþün>°âÓYèbh]ögm+Î‰í©Žû¼2Û²ÚИ6ËÀ^õsüAP°'÷Ñ€Àˆ¿nŸ <ºXúó‡ÔÕ>`^½¿N—ÏÚzÑÉ»Œ10÷´R†m·J#îU©‘Ùê…¦øÊeýÂþû~S§µgëŸÔOžFg¿tOþ"Pÿãöõ?q¸ŒDŒþI•¿é.ˆOHô‹ÿL„ I H«"…áþ¡ËnÛÏÁÿ–“&%™héú¿óŒYæö¿ÎäÛ=™}%lijÊ®2¶”oûÏ'ÉDýq¼È'™óýØÒ„¨]ÿ[ L—« ÁS 1LË#duZåi1•" ÁÜ ŸõíÀ½^Ò|x&t–¾¢o¿ô„!ש(4¨š¿Ëÿƒ6ý݈۠MÅóD—Ø??Ÿù‡õöÕ¡oßi,@Ÿò ыӋ\ÄðW´Ågö,»KþAÇaAG]ë ÀaY©¹É‚ó»H ‘hÙ“îÝ‹®"“4MÒ`Ï‹ÑXÞÁ5°„£‘|E#š»*Ü+ÖðˆŒ½Ñ/X3:)ÔDQ 5•7xŠéÍfµšã’Žsÿ.îr¸xO­ 1ï`˜‘pUWÕÃWÞ‰¾CFK­°ØÇÖ&hmŽF/ˆ Cd ÕcJKÌ@3eDÜCª‘ÛŒB‹0f†¦¤d*S­2¨hl‘#’!fSÅ è¬DÍ‘ct%•ÍP@Òä`‘Æ @@Ë fØ` §¥1Ðs–`fpPëØâ²0jŒ½¡áÀCÔ§AÝ :3@ìêuégƒh¡É,pèföQ%c’Àsc¯vÄŠN…ÝfÉ\$FÝ)"z$ö$dXé/ v¯€³¦ +1«Cܘ„D•'g¹³Æ Á¡TÆÐ¾½C²)Jƒ¶1Cº7©r}Q„b _†ÅX⽘˜2€ ו¸¤¯A–d WÙB³(h4)¶:h‘5[dpe¤ÀAÇ#R›Ö,Tp®žé›‰ 3([ᶘá0ÎÎH,§s˜¶EÏmMp¨ ’D˜ÑF¦sƒe¹#A< »bÈBÔ4`tÙÑÊØp™¸‘`0±¢•u@77º"¨¶DŒÍ=È2.t× hâTeèp¡èyÙ@ÐUC¶_s"PȹÀ›`Uì –,·²0rgŽîÞ^Lg /QØVè½Vï„C¨©¤®9vº Àa\±Ú3š @r¤îV/båFfalEP™\H* QÕ2  À“c"›H8gr¢‡húÓ„ñ"û,M™îrsnf¡ÔÞÀ@ é.$A5L‰(hÀHç! H ™b‡*.£,Ü]@Ôçtèàë°àHîíè{ž±"B:vÂÉG2+W;"Þ!Õª=©Õ¥AÖ0O*‘3foVÉC% R‰ÂÏ ´9ÐõÊCOFaѳǖÆ/ˆœèÐ|Ã3¯@°.ªÖ¸êcIW=pª/[EÕ\p·­ãLÆ‹«Õ vÎy‘}»Ó=wѨ”…`Ñ|ŽqPÑÂK‡ÌÉ7/ ǧ)ßH:%˜Êue8c ݈lÏ5\vÖ\,.©xfÈz 訮Ð%N`;­×\8\á@Ôs*¦ˆ-u}˜¥&w;vsjw{yµÕœ»}[Jº¸PatŠˆrâ1NŠ-ÊÈlQ4 "´û2­Ê Ù»ú‘1C™&ì vžÂ§Æ˜ÝQiY‹,›,І±«B´P›Ž´¢°·¯6í»Yy: ¸jÄ…q, ¢H¸bÆ ¥¨H‡1ÌÓËše%»ÉÆÄj¸Î‚¨ z=¶ƒv1€4Öƒƒa™émwP"ztÙÑš±r&I"iФˆc†¨\ƒÚó]M¼¦w“vÛ¹=l%,…ÜÎä2ò9¾í‰®÷]xp$ ¹ª‘¸–\ÎNËêSÊ”]oVdípv'd[XøwvEá˲`)êÛ<[ݪ˛æt¼×jxNkÃ×¶?ƒ§Jgº1ŽlåÍzg"k°¥ddgƒwcêœÁU˜q¥™D›­É ÅåšÁ»Råè;Y(]¶œt®²ejW%Ü— ÷=XÝ®Ç)¦§ý«Ò0‘›áÝoH#}Ç Ø-N]dîV |XÔ/6rË—µ®-1’Ñn¬²2jÒ=€G®°‰˜àIÙÆêRºˆ*â7„W AÃ²Š€˜ÇÃA)³ŒX¬SƘDsYH#í[ˆÎ7·@Í‘ÛRdPÀHÕ‘w¹sjǫ̀Iz;‰K›Ç›ï,§½ž¼Auó<ÝBºì9¤‘]KŽÜO ÍJÞ\ï°ÃW{¡Ë¾ðK±A jÐKy±" u‚-Ý äŠ 9kk¨PѸ20Oª™tÆU©DàY‹6ˆvVlÓá:xNV÷F -K£ÕsB­9€„/DÜ”¶ôÕÔG‡#£æØÚU¥˜åQåT}ºÆe Z wŒ ‚ >“H íÀˆ!1¢nVŒs†¥ÈÑÅžµqW½t„ƒ¦VöN©[µ jYptók¯¶3Eô•M@LôjŒ<-öõl ¦ƒo/rònÆ|¨Óµw®ˆ˜§f±¹#MIÆE<’{u˜ºÀÄ‹"ß hàDÍ ˆ½ZÆy!jFaD@T–ÒEî…†„ÌÌÓÈz$p+wÕd1“ \”¨ °ÊXņg•CÊ ÃÙpN$-8‚x…lõØÌÿ‰Ä)¶€z\Øð^ áö™Ú#Ÿ»® ‹ªÐt`–¬ë‹Ìw›®`IŠì“­\qÚì´ìié6:Š”ò—F8EÆ"w¥Œ¼#¬Ì<€ä)h¡½.$Ž’@†Ne‚°|ô´0 ³µ3ÂÔ;¼‰u‡/ КÓÌ™‰’t Q(_(Bï€c`‚$Œ©ö‰ÄÐÊ:fYNªn¢[®cœŽJª½HRê¨ÂMm”'5È®UfÑÚÕ |¹#qµ2F1`èiS`P½ÈàÌm§œÃ«¾\»!åÊÖÛ(ãr©b¨H¢(Ò8ÙÊ ÎĶxnÌp‹+%“À]“yYÜZ×€.ÎÅq†[ÜZŒ•íÒCR|Å™*d§ ‰ÔdD1ƒÑ*Ãñê£Ý§e ‰¼ê¼¡#im'D Í â0æÍh¡‰íŠ2ûDù —Ø‚‘ tŠÃ b·»¶,Ü=…E¡%`ΰÀ«3I¡Öø-ƒÔ'd‘r†ÞŒ‰Ü;ÇÆ@c'b:@`f™£b—ÂÆ@sT”ŒÙ0P®Ñ0ZÊLXžz–TÌÝÎDF:«†Î»j‡±=z¤RžNí”L )ö ” a`Ü>H锡ibó›\ + Óªåຄ@ßø7 KÁÜØSræ2¶pT‚ƒ7rÅ窠 ‹¿÷`Úƒc×Q´VKçÉÕ Y©p—pdY¹”{x ¹Ð1’YbzL ‡u``Ú‚É4ÖøÎÍCÈtˆÛ84hRtÓ9q ±7ÛÂø”óÉx„ÓtUîë@£¬Nx0!ÈŸŸTX ïÔé=ù o§«ÑyœÃ£E›û~d¹¹"»@#'{` {ÑH }|ònð”(0pÞÈiè Ü,+Û€=[Ò<.yæh®ë½­Ùì1È Q™¬‘Û½X%CÊ PäéKHÐÕbu1;4 ]–éà‘–â I²€˜Õž>#;ÂËamÝ{@"Õâ‰kgÇzci ÐÑ·Ð$Už÷EšºAaÃΙT ŽÌNsºÃÝL #6ÜŠa;JpRwVo Q5ur ­O¢#xÍ)Œ¦¦ðªåï ÁÙB …àq9@÷QpÆó@öꬎrT蜽¡•[<Ñ ó{xÑ—š0Ks£1ö앜+3{Þ ”Èuœ M!“mk˜æ¤lw™¹¸y¾‘–¨zæ­`°„ œEãÌÆKP­mnMhÐîæUÀÏfeHªÞ“´Ü ¶î§(;cEŠ(1AKeÕ™!ŒFì ™¶Q]QqÏ@ ¶ tƒÞ ÜÓéŽÂ`)I¤·ØÅhîÎØ_åA“¡1Ýz ¦ë£[€/*ñÿcÿšK=4œ:Ë!†òbG¾ï4 ÌÊ8qä¹q¢¤-¼˜ª3žÉa£G;Ò©¼Ëô=:  D'h8e/ó'þºYd‡ƒ.¡7|Ÿ,’ ²þí’G-bËl­ü×pj)‘“«½+œË-%¦)Dj5·1•¬”$$OÇÑù¿‹bZAX6°çžoøµBÉ’ ³²J^ª‚ BîaiAwf¥X•»© ‰³Ø"¯RæÝùûñ5r‡ˆŸî‰ö#ý£ÿ¯«÷#!ük+ßÿê¹D ÿjtÒ*~¿“üšø{ÿÞ÷ÛÞsº>o‚¹Á’Îå‘ö/»ìQgkÿøiŸ !ÿÎ5pQ5ñ¿±¾:ÑŠ­n·Ë¡C±ò¾ƒÄNèàÔ,r5ጨ &€™ûý¥ÿÙ‚Èñ‹ýÀ¨Šÿ)ÿ"üçóþVá$ZµÏçkØ$ ¬Áj»ý(×ÿRTá½c@ݹš\:Íx͵LѲNm­Ë Òq WPØõsŒé0Lš3ÿ13¡Ès/·®îÍržÖ¦„@G/7)!a^r Ñœ™™8è@˜ËAA P¡.úÑÛ ƒ(Úˆeœ!É©Dkܬ©™;h ŠÌ Hà MuDd±0 x€ß.9åч´ ÍÜ$=öÎÒ_%4NsyçN^ËÖt©Fng{îž¡âDå¦4Ä]ëeOM L½lmòê[.o3¶à=>ЧL8»¡V¦Ñ=uÕÇTŠ©C%pˆƒy#„·«d, €3Îér¼Ê9µ*ˆž¦0öYÜÃl®^Ù™hÚÈ•¥„ec4eƒ'§ Ãèë¨t˜e´"0<“Qd1!B˜TÜ‘›/,ŒiV †bå•U P¡Wp»zñÄ …!ó0³1“t7z P½]H_|Î{wœË˜nD@5\Õº½l:„àâoqº­ÑqyÍêøaʉ"|BÎm ‚©°»)«D Á\f‚Ý]]ÖmÔY·Fyï©”êR§–ÁÞ“y¦0ÞR¾'ÛT©rS†W/BjÝb!yjÁÇ^¢`ιÌ1ùËßâÌ!3võK D%b¨\ÔÌ¢pP 1ÖKp·º YbE(U ha±¶ò‰ý@ã_ç4’2?=žì {Búu¹„á»®×› ºd®3MêâÃtÆS9uæÎ èçÞÀL¶Ý QêÉã®Ý8@ TšÆƒ›ý½\Bm鸈b2;zbúB„"ëf9pHÙEƒ=S."=»ÕñFu‹R³™“{“c,Iå8içPiƒ9 $‰(ü*f5äÃ1L%Zèå2 Ìõäí-ÐS„mŠß1‹»v¶®!eÈ Ø9¼¸ ímk•”x«¨Dë“¶‡be‘x S„ƒ6…ûØØÂ6ó˜EG ÂÍP×-ݷݵU×Ê©‹@{• S¼Œú•Tà›œ9l”åŠä.£»ZôÞU‘é·pÙìk\@·1¦ùtÈÐÁžT4FEÁʾ›v͆f\áõÛ¹R¦ÌÖàRGšínÃÌô XÂLÐ]sªIÓAP™Ê­¸!ƒäï¥ë®Ì›º©¶¸‹Õ¾x§’9·§‡#Fìq"uØí«ÂyÀÀ¹ñÊzZš¦jŸ…Ii%r'$š(­HNC#Æ]T’[‹ AP…hAȶ¡PC%–`Êc1Û`¦ÑP=.ÛÜ[YZÀ”öîËÝѯyûS¿{ ¾d'R¬Ê6·Š˜¡²5k͈"Óª€Ú¤ö`½mðæ¢®êv‰$TAà ¬¢Þ®Õ%oS a5D87IÔ•dU,sª„ö$½õQ3¼ŒæejzcE tÚ CÑ"ÄÙJoÆÁísm=f–­KÕ”*Œh‡Ff ™TúXcJÒ‚$•3l¼#z% µ˜¦°Åtª©DÐ[Èä–8²rÔ653çÚ•_«µ,¸ YÁ4šåÕ{³+¢ñu ̱{}Zóo”ŽŸ¾C'Ó“³eÀ`;˱ÌÅ¢0. EŠÙÎ7'uTï2Ïr…U—Z;‹FD©¬MÙmˆÀ‰ ð5tùJH"ÝB¤t€´0ìfÕ†šÛ¼»‡ÔÕ6ajªi…UC\N²Ö”ØŸhˆÑËklè´Š¹R%.)<«5x&õ "MÊ- Ë<‡Xfb­F‹$bN´ÖŸH v/TIÛs҃…žy­‹*•EŒ;ƒfɱÄ[e®@®®ðZZÍËsN–”‚bÌŽå4ÂB")!72zd>|]áR9Ŕ٫Ñ%Ç^‰S/rèd\à£3 dÂQ*(v(IˆàP*ày7Ø. Œl©›!æ€A¼8±ÃººÍ‡¯&d@@Y“.資€³ ‰.DxH÷†cF€ñ gˆœI¿ŸFаLâТ^6h°î†j½aŒb%©oü<¥·r1%½Š¬Å"øäÍèšÒ»²[M<ƒIoŒBâ¸)¦óí‰×r'u’ë鱪Òɱ#²ÍH%¶²D§A´ô4+{¸1(™ŠFµu³ž¶Ù °Ùͼé"·›5nñ"˜Ù’ I·ì)ú†QÑX¸¶£Úá)¼ÃˆÖ aát½b™CLïXö›èB»ÔÍ ªÓ "®öjìw®îÛ ÛL"lƒ¥LÆ(Û‰¤4¶[ ¢g4±†Þ=m+æ&$È"ðHã@JŽ•¹RÎȨœÄg­û#/Ù.‘ÊkD£FfI [Lòx3.Û®Ôúî³ÚÒc=ž<)YÂA»äyM¨Ì‘’=: k‘SAª| š×²t@!ãênö߇=5ÍEîn ‡H·Ž Mg­óGLO'*0ˆ•<¡wº•I;J<ÎîÎS{5]uÎHÍÌÅ ò)ôà–ŽÈš‡ `/"6£âÍ@šÑØp@ „&ËÀ‚µˆÄV*ŒEF(2? í<ì¦u²ÇKð*pIÜ"г¸ OÙ!ž´Xð¸oD¡@¢§*ÞX¨ˆÀíæ+zÅPéÅÆ'‡u[—"Ú¤ï°m£jݲä]WPÖ¯&H€L+Ôa'›—D]"\1¨[ãYhäí9lÁÉÌ3l9­× ¾swwwTPv]ª°Å2²Æj€·jÃaL ¬¤‘ëæXÀ´.¹ (†\iÁ‰®ŽÆw¨ókmªLÙ[ j(=ÙÆVI±\P¦¶'wÖ@¤{dq\«JÖÝÁmáDëXÐê.Î{á÷¢¾Îåƒè›1ñ˜fî©Z¤!ÊX“'Áº¢ÉLNhÅ¡ïvc+=DV¹Ÿ Ñ²:F„WB\xÀª¡ª¦ß^ÙÎoš:jZmZÙ’’BAr…²…©^· pH jÈ—]W¼É½Óx½s5“FˆS"LÓ×w¾ï8µäe`QÉ\èõ€Æ„­,›`Éé«ÚG±»æŒº­­Anö ÂQ¶È²\ÙÅbrÎ÷hØqr‘b´¸: ´9‹¢¨ êØ9Qôó¾{0Ƨ-­/7tgO85uœaäï2mç›® 2µí€fu»Œ:’Nµ£¾^u×0Ù»C®Iœ]6Û›´âT‚¦Xši¼Q†MÞ³™™Jˆ"xhÇs ;²(*çÂȨWݶ¾]§±iyl0Jè8Ô£0‚8ÝÆë¦¾É±¢tnn³~{"˜Ø®¹º+ZC»N¨¬6A¡d¢¬‰4ýNo"÷XÊÂ9¯ß9²[2 áªt x] Ç4¶gUa4€¡^:¤L±hl”ˆ“jŒÅ0ak¯.&Mæz­d‘IªÜ&óv·+iÒª©¶‚ÞÝ“Ž7¹¹ˆ…›cnT]ž…Í:ã}[nò£¤#2æ™Á­v*f"n"8ˆΓ4rÛÎqnz9æuYmŽÔHÆ€ìz›TdrIQwO«¾ Î73Õó¬œÃO`Ÿ‰Æ@¹ŠÕ¢^±`© "Hë6'[»w”¬.ª(ŒÉo ¼™9™‰Þ ÏDÐØ2ÍY1rnD¡†J÷‹»tj1IÃ^/A¨ºÙ™ËžÉf½õw?‡Ö¢y@ `GÒ„Ò „¬× Æäp*ÇÓ6O²”©IŠ¢)͉Æ-i4 i†$LÌÀf£Úá‰/å:Eâ‘¡^[P£ˆ£T 깆&×BÑÙ¨ ®©1Z°Ô)‚¢€ªY¬Ò¡€ªè€^©JÛý*™-y¶}>ˆNp÷OKDRãtuy»ž%u@ø?¢"‹1pÑx¼®i…Š}Ú(&™äíNãÒ"ôV ŒØ6¦fÐmËr/#KoÆc.Cúh¥Þo - ;”µÐÍñ$ CMZÀ‘—8^9õfæ’“Z*lN͉YP¯­"ï¡’Fr±D6Þb±v3)w›ÅöÝHÝ}}±™¹°ÅÍAQDN˜–ÄÎ¥|à ô 10í©ØÜK(rš›!PO(*‡¢­ÃU}—ycAŸ»ð,ˆ¼Qª€dóN€é¡.ßCè‡C¬?\›YÊÌDC 1ïR¯ˆ%ïÓ±«'(ÝšàÉ „˜Àê„YHY­»,R7c Ôz¾§V›<ûž)³œ…P©jôØ€XÄ$@¹Ì¹c}‚e B§mõOˆ•ȹûtàÎ!D[©aª±ìÕUQ¬>ØlŒ#Çw µMòÃU ÍùYHYcPO6›±àfb{¾‘m18k Ì ™ ¦úûÔC|ï+¦ˆÒãAõ&AáLƒäK•‰Ëä8øÒ¤t©Ha×Uû|õÍîæ&ð_[ž4(YMWrç{& ¬@Óg½¤Ñ¬U «'„ëÃŽ”U Z:q<4ã.÷³¬ _¤;$;:£·ÏîØ9ÁÌÍÂÞa»&tdXºQÖ`~¢ü-±‹V.[·îs‹T°õ¢ìÑI¥D„Ó¦¡ç’Èd…´Æ°R­D\ŘŦ¸éú¸dë’€GÉŠ'Єû{›o¯oÆØKÊÉÁ²ü“'BãõœÌǰ z¨îÒœrР®uÊ=g484¼[É…Q;Œ6@6×t{wãªáëC€ cB ‡Ž0…œl  Æã¶’#§NIJ¸u. O“†+½¼ÊÞ®sJbÑNZ*»¾ÏS€ÔÞ,×coÏ:Ú *µíŠ;ÇŠÒ2”PƦî;H°fÑ ö±©Û¡±B<€rçY ̳SŒ" q›Ð•@ @ç9!½Î ¼VÍsÆ‹uÅÞ% (y©¢ÉH&¡/E>«[DC:2¶61`¼‚é ÒÑtÃF̼ÌXܬ»(TŽC-¬æ™¥TÌ]Èá7…ê"ÂŒ´®„!‚¦hŸÒ9=ví’(TÉU«Æ;w-`Í£¤¡eÃ=KñœëÀwÞ°ûmM#JTŠ”.¶ü ØI˜ÊZ—SGV2¥) 8ìPy~°MÙÓÜQšcž”Á<@’˜‹:çµß¶çsâWõÍ?ÙP¾·„àD"\DÜ”¦³ª›`9¼1•¤ØÑ{¦ªí‚ØŒ#WFÛHë!ç¯ÎôøT¾½eµ“mmÕ;Pyf‹È*Hpˆ€`;@íÄ+3ÛßÂÉâxö„ïÖÊ._yCë(/IÊ9–§XtÓ>ŒÃ¦±PÕCXX>1¼zÌ<¶)Õ¨rxÐÆ|ç<Üö“ÔññC–Ad¯yÝ6†«uU\Ñ×-Ù¡UAl'Ïri ¡$#ÜÉ©æOfc›cvßk²7(îÍöžvjHt6ÞZ:±Jê<û¦G5²Æ¬ÜÑ;’åØçX0ªÎ²-°³qvvÖÍ[§¯·…EfÉÕ‹žÚ pvàu†f›Ü®¾­Ìª°ð^îTÏqéáVÃÞÄcÐÕ·©RÎB{f¹jÜ©Ýݵ9­öÎS×+9J™Â¸IWMÝé"Þ ÌçJ[«×‹:e=]•Fëh‘¦ó5нjÞOk¼Nj¶»jó'\ç ®îžwg3b·§×«f&6R¬º ˜Œ s0êQævÕ¹¾ZäÿÁ¸[Kï@}ÐÎ…êFv½Á`f©ïÆ&ޏHQ–,€RÕ† õJUL¸ŒÃÌãhˆRΦs!”¬8cKiÚ–&Õ^2½=«ÆÆêúÞäáÑæ^ Ê¯Z/5³T“œœEÎ.›Æ5 6nÚ€DH‘xs#‡p¨ç$„`«‘)@q0ƒ è ,‹ê:Ì.≈’ºƒî©R?åÜ=~O.X‘ìcˆ½D-ÊÀ–Á^S `½[Ï®ŒY8"Œ î¼éãßo[NˆQ{CO4Ã#á“2¨3†(Ã\ SVmÍVíÈu6`ófó(‘Ë£ƒ‘$-XÙ!xdã»w›’¦¹–®4x•dÄ¥³BB5ì’êÁÉ-©vŽS¤š™#¦Q%"ð«%‚\ZrJjAT”Ú €4A¢!h:ÔîÈ5P£šÆËE×[Ñû¶.ÀœÇ‹d¨J¨qê'М]åL“|† ᪘Ó#‡gÖfû{НhC<»ÉsX(©L„tì”rÔ#„D‚gðmK{"[ÝÌ*ж޽<‹‘¥~ŽllVtc 4`H#jr1ÄõSs–¡ðÖEª¨ae妭¥TEb …eztD5,­Ù‚6nø"÷!52¹âAòc?hW*ë^Ÿ^Ðìâc˜§~j#¨QR£àµ6릎¬9 ,+ t=ú(6‰mr)ÒÌ庿¿gÝda.r,ÄqpQ˜}!J  ò•Æ1ŠœR,ˆbÓvf–’.’µ"‚+C÷¬nå¥Eyt£EÔüt²YF¡6+M*®®Ïßt>ÅÇtŸ•. j€vª«C½„ÙoI¡dxV†}ßh|høQD™¥)‘¾úh$ IçSÓuyyyÍ6j"òæ. ™uÑØR7‚Ä1(˜)†ÒM¶xÕH©žI!­Ì®f–€£!µ°(Ü»¦u¸ê†(ê¤CiÄ¥¥q&sr*’eR$Ú@¤³lXe™”4èY„tH³™˜Ödƒ%+LG92ÁoZTbaoMRHSÏßeaH3‡ i~6ôdŠ¿ sìû–€ É’"LÇv_ÁÞNX7vÖ&lÑ¢Í(¨\‘V[X¼åʪòîgCÝžy–•á‚÷•¦Oz48z $³ |¦ÀÝw7™²¨’úUâ…bý cÉ÷±÷j&B38<´„!üÑbÛÈÈ&‘JIщ¨mˆÉi‚`X(Ý€ƒ¤ B^¶D’Gâ¹ d`c˜!ï r‰$Ÿ²è¾uv{ʇ¯¥ó vÇž‡'1±Ò¡3râËp+u2ð‚·¹-Bj ªQ›V Œ0£¹²s''(]«&¶"AˆÏ±ƒ'Ô îâ5ÂXwÖ]°I†™pñ‰’X`¼š/"ÛÍÂ[EæÇ»ŽÁ’VD8Xί.½CÞ ½Ö‘”²q  L0ˆCêd EÀêûÛN|KYÚˆZ<·Í¦92\iU'l¾‚ò‹w#¸œ@h’–›3 ´¹Öâ(ςӎVªVÒó )mmhTᙈª=ÏïO¾ÕR½&Ñ®2še”’ò¸2¸BbQ¿Tú¸WŒSf&¾ß9ð;$/EøwÏ’X¼hƒZ*ìóÎÏ|뵌Xž+O‚_Å6ØÔ/m^éDbû×Y½Z,EŽ$ךى+5;JŠjWmcä”ó.årÄx%V*—ËŠ>IbJÎ2cqW°-”̘d×Ö/_Qœf •pÂØ]¬Æëq–ýP¬2Óq­d Êb)-÷ÛŒã1eJÔ~YÆçˆ(ª6’ň±DbÕc¶–Õ¶Û^%Ûp¥²ŠS;ÓR" „âùG’›šl’JÄÆÍ´%"5¸Í‰¼¢ 6fh¬YjB¥Çq5:[pˆ$U"{µ#ÚÓêPÕ’1#A$CÌ 2æÄõLæjÙâ… ¥I²6“ÚF™HQÒ¦20%„^ÍuE("’÷µÖ·Ü”Fr6¸#tÒ É{̦¢qw 3”lj³—;cˉ«nZpD’0 [™ÓôÍpÃÏi9‰*K1•@2?yµàÒö¹ÎnD¾òà€`èÚês¥ ¯œð‡£Ÿn^^•X‹A{L Õ_ÝNý̯sO»æy”¼B4A‰‹@ü:ÏnÄÎ ý9‡Ó‚ðûíº×H4Qfãl >™.^’å-/¨TFCe±Ú­ˆ43_}Bxhn„說&½9%îvô¤±'%ÏÛz/ öñokjyS¹7µœõUn $ñPdnG%¶6¶ÖÅ]€øÅ±Qàyf3£Î¨fæù3¹½ªßBÉR"ƒSŒ+1 P»s-´nÛ€Ì+e±dÜ&8[iMÛQlòrY7N\˜¶QíÌ e…%rYDjmÀú!ë»çÎ|4;ãgÑ(°67ðë¿x/y0z§¬(zr8]çWÆæZ"ðÍ‚°F#›\±ˆŒDªY‡Î·yJŒE‚‚‚ïÍš"Îöù­§ÆÄV1NúÉÎ È>Ϫn²A+pDAüö7~;å¦:‡«£;šë4MXbäHY¤GÏ2[t1‡ÁÉÖºiQ<~'ÃÚ9„4mÁáðmÞS>Ä!j_nÆÍšÆº<ú?'ÅUE•×½ù‡×Uí)ñZKX8L¶ê+ùNA·Ls1¿§ßa\ó—7‘3”( Ú5ÀI „½ý—$x‚bªåã™”ûEb¶ðe+$ËQÆ(Q…€`!›ä º‡PŒ˜“¼ähg^ ¯uÙ¸#oÔL1ßHŸ…‰Ã]6Ó>, $mPʾËî­ÈÀ‡Þe{€?#d<ò°X^#ƺEé/ xy\Îí !ˆ=>•)Y» lD¦mäP¿{aÜÕo»¡I=¯Bvpƈ)dHFHÐ0Ág:ö%â4vªÐÆi(ã†Ð²DE$‡ ]yò\C¡åò/.O»¦ù4‡V£5ü¯Ô2N»ß{„ÞKºŒÇµ<­a–Ü®ýíËDe"‰ @æøŒ§êbKdœ ¥¡$ZÎ÷âî]g|rnNC{Çfb÷ ¦+¬e¸x)·´`¶¬[&`¾Å”j"ø¤’äáh57¾âؑߔ­ÚͶía™lš—®Sñ†ƒ”¸X|„È÷k˜‘}IÀÇÈ9=§xÈ{»Ÿ–Àúß|É­{îUî™F·ve»Ý3ôíÌÕOæ3¼§ 7hp÷ﲯæ&y³Î1ýc6?géG£|¿ ðÌê—Þõ¦ç—¢õ¯¦ˆû<ÖÒó5YµÉCd¨·JMãSWÇTµÎæcã“^sW”×4y¡½“Û‹> h¢³Ê@ ŠæçõÓ šåµ_wß~oj÷ãÒsÏz™rð·9ZDE÷µô5@|2hmšiQ1Ûc¾ë´ÞÎcïÁކý®ovŸ 9p—³S”ìQ}‚//A®À9åižk½Õû±ï{±AëÔ·oHÔΕ6‰ìW¨c·]Zn΃.8ÑÊ´ïqÊ[ˆ$Áeðb÷G6‹¸! ¾ì#C ݈õæ»Ài@hɺ@ÌÍÓpˆ&à•›(Ÿl©‰©ÇP¼÷1š^œ„—(gçÆøÏÙ?Î,ž%x߇٠Òü¯ú…?ˆºÏqÞ‚z!%8ÐdLì_Ù•÷ÞRW#µÍ07uÄ`úî«m QòKÕ~$èÄâ'YÎk7³¼ÞBXL±H cç£÷ݳÆOZ²;Äï½ÐçLÝG¤=)žHIÖjðìèƒJwÛ~ï·ÝòR•%ûÝï®,‰(¿|ß㲓ð¬k‰ìß Rœ¢dš˜vÝþÜÚCÁNlË B;.y¶¨"F ô7å'ªL¤¾D:£¶ìig•X¸Ë.Lcˆx¦¯H„yì[÷ƒ` ônËã:Dng²5Cöq–—îgÔ.øÕfò³ë&R¡=Ïk˜§y¨®bûÜbÅ5h!Ö¯;X/¯GXê«D‹bqË© qÏyå‡Yß7½ú<ÞF*Œb1î†&T–ÉKQC»pPH"¥#m(¢"(VV…•‚¤+T…iTPÅ+²XÅP ¾–©¬Ôº5yÔÙ‰×\áó‰j“Cb€=óƒT+‹Ò÷qìæ•. ®h[†ˆŠO:ÁWÙ6KÅy„®Ñ[‹ï*(¢MwÝÕ ËY| oÐX/kÂ…y æ}Ëuϲ ß¼¶‚'¿]/F| û—OIw6ð‚uöþö–*Z`™ÚŒazT¢„ùÒWjó2þ»Ì­ܸˆƒ‹š.¤tÑ›0 Ï”ÞáKÃ;á7ðî\e›åflµù‡%AýÓú=šûDލh„=Vºe"ö\Z—í‡ÙÞIÁ;}éù£ÒL$úQ&ÒÀ ¸øa‹ÝÝ€~ûèoH+äÓ,a×mÖmú {%ƒ²µŒUhÒÊ⟢údY]LkPAßWnù)úuíËœ•^½¯Jþ*´ &tÌ ]Ò.*sxQ¡â(-±êØ3/1©¹P,Ä>‡s™¨íþ`ÅöÏpø³ö¸ýcð²*= Ÿ²°£Ž¤~m w`ož< òý)ÉX\G•UXÑ¿7°à›i¸ß‡Ò3I|Þ§ ^¹w‡CtÆ›+Õ•ñøïYéîtlt–P™·’€e‹ç&Å5¢¬¬œ¤]ÙdP‘Ò7Ÿk½ª³Bp}¶:¦RâåÁêó.…Vç!w*ýúí³ˆTG{ß1¤u ¯M»²„âÈÀùyŽ?§ k/ĉF­€]ðWÕ\ú äèÝúwoxå›öÐ÷f¾“èó\&¶|ö¹>#K{X ÕäÖÛ$Ñ€·¨sw‡Ió0 Y" ¡ƒ‚LˆRƒY/Ê`ÊÉPDêŠUR!Ìž™¯XëEÖÆÜhÓ}sHûõÁºŽ'Ëï†uƒãš)Ìî>¨á’[]Ãã² }68]‰ Pn0ðÉMõ6=4÷.mà¹$g °ªæÅî¯vµB ^LþɌٕ¯§ã9¿q£!š&H1ô‡g˜Ï)ˆ=Gƒ'¨o»{`Q.Ý€KÑø`F¯î$šÌ”ÛïséÜgÜ[9ÛêÖ¥ÃàT¬¬bG\˜š±2¼ñIÈ*êNüž…Œ>¬˜I 3rhÇ®m±­* ØîŽo³Vq,ï”ÍÞ<·˜þœsÖL©»žtzT })1‡hK„>àQ‡hì ÎN?Xöw@îîQcIÖú‰a”¯ƒâåhÕ.ÿKkß…rßv°2²ä~ûáÐû+÷σì†CÑ‚UhŠÉÚ¯÷÷Ú‡âŸï;´¤MÞ±kq»<{)™Y¬åÄu;È¥2(fK2ÿ@ÌØ€lφnÅæpÊ ‹@&ãÈd”…ËbP¡kRVµ(4->ý6ù_yÙ}ß&F’çÒØÝÃFÐD¦ ÛCLI©cg”<‹Rà®­N;.Õò@N¯¹âÁh.[ ÝwG[ sîPo$ÂÞÝûH{|ÃÖ9IëñšÏ²ß´5\bа¶´æ½ôråê:½Û"ÀPó”1€)Sã'Ú@ÄXó˜ý0•í’ üë¹`”0ÂC0̳—£XÞóbšWÎòb–‡•Kîó׳‰ÄO¾e6½?Ts³ “§õÏßµ±B»BùÂvQ6ˆÅ>»bZø8ÐEh¯‘œ,•›²#\-‘ƒ™÷Û‚\HñŒÊ›ˆöeYâ(8ÐKD@š#<¶V›§Ü°|=šŽAÜBϪ&A®¥ºF¿Ä?Ô…^*qþëb–!" "F "Ï«`£"ú >øy¨»®\3>õ²Ô\Ö5Îp„HÅš®P ˆ hÛCDháY4øè!4!…ð¡°(æøÞPS±9šÂ¥ž^ –öTj–Ñm¢Ë_¥h$œTžÍ§2Eâ%ŒP2ëeA4G3jÙ›#l3s‘H¬Eù·eµ2ÔkC3 ¸2Ƴ2z½šfÛNŒ¢§ÅÚAWXâàbÎ¥×OHëÔ”mR5½” |C'c&8¸í)’A Q(QÄ'lñëÎ`¤=dã»æ&D&[´™³`€%Ð{wŠA‹·¶Ÿ7tPòîõɳÅ\°¨eaZ§p¡±6\ J¢òÖæÂ½6j[ ˜‡8/,!"ÊQ$ëfâ‡uÐù¼ô ê{ ê§8XC|Èîfß'+=+«gdt4ác«A®<äkÁY©e2¹ ¡qÖ1ŠF ˜)[›` µ†"ÏfTÏ+V/´¯‹=¦ªt‹¤¥I&K3u¼¹ Ô1bxP208ÍÛÃ9µÕráq2T° 60¬Ü’²„dŸ¤AS18•u²í€»Å¦0PjSm„ÆCSÅLf"аËJ2Ö‘@ÛIŒ. &1qac Œ,X,üæß+ñMÜóɃUÎÐ}±Ì9h_{;oûËï­ïÜ]Qû'sgr+2»¯XÙš¬R<…$W†M…JU²:­:±„ÌÞÜØlŒZÉ$.†”N ügÏnж 1¢F»Ð\†?e1³#Ã{ß'nÞŠmýÂTóå LLêÂÏ.XÀ÷_Lû³!‹jòqÝDƒD² ØDÍ–>ˆÀD|ŸÎÏ!£¿Ѧ2òËøëÉ%õÝd@’…#Gm0a`6E…ž.)R"'HŠ·vسÈT›Ÿ{UÊçŸ:ë¾±.¾Ø $GÛd8Ÿ)~Í!jT_£×¢ .:Ö!ÁÃôžÛ¥ØrÙ„# ²†«cz°ad°‰AÄQÅ£Â^õ»t2q&­å˜¢Xeà5õ1nÈ)FR)è9'ÁºÃ3%( Lü·bI0‚Ë÷µï<¬ÓÀ¿?f4qzæµÔDŸ  ™,䪂JÅ#Ò$ 6*³mÐ8È9c%aµˆH‹P·¨£Ay!X}rZÈŽƒ$ŒwÌ<å3I”Û’Ëlcœ&Š¡Øa%V_2„ÙD¢4e‰ ’CMÕ†­\Îr €å^Ë”c-Ô9CM‚Z$#D´5Q±ef+ÃÃÕáœ4g–¨M¥ÂŒC@g·‰&Û:¿¬É’wqìɶ—*]ªbq×ÍÝ5ZÒ·Z3ŸE—o•y©gê‡áE¾Òõ·áU@ çv(ã~°Ç¬¤LÞ¤½N$àá|Þ‹# -€Á’ m¶wD¾bök£6ø¯Äñ¼§¹Lq+5{ï¨v¸ïté]xÐ0L`‚Ð@ÐK${/%¥oï‡}Yœï`<°ˆØÆÆ|/Æî5Ÿ <%Yúº ´I*ð%X.E‚@$˜)OˆÅªÕäÉ£yœðéíZêKoƒ+‹Ùn>ò\}u%A•¼è³QØëbúF°gÛÁ@S!QÖ€ ÁûáZ¼®yÜHdoiÚ]Ší ©Œ÷Ìáµ&’&ÏÆ€+0à ú»tú¥–*÷v1sCúv¢w\ õ Ô®K?Rtrd2ˆfkgµiJD’ CJ3Cy‘„Îb›ÀÌÁoV¹WÊœ}®GT—§k»6´a¨úÍk-X_Ñá{ Ûxï˜u¿E:Ý:"dðÝæ¤;¢GWAV(ç84EÕ”`½ B{÷ç͇LG—¿ujIŠ”Gçß§}IäGêQïªþÊõzêÐK„Éøð:m®Î÷ª³/yækTšcˆÎT`˜£Ïfg×amr%bÛßß®ÆpçiSž¨eˆìödÞ"è ýwÀ6öÛ¯’ò×=ËA‡ºóªÞîx¼52d³›ë©´Qã×ß‚¡Ò/Ç µófiÒßDМ ÖCYû•1÷åG‡ÁïÏhõÇÑ:=Üü5=­D=\:ëÄ$zrE©Çê=ÙëiìšØçkOdM||W5Zóa`ˆ š~¿ !»R«GUöLþ÷¼Ã({Ñs‹ZvÂà"úÛ–ØE¸Å³ÆYœÃ­„χcF¿ˆÒoŸÎ7‡^iè.†„bÇø¬—LLŒ ñ¼Ð$!ŸŸw;ÃŒÓr$ ¹éžàæbjÔkàz}öãa¤ÓWWÔP³µ‘c{)Q³Ðe§4^ºœ~ûm†ÃLŽóó%mÄ M1=Úº~HH"ýu]í”d+²´z·gexv÷8Ý%lŠ»¤3…ÈzˆrA.°²Ö]¼ÃV®¡Ú€5ŒhÀÉùz.0Áƒ×µ¤ë >5Y¡Z*ÏÀMí¦%Q_'/èFÍo¸w ¦b:ßœcŽ7hæòEšÃÏ;Þ’Òé'=Lá¼J2c @;ÄÌ&°Ôr­@\ô»ÓW0›«ˆBkU¾w²C€í¹¨¾ ÓàD Èœ{îÏoPž£ìÃyó9=n¿P¿GÒµµïhí÷\ߢoÑ–>ˆ@° Yj}ÓÕ>_-ú÷AÌfâ;ÇŠk_…w¡ßpŽ©ß ^u(@|rÝ/;hÆ+8‹±âxO‚žƒ0×Ù/¾ã%諾Çå¹Ë8~¸¤;ÚÜd먒Éç®ë~ÓÒ‡TÎázKæ .`¡¢´ÎßÞáAÏÁŒxû±^÷ÃêtM´<†Ì£ W~v ì@=Çz>kçûš>[ÔÌLO}¹çÙ¡Ñ@W67€t í?„Ûü×¼ß !q­›øth@·zÑúÞä¿)!=ðÐgÙˆ)?o-d`Jkj&¤u©6‰D-ê]cWrY9¨ HÏ{åN4dÍ,¥·¢“òÇ#¹}¹ù‹ƒ8/«>°©» dJµðWiº'Ð:”Aw#®Â;çËo$u ¢h#ù}ç!,«j´½øŒƒ×ßWâÍŒ¹ýš>ZúTØ­üÖ£ûÀÿïB„ö;~Y‘^‰ü™c§Úlþ,%jzÏå§JÊSªÅ:-0º¢À¹HØ#æCûÒD÷¤tm'ü,Àg0BªY@ôBmð¿Æî}³ö÷•õž­¥{RÑ^17ÝtJë8´ƒn*jüP»œ^»Á»»ó‘g˲V‡ÀCT3íàˆ‡îÃêç´,×[›Hå Ö –¡€Ôc8ÌgËPΚ+S¾½UÈ~øˆƒŠ ¦ ˆ´¾bmìO°÷ÙãÏA;áží²{övQÅ@œÉ“û=•^Í3÷´qº@Œü I\WðËö3Y±½û¿t>ksé/Ýy;\5·ð²_ßÃð}õ÷röÞ_³Xm a¾ÈVq ©±?s^Òg¼º¶¼=t†j®i‹ˆ{´˜°Ñêú¬v{êÓ”myÛLÎÐïÎó2ÁÚ¸ý¡>úô#îܦA¹|;õúš1¢l|¾ëS?O¬>ô ­×ƒè#b t·–’×®ªñîo£oN8Í9a®ý¼±ë sH û}·þÛWâ–\ðkžÄ)$Þ^ V+I|`Ži»,0Ãë8͉bóšÞhÕâ‚Jpbp¢6ËJljáü9úkÚÑ“÷óË:Á+F>É%fsrMqºÒÝfá¥L³‰{ûÅ Ñ A^ïk÷‰ñÁò´\our4Àcà ,¾Ø­¯ªÌTͼïwh #8¡‹êü»±´ÅÆ·aòì6$.ØCxÉ>ÐóÎúÞ0†B |g¶T”Bˆe H[`Œý¹Ò ×â™Ø °ÏŒa@ 5 &¶ ð¾}OÛ™RGW—Þ÷™GmtVŒ=²~ÓÈ÷ÈŠ\)ÚÞõ,x!›h¾l¼×HÔ 6‡™Øï¼í˜еÚyS“uLQsKs7Õ‚àIBF ‚°1Õcn½UÙ“Üàå±­*îHA1sÛ‚?˜ï>å€Ôê5X9sâÖüôׯ_lÇ×kóì|Ç“Áð*¨<¼Gµ“šãÊï•“3ušài¾=èžõì­€DYúÈ;ÛWw0øBºûÀ¤ 1J+bÂLT•^»ÂæFmÉoÚ.šX@^€$–Ä Skª_tá³Ön’‘ãß×ûÛ"ýýf~üo"õçË·™½ë¿ì£³sëBÜšÖ«h¬Î3}½7¬pÀ".)\QV­×)D^-w&0…Ü9Ø_?¨9!Î{ ÑCy»C¾ZzÏsç 3AH€¿hëÌ2€&>A‘ §ý÷WÀ~gðbüô)ìßh&1Òì×7tB¾6„L·Lð] •¹÷Jö}Í냛ó×´ç·¼™!®eß½‹µB® ‹Ò¾& ϵ{~™3O†xõºnx‹«Âëañw”æÕ43ld6ˆ.•u6+RPViÙ æ³Aä~àÙÅô[¡Uꦀ‚íié”e)&äuó#dwU¹±¼,ËÝÜ^týÞ(õúýÛíðtjT×~ {ûáñ°/¢°QV&àn•  8Þ’µ¾’ F]ÒÎFº˜Ì°_ùßsYõùo`~Þøœó»Üª.N=s×,ÏLàqYÙZˆO6Fž‘ID ¸§¹ÆH¹«c4 Œ 4ƒ;q莄¯¶#{&Pœ¬úG¦ØÖEŽTÀ¯‡š³á,–¶y9k åÔKTz¾&•XÌ]† \ƒhÈRæBÔ& ±;€¬Û›±·"{ô™ð~ü6¯ÇÑyÝó9 ðJÈÌwlëÕ³k 4¦j-b¹1iÔåÕŸZQЇUí?uwÞ$¼®óѽS滈Gœ&{×4 Õíï}Ÿ`ð6o³­;1úÿW¸nRT@ÚÜöÄîQòR©ö“/2é¯A÷b¨9K¹|ÅbŠÙuõy`\Z|MGY©K uëø#è\¢O13g0œÊ©Õ˜`ãT/%f؆†‘Rˆz¡ÔŽxÖ|U¢I„•"piWe®ÌZp_3RŸ…Hö؈¸ßÏcáÝš¯Ÿ4§30ðÛ¼#®ŒÒsk¨õ<ëw¡¹ÎœÚδw‹Ü²æ¦è]ß]ó¬ÊXκֳ(W=3Š…Ín_$'2¶H:–ï#/"îJ!IFnMUÕ¼ÉSbMP}3JÍëd÷<|¬§UA¦¹r†éUjovøM![ov­réÛ[µÙ/RΗ;u!Þ„ö”‘WØ·§S™9:ιçqµ2uáp¥óî®oŽº™5[y´Evë}q{TÆqs/ONÕ`&n^žY–pmn£Ó‡g¥®îî52ëÎ$2õÕïmî¼Úª+°Ží¬ ݤ;N Ü£K†&kVܘ ß}˺kß^û‰þußy¼9Âøç^wð§ ÄB#Û bqŇHÒÎîÃçCU4wñðמj…PÛÁØ:±üc ŠÏÑ•‚£@£u³`TU÷»¶ù*­ñÀÏfº&É×X<‹ÉÄÚ¢(Å‚ß+ “£^𓾖 3£iª‡–4ƒ;‚©šLƒé740öÎÇʳµ a¬ 2ÌÍZÐDå ÙLgá?EE‰ï„?7÷‘ýNFÁh¢§e\×&8ÞjÍå¯ ÓÐKS¿Û¨`Ó™5›[ÕÝ™#Þ—sÍqw…pઓbÁ˜@ØÉLáRrBJTº§ÈJ3òLz¤Šž–TET`«{ó|ùáÐf÷*ŽK*²*1gß>Á8Š-D¢°D¯›ÍØñ,YP¬”yï}u×RÛ­DT³¢â"¹,”TRŠZ-VV ¬î7©ev˜àÖ(‹e*ÅEZ[P¢5ª±•Ak×-{Á-ï:7‹.!&ùyË[ŸnÓEY1^Gm•Š,bAaÛ‰‰QE‘ATEXŒ( *"Ь“Ì>$ô¡ Ä\DòµÉáÎèÜ;Ç&ú–nÓ›‹30&¾†ÕË!=Ñg Mñ`#EÞ¸ÆçhÅF/¶)@Û¥—µX`’¢ ’†ZDP.e‚jJ:`1¶P~÷÷}bdëú§ˆH=À'q´Çæ3áË#Ÿ>…~Œi Lx‹_„‰\¸ ."‡šïÞ±r'TÛšEb…!nèÛ¡7Nþ¬c³xÅðÅÓ˜Îo ÷–ÂàvÝÝé!È@Âu…•×” 8>áZÀŽHu…A‹y™Æ±šÖxôm@n!Œœ“YªGdïyý‘㟾gâæî„ý½­Í™)ÖÏ<&’}"õlwZ®ÝÚd‚@è ‘ 8éÓÖl"ÊúÉ©¨VqæÒt``11ƒ7º F¥r›,ý²2ù6`èZ£æ€ÕÅAbÛέfÉ]” )Õ(nÒPI & Üc6–™kÌÀÖyßÖM;*Cã(#B¨.:lgÌάZè>#–PõtNUqn¾Þæ -Eê¦!”´1枼Ɵp‘š0gæyÏ‚Õh‚Hª8~Ä@6íh_FÍŸ0€øæÍË­R²(° ¹dØ(: æ´!󺑑5±¡ö§àCÎìg¾¿ˆ—ãrÖœ¥Øq­ÀR‚ Íe×*Ñ’ ÇÞû·´e ¡# Êɨ;y™Pä»é`üp“š0´…$Gr‚Æ»¯cÒ\þœÁèt?5ÎŽ©ÏdѳÚ6¯á½»‚yƒUçÀˆ¤dÆý˜9ŸáO½t¿ °þ oÆç$Ž!H(Úø2BQ¡|Û}ÅÈÍdÞFÐo Ô|ú{@Ò">b{{Âpœô ˱öcÞì†þé=ú|iŒCá‚FØ]òŸ´âf|".V‹VAÙLX@¨YA wªY¾Ì|ÓfØly€("&Õ n0nWrñ¸lKÑQfŒÃ:´Á\š0:°€dž\£Ãw¼}5‘ʲžø!T†V±ødìñ¾d fyRªª :ªPà^±MBÀ©«Áƒx†ËËš4µèˆˆ¹¿¨FRö*ÇP{YßY \Š#Œc°‡(¡®ÏáxÆ|¢#\¦ˆü)WÃÒ=‰fñHÚ,DFéZXü€ñH9à BüNÏ5*Ë gÜŸ9ÐèC¬)ç˜t­5û¶æX8Óú÷ï›ø 4ÁbyÌ 3nÓþéd¿ÊT~ô¡4dÎÿuÆóðj˜cí_½Ù¯ÀÖˆ»j!3&·Æg7]S(dàWqgk²Ç6òäñ™$>Ý87n‰Ã¿.ÔÛdc"Å;ʦ"¶’W2°E˜…²×Ÿ&{­î§5$}ahx0aøZÄyÇïSéñä0$}€.}K\X¥Q°TŽáS³~ôëîÛ&¾â´º0ÂC[2NNt&|Ö÷`aƒ¡®©$¦ˆF¯qGC Å ºŸ OÜÇÏiíÔrFÄh!wÜJ×äÆQñð¼ûàa° .¨J‚”¦éscî¥ÞD|ÔðaD@2bjë·ÝÀéGÌøíƒW'7¦Ô<¼@oÛ=cîØåKûbР v.zÂyA ­¡×\÷;s>?}\—i3S|æˆô€tlšJÛÚ˜ôú,}{ 0=Yî‡Ë´²aüIhcáw~ý##XR}UçU“W§e ˜€0^¨Fâ²(]ÝðC|ñœ5;×yç:PÙ8‹‚'bä:QÌzóF|45+x ¥àðÖfÀù¦8¾7qàÖì¯yẪçB‹¿_ŸÀ€ÉÖˆ«]`®ƒ/zïFw¤]@@jй³ªä×7ÔèïZãDWÝlŒh`ÚDEŒß˜™C8ù%ÏÝ¡å,D6=1ùÚȸ4·ÈCzszº3w¤SbìoØ«åž=7†? ûÞÈßNíϨf<@¾’®Å{dØbþå+{ï-¾±Qð Ï¿8ï¿;Ó?¡g·~Jò"½2-jëHoìî’R‘ÃjˆV—¯åo.’ù¨üzGˆb÷ô|@t€ÉïàßÇÀÉî߯ŒOÁºó£{Êrç,V`_®t•Ù’­!+d]7e‘¹•÷u1³äqå'°'E…[ÒÛU Ê¬üÇZ=>}†¤7Clm0dCVPav&óei” ‚3^ßæ®oN³ó¯‹Ù ƒß—><ãgÉ>µá¡~™Ñî¡Ò÷4JqŽÂMÍóî¡™C˜ñõX  €Èr Ðí+š?TŽ}æ>°½àFI U…ÁB}6cCéjï®=_6xïáú¾sêáéò‡æwÞZÀ™òZP=ð‘>ÊïYõl5‘út6—ù“6oÄà<Ÿ6<®ùNcŒ,JþB$Üâ.:=’?Aý=…ƒdNÄ@Vv’I¥Á­_tû¤xÇj¬dZf– û‘ƒ¯²oá“OV°ƒ·qïJoÆöaÛ÷g â””á&¤7XÅf~«xW­ø{ÝwÞ²#'L¨"¤ñ’¤¯èß'0^lçæµ(Š´+P äŒ0#äØÜûrþ Ø&p]¼È.Õ2ü  ‡›éZàÊ©©ö\-®ÜáÜgI`{ zš¶h VrSWCͬÜËT‰WdA´¬ã›`'¦$CB4·ga}öõB¬ì•[tÃÚÕꉯѽñ±’<™ßž³£Á_#½H3æú¡«ŸN¾ÇÌïÙÆ{@sܽWŒËAL’*làÊøæá èž"€ˆ¢®ãV÷¼…~ ®V|h¸jjHÜ®½kGÁY‹@{žu߬óoÀÚ'³šgsašUÊrïöoM©ß\©! .ÐÜVXQaô„*èü'ÑÃÉz wJŸ@Æ,Ó…ó¬Y:qM»¡CªÊüÖ~Ÿgá?´Í~Ù÷ßwÁõ†õ[»k²2¿OÃÁi{_ìðúG£ò›|O´O‡²$.[{õW# =ZìÖçXíŽp0›zÅ „j΂S„yš˜ kïvB‰©+ÍiJí¹ ,{z…ʱeúCè’,D^Èd/!¾êCöPä4¯¿HÐ/WÔ$œŸÊ†|ø};sѸz(€Ÿé4þû7Û„u뜓G ¨Rº~¼I~Uû¿§­ýWùîm+Vÿ°7ý†È­F¥ dÙ=ce0Äð/Ô‚ŸdÒ €>é0d:Æ6!~ùó;êíëLGðÙ aç.¤QIB€z“ o”¬&ÛÒcë I É5R¤;æL"¨|ç—3¿¡ zìã3ºh]¶AÄú»¨Î›"Àš’\²¡œú/3ãØ€Ÿ;š8®â5Í"î ë“›B¤¸Ž¡tÌYgÆ.Uì<€úaªÄÞ¯›„nÖ5±Ã6WÍwž1»ä٘܂= 79A¤=}‰ʧ‚IXHÑ~;GqYbQŸ4…ð¥üŒ~ûëï†é m¿§iM¡¿¦ýVδÕñžƒx#ÃÞOóZí Øïhi€¢ój¼´ñw…iÁfïu{î1Ù™Œ¡™€v•wʃ5â⊄=¯À(;.Ï=ü:ÔB<<€GéªQ¸[ÍŠlYžj*\„ÛÚ‘*Å¡FÝP ÁEÌa i5¶3Ï£z¸¼á;bë:ñ\ì ÷n=o;¬_Q,Öv«¶%OѽQ¯l𛍀óªÁÞí÷-íÚÊÙp$ åÓÐZ" > µãÄx:ýÕMC whUa_ÐfÖõX²ò¢.…&•UÇ>úNh»£‘ò¿«–ØòióD^TîÈ“3‡HøD¿so²|íÕÍub²L~ŠÛÞœôߨ¥¯'Ó£8iÚ<ø½ E­¡›ßïßX¶"øož~á!€ ýè£UCÏn°~÷÷Ïgû=ÌÓ_i>´³é±>îÁòèðÏšóéçyæ—vXØŽöÇXöΰkOÜ6¹¸J1K—2j!¼ý(HÎw‘Q!mf“±!Øß$–(_%6y7‚ônÄ7Ç¢åu{Ï<ÄÏÞý" çeðõHÃüÍãakm}Êtßs¨÷ »½ígs<<Àç0¦¶Øûg½ò¥0³Gºýöv®+áÆÍr,M- °C> wÎÌì5a ”ÄÕ¿)úœñ¶—½õzᾉ÷η¾ñ‚^×ÒÃ>׫€ðÔ\@^…#2æ–·Íì}RòszSÐU° Uœõ?‘ÏÜÉCÔ3›×õi§›]ÕÓ=%cɆÑÙɸº¬¡³%^u 0" M¶D•¿´03v7 …ÀAd×d€.z`;>®›\ JF|úK+ÞJ½c5Þ ´;\áÝ á?B˜¬,×3áØóÜS 9zÿHf qköûõDiz.ïº ùÙÈ{DwëÈT®Áeñ*k[•e¡ÌöÂ÷syÎìsE¸¯ÝácS«zïŸ{¥îözØÉ®¨ ìÞ—¸Zµ^Tçá`ÞýÒ€«BÓ¡†ˆ´·#ZKJWqXKÝ¡+¿sº9øQò÷ä?u‰ʧ«W»eþ:8Q‰(Œ§&uuL°ÀH©Šãs8¦, ¼eH‰ÉôÖ„%‹°jç7­™A$”>]bp`Nhó@ÎN†ß_Î;뿽OcayÛ‚I~™õ'µ­ø¶w4ë «NÆœ® U‰À-§e3ŸáÙ‘ïTç€îBà`ðª¼à“Á‡é,‹RIZ÷%]y ùB$C!ÔÄ™zÙ½ d~owÀ>©~»é¬ðÕQÔÏ€cvcÍw³yá–Ç&eø5í\÷º®1{ÚôD ¢þY´Elÿ}D ܱ”æßrµÄ6*ƒÜ`xÖËz lÖÏ}0÷jˆÐîáêÊ ˆf3Rx}¢ÉËz+ô0‡Ÿ3ƒ¿0ãûTæ÷Í Øùùeôj@íðM•ØttD'ùÇ1w ª0? €ñýO(då}ÂzÀ>âGfH'EpÞý›ø8Îys÷ ìDظ=!çåõ ÌEî—’€óÉ29í¦0+×_Ùzme÷ˆñÜu^©®dÊàù E 0.‡UYœ›±­[ÝZvë0MØ'ðþ3±h—_P$-„±á½ÙÙì×˹së™ÞP~kï`9ìÏ·ôwª÷BëõN{¢lÛà­:ÓoAð}Ýô{¼·îf|ð<~åÞ²„´:6´0[² ˆÏ¢‹Ñ3:‚Ï»At¼=;é²-½ê¬2~ôíJe†@m±µœƒ4·6HŽû×ÃÏ‚Ã_z¬šNo:(ÃQ©KÍà‰j›|™º²ÀÙR (Ë­ßf׿oVÂPgv*¼Iq?WˆËY7­H;ƒ\ø0Å0ˆÑÖ÷?6çn—ï<ì—ý.ùÑ\Dñ(­¤'$:ݼ°ÉÔ¬ÍßÝúæ_%ë]s7½îÄq¬Æûv)øsü‡ 8zëÞŒÏtxh‹wgª[Ç>Ëôþ^Я½q÷4gaõíªýøñ||8R^Ïß5[ÝPÞôaNt$²MïHÍ219$`Ðg®¥HˆÎ^0¶\‹^ŧ@ão~ª[/ØúoÄVaæk²sB-Ͼ¬öý;Wi´¸ƒÚ¾ô:;ìÜ^Í Ï¾#¯] Y®Œ~~ƒ¨*€8¨L{Û}´õ:yí:Îö'àÃÁ qt–µÞ(Ç£ê¿IòW%øé̱R>ÚÁÖÇr½T£Ø jx• å6hSHº‰œÃYÀ –5R°2è`h0ˆ„#‘­ôûG™öB¸®ì=¢6˜Öߎ"å¸ËΡª+³i Ä¢«C»pÉjq LLµéRÅæ„8q«Å@8E âÿvŽ,Ür`¬2-/gÂÌ# CÕz+ì…ŽdþTÿ ë_Ž¡áçÅÖf¶"“*7=¸ƒÑú;S  è÷ìn¿pÇ 9Hµ•\w/Œz{3ÞˆûC‘aÔ‹J ¢!¥ìYJr«Àâª`S^Ô{Ü@.’L»ÛæÇHöäÕ¡ÁíÜÔ@uR)/¾—íÄ/ìgH³Ndêx›„©ÔÔF¦k}¢Í½®TúcuÊõÚ(™d‘g$#µÐ—|ååA™Zjs*Cœ“gTù(#šhµo{´ÎÌ›WyV´œÆåP¼µÖÅÉͬ­ì¶ñ¢6ruU y§(6¯§4MÚÚî¶rNvâUÚôQCeWk¤Nõ Ë5}µY¥ŽyU=Ëjyò]бÔèµzï&æ¸õ1Yf×^b¾ltÊ£kYåϹ—š^ ܺJè†rغÎÎdÚ,]¹äùžëž™«»Ó½§MI%œàÆm;m“”:ıܴ °Ôž¼Ë;}9Øno²†b¯½3»GvûvÌõ »Êζ¥.™º¼Þ·TjºqVÕ² ÞÝÎÙ*ío"pÆ·XÙ¥`å˜`DÙ|jö'ªu$fX]Ðt㖗˸í*YËR ï}ž8q›U7!–ÀÓ–=·Lñ‹œÄ#© ņcuÙl=’vuÜÙés˜¤IÞ±v]4Å9Ô"Ú4Ф4™hå«Ä8„9 ‰@‚7XvE·6¯gAk˜¤"ëBˆ†h‰©•onn ¶Åƒ9¹–34º¶Ñ8¨êiTÑ.[Lœ,YÒg1¬O‰åi^YÙæÌu²ÆQfIé ̓–î]`èÆœ6¶` WQŸ<ªKh„FzæaA‘}ëÕî¦ìOpÓº#WˆgÔ¦¡Œs]''{ÉÍÿÑaløŸLL·¸KrÚá™[ä ‚"òýT£-…FX­42fDGåÖÚNZ0¶ ¶BÞ€ZT¡:MÀ†ÕÕs™½L³°ñÁ’ÆIS8nVÈjR½¨(ÎÕ©\ɦøl×XÙug¦,€aÕœ2¨¢£ÆPkX"¦¥ŒT€1S"(‚‡‰Y4´M.8–BKå%ÚkUÁEV…È‚xÒe5À2Þrá¬iPå10¥ã0¨´Ì˘"[ #´ºäU(ˆQ…‰ ¼dãÁÂÛC)á‚Õ¨¢m3’ƒì݇ZUdph€vdJ@1­þ\¯ÒƒZ b»>ë¥Ç/Ú«zjçÎbÉ=Þm-©ÇvpeºW¨Ú¤‚tж¼¤æMã¥ÏüKuá8 dÑëœÎ€’\­“^NC1Y¬+s(g4Õ  ì°D¶¢ 4ÞXþ's§T`³ã @IDÝŽë²'…ú+†±D@ tž½Ü!Dûš0ñ·ÜïÛ¾õRoó냡MB® w§CX¨dÅC1Ò¼ª!’ï4;Ïú"Lþ<+ìÔrs£Ðfý¡T» 蘠N¤4Ä a½ÜM-± ’‰Së”ûå dø„éúpñ³<¡¡sÙ°"ƒñ´4Ò]paˆ6¼2¹WðÍwàÙ5²ˆ%X£ñ£ öÊO)7ϯ{òÛÑOiÓÇtòåofz5'” $$“º8Ê¥EQCZ§ÆQøÃ΋”ûùs•YÝl pÃDáî–¶†‹‰JuÖ9•½Ðž€"¡Æ4ÚfHÀDˆx¤’IþËîææ[ñú·EÝ«áwfz8ÇÇÎ=!òˆû½ 1}ï•äô‹¡ÀHÂbP¯x!3p‚‚Zv†¥ï‰J®jŸCô}ûÆ"r%Ðçžžñx0G DˆžƒôÐ&}¼ô¯ÙfˆY2@ Ùø<ÐÔPz£ïtåÎß‹ëî~¹zþ;ÝFøžÐf¯¹ž2N)KH£˜£Ö‘l F$Nlãj`ÎÜH._àê`]$GØ.tdçHsˆqø ãacZ©WõyÉ63";R < ”Aëeˆ‘V#lçÌÝ ©ˆ„÷Ðg<ï^mIb¼ˆ"ÞHý±‘ìjˆ¸÷/À,Ù_?¶¹õ×nûì©]è÷|Aúûåœp¢ò˜êDP7¼¼ð<­f ³Í°>ñFiEÑ„RËheôv “ºÙÉØÀ#DçBû FkÕÔç‹Ç$AÉ<¾fjk<õ“ÃW9@ à{+ –gÝ¡AÍY¯0ûh‰Üö'÷€¸úþÁ’ æÙõ‹ŸÇ„ÁPÖôï¹¥‘.A0wVäÝŸ~¥íúßˆÎøp]£3´¬‚=˜¨c‹7_çÖ>©n¹ZìK-íç]2õë0¾’zt²F.º£¦ dl^.ãÁ/&½Á`ÍJ‹ÅŠEPdú^uŸ) Ž‚òžs›kT.€ÕªdB&a=@°=@ÔBXÒ¸ç#fˆB$‡m‚þ»·F!÷–'¶ƒÐBuLxªUç ¢QdÐcŒDMƒ|¾V*‡§c¯¼ÒYB§pÃ]KÛˆg'¸ýbÃEöŸ¶€ Ë;,ЈeìP:Z졬ýßmÆ‚0•OÎ:^5{i«³Ì¡à‡ƒf¾4æë•Ö4JÐe%Ga ds5ˆçzàÏ*…ƒç\k]÷»c`nVmUÜÒïdg§ *ôEÒøFÙèög¶$9§ˆ`U䋚Yâ.˜¸ì ¿¤šÏl Àñõ˜Š“û¿/[÷<ùæŽôc¬Ë‰PçÊNaÛÙ˜G‡žNöt󃂯»P ÀPïÇB‡Æ yF´ÑÕáT"² G¯€œÉ ö~¶¯ÅмEÆõm•ej­OÙD«±rDDI¢ ÕGIƒF<«äúY›{:ecy×øhÙ-ôWöÏ.ƒåßs˜¢*Á>ØJÚkšÀúHŠ€×Á Ø·§ÂñÅ…oÞÛ5¤Y5u“ÝRä ñFý·°1x ³Ñl×Þù£ïdÐ?á-wc5µŽ$`ЩëC2A(ϳ"´OẺ‡ ü' äm:lŒT°¸ç*N# €†iètxûPošýŽPôûžøm¯£±ÌVÙü®÷'võª—žê nf®[Ö³=bg§Ç<ºpÎ :r²^ €Qƒ:/sc·*É™Êw¸¯0S<òVøÌª7S::®ö qÈ6`ÛHÐ ðG³Ý-]ý®µ]v„«ä 3L±½û~›`•—«Þ×¢ŸÀLGÜòˆ¹÷Í ù/…º*ðWˆô¢}`æï…€ý—ºEÒâ¾ô…Ó*ÚÓ,€iŠ¡SùŸ—gP¨9Þ~2¦Ñ×hÛÍoü嵆«‘˜Ôiý[Yø·Iðew„M~B$Àû'³=ïîÝŸO.ð WPúE±{ï·®jO¹µIƒ(z.'6>ä1Œ<Û—Ñr¶õ{ßUqI¶¥ïzè‡5H6õ0³±9t>¼ºùë'›œ±½AêÏQêˆGʘúÍÇ.cçùþ9‰Ÿ‡º„¥öUø1G+,"G„=¨'™:4.Ì'&þh­ö|+ï ©½h_I{!–š4ÚAÈEºq†L>QÙKv F€ RƒKSV5Aà±-óˆ¯FÂ7M/ÝéÆI$‚žÞ3«ß5ŒtDÉ[½œ6nñ¬4›êÌ›8Ç!}ÕEKÒXNì¥r–ìösCDÍ'—¶î—udž½ìã5i‡U}Wj›Õ+d[ÓST]ÒM]×vµXªª7rrP;½a¹Á†¦ûæºÆ)íœ3IZS  Ð°Í,|E§.Ä®œœ­ª'+kpv1+ŠN®¯³•mom:íY¹)Iºöê‡vØí’®¨}(—bï:ê’ÞÝÃ4¶Ä¤µT;5j^fª‘ÍÅ.ìГ*¸‹­Ôòw…È/PË•šVa˦ˆxpwD×to·­ãº–‰Õf¬öfEÜó¥—%åVZÌk¨êFzwM‡–je#œç›’ÚÄÄõf¦ª5tÖ»©ôõ,E ÄfdÂ#%mÙ4ÂMð­ê›­”1U;:,eåÈ•!DÝW”º±-Ö»:nEvueÞL‘›[¢H™JâTikZ5TÙrâš!… ØZ·h+S2Ùúo¼¡ëCv÷jÀØbª 9ȦªC¥¯LSÚÙwêe­‘pˆ""gÁ" ÆeF©„€#V—™pJc†¢HU-Nm‘ ‹ 'HZ¦èLcÛa ÐÀ3:€8[»vpÁe`Ää$²4(”:îYŽ0†Œka¼Á{®xi¡|Š…=™™Ó}Yy—BU ÀyQ w®ª"[£Û ¼Ìî™À)à}Y‘NQ±Ú^nÈM¨Uiº„hb¦ùqÅ„ +^l㩎š–IrÆœ§U¬hÂâÕ“fUÛºhsqœMÍ0»`€L”eºŠ‡cn…_?®5,ý@çR•÷VÌ£¨KxÏaœÂ¨ÈtNÞ6óE`à/’‡¬1½á&í‚"²Rôx(ƒÜÅÔ†ƒí€îÔqBÐé¬"râ9Ü úƈVnTòOqí3ÓÓ;ôå)½7Ú™J-‰±¥Ö"¬|~ŠKèFnkã5Ñ#Þ¥°2Ý:*0"& %¥Eñ¹BÛÑõ†Ïht«–X#9n6%H”¿^d£ÒW&烇x5ÎF‹;î[‚å'â <õddX—ñC ª(åûga!‰ar&"ÏB±lz <1û­ò¢µ(Øë\€Øý ƒœ¸ìšéýE­n‡0ŒpM@t Q 0’’5bu+l_Li@f9Ï!MñÙŒú¾Ýhãî q!º B®…x•Ö¹ÝÌsǛ¾…§ïßG5~…Cb§™úaŒ 3 Q‰ËgR:ó/µ¾¼×)ÅAZ¯k€Z¡SYèõ³wÁmç9’t:Þ%– Þ¡ìÁ ÈÚÆP›Nʺ;jç”k•5Èk J2;\¼·}!ì (U,›S¤=k8›{4<ï¢ Ä É«EÌûa×bŠ€ ß3¼È,3|W‰17ªVÄí½ùf³|w35­Îâ (æ"22# ,GàÈY)íGª`üöïsݰbÆs)ä­I5{µf÷0K5Ì TšÈÑ ²f6­5«X ”mˉƒ7‹à¡öô”#ã'4=êçv^è²§PÔn:5IY§¸9Ž¡[Ö¥-ë]p  …U*YÇÒ»o˜2#[»Á IF¬Ü“ ì +¿{”Œ ê´2ïZ 4ý.ØxG¼4õï¤é¯¸^Ê×ÏÄ ~!@åã§-eÞz•a7»ª¸Óûðû}÷@’ §bE¨"N|…sÖqÆŠßGé–däè:ûNÜõ.}škãߪ¾Ï'óÈ Mz$Wµoâý€$ºhþùº÷‡ö}„ŸŠ¼0åvÜq"ľW‰ К‘Ž+B_ nvö'‹s¼Èüòà“Ð|C£”fÙVïû'Þý^Á»Àò …“0HÙC‡\Óâ =VD: îÃU‘œµ•u¹ZY’¶­Ò(Ì+!ƒtâA¼Ü¶ø¹ËÝh |tð"öU -ûÞ“×¹c·­ÌþÞ—”2M¼ªg6l.«ãZÜ÷N϶û1Ë(5[¸h‚8N\ŠÁ]Œ@P¢AVHˆ1>Ÿ6™óì>zl;vhï@,óä&ÜÜk4×uÏ}Ó[ó‰fîÉÁž^е;ÀH÷±…á·Tä±[‰_˜qèÂÕí‘ËÌbÕMÌà! ÁÀºÀÊÍQwq58o† C%lœRÑ0{ÌV$´÷Î=¡†Äz<Ö&––›SaI~½Ò4¾‘š„W×ùÏ->¼ê»™§ö©új7§FedNc;=q¹ŠÆŽ\󪜕ÀŠ†í‹§ûÊ4ÃÂï¹îc‚W^¥°À¥o›Mš>å®ýï .qïJ{E1ôB‚؈€xÎÎTãî¬ó±á×öÔØï¤öPßn_Ì莒+hZÙ"²«E÷Ûµ¡Ì‡Òg‡`]í`:Á‚Š‘¾ƒÀr1ÖË͹P¾¯®Ù§Ýƒà{°»P b‚ÁøOcbØ3Á·Þ„´¦sðÖ¢Ôg.4b¹Ý][y"‘ö¸!¢Uéó ±+ïN—^°;Ó›úGè=cì%{ÅúíŽm`Âoûé>|¹óõúŒÛ{áÆKÄ@ÃqÄ$Ä3z Fm‰+ëþ;wkA9™ðöï 3µˆ*Š,Q9ìûa{T+$Ðâï­î·–À ‰·¡TÏ&á^ÐV¹º>÷}¢³Ò‡ ˆVºÂEÿ'X,jùy€"]™›è¸¾uM‰êÌñ:œ!ì6¥Æt"±­ÔÅí#a\´³ËÆK û…8€ Q\£p5ƒà.UYý·¾Éª8ì‰ W»6ÚxÅ¥( a«GE>^”öõ04 iÉuÒþ±cAD{ȯwé 6¯ŒQ‹V>#.Þ~þð½Ï¦zýf§ËxT¥‹q–f…½îÕÔ ®ÉÐL§ \†c»,# 2ÂÅ­A!º Œ\®1A™·]â5ªë3Q#kàý±@ÍDDWìƒIÞæwV~žÞhbUñª{½¡î›ÇÏ{³[‡Üp¢DåÎæÅª½ö? Ð~_(¹ˆ ‡Õ¸ëvž`>ëÔ…ª¬o´7»Ï0„ïÔû—z%Âçp™¶p-NÞÀ`ø ÁªÅÀÑõgÑæ+OÁX—áns}Dù#ù<ú¼ÅŒ‚Î¥¼,!ÂÒ–•¥ÚÊu)çÖõwwç³:¯³ž®i屢$•‰i€ iŽ"]ªù…²"~‰ðrfN‹Åc$$@ke;3É ¡Ðêo•P¨ÁtªŠÕÙÑ‘6¥¼_GÓ#fæåx“ìwéÙ0N#æÆ#“sHUÀBpLQoæóGÓ½uWìte?VŽÇ÷*ê"tƒî¹™Ú¢ÐÁk_»8aÊÙ„×T)?/}º@ý¹¸‰+ÞXpÝÜ?^xqh`û¿#÷º”‘¥@!]\°÷†þá’ òÏ~û÷ƒüR>õø×ee¬„.pnú³1\Ì÷K³½È„ó¦¢F™ïíÌï{ߨháòØœ†Äá/²RÃd7×Íýr;fèèQã×z¦sõç‡$?µgD‰*äz¯UPÝ 8oUîýÏiZ',ý>Ù#ï+®‘ugçï‡KÒ |¤ÒÀ˜È#v»;U/Uö£Ú”ú‘ž¡)ŽÑu÷{´#¬ï÷®6ýðaêxe—õ"!æ2ž‹úý4™C¤n×ÄaÉc×õ82¾¡@U™U@$Òæ‡Þ—¿Ža¸„çG$Õ¯ B[j 8 ½m«ßç4C¾­ÜüæÑ±3REºU³!ÌúGçvEŠ1ª¬¿]Ìd\Yc2–DM¼Ç Dõ6½ÛeþÜ ËéC¤¹#dù\i7jŽ‰È®Ò—òZ)^û¨oGjŒ"RáñŽáèËÙsÞgáŠw÷ÜOÎd ›KྩƒL=yãï«ÅÍ´–¹¾NìwÈ>»¾Xçì½Ýy"GརœÈÓ€á0ÕA §Èê¡“n8`yyu ÒÒA”š4J…Š…`ÖÝz³<õ¶†¥Ö†O~Ûºt•ÞÓw{¢UÝÊÌË4vÒcFŽœ¼ÎÐú–QmÕÎ=ÝY4/;“-_]f ÛZ¯Z]hSŵZ2Ñ›ÑÔÎKB{4m©Ó‘‡¹Š©ͬ¹áhçnv;Ò©éº[ŠiíÒìë7/§.QÊc®q_#/sjbÔßfÔ›ì’;…[×ýå¾íª'Û­²Û*¬îŒUíáÖ%-­;´^ ÛÌÙ}y•œs]×”’«»“†«‹'+$\¾v0h§ngeôÌ·]ØúÎ[ºÑ9EÙ3†s6zd#;ƒj³­±× eœ³šè[U[ÜzíÕRÀjð‰Æª±^P;C€ ¤2ZQÝ“<í»u Û›ÅYÖñ>eÎó ƒ ê›é¨ìÔs57/(FH <ܧD" 8EWt·Ös*“«M¶lXjg´é2{æZ(œG;ÙÓVÓŒ;Ov0=sÜ̪‚7WjÆH¹ÓÃsg 1b%nÍœ‡ä„h€ŒQDjÇ»9ƒ%—·ZDϺg)ÂÊÊÛ¡´äÒVû+º‚Æ=Ò¸g ¹5!Æ ëÑå¸'ÍQ«^FÈ¢yn/1CŦ”ôš1¤° ¬z4NEâ ˜*Ôa\“Zdt¥ÛC°§}V¥õU¦`%Ð+@8C½m kdbNáBÈ0©Dr•"ã¨Å¢y»” ‡¢@°TŽ BÑ;µÔ0ˆåc,gl›ÅÓxX'°cl%7U`PWD‚ª ŒFGh!´ áA³rádÍ3 .Û ä³´1 ç7yÙ Hf²§lBXVj¡ Ô´.9f .˜´Ð)F\½¸ËjúœLµêÕÓ™ƒ'I¯s/[¸V ¹¬4FÑ¡J&Ä 9ËÞZlÖbD?òýw¿>?Îk¶>ya×c+ëÍ5¡ùd³qmìÏJÇ\¥JRzj+»ˆCs»3Æ9¹¡×BX@‚çÕÏhŽ®¹‹<¢ D|ˆhÚ53P:Yä®ü'qg–…Œ´ò!ÝÈàÉ™”<1ó€'¾Yó¯ÞÏ2Î1|kóÌœT~¸a£$ÔýÉOA;¡¾.䣭”36SË[3Ù§?~÷çœîžÄÆK"„1Ô‚½â޹îÞeC‚\Mx*5H©©Ï%âõÃ:…qyÁ®°šT†ÈBŒéòHí@ìÄ RU9ÜÍZààúÀLA:$ÄS%óšë¯XáyÝÙTo /~K|«W÷½ÖΎ˧;D“D׈îq L*4U&“9©u’wOVgÅ:€Å ûåó>Ä>ÛgêéºÝøÓ[\°ïmîNqÃÛ2Õ¢qБ¤--ŠÖðŽ"jœÍC´¥¶ÖÅøð¡*/–ñª U×ÈÀÍÛtGžBÕb@ï”Ñ`S(ÛB@ÐãœÎ,‰˜†¸ÇÙu§v!ÄAÂ@TÎyÑ…z€)Ôd^¢WX·YwTvtSŸ;Ð–ÃÆY¾aŽÆ&4×ÓÂ9¡ižFßÕTꩽ‹€aÁ¤¤íAyŠw¾aS‰Šû}’'º#ÄF€ooÔ[œ2þÂ(,)‘øVÎHÒøŒKòA)]Ÿ†oY³;Ì´‡H@ü@˜"HL¨'É×V.¿×yʳPyTÁŸb5§­îåÆ u!Fr§goë=»bØžZÈC]®»‚>™Ëu£zr˜IHŒ1œ•‰‚áOÝÙBtGÛnÒ}ôŒrؽËÔ¶ëcšÛø œwNÕ@ZÃŒøe«nBùÀwÓYƒj„Ú¬x&{,w›°0_{×âðõ¸6åFw}±ÜðqÖìæ±Óâ§U¸"—ž5k|sܽPçžÆ:c}¿¸¼oáÄ÷úlàÛ¼>ÒÎiu£IòêHt³c}Ïx#È} l`X7Áó1ÓûwmžèQ÷XÛx]§<ÁAüèåJ˜{À,ioÃØásS¢ÙW¬bÙ¦¦æ¯íÊhWÆäŽäá»içnƒ£l‚ÍÛÜ$ ðÁÓÜN¼‰b‡ þAÙ"Ó×֥Δ$6²V­…·û틮⫞½Ø 3 X¤IŒú2‚†V¡ìõ]Å“Îô`CÓ};çÐPß ‚ÎÍ®ñ%ùg]w¾€=tC˜ËÓt"Hé»õß²fÀ ÆÎÕCYê㦛ÇsEÝ,eÍŽÆ©d²‹ä®[[–ïe9 \Š‹0 ÏZÅÙÇ57Vë~ÌÓ¡Z>•þ)ZÍ qD@v’²5½Y㦂óËË MåÚϼ,qÔ)Ó=Évnfu0pÍ÷KW¢f¨ ³Ñ`«„!™ÜCÝgÔãh 9æ_æYÈœMàrZâØÓ” CëdsÉûæ¬|©¾ñÃÅk~œ•sÀE ¿º,4¾ì¾ãÞû04h÷̆Ņ÷Êæ®[‹îN9}ܸÏà¬a²:9êûÚ)rÇÅ×´Yò6s~ vgf  ~ Nâ@‚ÛQç§ð¿§Äeª~˜xÎÜ`ê_˜L`êРÒEe/Ãdˆˆ…Éú–Ì[å><ûµ~Ì{Ÿ˜n®pPº½:†ÐC±ªäiÒ¬6ôÀ®•7©ñ£;E$‡çÇr¯»6«W5ňŸxL*¼U¨EɈيÜ9á?oB¿­)?} w¾[‰-Í "U#këOL=]©D[€Rö Ó6|䎽ֲÂVñlüäM€VN†£xSÖ ½â:æ)ãûޭܱád]B°¹Éå*yÁ ^P,ŒîkÕÞßb_@ÚªbŸ¹õ¡í|‰é/G#` ¾öìP¿e1ûÃueר"½OÈäšó`惓T•meWweÕæ‡“  C" Ù@>½ƒ¤Ö“ZdKœ=5Õ‡™³–v²#æÇ¥µî˜ëŒoÕ üINeLD|EV#s~­Èl¹öà4¾ÈC–q´ N+£•×áê·ÓÏw®«”ÐFW2¤Swr½ÚëáØ?ƒ‘ú/Ül»ÀÅßËôÈ×yœÐµß˜§jox¯ÂiÜ}½÷æ]8åç€y7gfñÁuœJ;ðVÑ eÒòE}ÃxXwÆ!UsS”ºk1ç {øjÁv‹fñþ½Ó‚9Ø–}¾‘èœuÄÉ^݈Œ[È„A@ùá›ÚÓ ò«)Ö ö`$‚”ÚÛY¥3Ðî5ö#Ðòâ+ÄÚyúþû²Ôô”ôMŸ\ße]©·—m7U§‰]Ý..åÔʽ›œÐ‘é鱸L¹Zm[KV&ã3©±½²Þµ¡i´ܶªkqéÞ•#x<'9Œª×ø ÃhõÍogtäËÃLWs“²aÂJeiìÆælƒŒöмÖc"†s/»<ÀAêFH&zèÉxæÝŒê€ÝnKVmNŽ$¶SµhÞ× §.±Í½Í«ÌXjµÉšâµÎo^ é3K±Žíyw³3—Í!I–Þ]äçn9¥^%Çq(gRÖ:ó¦xÄÕí]ëÑ>,½ë¬DäÄÈÃz‰:6âql SZvÃN¸Þ45=Ì&xÉÎØݹ´ãf®ìIᢱh$‡‰ÒgUð8ÞO[Ì׊ó¬fÞÂó/e”JÄÚ:cˆ`Dž©:†Ý“ØèÎMÍÜÖÇT)sEïdåL+­T^¿¡<›x363,1èY2´øzäÚŽ#xO¥íÙÞºc‰q¥õEõ%QM£à´PÉËÍ»ÍO‹ôiå5sË’‘¥uïÞÜwk<‡ ŒìôÔ§b‚‚ÑRtf†”e¢Á´Ñ*Ëm^~9{¦‚ÔB¹ñÖ€¬P&Ô‚bo2ØÀ Â’E%$$ Ù¶¢à˜»jƒÀí“ pŠ[± AÜíQ44h93ÈÓ"Y•Ðâ,K±-î´åº*k–05D5L(â¤UwZaeŒ2!Æá¬åf´›JM»J2˜er4L± w8œàV4L2èÝ’+ŽíâÙ\!ÁN;1ÇYFœ¾:SÓ3<÷•î†u›]³w¤ÝK½Õ3”}î›~ßyu9›oiîHfÖÌ˺¾zAºº;Âúk§ê!¹y a”j¿ ‚&ŠDÝ] qV««Ï›Ôc{ÖÌu¼˜»»šè/¡UGfÇá»S>< ‰ЬԻ'‘¬(©P-æ<È.ãr1¿ÙR-{æÈÀEûì‰~Cëˆöƒ[ñ¨ÓAžö:ößíˆöéà»å³«¾Yñú`T£› .ý›4>Ì#êFÌ/ªÊ¬žvпŸÕ¾sîÑ¡/n`ÉÓcÅ3ƒõP8<$ö.">‰[BCB»×µgO¶òèZ„ýdúU×LØ«å;‰]ægsª‹Hm¨¢$’ÕdUÆA‘„¾SÀñ“F²i.ž–îÐ3HZÕ–ã;–:¢cUf9+ž€4o­Qc h±w}Ó$k+aËÓõŸ(*„V½9J” Üé,Ýø¬ª.—µÞè0óìGˆ]_4w Œ勃Ã'> »~쯾C¡@M>¦ë¸ÉèÁŽbµf×]JWÁZÏo;gsß ùõyrÃà7>ӲܷíûâFGUˆð^3Á¿2˜nn— Èý“í©$æ®ÿ ”0ÕQ"†ˆªAª,nuS@›>Ñ:è#~üy\Ìø6Rú˜¯š!ÖšñË`O8ÓÖ}'7Ê[Ô¿`³—Ö„×ZûáYàú¾êðôvÄ®Àï,PÛk|žý ½œ°hóWƒ§³ÐjÙ¬”Ðöpݶ_†×¾$©#:‘ë–ä[õ[Þ4פvnýï6OV¬‘õ^éí…ÑB820ÊÃûåÝ‹¤D ¹§†3^Í¢»" ÜuÄ@ …˜ô¾rþ‚”‡ û÷Ôå®Ìð«ü+ð—Ý;‡äm±|ÙÓSÌÞvG†DF¯½‚ô{W¯ÐŠ•Œl40súsßx*׳¦X“›û*TXدDG÷3Ï  H×Ù¶`Â7}4 ˜8É["Ç‚ç+¯l{'ì ì:,¶¹¹÷lÂÄ=\åÐ÷¾÷Ç>ͣʈ‘)ð7ûèt ¨Ìy›û¶Eºâ2Ϩ<žH×Úë†Ï_uîÀpvIÍÖÅm+2½<Åžº½êê™·z@¡¢ˆD@ë@IýQ›€L®#Ä÷•ªíôÅØb0û÷‚õ•Äïçô QÈ6DãÁœ­Â6„Ÿ%»c´ãc¾)¬ì>k¶ô3l` \‘«¬[5Ñ¢d …Œ—έÁÊ>ú|}8‡”næ‰íi¾þyøÞÎî:ƒVóÝ¡ê§áK»;ñú£Ú%×ï¿­QgY8ºñXÙDÆ_ŨÖu…ˆˆÓœ!#;³‚ö’iùöÆ»„<‚ú|;WÃÞÙÆê¬7–e~yñ×}PÄ…&èe*ÎrH2Dã¹¢ w”%‚Y†3ºŒøžê²Îצ6 ¶Mà&ßY¨(„Ô9Õ yýÖë>²>À½z/7e ¾á)9 Žõýìw›wá…ˆ€ãÈO8ÜöXï°%áXº¤#ï Û¢Þ£Y9>îö›Wþ_§:P„à—E|…¯ֲɉ¨x/¹üW3ÑC> ˜ßHׯÃÄfZÛÍëLÞWÌÄ'Eä¦wÜæUöšÒÕTÈ—D»º™£‹sÛ/òV'2ÉÙBÀT2è1Žg&‚I@Fl—HºélÀ;ã¹wŒKæjÕj¼F"䢆ia`ÍBpTY`f(£5×4Òœ0 졾wîÞw Yqë»#Êc¢€ªžÕgm.ì®ùøäů›Iwæà×ÀÆ5–2\’´¨Ø¶cQH‰ÄDØ/„Ã6Ð`Ó36ÌÛåçß¾Õ}>ÖrWÀg:AŒ-uMÌêÆôÞxb¿!#|<Ë£cå{ß{®ö&×°í Ü_#[[[u¹•Ú®q×<ãTöÎë‹cŸY­AËh¼¼Ð4mÀT —øn‰±¨ñ7~üªʟݶÿ9;·o?]¹¿»""7]TèW®ÅqÔ½(ÎŒ÷"6Ï{k aY[}ðôk¼ÜÆyðÒ±Í÷^ê zP¥œ?zE¾ÜЮl3󳙟²tÑ> Íë£ó÷¤ý”Õ97kÕ¬}=úÝ ŸÞý$i“º‚¯ìöºü~edÏf"¸ôöžÎf™–Èÿ-½þ[${Çbr«@ëET=×U›Æö+°××e&Úz³®z ¹¯\÷“7y¨ÈÕ2œ&"OõRôœÚ!ÄFöyÌ·Z})ôw¹Õë8†¶û±v!†±ÁÔŽ¢ 'RKðNœ%¢<̺½»tœ¯Û‡´Nd€h”_÷Ò@ÌÌ>˜”cÓuUSb—ÑsIpèW¼3yùu@ôû]ÚvÍ=1 ¤C ì¡@ ÷4_  ï{g†¤¿\úÐÏMVïË1jÎTpP¦³ŒÜîIÆ,_¯’ç—Ø“Pÿáþ>bóG Œ±×ÔBœl%‚X- »J‹gWˆÄÍ1._fyË–‘•kšHÀ–Á8(\ÊJ¸P‘Ù>Åš8èè7c(V om H¨&Ô—ræ -·ï*ãã’FˆE›¯@ÇÞ̼ žÜ}?Þ@} ¦èaÇ‚ÝR5Ç•Ì{–Ú|ÁŒ`«PJB„_Ûv0ÛÅB„æ:h2/g„Ïh½Ç=%èΩû­ÌŽBnVáYjéâ=¶&Þ©Ú&‡v:·£‘(Þã¬éw½œVÖ‘OP“rµÝNNî_ î\Â8²•ª§Èó*•Œ¡¬æ·Ô“”k ñ2 v)”êõÖW •KŽjv†Uô¾3n†í\ÑO¤IÓšåßu¼6ófGì¾ÜÛauSÁ’[ÚÚÚÊ}Žv©îRWa³/žvË®´2Oea¤:³׳W+MfMJ;½˜Cκ´ð\ìÍurɺÁ/¸U•‚g³r°ñå±!; ß'µ¢ÝÏl®æw¤<î:ç–ʧ¯B¡Y1“QU–¸Œ[Ó”jÞuÄÕ€·<“›4—B˜ªbõÒ©‚µõv‰¾áæ!5Q×#”˜‡iéžë“ViM$qÒ…‰ÎìàÀ¢/†Un=ry:¤Ù²k$Y§[pG´)&ˆÖ§¾ïvú&©*é@ÎUG{¤–:VRYì/'cpO«°Š¦²AÌ~Šmï·Ó´% Í´©o£Œj¨.Ü!öNÊ”béRߤaîÝÙ\­k½˜CLû=²£=ïMTö]î{à3"<FÄêòÞgOTÈYÆã7z2á˜T¼ˆe‹Q ÅøÝ4r @b‰ºË#5 cb öžºªJ–À7JnøaéUYµƒ6JéÀ04‚(È”tus– )ÁæS#LNa12±·JV[j%¨œPÚäÙŠ¡–°hÓ32N«+IZAÑÃÉŽæ.I-u8˜†¼`2&¦¡Á1u°L”ÂÛÅÚÁ2”ØäÃMÅ5ØäÃÖZBé”ML²ª-/ :¢# í¬¼f(MA€F«91xæÏ¦s*ÕF±o²Ö~’sõψZ…eì ²ˆÁfm¤:ŠEŒr^&ðߟ@û¶ùˆ‰(¢/ÝÈ^¨ ÓPìêrÞ×WHö‚Xñì¸ÝM—3Z s°aC~öz*‚ QŠ¢½.üÙnï±Ý<újùø–ô´m)óï5¶ -J½5WÙüíÔyS*µìÄô^Ä@Üîô €ƒŒž=§yn}J (™áó>ûóš´Ïªwä9J¤EpJ•ŽR´kϽמ|ÛÝß:9ÎOº"  Ázêç-W2ã'UV~¬ˆÀêø,’„IòÀÛˆBÞGš]··­mF¯o̪&¿e¦Z²ˆ'å l‘@Á 2óÖþ@`:4Rú–ŠŒ|kQ¿N{Ö}{ó©ÞÓDÛ/i¸‚Zº°šg,Ö:™G€¢, IH 9Ø?|}Ѱާíšx$É5›ºÄžþž›Îi½5·ìÆ ÙX:Iž1odŒ ,ÐŒq[y"MJQˆrJ$^ aqý±éïà³ GeÇqY( I#$N*ݵ} Â`ÈùðŸ‹@’AÝRQD‚:´C¸£OU@Pl 5dÌÌ /ò׈æwñ±k÷QaPÞÛ‰ Äâ•o07tmø²K6]N²j v•¡ À„J‚ÊX,€HD˜²žd:µZ–ÒϪfk<èyœ¶²)•PR´º 3¾æ?$YCÉz’'MA$4(™öúÝåÄD8ÞH ‚"”%ë UÌ­’‡®FU§Ÿjw“=›7;J˜À‹"'‘08D0coã<í…`4à¾%|iZ3öëÁÐP·³,äb¨8—6dAªŒ”I`H9ÆøfàOí£âɲ“QŸ,έ£yòÇ0ª‚‚ÖVDí׃„`“ˆ" &’>ABÞo]² ße½=Ÿ7ÊŠÛDr×*|JÅ(,ñ¯7ÄóÞ""¹J¯—¬ÞQ$‘`„Þ"¥âD{—­Q8¬éd@QœA$GˆdQð÷ÓòAá\F‰ñÅg‰Úyòñ>•'¼¯”mÎU åõñÀ|§£4:h/'Ъ+¤lÔ#Æ‚4rÅ'‰FkÕ:ñÐ+ x0P¬<Ø©j*ø=PH Ý "‡Äo‚49…ÄÞbm’œB|ð9åc^^ȇŽ×0$dDD–e¼*l á DˆÅOêÝ}Mi"lBOZÞæî"n\Îó˜uC7):ÛÂ6Ñø’ú,üq¿”ð ~ ¯¸tqÁ_`-^ûÜÍcŒOÔ/sBñ¸×Ù3=9d—'¶ô´܆ÆÔ̯'Q»½¨==ÊÁŽB†Ýî¹Ê,ßX ê7àåï $5ñÐ|E üþ¿FèA yë€"ãèZgòoÁN~ñϪ•…Å%ØÝ-HM¾Îcxš¶ã3ÛÂid`v(=®doáL`C~}øÖ±-G¦3½½ò0ÛÑXƒFnì\¼©Œ¾_­b‰Òåmt‰Ç*â#…YÞµr(8{Xƒ›³D,6yØÒŠ}ôÇI¯f;°JÑaPì(Ï`…\zG}аS&¾aŒ \!àY`”ï O1¤U<­Ïªpõ@Õ€gÇyOM6A‹šÉSg¦½3š“šžVÏ`Z¤@‰g‰êqøØAÕÐk£°>­€Ã6,9§ÝѪô83Ti@>…Ê1ŠâoéõØF¶3Ý/Û~V’rxªÝÞ ®oŸà y žœ>èãt}½áíû·>¥d!}JÁîD‚ScaŸð§Ï(¬ ~¡÷à¬"pbTÜñ FX§_ÑR³Úêæƒ^Aþ)+…rü5/¿“µÌÍje·#*Ø»6~Yñ»7³­Æªû$HˆŽu“š!¶ŸôD‰Ò6〸z´k—ƒ ›þdiÁüº°.ˆräŽftuòÑm‰\ë{åKÊÝî9Ħ`Øøî^!€žV/ÚĽ±ä4«;½rÈïßt <@#ϘÛ'Ô…Ú‰ðó±ªÚkœðÄýé÷Öêe l¤Ïׯ'tŠ9—q§g•îÀ$Þ¿;â@Àõ®o‚0]@²Îï Í|²o”š<Žíg„à&››ÍKàܾôøøóÚÛ+gK‰!ÞX$|a ~íÙß«¸ 7Shþ´;‡ˆF™<­³V(æ—Ñ»>¯`U»ßlØîÝ.T¢4ùèT^+èµÍœ³»å]»F{–Jê*¹V†hÔ™]§0<­Íb„õ¡¹ÂR¾Ngg®}ˆ97?…tòºðSâ|íŸ{~]Mòx<ëã÷‡ÝŸK¹Üœ—+L¹æâìÝcžöôv.?HÂ[šÏûå½[=ögš&¼H¡@Øb~]õQ²^š׉ÝÎ7kZÍ•\ªØI2_èð?Àa“»1PVE Y‘dE$‘Q$I@ Y‘ ŠT$YV@P$T@T ©pT‘h )?h¡¨”,A[€ E! @!8‘¢£ ² $‰$‚F"‚ªA€ €$ H€ÆA’‰ ¢Edˆ¢ da² `0‰1HÁ@b@EAA‰`@` ’#Œ¥…‰ ¹l$@ŒŠŠDQ€ˆH" ‹U!bÂEc$"‘‘€‰£E‚ÀbŒ‰dYB´ŠAa °(°QE’#*®RD£$°@Y„d Œƒ +H£("F* €²B!$bX’* B*F0€1ˆ ¤H À T)Œ„P‰02„U‚„PˆÁId Æ#‘ŒX Œ€ˆ ˆ Eƒ„P$RH¢²"Eˆ2"H„" ²AŠA@ŠY "1"Da„"„ @DD€ÄÈ0‚ňÂ$@dHE"`+$ƒd$‹ + ,"Å" #D‹ ,"É’E’ (¡)  DH#„  ""À`ÁH,‘ŒP$ˆÀŒ ‘‚ a(HƒU€F* ,  ÀElRQK‚©„‹@) *¤Š²H H¨Aˆ+$€Š„€Àˆ¬A‹ E €± ,„Y@Dˆ±’ŒD`ˆ’B$ˆY‚¨€’AVA@‘DE*‘¨@Å"Æ$ˆ° P, ¤"D’ d!ЍÄdH£"HE€"@dˆ b"$QREÊiƒ(‘#nšF+B’‘H@¥R@ˆ„E i ûÁÀ¶°afeµUm(‰EµIdµl¡BÒŠˆ¶ÔDddD¶Ð¶ÊRÚ´…%"ÒÖ–ªÙm„Ë(Yb%)Km)e)mD´(ZXÅUZ‹mUTED´¥–Û,ADU[jÒ­²Y-´²²²ËÅ\-c0¥AX0Zª"Ö eˆ ¬ƒ!HBÛm-[m¶Ò–ÛkÂ+‹dµ(¢"ª²FHªª© ’Ëna† ÒZªªªª¶”¶Ùj¢[Um„„–RX¨ŠÉ#ÌËj"ÛX KJ-(P¶¢".a† mUc"LY,™ Ûj" ‚ÛQ2ÔL%)Km¶[iE´”Šªªˆªˆ‰KXËjÛQ-¹˜—2L’Ú¶ÛUlµk)KjÚR–YiKe–Ú[iE[$”¤-¥–$H«l±-)dµim¡B–­-̆Y l%¶Ú@-¶ ¬ƒ ˆª¬ ÂÛd,ƒaj …¤ @¶ÒÚ¥”([X0ZRŠ’$„Šˆ‰m´¢%)K`HX–Û$€fb&R–ÛB‚%µÛK,DHD„TKJ2 ‚­µh°²Å[jÛl¶ÚÆRZˆ‰d²ËI H1–KUƒþ®[d’”¡Ùj"[ÀDAc4À0„²ÊÒ”¡™˜€-µQ,–YiEUT‚AÒ–”[aaK,[-TETKj­²Y- ”c)mµŒFH¨Å[`X iE¥%"%µUŒ¶Ò”H‘VØÀ”¶˜Èui¢í¬c ¥(Æ[W2d™"Ú"DDKjÒÕ¶BÈ"-¶áæRÖ )J".RЏ¥²ÊR–c Ëm)ETEDÌÀÀUcUР‚ˆŠ¨Šˆª«Km ÔJ(d Ì´¢ÛieŠª¶Úª%%¨Š¶Oûl3Ð(ËÒ–Õ²”°¶ÉP ª¶Ô¡ Qɬ’, ÌA„% a`¶ÚÛ ÚÁ‚ÛUm¨–”@@TDETEc)m”¶ªYm¡BÂRR*Ù XÊJR’”UV U Z “0¦P iDETE¶ÛUŒ°)F -¶ÚB”¶ªªÛXÄE´¥¥mª¶Õ[j"ÒÂÁm…‚ªª¢-ZÀ`XXXZQ"D¡d–HH[m)m¶ÚRm”% e¨‹iK m(«mU¶XÈÉhP²°¶…(ª‰mU¶Ûm(´¥)e–”UUUD¥¶ÒÛm)Km-²¨Š¶Ö )aam²Û1†L”µQ)m¶ÚÁ‚""P”¥%(¶Õ¶ªH$ La“%¶…ª´„²Å²ÕÀÎ[„Ž%(¨”ÑEÅT»i J¤ED¥´’”¥¶ÛJYÚKm¶[B’‘V–² ƒ ÈZRÙ,‹™ Ë(PU`Ám´µm–-¶Âé3 ËeŠª‰iK,±VÛBÛJRÛj"Ûm¨–ÔDKm²ÄKJ(ªª ”%ª¶”´”Šª¨ˆ‹iK-T°¥ËjªÐµie‹iEc‘‘Œ¥¬--ch[m´¥²ÅDDU[(J€R”µiJ""ZQm’Y" ‚¢-·Ba‚"²2-)ETE´£¶Ûk bÛm(¨ˆ‹iE[D Ž˜f[iIIB”´(*Ü&eÂDa†Õ[@ *¢*%µÚ¨–ÔE¶ª"«BÚRR[m´¶Ú´¥ÅTKHhP´¢­¶Ú¶Ûn“a3,nÒˆ‹KUƒKe™FH’ä²ÊZÆ[,[m”¢­! V2Ë,°)J€X0¶I%’H‰d¶ËÀ[`ÆP…ªÆ[,Z±Š´²Yl´`Ámª‰mD¡IH¨‹l²Ùc#%µm mTDE¶ª­µÚ€ ªˆªÀ`1”µm)dµT"ªZQËj#¶ÕV Ò–¥)D‚Am„°–… -  l¥´¥-¶ÕTJ(--D[j¡¥Ûm¶±ˆ–ÕDU¶YmTE%¶ÚÁƒ«am%«Im¥([@µhÀ ¥¬b%-D¶±‹hP¥¶Z¨––ÒÒ%-°–«InɆ –ª&fc l–E²”D´’’ bÚQƒ j¢*Ò…\Ia“‚ª"±”-¶ÛVÛiED¶Ð²ËÔJ[iEZ(ª‰K,¥«iKJ ‚¢XRŒR-c-¶’‘Ùbå(¸Z‰JQlµVÒ–Xˆ«m[mJ"-Ë,-¶ÚR™ 0[j¢-¥Ú«m[J*ªÒÕA¶­¥([@¶Â”d@ÌÌ´¥¶ÛBYe!j"ÙjªªB$%”¥-[m¶ÀµVÌÉ“$€¢­ VÂË-(* I$–ÛJ\ÌTEÀ¥),²Û– ‚¢d°°¶ÚQm¬c 2-V € ËX̶–±ˆ‹’ÕaEËm¨–Ú[™† e¶Ú´¥-)e´µŒ¶¢P¶™2 …( 0•`ÁV”¢Ò[JRèÂL ¥«Km–+KXÄJP ¶ÚÛiJ[,²Õ¶¢1Š´¶Ûm¥¶ÚZ«m¥«`R‹KVÛBÛ([,TTKJ[X ²Õ²ÔDKjÙJ*ª­µX ]Âf-–¢P m²Æ .sÒ‹mc)d²*ÚYÊ-U\%´¥,¥)-²µ-¶Ö1‘‘l m¨ˆª¬ƒ ‚ ˆ‰aj-¶–Û B[JRÚ‰i AUs33&EZZ hP¶ÒÛ h[Km´ QŒ²Z´¥-’Éak¨–ÕZÆÙJY%´µŒ¤²Ë‚ ĉ, B µ€ÀÂ[aJ …µhZ‰aj¢"ZQ)j"ÙB‚Ûm–Y-¡m$ R–¢*%µUUUm¶ÕV1l”¤…¥-¶Ö1Œ´¥µÒŒZRÛKÀTD¡j"ÛhÕZZˆÁ… VË ²Ye–Ò”DZRŠª¶”¶@²Ûmª¶°JZ¶ÕD¶ÛUXËIIe„a 1ˆˆ–…DV`@AKj&fe¥-¬e–¢*ÂZR…ª¨–Õ„$À!`AIÔA‰ H†ß¤â”?˜ŸÓü¯ù?½ê5‘TK~Ú¶?Kn/oïÈG×ùëüü:³;Â&Ùˆc%[iŠs]ýk©£Ž€æËæw\æªM*¶œ×òÓ$*¢3w“Nû0ï wr§þTs”•H—¤TIs§ªlÞ˜ïÿUŽ+f`Úf Šı]ÓÌtö¦ Õ¹;¦ÒÀ$ Îã±áŒvq†Ìs’?¦L‰¿òó¿cH¼éò?4PðPV;©m(TBI¿%-š˜0×·ý.Ü]Úv|}}ø3ƒžÝdüuÏ?­·ƒ¿ïÉ!ž8ã˜&vù–Ì=ñþ(^Ÿô¬^ƒÒ<ãÝ~³Z7]Ë*Š>{©¨óÞ4)˜üû˜jùûë8\ÓíÿÏN n¬öã.FÑŽø2¯aíâ"Ź!-o”«ùª¸VŠ^ ÔxHb;»Ï׺Îrq˜hÖn¤sî«ã¼Gß«,'k%æ,`F6ZŒ Q aå“•}½ò^äVX¿0Í-snÜ¿3γº¸Ã@œ…ÅÆa€´_Q&¥Í9É‘ T,Ê«V R \ϪL€äV .­ÕFFŒº@&KAÆ„óÑ÷Ó$×Oß%}h8Û!5Äëµ2˜Åu Ê«uiÜÉÅ%1 #pâA µâ[óL—:)b '/t<ØoØ´Õ±–”EóõŠÝÜâNéÉôûvJéÂíÍ/!æ''M¸X~“ú¦`¼U­]e0þ`ŽS4ZweìNàü†p<±}˜–H\pj:ŒoŽ sÍâö:¨ÒÝŪJyñ²tê·šh<Î2ÌD8­ @ÌN\_j9<Á‘”æ°ïƒ YHÒYAYµÜU°`(°þ CD9˜è@N“KŸ°ÈR/¾öl}‡ðû¶èº G—R–yrÜ’@ŽÊHHr9ž5áò¢2O5™üŸ[ÚîбTœ®å û;Îeüû7§“ÈA´1-5çëÚÕd*ˆªfÍöÒ⥪j^ô§”V˜¯F,' üHƤåâŽå×e”Vü[º ³èΤ®zÄ‘M –á™k¸X–y‹ÞÌ‚,#µŸ N4ç>ï&³­'%/{B¯žC×yÎÛº DÿÔq|8,­Ã6bÌʺęªùê|ì£ý‡±Ø¡£Gíô==dJÖ |‰ŸCÊ4(™è?›Àp¢hcôÁ‚€¤â­ XFÀV RŠD¨¢² Z%I²~IÕ›‰Ö!Ñb$P~7Ùàï°¦(¶ B;tƒc {) l¦À‡—'*¾ ²"ÖÂz;Ç:xr@¯ç ý«\3Añ¦H¤„†€â‹ä(Q‘Ÿ€ |åÝjðp;°MLà7=ìÒ»$<¨²T‘ìTâ(EMF¥Ko·d„ð£ûÛ‘0ò¾íº!ä(ž—àR.Æ,ô„‚ž *…¤† öQçP †~MpP¥ñ¾þŸ•?CN®e&«¦ÐïyÏÑdº»ÁÔùÁÍÀ„¦<«0˜RBFH0Fvîq<1i'ep9Íö&öíy¤S(ãáß釻ӶÓ5( 30Å Í0ŒÏ°Ýð‡âå4\#*'àgÒV̈rOFL<†gžù‚æà9 ‚¨%xwa@dÒÁ`U‹lÿ"B~ý†Fì¥ ‘`eN J‰!Aj }…ÓA®ÎSp„%Ê•„¸ªåÆ£àuéý<”¦ ÷ŸeíÉFxÊé—®jÙ-AÐ qø~¹ŒPúÙ=?cç?³ébÊSdèA`‘"éû•&Qè[á ;,LÀÓCíÓg@•–-“{Z÷‚ŽU¼ÁAr‹ÕY¬üQñç³æ÷xÌÍÞ&uÂò&¥O®ô|í‹ÓíèØe:n=ßGm‘ÜàØÀ¢Šu¥¨ ¬é¼ àžVT7W€ÃÞ=ÝÃ~ D*5ŽáºXrÐEEŒR@B1‡!)†¡Öa(sÙ`a˜$•ÜÌPŸ‚†Lœ§7‰À tCª§˜ŠŠ<ˆ*5‘U Ö€-HN\}À’e¦r¶Ù줊oD ƒÓ9À9i¾…HæüdëñY¤ðAOžÍ9‘ I$! dú1¨z›Q°+'‹”ñ¾É#áT|x¶>,6æfuS~gK„—u"iò€/a¡éÏ¥ÂPö—§t¡åà9uÚ'ë´ÿ¿}ø’HûObë ðídp˜  ç…O?±GÁÔÉ× ”gÈáBÇA%¼€Ûé΀µØZüx0¨ÒšÃÃ^6&ÎͲvZʆ͇^Îülf¹»¢Šª!u¢¹)oì|4è4vˆlvðDåbb{àâ•=àw ó#ìÏÔ€ŒR*åªkSZ¨@<² ~öO·çø¼N‡'…Øܹµ,/|Z£ŒDUøïÞɾ¼6U9aè¡ÅlÛV\¿¡–Ùn˜ÓñS˜z~ñE†ôh|ÿ<’h¶©K“îÄÏNZ¹·‚C¿«ŸK?3ê°ÓnÍNíÇé v©–‹I@)t!&®œmE’@„!–ËØ¬¹ì[ãˆ<—<¢~z ¿†h$]ò–Äm®Ð)ó–‚0>}ˆžH N*L@ÖHbDA`†Rë!Ô¨*šŠ®BHE„D‘€¢‘@dR(¢ÁQ‘A`ª(ÄX*¨«UAE ""¤EIF "ª¤R()ñ*¨¨±b±€ ¢å”YDA"Œdb‚," ±X2Æ  ¤b ŒQQQXÄŠ"FH/I&²@ðA 2˜ #PDCH(¼˜´Jˆ!Í=©D5ˆ´FDSd9€*j ‰Ô¨ s^¢‚:"™‹¢"¿PTtÁ £! § pGpA‘¢TTÐõH†¹ MA=ŒHÄUŠEŽÔåXñº%d„Ò‚¢äqùÁu[â€"Pé†@2t'ú”Ïféhžg>Sré$Ì0{£˜AÓX‚ ðAGNRH§ûÔ¦!D¨H,‹‡iЀÚOÕ‡ÇO“|<Ä>­ƒF¥=kEÜÍ6@Á$úQ( ‹¨!‘˜jh’€¡ê?±êHæÎ64¤“’*H">h͵DУ‡NõÁ š"Š,3úXI&+ ( )BI„K ê°áC¨lÓp&ူPPP‚ ”0¾Ê}¹?!Ü•]àÊÆ {±¨õl„œ `OBØRÒÐv3ðxg¦Já’ ØÛvH P!DF@Y@:ÀB¢µJ‚’ DEPU**$вEBE@¨¨TQ@IZŠ ‚¤ˆ’ <]íí­T…"È‹FTda0­b el¿‰þ¦Ã9™˜˜]!ÀÊF"(“ñù½pDþ´–ÏE…|€¢$`" Ì €ü• ë—'éü Ø{ãc6È‘€ "ŒºÙ&þu~PøÏ·‹Œ,+6K.‰UºÆ%´‹PÇK™€¬+€¡Èsøì¬cÛYh3’';BÏð­Wu*ú ¢ev2Ž\;ÒBK ëç5`mþxé¹/ѪNƒá¨`„šq1“f$‘P¬3IÅôÏ€tÓ·}´} N0´%IAd"ÈÀE ð"±àW³è„;Ô?ºL2Tr„ÐÓEé'Ëp—Wt”f4èÝZF®ì@qAÛ¬€`|Ú`ÐÊ0 ²\¡GlÒ¯äLêßN2 ýH…gÈ6Y÷\"ƒ´,bÀ@(¤AX ‹ddUU$ü~ÆLÏe‹0… Rp,=€Yµ%’Þ‘2.ÿͶuüᣆŸVNa…D¬ª'h5¡D&–µUP±ª0¬Xe)†PÅ¥£qÊdgé%ß©98O°ù ˆ{áNàìúÓ qŠŒd?ÜÒDŒ§úd b¢‚Á‘Š©bF!‘Þ€˜a0^ñÁ÷úœHCuE«oÄý~½éN¥­Koä«,‹mò’™{¬Ä8˜X© ú:s&³øã Á7eœÛ$ºÕmÓCvÆò c£ñä@<”^§0?EÁ‘-&² T  A„„‘ñ‚4ŠNÁ´çœ¹÷ˆ/&16|vf|1Ä tqÄ$ÝQqJ×Ϩ7sRc©3lHXÜúÌwÃ*‚‰‰–BDaP„‚a¥DfÒá‡;ØdQ^^»èæÝ&¸TPá i‡$Snx>NPH£1ƒF”¨³pï³Iì±!B { +YL…Æ0(ˆÀŠªª(¢ÅQTb ¨1b‚*@X±@‰í$¬ŠÂ1Š$œ:òB ¿I™dèû78rÌÜ®ÖÄ6Ò8’¢ÛDDµM(R$>M- 1ἆh‡.*›±„y² ±d¡‚‰%€g@l É$SÙ!9iê*JeNBÓû–PX)  ƒKÔ Ž  /ØÉH Ü‘@&²•qx¶2BX‰á³ß{ÉÄ?“Ût™†`BH0lX´ì³¢aÁFûÚ÷˜f38 ÀC¢H ©Šõ * ¤ˆ‚‰ïXå´ªîJµŠÐˆ¢Aˆ„dE‘b(¨"‚ ÄŠ‘THŠ,$)€Š0‹c‘ˆH¤‚AÈÚi1 †Ú]P;«­¥Â'Õ§í a@:ßõ6XM«OÌž}Ä×dµÿUµ‚~†,‹$%E!"ÉA’"ác’´‰1Ü=8º¯e\zR§÷BÈ`¨¥ô ‚!?$õ•'„YÛ}Ä …:Tš÷Á% ° QýŽü!‡d’–e'PóêŠjÝ&N$“‘ÎI Ÿ^Ív´.3/¼Ï"úÚ[zÃh2*¢Ä¤ëšm`Õm¢±­ÊC H%¼Ý˜Ö²Îf6ï4Âil®Û»Ó0ê#Ñzv(ã½Y&ñs/ô¸äêÇ4¡)§c¢¼0æžiÔ‹cÊF®cÓ´7-¤.6¸S2h™å¯[4 · šé2Ç晓˜a[tÿcn•›Ö•Á­WTÆ¡q†[Ч#M½öN¹&2-¡8uy‰9ËžfÏÕÓ‹ùþ¹¹Ñ‡&¸ß$0Ó”åãn ”û)g <´£U²Žg6†­Û¿[¯A¶¹n× 1 É2˜T&KI ˆÌ…–Ò<Ù 3_œ¤„޲)Îl\»\™af&ábÜÍѶa…µlpìÓuÕæÌ¬´FÄ.Ë.S"Û“ÛA¦ vÜÌ„1é²$9ÀÎÛ½Z“–· À©™”¦E„ ±ÌÄ@6b¢Eˆƒ€Ÿl­‹d‹bP%ŒE´e¶R Uýšà‹U«lýŽ-RÉK`)ŽDå» 6æfJ•R´Z¶YBŸÆRŒX ÄÖ²Ô±Q@ÄE‹+KGö…Ì­e>gÌhW[™C jÏÈCýRðÑ9ñÕQAˆÞ~tÈ>° d‰†gò;váwrN§ò œêÏö÷“Ç[³þG ¬Õ!·K*Ø–Ø6.ØD辡ÈuKBÁ™ìøDf3øI= >Aý˜g$œ"D)ÒY AÆ‘èÕãK€‚°-.ÄL)Ô¼)é‚É©0t2µ¨Ãú![K¸yÑS%*OŸF NáovÄ&P¡–¢p ?Í&ÈÓÄ)œÛÉß¶ 3RR>ŽnbµJ*¢¤Ð‰­6›jØüÈÛ†}J†…ÓèµXû‰d<À9(¯!aÙ%Q*»Qo¡‹äœí±A>ÉÂ#Dý ± Dì¦Cû0œ'œKá)Ù1¡ „–щ,ŒNü÷ÈAózü?¾x{äNC@âÃ:{Iz5¤Y ö–Ò²°R°2€J%CçÜ¢H…Ñ"%ïœÛ’Ù Ü“åÀðyã'X{Nu* `Ö… & œ½ëêK÷æ9ù¢©ú6˜.4YuˆV§Âfr!™ .<Ç[’"%ЧÒu­ÃÕÙ ¤G”"4££°†QV|0SAÞ«¬tIÖ8´ºy’Wã¹f§<špî &HUŽkJ—>}$‘•Fã`È~ö•UtP,6Úœ”B¡(<¾Ç0ìBŒš6Dlñ‡(‰U«%Q5‡I ûkН¥™]øwÜð¨è‘„D´M~hè ÿ ¬°14ë}/8[[>óŽ^'žgŽ8ˆbËÂ|9~d¥-IS%ûÌm1›s L¸ìtâÓÙpHŸt‘­ÁM©×°õü uí5#–•xÕõ÷-C×…šØA¸¹ þú€„âªËUdS4A> )ƒJ©˜ëNÇG´AEÊb¸}¦¦n’Nœ('¹™ò8’«??Vg-z¹”®×¹aÅ ‘s¨7×6w“gÊ7ÑN"s†„±õIÝ”Éä*6…ާ«£ƒ{ïE ˜Ê)'iƒ&Ž!0J“S¼¡+%CËuã5úOÇ x3î|¤ß, Èq5†ºÈŽá‡âóŸ3çf)Þï[±H¥aR²xÀÇ—Ì õLaYÛb¸Õ2ñxw;áœvv¯w7NŒž®  ­Òym8R©¢’†Bݤä€Ú¬¿‡ý óh·þ(~lâÍÿPÇò‹Ÿ®?´ 4w«Mf_9ßg“W6ªyæÑצ¦ºâî'ëÏE9|?Šð xCuGv0uÛÅ·ªÛ‡a²‚´jÐÁÐhï>¦*4ÃÙ–™2;¼¦:8ú×™a>ky1&L`ͺ}GL‘<âîi¬c=¥<±LD|dÀû*¶W·m¡Þ4­Õ®VÚ‰„÷ÝŽ©kMÕwÊvÞй²´IÆN­ÐíÕsLøÓ‘TΛŒLuÈɨASŒÎœ‚ûÆ9ªC ¸¹‘Q|&Êä[Ñr÷Æ“ÕêÊÒhã¡-ʄڥ‚_xó¬D½°Î2Iï~ŸFÝÓ ‰ˆju·åÍï$‰%ÞÂèfC·2V2º®Ù¥NíªpÕ™†³¹¬W©HÈã·0øàÈ”x1©ÙׇºV¬ZÚE³xæŽy³Æ1[$v*vŽb©áû1†¨«N˜~íÌW£]âé"Ìh~µÛ6ǯúˆ°Gï]Øÿœ«nÅç‘ö:d ‡€­è˜çQÞÇ("¦a;·M–Iµ¨¥ÝV“Wy‘žq6Aü oñrP@X6iTüSºñ`˜9ªò»³‰ˆ”òýµUªÓ4"×=” mL\AáPJ\•Áå 9{;ù“whvô}Ü9*Å$t`æÏrE¨ðÂãì…º;ˆ~‰87Æ3zë‚\Vä 2|‡]4rNÎËpäŠîPxÂç³ÞÅŠzI²;‹§ew ;h)H,QEèì“"èò‡éÑÌ-ôP% §xB;Ðz'©sˆíEu-kÝKö,Ãy%¬¯!„ \BÕ´u¸:¥ç{éäÿ‡ *,†ûL1ówr_&¢9ß1+“*îõL§Îh:'D;‚ôE‘›(‘ÜÆÊÄ^Øê4ð0â?}o+ZáŒf~=çßμ#í_Y_ºS£ªïìŽÌJî²y\G[ ¿P´¹ÞøÃPB÷ü½vÔ6@\¦=«ÉºÐÊsžySts¶NF霻µà~ɧ´D® BP°&„ÇTòFŽV£h<âñÒª ž=V-g‹@im>NðÆ afjв0¢+P(NÕ`Ëû#¤ âÕû"Á·I䙯o|úõ¢Œ(6i„•zÇ©fb_O‹ŽÚ4 ðȲå-+o×=ŠTPÈ-«RBä4ÀiD¦{ÃdA×ÖhÉßÙØÜ7umø#ÌBðïj9w¬uì‡LÊjq(õÒSóhwøJc½Ò(>d-›UYÃÅÝ‘g$P/{—¼D»cÒ˜f†A ™#­³^MnZt $z;PI†IUŠ ¨,uÖöò(á&oÏú¯GL\´õ‡„&nGs$Ʋ^%AE!Ä;C‚HÉ$Xèþäh'¤Q²ýùC«Qݤ\¥Vvë0üó>ޏeTúKžòÖ,‹?MO´;cÚ”:.åVý„FÒÌdY~K¹èꕹ! ñëÍ~¿Â¾MÅYÁɺ¼îkŒŽŸ¢H¡Q$P"jôO|trøGŒP(YËÄd@„y‘Í÷[:m 22ÐLk¤ú”¿v£J~L òs3l%èò;ð^!Ëœ% ŒØ¶HtC:'d˜ÈÁ P¤@”Bÿ-$fõl" Ýr%‚È„G®x+®åÉ…9 SÈ™à)÷ᯧ×üƒ½«e3]~¶‰ôú·¥ð8»QÏ%¬X]o³†*p\.€‚!`ØŠ§É•d0úB‰íM j]ë8 ! "£™jê’žj?_6¢äCãg¢)a¦Y$†D8ñ  !Ä îw±¶æO³Ö5A\J:¯ÄÄ©)Ì0~(ì\XìàEdÔÌWÚÑ®Ç<ƒÌBÙ¾,2;ã–ã Ùa\^86…ëX¢àBqiS|nôOç'gPäÚ8"š1ˆ$2ŠÈ©ó‘¢!åÁì©ëmâ[XûÞ€‚§¶Š‘£¦ ýNCzßa`C‡€®pf}'ØPnÀâ-ø03F$é«D Ríè õïméð:òä’F §â§,|x@™‡oCg6G˜„¹éÛ,w9˜ì} W©›}Ê×ÞY*’x ï¿+fv+¶<ÙµR& Q‹_R<06èÝòs¡àDt,+T.B ìD{»^­Ùº†è!±«å!'‘ÌGpí$"sîa²pA6:p8Aad ô~ÌÜzßïZ6îY¸0´€ÒÖ>Nü:ÓÐèêOßG¼³øÓpYKÅŸ½–¨ÿRpŒ!÷äGÃvçèƒg§Â::n§p'¶Ê „*¼@ ~Òƒzg¡Ñèwµáèè‡.N|©Uî:þI¾?ØõªD@4a:{>eƒ ÑBË»ápÃŒäŒ.Œ(¤d:ahÓ_ˆ`€¼CgÅÌ þê/¯Ff0p¼¦äÞpSùÚ'R@sÆàÄ/‡ø¶ž_ðŸyy}MŒÞ›ƒÎïL=«'¤:jÆà0žfÐÞ{yˆ@é!Ð\bƽ˜'q4sØ÷TI#!!: úgÂÆ÷}µ3C¡7I—å͸ÎI´9à¸%„ã½pú»”YMãÀ tCph± ( ýÔÌ(‰áСðÄ6ÍöNâ%Å_qq²K’~‰Pâ¨e—wƒZðÁ@ý•ÏI†ù8&ìÚŸOõórƒ¦2/0§.Ö›‡ø‡' äòA( ûJ3ž‡N ËSV*Öæà;ó¡WR hw² ttJP!d öŸ¯ÐdÇx ü6Š–"Å( »°i€07|žLV ˆ8 ò8{¸0þ.IÏ~R'ŠŠnþãò6e¤Âè‘5ÕÑŠ“ÖlÉó@S-@£Ì”݇W+§…¼W’“@|IáÙäãŸNÓÛ²³v¢J¨7ñú¼ÎeÇÅd?Svn<±Uf‹KÕ@ˆMóQËŠ‘Å»Å3j–%¨Œ¯]‡…DB¤Z¤Oƒ­0  ~ â ÇÌj^• ¼»WŠA•Rl@Õ[LBhÛ¶¤ç­RC +0;Zï•q¬¸£0`©v‡Åâ³ß“~ÁõÖî'ÑÔû½kóÃÇ®ný]½a¢f  ºñ^ôcøB±Ù'D›÷¬<¨¿L$„c‡YBd‘:–hÃuu(zX£LÀÎ\5G¹ õéÄ%0džÓD¡4 Q°„J%;šŠý¾±ëDøB„H" Å€¬Fă!è!­8wŠ!3qJÀ×. Ñ·€ÉÀ¸€œLƒ·Ù…;Õ%U! Q|¤O¸ r׳ÃE¦"}^º8²e®(j¾Î{8×T¹œÍ‡-)d‘Ã[ȸâm‡)ØLPSäÉ)ªÿÍ’™Þ×ÒÁAclRÕ)l—òZ °;übª3¡Ÿy Á·“íRªÄ‹˜,kûG ãß¼öŇ=šk3J8¨¦“Z=ýš…‘è@v@õåSêl†à8Õã…n˜þŒó>3®w½Žï gõfƒ« ÌÍGX rßëËe Èoóv?)·— Xa`HÕ’RÕFÐy€È¢×Lí DÔÓ¶g<'ruâitH0CæÆÏ’D$²Äü`ö,sÁȴꌈôHÂ$1õÇð wmb‘!eÙwJ{?¤,-N)92'ƒF¹erŸ¦”tÀµ±JsИ‚á8¡„‡ ´IsNå/}gs…TWÃ\¹¾+œãµLê¥Þ¾ÒØXM¤fqº6ð3Â> a©ÖD¸y‚ËUôÕ÷Íç8*‚‡ÆûçŒsæ3‰å0€XÀ„ ’ pDD¨b„ÔèlÑp‚š~ƒ5pt’Þ1INºü,¨2ŒÈÁ‡¬|ÐàUl$ï÷™LR/Œëì7$ D¿0ÁÒNpƒX¼IÅëö½8ÊJ^OC¶Jí¤zÂf‡I±RT±t¹*†[¨^©S[Ѝ¬YUý^c¢Ú€Pý‡ pRúý!€‚?hPEíù… Ÿ ÄOÈ(™Š¯éŠŽH\+AA’¨ ÅP¨¨êµ „IL³IÈd̰E» °‹HB®PA,"2Å"¨$ÁT@H,"ŒDO8gö÷ÁFE‘iìÜrÊŠ%4 !Å¢ÿXýw½œÍ0î9$#2dÌ<(h…ܱCÊ´òÉÄ‘áè™q¥B„B À˜,Fâ]¼),ocQÙØ#Ú‡NŸ4íJyz&‡rL)¡Fi{ÖÖy+<–e»Õ9 4 Ê ê–„ÑŸ| À kзß`RøyMÇ.Ä¢ B,‚À?›¶d`Šÿ ¨‡ì4bˆÂ@P YH  ²AH¡‚Eˆ²# žƒ›,+Õ´@?¬$…J(‚:Ì’0"¢,ŒŠÅ’O±…Ü…Ä2HL$™O‘‚í×Þ©GÃè¦9¯±=6 ø3¬gw£=rRBr¤0@+êºóÙÕÙá>»¶Å‰$H@±ý~ðŸ2"Hì>1“M˜€H9¦WĢƱX0HªAIõ/íûêvýp6‡´ÅDß´0}ɨËHBp.m¤8ÇH/ú l•«‡€Ë¡KNŠ #¿MÅ^ÏZà|Õ ²U ~¿Ža ‰ þ¤æ1E Ö Š"ÈÆ @H,Š¡*ŒŠ(ˆ" Ĭ"1UH"DIïúe{?ÕúϺÌSî:¶ÈlBª»(b[98È*°€  ˆ?ÌhüïÐYÛ, ŒE¬ìXéÂrI¡A˜q8-€àÈÈH:ŸM4“a’BD¿a Èzžd.6ª…–ȈÅhØ ¡¢¡ R¢“&‰q-Óå˜äT¨,¼·,*ì ŒªÄÚ]¹˜%¶Ö‹*›¸iï2I½÷VïÓ‡„áýšC>ÏChhs(€1E0‡ï!šÙðöý¨T#Ðö¡Má° ”>dG2%D ]Wà(>ÑDq$´³L„{ra!R‰w9Äy ǾL«À '‹Ó‘æÇBÓé0¶j¡ Ü„<‘õ³²Bn î g‹²³H®b‹d*( E ƒ»ð9-ý#ÌÐÈ}.Fl• "yndzœDŠ"˜ H" ‰Ý%$2Ñ"@ù+…'å Pø¤ U?Ÿ†ê ž”¤P³"`Ox‚2F ›)§'R’êyà ÆdoPýÕÃbEÙ”JZÃF7aê¿_dÙ¨ü‚P‘ÿCï0aÛaXÄ’Ú ŠºÂ,$×bfa"AO”±aŒ¦Jí¡Zbu¥;å±VÄîÖ*Àã’q»`°œJÀÆ­d›i‘P6 vÒÒE•%Œ’CŒ…Ú¬‡© Ô“* 8ñ“RY42ý&< ,¼ \‡03[¬Æe¥F3-ˆ12Š–¦rК]”̳—7]LÒ¨¡ì°i`¾JŽx æb¸%Ñw%:?™J4  N_viÕkø¥ký!¼eÒ0yø1üæ™R@R$¸n2 !+°´hBhšÈXªž !IIX"ÁYéä<‰• ©–NÿÃAdÍÖPlú ¨S$³°+°Ÿèø!YtTz¢ØÁH@?˜ùŒŠH…ˆúP(Å,Sã ŽD $ÝI8l(ï ƒG°Ž“BbÆâŒ‚¯ò*¡ñãê¹*›wÃEÉ$Ø1í ’Ù: À)Ò§pÝ VÍ ={°î(o}ñ Þ‚ðÐ)ŠchÕäÃBÚ (ÅrÎNi0ÜY#"  `XàN `ÆêbaHAÙ°¿­ÀîÆ<ÆS„Þá€%H%0’ IHz;¢Ä‹$MB„nÒŠß»e´¬"TJŒÆÃ*Ü! þ Fa«=Šéc#r¥¨Ð@ΦZVz€`’ |ùJzYgïž³  ôB  | v8‹‚À( 2÷ðpë'1U¤Q °Ú•Ix«ËÑ$Ê¢†h…ºÂ'Ð@(J°ÄãÀ:D:JÆàT¸’–BdÓ“ÎM5d‘ü@ä!»3¿ÙñöÙuudôèáÛÐ H§¥"ÚÎP1! ep'÷n s‡á`ï<ßëÞ#ü288¢ë¢$ü`$˜Š¾ÄR©‚AEQõ‚9êdéšVI©¼%$í@HïM¯D¢+õÊx¶ý¹ó2;+ÂDFÞ»^³@& fŠ8ÔÑ鯖®S¾<Ä9ç0›–ˆ¦îaí³û5ð!=óg±þô¿™”:ú³†ýRÏ,°r´R½õCï8”{y<|ë§%{k´pã/”ýáûþ¤š PBD%²U ˆ¥hT¯Ÿ¢÷òþWñ¸> 8JCžZ=Z‹E) dž'¾a°2غê‡"#—•@úèsסG_›Í æ¨EÑšLó©S,…Ì’» .À5NípP‚" `ëÆh6˜š¡9*"jþÍ®õ¹Uúª: AªV šþ’ X'BhžÀ ’4“pŒ–EÚ·Ò`V—‘±öX‡àú[†(tB½ŽP·€–;Sž£"ƒ ±QíÐØ"…€åÎz³>ôHC–¼L(Wf‚䉈ÔÅÖ! èøx^ƒÃèDv‡ ô9±Ÿ0Û¡Œqõ­Q9tF„,€Vl,¦Ž…Ž@à@›öñÙ(€CÀŤHžØ§à ùƒP;͜Ќr2ØXïs#D!ÅäEÏ=)‰Ÿ²¢‰nä¹~ƒé×SÓâäAã¦iQ¯ŒÇÀ²eÙ¶ƒƒßpÄ îxÀàp„&Äãwû˜»¼pExÐkž[‚h“ëUì,@ÁÅÔ9YÐSh°‚ÂH‡ŸlUW3÷ Â…4]Éî

LHÄ$=BaÈë±Ïž ÷yåO¼BlÛŸ::œmyw@ ÂägEAÔ]²­Of‰V¤˜·ÕæÞäoM`ç¹ٔ Á {/{¹pɵq¢óºšÎih8ûëb4^?‘Z"(¸Ô¨ 2„k=Ö¨' ÒÊÈœ’}$äT?Pü¦mTL‰¦ Èl‹¨Ì 9Gåˆà8U$/Û;ƒœ¬œ,Òs¸ò9˜ `¼|½jËÖÙÓ46žu‡R]a† Ã(º‚7˜22Á½à‚-»®Zgd:º”pH#¾Rë“EMË=WÀ‚™‹›³Ó÷€çBƒîž|M¤ýQ²ÈPF%ÙwIé>º#ûì=o“ok— ?eÐôk)ø'Ú`ÈÆ"Ù:< þ‘DP¡NLOá#­++û‡“‡A%çˆt†|ÂBØ,—óI‰)q †íÔZÑb¢HèÕ"B&Ø% ª–»‚Æe0PåÙ$* Ž£P ~Ûéý¢™Û¨“"çŒF@b¼Z†K.òf’Dþ ɉ0¯"ÒIR,):Û7‚å‡`s¸=™& «ê§0a2©ÈôX¸Õ6Þ<zzCKô„ö >UsB}2î‹ K«ˆ8É.nší“Ð@xnõÃcê qxÞÓä·Ÿ™î™š$¯ æ~¸ f`TÃdQ‘FÍå@þ¦9mé4Cá±!ˆ6‰l4$2 3ó§aá~àû{>ÊQìîÀ˜3£²œ?X(…<ðà>üôþ¾^Ь”Ûˆc:J2DH bJÉœµŸÝ'˜‘´•*M‰H!,JÌaY1’ 3«c1­Kp¢Œ’VÃÇ",“©s&³a##–£ws c+ *5YYKQ­ŠP"’ËJ‚%@ ¿à”SÖý…ü8t…òHB®@Hª }Åh½”C®} û‡MRÄ$íƒrtS½ ‰¨~Ê¢¢³¯N >Œ:œ¯dKFô)@AF(!ËdŸï€É`ÅV ÄPŸ¦ô„,c"1À,’ÿ"ÅU,"Àd2 @Y dRa F1b„P`„RAHASîñ:()d,£¨&íøIqu– ŠKø,3oõ¼æ¥i†"ÊŽæN¢ %©¶›j€±@U!€Ê™A‚ÅŒb£$„ÎSi’I„X¢É"¬Š°‘IPPX°$ ¤HˆAb„Y ±Š ÈDdP"„R ²È )ŠÀX °‚Â)2õ.]óHFëA¿©Öà ï–—Nθ4HŒikŸ\¼ ÑÿIKRöní?·Â ‘´#oëpÉŠ0"€ H« @P(Hd‚ "€°‹$U*H@© ª@‹$‚È¢ÅXH°‘@$F’QI%JȰ²I*DJ€TU’Ec‘ ‘Dd$Qn ‚%Á[ˆH,€A Š,Y"„‚Ȉ) °PPX ±BE€ IB((  $‚ÁdR„£'#Ž'š…Pš…¡Ql”à𔳙‚¸Z aÅzBÊnèkS¬Î˜ke§žCX E ¤€ œIÆLŠª ŠE‰YíéoÊ÷íZ´ð‹Eˆ­­ .͆ìÅ€(Æåþ"p±ç(QÃ{#TR¤Œ?a n4’Á# %°fYÏlq’Óå–ÝÆÎ°Xö†­9„ 6ýhˆËIð0(GàDzÞÖðäq%Ï Rº9X+‰‡ ;b“¹mB<L”‚@?SÇÒ´K½~}ú?°YgK GGÄCˆ ÃÜÆ#TA µõû7Tp&CêÆlmöúÙrH‰"˜‚¡|¡¯¡Õ4ØXþ&Ù´“Üx†ÚVÉpí2¦h5Ø,‹?B8`4¶ƒhZ~!”Ù4èa¼x…´D© +ô+ájåÕë8ä¯í’ëü¾é BÒŒå¬RþÌ$•€²"B(, )+*²xÉ1 B‚’(µ ¤Q$+""ÉÆB²E„"€*‘°³ ‘EX#¬*ÁbȱÁŠ££·öÏSF@?´Z¦F,£ ´e51$ˆ‘‘³uqöÔßs! OpÌ m–À*Éi¾5`Š";CRwËȱGûîLWF<^ËÁˆ”@D‘T @)•©  •´DF`«JQYT(*"’IBÐ%a ÷°p´âº0ØŒê…d׎³xR(-Œ21è¼4ÑH"õ²æÞ{¦S?ëÍ ÀÊãèÔ-‡?šÖC$a¶îFÕPºÀ:L,((Ðq˜)”s*"âÖÖj­jÌ€5‘ì-и_ÙCP¨`û±=¸1 Œ×!•˜1AÞN@ýÐß7E4`€².Q=Q²Úp!ž c¯s¯ŠNrÎYÄVµ&Zp" ÓC ôD†w½í@›ç¾p÷ð¹` q†Á\;ÍMÐɰvBÁw2bêêˆcUÀÌ9BÝ^¨>vФ óRg?žòo„³Ð"ÙHR?‡öOÇO¢›¤lþH€7-ã #Yïzƒ ¹‹†‡CsÍD­”@ìŒc‰ ”üFˆ 'À3"è$‘;†?„ KØM‰§FK)I˜ÕXAOÑe0H2’É*E TB”¢rd)°`D6@°Âìì\«û"¦ý)曳Lãúr Oð#{Çì}BS¾ŽG·ª®ªÎ¬²àˆ‘÷¸U˜â.‰Ú` "Ë#D Ìu¨|Ý+t¤* Q @ „'Œ!øLd‹PÕYk@¨…Æ î-Å‘0D  b2lI;@ÖN"$‚’)ÀX(E‹%@ªŠ d'~Y¬R,ã Y’Ær&"bn!q‘Mœ …ó‰8ë×Ï.ýô§¡Š\ÙS’Ân`ô9¯ÝŒšh.@œØ¹ u þ`ÿ'`:=…‚ ØcˆÒ;Çp¢US4véæ<&‡0L…™4³])ùö&y^c¼R ß÷tñ<…4 ]ŽÃ¬A9°XIáY4¶xYÖÓh‡2î‹G/0Ø$…s¸É—bŽ«Ü?GëÚyƒQ‘¥<€Hz˜°ÐòÅ<`¥P¥ŰŒ 0àÈC0"‘Â)÷‚z€rš`aÄ„S×£ÏÅ /0ëáÍ5Ab)~îòßrºüëÌ¡ð,O$X­ôÞ²Ç=ÌÜ|9«S&{ˆ^Àp„ì‹”@‘@fvÉ"ý0™’S©”Q‚tÜUB¡ûü1F ŠOÑ<´e¤£H´*!u{á  Ù/A(OY|4p [BD$j!sbÀ1)*V­ÆGÔlÔ PŠÚªÃ$X®MÀ„ @`¬:5pO<¦d¡û¡2m «a5çrw‹„D²pnl ÄÊ}ÏglÛ`ïe¥ÄÔ èìþð… !È•`‚‚ÅÁý‚ŸÆp(jJ‚?I-Œ¬dDïôˆŽ®§‰AU!HÞv[Ð݈SEiޱ ç„ÅIo÷c§e$$@Mšb‡  „$É3ËHAD*ƒÍP2$!fL'wŽrL…;„Èúú®5 5Gæ—š‡i¿«Áç|ÊÜK¢q}ÊŒa–"Ô13‡2YU©— ®À¶ê]̇‡)K$*(ÿQ mÅSÈædGaw#ÖCþ“€D¥Ñ¶Ã#”PDÌ3MÁ-§ŽÐ[ÑÕ¤C¢pZýL5SKôUŸÓÌ Ø\CNİÖ@·Âþrg>:8*([¦+aÌ*À»ÍtôJÁ*X[8cѲÌË 4þ²7O”õ…µgB …x}}uš{ë›3ºq†‰¨¥öÀ¯iÝ”>¦dëÊG% `g–³Xj)iL”¡Rq †Jk‚C6ÊÌÓƒ Må ‹57ÛDïª.æä8Ά9G0ÀrþüVòÇ–V%ABЉøÛ'hjÂm)!Ù+L®¦ï› ȾÕ9Í‚ кsŠ0"–ó$ETöy½Âu”϶ÆÛ–ÝÈ,àà{û®[9ÞÜíË 1$ ªn™ %qµ•P„õ†I“z¯}ìÝa¬¦¢e/PšhÊÊ3”¦ñ+u®¦™9Cr£¯}òNîöÀ˜$„""! Q²“ðŒ˜Cíu\×`vMˆ 1©"BY=¶í¤)§½ž ¤"‡„ ? 4ò–,ŠB²Y$!P D ­¶X„²Cç´ÝvH½³Ÿ+äøùbýùÖ©£G-Ú£»§O“I HÂhˆEâ¤b1æ\R1‚"” ,0p‹"àBaô–—H@‘ÀEðmAJU(‚Ûhµ˜-£)a’ûI€ŽŠ¢la‚eR0ˆ“B62„1 ‚˜”ÁbY† j@\fZ ””$RHÉ ebªVŒR#@XB Fgÿ&æ-h"C›À`$›‘ ð©CŽ¢M”†¡ ð 4ª/RFÔ ŒJ* ¿OÆt1bÛ+"ÃÄž½ÓÒt=m2$BæŒwöÝô_™@×N¨ð)Æ#”6m+ñáòñëYƒ:c.f%ã×7ˆp>@1—ZP6/F3Ô¢Œ5Š3±à I–ú^êKð7É“‚Sg†Ûµ©f䢻8<ÏÈzæÈ‰Q‰$f ("¥ƒÔ€ZAHuÓF 7ê~½6á×ä2PÈ&à€,RE ‚EŠ(¬žýûèypïÆÅ‹µW,Þí¯!±ÂBFHIdj…Dù¸¬A 5pWÓ&£ L±Š  QÎ gpéèÂTY& Á…´%P•áv’xa(ÁXWG ­íØ^³˜a„‡c˜ "(O^dtdᦥ”7„ÁÈL*ª¡óS(#«¨uì}i7Šó̆Hoîš"‰¨ŠÅ2NY‘!H ¬¤–a¥™,¡†"È › $A aªªÁTŽü:"Â` Š)¢C„Àcgáï­¯"@‰×G$â°G¶Ë‰ ðA‹Œd‹ ˆ ˆˆˆÇý)‘E€«"‚ÄPbŽ˜}Âýy“©bŠÁ? :µ… HI ¡ÌQ³îÔQdr„+t•A` ¡Ž]MزÙM„Ü•­‚Û6î;’˜Åe¶’Kk3!jDAH¢Ï膎C%Q§rŒÌæq!´:{Šc«˜Q.Fuå“¡šue­ R ”aц`˜7³&~!‡)Î[ –nJMkŽaMk"i—È]Û£¨—0)“tw1”™“4\5¦·Vˆ®¦Â®d!¦É¡JÉ&á†ÝZc²(rf0µÛ—.Lk3wGV@•+$¬`ä!rd¤Ü Q6Ja ÂBAY°HRL…-f–†’ ¤’“@R¶iÂ[÷¼á¬Ì—ægÝ&àùðÃv%L5ì+ M§O[SˆS®ºÝf]s‚J6ÑJþÁH@éb’Ad4„•0À£€AŒe*’ `*0X³m’J’,‚£fÉ6ên½¨ÿJª«2h >²ÎÊ­)¦ •tÜF ,tØXަš#¦Ó&ÍÝŽQS2ÃêgiÊ¢@Fò3¡  r@†²!a¥ýJ¢¢{í󹿝ޛç›c¤´ŠÇ¤%0V™žñ#@A`¢,ŠAUÿ…QDƒmQXQQƒb€¤D2 ¬FÁ‚ÁAA¢*ETT*20B²,DQ*-¡QUˆ¬b¢(¬)-%‰"¥°ª’¡Xª"ˆ²E"ŠŠ1Ea*  ¬T` B²AF$TT¤X¤U@bÄŠ °ETQT‹  °XŠŠ(ÈcÙçæyu®÷¥ ¦ÎD†ÄÉ’1Ƙ¥%4чoñCU½ÿ×9¥pí’iz=VŸÍm,ÅÐm6H¬g) Eî˜Î$ü¼cÕP¼Ð!¸ÞaNb t¯«Þ«ŽhãúéTã}0¿[à÷Õ¦Ù©p(7ÑÇH+øBµÁ“'êà‡fgtƒ†WHb«u‘A™–Y…䯢$ ˆ8¤,•e`¹$~yLI'œÜÄïºs‡×3`T%QæÊ,ñ@²¬]µÖs¯+µ¯W(ˆWE,œ|:Žt?-žöãØ<&a$$‘ "*B( T’,ÈEˆÂ(°ŠªHEA"0@aŸ”…[íPò8É!ØO|˜$ƒ½  É&>N°è:F)ñ„X˜¹p»‚Åwð%/Mà‹°mð59!!ÈôñVn‡§-1,RZ%Aë»ã wAuQrdDûƒ­ü,¢€d§ÊwëyOP¬¦œ˜\”oƒöiý¸¤¨Ñ£RN±VŽ;j•í‚à€¦Wå›±Ó€°º"‰s3”…'‹¥Î™@/ë`Tàn+›Ø³Ø× Bâ}`rEâH@ƒÃ¿ETÍÌ€@yup‡8­›ËBá`=.ß× ßÝ`vRŠÛ"Ã÷œ=ø˜– «êˆ6É ›™ˆ0í° ;' 6ù’\wuîHhréä2E♨‡E… '(€–02R=äL(l`™q]°Aþ¡æÀé¢ÅPö±”丕TΦ@Àžˆ€Cbèñ2n-ƒYâäŠÁ–ÈØ:£p ‡Ê@O&ˆ:¦ã`Íã€d)(ß…{Õ<ê¡~ôZNœ[:[ëƒ h~å€bÂÕ.ÉücºSŒ •­’ˆ~aiP*üÿÆâ|þUëQH»ö´Ü•ˆ+«\Ìq-ÛoC$¢Œ³Û"✡D’"½RÏÙ4}6Þ°3­‚† 9¡úTÇnˆ‚ Å`‡ìÑšÿGõ¿3hiú´ÐN`¸ü4WÔšä:þ†Ÿ 'H¬`JÊ[ZËÕóóu3~÷AEPF ._ru–:–ÜQ2ÒOá^3¤ÔƒØRc€èÒ/v˜‡vp~cq¸;™b_¢–ârÊjpw„תL÷XS©úÞKR_?^ò{Õ!ä¢2$ˆv•4h«ŸÍ1€VHEõIP¢è0¥gÈ;¶ £1Dü!‡w¤œüXzô¦ZwÌúÚ + ÆÚ‚€°ECßÕ˜Š¡M{rÏrb°ûB|¸J©;ø³Pb³ñô\´¬Š"Q‡ËaøCïç°ÖE6u.Ãq×Dôã PÙ”=œu‹íûîÆÎYë­º%?WQ~œïÜ/Uêñm—±±Ëc Ê ¾$ú¤º+'|峌o£„j„Š«±×Ák‡nDc1H #Ä÷i_nW(óTDñ(€^ÍšØH1„Bˆ’ (Ä" (ˆ±E< ìc‰¶ÉX @êzÂØÉ ÒÇD9°@n·8Ä:v H2/Bƒ±]~h6 HEÈè´ñ/UÌNx¨@ôù)N¦yyDðdÈ0jÐ^îèB#‹Ho툇}©$jsÜóÌê p%§£Ðçù^ÃÇG_çÃJ:ƒŒ±L`;ûjfÚ'Š6äQdy›¹ PÑHO#ÂÀ‰òÃôîâõWKFÂ(/s9^”ØCÙš`ÅÁaÅV®ˆ€D`0v—#|Õ^;Ñø(;.‘ªUWgôÑéQC”1ö{6§ 6vcŠ(º”Uø¢N¦d¯Ârpš˜)ï“|O~;[m$HB$TºN: F=Y¡uSÄ8ùqtßHy’o¿·ö̶¨TÖ&o%Þdå±Éß\ë9»[çEPBß{âĶÅ9_?ƒ ’GÙ ƒîlªTUÈS'%‘æ¥F[ô&Eì¢Ì:0b°I*© ¡‚ž(Kž©¨Ê”O>¨,#„Qð¯2Ög ø—ÞŒ T‰!õ1dŸ‡ïïpúc ¶¥J”ӽń ŽD÷eŸ½Y ”¥™‚Ð`ÈX|tæI3¶#D‡Æ°QX¢ „Œ"F#"’ HH29>Ý{ 8±~ìÃæ—ĉ±”>ƒ%ûÒTDX‘…òµ)3Bš½ahÞËÓª©z:®t3Ø¢¨‘AIѻރBÅ‚m%îÉçdì$ “àšÔ窒€ ä"‹!²–$ÝâQ’^\ F•Å C@ÆÑ€3 ÂzDȰ€%ã£E$ÿt$®üñD’V€VJ³©¸~°û!Ѿ,²ˆX´)¤lQPö}é-Ü„¿½þ8õÞl…éÔæfós ñ=îzwHw%¥Š,~O¾ˆΑdoa±b!"©ÅA*¹‹ ROp¢ƒ NìþX~žøFŒú8!-½JßDâ›ÈJMˆÃ‘,_çC³iº²­`Æg¾žM‡£±£ ®%‚0†q²Ç.”. …ˆ4J±gÒÈ‚²÷sñu0Ñ ÒAÞŽ0 I8\C$·X]’Å"E ( ·û¹9e"k*¢ˆüì)Û ·¢uE„2'ÊH°¬Qêaˆ¢ N8âˆfìˆwËþÜ:sÛÁ®·hÅTJ"ìC 9ÉdR¤Á/”)¥Fjîf¶*±ºR¤ ¡©rîPÔ h‰HÛ+2Ù˜•Ô•¦&‰3lÂÐQk @¯†ÀZËd`4ê’ãDV(–‹(ÛSøüVf«DUÁçBÒJ£X´B£D W.šÑE‡Ñ!ô×¹c=Õø¡®›X·/í?õ“Ñd1²$¼ŸWÙÈ›B‹û0PžÚ2$²B0D‹RÕB4`Ž8¯çëg°D†¢›`þñŸ"i©éPEùØN0JàíÈœ“‡g!fÕ‰h7÷ÎÎN…fä+Ûy rS‘¾D~)Éä“y…1žÈ‡^£M“¢ôdaÈ…„?˨±`ˆ€ZÚgv!d"‹-Ì-„†ŽÉ±,³'ü#ÂÉg(“ !J†ó+áL›Y¹iª3Ï Þ/ š1 ÄêØ#m,"€dÂŒPPX‚#’« LÞ’ƒ½µ®$OÓdœ>Sñ…5Ÿ¹³(Œ¦Èî# •º¬nAô帯҄ÎÀÁïÀ³š;íè°‰Jåúú{ó•ÆHY4À88u‚©K9@=ç‚ R@ììBÈWq´ë0Ƀ¼/ Êõ“}ÇúWžDó&Ÿ'ìñ¨Î ½œœ¹!×(Œ£¦s~E‡D:|IÖRbL¶e—ó¹‰nîèÁƒVPr!ðörá7¤í>»Ðü@ÇŸT*¥Ò8OÌd‚!XH(S 0ƒa€& &Àt û‡&ÿ%Ÿ‚KøCÆé…U¶«kQ„l.ïHòE!æ@ë©ÄÈQ ±€g;ç6Á*Ëoû9µñx‡ ܪÅüÛR–»2Oïh¢©t¸®³‚fÑze<<ìýƒÁPÅøle ±£e¯êï{Âð—ßñèÁ5ÝþI¦Ë“H?†R+‚0€<Ân]¡CQ!Íâçƒf$F ó£¨x›áÈÀd¡^•–~ûdRÓ¢|£ÅUañ:P4ð|óÞ²ly3ÉÄ~è¨ÜU¾Þ×ìy=Å„$A ‘èp¨‰ 1ƒ ˆ‚,Š¢Â,Pîžb§Üs s I2  ?œ*$hFDDJ "ÉüûN¤ˆ“¾J+rT`ð¢‹JXØ\`ØÐ)¶ M°‚QAAb‘_è`êØdb"ÃdÊ´¢IG!F0I—©þ];ÐÌýNþnœB¡Óf<&²ºÀ¬Ä“v}“ú/ïa(•!AFAZ€QÏD€py-BÉYŒ$#¼6ŠØ¼:÷9˜É £ qŽ‹ž¦× HÂÊH7ÜeUx¼v¼”•Œ{ Û 3 ÊHæñø‰ãfptvp®»ìiÔtå k  ÕÀ\ÉÄ$ô,°‡%©øQü¶*¼!îÌn¶Q!bräpf¦O¡¥F(ÀY þL „è¡“td%€ˆ0JLe!1¹”!‰‚’Æ>ÓþRz€%³øB¢J% öÁ¡‚‡cê]òTéŒÿ­Èù¾-5*åP=ˆäíb·Åx뛌ºuBY¨É‚\³»§˜–täÏG=<ÔÊþo›ÓŒá©HÀd2M¸x©kD§7h»O«¹Ã'ž·[4Vós"9B•¦þÅÏ2,gé#¢¸¼@ÕotC }«ˆÔ4ÁÙ“-TÈÈ“õذ•Œ:S9Ø$t¨fŒ‚,lï¨]„‰8NLW{,^+mˆF)(Ú)Ž ‹–Ÿñø šÑd %«E…JM^|ÿbº®!%@é`ðöY)j®]FyåÒIdc½mûÈ1üê×í~Ë뎣Â×ÅBè ~ƒ1+¥+½1ÌŽÌݯ“µ´Yݨn‹ìA-EA¾˜Šöfc;ž‹÷ s²xžºaäE•IúPoÏ—'*)ˆðÎìCž#öËù*úR¡h;£„q±#R›f°Ë¼PÊbÔ ã`íu¸h±w¢*îÒ5 JÔ4­­@™*À?´2–Bu¾oïßàßç/¿(Ú˜ü|Ú/æôå‰îL|f+C»¡Ò—}š§XgÚqøn °›ƒƒ)&„´DZÌИÍïuÀŽx\Ú,—ðLŒÚÍ ½:€z½KñÏYÑu‡,[@(¾\õjCœNµyϤί%‘ Dgª2)ZFªç6ÅèDÃ&/ijÀä̵âù¨‚Ft6V+C.dÃÙ¯s óÄߘA»»yõ 5•d׳¤C7£{¢ýàäæó%Ë…#9f¡”JEpÇ'¾À ×1%q3œò£œ:8êäµlý£îM”7˶U§&}}Î=S¯2F/€½É9œÐEš´ ¡L¢Øâ™®_++©ç7чÝÝ•\œÚ6Ò¢ü]‡—ü x»µú—=w´{” á×tÒ "óój G”#w׃ø-œ„³”TìíÓOròµ©`í.š]ÜÓWç,)쩲#a´ûÔɺU¿õä?Í~l˜å4\µ|ÉüŽF õUÎkã!36øÞŠ‹Â5ý,4÷Ú …göæ.e˜Ã,ÿû ¹3……ü?Ð1) °û ‹*‚ IJDø%˜ÁBÑà8x1Ï{¹ Ð’DÀÝ®޳øÑ}s@ßå5=þ&ùHp()„KÀ¢$Ë h\¶ñÄ7c.d9{ë^hÁ:ÓÍ;*Á±9,Ô!ÆÕ)¶ÀÕ-ۑІ·_s³H£¹’§tá”հö4!éª#,4çÒàÃüýo';ÙÃëê½·Q”S¯ß5º­Ð ü}0S¬Å+@“)‡Òù~‚Ï¿e¢’" Œ"+FAëPìËàå÷¾Ý¼ÈzphÁ Zè°®ÃÞ `…zC ’;½3`YŸ™Òt|wü8RÓåè-±·²ÏÀϳ Ò@± ±Ðï(0lÅ 3ÄYËÛÏ+±$ŽVïyp?¿ï1h\Ì^ÞkÚ¬AÈ £ Nº““vñ±Üu “q JŽñ29Ú8ðt:‹áÕÚ{ £h=fÏdØ—C›Â`Æ—2@°>.ƒÀ`Nùbâø„u ÝzÀ$Kv4‘.˜ØXȨ­-X(*Š0©$ €@YD€TDVI÷R‚¯ôe€ŒU><èæœ'1oôÍüºÅb"(Œá;xgèùýÏ?]‡óÌrд*(­±¼ô69„`Ÿ'8Õ®yjH:HvÁ ÇCYîkål៸&ÝK)¦n÷šiú;ÐNRBÛ–öîïqÞ³›RNòò—t??¢‡óxÊ÷HæR È. E´( Bï|ûg°„oéMJÌM\uB”*¥ roìa®™ ðèÉ0³ÙâŽNoy*DdIÅY‚ÈEAP‹"Š ±Iáò™Š(xËH„PeÃMZ/LRâc±Ó95ÆþþsœÝU<â·œò‘~éÙƒ:´t[º,ÕLâs½×ÖlkOc.µ‰ÞLúM~3-WpSV§¯v Ç,åÓ³lx(–¯ÐyIý»U!Tž“ ßRDæ" »"@}Ã9ƒ†Qb,ŸÜN™§w…ä#PEaÁøÆ_#0¥nR¥´?Ä|ñà‚Ìësº*L` @“±\d«j6k_ÆãùÚ$žº3/7Hz’k'ÒÊYoyŸ†˜0ñâMð„Äõ„ò 9½ ~vC½…2ùcà`7²”—IP‘1î:‚šÀÛ¡Bå²CH‡@=ñHå03Á%g̲d¶UÐ}™(ãWøø_ÏVËÿIïฃ(PF þçr€ŽÄh(÷eÅH ¡” P=’°LSnÑ»P°¢)­Ð ‡/—º6….a3Jʦèu´,Æ€‹uÌ3>Ã~Ó£…Xöæ¦!4×0ÌÜÛºje³°¨rØ:0ÛÖûÙ']—œaˆ?Ã(‘YHÁ$€ $YTˆÈ°QDVc.Œ¬‚ˆ ŒXŠŒQEŠ*"}Z(ÅO㻊˜Õ‘H‚±TV**Š"ÁT#:¥b ŒQ*¨¿ D‘dQ‹2 °T"¢ˆƒŠ):jˆÅŠªª2("ÅUTVtÊ"°Q9øÃTLJŒˆ+‚ ªÖˆ,(¢Š ªÁPcZ*«m^|ÌTF,‹X"$DV#c"1b¢(«V 1XŠÅb‹r2tÍ@b ZCøDHâ $a%~ï >õãÍô(Pb$(¢œ]-øõE¦K‘Ц0'9Ì\Êê¨*£eaÅ&ÈtÌ-"qp\»au\G­Ágavô~=Ÿ±úÀ8’_mÃÜ“RCÀ9 “m (õ±&Y²0ÎýS²Ðb@?Âg_,ÊxE¡L‡s‰2T*t`xJŒàÞÀ°pn͆#·(€`Ž\ì8]Q€¸$$T…±:„vÌ7(Žû•2}?0 ‚’"E‘H,ˆ¬ŠÈŠÀ ³èBQ‚‡Û!p."mEh€/PZе ‡ çh#š‚ÈV–Ö TÓ2 _î MaÚClK†`f"íy<ÿ[Z/ÉBâE# Š.ٞת£ €(Ó²ú8: £Z]è‚ «2€fOe™&ëiœÙtú§\¦Bs›‰Á(©FËsƒT·>™{9˜Û!gI³ ìdÁËÊd톌ëK1mí©Zvn`'…5ôÓLMé41<,@È–„RzßD†dazVûÂÀ8}±Tü鄲^ âXÈC0Ém‹ Y…¡”þ?Ô~.è™ûú¨iˆ…?ïEíJ¦®Ó DPXÆA ªþå©ÿ ”³ô–0Q~åäÿ«??Ûë³ÅR(¨,*ƒŒD±Q‚¢©1þiXL™gÌLJI&RN%x׈ÏïÌ»ã»b¯8ÅÛ4Žð=!°†xNöñ£€Ê±³N|G® 4tc8é1 žUæôe&š@®dÕ#03q I„X…G¼R‰ÞSF=qÞåb§+»xÝ*ˆ,QQAû.ãY}„ͬ‹³Ü5ˆp‘FA„VDd„I‘E‘`º¡hÚVM$LÖÕÀa¸€H2A2VÈI2{¸®¹„M [[ ÔgÉE“ìÜêäïèwC0TS„³MØ%ˆ‹1E'd Ò}‡½¡€òIJäÍÈ_p “†4)gÒŽ·>´S‘ ©¦!…:sØÀÜ@ÔË1Œ Îjü`5D E H›×Z¹éOžö÷ä„!€AQ>([Xˆ6°;pŒ u ,äçH(iºSOé@ÿÓ ÒkŽzÏvU]Ä”²àÚ¬E0 …bíú5؈ËÊŽÓôR>èRôŽÇª7õrÄ$5 !Ð!EEêdÖ.Kxc¯ãÚ™9ÙÔ¸Z+ÖM)ˆC@#2Ìb^ÛzÁxýgsSˆçZÅLÂ9à¤PfÕf¤Ò%šÄ:lÒC˜¯À€‰ ^ú+q°…˜ÛWÕŽmªíÊ7:°¡Ss Ïï¼¢Gnbæ]š»‘CóRŒÔ(ãl`døm™¼•U©ÕPúÜ-õ#’¦uÔÓŽÈkË–Cõ]Þ””‹sQRokS(Pï5¸—÷çë9ͪT ¢!ИÄG]W|ÚtðY<Å!»ë´®ø!©n ­ŒC ý蛳œ*Pw€Iì“öÁ9¡€€æêÚ«³Ùò³‹¨,­Õ/-ÄRã8 €q ñ$ îh=ÞéÈvjÿä¯LÐ~0’ '!Ñ’†Aàâ™I?s@‘J‹:/ìð‹NªŠpNñDJY êÇn+Ðô†‘FíÜ»g9®Ó§gbŸfCì6ñbÅ„ž4B~ÀüùV à ¥î%†Yc!@Ž´½ÙPàNY…¡p+^–ÜÃd¾ËÔˆ-6”ð™WV^ â™Õ"TÔݨTbUŒû$© ÉP‘„x +iB& <» +õ)‰%0+ÏÜ9ñQú'°0ºo}±§1ÌÁL8Cï¯äB’ÔVÊÊH«…Ÿâ`@ºB °UŠEA3$( 1C¨bM”,6L²]à1…”Ø(!ià ȹôWe ÏIƒ™d(¤ô`Â”Ä ô m7ƒ[﫵ªÀhCBRF©F)!Qb EY¶V °X±`Š„¬¨ÅEc"¬X(ˆ¢ ˆ€ƒ++"¥´d„Š‚Yñ’ˆHå 6È V¨Õ@ùÇ*,(‘J‚«B–ÁU¢þì16(k"V¬¬¨«R¢¢%E*!&2H"ÂHˆD‚Ã3 ÛßõÂÝã[÷gM§vf@ßÚ²Sc!Ÿ~¿ç!#Ù<µàa`Kà§å Õ¨6 4À›ÁÝ ê7I”Ú‰FR‹À&ŒëNüýãø†Ðƒ\’Œ 1mZ`HDšgü?&ý÷†%£œšDö¥'ûv> `ô«e¢|³¼=…ZI"Å|‘k0 CàÖV•á²¥›\(!£#’)pSQý¶Aë±›G³²`æëfР RˆŠåiU%@:B@‹È ðÓµ¬L€þ×ù¬¹¡,5Ut€HÔ.Š!Í»Ž£ ¿Äö,kÈŸ:M^×·” 85_pß±˜äÅDˆXmÙ,–mº¿Åeº £"¹Š'¡UD’¥B¡­Š(#« Ss}Í ž«Âó»©°eŽ©ÄsyÌ]‡Ys{?€L@@=ãêkg³üP³Y)ãŠeV1^úHAH¡"H¦Q Ó0€‘±H,#X€&Ìå§S@ì7ÉÃ’áFÀa¾¥¡?.÷t’BxÏ69LµU1XÆA…¥"T*°b¤ˆÁ+"¬X¡HÆ AŒ`ˆ¬B±X ¬ ¡"„PP‚¨)|:%"û¦FVL‡ëC”RQ$X3}«=CI'\Ȱ3-c4ÂÌEd” õX«Ü”ÿÙ= IÓ¨ê4íæÀ7$L¼Ó p]‡Úœ$ )»ØaؘvjÁOdþY‡gÇvÞ~Ü*[ÍÜNÙaõ’Tø2€ÒsöV/ˤ-xû>—Kj˜˜ˆ‰X ô_T¶„HÏÛ«ÜìÙHktØáF ygE!‘ðü4›YH¸!²î@WBB$âW¯™N÷¯îðÒx} ¤ñMŠ@»2ïá$0ÑÁj¥h[|XhP;þ,1€å|ÊeÞö±ª °p¤|>Ç®˜¤\;Í9CNfáŠÉ®ó(æÒøˆøÝÍ"Û ãbâ(t<­‘!¼qåé:õ–(ç_\Ÿ«}á{Ê -µ>8‹*Ò¯5:¤=®lèÁhB%  …xõ¡/Óã7Í1 ±Kè•h h7[ oÓgufCFräÂ"õNu~©%åu<¼\/«;÷­“á÷{¢¿é¬þá¡d"0Xê vêÛ…»¤ã†ý%ØfÃáôR¡R4l ÂT4JŠZ€Ã–‰(“RbÁ» ["$Q ²˜F e‡2`r–1“,¬&ÄÁ£ Z•)DKFZ“‹ÆÝ?îgüÞôèè—’«ñJˆPBúšˆé¡íN,P—jT’Í ¨@Ør™/`"‡è²Ä"1ŒÎÓ¯À*Îpç÷™z 7£%¡Í"Š(÷ 1B ù@•$ šq‘,]¤*«@äÅo³2ˆ…BxðÍ2ªª¼ïL?¡ÎõîœÓª·¹½;¡IdX™q2T.0­V3:t˜COHjC®JIÉ š d´úpDZÈí‡9$åáܵ4—h(û. TÙÓ31Ȇ#`ÓÙ[†ZbQFF$QŒÿkq Íd¦Uc "3ö¨À c0… #TŠ·EU*\RØÓD*]4: öð¦C aÛCúP!E`¢ÈNþÿ6þ •n{‡Ù:… F2(EŒHHfô*é `}C±Ÿá°1 ˜ÎZq‹ Ũ¢HˆÈ©âZ½dáüøwÇÕÑ­Ïc‘¢ZÞ|÷Åx¸p(5ƲZ¨C»JüzjÜ ÄÎÜÓO›HÅÒ;ú?€$€G$)É*‘B ¦›#ó•,Zˆ ƒ¨&~ꦂŠ`h@ãîH"@2@d È’v.˜4UD>°U$DU=€=˜²Nœ©.[«³û&gæ\9m²ZZбKG@±¢‘²•lÕTÁn…³!ÂÈõûu¸¬,`,ˆ‘DQF(„þ ò#±ØÕ÷µ ²"ƒç¨j&½žQ 3rÃ.`fir("ã&0_èól8ÁHT/–˜„ÔŠEþY&=2\uĈÿT:dÅzIÑ–BÚ«ã qÿQé%@“0I1e–RU´Y‰×ëç.åK<õ¢ÌkP•R]Yè!aê5ÙK§E„”I9‚aѰ‚g›Þò.CÒ€hóa¬…W‰Û>2§ÁN‰Bã-¹ŽaÄ p6q„A¥!™2l f!³ º›£têfŠBµƒ¶}å>’²ÍjiaÖæe«˜Ò™‡V—’µ'`wÝ&Išk5z…f4DGXÝÌ`‚[P¨5D¢«Ç>«›0Û‰ Eò%L)@.n†®ªZR°š0&œ²~R@´­m¶4J1¡½Óì1åKjçÆô ¹ÂáŒ,`Á#½Ü6ч+|ÝÝÑ.¦aw ŒEÑ• §ÚK{ׇ^™ s3Ze2A•ÓbcXrÞö‰Û.ó&E‰ŠÖTz¥Lι¦Štup¹LÇ \Ž÷8¦%AEËʳÎíT[°„áUðL™¦ø "*‘æ vJ`Š¢p¤&›rL”+âÀˆ)XÆ>Û‰¨‚‚È"E‚ °QAE‹3ç×áÏP),=BóàtšXZw?Ó°fÌ8mzÁ!§¡ºhñyž'¹r!‚ƒ²“pª‚q.ù8fvâ®ÆR@!==,¡p"ò ÂÒv‚H—bAKÀJy%§87GÞÓ…ï—ýÃ2ªªzœËý>Æ?‡P¥ 廹CÕ¹I7 n¶!çd Çg¹™ÑEÚ@»µÃCút<¬Ð)BŠ¢B‘mO~ÏÑÜPdiJ5c±2&mͺ,uªB:s6¿»ïý‰ü?÷ÿ,«ü¿•ê°[ü$Ëøº•þ&ÇíèþYÿß8GüŸïó°(p3ÿÁ¸ö?ܤÁÔîgÎÅc8û*Šˆ[‘ú4âdÑú¿ûgCÜÔá¯_ñQ *€¡¡¨‹›ØÓ™èÇùmߪj”CR·=Èe "˜.**!„èpÁcçè:t¸§‘e7²IŒAŸ“jاÃcÅiß=±ÿÛÏþÎ1E{^‹¯OX·QºQo•F¥Õ«‹F1»Û{µ”c¸ÿþ†eÕŸW |6i}ÌCÐJÙÇ Á,’u–ÿn—þÊ{˜Ë>Ÿè`ðxÌðzõG*. œ^ ux>àLñU¢ªö{ë³üŸ£'ì;îÉ`Q‡«—gÒ×ÿOuQQ õ¯!w<ˆóÛñË©öU¸>n ëU×lðµ¸pd=‰PÇòBŸž>ªWìU°jjgŸ »‚:ªŠˆh|Ý47DøÕáA'£‚~6 39´pÈ£¡Ñ±ô Ò¨¨†Dü`Aç±·#ÅÈv™*ŠˆM@ "`àÀGݾŸGG£É²µB¾\~ ­©ØØî.f™fLÎ`ý¾Þ;™¹é+Dì£ÌÆ,e†ÇÊ'%QQ4Q‰ ö3ÒÆØzCÎý†Ú}‹ðîc+'’­–]hñÁTTB®eÜ lqôpDõìškÊçÑê ª¢ŠG ÏbÈ—7 Sðædš¢k4æ#áO$G3>dOÀÐØÙBðˆˆP$@"A@YˆÆ@¨#F À £*(Š©‘"ª@Šƒ,X‰ ,€HD‰"UˆÁA‰E„ˆ£D"€0QŒPŠ` 訨†ÜDz†gS…m‘ÊÀ# OJ¢¢¼dJ;,ö~¾ôj.` PÅTCûeWØ‚œ"&d4ÚÜä>%È(}9žÄœß{Žds gä,ÑKÜ]NÖ0|},htc­Ï\ÃU¹È±Ð**!>™‡£p†“pu!ysÈ+у4TC%R9æ/ÇS#Ù¯M‘ìGØDùÉM½óNRECÓˆI7U«{|hñÃrnLlCºLÝà€|þ‘› "¨¨„?¼I=CC“âjÆî—¦ ‘ÔJŠ‚†bí1”úÕ] •Òzø°æ\9ª*!¾B¢ý…âA†qÍL(çÈ àä_ @Â'eCî1©R³Ué×£o¯CᎸûŸ!Ñi:àüG2%±V>Ãv)o_n²eûsßbÊ Xé^ïgʨ¨† Žœ~ꢢû|œíå9§§!à"çÏô‚<:"}Š‹ÈítK ¼úl?6µ æˆCÁcˆà4Uîª*!àyÌ ¸8IÌ7Ř–,Xg ìy>ÇÐÎ hRTŠ¥‹Ø€¡ð7)TTBÜD^Ã˱©—ÄÀûÈ€ºéŽYO‚\ðkñ×9ñ™èäÛ£hÿì$žê¢¢ùó‡óü!³xîÁïÄOè ™Zùüì¡W“2~Ëý“²¿¥]˲½{Úœl£íTTB0xLú…uܺ&aÞõo ëˆ*ˆoD2 bû<Æ$þ™F²@ÑC0,JŒú-0¹saç±'c®ÆGÄDƯϬüw“2ç<ÅBÄ~†È ¢_j5_'8öU’Eú‚=øÏgèwGƒ™ÍÂ[¡èó}<€oÐû;(\ÙöæÕUD>æås¯Ðˆš|QÈ-íwbµóDOº"|ŠŸ #{iÈdõðÕ *ˆq <ýéQÆ>u(èª*!àýj ª*!ÿ ¬“)¬¢À¸J§oÀ<ˆ)¿ñÿÿø_÷ïý1Pÿyö£¡ÐƒG'UQôËIóÙU¶«¥nL­;Z¹Ö']éî«€ŠóÚž{ÜÐ=>€r GÈŽŸ@÷Sžï±w|9aúos ÚúL³×\V—¼@@/[‚ªÖÈ­VE26¦$-™-Y{}rú–=æ¶çfÝm‹Þ}ÚÞ;ÝmõÞîÞ÷zkÍÒD 9í}ÀVû+W½Î)è®õîPîjmž½áí˜ ¡@ª%TRDЍ‚T*P¯hÛBR+lT•@Q Ð}óЀ ´ ß6ï|ú Q@ PP IB”PT@ªНj3ãîñCSOnÚ¬€)lÓL&1€}€VÙ³Žš"¥èÒí:Ñ»p8wK¶B ›³R§M  ©vc‚Ô¢ŠF€R†uÜÂ讨0ËÞ%( ¥a¦#iîÎlêlçLno½#Ó.¬¹ºsbªVìÇ&xq¤zñÓdª«7]R/Mz•b•e’@Å4«€õÝEì{Àz'-Ó€v02˜£Ýî”Æ5T±Gf5E+L(CZ” f«£;2vô ÞuØZÍ@ª¶kñÓïqÀ3j03)m¥R—ÎÎqÝE ¤EKé¶iUF#TTi”‰@U(Û”¢÷{îûš- ö ºëí¼Þv ´)Ñ̓ §5$ ”méÐ9ÓMhAAï倴°€ÏgsB+¦’‘{i$ªí¦ÆHk{Ë7w6k¶­›3TõŠQJ÷™Åî;€ Q#jËɳ]·§Av&³Íƒ¦hj’¢ª*—M³$B´Ô·l¢œÚ½ÜêôÕz €Í–kÎîôé@„©+Fö$•Jª¢¨›iUT$ZÀ  «Ñ¬Ì…ÐÝS»i,”•_f€‘@¢ûƒMhH§Û@ÍÜ šo¸9v¶ªRتÝQU¸" /fE-†”U$ï¥> %R‰Q/}èôúùÝÀ>žûÁ–UÓ¡û‰.ÚÏ}ó¼ûVËÔ1ŒˆkÍo®¸,M¢¤m0ÀÛÕS %A-Öh4ò’†Š Ûv/AªSï½îÜ÷½íë>‚ÌÐ|S§›FÖ÷Þ÷•>´û· öùïuéLNû××½7ƒß2M}½{dj­RÔMcl·½÷|g—"RöÀèÄ””µ‚MOxãÇ…{5:­G;y÷ÛãÏ›«c`õï7²c±€Ÿ@:ÓžºKf€hi“çß|ú>"m>í;ŒéN –Øl·Ðç{wmCX©Q O`Qô=ìzztGßg@ |Ï]@T‰ƒ@(Õ±vç»ÇËãá)´ÁŽ€ä6Û%n÷¹è²ZIöݵ1•£ÑkP,a¥Œ›+o¦®  g·o¯O­ž×es]m¤÷}÷ÖÖû¸ûÎúÐöÍw^s—¶@hª-õÔW›žÀX姪Rv¾„w½½ª¥+{Õö1|÷ÞÌ»€6„”YŠËmJÚ›ß}ô[ìа^Ž]z—0îmSž¦M_`Ðt ¦€šB  €Ešž“L@4ÈÐI%%MOH¨d4È4d˜D I5 joSÒÉ=L˜0“M"B BhE<£hD“ÐDÉ6m ´Ê2šmM©êb‘A54HÔHh€4ëÓ¢‡nÕCýjB-@$”¡àQB ¨¡j¡qA$‘„PT$V@BEE‘DYdPd $I$T ¢\AOÇþ!òþû~ÛËA£•!R-UËøå?}V ‰þ%'ãßöù…ɦö!‘ÉB2ßõÕÿÿ(ëL#þí'"‡?îå¬ÏŸtöéÚ²xì¿àÞ®xó·ö¢{ ¿ðÇ<³U7Û œl^N7¶;›ä ÿdIqQ¨b¢gµ5ä…k¥kGåçÍ‹ïEJ"èÄ—µîÔ?Âþ(ŸÚb~½`ÿìõ’C%‘b2+ù¤¬HMh+”("wƒü`¥Amü9ýwÀ$_ª¡œ«ûئ.uÒ®Â"IHªå‚„}Aü ¨Có9ÿV—Ä[Ò‡:k\ˆÈBw"¢h8RÖQC§Sä«»Î)”:kßN+.>p~2Ç}ÌÿnwûC<¿–;6„!$FB^QèB­åŠGöÅĹPX¨^Z žÑ$yÀòjvùº&°C=(Q Á÷ö¤Äçµ!heçt€| ²¸þq=D¼G¶ç>0S€l…P´'Èe³î®\hwÂÙ$Hÿí(çÌ®tÀÚ‘½i ýà= Äa Š»!` ý«ÇÕü—Õ>r¬{vÜNQB$P“œ{K°ó<@sƒßZXªgKk¿›iÏÎo[bÝI§NÜs“¬èÆ£hW¥\¶¬!RùI!ý÷ÏgŽwkÏß3îùåßwÆàT ˜>¢½¶Û+®P¨¥ŒíKÖ¢ âƒÏ•"½’- Ú„÷ׯOl÷ù¬ÝB©¢… kÙœå bxp@¸½DÄGî…{ý¦ë‹¿>qÆ{áÜS$G]}XÝb>#"œÀ@±YâÛ|ðtõƶÌ] È ²!RNq$ ê¡x!‰9Òžüg¿×Dig€¨I 2=ǪìR ÿ^ßÖá}¿Óœ‡ì8å}'™ÊÏ㧤1” ÊÏ´îcg¿ì:‡l(X’(€g}+aO‚¹?¢ŽuóøóÒù­Øùùz‡W,~í<À¸­E:64Ï¢P%=%~#çæ‚ó~g?+’ž ÿKùqР‹~Gj=¾ÛÁ r¤™¼ePqùüÛìxyÆ'Ñ—^¼çž•}"øáaïB­ I—oÛöœÉü}ñ©cœÑ2=¢A>”fÜÿxKqÃ\+£©˜í£j¡K/ݧXÿ#€À6ö÷´à„EM§KJÎ×øœ]¿¦‰_ãÆXPm<Ô¹í0ùoG˜¿.0$d–¶µ=8Š›¤RŒÁJ³BTõ½íuɽ¾Må Wö>Ìè|Ud`Ét@¹¡AmRjC åâšYä®sÖ§(’5Û2A^ÉÄŠk¸o jõºnãý&àþ†Šâº"æú¾8gù-t‹ ;]‹ ¼Ý740þ!¯@秆W£Þ²üªÊÍ®òP‡’ûÙ'׌¯Ýê6 V¿€ÓW`2Hþ¤Úïµzë.QöåëôŸqæ}ƒ{W0`ðâ GËÛÉZÎ'(*2z0á¼5RUÌÕ€ˆºg}¹gCüc1Ó1óáàKôÎdð¹L´?\³M¾™ÒMZÞwL`§Ixv\ÞbÇ9­¹uFs£2Ÿh]¢íD š*ÑbË5"?ˆ[ 12;E ˆgû$‘¡ÝÄšÄI ;ƃ Ⱦ·` ®Ôª¸]xïaÎYL^ÕÐD2p„‰ZˆÚ‰æêqmé‚IÖžÍGý¶ë%Ÿ´سu?È—Å64!œÃÄ xoÃjòˆQì O'«bKm"ð«*>þw®œá@€ÿv"Ð@Ótâþ²=0‘uÄØþâ6@Ý„=ºÔ†(Å”˜“R¢vØf½¨Ÿƒï¼sÂÕ4òq*“‰yÆC9ÖlKL&Cd6I{”$Öõä¸w/{NÞ+‹o”þ›§›*’’ÓOô”¥ù‹D(T/!aB‡ðº,iW€È-pŒÊP–&â"HT÷†bM(é‹ûf»´ãï…¿œÒy=c¦áÞ\Uo !S­¤¿ˆÙDcÍBnnÄ ¨ªÇ×7&ݹaÖzóÃhÛe¥‰Þ[ûÅÚ†eÿ éVõK­i^Ôg˜ý"Äaž_ yL4ª(%nøúÚ«½róuà£øÅ j¦6êwT/€paHDÎËv…?‡p°åÁ˜ŸˆI©Í«k™‰.SÆúçNe4?…ë{HÚ‹…¦žØ¢`QeÎ7E“˜$–º„γ(Ôã50J—m=íÄWð™æ‡…_,l~îå#Dð#ôFK#÷P–¾Š ¡Ê6åôñ‡òÐ#ƒÖ\#$XwV|…^¥D¢Å¾ ˜# 饑S ¨$¡õ säSÑPTÿÚhÂÉOÙuãœ-áiEi6løÂë~ ¾¦ÈÑ]6ÿRÃ$Žã0-óÞs¾ ÌËu2õ¦˜_§2•wÖëÒu~òW¦¼‹Ã¼ÆlQ-æ2ËÉ»½ Ë`6Ð$”౸Ú6¸_¡…ç뼤ð¥frÖøóš—9LSÛ®º˜–`UCè8óJ„û)â±`{†.Š`ÑÅ/=ó¯Ï!_ *¶Åøôúg%˜ßÈYY›‘·o¶‡cÓÅ›õŸáÙÎ>’Ž­@(Ñ|Ö1VLª¥$W’$3\â2IPWšf"•P)OkPôFC.Uq†@ÿ¨<12½È  iÀCK≂Ò\¤§¯ÍÎ/ƒLæ5šêïe5àpÂñf†z™ˆ |† LjFé 'Ù*E‰Ç¹{;뛂ÁDd­Z£û¥.f^,”¬=p`gdc'™Y‚ÏߨK×öaÓ!tã'ªÍ2R]ø~œ³G˜h uòd²¦H»y¥BÊ©cäÀíŎЄŒS ”iƒÂýŒ°C»òA,ùí߫âäÎ6t͵֢ îdÂ+Ë+”ÄÎÛüÚ½[m$©TµN8e*¥ÁZ{<¿oöÊuÎÏfÆ¿6%žÈµzQ¶™Ö÷¡¡1­Ú¼# t5cW*öæŽþ~޾Ðüä`€Q ý:ôêx¤n;GwŒB‚}È)µ-oÕ°Vï7At‹õËÆÖi/¬:s˜´øäyÆÑ5­1Ó¥}ÆÃÌü“éÎQ­kj·QŒXv¬UQŒH¬b(² ¤X¢$U‚¢DH Œ‚ŠƒYžÙUXH±TXîeþRTª"‚Á`¤ "¢ÀV"Å’1×¼,F*ŠŒX((åª$Q`³-ŠFþ™R"Æ%EUÿ›*EUŠZ¢ÉÓ b‚$*0ŠbÅ‹ °¬¬  Æ@PU‚‚Š  ª)^2UTU‚0ˆÀU‹Š"Ⱥ•Ÿ¬PX,R,D‚ŃR,UcYŠª B,‡ÄD`,ŠAb0D‹ÿ…”Š °X)Ä*‚ŒEXŠ¢*ÁD`¥j¡EEU‘U‚¢"°PRE^Z EˆÁV"*‚Š« ¡Õ¢"© ¤¬ÇPPX,UTP€ŒUI«AT`VQ¤XEŠ‚£B,0PTdUX"*ÈŒQ`«"1EŠ,E‘!XV# bŠª¢0QEXÄAdDa"Š(ˆ°¬ Á‰Š ÁVÈ" AbÄUE‚‚¨I¤’$„{Uû™VÝw×Åw–óS2q=qç†z^~5ìðÈ4[n¬q°ÌÜGˆügQãÖH¿ ¶ø¯3ä}¾³ßãóŠž+ŽgýåÕ_ƒÊŠßËb5Àþ12šì(cíS–ü4ó?ÏXó9ØÑoöW*õè{O%'õ,|Kõvù4=§‡o6ÇŸ·Àk”ÊПsïÓbCñï¾ê'ÌŸ¯ô¿dóå÷ÊvFFB“ÖÑ—Íøv#Ð#Ç=ý±×<>Kuc†tÄ~§×ǯ>ûÃyßS¿jòíùcãžä69¨õdü‹ý…-ðT@tüÄDBªˆ3þv+íá {¾ÿ âúŸsæwØäR¤*d¹¿€ {vøŽ=J}ö©úÿ||{Œ"uà•Ÿ¶e{oë¥a‹üuëŸkŸûÃd âƒ/5±L€þÑ—ûþ>/È)‚¥ÝQ~oßBGÒÏÔQýÏî}©R9 ¸xÐ^Ïçƒýt@Zæ]ž˜xyÚhD‹ Ž‚ï+sëgS7Æ¡ÂfÈŸ_CÆ¡€þHȇ÷ʶøNcñúïBŠªòÃ~GÇÏi\( ”ceê‘–вT¬¶TF¢Âª(¿›câÝpE‚È/ñåÔ‘IPâøOïþ¿†×ëÁèJ…êP!°lükN ÁØHÅd¢5Þ¶:94kƒïU¬'WµåW÷|õõ†Æ»^ò³¼.rPérÏû2˜ övûb0ê û¨–• f¾Uy]J§ÒŒ5~‚ŽÏùò«h³Ç= _\Wåð>ñ 6€¾¡{H(|ë¿Øö8ý};÷öõñúïì û{ð2©ôʿمp{¡ê‰€;«Å~>ØÆÈ4˜8zŸ Ð&AÙ€Ä{ߨaÚÓæþß"3Õ‹V-÷×0ÝÃ}Ö|㺙²IU_å”çÛúñÝs˜gü)jI×|¶7Möðr‘ß!®>ʤõ•kÈPÄn8öGI”ÀQ>σ„f)“Æþx~EÀ®GÇóç*Ÿ#û÷Àqäçô©à¡(÷§_Û°Àpˆ¡oøOÃûý/®¿aÄyû(âr­Ø@Ÿ•cç Ô¢Sµ?‹öüB &÷Ú}¸Â´O¹OÉDâm)ÈþqûÏqõüÄ|‡èR8qƒµ÷¾ÛCLÓ,ÓçnË"ÂiŽàFyê¬P›búõµÝ¨ä9‚m†í‡qö¨žñ†]ã‘öãrÀŒX %•~>½½PIGD¨9ª¯¡óýþߟâ ôVCÂÑtx\¹f8ÙªŸíë5ä^PrØ:æó1$ \CMm!Í/ñÉ^µ|=:¾¶¡†¤ñ T1 E-4ËɹÒAÎ$#XF^úG×og÷Zrã|d«É¡UHVpd‡þ1'2òd%jƒßÇb€¨_fòÃíùþ4Ž5öl¾Èo•ú÷ñŸã¿vó,Ül  Œƒ¿Ë%Ÿæ÷ùG%á2Ì1í.<+¹c‰+@Aùïõ´}òµ'Ürç\´¡ç|eéF')д@™ý@™…»R£V¶T…v oQsT¤TÈrBæðàYü† ά©Ç,{?èdçã­±6ˆ ”@ÎxóÝyŒ¶=±[Æmð2¨d%!P èëöþš+Ç‹À¿ÇzùÚªÿº")F‚F‰êJÌ€^HHç1Æ\¼â߆ߞÅ|i_¶äÓçʘ!•¦ùVŸžþ·4yc©¡Ó Ž»›] Ê~<çÔ‹õ#kòÞ<?Mb•ßý¤Ç®½–ó28ìoÖ>I‡ïý' »¾?„Öñˆùþ„@ ÿ“Öí? Eₜ#°¨]׸ôýñ~Ê6ãf}ˆÝçüÙ ^3ÆAË?_€É®{?¯`ÎÄ€w_"|øÔ3êíY´¢ža…¶sOX™J„ćcòßÞdç†=W™ËŸ_Ù•²3‡«a!¢s¹Ãú‡Ö $ŠWÕZyXÈ:•n StþGè føLúýラÀmÆÆ~’1ãÇ[¿¢¡‘‡—me0ž€äWkî7ëâD_m„åZò9K@.ôEÚ} ¸xQ§SáWð+™þ.~ßKçËT!‘döW‰ýzm¯“°à  3º¯qåýÙ,'Û(ä§ÞŒ ¾¯j'küãA>+®ý$û7øq@ℊÉ\®O’æŽ/ ìxlû^êk¬èezÁÓ˜öm1PVŒ‘GÜ,W†Á¨ýV;Û ³ÆËÓã2LOKÀi¥ƒÁ£‹[VY¨p[ÃA# 2Žå8ËàâS„qljŒwUÔo=rßV“hò‘ŽAGË8È_±¨Ê~B$¸´ý½Õ‚¿ Ä}7Ûo5ëóC¡;zôÓÏ޵ª=ùûû‘’ƒ¢¤)BIUEUI‡ëê‚ðYBiàøûkÌÊýËÎyÈòOÏîýøŒÎYÂW¿ÇÞ‡8þ{P«™ºÔ¢çä¸cÚï¡$¡(O|Äx^Y'÷U_ëž.ïQ¸¥s_œ¼9Ñ#ëÆõÇåë‰$ÓbÉÏ•`ù¥ 6§0c̉ì†Íüü È¿Ç:£Lž¿i÷=¡?–±éüüè²¢©°?r©óÚ©ŒGO‡Tµ£<¯í-X á±w!äÓ•£H·»jj‚$®#¦›p˜‚ððfR*2,üð=M˜ÝcK­>¼Ø”À+„PTów¾£x’¶ ² §‚­Lµ+˜ã~ !~ëñì  ¹  ÿdÓ¬H ÿy1ƒ•þiN›BwÛ~—ýYÈÎ1„’Eé­‹;J€³þ¯ë(W!¬LlAa!IQ¥ƒõí÷ìÛZñ¼Ï8Å)6ƒâ¸½‡ê_²Ø‚f@jª¿a@Þ:Ä/. EI.œ ~Và{aU¿/ÖØ”h¾Ôâ<ýÑ—,QyyîÈ>õüŸÖ„ØU¡¯›á¤dly`ÈȪ°d»^~§Â GQ«í Sû÷xØ{·çUw©ôoœÀèÛ•o•Œºÿ<[ ÷?âZò»EýƒNÐ_²ÉDOD ª Ÿ€¨?oŸOcú5²°yOºþkCù¯mýµÞg÷Ÿí¼ë¶/?ÊOõ¿ô†ˆ½¶0‰ûcù[b×6û„¡ÁNd=˜i`¢—ëìö_³ƒ°f. {y䔕þã›ÏK PGoÑ2²¬Â9 ŠSÑk\J(UeÀÙ?Iå8ò*Ü*’Gˆ õ þ×lûÉ×¥Ÿø 8Ý*l·ã˜VxÃ8ÃHþ*Î)s^}r7°Ý„ã äÎü†¾å$kµþJ"k¦¢Rƒ¤ø_jÿX×ÇxùǾ¿–X#á8å•'¯tc(ñ‰x\“ë p8Î<¸0úHûh¯À^ªÀž… öVœ‚¢ÇøÍãâ“÷÷_?èŽaÙ¹Vû–qH©GóÚÚ~ê8uð[W [.Ã%èâ¢éšMœ¾rш°Q‰QØDzÊË)£oŸxø÷¦ó§ڿ9êJyÂÔCáÛô¡ÓöØ A[çô¸ˆëîa¿Ïõ `Ì¢j":p6ÉÏùh—€ÖR1NåÒˆo\ìfùZ»fLJ¤ƒs´äœ‰ug¯Ti$ß:*KÄn3mçÖu5'•úe@ù)sîÈ‚=9¯0ÁÇÙDççã WIѯⓊëCœŸ¼Xtð}Mþ6éWÄE!MÐÉüÞÍ„«Eâ!ÿla¥w+ý×Q٠Єe©öv¬3¢‡ûÐo@†D[*%TE20P¡­Ÿ‹a%(}sz€¥H”$ÌvŽŒ©Ñ E‘°ê¢ÆµQª (~Ü„.W|d§ü•P˜¦Ö•²± ) ¼ûr#ŠiL*Ãr1{·…P$~—?âà\.ÏÄáãWÓ«ù´Eí”Mh©mç—Q¶mÛS ¼aCKÚX¦~²bu½mºA̽ÝÖa‰Ygžyvt6Öíÿ |C꾩‰ˆ‘Öã;;ljÜ2¾X7Ÿ F‹®TYªøz ‡¥soûßênÆzu+±c`¡rÖTXTÏõ*d Lì!ÍúàÅXÈ[|/,m l~È@w÷–þÅ(´{XH›RÙ†ïøQœifAF[_eI€»NÙ(ëöÜØäé±ìXºÂ Ôµrr'ˆ’,ÔÂ)¤bxK Scÿs±£NSšrSEú!¡Ö±¨‡•…æs>® )›UÂÅ(ÄÓÛ´÷Kx8-zÜFuWŬI¼1R`±QL(NþV$´ tiŠXÕé4·Q´W^»bnãß²ï.IlŸ8Ñ3ß½cÎkc7zÇEÆDÕæ¯ÑB&uÎgšÄkù7k^O”©ú™$Ú…&JñÆD¼)µiðh%˜·8 ½cfiÕPŒ*禾vZHý~¾5{‘÷'û¼³7ËôDŽËž¼üpòBòê€þ<ÿvПk¯gçÃ'™ñÇÂ]qã’«ã–liwvFb¬¡`0RB8R“R*nçñðï®~(qßñIÓÐùå5õ¦Ëwƒ—QÝ&lÙÆ½Š¬ÑÿÇHéÎ#[ïÕöwFKCþ¾¹ÙÑ̵eÁÏ3u(Óý•‚€8q(‰#øòWJÆ$s§üK©a__W§¤µûON°USþ9˜Š A<¶x…xT‚†´ÁÁüºüil‰Ç9pü,=Ðy%|0‘Qˆ„b "ƒ-QzAÃþ»‰}Þx–—Û±2WbVˆÀîCIÁ`HU8(¦šX‚üt$‘ô+ùòè0W0Î@'EI»à_»yD¼¹Ÿ¥ãîWçë:ýþsþaGÒh¯?€Uþý°‡ ýÁ}¡ëñ(4à¢@’K^„¼Q üùƒµ>9g/}ï_„Û÷ù®ý¾<&7ׂ[=öãöPþ¿Ómtµ¡|wöÉíøÕ‰Ï¯«b¾XËÇ {@é ¨VTX*2zËUb‹F#*1ÛDb¢òÜJ¢©Rż¥U'éT`ŒDTTU ‚±Ë`‚ÅUX@„da$dHB@?T ½~Ι˜=_·Wá+¯˜U~êór$‚ðFÖÚÈ×ïéçпÉÔ{Ùâù௉_³WØV?‡òÙ›'㮢B`øIïïÔk¨¡÷ýá)þÚ›ërWÀàn»vªø¡:ÜÕª€kÙô—:B‘] rÊ/ÇèvÙü+ÓRøÐA}rÍõ¿Ð 8o~¬{¯Ù‡ÝãíãäŠþ°ƒèý†4ˆÊ@ŸÂ¡Ì1vñ;‰üE2¡‹¨^ŠÍ, D±,C¶gU£ä'‚ œçrõR¯‹maûýR^-®ÚßkëÏàåÛ”2TÃ'ÿ¾ÇëÂSn[è\J ?ò)ã뎵ò0Ã+èD~½þ»i;Ã?n4ÞQöPÿ`E PýŠœŸj¯Àÿ¹ïæÓ¿/ÞèÿXÿRN„(üõ °ãúùþýOýÌSlCåןÝûÿ~j½-ÃMÄá^ÚË2ªª˜£oÿ"Ù‹!¡=}îªrdÚO¬E¥¨¹œÌɘÔÓß´ë5«­”)¡L‹WÛK¸>™âÃÕ™ºxs]Õ½SF‰³ES™¹Éâèîna̸㛯uK ©­g…‰+[¥o]0ÑåÝ’Á=qØjÓíaͰöj±UâœÛ2[ìsˆoN­šˆ“zE…Z9ÃYuWµ›9T®ÇvÈ*g ÊÞs².Vlíã–ØÙ"†Í‰•›YSRo7 Û±xm,“OkP’$‚,ÉUV(Û[½Ú<œ[¶EÚHlöfd½1u²O·•éÍ¢h奩Œé—·F®ûyÁÎ(õ3D¼&Õ6†,ƒëD¬½py§KÆ>zå%{&U_NmhÉžê¹Y[Fç`TÈGM:œ+mHÛѪÎI­g%^QºÄÃ3‰÷H®[Y;ržM´yžå‡°Ê™—YÓ@»¼ªp²<¬Ñ|*mÍV9KkEã¢èšÌ5ذ[IèW¦ïn,]²Ö#¤Vá+—a»!Ž©iÞ6EIÂÜÙ ¥½¥9sy-Ø9¨êä±ÞïX¬¼t9ÇU[*ðc.v{g¥¬ãGç.—Ö‘Êiåf9G£·¼%XÚwÊ–;n¬J¥ÙÙT{{–± à¾ì;ªQ£YO± ·FI-^NÍ÷e¡NfÐãgº»/¨©’¹,“Sr1õ™æGdñppc3dÕ1£îƒ:j‘Åŧ›bÊ®ªÓ׊gsxí!O+µÝ˜G!¼.¬ÎgvKÛj;“AÎàš<ç3stÞ!åk¹Ô§™]I7„L®ºÀnâðÚÎ|X›29ö$V³bé+¬”ØRV£rw× rNá¼½»9´s[ÝhöË&Üî^XË–qZ™·l{˜aí v§MÝŒÞÁ89{Ýx/bBõëÎjÚ ˆ{js»Fp¶+PÛ ±¹ƒXÚ§Mw=£hÛçÖ*B‚úÍ‹œ.ïPU#žULõ™V/jÊS=zÅÛd»­ÉH™Ç;]¯§ÅîÏW\îMÍVífH¹ &uÏHë««®c4‡—›™]¸ïÙ;±5HðêY\7ŠË+– ½¹:ëjÒªâyÞµJÇ^pš»./o*®éßúå·IÌ’°g µ5²£È!–¬9”ª;¤P—v³·¥NÕNéÖp©ÝKsª»S`î•wR6o;g:„Ï ÉîY¶¥ÕßAê¶+s¶ïOmÍ‘˜ozöÎwhy˽O2}‰½ æ¦<ÈXv]ˆ`|kw›Þµ¤ŒëhÚ•‰w(z×aꛤ­>[M®ìÕŽ«gUk=ÌO3gNNË8 ês¥•ÐE_g¬ÊÒqõ¹ÂunêÉ=…n+ëyÝ]U/“vKK9-”…*{Ýc(JgÛØòûÇÇÃ[IEë{V¨»¼š•-tmnªsOs°]‹Ú62«´fÉ‹Y-Õ¤è^ÒÉRèÛ9ÎÒš©äšÊë±SÎò¨«s±yHn©«5K¯ŸÃe:ÅK ËÙG³vsž9ÊÝJË9µŠñΖ;jÅ‹¬Ë§ªUМë*nø½¥$®»î®â»{”í, ÅÜÚi±Ý»AϾÌÚ׫-ëÔ© {JÊ×`±•!Û©,UUÎà¬i_ttSU;’¹]ËÛì·WÛJg§[ÝêØªÅvò²¨‡,ôÖ½ê;sÂò‰éËìç}´ûY71v£×4Þe362¥¶³1ºU“¹2vj£J†;k°æŠÁZí¬»ÂÈëÂ2_\Ïc™=™¦²ß*kŽƒXÝ˶š“ˆVÞDšÝvä mc6ˆe÷#&nfWmÐtÖfÛ£³kž¹Î›.çV‡v+ê©íÙÌ®Mhxy G†Q2§xÖ ÓÖY9†íwnh½É’f{”-o_ ìw"Š5G:Üæº”$U݆̽C7–7Ó›ÖÅÕ!E2hR½,ë×€u_gLæÎqŒÐù7ÕujžšW†¯6S7u³‚sy’ìÜÅNKto'^5œïg*¢3&Ånó‹8,î!ÚºE‹ÜŒêêÚ|nm*­ØÝRtv*W‚ñŒ*Òà_]5[Vžu]k—‡EÔtåMÜS8VY¹ƒEI}\©Óµ9•º\Èê/))õw½e“ÊîõÜ^Éty_w$ÞÉÒ¥#¡X7†o;ª¯¤:¯k3…›[µS“¸nÓãwR¨èÄ÷*EmîrU½¹« R…-ë—WÝ5$¹É§ŠäÞgË31㳩œ–rôõ0–óY—¸•Õ.¼Ëdr¤I&´™a·ÜNÐÕŒïK"x*;SSr\¯‡MWšqæ ů34ÔØ*I)ôÜå:5F¤Ûa¶k‡^Ro Õtòãy§7§a>ös"ûy猑—)”EÖºìåüqš5g2s¦mõ-¦ìHâ˜]¦Õ­Ë­ÅMòfk-å { qq£"éËÚÞnû¬Tð±ËxŠÔÁëû’†%ƒzë3+•·]AõïÞ¹Î$é ¹¾QÅσ®:36ÄòÎ3±l9yw¥í«T6®é’Ou•92Ìo ‘ªUî«ÊÓAÒ“Ý‹-VãÛvhT&­¡Ô¨­T§†ÍÛËv·{më{ˆö%EÓ¬Þ»¾i9&¹’:Dó¶pNrÉé#uåò·59Š´N‘–Î]vÖP[o) ¢]—“=”iQ©s¥¾¡rnÅo§Üžºá2ëj^#ŽN©bÛNí•vë¬Í]é©îݰö+Ì­—@»Ì³¹x†¶]¼G¦¹Öóš=c*·-ŠÓ3Gum9©Ü ­2÷2·%ÎÖŽèÁv¤<šª@Ínñ“YÝÝ®A¦¬|æÚ••;ØuTz§šÅÜÓ©vöµNá3#(Ï»tgg8ÍÕˆ[˜²udÅÍÕn;y¦ÕráÕ%IÞÜ®"kIçÔ&]'esugGŽÒ¡2qÛÛ—¢] EÎ ¬î›£:Ùs+ƒœ¼zή˜©šÓÌñš.÷WK¨³1âK}€ðD6D†@²;b¡†IÆtøžžž•*E©€ë=íé:ekU®±*]5Ò7Ä,× Äz8á1†J‚nÐ’"_¤J©Eh 3FgŽZ):f§O}ÓXW½lë«ÇY–ã*^ì™ó02œÝ]KwÃ9²Û4y·^4‚°7)r”æ›°Á;·¤éXuÕPÞ­Vja´^ÚƒÃ1N*±)ub¬ÒÐÕ\̨ÓºfÙ˜„-í3ÈãDI6£$+6”™#ORfïC­0.T\ªÙ‘º²W´Ì™Qëo¯t}_ly/i;J…|p|u™´Œå+ÔxÈ/¬0À¨q;Cn&‰Itê½)Ê#+/3›7)3Œ=¾žÐí÷·Ç9ÞJ!‰×«8é¦Ò,í‹P½æ6èâIÄ•÷ï½Úö{yž.TG±ºœVh2/µO33ÆŒœò÷†f4CñhĬç–ÓÖcÄœAîÌ`2”ËCˆdêÎé9îõÊÇ_;¤ã5¢ë¸-G޲ÐMl‰ÅYj‘dÎd¢{NÙŽù…9ß1†¾0ÄR¤ô>ÙéœîªjWܹn zxùÃÂ4SÓ$PêW»!±rª€,ÐÚGŒ¯exÀ›·A$̼õEœ]ï8³´ã=¡S¬)-±]¤í&!ÃDW*]šÆ’hóVbˆ¢(‡ˆ@â(¢LYÊ 7*.SfÅšŒ âÂN4À†.Tçß …ƒ*›Bƒ£ÔòÎûp¥à¡ER`Ð,Bå%á°h¤2@Æ—d"ö©³qnD4–Xmº ×4õ¢ÑC~©¢ÛßÊóiæz1<İ)Ý(Òˆ;¥™‘k²†% 9!A ”ÈáµÛ#g‚Ãd*l³Çédâå22+ æRGÔ´ÞB=íA¤ ÀL ¶ÖPo Tø#dYÇ ”pQGJ} xœåó7'ÆcÒ|dÔúîËÊõ{Ú~ßî–†sø÷µï'";ÆðzGy”7‡Ž ^m=£[#f…ø4þ?S@|?¸Ÿ^ºhlÛM÷µèá 7^Š„F* æ©61h¦ى •AëŠaÀ"±mîʃE3•ˆÛz‡LéÁpÒñN>ÕP³¢ûô餼–€Ô6v­æíҀ̋[IcÍ_r–«XéGcdíàc8†ÎÁP[C ì×ÀþÏŒµD,ª1ö" …RÎÁ]Dtº!Õ`Ñ-ºqÓ˜©ãPaï4Ïj„7^|·SïÇVj'¯5ˆOЦª¹Ñ´8^:Îňg9Ä×?í–]'iS¤é¥^9@8…çØ§§6Îfĵ¡Ø*zÀ°Di‚Eì’Aål$ÚŠ4c3¡x~žÅ›æc«(££¸†Œ0³NÈ\Ü3Ö$ŸÇÇ^°lŠ~N¡p:—£&¢ÀQº ”y–{]‘Ù¦ˆéÔSöâ£øq·Bl ¤ ;Aú7ü*ׇ\6G“| ¼CÒOÚþ6ÏÏuîŸN0¶†Ò&3¦¹_R±€¶)ÌõZEÇj51DëFji¡a‡¦N Ç ,WÚñJ·.x€)÷aͧ¨Â-ù8Àk¼XèòRf)¬SP÷ÝQemFep@$hÜ(¢ œ¨…SõŒü¸Ä…0Q Lò¢Ï$kÊ¢|èåT )¢ •¼MàT“(ž¦\ô°ríE§ˆqDwëÑ@>Èb×ŠÓ ù^¦—O‚ šQˆë{Q5ñdA!Þ½%íRÁEn[¨F¸W•¨##× Ä6|q†×Æ¿N:ãD®ÕrMy÷ˆ_Síýûн#Î#qSQDî Ø-´§ìäT4ÁÎCRDFèÞpê¢h—}èi]b6=ìV‚9ÀE.¡˜Š`H©åDuÊP ‡/›ˆž0R¥D‘N`Ô•I"óÎ&ñ » p…6\:X¤+ªHŠ—6E]…~º£”u¥Åè"«ˆ AM­°´$z…-È ¨-¨&=Ä•DP‘]u ò𘉠„€®b´, â‚f¦¡†ô;˜¹¾E_ €ëi¸uƒ’š bS (S8 i°^]ÄB P'8ˆ(SBj HH·/[ô 7î3§t<]Ҧݳâ~º­z¤ Ä^¹:Tç*©¥Þ2¨näJŠUÃ"ƒñµ^ôʲN­<—Ù4rz³9˜ñ†ÄçUft ]ðÒÊ2ʰt"%üý©¡Eká_Û]åØÚT¡´vU>Ñß3vånáBŒ‹¡ÁƒvÆæþj'0J~tëM7Õß1÷×f+:䣟ŒršÓ¿œp"jyvx]°d)Š ™pÏ:È(lj=õ¾ÏÍ=x §Ú&,Ø1ü…U03Ã¥ dH©¸?ÑC„Ê1bÅ·°:j°Ê/‹ 1(DåÈØ€éó)q86£S/ðÛµÊ 1@¼§œ·2‡±[Àj᫓²+’ì ÖøÛÒ¥`ê”R=¸›S,J¹®éÉbB{(XT…àð4ò'4IzÔB8—( @vPÃ1H(†l6Ysíšðá¥뎭HEƒÁG2É 2 ÈÐAPs̾KÀ…°ÂW.’à¡@Á3 tn—L­€tÀm|õŒd8€0ŠÈ#háÆ¡ AT¬9)åWe"²2¡lbfҳγ֧Œ…Ǽ,*ý‚À~yèÔ/O°Ùæ[2AŸ[@Ñ~­¿ç|·{èÿ¯hs´C$^¸l4?Q©uPÁ‰ÜãÕ׊Ñ226˜v !h(WUQÐVz ×)\ÓØ}˜‡€¹Äb¹©ü c>÷)Á…¹Ú_~Anv v¿Ùœå¡T²“…éü¦CÊ•ÃSؼ'Ä Ðì·SK¥4GÑ 4ªóç ;ÄÉAoÇ5‚j²õùù‚²¨;^ÊnÖPîïo2:âÓ” ‚D`£ó¸¬ YtaƒËXóâoSf†ØªT)‰ËfhŒIÞü[žŠ×Šk³¨fÂðY '4™žý'k’¨)ýßJ¬¶Ìçxo²ïB°FY"Âî>Âë@98+·ËÜMH™€ @FgtÛã/…v¨Æ~—ò;•ß>¯XÛ4Èþ›R{ôç` ¯öëôïš›ØSę̈ôh(`x*¥N˜z¸Óa fRÔˆ‰<ù ‘Âä<†WÊÒ@ï ‡uÙ¹8/t²]?e…õT&sRþ®å“š‚ÐñÐ}ê0‡*dÎHRég°C”DCºm¦åÄ8r0ðÓB¼b°EŒ(ÇÀ#ŠÝ¢E æFB…˜Ð3› Æ¥e¥Fn~L(qÅqÍñ¡ÕxßxGÀ¤öËÁ¸UrGž pΘe!Ó• §b°2¸é€‡çà:\'i¢½,bŸ–Õý•£‘ºê„/ý.¥h¥Ç¹Cþ±8¶È92^°šÐæZ®ð!êœhpМ3 dd× ¼ƒ*òàPX¼w8_>È7ºM;¸:çq)Å0ÍG‹ßJw²¡ŽtØVØMÌv°0«aÌ Œÿ¦ý¢6CÌ Î wGð8aì(3T¤ ¥‘+Ç UªÌgR5h{ž"E‰°Ç3ëøiTzFt•¢=4< h)bÞŸcœù»”÷¼ˆ×3 k¬ðÄêLß:‘:Ñ *ƨ™ßÌÕ—ˆøzMÿouµ;'2àQÉL7WzÑ£ Ë9Èð`‰æ†ZÆ&Äbê@k‡àl@£<²¸à‹†] ¾(c•‰íÂ[^|NˆÀT'áó£b¹õ¹²'†}Ù|Qïm €ìüà²y´kÛ"ž'ÇQk‘qÛj@¡Ð@ç [ ÌåußC €0¬iF3­f3·Ô¬1- ¡ºê$“°ùÈ}ìAÞIÓ5Ú'‚+ÙÒ+6ýpã“›ËPSÆ] ñz‰ò ð¥K²Œ$éBÏ"€Z @¤ÒazòÞË5äx8V^˽V )ü^Üwˆ ûÁ)è IAWGòŒŽ)xž/!öƒ€JpéŒïžIÅM°s¡RÄà gÚ q!½ŽœC}ÏÏlÅô-·e êú‹}懴ïœb‚Š=Ô\Ëíy8Ú(g z2;ªúkŒ*‰ Ã*4(%†ø 'Ï3[<ötkç÷Ç™Ð`—¤9-=JÑš¾Àëòõýw$×¾` ?ì¿lOÆÒµ¬ÊYaÃM—Y\î𢄙r;`§e C˜á㇔ۈ¡…˜DòR´œ–?“€%ÿŒ8"ªgøÌüNm¡œ ‡ß&pHTl>Ç3D{ "ü^nŽ@E]pœ#0âšÈPA®UU;xÈ~WÀ£˜K#3jrÎ;ñá²”¦z^X60Ôî 6Ê+tAHôÂM^-_ÁâI OÌü™ù~Ë4ü¿e¯ÛjÇTeUÚ^7S£üZñáÄÞZâ‹´õòÒs ¡dE©Í¹Æ L"Õõ^­g‹ëB4+7$mŸ=Â8Núx`}/Ÿ^¤!;$¼CŽÝù|“ N(a¤hŸ#s¯zyLá¢zpù'öž™W×èŒߎøù³l©ùDÁþ—ú¦Ì´Š7oMø¾Í~ºÞù\Ë~Ÿ2å1ïå¨cøåP`8x"¡­Ã–öñ†ƒ7|b+RkX÷<²ÀòŒ0OF™ê$¸Ø@ÒkdY 6ÀðÅï\*o³䨳†©T€Â.išÌ@Lª»\TÓ‹3ñl‚Ï”È œ;©R·4.ÕŽ¤Ìi“´+-»”]MÕkEèSec hª$Ma\«§#ÅŸmPˆÕ*é—]Uœ…ùà$Ù¬4.LƒífH\°ÈµˆžË'ÙcÇÜ­GS^‘$`!ÚÙ+6@!yŠn¥ëL¤ºLVR–âܸE±Æ‹F n\ §EyHiS‘*w*³uíÊ#þS?VíK \vw0ËY:Ö‰!Þ™ô†oL-*dÖZ~¦a>ÔÁ´*PdK¡4bÊw[WsªZwS8vE¹rк”ÓÕYi«DÉ!™K// –1ä†ɦŽÿÇéh…Â{<¼Jx$0\º0*Ê”oÕ¶öæGlÔš8ñ‰Bα§“ôYÖ×ÍNÆçX›M­EÉY!—u~S‰ÖA!Mî]B‡n‡`ÜÛžÞÔDÐTþ·.lnÛ¥"Õäû7py.òãF$Ô¤Bƒg}¦Eò7‹J³r±™S ¡2I \À³ ‹8ˆÒöî…27rØŠÙRˆZhŽÅÚ®jÌ–’Чv*z¬{’03s0RÓÆ†1Zªi2&Še°÷8\iQÊ%¡e„‡‹4$è;!½ûv«Où6G;‘W?«Æ,¡Ÿ¤œâ´“sKè°÷–Ãí;ZcYsžZÓ›‰Fª=ʲeB¦‡¨9O–»'ˆ¾ ¬:Z7ØãPš‹3FæÒ‚C0Èy²&X™Ó³ÒÄ’µtÿäí¥È:‘:_!,ó3¸¦&s$³'Š´´Ó9Ù¥vfˆpÝq‹&Uîûƒ1+ãS zvÆœ¬6޼»–„‘8„š1¦÷'¹ÚÚ©Y¦¦(LPK0§Ì!gô‰0ŒÈÃÚ€jdƒHW]&0Âux jG'ì °Äôã,W•>œ~ÅD ñ{#ŽcÝæ ‰ÇgE•K‘½iåàÌÁ°[8ìˆèƒy»KÛ*o±`™8Ñ$ ì¼(@,‡œÉ(é°µ«žÚïNë—Ó9rF+ú‘ ´ì´žä‰;¦C˜ªå YH‚ŽÞËê³NêQv|Š^ qsƒ¨kÃõEWßTecž3Y“&jZÇÌ_Vm!;Ô$kfIøöËoyí¢<‚)Ið®RI˜F0ÜÉE±<¥åg…úPrn„ø³¦ÂÇ–cñb’#bØ]‰óY1X%ÛjimuŽs‘ãîvúCÖÑc 2'´È1fé˜3›Wwª½á·¾žõëítÁÚï²V¹{œÏÛæñвTgrÚ0Î!4×G^ÛýAêeŸŠÂS"7’sjk)ÕŽ'ÒLöŽ”)J°Rä®^ @›”IhÈ”0ÔÚWì¶çCiðµv"Ô‰E*á–/Òv©´äW˜< Fߌ„qÉ1™1-/6Žš Yu¦ §$¶jCEÒ8…;sÔ¶‘ºÚ“ \‹ %,aVi×Ù¼ìÖ(PíôX–iqpËAo$$vÃ[!ƒ*|ä"Wb#D•¼Éb¢ÙcGE‚Õ°F˜ú0JR" ÜaK ¸Ùl+k¦€„N,:6}J7:°ªãfoÆ öeûx*cÂ$IP¦_Õ[{ãÆ‚JJdm<¢@3„f½y±'%ÐpÎÿ7u†f3UUMaîìàã¹½!fù.&.6¶˜ÃX0³8çF­Ö˵DI¢0Ñ K h¯ò–bƒ%}JuxÀ=Xª:lË$Êyç@ÛŒSm‹[5H†EhY‘ˆêŸ¹Ü&Ée{±ê½¤’(j'õ!+ä飓Ègч: 6GHÑ©šk$8ce»nƒ!¿ ²å¥ ‰2E–O4ˆ‘Ä,Å”4?ŸÛçä7È_ðþ¡þá‘ä~ ;´ÔÃþæ J(ÑǬ˜Óÿu¦¿Ìv þx³Å‹×cAÚr(SýRŽ7¼á®PµjžU^rEHZ‰?Þôe.–ªÜdÎvq¢›Sg•{³;zÅÝ–5(¼e¸8’ËÃ÷ þé ñ5'®Z¶ m³‡7gùìÌÎtîÚ>D/ìÏE«?ðyùûÖüv_·;ÀlD\Tœ«ðÛ}Þ4F¶UäpuNм¨QáFcXÃ6Vp%`¾/"h¶å.Eya ù|ÖH7=:u,Ò‚Žð¶÷²üØÃ¤D@¡ìá»x²epæ¨xÏy}ÁVF5‚/I/¾^äÔÅÉ=DÜÊÌ8Å-§$*aÿL;à ±»Bçúܟ𡀕ýî€+Ö2 rÞDâA#ÕTdò®bª$;3Lå[Úµ,õ:ÎwD(P˜ ¶ã8½¿Œ¼Ê¼<,KŒ ³Ua¡¨ÀÁ$Ë—³%‹ªÒó¼Æv àF5 c[YmÆ®$w¸Xž°_®€W»ƒêçaŸ¶µÔåT´(ÁeÛX(C(`Ø.gÙx³aL®¸S€„üÐ;ÓH?#ûµ³ü Öàè\·IƵ­ºL$d®àêäÙ•qßêÕŸD1›µ_èÐQ:ˆq’-hU¬Å:÷ß"ìÎø˜Œ ¤íõÖXðš:éòÍ+¯²‘>Çf`[ V¬2C·/;ŽÛ®¯n”üéYèK x_þcW(fÿ¨×w,Tj h—…Ò`ÜLŠÏäÇî\aDÍËødç5Æó¡kJˆÍÓkOWKÌ.x÷tú(Z®‚á²Åö|ëý1æàGi@­F’¿K"¿æÉáN…†Gþ$`㥆al%‡<ë%&è66uƒJ0ª¨‡påä„ñ` õ|fѸáÇM×( ªð9éù.ãOû-W\O( ªA!»Û¿UàóÐÇõÅÕB&ä‰"˜ã*ùž¦-—vV‡™^WæŽ ü°æe"~•ë½ÏàG±úF:ËAÖG5ìøÝž-ÄŒVœiXÔ@@.[þ0ذ¥a—–í³ ðÕ§øuv­ÊÙ׌ÏMÿgxÅk?°7··U9R# êô@í€dc”£Ê°æ·8àc¼E.ö«î«̹ó\á|"?ì8x…¤ÚöQE2Ó¬—íU×9¦{‘ï·ÎëÀ¨˜°eÔðFÈÑ/ÜêÃêS3Ö×"ä;«a ÜšŽ¡w++ã…Dy­`jøác R×–Ót,pzãçŒæÁSzúÉ¡ÒÛÿO}­-?²XÔÉÄþÛú_Êü…OQZ{“ÆvÐ;,Ϻ µÅyw­ÎDt¨W?4íKϧ N¬`;<…~ví­Ž®dÊšÅ2õ¡—šU&𠂯֪°¡·Ôn×-ßMP53È~Å‚§Œä³²åtVºYá?‹&Î×V&c¥ D)ϱðöÂ冦ãM†\ÐÙ¦p³£Xnå±h)9u©DÐéàΡ÷…økã=ß­º`V=wª’s¼pýøM̯±h¼2¼ÓôîÜñZ…VÛ½œÛx‹Œä²õÀÍ%ÈáÄ`i¹ówÖóCoŒæ0¦‰yirªve‚¹am=Ò ÓŠ*!œI³–ÓhÈkpó;¡xøã{Þ̽bR6·‡}f¬‘…¹§ž¸euéíÈÚÝ(ɲؼØ`´HVaÙ Ò2ÁQ&¸Pù? @غ(aÃ2­zX攕np÷å^CÉÀù~æ«ÃwŒM(¦hféñøáó*ŒA-…•à.¬ [çO${DöÆyi¸±8ÒßW#}+Käk%Þ$ˆw«†¬µ|a´°p«‹Í`C«UÚG é]¸zêº~%lA o,Òæ«‰™+ÌÇzËO{oÃHkÛóDDw¶®BïÞÚéa˜6¶q ’¤ß«ôs3N„l»Äã–ã døy±PºQD)b­×‡¿i Ãõù—Õi`„m£úðdŽ&Ö5½Û³da!\šQ'¬5áfnÚñØ“ySmH =¬ ñAu–Í/±¥>xŒò½pÚº•9nX`°ÞzãÛÃÕ{aö/<­G™Òp8QXsâz,År£,#1cìa†hk8Œ«${î:ãë^„[wH–à ‚ôØKm^¢$C§À<ʯs˜UëoœŸˆ¦3A¦µ(ëÈ5Æ1Šž8uÌœÇ3|ñ8…¾ßµìð_bBÃl;͘äÎV]CÃq–åíŠ|pÃN¹˜ñÇð¯æ0ð0œñ8íÆÙÔ+•šÛ°{²ØÓMDæ8ñ¯idt9Ü1ωyæ]ß›<ëxˆ-ÝSNWåóãF*²~u£ºîþë.Š]ìNŸô>¹ß:CNýŸ ‹†”FO:ÉLJäƒe«ļq´I{7˽åŸOyõZMjwY²§8Nr?´òÐ^Z9ËW7˜¸Á†D ÝJ‘«bÓk›t—æ(/Š÷ÝðëÖF:nc•SÊ· ÌÄЩÌòoy‘ÕÜÖB³¶Ú‰u† ˆ%c.ksWE»ÎꪸυYx?Ñþ0?å‡ù@²2'éþð¤üùWõyÔóÒxç§$X;Å*@“4êœ`T ``&«û…ü34Û2ý‹ù-r×ûOG-Ÿö»}‹ÿ`ë>MžÖ”:ÙôgR›¸]2/.®¡‹Qo^„,(˜¶kÿ~±vË¥Ìó,2 ‰\?5Ÿòó‡ôTƒˆdm‚FÓÐÑÂàW .ýl*¨¦þ˼å³éxØQ”£#­ar³£‚å8Ïz 07$Óh·- b%œ“nÑL¹r*´Ã˜ _NØk*ƒYuë™{1¯š]—õR…bóË]s(t€I™Õ¨ —4žÚí*K0äþ;Ýæ–Ý?êý¿5!2ã ˜u -ˇjo" †ŽYH$7ÞŠZ?!>RPW]Mƒæx<YЮ ’F ®ä7qR¼–·ì׬®ƒë•oøÎ_º§Á€ìwK•pH×úê™ÝBhÿ´(,ÊÁa¨@:Ô†™"I pª•*'Ï­¾:QŒ›ŽóT$Âýúè]ƒ‚zÊè|† G ¨äýKû¬‘¬6gÓ*½îÝÑåI"—Áp !* ÏôŸ 3¶ä¶2¢mÆ K(ú+¿û}óÑ`×…ÿ@½¬NÕàAÁÃ"C"·FŠ6 29cÑYÄ;:¬«.øX¯vM½—1W€ÕÒ¿K| î¬Y@Šç‹ÄG×Ä8¾>¾°bàùQÌ®Ûe‡÷ù3PzT\®Ýß„Š.ê°®ª=÷ ç9ºV‹ˆD Œ¸v5£‡• ñ~ÐK¥qäG“­ø"你n!Ñ||ù;ÅàÞC«åúi˜L ÁÔ6Øž×òrHÈ8Cœ†XâÞu½ã‘ŒùšöXé¿Ú¯Œ@zu|¨\މçw*ˆ<ôy§ê†ég‡l~7W¡¬~hd…Fª¯EÉŒ)ç<÷9Ùï×Ö´AH^tQQ>F—~½ŸÓÀË*ãÄzÎÂaŽæV6!LW©"É„÷ޱ£–¦5…ϳz'-S! ‰…ê”ïK$S@wqnäüåûvÁ[€hd/SܸÙóÂ}ƒ ÑóÈêÕ9ófõZAsíÎ)_³Þ„þ¯&Ê!ÙSŒiý7Ï=S·ëÞ½VÛl˜eìó Â)K¿egÆbzfn¤~‚Î <#áqè ‹µùßacl1dòÊoæ®1Ñ#¨ª¨Âê6¿ìÀ6E{yçZoµáOŸoAâÚzÚkèè1—ÆIaK‘ˆ,1¥ÐÜV>·PT­ƒ¦Á€ú°»¥#…Qó]\6ö6Ô»?òWóÊ)Ï-À;qÚöê#…õÞ1ç …3œà¬W¾ú×´uÊq‰<î<7=µ‘L%ÇE‰ ÜfÎï¼ÃQ8ûá<²ÏuG³Þî0'Ü®»RÃlžcx„ªÄHhQïÖ°ž¥‰•M™ùÌLeoôÆ[F*`(¿*9òÝs7Yö÷ÚõT*Ú°Ð$ Ö]ð¤AŒ·ä¢“[¯ E.Æc ²_N%—àCüø]™Þ––¸Ò;Žøy‘¼ä-A+ýú×ç“ýJÚ†IŸj0b˜défR¥.„ŽÚ‰‡ûÎ4ÌÖÞ4ð';ÌbÆ%½‚îÒ½,fw¾ÞŠÎ~ÿ}^´û÷Ì Êˆi,㪉ŒR)ûFJ{;’ HñE‚¢™~ùX<éqä¯ Ñ)횀¤Ú¡„Œ‘,Þ"ÌÇx,|+ Ü…Iš?–ûcÆfü,7QÓ¦4Y‡'*˜o¾*5 á{⢿Lc€ª}t! Ÿ‰aã8a…Ç%¼p®¹nüæ¹N;Z™Íé…´‡!ÙaÝ2[\u@{”Äê&ùæ¶ûQ;í{?À_»¼L·k|Ôãùvï€m®$ñì'ÿ(¢‘ }ë¾v´ÿuç†:Ç4œÎÐ|DÄ‹7,•¶n÷çR{jZ×SñVh‡N tã;íbWkð½N$Ì/*ðÁ²f;öŒ?mËÕÌ fÈ÷uÞBødEøv¶MÁgPVT¼¨ù4_årî }>˱¤(6¸Þ„& ‚}¤Kê\3¨XQÓßuBÕBúóžäHåOŒ§ÇÞ@ï#E>Ž•èÐòÄ(Zó|tÞ²«‰h_æ`Éq,« QmºÁ_0¨ò‹ïˆ¼û|>>ëÑãYc3'Xq‰¼™›\uô}„@‘]2fä_€ñT6s%5ú##5U™-ºÖÊùÊd|ã>¡‹pxn;žy(À4&™0D4Ü–æ2åW&[ò }œƒ WëÖå¶|T½¬Ž$TE¸o À¹ÏüœgßoX~œ¾y¥Ù CÚ-­R?…"›ðöëÊöÐÃV}jŠü`y.Jø§K!(Y@©»86Íàf*…–•+ê㥞µ7°¦€F2]FEþcøTÅDoµúÎ 8æp僴p½‡Tú Û¹mR¶êFáOþø´…›POy÷Šñ1>¡h(EâÛöÆSmm-žÈ'.{åæÿ¿ê ‡—çýB2H€Ÿ¶ ‚Qú*ÙÄ=û`û”ÏK>~:÷âáKÌÚ<sÚúg }[~æ‡]+úÁÐ@=ø î×nݯ¦]zìCî\Ü|¥0?¡‹û¬ ý½“9Ráþ0I"H°ˆ2 ?¿ýsÿzŸËÿåk¿ßH­µµS¤•þú§<¹N»ùû}èoý–µýÿidÿ¼…þæ?∠xVUûš…OñdÌ@_âYŠl®)NŽå“ÿ¡9ïæ|ÛâIÏ §§rÔXáž›îhÞH„9§Ÿô׉ÊCÔdbà ž¦ ^<ãÖ.ýG«õ'fßKnº#ü…a$f—,cVJlèWý?ìtm,6Q1ü|ë‘gÎoã@ã üåìKhëAü4‹H›Æ´§þ°?à3¯öÿ×âƒøÆCûáÿjBÅO‚h–Œ¿ùÔ°ÿå_ã |§g»³}»±±„‚Zðv†ŠÃX\6P¡µæ›Á•>a‚À È)Ð`+±m°táÜ€Q£ŠGu¦o7u½Ñ¨²¯È¥à,(¥W’8(¡hw2u;ªÁgÒ¿ç9š4Ïe‹ þË¡Œ `m©›ax÷bWÕ¦x Á7‚ìgíÎt b¥ÐY0¸r1[;B˜ñ½ ݌وj3·Ù…“X8‰ÚäÓÅXsÇA‚*WF„C6°ùsf ·U8#àoU,ÈBìK¥cƒšxøIàUJAR³™…zÅÆ2`Ú—‡ \¥ˆ zATMŠ À´Þ¤¦´õ[:/:x†‹ ò…<¼b³ UôεÒdÈÙÈrY›ä²F’D7‡HÊó/E™ËÁtᚪ4"ì°„¶‚¸(s²r‹Òiʽ3Š‚"Îpa’Èq>bo»C U•w#±¯©X.4A‰¨§Z€àˆñÞ“*¶¨…8À3¡jz‚˜B·¦NäX»#nƆ8iƒ*ƒZ\aé$mÀ®Ž$.îïF`T•åÈè9N$:áFr#«EY 6^J«#‚à%%˜w"hB# äÏ*ªãÄ8ºˆ††ÂNÓaSœº”PŽ[5 n†ÑaÄDÙy:%o* ‚»=Ôäç#)_I»"¡šŒà¹…R27Ä'¬°&I„V©˜bì@”(Àv‡<ëÉÜá}ÁS¡£B€@è(Pœ<ç@Í ãA%V"åË®ª;8†U)B†ïHcw0m^ˆËÀÏ“›*&=<]'u 1²\ÜŠ$7Àé$ º¯5Yc- Y5ˆ—cfÅKcŽŽW„U…‘È5¸%`RÀâsQ²]‘s#Ç¢L…ŒÈÛØ´`$0î‘R/Ò]+•¬mÍHÂë—og<‘v&’ÔÑxq„ åÓòv†M<t†gK6íµ½ÛaÀÍß@ÇPU±ÚtH®;z³—WUlaܼê<ªN¶c(`¼9.n¶¸Ø‹Î^ ‰>REôr5›»8$h‰á=¼ã²ø LhÚiödÌÕA·€<Í…,ðÙ´}¯¢ð‚6€Á²fÐá²,rr'†wwB¼Àï³T,Ãz˜ö lšä-@/kLà…‹ŠB¡ÓV+9IÙW#îÊw¼¢9îÐh‡–\°»ÁU™]¸¼¬8q„o˜xô!‰RYª%ê«dÁJ‰¡Aìö(ž›íÍy4¬›µF«nñꚣ‡a[inà-Na¥¸7tNÚÛv^îAagnÛ7vãgþ!ÜA¼yAWßUl=ö®®fÜ•ÙÕièv.÷¦òo&VVëcsoÕÜ”ƒZxç>—m„’¼ë»ž=[‹jÎ…C\ÐwtÕ ×–Pî'Gme:žÅ²#Ÿh¸á„àãL^oI`ÖÛ¦û¦´íœ6Ó­ “ÉÝñº˜ ï7š±Eô¥=VÂÍ­žh4ÍöfÒ§°r­h,§ŠûwµÛ†CÄÁ8»¦zº¯.aäÞwÌ+œšÐAHžÙê±)Ú3’Y¹X%³z[kEIO¥£n &'¡°óš;ÈxðÀ“:´öÂÆç¤UWN"+Od]âwÒ Ê˱&¯t@šâ´Ój¯­Òh)#n€›vÖãg ,Øå‚Ò©ä1ÍsGneÙoîìÒóvƒ¢™ãÄoi­ˆˆºªì¼ƒ9“y,õ4ºs‘ê­hßÕXbqe•½¯ouó–nè¡®ó÷_ÛðºTµ$%$ÿ¸°~bÄŸgÅŠÄÊ´;ZÇääkîGH®Ý€ÞR5²®u0‘‡(dL°Ö¯Xrà š½ÂqñÍð°ko„ìæØHcQ¢ùºáØÌ#Y Cªª¡¬Âà -L„“”ŠA1”bË.ša bÈ“X)æ´nài‘%¦tÒ”õ¸2íÍ^®ÑÁ ´!–Ô2À®H¡lÝ‹µB]:b²ÆêÓnV-¼Æ-Xž4%\‘ìFg m È•‚ÇZ¢ˆÔ‹Z¦@¶m‚ ›Êp]±!Ày¼™+o•±&…æ1iÉ“ $]Vp†ÆÝ÷hEf5\z^Pl@'oifPZFÊ7ÄoYÙÌœ°¬9¡©Or*î@‰­qƒ{hi#)H‘3³!Z°›e*Éb­‘v%Ò„‡ö<¡˜·lÜdŠâ [î=-Iø=ZÜ æ¬åÜ䙞Ñwü°ù«|±\L¤aøªbÇ‚µ``ѼÖ0vÊ@l¨(2*d Mi˜ ´"Ÿ.Èyn.ÄêÌ\jzh°’ÔU›èËEŒ#'6A.rãjZ@²^@j&D˘,ÕÑž·ldÞUГ¬[YÖ&eLbÈN†ØÌY;\kþÔÕFHV§*0j–¤“× Svi—$W¤U-Z)–’Ê6¹pD!–F‹DT¹¦2äbÝI’¸:P³WX% qqbÙÜÒ©Û‰êì(õ±"Ä4‹GrtZB‰ÃŠQ¶®m]†+G‰tÙæ-Û\]Ät^±·F„Î̆wEd‡p]ôã%ÅÞx‹£Ù­2'”ÊE€ÂC›(àÒ°r„ ¤úEAœ~|Ñ‚/"$?G,皊k–¸«”$Žž‰© Ò*] {§1ôš'„¸€ŠÓÕ0¹yreXÝËw4Q*r"dFÖ–ÒaÛØÉy•Os †0^Ò»ÚÁ"Š6–hˆBm‹5*li†„èÕº±I“3,ë©V2±ÑZ¥˜iƒVMé ìa ´ÓlˆiiÕ*ê–” ÅÃM,õÐkU‹S6+c»„,z»®eÙw=/+g#Qj…ê(ÌõÍqe3’ÑA•ŽDš V]H/ztH—"ž+—¨©×jAÇ2å·“R.)]Hݩۚ å ;nf¶øo66€ºU@êh‡pj"Û;U¢Ä¼ÌÌ¢S‹"H±@9¨ÅB CÂÌD‚ÈqX†^P„ÈÊ*æ ’ ¡{¼kâ¸í È”# ¡äÂ3d]‡…MÁÈ…¨ÛêHä[—Š!].jD )hª”b…8êJ) Œ †#È ×Ea 3.G«3µ;º,nÞÒÀPÎ4 K75ÌÔ&Ú «HØZj{FÚz1v…ZÊÒ¦îmb‡0ÌÑ|OÎ'¡Ò…3fÎtxªP«­,ƒØÙ‹#­]MÛpã—iˆÃ©.Ð ¦ LXx,‹ÌjÖ1׳¢Œ™ÞêÚn¨cÜyFï”a‹ãJvç-‹½ÛZ%´Õ2¬QoaAU.U.°‡›†„ãvëdÎ]Y¶´ŒºMç^ Á!#LéfI&‘[4ÓÐÉŒ8Õ ’•ÐÁ%Œ°@’¬²íMÛ »§­b½É»È@™Ú〾0ŽD­yqpÁãz*F–F.ÆkyƒqéÉ65#ˆ1V6°‚c1* Ä0¼JåY·¦UíV¶ 6‹Z,Ð|Ú¼½ˆðmÄ« ØêtD·‹®¬‹€ l¨ÃÉ8ïay“bºA4%ð™±|ÈZìtIiű.òÕ$QEãs% ¨× ]¾Ù4„Ö< ªÐvB// U½-×HÐЮ©¨!€::ÕJ®‰]¤ƒï@Gž´W¸{2ý<Ⱥ›•—u’,nÓZ…Veæ[½[¨“LÜUeˆeˆ6²S‚lÀxž+‘Ï„UŽÝãÅ%·íÉ—z²n†¤‹›bph«ÛNÎFÔS‘ZïÎÎÜÏN$c逶Å®tÕ‘´‰ 3ÇhêÁ£ª˜—[L‰™H›gž +%‚–³ŒÈ1±¹aæò¨S1 P3Õѧ5[Ê\¡6E ×Uw2Is2¡`‡kj@Q°‘YaaL;Âô¢>vY¦eI»¦™°mã U us…à+f0¢ÀªÓ‚ÎmdH—OM¬Û»'7v¬ks´Áº°²ÁxÁlI$äfŽmË1ek-£$smö¶Sqƒ¶Ž4îs š°2²:×WU›„L¹(6¸AlMRt,¶]rÌʳ{ G¤pbÅ "õ£°1õ&+@’’É—zuâHñãÑÏX)Ó{ÉŠuz ÐbîíRAu‘œÑ°£¼s6ÌÔG3ÉÊ.ðºÓËÃ!té ÍayœÓv-4ZÓ¡`ÔYtŒªÙq s2è<żF…S=çãz¨å'Í+aT€…(‘ 0ÇBœˆ%£Vaˆ1Dd®Fœ¸Âx˜bCË¢ñ…Ø$ †ug îoó{LžÚXöÔsÌ­1QÛ¼Ç`µ È¾Ñ 0 •%j­•’Èm}v? :׈ðvcµÌ4ÈdªüðúOEýœÁ* þö¢i:Ã…@`¬TH‰–…±—ÿ½„Û‰ªƒ´¯J—mLBˆv9ñÞ •ó®’òtÒ²åEˆ›JI©ü¥Ê’Œ¢²² Ãê}|ŠþþðËLUÎ{ˆ‰cžlQmO *o„×çýûùØþcý Ê;=/x´oû*eþVÓKØÓ:-9œ†lá ᡇQ¼I¡ ²F ­ÿØ,{êÿ`Ÿæ64…—þMõJ.2ù”Øþå?¾û«Äç? ¢V-*ÿÌkúcÄ%5‹ehMBAꤲAÔü ÑH0º’iÔZÖõ ÑÑ#gÝ‘„PheÀ`MÚÈußEïWÚzNù Òn]Xç…w\€°F“–*@–©/-– <Ò¦4€ 6ó#orÈ<0Zƒ‚4M©˜ÊL´Ž©”9'F†Ò¬#„2ç †Li¦ ¨AhB4¨MT5Î¥ )¡"-AnA0ª§Yeu+-w½'];ÎüæïD­Z„3%GªægˆQRkêÙ:NŒ²ú¡ãÙ­”;þh€0Mß±ôíµ>»§iæcžMÙéé‹Äx«Ã¹¤šÿ›®°HyyyÛì÷¯žWe ¹›–ìÛ=¸Î¼–wwŒßka£|ªï®fp¢rƒO35ò;W–Êêá'¹õ®VlaÌ"voK'4Z–æ­M«®[ª­]§·˜‚ìÞìîìèÊ3nXÃXÆ‹Ñ)ñëEÚ¶¦žÐβ¤ÉéŒIÞ꽎ͣ|¤ue×V£Y*¶¤Y©ænòÇ%Z ÈÅ]ƒhÕdñAí­9窙´žnj¹§¨SÍÑÌ–°)ì’çg·Ò®FŒÞ›¡6¹,‡@œZ屨ڋKŠçÁ#c˜ Ú“²È–LÎÖhÊÉNõå5%·×4c±p»lNè¢`ªnæm’ÜÍ+׸p^-‘³gfî)4.WØË#rnLÍd]ÆåHÑÕYŠr‰Ënïv^îN+ì u 6í[}{Ú¯§–öÏËÀŸb¬T²Ù¨]3A¬tU{#;šË9)7o WL»ŽTä·,º Ý€¦Ž¡W61òèõôï^o¨w–œ9ë%E± zBŒ1<¥\E'¦¡6Þy¹ îöén³;£ËŒâ³QÜ i& U¨¾a’OW)ên‚ÊUN5=*ÊÆÈq ˇCt êújq=2W¶¢‚ÅÛÞî!:¾g‰œ¡È`¯'±nó,Iâ¤TÉä ä HjA%ó&p xÓaB4j+±H _/½°â6õêøëoHq‡fîÁB½²Áå)žVœf¤ÖZ™âîæPñ# Ä&ðQ0)¤êQ©Þ{`yËßm:Lõu»°àê;E—hTÜ/NÄMhui©Ó/[ÑÏ]CF©Òl^¢aYnÅ’À‡õËB"œË;}%õf ùgHuÑ]²³Ç'¦tÈtÛqR¤:N2zaÛP^’Š®j°…´÷%Љm]Ùžº:/y+¸Ýa-Ú´²/ld6@Á5€ÌÜš;ˆÙYhšL‚¢EÚxGjgKɘ[½®µÎ;íε]=[“]v®åH©|ÆÙækZ+p’ ÀÒQå—BúIW4ëI;d¡€ãKôšxZAÜÈ4nBÕv^@<Ý™Ôt½ k‰¼€ït³²3k§c€/-Üéšà«sföéÖ‹`²ˆ¡Áv——’$€€ä”íxð2òKz)ï;Ýk’¡ÎT„Їǎk*–\УxpFDöVó3fá#ÔUâ‘nW_UíÖ;nPx‰Y ` "J ¼…Ŷ™šZTtï[{{äãÅ ó¼’™g«X#–••”jO&NýW”>„(,%‚1#Lb{™f™hA•Y565H5Œh²&ÈkVẠ±‚1Š`6Óº`€S`"5kC¼±›º9—4.éͼÀ¬6ªÌ¨€‰©s¸¥6^šÂšÒ*îófVhÚB„\ ¬×»3[£*VÊÉÎØ)劼4ª/X鉻;}6¦…×£¾çÑfx˜ŒæYŽÛg%Œ’©h5›¹ l¦YFñ3n¹Âà*‹+D6Zí3 ÑÓÖNòœ8+(½9 Ê”ÂÑLšeu¯tâ`¡if¹VVˆâa†8ª± ™r`æ8¥ê“ˆuÑÓ:ScÖà8i•3„„ÌÕÖ™Y™‰”Ì%̶U2Òນºbc Œ•™bÕM“E¹ÑË•»[Ò:Ì7k&[ƒƒ¹^¥†\MÞ&pYxî1FœÌX¡¶G0Ö¹s‰¢ès.]g+Âe2ó/0Èe·R˜ÊZÿõ‡Y§-áj.€Crdz¼á Y¤N²é¢‡d…«•o)rÕ 4âdÍ)ë¬ç9–&^ƒ(Ü;ÂÎ5T\¢Y©†K®î9 Ó2Œá”ÄÑÆ•HÚKjÃ9 -ÚdÈŽn±:Ѐ ™ÙS«æãšÉš»Kk L&™`‹(R‚AAÐ÷.„õܱ7*šÅƒ+jèåQ ‡u;‘ª&0ÑÙééÓJŽ¡ mºžÄÚ 5T¤†ò[¹™ÁÖ4u<¨Ad9ÊŽÊpã3\lèÈ™’Øc+•`“º(ر3Fx’z²¶LÙž=ŒguÝR@­y'tÓÜÇ“{EÍH´…P³[54egK6DDÚ±'o†2F€õа‚’,h1dLXé•Mvy7–•ö4ð-¹éo·¨NìâY]´6s†Òfy[{W`©4íKVDÚÀp,UO/µ»ZC3s"¢å¥DƒÝ!Œ§&¥ÊGàk‚¤²®,¸cJ u=¬# íæ†Aº"yn«½h‹y»{¤õ§*[6èGuánLÞSžuTÏ^ÐÆhhO*¦¿æ‘&’ÛT7¥Zê$S¥Î¥²r®\É>n˹ª¢B•Dm&ÍVfu^²vyöžœÇ›vGRÚ×7µEUÍ ´¹g.©ä«ËO.hÎ.]T:Ô•s¹NO± 1T45ØòçäcUL-¤Þ±Í&Y"ÁdlìrÝâ³­$kr©œO§9— Û¦É,-›&!­ªBlɰÓ,»)4ð¸«OhJÚ²‚@ê 挫çµDžz½Í[ËÆ³Â."¢ºS;p!å äÕ®[š%7™T4“Ô³vêeç$‰¼-PÍÝÚvden;KJ’/n–,§ZáÉ«q’‰¶ŽÁ– ™ÛÍs&ZÀޱ¹+t:ªfs‡Šx’¯ûEQ«äãW‰UDŽ Í™†ýj¯4P#%ÄçÉVp„D˜€~YN =ouÍ<^3§e»Ëˆ‹Ú Ù¢SOaH.à° vÄ®"Å n2I¨4]Œ† pfî…‹ n=yÓ)Ù-y&C‰$ ¹Hje “×WµZ3GJ:{n[jï œœÜд3dÂÊ$B…$ÑCrpÖ›(æ1uÍ#·,É$Ò@’xLàŠÌTÑI wo"èJ •;Ì@åíBàHÃtA1æ!µy«&‡ œ9g§2ƒÇ—!•r¬p»7f¡­8›'JΡµc&ÓVìmF äÅ®ÑRW9ã‚mj3u)å Ú+i"­É6µ9³Îõšç:é@Á¶Â²ˆ@á»eœ˜0X€ŽØßnЄ/(…µp(VÀ‘×J€3}bË‹•‡@9Á W d ípA¼ƒ¦ÅŠ”C®À8°ÆÀÀPR½¸õY2ð!š“"ã”áV·s‚eï»N—Ân¾taJ'·z£` ªfå\G‰î‚§ª\8C1a‚UƒHçY˜> †=7–»´¬â»¦`¥^þ¥dè7U©Bœ»uݦ¹…1–d¥rëp¶¶ÓpÉ”¢…¶ÆS3""å ÅÌÌ- æaç¹½w/ 1öÎ$PC^û9šiÃÎüß7Ÿ<ö’N2o«Ç‚k² £hw½i›s“QEIЛÀë†- ” …VN]¸¸Bà¡é (b…'Ó›8Ú¿‡Ý}u|ˆ¬‚† ‹¨(å4+‘ÒV[€?>Ø™úþtk FUZ©¿–PÌ¡1cªï»ÖÂf²ÄÍ MÉ“u–cšïCgo|hÁÉÈ»€s@[CÚTü‚5@ƒ@hŠÝ0ß·sÖ‡ =à1 ̺ÑU)+¡hQ0ÍË ÌfÒ‚ÅR`B¬î(5=ãa·ÎU±@g8ÕúýQLز!JP@yP{ðª—jÅšlí‡*„q Ø¿F@9Å­ÎúÞ—–©':/nØE«)¦fÒ +5'C a7Õ% 1ëo˲#Q‚ÂVeƒj™Cu¤å¡Åˆô ø½ð›Æ ©Ç $u$r`’-ƒ€G¢.×p@2[¨(ÈHjÐ’¨eÍ!ãžÍû×¹b¼_…+Îä>ÔÇ̼k©kSm~eS]çxe*8B`Œ¸Ö°0³Õuµ2ì¼^ª$åÈy’_Öž"“Ò¤¡©m0XB˜°$IX…óyñÝý¹* à~?Ž÷ì¶Tðýr¨6j¨¸uò¿–$ÑR;ݰ}]Cðª¡6à” À uLeØ4 +0slóyóÛèf"» üž ÄY„}ô‰­¸Ø¦{ž{ª×x¤ìU fߣV0±UÙWgE¬9tŸ'&‹{PP¡²*‰uY$‰o™¬¶¬MyË‰éÆ Ä# NÀ¶ÉÃCÇZ:Oƃ+{Õëe C‘&”-0™.M”ý9çFbPzÌ!ÕÕEë1ßÏP HAß'¶ÄðÓßj³²m )Cê3LM :mè™Ü—¨ùL NY“Ò§–<3ƒ…w¶<75yÊ2«Å8r;jˆóœyVÇRŒR¶‘4Çs/~÷L²ak{¼ç@Ütƒy D1ä3(ÝÓpKwSÃ)fb‚€QœõÐîf$Kâ¡ ñ€P÷3b–ë—¼sµ1‡45­{{ ) 6ÜfõzñÛМnŽ¡é™Õ¯åCä4xÀÇÐRuöß´--Ф۔µ¤ì&­0óÆh#L`0Ñt«è–çg§BzÔ“9Ý5}U]±†"“ÊŽAdÕ²æÕ­ØÌpyc Y ¸0 ¸Œ" lÛln„‰Žá­ùÎó;O]M9`j£–°DDXŠˆÈÅ"ˆÁ}Z„Ac=ûé›}´H3M›‰à¸uÜÉ"0t‰ˆ Û–ÇËm9öàå ¨\îKÈ=ÚµuBJ›Ò9ۗ׋݇’†–1¹fº^¨¨uH¯ ÎŨˆ¯ )“Hy-DòݦZj÷Õ++XµlÛröðî<»“{êóZ˜!•\ZQÀ‚r>\¼X•%^p‰{¯u=p$pd|‹¿í°õo|·ßmn“…R5ÂkÅDÜ#P\ìésAš+Ó‹ ]äæÌ–QôŽó»Zl—”ØTž¦ P…!HãQ 5}är3(|¡iTÕ QàÂwJR–˜[ šäsPcž÷¾btŒÑ1Æöò‘ªÁ‰Åv—•ƒf‰k+%]f*¨.ö¦E_Â"¼saQ€ªbmͰúG¦û†Öi”xì¿uº™<´ul,Õ¢GÛR®®òúUcÊ9|¯†¼¹ T»¦)¹1v+U4k³®¸›%Z*ezÕîx4H¸®°£H‘ƒßQÞ€Ÿˆ°GTš$†“=,°z«u§bô,j9›]ãÌ“‚Bö_ªñÕÕzsJ¦ßÓbØáY”Á¢à4„Á B ly§]CcÛÌÎe_)ì µ7äÎ4Cu2 Nb·Žg&öñ ¢ _Pèbð“9êURÝ`'¼²)ÔÎïTXÚ¬Õnjo$ÄÏVgYo‹­¦PGqFEXE*¶C5zÈ¢6c´²PtÂ-vúá«1˜‡dݰȄ p=Ük^êÚf^ñìÛ³"÷®x9ÙT(!†ˆ{rò÷D’n™w¢ QËCHjêÊáÖd½ _p4‰¹”VÆÒŠ&è@ï­ ç ë=8èÏDˆ¯\"ƒêÂUš×Ŷ2‘ƒ<¡D‰ƒ,ŒÃ%¶ ¢Š ·w&š–Ь-((²Q¤¢ …XÆÐ Å-­iP*,R•QeA éó9<¨DµÇhê±!e8zˆ¹Èpïiˆ6jÈd4ÝhˆÒâ°‚@ÂîÁ(j«›ê9‡*]xÅ÷—”ƒÃ¨U {j”0=G U 2ðf]eL·),ßWêÆkŠÆ Ø³²û©;múÔKFØPl=Á²Ì”åUÛÖØ^èñË1“Ç6Hø×9Þ†ß'`l(fŠ$QV§kRÆà곺¡;èt6÷½rjØg¢€^a»ÇU‚&¬<*© a Q³¸w ØõñΆ€çR‡(*ÊËWAh5B—³˜ÎèUI÷ L<áDC6ÛArãÓE‡bª$1vž®<6fg©úðt3½ÒM–$1JC.uãÖ-i˜ ˆ6È’S™´<;{}•ÎP,Ù8H¢O˜™RœÍ6Û£2+ËØ#½ɼ×j H-´ã\¼ ^XO(U4:ì0Ïdâ©‘ÓO—˜«cò÷`= ÞÈ æ™v°j¨T€Dš¤&&PÙÓrâÍ–_d@ÖÈ)1Íu…l&ª»CàÀh^(Áq…:vª$edcÃ.šàŠ,‡”¨‘"cV+)V8£q…ŠÐ¶fJS1Åå´µ/«‰ZaQ¢[h#mF"0`¬d`ÚQ¦ÊEˆeR­zö¾fFïL-ê3ÓèŒG¼&WZ4 ¡RY£L®íÃRŽJtÔèÍAÚpeÝ„¯¼¼<¶—O?xøµêóÙ¯*K7DЦT© r²òË÷ŸOwÀ8$Q¢•óVq ’ºœ Þßz}66³h^øÓëš§3¨ÌÅQ&³1ø°uiâT´ÅØ34·WµöRVŸÜàp£Õt UfªJtDì‹0`êÑ’ôXA8p̪fƒT¶fb¨úPí½ðá™™£ËÂèä e"Øö6i ¬œöhŠ0„ÕlæqÀÄJ•­e¬ŒÜ0²C)…¦ÔA†,X½ð/Z&ÀÔF㬠n…›të°ØI3Ë&D‡*uI/,©ˆÄ»º(G,¤¹GZ´;p;Ùfk•ÔZ; L²uÛ‚í]nLâí(Tɧ”¥Ý<ÂV;°Î¬”ôà‘º‚.æ:„„YŠ•}¯2ÁzÝ*¾#Os­ÄÔ'\QbÄÌÚ¶Ò}zAͬò‚û¥K¨UhÇaˆˆ !‰‰‰YYªÄ`ªŠÉH0bƒ ¨¬QR#¨É¤‹ÈH‘&71½‰É®îñçiûœ×=BCÄ„§¢Þö˜ÚQë0`­¾áXcä¸UÛ1ZlÊÕ]¦§dµ§©jÒT`<Ëœ~œÇb³×ï1|z 0î¬P'~Y[707iÝ›ÜUëGLÝÄè³™åÜ J/BlÜØHóš WŸœØZ‘•¾öðË"J úsižrÿ€ˆ† 4>ã¸<:I¬¢þ…ѹLÌ©h#T:ƒ™ÖƒaŒˆ .Û°¥Ãϧ Vt»®«Ëßt—¥YЇg“ ÚAAÆv`Â3‹Yír^p°N¤r¥9ª(tˆ‘!HÌqnWÆs!’hÉÜVæa3¶|â…;㢠]ÄQ`W®k7S;W95šægo&4®§™©Î>,›< Bî•Ý@º ÊTˆÂ3N²¶–‰¡hä3³mÐÒÕH³t`°ìnÀ yŽ¢ÞL¸Ç¤7η¥ÀQ2 €êTêÌÉX(ƒc,ˆ±X*¨"0QX1b)1‘TTQbÄ@NwßL.œO7Ü7ùï×£¼=È`Õi´©{U"çDØõ °*a‰ÑÏ¢¦¦¼Þm$Ö%÷œ€)‰çjû͉1ölD@Wzƒ¨[í÷€€­-¬ÞZy3Ý!ÒkÐ"Š0ûÞ–$Ÿ#Þ%w—mlå£tʑѢï Ê•¾8àTÎ)â©ÜET €¹U5×…iì;„ÈhtåNP¸ ‡…ÝhMhi2_d—Ž˜lÀ‰¼”óuÉÙ­$h”—@ä9,OÓfluÐlþÏ&ÉD°P³¸ØÌ6ðH÷{+Àfß"Ô+„}t¸í9T2ojâ`¨³Ä«·x%~óö÷Üt™ØÚµ¬Õˆ†{ÊÅCT ¼g[ ¨³ûÜÁ:´ƒ+Ño‰ÒbNrÔ"’³i:躬ÌÜ+¾·Íͺ‰ïºv0:<¡^†4°Ç3pÄ1=°ó,W¾a¾ST¬êRÌdRy˜âë+Ä¢°äõq:4å’“l;Hù`· uÍ.dšÉˆtÔ=z¸ôݤ© LÀ$Á"7(˜Änòé{4éâ§Áøö)=Ò«¾› ìäy]Óë¾èšÀ÷u¨ãφmØËn]lUÓ³¡\©œnØsµ+ŠäÍ^ΪÞÍ%bKs:ç¨ó»å[8)]aÞª•ºSdo [#³kãÃôå–ñUÎMZ!ñ¬®œLIÉ9m7tÃé7™u¶2ôÏ`¨-Šö¶žÍZWª†1LÔ÷$êÝÄð¥ÉRXÂnJB[=Û[­ê™­¶'N3OIÉ«Z¸ ²Å¾Ço0UÛžíW’¥›‘zo:Œ²åæ!šE=Ãr•u©ªÆó¥Ý–(ÝŽÉs¨ÍÕÕKèH“ˆ ¸âü"`*NÉœDgm6,E·$Š˜˜Öi]sèÉz3¨PkAÞPPðÚd´±3 ”d¥«`̤p©Jc3,Òy»•R í˜Žï¤Òoç»ÑBôPW:“šÎµiEdF¢s &›)™¯<‡OT#LXÀQ(Õ(¸ HCL6 “lMáÊp´XsƒIë.mðÝtA›J¹ÌO{¨@êæM"#ˆ€s,îÍÍXÊ»T뮬½•xÇ/7E#ˆu^Ašc6)"Ë4«¯æÎ‡ºˆÉî˜‰ê¹¢ÖæNhÈ ¸SkjÓ+‚ÀlÅ‘„2Å.$ d£¤»ŒôúC­s$œCÆ#5X «’ˆ5VÙ1˜œf2k ¤CF#+TKhŠ„KH&2sBQN’ºrÖu€ì\(ª1b RRð 0± a(ÖQ¢Û™f¤("0äHX$ö¤`†ïgŽZA y#‡\¤*ÝC£û:\™®pZ×4Ê•ÜȾ¤*ÍŒy´²Ac&¥|r–jJR*¥k ¬’4ÂI:™Eø…ú ‘„t„HFJÙìŒö«Z)²øwgº:p|Ùì÷ÎôˆÇ‘Õç#Ó8F =M\k©=µLñm—[½Š„šâæ ÅT4ÈÜZ­VŒÉF…&NÔÄB j/1xÆbB ïÆ˜Ån¨7–?±Òó6R¦$ê¦mðè_¶µ±Õü¡dðü ¡¹È¸i“Ñ‹”ž°±¤šHmH¢aTÍk[Em}É~Ý9Jò´ÅËJ"w«©mµîs ¶Û½!ó ·™ŠŠGktÌ‚fB¥8kn©¹*å™Ö¬¹’ˆ!ñ·©tG¦ºxIÖ¼Û‰£êªäåŒö÷!˜Ñ5™lv[РMáλ7ã3vjÄ• MUtl‡'hq»p:z½ù‹v%|<Íï¼Ð¡AšâÍS ”»yÆ1 Ë„ñ*cZÀdñ@ªæ Š5Bg‰½Q㻲n¸$ˆ˜Š£`„wœÚrEO¤Û²ØbêØÇ9e¼“Wq ˜¶˜jÜYѵ¬ÔÖH$PÙF)Ù,\)z(±ã›ØøðÁXs¹g™Lqž:˜™šjO;.öë)ÕN3¯Œ c1бERKxœÌ;ÅÈiˆx€ë]_&†Íã­T¾Õ(^Œ2ûj`{N¾P„1!Æ3(ª¦C2À©Wï-Ãzë2zaúÏbˆ‰p ÕQ×-ºÑMB1x£‘êî×.  àó‡ZÛ¨fg šH¢NÚQ(x”À\"‡fÆt ÒñÄ ±Ã§C¨§kª¼Ö&ô*†b9ˆ"U œ€òé’nŒÒç¾ÉÆ‚òR•Šœ öj‰2Q0d”J5u—v’!$Xçö`¼ú0ÁÕh’¸Öº-!  Ù,-|.kaŒ©A¤sæ÷-°s•RAB¡Á´hHq ¾ù˜¾¹3Mí:~9ÐââI(i Y:ÒÉŒ,XNÄ"qaa*®6•·{ª ŽìY•BGóÀ‘ôH\B‡÷wè¡9ª©Ê%îÚ$"s• ÄÖ=\½´æä¨qj©XBøôUnY‹ØíºÌH¸fu;á$j.ÀvÓ\äScñ?E×Ô6 ‰G€öïa)A=å”åiBÕ&§f$Ã"ˆEÅ”®Ø˜£?»y®‹䄊ÌYho€dÆ%Èotòjî ÏH‰Ä@ßX°¦„ Cà |jKu—™š„3úl÷u~/^ÍiAvMS!iP* +è#п{sd|óìõg7/fÃ$Ÿ†©ý5á§g1Œ Æ[j¹¤%‹hÇŒ²s ¼hnÕ3ð­ï¼û ½û£"øw3Fø{ªA(fUíÄ‹[(Y–ª¼¥öÑï˜b•ï­©Òx !üydŒÏ öHø•‚œŠ(dÙÂ' ULÒùŽ|ª|\¦É^lz™ÎîÜ–©Ðxz§®€H±t”ÕšäY§ËpUT‡Û‘Á±¢QÉf²G½B ã …­1Š®r,0†ÒÎ2e˜R–7pRv Ñ»² =715’0-­QÚ:òI³ÄIÂKÙÄØÁW-Ìõfj“šL´Ž4: ¼\8«ºÇ#dc¥åÃ,QqÂÌQM:\k]Ú@’:D͇¥¾œ×‚jRQ%‹oƒ!е3,3T4¬ÞÞe¶ú0ЮljYâkÔ·päÀ~óo´ïÛÛñê òûäO£ÄŒ*´€$‘¤VJÅ_©h"bQ_ x|ôóV"{}+Š Õil¨•£ª¨–Õ‹PY ¬Xx”X ‚†$Xxë=¦²  xcX ‡),"ÀX§iÞXUòÉZÔ‡l ùÌ!Äm³³®ºÙÚn#lÄìq]ƒ5š“]„ wN¸rôiïL—‹a¥ÄÔM%RjT=¯·Š‡*·m÷}wÑ6Bk¤¬„UWÒR%õ)wX¿gg]c¾ñ\‚§ýA£ƒ ˜2N÷ß`¥wYùEÅÐùÍ;álÁÍÁ ¤ÚC,£ù ài½–Ä!&öÕøi"˜åI U#HÔP+Û ”‚‡®è&¡ êÂtÀÄ®yL×wgF­+.¨ÐI ¢”œ M~€_FxP¬¾7ál·‡Ä1ãóÍwЬ³Ÿoœ¾ÞX`2åi}whµGàGð9Ÿ{PTïôc-KaÖº€Ñ wíôãg°sÁ˜d ú6¸|‘9¸%öý“zh ¬~°*øXáñÂ%ÖžÕYVØÏ­Ëûå>Ѽ¸ôANBÂ@|ì? /xyŸ‡Ú2"ãMþ­#ªh_Ó‚r…pT¸€Gãô_ì¼’Â…/î¿c.ïœtWýÌzz‡hCL«.cü§¦ž–©ÜâIO#o£†æŒ†Œ¬Óe¦°ÓæØvÊåj­jcؼo cˆAÀpÝwN·ABÐàvËl-¥Ü¸-²Ì´%¥’…]!D'¶BA¨¯$ ð×F÷ÏF©ÍgÇñ6lÇÌCûèÞ°ýÐþ@H=ß~¸°<Ó !RóÙ«V–©í³+b5,]¡˜5Ó}᳃KDl»eIs˜bìlKG«3,D³ÊfZÊôÌVbÛNφbMq¸U ±DQ ( çÃáïåTÆ­+Ìãc-tn ÷µxE’ôB¬Mb0Ÿ$Ymyï7ÛÌZõj5«»˜ðÌ2V¥´ë=ìï’t“”«SQB,E%iŒ‚IKeI‚QÈ…¢îOäûðü>W¦3PóCÕ‡‹åÙYB̵ù%‘–VAšçaŽ‘7{ÙÓ5énµ淌fr+4 EHšî÷¢" áE^†·PÍ»i™|i¸(C &ÄÔ¬d.&v‹;nŒN÷‡r—cD6Ž*¤ˆ;^ÎWAÊLŠ)¦2æÙòç†Û6Ôm•ù»§M¾g{H|~àéÕWSæg×à÷$å) çDg…_ovú„Ù@š/ ›±oú dö³,ö=N”ãCr]Ä`j¤h@÷ã¢b¨Ið±ßhUh´‡WÞŒ"aL MD!UÀOzìÀõÖù;—ôp'•4 ‰£Åê×6'Ò§÷Ó—³~ä8KÊ='MÞQ/ã-OYØ0¿ÉëÙ*ûdžÏð}yUZnÝM»Â&­Q#Jgaû=ž”2 ò žu2\ù÷ºÑÏ7óTg‹Þn„À±'($ŠP¿ÃŽí=Ô"#ÄG O½‘ÙžÖ¶.ÑežÌ†3…©Ý¡ŽeXÁ\Q©™ŒÁµJ)iÌÍÃv)6Ûk-«ÎYŒMVáJ6”b½·mV¤z®ê0Z$ˆ‘ªm:ˆ‰:Ü]›ÈjWYñ4QÎï>s:W“¿JIVE‚÷f0¬ f'£Ùáºq5-µX éð.nßp• !54!` Ê(ª¢j¬,¦ 6t—o6+Óï¶~®gs[éùû¾Öqû¾dy?"ÍñÉÖŸÖúø3˜6’±Î!…Ô/>nª‹øak1w}p"$ÄF˜áú"ñÞ¬°–™·-ÌÕ ê¾Œ9]C¤]‚fwØe“ˆe­ ÇÀ¤ ¶zÅt¨€¤’àEhw„‚Ð)Õ¶¿5à™øòÆØSQ±²|¼;­ïŒ´Œù“ÀnS"Xùþà?z;ªÅH«¤Èn¢À9ó:µYC®Ð#¯½ælom¾=MÜÍ êž¦>âH·Û*ÍK)ãt;… ¤I1Òq\Q“Ždœ7ˆn Õk…º@Д€Èç1ÇoFyÎû™[t­6Ø‘Šd5,ʨ…˜¬‚,Ä[U>]!Ñ)<4»‘Ñ¡ÇÐ#€ vR¾¨‘ÄzœqHj&`°Å,2 @F Ýù oy`-*Š˜DQb "ºh}zðõ_£õ„Ët†§DçÔói pDGå¦ýº­/КûÑt(¯¢d¡C™ }Þï¤$´2Ý_x–ºÄö·ßµâXûæYRH  ±dQd‹!èŒêèX1¾Ös„¾< , wÐègCûå øüb0Yé…Hß}÷É'IÇ´—êø‹:a>³Y¬½=[ÁµB½²>}|±S0KI’·‘csˆ>÷ëgn¡b‡\.33Ì• žé˜?Y¬úîÂp@‡â„?W½8ö°AÃÒ€#ß}ˆðÏLÆB#|—좹Noœóùø½m‚x‰gâá/‰ Cå]®};U÷W;Ï&n²h2}~bߚĎf¬êš>×µÎ]Ž4z³H‹¦]¹·r²~ì¶{öIµôÌ¡÷_š¡Æý@9lÙg`$|,&yÏ@Dªª+>|‘y--àé®k¶'±—ˆÊÜÊëWÖ§JµþHšÙ£ƒu^œM ±¥Žo9²ÿ(g6ÉX܈ v÷0£|GBn$»ù±z¶Ôœb 1"§Ñ<¨Å™ìæcæó™Hxl&(2e¢²"0‚¨E`¨ŒPQ Aþ{‹Ù½!Œ±¿£ßÝèß¹o©hõ ëÆ=ÜÁ°ÅÖ+K|ø¤…ŽÀÈ’ 6Cù0Öß“óç3£BÚ9 îý³a 3è?P]íeÐX¹ú…Læ a‘V>õ…/ìíÇl}u#XÒeø1!¨/®Á¤4÷¾xÍuµ€^úÇmf+ˆƒ³×ÓõËñð­"<7’½ñ,†êGG˜¦ó?úh]þŽZâ(ß§4ïOo~Ix©Ôôdø¬P„?¯l9!d…vçÚ3³~Ð å=!8Ýæ_¹ü½HT“ŸÎžŽw™6‹Ÿã^¾»Cë W XHÉ *zERÝXåÌÑ1#±ázì›´®Ì¡ºæ,‰s3rc´.ÈFD‰‚6Ák¾Þœ<ËQm”ï.F3ÄºÓ R­¶–عh¬g¯WÞa’VIUQõßL·à_ü?Ÿ€öJgtþ¸Ôƒè™”u}'¿‡W÷®›ä<Å ó½‹ÃÌæý­wÝøƒiàO«ÅÅï7ß– $ƒ {!ãœÁ&j Hñõ‰ášö°t[/ɰ´c+Ddƒ®Ù²ƒ­F¬>ëyÛYºÊ­;?|†| úVΞխQ5°ü{´>ÓÙx.ö1gDdZøW“åˆðçH¢Ÿ¸}ì© }ðAü•ŽŸgíøPäøCý¿±££ Gï¾qxøpøÂMâÔ|=õïgj5ÓDÉ‘ùX°/’ÚæFL‡aø–ÿP’H@Ñ€ÖÄÚ°dyN¢”ÄAs±!\ôLæ|zkà'†°#ÑUÉ÷Ó™{ìˆH›ë6‚¹-Ý4?’ÊüÐÖ¸n!`®ðð°Cîö²Øno1šºu\‚íUq“6ùtHÍÜaøm*I>¨¡xV+..ðzu¬F¿œücH¢W!xMßYòìHú×8L4t( “€ “ˤgçho° âJõÖËsßc‚pN*ˆH§¤ª¹[b±…(6”¬ZüúÓM•”A––Ô®9s0kE«+Û‚g¿xqâ£5‰ÕJÆ×2å(¹qÆ™˜Úb«€¢c´Ì–Å1«ãéÞq2ˆÚZ-iU13‚µ úqPÕjj¡naU[hµ¬r˜™Ý” ]1q‡ˆ“ y¯Í]’<@=]íz˜ØØÆüù'¶˜h½8º¨?A%ÅÜgH)‰![êÉIߊnwºzJDíª•ˆxóD›ÎˆÚuMõÔ™‡ZS‚þ-ž´¹ ,O¤ôóÝ(Ã4ÎegE•m•-6b7)T^>&+P Qm¾\õÏ®tæÎlTÙšë5ÅPàÍÃ:MÝà¼Úw#¯®“WÙ#{¶H;ÏUŒS%Å·¬Uùo¡÷×â„Î¥)¿»¸*|¿»Ò´I&Á$"-PŒ°$My¿žG`Øòš’#ñˆ ˆ-„"@vÔß¹Qˆî¥I—®ˆ8Èm8ÉÓ¼ßW‹­ùóIÕ¸üöúTöˆƒZ¾l3m‡¿*ùÍD PJˆJ1ÑA2íuŽ­t"€¸Ÿ¨pøu‘C~Cÿ-eÖ±†o/DÑ5ÓŒ.ù2t[aäîã°A‚ ³½~†÷BÂ6„ßâ‚X/±²A:L0§°wH±w¨‰`xEû¨¤Fãùo†}¿weüwß:­Ò‘<ÓÑ4"Bddû‚hX¿õþ~0¨|ÞÉûc¹$P-  /š¤hâ›Ê£Ž}7…óu©j(‚#¥-Âü¡_YÎ?~{ÐÙ:ÒzQ>Æfå%Á¢=¤Ö{O­óäðmJÑÙ"Æúb´ÒèÅ¢‚€î™©HùГ㳾ö\a‰2`Zr!à½cÙÂOP‹„õÅnn›¨Ã,£D ÇÞõÕI¶4-wÉYKëÐÊÄà+Ì¥ŒššÙr2|dߺí¶ð‰ÝÛל“ÃýæÇÒµ°6Ü Óõëíì¿@Þ™UTG ½¬BŒ†ìNRÙrí±©^kqâV‡Q(í¨1-¤EêÜ4Í"’Ù²8±IØÑ¸%-±Æ•ß Zd ‡5UÁßUõ@ÞÅl®84Ó¿Ñ•nƒMÛ4ò0ñ{v&EÔ5¨¼ƒ`¦FÖbÚõ³‹x ZÑ;Œ™w×@z;"Ï`&Ô~‘‘ó yûðæ=kýû·Ýƒe]Ô<`WÁV¸ê6ÕXq[#:Nî¬ð‘Q}GNDíLšÌs} œºuëNYìÑ ½ñsß0ë ¦V .B2QŒXg»ÔØ‹“™¹a1tNaH¨Ó%Ò‹!$íõ¹`,·²&rÙ¹üJýS‘cEôÄNÜà"Îóœî­N$…÷>òèÈð£Ï@H‚ú®^ã¢4=ü²zþž V)+±.ÝÞNêI«Üžªuü7Ú+£)(Nv"e:RYù¢ÕÕω+ìÕÇMTíWñ®ïUkC=Ï(©‰`É÷q–n*ïÕ|?h"!¬qH¯¢Î1íž?–Ž1û²‡†Á %»ñáò¡ö€|ȇ;ÐG¯J¬t=z´u5àÕR°Õž`<·Brv…šUœc °uòƒ^e+×Fã†÷*œrPÓµêàÝì/¾ùÃap9Þ7ž æî]·>ðî¼Þ¯ŠUöo¼î>”(}ÝûP÷¾¼ž ívÛÁ\Ït…so‡luȶb[}'{l``‘º*‘›Ñ“á(båµ™V:‘%+¿yní5à(Íà+î>;i`µrzûÙ‰N{f÷sÞ¿ýoÙéÔ,±*,=óÂ,^Ô̰‹›ûBмXeýZn‹@ô …YÊ:wêvåN¹ÆŽ> 8zθç+:—ݶ:%3á^—œ#½ítýìæ긕Ѧ4åùœl¡Ö0næÕ×¥~—’v-èñøÉ2?øÚ,ñðNaÎíeÁ¿.÷r²fF'Xú=çñ#«Ñ:ÏKBïQéû[¸¥ñž' Ø0”ôjÉïg¿>Ò`¬~åø~#ûÛš+Ô3·T7÷º~ûÇ|Àï gc“™IàßXð;ç[•jÎLà@”Ö2%¶  –1´†Õ˽žž·'L÷ÁmõùÜï7Ü©<¸ÈWS-H>$Þa uå¿ý(.Ïö¦ý‚ëºA¢?Wõ{(úæ5Pt﫜€oÊ»yWgWu>=’p™ªÍÚR¹‹ÂPn ‰R©‹å aŠÛÔ¯TÓÛ¤bW>VDÎF«€ NÆøa]Úø­üOÌ©Á¢]®Ñp ˜ÈÝÙôâpü`œÌ ÷Ø)– IQÁ >´2¶üóƒÛ²E>Ïi}Ç>C‘z^¯ç ûè;„](Ðü{$0¯Ì÷UÛZÞYꙜýTíùÖSÞ­Èwï³ÝÂzÑ“H²£ïÖ0™Ùí²2ðpüÿ“ÁGe )ÈIö Ìæ 9Ãú4O;¬ÉôàS9†fwó‹âkè‚4Í{•A ü¾?êÌÕ? út¾ôÓuÇ­YÍÙ-éJ»ú÷ᶸD 2“Ÿh,Ìë"óp;‡ P X%!o•ý¾ÁîòÅK,"ôb6<|@³á•Ø›B¨‘Aù”Ÿ†Ã½ò×l¶9ß/‹Þ-CUT9¾»#ñûðGaTä¨=sÏó¡ûí‚m{Õæ÷ 9tælAf©ÕºÓfG,Î0žß9½w\­ tñZ ´+<ÞÛî¦ÛèûÙÎíÈ>[”OÕºú® ^ïtÅ3† È Ã3³orð.¾¢Ì.'î©`ªó’—qaê@lŸØ«yùÃ/¾:æzï÷Ù7—«¥x‡œ8–ÎVdŒ·ëÖoFŠÓdÆ &‡4ÖíÝÁÃ. ‘·§êÜ0áà *öú©Í˜ûjƒÇs¡9ø9“°ÌÝ~ŒžÁîC(ý‘€VfLnzÛ·Ëé±ÑX)ú2†éñð·l+8´kfZ‘!“h“¾ ˜]ÿ]… juàP)¯/§¾”%c‡!X}ÉxTìwLŽÉû/ݸ(.Ä|Œ˜É:ä©x|µo„@:` ̾ðSÝ÷“íšÐÈžÛ²2÷6êÆ¡jkÓÜg½:»Uå?M0D@×ióËá‹ÚK§fòÎy:㘅ÉS®ô/€zÈÍÝwàêß·ºs£gÏ\q -2ÔЩpÄnÞeŠŒçªrº!“iÝû¤cùÅr‹¹õhÙ/¦g*ä èôY±“ê¨ÕÊ[<ñ»LàðzJnuVo^Q9™uáp„œÎp´3.¥çXrjô·¶Œì»¢zz@ɉ’ñÄÁŒ“D'CTø<½ìßYŒíuˆ5B&‚ãA #ðk•€6†ýGÜî9×óò¼€?† ê#²Æü·œq™¢Y&ùK^MÏ¡,¶˜Õ ’V¹¶ïº)þÖ‹Ú—Ðq?µÛ>›•{m"eŸ"+;™Ø´Lì dk%¨lÕØY{?©u¦|½‘â'PÄòš~ßGîœÕã¿Q®GçÃ*ŸÀâxó CÕ…\~Ýijˆyu°}Ùæ>>ú¨Qš½)÷»ƒM‹CDA“š˜7½1KÝoÔ|æñ]­G_p¿»Õ¤‡ú( €Óªü½òöhÑD®èÍóû7YÊß/Þ ¿Glñ¶UgáéP.ÐÒ ââ(¢Ÿ ÕûÅþéñáž–pÕp‘?Hv‡„ã†Í§;žzY2ªI}ôgÙ™cë­ð'ƈ5 ûw¶¦½yÔf«æ»ÃÙ;‡Ž¼Xu}ÕÔÞÏ€^"`ÔÉÆ™‡§¬lÉ™âk<ä;UË…=bö{Ã3›ªÍçqœ’5 ©Z™a’â-éRg/§S§Ö;¤©ƒ™;ɨj>WÁ`Å$K™Cvè1œEUXO8vò É?@U)°°ÑìÅwj½ýáŸG®2—ùòàÄÙÏ£r3Œ(&JÓõûÜp#ôZr¡É¤×ϧó¿ÍŠ~ºF»T$s¿¾ ^h³aEñ™ˆC¹‘ö‡ðÒê’óËŽ²ï½.õ÷Zܾ(‡ÏÓWÓ}yoˆÏ Z·ÖEíõ²#†yÚG3;:ÖéŸeßY0G‰ã›ÝÌ Iˆ­Äsb½îûµ]=û¦¶È4Á¿}‡<ÀÉç­ÍÀ$Z ×ÖÌAß¶˜ð+Ûžáñ¤ã4¯uPû ®vÄmoÀ þ¿§~ûhH;AÐô)rïºÃÊ¿€ò“; zOˆåý¿­ù. µj”— Bص¶tŒB" Š6›‰Ä޹Ì þýv¯Jlã´ þ·V5ißJÚÃ;ÝÓMO^ïê¬ÛºTNhn€’±*› pœATte¸ØW5w2ê*U½ÝpÐø¹`®žƒ·(3BnGy„}8} Oêê÷WßZ[íß‹ÒÊúõß`€ ï8¡nªŸïÀ §ûfä#òpWô@F?— V€-NNì̾]tOíN‘rLº Æ¼%u}—6&*¬”á"DáŒYe›à[5fŒ‡`òöC$5ñêTA¯² ”oÙ³Lñ2ýáuG×Fv¨h¢ ˈNT¼‚qÝл·8-ˆ‘+Ut0@/V»_‡Ãâr¸Õ—3¬ ¨úêe†½@n×b¡'êþ‘jýù?Äó‚'ïå?³EÆõm¦'d(Óû*EÄ ô{ÙÌÁö6JÏ®sŸ¨´Ø‘ðfýgpBبÈÄ€÷ë r‚ÝZ‰üÛM_–òjø¡,{Ìq’(¨A€áª#„ H_XáYóŠÄïŒpÏŽŠæ$¿SÉðÉS$à‘«tèÿ%Žk†øÃ8ÊrfY²§d‘$~6ƒ¼èdîÙÏÈ™™ ¸#9´jÌ¿(1ü²~±F,EQxÀ¬b«DQUV1QX¨¨ÅU,‡y~&±EA@Xþ³!Œ'å%Hˆ#îÑE#'ÎÈOž»Èf_5Á@ð®Â ™¹F–ÖóaÛ…k¯‰î‰K>Àû—Á‹åv0(üŠ\´+픎ÔÛfLOî †hºm}w·˜¬G&5 j¦Þm&Æ›u‘Gø¿ÙqBÃýó‹&4OˆÅ¿¨g~/§£ã­™ì¡ÑóYµÎÐ18¹Ø!ùÂSdÏwÝÝ`-ú1Í/Z'ï³P† !†ÉÙ‘õ}^ÉÌï‚Îó׈(ùh ‡Yó»@ÂñGÛ ŽñV®`•ùêN}ͤ”¹åèD‡õkI ÜÌ‘ElìÜ;œ?c»É¬c.á š@¢×h`F†bâÔnBÍà’ŒË’%X •j‘| pY“y(ÛßÑÌTþèYÂ_NÞÕ·bªHÀܲÍ*¡ðà@B€³X8VoÑ7ÙÀt€FÏ¡èAc¥Ñ¾XaÞtIïµ…ç¾Àê®:mìêùàÏ4w\ÃŒVP7ZÉ}â¥ÂµÐšçciÏ`` äÇ ‚€Cʾv/‡T«xd×\æàíÚ!¤4ÞpN]Pîv¨rti«O¤ªÙ÷M… ¤wÕöˆ|a÷ŒðK½vr­ÝO¾(jNL°MÒÞ1BÚ=›AôƒJ'– D’õVäÕ\…nÜÛI Ì©!°Ð·LŒµÝ·‰\â¬sµ5 "HHniª7ku°ÝÀ‘i ê7ñ8¸’d LÄÝHXBËŠ¨=Kµg©ŒÈ‡¨âìQÄ;9æ n;Vˆ·G›ë±2CzÄ®w;‡HœÖáÖK ½ÄMÌओ"Vb"‚¨)ï"æ*‹B¢7 ÅŠ¢ÇiU=µŠ1—«‘#;îÌE"¨¯°ðõ¡Ò/¬ÏD·i€]ò &‘=#G$nÞâ^­ï¾'áß`’I<½™Ï„éѦõÈßPu P¬ç]SU'{dv#­« ߟ9-Ðú>½¥tÅE=£vGˆm{ÕK~Õ¦ÞgØÆaºªh@•3¼Âª0—è¿Ø^ ÑŸº`ý“ÜdL3û¯+-v «)õ'â.Xo„ƒûšUh. ÎLs¢‹ÒaûBÑæ&¬[ýo sÞ¡«†•Ù¾š£…#ß﬎Â~¿]û0ïÈEèšáà@ˆé&Ç#Û×¾Høv~=Þ˜û7ìK¥/¼ò†.Þ>ðý™õƒû”N¹‘ûÊá°\ ªÐíàÏEdÈRhÔÐÁ§!÷óKbÒüØlÚ/§â“ ýúvƒéúGñœŸìzŸ)¦sï®h·š6sh^žÞvo€a‘æŒ m Ïv ܰ£rΟå“[>}/Ùr$óP ߀œîí—Ò,M‡Æ Hâ?¢=Ÿ Áj…P«×½„ÎÍÜá¡—@ÀËYédNô”ß9ù—x©Vµ½á@KcÍ JË~>YÄ—l­Ý}÷¡ßD#[7áǧu´›óªÃB[×½“ÒœÄÅM‰âw¯"!Çk¼—Èsó\X;ð_}FÁ…¢î•«xä ¬l*õf8 ½+Ô8^#×ì!ŽAHÚ™¤òHIùó{Û\?WÖûô?W@…÷uœ  );cFú7,¿ÂßéuW ¿Ghîs`ïpôBÍ´ž¦tFû@‡£ÍñŽV³Ç~èî<ìØø9îö{·c¹ÀõÔù™¯ ëê$oeVªr–äkšŠ£fèš…Y57Äà} eu•Az€fPdD ìàÌ*EKŠÞç{n¾5ãBg}•N>fƒç}¦Ä¯e"6Å ŸFÒ€¤'w|\_.?½ê†ŠŽU?¿g†ó¹ëä¬Ö˜Ùc«o&nxQmß hïìè¶ÐÒÓÛçi…4ØÓÖà&›0%U šLØ4dfyMù~½Bß°R åÇ÷Ù#%ß!O|æø†ÈÔ7ãVñô䇹·KœÎÎÊ®¸÷ƒ xÞ’/ˆ¤5‹Mê#uœp¸R g*!‚$t±=»;°Ê‚VP#.mN~^ÈÉøŸ‹TÎO§_ÜscïÞïµj¹ì˜:Cpz}°Û  ýšâ\/ìØúÔ:ÑõÓeOoŽxz·'r½d,7¿OÊ>ûF†‡ËkLå†Z±à»Zw™3,yžÍY¼ u#ßTÞƒÐèÏ7œ…àfF‘Hø„B ´hοVdÅLeUzw›ê®ì—ço,P Ïg©§·Ñ „”Ü马×~íªÉšk§w¶8çÖ  4º;%öÏ<åvoWŸ«Êê@Cí¯¿¯÷àç¿uÈŸ —à˜ãé¶q Ûž¯Õz+¤ä4ð5¬î·›ÔïxÂj–H¥T«¬²AC6jp¹‰±:Lãcls ÙˆÈÞf…h¹dc»¡€ÂÙ T37Ah1¨Î·œVc8¾Œ ïÒELÔÚªº3:{ðËõ•˜ÉK‚ß+¤­]%·+âNq®¥"ÜçÌnKÜ—ÆŸ:Ýä¦e…„slœHź’…©’h†P̀ȧ* $ÞiaÀÀoT9F)ÍŠJû¿ »YÖ¥À£ú!_ ZZAñ…aŽð¢8qØ^±y%Oª¡ .xn»TäÌûZý<ò Êß©Ò1çÄSý¶Þà8äÙ?M…ú€êÑ wÑî+@¤k/‹¯*1< …ønÏHÛŒó»ÊŠÌç×/ÞÁ5“i¼ÖæœÓÅ£C¤’chãÐt4­Ë&u\½™ïGˆ@iX¤??¿ ŠË!à`xì Fèsî ÊÎwogéGós0ΞÍpM"È57Yõ>æw•¶./µ22Ööæ×TßËiw­æ–Þ,ÎPd –¨Î׌èLâm4@pwÀZGfµ1 ­¿*é%ƒ¦ÁñdyW‡=‘ò {Àg3£G[óÝ®d´GçÚ÷#ÞìÍ–Yþg7 oþ³ ;¯åu語³»„"äX;;UÓ€D 1ŠŽh½š:€³DnÒrZ¨†DÑOÀ$gçG%W‡¸S ++Á’'Fñw”çgdn;¤+«øUèÙ÷è­Î Šûác“4 H!ä³òûõ¶{ßÒóGïE&xa_€OÁç×ù´†@R½Jª {/¥âÛ×´Sqpj¿Šª€£Þ÷<áï¹'³Ö6ö5{3Â¥çD¡C¸H}͉€fЪ7ìÛç‚vX¹fRÚª¯i ïOµôñé˜ùëùÛZfÈÜíµ¿Yâ>µ¯ë­ê¨'T'Õ¥Ï Ñzæ¬Ï½„eô?—{rk'Ë~Á$S_fÌgëÍ‘Q÷ëûŸ|'ÑÞÔˆÍçðÉÅ”u<æ:ɯ…Ï!û3Æ ¬ûöîGëSÃ÷…Rd!œ¡Ó¸ÎÕù9HX¿°!—‡Ú,Ý H‡á21™¶Á.ze »HáPü½¡ï“?‹_F+Ö<«óý5o¾«;Ø}géZº0å°h‹£ª ž(ZIwapµ™î/G¡æúƉKÐAž6$ä­»±ëÖž D˜„û¢Éùmù(w‰áÞ¡Ý”©Ú@ý@~DéÚ¤iQè+á=ÍÎàpwÚ4†8Y Ý×#]›yщ )˜oÞÙ˜ ÉÒÎêT1¡ {©ù©ñ‘÷sÙÞ¹´ÏÕ1s~ï‹Ñ#FûªÚðCï'aDyù}Ó-|kœ²/I0=ÕÕHÃbZúìgQ#˜#õçypÀúûÃXô>Ù "ELå&MÊu `‚ý:=¿ ‹÷81I²ß@É•I®Ô>×}w¯kí#ÖÀžQã–7¾ôÂ@÷|3>é÷o¦«¾²ö•¡DEž¨¢/… }°üß©¬Á/¼ÅßuvüûÁd¬‹Ï»3d%´è-×»»†²Êªî3²š¸Ž:fA1Çh;¹*lÐWlNNäG ‚I¯'挷v+ÁÃdimŠ€¨t±qT‰°¬ÓSb˜ Þ®ÓHˆ+¢ÕHÄ ÉÑÄaÏ|ÏGu¾ˆ:µÚ¤UðÖv9¿÷×!ü>™¼]¿ á ùÆRí¬Lh㾿ÌÈ«ô6+ëÙÓF*Ç`QÇW{}êÛê,³—ŠÍAƒž‰³„Äû7ÍV[ž91øwš[3/@?}9êêì@Ž?ˆczR÷À<êÌ=d@<ÇõÁ÷Dh@¯b¦³”\îØœ¶‘\c²/®\bÀª‚;Ij×oy »áG<F­·‘´` VA(òr7*ŒbÍà.òf 9A HÊ“ž¿!X°12,*[íù£}h˜šü†¡ éTø·¸Uò[$Ëœ™gá“I µD÷öz—¢Û˜kè-©0>ß׿d (œ=ô…øt¾zコ?¼3ƒÌ¥!1ª°JÃ#2Y€ôPòõcâ%EÝRÛÀp;ÅÑî=ÃIꃔ3†êT©çXÐðd^òÖáñÉߥêóëà›Ö!>Z7ˆ #Û{í­{}?Lû—1¡÷€² œo'ÌæF˜\–>ÂLuÎAŒ¢±‚dËBˆŽk­~í›Á+¿Õd~ØŽ/ô‹‘²Æˆ\ foíÒírzr€¡N™^Ò@£Í 99arW®?¸U•yÝ>Ø_°Zø'X5£ýû»µnó¯dΟ4/”È“5`J¸’0s͹c¢ q)íÃI dõ3‰äv%Þ‘6L»«W2߻Ƽ}c¨¾á>þ&*@£ Û ‰ÅX‚\R˜§˜ÔÇVÀÏ9'sÁã›»ú™æ¹}úØðl„j5:'ÙìZzBC®÷lÊ ;ƒ\Ä ìó® Î{ ñûîwg€oÂçVœÞ„ûíó¸¤`pã#ƒ}ÙAÛb–öD:íâŸMýÜä¯pŽÙ‚˜tÛâΡ±[ÙÐi(LÈ[ɬ¥5œ #/±£8Ž ¼ z=±™é¤ó³7/¢Ú×\æeã¾}ACjCB g‚„´•Z—€Ö·šP{eßX6¸õ„ü‚â13‡”*+†Z8f\é¼Õ.%ylû¾¹²‘"¹d¢R 2оkEvÔžÑcYÌ„ð›šÎá–Zs}–qí`“ˆ- .m'ª^eër9¨qîÎòsÞ¤¼8cãÛ¼Ü{Ó¤×Y†{jû›Ew^<ì–«© ÉäîNNk  oã 5u7¶°qÉCzmç;\Þ*™XÁl-±W1/•£Ò{¹«3³}Ï/nEê–N­ëéÍ«xuæEeb{zvû0XÞ·Öç6’œp¥Å}±§MPÅbë¹vöÚÕªnk—¶4;ÓšN‰Ý½êh×.л2xtRëÜ|ÕRÛ5»ÆfB±, ñŠçÔFHÚ­¼¹vªg,-À…`Ì­éåÆv«'-U̺™ pí\ÝNuK ï8a»¦tQÒ¯vÈ<º»·kvÔÚXNr‘[ΕJfµfM;Všzòµ÷UeõÝŠ#,Æ'¹A»ZžeNeºLdã2b“T\zºêƒ}Âî§)õ ÞÉ:Ÿ”‚ÍdÁ¤Œ÷!z•mò™»ÆWY;kÎÝa”L±Va¨C.Æ£”³&XÇ:û•H0¢4Û†Ã52¡KRÁ=kœyM¥1n´ô:m–éÍ :LvÒA×%ƒ\܆ÁÀ´&J–+2®‹‹ 2’UQÒƒ‰„•eÔ@ aʼ‘RÇ©\B21_rÞ¾Ó=»Ø„žê<è;èž­º/»¬glÔ÷v)±]3tì<çDÕ4‘ Ý ÅîN»ÚÚ N˜u“Šò…él»|Ö¦$ 8޵Æ4ÄHH‰&¡—¬ß(vàÁØ(‹!K@×E@b Ų“˜Ú„ÿK9ŒÝnT4ƯRÁs˜¼FØá«l”bji0k«²©q&P̫뮑c\Tª9ÄlŽ2ÒËr,Ø-+à‚¤@©¾ë†ä67†{d+¸õ¶C÷€™$ŒÉ×2=ÄaòÔ\"ž+Ø|-š=³µ¯¬ÀˆøŒið9¾@ÙŽÊíRl¹Âk¥’FKžŒÂæNÐ9(ã{„­Cw¥ D’VèºEš4µ¶âA+A¾oŒ^7YF¨Út­µ+k]ÊKÕ†' ›u„QƒSx¼NÏâ6ìú¸CÚ x!]ÑÐ\\†ŒAQæ°;‚ú{üA±‚JyGNáð¦Ù0 ¸  º334]ü,z4w¼v ÄâŠà‚½ã£8Äx³Î.@›$9Y䲦½ý =€ï¸~Ìœ×Ê?˜í%¦ï A½eí}Ÿ½ø«¹{TÐÓ°ÑÕÈIäYÒcZ´@T‚£¼³a[£2£Nã6vctˆ%0TžTH3à)ñàá:AÏ@ûæ>Ü}t!Ì*D·çÂö¾_Yw»Â1ž\2{LÂÍC¤†Äðùqeô=|ä8ÇÂúB™¤"#cøP™÷9(ž$úøþò•ÎŽïE„J's[é­Î½ÍRìö’8™4¤J±iFBÝDÙA)(1–6ƒí‘!³Dê÷-±+”H<â ThTÖEÞå=©Ít¬¸™ÑqȨÛbðX°çE@RìÕ¾Õ"ò¦–æàpãÀ\Òý&:Gþ2¤{WÓipLQB)'ݱùOâÔTÙ‰}&¦71ŒŠ«Í75@H„H> ñ Çg‡Ò•¬½«Ûd¢´‰PA!-ƒµ™|”‚a´$¢B"8%8—[A×—{;¥üG=wõ•ßxÙ¦z('ØÓd<ì¶^.бp&/ä4›VGû‘x™á  ­=úœÏ@gÏ÷†Ä½¯]Ö]ñˆý&ªññ#°½¢æÑ^¹+«8d¡Õ{p É=¡3ù®UíüëŽu~v" Ö›s|5Vö<ïÜøþ:ŽíHáIÑ€1Ý“ù\Ј…þõš"v¾Jܸ©]æƒîé¢èŒ‰wzy—¸{4•Ô¹_Ò©×.s{ü­£Mf9•^T$¢×¤k©†FTŒàû¢36Dø(CÃn›4ua€mÿNºú=½%+ÛQó¿œàV À<§Ÿ,¦‡ˆ  ˆc=e ¢Â Pí}^uçÏ;7g3 hiõmxÊ[p!å›{wMjrF Á¨V>:*±éù–\]z„oråäv¼ö‰GÝñQ™ÇDhÛžÉ"lfl޲&¬ä]СŠåâ.·=As‘Zwä49Z;‘ö²@;7rWH |þlèW}‰a½B±2'D‰@î%Ï–ŸˆÔùÕcуÍÊ<+àãÜð Þ!Cz±9ƒÄ'É–-ï¼FÒÜõ}–בÇÙs¬9bUPh_×èûzå>èúÐgìï”ø€!˜‚@[öFïoÞpw6†ÝHÅ÷°»uõLå¹õøEØ‘ùý «$k-¯¬$ „„µ0í1çRd³„€óaPqĉ´!~X¥óý]òDP> 8l ˜7íüÜ›È×Ç„{ÎþÎŒ ïwjvf·l\ïê4•ݰž[——1Àë¯m¼ßb•ÂUË&* âÙˆF¤ËÍm!ëó°sÌÖ²vÀœïÂã¸òx;Ð`u7‹ëWh¼Äæë¸qj• 2õ«Ë¾¸Åfeô&\žRmã_ S…ƒë^µtåþ›¯û?lxBÊý{}6™•»çyo¾³xaönMæVV¬ÛQ;¯¿f[;ÇÏrgZSê®Ì”ë.Iôhɹ­¤·Îð©Ï»ÁHBJ…ž:S–y»BT #v]Ô‰Møð"…J|œÕVWC¬Ð V‚æcs''pl}Z÷¼8u|WE¬pŒ¬ãlî®°{îìÊ¯ÕØ«E௃‘Åbûà4îL5n">ë¬8ÖË©ª_{Ã/~+’¼—¯º¶ªixŽŸ¼åXPP “ù}wÈ»&É,¤þkB“¿«BÛµ=†ùW:ÝR aiL$®£¥KP5¥Ë7y¬ÏÝQÜ8ficAå ÜD, }Ó0œÔ—É9À²h½ƒáÝVq/k›Yb°§;€ÒH}æç·íÞ?…Ýê›1{!¬<ÓdÃH¯0R10æÏv^Nâºo‚€c½ÝÍ!c dæVX9]ƒ.¯´@úˆôR‰P¨Iǹ—x«ïéÏ·|ƒ‘Wú|9ë.‰KÖ1ÇÁ/dÆs»†ï…{ôõ®ïvŸ`¿:•äÕ`ÚnÛRD ôeœ•®"è5~øM<œÚ \{í£¾ûqêsì]´çëÛ ¾,qŽ÷‡Mûyìóå^ˆ«MÕ…Æ“i,ngÖ¼Ù)Š‘UYúbýV†¾–ü~|;D¹ç÷´»<–Ä\CËcIž|Æó Ó9”QU–ζ¶^Wm¤ŒêŒ”o1#öÅ×7p†‰uè|.Hzg7à:&¹Ü ‡žÊÌÂe(®CÎíh…³ÍùŒ®ßš¨|§w€õ¥ä:G’ôÈ9:;+'égÛ“Yb ­,)4}½{Šˆíùô £Ï¾Ò˜„xP÷E SÏI3Ø’õç@TY¥¶¹kŒêm¦ïPñ´ÀD·†Ø@ƒ1{©WÍý«dˆP&0ÇÙ¯N¾t_6=Îæ~k~²8¤W¨‰Ñfk†xûqç0P½M BcmÙu“Š;¸;zü0]Àmä–fýãÀ•¥ÕÌ“!®Cè5D°î|º­?ž›sᾩ â1\ÇXœ¬¦ íbÜ•`ÄÌ îýÏ×ð¸ôÔŽC®Ú«C~´W 8Ç„@N7€÷Š˜ÃÅ‘!d)‘iÍmàœ -h‰¦êi¸Å‹{@§öÃ?RÑÅr44¹¢¶󲼯*©Ô8’÷Ud`ª’HßÔ¶®GÚ(xÎ#ÇôšÁÏn®fC¯¸›X>õVUÍÛ­{%‘OŽMëY=®®d&2Ø.Jfj7&;:ei)u"X©ÇÛ¦ãÜ Öˆ}/†äò' ӼЗYç®9LöSy]¦ùŽû  €$€’ÖIô€²‚hUÎf+ºûÖ™™…œEŠT}?{%@ÊDUQŸY‹Rz3"¼>¦<3wU+óö_«æt‚˜Zúþ#nÅFr¼¹ýêÍ/ML-Ao†Öyœ¯¤"ÆNî« K 3ÞhWê¡úóŽìFgÂRåõ0þšûv΄íÝâf-–^Y6½ UÎï;=íÊCØ«$vcÎû}å|® Kmm!øJv‘—Dh @â"?õB#G°Ô%ЪF¾Añ¾£&eÀŸEý¿j·ÀU!€6&<¡AÎôuìh$´@¤@á²!˜»I $+#{¶Ë$^’¸õ0ÜBàheKTŒ°VIŸ=äPÙ uHÓZ²±Û&îo”6LäÑÈhQ‚Œ°Ê©;A)ÍêÍ‘ƒK“r¯*SL­áOªñç*J‰éfèuguŒ¤,¾‡Žñ×I¥³hÍV«EÓÞÚÞj±Úw‡¢«jk¨¹˜ÝYÓµ¹tgè»kWv®Ör»¦G5*p: äÙ¶tâÊÔé‡YÍ+)Úµ—µµ×M7l ´x£YHÝ‚¶¬I#5Û­±Ó‰Ûs×¼ª¹o:ºU]zF+á(m ›Cwqj³rùÝ*Nå'»4%g:¢Ñ걓tIšÍ ñŸþþ³x³{/ûJ˱u³ˆÊ³•ÝW½&ÏnœÜÌsϲU!3!­–‡Y7“rA%fÖVnç•Ò¸åíÝŠ;`•L§·9ÀÇdšë­³‚k&DÑî›ÊÑY5K¶Öì’0‹;}/+jàщ’Œ™D!9s\Æ.æ±wW3¬Q›¨ãw¦Ïi”TÛ›£ bp³=H¤Vm 1-™¹\j†MØrȦµ È4`¼5„eYÕ=-^EÚž{£y âÐCy±©3£’%Ô¾3¸Á$†X‹®«5àZ0Ïb ò% £fͼ7SÙN©žo»íã-¨Á&T,‰‰’TŒÊÄnðåWp—lÑXmØÝOªUÉ£v*îB-tå’&B‰W=0R[BuóªÉxrË®®"˜F+C¼ÀVºÚ†–[ÌÅ2¤“;75»{š¥îcçhñzxêpÃhI•1’eo¬̇š¤ÎÉfÈ"•+Ú’s—µB u/Ú<]œ÷£fÔo—±j›~ñÉ=g:}Ox1‚H·ÓwxǪ2×½­ W˜;×¹%vç‹®X]× ÐÇWIÝÙÿ~߈^st…vÖ)à–˯Zh·1Ì‘Ê3wwu¢i ¹îÜKËZœ-Œž]N‚N’õä·ßd³"tmnDäÑ •lcè›jQªnºÂ·I°.© ™Ö'¬ì;ƒIè7"ß ¼V΄Lic4·oTÉ&ªD¡jÒ¢V‹m›OlV z=H‡Z ½=WÃiÉxìmL¸ÜX¯h„\­Ž=àb=ìHªH¢ #Æå*$Ùl¢Qe•*6¶ÞR–ˆ"4¢Å½9ÕÕÓ«ƒ<-©+ëŒÚØVÖ†K™K—mÁ®˜Ý¡p¬˜]qÆ‹kLE[j2ëpÙ†:èµÂ´¶£×3 J¨-%‚[N4Y†Áfb¶à‹Dª`·-ÝÝË]ÃV”µ»•˜îrÇ]·wSnÐr–‹¡êeÓræ3¯ÏWxèLeâfF±5áDE¸PÝ…Z[5 1™Ó“PÞZ’àÚDÆtâàУ æ½M¹¬‘÷ö{ ÉÉxV‚ë+#®ëÖ¦òvõÙc¤ª¾²önœ¡*¶]:Vo±Ò{ ®š"pT¥¶e‰’àó:ówFRЋ³cÝ”r–BÊ „ÔIÇ ~^Ê츩‰°Å¶DÌž|“Št^L¡Ü3&M¯=;£ÈJaå½°úH±#²Á´&Á£,úô§drâ‘ß}¤5¿a`Á![˜¼ú§èÁ½d¾_‚T³5}Žš¸àÂÍǬÖf–T2ýßth{µÌT6@Ùç•jt®$!9x¢”3N -¹—Qà ÖM¸…M\M û×NŒ¤EbJôh"!‡áìð‚ y"cÈL¨ úa&—@²ðd}íä€m NñzôisnÙ­ŠÎRÑ¥Âzt5-"ZŠ2MÆH³QÆ. vôC¿j¼sT>×¼<þX Œ7HaÐÞûntw*¾´ýù­Þ°ðSm8Ðú(M€ë.ÛôYºÝ㾆4å…£‡“ ˆ§ï³âÏ^™ PàíÔ ‚Çðí\”V`Hꬓ½–Ðø0ðz®ïÙ0O$pîÔµdr{Æ1­At˜Ç¤T\(&ŒqïãÝ?DhÙz~_ É.ë>jˆ^ÝsÓ¿éU§í–k³6jVÍ$|2L t ªAëN*IlxsEÜÊSŠ*–ÂÔnbˆ;]BÙ…æ±GCä³Zr|º³Â߈Í|9±Ïºë¶“äÇ @ááP PÂ>_ NƒuZ]çaE;¾(|Ø?…*Í¿ÛpÉìþ&”±Šð¹RUEá¦ÂII¶™lÐä~©ü=®Lãˆo¶z=á¢7¸NßZ=ÎÛ¡“eš½ãñæéè…Âakˆ•¨fÒ‘`ßÕÍðMtDZ ûÜü×ßDDÅÞ^‘)ÎTÑžªÑëcØÇØ÷J/¼/UUBÆ5á5.×q±´'&ÞÈJ¡ú§30[5"BéY$OFôa\Àã Ý`OËeÝz~(úþ¦î|3luÒ 6hN’ùCÒ„è@#^(Ÿ·Æ&ð5D"Ë«z¤ÈœbrVÑB¾ö]|{Æý “;çäðÞtVêîK4Þ­«HõÑ¡œU²Kj” ¦+32€j'Îɪ.ióœxFti&Š0Ȫ­*úì.wÀïuçÈ„Ðg²¬wjaÂïGU|Ä/su€áÅ’ð]ÎëPl{ÆØÁK81å¼…ƒD"©0‰ýs8-Øáys<äuŽ´¬ûZÌÞK~ö4ÍåÃ2ùcTx®õøSRR«RZ.Ù=á‘np÷²ã¸ù}“ëœøôÍ{Ù41‡Lï<áÞÙ˜X7ÈJ€hS«yœºÕfI¨°»íyû[À½Üáë×ßhé…[@=‡ @6ÝÕÐ;ðl wÏáû ¦HÈÅŸÀ©µgËÐk÷ã¢Ý‰¤'pMæwl‹2ÁY±«iûÅXƒÛ×°4åôüÞXkë;ÐÞn*ú³íwanû`|zD׋ëÒb\4àµuN¡Ô+ÊóÂN{Ò…ÉZ•_™ëú¹ž/C` ¡Wcš*çßµí(‰8¹Í'’‘WØ$dÜXãXØ„c“)ã|—a¨89„Ðlí7…ð5nö©kF3—ØzB$.2%#A³£u¼îc´ÆŒL`{@Nx!d 09 AÝü|3,ˆÖ}'Ïã¯}â‡oC¡ßD·Æ!= ¤úc ^¡g}áYælìUðûnÁ1d‰ç ŠYS½Ÿí÷t­™“GJIh1sh=Ævñ­a.¤›]½³¼Ý= k {½äC\f,™˜óóR¾ÌSzõ7RõÝO`5¾«Rœ±ÞL'Õ\ˆ¸ØÂB@*-­–E3†‚ ˜í_§qžW±“èÔ.i˱ÕNäŒüúsÞe¸¯_r¯e|#Á.Ê®"”Š 1]ýÜRžø?«á¢ÆÇ¶ WÂÃ\#äµâŸ1yêúµûA‘ZŠ“PÒ#>ùiù‡óW—‹2l|ƒªßÕRwŠÒD©J&RÔuàõÙ:ý^˜Þ¢½›¡åÌÈÓ6Û÷ #-9Bè(ˆðÆßt“¿³¼åÈ::lPçÒƒ¡oß,ï»÷…˜¾ÎÚ~/çjiæ+[Ÿkwgê@xtéÓÞꌺÆ3nõß=ùKàž—3Þ2°m‹˜úŸe ë}ç d!™ÖKƒÝ^û«ëá¼_<=½aÎ> Å_‘ëíë­×6în¨ ÝêÐûP÷¾CãÒ`]Ö-|N\¥g"îâĨ Pø|À@²4¢}Yúƒ‡"˜c°¹ÙÖÈ mw«©XÍíÜ8”ÿ=ÀÆÎë“Ræ7 ÷nßÏàø(·+¾Vþ¨ÃÀ«g\P¡UßÏ^ònÏG£¿sÜð÷QD- c¢üß ÆåÎü=†Êïe¯C&!Ûë8Ì#׊ÎÑ|YsCS¼÷ž¢ö> ·Ï s!Å3ë.Ó\aO_\$ö|ù úãf#¹36,õŸ¥±vu~AAÝ;¿ÍÝõήdÛÇ“•éÏTÕÐ+‡9« q¤ŽåÇp)žl!«,–$R 6€œ!¼„^Û`,G¬aêí»Ó±ÙJvqÓ!}f}L‚$]íYð… W¼ŒéR=¾±b0©C@Žý_8í†ýý` HTÃêÏŸKõõk’^áã8¬—9؉ ã²¼™ðAê9Ñöì÷Hæ¶ë‡=ì|?0A ÎîÚø¸=B´±U™–0š‘øì1ñˆ†W!E˜¢îB‹á†F5xÄ1=¹Ùwîf„ãALˆsÏ‹ËÜÕ€kô/`¡~#{/§Ôúœ’ŠGBsëXší]ˆ–cTçhò\Û!f‹F½¦Îr·VæÚÏÃש É­c¤~XA㛪Ýù8f%>×=Ù/ƒéÀàí¾1»œ™¾¯ŽO«ó›òY*xÎØx…{gHMzÃëõÌ~¹õ¯Æ»´›º×;îÉ·˜ò[™Ó¯ÙBj>Â5w6.&Ö‰ê!ƒ¥6?eœ ,õËïV2R+›3°sË êv„-êÎÆO¶ðaöÆ÷Däb«ñÞEö’°èd=¤ô† /½ïÙo»©zKä*wö2dr@$D´㾨Ø2†A6DIÀDøne…Uì‹‚ ççmM¨Ž‚º`e§cš• .sÛ’ß:<¾0øÑÕ‡:éíÓÚ8¹N|¥ž6Ä÷Ýw›¡ÓÓâTZ…èÜÉ/–IäÀýç`X5Ž6Ø•u!¡D ªeÐR,‚b(ÅèÌNøÒûÂÉÞØø Ý ÷{@x×´„à“Ÿ qÓ\çv½µÏ!T¾"å¾­ß³< Ÿ45à¶~>ˆØÄ¹îsá­t÷´>Ôüa Ñ! ~» 8›ß ì?»x†ùµ Ÿ)Õyö_}/Z3á}7²5å(€ù«'ß[߯_cÐë|’É-´êUÜ02ÊÛÆqÕW-Lô<¾±¶„,ƹx.ªvòÅ ŠGhM<ÝÌÅ™Ã7/¸SدÖü8Èýi$|aQ®ƒP:öý®%8¹€âO¸º(:@ZTƒû~~Ç–â g®œ®¶kÖ‰ÖŠijæAû½©8F-Ê®¿?r^Ê!˜ eÐóPA³ìNJÄ(OceDJs„[Q&0áâ°}å¡ÁÎNY3HkÊ\(±¹–=õU¹ducO`.¿^Y"¸*jÝ^–KDl÷Ëc¿÷ܹßY ˆ÷1¢w‚jV»p_³£å|nsÞ´:5[Úó™H·Ì܃9À‡ƒ¸Ûh%£a¡žôÈÃ@F’"1mª7R!~³ß†>³e{¾mâÃ~Xfõm½Þ£Ù/të4߯<î6‚>1´ #âÎÙK1I„ Á3§Hüdû$*ÛÞ ·SÀåé›4GrL9€‘ô þ€kÄH¹ÜJY…j `k Ûª\Óù–¸5½9ž4"m§}•91ž‘ÔEi_’ –fâ´Í H»_9•×,Œóå}ït??\K×H z tÏ (|qøxòz{dö|=4‚çCzÄ–ûôO Tß`úØ3'$Kauoå$ZßÔˆŽN³T•u#¶‰ DRA/óà÷;â#U߆{àÑ^Âù*ƒ}CltXžáp·\}œšû;è½ÇÀ‘F>”Ó~ÑùË©'çŸ`yjg2]^״󾫶ù]m5¹‚Mœ04Vñü2†ÆØ[2™Ëw¾ÇLNàΛW0«ªN`iXÅŒ-ÕŠ9îÏ$¿?ˆ49:貫¥Y¸2)QJ‰»I$©4°—l†ÞïO^÷¤ëÑœÏŦK Àé õvabùÄÓuhcým „÷,¡ºÿV@7ÜPŸÓ3Ü-æÅp><Õ”Ë 2hP_E<åW~ÅÜé4:H F6ÜêlÞûÅÆß(ØûCáß=‘:¸Æ@ û{ú÷ÛX¾·¸#hWN¦æŽp»Ù´ð$–ñ©p%zÛßd Ï##õ·Bˆê•¶ÀÛéøî˜_(•>NÏæ2˜( ¤TáxÛ €êƒ”9‰ÃãóËQ&Ñ@FíÔÑÖÙ¯Ùº[l!kHÁ1˜vç@Õ¨Ý ÊSóÏ]i;Ntw¶»â™ULˆ<¢G2Œ]vK²uØl^pû30Ñë­'´çh»SxÖŽ²÷¸Z´2l+é—ŽN4²òh÷bÖ'swq{FCªeä‘ÛBvêÉ7&ä‚ œ=µ{w—¼0ñΤEêë¬ÁÝ\ømV]½5Âõ#52Ú¾ÄqÕ9Ôz¨es94ÆuMËÓN–É¼ÝÆ:É»ÝR¨Ðr£¾›{UC)ggSÝÓ¡QΚÂZ1Há|óC¬=×a>rÞäÍŒNŠQv;µa°zTœR7¹K®ÊgvÜ®Å<¯7k;T£Â¯/ZX1Ÿ꣧íÆrÒvà¡F¦r(ÖnÙ„sdÍë™Íƒ4r®îe¬‘rÏXR;*Ð)Ó=™uk–8¤iÎ  œ˜±” @Ä€šFlc–ìLÅÒdÓÙhܽ]þL÷q¥)Í`•ÄyblbgÈ-›Ê8(­á3²SËt¢„ñBMó$ÔRÉÚvVÉSµSf¡|g¹;—VMO:®»«ÅJ dÙ'R²¨ÍëSL2›IÍaza"²2g€­(Þˤ$ £“Ãu·²$šÃyH“NòLÞ¡É“yVìº È ­†…hˆE£A’y)èp‚X!š'@è­¹2Ðb4‰Ã¥&o¬‰÷·µÆ&OqË\–`>7yš†RX)øiÁì!OwÞÞy‡'˥̳Ø]í¬âëÛ’©w³2¦ûÖcÞä¼öžüÙ8‘Q_d—r¨Œ—²–³ AŽ:¤€#|EÆXȈq†A$+9Ë´¡ßHCÓ†wße×YTç­¦\º-L/—älLH!@[ÁÉY6AºÆÖÌ»v0pZÊ¬ÇØyfìèšÛ››mfÎáDs”2sž#$ÌÎv=»¼q4fÖÒiê |“XÍV`Y,¦æo&eóDAAnÆúðìåכꞇCXô03 0˜Z,¨ $=%ÜL­N‹¬Yˆ.5€ª€ÈŒDr”£,Œ+,R©ÛpFÆVÔ½µF SŒ+"‹Œí*‚Á#¨"‘[êʈ"ˆ( 4 ƒA 2‰š•W¸:þc¸ÄÜ6ø'|ÕÓªøµ9ßV]× « ºplñêu²³K½R6·6eÝ©ŽçiY ¤vËîX¦¶:ìèJ¡ß–îVÓ¢0ö´] 6²c«fK›sTôÁ¬îE“43g:‹Å™¤"¸EpÕDc€¢0‚:ù&÷}u`ª'7’ O¸^#%Jñ…+ç2(°L­Þñ6%G<øg” úGù·ßÃôü4)wBúg¾Ôæ¥Í|ùbõ¡³Ó¶€^CMÅûÝjâ+¸±ðÑ¡™×ÀãYæI!nkBlµ„@’¸ZP)@öb§XÚï,xZ ¸Ç X÷L:¼W„3•™¹QjÜ>Ðf[Î3‡{ï´6AlΤ+Cz¯ì)0 I99á¸ÑÔÏ2tœÓ¨3PÒàm7ddˆžÁõÏÛ¥ã<þæÒž5Éç0óÐ1I s“øýôÙ»± D]ÚÒ€L‚ f ‡¸c­Í¢àÂF¯b0.îBÓ_2×W{Ó+fÞ±:ç;Ukš©9;1)CHimMòU†° ˆ4çnd[Ò(PR€U(sZ`G“ÅŽë © Èlå:µI‰Â„òU‹ úA<7|,–:½ÉàÍ´DÎÚkÁÜD]…Ck™‹[|Ô!È:çmZ*ôS, ܽ™öÊ-Nj}{Ŧ>€n[ÎttW_¯­¹)ˆœÀ‡fÌ×·{ydšÕY_ï!Óí©©ö[>ïes¶­ëÛÞùü#íúÇŽ^)ë¦Z턾 ;Mà@À|_c[©îñã#»×;œ\ id-ì)¯•mí´-†ºûÌL¥‡ <ùß+¾ä I¢§#l ŒØÛlbN2#ÆÁ¢(’-M!Ÿwç/¿UZe¦¼}±3åš—í¾‘®s§'VªV1™<4֮˙ÇZ2Œ\îª Skm+Nc>X.ÝJ¿w®$û'¹gÛG¢H²" ¤$EŠ0DEˆDTH‘"‹ôm7ß›ó×€@3Þ^z\ÞõONˆÃñ¯®y‡UÕ ú•HóCÛâ&ŽSú«ÙqF¯ˆëùÁuYnÐ,'íŒ×«Æ¼£ÞÁ0Žƒ¶¾òÛÒWPð媀?\èú„û†Y²4Ðú«wosu´®Ejû‚ó Qyµ$ŠÈù_ªr«c|HZ!£–‰ýìýwó9 'º Z…ê;¦A‚ËÝv(Ö§&ò02Øtt!ÆíÔ"=l‡BüvßÞ¬àkä£Ç઀\%¡Ù,–9Ë‘â*U™€”ºqœÞZ:<Ñ~`håÛžvF¬øë½hÚšž#½ÕÀ"üÅ­ís˜ wãñ ™pxù‰’ÜT½™"–”ï7‰Ì`5δ-Ÿ*6JBQŒíµ¤ ·æÇ7©8ÇÃåí{£jýŽØ !z’íUàt˶èé* 4Í¥d!z/~™BÍ!Àh ””4H³BiH†Þ‚ÚÉ |Ûï®^ˆÞ3¶°væÖocY8DLÑË” ™#Eêaw £VtÍU›rç- rQÁ UѾÚC9¨à+¯¢L¤k|ØB1(÷³¨D˜²2ÐâŠ3‡î±¦ˆ×ûëèÈ;³Ð0õóÐ D48`¥±HÕbãÖš•ÁòÉß­ÏCÎj9=„lÞÁ÷KxÒÙ(U†+p/„?[¨ðø0Ï^ûcY»À­*xØÈϦçÞZß³ß ¡ñòï)ó¿F@CÈ` âõˆ¤ø÷ßY®ÜŸwwñØð#ã…¤>|bø­ ˜«~awì Ï6, …Ttp(Xs £†ÛÓð¼‹òd *~{ä*k5íÚ;•j­©ÓŽwÁmf³”jÌÍXw=ÖqÍãÈD‚ˆ}2fb®åvëd`uŠ'nM!qù(Ehk>Ø–Ã!$ó·´fÚ m°†K=htG•¤É÷\2ÞÎW bðîØý÷¯ÒÁ”ù iSâ²k#Õ‡™ë4Ùê¦Ýîv˜©»Í ‘éܘ>œóŽŽÿ|DÄø‰Ò'Ù÷³ÑÆ4Àп'k´^Ú¢u¥zñ¿u|•Þ‡ÉÉ,eÓ˜Dš^+­‡äâÁŒ" ÏÎqг#mó¯·ÕËû<ëv=áAô&I$2ØDÑ5G Œ!ß©ß<Ò¡¦†œåt=0'²Ê’G?­Šô÷Ò´CòÌú¾CQéü@¯“.L^^éØOèÖÑŠägW­ŠÕ$:‰,Q]ɬ:ëZÙ†|ýèñ—A]4$ñ k†tƒ¾ëkiXºKõJ:ÊÊÂì»Ë¥ÏTà’S§"Ñuõß0í7™…t†0é$;d#™nY¡VÐø dp£J!v€½FÂfiP²³ ÍÒ©DÊŽ¸õ‘ÓkŸJ=W课wl}"&f`I€  VêðÏ= qŽÏ¥}8X¶â¡Ó^°oàߋšÆFÀ #xY–ý°XÓDü¶c²êüsêÑ·LŠV›ïsoïVôûJ¿]/59ÒèK¬ëœö¢F€‰¿V‡â…¤Y Fõög&Q¡1°8E6;ŒîÀhlOXßMH¨¦b/’Ä-¥§„ý4`.áëm- tÚv9ÉE¤ ã0gOâÖÈûï~GlJ íN…–pe\cbo2¨€ˆž4!ކ­¥2¸R6FȲ€PÃèï5Hãa‡À#–ð‘|F’]ß§¢ûEæqVLlæîÿ<œzÓª’½å$›#ÂÜ‹hhÚN½hDˆüÀ-bÂË L:ÃBÉ"·µC=°ê5c•3'¤AªžÊ‘¤_'±æ¯ßo[ÊÙÎÅv[ìê§;Çiµ“²,×OU¥0{X¹pŽj–Ÿ9)D¦äßd ƒ8°ôÌݲ/6ë6ÁÃYJçtEäÌ«ŽƒõP<á ]RYm;˼ñW~::5Éq¢ dˆ=\ø©užßÀЧï-šÝÀÆ$úäìö+s°í}ô¥]»Ê™ö í_2¶xr™AÇöù÷ï)D{ÁÁžû|¦´n^øKpŸ©qS­# áðW:Sd™_ÛÎfŸï«Ìì ø<0sBt `T>/áµZYe«8N,a^Ó –4ô ù j]M»°‘e’Š_™“Xë­ŽùÞü¦¤kê'¹Os¯Ná«–æé[µ’÷)²p[¼¹ê.®ÑÜ;:·³“X\¼§Hé!ÒÔΆFÖñžçxk§-å•–Ás8·X¦Èݼ]³§XÙ—B…Šä§ 3‡•_e抬%–pæeS)äÓW“Ò';Dô‹ äX‘tøfnhÙëìž o¬õeNÕ‡N¶q™±:¸qAv“’©™|,7žIõÏÔ›3Ï®€$ % §²€d°„ 4)¶ƒC‹à´\viXƇ /0&å #†‰¼á%Å© \–h¬±ÔÚåÊÝÍW[7ªAÝÐC5r‡Œª­(9dirïX}›Umß]\† ìxŽ!ÄxL Õœ,îäá©öœhlDu{;Ûh{VÝÁ\+¬7¯ ëºÁá“;RPÄõÍ2ŽíOmø¯B(rR6wi%žoŸ)²Ü0O{¦¥Ç¾6VçkNÃá"è€zý7£´ûvAÝBýn¼‹‘™]lóÞ)P]àr{ÌrÐ…)ök7†OIßK‹V åÉÆ;6–vÕð©ÌEx‰ö‹ÏXh¾<.ds1k 1³1Š(ãB¶´+Gtï“Ze¾ðÃ/O#ÔÐEØB†ë`jI´5vØ™¸±dt¤ÌŸQ@$ª`½¬9pµ§"zX¸«-«¤»‚‘W8'A$ Lò­tß=›ÐÒãq£2­§ÈÞ>«©¦`ª§|î÷8œjÁEí¢DAdÖyj‹Œí<ƒ0îÐ`ª A;´bÈŒQA;""5µ– ȤQÄXÅ@…ª‹PUPbÅ@F,,b‹#DDAYÛ b ¢R1¦?âèäùA0 º;糤4׎ÍLbûOUg*׺@»¨”n˜“t¤*b;2<ØâDÈÑŸw£…=CDjŒP‰àuX¦6¨:»õj½ÔxíÔx±G¥/-óÀã(´B¬¥¤¥+‹m)hU¥KP±µ,¢¶µ(^3#rb™,jÛ ¢–¢Q ,QQEb"¥ŠÔFŠ¡Qµ"Ò (Ïž0YêÐzÛε¹‹AFb6GœsÀÍíŠÍÚhMQ$bÃS0¨všuY¬œs}å«è ô¡ÞlGŒJò‚Z m¢qZ´æ!Þ Á¡]5ʱÚÙ,ú¥7õN¼aõZ|†’):@8€GxdÏZ›Bßžõ:¡Ü^xw‚%9+B"º8Ü(?Ò@  ŒéåŒ, /0£îe¨‰j1•€*÷¾{ã8|A ´=ßQÛ«ùkúòÙ$©öþuä4jHŸ)2÷²ÝÙSC˜ó®®õ?\:²*Œ^Ð϶Åv|â «þ_ÏsÝTWÄ+ú®¼®nîV7Ì+4B] ƒÔ‰Õª“±¸¨3Ù'P[ «˜]¶¹ª½†émXáÚ:°Ä^Z´"¼ X ‡ëî<4nî«C¹šú&¨ß J°Qð¡nø!Ìä(ÅDNÒÜâA×P„@âJ&+°b%;Ï>‘×9‘š9øô ñÑ~£„¡³Âg›¡Û‚‘ˆF,ü@"¯_ÕÖ*6zº¹8Je˜Ž¬G霿l{Õ~mÌÅ £3¨æ–ûÁT*¾ß»çBß\5éñ…œ·÷.À6óÁ<~ø1L^5O¼y2pè>üG­TÝKÎÙ–ÓlX@;togy¯l0 ÙA½t:~û]‹ŸÌÜ@CVi_ˆÖ¢R¾ïÕoÝÕé¶s)þ™(îWfo+±ØÄ¬­íœ3v·oXPRSQNÇ·ƒvzÕ>rc¼µÚ‘¦}XRŠp³sÐîž}÷7à nº›xPŒ¨‰«ÏÇ !DPCÊ'KïH'(óµîü/V3áÌ {ž‹¬¡î=ݬ ŠZ¤xãë›éÁ‘§éÖyŠk¾4oÚ)NÎýa¡Žo Ë4úåûFŒœyu˜wÈ·:.^Ô ½õãCìï¬w_un‰ÚËY{°7áC_&¾~û¯zαª$â9Ò“"ªß²þ¡>@`Œã——ä¬V0èI?4ÂV:]Ù&zûÊÞA¯wŒh}CáÝ8Ô¶ gSÒýû÷&—~Z+wÙvÕìÔéÕ,×Íå é©Ï˜¡Ï.À«·÷évŽÿ}×UØ_U}2øð*µ‹é˜Ä4ª€†½f]üòn.øÙëü¾\@ï¦? n½nw½¡¡ht£@„SÞw½ê¢n_ô¯Õ“ʾÖnÏô{>©{:­SUZÑl"˜mÊ>M,ÁDo\Ž×·r +Ç5J(75&zÙà@ˆþá¦ràH1¿„ «×8×¼÷kTŸ¨\ ˆF±P׈ øªÅ Dë]k{æ]_NïSÌêÊÝÓp’vÔ<@-Q•à¤Ê5h¦6UH¯^˱Mµ?fæVy|—ª šQ晼Ĭ/gÝ“3i`CgÅýaNõºN)*è% TÒ¶GÃkwV^ýR1o!žBö£å½žúç”)ž‹ì@ƒ tXÑÕµœ2Çz<|UÇ$j¼€ðúA'Š™¹&8ŠkZëwŽ$  #oî÷Qð•Úuø@£ö{Fz¸DDv½åNÝÊá}>ÂBÜ÷skácéßS8¨lx"~!h|zB„}3­‹µí¦¤p€›˜—Ô¼l}úÿ~KöbàŒ2 ‹nü5‚–?…V]~ ÑM׿3¦¯YŽÄ»…nîÛàŒR4Êæ-d_u¡‘$õ×]O5`÷#°»¤Gð^Àƒ”$,éê€LPŠù#?¦}£X[9îîê»~ "ˆœµ×Qš$ý³,{3=Êl8Eç@ù N*°ÈgαXß{©î}ðµí÷ºö§ p "väè[0I€OHƒLƒCÃÌ=.„î’×¶ô{÷Çß-¡"cŽ ´Qõ£†.â°P>ûÛµ"9Úáç[òÞ»Ý"ÅÛQ0:YÁ¬½èŒZ#ݘ|áòw]ƒœ¾‹ž×›8(efI±›•¿húK=s÷v¿¢°=©T-øVù‘êoçAÚGc˜•>¢öéð®ì2 ‰(Z„GÙ/¤øûz` / "™ —yî#Kï–ü°Is¯çx;ÛÖà§tw%«Á™9D¢n+§YÞOUŒ'-Néb*pó—f@SÔÈÞ`oÑk‚¶ˆUv7†0ÑØS5²k:f›˜Ìô˜Ñø1u")ý± 8ø‡`µb® ¸¼ûŠ ¬k«…CRüÿ|=ëGtÆyŸy ¸‚].¹ŒYÙ®ôvJõ‰£hàÆFÁÜB™,_½Û—ï±GG`ø{§:‘ödø„ÖNÕÓÛVt½UÒ1½ñðög@Òi‡†Î&F¾¡1=È«Àº¾¯À°~àŸ¿HýëañÒrµ5Î.fK¿“cCÔT£¶#…«&¶D”|roõXâ>|ñn®ÁðsÜ­æ®Ô;™A‹Du邌Õ}àž±bÓBxIÔƒƒWÛ¶àùü-"£ÕÒ\® ·ˆë%sÄç:³öû3¶¿ãb¶®oqœïëÜ&÷ATÖúòè×µ– ì£ Ôm.©Àn6«pÐÑ$YF¨|;M¼bói¬Žö_å¿.m)ž #—bë§!Ã?MhY*¹gðù ž< Ï»ÑbvHÏÏâw·ÇòŸ¾GíÞ  ?Ú¦k©»úÔ’6¨9À"?Z`DWPÍïZLÁ×1wùÑÒ$4{ï~Ê^½·#y¢(¢ÈT}>ï7Cîõâ¬}µBø±ò6C+Jy ¡g 9ßoØìç¿E÷ި߀ ^…#ã‚D@÷.`ÞðÜüÒ¶> :ð‹+TG—'/ì­HñA+@a{¸Ú÷éøl ý!'3 2ݧôl¬ŸOíg7ö63•f¶Ï»?²Mõ)Í^X‚xï-î²í]Ó:å‰6vùŠ:Ù Ì~ÒNÞ¡ÔM§@ƒ·º§Õxw5ŠÀ U~Rûϧtm{Âóº`‡ÔÿL|àB Ì'`}±ðŠyu?gÀî\·ŸÚ\¥ïWWƒÝ1›èÓ͹*pªy§âÇnñé?sÚjuýàƒÒ& à‡t%}D@©{iäôˆÇÅzÇç˜2pDÅi>©ùÝ'ÝdxqÀAÑC³&„ÁqeaŽšà"Ý ÇöþŸyæv¡ @F=§S:«±2Moz¾ÅÊ 0ïhouó_/–1œðÎý™åÁÚàinî}=¢f‰¶Â}]šE×ã{¯už›RbùfŽ[Ô@wù-‘‹€m¯ÝÙ¡ c“uÖ;HÎGËD‡¦ëÏ;ÒÜ#ÎçâÞ^ø(;Ͻ¥&ˆ}ЋϤ¡§båÊ8=×žà€ø1]4O õÕ^XÐ)¡ñ®@¨,k4êk<|èCFŒX&ÎP ‡,ÚŸŸhYäC@Ά—vãI‘w1ém"üv^ŒÐ(Ä|V¹´1Çèè±v¤~'óÚBHÒ$ŸÞ<<lrìQa5ñŽŠÐàxél€Û9ãÝxù¼\‰N³ó´ç.IüdتzföÎè>FVîïJœ©W¦î몮6;“ì>y7³˜M+W¤hU!Y¦æ³3×®ÐÀ"A‹"Ãy‡·axO‡Ý8ꄨb#ÇH”"d1Ý™@‰æ¹÷y¹ãά“ k£Ó¨º¬×”Mxj Ö™\ÌæOûš‹Ä„CÒï‚DXj‚\"+Õ{9Ò2"0¼„6æ,Kg/6êr-dˆ&6V¤HA !XL°6Çí¹Ò0 ÝÇï ô{ÃŒš1BðBuãèÞj¡™Ï¾Áoctîõ\¿z…æø^"’ƒ“± ƒUÇŒäï>#¼fŠƒÓ@ƒåm SE–›EPÝ®+uI°Íj ¬Gj2ëf¾ôÍðÇ;„cPíÙ½Yvfcd½ë}tÊÜ76g/ðC.¤î±'jó\ð§Ô¯¹’‰zYfð:´5`¬š›×+'kµÚÔ+·­sºÀæs\É;ÀîFÕ›ÜÊIvèíf³%Ë»oœ·t9^Ó¾ëÞÄ+(é›­}ªé.Ç;9N”‡/Y̹2=°øv‰ç,ñÔIk4ܽv’95\ð^.’³…îRÌaÎìÑc7ICFuÚ­¨"yñ*xMõYµFÙauãÚé9x®ÞãwY¸°+rz¯± ²´êÛ9™¼01¶3h[›XƒÞd@8Ãv*г“ ôª0­UŽ­t:ÊçIÄvδ0žÑn†~îñ¹µ¼¨c‰yiM­¾õxí© NŸ:!¾—•,Ž:-ñ¢}Ìm&J|ÑUÄ•ÈpŸD j•pûe ˬ¹ÚVû}è|;<=¼qñÍv9ª½Ë=TŽèð¼}Õ7EÈúÁפg¿j«¡ïϾç ëŹô:Öd€$4³;¬°÷-Ê#Cõ9YîÁîî˜íÐq¾(^dù¬x݉…qLíä¶-C®`Þ8®¶CœwD &‹¤I š„N©¸†]ŠZipõB!˜z`NP\i›%@Ý@œ½ÖUØ á&Å s!u½` H u„r°iV³vç*ë€+aa¼—§®I!0À['Ï%²ÉZ ´,vm]‰2ÎÈ8öðfÁÁC¶õ¦Þ356ByÜda^3¼MØÓÓ»{Ü4õošwËÑÃÎ$QE„J²   ƒ³UH‚( ȬL¶ 1 ‚ ÁŠ*Vñ±k*«"©" ˆ°UŒ•ˆÅ#*, "ÁE@EV,AȰˆ¨¢Æ+ ÔTH¬AE1#‘ƒÉ V$bˆŠmAˆ¨™K)%¢*Å‚1b‹A¨lëß4×ϹîßYEÑ”ÏÇ~¿íÊå¿*KÛ6Å{Yv¬Y>–³H¬–Ê…Üb$v*¹€9í¢ÙŽ}8Ó.ö:ìA,ni=C͆õ\½‡Õ°Z.+i¦Õ”@#¿DÌH;CÇØfÝ@¾.Ç•= íæxeèS3šoŽL†k°àÐ @üàí e~Ô$®HŠ&N „¯¦C¡k•€ÌH ­Ò·Ýî@WÌM ²&<Àwë—¿}¿…\^¢H&j‹…U Ðeøß×ÞLNWǬåSˆñMbžôÃ-öuU`‰[âßÜ÷TûC´ÐYtHŒ„í!â9& ‚Œ=‚&Œ“,› Øb@HÉ û®æ47·Ñ A¤#¶g¯UŸtòªª‚âha>ƒ¤õšïÌ]JY^Õõï×v-ŒH"Ì @±Q3÷ØiþN(yšžeUú%»³ >O©ôÔ‹Ÿ2Ÿ]úÍýq6'ßW?™Ÿ¾îº£9vuôÓ¤EñHì箇:äæs°Y1‹£Ò*=ïrCGRfRÊCEʵÄiÝO&óÖ+qÐŒ!©è\¬I ; ̃dEPwàSÁÆ€n9ƒP¨$…_0´^¢¸ÕM÷cDV@fVŸ«” dͫȴöj®h5Â×Þ~ATî˜#®¤"»$nDVÐõF"Ȉ#‰’‚7]k6WºéA)™üŸÙÉÌÓÏ ìI„`U (¦P!¢wîÇ[í }w Ρºæ³ïk}¶ÁABI3Šf»ÙÎiÚ¨ÑuâòßKÌ&'W¹]sÑËÚ" mO ÆŽõ°G¶€'ÖÀ“æW>â³õŸ7ìuTH…yÖCzúNS<ŽmÃí"²êÑ»Ú[…ºßY¡†œÂ#UœUæç¼j´çl=h”SŠ»Ÿ_’±^ò ·•ÖðQ1 nìÙ½ýôðÒæ‰†ŠØç^±÷ÛéèçeÈ:ñõ_×íb h ÊûŸl~ë ø8¼¬ª¬ú_w… /=–äßÇé\JâˆCâût^'W†ºRÏ·Ï$ð[½‹ž~4pý”þoYp®ŸkY¿‡¼!®o^§‚VyWt߆daY*ö8øg„yqøyfX–{n3GÎëݳ#GÉ5û="_Èw<"XGÒkK·çõèóÀ¨…E Ú‰ÔC^¶5ÊöÐØùg¶Ðð¼d?8 :¿DVüþîl}éCÓ¯y^­«'‡…ˆcb¹ ›YÒÀÖáSSs}æ^äÔ™óJÍÃŽ1m âœÿ 8Æ›–^ß.Ûf„à‚¢…ª6ò½5}”®gÞíH pÕ_ƒ­Ê!1«¶uö¦—¶‰by³“žõ .< ¡"¨Ï·È½Y‚«+ÕŸ@U·SçN(D~ö?/œó¬Mœµ”s[(â¹¥ÝÎ}Ʋ!{Åû}Ó•í 5$Ý¥ºîÆ{@›O_³ÐêH±“1\ÍT {Ц ÝE{j}”p«ï«îúB/3_šR°~ÜǪ¦öܰ‘±w äÁp§zEl Áý{÷é…-÷ÝÍ‚xŸÊv1^½nèïXÂÙß\ô±ÉÅðÄA¼ãç‚"}ʪ†ˆ®æ¹£[5¹Ú†}Ù;L̼?;îÜÌ7²6kûù¯bÁ\G„ÍÀÒ!lÜ+þÐýë=)ûL›.yÊ-°´Aì¬;¨˜ˆ‘Þoñ»t„+ð}¶¸…Ò,: P{·´2kÒ ’GH+¼s¤0^ñð@ñš*J¢h$NÒ`Ç2|vU‚³¡à€ VÜÛnÊ‚.Jô§˜6Þ^åJ]^VU3©=àœ©s¦j›Úu!6ž¡8ŽŸp®B¹±õÙ”’¿Žüü:¾t½–xjPÍ%î4ìÂ"'+N,ÖÁýÐâŽ!saB”ûžßñ‡$çÖÇ«ÚÓµÃ}o*‘‘tfE#çw(nNýÔyÚ‘da!$"Õv"X¥wU<{gJ‘O¤`>¿LW 4f7ö÷¯ àuѦ*ƒ|ô=Gca Pºmc3‡{ÆEíÆ1¼¥HÆÞµ­Èl¨Ì0W‹ðª5C}—²8éŸ×aK44ä? c´(‚KÀ%Ò ý~€ì¡@ó¿{&È^°± =ØBeòRñô©"§œ¼l.©«¬f¹ß-s>ª«ß€±ñ«ŒÉøm¢;éÝóƒÔRÒAû£ò¯…|s„ü¢c¯ŒZH,>–W¶û³£ux¡)lSmÛ4&¿ ÉÐ'U˜WÆV®Lâa[Šm-JT®Ú®]¡ÂÍI²d˜Ô‚9S&G[ÝÉ ¯ûdû%zExTI'‘‘¾óC«'š÷uÂýtk(™Ueƒ¸n~š¹Ñž¯HØãaàë]ª½Þö¹µ˜=à&'vî,ˆ‚8Nmº¤¥Å Z ;îv(óÁ” H¼èwBm>¬Ùvhá,3:Ã@»dhRÌ ÀåÀ&^pð€¨åˆ E`Rì¾°d#‘ä/Ý@b#MŸè'§RïIŸ¯¯AÔroä}Óá``›Œ*Ú ¡ª…ÈS«’À°ú´[Z"”¾%~Æäb“Ô¾ï¦åëTš^›+kxÍoRfÙØÂ4Ðh 8øÃ%íólê] †(@²dTD iÚ­­jºç²×$y쀪jÕëÈ¢9Þ¼ŸÀˆ¿¾óÁ{@ÞÀkz>_`›?YcH~œÉмçÙWóç¿£Ž]í@œý;wžÛ€ÈÙnžFGÜ1I©}=ì:#£uÊâv¶!]äìëΰ¹Íü9é—ÑVQÅRÖ GÌI(=¬Ïœxù|Ù#Ç‹›Jœ—aÉúte|6ªÐôç®ùèY#O•;‹@ê#6Ñ­dš'‚Ä-a¿XdcáÓèÓvñUI›ÐÍDE­âà?³U½#œ*4CŸ&sIžï[é$k§4W5 ¡íÇ,îªS»îò§*‘V ¨¬ÃbWO`ÎeNÆm$£ÈrÒß`z™n6”ô t‘àwÎN­†ç÷Vœ•œ©DP)Pœw_‰dÖë4ëé› a%nÚã”P²e£uµw—œ3šæ¶å‹ªÀîùTÍÙ©–^6 ̱Œî,›Š£x›Û.—uŒÎ'l„%„Ù»kƒå$ææÅܳ…Z›ªG­–+*EÍÊî•nDa›Ñm<¤¸w{ipm–$!˜f¶£4k2žb2®®ì÷U.ž¨¼½zxåÓ `³6»¯oV©]Юî929 º©'xÍíqºYTeØ»á‚e6Þz.cŒä÷\×sä᪭Úݽ«EËÐŽž®b°„Z)7§ºï.—RDðy¶ó’;ÅÑ6ßVJ‘}¦ìikTå$S!Ž›¢ë¡·VNíæqoi…”„÷gVQTÙÀپŽ|æìJ±šoiɶøu͉Éά¢Íäq“"ßÕÖV[âºÜб+d«ëÚÊ rÛ¶ôÓ<6oï-Ô‰<Ýó¶Îvžs"" Yîå®ìæDÌíÊo®¦nm¸ À Fî×-7u“tغ)=šÍîf 멪8I<µYíH,yNêȬêÿG/“AnxÍ!Ç&²˜õfÖ§+{õÐØ.zgÊü2]gX}Cu¸¥c<.œÆrYbÆ¥ -êÕ^+ÃÞj™^Td7—Fá«Ð™bIöèªÑb¸yú¤<­aïBž9Y"ÀNê§½ïVôñæÈ>±lHkÎèp¼¡sN¾Íå°½ÔfÀ;95ÓëèÎÙ‚Tã˜Ußf%L.5DwWžuÚç·ª6FâÝðUãÃ{±±õ‹ÞwïwC¼"!ê‡30C)‰R¦KPsÞ%Ë Ä6 º ‚åØn9º#QÀÊÈk%`¶ÞØE B0ns6x/6É=Ù„Ø,æ)ã¹unêªK·y6dÈVmÜŒë1æ´÷Ë`˜ ƒA¢áNôV@Õ=M:„ˆ29rõÌ…k<¥[(!ŒÔž 4H±EFF$Q#®ÆÁ„Œ fš‰]øœG®¶®w³\[õ#ªû´fTß“SC§u <;» RÝ»JzEÕÝ ,£sE 9iPгÝR³èÂ@œ,Ù*cÄqÛLÚ#yt¹b!DÌ®TÈÂLüã±;uvý×Y'ÛD`Rê=0Àõ$½Z®¤ ‘å&$¨Ú"Bv˜=Þ8V$–B4áZj@´ÜQdrô²³TÚEˆ&.iVF‘åŸKí QˆF#Rˆs°””©q\îŽÜ«TÄ×äú™º¥FðÌ(¢Ë0Ç0˜šŠ)Ap[† ²ˆ"7 ø-»4,©IĈ"FH@ÔJB›M¤Db$(˜ä€OÉ â ëM¶ƒ/R@’ÛBЈ íL"? Ûòá›ávPã¹s hšM7$Ë· V—!+¸…›µ„´#R Db³Î[Æðå®Ú(¼·8ÕÌÆ•ÆÜ¥:Õ-¶ñ‰ !4LË’Z]ï.å)Ìá¡C†ª²>zÜE©×zSI0J0°H%fé'i0˜H^í–™œbÝ‚ E8òÛ´SrænUpr™Ð›3JƒØÊ!öh#W‹IÑZ{H°jLɸ If—fQpåBtéYÀqÑ[Ç™jo7š-áÁÄ«„U}ðôíBNdvB~]õïËÖÄmèÏ®lí|4f´Ü‘»Üå ® ír(Óf¦™æ€ƒŽåíJÍõv$€—ÁE!ÍxÂs•ëb¤é*I+%@éÄ‚Á‘_oxw"è´2»‚ ªnî Aæ¾ÆOŽÆsyƒì[›“·sîµ|ôã¶RU’^ðÆr-cg'©YçËæ†¾C~{œ…­óÙÑÓ92£`ŸM#ÏÖJñ æsÒô„Øð'F€9õ=$_½k…{À.r¶3Ùy¹ówªSc½•f´§; 6gBáœ(ÃrË6ç®sa'Æ3¤t­Æ/i¿{C£¯aflxGt¹©ß¹îÅï…rÕž­‰ ÁDY‡æhwíl:ï{ -O ·{®˜Õ‡ÃžÇ…$o‚íI|‡CÝB—júY^èÐf‰êÚ.ˆF=<öpã¦0 Á1@ölöÝ‚0¿«õ|^}uUú?+ò-~Õ˜÷²›U .•é¼T.s·*xŽÎC1ÍA™š ŠÙzOMä¾GN\GÑú¦w?àSž™òõfk%ˆíP˜> jêÌaÙaŸ÷KÌâf+X¬+91çÅ÷96βëÒÌ«6Í7n­ˆ°O¾~=»ÞUéë¯rX+Ò7ÎLßÈå›dyû¹ðÒçQÑÌëÁÇŽæræ_Îó œ %ß;¡t1‹<† »Øi1€¥º DÓ=.Øžw¼çÐ…  ð˜ß·~øWµÏ•GÞï岆Þý·>?Ë¥C?RÝý‹L·@ÂÃíÜYXFb‘2p,ÐǯÁ–àCzöf…UEÓò¡ÀÙ¢þP s¾Ä‹™›™¶—ÜØÁ|ÈÐãÚ¶JÜyVÁ¼4˜Ã‚—«èß.žb¶žæMÕÇ3ćzÄ¿,ÂÏm[w›m ïô/ÏëAðD!zœÇÙ¹¸6}U8Vá| ¤s†Äú»˜ðv‡ cÙ šbМ¡a£jí0¶Íè’$_¬d}óùcµÏÚ&÷oàï¶µuتʱ›ÆjƒçÜ«TËvrà¹5$PÚ~7Økz/Ë”gö€êçÜ5}¾×·^ûI72F;MYÉúO–~ýà¿ˆŽŽ N¸Ê©‘É÷Ø ôV ¥3ŸÛ§>¤`×ØÏ¾ì'ázB̯å>scjµþ3–ºÁ¤;ø}­«â××Þ+±¿!1v!½V«ÙŠEÊm-Ú aÁ ë#›žþ[ëÁokػĪk»¦“•ˆèÛ ,µ$ÐÑM«OO?¤YXª<í’¡3EεDŽ®V´yT§B’Ý/Y›ÍT´T yl£æ³»Ö2„šØW¹ ~ À92wê¾úÞÈbÖØé)ü£Ä{>!õz×Ãíøå÷ʵoNC=è¢4át…@èöcÙw¾GôÕ™Bì*.qHÞÃßnÏ{ xÇÓ÷Ç;g(:ùYŒÝ”í༯á##š ~w¶792ãC]T*ÎbgFkOH:ËýG"#!ö˽æS¤ç~ËH’&a@0gúóÉèëðƤW^»Ñ¢¬QA1öþfìú…VßxFƒ4AoÄ÷ݺÁ¾ÁfsÃ&£†î6pÉÊfg ÆÂ&LšÕWÝ÷/KSöýôÌœe\»úêÂ@Ðm¾Ñ:¯íˆÚͧjöê¼’?w¿à.h€:,?`܃ç!ÖÆµ‡ƱIrfÁÞf,=²Í[B§LÈH¡‰íý¨•hÁ°Ù=ÐÊØéÖŠ¡/ú ÔÂßGßWÕ3žÈ³uaÆ“¿oõX=ÜGƒ‘ÖAFj$€ÐM„ƒú¯û=qùxû×.ÇVϱÌ!ҩׯ{ðI椤ˆ¤}›iþ+ 5ÞÕ| É=|hûËNLj'׋|ÜèX’ZJyÚø8c~Uï[ô©/µçíßÁ‡]É_ Ê`ºªÉ·†wna‘M®š”‚•' Õ›¼:ÿUÎy¢,Æ¤š¾€æ{»ëFÝßÔ8à°cõìÞÞyÑ¥ô³Š}Ó?²qÞ¿½’/íØ6k>›¢!£â¿^`S"ßuÖÏ)Õlá ©Þ§rþÞêó<ìCß²tc„` ƒQ,ïe†~ªõòå½4ýçë?Ïû-EZÖµ°ýÔ!ÿè( Šª²*"j ¨$‚ " `H   È* @+A!FE$`´" D@‹€ÔDE`-@)A ‰ ¡BB (ETD$T* "´EP „X"D‘ ‰dH£ b"¢(TU’°UŠ0@ŒX¤X A‚¡‘X ºÍÜT€Œ A€,’$ˆ¬! 0 ‘ˆ$XH!  È, (A„ ,XD’AH°‹bAdR$ƒ‚I!ˆ$A"2@$`)Á$€È©"ÀbDH,X@Tˆ$H2$‰*‹,€¤ FV#"$b± Å,@„ŠÀA"21dV $X€²EH(,$YR `’•YR !"„‹$`¢ÈŠ„a" H "(’ X"0Š("¤ˆ ƒAa !"I" VÁYY# EEŒB²AŒ È€°‹$P‚ªÂ(B 2" ŠH(0Š’‰"H**B($XH(A`ˆAH@X"Á`ˆ!ˆÆŠÁ"Š’ F ° ¡ , „ˆ„b¡Œ ,Š#€’Š$0 ÆŠ E#F0ˆ„€Áb¬F I"Å€`¬" B HÄ"XB(„)"¬"² Œ„ˆÈ£‘F(¡ ÄI ‰ ©"b¤b€B(,a €DH+ "$1Y“vÙ ¬-0&”ZR‹e´)EY!%¥0DT‚AjØXfLŰ”¥µm«e«iKj[,¥`Y! iJ[VÂ¥¥, ,ZR–ÕV1Q„ ŒV2Ú«iJ(-–ÒÔEDZ@µUij­„–ª"䙘ÆRËXÄ Rйj&RŒaJQmªª‰mD´¥¶È(‰d„ÿÒÂ``1–Ûjª¢-µY-¶ÕD¶Ûim¶ËQ-ª¬b"ÚQQVÒŒc È1ŠªÁ…µŒAK-¶ÛUX0cUUt¥m¹eЬc$!mUd’ ’AŒA¶ÚRÂ[KVÙcÕZYbÚUUm¶ÕTJªRÛmµiJ"fLÅUD`ÂÚ¬b"dBË2ÔKJ*%!m²Å¶ØÕ[j­Ç&Kj¢+Æ* ‚#«e€ˆª¨Œb"%¶Ò‹m´¥µm%"ªª ‚ª­²Ëj­¥* «JQUiJ--²’‘iB‚"¤H´¥m–*ÚQQ-«mU¶ÒÉd[e–²Å¶ªªÛs Ëaam¶ ƒªÆRÖ2Ûm¥¶ËVÚ¶Ûm¶²Ê[I)K!e–KijÒZ¶”V1U"K) BÒŠª¨‹K,¶Ym¥¨!K,TKa`ˆ¬e-¡j«ÂY$m”¥µŒUTKJ*%¶ÒŒµUŒ¤²B–€¨‹íªe–""""ZQm(¶Õ¶ÛXÅZÙJXBÈYJ[!d-iK-°…–[im¥Q)mµd€Z‰HXX-¶Ú´–­¥-¶ËÚª¶ÚZˆ´)DJ­¶–­µm¶ÕD[jန%´¡!BBÚ¬b¢*"¢*­¡AQ-–Yj¢*­¶Úˆ»j"ªà[KmªÆRÂBÂB…ªª¶Ë)e–ÕºFf*ª­¥)jª¢[m´¥-ºf*­µU‘‘XŶ­µm(Æ22[UŒ°¶–ªª­–ÚQŒ¶X¨Š‘"Ú-¨Œe-TE[j ‚ª ‚%¥-¶”¶Ym¶­)E¶¢*Ûm¹J*áJX[–ª#¸Kp$ÌËjª"ªª"ª"Z¡Z[m[$¶„ XËJ**Û,ZR‰-¶„$-A jÛPCL’f*æ™”µVÈk B2ˆB«e«K$,[mµÉJ*¢R”¶Xª¬b­¥-«m@@´¢%¥AŒ¡m¥(P¡JR…%%’’˜Ã1m–-%«Kie‹iJZ´µhÛUUm)hPèêâ¬b®Ë,¥)JRÚ¶Õ°µhP¡JS–®”ˆ–ÔEU[JRR”¡BÙ,Š«iEZRRZQieŠªÆ[Um¶”D[m,²Ùb±ˆ‹BÛJ*%¶Ú¶Ûm-U´¥…¶Õ¥ Ë)%€ÈFB*%µUVÒ–Ûd,…²Ä¥¨Š„‚ª¢*%µl…¶Ûj¢"0amD[j¢-°°²Ë)J*¢[l²ËJ"[UUPAUm)hPTKj"Ûm ”U[j"""ª"#‰KVÉJZQm%%) AUÒ”%¨ˆ–Õ´¥ VÛm[eж¦Z‰„¶Ð(P¡KXÄKJ*¢*ª«´,±m¶Û-UaD¶¢[VÛeª«iE¶K"Û,UT‰Qm¶ÕDU¶­¶ØX-¶[,³ 2å–BË,-[[`Z¨”µXŲÛj ‚­¥,¤¤¶–ÂÂÒŒŒ‹–®eª¨”¥ÊRÛl ÚªÆP%¨‰gAºihP[HHd¶Ú¶K j­µVÚÆ--¶ÐµUV…¨ŠªÆ[m¶”U[B…-°(P@@U¶„%´„€ª¬eµŒRBµV”£¶ÛJYm°…„Um´²Å²Ye° `VÙe¥ÚˆÆ*жҖնª""¢-(P[e–”[j]pÁQŒ`ÁXÅZIm¥Ú¶ÕUU[j"¤Hˆ‰d))…!H-,±m(¶Õ´(-(J–Y„µrÕ[mµUVÛm¶° Àƒ iEdŒ‘ƒH Ú¶„(AVÚÆ*ÛVÛK,¡ •&UÊQQ-¨D"%²ÅÀ1ƒ 0TKaa–å«l,Œc-…ƒJQUŒ¶ªÛm¨”¡(KJZRÚ«iJRˆ‹mV1Um(ª¬b""Ü„Ëj%-[e‹m¶¢[ij±–Ü· -(ˆ‚ ´¤ @DD´£#%¶Ú«a%¶”TE[JRZªHD°–­„²Êª"­)E`–«¶)ÒŠ´¡AiHIHHÈÉ@¥ÚÁ…””DUTDKjÛ,¥¶ÛJR’’”¢ªÒ”TDKjÙjÙeŠª«iEUTEA¥ -) %µQ$„UUTKJ[UUUQÛiD]ÍÝË,[J"XÕ£$’‰@µVÛeªªª«l²Ð ¨‹Kijª°`¶ÚX€1Š‚ ©[UUUU–ªÂE¥¶ÔDK-U¶¢[VÒ–Û²ÊZ¶K UZ(-µUm¨Šª‰mUZ²ÅÈÀ˜È†(ˆˆ–”´’RIBÕD[-¤–­µŒ¶­¡(Kj¢-ÉÌU[jªÒ”T¶ª¢[UQAQ-¶ÛjªÚQ$IР‰iJXXRÞl$ B†›m)mUD¶ÒËPBÒ”¥-%%…¶Ë–X‚ ª¶ÖFJ¶”U¶Ò[e¶…ª´²Ëj"Ûm¶ÕV1UŒ`ÁPAm¶ÛjÚRР¨”¶–­$ mª‚”)KeŒbÛ,°¥-¨”–°aiJRŠ«C Ba†[mUU¶Ò…[j®IJeªªª«e)`[l±ÛJRÛiJ[H[JRË,¥)m²Õ`ÁUQÚ¶ÛJ--T[JZQUhZª«m¥«l²–ÒÐ UQÚ¶Y ,„–ÛJ[Ui,²–ÒÛm-¶­¤¤[B‚% PËUŒTKj"%)Km)E´¢ªÛUVÛmÃ3(Z¹™‹e¶Ûjª°`¬b%0G3!jÒÔE¶±–€P jÛ  VÚ‰mV1Úˆ¨ˆˆ‹KUUUŒV VÚ€¨!m°€P ª«m´(1Љl±Q”[jªªÚQQ-¶ÕDZYe¶ÚÆ[Um¬XÛVÛa-¶«`ÕUTKj%–Ym¥¶Õ[ÛJZl l%ªˆ¨ˆ–XX-–ª"¢1‹KXl¶–Xˆˆªª¶”cX m²Å`0Û˜f*­¶ÚÉH+ªªª¬ZRÚª´-¶Ø–Y W!J*ªÛh[iEU´¢Ù-¤µlµUVÛiDE¶ªª%µWIJe(ª¶ªØ[m²Ø(RÕU[j%-c7 ÅU¶ÛVØ€*ÛhRŒe¡AŒ¥¬e’Ûm¥) s2Ü3 Ël-¶­ VÛ$ mcm$¤™™”…¶Õ¸˜am[$¶Òˆ–Û,,([ad%ŠZQUijÔªÒR”’t=h‰–K%–Ùm!j¢pÈÌUZI-!&H¹!m¶ÉmµUljªÛm´²ÄE[™Š¬c…ª‚ ¬e W%«²YÒ–Ö2ÒŠ¨‹m[jª¢-¶ÛmD[jÛ,DUc’’’–°`Æ+«iE´(R”A´¢°`ª¬b±Š¬e-¶ÛQ-…… RÒ–Õdd´¥¶ÙbÛW-\)Ke”¥BÒ–Õ²KUUl-DU[m-¶ÛUUŒX¬€È iEÊQŒU\%!H*«Æ[m¨–… ,…¶« ¶ÛkmUU[jÛUlµm¶Ô‰,¶ÒŠŠª‚ K,TE¥´¤¤²…EêI‰˜²2‰ìëþ”'2Cçý?£ùGþ“óµ‰ùߟúø‰6@ÿÈÜ €Çÿ3•Ì ÿçŸøëÛOî H—ÝÌÿíÿ¶pìÜ¿Pâµ%B DàòQrîiqFø£zò¦>¦Wâ»oä(ª4õbp@PC1$p€éXZêµÔÎâhv®ÿ†Œø`»mŠîïê,{€´Ý®å¡o•·T”‡/WÿºUƺÄ/½ðúǬoÛ¾1€TzöÆ¥=Lçjÿ+iåÖužeºqúÈ|d0Ne§4¡€UG¿xw•Ý…e²HÁJ•BH• µMÿB›îFÜ+— O$4®P˜4ÂØ)JÂ)ŸVµ¶þüUÁm¯Ï¾ì”Ⱥ°Ó%º’BÈW,CR¸Tö±m¥øã0,Y©µ µ¸‡G‘Ú‘],QoT{Cœ¡F×qÒiü¶Êhm ¥Ú’ÁÔ£æÀÍÔ}Pëœ6‰ÆÇ,¦NG"Hã¹#Æý:¢º/arC^ÜIŽ;¾w ƒì-<q¹°âußsÈdëÅùhj¨iÓ²¥RHEFD÷äïõç}t”NYúòêy… üÝ2Í«gl–ð4›Gò~Ö:ºÃïÀ…@[C§á9[.|B£ ÝÝês.kÜ7jX£œ D¨¥¨ ã¬ÓÍk*Šˆ){1µ^àjµ]ëay ˆ™ôœø¹Ï„¾'Oº¨Ñ¤…L-ã=gŒ.”%°èqa7yÃUë ç0Çœ`%fo¸å‚8¢‡, ñÊã¾%èúçÓ¼1Ægnî`ê1já¹RÁj¢ß|çΤ^xfL7p4îxƨR$pá˜V±6\µJîÇs“de–<¾/Û3™ñ´8€€p÷¿Gˆ¿*Óê{ñŠ®YçZé§/=ŒÅ2϶½0ºã:‰u/KRî:Ó2Å+€aá‰nÿ¿Õ‡ƒ¦ÿ¶™"Húé™Þ¥YÓ‚Q³‰“šÏY Êî×>Ç}×3|òɉ<Þ‚ø^)Êœ”áÛyeåGµß*ªªs;?oÈ|ŒË|%—AÌ tÒ ž²”ŸPU;p`Óìvù8?àþSë‚BMrÂEW´ÙÈitq’[à¿ôÄÒ3,`÷mÓ}2`u oa«Ô…\âøéJ~kUÔÀŠ©'m'×ð dìÁµ¯®(„ëÎYÈwlMR¶º›Mõ{ø’ÖÓsßÄP‰*0Tˆ\ÂÔÓ(ØáÂ"HÚ‚dÖY‘=7!ˆl@ÈÔ:¦Z>vËŠ(<׎ÍwÀéH»Ã{°´(7ªZ ô–Ú› @¦ªŒ‚V̉ühò3 îG3”WèæP.  W@€å“tì5;€{1@ÐŒL¢‚HˆÈ(H¦KœnË*®L9”QÝFð!{›åàæÅ>¢2–A¨’TZÈ¡þÌ!FLD‚2 °RAA¡B¶B)"• Â$?d…A`°CZ `e²@•ÿd‡AH‚2°$¬5’ ¤D I À©²I €(Á•8& ˜…å ™£4ÐþBivå.FðµÅR7˜À6€¤˜ˆˆ(ˆ+—0V‘þÇ÷ðªN 1ÝVæd¼L¬o© §Q‡£ªn•Í6¦ÿhda @ÜômNeýzdõîÙ:¯ }ÁÄÁ 2Q$_vAì`¶ag£a,zjt#Õ{„¨RÕUJ#QÙ¹“‘Ÿ`‡¤‡„}ŽÂëÅV÷„¬¨(µ¤“ÅÚª©{µX¬ªÎ݇#9™ïªp °:*†é­ÅÀdìEd!‘ ÎŽ´†û|”P p íòeâ—O„Áç/Iyn ¸¯y©_wp«§Ú7KÂ=^Na¾œ¼ÚNró ¡"€ûÑI1CRFFÐ ˆÈ²Ô¢D÷Cƒ5 \F’Æ€òÿ½tšó§÷Bb„>["Æ*ˆŠ «Å  BZTV@¿@YÑ)BýKÐp‡¡°¿Çtï éÛÊu“E¡iЇîIa`™Œ í>X1Ñ—¿/sÛØR?×{§&³Ûô¤ÄRƒD“åàp †~ûèzLéyCR)ù‰Ë¹Hꂈ BSGñÁR¬³ôÝìá¯}þ¾Î+º2†4?€2 9‰ÐuÆ:Ž GÂ7_¡¶7¦é?¡ÜÈÜFI¹‡ºlæS÷y’ºszaãœ]\^˜}' ×­Ç%¯XwŸZŠÉþhTDSøþmªiów ¼; òžÔ;>LÝSS¹™±F¡¤„Üì§+Y:øñijªða9)^GD*IׄèÁ ØÄM7C²‚„’Ä VU¢Q*2 ƒdJR$  J€°%ZH„µ@‚‹Š!ø#ØÉ³¸Âs²Ï=ÆžÄÐ\Je¨á~Ý;âAä}‘ŽA€Œ(bĤ8}£'#¶ãì‡H’ ‹!"w%ØÕoÅIJªŸØîdS’Â=ÌŠ§«qó>T°A—ˆZ±yp¨Z_+ªwL’±Úà{Œ©Gb¨<÷NQ®”â6«X¼rÏU$`¡ˆ¬B-G”$¶76*!P !j‘ ‘¨’‹eàïóÖ@öÁöѸj²?V RÚ¦ÍIU $\ÚE‘k„bû™ôvz®°?%ŽþÏçCA8à[JÝþw}¢£C‹Õ5».Òþ^Áù°È|£Ðteøî ç²6y7±Ùí.€öìýõ÷ýÓùþXsÎS¦¢ÍÊpüR×›Îb8à n>èMœÐÜ8Àá=¶<Ç0ͰÛYGÃÚ¤”†PÛl+–Ƨ»Îô ë“{Y³ÒOŸA@¸fFÕDIÒÆ³ì\Ù‚iI(Ö¢%nú>ÃAK$Fë„‚ÀLŠi‡‘ÞæcŠ’ˆB( s`§¢›jmAD’C/fßÙaÁ“€Í8r ¹%‰E&Gƒ»ÊàÈ<³Á~“È~θˆä£!#D6 ³2Z\ù„‰«bZ!®ßçWX˜Øx/‘žH.Ô±,4a€(9jKôì|%FD¤2¾‚ßË…røä–(­+@ …«îë œ¹”䢤̕(™¥™üZª.˜;'!rɦ »e®ä› fA5.ý!C¦~š6:.QÀrÆ ްØÜîA“7)*„1Rƒ Üsˆk%HU OÖnÛóš˜]†-´Ü®Ï=þ<›ò>®»€á™*+è‹JG¤iS³eDÛt$ã´fßÐplk¶ç ô`‚„Š úˆ­@A$@¼ín$)ÌŠ—§^±Ò†D r_f@d‰å2<¦Ÿ€ïµe¹ >|†Š<=@tä({"Y2)¹ƒa]ÃNê®…ë ÷](þËöÉô‡ù÷®t}w¡Æ ²ð½! }SrË[³Î”q —xÞrJå UE@æ(l<¡åû²©ë¢þ¤ûö«4ú0ôoÃÙvÀSÚAo󵬕2= •º½\ñ[x¦hö—ˆœt'²â)MXªǽIáSe(ûýb¦°Ë‘UfŒ7u>÷ÇCô¨HkÙ2‡‡!D¨=¬žý–F@€¨Ñd HzŠ…DW¬/jÖ†0È¢Bt˜ÚCŒ—–vÛJ’Ú,F02@T£%­– ¬DÅŠ*XÒÚ PUÅ‚ 6…b$­€•E`ÅTEˆ±U‚ˆ‹YJP,FVÅm ‘bÆ Jª‹*(‘ˆ±A`)"¢0RÄ¢ bŠÕ‰F"ªÄX‘ƒ$Pˆ$Œb¬Vcb F(°RÒÈ¢ DbŠ"(JÁŒ’¤AU‹,eAA@ƒ Å´±4J‹Åx…À²P`c!þÌ.Y$Ä‚Þ*k\E]" :E@â!QUA¨;€Š@qC¨(’"½.â"Ä ‰ˆ©PD*)QP]ÄW¨ úˆ‚/ÌE ýRÒ"›ÅPÖ*720«$"Hj¥t²Pè¡A?VŠæZ…-$|˜‚nŸœ‘D‰²ûÖ:?£‘ÁH(‰?åÓ"OGßÎCºqƒþÀk;Í"H§øØ ‚A¤©±)" AH‚OG¨'å)¥L–üú€°}ËÈ*`.íÓXSÈÄ!<8›ìr š}2Jtò{¾•®ŸŽ‚Á6 è¸ÕÂÂÛë .S ²l« Ñ'}s€)¾Ìœ³¢ASŒšÊYÆ,ˆ‰t=(¸l(u'G£©Øv#¨1b£$!QiŒR$cÀ©î‰ÂPwQšxè’Ó">šÈ ™¨ÆH$ƒ 2AŒ#$DEX@Y$d0h# `ÀuŠ 4lOÀôÈy|e‘Ä‚¬2Ðm*…*ã@•*¨T3(cr­´F g0>U\²@͘|èu7„°NC ‘22ˆ¼ˆÀßש'ÈtRÂ(ˆˆ°DLŸ÷¸p‹Ú§vâ#9ª€3ôÊnBC ˜–i7+byñs¥]¨ÈjR’"å‚TU6F ¥A­ejÚôr@œ!³™?|&˜KªŒF†!D+b‚X±ˆ‘ ”XŒI¡ •"¨$Š D$ÿº`ÄN¬ÜCÔlˆ±X#0H‚Š21bEƒ ,QŠŒˆÅŠ{I+DTE ÄU`’,"Š,R3û „:œ=QW `d¹Cù†DÛJ ¥•H£ô,l,ü&!rY Ô¨U’BœÀ45GT  °Xu݇ºOÚ~]@A€(@ªY Sƒgó>É¿&0Á1!Ø¥2•}…F±>ˆËé=Ä aÚ, ¤X£>_û}y³ì¼üÞBj(ù×2Ö‰ÂÈ õ’+֮̀#[tpij‚~féO`ÂÙT/ [÷ß7Bß!OV ‹ø¡YÌà :LÆ™8†e+ )Î¥Óxpæ!³Jînjí.•œ´©¸L3.ìÄØ†ÙÖ/"2Á¢48i†´¸Ðdã®uu’›œp8œa221 +SšÚÛ3! »V2éKeqÊÊ›Ž\,éÿÈÍœ?‹Ï€5zÂ^|(賓ëœc8ÑQ>ðÃ]3”ÓG*[w FªØ‘')@TUZ*—‚˜TwÙºU'WÄ«­]CDiˆ<"YÅ©!%czËð ($’\¥¤µèpí5Á°ë¾\ &¶=YtfÅ ê©JZÊ4Á.f&+CtN¹Õ¸ts1Ìam2]°ÅÄÓÊk¥)Þî¹Í0¥ätÜÃ^ÙMd핦N‡›˜œàÜ•´f e+d$¥Kmé10]˜`*.Yó3k½¹¦åÚvÞlx7nRŽQih(,"V `†A0&ËI¸…a`“yypN ÑÊá9ɪæ˜dǦ¼ÜÔä½56œåI·+eÁÇ­Ù uï.Úˆ0Ðl2­F‘B4M·eÌq„@a„1‰A¥ATtXÈ(\¶,4˜i"Jt’<¥v7{ÐÙöAÆ Ý0TUA©˜ÀÖ(µ£…ª™U@´¥ (n[˜ƒc[ÞæŒÒÜ`‹ÅÒš­º¬2`Ü-­hó0˜Žýó¾'\ÏEN[Ù^ Q`>ké¢{[{B¯–Vë¬5›hÚÙ/؇òw)‡äDŒE„ïÐôþ?…ÿÃ9y8§ð.rÄe#2ãˆXxØ› Ò¤ˆ'¬Šz8¨t” îûEŠù„Iâì¹õfs4×`pú?[§¢R“º %7sÃ… Öù´ÃÉ„Üié«àžQng@Ø‘š‡7d÷ýpoâ¢Jº?/ŽG•ìiRÛBÁuVÅK-pçÁô^Á±¥'ûÿ=â)õ'ÇG`ÍþÆü曚}Z‡¼þ;43…œë—Û×]éÙìX±‘Ö R6\Ô *‚)0t¶\œ–À ë>^&7©ˆcv"f£ˆ|:?˜`…÷óLÄ}ýDÙ@üá€)‹?]yØÐPOr¤‹"2"¢+AÒ“æQUÔ‰ÉÈxNþç)ÞZQ[J{áæ  d¦]@Ð7Æêª¤*i—D$xÀpTÒ aŽœ‘’§I«# \r¢!Ia0bP\2Ìú2°çD4>žÙƒåÄ®γ1ëÁ å¸dª2æCD‡êqÅõ‹øn›U2¥¶h1eŸxn‡÷õXû "¿]ÄŸ_F²NÆY¨‹ôHdFf¡–æV0QEY³µR 'ƒ6'ÔÜ< nô>B¿få Ií Rà Ö,ᜇµ"’“X(„0 ”zàz9¤:"G”†“£âIÝ*T “[±Ü ( (Æ b#lÔìê~?×OŸÚoë>þyšÖ€Í¿É@‹zo"ÆZdXà„,ʈªH¡Û©rž³êýêí§œü{Ìå1‹¤Š‡W½Û?ÍI¿/ŠÅ )"‘E핈«Ó+LJ¾¬Ì¤–%H,Ÿl+ÆÚQL翯\Ÿ]R"Ma'˜þp;L`¡mí’ªæ q|ÃqFuY͸ádF@5² @XfN“R©õë%º‰p[ ™ˆ9ˆse$5Fá&²j¡S¨iD“´·Pí"È)ÃÜöd ~˜= ¤X}°ñîì‚îâ&¯¨³˜;Í!ƒ3ª3e±ãÖRå„s0:úBtzg‚|CΊ§¸žÇ[.7È$\R¨x‰;'gˆá×ß #9Íκ—]÷ dœSÄs™A Î#Eíg nÅl/­8SPyÂÏËóÊã<7®zL©É9çΛ!ÖSe™@´òs(ì½T6„ÿŒ}þIÊ»ÉXÜýñÉhÛ0Þ/“#ãKÏ‘’Ö _8ÊEs°”› 9Æsß-q¾q–„½ï v¾:ešõæ“~xQ+ŸbUêð±$Õ*ó‰©12 càk&tß:dÌ1Ñ|Íþ'FÛ_Cß ·MòZ"§ÈùšøøV}’ª‹'¿nÂÎ@rNÀª'¯”^M³_ÂŒF¯9´> õѲ†ÿOÚö1²ýIÿ P¸(©…`- Æâølk§DäÐОjÁÔ“ŽAñà N̆¡Õ°Kôóç®g™Ès3Ì:qÏ] ™œitÖdo\â€Èœ’=f4çwŸ%zß#¦Õbä†7Ö¤9òHúKŽW˜ˆ +Éó‡b lß(#Ãó\yŸ©½ò3"1¤Uð±†â<®yÆ_yÇ'âÅ®×CO/kh~i|;y¥{~ŠkÉÉ1¤pl!ch$,¶»Í¡Ç‚mÔÃ:Ãô‰Ù;B" À„+ÁÀyMÕ2eXj6ÉË÷ÓÉ ©,ÕÀhà«â22Î ÉKŽø”+MwöærCb+|6Š1™#µ]H‡@+®cWgZ~…ï—&VÈa;1ˆLëÖæsò¯úZÃÒü@}ÁaíRúH’èUU¨f!PÌÄw“%Á›bæ?­TgŸ7ú£ç4¸>âR¼ð`/á½SêPA;Ýš"ß… vaºi€UqL›u¢šµœ.P¯“!€S‚ e8ò¥™­ÕCCäeü5+Jñ*ÒŸ±¤ÐKɵ”‘µúw³?˜Õ°pTñ%¢Û¥úP¶ðQHã*œÒ‚Cò¨: œ=v SeÀ#§j<*”脾›S±á±Š BΤ>„tÐËÅ8I]èÖ2HdO% ώ¬†Â‚†³"yéÒUvØ‹ *:œrü·ƒ¢ùzQAoI¢ç¶c1Éõw¦ €ÈÚ DÔŽÕ^Ë œ¾Ãö Å"\B—ZËQ‰]#Ø`ivDÐŒq>xÚ¸£$vDï! © 5®LéÞ¹• ^„uqÑ Efsƒ§ÉbJä…*»ãQ0¨+gr$%S`±e\ëq°!@º€ ú}ÀÇs{[ñ(v±J„Ú)‹Ô:1QË0"ù¶ŠçᇓHl!| °¢,ŒöÔZÃÃq)¢î Tb4BxwFAAT5bôÜôÑAg·šÛZ4T¹Ò‹ÀôD¿E#…E|’À) ›" ™rìÆWe’nb 74¼ÔQR"T9’›)K9â8ͱ$^k <¨0¶[…Š$*``kl$ÉpDâܸ†TE(9ÊŽt«ˆáì‹Ç,1*ûW…Ê·B¨ÜôeÅv¦°ˆ^î*Z!Ç+ÌÓ{ÈóT¼Û1çÁdŽúpªì<ªŒƒ'¹„êì¬Q/ÜeÐÖÍ@OõCl1œº³ÊIU€°Ñ…IÄ…@bÄY2´U¥}Ù†*Å©X4px•ÈÅ[Ââ*Š,O~ú8a¡K)Ëfü¥É¡/ù[>(šò\Ô~ÕR h|„d÷§6’‚®VÚÔí®–ÓÙ™øä¤ñ؈Å*Ä`ƒDb"Á„æè)(}S£ÊÐ}öb/½ y‡:ñÝR}¿—O¯ÊY_úµ…h1&2ÆÒ~ŽþÅWÜÿb"'¡'óiY[Óܵ?´ˆ‘‘ÐÐ=ÞNƒúæwD]Ê’NñÐ .€ê@Ðì.¡2±¾Dd$ 7´àó¨åsdc4EB‚HQ…cFÑŠðÑ`rpa †5ñËáñdurÁ8—=ñ¤–§nöŸhe–lC,(4?gêIÏFÞ #íU@nw¡ç ÆàÀ\êì²Lh` ±¢$#õ´Ä{¿·çHh”ASŽÕrÇÑ|½{V `¥(íªì#ýóUbo.€ÃPf3 ’&Ýër¤‹S½ËÇåðë¹2ŸØ``ˆPç¬B1æ]ˆòž¤Ö%%)Å!p¢î˜ø)NЀâ!”Àa ¢ƒû per_àÇð!ðøŒÙ$ÛNCæý˜$”—bFQJ‰ò|BPѾ¨Ëöžø¹°}"[RQƒ9/W•&F¯Ço@@$ô§:* °‹G „¾dˆP¨ä?È2ÄÂSB0 Æ$eÅOAqò »_ÑÊ=–ëÛ÷·Ü^|yä÷, Ù|½ö¬‹Öa –9ö.+°fS…8ÈÏ„öœŸÃ)mm¨«G¢SÏÉÔIš!»GÉdSY Z‡·R@aÌñ^†cGS’am_D%QD©ðè{šä:ò郪v±¦a)¢ª­Gäúy@[ÌšªÑÐ,-'.òÉø\õgœBIÄî~CØËãEîXLÇ!9ç _ß lǃA©#ÞêÂ%D)ª>ùþüÐåŸÛ°.'\ó­3êÑ쨅‚ÿ çóŒÊ~̯¥ !Hú@$Ô@@‘ûd]5DMïu=ÓIÒ8¡ID"`Å{:ñÝ1þ|„¢Ü[¡¬Lˆi…˜*æ\<€Ï‚4x²a€øÔÌå¦Ö,HJA‡lAH¡þFª¡keIòŸƒÁôí`“ˆ5 —|ösòsÉÔr:+pï¤=l„Äž¿€×G’„6œñ!"cf2×ݵÇ^CàáÙáºq‘Ð3#°‡Ný¼”´jÐ{sN†ÛžXW|ŽM¯»¯@°ßÞ&H¨j-ÄÈ eyþ@û³AÔËb{ôy툓•soÜ—/bKKRß®x¼Pz‰Ù‘)ç×>ÌǹÝ^¡øð­§ìKŠÓ1Ã&ZÚCÀ~¾x0‡;†’<€~'.þëµ7p£HÄTbu'¢}éÔóoËjÖßP’3,*“°Ó.õ¹€C5:¡¢å»¦õR¹óÉ¡c]^©u¼¾Àgö@Á”HŽ¡9’š×ínÿL ßÌ.fêA”@HL­QìÇbÀ#8e*Ë[§ÎßÎ{ó¶¢àÌÕ€S NÈ}IÐõz9/Ž–váW Ú°BÚrºÉ 'iaòE|Gè¤+¦ežÖ˜ðÜ÷’ 8e#·”„ÜÈbŒV²½|-ââ¢e8ûWÔho5ˆèÄuC*Fò5¼zNùwN&f9š¸€ö þ›õôðÐá¤hXÑêüs¶Ôxé1ˆ()r9àߊ 1Ö#j’RÖV …ŽD0ØÉÍ?BD²yÉ@Ì• ¨J’P¤l³<¿e“‰@žVaLUÝŽ¿ìb‡†›réÑìµ!¹DÔ6E«CƒÂªaaKà·màêg!@]¨¬Hh6ìÊAÍíü[>†ëŒn¿4Èøbú7hB?_-¤☆Eú…/.^l¾«½Ôæ ½a›¤ª¦G¯ˆuªÎÛöoõ ¼š@ˆAaí+·&<t>Ï™³h‡ÄP‚E@7ƒi†r©©þ'E|¹2fŸ['U#îê¡w\—l›y0tå,kÁ6þ\ŒmÒO‹<ãÁ¹T£± ö-@·Ý¹´p1*”Qúì#¦˜tu +#(,b0QH¬ÛQ©mz™K¹ÊÔ•@£ô­ŸÑtíCBž(KBl‹“Áв6¾™F µEÞ$> [gÎ}f}§7zç¹`+üÑJΓQQ‹øï¼‡îxRLœ `sÄLA‘^bÔñÐxÅëŸeÕcW“[/ ñ?MU6ôþá·Þîj#¦•QÉ¢ 5$ª ¤),¡Ð°Ê…>—ò#Ôx=îQÈP0pg;D«çkwõ*­8èú|CG@;T×䄨HbÅ êÜá5õM;8¼×< w¡1T7Â@YdüܪÂs,í‡@‰unmP©›ÂBIUBt‘ô<8˜57_j$©ÌðÒmìïk(ªx‡(àè~}y+ÓÖÝûÛ9Ê9dÇ^êé6]Ú¼—Ë…ÞU¯ôo$v  ’**6<˜ È ²¼Úbžj§ô–‚!"  ²*¬Œ`¤FEŠ({,¢$O°ý£‡ZUF $HD7í¢7qîjÚÝókÜ Tp)|Ø%X À&y XŸä¡_²ÊºHȲCñ”#ß¿[7‡x¡Í‹h„hªT¾öd›ø¡b©ý’ÄDAbB$PdF*Šƒ "*ÅQ1UEdV" QX‡B›˜ï™ùü=pºŽŒÞnpÝB¼œØãEÙ!¢£o=@Æ¡Uþ.U ÿÔòIâ°¥9ìQLú!°.uä|,†çâ`£lE–Ê‹¥,Yj¹2Š úsj,Ûm®·K¼¶0D ,50:Ü1媽s1áj"Èô—†·¦VÞŸ<0ô€ÿÆ£œ<$ ˆJyàyÓ"+ÊLôöJ}KM”¼ Q*4î"„ò&6{N-„v áyå(°ªL¦€?ºHR9!¬½ÈI$Óh”h]ë‘ †Šü°¦4ÄÀŽÐ[C8G’r³ü«#“dçHu!°‚ 1bÜ1ðPìR,”™)Ðÿ)¡ÁéÐMñNC.I•De‰E*3ôOG¯à9C£¾&± ’´]M‰2(d Ûɲ]2æ#Ì ¡Ê9ÒÉ$„l{o}¨g@È)pn¸P(3,J êAXÝ6§·ƒÌÓ(µéKl*VMè§^΂e'Ês¶2zç lÑAøsCs’PÔÍ£ñÌ*)8 I;§6'd Ê(xMÑŒb ƒ†ß;‡ÝϷ׳ðûá_ÉÔžÂÚˆ%Ó¼¢8E(.DLˆT,y±Í¿w—‹>|nj‡cšzC.bH·£ïèòzîv]ÄQN}ÜGl•Ü¡ÜÁV(‰ä'ŸÄÙýƒÜa áûü@Îl;ß2hjŠ_ÑQ‚âHBÎó#óTIÄ)‡o.sµKxºFI >Tm"‘€~*Wâ¯~‰Á|fçÂT8€ŽIªU2>–b<‘åzd+³ºe8ˆ‚dg˜s öÌ 7‹¹3p(f/]Ý5*Ò,p(¢ˆ½ZàÖ5±A+Š ˆ(˜ÕËL2Ê£251Ç%"¡hY òîšà<·i©‚±Ö•­Æ¤11˜ª2ä³’£E¢E‚*Õƒ¸fѸfæQ« Ó2Ú0´J¨¸…ZÙ…°Q–ÑR,%œÚbÈw$eÓé÷úAñËÛ° á\ „ذZ£Gƒ …WX‹šÁäѤ2MºeåUU(ì1â÷NHëtA4OÄQC瓃Yª@Cꑨ$R$‰`¤Ÿî‘ ,`Œˆ(OOøþ.°T( "b,‡@x1U ²ŒŠ " ° Œ‚‹"Š1 ±ñúûþòRñÌ*5”Až™¹•ˆ‹?Ä-6UÝ$Clþ<܈+6^æÒËRLb€ì ¸tX ¤V>¢Ÿ"l·¡ì½R[ÏgN–útlÐÈÀš²õ—D‘ƒPXÒTX²"I×=ÍPPϘ¬¢ÛVÏ|á3’„ Omß’=Àîªå )¾ô@’<3÷AM%ç^”%÷ 9EfU%)  @X~*F0Y‘dŠYJÀ*(¸€TXa!"*ê 8ˆ—ˆ…DY+$¬=Û"ùe`N0…EP•'ưHjHE‚‚¤PUÒÂÒËQb$E_ªX‡ N„÷˜!+ ª)©bbX…p<-· l ),ã ´*,JË xÌhDúÃNš3êÜhóË›Jª2µ±±ó¨n¾J¡ÝÒ§7ýÓ¾Ú.a‰ÈTŒ AEú b€Jƒd†m9…“SÓ5ÖÉ8$‘¾´³•†´ÉB¡bõ@ªÉP5…FFQĨ‚QhZ‰BâVZPZaMdS2‰N:IÖ´éÖÚêʆ*®ªMsçàÞ´ä=áëA² Œ Þþ\øe„!„ÏW!r&b+ÍÀÑ4¶¦—Ž;9?‰áý¤9Ò t ·y"ð\t uû&ÐŒ$!J Y œOhQ$‰:Ò‰Db2 þI 1@aˆ§²Z¤é ÀC×ñãú_á·¸t&Çۘǿ>r µ7BÀ`²Åh”=uûsÈ‘€š !(ŠSYÌé–x¦_h㕇‹Aj¯\­P–jÂm€?°Ë{=ydFÅ0ØÒ ìÌmE­§J „5*Nzîü1Fè#ñ‰`~•ùí€ ²!úvÄ„ð iöX‡ãaÝ(›°öÕ¸F6XPƒqBDí@ɳ\g>ÍŠÑÒÛ&D;r„>½´ñ‚ø3ŒF,ˆy€yÚ¾ˆ7ÑJH½+—¨)ãì·Øa,©Û;|è±M&K„„ {Òaðh¦Êx«ú»ŠŽ ‹"zÌÑ&€‰|Œ©Ä†² Y5 ‰ Iˆ,Wc5Öq§9ÀQë— ¬S@:§7†ØåZp¶Rż|ê\«  ù”½ÓÎë>¼‡Ñ­jƹ;BÒBFÉ>í ?4 ˜ï«äŠÈ„ƒÉž3u|&¸Êéuàoãt ‡BžÛ!îß¶ªÅ“´ÖLIÀýŒ%TÃÙ¹Pè…K¤èçùuúnÜ=ßµPð&T’eÁq”±a@œÁþ‘a#¿$!—&àÓG7 Bÿ"_Ã@íâä&NaúúâNÎÏSˆwtŒC2àO>¹Q¶–ßo÷-–ÛüòHÈOçáÃ〽D˜lb §Ÿ°ù*ZßÔýBtd$}¢D’!/¨:N/Azƒr"ŠÙÑDÁø'ÝR‚ªá\ò«Kk!Y³Þr1Þ”p 8á~5 sP—Î4ã…l2½¸Ø®ZåG<ñÆ1šÄçJæN&šÊ—ëÏ €"@`¢†›‘sn"ØÃŒÆ0d2»¬•ˆ€þÃødв(3ôtÉ; †‘þ!»?@T¢Â6åàþ)üÄN§v?Ù3?¾µc™u嘼7s /ê Έ`zF0B Dˆ‘n{ô¹¢|7Å'¹R éQ„ƒ‘bÀ‘Š¢ÏP t‘P?ÀüCPMê{èÈ`Î?¤!"¡ ‘$EÝ(!›ëFㄲñH@Uú*CÇè“®¨–M 0éT,€’ubb˜\Ë*QXÛ2ÚaIceÄ1LkJ¤Ì˜â•-¨Š""´KF… f[ ²Ê*ÔVƒRµ¬Ea–ÌQU¬¶±bFm*7 a)ˆ±jØÝ‚ŒF¢ØBD€¤!X@ &b%¦üA˜E¨É&€ (– "aL—e6 Ù$`ˆ ¬›d þ6cºIm 8JKFÄV Ù¦4JÚ Ê,X,£ 0¨-²µ`T¬*4²ª…k+"@º´)A`-š°C$Ú»lˆÁLÀF(mW×¢trjrſﰙ6Hh’•&K0 Ií 5:d¦À)ûÓª‰‰…Ë,ÊŽ …€´2ÌY!D c#h”H<ê ×JfâÑ’xY‘< …:,ú{+U¶à)ƒíOnÅpGóF_×fC°‚G¦£†(q$ dBylHC1‰$Š ²„½‡Ð–9!,ÞÅÏ'`77ݦ,h !E?ž({ucI¸\vÀ¸(ÈŠ’K$'s£bÓ¬›(h€b*©P+ó‹Áœ‰H½Bˆëm&ª!½QÊîè^Yœ×fó†Ë,á¥BÄ)Æãm·›UÍãy9K 0Éx&áÏ~pÞÑ44sFÅŠ¸…wä†ÞŽÕ×$02^¥…vé ¦|.‘¡¸’Õ%¨4Ôe·DbÊæI/I*ƒbé˰ÍÄ´4î-°‡o¯û~<\)ˆ(¢ žnf7DÆÛ¿¹UP_¡´ÒÌ\rÅ…Ö20)@š‰$†u (œaÆ!QÝ5†ÜÖæPÖcˆh;(”…u5©¨î™ -¥Fe€\»»‡°?lÆïþy|?ohIÁ‡¤(›´Î¸sêóãÒŠLÞ3šMãÍ!š¡„bÀ9ikz„EZ± bª"²"©hPS L¾u;Ò½emþÍ^Bgïö?k®þqK÷ /Žp›t8(Z‰ ჾ7/gÏ5Ž.ºø>>†Š$!ìb?Y3aEX§¾.~¶¤0iB(ð›0„’Í“À›—¹…(F Âý›>JýMñ ¡6¬XÉyb? ¤cƒñÄlipÔÁZ„~  – Ì ›­¯’j®ÆJY²ÊXF>"€i!ã„XŒDA‰¤H vÀê c1°ç#0JýÌÀ0` ¡˜"5ÈQb@ï‹øZî•]ÂÀQN‡~šÉœ)uÕÓÑ’^*m¶Ç-úb¦œŒC›\9yÍEz="ž£Xƒ„LéŠD8‘]XÛÊ:lÕÉE¸MÁ/‚•íz!¾´ÊL*„°tÃhR\Â#Í"†`¢'þúaì°Wò­0H'pɤrfƒL"ø¢î€:( Äè2Ø"*ªs%ADDšÜAL¨ˆ ìðš"1’SM%B0#I“@‹z‰@ ¡ø-8BÔD‚§¡•€ï°K³ v!ƒ.ˆôFFËD $2J (¤@vp*(NAt,õ ˆµa!DH®(wßøÓAOsßgô)æà¯òóîŸÑ›{e–BO§—qd6ÓŒ%x„ŸöZF*«Hì<ý¶³ûé÷vSšg%~·nu…y£‡‡‡¡$ò6 ¤D'”£hèQxõ‰ˆ\ª ±£¿vª0ó%U^Z÷áÀkä.Ë"’)Ø›¼¤ˆ\µ·0Ϻ7LƒaB [0K † dó"((Ú|DS÷#ÕíX@ÀB !ôOæhH&]('òu™pñõTÜ£—+L·s' ,ˆ/MUÔ +Iú`ºãYÞ–f^•82c`¼Z7œ´‘&à¡YÛ¦bäØ|áôèç)¸tÏ9¯9É2åI®‰˜<å^T¼0¯D ÃòÚ<2ðï«Î/:åš1Cw\)ب"$EQ‚È ±@QHšXK RAI!þ,ÁV ®„hƒÝ °SBç \° }ïþ2k-`‰Ð•¬”ê‘PI8äp€À4Hk• †±° Kb\&”¤·ž¤„š8Œ@é `ŒÆ*ÉAP$¥ , …e³q¡F À² IPQb ÈEPm‰ÕìLES+)ôãrPÁ÷V‡’uK5eJ0Œ„Û‹%0A !€ ÈÀ…7šÐ¢µ”XÉ,9)ÈÂh*nIC RPKpÕµ ²‡y±‘! õ›´óÌ“¦ä…€²‰c™˜vÌË6¶iÄÇ/œ=ÈI!æðóËà‰b¨Yl §¬Õ"#nP'Y+)X)JZ"˜òGv!“˜‚Š ¬ÁQ«´EÂ@ãŒý‰£¥»:NÙ8¢0Áµ0Y¼#‰³úêÃIôOáÀc,Š ÌS¿²ý8]ýùcĸù¸N„üáè¥ï[ÆuÆx¯íÇhç48*˜§Ýü=sª*…ª?“d“@¢X8?ÕÚ•qÌ­ßZ~ðätU ¬šdÛÂ»êÆ¬Ð]ÁaPRE"*@ŠI¬ (9@©ÜJ <‡ž»>÷W·Ÿ¹µÃŒAÿn¹Îg9•¬N^QG| )‡ð%ººŽh‚sHX0=ˆB1"*¤ ©$P•`ÁPQa HTH–B ƒQhƒBH1™$¾S T CX)Y»Ÿ>!ÒÄŸ¾ÏPèš*µÙÊ]IqÏ×V]ZçbiiGE_G€fÏ@d,$ˆ €Ñ) ™f@@4(Á@!¦?Õ6C3.3¨ä $0f|FÇ)LtË*il¥ ¶¥ÈI+H‘r‘Ùܧ&»L$`Zg%%`œ’‚aìÈÞñ*sauI!Q²‡Êò¥Ã³“6ô¿œL÷Í$Hƒ$¾™ $ ÏÚéïâ( dE#!ÿÀE‘„AŒDE“ùBJ (È¡ˆ Š¡’z'¬K7'—7¸j@è’ —ªWHbHQ!¶kYˆ¦Ý²e¹w ‘hÓöÉÆ*) T…@‹ X`q ™Rå×Y`é° ˆ‹5ÈbˆŽ£h «6è É&à ÄX"DER*ÁáÓ¤Ùl,°syv*Y„÷&1+DÃN5‚¨°¦SÈùaÍ’Ùà4˜MhÀ¦ÊÆâ1‚¬¸P鹯B3Z¤%fæÅÚ—©¦m$¸f)–ktiƒ †PY_ß.Ú’¤t¦Kh‡lŠí×,6¹‰pÝ«ná`–e 4Û1,561†nBA°&ƒ¶P¶†H!4JÀ¨µ„B2À¥T!„cOÁ„)–¤¤¬wæ4œÌÌ­ÆÊ&S,¢q¯Ç' ÉF-ÆñØáH¢TB–ÛjË7'Ñ«Ês&–Û]˜C5c2` ƒáuT &Â%KA¨ f Ù’f,E@Fé(ÉXB‘ $BA±£¥ ®¦¡ÙòI @éw‡o‚ ¦m„B§5ŠÄ–ClÓW‘¢Å"¶ÍwRʻ̬۸µ„ó©)Ñ4¨Û%eˆVC»:´é ¡é E• ÈÀ„ Bmì¶ä@ù€Š(jýN¦ÝwÁw×|{ÝËÍìñ@œŠ—²Éri{ÏnAŽ{¨¨ª 1DX¨¬b ¬Q‘Šˆ‚" Xˆª ¬DF"EEdF)0b‚Š‹XŒV*£±Qˆ±UŒb¢ˆ#Œ`"-lˆ± ª‘ˆÆ)F+ÅŠ*F'þvˆ"+AUŒcX¢ˆˆƒb¨¤UŒH‰UŒb ÈÁTEb)+QEŒTAQE‘cb F £T"« ÁŠ (ª(‹,cX" Š+F**±bÅUADDQÄQH1QX±bÄDˆÄXˆÁbÅE`ˆ¨¢ÅTH«V "ƒcUXª,E‚+",F1F,F,AE‚ˆˆ¢±1X1TbŠ,T`‘U"°V (¢¨1‘DX°DQª" QQT‚*Æ0R(°XbÅcEbªŠˆ"ÄcX ˆDDEXÁF"" ¢Œˆ¢È±Q‰R ùøûïY<þÞ§ï<½0bûkäYlüKè_´•¡&>[ÃÀå”aœ0ϦGÓŒ9…5~.ûϻ׎³€Ô³T\ùæƒëJDö1°)Ó)w¥¨cû¿¸9Ä$š”rƒ¶T~qÄ®ÖJŠq æ/ 2*„ЍÅ@Š£y]]4>• 1ÒÑÝ`|Þ†Ød#C)çy¢¦ŠFJðh߬âQ?¯4RÁ@¤ ´DUp0Ë«‹Òö´uȤKQ»†!…'‘™ØS‚ñk"™†q\q/z«Œ ¼P˜ØáãÒºqµ C34¡€!Tô‚‚ ’K¨F赿àœÂ— rç@CFXv$00‡þœäI#† *GXJv‘£Õej9Щ°JïbuˆD½‹YpFŸ€£G±X­S"¿~S=ÿRx€(@(AH ²EXH ,YX, (¤YU‚€È$ ¡ ¡ EK›”¶ô Xµ‡4pfðHaÈHOµájnTã?.¸’2*G¡ ô,œì„qÈȱŒz{U mÂ~Àì|ôßS@€Š’ÄË¥!‚Jµ‘Ç >¬yf„ 1*±ÙbŽ»s1’ƒ””ÂË×äÖÒ ±ì@×Cc]K¾›X7y‡žÆòJËm'Øs¸„—Ì=hh¨¦|¨²ìû}DÚÖÚŶ%Qm¥á94÷u"^+Τ¥x=`Ð. QQä¹e ÏAß´“±ƒ¿=®h§éz<ê9Ÿa}éø|¦…¤ÞÅw2MÝLFš¡¦U>æ ‰p}¡ {ÚÒÒ¥°té {þ††ÂaÊçiXÀ€B†à‚jà~ÿÀ+dó %âËÆ)ÐuÑÇàìó=ôu¼ƒSÔW¦½•´¦ôPÙ *ð§!jŒ? :]íЇg!Ò:¹Z÷A–b¸9lZQäÜDÈÎÃc™v=’§Ó†.e»…À#Èêõç€Ñ ŒŠ¼Ú¥Z`?HïP8„„ EçÃEdJ¸ý"„‹>(*«Ä9å\É“Ìz-‚àÜÃ鱈t9–’Œ‘D7—,öw[ ‡Gsáøû³þ;쇉±k ÅÓõ™2_Ö}±qýß2ô']¿ºôí'Û‚ æJ[g™‘ˆ+Õ=ò£ßö=z¹“ø(§Œ1J„/²¥òÍZ§ î°ìˆA?£üØp,ÐC´èÀ•‰Í¦D¡Y»Žÿ3 O¶W>fgéÄ?M]ûú0·pfgé¼Mƒ#*ßw ÍÓf>œ?®†±ªË÷·ÖðG (sÍöm‡H¥X Î©F*Ï}ómºInᙳ' §lö˜ ê§YëiZ!ƪT(>5 oÓÞíÓ<4¤­ÒŇpê`†ß[ÅQÜýn°G˜‡˜[ÙEC¬R\‹ OsÌp훆b|Åó¡9.”Eé¦n}hjå…:s,aüƒ'èC¬ÀÈj2!ïÏ™¨ h…îÓøÃ1"H_ËdCøÒå¾²~²XbzpA?6k"½Z¬]~tšrÔü2½ç­•ÛAAO9sº)GnåÊQV Ë÷†~t ÃõÌ0éà¬D;mÜŽÅ IÁå:f¦?‡\ê‡áÇõÝÆݧå“ò㾩Ó/VVq B¡úJƒû¿i3”óÏ9¼}aH«TìüY™Jö>»¹mk7Õ?yÞì&–ÖK÷qüZDO"tç(}o:ä1Ä*ïëÎ߇yü=!ˆ¾¢J¢"ùd¶Â«Qà ÇÄü2ÿI?Í¿{ŠB­æï®©*n]å:mþçùž§P€H|Ü:Ù8îÈû°¸„Ü>Éb˜A!#`.W1.— ýæ‘ø&䨒å)*LØJÅ•$ˆÝOŽQ’Cî#« ‚á‘©±°XNthûi‰U 7–ùµîIŒl>'Bi 衦Œ›L‡òQH@ûI5ÀõŠ–De¹‚p’ÿ±Cç•F¥DˆTVD$I¨!ç™Ü,ĉ`IPÎM<ÔSÑAòwdˆ“ùKz0Áik¶¢Ç’KÄðú+¥kù ±Î*¤|ˆ¾¢+ qD*DBÆX†]þº7u vÔêQWn0Â*rߢΊ Ba³ëè lÐ}°€ÀýSå­-óÓû;= u‰åD¼J¢‚'¶›¡¡ÁØ»Ò'A€øzæju„ªNÎm®´¦ý½¨¹ppžDû.üÃArþâãã jð2FÊÍÝÐ Oð?ïJ… ÆU›¶«¶˜šLBE)üŸˆ™vDëè̶ 2)" €ZÈTA–åv§V dm$5Ф¸ñ‡*jÁ÷ ÙÄ = ÜhXòly<:uT9”fîº_~’WwàíÞéÖP ƒ!!!™a$8EýB]äé$!! •¼lK" $‚tït‡“¯'„M¼¢ölOˆ(Hƒ+ ! ¨‚*¡¿RO±F$"É8€-DIM”Š üùèvp yØqõú©æ®2¯Þy„ÝwüÕ]ÉW®šÝÑ ”UõC±Ø‚ÇdM2@Å!çÈô½tã³ÑþAÖŒµ•Â|”|‘ÜØžV‰‚~f2WÜçF7ªùÃ[•V¯s¬d"úV4ôJ‹b*°U±ÂÜFD > à%žjaå,T~Åèj›¸Ï2C­ƒ”3Å2¨kÝtÉpÉw$ž_6Ÿ†ÓæEV¼ˆT)®f@]¿06Ò+fƒšh/âѺ\´’aCˆ‡# †sóä6˜ŠÀ¤L`žlâœqFA æTªdhzˆ>‚’9ª9#™¥ÏÂ%S¼°$µZÕ¹À§\&‰³}C`®Ò5â.éáÆ¦a1,LÑü¬4 rª½ááÑe‡OQÓÏÞÄ*©J‹ZG’Ùè;u¢äs5Ð{)ṽ$Œ!Α(’±‚XÉ÷±ù55™PCQp© +çÊuãU*´h6Š Ç ˜:!.°:‡´¬»e„Æ´PV•1}š0¯îkøãdÌ »3irÚ^ŒQ‹cßSÞrŸ»¨:ÄDSïLm`€:„U°—9BDEE=HŸê0Ä%JSÙÐHRÂ1‰¤±A¥+ŠH”9çò„/úÒRš ÛâIHV:ä9õ·l'!äßóhx’<'ãGO•'°ÀdPXE‚,adCnêvFDª¤†LžG¥r[²Š9´%' GÉ™®ÕE@„!ÍÌ€~“¬d!€RhˆyÄ;jJó €¸>6bÃ’TB@`1—H½AÙ /”å@±{1àCF(¤b1b‘IH ‘C¤”QY%¥a9 o)ØJg8‚'ÄÈI ƒÑEˆEI÷ ½•*¨“‡fœþÀl1ABD€(€ R,‡@¤ XxK  "¢Á‡ÍšŠ݉%'2á@bŠ%ÃDï×#V}´3ð^¦¼¼ìS Œ”)d¨¢ŒýOÄü~ÈGJÀÒqXDUEáþÆ` QŠDAÿpµ>»Ì†@09«Ñ UذÍ4HmËÓȬ͚CVaO)Ãé3K1Ç­p„‹ tlxHD` »þ)õ:|è—C–L5Ú@S8xTS„ŸŽ¾%!õscÑ;à¦ct,æ-B±Š0ØúôZÎd¨š-«¶U{M9@R¤–5’°1†9­Yf$ï$=dš“:îR£õaÆ=*ª \¸0ŠD$ÔÚ[m­„+ÀëLŠå–0œ@ædÂ1Š +Ä @ÄòÏHjà”‡úaXo–Þ¨V=_I*‡<Ü!Ž¿Ã¸=e9cÖo[uïš’i‰¨"Q4F€f*bº6ÜHh„®I©k%I‚M²0ZÃc1†5†!‰ ‰©bBc™5˜¹`B¤Ô¬"”¥+ ÀÖ¦ Èå¨c ` fY©1+X»iXMK´†¥qĩ٩ ¶MI1„ ònÑ>Ð9ˆXEjTÔïÊɇ™Ž'‰ßõ|žp¡â´<½GѸD¹Q—Ý¡ŒP]TÅŠ–™è:4? €ÄNR%Öä~”õz É ïÝçÜ’i,ØÂh=¼ lˆ°T F!$"’@Œ"ó€óÁ¬uGѤKª·(«ªÀ!–J(˂җ!Où$±Ø2®£Ñ›6¹BõÁmˆ:ÐGéÏn„'Ám'o/&ÓIIiS^”{27žü0¢J©W/ ˜téΛU”Œl 0Cò2Ȉ M(dq9(I ™°£€Adƒ8|ÿÓP,ë e+"”L€d븵†ï ±V<â°²æ8)*6ÓX ŠÉD%‹+¶T`°\)` *‘L¶(ŒETå`(qªÈŠ"†erÚMØr&FÒ2BÊAJï{¦îì!P‚J«$.°"(à8±bÄŒ4ˈU Y˜à¿ mà¶íÌͶe£üaý“C §T³:æ.›ÕÕÒbYÕ'ɤýðuO¯ ®f |‘hÜ¢ƒà À,ÖçöÅϺ¦­Ñãr  ö¡F$†,Òª­º>G§:Üh7áp§¾Ï”L†Ó+•Z;Gðl÷è>°8áÏ`tZBPj‡—©že£¢™P 4°àé®Ì:5$/óA¨ž{9ž >=‰±hôZ[ÝË+àùd ³cèä”QÌYŽ˜~‰¼zt‰!º`î¥S! H0˜xV é$€\ ÐÀ¸bX`ÐÀ¥VOÏèÃr’1d‚L>Ý¿N Ì¢— lIù4Ÿ:}GÛ·`*v,í³ XÅ$&:0Ht×m ± ø³ãž @Iýñ÷§ïo'îbï>¦C{ù?GéŸyA\JLObÑÍr ùýÈhcCmOÉšõOO'†ñaª…sTëEŒL˜”¥¸)L@‘U£eއm3ÙÀì8r¡ã€§ÆBH„$n”ú’!ã ½ÐÈ–ñÐYñ`2¼ð'h‹‚ Á´$R$U8w(#áçÁ ŒB, ,a$qš~ a d"ÁŸt•‚ «-²(ˆHz‚FðDBkü¼dTQ 2@RMƒl*Cc !,²/£AF"Ë È„@a’•mjÉ ‰$„@ÒI!`$¨¥(Q ¦ä°ÒÈ)`T‚j©B‰BÚ˜%$É«b1v­ %Fæ3¡@2‚2˜`æÞ™UöÀ–¶Oå­a*Cz=Ãü¡û v"WÛZ ‚éH{Ð>l‹‚¨ ¢ ÐþˆâȬ>ŠO³€Çe×"9.Øà±±é =ÞБÐ亡5¢Á­ žF¾-¨xÚÒ|¾=™aÓˆeláZaÜ ™RŒ¶Œü¢r >Ö4n€ur6£NüâR ÔD3â%B¡PžKÝdÂVJºŒ7a–Š3aÓ‡2VZ£ë|žÇªp5k0Ðí c̪¨×ßh¯s£ °ø¥ F `HJp6%Á³%™(Qb2 €*Á-6Е A¸‚€«â%DVLgK2M²¨J1‚ŒX¤P‹$` ß Æ@ L@F@I„^0!âN…`3Ëž1 jZk ÕµE’ÚT+iE¥*[f l(ÈÁ$a’"…k+!YŠE‘V)!…!I†R`!0°0c+Qµ€É 0ÏÆ,0ÉiR¥Ë‰¬„¤ˆ)uç`ý`þJ?8À!õ§ŽN·÷DÆM±¨„€åU^͘±Ñ ¼mGˆ5]¦Ÿy“d¥"Yù÷Ú¢**œJŠ= Š°W¹–"¾wûÚ:³˜]»’ú¹Ä—Ç·)‰x›xçÓËlAí¤ b|”Àe°Á+wr‘ Åø íŸ]Zvâ^a™Ö\\T­PLÂÖ~9ƒ÷ë½]ÃIÇBÈ%IÉCˆ(]ö<^ÍBHN‡Xð\Ôù§§¾Z–7n£ÌòÀAñN.Hª~Ý0ôBÊ,Öèp/f¥á¤Öò;aøåŸ&C!ɲʂ3Áp ‡9œHDAé U€ª@¨ë£4î\âþ¢ÃD!™P 0_|̾”h¨Üôüëˆ3t?Û“:†öô ŒÁoLˆ nèѨéÝš&ðJqÅØ?~$d=;€æ‡™ž’À,â0 ;–;˜ a!!…¨hdRxŠoßz¢UàÁ¶ÂÔ;EÕ`kØ¢JY1+ß³NNE€ƒËZ„*m£D!z¤$ÏäOà¡™@ªàP(Š AAX¢E#(,?³ R PÑ (vãGÉK@ðCcè;½§šü‡ }äV‘©Av2:Gp‚Bƒ«UUÐ ¯ZÛeª¯hdlðD!:êêJ¾@/áîÒ÷ŒtQG9ÌšÎ8ï9Jw6Ôˆ´µ‹õú‡0É8ýjËcP„ Œ9.–OÔ)‹$‹!,ªåŒM?Ïš¸p¨hkg Áäô…(m¢É ƒ;l&ÖÂÜ¢B|~¿TMUVгiÉÖtx„…{(çÑå š„ïŠjˆÈ~¹ u HŽO¿Ñ?1‰ËFÚ ÄSΘ,ô²” PmKžÐ¶ÇÇ/H°€HHš`˜.›,GN3gï§î*8áP8KÅÓ!+ÁÄ“–O\ÄáÁ¤p‘;‘Æ]'¯„„Þºqƒ’ 8Nß4¾YGkó–cõ@Aܬfb2Î8Ãöè¦Ô$ë)Oñünož·} \Düß™LåœAhëÉó!ÍÀT1Í $¿DŠ-Æáˆœ±ø…R¬8)ÒB0õ2›ÏjÍ€- r@Ádp³Èÿ˜ÐÜ‹ˆ~40~_äVe{>p¡Õi¶¥I.³žGà èYÉm¨¡ü°ÃBmÿ³&ñÃŒÌÿ8|ñzÛ@ .¢'C2Ìf¡¤ ËÊ‘¤«š‹¨Oâ|YP$ñë)n,¿ ¢%M›ØiG“Ɇ%´Ñ“&ZЦfV}ðõDÜ ÐY$E‘Éç2ï>âd†‰CПÁûNA`¨ÁAEP‹"²#ŒSßÏ­Ø"OôBÊ  ‘bÄ`ÀR!#5õIaa“­õ%nz0•ÏÖÏâ{£Zp9;ó\àÉÏæ|ôõ^œ=å¯ü7»ÓåÝ÷?¡?ºÿ²O"?ö´TEcPB_ð…;n´HЬÏÉÇ?ð–,AŒF*1Eb,F0X¨Å"ˆŒPT „å8ï¯ùÝuý¢4ÿ‰ÎBÒä0³nÞåsYT¯efÒ±«o7£¬èª·ép¦ÎdpÚ B‡¹ù ÝwƃÁÉ/m¬e`ZÕ«ˆ9é¿5 îKƒ ª {y½Š»D´D«>(ª ‚Ë2XÀÈ•M±q–pÐÂÌË—N)/Í (’ Œž¡ñó^½k{Él&f²Šª4–>¾˜ŠH©"÷ ÔTYH¢ ‘‡û!RHÊ4D‘!³DHFLû}ºþ´“=ù€hûÃ}+X ¨Æ,@ôOÙ‡vQÀ$€é³‹0[¤?ļ5TPS¤ë¡v=#è²?ä§U„X’ìþÿåBÈ …lô÷ߎŠ£Ÿ²ÈAÎÁ2gûŠäO£düéî3í™48êT£Ôa.ahÚhg}™õïþ0ûj#t¨ Y=%sè„·ŸU”ÏH„=ð)° {B®±gŽåÄÅ'ÑEg)X©Y"È,b‹¶ƒ“# °Ì%n¡?Úò(<@Nµ²é>{ù;üiœ]ÌaS†5¦Öî¶ŸA€J±`Õ­I½‡¿+\¹ú'8(£ú»ñÎe:?˜`Nñì©¥ø­ëe¦²´…ÚT(’Ë c„f—'ErˆÄ¾Áõ¡6 ´ 5ZÂêÄéràŽP©4°É°¶XŠ,F>_×zc UúÊËA¼ 5tw$©•érk&Çò¦"am‚T(ˆ£ý×á„È¡‡Ã[ÃÈn9 ‘-c…p4AVÁäG)1ÄÁ¢›p4KÑQ!e!\UÊ$ޤEÔ&Dq¥!—*üªmmë\Óà±<€Xö[Ìd‘„ò—Krpäö3‡zðú“ Q¤ö)ݳ‡×'¡AßgÕÜ»½LˆhÑXþÂΞ?ƒO&`@à6iÚm—*TšØð0Ýú‚#!Î!PŠÇ'"á…­ {qÀ~RöÅŽdZUU½9’¤ËNàÔJMûãË Ég\RP¢ vŸé…FhXZŠQKÁU…… ûEv)o|¥$BN·‘L}ðdï!ebÓŸ³¼ÈMŸÇ’6¤+X>2Šâ1˜aXåƒjƒ[L¦9LÀÌ”jf(±c!JJy˜L³%p·2ã Ér™–9qM¥L›7riP`ˆ+¡fCa‘bI4B¸R:ŽÌc,¢ƒILlÙ·`ø@éQê&Ó(ƒ[FcDÈ–u¤¢NÂvcˆ9áà¢`rpì†*ƒc‘Bz*F´ŠÅY‹"2+Š ,UU E€°X¬EŠ)D(ˆˆ1°D`# ÄQDAË+$ÆB²1%eJÕV)bö”FL¡ë*’,EAb1Ec Š)"‘‚1QQE`¨6Õbÿ k!H)$Q‘A‘BEYdQ$E bSu³ˆtdÉÄz·g³+â4u"]WP*EÇ×íݱÿПlåb¾6F c^áÍ(šwº@:ˆõ)2aR'êkÖªª¨hn¥¤‰ õÚÑKgbDzWÄÐoÛ ´d ±`0çEG±r1ýòB@)¢‹UB|!š­·ééàÒ!ä6è¸2°H. =Ôd´Öc.Zõ— Äfªc*jRo]õ9;{œx'Æ+Õt¶f$ŠîŒkqÉüGwãu© ÐUÓ‰wGŽ|`tú>¡ÐåWé [@ê!úI×l wÓò“L­:¡såä>˜¦'ÚbNl œ¥#YAHAk`¨‚Å‘„•ŠaXFCLe+ 2,…JVlË©d˜Ž¥+Ç€®F(”J–Ù(дJXÄ+A•iNpÙ¹ÃiT«‡(÷HúœÓ„E¯|¥T2ÉR1¡â…à½Û‚ªÐ„‚$öYOJ®OdÉ?IÑKø—1ÄÈê|I-÷– °"ÈK3*)$£$¡ë`fŠT²§`YÈ4É$%4­Ut @R!ËÂgD‰þ;£Ó&fúŸ8oãÌpXZvœåéÀZ=ÜŒë¡ìá?qWñ`‡»Àé<Ä( ¶[¥±¡‡Wbß'Ž[ç”ìàz÷~ùf÷BVPý\¬g \•áÎËDßÐdÒÊÒ4+mUPõ!?éþýÈ úGÌêÓ¨Q@HÉ8õª"gPú‚  Š„€Š¦~ð¡Þ¨÷—,Oà ñpØ!¥©Ë˜.Z [P–R7HØP§³Å™[.tÓRXo@ͪ6Ây?Øå¥QH¢¤A‹‹÷‡ã%DþÔ²x‡û3ùCI̱T+%aR¤k)&ÒÉ–ŠV°âÂb ‰\¶« Š0`¤ˆ‚‹Ñ'-š€°ˆÁLdÑ‚?ÂkƧoŽÑÚbŒ"’Œ¶ZȸÌdPPUÄÖbOì† ˜Îªô“¶Ò,þé>ðç«è§%FL] sÇ(z‡õ&,‰(=¹ ]NãÁþØ14OzÙäæòpÎLfþ3$U ©b/ÒJÀR=Zõ¡k8f\3?¾üM="±U¼o/ב ‚3ÔLb+ŠÎ!ÇëlþoSc+’ {οò!ûõ°€ûûÐ;Ç\цF0ànåæàUEí vÑe–SYrhu¥Ñ}း–(¡R£Æ¨©Ë)¤\PÂ-"ØIáXà¶K%!l/$6µt“ÐíT=(0D3×a6]ü]„pé5Õä'©ˆ¸ÝUº…[GÓ¸oT*ÁáISÒwÀγLÏ)Ú.r¢‰îzuó{Èw1‹îiy²°œa$ zwL1g̳,l•Œ_Im…ë¼1Hhö̉Á‡Fó L+}Û'2£ÏïõÖ‡PÔÃ#¡3°‚µRœš£½¿«T9¦Ä`(ÖÜÇdÐ À‚²È„zöéEP&±é³!¤k~»ƒ¶°ìsËÛÆz`QÚ‹"€½¥ËräÜËõågó@Tî^º¸‰XXn¦‚¢m3ºtÃèÀé ÷Þ´ÑÔ”‚7>Ít‰î»5Öp¹TÚªs¯TÓîÜ{õÊ5ª Ç~PVŒ q”a å ¬PR,Y¢Yrã\dœ5ƒ5X´éO¸^ÓðÕ†‹+¾>ýt@°£Ñ]®Äù}¦ŽŽÈX†üÄé’A±šY‘Níƒï`Ýö'_rúlè{‡M´ …“Htaˆá ‰"úlÂ1±‡É†øÅB.‰àð, ßS²èØa4ls5 ß©|œa±à±pºk…¦àÄö“0 û°*Tú$ìÛÌ0 ̌ȋimÊWÖ‡ê1Að¼Á)Ëdªê\$RèöY>e躖^E&ÈÈ;—.˜2w“‘¹?¿üÿÈÿý?ÇùÚ#÷‡óÿš…šPÐ ÿ­‡þÿþÈ¢‡Æ mÿQ™øqB@ ô7Oýjv?·ÿ.Ä{µÇéQCÓo?b…ÌÐkçvn±Gƒ7·ã2 ÙN_¶ËÑ¥zˆSG0ʱÿê?ý@¡ÿánóœ8Û·ùdMŽ×/y$çÊiG‚Æ‘ÕTӂדý„E<±>Å=Í7ûÑtE L‰c¸¢…û‡_ñÁYî‚(¡@#·œwø9×nx?@E œ(l‚(¡¶ÝF@ÓOc‘áCCRÄ9€¡”E…Tb€‘ ²ªÀQdV #`¨0bÀŒHÄ €’ DHˆ°@„Ab*ÀA`‚„X€P ¤@HÅD"£V($dXªÀQ ¬"„DŒE‚‹X Å $@F ÀH))€ˆTª‘A‚‘(„ @`Æ*ŒF+ª°$ªE "€ €PQî¡S ¥çrå‡(Hg820ªdä[ÐyrR¢†eúùª.(¡~_š…Ÿ'… “n§Üßð (~g^­îl¡¯ ·C¨jYC;ÖfŠ(¡ @E:¢y72} Š(E¿Å{}™ÅÆç<·Á “05>59ÂàQn㨢†yý”.tì_æŸüx<4ê(¡s(Cqíî9ù?Q¦ºz;QCËéæMÇäòpn§ô¨Ñô2´ØNŠ@À¢ÁTˆ¨ÁP„€¤B €! „RX¢,A‘¤DH  *1€ A@Š!V(EU(°R* ŠÅ""Œ °Ä( b(ÅñQCŽØÙ’üÎHÉrå@E(ª¢ƒxŠX ‚(¡YÜì_¤Î.Ñ(Ž]0? &Y¨s4èvçñ¦§¢”7G2ŒtuŽ5á9 –Cãû Š({6k°Ù`ƒW?ù€çð9œÈ`=W0E LÔ!Yý\8:h|ƒèÏ=žFZ@´„UE;K›X•Õõ$Ë#%9 ¢„x¢¯ÔÜŸ4œð™Ù‚¼DQCGúã©Ë?é{†F‹-,¡hZªQîp=~=ÐE=YQC—£Ô9°…åºüæ(79”à@êër•QE áFB"ŠŽÓÆúb{›ö  IÈýÇGš)ŸÐé߃ª¢†j¸¢†7O¤út¿~hšþªÇÙ{Ãä°Ò‡ÈNGä}ú;ó×—I!a¢¢‡PE ϱò¡~Zk̽ͳØ>iƒO±8!„²\к¢‡ØüB€E>‹ì‰·Ñ™áCDKšLŽxæ~¸ý…¯¢…Œ|Ÿ"нy*³Â„8¥Rju9rûçèñÔ¥ N¤t0d{miÜ”g ¶£2PE'âþ3³¢†¶GixKb}í-—h‚(¡F >`y„¬|?(Ž( =ô8 ÝUÌ> (¢†åÁsà†¢ȤE§Üù¶¯@ûˆÝE? íØí:º§Èf~ƪ  ›–NŠQBÐüŸ²©äîx9•Õä ýÔ ~b 6⢊ÉôP$ÝQC÷(ª(@E¡ÿùŠ É2šÎ>àó`!ÞüÀ‚;ÿÿÿÿ…ÿÿÿÓû_sèí»u;p“ƒ‚º>EÓ·{Ùå=‡UNì à%ð=X`OžÎ}P_@z»·x…Óè Ö `}î¯{£¨€ Kà å@(( nî_C{ÛªJ¨ØÙ P£éϬõFƒ^ð¢€ok×½ë’ö]}½ï;6î·Û.£Ùs¬Ÿ{Þ¾ûêT©I•TP¡õ¢B‚”Š¥ðh lÀÖ€µõ¡Èúô¡J@ @GAÖµÙŸ=J>¶V†…¶hHÒ€ •Exú£Øûcº]{çAlQ@ÀÀúÔu–XjÀ €b1J FÔT¨ h£@ª„ J¢V™P¡4Ò 3SR…½Ž’ˆªP(P=àØ0½kª¡Km”ÍSLÒð=sÏ:Ç>÷w¦Ú껟C×½ç{{q÷gß(n2¶ÚÙFû‡qŸ\‡lÂbu«a“,¬ÜážÚ}ÇÍã×+Üs«[0g!"½‹Ý\@×|·«Tȃ[.Ýí7¥Ö+»W_*2ÚgµÞŽ”ºî5Uv Ð÷­âëd6VQï¾÷ } m6=u ›ÝÕ|Ï*WiçW§§·¹ U(•*„„…DˆgåjѰ-4J§X“¦Ì6Å‹iTl‚I PèЕ"$¢«£D*)‘R©P7;‘ ” ° ›MŒ•¬Ó .Á•QT %*Q@)I;*$P*F#oA½ëºw`êŠ@’JŠ©.ÀÕk"JB¥¨ UdÖ C®DŠT‚ªT©UR¨ë@(‘@RJR…AETQ+¶ª„ŠJQT$¸ +$ªÌH%R• ”D…QPD”R¨I*H)!ZÙ•DJKjHl…("R»e  ðРР( û PísIÕôS+¡@fY[g¶æ€ ¢ðCP 4­.°§£±I@i½˜tmfÛ š”÷;ÖðH6­£l–Ój÷SŠH³4{±×AÝ€u×#¶]Tš7Œ>÷ô o¯®‡šªW€ìz¡ÛZ)'G*èî-Ð¥ßxøkãâž}ïzއq³QöaxÌ'y÷x>ú{ï×ßdäú³#¶Í`mŒçiɶËmšµfòj»4–aÛ¸7m}2=tî;ƒœ†“ÝÝ­¬&«@me÷pâ–…ôÕ qîeY-Ûíƒß.öèx¾Ã¨»kd”mQ´É]öõ{7»9fÛe°DÙ’wž|­Yò:¯wu"ôP›U[-ldI¨3"Y+a¶µ@ Nï¼Þ¬ï}˜e>›š̘FØ ª‹O#‰sÙ,ÖÊ}Î6€‚Μ”vDO­Ô d6̪´‰-V´¡¦>; ž‡Aë×|Õêø*úÑöl5íÃŽû¼z €R附éÁ¾îxmïžw®÷Ÿ_}kÌà¥ÆÖY(Vϳ;›å’}ï¾õU÷5ÕÙ±LLª€ÆÚ¬B‰m˜6){xûÝAõ+ÙÐࡾî¡INûÎ|¢úùßKÞñª_¶ Àm Hi @ €@Bh‚˜B¨ô4™4iê™ $¨‰FOÕ6 2i„@”…4“(4ýM&i¨ÉˆÀ˜F“Li!ˆ$ÐS¦žÂ4)42ž)Ohe™OGµG©£Ôz!"&„©ú¦z§éÈôj FA“OŸ¿~ãì_¬`ùûúU7€Š‚b‹¼}ï1ªËªa"äpurA6³žLÐ òÂ#x­µe6G3cÐ%îm3¶Æ¿ú¢(ˆ{‚#ÿøQ…Ê©(¡ª °QøDQ•DÒ‚„„¥QJ¡UiF‘@ h (D(@JD)E ZB„i ¡ …(UZ @¤Di €J@ DJh B•X Pii@ ¨»þ?Ùÿíüûqû¿?Ýü»·‘„ÿVºP‰ÿ#>¿Ù¦YsoôœnÃmíû*¶þˆ´SÎ&ÿïñPýF«uÿ,8x`Åw† («ÔÉåVµƒÿRÄ¿/ä9.†ï åþ»Í}îåJºU0E ¤‘•\ú')[(ÿ‡ ­QÛvƒ±«Z?:á„ÍÓ¨fæ”k>5HJõÇú2Í?ÛÏŠ½8ïþúw£ ÿ_{ æH`´ d¥Š @¤±ãg&kž7«ûí*÷ö_ª~¢~ æÅÔ.’œ:§ÄÐé Å/ö¸wj~™FvÄdz[Ûö 4ta±ˆ¼¹<òga­¸ú·o%[wù|~o.ï5w:²Ü§ò„¥(JrcéBfAÝùi™N8é¿Â*,_ù¡Px¿ñûú}Ѳl}sŒ&F>*SGPÚ7Šzˆ{ôÜŒí+ü§xOçñÿAr#´@ߺÀû”ˆ7aKüQ>ãÖør QÞ?¼}ñ·pÈøeÃÌêbûÀm*8= Pl@Ž“¿tMeý˜¯Tà Œ!¾©Ž“i&´X¢!÷w”)Ó. xÍ`eô²&5úc«Þ>ð’¯ÙcÊCû=óg¥Ý´c ï€ýó®€çãë(¼ÉúW§]ž«õù}yð¾næMúp^s‘xŠIŠð\~6ä¿NØ'×—ßOy;Q“Qö´»úºBå;¥=@¯õ•ÏëOëþ4Ö(*›‚ÈŠ1™{OѺ(}·ªCF±9N§ínŠ!5îb䎦—¦ø>Ÿ˯N‘_d7Ë3ú@x‡RüHd%ÈÇÖ\B¾¨MJ˜ƒçןœùǤ½æõTBõB~âkóHãõC¨º‚óhîÅ]Í¿ã.roÅ[ÄJP÷.~ °Ú±?™ôØm­õk˜{çžrƒ4 ñÕ'ê/x±¸Ô=C¯T¾OÛâ·ñâb&?” ¼C˜3xFçŸ×¾ÃôFM¡Op¾-Î#ÁAa¤à sùPª*°>ð•@®ÿtý1Zµð<€üOdžÿìàt{Ï9àv"7 Ú‰\W֡φމ oñŒÙõ;//JÜ€­üüÓüjnŽ@þ]ÕBbkùþÿ³NÕ€•Ú£ÞÓ-ïi¨U”ÃüôÚŸƒ Q±Räv¼8€f8V8Cº™³„ØÐlQ¼ºÈãœ]‘^!a©EêÖ/š0Ðf:]žîÑa¡DÐFçþ èÖ¡ƒ²Eþ)‘!ì–Ý¿ô<òÀm(¿µE ! ‰ùjp!FÝDšØ£#,¶Ù–ÿ'•¶µ¬ß)×1ìúà±J]mUU•€®œ8„J?b®µ"^¬Ã!×¹N­†˜ê`ä×2òˆ”‡õmÌe¸¡¡UÒû&¨XΗX‡6VZ vc‚@‘„•þ†Á©h÷³SXkšÆl|ˆ ÝeŸN*&í<ÆÝgÏ­fÃR~µÞ‚mŒ^£ƒGA!ú´/0,£r @ˆ,`š:vgø_ê ëzįðêPJHk(á‡e¦i2ù‡Òfþ ã§ «l©O³?:ÐK§Ê:Þ÷÷µ¹¶>DÔ­Rˆ’·.¿ˆâ´̨îàbR_«f€‘Ú áD¶õyðêþšŸÊ Š ­ zØéóž‚_é…~bf÷wZ=bêÅ‹ ËÌP0!•e£ J¬r?­Ê²EëZQ*ýœÅ?÷!E1±øEP#ú0_2¡Èa½vEp“Z†gbîá-.]¬ U ˆ´ØýŠ+û‘ùC^»ÚÑÖ `Ìá•êÈM€Bè@Ã]m³j뙹ðõ~ÖE«?ØÝ„´ƒAWõ§r "%®Ú›Ë„&Axz9´4د´ðÏr8!Ý#´BD2ClRA;‰ºÒáÐûZ”uªX4Š~ì[x,?í¨:p]u p#T{z>Í9ΫŽAÔ5nj_S#ü¿g  bã=Q,\ÒW×ßÃøÞùDY;ÒW®X#ì\›€M‘Òè?£dòû»Øåœ;Œ2þ’'F2ªô›W ý™ :Câ0*Öq0h-&EDÔ‰4Ì ˜öt³` Ô Ó 5?…^c×Ù‘o¢yrüð.©TuØ?ÅŠX  ú‚»7νm†@³’ñb%Þ`W»ƒð„^ÃÛÄÆzpí †€z#_ì£aÅg OíªTÐÇ`ÈÍYTr¿V€.õýî0¥CŸ–«í‡§Ø·ÞÐ4 Ù BÄlRâuXìÁ@ßüôËód“zãj¾ÿÃRà)BéûOœ/XŒS´ õ„µð=8ý‰´(ÆÀŠCV 8þX|n>Çïoä§YQ‘NaÇöÿ ùÑGZ âc®Ô½¹LÝD% U¸ ãÇ^1O‰Ó_>¼³1IÑ_™òOçâ Ý¢â¤2Ï÷Wƒª)T Y?$< ö´5)¡zy}Ç1ׯ¬Ò†ò·¼Êm_—EüÇYP;–ÝEkV-ÓÛ‹§H+ͤâŸáNî[ûŽð,î˜ØÛ­¯ñðïŠËæP$M ·ÏÞNÿ5ÖÞ ØÅ‚¹ý 3o€êþ>_õžÌJÛÉà„ÛçféYí¼¼€£[¨MîðsÕuM.Ïóí“‘_á3%TI‘ 5530¥Z°*ª ˆ&‚h˜"‰ôÅ1ª‚Ššhª™¨ )ŠŠ¢ª‚bŠ5U%50£ED‘’§Äm:¡AEQQUEUFDAAMQY™IC$UU1IE0PO\1ÜÕ1IT*¦Š‹XäÌLSQDÐ,TSITÄT@ˆÄYŒ¨ƒ1 X¢ÐQ¨–Šñ†%0Mj0ª ÌŠªŒUŒQb‘Þeÿ~póëÓŸå¾3µü©µ~‡ýñõ°"•è2;ütéñ‘ñê(á° §õIË«9ÏïSÌlÒß[§Nf/–ËÚxÐk¨~!BÒ^/UNƒÉ6ñøýóÄŽ“yî•ç² * U‡Î=ì#¾¾¹¸ëÈþ0´ùÖÆúÙ4ŠHR}g³§”(ƒ z~`{àmþ7Y÷Ï­yAp0P~M¢·aþ[·ï#¨ýû¼yßÈônµkU[íêádxu%Mˆ½lÿ¥ÿ½¯Ñó©NÚŠ «Ç½}f°<~1ªÊ£?¢ÈŠ÷¦t·­þ·ÊËà=š£ä"®ö×@B~Ü;¹QJ¯ë÷Ö—ÎÅȶá‘'çñAkòt;¹â]wQï²è~Cf¾ã!þ<‘¿j¸DïKü¶SÛ¾ è¾F(ãùs8™ßŸ|sº ÇX­¿¾Þmà y€:NG]s\S µÆvOù}t>ø Ý{ý|oÿ(âñOn¦+om«Q¬u+v^Èúfz±ŒÚÂÂ{;Gëº"ÊùÛóõdióÑXej>[mñà àîz0rˆƒé\t#Btœ1®£#úê6öØhïÇ×Í=e@ô.>ô‚êÒF.%k>½Q¨©R)$ ýð™‘ô‚ÀåˆA\T7Є”ü‹ª\Z⻨«‹\*$’ˆ¯/1j(yZsåZ\~‹~ Ï@Œ•§=5÷&,!^Â2 W öt_g@ú~”íéºè/ã·‡€ƒáFG^¡¹šþYQ#°W#ø%™ÃŠ 2¶,Õ{töµ\ÒhãïóZR˜WÕu€íY¤ç*¤€IzmÔ8kOaíóÓ·ëßÉ nåˆ_D–#S‡ùO{Ÿ»öôý½{_ãO”taMzËí[nP>üB"z!8Ÿ <ŠˆëË@W\ôa9ÛàW®ÜOžS#c2<Ͷ™ìd+VD¹â{µiJbÊÞâê/CZujQ¶” GYÍi­¡¨uºýW›BŸÁ¶æ´m~†pÚ\ñfàÄ»Å1*cJ÷·GÈ×Úé²­NÄw‘ÐŽUhR }£x þ={öX^mCãàsö#«|öìøó{ÍËpíå®Jwå1ÎÑnñâ9ùÂýÛ ›äƒú‘‰]Ô~·ýkÛÏØö·e qõŸ-$UWѸ¿ùÚÂj¢¹«W«³þ¦¶§éÚ+¿X«ß^>«°Æ*ë9ÇÕrw¾Ú»Zmùíװߺü²Å…ª¡êOްVWü÷£MF&†Ç–Ž%s”Á®Ì.˜PH,B)$|*Ÿª+@R\ ÀÄÀïÕS¡KLÊ÷ºøQÚã{Üb¤QÎ$ÎåEˆYTÜ…"äRÝÜ!¨ŸtY½ó­o¦ù?vÇhóÝ%ÃQÙa×¾ªÐÚxƒÞýÿÆ óâŠ'pNs]Ž1MÜ®,"¿†åùGXù;ÏÅÔƒ´Y¥Ñ9)&]A$ï+rH¡+H‰¬º:rQ¡U•0P,ÒÀ&çm–¤d¥Lž÷ËB½Í@ü}Óh°8ɧGÝzÌâ :Kü_ÏÓd*J!ãÞw›öé f5'F©ûëûóC×þñ;ŠÊ€4Ü Œ.C òæâ„Kª(Ü% IƒNª•"„_ÊÝÃzw5Å™E–‡$$†§šŠÙÈBÑéiïHaPÁ4äÏöœOE[mºþ-OÁf­uÛlaÞµÿ¡¡©±ôü/ƒÍÓ#K÷§ÝÏ çw+Xû¥Ñq wZ"h’ÙÔ˜N)fràfÉDo ¼ÿÄJÔ ‘ESf"¦`ØÇ#¯^è´ÖÔ:ïÿQÿ¹Oÿ ¯ïý ÈOqÏõü{~¬**ËúìÝ¡ßù¿ooñû¿µHÜ0ýöÛõù¯ËJ/£Ó³(庪 .ä6ÿUÍç{ Ðû*‹¸reÝ«Êþ%Xö׎9d§_ PóŸÈaE O–Nïú{®Ú,>Ÿ§O®Óý;Åoéºqõ凓DôßÞ|µ>T^&µŸæ1ølýºî·ßæ¨ód5zþ&ÕŽœÖ¡yÃP°@ý´ò0ŠïEönÌ ¢¡ L™dý7HQweÅíAfNì#Vgˆä<[)nPjŠ®‚¶y "å2[M`G·™Í{þ=½ýø TöÂ0³÷÷Ynömâ¢à†a½C&))ƒçSQȵêá6F¹ºÑa¯¥GL?¿=>Ëx_‚S¦`Xa£iPäD‘¶à3ˆû–Tv¶«Ráde Ú•°²£Ñ!ô‹/§.ïÿiMÁ©œÌÐËp$W-Îg!”‡íhá:àFEGD¯¼ï^zï@›ç]ïÝGÏ~}¾Þ†Û,vÒ²…ÏùÝvd¦xucgöpû~ékÙ‡vz2zWÖ³½íqQ 3éwš ŸžûôÖ½]¾ú¯è¹æ“ï Ê;S Vyõy0š—d?UÁHõ›áí†Z.Þ僑]êÎëÿi¾¯Fª¦%aBÇ-…ÏY\Åf…qK;Þ±Rª\Îëý>°–¯U¤ q8 ¨×è¯méþ­ZZ¶éu¹{¯jÔ¿EàoV®óNd4f Vio]¹ÓȦÓãªÈ|Rþþ)¤øýmMWàß!AßÕ2?™r¬;õŸÍÿ­þÁH…âæÿŽó¸“ÿ×·â‚}l¿Ù—¦ õÞ×­ÿ‰2¯3hʪŠöÄÇ颫÷8µZ¶n¢Õ6r¦ZЪ¢³ý7þÚ½ Òé.œÄI!LMÚÇþv5.­%X€çÍýxAš±‡ãÑøŽ äme`uVJ ©è?q1ä¶…Úì~zphã7|V8¡©¼Þ:¢Se­•Â…½[êq¿LíÒßôkòFQíƒ?æÏwW£¹â¡¹SëÆé´cø=i¡wí×4kmרɼ^¿ŠqóWHµVŽÜ+ž²ä‡_=Uç_Ä=:mwµ²Ó¯r×{XtÃ\ßu¹þn­4fºÇœ|´0ÒÚŽ˜·ž-YŠt²úµ-¨"«ýŒoѾ)Zž¦sÄíAZqTPï^" Ú½m¹bmžYž•Ì:™áÅaž•"Dvm±åmµëa8QÂó@æïk$id†“¿Üpæ[¡3w‚o4½ùí`¢¢£Å“ãZ£“Á±Ó_Ä ——n_ñÚ¶{«³d-Ø©¤Íj§l8cN<5T-ËYSN_%ÄZ¤À ®('zˆyá´3-T¸ònIeÂÐãjŠÝw–Ö!A»Òý£kÒзbusU•Rò?ƒ²cšÍ¨Ú-©´ÏžÇ¡’x§¢µ3927¦þªØ6ãQ;Pc;0Í«. æÌ z?ÓtÖRÖv[d~óÍn{… gùt¸yèçµ£V;³}ùªÕf¿žÀÛÅ÷è¶|¤|‹7B…b2ñ Ùó¬KSÁÄoÉÅVì5JÍÛ£ ´ûòö~©Ïö\P‹a¶º¾ó/HÇYèq…L5Xz¸¶lï€8›]moV­Ôb¤Xä†k祓¤þ¸Øü½9í°ÆÛ¾xoƒÓú¯_KΨ½+HöñX]ÿ#Ì>»Pm3ÓP´E”¸¤n&ɽ–T,žVýé¥Ïj¦"høB=èµOÄ*!¯ßW¼¶ôßÛŒWCn,Ê£Ö„¾¶apE+iàp8›Å,þÆæËõª0ÈÏÔï¯l²vq´/pY­³wõÞ“3f"Öë]N‡K´Ð×·ÞpjGvz´²·ô(ßµ›4b—œNÎ2O ók« Ó\3RF´¯hÕ™àc±ëùëz}þ—çû-…ú oäu ~¸¯ÉQæ? E~ã<ÛÇj~WÝ(oG×ð4wÉm¡EE–_ɇøX³N? ñôÈwV·AåT?×ë݇ä°úæ¼úÏàiJôöoñ¾Z‚„ª¢€ADD ݆ýg t {*+Z¨Ø!N±ÓO×à ‘H$°qÐ[×\‹‘ž]«E ”DA¶,,Vß™ö\c¢Ï±.ð»0®#uÛ a‡Œn4ŸÒ|Th¡ ²¨¨GR¤y¿O'a”ÿwÿúª¿¯_Ïœ&ÀŽBùí£–üÚÁ!ÿ<·Ÿn´ñŸ¥®ÛÔ~¨‚è–¹?Jxîøk°KYÿ‘=ý7Õ¼ëý«a}áßVcDH N>¢ã{ã…ì8‹î7?·#Xë8=*¾|øõZ}öâB¬ÿÛŸåׯl,ˆ8ÇNß?Ï_ïã({ü]0<ý­½ l¨iMý(°~Ô'§ü>à@þ©‹Ÿ…zw>PnˆJAR }E=¼þ;YÖ¹%[Þ\)D€El¬QÕ>tílúñkOQ]…ê§ s¬>·jÑp¿’ b×{Š{ŠÂWKÐ0S Ž~üõµf¼wî*à ¬Q§~³¸ó?bo¦¢©í¹~[mçÜsì¸í=›¦îƒàiƒ5ª’O/‡ ®î"ÜoÊwxßœbû5õ"vÇäŠVœu¯Û^ª~µV.½:–øÃòž5ÛÒo#µ¤Fþá™›­@ÞJxÊ…U GÏO\b³ã¶¦ßãá¾é^_¼ÝÏ®¸mü¸! ´´Ç¸Ÿ£þ=¿“N=|'ßÒ ¯oîŠÄ +ý2£TªZßóÑ8ê&Õ­<¥t†®µ©«|`§xþß’¾Üzu_¯€ÏO_~,žß€=>»ì‚¡µí²Ÿ“ ¬8ñÔ{s!ˆ·´mQÊ$„6ÈURz¡ÿØ…=ÊŸ´û<{Ô¬•; Ô<ÍÁ"o_×ö½œtnªïîAØ0~àùÛùÈÇí»‹µ~ì5ÓI€Ô!‚]†¼ÿ š qÉ; nûD wž÷y×nŽGõzúëú÷}û+sµ7å¹ðKéƒèjÀÔy¿TF¾w@<ÍúÓ¤Çs¥Vde´*R˜4Ô~‚+à~‡éžì6*¢ÀZFÝ!1‡÷݃n -¡£¬zýŒ¨èyÞÝÅrÈW»Ø×–кf·« §¶P"=,D¢;À~5Q!kÇN‡Vws•@å… T”HÄÝ» ÑçÎݾøAÇŽ´þ¯{óbÓ]k÷ÀïÏãàX’@Eÿ² Hl áE{Ÿ[Î{úâþØ”÷µÇb+Ì!¯îv“–€â}éñìo·nm†SkMá”(x¼æ*«‚/;©i·ù‡gbˆ¨ùͧ5ÜáÖkTV6øŒ?–ÑÑÊ®q§ÅÀµCÀy (àËéÃųv…q‡M0S“šó ¨b£GœrÈöŠEV©M˜¼‹N„•ß7‚Ydõ ¶ÎPßÖ=""aöàGc#`Q| ç7Iý#ŠžÃ xëZ™AÏjÚ$j‹¶ŸÈª×Ù»>¨ðH(·#ާËE}àïå“ cnþ/ô®÷ȯŸè¢rùªãϬüö-ï¿!(ÜìÁ‚ûPH4Šò´X·l~§þퟟɼÞtBgUù{ö¨ =dqñèi_Ÿ@tþ)ëKÓ¯ÖG¹cÜi@ۥĪŽü `¾Þäx*` ú!=¬=T‡ôv÷~þÅ·ÇŸOgŸO{¯f¢õO¯Žòç~pøÇuÙ·æö·AÞÝ}öûøÍ#7å¼yÀöqôFýTl|DˆµéN™³,«5èz3ºÓ»YÀÉ¿úô‚}êÛ$Ó«ŽÛlÚ/öïDÍ(î]\”’©$•e÷ªÔ ÿ7÷{ …iT̪œ†Š ›¹TD &¡‚ª|«—«[·?_Áãu ¬Ä*Ö¤U:• _™@Hd›' ÿ{ÿ\ø<ôÎTzî³îRFtUOP\7‚ ƒþt£iD£FZÂC×é¤uû¼çíßit…£ÒzM3í$ɯÅb¤T¯udîaÃÞ¨2T‰(›0PÖì1‹OEĨƒßó_e‡µDð°Ð'U¸Àg.£TéÛôq!-”&]¶ž¨áæºÇ`ã D;®Ó¤pøÅb¼à“;aC° f«Þ–{®ª”çñDÉil€#Ç|Z~éíáDßà€=Áð:fß#C¥6£P,ÛýùÚdvù8é֜dzÝohÚíô\vÏÇ?î7ÇÂøo|÷ìŸ?+ÖȤäý¸”‰ô¡¾X•?·ØÙÀˆÿe.¯l_1çì=ɘà¼FåŸâõkM.Òîá‹RC2©muàuŒVÂ.«er¡£öR»ƒ8·F¦ñÓÛjt"—O‚ƒØdoïxoný‘Dì„?C}ˆƒ:ðÙwžcÇ S… Ò†®Ÿ>è|¿r¨dt”2ö³X+ýKë ž P ‰¨´üƾëSçT|x§0ó7›”1ƒœ‹ÞYH‡õðÛ__Óç^gÃJoCç@"Ÿ³f*ݾBþw òçãÎè:P€Ÿ Ü]Wvè‚ûý°@¤pðÀ-éÜM€nFÒ+@/÷íÌÕ­×óãµ?ùy_æ;ÒÝv4¾<üøÒ³ïûôÌ·OØéd¾A_ÛwóüÔõ_ÅÙ)‘Ó–o ·?X8®Å,pà î|Wù« ¯#ó´<ÔkÐǰ.ìÜ;Â3±%ÄË ˆ õ¬ñ þÆ´.™Of¥…3TÞ›”D]‰«Þ¡c‡â¯|:A! ¢CŽú÷ñ>{„š8¿Æ•w÷ô/Ióp{?âm9¿ÛjôÊClûS龦½)Èù÷-û÷ûVzü2ÈTóºýöðÛWÏz|+ýçïÞÁ©×ˆöídQ»ÔX 'šÛª"ŠõëVD!Uj®4¿CtJ7DÜn¸oL-#Ð¥HÊ=¶Ç…'øãAtâßİŒ Ò½—rB–²ß‡‰«=¿Žq)⾸ºŒ†wúÜHV_½"r ¾×ÛeýåmûWÌù޾R|ëõ^žÒÃDCËŸ‚½ó¥a2Y—+4ÜM:¥Êå@hX5ú 5†±àâñHÂê߬É=>;qNüWál7ÁÈp)j7´|rÀ[ß4tG• 5ú–7·Wö¨ÈÐR q Ë+²¤ø€Î?Kìý”W—£Š"&(Š)å†'Áç×þ@ž47çímû­ÿ_Ú·^?·ð€Ô„÷‚}é¶ØI*jHš ˜ng¾Ž<~þ¾N9*} ãöþÿáûõG_Ú}¹t$…%#ærOh?HÔ4Pj2E¤É$ª(hh\ÈBÌFÌô“!h59P´ H¥-PPP”4­;ÃR)@!TÒ…E"ä«fF@ädøíŸ3óö'¯á†¿`{误éäÕ‡¯kêXF}Íg²ŒtT(GR‹ö£î›(ÿ½ÈÏXf–Π=¡è¡¡×í\¥~í ?=—íÔ p´G:¾‹®EZ£Ú«ªÒß^Dó¬³cÈC™Ùõƒe×°a†f…Pñúåí¿ó²ßmè 6\P¡‹Oa¡@I&ôaaÝNýÖt×7~ÀÈÕ×xè}/PA‘ºÏK7oµzO±ý²rØ?´¦n¹y¥§ûÍ:Ìæ=‚9on‰ft·Fü홑üh;ˆS§yXê;qR¸¯ íjtÛÅ_ŠZ®Î1žƒ¿nœSt#Xlµø6ºH7Ãcj$r³ªð‰p ´.M+Iúñè]îH±døV¸‘"i¬çKÂ1âÓ`…@!‰–í º+Õ{•)ÏÂÖ‚£Ë[Ã)X6ãÅ×,ûXY|ÖQË"úGF ;´+‡ËXàR“ZÆ‘Þ& UB{yO¢ àƒîžOÝCåEÍ[çOÀþB=ÂIADÙ˜§;×µ>âˆeø"\ÓAù`ÆÞl¢AVã_ç$ë^ר¥0žÇd&H` ó#³¸!#z Û'¼W› ôÚ½ Åzøo—D óçŒýZòP{ÏÙ½³Ïá+Ì6¾·çQzb(júûöùó}ÿüÿ©ü…ü¢(ˆlP–(øÜ öÿ¸0wˆý7âa×ïó,h&¿Ñaq¢·aÈÞýw?ýØÒ™&–‚ƒÜŒµ/„ó H‡ý>eâËéŸÓÃßý‡=ÿçI¸?ó'ÖìO÷«ÙD©aë×ÐíâÙ|‰†hE–]©== E-g†ôÑíÛ[ ñäÕ]Ým3™Åi–Céàj¯fû—UÛ'ulîåïij‚ËÜÙš²4ác´Œ=Âìšh=œ ])Û웩•u»¡¹¨õÕv Ât6ÕáœMå.îj”Þ›–†,’i½;½FfŽp¹ÁÓVm½ÞЖÕK×»´åÖ&÷¹U72;· Ü´úÙ¼ºÉÐë5eÏ\Ñdª¾Î•ÚPá!å Õ×;u//)a¦êÝv 5Z¯/¦q^YlR{4éäàÕ´DÓ2‰¤{x+{jzû)à[—Zq[ÊÙÕ7nM¥3&³tI;S—7`–ælÝèI«Ä‘SÖlÒ:›ží+¹Ô”Œ¹nau'&«3UWBéöªÇ{Y¢Ýå\ãZ«k'0nÈ®«¤^ž`Þ™œìQ×*ì¬}ØôL<-ôòLÁϪ³ºÆr»·3uY¨§ŒáÌÛu”eèí- zJÂçV.{Šó¦ÒÖ^.Y;›ÌÖ*§›®žæÏ §¬Õ‹KËžÇ{X^öÔîT­šYÖfU.µC9]„Q쳫lÊRÖãÇKqƒÕ]}½y“šU­™Ù7Ž­Í7×wG›ìÕZûÒ0,[¢‘Ñ´-PuÂÒ崛險`ì×±7&vçdÓìž¹³Ç¦ûmÚz9÷MUƒµœŽYºÛWz›VrcjF>O®{•S¹|4Õ”ït›yt;kFTÒå9*;^-.•aëè5.kMWuÄÕíæÞEËécze#š^0]ïN›WRO]^Ô¡7xò…NÐã‚o»s³N \ëmbßûæëÝÅe õsxŒ7:v¸¹g'/s˜ã{¥ ’qM^msœX¢xåîõ06fÞ°$z½áyÆùÆÉ\»´ígNh×·b”…{+®sÔ hà‘Úk°K“Ϫ¬fÞÝÍjÙ#©”7—’6EÛžìr¸¥BtçW™bm=Ë[•OzoNX“60—7KÿZõhj»}–,=557¥[ a“¦ý§¹n]mâ;–°êÔ›ÊiÉš¬O9²8gt­)ÚºÜÝ—ÊOlðT… ÞâíW=*áV’yÔuÅñ.¶œÑº­}µuT32»«hØ´–u]è}eÈÙ™Ók6µÎh-rÍxš4˜ å:¹»á"vòŽÞ雸œ+‹ã6Èb‰™L¢ƒSÃv…-›—Õ¯X*E"hråYÞêœuN÷•Ðt‡h:ziOV±jÝÐ=''åØDº©êÜ[´¨sîÅRu¹ª©„ÕãÅ ¹Þ¥}·Ògk;tÖΉçÖÞÆ1§$n·Wœ³ÎÖöÛ{;¤UžÖ3ŠL±³%ç#ÒSìHO<ëफÜMOqì§yÌ,"UÝÞVq9WprÎcyXì-¶s¢uT–³8N¹›G:oŠÕ}"X³{tzéÌîbÞÍ Ý*wnê¸%F×nkÚZé +îaš¢pmC’SF‚z¸McέÔǘ8òгI±{¬óæ ªAïz²¥Œ™Î-níVÞ«B·sHæubÚViî u¼‚Ó”z'·¬§Û¸kG`ŽxFñ û+›¬3T§Sé$Ùªñ•›Wi`±tXÛÎ[¯^q¹t+'M1¦KvžwVËú³2ækw/nŽaTŠÔî·5r³=43 ­íª¹”Næj"Æ,ÔæÇUU;<e™ZC:ß3ǯ3¦o^Ý\¨‰dÆ«£›»;:59Õ·¨åërÍrÝ<üªG¯e9ßTù,½ŒhЦ³fµN¬Û7’s1åÒ¾V'V¼o*wWwu<«qª¹ÎîW:q.ëÚâµÈ{9'w$ɶ^£Aî¼Zkƒ£âœÎífe<ê ã™’ó&æ²Mås¥›¹œwƒÃ²§sœ„žË­YYF»—M‚7%ʪ›rnmò‹ÜÞÅv–H7–ú¯”ƒ®úêgž$eÑž£Ó•šÜ¥RÕóV‚ѺÏ;:w­æ¤„髬”†bËË‹½UÒiñċډۣe[{/S•Wœò¦ÉªÀ†¹¸.Vªé™ØGNRÌõûaôÙ<ï¼="÷ êÍÕ]aéΖÍÐ}Tƒ›ÚáWZÍÙ®V2¶•Í,6ò`ÁÓ¶tõ×VðÎWsbfp&©eQêVôfq6p1ƒyͼƒ6szoÉíOCйVÞ#Ô·xd·9{Yk•æåЙÃò5Ö;¦†—WTŸÉ‹«“}›Û¸y££FJ¬¬™2µflÉë6^eäÚåÒNñO¬Ó¼ К»WÊôæ7ró¤MnB½Ð†½§·lmîa»ÜºÇyjH¶w ÅW¹:úiŠc„ñ˜­&Õv†Å4tM[ØÍZ·}U‘hÙá:«»3‚9Ý·WKÕo.çb¹šËÁsiišœµnCá³·³YX‹Û¦ñöedžî²´tÝöWk­å5ƒ.dÖÏ+ã'¤e³{»JÙ×ÁSÕL§¸qv0P¾É͆…}\¦ÔƒÉÐÚÞªšëÚ±XÙºÔ»;*fK òGLБ“WÚ\ÐjvDí¬*ëªÆÚ tæ —¼úë†V[¼$©—œíêÖŽ\¼ç=Zg©ofÌýw—IX.w2ÆfØá„[ëÃYáÔí z&4@¢# âCY»N™ÆkºÈb3Æ™ghnßâÚ§}¶tÊýu‚ÞS™å>HÒ€ðߪ§‰gŒ†¶Øæ!A‘†¶öÀšAÚ«j¨š ááÌÞSÑu„¬Ä—­Üž"…I"žú£©*eZ“Ž)Þb1›µÆ4תAëìQ,Ì ë`X,ÚEHˆTrÆ L²£tN·OÐþÆÝÑ€¥lÐR'%!!A°ˆ— Kýôec0(ÙP\BÔÔ.ôå4v]ëëg)·£ˆ¥6좵ÿ.°ÇM^±·½\½®d!!ùI:, «A T’¾ÝȼÊÂÛoü(ï;’Ú”æX]ÑÿcÞiÝË‚Yêu>uc%·wÿ–gƼjÿ ЃRÖÿ×ÕÑnÀ’4D4(´ëé/ö†A´˜ÿŒ£€¬´¤ªýÅ´ µô¢Y!”#TZlº¿áŠ#jʉ$é¾?í-£Uí?Œï°á‚Ÿ†èmy–îf þS4knIG_˜Ù21EÈîOúìWü‰“óÛP@W²»¸(„‚G==*° e×°ÀUU;Zœç››Qt•¨R¬Œ{´_Æ÷¡ÿ*ý¬6Wîôáq†ÅÛ`BË,!I"¿)Ó•ü]Ï­˜ãÓ–Î&L­sø××l_è“H‹#÷æa­éµgLi놘Î×ñÖ)ó–<§XÛø3ÂâC›æwºúÑíªtÜTø×eQr¦^ ¥ƒøœ õþ¼Ø ‚F¼hÑ}&ºn¿ã#¤x’L¢i«_FeÙ[ƒö¤æ*4ò‚dÛpó1ÕD ö†yZ÷ï^vSï÷ÞÍÛëƒ3¿ÏXýåXÉ¢5¶îˆ¦ „Ý*¥ê·Až“}­%×óÝÒç)—tÌfYøKo™bÕ[M6ÈÒ?-UXŒx1ÃoI®¨máhqÚ:_¯·š9…Z·¶‰––щÒ=_ÇŸé½¢O|*¬_|Ö½ÙûÓ™y¼×ïTÁßõ¥âºÒ ä¡,¡•6tÌ*:Æ´Íڈęc¹AŽ©â`ÄÑô†C@ÿâ¥ûôdÓ5@“É$<#ÄÃñÒÝÊ&• 6h2m^ì'[?Ä„ yËû£‰8E3ã óѬtÿMíÛ].#¨kN§›ERÏû½T±§e l«„B¬®˜4‹0A#‚ŒzžÚêØ!Š !JÕQ¸TÁ}´Á"Šz-y®î.TŽ$V?ήSIøAg©~Z¡¿zÒc*ºqxùÉ´àØÛËêhTëaÖ¹¼¥¡¢`˜é."Jª‘(_ÞôhýTül×ë^t<› % ¦xɬ¶%{ï[×'ݤ×Õ퇟Œ2v†òøÕ!ήLnœAQ¢BÁ¤ã)« A«R"ÉhCú‘«!Ñ€?’`¹‘(~:ém ÄÛtC £Ód’§ ™ophÀIš7eÃrÄÞÊ\¹Kj[ާ­üg™¤ dWy­°¬½°©·nM‡ÛPæ\ÁÔ?. ¡4¿xiêÓFð¹Ð.c*ÒÐh%c…r0•Zà̵DhÜšÃFmë8ŽfmÕµ*&ËŠ!ŽôR•le«*˜–ï,~ÔÄ\yd„V¡¿¯÷Í`”•2Éñô 1Ú¡^ûúɳºo å5ÄÅJû«¸ã½R¥~[»¡Žõ!ÓÓ5Õz^˜ÌÎYt}]ãJÓXÔó3ïy³EZËBͼuª,”Q½vÌÖarõ¬XŒ ¤ijø©Ü¥Gd˜1]ŸÆ¬J?—_­3í1ï.µqˆ¤iŽ`ïTÇå0wÅÝÑAm¹…3ñ…Ó øËYÛÃWðâ³wHá—³ ~¨—Y.õ¥„c'ÉwïziN¨!æ{Ü[«zþëN¶b­>u[Ukcõh«f›Cé¹ø¸™lc÷û0âi>Ðï Õ¡mm_Îïšîõµ’Ò$n9áPt)xâ®ÆýW©€D” ÓX^PEYwVr´UåG;з´Óý¡©‡tÈ(š4|mn÷wëTID1ÏGtó5¢m©¿þ¼‘Ú™éFÓµŠÝÙ Ál¡¹^g–±F; £÷mYi>¾{óX¸˜8®yš5ª rëFš"}eÊmñƒ¢Ã—Xoú¶–ßÝ5–Ô•n-B”¹ 5HÆméšÕX}FÒ"77¬FæQ[~½Àò|øýTÄ‚¡)QIÍ1¬¢¾5«°´¾ŸšÄðº1_N‹פu)_)Cî´Ó‡  Ì $ñÄf¹¹U ¥_mSRËônj9GCø¸+•, 8ÂØ¦è ]) ç ‰Ô…©íº±bÒQ÷æN£ÓWwü~n·Dµû||×iÆ´3ÉŸz†øÛ¨ËÞd5ý·†¥ÓŽßÚlíÛ ´«ùë4ÝfVZRˆ¬´Ïª-f’ÚDÐÚ*Ze¿TÑKsYѪºÅ0úM裲,Eu˜~„ç a¢0úóó¾f1P¨ïSûÉj¶Y³Å`~ç0GUd ã Ô±vÏ2œw€¬c~°û5v.ÉÓú#©w¿½̉°T÷A6¯º ˜.ꉰ†Ñ¸!6B¡¸¯êÒ–"5¸çò–¯$E«MD‡pâÀKP(V ©/ÇòXŽAuBƒÌEÒ¢|PD<S?\* ñ rUŽð?tYª½J`‹°äaXÄEA ‰ÌDÜ}Ä;жyÙAøÙT=&‚…SÞÔ©¡H¹ùŸc¯žOðFiöö> %|"¬À >Ñê¨zR„Þ.ÜB‰À5óÎöb”‚×À¡p®‹±ÇIAøÝ([LÛ£ˆò`&È»Y5€K¡ÂER‘vt{CÀ)£ í,Dr@ $^Å{Q± S«ç ˜Þ`¯p­»·Å›žÓ¼÷½%è>“´\ ýøÈ„ Q¼_BX!àŠ â h‰J®þ{‡È¡ÏÉH^÷À|ó6“Obic’3t ²d÷}á î3ß™›»€Ô@š "eC< ­ªƒ1lp)—Â.b9ßRBÿ€8บ¢^Êb‚05¨H¨4…@ǾbñR}Š´aµMüC9޾?ØÅ÷x1–zÝ42Õ 0DÈC€Áta5sy‘ü¥Ao‹ Ÿ‡zþx]MlýY¤^¶=„µrú?lŸ‘M俚éù Pß·Ú^úÖÒÃÀQ%¥ˆ~g˜›)Iš4L ™ ðÞÆ0L¯_)rˆ+ý¬ŠíNÎk€”vÿ:¾“|ý™¾gLŒ2ãðq•£Ò§•Gÿ‰Gå>ü|~ïÞy-öüWÑóŽpa6:«·×È\ñ šßs`(ÿõ˜u4ÅR®ët<½r‚¬ltÓº@‘jô¶4k“nëâo÷Îij=–jNj|òOX(mœCÍËžlã<6žmpÐðÐg(uŠ »eOŸ‡yà™Éc" ÅjÊOÕ=¡oƒs¦þôPpùJê·ª3ؕԾ̆÷ã`Ñs[&³u˧^Þ ¸‡{癸}Åݳ¹æÊ£šáÍ™‡ážìQül^2M裀PY[ƒ:i S¨]d ‰®·ßã&øÛÁ¬ kHÆ^Å·óÙ#¹‰¿Uˆì<â&ïiî<È;{IáËf$>Rè*6È0¢9̸iIÅ" ÖÙ@,ý!N² iWæJ ÝD¿0 ¦”(Ïu£ÐRÁ]&vw7Qªc pB’`=1¡œTƒì”I¸,]רv-cm˜ÚÏà Üªç(‰ÍWôDšVª‰ ýkÈs3áÍSù¸ŸgØ_9ÐXU¯ï¿H†}ƒ"“zc½:Iœ=6QNx¯w °­ìÀ¶PU@z®V€ ¤—« ßN¡zѯ…°¢†Åx[³¸`M{5VûÞ¼„µ(X*¨qE ‚µZö…ÐçóC\ËT?°×óìm1æbÎo½øõÞœ›àÑ(”og8á N:…¹¬o~¼z2p6˜„ 8’‰VÝÛg«¨Ècݽ[æ>ñK­ºæ<†8Æ,ëz0ûä=ÔO3ßeo¶Õ}ÈüD qD™ÅIÜQx‡ä¿ $Ñk •x%ë„•@Ί@/âaöqPɺ۱iüäû×£Žý5$ ÍyjwWŒÒmÓ4üåÍÎÑH³ò]¦ñ‘JR3ɶثX…Íabôf þ -ºsö'‡Žþ[<¥8¯4ø! ‡Ÿâ1†NÖ¾ù‹¦…÷«ÔXd$? mÒ¾¼•Ôê=NñÖÆ·„Vs7¥á&ˆÛº¬"¨Ž3$a@á©\u¤KCh*6ô•ãÖ=8ÄP¤ÅÅL˜¶ö,Mc’äÍ$ïh¦É:pöÄk¢JôÙšqž¹N§Û×S™4tÃk ÔºÉÊ·§¤£:§ ("vÅÚÄb¢’A4‹¹m»” 1p°š'= h!I$FïIðáޚݙdùȹ|M$IFx¦rpãg­ ExÙö7“1‡/M Eh¹AÉ5;—9×Úȵ©×VÓ';”A9oWùÛ$Íœß1Žì:2÷Ži÷òrí,ˆxôˆ Ïg_‚8DÔ4|‡¢*ÉÝ`¿`ƱPÖ)íÜo2]â,>+”¹J„ɼ·oÍiŒ»¾ÍXFNÚÔ¶Ðwn…ÖF‘U$4‰ï$l.ëŠJ‹ŽA8¢ÈÓI6EÓ€çgæ}ß¶ÈË«EcöÙ3‚…ž™•oÛ™bj¨PQ¹›¸%+"÷ôÝlïôü^\a~Ž84’C?zÍ2/ɘ NP%‘ÙSNQ§?⺄ ŸÔoûÑóôp»nrõä×UR;¶[Ö;Lôþ•²"VF Ž& ÒK‡û¹^žu㲤Ö^Í‚:¹9—ˆë!º¾ ¼šå”å{פ8œKÕ6A«\…aþ^#â.ö&0š_a*M[}gÛ)`·Ž¢dœsó×V•mj -–ÞÅÙkqKBÕžy#uÌYã$æ])-Ëív§†ûM­´>=>Ò¨š]~ŸfϰwzšÉ™ºº {}¨iS½SœÊ«<\œciñuÓ}FÖu1}#¹³Y4jI»Xz•5ÅQÉ#K—;ÛšXÝPµ¨!org:FvLºÀÿˆ€(ewú#ûWôí?½.Góp¹Ÿâ-3§g„èØ8#l % – ŶHÄËZÁÅD5Ù¯Î#E1GE—þ³KRBßµ F Uñ—½gù}%âËwÔY{%(Qþ…3^ƒ*Y¸R`Q_kªN¯§q!‹l«ÆïïñûìÞ^ ̾"ß`^æ4ÉØ‘ùðŸH V6ȇq”ü[‚G5 œá¶¤h› ™ÊÇ÷ÓHšU^ì\CÓ=±5?â«jjŽ ¡;Ô+¼PX§F‡ØôЋÅ(±Upó~°Ì"†¨S~)I…è¬÷[á6®©JÕ»9”±ð­ì*o{„A˜àfEsJåÍt1((µjµAb· †š°½^Lž¬%÷µ·€€5mMñ`jʽ1Z-L€V>5#}"â” ¨–e¼ –Òê—eü ô/·ó~öåáqDq°4]ë@Ç/²šÕ&‡fÅ‚–б…+Yš^ù"‹ãK´+\ŒÛ‹°•€G €p&(z4WŒïq˜‚5š‡¶&ï{M¥*â®r¨ÕT¥ Ö›Y÷v‚ã Ç%ÚÌØ Üs{ÞŽ+uÛzb°ôcy¥‡5ÕYƒMîºf½hë)ºÜgf¦ôJ¶·­3ÇŒm[ÙÔ»m—¾ó û×9£µ[/ÃV@€x0,x{ö Þv]™´»”µQÐ"'Ï,ô°sµw—¨Í÷¤‹ä)+€´ª¶\9ø1ŠTçç<¾/׈¸ôk2 _‘4‰?Á³Ô.j”WÙòÃR75¡}äFÑÓzö®+«×Rus'P¦Ä§5 1•Ù“œÍfhníaÂËVpRõÂ7"ò;‘˜¤³q¨Èc@›3ósѵzòDX W7Ü)^WŠÖ«g {;<^ˆîµEíQšÃl$[žÃjêPì%ß‘œåædT²ðÐÔ+­-A´Ê +3·7ؽê™rk…!Kù˜˜™Pib^Lv+¯B#ÖdÓdÌÚÈ&逞¯­Ÿ8v ´ŠÈ’9Ww‚×y²!Þ;-6"W5¨’0ÒÌÆ7ÀqbÏVQZEl³J ØfÕÞ™Àk=Y·ÔS1VêÌ÷ÙEâZsÀ íOI@ß,”átÚîu©ò£8z³Ö¶A1ZS!s³E(:H‘Ë•dVWÅNÊŒ¦Y_¾&^¼VƒŠèPg‰¤Ü…e”Üî8˜øy-†d_ÓbõA5ãRA sz7A6¹q}*0ÌDk©j‘»g2› mçU ‰˜‹¨€Ü¢U²‘¥ÆÕhLM)èQØUU¨Õw°²7'i¦ë{¨”ÞQó@qìè?˜EëmgíŠýcvî¨{K?‘‹¿1G|šÖê3V‘VŒ"¯ªfTwH­©i.¢6´†%%à/¸i Æ)oûMŸ4GùÍ»½S¿Ù÷—Ã6-®z³êûbåk±Zì1L¸U8ÆYNC3Z´hª‹¥\^^m9Ͳ«+zåá‰É#jH…xYv‡ë¨;KõÝó‡ácf†Í%ê‹1q6ŠœR¬O ÍoWýrå­L—Ànqë?›Š°‘¥½ECܽ|,˵ =(7pû3æ I±¦Ûã®í÷C ‡NFTÿŒ¬—ñµªç˜&ãûC•ý}·òd ’0GòmãWügúïý`Jƒý»8íOçógë4HØçþø/>(|…’œ‘r —uHžï!6#e»!î¸(+8ƒ‹A«°• EþCª£÷«S*€§øámbª<Á¬u=YSwP ±§öQJ) ”èn%Q8ü\^Ï…JÙo Þ“ûr$á–HàO*ófwX:ª üí!áx S‹˜‡;«º…Ó%[¶U@¾@¥Ã1!J‘&'1¦h.:K štQL*I>Ã1Ný¿—onóß<þxÕõÚ÷ªz‚îÊ^VÙ9Bµ©{´*#ýƒ¢‘UI)È "j±žêEŽzwa1Fº*FVH³ôZ"è•ÝÞMëï(þýv?yšÞÝd?ál?*0V€ [X³<²“Ó`üH…-á^Ü0Å7kåQ+³aÁ+j°*‘r•<-(ýÕEòî=E¡4Ê8éIJÈ“±b#_ÝfçÓt¯l/U`um5.[¦UÌQBö‡#ð6Ó§¬ÑÝp@$Y¬Ñ‚B2¸1Í®ÿ¦òOâÓ¦_ö°í˜ükå-C4køÖÓ¥7Ô†d2È,M`4t[ö^gu!qÎ\-‚C‘ÐÉ}@ˆˆ#©Œ°cWaQ"Z7›ÐrÞ¥ìCý!—ûòJ¼ÐPžj=ÝÿOzé}OÂ!àÔƒ vë½–:š¶u¦Ä§†f^»‡™^-Ç_«Í3{‡R½2žù¤-ºÔCVôeÔ£­n¼Mï€bjX¶ @ƒ/ó¦xÝ[²Ž÷Ôi9`ú³ôËáoM»‰4þÝ1i–\-ÝI¹Z×dzÑÙÍÀ+³>[@ ùå¾’Š$ˆäò‘Pu_cÖzZ›m—€BÙÕý³š8p¸jÓÃ7+ *ô̬#û·žÛîõªîVÏîE" Ü3B¬7nÑ@òCw ª^ëAe’£+Åd­ì,Òò ‘ü@ãŽa­XCY9p̭Ĉ) Ô(c3†wZÕjyañÂ\—Ç¿.–ýA:øûN&nÅšÕŠDßmù¼YíKé€ A7 Ìxá@ìEÇ+ÛXhßßxy‹·ùü>þùÚ¸‘zÀЬҠÀñ_\ˆ–©ÛCR+t\¨eXU·ÍK¾u]”C48pá½¼;]HöRÕ·$uT±Å¨Êü¾ü%/TSŒ+¬x¥(´:gD™ÞkV‰q,!‚Ž PÖT²°|{GÄ "0¬À€@ûp>úU<2%ÇJ* åFÐÎ#ã­†6t_¯’¥QÞsS¨½AÁ¾0–t}îfûUÚòÃcA^‚é`Ý–ÅÅ„ Iã³|ò´ú¥¬=Èæƒ·K´p„M„éGHì›e݈WTêïÑ‚FY#ˆÛkÐ/PP‡ ñáP;ùZ$Õi³µ#»²l4Çkâ‹ »SØ û€·uºJ¾ûìªÂúmueh&æ ´0t˲¢,ÞÃÿTD@ˆ¨‡ø?å ÿG>W˜wyGrŠŸ¦ýý Á.P~ÿ+ý²u aa‡àà'ÈðWýó[±F¶gý¬Ë:*¶ªø¨¯üAz‚ƒýu·ï!¨ˆ¥Hþ|é ‘åÁ¿ø®óÛ _¨íz™’–ôèôç_٢ϯíùyËûbb |dãèþ¾ù j6éîØ–LêÿüÇy¨ÿi¯¿Žç@Ÿâ c_ëþHé=0sé£?Çÿ\t%ÚýȆz:?¶O>ÏÀ¿ÿ0Fi(J”(¢$*„ßßýÿç­ÏçEÿÛþßûÿä¿õÿÏ¿Š3 ¬«gPßÿµŠÖÿÕš+Èvé÷ŸûOêkêð_òÇùßçÓ7û;hã;—µNø;Çôæü`ë¨Þùÿ_ýôG×_å{¾@„XUzˆmÁUAîš—ÿé׿]ñÉ_ú=÷èígµÛiÂhFjwRŒ“,ÌVGüÝäˆð–UÙÔ#}â¢i‹T4ÏûÌ«I`äH­*xWÂì__ÝÛùÿróƒ‚=çQ‘íÁæ>àç'áÿ'·ú}³EÊÏï¿Ó˜sä?³žrçú=+ƒP™K«$… €p/“ … ÉoZ€&‰i`ÇQFàÖø¾I³Ò9¨¨@¾—rC±j$ÞÙæb)æïÈ)ÀÞõ#Œ@"膾ڡT’?öÒN*ûŰücÁ)“ àr€Wphƒ× …ëCr e ë;f‚³u£B!cnB ‹Œ &:í:ÅŠÞ†H¹ª\7¶c5‡´ß#8ˆ¥èZ8€gcA(h˜£Ç«cy‘@ ɶ—m\Ö JÀ`B= ì졚ª!@‡¤%¬\êBTÐ s‚‚{*Îë²DÕ­nã«&«u[) 䇈öµ…ËáÛ‘dî;Ó"Ü !"¤eYo‡|¶@Èõõ]kÀ³Ø1Ð1.}A(èác‚õ†j¶EÊB0t³*Рxk¡»0XRöð‰Þ95ÛÈvCTvÀ‘fT6Œm=’8ØTËä®tKàÆ ÁÊ Ã4:h3怘C$mÎv*òñ›9ÑIÛê€LÁΠg«Tmyc±(TdXº‚7·.Ô§¡MXjø /r¨9ší‘¦C¡7ÛRÝ€A!à/ˆ}Ì`.$t5‹¯ss‘ÖR™&^)èÓBÞ»uµ¹Ð,K²,ƒbÔpk´ ¤fô„g²ÞmDìØŽDQнt%–vÀ®I6 iL€Ãpnå‹R` "‚‘+¥‘}lUuˆmê…T é×HY‹ –†Lؼœ:4Sµ¡Û Nq“°ë8gfÙgf;’ˆ0tWLà»àÀfê…˜”–¡ƒÇ  ›90§8‘cK$ò ç:RÙÖ§zÌ;Q@Û¼ €›eNŒ ­©Ó»swb—#‡í¼Ñwf¢yâLIÓ= ¨!`Õ3YbÓÀPÀÄŇY4K€RÚ°,;P‘¡Ðv4 fÀZªn¥²AXhmCEpL¦]„yÇ¢åé¼·DèÓKQXÝhwĬ‹Ü ’’¨Ù›íHßMÚ|ÑM xÄfaêHt¤[±˜C°òæâ"g¦Y1 /wj™bEšÂàVbåú{"ò³¶)eÎ3Ц„ zu“QÖ¬Okì=ˆhà©E=ª¢@YÏ®32t.‘N XâøÃa팊‘¡Ù¸o§É1 "@|<ÇR7ÌîNú»ñ‚cO‚=ã¢våËÊeç, ŒX7#F…3× ÀŠwO-Ío)(Ž@÷cB8¤‰Œ©[VÛD’e©ƒÝ½ Å ô8Ašå6œ(@”× Ñ \Sˆ]DŒÆ%YxU\N* ÌÉ!s ï†‹Ã“’geìíyÖ‚B¤ƒÁÉ’Z€ád#ˆ­¸’êåo.;yu[+¢¤(V; bâŸÀ¸"šÕŠõ³`qÍë«¡©t'.w\rêî‹HpÆ©³`:ÌëÐÞÆÑ–^‹r¢±ƒ)X¬®…pA+• Ãxåa#<Èë†k£V÷m p"—)…(\vç‹èš"Y;ìÉ]%=A#CÍ "Ï‚ë§diõVæg åY]5§eñQ[±Ä@ úQN T7z˜Ì’«¦é{œêX/Aš#IˆÚþóö¿é|õŸ»¿rïaièá˼¢Z{_žY®YÎfEöJg›Á†ç‹èÍ,)9‚Ô@„«²ø,}%nÖê“Ø:ß9à[:nîl ¤iÁ+Bºàã‘D)R  ½ë´ï³h×4²q'˜LªÙTÕ«(C©‰½¹ë‰"˜QA»ÕS¶ºÆÖÍ'Ço[bòdødÕ-¼ó¬°‡–œ¹õ{Œ ÿ лWHÉ—$vEØâ‹¨ò¼ 𨈊í1Çy,ƒÐ –[Œ[v@§C•…ÚÇ@×ewUtÊ©¸îF‡QËž j±¼¨ÆZY—ºìå Ê1­©‰=FHÇUMµ2,VEHêÎH»Ê ­›ÓÓRn@ás@[ ‰•’.aXç*ÝÍÈÕÕ!¹ÙæÂ3N™•³²Y &¸_M¬¬@–3G={­Dö7¢…¡¢g3Y…Fœ×Ï®õ‰–qRUº0`”¬õ%9„å¼Y2$.0Ö]è’¤fähLŒ¥6ošôŒBÅŒ49WCEè®w-Íö´«yz]ÏÙ#i ì±x%¡yz$¨±mÔf—W„­© »·56§D\š¬é@nß5ÃQ©³T ëN®,½B–0Š™—UWל ¢£3dm¡Ýz89]’ƒr®ÈnHÜ•Ø%‰‹Ô`©ç ’/†w°O¢ŠÖh¥k\º·Yã›áxêá[”+$7¡ ]˜/AUÒFM»jíÎÜâ::çÎ F8Z3jÅ©Ýaa”®æ`LS©öë ¢ªUÁ“‡<²³epVêÕFi!"õTòÌÜâ85iæ2Ã1hƒÃÛ£ynŽºÁ°^¹š³Ð%¬ÇÁiÓ6ÔàŠåf‹2•Ò%T瑪gãB"4:£ .•2/©‹Ó‘I-A8v ³Âvó¸yÓ@˜ºÃ3ÒÖr¡ÃŠmvíº=4L`*0Ú*@ÒgEñÃ5™Îî."qnÃ2í‘`äcÚ°Jj­ x U#Lº„ÚhçÈo2&¬QrÎÙrƒϤï@¼¹¾KBʵ(Å¥À0„£7s7‚×MHÀÄgkLÊjn³E#(U¤Yç/&·pb»5R‹ç[7K1Db©ÅÝÁ¨ìm0¤ªÓÃ+2M¬±"†”*¡PM‰qÕÚœ€¤ ç9Zç^A½;*%4Å5“\ij'íHÙeÊ­šFÞà,U±9P0xè8”ì÷m±ahàè“7SfU×H£‹ž„ÁÁÄ©ûEºÖEÉN“Ù•13w**I¡BFÔÖ¾x)_PÀÖ+A‘‹`]xnÆ8íÊåczBm;\¶QÃÀÈekjGU‰—eG.¤+zrR&à5H®ÃªãE­ÝÆŽŠ¹s16‚4ÈÍmËeäv’ “œNmï/( eÓçLn¼ƒ‡w&¡Û#ŠÙ•’9oW3 ˜SpZ@„ éqÁPí ¬°5jm‡£ysqÕµrj`)шHª ”ÍN•ÏŒ‘k…g;¬šÀõœ“ʨpÛ|k„¢VŒÒsÛQ,)€\ šPur#‘*ñÓˆXGG*òK” ÑÜh­—2qÀê²%AÐA,ìFí‰us÷¯3F¬ÜD+¤EÎL‰âÎmPU¸wcCc/ØÚì‘[+²YUœŽ2' O ö¸Sêã¦lÙ£j– `ÕcÈ'v±ÐF0r;H¯ºC"tœ¡€Ý*¹¡Hðhlpœ˜$‹¡QŠ0·¬ˆã/'ƒ® .EH±C‰Š:òų×]™–R¬‹X@2˜añ:.›Ñaëxáª%LRà«¿¡ôfÞÆõð;VýQ_ëïæ‰Èeƒù?šŒ5MÝû[§åàÕc_·Ú¡ðRh¶×ÏÐøVgòzŽyg_¦Nù¢@ݸñB«U>&C!ÍÜÇ´¸»öö€íÿ6‰üɾ¾Ú¼¸;e]u\ª1lÌ.N™ˆ`à×§@Å‹…-aR»LH9Xe1ÆŒ)?¥—-Ý­LLjŒÇDY‹B6B[E­BÛ+Ä Œ‹ø²ôÂŒP6Š-`“™‹GÌ…CýG3·Kúùú-ÿ·'¬GöÿÊÕœkûY+‰Wvj˜Íµ6Š&9—XQS**ˆÿ¶Y\Eü誈‹†Yü\ÀVËKm¶ªžeÄoò ™qï¸QKJPõƆ%B‹*¯ÿt¿>ëZÉs_VÒ¶¬òAæ úˆÅ¾ÕŸ×5Ëì·úàEî›ÅGþøôì;xøõZüWEõüçÇ[t€v)VM©þw饨‰ëì nQ'}m¬—ÿÃþ×ð•þâöoñ¿¿úÿ#üÓû{õá:šÏþ:`sãüõþ£Ú3ÿ?þ$ƒ­gMÊ5UA½hÃ&•WŒ·ûëk+©4;RhÇXv…zå·¬…`ÝwA]É4|gþ:s•åš´a£iÿ{™Rý.ôŸ£î^Šëÿ}®! Ÿöˆq†’©Ôåó?ßààÀUQ¿ùà¡®¦¬ /öÍßê¨ö–óÿ|ÝŒ1?Þ×9¦y €NÑTaCîU•hzgÆ‘ÏtȵÆš êO†‘F£¦™›çX†tº‘²¤&±Yš²µr샥ÝóE:‰Äzãsˆc°ÒTGO#flñ…Š,FHÒ$§½Roy¢¨Øµ¢¨Æ)œ4°Kh €CËÊ+ÖÈD µL(e”M„³$Õ†ïK¡“p(·»b='”hp‡¨ ] ¼–Ò VŽ7™3о¹²áPF Ïr;k…¤ß)—£ êÖGWM`¡©n‚x¹k8ë-C™dƒ£0*¤p¢t[à i†6¬ƒ.nqÆ:q²ÅÄ@iCåxêf6ŸhbÀj‹v¦HÇÏ0ÒćJH v$u‚™‹Ô¡ ´‘˜Ä˱9¥¼!¨Ã-©s}jO'Hƒ§g (¸ÈT«Ò$ÃrYü ˆP/¯ÑsÜ&”Ïo¯zºyôîæ5=Ùºbõk³9Ó³;·U«f1Î0ZZ…—#»æ)²›±v¹¦à|œ 3ªÓ´{®rUr¹×³³%;¥5Ý}# Ñ4í Ùnö³6äÎôÎÇÚjæ¤u {KáO±ºÃg1îÖv˹ڧER#NÙËܪ†ÔÌ¡¸o„©³7xëfézç•Yõ)òºšÍ”¡ŽìiŠ$óâÝkV¯®9c"Êrk»Tñ7ddô‚8¹2y)®}yO®LêÝÒ3…žžë±]Óª(ÖNž,"ªnFÅ¥Ày³³³ÏºœƒÖ Ý®ëƒ[2™®wר!S§Ž¼½Â)`³`ìôŽáZ {Нfíçp!ð3¶nèQ’¯Mtî 8ä„ Lã ]¬»™JfÉgŒ]æ´§3Ì9Ý4Î!4ÃHE‹Ó'n2ùM¤5«Û'Lí ¡£.Ýå4œWÏ,æîÛ”‚ö’¾:N!+&3§§\¦'Nß§cÄÖPñ4ÀXõÌñ˜ï7•®­ŠNœs˜WHe²¥´/”]†¼¦îÃc¦T‡l¬"ž2¡®ìñ ¤æËE5šNëOs…¹¶%½ÁLÕ麢äDI鈚\@dÐòJ[“¹,NRsZ{T`"È‹t¦DQŽjD ꑇŽ$J8Ñ’"Š5*8ñGRvúÙä'ViAÄÌé—SZ` h2$ñŠB(‰©™0(Œ›º0Ä2!4!‘z‚¹' aŠ0ÈHŒ0Íž5¯+!!XŽ•„„ b/·¦Í:ä8%„7+i¥»¦ö™ÅÅX'ek·”VRì9•g$UåЊ á‹@ÖŒ+»‚w«ÖшצèêlºìÌ]šÌí1y*”ÐhÇ6&^ó[vwÖ£ !¾Ù°àÍ„[˜­;¹Vó*c”ëZÐÆ´®;tTã °wh™²áÎlÞùBªÞ£ÁiØcIG ‰ØUK¹˜õaæw7R÷³3 …Ö"4®Ì§°pØd(uõåUUU Þ7fhó:(¨÷«A”öîå{›¶êdKHÇ}¡‡ÅK±E 1º(mŒÁиÜôo\;PÙM Ón×oI¸Nã79 W±‡ï­ˆÁóÝ›òÄ׎çžü(ÎvûÁÜuÛ¼±Ç·O1ŽÊ¾l0„ˆXk˜òª¯å„‘¾6d“ôäЙÇôí9YíË`Á²<ÞÍã—^9(¡®>o¯^­ãN‡f0ÜY Ÿ[º9çXh ÎHܯ¤xçÁoÚ7D›·¡ÄEËŽ–ëoÓÇH~㔟/t*¶-¥6›Y5fªï@”m²–ÜÖHÙ9练ËíïÈz:{ ¦5X:Ã6N¡.mÑëÆ67 ÒÕ3ºµî‘O¹:áÍh{%IžLÀ,Ð3ÎÓ{Vëº3èÊúǰF uàªë‘ä>GE5´DýÜ‘µ;8"eð¿@â È‘£Þئe ­ ?/ef`Ÿ„_¯ë<3r½8¾G;d…$ø=] ûOÇÂòœè +Ü2óÓ¥«á$†ÙWõ`/íô@~§Tu Öa•oÛ9“V ‡ÇÖDAžÐÒå.„yö¤ˆ…†nG´ ¼V4À“V‡ƒ£wÝÁk3UL¡c iŒÚò™Éå’)·ÑѬÕé´¡'GäK1†,énoœ¹K…hCµ5á.yòå8ÄÇ G¥ÝêÕfdsvÍ]`çè¢6$*¬<¼HF-› Й׶‡¼ðÊó±Áыƺ/ Ü…qÉÞȈ$>AŸMÆd3—bE:©£ç‘†#'|€ ¾nn6>æÐÊÉ}£íH„æR’nkì𴯑„¿v*Çžâêê—ÒæGxNZFW >¸Æº|ù̳@}¯œGÄ ¿¥ŸhbaB 'ªk7ÛÉÛGéト|xuã÷È@¿cº¦0ûÇ_º*X;G‰ãÖtÝãóŽ©'CÛ:Ž]]O@Ú܉ú„Î-ûdï¤tæVàžéíœÝzå•ÇyžÛ{’6Ÿ`ãÊøXÀ€]p+\MpÇ·v$âÚ MMk×gœ*®¶$ œ„*‡g€°  ¯$+LÐ v2:¶&§Û#6:aÝX“•ŽòÆŽA›Ok®kR¹ÖÑ«y2\2RjÀ@ôWTæS í0ï­6ë[(â¹l(£SÌÌ-)LsN`¡CVæš b ÄA‚+.¨¥pV%¨Ó˜¸& • óžfO:½f›¨ë¸1›¢Òðžë¡'3OýºÍ…ŽÏÃë2d»:²†ýŸ?’Ûî{W·ß „\ªÃ:ž˜’>žûáÙµ{Ç‘ux=ôé©ÚRŠx¼0=ïw¾·wа_½Ð”{²ˆîw~ïo˜´Ùè´·¼ú¿; óŽ¥nùÕ‡Þ9œtêö&©pxFår<»5'‹ÃÝä‚üÇ;"×;Ê 5X¦(¡Œ1­[CÉyr" >šë Ít¼=ß§–<(˜ Õ‚ƒ!÷Âwu³ÙúsÏÀw–6·&£¦Wê¢=Ÿ;“7_j¥Ð^ûGÕ ÀË­êj.”¢}w:.óÎbqr¾)Îu‹‘¯w lN_mÌ„Eê´}%³-uÃÒE9ÈÂÍq¢ðldT\Eìf«;RAµR Œâtt40 F `[rZWvÅ­dH0‰´úð¢ÕÕ]P½# G …Ê–E9ÑZo¼ŽCßPÃÚ»ñ §Ò'È]ÀìTHZ‹ãìô@‹Ãä>á·é¥Dý¡¹/ÈÒ›æ(+mƒÌ|¨ºÂÒA©§}§šIzpÐLU«cW%SbX{ÛíKŠÕU¶…Ø;P€Ò¢Ì»¡ó½@Ê ©óQÉž|Pjjdå6†ž»ªí'ÁcÄæÆí­W(_„ñÚ;>F±TüFs÷‹õ ñEïrOÑD^Ç<æ·Âsœ"ïÏsl7¦ÅúØôš‘Øz¸‡¤k¦xœ×{UדÖ×XQã‹97®U ^Zî«ÜÊ3AÆ{#ÉIŒèyÏJÐŽEåæàÙÍЧ'±47pöu-}Y]uE¬×ÀÞQv«FÌeÚ1DD‚kIÍÇ Ü9Î`âÙZ¨Ýº`r…°­ˆbê&îŨ¢\ìÔvt¨1 Ž#,qXõßžlï‡ÊuÔ ]‚S;ɹ"¯HØAĈ@À0wvô3µ¦žXÛ®+rð* Ž’wcèÛçp_y±‰±ð÷÷é66 ù¡½° L}sÙ÷j§c<ˆªL÷³ ›ð=‘¤-Údï½ì™w=Ö.R‘èïNƒ§eGo¤kC¯•åƒR…]ö…LçžyV´Û¥›d³RÂÕú¨ê©¥2óéÐ ¿8Ö’¼©ØT‚ᛩ½][õŵpwÍ_ÎÆ¨˜2xÙT•†>®#¸ É"Òw°ÈhhÈ›CãðwTfWW|“$;8 3ÂEEb…eboM¡}kzu+1-‘dJ+¨*?$t¿pšÏØülŒ½R4›.muŠhM^‚%Ç3Ucv*hÑåböNîdîiÁ‚Œ½1iaS]T&l\MÆ])ä´&ê‚Íò¬åt„Bˆ¡(Iw"uR‹jrgވ河hŽp"z+Hfò¾áj—J3nãnL€{Ã@cäÆi…Ídžzñ#ßžyØ÷Ä*NíY>HF›b_·akºÉ8=k@ØäDøxk=·íe,™{;íùɼ[ó›8z6¹<,@Cä'Ö{†:’zvV-òÚ]@ˆ…Jï¤EI–Fýà˜è5P„ ɽˆrÈ€®óMKÃé­Òîˆðé´áã{/R»u©0M('/Õ°<)u uº“Ng¤I‚1©ˆ,Ÿ˜g~àOUðßT‰#Ï¿˜Á@ Šª…7†ÍŒI¬ á^øF!ô¨Æš+Ò+ Lb•Þ#oìž^òêøŽ!M-<ïk©âÌùSR ÚÂu»›ŠŽwU¡Tœ‹[8ÁÈäãl‚D$…^à„ )¶ºjΡo4§6OuGDk";Q #Ì£!ò…‘ÑÀ€…el³tá"4¢I‚?Å í \²ÃŒs0ál"ÆÕ"D ÆG) Ȳ)&XPD;íätõç|5^j´6MuzŒìïEï¯â@ˆ¸Àl¤Š£Ö^“I•}ðÃYoË,UQÎܨh“«ô¨ êÞ…>¦(œ—ëܸå¨5°€¿b!Â*ò»aÖéZ磔›ã±ÜÔ·3J2Ô´+TavºÊM iùíÅ}ƒ.ŸK/§kGBÕC[vÝ1|veª.ölâ!͈R1œíÈT¶RžÎ¶/,ˆ°EÐ*Ä„†×oDÔŒk–›Þq©@ÂTÄé Z¢T‰„@å¬êÐS ©MDDÖR„q Þa½Y¼À(i5%Ž$L˜éЛjÒBhÁ# I€Œ†v©S+¸|5QâH¬L4iЬQîrÁK20=Sf':XnîatÖµq€dHâ„$RKÄ,r½¦š¦=WB8·c¬j)–47mÇCÁ©WhWzi”¼®¸OkàI0Š9§ÛM´ñÃYé Øj` ‡¾šœ¾g2w„4›H"‰âe×™)%^¶aõ±x‘Éw büIïèQø1àhg×ëÓüñ.1 ÏÊØ÷ê¼µtk®’=ödÆ–lMxöà™ç¥iÎ#î °ÛèŒÚ‚˜Z:G¥“ðòׇu+4:ì†=Mqt2:dUës—Gª¦’9ï:Ã"XéH³‹/L_O½Â6ˆÐçSŸ½2=™0‚Îì\oo ™™ÑMlæÛäžUÞåÞSËîë²tnÒè[‰±´¨õ^^ʲŒ˜™J´ñ×3 =¾†g \!rΘÆ6SlJ6)qæ %«ÁfÌÙàÂ#r \T0€”äDL‚vé»%Ü@UJRÒ¤Ra´jÅÃ,Ú›‚‚â2(:k»(o'£ráDì阄DŽÊ]¦EgpóÚá(ßu9kº¢Ž2/eõ&Ya‡Ž³mM/jLùâ˜*öŽÜ˜òô š¯P~=å¹0í`håç !²ÞÛ…*°Þêª ŽêC@•J¶ž¹Ê^7Ð|gF Ê6ZÑG˜S`ú´ãQc³°Ã,,x©"eàK1 fbÀ»!šE^†YšÑM:dw ÓM)ÿ-ÀJª„±yÖ,†W¯è4—Ši™Š{7DˆH&˜¨œªH4a §þ7ê­6ä`¤QÐo! 1‡~ü”ûbŒ&æcì?.U‚¤ª”ÏJªȦÌy-‹¨PªÂº(pÍ(²ˆ¿ÉY©ˆ€’|Ôê½T³SgHÌ‘kejE•u•.ò±åÿõa¿¤t„2 Ô‰¸^J!Ò‰H€¨ šÇ:Ü!FÖà":ж„1'fS @?JÖºº'²¦ñÒžs#‹œ"ºúÈNÓi×H®ÆûZÙµ¬æ4´LÜ©:©æ¦ææÓ¼|g\ôèì·Ô4Lé\{‡J{»sy˜Ä§s2o®gwzFGHšª×Ì*Üí¥o$f>|r—eÊÊ2îeãêÎÝ}—3•¼“ݵ¸]Õut™í¾¹¹6¶è[[ƪã]Ñ3´ëhƒ¦Tê;S±U”-*Rܽ®3Ù:ØÌ@¾vÇ%[Y¢²I9y¡gJšîÄÕeؼÐe·Ó)¦n­¢ªçfm‡§:¢Ú¡:Õœjßw\cÀ‰EŒ¤Õ)Rö¦h’íñª‚&wœtèn6¢²ááBÂÛ ´G•q™3·sÝ}Ûbƒí©©Ä2;-”]Ü¢`âÿ4©«S<ý|œ\äâ;ƒÝ·ERž@Q’e²†É ¬ëÄ•©´6rö³nk0=MT餲úÝ;çg5]Ô¨žS‰Q K]ÒêÅžg›½¢õ5£¼ð]4g¹Uè6¥½›”NÈœd?<¼(Ë@•[ÍÒ6ŸVrË==33Yr¨î—3”kÎULÝIáC‹vx=‹•=¶5L†ö´bNicÞvð\­Ë“YÃLwté%¥ÐXÉY½´“"…ªuÝwÙY{tNb–h ·šNBÔ6BB­Ù¤U×$êjX#s%6§ ÄÕr·£srtžœÆ:»¤ Q"IrIŒg‚¬ìˆ³¤óécøÅàx{ϳy#y˜¯¯ë W?ò²ÿò P†$‡=(øÆ.Pã–³÷Åë!¹òÔŠ 2ÇÃ?Í ;´µ/ÎÍkBJ\&©.RçWLÚfÔÕ .9 Ôå„Ó¢·75­‚EÀw÷£š‡r‚]0N³ Ípå7 šGNãCèË$íÈÀÈð6ÐU˜tÙ×y­b$v0*d9à ¹:7 9¡Ü˜u‘ fïn$©Òo}ýrC[ï}°Ñ'7Ä5Ó˜M§m6ƒÍgu¤ eÍt8ͼݞ D"ÍóŠØGÂJÁxÝX™Õ€‚kÓb0À ‚€+¹L…YNÕÁ8À tÁ¼e$@؇SQ·» {vhQ­n;ÑSОjÛY­ÜX®f¼µ9¼/œ6±ñšÉ™ÙæÌÄ­ÕGp·Z/ƒ†*Ñ ]aO-ÌØ÷©ŽÔßJ{Ù×Bº´ Œcx4wÍfÞ¦Zs6dŒÑ L­Å‡00ά»Þa–¹M² ‚Ð „‹8•ë€néOrÁˆ‰ÕÀÒû…Žªßéû·é‰{ G±Ÿ§àÐPÏvÁ­˜™z4Š­]v*—þª¾k¼x?&é_¬ºA Îîºß+ë¶fR—”IˆÒ8ðãØÈ¡ öÈf¸®Z7±crh g(ݱƒ=»Ç„Å3sì©O†iÍD匀•èžÀ!ÃË<ÑËåóuÕßP!ÞçMM# qÉ4˺`.zÖ᧦VÍËÑ cQ*T+.SÉ 8\1Dì¤õÆ^Y:dúM²Tý¢ï`.Å]a£‘-ÌÔ‚âq_OyßMrèÔÔ·\2ÏHÔÿiÉB`~ˆ¯>žÉøX)ˆüD‘p<—Löf1vï)ª{r˜mÏ_x}] …÷È_†^/¬oï¯õÄy¹÷Óºú»ÆÆ€$:WÈ †¶y@ûÃò^Ý_‡X‚Â"ÂÁé /¤z:ì[Œ]0°{î}—é·Ô 2\mû…\áÞÞˆÓKæåhÓYõpîù@Þõcçêý˜ ÄQ ü•Ÿ/xê¼3"û½Î¾èxãÆy½Ýƒ;½Õx¢5Ú½ºû‡€o÷江z]ï@ЃX:tì‰Þxü?kûœQƒv¡|ýòð›×í?0Oµ]BfúdÅ •š’ˆóé0‹ì´† '~‘ôÉ, ÁàL2kV Sy¬}‚€CÛjnèYd™œAZ7?H¨i a‰gžmUh¢  úŽì<ÕÇÒ)‘H†ÉƤ"‰"ì7EsÄkj‡ÌÏÈ,ˆ|j~`Š_ áà'~C|î`N9ºƒÐF†1 †b®… C¯`»vxãxµ÷¶ðÌoiÄ~‘eÚ”Éø‰í~NɽöôÙ*k·Wf¸ù½ôsó‰É•7 á:Y…ÑÄ©Iº¦n’Êp[Bœ›vï&àš$pÖ°MXÛ·-æM‘¢®÷V»§›4²„˜f\‘Âá’Ÿe½ê•°Î»5<›®¾‚$)°yš[!,ýéÃïH[Hñ8·°&²Üûó çù‚LÃítƒð ^hFEO»KÃàÀˆÌ™ìøx6ë1 úVdØjƵ']IΡTÈ¡ë,ÆM¾ý|ëPáÔ!OLa+Ý7ž¶„àkï°z¸i×43CT Bݾüè>¬`t5BŸ´gO²úx³‘3t(3\pçÎÌÇm„‡h „X¬ ½÷ß}çcžÉÙÿŽ÷½ÅߎӈÄy…U LÄK™Åw'Us™ÞÚž/kØW}úÍáA1µ6W ÇsœÜÝ»ù­‡wE ´¢µ u¶sÓÞ»ëv†­8„€È ¤ˆ\ueMfÔ1šTÀB :¾Œå[‹AÖÓŒVý_IØC}ù¤ Á ÇOíÝ^!0‡\±ÔYN#SKH5YêÍæsŒXföÖQ‘4¨¤Šñ) ¾~ä?z^>Öé }Õ\"ØûCwÒ«½;žI‹­0ƒùî Õo:hPãn­__îûß©>}Æo¼Ú¸øI•<þËòˆXwì—±]“™'z,=û‡Óû¢w !Ò±cå æµÝsV‡læ¥`üÞLÖ0†’˜`¡ETF*(¨Œis*Kb¢”Yˆƒ´*‚À(„•U`aáö²3u›ïÛÑBÐ]¤kQ Š0>u 2 *fèTuíD @øÞÄË(#ìmBÛïÕùÂwî!6Û/˜¦üç³P¸¶û@3èwíöþ+Î|k}$S ^ï§§Âå»ñóŠÈO :ZBÇ¡Š^,äÏ×3'0ž¥ÒÆ[,FW4ïCsïQUÐÁp"@yÛ{N±‘(8*˜Å+¤â#]Á’×·(!Þþ¶jóåIºÑ GˆI ³+ß`ÙùØ¥ëá¿8εã¦Û EB„!`xyÑÍéžÞF_áW|BRú|ýŸ/yš?Š-Ùûë×ÖÊm¸q©ª /ÑB† æ€/UÞ‹œ þÅÍ~ŸpC}Õ¨×÷ÙyC®1°)¼»¡¸â€×†…ÿ!öå~…·Iiý çRç•[¼ooR3ŽÆoK1¥¨áÝ,\ª é‚*+ÂÑjT¢Å(±U¤mñ¹gVf o‘¹ikh­Q–”­©ceŒâÍ4E4M Ê‚jyr{ÙÆ‡UPñ%:j"*é**Ð4‹l g_=ÉâNÅDJ’ÅU8ˆ•hÑb£e+U«(Ò¢ZyÇ›Ò2³š¾>ûŸSƒ}»;îvB2(æE¸©Z¤ÎÛÛ± š«eN¯U§]t}@»¤›M0ûU =ú—ßJöÆÆ*î›ó\é@øht Gßiù>9ñ7§¢r#i›?_Üx5©$ÿÍév}¾õ9¡¹³*åÌtãNMù˜Ò*Å-íM!n³e…ùhÏÀ4{%AèºKÇ [à€ ɉ‘uP•L#BeTÌÖK€tMpöšZ"¢,+pÊPRÕ «1,ÌÔÇV )-Œ­Ì)‹rÊJ4'OîP,€#Hr§yU÷ºð°FÈÉž‹*YÈõÑÉ\Kã•W PÐ=à‘Œ€,Š)â|× —RÆHgØó ž¡<CDšß ìB[£ã‡Ãð>—qAþ×()+Dw‚ï9V ¨‰Êb¯X0ö0[¹¯ g œ|L‰ç૵f€½õŠ p@).tg®´<€ì¾_{é'×x‰íWö7~´Šô¨W>žkšo_‹võá¤5¯h`¥¢Ó—@•j@`+n.ØÍ¦Õœµô­AßÀ`üzÍöùÒ@a ‘Ÿ•)y}z ô²wßQ!°ÒÆF¨šh ;Càéƒ_{’‰×/±Í;k³ÜDD€A´”ÒHÄU=óådD ˆ  °GM-U¶•ªÑ¶ÛZªÁEžîãEQˆ*›œª&N3jš¦˜ÖESöÉ{ïst%EVÒ¢¼¥“­õ3ˆ YôH|‡Íî'Làv¹”È‹ æ*2EbˆÅTö•56uîúï¬O™Þ¨–Õ¬kZ­U)VËj¥[KTÅ4¶Òˆ•KEt\W¶ÚÔ©UV£»Ì¢Œ"£3#"i^ä§i9KÄ«›ÖŽ¥šf)¦jŠªŠ¦†šj& ¨ˆ¨fçÏ53LR)à¤1'6\™ØhæªêÇ  Ž›ªÒùŠÕ­nY¨Ì:O¿o^Óz%Tøü>ïò»ÄW÷Ãk}:ïtl½Yí)ª{=šmUB› ƒÉ ý¹·¨o¦*…UãcË8N¾ÙVÞ -[Pó{9¾'Zy£-ÖÚÉ|8”ÓbT´°µ©hR -äç׌€á\|oÍàÞ¿‡ßYÐt$Åb€}€ý´À€vÆÍ×Z5†÷îÍÍ´‹Û3å§A}ÈY"óä5ö^#°dêT`Z£•l‘ÝL6BêUFœq*"Ì3àR]íùñ?VÃlz-Ê(x‡YHÈ/—NlÐZ BÈ=Tüª;ú {ï`ð÷~Á #w|øÂ²)Õ3|÷ÞO/-ëÎ`aR´E/D€Ëb—{º~R:@Wq'Kð¯~éͱ øÂ‰Û6ùïµC8»ëàŸ,,WHêçºÚÃÕÝnýz¨ ë…]N®ÈÈ›ô ­ð|Á»ôñ±ùâß H‚b ·¬þß·§µ›ç|š~{«¬‰¾ææ½T CÁ™I÷ÉØF€À€UE5L 4ëm‚3‰ñ^¹hÆ©Ð|nƒ˜¯–»öС£@ŸÛë;¾Ï˜™ï{öz‚0‘B)Ä À]àÛÒÖ9®{Ûm€Üæç{;œœ_sôÌûõÍfƒ'" Ê–\W®F7l¬ ¢]×úyž$©Ÿ[×;÷=±xeŒ áaß&}¬DwÚ ®hƒŸ´wâ_tïï“ð—ëSö᫵wËö‘†– ž¡s½ëª›Mù·¹¾Ÿ¢k…Ž ¢0wýíÍ»4ý÷êV¼·à!˜0nè_Ë,¸º€€Ù^½ó°ß‡¿ìcŠ ÀSß~|×ºÆæ÷Ò}9®Pæ.üž¢ö5Õ²õ¥vgl»ST¶íÑ»õõlÏn=}UZ^[ss¶4Ñ­[–®_ Þ2Í<¤WsªdOèsÑ3ª, Möu®m}¶(m«dà Õ0õÒñ î…6ëÅêÖ7Y¨&²…„ÁY˜˜9#\HÛf­©˜YZ¦1`°¶Ôu˜¸|…ó½vv*IÏÞÌp¿nÛcK1$ßì¦GÆNbôSùý:y bÅ~½ÆxÆ#õÌǶ—ÚêÞ÷ÍÍÁÏ‹îý®üA pújfô£¡ð¹î÷šZ.†Ô›ö„ÓN‘©nÑ1VÔ¾Û.-Ó¸Û±,Ø»†Ï^¦kž,¯µè×2äá®!ÌÇ%âð²[ÙåïÜ6"(}ï› öH ™÷Õ«öçÑàË¿yH»ÍÞð$ð¡Øâ˜v ,lÆ«|_ '/¥Íµ{³êñ'C?îÏï\‚ påÄ !K½vgíýÞƒ÷•ŽD† wŸVŽ€îo๻e±ãó™¿ÅŽêž®.<&´1½½¨ I æÕ•ÌŒoI¦‚¨ ˆÀ¨€²4¯Y½f)ÑaKeˆÕÛ˜ÒŒf2ˆaq0D;Bæòlt [U¥d©c Õc(PE£–ËŸ'Õ÷_zÚeb„,ðõô`ߣ×Þ0OÉŠCߎ±@²¨³L¨¢›µt…q9­Š‚EóÚƒ¹¼û†?yoGl›÷µ>}GBžñUž¾NãŸAsoÜõÛ¾$fƒi?¾Õ›O~õ«¸€:±p>=g7à•ôZútzU­€gL(u'ä3K©†½ÔÈ©ïw—¸9¾à"ˆ!:‘l ‚’/ ñ˜Ü£/ïß Dz¾1AŽ×˜ƃ¯¤ EÚ ˆšG«â¢Ë7õrB‰51T’oÑ¡p< ¯•ÿ5¡¯~híÈ;îp"AEÑט¸Uùªpí5ôu× ½už!Ä|3ß½ùîò¦Dd<²Y–whmøÂ;ˆ "‡ »÷40ïÝùuyDç—¤ñÀür“yìùg`õݰ­X’1Hß°~¦uÔ§Õùœ«®©ÀRÆ™ÙÞÎHέ­¥¢„A¼‡V „9¨ÉÙ|yw.”¥LlpÊÓp7—ÚW0D¤IL°-ih4”DŒ› ³#¥l–•´D£Vížøç7Ùä5éæéá²/@a~‹à;íê ô3¤(j (QÐ =â@›³Ráp®7ËVµ—ƒ=7Z£–Ûf Ì©l°˜tiÛ$ ±Máòi[çæöü×}ù}ø0ª7ðö~ ;ØèµEÏÕ+ÏÌŠu !ÊFPÉøw0ú¹ÕŠ¡kE:¢Ã„)÷{hìöªï²ÝÖ?(!¡øJØøRž »Ë´;üzÀàïª!ö ¡‹æ5‚™ïÑ^ÿ9îö¼hš€$R"‘ &¼‚èóæ—‹œö¡ä½dië³;jYÓ¹‚ƒ™ËmEÞŽåb‘ÔN÷Ëï–@ˆ7a€ÂÃájT‚@â÷cûöPxj%ôÖC®ß½6w?R~yŸxk/ºlæ²ÎÅ}Çg·½žs³Æ{T à0Më »"l>þwàÑÉ^„Ä vN\µÜ °ÐnS,ŽSª€¥ ¦HÈ›¤J =5·ÒgÁü=Ýlî÷â!ßZн ‘+bªs¬Û“²Ë@¾,¶ö¤ÙY³šKa"°Šž%íÇs•sÅQê«FFohš¢ {¦mNN³Ø+ròçIi]Wf‰ê¡:q­všltÕ\Þ•ÝŠoŒ”ëÐ¹Æ ºuD¹Ö9–ÝÉöªÄÛP§»Š]qZ©k秥Ѫ[qÁàc˜Ë¾/†Š'o¨NHt.ô¾Ûª¶E^²0w3\g]Ëa™U}‰ÎufßPZåZëíÁ–—qRñs«Ç¸d梷{¹Ò]ÁPÜ{z‡>êjš·¯7r\¡Öe±Ê³¶WU*xqêÝYÜ Ò'Na•.z3›³u¡qMa{if×ZàNŒÁI$ •6¬Ì‘3ÍfÊÃ:ô==¸-Xí®Êo2¦t…¡rR Ì˜¦’3vÀ¶:z˜­5Æ•ñ£¤¼k¢N•6”†/–Mç[뙾°Í‰HjFr‘‘@ÖW1 ×ú¯{ghÀuÏp𩙚Z,5ìçj”DØ“…rV•]·…nöÅ])Ê x‚0jká’ݾcGo„ ÷w4_1òk+Y½Êæ~+'¬?î©Zê~Ñãéi0TUáÕÿX†H½¡Z õ»õ¨x<ÑE #xå9Xd%je`¡„âúƢݭo ОÍC¾ùJ‚õ¼›)'Si4œs;·€A ^1Œ\!(O7‘U³Íšz9»Í·l;™`êáÎpÕVVšl a4¸*ȪH«‘I°$rš“‚…XͨC'¤6¸ëC3„ñ[ÊbO$1'5¡ƒ,;ìÇ€‚_V¾³[Øuç[wu¬qQÛƒªœK’œh*Í£w35*&š®TË‹–ãKº(bl;)Û´ÍŽs{¥ß×÷ gI¾“˜TÖX´B´Æ9­i“ÊÍP¸7%¦fP¢#s ,ˆ5®XYn™– ˜QXjÓ ÜŠ`Ö*š(QLÌu aF¯ÃR ‚ #1ÛO*µ­#˜ÌY•eZqfšL–…³DšY¿®ØO2ƒÌ{²Ã«Óéì8ÃöOM¹GÓ¹“²7ÖtÒ¼a5±Å:CL킌ݲù¤03.Œ¹‰òf¡ˆéÃ{ãšÐþ6êK—wAô“®ÓcX4Z7ÚŠXÁlƒ0…¨‘º¶f´Ë› ºzNÖ0EìÆ´>‹=qÓ PÃÄ¢€fg%™Ò ©Ó¾ÈsêB«&McãdÕ1Y‰ª(‹F¸ý1@ü¿ ‰ý®¼8×5DŒ' ¯>æ³ç» }®wTiÎÁ+¡ôÉ¡êóß&m:‡î†Ht‘u†Íy4ä;¾ûHð€&>…ˆª€ dHÍrÏÐ# ª@DhýSöñ˜è&¼uÌD.ÔÇÕ¸­C´N¤L”Ž=Ä •oë©KñÔÐ|üÄ+‚|$'v=l-ls½–Oã5Øï&êÇ«íð?eƒ q1C†‡—mºwvÏ´*õìÂU¿mü°u\r»@PÜ›c^Ú»žÏ,@ŽØZÍ¢»½£¾¹yÇ3žº³“ƒŽ6¤É;G¯R÷ºå‡Òu¯«‚šÝùfÓƒÅê‰#îë×dGïÐ`fzDBúp'\D¬;Œ€ßeØs_0ŒõøzYûï®ï³c…" <àè@ÃáCAúûà |ÉûÚ?¤ ØÐÕ’UÉ4’à{ˆfÑu£¿&!Í`håU]ïhMtŽGäfÇfA÷»é±õûcøý…j£zØÛ[ÎÐú šÕNz­} ö¾ÃJ°×¸îeaá»uݧ/1…¬àèî½d^sUÈfe.¦D™PÆÂ×r(’0 ,8%] ¤m=$ÜÌîÉ›ÿk 7ÝÝ¡Ý9ìÈàɱ¢vBVÑÇÒ½°úwú3Ô;éá WBø#ˆe7ž»«îƒ7ûÃôí?aCjõÜDw!$˜$ð²Â$˜’iï0økžoÞxx¡ Ôn±ø’ÕÍËŸ§?iÀ U¤ ] Ô!G»ÆûwѺˆ‰¾Øã;Í-0îPÅiD E€… ¥ e”©z*tÐ!®°fÅKì»T85Ù ¡`Ãp ÁBàd"©ÔBclí®ùïmo8甆Zn¾8Ïmxc|¡Yíû[ÖÃß®È ¾i9ßž¯=psâTB ;ñ8Né­¸yç‹ûŸÉdh^À¡¡UÑABJ¿œƒï&€xó1`¡Bg!æŸÞGažEêðzÎÕP®ÇÖ+ï´ý¾¸Wö .ö>AŠÃîÙ„oÑŒ``ÓMÌÎ/ˆµ 3Ó¾^ëê!?‡ÝPÁ O7qÌ}×ÎboN ÀÛç´!·÷φο¼ë»¯¶}'tW1)M÷¼ê¡U£T,Õ YîÏƒÏ õý'ò[…¢Œ¾ê³Þ‘=Šgá5ÙÏ5Ýy®‡Y“ݶz…­š­¥c_UYÂòÒ9»n±Áuº(8ªkŽéW²ªy•#³ ÛS›(žVóÕö8 ŒNIŸG˜ìûæÊD`a'c÷¿P Á Ç ~Ÿ! B+)ÍŠÖÚÁÕä "¨Þ‚¨@,  zjb 5WsŒˆuí{©ƒàÌ]ÏRʦI '=¥ÎxU ðyØ §]Љž³Æu¤®±Å&DK#µm‰° (Àãž ¿ÅΖµŽ« ­eÊ œò Ó4È™—/]`nPÒëRuJXH¡i  A€@ mH£˜‹6|ìs_ï[w¢#¾Åþú´{sÇOW°wÏ> ÒÚÓ.?[÷&jÇÛ·ÓPúH1:ú »w@)è6’! óÍÝÎ6Ç<÷³Ž°»9²Þ° BÍaàÆz cÝsì> Ó'hC¦І™ õK °æ<àäøFº/á§WÂ%JÑ2>PÇ |9î:×ù_4ÇcÏ}ÕïmæöwöÀzÁ«}ðô‹” ?O€#~æroÒÇÙŒ‚Xä±_Ýu÷nWdÕ^Ô "ˆ0óêSIjf£…t³UJ}X:ø9»9p=”xÕuy®6š®î­Æu[aÄG¸¦ æ 3JQ­æïët/WÕ—ÖËN¶w÷œÕ|ñüú7d‘â"º÷¼ý÷ÍõçßÍØÑ‡÷þoö}têß_?¤ëѹ?þâ‘ûᇋ,hÕ_¥ßÔwΑ“G3¤ûwÛLqݰøíð­j˜se¾È-¢À¥UpÐÀpèàÞØ‘t‰7ÓZ#ЏhºÎ! ¯pÈ0&Ò»_†—­^æy^÷ø5óÀóh~/¨wÖ“” 6vá»;ÆsÌ6«†ô§[SÜÚ*\‚ýþ?~ ú}c5FÁÎßËõÀ#NgÙBÌ¢ÙXã!âºÄ!3ß[¢ ¤g¾‹¬ùŠ—®«æ‰ìLü¶ ^MYùŠ:ï6üUB«Ã;ù–üî*ö³«ëù*ñçèñ —ð!Óð€ÏoZ÷¤x`#ûe^µ}]ƒfôEºœ ½±J-uLŠËMs¦p‚Ø‹Q3ŠM2’t)\@dJŠßOzÎ^Ïa6Ñœïòx_߬@ç”ýºÈSB¿ Ø1¼†*‰a!óMo{Ìbm¦4/VBhÁfo¿A_soÈÎùÀ…~Cõò‚@’Ó.}áš5Ð$ ûvHÙ“^‡ @?`Ó1þÄûóÁõú8 ¯$.‘ÄÚd0²~XGf¨C®?ŠõçÃ…é{•ÛTHª$ u2ÄPKÌH«ã³„NEܱõ}ý¬½ãп`¯(£‰P°}¬8àß««ˆ¨Ën >'WÚ‡opêŒU>¼3ãsU~þ¡Û‘œýiÁ©Ùai¢æÖ$iÝîòY=ƒàBök¦O¥-1!DØšá—”÷)Ô dev ¨€f,dPÚ ú_U’/ɽõ‹»®ñeð'q*éRâysùb ZOòoâ:¯Ñ¡À‡= âzÂFñÙëÛõŠ$øÞ©$gº¤“³W‚ éßxxh@¡¶*¨Í÷p&¶‘”(P¦«åƬwØ1Ð~sËàÖœ•®öçª5SVY×`Òk­µgB¡!ÍMg¸Š˜qÕ!±¬ª¤×:Â\-ì ô{ßžëÄÆ|N»$ÆãtišqÄ— Z!šöYî1‰ϸY+ä;@ 7ï° Ú°})5õuMºÌÂwòâšêÇ'³mSĉ/ó7纨}d ¡(¾²ø²æmq%Ú÷ƒ WJ¡­êºÃ^ *p¥ò$oð0Xá–ÿKíº±E‹üE}?o·Í9F»¯2þÝ,›~¾Ù¡o¼+ä¿otxJsX=û×”% £}z6Å{v’›û°æ !¯€#ÏGà×DæêcË鸄‚GÆÊß•{s³yPõ@}¡GËÔx§Ó—˜žOtŠˆ@ê?Oá|bÜ0¤;@?gu\³›”ê˜Ý{vœ-[^ïMX4g0zz¹;zIËý6©Y>Âà«S2;=:énéf¼@9“u/MqXÄûP–ÚÞ+´wTø”Ù8èo¦½ð£G«LgT1~¶ og~½õk¸Aߺ ^ÞCý<}±P€íéYÙÔê® ‘bÙ"HÐ:Å«w¢ŠbZ†æÔ’ãëbÁ"ö;G…÷bá¾x«}¨v Ê|ÍÌý›÷—¾ÎeɛЭƒº¿½ôÝ·—|¾Û¿®¹¡?·sî·Me¡Ô8Hï…ÝPšöÖªÂð•‡@¿ ÇŠ§Éýc†v\Š  G_ÜÖ¶¥"ÏÒ±`8 èàÝ!CŠëVðŸƒ=œ&KElþ¾HL¿·Ò±ŸïÓÞlÇ–ç({»Îp\wÄ÷/ïqÏ€|ßž¾,&‹Ø$}ï¬àÅŸŒ˜ª_¼;÷îï·Cæwïh¨{vÎ÷–~ˆ÷=ç2ù¦èfÅ–ƒî«CW€Ÿè[ l|"Wiã"€ˆC¾èBû«é°}åÃÙiMäßœ“5{<÷®æÅÍg Ìñ6®“œ]¬#‘€ÄA0#Œo19}Û5ˆ‚¬Ít‡ïyÃÅÑfx Œ!äàǘb´($þ8‚™ïS!Ììv]êÆŸÕèÊ<*£Næ N]lD@è Æä›úkf„ËÐëß»œ­]Ü;D+G}ýq¾¸_‚~=ñ_:'cÁ¿§Þžë ì{ÜÇDYï&·âˆ3˱F V~‡Ë­c¾¼3»ã~Û¶¶ñ&F¼Æ¹bwíky×·ß|0öT)ûÖxG6Ð>ÛÙ`o¶x³oz}çßê{˜YíQìøY§¦/÷ïjÞïLöî|ÿ †!¹á߯çTKøpt;ä•/?ƒ}ž“º¸ÖûŽGƵª-trä\J‰9Ò"r¹9:µ’ÚŒjºûQžfóvk:×lôüæ–Ë++8𫼬¢o« ©ó¯'lƒ;´Lw±"u\¬‘c3'+uiŸ«f„¾€oš`Äž±1… T©œð—¦îês¤~{ÏÜ8‘`G³û!;£!僠ŽcÑT=C½oiÝSY'ÄøhÏ-×Z¦³¿5ñ!Ó¢2D~îÞ¢]t‹cQ„9­hÂõ¼­Œs®Ç@¸@àèEP¢H~¿`¼Â` µäÒo*½rÈ@ƒ¥ÃU˜¬’p ¶K£UË(âùkC–"œoÀîÐÈ„ù.¬#êªÛ…A-¬<"„'¼rx2àTýs<åÈV@ãÝ.¢ õÂЧ©xÐà¡®¼çY߇2úåçøÍ€@'áÊ>J¸ãFÏÞÉNüx.rjŽ•!ÂIP¾‘‡½žƒÐ.õ š¡áå|!gÔ¤UÁ篒"À‡Ä2åFÎÀkèVÁ`nì4B4ⸯ¸»_P4>u6¢?TíU¥r؈µ(ãPQÊ8‹¤n³èÂÌw‚x6B"(E,Ž‹¿A}C‘4GßF|cøÝÝÇgßúI?Ó]ìS’U”pЯ ™£³dãá'"l.Pìܶ8ðLŽ­¹l?Á+ú(ol*‹]К>±žÄh œøk›9“¬„µ¡q¡;ŒoÀþ®lÒ+:þ?PÚ€³^5_zìÄŸÑ-–j†€ ˆïÃHÜ•`ô]»’p`×ßfªÏHOGê¸!ßÏ™ÑÁo—NDu¼óU:iõ»Oƒ:´(ãü‡À½Qï54/:‡ÇŒ{§Þ H(ƒ¯[úƒºâ )%TžôT}²P|“óýCî7ö¹ü„]ýúƒ;F¹½ó¯ì}¿° 'øö}&ÙDt~¿~[ér¶iD8Æ?? ‰+„Ÿ]4¦ Ö‡pl“Lòõ–? «¦§{¸±ø<ÊšN>2˜vIhR B>~½6¾åê@= I¢qÅX_«Á·Læw¹©§ co_K- ¿Oë\‚µñ- þˆˆøÀ†qï½`‡EÐ_dîÏìsý ûÛ:Nv+*¬`Ù;©\•×išX‘Èb€7(Ç€"euŒ*Yz•ƒC»q„1 ¥ÑTŠŽÉP<¬·è•­9Ïkã_šÁ¡½A Ð'>ðû¯‹>ÙMBÃZ+ç+½áÕ|O׺¾ßŒîÏØzfë¼T( ÷Ó.1²G{Þ ó^6^} ªñÁkVoZ÷¾?Óæöóc4WI{ð©–fÔŠfÿÕmü&w%€+;×>ª£ç‡àêòã±K¾æž­8ë¶Ã}ïÛ뽌 Ga5:Ìå0‰»è\Ï/­rú«„@öþ›cîVsï†Ç³ëËãÕý Á™Q/Œ°¸¾EkR&Ð ȵoO EÖãåTí‰*°'²T?˜Î;»ykVc“öeN”6òùÅbÎ*ê¾ “fI™ÚûýÛ’C»Û"öâ7¤egû¬x2ˆïn îU›Ìo4': ìÎAeéo„#%"`3­zžÝ9à‰|Y ŒàtÛE®JXΫ8Ó³=tÍuíÝ˨ãŒW[)Ú‘K ÞnÕM®*·TéÑNŠ•%h­”çi.®WÛs×¥dhv9C¦ñšžE›:Ú}{«¬£—;9X‡^Þ3Ô; œíw.vEuæÎÆYÙí9”¹>ã7Ù]tÆ S"BEÖî 9»|òv”­ªÞwEëÓ;3UÉŽ³ÝTKœœ54ñHÞ£¹Nˆâ{l#Žuʺs]îð¢²lÊ‘¨Uª—Eï7¶–¦U]×jRhŠz¡)¦¯®ºú÷¦Nõ ›ÙuÍÎ ÃÝ*ò»o2‘ê Ü"ˆ²–èq$±!WH #dqÌŒåZ6d5BnTsW Ý=o£š´ha7˜ r… ¶zªr÷Imh5Ë`¥•d&(¥®VwzíUãwlÄL¥Öbô!<êÑ7‹jF3ÙRú…›¢c2ºÑÕ¥”w-Üè²&vàt¤XU4: زK’R6^aÒâ°ºvrÚ¹¡5:1ãÊÌ6ˆ®g5ðá)Õ˦6d[3O'ƒ4òòíîþ4e;lño]V© !?Ó0Íï¬ › TÙ)s¢À‘,'R‚¨©i`9c°&-"”`‚Æ§Š“ù¨ÁiL îðf€3VyC£*M´º44âlò”ߘ `@sÑ$Æ£#hÊèfpÄ l`@NèÌŠ­[”$3Æ;±Õ!k‰›Û1NgAÝÌs{ÉR…B¤‰‰aF»/G<Ê÷omVrδdtí†.››åësb=ÙbLÕ2ÉjÁ½0H¸Á´D’â¥(Ä,U@I.päD‘1$ÁjÂ"ÌÁ¼‚cž\Àya,E"0EÆu…Yb ®‹)ÝèÔÅGe©ˆÊTFRï ‰dQñ¦Æ‚‘“Aj ˆª½ç™)µZÁ†× ÅÁ*aF!-,eAs,H©ŒAf é‰lPfZ ÑE.š(† $ªŠ”ˆCDÎü4×)P÷„æìŸïá¹ôŸÑg¬/xB[2öC¯®Ùª9ÉpìË1“úãzèögchiâÎ<gx·6O¤ÞÞÅ0D¥9)rc²$:¡RÑÃH€áœ£Ão+sëy«²Ñt**Mí ÛE¨ÿyNäu)à¬èöx1ÐFΊÈbffÜF@Œˆz´VîçŠABVdÄÈ0dĘÃRÆ"•APQj#`²…7ô ÒŒy!!*êHñ&»üî÷ÈmeM¨J'Óµµg~#®¬ñboLå]ççÞ`LêÂ5ïMNÝ›ÉÞq Á '{aÚ\õRlÖô 1G) ! † õ#à+Ñ¿…1Ð2ÜëÀªlö××ã1†Ðžå‚ƒt^j± (”i ãæÍ #0¤=Žƒ™lÙp® [ å„$Ô(È$‘B¯ *€_Z¿`âËôµîYáiðßÓbq·<'{ûà*"¯¹&yüµ >¿¯†n,ç¶‚Cá[“Ö[Õ}t¹Ï ± Q6ÂÛ0Aé\+ÎrîÃ÷®ÌÛ¯ƒç2d[y>"ªø  oOmÉ=tF ÈVŽâÿUн^eïhüa<8 lH†>l‹÷d÷/…øÄ­Ñö£™1Rn3iËU²qY}†YEÖDÍÔ9^l œ$5·¬/¦2•èå³°ãÐ „x2£Î^Fš&ˆ ”hT¿Y$i¯²ˆóøXû/À[‘W€³‡oÒvlž°øÉ£CfÁTc¼Ï­ÙøPÃUŒ ´úõ’ª¼;°|Ì¿žª[Ö,ßÚÎàz7àX„÷æ°6˜$ßË"í›f<ÏœåwÚòÊýrİe毑¸æ=í‚knnnoÝ{€ Äâ[Ú€tDï˜ôXíÏåb`ˆo‹ãƒÕ.â{}ô×Sp¯ ’¸>W S\͈:‚*c£¬dèÀ›ÞÚäÞ¬äæñ uöp‰ûdür·é_–@ˆË|àž ]mZÓZ¶ª˜Ôe–´ÒÃ1¥¢NDÊ îì=2±ž©´HÐærQ’~6ë€÷¬k+\«öÙÔO÷‡ãñÏyÏëvxà Ÿ†‰ßh7œ/ûæcÃöàChÚDP³®ßF~.i5ùôÏF&kWÔcEÖä±ðå\ûvA<Ñ›*­»®\3öªZ°@žêy'Ø£sÃÇ·LŠÁ>tc+D-–"¬™âJÕ“´íôèpn„¶BcP-~8Yƒ¼te¡À²¢Å ŠóšÆ·y›š6Ê]y|x ,åae|Á=ôðŒ¼]ÖøNÝ©úYÇõïØÁ:ïì«…ô1WØ}äp_ߟ¾â;wS<ïÅ_ ÅËœžû/röþ9º³‘´±W1Ÿ-)=¶å{‹Û] ì\>ëõl9Û1†kägVæK©ÉIßCѾ¹øz«'tú Ë{W•?r,z¸£Áö©Þv^J0Œ¥Š¦Qª«ð~Åž‹ õ í!ßšö÷_~L û(æàè÷káÑ>Õîþät£ðø®ü=8Á93ïvË m/µ®ÖÎÏéÌÞÁ•d4wõU‰bñºÜ&ÒfåÀDMG‘9O›Ýï#´7¼†“tæ½=~åøþ§/õß¿Qìº3¯á»äóª¾ûÝð÷æ^éc:Ÿß‡â‡¹àì™Í#ç%©×ús?}ûÈT€>ú5nt˜ÏÍvMjÃÑß™"{Í GËï¸g7=-Ð\!œêÐF ácëå}½»7Ú½5ðîšu½ü=“›ÕÙûì~®Å!(€$ýÖáô)á~i IÏäÁ‹Ã…'Ÿ¨}û{º÷®q~$X¨ˆÜùz°•¦\=wt!û^!ŠïÁGëzÎQùž£ðvý;~8šÈ7¶Ã<+G'9£Ïo¾aóí¦‚üc>ËD1’gé—ìܯ™à/ÏF‚˜}Îû ³Ñ”m-h'ÅÆ7Øê“ªÊëÙÉî|ôVUlŽ““H  Ų†¼¡…˜ê@ R'oJ?\7íàÈ|¤ÍΉñ8/ûæØ&ÌEY©µ º×Ñ8oÇÃF2·#í˜ü)ÛÆ>kÞ’Ù‡imúrÆmƒì®ð‘ ˆÇ7—åY’!Œéžïê`5Þ¾tdwŽ×ˆš¥Ç~Ô×Ï|TìûÃèľQÝëÇH8èxe¯Tiæ#¶â~îgï¶ýïyŸ¦¬Ü¤5 o Vòù OÕ²{'Â~7ÃdxÕ¡¿{†€8ÃËßI÷É ìRvsP,œÌu[jzäð×½jhjø„{öü;¹¹¬³§Ñåš™Áö‡Ù5K…ýïLìQ…8ÇK¯AÙõÒõ‘öXÏd7ÞfÌ×ÛW`O{ÚÑùwéýèâsmþ~bá9ÙÜ&¯½Í½[¶["U$3ʯSpû¶´eü(ƒŒB/ÈE˜Žó“3@”b0ăB+f‚÷®ç3ÞíËhxÓè †;%¾Þï y4†åˆ;ùxé1B“}™Î°aàcß}hv¨±@Pí­¬ŸW³ ™Jão¿W.úupÍçÙ˜‚7X±Î7¡88H„qîsàÓÎp|ÛÀuS7÷r¤Z‘sW^ø‰îz¯mà#Ãß®ôZp†~ ¿™¡–Èý—Ïôð™?·„Çj4Œèñ©Œ+ÞÖÞO øëÝç1`ÁÇñ¦½›¡îXë²=C©- ÷x•Ép4½½‚_V£Z“îõöûâ9¬§Ïw TYð}Ì?hpê'ãc=ð¿NøóÐ{ !_FNþúé;4gvð±Ø^üo­zæoØ(c¦…ô™fHÃ\ùâéDK¬ëO»(`¬2qœ””Ýr½ Y‰úðwæ+_@ÑS”:"cPye²ÌYøD&£?nfÊ+~ŠÝç—‚*·7y­¶Gt%ÁâÕ¨¶]~yl œ„rG0ê ÏXóL·Ï|Ÿ5ÇÝÐÍó Œ>:JŸBx_¯u†Ø¥aZ•›Ý!ŒSÆVE‘ER uÞôyá©äKÔ ùJ$1.¦ ù§»Yì±P@ ‰#ÐBÆf‘õß>a®ûü}ïs³ÓÑùLË·ïÛ5új# !Y¡¯X„–†¢H&±"Äë}eó1‚WWá„{¤àf½]æµ¢z¾r½Îš¢C5½]C)ñ'Õ(ˆ)ÄÆTÇÝ|Öw¶t‚ýÚ: ˆŒI“ÀžÌÕ½‘2ƒ…[ö؈ ¾¨|AYYíÅðº2ôd½ÍAÞ‰!m,.Ç“ÎÖÉGÞ™ŠLV“kPüÿ îya´ "‰’‰²„)nÂîãšE Ãß95Âã¯,:?_ë󯬙ÝõŒ•s?±YíxÖHG³:k\‚;pVt’·.j‰#¤iÒVÔ^:¡_°.‘'(U‘‹ÞÐ6A9ê›Á2÷ñž—°%sÐwÝáz¸Då*ä¶|p“w§PŠ:²ˆ ¿-‚Înä`©¹eQGвˆ†½¦ØhNÛÙ»í÷y«ëNíQ{øfi;Ë£^è£GTô¶tÕbÍ¡QbÄc¦¢#´¬R¶*•sŠeÍŽœ¥>n]f!iØã–¶ˆ7Ö¨cF´èj‚ó5Ñ _w˜(·æ`®äµSOÈšaÃݾ:>gvží×oå”׌0µ6–!ÍЋJ3ãgÂh;­êN M„=hõQ®µ£ ¼Ö½éB r÷ÝòßB$ší|Ùª€|€e‘<€ Äq†@ÌR@|[ôбP@üºtÇâóôÉ͜Ã;ö‡bi=òk ß—hj{CÔŒ cn‚öY¨½"0‹1¥‚8~ªâ+ˆý\ceÃŒ¨~ýö0ûf'ÉI·R‰„K³ª€„Òô^Ÿ¹®¹Ç˽P¡-Ö ©ý-ß“ žêŠ?»öxeÚ~WÛöåšå¶&Þhã]KL·9s<8ö1Â…ÝQeï WŸ§}VZ‰Ú—£OSÝÜ;{¯6/{íNýß[ûm‘ßqy¨9µ7{õœïÛä<ö×Y,hp,ŬHý2LkdÕж0éDý™6ç–Hæ~ß~tpe\j‚xô¤ŸÊ]áÍ ÷¹‚ó<äU)7¤6~›Ý¡Ü=3vÏÂ…ÕùÁ[söóõî€uýòú…ÐÇλÃìæOóÙ‡£íùýk©QÙú¸«àµõŽt´Íû{xmNMëÏÓµà2ë}àæõ¬äÍk㬙øUC °DçŽ.Н8>ûx>:üo`OÁØj KVk2km‚'ŽJH1îÔípŒj0=bÔ Q·8Œ·¸â3Žþ¢\ƒB…Ë&ìë{ו¢ÒÅÛ&ãǸîùÔ§W¢òhT£®¥]]M&JËYl~|ï²çÒV*EáC©÷x1dÊ A²µ›ô‚ ¨é?¯›L aïB8ä5¡ðÆàÇšžª¡X"+zû©ûãìõôXÂ)ßÌ#WË´xÑYÄüçÏ÷21¦û>ÃîgÃEu$´­ËYM÷é'vG¶:jY¸ng;&”_N ôBàö«Þ‹·Éˆ=ÎWPQÌT PÉÔ5c˜˜v{ §wÜ¥®Á¥ ´åÏØéšŸè¯$gâ'zlä’„CPؘ;î>c|¸~ÅK؇¶q¡9õoFÂáúÁg€Õï:Þ­ÀH~^˜•‡šFr¶ÚûÆÂP4¹1ôêwÝ òªø:ðwßë¹#0½Ê홤Â{ø@ˆWågñÏʇ·å¿¸íQCÅ×NëÈÖk~á¸8»ÿ;¶Ï·Óg½ì®Z¤n[Ùbj¬^0„ÓbEŒ \ÍÐËÌÇ•?ÚFdeÇ€hNÈ `s£lT×]20Õò¾ÑzÜ-þ€=òØÚà~?z™ žræïQ§íÙÈÅËp >Ï:·"‚æ2bÔÁ |@ƒGOLÉ=º1x¤B~Ïr®n‡Þßáò±á@Ï9ó]J"¤ 0ÀC›ÄO†¡3 -H–‚ã¿XÃ<4ŒÕvý=Ìth5ìš6EP¡W]Ý÷Ð_ÿnŽˆªq¾6lœÈw‹KçkCYؾ5Ž;LÇgDÍÒΧù× Øäb÷oËHÆ€‰Â‡À…}ÛÔžË:´‚+=B«Ù[hA˜Æùo¾×ü¬htÕ—²ÑÞ°æË7Ý'½ÙvÎþ ¯‚ý”¿WƒÏV'ƒtމÀ+5R3uÓø)c½Ž:öo'*æp*›»Ë×½W7•œZÌæÆR$¢ú­q²Þåw-Ó½¯|§°4Z ÌZš6Y§ØºÉ£lßg[ð`ê‚òÅ;ѹÞû¯g[}€ú…›´_¤9¹PïlŒG¨XòÍÏÔ%4% ³ßmþøºÁí.¼0y¼åÔƒÒÑô Eæ] »%lrø¼øm©o ûztº+×G°AÕÆ+It½qÆŒ@ˆ0ISÍ¿…Ýe×ägŸqÁ(/iðéJñÌ=Ó~ØÒ#© ™f@œˆH³âÏ ÐÜE}ð^WyPm£¾$ª ǯJÎr&ÈFæä75¯MäËeLÝ"f…ÎçÙÊøç)q²­n¾¡§Ö§Åë^5/µe¹ gßv»Óž¡ï•nEâ\ü¦ìèWð¯]ßâE®sÓí¯ÞÝÝ»fÄïïÑ=ºº}·e—j¯#•×;:*ØY:/¶étXžÐr50«H ÊͱYÙr™ˆˆïdŸzPšòüø_ð€3Ÿz‡ä”¿¦åžç[—oŒa$ï PÚ^uz¾ o@7Yˆˆ@¼÷Ë«Ö?'?o}ú˜z~ï¢@:&¦}Ò7¶†›N³5¡Éî^~ÓÛ×Èè€$c˜®¦¾‰Á[bäˆ%¢F°ðr¾óÇ—¢' ûŽ´|>·ïŽW½jsdqç,öj¢5/4ød~µW“û:îÅ~éŸÞ­‹Ý>®Î°=^ŸÝ^ǹóu`CóUÕ>#WÈè¨ïk?màë[Ñ—‘6à ~ûp~_ =Š }ò¨´(yZÍY_/ƒí'÷oÇ»ã ÃH÷¾Yé©ì‹FÖ™ V4‡°b¯ïäüÍ‚3ðoÔlJDE•'‹¿ë®»ÑŒÑùÿnõb" Ò$>ÇžC4:ü<Úʼê+Ž–dïßlF/âoLÊÌþSBxy”èNHðádõ=½>JO°tФ÷U’Ÿ”ÁÑ~ÞÏKH~×5@÷i3Ú#¼ÕÂw;#WHƒR^¼›.™àëõót}TÁ (ljuA¬èî!c$‚vó¦@橈yº²÷[&ªû®^jÁ^ì gÕD ®Sˆþü­ ¢C%¨¿çÓ´ *ÿ>m WìÙÔÈù|X÷(w¤XcêÜ÷éí±Å_-Lþùú3`æýaèCT> Bø«}vŸ®ØhŽ­\…jM±#¾ƒTôÚß¼HS£8(x†åžçÞjú@²„ ]¿/»¨Í}ð®#ì6PÁŒe Â/˜vú.Ø›_©÷Ô®ÏEoA`ªèªül±òΜýî“Ë lˆâ<@©`ÐÍ;:Eü»«¶ ;Ô0P -fFUO1“±,ë#ᆽ}/¼y¡ˆÞu eŸqàî@k êÓs’´]ïfÞÛg›Ö4]n«…u]ÒâH:T@„bç&hr÷Ç‘Á½V¯ò?¬÷÷²äB¥Ñ•#}¶>$ÄÐ`ûYïxÌ™ßÎ&“ŠÆ³Î^ùîÖ·5„ 9Ç6& ·;È$\üže¿¯ð~LWèoÞì2fv}óºÕ ø’19Ž/–‚5Q;íúþÅz/®@@Ž? ¢,ˆ.je&p7#z»>ƒõ©A÷šóîñ0 F:;bw®¸sÈ-òWG’‘“7S|;ÜF<ÁòP’€ê&ÁPuÕoÝ} mù¦T—ãûÕ®ý1 ø_ìFl€§c?V™bkÜÁ\#ãžÃö ÃŠlseêýàG×ËÀ|EæþèH{ÅDMZö°‡Ï.úü~~©\4‚_+Jø,j]Ô5%ó_áðƒ¸XûYÕ8}Þ[RkáÃÎNÐ÷Í ‡’xògŽ=FãÕÍÞM){â3q*ìÅy]q˜;*v´€5mæ™5˜±ëB`¯iÃÊÕ‘žTÖ˃Y êšHš’~Ñë—Ô>n@Üxç€5#¦A¿ßyÛô‹_R/³ç³ì;Úò¶@‘k[–Íнì{W¦¹Ý ùWæ(Û7Qð£çH¬TÄíÚ^î¦zá® Šœ0>÷éº?:F^õ¤c5ý? ÷zo#Ãp½¿a×ò%ªµâ¬½t“î¥$~­?>ÜKÕÚ<8:uÑêB½Î^gu@@vÎß½¬ ù7°½ððƒ|õ²ö®DàSPwÚ±áaÃÓ¼=ÞÐáûï{åÔ¾Ôø_Ö¶Cµ˜Ú¦f?/70\Û§˜<¥A‡Ik°ÅX7WK*tP¶$Ý®âá®C)dȱ‘9 ðô.ÍŠê# ‚Gñ×ß?‡ï¹ý¯érˆö8û'—ŠÏHýù|<‘€ï_ÚYу@|Œå=Q=êkÚÑ®ú¸ íØ-é@6–"¼x‡Ÿ£ùÖo\ß_/¶O· ‡rðͽ?¾ó?nÉÚÞS.ÔYÏ*û˜Zú[6Múè=•šê¦N}48&Z«ââ]8ëȪW÷±~ø  ‹é%ÑÚsÝÞÈgëîèË蕼rÊÏÖ?–ýƒä¾ø/Ù·.Ì÷´t:¡3XXÁ‘ñ€o ¤bŸ‘ìua®m¯5~C·|÷ÚÃË‘I‚òrgÇn ¬aâ‰è@ž“—[< j\º´ºytŒ|$Q ÓŠU‘¼†/NÕ±C™¤‰o´}ì¿è9­ã¶~šóVPöùgñÐTŒ ûG-;;•Õ: ¶ôW¬0y– œÉ£ììXÊE™Ý5à(=…œØÞÞhí» Ä +†å&­mw5ðZ,jáš6þRï}WÛÁÚè´î¾¯_íwªö‹4HndåœÕ>éžA‰ÊðQ¨4uI |Qµµ5¨mmiÆ3áï„›>ŒÉ©…¾ý“\kÛA~G:u,ÇTI" •1pdîðß1¢î\ü“ððã[½ûg©5rx_=¶¥ÞâÍÊy‚éL;@7+C&ÿšÈjEÞ‰w"$Ù„^[>ª>‘Ø!иӡ@" ˆ ú¦pzÍ­ònØTIš êWr^Ï[ãp¬©%a+ôÚN“áí8€bqžòïŸO;ò`œëÄpE¢ßHA>éµÝÚS™îÌĽ="rGÔ¶^þ"ÿrá½×ß'“oZÆBÕw¾Ô7e[l{Þ~Ð®Æ ˆ$‹:9v&\pöîMzCÍÇ…èÅF^H°Ÿ®èw¥ 8´Èr09êrä‚G/iƒ¾ ÇZ&hóy%H[ë²^g xwJE:ݬÍëm;7»˜3½¹¾ËêRj«:¦N.į–õÒª²D»Î9™ÈkíXP»=®‚ͩŹ¡Ý÷M³f&sE ªi͵®q¬ˆ>+Ž\|Ñ—b]Îs¼Íð®éN†æÍXÍ­‘Û¹ÚßMòº88ín=¾t™&C+®®x†6_M^õî*”5/µ @íÇtîÛ›|[‰¾o3IpB9zÆIºìªÊO.²ÝZêy;RŽ*ºugN'[ÆLË@Ï^–¯°åÏN[•yÜk¾±2mÏ>홫Vš‹Á®brðZ†ÄæKx9Óhˆ 0€ä*±Ðª:ªÔÎÛáuC2gšÉкAnP$Ûª¬N)¬6I’B ˜Ó;4(PÅÓšFéC5réJ—®fáÛ"£"q‡œÐ¾a›º7Î8I)"-¢$–Å€A8FÔPpò î$Ž•1a¡h"ª{Ÿ»wªf/VCѼš«‹0vÙàC¼Ù·ƒzÝ+°ÈDK©$Î'ÜkXÜÃfnKå"`߬5:†‹#ÇÆ( •3·ÀßV<¨s²Yº›’"ðÝиV­éÙá"ÈdÀé©Deu{Z—r7]HÑÙ­ÜòU›Ž§·¹^qoÝÚ·,ãÛßHÆ4“ßv ê¯$€øj;ÞŸz‘]§|¤I’>;Ut®·)úôã¯o9³/]ÍÞ n0X±bÇOe%ÕÉPŽP2\Mo‘¤ ®‰aÄ{lê!L¥i^°Œ³dj ¥*`@Âu™6éÈ™µŸe`Jä]@àˆ3)¯ÌÙºe3Îß4hÁB´:ïoRªc¸N]Ö<¹Úàž;/J*(âI®ÄãzQ H:ÛAP¦‹0ÅR`Þ®P ![Íe;¥¢ÍQ8› QL¸u¬‚»Ë*MÞðiGé˜f‹YHÎ¥G0¹§3 X J¹B›¦Ã,¤We[±©½¸ svV˜›ÖŠé¬ÑÊQ4ÍŒ9Í™6ÜMœb™”ÖÍP†XÍØVÓŽ&÷™ˆpLXšiÆÉXMˆ'Ò&w™­ìÚ5ïA×¼Äâ+H§xQ}é4½Î™°€ µ²œÀŠŽÏdëªsÃoÛ(®XÜìrס¡’ñ²¸ Á"îèM ¤‹ÉmíM†ÛmI¹¹66GÍ£w¡0K¹²÷ëŒá\Wm”ÈX6ƒ+73A…Nh[¤Ìn±Å‹o WÓ34×jCCV (ì"OÄzPÖ…˜Žûv/ï­$ˆâ¾E Óö‚½ì"Ãwa¡†iƒŒÝ‘C²†·‡¯ªŒ§èŒ#è’ÿÆÊýúwã#2u„ççsêÛ<¦};è¡Æ†þŽÐU> ¤oü.ýoòsô„±·èbõ|þƒÐXè2Þ ÕÐ ÙÍœ¾ä½{yán¾«á:±ßHhT÷×Õôæö6æµ8*kn?‹MÝ|×rIìªy ÀÃ]j¯1ë­S°ý+¼œ˜â ¼¡sƒ}ª­ûÕæ®y;Ó» l‘†ôù#¯Ý àé£òï_q0~{ï¦õ~^{Ôw+á`¦åÑ·c®ÿ:çéü7°ÚL¢1@‰!¿ß¦B3züdøõÀ€0ˆˆÈ¼`þÖ/þü3s{/ÂZ]º""FÏ£ñ?©¡¨sùÕ4;~îï47ðÔÒż¿ \ɨ÷%K8Ó||·´ÞCº@ãÔÖÃ|H"I5-mˆâÔ4'9íELá«/Z„‹=ÙÁäDí^NŠú­/DÇ>—w68€¼ o«€o}ËûìCRþúÁ¢ÓQUš¦ %¢b…0@G½ûÆu­;´¢nk®pg­ûéÐy‘ºÔ£x0å}WËíPkbàDQ/ÌϽ£e¹55óóºþªì€‰‹öZ¿Õ_82f?|'r¬®ø«Ë9Câ¯ß„0É û×XBýì¿^s eÜÏÍ~#~F4úþÙÚ=×®ÝPýýqëñø2ãßc"Höz~ÑæI+u¾ ƒ—8þôÇ™‚>ï+>¯Ÿ… ¯qÍÏ]&{ç±·Ýt<Æu¡œù{}ÌFà~÷¤þ$üØuCaNúWžÒ;y«›3båd͆ƒ§‚Aa§kžª* r€œásTa‹uÈð'ñ_<•\a1¢þå•íU¾W/çCîÐe9ÚZt2½ì6,l(t\}á÷×·€ŽÈ2 ûõöëúî|{ÑuÀgï±P罕õ¡`;yZõ‹A[z³Oï·8#Wó‘õˆÇ>KÕÔ«â… =£¬mÛÎÎrkÃÛ{laž…%>»ñ9¼t9¾ãƶ3OÀ>æ´z¾¿Ð {ð?€X@P ¨åîfRc>ž»[”>®°Ÿ-8oˆúÍÜѹ ÙÀ…1|•7ñëÜ¢~ïvoX_?¾K€Lø2ÌÓø½ç” _ÔxXé×µÙ> Ï=¯º/îšé‚ÕÞ½ƒ›“=D ü|}Ê H s‘Ù'ÔŸOKŒOy?‚pÒF(L~{÷”u`lºöÜׯ¸Oîæò…ŽÙݲHÛ[˨pÌAÐî´ZqÇÆ p±Âì)ѵŒH$ϤÃóÌÇŠ,T8µÝÀI Ì;½Be4.Õ‡ôOâǤïhÍ÷¼c¸,#2>¼ß‡^w Ye|uhÞéøÇÏ„üPKåíÏ ¬'Ѭî,¢Ù÷6 LY`šÍ©m€½ÎïÏÜìmðkǼ¶µ4lîs]ïI×<ã˜Qán!_²(v­ÅPïPï—ÛÎÁ^ÃA˜úû­ÀÁÐÛ¡ßz£4'¾ì­oÐhÇô_`÷_¸&Ðö·Ùщ!bRÉ}ƒº‡ºAÒüs®½fNm·æ½øVø÷Ûpºw½Åo ^iì'|È?òno EÓÓ•>Ö†*jÕX»1‚”r1}ÞŽ"†Mß½ôwöã„@§CåÒš4G'oD°Z^ÔÅŸ1ÎV™*}¸"#8}oñ,qx ùçÓ$¦qõíM¨nüÓ­¨É€¦¥j2ˆ€ì!F¾òëÜ~f¹`ê×$sV¯:ÞûÚãèøý^G|5B¡ XÍÊÒö½62yï›ð#aOk¬Hh~¬ô >»‘< M|u¡À{' #êUú|È»ïD37irY¥¢4ïÕX®oòw»÷Án.­¿/‚™‘_£b:#áûôÕ¨ò ¸õÛΡêeÔD:"'+J_xhô@Í@ßpÁžðShíÍ^UÝûq]à›®½[WYS³º@¬.Æ %qrl»Á™§˜ÎܱuÏ+>º$\^äSŽ….ýFîïÏ´|—Zﶦã•É_ÛÑQã1Dä[ét¼C”±ƒ:©æ°øz—"×¶hP]ëü/Zõý°Œòú/%%ïwÚŠ¦·þ2~ž°Ž¿… ÇÊÏ.¡>v®FX#ÏáÆyW"”( ÃõP¡¡Š×ª¤ pÃŘæÍ1¼¾`°þnrÊQ}S;y_h¢î«aWŸ]½=ŒhˆVû=òUò‹1|kÑÓL`ñ@ëȾõ› f<{¨•p÷¬­%÷~¼´;¾9ܹñúþ|ùs bÒ¸ q›ƒ—½ì†·ìëhígw×Vd1lÏ Þ3Á$Ö[ŒYCë¤δõLÙ5+õÔT¡…¥)¯<<Ç£¾¾ñ(£ Š 4I#Ï:35Œ õ¾´:…}•Þ?.íëÇ~ã ­†÷0z{Eh‚ÅrçzÂ7­ûÝ÷w@:ƒ+xwÏ}´wòÔ¥ˆ{`‰ñ?¨|~û{T bÊšòÕ›øû{ ¿B²: +æ­¯ºÜ¦dà *c‘T“?x¨É9Ò´<¹eÚÏ´Lx§(ž»Í#6û¯'°2:¸C"ЀÓ¸Íöë¹ìɶ 7çÂCÝLBlé*>]½Á›Â{µ°L„*´i&…hõ~úó ^û/²oe.<&u®®ºìpó6õ 'H”#J$Ù & j ‚2ïI ,F™€zÔê¶$X¥˜£1`ñØ€Ú;ÞAÞ¼0_ˆàTˆ±e9OÙéÉ›ç¯(8,_Ú{Ë~Í7ô|™¯ŠD.õ] fÐÝIíàÏ1¼îDù¦i4bÕŠp>y…Û™n_žôBþ…÷v Ëð;>•¦>_zV³ÅûŠý‰‹®47;¾†EÖ(÷Û}±}øîvza{ôHÁžðà~W5Übo,Ò!4³õ}–všÍýð˜Ö6a•!é›_g¶¥ ~¨¬¡ê`}2vÝððiQyu]꧞ܛ©¹®d“÷ÕjåÙCÞ€Îè{"ÿV~¬ð efýû²²ÍhÙ¼`¡"_)¬Hìž¶žŠC6hó¬é –o;[Éyô<',MúÖp¾‹A`ÁѼ—š²#àèOœžéïZùЏGMcú@Í|G~ùЃòô›ûÞÔõïïÃFÀwŸ)S-¯h¼=áBZ)‘ÅÆB<¸éµÖ2œßB?Ý@Oˆ_¯†›"\cÆGë–þ–P÷†çÚ}¸úû<ÜÃYÞ»cœ“À†Ê­Í£F¸V±¾w£ªcy25åEâïj†DY(–ó¯yjözÀÃ;ýmaè? pâ;å’‰gѨ~,¥¤@Ö‚•ƒ&n_éo¥g1Q÷H|LGÂ>ø¯Uèò@`1é+0mGRM ³fUÐx›Jœ,!^ù?¹D# 137¿g;6W¾^4\b7½sîHÙé&¦ÀÃÁR³¯E*ĺ»rwµM¾îE´Æ*nÜ„ññÙ¡T]Öñ›SWŽEÞ"{QbåéìñÞ“}LË4%!»u42Õ]º3«ž;·—=J×avòõõª˜ê¦6“Ù}¨õo7 f¦µh·IÀ @Q@lHDlaf#2oÖ˜½¨b`"ª-@èBÜHJ@‹ÑF¢»¨%h4Ýa{u° Á¢hrf䣋ø,‚q˜3.E¼;˜%«Pñ]ï^VL&zÚ"³½xgs^‡CšÊ g;¡ºE46Þ!…Ó‘2ˆ«A’% 0Á5‘™Y£SèjÍæDs-Ch‰´™³s+›Mf å6ÁŽ“EͳŽR ÓS:J“O¾ÀàhÙ–@ÌÞ !HöR²dER) é˜Änd+‡9I¨!³aq¬J6›ñ2kt`VfÊEéÚÍRî†-íÐïnyõ®ÕƄʓ§j»†;žšb ,öÄŽUÒ¶ß½v†ÊVìÌí{e]Ò %å‹D„­Ü6*ÈÔqXk&úîîA Èxln÷á@ èúHô} °|Ð;6ÂjÐùÆ5žw¾k§²mŒ-mmkžd— hž0¬2h²¢Èˆ.!F²ƒ+A´¡XXÒy¯®{2JFvS±4¶á“I&½ó¯1Æt/0lÑÅÀ‹¢+4Þk”çgp)—³Ü1‡ßãCL¦j˜&¹ÓPç6 JlQ¡×—|#¸þ¼2²¨ LˆËýlަªw;9ßé˜ÿ«ñ" €¦?/ÍVÐýÁoÀ‘±”·Â,Ä@ˆŽ0À´Q-Oäÿ+UË¿,_†Ý}Ÿ€|8__}lKðZ>Ñahø±ï×˽ú~üËô4À76,sèÂè{~¡ºÙ°;¾i» ÷ï«U{ø ŽªкŸïvÞaÕí¯š8­·yÍ@Üë´ß£¡«ˆ&×¼ËÆ]J…ò…ž!JýlÂÇÄÆ@LCŽ&ùØ Øu¾,€R&<…W°ÎL!¸bhûqï úÝvAÜ®çCœ0‰£Ù‹&°X&J’A¶l¥ëJ0æ,^uѵxædÊ™A±W•rÂ66›nå$×Tkf@Ú Pž§:  +#àlÑÍv\÷ß •uPÚ›æhvyÛny¼Ãj¸ýë€&>>ˆÝÃ' ¯jhσ=œºÁë¥~3 kJsШ1­¸u®fN¡[Q ½¾äl~éÓŸœ!9˜¥ ¥_Š!~o÷Ìuö‘B¼&$çNæ“á>É —û•èÖiŽí¨ÏÖ/qûiD†;£`ÀŸÛ>ŠøowïÓ]â­Ž^ýKs_rëïQaœÇ3½ð`Á7uÓì e‘¥DæJŸ½T¬ÈQ=€4jcíkØguñî‡m÷‚€õ;Ôk;ñî íßu|ûâ«×s®n÷‹ÜdzZö†ʪ9¥ˆºsÜY3 ª"¨ ’k‘<Òbƒ·¦ð͈|{çwô¦aÑyQû6,<Üûïh׳zØôâïÁ‡Rv¼ ?y!úý¬aÞCï{Ô<~ù. {¯`–a±Ä)ŠG7x…&*Üë{>zç·Dp€ƒd,[9tXWbïØ%iojGï‡}žæŒãÞã¬Ô_Vƒö„î2P¸èT w³ݛq.B­UPÔêºìÀºH'Íš­ëÞX«{ê?1ï!ŒrØñ¬Ç=:Æ´Aá«#g·ÃÉŸMkî%Ì<úÞ1?°6WcOóD{ï/Ž{NÒØ^mY% «7Q"Ï6“á}z#DHÓHl¡¸) ȉ³yÔ$2®É ‹¯^´Ë#ÑÜü{Úî ßonxs 81XŸ!Þz̾ ¡(PòßÍè9ƒA²Yý¿{¾¹: UCF¨dJÌËçž¡#2³ 5´æ ît›Í%Iv™úìíÎ-'~ û[aæ:²M)7£áê÷u÷@œÝ¡1ö±ÓXC­=Œ-íBd¸.¤í6þï7¿¸wú>%j÷Ÿß»r¿mcöÎÜvSžº¢÷ª«¸Ç+a ²3s‡+AûسǾtIé[G©«Åá}¹Ãy°’ܜǚÙBcžîi¡{ÙY3b÷¸TȘ¬t1\uËÁÓàäR;Ë÷ „{Ú'à‰Lß 3/Ë;;± Í…a^õõšî›øsËûÅúhlìÉ‘Ð|ëH¡¶Jä7›°÷´þ‰>Ý÷”©*ÕöAíläú}uìãc怴صoʯz†‡¡HÁ9¸2¶o4ÇÐ;î¼½öz¨búú*_^_º"z vP>;'”¯-²‡6 ™¡Àƒùèü1®ëËíWwÛeüÁ#Õ¥}³úaöxŸ߀Å?¥ŽÑqðÃ×—0:ùŒ´ §4|Gª”±{£Ôé»ëfôSºãXág‘o8öåØ[%Ø-V1†Y#Ð~®ÖúvˆÈdÐäëÙ]­Š?‚¢ƒO`ÝÏKÖtêü ûîÛ÷ÃåÛhÙöƒ£”~$?‡Í2¾~¶½ÃÁ(GÇèÄs¼ö_{Ûí÷ zÍ*›ïn/ġǭx+Ê™‘Êç¯éØc‚f1ïcrâz/CÞÞ=éŒ&µ …f] ès‹N‘÷Ö5Üø`ùPаž•‡Û¨àó½}èj€è#ö¬ü„°Ç?zUh† à#)¬ïZR\ÌbéX‡Áú{ç6~èôljQ–»­óás`öÞŸˆ·ôÆ_Ȱ±Ç…+ûd…ÂíÞôÕOS¢ðg9áTa.de»'nO|4{ªî§ÚjЪîOVJÝ +Üøôã<ê: ÷»ííéG·€w¯ípeÙ$x}9 µc‚ê¤"»æüÃø&Œû½šcî=€Ø]VÊLƒE’±?¤†\]áѵé˜äbdªž×²µÐ‚$q ¾ûz=G³âkžÞäÈ+QZâdÎ{á½SW5žñœƒðž³£k†žÍ Ø»ËsÙdŒà~óÆWyÇT¯D9fi¨<·€Yqidzßý’Áý‚Ÿº”„g³­AöîLçáÍÇÞ­PN÷w‡'EÞ|]ÐãÄõàžÛÊ­Õ^Y¼NpôSÐÒÉF ëÆÿL—õý{ëßß?má_GèMÑϾˆG±ýÌ9l:>Ðò#G†ÇLË-ˆˆ÷ïPž”þÓ}•¢{æ9ãV‚|41¹æ¾ø}CÞ7‹Ç¶ÇÃÊ­Ö6ˆ™yu†C‘49±eIw7Âv+ÓtûI´R€€2³ó+‡Ù?"Ö?T‚(b#Wµ!öS¾`Éõô² îÛðÍóãÝEϨ%ž„†vŸ«ëaéO—ß}?:²¸n_máCrµ»¹LÖàU¨Žé{KÒ/m¾Ê’/®³’¯b摹‹­›ü`8°£,“ yådürû˜È°@ü¶~!‘®Þ¾îN¾HkrqR OGDñ ‰0Nd—Y|gÄÍûdÆŠÑ#ÝåìÁ Æøºýj{œò½t·àP|úkÒ?£Ú=܉š±÷°Ÿ_£[»?eŒ_Þ¬Ö´~Á¾û+ƒt#oÅü|ª~]÷Çí ë}“LÓE-Dfý‘Õœ:©š÷WÈf˜ªhƒŠÄp;ªÞ ó€”ÖØоf«0Š˜ÌšŠ´%9ªØ4¦3´Oë=—Cp ÓHU"*Ô”a  {¯ =¤Ímòš ‹T€ñ°Q}TЉƒ¡ ô²½= ]n#´.d»»öðM©«Íròv†ï˜É¥:ñM#“gW*›•ÉJéÝbRU·\ò·vjCSÝ]XÑ‹™kuèîÛºÍÇÈïJ‘±Røõ=¾É‘˜ ¡Ø€©åZ$!/y«¾ ¬ëÙ‘h®Uo mFð5Õ¤ïM Xw›Ê°Ö•“;Û³Fñ)ÉÂËoQ–o(‚–äÖe›37É¥’,J¤ªõ0PÓ·7J3e×H¶Ô–&q×VsVívX«ælm*£©ÝNÉÎàk#;ÊÍs9w¶0`Çc…ϬëÙÃUŽ(«7AÈGMb"dW*®±Ä»ké ÞÍl’öh\ñ!ÌXªñV\ IÄtEŸòfàâŽí"Üõ¹²£»­‚)MjÉè½Â¤¥²²«QÔ F%i´®#Js%íæRÈ…â:©w;¨Õf§B…­4tˆH @0P"Y6 Y!õÖ—½Xôfl^ÖìÚÊ­;c`[/FÜåà,<Ë„^œY`(†sm¡ÔRlØAM›å—¼kœIU³1T…¡šÒTkWH±]Ï +†ª:g[TnÔç¹DõŸ|© [Âe¤(Ñôé$•VÓEç±=³ë;> ”=*ÁÀ‡—ÕJôÛ;8@’Ä¥†Ò %Ï¥àÝÆH$¼ÙÞÝ€«3¼*Áyml3ï›§Û3H†æ¥Ûí½c÷»TM‡¤ñp¦¯]–ÊÄ´ÉIDàOÞôæÒ#—µ°¤8ÈHCïl€w@yõ›+ÍA­©w“z»¸×ƒÌ¹ÉUUàƒÒ D_zYÄEÒH¦¯…ûê ô¹“‡èÀ‚F÷ôå+°Øãpº +<7±±²®$|þu÷Fˆc@­0‡\ÆÈA[凲‡ã¿l“‡ÆÈ7© û/Ûª}Äúm…ˆ"wT‰-Ԓ榎ê™ýî,$3áÙñî-I½dÏm½Þ·g{È•kqZb®Y‡q×ri ¦„ìäŠXÓBXBÍ ê¯Ð ħV ~ï2ý¸¨{œÅ‰í½dså½fݦ©õ/X1 ÁøØwl× _)°{•¥’Òs q¡$ðÅÇ ’<ÊC;íÃ`ŠBw*Ër÷Šü>ð©îûgr^1˜*åé§™8’ålSU;šÈoÙ&_ºžï+@Yåã`ËN.ì7¨´mpn€+æ…§^õ´®î~®Þ‹~4Húa¶tvztìY©\ÒnpyËÁà7ðc¢ëìù‰‚óÞuÛ¡ ì3.ú¨¶FzSË'6F5*¹˜3|¿_¸ÛíÀ±aûç|ÕqØæ<@®Ýc^û“Ò…ÞÕŽWôŒïuîþ…æy;ê&Òv¿~ÛWôÅj–ékzËËŠ÷¯w¤x}̸ë’xßÄa$oŽ™'fˆ’>„¬döýXþ›µ}yN½¥]Ͳ÷æé9=3½Üæ­ßãRs àO u·^kÝœ^u”B\6eêœtLfº:b¬‹YâI=Kf©½pæüØñ$r²7Þà ˆ;ð¨•K7è4¬BЏÞ0kÙfÇÖòyAö{=÷_ÊÑ4_ŽíK’Ÿ ùßÊoŸß{)×@ò6—¾ïƒùOÓ2òéùwÔ2›¬UÕÙ-îvâ=6CÙÒ…W‚¿fJ÷MJ™´÷h{‚ïîR8ØöUHÄ…&rcãµ÷]0rìu9 îîOYÙQ£Ó,…(ÞËϼÛu9_zLß?¤9“=ÀýïtŒ0 ÌaƒØÐ‘§°uŸ×wHæ~öׯæ¯,…ZíA í©t‘»[C/Ûp1`5¨0÷J¥ÕKR$\nnÑ×R™¬ê¤ðµ8ž•=tt¿riÕUÏcéãtyvnAð9–-yeÖëv$¤Vg'ûÝ…âϨyÊýz†gº|$CˆᆵlïÀ™CÀ+¹¼Ê€Î£,2]a›vǘ ã~ò¿´÷å³–7Á­è¯rÛˆ¾4õ'€iŽ÷A¦Ž¾¦¤fˆW󓥋Óz€Ù½ 2íd§ðíhJ°é®š›‡,U5$[…´B‘X]ÖögÄ„o?—ζt(2<¾™ sóúºÿ°Ú|éÃA‚¼³Ðr¹kã¶F·&<6ÊÐ œ¬d’î®;jW¥ ¾îwÐ’ö9‘w{U×wžÑ¯“«ãñ^¦ô?Ã/F%'ØÀt1kÆ4é 雕ü‚>­Ùý5gé|VЩ¦P›‘|0å!=kØ-™Á^˜¡~HŸ…2ÛŸ­`Ðè[8?K{AßÑ0é~iÝ“¼¯Bkò/¾ëžGì«ÏvhZ,VUÕ]<³UVר‡F.j²QÑËÔ·ÌóÌ­BVgg´ ªÃà(6Øá¸>¡hw´‹Ÿ;_LûF~®×&Yؼ¹ÉïÎtá÷@ÊopêÙ#GãKájüÖÈynhÄÆ,-H"—ˆiƒAöøí½àën÷¡´mQéjv"!Áí{I`L#ñŸ`¤<'ïólŽ´&l’v@«[Ç_³s%Hs¿ï}]Ò;DÕG¢2/²P˜¥W»³¾¯3mŠíõ µ2Ôï®<À‚ŸhªÕlêÎç—“÷tê?²ðD%} üeõš·1ó2Àôû6T¯Hîb~xêvP#yÕ¾Õ^šq”~óc·⯄~¢­Kß“ªD_Ñù¾ª™‘Φ+½C öIÌ7ˆÁ¿Uæ¶©pˆ‡é¯ªÔ_ Ç ¹ëˆ_—°¬9ñÎ¥ “Š|ð4²/ò¸?Š%²ºüDZxç44=®ó“'t¦ì“‡èÝÉ•‚rÅO^†±rx®Q<"ª•¨Y3²m£‡‰gŸke»É©UÑâ·ÎÒbxXÓë Á¹É@B1 7´45Ú¾VǪô}TžFR¡ñ¯4p¯&0H6„YR“¾¡ÒÈ_gÖzËùPV3ìÈ‘ ¶Þš#pºÕ}‹¼d_뛸— 癲$ådl‰:~ìJˆ%5¯^̬[ë ÜÝ­;9F°KÓu‚2Xåã Ž}µÝ¨ã }ÁÖÑÖNB‘5Bµ^v'£U¾‰'¬<«aöʼømÎÝJLâCgK‘Ü÷òbê]aq1TH¹hžW\©·bn^LÐk¬°òÙZ03¢j…¶¨FƘã÷.Ôµº?÷•¿P,‡iÑÕ¥hÜô±½{s:Vs˜Ÿ‡¿·˜øhùAFB1$(@ÊØÖíöM}?GU_†Hîeg!'‡õT!4—5µÎ‘ï"µŸ%2-½íC3rÃõU_.«bÅÝAÁw˜¹2ŠíÑ,wêV‰ÄtîrÈ(\:­MºÕÑÎŽg•{—}¼]¦ÞÈ0|€3Â!‘9îÕ1["û*¬¨ª†9.$ó½÷á=òõ/8ш..>½êlAÍL60’¶Eô»aB#¼áÔâ W§õ{ÕQÍvÁ5tHÌé)Û‡H-hh«ª'ÃÝq ’„z|d‚qدS…­W¤H>`½à¤¦Ö~äk6‡1…ìuÞguÀK¥„foíä÷=šÝ ×:¹ë«ƒ¸[´úzr}Æ5¤:C3‘àAeÒÖädòo•.7#>ÈFòè qé7˼ß9¬âìÓ‡é…c•™9•5òCwÑTQø¼®Q•¿>ûd~ û¾‡á\"ÎLî™Ñò*)£ã‰J-yë,Y¼KK Iõ\uèL ÅZ͉¥Œ4§A¦e«K¶0ÅdïÇ.çRºç²I{ŸˆƒnŽOw¯ã÷¤w<ަüUÖNŒÓ&jI“–¾Ê£T(}V Ĩ ¹Lý“ÙžV¤i }•`‡ƒ=[û‹ºB¸©­š>énQFžZok©è[ò©±5˜I9`ÌÄ¢Ö ¼!Õá’Åûg¿8wšši_N£|©$¼íÜ"Ë5»/nzå[‹ÕÄâ][§q\ªìŪñæ W³Ñ³J«‡\«×Ó{AñjÖÏwP×`ØGyͱUNƒŠÚÙÍ“@ÒsıFû·z†a¬”Õ«4ûSÊ2¯+…ÍvéËÛBHçgðw¡4XÊRQÕ˜°lÕTo+vÂÉޡ̰û:ö©UÍy‡gå.ÙÉͪ8Ø©¤{z‹8Ëγy3Ô·g"“\’ô!Ó+l£/’#‰6æ.óy*Ec“y¶…]ërs¯[ͱXxªº·Ö|²ö{'G8.F‚ªÕsKÀÕÉ…NðU \Õ*[}xMöR77Vž)nEî \og9­F`»µ[µ†fJ#¦™•+rh¢±Ó™ 5d‘Êù\:¤åpÒEŶF+.ä r)¦Fðn©Ü“¹¦Ýá8ò±’J§™svn™îR36øÛo•ß:(=Óxíµ5« ÐX”çûpËööðªýUY›£ú™VPã·á‚ºõÅçÆ °úû>–/ݬf-7—º°U0°è=ÐIÆ!ši‰M;8F ™¦Ò­€è^‡1̤6æ&…À-ÕtMN‡öP°û7ppVŠÖè5ÃņÍÇd=š'QS”¶ÄÓ±XC›œ°R%Œ`™ ÝI‚J÷† Ë("£¥µšpɤÀK+P¬ï.5¢Ê[RÅ,²-Sœ.M"s å– Kè·yÌ+Ó£v Aeª–-²„µjÁD‰x6 VJ’4D,ˆÚíÇ £ƒ ¦R2Å*dw àâšJ‚×fP7ˆ¥ j#•,¡Ð˜’02ÿðÉÚWü:ÐnÁ¹2ÐÏ+uud»·äé+û×Ù&‡Y(·´2l±wJªn{9Mƒ'ëDg.ëÉBò­>ÍËìYŠÔÌ!of1ËC¥nÉBE_@‘»ûËv÷Õ—¬È-LH){i†½Æïrþ^kD^¹@PÙûqžÍè„1Aš¿†ÇÉ×¼_ÁüT ±Uù4øî êä,3j;2KQçUqÞŠõ‘aì$G$$Z&¥6JÊ@B;ÝJ>“#¢wêD†f—x»èyÞôýÛØ¡9GÞ\gç“I[£Â0µ6ÞyŠžÁpí#¶û®å¬ÓˆÒf”TÚ$f¾ûŸ·Üß Æ:ø_ã±Þ÷^Õãá䦑å ý/÷†ú‘ÃÎ+^aй×®xŸ>×Ç>È:vϦns\ãvæYŠÃ¾xjhÐç*Äìl­Þ;Áx³…E–-Œ˜NC›É&Æ¹Š¦Ýçš½÷ɧÉç²mE`ªDUAF‰ ,G-{î{Îuyìë o–s^"”Ðò+ÈÂs‰ÞÁs:‚#D@•Ù£p 7»ô!»wY5o¨vÓŠ¡RØ¡Š®kÞ»:úFúqnçy³®úçÍútÝè©FE„nĪÃ#ÄqÓÐ(@»`8»WªRö NNOX•b T$ ÍG¢8I³JÓ.` $ìOg 5£Ì_Í'G€š­ ø{máö24¼K»½,çÆ`só<ª±)™¼w<76G„9¶ š3Wè;zsK4P9:äÎgvè è  s Í/¿!˽[Ò´Ï“~}å|O¸@I©Ó° ÆîŒ~Ö|}W:>~ÍÅ|$cSØv¦¯k3*ÐÝnSG'vŽi§ZñÒ8‹öT¯hE!G©Þ\gÊŸóüÞñÇ P&–ý¢Òü?hšYØÚÅWo¦†ÆöÏß~ØÍõÐ?¶CÛ48ïàz®P£Ÿ«=­šÒ'|ïFt‹PŒÉ€–•G´¯3>>)Kâ½@z,ÙÛðÙ­$^9ö\V.ÁœÂÞÈ·fÄD:¼G´NÕ^<Í}û>ó™Ÿ}j‚ªøPTŸ¨êø(emðøwßû6¾ÁÌ/Ï„ž š¹¥ò Üx× úOMÆ~ÚtvÊî.k…N¡šy« ?]‹sRÛÆ6t'+sÙ’Âêo™ùÛ‘IŽÞئJ=›–¬¦A§!2P”¯Á~7+NêT{T7¥½&޼·8=ƒ½N5'Mw¤Þjå¸u =éf¡µP¤á½¬íÛýë`W*Ø­A—~àõ¿£åPö±îùf9>_pë:²÷6*¬Ë›´+N­Œ³Ì•O]M'؇R½«îª óO@ú=ٞɖ3¢/£]÷l!º^"¨sÝGˆ0ƒû„;v6†ûÅä õìûaþaŸ¡Þ_}g#â¯îŒ1JÅLF|®j%<*g¦<|^ÇÝô Ù½õ3ŠE3HýÙêâöhú} ?@r9f*ý¹³ò©-Õ 4ÐÀjæ}öäããó ®Êîšxö å; Ýp öôù&ôÃÚç[~#ÏcOgJ¸Ö¶,3Â=ÌáéÏ áÁÚÇÂ5ÄÆ’7a/¾ é£:·ß}A}íZ~lõ{Šo‚ÄEBò^&BÕÐfb{%û^}”˜l<ø{ï±ÔǶsª¾„ÄÖϺ‚Dh–9öLçØð^›³¯dzöïIIb§Eîí¹ˆ•’ç†Zs£c2)šã\½:G˜¿xgïA”†ÁÖ‡‡•o°]ÊVP _<êáÉÐÔDpõû¶¸<ìsyÖúj³ª6Ôn¡:½2pÙìxDEsrG.HÙy9-•/ѵ¤Q}.IÂð|ûáõ«Åûœš+I×ñs2b〻Áuõór*®'%Ðß|ÃÜîGß Û½çëƒI¯é0~]Kø+ÅÇI`ýå²V”û¶D[óØ2 œ<™‡Ùwa…ogˆ÷+Íý %žg^ãïHÇU¸F©¡FyJàCÞ±Á¥Hiz˜d«±Á;ƒ)÷<÷¤]ùOwÔôlϽ‹˜W 5ÃÇõnP\|•˜¶t¾/îÎtf‰àð½?aÖÄÎLœOv« ×aWÀƒÂì±Vë+6ÒÙ ¡yÞ•v7x!xF0 gÀdZyU¬ ºêYôs$@Â=L)"@à,üÿ ¨xÓ§šóñÅXZ÷³Ý:¾eì¼·ñMB5¬{ÊÚÓårÄõöy° óA‹¾ù­GA«MaˆŒ‘Â^Èx¥Kò+°aÔágÏÏõŠôa󼬯K(ñt¡•#ÄOÞœûà6Hg7•$¼Й}–þK’¸Øôøq=;÷†Ñ3G KQ+A}™ì\{”(\Ùûfx¨"ÑËOËÞ ý­™\ìC:Ý üC›òlcnþWŸ!œà¾€)ß­ñq øTR;š0C²¹­ønÓûs?_v{ÆwTÖ+ µ½6´I}dž&3¨œÍ‘bsn»õãz'ÊF')ÙX‡@ˆøzÆáÏd¹aã Œr<¹ý~¬lŸs¬,ÍàZ aõ`¸z—–ÓÏWšÃæ÷Î!íàî’óéÝW¨‰ç­3 æë¶µ,…à§+›Þ¼„%„]zu7kd) Px'„}*¼ŒÑBN Ä ùÜkóTúÁÕ¨B•Ú«ÐaÒ_ í¹ TÚú G$Àz{ÁÇÃìX%n‰©²ûEßõî4ÄùÁY­ô×AûÕ*åâÙŠî”WêIŠCüm®œt¤(ZjW§¸î—Ó·ºµÀÑOoŽW5¹ð’ysëÞæí…–¯xbEð'ål=Ꭰä{/Â>̃¤ÓX$ " *ûËR쎠j½¨!ƒ“Þ¡C~«;¶ëIW~§¨>m»Ú±8¨pè×ÝÀx:OÚKì™ ‡/5:pëׯÈeÁ$Ž”%hV› æriã°ó)w¢ø^¨Í ±<¤_=jÆxÐïLé‹'¹I[¯ ;nСB®qY—›2/¼k»¤{Ä MÎ7q‡‡Z㜃ã­é\\=5ÔQ ÈÅ­°Ýµbgßÿ7ùÞàô|ëwƒªËóqI¦’¨§ÿ{"sìû‡¸?_‡z¡R”•Ò꯽ÑÀ"ó¿|C-¢e l ¶„O‘{€_Û8Ò×#2ÜÕµ·“~è·"^.]''öM“~í¬žDÙc)wI3™¶«¾Ñ\L _Kš2°Š›NÚ}ŠÕãxÀÝ;–mâ™ ¥–Ôõ°44Í0èrå@ÃN€¢=çËïD€xë¾8>9·`„<`K^ÇÕkr¶Å"4Wå"P¥ÞÉÍÞß{ãàØÎ#ᨼÎá Èÿ|nx=üœ¨ƒ*gâ¼âè6ï6ˆ1ݰ7to¥ŸÑ<:Ôöº=šb/¹}ð}ðŠé.Vs[u®m½Ùî7—Œ648ßV«ŠE¾,Mk «Ó–Î×MmÜðúÇšÞœš£ ÇQ>XðiJ$ÝPœN;@ê#¤n­¸60Ô°¾Öñä©þaÙôéCwå—ôŸÊ]§œ½Pá\ÈÐøIÀ—Ì…úL\h¡ZݨÈ|M<Š)Ÿ¸ý å»<óû½š¤Œr…Qv°Øòw&÷~¿I¹nzjiÝ9ûÈíVàÓìFùŒåTÐàVçMSŽ¦â™µÊyJHŒç8>ÞvêëpG†ß»aƒoÌzû•>æÏ¯œ^é Íö†Á÷l?´Æ9©µÅaŽíÚw±ž'W~§"»—Ó’@+9-Ç?âH^¾a°ÊCNâª0Žb{zÎd;ñ/¾£ÞAœßkÔ‚=îùgã?Ó¾ö!ÒñzvÞkóÙÀñt {ÝÝJß“Nl9óß’'î”t\5ÜÕw}îïc}1yŽIÞÞ0ꪀûĵÀvÀ¯÷ÜçØ¤äö£Ù™‡KÛ®žØØ8Ú3[¬ [á„î˜|¶íAAøºP†Ô7<0 éN]ôîdûÊzäÙûï»íœœ}%9ž¹dI:VêÂŽÇ/²ë¯/Ç0vx7ÁÝ’dµÔ»0p½½åkoÍ›äÛê‘Pg0¡Ôo+A•7m˳NÒçÒªšurÓ*r´ná黥C–ãLJZ™œšÇÛ[Å×,'‚s…V_gdÓŽV#3}37ÌØë]UUÙÈKNž§m u£½A<œ=;[Y܊׷ÓCmõ]¼“/¤âÎìÞÍ\¬Ëá;ךvoMÕ;êîÓ]z¹“‡ƒ-iÛ w¹Zñœ’‹n±NË~"–îc£Blº{&¦ß˜zÕêš™àruÓLö³&{hÖàzYÔôîvÚÖ¬A=Bnâ{¶ŒÎZåØj=ho zmÔ¼°Nm‰cB!öÜ·-©…2Ü@ÙÙ»0 j$ª4øP±Ù‡ €·yºî5 ‚ч+n”ƒº‰˜õ¬ØÂä*k–js\z[aɹÁoeäã(ç6ïR ˜Í²£k7o‚&@ë­ÛÍÚêòcºn§•Óv‚H54æ(Å&¼)cõéQ±\+±äS]3¶ÅW§{lÑ߮Ūdv£]á¦KU™·àt'Í3+ƒCµ‘ÞG½Ò£àD]™är_]ž ÙDtƒÄÄ+­ˆn4‡€‘Æó¡¼Œ4ºh ‡Ä Pœ‰Ùbl›8hO¤<5‡4ˆ»*r7ÚwyÒjó.¨æ:¥"²ÍŠ˜²œA» ÒêØ-2èÃV…Ñ–òö˜¬y·1ç]ÜÛZÔ7ˆõÞƒ‘S¦œ $©ÕÙ„<°;9œt±AwP¼É¼:Ù!M º¥{atk1¡m©¥®XÞ²²èÍ ¥Ú`”hÊ[UR¥‹ÝÚCR2n3›ú3;ô*± à'=ÞûÈ>¹xýtþ­X½Y?8Ôøä—¥ëªìÁ‘Œ ‰:0P›Á“jÆ2ë”ÉÅ];s/"‰  E:ÁóàdêÜ^4[1Ý멸à >¹ª÷—á„HöXŸ®Ž-É3"È-Œ‹‘›oZõ :'ƒÀw½®G#î€èçWk¸ N“ž|á¢m¤IïXvMBÝ›ùx¹?ª&¾Íƒ„ ´{€ø|,F#,­îѽã?Óž±îCGð~›Ve F‰xÿFœÙó{Yð•¾÷×~(Ur0¡U™l‘ }ö†ßÒwDO^s g U#J¶G×Îû3õåxfþ°ÈÞš0£‚DJ€ˆøøyYzùøY/™ÀssTÇm ƒ¿wy¦#r鑾ÉCôÒ~"`JÔg3ñ]CL/?Ô;ºî:§X š¸¬Ó?‘ö»Á¬Àb‚èUy k§ ¢™©µBÈ4âÒÀÐá?s.žŠªï^ÊŽƒ2=µ‚@DÒÃï¾ÏFè¯eM÷QIe%’Š6//Ý%PJ¤÷U:­]=`°Ìn*-Ý!ÎBÔÑ™³’,!¥S[ÀìÉÌÙ|ñu¤A‘>Ñt'pk¤ú†‡_Ô5æ4ÄÕÈ­÷pHRê“LU‚´ÝEš»A‹œûO)7jwÂCH^l#Ò´ºÔ—Ó>Ô'M‰CÈXc‡1»-IJ«˜$5§7å³ôNÆÃCšß†e”A8[±<,vàc >Ï—°¥rAþ@ùm‹²ô¡1IGD¹žHÍ¢`6O"¡ÖDˆ²ˆ‘9ƒª¤ü ë¦hµCdw½¾/€În@hB YÊuñ¯”+1†°ÕÃê8ÅÖ[¦Ÿè9³åÊ‚N{j²¹Šº£?^SÛ:œöHó˜aU´ÓH‰Ž!\´¹áBBÝY[, }R ^ÎÏTÉŒ!ðTŸÝp>û²‡¤×Þùª³‚ú’¼Ón4ÆyªÖ‘"ûqðû ûU×ržg8¬3Ûu–tÑ“jÛá´Eõ„ã¡?qðW@8QG‡”Á cØ_ˆå.Pà—÷{VsµU/`öø2`¹œÁ|Ôˆ^'ÆŽ$Žwè±£WÕ4[^G¤|]ýºeT‰“²OŽ@öcÛD;>îìhð°ÎÝyF.]ÕXvyàÙ3rƒû­é…±¿Np1ãÊ|Bó©{|O'³¶Èä•ú*`× ŠúôïÞÏžQ‹Õ#A_!#ˆ­˜Òƒ4|d]v¯æDîÂ.ƒ3òõ¡`ý,õÝìµr-ŠÑµÓ8zµ^Àd ùeÌŘD}·ä®eÝ’KQ)ùã6³‹1=8ù*sbþù@|¨À=›¡=•0„^ éGÜ[ËZk¿´WäíñîÀF}MȈ—r]Õ¸²Å@Mg.!D-a¦š¸¹˜«º›ìçí$ÆIB~ÐÅ5ß Ýu|Ö€ýq»ë{–Wžm—¡ûn'ÝÀ‘Ã+tKïy!‡]Ð>(Ò÷_Ú}_^| Äm ö禘ÓIL_¼=ªáó)`õæ{¼;åc3ÖyÑWåô@ö~·;½ž~9#ô¡¿y_Å?‚°Àˆƒ€ í‰ô[VÙ óÒVyN~Pøhêy|pŒr¯S™Ë߸Ýõ[ÞºïN~³¶v†ÍPŸk=X´ïÙÍÎ*•À©´<8¸žæ7™bˆšÛ£ÆŽŽÝÕ±;TÏ„s‚óÖ}ï@4_H®y› tÌzǺ"6B¿¾œú­ŽoÐý©Àù_‡ß l$Ÿ`Ñ? ÀFü»â][×zhv¢ì«òCB°s<:qFœçª~ãD5¦ý‚$XOÜNÓT(Œ!$’‰B-ÎÏ{÷¬A±ÎÖ gÂpʰ#XóÀeÇÐE$Ú?‘Ùï/‹°9¦žh-Ñ?[íìöº |k~v2‡?³Ü#F€ +¨ º–bˆá0¶×ê®y7—BjƒÌx³¼òF*yÔ¡\éi:/{¢Ê7Ñ_šö3¢M)‰3ðéùæ È›^ |â§Ùž¸Î±ÅæpEŒ›ò^Ê®x†Ü ól}󼧮Ђ÷¡­ŸW§Ý;ô&¾ÒÌéê4˜‰ŽõÐêõ½û‰ ½!š ÕáWžÔùÇ–÷îòù¡îp}=„411ô ‘yÅõPàC qýHzPT„’{ßpÂçÁ{Ûïlª¯‡†À¯>q{ÝÉXzÓ½"È@ì\èlÌö™9ï:©7®OˆœW“•ËmjÔ'¼ÇVÊÀ]ðcx¥$Þuí~¯X !làBV4ÃÙôÇÞ°A$ƒÃO“÷y]îë<ª€–ãYšÔ=–_<ÇÖ;÷žöSC]™g~êÝÍ'¬ÆÐæI”2c7Í 8ú>×W·Z ¡¼.k¹îp=j‡ nÓE)Ì©ƒî]Ãg¼º"üUbÓ&óÛ|‡•÷²£>ë±ÇMŒÑ£Ýr >¥%A1¾VvÌßÚ÷EGÖ Óóí;ø|q¬š(—ö#A\í}WFN’ç}}Ù´0j“6jÆëî“°åpÜÂ|yÛk‡Œs~s¹´p,ñ÷ÉÊíLÀÓ™Šß•ÑÙÒ ÜÈû˜‡V 1HO¢}è'3òõ|‘ö…¡h ý~ÙO:úìš)ŽÀ~¤º³áÁœ¯ÂúDûõø~Á÷çÜ;xW¼0Nû³À_¸¿¥Uì¦jŸÓv罩Þ_ŽíU—]¹Rbsî¦Ú _gT×SÍM2µ°D{¡ÅY¸Ôç-4Pù‹¾­iwæ¶Ãßty™Ï¯íëçéo§ÂïðÖÈS@hÖn*¦üðß¼óÓCZßý¹<»n‰Î⋵ÀÇÀä_=ùßÜö ¼øp˜D‡ž ›±0lX¿Ÿ ˜ÍòC÷RDuûò¾­ ¼‚Þ8$±ñà³öÌß Dà×P˜Ç¿Z÷Ã$üvß¿éû¤¢DþbŒ‚¨r” (†@ €˜@șѕp#,N$Š”‘LŒÄŒÁL1!@ÂPB¤¡¡ÿåU À‹„…§)$BS2Dµ€èSB`â#ƒ† BX„dQAAÈQ PI4Aˆ$æ Z@CP4#’ @MH‘QÈP¥È@4¤D†Bº”h2 Á”Ð@+Pd$,ÁI •ÄsIËL–±À‚ŠH•ІH Y¨…†f‚$&je‰@ª–ˆ”$Š`b"I!a€˜‚ˆ*„¤ D¦‚h¢ BV˜˜†$„¢U‚T‘ˆš–(ˆ€¢ˆ’BJ¨b…¢ª€%‚‰‚Rh*P¡%bX"‚&‚FIhJ…€ f ’D¡I* @ªIB)H€†•ˆ T%RA&VH •&FTHM*3(jQ\AÉAL„ÈQh3H%LÃ,0¨L¨Â¸(†ˆP‰ÉÉA'P(EgP8°¬ˆ• ”Pb\”(4.¤e HT"L!DÂÀp„]## P², ÒP¤.vÁ%ÐIC$JBK"„£‘вC@*R’BÒ!˜‰¡@$Ê‚PR’J£"„‘A0B0J²P’$’‰T¢ÉD+-¨’J„PÐR,„)TD„©­ B‰BP $ )(Ð*4€RŒÀPÐ$-!‘’@3*Q % ¢Ã"Ã-P¬2*à 0ªBK*d&M$+” C-0€E 0PH„PJ”ÌÒ…É*„2(D!% !*BB±‘ C @Kµ+AJ¤(C @ƒ@ DÐ)!-R¡RJRA¬(RRP°E …1H*HJ*´!C H±( J„’©M$‹ˆLˆÐ‰,‹BP¤ ” I"‹@$I@Ð ­+0„- ÑAJ Ä •C"“A$EPÈ2H4 ’@BJ¡ !J±*Ä”(ШRH,C4ÂP41"I0 ±*(”+”ËR¬@R+0K ÉÌPµ0“"ДÅB4ÄŸ÷NKJRdŒ™–”¥¹’am[n 2d BUD¥²Ú¬­–ÒY,” hÂ-”¥m’¥€¥, VÒRZQŒ[J1–”Z޵E¶Ò”–ÒÉd²Û( JSY,–”°¥)JZRÚ‰K,¡™˜¶… a€` mdd²Y,”33)KJe¤ .˜´¥-ª«@-²’’É”¥-´(R”V2Ù,”–Ò…°Ó3-ª¨!BËQ)B…²ÆADUZZ¶Ë,¥-)aJ- ,²¤)JZRÙe– ¶ÔK@’"Ù Q032Р‰I‰§Z¥(¶Õ XÀ–”Öf.¹B…)JÛimµVÒ”¶Ò‹e¶Id–”°°°¶ÒÀ°([l–F … ¡% -¶ÔKjÛ ZYe¶…¶ÔDK PpµQ2€P[Jf2é G! $ÓajD”†LÄL%!HR”TKjÒÕ¶Ò€P %)d†&e¶Ò–”´¤‚Ûm¨ˆ–”¶Ùm¶Ël¶Â”¶±–¥JY%·a…Ö ,µm´¶À¶ØÒÀ°)JP¶ÒŒR… JQl)KmJh ª¥¸%¶ÉWVÕ«XŶÒÚR–P «e–RË0U±m…´²ÅUU¶å –ªØ¶’’ÂI)E[,²’”°ÔKm hR‹m[HRnR–ÔJR‹m²ÙJZRÙe¶Ò‹hP²[iKj"Ø[F@ÂÕ¡j%4 0˜JP¡m¶YJP-\’, -ª¶P¡mDA¶Ò[e«mTDK%¬d‚¢RÝ2``Yme””¥)J…!Ki-Ñ™ˆˆ‹KUm(´5™m³Yˆ‹˜&e–ÒÕ¶ªÛUƒ Ul’ÔDKe–ÒÖ3)EÊ(Y d"Û ¸&¶ÚªÆ-,,Ú¨!d””–ÛJP°°H$-¶Û-À†ɒɤ̶«Á…µl¡(K-¡¤†b …… B-¶–Ò”¹™–ÚRÒ RÛJR[m[ m,±iJ …€fbbІ§JiL`DËÂÛJS“--[@ *Ù)K)J”²ÚÚRµie–’’–¢YZˆ¬*Ò…  -(Æ*±–Ye”(ZQXÅD¥)`Z´-¶Y¬™‹e´-¶¢"XRˆŠºÌÊB€P jÒÛJRÛm ij­-ZKVÚ«a%´¡BÉJZRÛJR–”±"Km´¶ÛÿVL0[jª­²Ë m%%µm¶J,,²…¶Ûd²RË’ÈYZRŠÆ1‹aIImU`0-–P)Kj°`ª¶’‘m YbÛQl)K-[JR”¶Yd¡B„-²Ûe”²K$´¥¶ÃI“"ÒÛ(PZ²Æ2Ú«e(¶Rˆˆ›™™DM2É%–#jÒ”²Ùm! ,¶ÒÚm²YÅÌ™ ‚ª"«K,UUZª%(J”¦¦ŠÀ`-)J…«iKn¦‹KV…¬- Q-¶Z«JRÒ”)EV2À(PcРÁ‚"­-°µe‰%%"ªÖIV -¶ÛJ-”¢¢*Ò@²Õ²ÔFFDJYe” %ª¶@cD‘hRˆ–[J(Z¶Û%¶ÚYe·VàPB%–BÈP–жÐ(¶Ò–ÛB…µm¶ÚZ¶Ö2Ò–¶€P[ QŒ¡jÁ‚ÙB¡[m«Kl P, PÂÕ²„¡Ëm„d„®HKrÛJ-¥-)r+!¥–--ZY%’-¶Ù,‹amµŒ¥)m¶­-D¥)m²Â”¥’Ë-……, ØX-¶–®`ä&B.Ùm™% là @ -’ÚR–Yd-V2–­!m %–P¶Ð¡K,¤ VBZQl’ÕUV2ÂÕ²È@´”ˆ” a)e–ÛjÒ”¶XˆÆ[pµƒ! ’ÛH¤¶…«JRÛJ,µÒжÖ2”£iEU[m mªª‰e¦dl¦Ö¬¥-)KVë 2LC2Ò”Ç -¶R–Õ´¢ÒÔK%–RBÛ)E É#–­…¶HR ˆ€l,-´¡B–Ù)),²BËVÒ–…"Um)HX@°B€P´¢­¶ÛK,¡`X93ŒªK‚ุa†f$$XH–­–Ûi˜a…¨–… ÌÆ2JY Q-¶ÚR”¶…«BÕ¤%(Â0”’… R–@´¥ RÛX‚I hs(Z©‚ЖÒÔ‰)!,,-–[t$H“fUZ(22P2&e¥*I…–*­-¥)m¤°°°¹˜aUÆöB”Š”€¡I5VÙc ¶”²ÂÁUl–ÙJ$Is31†c€ÆYB‚%¶˜˜`‰e’Ée……¶Ú¶Û%¶¶@-¥¶Õ¶­ l B R–„(BÛBÕZBÛ% - P-¶Z«mTKB…™˜ˆ¸Z¶a! fam’ÔKm-UD¶Ûm¨– @-’ÉL‚L0A -¶2HR–ÚÛ%‘l–Ò… ,²ÉŽb%”¢&ÍèÖ¬²ÄJ)m¶ÚRÒ–ÕU¥$¤Š¶XX[V–ÒBÛ(P]àa…Œ$ ­µUQ-«m´¢ÛU0&e”P!C!˜¸[e (H¶ŒbÛUim l¡Anf.Z«KPAQ-«–å´ÄXa‚Ùe–ÂÁPAŒ¶Ü3Œc iJ0Z«™ €dQ-!) P(@¡Y†Xà&AˆÂ ¶R…(´¢¢*ª%¥Ò–Õ P¡i%$[j …-V1mª¨–[iJ(¶Û(J–Ø[m¥ª´°, d(Km m(«am–Id–”Ì̲[q#˜¹m%)m¦fdµm(¶Ë…¨–Zª´ ,²¢­µUUiJ-¶–ªÙd,…-c)m m´µV–ªÒÛj¢P-U¥–P„¶’Ûm,À”¥)!I m¶ÂÛ XÊ[Kh[e–Y l,d -¡jвY)m¡BÂXXS(Ì™(LsÊJK,²Ò‹m¶Ûj%¶–­¥)J`B¢`¶Ûc“"ÙJ\Hd Ne” @‚­¶Ùe)K!m”¥¥`05k…¶)Hm””–±Š«BÛm–­¥¢$) «m²… ˜a’…2ÛIƒ ÊIIH´JR’‘im,,РˆÁ‚­²Å¥´Ã2 Þ‚fRH[m¤-ºI2…´¥-–-˜Àš€ÀÐP´¥ÑaH2ÈR”%–*"%–ÚR’ÑŒ¶YKim¶Á ”à -Z$„Œ$¡A”¢ÒÕZXX-¶ÚÆ[m…‚­¡APA€¡‰ƒƒŠ¸¸¸bbK-Ua™˜Ø´²Y”¥$²ÄJR”$-TF2Ò”33 P(ÚQUV”(*Ûm´”¥µi-T R”„²Y-)l²””–”¥)m¶K%¥Ú«iE²Õˆ–”TE¥–[%’………¥-ªˆˆª¶Û(¥¨–P ¶Rˆ ¶”cHÂK,²Ëlµm–Y-¥«mU¶Ù@ X´¶Á…l²Ä€$l¶Ò–Õ¶ÚQÊII)m¶”…!m¶Yl²ÛI¸pB‘dÈ I6»·ÿøû~ûù”h2'÷aËý!þùÿ/Oþ÷Šå©úN)05bùÏþ£+¡P [°ù¬¡ÁžÁæÑîÒ»­Ìù¾tŽa¿þÿZAšÛþJ¯‹Œ6›Q Žºúer--B!â¿ë¶$uUB6„îPá¨ÜÐ×4,¸‡vŠ ÜR¸«åâFOuÓmS¤´fG€;Ûd×óÁ$æô”\ŽÆžm\çþ=Ûݼ”Ç% !E2 XmœÒô$¸£¹ÄaÁ@™móšSvÕ¬É8§Lï©–"öò1ì·ï¾†1=ÃäþÞƒom%Åú"ŽÓÏ|<}ŸšÁç7l9º²yãÎb™:!@€ Éñç™}ŒMüxõÐj{o|¹‚±‘ÜUG]ãÿJGÅš ­y0Œ1ªzÞ¶óq×Ç¿¾Úµ9Ÿ qãmh„ßÖq耸Y­<€ZifF¿ßæÝp=ºwá3|ºRäû_ï_#­ðTˆAêyÐÔEÿ\8êDšòól Õº±·X°«íÍAŸ¬©ÄÑŒ¸îELL^ÛãçœÞ5@ßuÑÁhØá8ç á,œ®kò„:¢_Ç^5’;¹òŽùûU•\ RÄSM}4#µJ.©Ù)E³6" [yÊ€TU … š„x•Ø+ mQ3ˆ‹9ÜÖ’‘`R-LH8e¹‘R‘¸öß+Ͼ»7ÊjIŠß<“mœLà^û–G±§ £§_нÿ‹^ÎGN“ŠÝ7Q¡|o ù¥Š ~#¸™ P¨¬lw2uHQ£’’Ç‚›æ€€"ó³ ÝI 'Þ¾WÀ‘ Žgz w£óÊFÄ%XÖUT°igäþ⪀ýó;Ô±e‡ˆ¸¤+ÀåAŒ£ÐЬŒ¿KGGÎ"¤3H!‹›™–ÛiÅ‹]”ßfqÂqMŠî»˜ÔÐCêöRèáuÖ]Æo<k¾–çbX‘¥¦@Nü‡DÄ7"_m^ÿY?,_ܼ#¡!†nd-ô!§¬?n …» a©³pÄÖµpk4 µÒ–´°f\›žúãO±Äf1¹¾;[ãëäx ‰Bó• ß?¿òŸû÷ç~Â|”OôõÀ¿dDöl~_çÏó5þ“ú‰ý@SüEG¨‚(¿°€\XèŸcëóßm…@qù*Bp>Qå£õåúOV@|M¼Ÿ—„òsçŸ]‘GýU …ÿŸo¬Ÿ9/?N>-¿§ÀôíXU# ÐÀO¤ßuýœ!†F@¸­žÇcò‹ðö¨ÿ»±ÞþåLâUã6è+88%eÜžþC0“P6w-ì Šðc`Ù`rÑ•=^oÏb»-ŸØ§}ö%ÈI¼¡”(= Ó¨/®a˜d“+¡TÀÄÏ}À„!à:ÓÐCÏÔú«÷~Ýl¨›nŸ h÷x ¸Õ¦Í©NOž÷8/Á¥ <ÙÙUžÏÆ®0"m­Ò}GÈyøLt™U=O  [y÷zûfÚÁô}S„À?÷å­§€µ‡ÏÂ[¸þ¿'Ò†ÁJ.ïµïÏø! HÑ ú˜qMvçâ뫬މç8ÁéC­¾Þàæ“cë ¿Gvû0lnnÿ ~pæ2:>ƒü„Õƒ_´=@å;7<úÝ7ëÛ9‡Âî†k ú}¿­85ŸE•My*ú˜‰ )d\S–µcn²È|ŸÜbnl sxêþlÆÃAëžÆUHÕJBÀ‡"]ÅK%-º6w0ÓŸ}e>:¥&TWábyÛÜŒ„K?F´€ž®_PA†»=óûG÷‚¾èþ„.[D.Ì·'y€Ð)¯8ëxÛ#¤Ê@®0•„±…@Æ€f]‰ tÀ¬4’b0rtAà ³H˜ºÑ™#¤µ%… R”²f„˜¥m‹•‰yXÙ vµväÏ6â p‚íù¨¨‚º„ €…u §xM¹èfÚÈ颴Yáu¤([E#ºMeŠf¨¸•Ås SL×6bnæS8"‘˜l¢…ÿ @œ¨ÅŠÙ8q„k´¦@sš8”öô~С—Ç¦ˆòé™»CÒt»ɾn{QaýÂ{Õ™ÙÜçÏ“äèü áù0žHAñÕY#$~>N,ü³ß˜Ñù=qÔ ‰éêyN¿  ùɆk@a""V H›x>G?ò?{LñGâKû€èçp¿´øòhï‚ÏUEm“ä`«¡<§±>#ÞõÏ•B ÕÙ÷Ñš¼LÐS(7ßAÝ —Lª ¸4äPv‚ŒƒÁA〠’Èô5ÑÁöyD‰ƒul¡fʾµô‰²‘ ~ ‚Lµs_>¹äøÏôrr×ÍÄ®«ÙùãχaAàž–Ž £Lá! {‚x±D¨×¿?À3ãߟá¨~_T?͓݇ÀžSvÄ+B´H¾±°aBNŠü–¢°‘þ}Ý$$"Û¦,€BÁì°÷`vUûäB”>Ühpy¥ œ»ç~ iû…ò9îNB‚IØh%FFcïðh„€EO+@d/c€ÝþÞ6;QCŒGñüµëpäfò¼Äî%<¡­úýw}ncmô(›Y× {ŸÉÁyÜ+Î÷¢”Zóàô¸w˜eøêdkÎ6—¢vyÐ+Œ¡ (ÈL¶ÛH LäËØ.‹ÕµE`ªrª\3)âõe4H¦€  5ú[ûÀaRvÖ@̎ƱÍ RÒ*©ÜÓ ”jRJÚE™‰ÈrÏWiËYæEURÚfDß7a¹Þ <£oÒþ´˜+ÂÁÆ; w·,âB[ÀdQÏ7Þ°‘y2ƒ¿åÒ!¢èþcCè0N&V÷úJþ·ÀŒ€Z‡ÎG‹ƒ Ç P™Þžà²€†îDÍ€aú{&¨øW~ÏáE}}ƒû;ôxP?0áp‡ ¨H ¾"¯1"¬9Òuà ü„£¨tî9üãçdÌñÛñ£oáZC±ÙžC‚þµYâªÐ/à/„{= ˆkN ˆà‰üµ£ï‰RÒ‚þì³Í!(=YqT;¤§÷࣯³À†Ãõ—7ÉÉU"„S¼àÞ÷aUE4DÆöh8QC_‘äz»1;h“¢kyÖfºžzüÏœLŒ&QˆÔU` üüãNÌ›T3ÊyñïåÁ»ü{¨%š[gã±82fS]ý9>wä'"| Õ2G†EwŸ; ¸òg¿YEñ+ Üw­®õ¾Ð$Ѱ£ð@RåÒ°`°¯~óò4~ÓõK×ÝðÑ~Áƒ—Úì´7Qèe@MÐzî0XmáX@‡Ü;}mõ5FçŸ~v*TÈ)â øPèÆÖ§˜ŸÃƒïɪXæC1@|€ zräh,@ۃ×å°ªª•ÎÁ”àmÎÉBz)ý'柴Oñ¸üxdˆÞ…̈:ôÛ¤ æA¹Öœ# MÃæM i ŠŠ"6­ˆ9fac–œ"Û8Å_ æ‚à…ÜϦ>;/¨–þiø|n¡úÛ%Nô 0ûCŒ¦ÐZ§^ ÌŒðº7 ýÒû< îh@„7{€¾ž‡×±Ç)ŽW¼œæ$WV¢ËM tcãZÝ £É±@nF¸: Üìz;òrý™ÖüÇâ^Vï¹R".2aMÍó˜8Œ ””ѵß÷Õ™¸Ž}Q ;÷™‚‰>ðSq~<›':WÁÁÎP°IÊe­Œ4a ÛhhI«¾ã“ = øþ»rr8<]ˆ “”­}r•¸ž‚Ú|§ŽMÃÅ„àï„;ð§&߇èÀùuL9*½_wˆ’ŒL¤—øÐwôÅètÀw@‡´ Òñ¢‰öŸØ4£D€QHP€ËÛ¤  ^L†3‡cÛÝECfæ¸3ó ÷/WÞPNåxóý)´‡ãêöO+^ÓÏï û¿¹>d!ç,S%¡}å]A’ƒ4ý­!Gã#rFB²½}¹rö<äþ‰ª“¸†C ºŸ(=Ì,$ ôh‚|Ÿ\› Vι'fÁÇâ “ñ¾PØ|WÓÆômžcãÞ÷Ó¿\ÞÀÜ43Álä‰Qdሟ9™_'—ÀÿˆÑäð;†ëºnuãóf±Ÿ>¹0ïg:ø5÷U±Bœ ¯hM5EM¶°MuAêSã}>…æ“·j˜CökiÛÖçä]=û?þOÁÒ£|)àþïÁ°ž‡Ë×  Ÿš¾ºcñùÓ©ÐS õþy á?‡ÝTâ"f‚ƒùŠ­ª3쀈@°¨ ÅžÖür`䂚>"ɾÁÁµj‹;`Ý*ø &܇Öh9È%Ç¿=§ HO¤¥90ð¹üO]9  ŸÑÇ5‡§’R@Vh)ó Û7‘0áÍèÅCæ©¢Waˆ";v0ÜŽËð&ÏiìþÏ3¨Á à‡¡¬YìôóbV‹^¯«õöAús=¼Ÿ&äH¤ ö~:Â{ão¬P ÿ›oÚ¹ª¤'ÅìƒôR ..йì\ôO0Më}ÿ«ÁqÞ\¿úwü9ûÈÞ·ÜÜö?!ÿ›ë;‰úÙTÏ0‰ £ô“™¼dbGS÷÷êp‡"H”-J/â\ J/í“D¦¡ÂNЙ ‡¨š-”sp‘I jš‰™˜2É)‚h˜e¥*( hĈ±‚¶…`+LŸÇ B‘d¨Ñ`âOnxÎÉúè9j”ÆîBªy‘L‘NP ?¶@Pó(…ë"'ÞP÷=ˆRçÞl’é$PRw‚ Áê'Ä$Â{¸€n)TOô£ «Tm­ ÒÚQóÜÃI4 ‘>Ãõ“`ŒÄzó·ãsJ–„£&{=)W´c¨q Ë AÁ\ƒFk ZZaŒdCÍLÀãCü‘~®8)â©( „O||ˤˆ‚{\‡I˶L)yªb ‡saW±½½ÆÜk’àpZ žªˆ…A¢Oæó8¹1H(£BÊt(Op4PÃû`žR;ÇOX§I ½ç"*&–hœô‡~áè~úA“hž› cü öhŸøSúÊ挮¿¢dݨ£‰K—NÄØ-{:ßML‹ožêØ¿Å,¨ ªÂg€ÔŠÉzã(}åÈP¡É%ŠB–hQ)•„h ZJ…ˆQ J¡J¥ A È\š¥S$(¡”¡r2Q¥&Š( r  ¡ €{bÅ ("“¦ÆoÅš„F ËUA_õHTaØ”E—û~þŒÛ2…RƦ{†T³I<…d`ŠRu?´(@”+¡KõJBöqýáU­a¡ˆE@De¤j)h÷9ÿ#ëÇ/sgº· ÁQ倯‚!‚¨Äõ3‡êzNžþiÀ´^’È$¹Ld :¿ÙÞki-°"¤·Æ´FŒÁìs!©–aˆ„›£â„ ê7ø,^^ÝOÑþF—øX¶Ä0 HAA`‹?ÜÿÏ'4jÌc¡ª6¼feÎÃíC]uUD‚°‰'ÍWÙýÒ‡N©ô^»/ D‘ª£sê}œ=³;»ùĆH¯åƒ¼‡üĈÓðÔÆ{Ê –šâó9, ~Ù®½²é$AßKÓ»‡Ù¢Ç?Ì~l$u*gâñƒßÌ"‹¥B}ÀußÄûÃÖaÔGióšÌ,ìÒLrìhRêòEÏÐ…0í)DT‘-ÆÃi L“4ÅM4Ò5ACT´ MPHÑIE!RQIT4TMÖx\èyàA¬r¼H˜—­`†èй¤ÊQµ¦±q°’°\°Æ1ÙM¶`G£0 ¯‚²»£šl€Ë3!^†eg .†&!J€†^Ú T@¬s¬¾’ìv¿(Ï%à5• !”Dœ•¡`1yÇ!f¬l¯³E8¦1*”ÁHAHl,àõçÐáñÈ*Ç!PŬ®E߹Ѣ“°ÿIl£€Ü<.‚ä&Î0~?Þ¼^>ð}¶pv}[P×]ký™&þ¡í§ë ‚2¥jRRäÊÌ‚%,¯™­ACYj6L¸1båR¿îLÿ;5–ÿk€²Ê6ÐàϲëA¼£¥ÃEƒ•&HkJ–ŠŸ £Êz(Ñú±ÿfd ›ÏÆ7¢Y’5ÖÀ”j¦` ‚J~ø'÷ÁŒ"0W…N[9Ϫ‰ô óHù}ˆzÎ ÆA(¡6ðøŸÐç'küd>0ç>²û'¶‰S­YÕ0àhĆ®´¥VFTò‚«Ò‹‡=ž:)B#Ñ㲘Ùx h¤"€Ôªc‡.¢Ð’o „à%"oÛ]ël:ÈKTÈtÏ+Ú=fTš‘ 0‹ 1ËF¥&JV–‰im*o 3fÕh€²­"y] ,㊫˜ƒ„˜gQ ê˽ ¡åxÛ ³ &§!çHØw?ËÃy²U€‹PÓQPÒöZ&Ï ;aóÌ Dµ†hÆ]÷âÊDã€CJ§Mkß$ ¨3 vsEJñÆ€!2TS zèõQd­¢«ïñ¨f¬§•qŠ˜“*ì®±¬7˜/82ar† [(Jã6hÞ‹¨®` 0Kq *jƒ&šl=ÞG$XD‘‰‚²XSaNG%+ LÇM”AŒlF뉦Ò!±‚Ñ¿¯_^è@UÔ°¸íLÊE]6;ƒã–œ ©E¡jp~í‚m1“IÁt9¾5Àã<¬ã]ÒûJSŖתï»eW;ßrÓ…¾ù3:˜ñMŸ¾1™Ž¨J…>‹¸3…ï÷tWB-¨ÙPĬuqÔ0^‘ EMö(âW'ø¬2A‹¶ñ´´ï®ôM`s 9¯áš"Ÿ(îÊ†È .5*ÁŠ (>âqôýuÜêuê@’ê%JE‰‚J©™ªj"¢™eh(¤ šˆ:ÃBÒQ+*(dñüJ3Sj¤àîjGGl[^¶CI«žœçJsÌM-D! L=6&is)Ô'cŒ' ¼Ÿç¸TNÒLq†ßº¢‰ùQŒaàzq©[ïÖäödøÏìÊ‹àn„Ò=ƒN#ICøƒ$J= + %O &S'_Sï›ÝÅ Ðæ#¡ÉB(ˆ¡UCÌSQ?D:ó&DH¢*¼,…>çøÊl9? _lx÷{‡EvPþƒœ“ý´#œPÂ@#ëßÐ÷Ê\BpºñÂï?<}=>9u•ä•”…4RP”L´!@RLDûfTŠ*Åm¹@¬X(AH¤EB€¥(j™€*šVŠF20ˆ©)j–„¤ÈÂ&i&–&Š*”"iZZ)h‰f9íBP´•EL­+IR19JQUH°‚¨ •+éÏ ÃߣÏÎ hƒ¿3:×=6!œìfá÷ä/0ê>)l¨[xxûÿš!×ò±NÊ6¡Z¨¨µƒHÕŸ×ù“YŸg×Yô÷`hAŒY‰Kfcj &èD’< HPATÔ’‚ XhDkû!«ƒªP`cCIšpÆ5i@™²®°ÜŽö4à 17wL4 ±J.é·Hê“lÓS{­6'W7Þdr‘ht™™[Y‘FÔ§ï.µþ¸k5\.†9B )U­›´l,¨Ñ5…·T&ãù<Ì Cl’·.>²5LÚõÔwš ‚…°±ãVØ © 1ÉÔåÃcv\˜—TÃf¶š ™€üBbkIÌ·—7dº¥nðª2SL´Ó â¦Ã(‹)§ÅtvÄGêôš:¢ 5/i‚áB£EŒ)¾©´ä–¶ld#r¸£6o[Ù^¡ç[Ñ·2Ì/<*xqÃ#Ü Ð`³&0O%f1ì âó#ü»¹ñ£PšE¨Ktœá©ô“90Ú‚4$€«0ïD‚ %Vê«õƒUR Æ(ÅMìèãÄÐpùÀÉ"Æo\Yâ Z*AêŸÉÆ“-jƒâbWg bçÅõo%ös"CBÑB¦j†¢Tóœ¼Ã‘„ˆ2(ÁK`v˜òR@Ý’„SB¼Á'™½óÕG¾j'|2Û8l6!a2&„›@arýü& ’^ÅΗ¤.Z’™³Ì4X÷å:3 “‹DTt­Ô›6KçL„ài!Û·ŽmDœÇ Ä› 0$d§×Ãçüº>“¯)Î(=$ÜÛ°mJ•…2Ù›AqÔHi¨,Ó!¬L[#ˆIŠ0œû }xý7–é8Bzòb‰l,|i_ÞÙÐ< P>|û÷¡½c¸hÂyèd*°HDce4š¸sEq›…$…< X¦€Îõ°  >Ó:º¦[EÜ{H,ѯȥÝ˜àÆ¬Îœ%™˜’øf gmð]RÀ­&f‡DÓÝåo†‰Ú2L ™¡N»î¼à):×c®ÃFÌÂÒP—MmÆ1¶Ø-ì?Ë×ûÿ?œÓS-1£ùaŽMùh|ä6®@ ö© )ÊjTäñ&*XJ!£E I[”ælê €‚Å€Ù@áŸe£wðê°=vÊ#ùÎ%-Ú³´,fœ‘yèËqGpý¬ÄÐ+Œ:5ƒ+-Evn–f ØÑJ‚"ø®¥tû«Õ ñc,—ÓQ&™›s½f¨"SW‰:Š oˆe¼@ùw›K–6ÎfTš@ðCLõ?”ÍsR ªj]Sôxlß~\‡¡Óøœ¶m•  ¦Ó¤ˆf'ë¡Qàc-¡1ùk0æ©ã›œ¸uúâÎ!nÚ:9v9³q6ÀU•4Õ`,o*Ê€%‚ZûøEðÕ‘±Ûœ ¯;^×ZðÞx¢%Zù£\ß:£g»†JÄ#샆QÕ{¿(ÙO½Ù•ÕW$«ÚÌ6ßfè Zõ#{6%’µåúNí©­Þ–ÎUwö†¨vUoáà¥õÁh†i‘“½ÒhTƒÓ€µu‰6r»ÚüÆ5ÖݦïGbù ‚K²`U'{ ©@èPšV¤TlÕÖÿo •’‡ÀiqN¯Y¿Ðóô “LJ8#;D8Õ“Lè3{ÔI„Õ#VZk ¡Œ…ÂÎ C…«(J·!ìgµÞ·‰%z ïWHBñ­Ÿë÷ö„QÞ OÓ²>¤%×–;Úà9«ºa¨ /!²ÀUm.Ÿ!nýˆë;²pté(…€/‘‘¢ŠÕ(Üí FáBÖxu7Ü_…Õ¯¥¹„ ~ÎÒ¡ËÔÅè·L ?BJß• &°÷è/M5 ¡Â¥iÕ³@*À„Û:Íè¯6šmÃ{çN‡w¾‡xÞ;)ùÆ=vGFßF æúË%•2j|*,ÃÞÎtuXAÑ›7!:§W û†!c\áC(§Å½íF刂 Ö2ì,ä0T[»UnÖ@Âæ>ì’ü`|&û߈ ZŸ¸PGB¡çc‰‡¼¼Ãnwó€>&ðv‰Sûó½ûÜâÈk‚üÑ]ø(¹qïêìç%pÕZ)îj-ê¶ËêhHw$ä3Hõñåkø3LÕ þ鳄¼¾ÁöàOÞ!÷0B-¥L oL4G§¤²:yi‚/ËÔ¡ùùzП)eÊ,òš†VD8VS¹ëNfr³Ã®€3˜töC??LjiÒbyyÏÛ¯®«›@¢ŒÕy€¢HË»  ,ÖUæ ºk6ó. ï6ßáþî÷»Ñ²_þ€BœÐ!ƒXIHtBC`Wh6T¥’ Wb- ¥à2 ×–¨u¦x‡îÖýdcÚ  õ(½¦/†A‡Çââ­"pEýf1gc#ãB~ñ€t/Š~Í0£r Q³T€Hm£¸dlß0#ªª£01|w¢+ÚœòCoéßÊùÞh€AÚDôu°1TE …]Z D(¸Ò\Ta¨XV8fb‚#™qUF £¦&+i{´U‰Äª«7q)ªšˆšÈÊ9f4Ô &éUˆá¼Áb ‚"¬ÚJ‹ ]ÐÖ'Ž´†‘a§%šüs ÓEŒUb ƒÀóåÃ,©Ëg5¬ ¢êë¸7…•Iým5á&º=ßÒoâŠ[ËS»+FVŒª)öÐQ ¨±TEÀjAˆ„w[¼…H¿D·æî)އŒÓÖº@S“Ù¾ka«ÛQ±¨RЦ 6¡¤©>› ‹õ·š6B’h°pÞ]B¶ð ¨4Óó!Ú~p  `~³™€dt/ ?• œ?„Ü·| •TõÀ 0/†,FÆ]{ çŸàJ–×BèdOsœþòM/h£[N-àœzMßZ83 þ}d¡Õ¾Þ½vÌÙd©MK…bc0±†„T) ˜)FE9WDRÐA*`Aƒ‘†t4ÒAú¢n[Ú“¦â: Ÿ™Ùä¿G­~'ÖDáñá/—n³ù½ðb"`Öè1°ðAðZœFO/!ŸæOñ³é@Å/Ï {;Â2KhG ?8Øl†H:5ŒRàÝyL‚ô•Úø•ö¬Ž¨K ¤ ÂèÛ¬ÇMÿ¦r*Ñ ¬=w»BäÉõœÜ˜nRúæÇœ ¾ýùúä¢ykêœNÐ?2ž£ðÜã݉µ+Áö×Od~ù³Éº|Œ·xvœ“ïÐõõþ-ûþ Z#]yîÏ‘ÚûZRN¢a‡1›.ÝGBM°Ù»¥·\¿“gDŸ™èÕJ“sóöCÒ-U‡æ†~O/P ¦ ¤:?FL2‚ÀO™CОùö‚šåO¯&î>½Ÿ|Їžù¹Û<êÇÎði7*˜'\r!–‘b©1GÜ øò}»ìޱëð‡©È(‰á÷ù‡«Í–-* T¢ =ÏaÍ=ƒ•¼öÂÈ«4NBŽ÷­>R¬¿œ¬ü%9¼¾Y£F5 )ÊìÙÍDb„g‘áæð;Þg¾Îj%›³¶®…[NdÛsD¥3½Ü ,RÒîdŠ¡rÐ^Ð$\>Ðc½P2Œ ½=aÍ<´CÜ¢¨ýµmS”I1Dh =ý~hü:ôš+ãËÈ+³|ò@‰çhw)‰ÚPUU5Dk° „y;É¿ßv¹Õ>¯_Ô+jJIJF<¿þþ!ø>O>Óí‡ÞOßÉåãñ‘¨PñÂgŒ&Îþ¾A­Í‰ö¾ÊC°žä(Pq „(\†À Ñ<¥}¥i’S°}.«ÎþÿoŒ|~èåGƒë8qýP$4QCW¶S2cyC ùÒƒûú!*üÑèøè(y=7›14DIµù;‘®ˆ©î<¸0‡Ç+”lŸ»ùŠÞ¤~ÙWçÍ®¯!ëà¨GªôPn*Ñ!Ç®Ïõ>z^—ÉМïÀtCÌ•ÖæÅƒb]Óz5ñêYňX_Dþ»¼3¼àÝûqÒí ªº¿p³Q£ÖÖaɘ—ßÇ=vd6K‹(“Ž(3¾¬õ¶µø2Å,º_¨44¡föUõ1 gÊzîH¢PALFê2žÅ…ÀÜ¡þHxƒ”†ê¹!ÎÅe\‚€gK.­œÃNÆË›µÞ€½àp¶¬Vš¢µŽñìt ¾ EdËÅ!€4*a›‚„£‘½üÚá®î/ÍÃn:o§0ĈˆéˆxSé(gÒA F"¡ÐÈWÛçëqfåsçWåÒwINŠq1å49N8ÏŽ²ñ1YD`е”TNÏL³ô„A<Œ)Úñc-À$ÞñrlkØtŸÒþ¾õq±Ê§é´Ï©†[ë€ò…h"aƒ–û€›åÁ6Ï¡ rñ@†M(1¾ƒl`ì¾£jw’Àžø "ÀrÐ6hXðlrlÀ±¨ ¿°&8kQµýY;Nsƒ³qÖP2+j¸D4@tR$‰Ã&qÖW—G%(J¤€ª™½`T%!K46#ûþVœE6=‘ƒB½ ûíñÆèþÚO”b¾`úèSm{Áôh=Qꯊ.-P!;Èjc{±”*)¦[^é-0$²¡‚ ¿OyóJ!t 2…!H‚!‚ê´âðø3ÐàOdÕlEñ 6áË€ÂL<ûÂ|*龂wßççM­c )+×Jº>÷Ñt•Tb>ˆ˜ã±â‰ñ_ˆtGƒzœ­Nëî}‡z,f°b.‚óµ¡ÝãéNµ×$/sPwÅbb<@*@Äš£DPå‹}„O Èßpv~ø¿«à/ãÒv¤ ×ß6òfŽöî3ŒxЉ$.Ž#É®KBõeˆæ\ZÕ‚ëmÕß…?èÛôßÁEJë˺aÏNOç#a~Kt¢;(Zî =žÂZq!ÉC%˜@£N[µòy:60 hKRà4 Aƒ:ÌtFãìl;ϰ *%%!ô”OˆRÐ`B‰J9ö|=äG,rh¸ÅÀ ‰ ª‘’!ƒ¤ÞÙ64‡žo«„ÛcF9Ëc~vË1Ÿ³èSRü‡ã¨Y]g,&¶Õ ÉÝVÏæÌ†ð ƒ˜€ç<¡±ÿ€û“•–Uæ1"PrŠ(©UyÚ:ꦑé÷Îaç5ù¼ÁóêáÓA„Ää'À²¦{`Øiߟgr>šÚ»ƒe¥Ý5®J¦á[‘Y³$i)H#òan;ž‡bUd{1hY‹r·è?‰04˜í.<zÓÇzøý¿²IÁ5Ïði·8µQe(äUO —‹%ºÏ F˜ƒ'"˜ë#qº[3uW”x„Рá˜Ö«3JU*ó9Þ+îΤ©Ô=HR€¼Á†ìBç¼B®‰E;°•RÙ#ºñ¤üΣ÷CHд-(R­ #JKÂÒ#ù'£ë¯?§S_»Y¡& ¤!ó˜€ÿ,\) Ђv5¨£zûŸ>àDŠˆWެ®Ó šuh9®þ°áù©Tª@I…ZP£Þ €)¡)¢’)J(i)i bJ(ë=ÓãMß¨ÈŒð‚ž¡}"LB*}˜ä…ãoxÈÙ2R““—¶åˆ&p7fÈ7€Ýµù3€Oï!j×@úl=2…ûŽXÊCU R(¿"¦~U£R¨äB‡0(˜Œ" p0bvÂÈÛÙ†ų°b%X ÈN‹`Ó"ÉNcÈ¢¥„JzÞkg)‚NªMm† -Qfób|µÛà†àR|ngÖv ¨ÙH±ïï­Î ´¤™ ‰šBˆ¨ 5™?˜2$rKÚ1Nx˜P„T+ù‘Âj†R$P¡J !!)"¨{ùÒõÙ‡¾yOÝg@‰Âd~–§öìÌí”"í($dXõzŽOád%v!}`€-Èr‹‚‹ËÀ}È=š|Æ<§Yô| ö÷ÃçÎù4§°Ë–80‡,xêš~NŒI¿\:l†Î¸V9Ùœw 4­¾èmJƒŠ FBmÀ„Ê®êv¹Ζá¥åR7uÐøsHîªû‘Häœ(¢ú™…D>ðâ£CDL2Å5HuÌh=Hb]8d1Dx1L Së‡OÖèh?Œ¥ v5™ùù”uHŒHÌÃt|œŽ±@AÉ1ÅSog(­¨61Ñ?òbªÎʘh£% “Ðþš†‘Ôs ¬>9UáxQßæƒÚ@P@#*h<ýÊ;Ð ógüp¬>пvlLaéFÀ,‚¤ÓLQ$ R-TÈSH´ÌÌÕP‘ÐS%LƒHˆ$D2#+ÌÒy›¿óô~ûEýëõù4Lj™Md­×ƒèâ<÷òÿ`h¢¿wH(–‰ü™“öî LýÇèL§ñüØ¥a³Ýg7XnÄ „±MÕnÕL­ÔÂìÎOk¤(;äh2Yå:?±~¡šÊƒ¡SU3"ŽRYS&hr:›¹ÅBž qïr"l2—°Fg“aJB­éàá}1áųӽ· %@“³—2ļ͎T´äYˆÞ†Ý½CÂ¥Jk_ÊaÑ¡U³òÑUCкˆOt*ŸhúA³¸ ê!¨€[jQøÍ/Âã×ä6BÎØ’o> Y@‘þ-%‡Ê‰vX`AQàç‘ÇpDh4 xŽäˆ]ŸmÎ Ô¡ê1eyÞŒÒú|„Ïãp°íOÛÔDLÀ9àµSÇGñ@p” º£ãk}ôph}Ÿ˜àü,òTVULñŒ];Ãq0âÙBéWŠWŽˆ6“ö‘ý'Ñ8ص[‡ÇÑÉ¿»®óòQkÀýi>~8ÑX£â=øî¦ ç!ô:4WMRAOÀ™;o³~σ۱³ïJ•~âõ,’¨‡ñJà£v€*b_ëB·õ‚Ü×Á‚P2!·Å(Pü¹pþwx7†`h¥´°>ÀTÛj„׿FIP‚Xy¢ÞB;ð½{ÑNy³$55­þÊÈ¡ Ê+¿£3‚€§‡Å )X†€>p™%Ï2%:BTA ñ ‚ʆóÏãY.hËÒÅG˜‹¥Å åá‘PT#ÙÉÇPéßתa±0UëWÈ „¤Àn—ú?ëMÄLxSø"¿›Õž€£–ÁNGé™UEzN8=·“8à”¦ŠæüèëzŽÚ*sH>šÍ<ñk ÃµÜƒ RË%}ÞmÁõ¨2HÐG;ÏÐ)Еfa8O¬¾^?0ç³ôSÎ(YÍìBa·3kÑo|\‡òkG]™¶Á ø;ßçgËŽPë°­¼À5ü_®—³xuˆFHç6#­Ûå¤Þ^Ú‡R0Ðc7svÎí Š·8,‘Fy„¿Þ2Y±¡6G®6rݨUUJŠŒŸÀàÉŸ<*˜(„Ô)Ô Ešóx¶ do|kI10?N͹Ë1¿(Vì§š,€áÑNŒ:qÎafáN$>{Þ°×Pœj÷Ë©Õx7ó ôô ½•ç[ÞoEœf|GVÑl 05\6[ñœ¨’% ǃÌÑ:?¿¹ö¿¸º4:èÏËÙ_Ûä? «È mõñÀQ~=x­›ß~í¡«¾ƒú×ï=™ùñ~ÉŠ¨ß”°ycÂ¥%µðY­ý!ô¦ÄË@t~‹çíD`D…×CèʯÅ>_Ôdôv5ú£Z#_Ÿ¥‚IÞ|h4ë"Œ%@ùÜF¥ÔŠäêL«Œ×7ë<'œÅs2ffð÷e [»‚/W¹–ï#ŒÕ*“g8ã”'I8вHc ÈR•$”ZU)¡¡¤‘(Q(¤Z¥T­ý'[ã6q½¼[,Ža„r€"¹d$œÒÅ ROÙ3™©z“ô £Ï…Α=¸'FãѼ8rlmøárD>ªü´f”îž7Ü_xÒ<¢¨(ù¬f“fû|Î{IúRq㦋>B¥.g@ ’p jÔáP·0®3êBúÇŠÍýü»_°>´tz÷&ë…£¡I´ ˆ@Ê :3Q-Å&‘$»Âé-Ñ ˜Þó;×™. Ÿt›>†E¡öùôÔ¥YïÒ9l|ž #Õ¯~üíq$¢ˆ¹¿Ñö˜{óǰ}Å PèýþZÁˆR×ê’ËeT´ l½xO!–í~¸û®U3w7tD ¬¤´„D\ø_`ëÓ³—Á;†–€ûéš‹¿)ÍÇ „ BÝ’Ò&Ìù‡C# ¯Ã‚¼{(ö<A’O0 æß‘<–*g5PÔì% L2Äû³ÕÓõò%$6+°jÕ”pkFEõÙ±x–ÄÇ, <_/ºzêÀÎZ 癬ª€Ä'(*`³aÔ­&&DBÈLIb~ívT¥ŽŒÉ„\Ia¹0rˆ]hÁÉÉ™‚µa3DJÅP+\K‘Öi ™)«B˜ndd¢Ä4І¯CŽg׃¯.Ÿ †€ÈªDM øCU†©„m¦¨]Ô*ÊÁÉ”RA µØv¼Ðçq_]`&¥i&!‰Áǧ g¤hP '‡ö¢(ˆ}x‹å&z&*‹>§Ðúš‰b"Xõ ƒ6h˜Ãn™ & Þ$ÃIDÅÃe!ˆBU‰‘R)B ¨ª½\‚{rôÕ"%}÷”7Bû˜˜%OèÒ*rë«¢Ê;ú*G€Åx›+ª¦øÛ}÷§C™²f¯øï;?®'F3†L”¢‘g‰|fFÐ4["7­í ¯o ÌQX“¬;”r((ªT¦!JEQŒ ¡ùç1D§¸S%(vŒ×tî€0JtIY;PBÈ1b4E*bFØg®+7ÛY´L‘B(R-* B¥*M+@©J©@¡H€”)B% ”…”£Ö $5³S êQ ÀPrÚ E&CPC{`ËðMÙr¼¡‚¹”3Ê@@¡]¼Ñ@H}äàÌT*¡ÖYFêÀmÆb§rj"b(¤˜ ‰ Õ‚¢ˆ¡m¦òâœæ[\¢:½Z¦ÙR~Pø.w5——ÎDcb±b‰f)¢‘(4äU)¨æ Ô_îs÷¿_2ˆHHñÛƒÂײc3§M„Y¥ÑaÚâó² JŒZ÷Äk]1•0%¦ˆ¢Oi(èõ¡À—m‘2}9ôÈ7¸f‚á{èÔÒæpOĹã\ÉX+aÊä·piXèÊE)°@ƒtaä€8`wðòr.Ǭ-q£@ðäã¦þû·3$úÈîŸg‡Ì^r˯ÅlA±ù³»66ÿ9ؘ#G²øäH‘!S÷Æmy*Ä‘&†'+wK8(,Ùþ¨ðlügGkgNTO4(îGAá'F«E™t,Ù1‰?glˆç²¤@?*Ì’³çtæóµÂ¨€¸„=…É ´ú….n"XQ7N¿ãŠâŠ7û´¯_CG9ßï\Œ#ëYšœôÃK@I¢"‚"+¡»Z‘¥R’ Ð BÈ€LФB!²¦ùa² }BØd½4+â C‹ÖÙÄõéµ7q óƒœjd r€QÉQ384EA@U䨠£vàšZå"&*Ÿî°®­4…AvÑ‚ÃVé— Ú,[s'ÇTÞM²°vÒ ‰zNf¿¦°F1‰ÒUüu6$ƒÒ>Š,dŠ‘B Gùf6hÊñvmEFüî®lÝ]ÉùîÑÄvƒ@¡­€ÚÆËPî ŠßŠ]¦!€s8Â}¤“DêÃb¢îÕ¦0UÇ-–eÅÊJÔ&#h(‰*ø=ΰɬâõú»ÄA6âJ¡ß%–ƒþ,¤Ÿd…² M…´Œ›Ë:@ûa¶ƒ¤z²³‰Â“3[3,1‹Ç{PÔN’iþ©ÿ]Ù‹þG ° H?~¦™ÅE“‡VøåðŒ QFúñ=§7®lk¿9Ö ŸÀÃ)©%ÒtÃ{nä»*è¢øàìW`ežO¼}•û Ï: È>¬#þŽNz4Œéï¹û,!)m'–ƒ*0 £ý(T©r~Òª1AH>ìŸï·À|O'<‚o5‰ ø‘ó+ˆ~¯Õ§ß÷r®+Cµ…áŒBõ"†`0‰o‘aÖÀ AAUç‰/Òß±—Ö5b‡ð<é>T+`•sÉB`x_»å9Ú¶ÜÉ­ÓÚW!U›fµ4.„D;ùûêÜÅά4ßò»Þó[ØCgB¯0A½Xa5Ì`hmÔLuZý ¨ 9íD‚—[ ºº4Îó´Ù£”÷S0d,‹($Æ"L%  v©rRaÍâóBO?ÞÍ'IY(”%´…hÖ5¢m KÛ–c£K«1Pã*Qˆ˜Ñyl4ÛÖa´ÒN™Y4È8K—3.Þ³$ÈHãJ,¤­b-­Ç¥¥ˆ €A€Ú¡-L­- ræX0RÚÆ #-Ž\ÄÐ!‹ƒ“*å ZT…ŠVÇV¦[]%5%Ì£™CÃ.°Ë• ¨Drä‡Pfa° cPk B€,,S%¡•¡(V„ÈeÒ,•²È#&ÇDj´9Ž"ñ`‚ꆡ¹H(ÈæèJ[J¨jaarÚLL‘šÃ"Ń-ª ,³eU”X¢XAVXN6T0­d‚0KF%E•PP(Ñ*KQŠ–6V,°¢ —5”SjÁækJ:hhÈ@µn‚ƒD°¬ t¡ j™æ ' ¥L%¤blLÂJi 6 }<$`C›cë%D-Ñ_L£\FþÄ=øx»I…™;NiÁ˜´‹§Ð´9ðpšŽÂjª˜¤"ºñ |€ËüÆŠÀüƒú½µ–HK6vˆƒð"?H)òÀÇùÌß²EQVB R©»@¨¥DˆžÐ‡7G >P†‚hª7B~ƽìxHJ)웤!‰·€À¥(–‚‚ €Œa„ 6TUô@8àÔ°úiE‰ ¹Ï’Õhè&°·Á=ï&åô{ îÏ›Qb“H‘OdNsFˆ}(}¦Z¤ÐŸl0ý]ìÕæ¥ª7Œ•/ÃãÇ)ÀåöDm:Op¨+¦ôÍNß¿å¹?4ÇÈRÕµ‹?MRȪ€Hõ¸š¯_¬%FõkïX”7[äWB£à?ä Œ1ôPMCÚÒBé™>ÐÇú‰¤ÃªLúeÿ $º)OÕ&±ï£?¿<}†;@<$¬L€­ö•Šê¹"L´0[YˆVå5`,Q»¾Þ×écëÓÞÚѶüS=×Y¢ˆo=èáTF>ñ©³@A¥štšÖ±r(¹m)záÆBj A³î†áª20F½á€w©‚‡òȹ4'‰p¨Šx„,NA6ƒ=úrq }Ϫ¹ðH!JTdLUõ”0ÁUËŒ).úßÌø¨8ŒØèpÙäÁÁ&œüÈjg]=‹ó÷<ë®z t 2ŠÖP+øÁ¥-4@ÜËA²73ˆ%Ö !ú é`ÅXyu6¼¸N³iBi‰&cŒ‹P:ükkžú»E‰$"Ç»-†Ä(âõƒ¬ƒ•碭µêðj³«êĸ€~†$& !òóTì S‰`ÂvS ¼ìà]r0N‘ËdRĤ±¿ŽÖ\œëéÔ„¾y“ç?Uvíx{9äzöœù‘­5fW®ûìz’‘,¢<À€»Í|ÀØmBhT8…C@ΠÖö:"B+²xeæR¢N^Œ‡] (R_‚æô_£¹ØtQ©?%P3bœ5ifjð$Pù÷JÒ}:ô:¹·Fõ­»€("X• ~D8í\Ì>æ)¤˜(&JâyS¶ÔÈ*BÙ&”™)1ER§—D‡„é ³‚b¥F3Øö· DIKAr9ý(7oœŽtwVïÊíÆá6 snȤ3ËøG×ÒoG‹äZšªœÐ¥ØqQÛaÜX¦ÚÒ‘è%´W+aj)íã|GY)xåŸA¼b€~s„=HÃŽT0Q'Bw÷æ{Teù1ÖY'ygÆå’bxŒ` ‘RAÀQ9*‡àÞ5ìÛÎlîVK»Ý"‰ËAÊoeŒ‰ åCvŠ+67DG§JcƒÚÅæok†óaQãšô„H-CÎÐ ŸÄ @b¡Òz ÜC@f 4 4¨åAU›s…mŽK àŰ·9J æBH÷ýø%6“§èt3ÞEÙ–JT]À‰½Á°Ä å˜D}³oÅ.€èZ¢Õý™MJ…Vö"8âD¡!nÁ‚ÛÐØÆáª@Gói±Â iD2ê0F¿¢õKE¢¬¢È†¤E# )£›“¦µOY™Ã&T†jx‡09G–ÌÓ…±•°ìßš®š–Ä/÷ 0+•„°".°ÕY°]É„ Û`Ò@†J Z¢¯è¿ã «À>ÁG@É"ZHCyÃ]7œÖ<5*‰§y#î Ws–*DT#©SP¢ ˹²Po;1©FõZäªMØô‚, ‰ê¨ÙÅeÎÈDQ”¤#–·rF4%Q;@Ñ`ýÏ ÄŽL\°’§3Š™ƒn­SYsçúôdÐÎ ýΚ}ó~lÄÓ§‰¹>2H|ªfÕÃ?Çeüç&’CjãÞ~«B†k¨®ÄÅW ŽŽ¦’à £¶°ž®ñZ¼é 3”;•e†ËÛ[ õ~ò¦ØC» ffµ¬5”h(#dÃêì}ëï!wö_<Å›ú¢‹!â|Ý%M·TO«›”‹ÄΛò;tÛ]SàŠ †¨DÞ3¶HÆMµš†[›Ç•!ãXðµtÑŒßt:æÅ8ÃL4Ì6ó£{‡C–‘ UŠ,c`  C G, éq;ÔãTh“ˆïy–!¼P*(ÚQ ÖD 5LÕ$Ÿœw9›!‘Y@ÐÁw¸È$28dOÈXüB€±ê``ñ<å) ½0 0rS/d!T§Û!=`b `-Ùd n 1—ŽI©ÈL„J54:!†¤¬Ú`±dRi+âIŒãÄ=2V]Ò°Ò~­:I “l“CAÆñ£!+%Ù¤MÉк܉©Ü4ÐJ9zü q ¤˜Ry°vC±.ð½[ fZE„5†Ò]YŒ¨ØMFÙ˜ô S12Ã,ÄBzÎp9°¸]M:Í`6X­¦©q!Ácµ`¥Ø1Ñö Ñ‰Ì*:¡€Á@1(‚%AŒœJ…Pa¦5€Ä©47‚dbˆÐÖl.B¢+:Iaõ’]'ŽÄ˜Ï›Õɤ!¤ª.­-’B°YŽ©E˜–Ðp&BŒ…m*Æ]ç‰ÇIOLÒH½qÌuuJ`…M8šB¦­Ò2´Òi²x4ÃlÙi7iÆVb^ÛY°Lt3§ÿ4iœó3´¬bq6)iÛ&Ó3”(Ðf5MŒØÎe˜È:²‰[”‹1É”0d Ês)Y„QìšT3m‡Ù0\Màݧ[Ö hʈ)›2Ç­L!ŒZjÞ„©Æpꇻ¬Û Ë4+ç´žè ‹íê’AAKîî3$?Œ‰IH4€›škÊ„‹Ò Ÿ“ù„FZÍ3£ÄéhkøÖîï/$Š@b°ÒCn"‘Œ`¶/W»-ƈ^QÁE¥² pª¨šÞj:Òa›ÄÎ|ý#³ûö†²Î[“3¢ |áAî ˆHŠxM±Œ9LŸU¯‚Mo>Ïö¡‡éèß„ÈSƒ€ðâ"² ’)€1ª¤Ÿ¶,•…²ˆ#BP2@0@M@ Ä*Mb˜…˜ë˜=Û#l9VŸ¯àPHŽ6ãÍ”ê!‰Ä hjHŸÙŠù¥J±´É7qU!ECó„”‚J(™`«« KM†`Ãö¹E„Ì,ª%ihªÔˆÜ³H>’ŠP0 €µ "„4%ÒÞJM«ñ‚$5†Æcÿ¢K%µ¡PEKdÍ­“C‚®ÊR$†!%6b@ÉV!`ÈTwL¬1bµ´Œ¹-/&^w+»MfajG!WP%™!qX2ˆh1>¡KmœŒ@ õ)ŽˆmÈÐt°FN¶dÕ “A„HpÀ®ÐSxM™ˆŒÂMJ”,!nñ×N5³a·{ÅóÅQ‹¶9ÏŽN¼x²‰(»ë¦åã­¼gC„d{j›²€ +EðÈR}2½áUËRt5`W5½já•rÀ‰¾—ÔÊj Y3Q,µº šk—tæQæçuY NfBvÂå/c˪r¯óED‚6°á6M‹Üm²oìþ·  î½›7Ë«ƒÕPeýd\güÖ wŠ(·Æ.Aýû)‚ÅÔù…$2ñ(*xùÝXàòDÕÊäóŠâC.ušv(n1\l¶—Ii ¨ J(R’`&h™I&”B©@¦”Ñ B$Y%žôÏ»gy¦eìs÷ïºi?F錿T†[+R0±!ºi“i Øb§æâi5»e (‹4E1,ˆ È܆A‚œ´†ŠÝŠ*œ@Êž™¹¡P FNù$…ëèyÞµ£.f’è.“òa„_÷¡âpteÿm\-Ò­f.2E§Þ;£Ýˆ˜qò’säÁÒ{ú³‚è¨))7ˆ›áÔY¶7Ä&/üFÁxv ñ¾üÖ8ÁrU\‰ƒpÜu¦¡UN9ijg|¸C@$€nA(|J‰„5B°@„N}œnfž±©‘Eÿ|•Â*1æñP@¸"¢4Ò À„Ù†ê 6âc¤Õ†· ù·pÜœ',*c?CäurWP˜ŠAÃ@PP’FQ( A"1·3(܆)`u1kŒ ‘ª3ÆÎ²~õœ`0^ ÜÉY&Ò­ƒP–UµsˆhØaúò›†w9õ³ïðO°æ¾í(ˆª‰îyxrO¸a4„ ²@vÇ%™† ‚¦„¨" ˆ& ÈN$DÄëŽCD&—"`¡h‰(§pY‚´–Ì1*5ä¾pñ9¦øØ‡ŠãÁáM°‡4Iãl!P Òïa¨ŠÒR³HOÕ7oh…˜²Äj2Nz4±¬Ù^ÛÓ@Ö}š5„–VÈ%µ±dï­“AX’¬ ɇ€¥ V°p ,‚å˜Ö:(ᩬÆH,Y º€ˆ´d®ÇQÚbÀ”ÕÍ‘7´Ý6K×.ŠÃHhM$ÁrÖiÖ‹¥²­É1Ñ­CZnZilÄb¦¥6à™G¶Ç«C&µT-F¦³ ÁT2Ö2Â\1¸Q+MhÖB …Ñ ” ‘†F]kIhná 5D‹E¨` „Q(KAŠÆaHfa!Hl¡IM2C--š’V’.9ŒK™qh”tÍDÖ¡eJ]d…CšË0qÒb³I ÑšJ„2GE,˜‚ã¨ÂEL(*0]ƒ„[r ™spY¦ˆCk5)‡Î%LŸ´º“×Û’"ÀÌ9‡íì¡É± 9Ð:.™†,A™ Ì”ª·p`wç ºO¿©m™B‘ M½þÑ/% Ë ¸+•"Ú”d_rù”ÚœòcþÄE U–Ý»Žôö̤†€»¬õ[U"††6_žüžúÐsî®»ž¬TD¡!$QSTIEPUCE‘EQMÒQDDQU4•LQI4K$ É3%RSD±M!PQQÁÓDLMEDEC@Í5TÒË+5QKT!QT”UTþA%‚…!Fr{Y” Ž~v°“Æá=¢³ \_h',ár-A½œ\À¡YÐE}‘@ —–$¡Á* ãJ(I–±Ø1aS8|Úÿk3s/ÉàÚëjŽ4¢w@Âùª °ë×I„@¶qKéi²(ç*Èëæÿ±•ÌËQš£Ì>ºôŒ=ºÔbÚc„á’ÎáÆ€°G@ò©ô£ 0ž* ®5x[*žHcW[íqHCµØ DÎ ¨ ã":™‹_&3 ¹ ¼ã†Bs7¨%ó¾Ön/‰Ë„Ņ߃F9ÿ1Ø|žwUØSlÉ“×Y½{¯[AÌ7†ÁÕÞs^ã)*H°µHdŠ„¬Ö@ÂUÛpp“Ö‚»÷æÅ•¡Ø2m,èª ™SNrl ºÖ£®‘læ9ʽ=·8ñ6LÒ¼Q°("„@451"ÙdŒÝ…@@‚_Í­üÆiûÑi<¶‚“Xè‘êöwÛyë÷föʨÛÙkÃÆ“v¼Å¥H¼3G2i+E£Äj6"•ƒ7ª«Q)z¬ÍËskO‰Ô Å«„~Ÿ_|yœ÷ÄŸXî&ÉIú5ÄæØÂAi*’šZ*!(&R™©Jbb ¨hJŠ!¤i¦¦Z ¢š()˜*Š¢ŠB¨)¡(¢a*¨( "Bjšš*¦ Ã_-<­˜& ø½õÔc×@}ò;Z”@€1N’Qá@ßGÉÛG"Ôß×Îòô@3ù2zß$ƒ)·Žþ:ˆÐœ‹×g~VEñõ®Ë€‚¯*p€a†„ÖÌp¢|ÛZ$côS’Àà7çÓjKdÀCHK4ÔQùs$×ß—°Té)2çó@^fѽê멸ӫP¼]©|”ø!–{œÕÀ'Õã\"—€±Ð 'hó@ø·À£ÿ›Ò÷oõÇi½%Ñ_=ûvËç´ …¹ª·Ðf×#‚WÔѤÑóœ±$a$$6vúùCè€׃Øðž\{áànv £ýESÇ—Û¾„î9Bu [P#î¼MuNÆúCБC‰ôKªeëë½¢lŸ\8ÐdÆ6 5%Jfz÷û$'Ñ÷344ü ïÉH½Ph˜!n„Á¨|†ì»Êú–peœ…:ä éá?'®ô{þŽAùzÈ!aÌ ¸‰:l˜qúû‡+»wáWeZ|à>Eì¥8PЈ,‘z¬Bë'èÿ§{j7eUÿ¶á×'5"ÕmF\qI>lˆ ô3; ìPù³Ì<Äû©¯¸,P6Qày¤bšy*y³ö ûK÷@ÚJ31Ty”ÈŸiOÞ³°˜Sý›-šÄmZ)Qµ*-YßW×ßÞL“Ü¢G_]pEr]SýSLœÏ6Ðþí:ÝÞK§§s/à|OË¡>Ž¡c€ŸdÃ&™¾¬‰5÷Ï^lù€]4ÑÁ)™Ùh&0Ðä_…H%â»(=˜øÐ®~›-$ç,Y;Õ“)^ ´m%´*þ\;ì/žõŒFÊÒ¡Þ_¤Ô å?€IxêÚïÎy¬ ôh¨ŒŠ2"HŒˆž’š*  ™.ø€d”(êEˆ@õ4à1"Ä/H¾"®ˆJ{ÌŸŸ”Ó ÄšI¹.ˆõÌP/SÊcQÓXQ$†6÷†~(|zÅ‚³H¡vÊ ™(~ ÚÅ`ŒÛ$“|/{øå!MÚÈT„*úaÄ1†„m €UnwE7ÍClq¶dÛ 5µq…T&Z@ÆcÚ¹dÄ ùf3–Ç啘*VsÞ°'9ïRîï«2'Làç˦Ý$Çé1>Ù4çV|@ÆRb0½g¸ÂÑ!MÛLÄSš(埈kË$Ä¡ã9˶JÀ™Íäc‘7lÍÖ(¾}cÁdS㦛FîÀ%P–UºUÚ§“>ùWGåÈ£Uå2©hT MÃå|&5³ëúOçè°m½ôaf"j6Ð[nQˆ÷ t:ÕR„üBÀØ{éóTýþê~Ÿ'f7Ç`Ç‚Ås¼ÇŸeS‘4gÒ”P÷èúN;7=ð8^€›Ïï'J¾}L\ÛLuø¨6Fè¸ær6Ú'àц@S”PÅ"~!K1ù¤ oBp<°ÙîFÔ…×eˆ*° S¸}Ø€á!@åB‰H4ä2^*òï7?±¢!~èQ1Ü„`0 PüDˆð€a7F,4PP›@ZØ€RRê±Æ†“ Tw0xMÿ”’²,PR–O[–O–©‚ãP´?kËóðéОÿ~åSDTVD¨ï¯{ªÎá:â´žšâÏ­óª}ä7¬}äæ­7“oœj„ø :zÜÏ ÌÔ¼çNJ™’aG ¯?sPẦ«äê<½‡2å°<ð1À¢˜’ }Õ= oGáF“ €ÌÌZ’,ˆ‰€2 ¡ý/´ù‡ƒÆÖ{_G‚4À›NçJÄ’þKÛÎçº 4ž4ž³`»Cà>vEOÆ`È å3ɶ´ ““Âø—±àÇ£ÀŸTQA‚Tˆ‚”ÄIè¥FÍ/PU©‘…™‚ÂåRòÚÞ±”èìªk…ÙǃGæ)­¶y†ãý•ŸÊž"`„²’ˆ ’âÒR¦™8ÏhV… @H„iCp ‚“…é€&qÄ J4OPÜr6?ßc²)ÑGĬUùøÜ?«¯ßì]ö÷ü÷àñ(Ö_é|'l…ODH!þ£P„€þ³kôPáüx7L'ÞOÏì "¯¢Ð?TØO˜T’1å§@€YL` ’P@ Ø‡Ž‚ؾB6¦D!¹óÝ”s‘ŒlÍÀt #•Š$€‹Ü%TB ÁE)Où¥O`ÃÚ|d}qÑІq1ódÖ@Öà÷±Ù:Ør0Ò47òz€È8 P ɦˆgØkÉÇð1œùp‰¤oÚ"CÎ(tô…*¤H„H‰ B á;>~f|x<„å L¡ØnœŽHd¹7ºó>Î Æ¿ÇɱñØzEˆ7 ä¥7ÆÊ£=Y*ªèî#ä~v$œ& Ú²ÃÌ-zhÇQ1¸.©ó\0ÓxæcôÀ*D¨HB§— ida-NŽˆü}Ø]4Á”œüv‚žL8?“xþ®„ 4×Åœ'Ž1‘úÿj‘ã÷6 Ÿ?_ÞSúæàH-oªî±¶ŽàkcÄæ×|mÖƒSihÜ@X\ÿ3®Œ{îèš"Õ¦ZWXlltìn[!‚6ãžpæqÏY0;Rt1KÄ?â.à©YÅ—Rˆ ŠuGï÷ä·"(<D´*›íœiXýc ªŠ6V‡ùþzη ÑB”t$¨OC@nE §N=‘àüé Áч7 ¹€ÃED ù‘Èój@¥rtLB•4Í÷3QÊ" ‡rû°¨`!Éý.ªvC "ƒaįÎé¿äÍ>òúÇâ¨>"~/"\!=””lÊhM WõàËû/Úô'Qè°‡]-D~s(†¨¤fƒ"@žs°›yJ `è…ž Êh 9ÜjMâZi–"hö{fòÓ_̨‡R—†RxŸ³p$6lH¢£ „‹B–„†Èa ÝæÎú ™bE (=!ô}Y'»ž†Œ(]ìáƒL­YºÐc …DCë0rÅ•ñ ðHÐ:â^Ù£Qc)IC/C°èÐzfPü°„{»“1Ý™ BÄoà eðí!Z/ûHwÁ¹j´AÚ„€ Páù7ž(Ò¥DñÁ{Ä·ÄyÂ|t`„ Á¥NEECÊ5A ø æ·B˜ þG{ø…ÃéÔýc¿2$Nˆ#t(é‰ñÓxÐàDGʆŒ7U¸Óf3«;1-¶÷™ˆàMë3{¦^úÑ­S³É»A_ÒØU5@5ÞÉ%iR!ˆçÆ jhãÏÐ<ï2¨bÑLhÕt>:jNj'Sœ’ B¨íí&µæ2"VŽW<¤=ô“†&JB£‹¦¨’-`-}õû=¶Lûž}ÈŒ ]aõ8 ûâ’‡N H–ø‰­È1Ù)ñ,4yvH†Ÿ4ÿÎÇD~œ~‘=òc•$<ðI4:÷¼ßƒÄß6ƒ­ìüî†Øv…YÈ>d/ BÕDÌTPã.ÿšê“´œ¡0Q Ó”º5r)¬ºuªa?Üš{K! »N!øµM%üÓ¶q‘ÝŠm™˜¹›¸ÀƧ‰´Ä©*qJ,Cf¡’L‰("ʹvʬ‡¬ÓÍЈ&^fe E#èRhb›`q AI´“8Q@öÍSþ(b{þØc™®b!Š$ˆ)‚‰Ò^ð.¡Šã07¨5R›»FÉÜD£Ää¥!¢u˜º€ BŠJJ8ɘ" 0š(uHuÆJÂhL©,Ã)ù`T*fHfZo(¹ ­´6ÏF75sÀ%pmºµ+AÂÕÆÔžL•©œ1ÑfÅ~üŽ×!N6AÆÝ±&`3.Ô‚" ¹˜ý¸D!‚Çð ÃûÁæ‹-¨çן­Ž'!¡ßqø:­õ õ€ßñázu½…®G²l&Ñ‘$ˆ(çŽE ”‚­ Q ABÊ¥Aå„”dMŠ1ð(‘Ü2öíF¼>Z^ EØÚ'îéN¡1 T´ÍDËçê¢vxôë„BwÞÅEªÈŒ<$$<°øìÐv÷»^„ 9ñivH.t¸º(»ÙR߃Èeììw}=óý]§‡(ÉDR‘ CeU4ASô˜´¶6°ÉF!3 j’d‰1 .$–§J& Ec xœƒ¼Çþ±‹À*Ý%DV,1m(ê…Ã[a 2ˆ‚ÄQ’³U:ÃR;Ý]Ì …ÍMhT­’ !')aiG3¥Ð¹%EEU1"J1%Ôa2ERk$”w©tr]iÍè4’(Ä™hÅfªn—!ùïõš,èBBL·£š…Àåë+4a…bâ…¶;¹À¤«´›t0:ŒEr0UþAR̓(:Õwuš¦³q 30)L@¤`õ; ¥$uäcÔöQ»›:Ãð=ôQu_T°âð¢‚d"ÑÔf x?yj)óÆæ)iƒ`Š%bÖmß QÁ‚Db„!×72¨óîp&ŽJ•”ï 2q°ž âo&gwE+$ ³®}Ïãß{XZB©¢lqÈà𦞑Çy ˜NÆ­ÎÜ{|‡|n³ áYi.« ÌuD +¢‡£×aÁ¹†Ñ|wÙá6öCÉé Ÿ I|}QulÆðiòk ¦ªhh¤ ˆ|†…òfñÔž’d(´EL€¢€±ÈX©†âa0JÚõryuÈH Íw=úµ ÝП`Í9•™g6”[,-ös2t}CëpÐu)ëw¦(- 0ìú«·ƒIk|ÖÇ#²ÇxU-)øö+rBâ¶¥J²Ïa`®)Ø*ŽìM@öcAçÂ4œ†džŽN¾yŒ=ëÙ}WÇ$Ú'œ…¢Ã f¢/lDD7OÌ92gç÷òƒ¶”ªž³Ð3°Üð4™FlžÎ!€4o¥|üú«S×@3c†…v _T²r“H0$aëë¿#ð ÞTÉ Á*”ÁC'C°À`šhJ–"¤I˜ˆ¢ ( "‰¦©‚‰@‘ Ä8¬ÁUU@UCQfdI% È ˆÅX€‰ò>™k` $£qRÊ%Ž‘< Ïl::ŠDä¡:„ CCÌh`iEJˆa0QL4ÐMHÊ."tò1\3”È28V% V‘ h$,”‚RD… T¤*0k*~ð*9.eÊQ±Ä%l# LÆG î"ˆZ˜C‡œ”ÈNû¢ã07{  ˜‹©s1SRaCÝGÐB¤à‡àŒ}Cß»ç\%Œ0ŠQ`5FÈR±pRYSäm°XeØåǃg Ûwqo¡ê9qÖÔmZGÇAEüŒ(‘‘}»ÑÐtQ~Õ!á)y'D5`|̶|Éë{|óÎÅ÷ߥë½@÷{|Ýtšl<¡A˪¡°¶bŸ`¥èòáØ»å &Ôn‚k™A¦L_Èh½ÜÅ rs@)ÃSÚˆ’á\÷2Bš’0Û9©4„2‚´\d’ÖØTƒÓ[M½9’¸*Í.& FЃQd;Ëbí’T&¬¼@,Å Aï&D@Ò¼@¹H/J[J(jìlKˆ A1œ¨…‰Ú Ð‚%(D°TÝY!sT1 T}¼¹ä7&3J´§,0i£CZœ $ÌŽÒ‰VÒ†Óa³zM ‚„BJQd 2¼D†K ÓCQLƒ 5(å ¢ 0¨=ñäíÁ‡xŒçƒå“eJj&N#„¡Qìò>O7ñÀY¼zJÒ%YÐ[—c #@L¤t¯@í€Ix°€Ó ë$KŽ`´Phv#€mYƒ¬@À…°ýñÎóešV.%Ç-ÁÍgN®m(Ì–Ù¹4¥’¤Í›ÌÔ5¨o7’åÜÐ!%E@µJ¤‚0uvDÛb€¡Òµp•ª6B†vçõ1¼¯eÈJ€‚@’‚¯Nö_Z -<âñŠíªèZ” ˆ îɧ9©DY&v%áÆÉ¼ßÏ [*ƒ™€RŠø¦ûì¾òE ™7÷zÕSÜ»j:»Y3²MÀH %Žª$Ñû, ºlIdcŒ¢,ƒ–IÇéˆc š´'7zN̳‰!X ³WÓ$ûdñ4ÎËaÁ ÷÷†Ðé8ÏYöã`H"f·, µí®4k8ôEþ^Ód˜ã‹Á¿ ŠAw Ò­•ØrœqØ&ÁÙËUH¹‹"#>D›Š8©Ê" ‰P \ úÄ^Ô-ud©nð/U•^%¯ÚãWÏ/ÚŠ™*2"°œ‡ýÄô­þô>ŒR83ø>ôäÊTk­§½ 'ét#;0@ æíTAÏUæ›&ëií˰áqVߤõÎÓnË@I#Š*ϦÅ•ž<Ä¡Ÿu:yêq®a7Æs4{Nº{ñ³uTù®Ê]T¨¢Ð¡».Η 0)L7^Š*drpÊ ec«RƒbÀ£nü@¤¬š…ôîÛÐK¸ªË®íºRáÜ¿nHX (^¢È-P&xl €²˜!nÜ‚(²Ú­ªb1[^— ƒœ…‡Ãú•î!Çwæ ¯ÖÅõàôFõ©#mËo\Ìþö(k¤@Ó†ª 5lº\Ñ€P“^ò Péê¶ÕÊ<Ž•*[©·wÎÖVÇNï¤Hnxpä^Loæ:›Ë¾i®µd¢Ô:¢.`âzÇ Ô[ZvQH*ôfrQb¥Jp^ôÕó[š˜»Â…‡ gŒ ÐŒKTm¡b)‘A>zVÝiøîáû§Ü¿…éÖèôÕOoéÄ•®X¬˜å£yõ„­Au 2*G6 ZÞ"Èxèá¾ ²ÃZ7/4÷2Y΃Ž5G@ïÐjÏÛ·¾75OYpÛW?>`Ý]µ>@ðZqŠÎõßKÍl¹+&ÄÁ1a7â¶Õ :c‚‚QËK¥è°8QšW^SSP˜U»{¡Ž!NïðýTC£‚ÕœÂéeW5­£œìŒ0§`»FØ|­6)››Rõ™d }÷1„s`Fw÷Þ¼ë;9pë|z/­Wî_›â\7üðºü(_f?ƒCl£¬a‚†³JV‰D6?ÏÚ}¡Ø ¨ÊB GUKÖV¸‘Í0f×zÆë}ꦗ‘§ÚcŠíYكǃ÷Ûv( »Žv 5è>×õs7 FÐúwŸÁ<ùµ Âiy-ãCƒÙå^7:x’d {ôÓ5J׺Èĺ†>œ<‘ßöº4lÈFy‰€:Ã#*¬”]Fë‚[ÃÆ´úú9 @©åÜ›ß5Ï›:c2`$ýQ`L8pMÌÙ4HHLED0@‘ M 4QCE„˜AESQ.óš¦„É ¤ˆJ(I“ ÃàÌ.¸¹àì5¿C 4°Š²"Bütb^òñpæ 1š)³È9ýy{ûª¥Ð9ÿ*Xeö4ø±¯Ü»© rË(žÌY?^t°çl0”¢–ÔÉS2Ú y1ºÖqô¨€œÿ\õD.‹/ÇÖ 'ºçŸéïÈùüŽ]ù¥5À-$LTÝñµX#Gß\#|—U}pÍT‚ jAKkâöö$y±¿8-÷Ëž-îêeÑ&ÊkŒTJ#öa!£ & –•ÓQAtÉrÝùߟœ®ç—HSâ†ÈwõÁ\/b4'bÊ/¤Ö -³˜9¢pøÙ³t'x0øCIkÛ£$\fôìà µ¨i"qH]ƒ¿€ˆt7€jldlC¾»UŒW¸@ÎNÏà×ùf8©-aRʨ¢TþÞ=>ýCí"1O¯…’ðÙ÷¹Ò7‹R”¿Y¹¨kcЊœ¶—Ð=Ô¢$‡ ¿–ÇÎÈÈg`³Ña²^äàÀ… Έ« ùPÜ>Êà¥Èÿo‘Æâã´ÊxB³© gÙ y¤èš>x8{âg×ln, M¾L}¼Ð+ :.˜‘…T<àìxÕè]¸ûÙ΂ÆÐåsš5?„¿ÁA›]®—‚·=èy@ ™ qàž lÒpx1úëÜÏ)¸µž®;‹‚¨)7Èi—>ù•<á Ê^º,†öh>œ Ê|²xÌýJm"À@üfœW¼Kš…ñ?“eù³—Ræ()»C€§´Ä`’ƒÜ„t ig$¨¿fýëzÞFÇn]v=R®)ýSð‰îø|¢më³æ¼Ï: Ö¼vñãÂçT‚€0©Jˆ¨<Ÿï3ðqûúó­Xž#31™êaÚÑ'û7†Ý°™ü]!6ÉX˃ô‡‚yœOIO Û48ïu?wRšÜ6ȉØÇ3º•¶ylÛHµj•ÿ,¢“<`e PV |ø¬Œ›×wzÿS;sN¶¤C×Ý#Ô/ŽÆ&ð5"jOÌä,I£ïâCïñ¾Áò]‰°Ðd3¢Yœªhë0H5Y˜hjáSÁEÿ *G^¬;ía×r[¦ ¡^ªòTWŠˆ;¨) j»! T½÷—ƒMï ™4wÍáü;t‚2J‚ÀŠ~í Ó…ö… Ê©JvãèA¹mbG²#yĈ^D€pEwžw®µK˜w¢sÁ*i“ Èí!âÍãÌ…ÉÑ>m Ö5$ *1EÖ(4µA@Ú¡g•[<`ü{ɽ>œ®²>"€è<0«ây¢Ù-R’ããaÖó}?sw3ã_7òÞlÃ,·œÐî²O¦@šdÒSèdÞWÂtÀ Ñ œÁýtÕb~1A†fÛUÎÝæÚb`®%B(ËQÓáäˆÞÕQ|ÌØR~bâvKfM¥„Š.›âˆ"X¦väx•£¶ðÑhÀwaµÒ*#÷@UU4‚P’½7Ñ,'vcTÔËK{"QLÎùKì¥ D1‚Ù³æ‹ æÚUºÔ´À±–Ýp1Œƒ|u(½ ("¦ÀDˆ°Ñ é—‚‰|ÈY½e"[vÖ„Ô%«a§;Ô3—ÎäÖwCvæµKÍµŽŸÞýÞ»ÛëóÏ­W/­H6A€À©@Th'îél—ñci"b˜bí¹X5‡Y™+Ãߊžž­Ã®ŽÙïÓ¨C!éTQ4ÀHÄ43RAUŠFÕ³:Ö¦˜ýî̆a˜L·V¨ "©TT9Û†:Á¢]F¡˜Mé³RỏIÿ¹ÉkÕiVÝp‚W=BÓ »£r!·œQéGÛ„uî„`BE4WœÃÌb_œµ€|Y8ÌSaåÞêY"VªÓ§D­¡K«iv˜ Š‚•Q ¨Ÿ áùÑ~ k˜HRw↗-A¸ÿ*ò´ÙÀö>È•DÉé+“Gâ `„‚‚üÊeÈóP QÕú!é9ÓAˆ¹Nb±b¨##‹”pu‘ðHBîÍ™º„CeKÒ68g‚‡þ®¨ýmce÷(ÒÈtX˜G bˆÅAHƒé~µñÝûÕ%"CP4P¬“×™µ¸ ¦+·ÒܼJt:Mèo ù97žòžÂ›îh©Ï'†ÿ\”øDº´âNÉF?u2ÈRÙzߡќ»ÏG‚,ÃÅúA-餄Q)\ŽcçŠçÌwäS¸ìæt¨ë`Ï}Šâþ{GœO5Îð9PàÚb%Ì›P´öXq2À ªj†ÌQË,!FÞ¾3’ø(„Œ³õ·$Í jßFÀ·CÖ4‡p„|·¶/×N㤯:4hì¥4b¨Å.bè^ø‘Gl.7MÌ„ †¬ˆ †STff½ûxPÑÝÅPiAa4¿É¶ 0„ŠoýjC6ÆÀ†žUÓˆ£Öh\óP0áù*ˆ‚³U¢º10¿Õ“ùBÆ©‘¯Å„tÙáï,;YÛ §KfŒþ_΀¬ë®éê‡o¹wøå˜³í¬“xlðkÂhvº@tQ²aê‹<ÄŸ ш¼2Êža²O¿0Þ ¶Å–pËp¯ø6 °{º¨Ïû&=˜Ø’<é'º¼Ó'aÞ&Þa:´“oÓ>ÍU`…0ÿ[ÕÇ!g¢b›Ô¾Zó,†žîYŽnsG:ó' ‡"6ŽÇÒ ‹(épÉdE™ ²6%Å¡Y’Ó¿Þ˜0þ†Þ ¡¬@¨<¼n¿hœ¬Ç`GA¿¢†É($ÜW #“ 'Ä[ùàÝ µ|Þý¼ü#_¢4k¤OÚz?‚0!¿vî šC˜¶w®É£² #n:lüåàÁ_‘MUöUhˆD×P:g=l„\ø~•%‘OƒºŠœÀ 5“?'Š“)ˆ’WÆÄ18š¶ üû®›9J2d¦½\(¶ïØd+Ïl¦%Wöglßù!¡ AoRî“c]~uñ,5†eã °òÐ]îãkh—¢á»§cpLË…½»à£Z«aµsf'0âåYIj_çáxü.ŽÈó $)‚%½ú¿ÙÈ/ƒóÚT3(_\~f©NHd} Á”w|›VÍ< ¸†’f‹ƒ®Èˆõ#½½U„Õ#TPP•o Pn’S 5D¦ é0‰ ”#¤°ÑjÙ£y·NÉ‚Ei)¢‚@0‚ÐFÕ)6ÓcHF"dü2 óè»,äªñ’Ï£ôízéá‚”ÕMJVýí®aäkKž4Nù*j;Œ…m~«Š]@å»&ˆrV‘)‰ ”´Fd!NTæb…(ÓDU*¾°*Œ+ %JŠül‚€å…AdUPm”T©Y,SVªa© Ejr žø¦á4USI¡p.L¤(j1˨*¼eÒ”21“UÏ 3E)ŸÛÿ/Îý`^™¡î…ã'éö|ÞœE+@PÐJT C@U”¥ ÿ(Âiƒå^§¦¸Cºâ^ÜÝHS´…RÐ44…UP´©J”% ƒAVEÿÑSïu>ÄfY”“_H·_Oû@$Shš4ÙÐ}Ž©ã„óø„mùA¤ ø#Ó)›¶ˆÿÔH¿ŽTú92åNHXXr—sÉ¿°¡ô@ê|ñÀœ -üÿ6¸!+¢¦àÖ)SQ“ rw¾ ré­Rú ÿÆO‚- 7!í=÷À‚tù ƒœF×ù >¾> KE.€E&ˆ=~ŠOÁ…NÿîcŸ¯A>4jHD'¤45 £個@E‰GçS³â ôE6ãëØ^,ÀUAöµö~x²( !¶øë™&./\ç°€pI®a FŽ•x)?ò}Îsùú÷D„óùâ-›Ùëw-8&KèÉéJø ^ ŸÌ"cÌÉTCÔ(SÊ1:,¥˜~Q?àâ('ÌdOqÛoÁ9ÆÝ&Æ÷ðV€|(ø¢Œl”¦‚@¥#,–”U2¢H5QS„†ÑTªafCy“9&|ß³Ø<h=3n @ô‰ÚÃÊ$=) ‚gñãw.|†‰àL!›öjIä:Ü ]È%žßfµF?#w”‚U-5ß& |sñË2îG€’% ½•ÞRR7Ëg%nZ>†*=QA²LœSÉÆáò¦ênˆn;§Ñ$cCÑΉá>½š&£r½à™üË­¶1àØçƒÙÀÝjY´ÌehØßŸêÄôÈB‡ËÓ<í³µ D"G³çÌy"M™£Õ=´|Ì(ò‘ÇÀ©ôŸIr2 †]v‡@DÕ`þ,.ªVh[ô¯dÙ³¥¾Ÿ9PÁ)`ñH™Sy°k 6SÃÛʦf?¬×ÁÙêá·àÏŠxðaýºO!Òw Ûá~Îì£ëâ úû'(Bÿ¿ŠKºþŠS£b"9Ñ(± ÈÚKÿY¯ñ,<ýz”þˆBvqX("° ((‚#ùqÉJT¼ð&²_JºêÀÈ'`011€3]ü@<&Ú?ªýï0‡B±H€„€ôlÀ*úRÄÜĤDÞ®B°¤aY3%´È °[" P¢f(¡b`¨) (Š`¢Y‚ &!© Š¢(¦&¢`‚(’B&†ªijŠbª(¥bˆ¥ H‚h˜™Q:H&´ÀT²Š\‰")TÊihlpº@9½‡ym d²&”n¨RTU&8“XP5Û)‘Ac§öaQ¶±T€¦]&´/Œ6pªáÜœ‚rm Á™2kgFÀ»MÂ"õ,¢`hé(ÖwÖÃf¼ÐôtD9Ò¹ì` nfÒ~_"Á¡#¤«ùÝhª¯5vøqŒž „ƒÇ6sa!¬tØô_ %“ð«@h¬_b"ñfSÓ34Ö¦@Û L^žëSÇTØšëöþh ´àƒN‡ðºÂ„"TÁT×?9±2ˆ MAôùˆ$ ÖR¢>‰ÃCÆ – „E(>o=É€´€Ñ% ¥ßPýE!w?¨Q óañË%Ï%1üfKBÇFáä \°$!=pܵ€€žÖœQbïcÀ¥8MI»ejÍMrF6h­&ÆÃeéÕ‘ æÆMiR&yÕL]\KþX\I 2CBl%‹ÊvíP5?ïXÍ=&'¶u=Þ†r’‚cm:jA„xÂ,´Qv*PÃ} L0ã%ÃY& €É;h‚–Ð?åÞÐ:§)cp΄'ù ¡(Ä„Ãèqß°ìQg\°Ì϶Ðx£a¤Là*¤ýÀ2PD"€¤@©[irƆ! äº6m7ž˜†ëB…€C(TÓ¬G)BQA$ óAþ¬0©ý½ªbë¢"(Ja¹âŸ~+g3ÆÞfƒúñRO=•ÏÄÇ8þÈ à×B1"Ð Q¦bºÊMZa‹là “"=<Ì öòkB,¡Éh8? @<áÃ<ص0g@2ƒ=~9ßj¢A8«`¶.a„þý“x‚ $.ïíÇ\Ê|"‚ñ¢4æ`›SDƒÕ£øO¥üPíîß4o_†9kÛ½YŒ¬¢€( Tò•_ZÉ¢ÊI`%¥„32R-þštÍCó%?Mh4Qp`.‰mxS ‚Y÷q3y€eƒ˜Ž²Ô9Å¢>VÈ ÆŒec¨fˆ Ű%ŠZ) ƒßLj‡%Â2ÐFyÆ Z µ”Ô?}vo¬Øƒ VÄ•@53 ¤Pç‘é†;ÜMS&Å@Ù …£õÀÓ«A§¨å­›4›$¡¥)éd‰B¥*R”(R5$zˆ8vy†ßÑÛOÔù‰·C`ž¸íÔǺ¨97â.✠\‘‘Dèè4¸k(å×5­PzNûºaïÜŠ ,B*)I~qȉ¤9”@Q!èk5¤ðK²µØ,ÉÍŸš@?`†1£eIIåÇÈôÕ5U{˜ jCÏ~†Ž‡Ê6¡þþ¤=åP(SúFJ¨RPª¿n4tòž-_´ÖP{NÂјD1ÌQÍ $†‚Vþ!ÒÑ 0ršC/}tõà .2K@£¥ðb>–†Ü½IFÓ˜|LtÜ’hÅÙ­U¾8ûûw ØÍÿ1A—vWK›LÖ¿Ƴ_ŽPÌÍ:w¯çZݼ‰™ÞkûƒMì…Ù 8¥+Ñ$ §s1M™‘¸„Ñ«¤ûC0( ¢Öe¢¯IY‰Y%J’*“»^›òëw‰…¶ÖÏ mƒ9³0ÄëãkL¹aYÞÙýÌÚV"]ØÿØÂO¯ü–†HŠà¨Ä%†Ù•U ašÁI$‚pygjm{Ênñ/¸P%ŸK¹ÅÚä)»¼79"‘¯!FŸÝ¢Z,‹Ó6˜…h‡h|ÕÒ¢êшx)J¿+2¶Ö\³ûæŒ×/EG*^ÜrDl!Âv5“…^"2ºÞª?;”º?``Kš¥ëà ªËž0.¡OÊFëy>Ó‰ %ä³ µ ü5¦”uŸËŒÎ2"h—ø-áBÂBºôDü-´ô¬«Í€ð*ð®Áé–hh³Ì…Š$X¡,*w :^xxv ¨|r)Fƒæó¥s{ÍÿF^»Ùõ­£å®f4T(º$@)øGvt g˜G SŹvè]¦%óµeÁ˜Þû­³;1Ü;Ë­´Ñ¢YÁgzréß{5Æ×¦dZ:2hÌ è‚âá g ª†€JÂä \«€“¬^åv€Í `Li½„º¶µ QSHh%š “ÌCx™9§`ÆG å16cñÆQóê‚Ñ£@‘ žäàšRÈ¡ Ž¥³4ዄщQÔ¥T–Ñ;I‚`Xâë:óÙׄâ% !@RTX³Q½K4Éî¨È“70 @2yÌÉSž hÿáüŸvZZh˜°À™ï”önnCÇŽ|üýòà|\3;Ńõð‚;¹6ÄÚÉôR>%ßÌäóptäɤàóéC/Fd!Ý€<˜ti$p¬òŒøLzM”Å 'A¾ óÐæˆ @ee¨¢jª‚Dc'>rn?_^Ä:k÷÷;ÿ“Çsòˆ¢!Áÿ_ùôOãOôôþQ Á£èCÿIÇ6ôeú>÷ôŸÍøÛ~G¿>_ÈÿÑÌ:*(ˆ{ýO¸û'õ†ðÔÿ ù ¿‘øÍ™z+:´w}›Ï×ýå…nÝY€VpÓˆyšSÿS.%©V ÿà @ˆ Å×çÛáÕÜ;ÅIÌ©ùuÜ!z°aÑ–â%;SôÍgóaD@’sÛþçU¾ýU[&¡òýÓÿŠ"äÛsÞ 7(<èÅŠ(ˆ~ý^ßé-¾7ð_‚ßÂ"ˆ†¾Á§è E È{’ÆëÖ—Æf^ƒï ˆïÖ‚©çããn)R¨_s½äÛb±uÿÖ« רìwùÑD?‡¿ˆ~ôì(þÁD"ÐrµÿÆÿ£úãOÓ¸4£¿ëìQëÇù?Ûú/úØÏ¬°™¨PQù‡ö à§ù¦³E¢xQ B¢‚ Ê Œˆ%©"¤@Œ H¢‚R‹(„°¨HS0£4,¢R D"°°2ƒ ’Œ#*E(ƒJ  ¬ ŠS@„J)()˜KAH‘*¤ˆ„!")B¬ ¨¢J"BŠ (©@‹ @¬+"£¬„ªH² (´$ 2A"Ä+-B0°$ CÂB-J@¬¤¡ 0’„²(€P2È, H‰*²ŠÐ‚€?Ø£EuÃïçþOWàÁÝyÚªïÁÏ­¿‘耡ÿ‡‡~ŸùìüøÀ6EEˆ¢!ÁÇÈûŠ4öÿ«ïòvsøò>Þä}ß~Çø½¯R.¥Ú&ßÀ£µí³i0~ó:‡MèQæ˜} (DB.D:}Ï?J?Ÿý¶ày÷!"}‚(ˆDçÑçö—ô}|Ë:z?Ïû²üþ|UOÜÅÜÕÐè'f’C½ ATüÀšp Ï`°Ø·äúþ|Ð&ÈŠ"gަ _ï+¼¡FØßÖJöâpoƒŒ4)Á½¢(ˆh®ãûØ nyÝÏÁ¿éÃðôñÔýÚ6]ÌÌÏÜÐ…D6|޹õdðž—øû´Ž9牀Sß þ‚ry?‡Üà–¿ùp]¤ƒ(°ŠP¥ ²J2"¬(! J €B "HR*È£+ ÌJ€@¤„¬*‰*ˆÈ (Œ ²(B$0’© B Jª« Ò*$"ƒ J$Š(H¨Ä )@ ˆ´¤ A ,*¤B«$ ˜]ÿý‚(ˆ@ŸÚ|ùõ}’ô~>‡uýû³Êªpñ´E Ù3ã:8…rÛŠ"¾ù?ˆ!þó'?øJ;\‘U²¾ëüàüü™×ìøøØQì?¶ø«u¯€;`ñøQóËèëøW;§ÿh"ˆ†pwþŽûõúì9!ÿmH"(ˆOÖÙl?£!Kï×ÖLºæÐ Wäæe7㯎DEÚ«ÁãâðtéöYÅ…@¤Eá‹1 Ï‚°n•«thÚ¡{ÿñCàn…‘ PQÿõD 77lâ‹l(…Yÿ|V$ß«=?ñò™,øQð|~D/⧨'É5{ Cü$^xfù‚ £ôB0ýÄŸD?§/×ôˆŠ"úFÂÎû‡ È,– ¾Ûª\J é™þ€OãýÇy:kÙnL_@×õäDCìö@ûyþOÏØ?ŸñDQÇ÷õ~€øëùöw°'ýEóÆ'ö òOú– €±WŸÁG¢ËêßôlŸå›xQúDQúÿ £“§ãß[&¼î ^M¿Á˜xØžs€“Ø06B€¢’~çW±Á÷”E ìU£ýþÍ»adyK€Smƒz䪟œü#ß#ª½FÝN _xÁÑj/ÍšgàõïñDCªúßßß'¯GB£€OÚˆk9÷øëN?—_ö= ¼òd®MÉGä‡ÿD0&O E  :êÎgÅzýc³èæzCèQ°Þn¿êÏŒ§ËD)ßv/Á¶ù j_ÁñyØvUJ{K:>è®ÏìòÛŒcsËþb"ˆ‡ßÓ2CÀ P"ˆ†kD6ÁǪ=ü4}‚òîY¶Øòd)DCî ¡Fb§\ÿ?ñ'èð|¿á6,܃ñØ£Iþ}šëú£ò?CÅeÀ}ÏäQ¥Q ‘‰ìýqÁÿUPèü›™çôoì¼_øQ ø/‚WoÖÏíòª•CìƒÊ‰?@‡è`%ãÙìûzOÌDC 5G‚¨½MOÆ\ìŸ@Š"?µQ DQ…ÿæ(+$Êk*:K¤ akð @ïüWÿÿþÿÿÿLX‹Ý{ìÐð®šWmUU)ßm {žp××@<€÷ÜÐèô».µ{e&Ø@QA@@è Öúhè46`{mji€>ûâ‹€ô4¾:H¢‚‚¨ˆT‡…ö)¦´èÕ­‚û žª6Á®özùzÄÞ÷“­îÜûs¯ow‘ØÚox"’‚‰(%*T¨<Ö„¨µÖ•ÐiÛR–¬Ñ¶ú€äë Å:Ï­ï€HR‚€ CØÀ*Š‘@… ¢**R((D¢¨¥ŽžÐî>›Ï´Um­QAfië)C› m2f$REÙ·;¡UJ)³¹—66°SZJÒŒ 6  , 2[fjk-5B€m¶l¨ R°¢@6¥2_XçYpÒh*vÐâôáqCÜÎMa{¸xµT½Ü·zá=jkE ´m”Ù‰–¢°ç·•qåîò€)pÙ€, ¼¨t­Öê†Ú=»—»vUÛR†ÆÖ+3Û æv:ht÷±ÖÞçRëM-ÖÜ4¨7¸õí™kTé¶ïcÑ×ß{¨RûM²š°}²ÌK^ót-´=i¸íÍJ@:ÔŠ M]ÝÒ’õŠ@õˆ{aE;a!i¨r»Ñ@“,C a×g½ëеH)E)mä% •D(  ª tQ"[bÒ½±½žóJ€P  3`¡Që Qí¨ QD˜½Ùë@»8w»µ¥€QE›\@AR’0°O]{Ìâ :è:(Ô3Ý r SÖ¤PUU*@€$ dÍ‘5 ¡’•mª QJ ]²Šv‚”D”5•*…(Q@…P ¡B¢U HªHÀØ»4¥!) PB”(ª*  ¡@‰TG6Á)ØÁ@«XR©DP ¢ê£l¥váD‰»À4  T­  ¤””€ O€´—nô>¸¼À>¤µhQï·KÁ%[>÷¼Hd¢Ó=»£i•0i³J¬ÎLèe¨µ¬FÌÚçndØh4Ò™C0Û\î ™@h!YöÐ$.ÈÛGw`ô ã™]ëßs£w»y°ú‚ ‹Ï9Ž“¦;yzzË%àÒ÷ÝïR¾m¾õ÷xù™ÞçÕl5÷};Ô¬ÙKb÷¸¼ ‚«Ð(­-¬ËgÐÕ]¨QRˆÍ›×GhU²”›¶cTÝÚíµWw½‘žc£lÚÜn‹Q³ww£Y5é©$l-Ÿ{9>^ûÕ8Þ²¨']Ý×mÒ±´ ÐjÕa³K—JîÄ5fÐelѳdz%Cë^‡@ÎÀŽ\Û`Ë-²Z0ÛQZ)ó›é{ÖÚ Ói>€È.hÓB»k´Æ2Ù¢Yµk­v}ÍrÈÊe5 hÄ6ÂmÚ˜ÀÐVИyÏuãÛ×väDê¼÷”ó¯¾u˜Úû˜‰è÷C‘vh@éÒößX.ûÛï¾»o®æ¢µÓ‘ =8€+ѽ½æÓÜù¶=÷}<²·×3¸€7`í[0 F§vëeM¤{ׯËÌÚµ}5Av·-ÕM¯v÷˜O°{Êk@€A  hM DF y@hdh$”ŠJžŸªž£#@a4Ô€¦…$"OI¢z™= ¡ ÒhšD‚D @„MýMG‘” 0€DA ‰¢¢iêLL‰OLi'¨ÁDˆ I “QªžÉAêz€Ð49#׫ä¹çÆ{ˆ ºE@P/EÓ*—0qå×òk½ÎŰ#‚X±ÐéÛpÕ¹®6ÂQý*ªvQÿJ,QRTUªªªªÅ+b/Òª „PBĸ€(² HˆÈ¤Š+ + ‰ «"*H#" ")A`IB !€‚H*Ȳ È"¤Š¡" Ȳ’ HŒ€€H"¢‰"È’ ¥ÅèŸëþ÷õþÃü?iýÿ×ýÒÓöÓûyI?oÊÿË–ÐøëΪ«•û³ëÿ5Eì?ÜLWþ7¶üoÆì?wg¸ýÑGßà"Iî=*zÓ©¨ŽêäönKx¼¾ŒÍcÿ2õ¸b°öâYòQÚ¬ÂR/_2NŸ`ËÿÝÜÏÝQ)Uû*¡ !(J$¢ÿü[|op7çæGSžmýëK^pû‰é½Pç?[ëëN kúïÚNX7•¯?·øïø§×¯ïœ¿—¯ÄmÝ|ÛÛÈqÂ>Р¿×9d÷^Þîu}sÏøöffk² IŠÁaîuf`Ü(%T*eOj‰b@WRGbi³ÏÏÇ1ñuÈI S ̨¾ˆRåV åSøýüõÀYQZWQ£øÆ ¢Ta‘óãÏ‹_iî&?¶k;þ+ï¾z4@ƒ’ƒœ¨MЀzÆ5|wál77!9(OÁE $ žù«ëâƒr„§¹÷ ‰BŸR ¬À<ÃÔBÓ>>×ýN½;œêÙ ƶéŒyˆÞ(J$ÞïßÀDŒÈóç‘’Em½_%ùŽo{ú>þzoåþ0X `ÿ)m¥´¨6ÊÔ8íË80„‹lÒñ§Yë:gH•<ï‹;À>Åæî€ Ø+!(PQ~+Ú±(xqWÍý©\Phö·«k´>mAhæ1ävåò~ÿ~}÷Ò¼wîØõÎ(½Ûƒ®‚žÄ{²‚N  O±puþE8ºÝ©X§*§¬©·ûø?Z ¡óHÔD÷†@6ÙîXOÎ-Zo‚Œ BŽ T„5óŸÌB³)ß8èЛÀ:f„Úr€X‡˜ëŸµ‚„Û~/4ª‹{Âæ>=ßgµ³µÁÙôy(–…àœRœ‹'˜>žt•?Ntºì~}|×nð:àúÀÆU$&|³É <º1( ÍRz‚õ{Z2*o9@鬯’kÓ·¿ÄÖ«¿/σ‘ÔõæÉy v§h˜ A9ëGRT¥Ÿ³ØT #^{óz¸™ŽÑ¶D£ÑM¶¦ðÚ/ïhõAâæk>7ã¬ûZ´÷¿‹–µlã¼£Zœ¢qÄ»JFC´øÚ?¯ô~_§¿ë×KüDbƒóõ¯…³,§$X;=¼R‰qê£àõ‘ïÙv?¢ÃàkØø¶ò±¿Ø¿Ù¿Cèä}Ïsœàønÿt@pü8x¯}5MÉÙ£·v•XV "Ñš%áÀÙ±®û~]¨øüô8éîvu1Fð$'èÄ"xàóæ¤$oñ>„©º]h~l &«ß#n|z¥â#¿ñÞiÒ¯ + ¥k[ÒÇ Kþ­~V/'Ö‹_ÜýÜ0õÆíÏÔßø½úïŽàù5ÙÏdQH†o•pÂT PAÈTbK ’ŸÊ²5¿ L·zfDÕHrŒ­áqˆsÇä³ PO]l: N­ÂǦ ü¬{ö¥B– (¹ •ûr•Y*óA-øiºŠ¶t*päN6ÏÚ¹û=“Þ«Wm5¶Ö/°ÐûyýÙ2 ¯¥²/¢~þ˜¶ÿK-/êdLg)Ò·b³»Ô(Á– ;´˜¶ÿ‚.-K÷‹Àptw²ð%ÖsåmûgÚu@BŠêRp¨.•‡LC^)K»~6©lMw™!VFáq<«óûþaw:$"¼|‰«0–˜Öp׊ölr1¹œŒÀk¾Zÿ~ÜdS½©\Ën·ðÎC­–»Âí;™ga[ʽÞÄ\ÐÜu­V *Ý…yxǰ¶+\ÖÙpç×,Œ&ÍEPø»Ð/0Æu»¾ëG…i«Úak²§Â_UjÙ=Ü­í…Z/éávô/ø÷'Âwý©ýý,ø!þ3J~!¿üdïò?üþù÷ߤAÐòQ7RÂ{§VÛû|‰®;Ô|;‰²rêü°‘Þúx ,¨_Ñ™ÆûÐrð||:ù0ð\³^Hó…bn½åâ|C™Õćø{A ¼ P‚‹†ÓFj³ýb€w²e1l½ (áɇ·ˆà§o|‡=7™uŸ™*Hk M F\™@˜a%fÙ¾îU†±\7ýî·ÃÓ‹mECý‚€³’Ù#hT%˜,p¡*Š*°À%PdW+%§fk^®{ (¾ 3{KµDpÐX!C”*³~™Ïuå…jnÐ\±«Áf$•\q€&Sï˜æ7l¬$ *LÞ\TÏ©ćž0À|žäÜÖVˆÛ;úøpíÖo³$"GsF‡¶wxNAU•.õê}YØP$½Ugz2?PãëäºS™at]š²>~} ›õhO¶wÐþØû}j_K‡ÑŠ ”3úvòÜ# sßùm¹öÕ¢¥°¶ÍÔ–(•{ÙÀR°QÏ_ϲvÇç÷Òí¯ µ°L6¶ÍÛ¬ÅÞoÇòÀRP¢…E ‘ØlùÌÛ ‘µD+ˆÁƒ$ñü{¥±ß¿w°#Ä(õß–TBy!ŠÅóù]Âä{ÓFìc‡õï~?Cùhò‹€ÇgT $”×%Ý—•íXˆGžáÂÑ¿AÜ0JQüÜö¶Ô4RâañK°øî-]¹2^šAý=³’ÚÆ Ù„ f0CÂ^D ¸› ÕDÞì$RVª§·ÐŸžÝÔxñO˜‰»~r×á¸}ˎݸˆ¤ÞyÑúùÿsúdDƒfTX"¨Š¿öµ9K‹ÆˆŒPP1Š(¢ˆÈª‚ Qå°Xª,DRAQ©*EUЍÆ+1UƒbÅX#  ˆÆ"(ºQUR(*‹‚ŒH,am…AQ‹T?ì¶Ac|BUb‚±AEEQDaøBÁ`¢ ‚±c/t«EEˆŠ¬:¶(°UPY–¬X*¨ª,ˆŒTF1X*‚Š,b±ˆ±b¬X±F8Ïìਪ0‹F*¨ÁU@F(±UEU±H«U`²"Æ(²+"±EU÷¿°*H¢Š(EÁ íçïúð9àvûxùŽX¨äû0Å~kzÓ ÖÚ­yN?z’-ŸÞWÄ¥-s ÇUÊCš¿®#Y¤šñÁúß]ÇÖ¬šŽ¹$_Ç¿¼O^ÃÃû„ƾöµƒÂ‘ë F sßßõã®E«ã²ý½ø·ŠßŒþô¤~F{ ÁÏÊÀ0\ˆfÔÁ_OqÊú•‹M•–Å\¿¯‹PEEuN HÄšªðª! dÄGúzvbpÕp8aÄ,…=Mq”Š9Ã÷tï~'\·Â\ó®Þé(…EÿT¸Z*hûH¨ ’V.áKB eR䬖â•óõñðY´ˆÏè7ã4ü7å†k|}¿B¤öæ °žÊ¤ çŸ ­kŒsèö4ÏßÖê5Šd{‹´UchÏ×ç¸ö}’^{÷¥±Ó!=o»O+–-ÏŒÆ-¹ãµù üü~/úǺ¬"èrò5ð6õ¹…ûnÐ 'óçª6W®ˆÈ¿™?nÀ'7(?K‹Ÿ^ÌçD *¡HOóøÓ\$/ùãñãa׋zy×fíœoxÞ7îþŸS“bê+<ÑhÿÖFôØêN<ƒù 0`¥j{8¤ý FüÙêž”3rÊÛD»ö¥˜+s_¬°¼íl~)÷¤jþô2r4bŸð=|WäÏÚ½³¹×ùñ'ÝàÌby¼ŒÙÙwüaÁ§l/máæAº……ŒÖ5ñùVù·Uô`>ûæ5#å»<ûþj©_šò®Î{}Ä #øo ÿ ·æ?K3ÚÞ/ÁUìA_´ÐZ‡äù7ådI R‹÷^øš" X¹q §r‚G þql±ü´Û—v.áŽ$®Ýüs%%Ö⟮¶YÇýMW;ábÉÒ¹ 8Q}Û¯ßÀçIɾ~ýÝ$ÞY“cÑF. ȼ7t‚Ÿ/°Ç–ÅʇRSÌxˆEfZ*èLþ 1r7…±âœ!ŒDH¼3V¦­æ2Âõ šªŠœª†0R ‚(NR*°’]tî1‹¼NžðGöûÎHä ‚ÒhÁp¥pÍEýÃø{µU,i¹SÔ¬£:dÚ9ùÌf§êÜ?-ÿþGÌ<þY’°H…Ñ{L¿!pCʬ†—U])Øa÷ªŒˆ¿¼Ã¦JâŽà.2á`w+¶æ©g#;Ð…ï;QÚE»#¼rÚZ5à-¨Í*EXYb>SóLïW‘1÷U#ÍÝÝf5áE‘.`ž@úÍÉD oYt s¿¦¤TÑÊ`ç(ÁÈ€kÛg" ØbP(¥ˆ"¼ÆÉ™@ß‚ÕUofÉ‚b“=Ðû†ãdÝÓ˜£îÿS3ÌÒKÌü½îpಿ‚Ú©_³.¬¿ÝóÛ·Ä,’"^žp±…¡Ò¨¡ïvÙi"Û/Y–v <ÅVÀNa»Ó3Þ`ºQgT–V¥&uϦJ:Г8¬=KøÏ.Yô¶ª§î-D@Â) Ø(!ù„e™ºVv‡]:aïÕuC|éÅßúw/³¸ÈáìAØBäã£û¾Nm¿â+çÃ)*·`ŒfªäzÖ‹y˜©¼.ê$¦Nꈯ—vW ÑˆyŒ:á?ư0èEñŽXtµRÎêÁvÃLô/hÞÀÿ¯—ë£Øã£Æ6ýõEû—K`ßðÒÿà ²þÖˆaSüˆƒ€õ¢_0ÎAu®Ê–„Pf%Ü®*î¤)­¥œ§’¿r-{¶W1a KƒQͰÁ‹f¨³·Þ>Ì’å ãã¯ð»VxD\W/gô±úÈ cß…dôe©`0R .ýGò,9·!'ú{çnÿGMÕ­TLT‰ãŒ&CÈA°·)~ŒMà5]¿ÆUÅÉ£…¢ ªX<8ÃÖ éÄò ¥|aAþ\n0‚à ý¶“©û7{Þ~®ýC˜œr_Ÿ›ƒAŸÄ†?“ôì#ƒËTýZrOîã–—ò“ž}Î)ù©ø{êÜ8Ž–jíÛZQ!Ä:8G3OOºÕþ#ýßæç"ìÉýGoý‘ÿ¯þ¿ÿüÿöþ íJQáH‰wRiJµ5ƒõúÿoáü}uÛý{ÿëð”oð)¤APPmþ‘ô VOçßl(­ lÂ¿ŽºzW÷œ~>â²ýƒþü°Ç!ÿn dÞ¶êÈF®ç<ð•_TOÛT§…휞/.#ï<¶C=^°xãËÙ¨¢ï¾sÀjëý½ƒøZн€´}d¯÷ÖÍʸ÷ÂÐã"dÿ|ËÈÀÿ â·ÿ;m7§z×Aù™£îЇÿTFáÅjµˆ`EÂÐ`]¸ê ›×nMªÖ¥1²åÈkÔLkipR)¿Ä´l]Q..Ž¢&“Ã[UâŠ.®DžK>´%)½7ÞÍ!îÍ}­hW ‹Lbwr¯ëõ/°ïO¿ãÝCÈüžnÅ…–­G ¿ê'aMì,iú?½ýÚ?E..uûáS|Ì ¼‡â™Ëi»â(C “†æ-]¾}ž-[=α@–u,m— `ÞÅÍÝšªÄ±Y?%`â—¿žÇ‚õ"ÕÔ7ÙC¼,]0¡åuEw ¬¤(¸s×뻋ìÐÚØvu3°$2±æZ¯ ª‰bQK”*8ª¥’!™†–´¢°•• jÆš!/U©Hî ·_kÃe To¶Ž#Pkµ;}y‰ÉâŸuXµ?{Wïã‹?à|žê³{›¿ß*ëf™S-*UÿÚGãÿ¦ý7ZWÖÞ¶§ÞjGÛô+÷á¿c?¯¶öÙQÁç\¢î>ëÇéïÉ~~ë@®GÖÚÕ/¦Þ$–÷ývDÛðËyb?W…%˜ä…cºža£ Äù ‹¨¯íXãp¹qòw·nßHê™ÀŒ9ud6ðÄb*T=7RÔÎìÞ÷Õw3!Wòe†ø|»(vݶWñWŠpàRîÁ¶™ÚÖç(›^“f¬³oU>Ôá–‹ÀÓ.æ‚|—äÅ3CQ»…ê®Ö«²I¶öwÄÇiú¢x-ÝrËVUe5Q£•WyheÛRÈ ÍhdŸ0:èFüÚFÛçNû[N-o,R7"Ÿ=/6¯_ð¿_Yûéóm´8»îäoÙAäõ@ïWô^c…­ê{…Müâ¾wf'e‘û?d ýÈߊÓÿÿË¿ØÐb,¿¯¿qð0S×ñÜ?CqZk~ÿ·ÎÓÄu÷|û  Ž:ûõõïÜquá’šX =áq !ç¿‹ÌTÍ,ÒË ÝV•"–ˆqvT)_Éñ6Ü ûÞ¹Oƒ]o/CîŸ-¿K2¤%UHYïär¹­ ä·ûû*æRÛÃDC½Ó¼Š PÒ_üÕÅ)VS¥þû=–Æ—ëúé©qòÉÅ¿“zV[ûÚGT]‹ªåŸ"/xšØÃ @æAiŽ©›çš_Œ2fßO2MJbªÁp¥Š…3<Ê…yQ÷)¸1jþYÐ.¦£ ÕÔé`ƒøUÉ+Dés¾åVœ·\Å© ¡™!鲇ü_Lçû]ªáLal¬Yÿ þnC¶/9¸¸uÈ4ð²9ý©ŸxæXsoì¶ôëeœ/4ò`]c¶Þ@8žÕ=¥'’e5XÆõMÏqk´)¬4B°ôæmDšÔZxØìð3c&ñ`Ø«è’(½ÿUšvy9‰ÒØæ?¹¥Þ•çál7ý†6î"þŸ|/÷¸Bç}Ÿ¿PcXµù´ðiÝlu,×ÐQ•óJO Íl¶°&Œk3jFl7|‘ÞÓþzÄ¥ÖjôgÍ£QG?cPÛV»2ýÈ»¨ù‘6ðb—ö!¶Ì7ŒËßî¸ÁÌ¿¬/.ȯ9öûÞ£dÛg/|¤1ƒ¬a£krâµ=CP½ï.1«=h _»àYÐh{‡6Ñ 7Y«Þÿ§Fk¶DÃï™ÃŸÒÂçýÌéùïÍÙó<‡yƒ/ ÏíE­ÎEuø\´ËfðJEKU‘eH‡ü7êx0S&ì»ÞÎÁÕ]Vm;ÔC*œ©*#Ó¤R•lm7¼¶Vßw¥êd1"“\:õîÏr+$=ažÊ²­®%¶‘³i_&Íf‹aE^“M½í:Ñh–†xÝ£ªþG®®?š¾ìûýo·@¦¹§¾2Œ~ädÕü|¨ú7Ï®Þ"µ#2yøý^2=ÅýõkûQmÍí· «º8^$Vç_þ¸¶'ÂÖ¸÷ù¬"Àö^9(îþÕå—KÏ›4Yr<ÈNÂÛjs¡=T?s¦¦·¹ÕUörƒTG­ÿ4wW¦jëo#hÁãuJšbû™e]¨ŸÓ#[Ø7šòøŠi1[³Q7 YƒíØÑ,²“A[áíf'ksïÓXÛª¾†`i;1ý÷ˆæþÛöÒtîû3¶¬¸Ç7ßeù–‹³ kã^¼‚'¶Õ‡ðÞ_£7ìŹPîÝ:¡óªZ¼´p´Ã‰&£S„‹sëÌ[µðxÍ3ŽÛûÛ/½TÍyÚºš‰Óß0°+@DrÊXPO‹XoL>#jÍ—ùãB7›1 »ry‹ç*ÄîèÜ… ÉäF=çnDâšIa„çõÝ«[Ϋ1ÐeéÝì8 òB‘ALÖ¡Vת^VÔ?¸íÍ$\fÀÒ*yaEÂa_á ‚F¼]è`ûþƒÞüGrÛ5êšn/xƒØŽ¨oðØ­.¶7ìùPtZˆ6j[–”–4v ‚Ì©G‡pw\¸‚ËS­ »õG.\9õ•bm…)OñDÕK?/ÈYÁ‹ý8ÅïSÒ9P¶ *Ëó]á…‚&–?ÃÁúûä09¥÷±ˆë—j…;KԪ̗¸G¤Cû³nŠçéŸ06"`.<ìÛóµdk>ø¦ô8{ÄçŸËî{gØEÌÁ –P–êðªˆÞ &cþ‡ø®ß!~þé÷â‚ÔßàÚxØr5õ9kYBë»äBv£¾€ƒìJŽ?©Ûkqήƒ?z0­»ô*b ©p;nqeÛáûg¿ó·®BŠb¼ŽÂë&åK,y&¡b¯÷¸þ9i´XþP{‚ B„‚ 5"¬©î¥b>A ]B’I)ÀÃÍõþ?òUëñ8‹Ÿå|þf‰¡Áçðs@àVÂ7ü¨˜ô:æž}ÄÛ€kjgÛ†zmøµf’ÀÈ?ÂæI$c¾Û8¨çõTµð±¼åç=2Æ»ï~¸üïíÐî™4ÛˆcÛ€ÑWN»³r{\®Õïõ˜ý"\|q®:NÙè5þÛàeý}½¿›ã}›|…$ª‡OîëÞ¤ûðÞ1ÚÛÿÎý¿¾µóùão#ú¸gwñíÌ ~~­xø¤Ðö'ÚqÄ0 |ÊÌVÕ\ƒ¯¸è¥q4¾˜§a\u‡a×D|Kⶆ v££¯4ól#GUv »«ÇÎX¿ý*9›|~ºß‘ZWîDÊA UZ f”Ÿ¹ lýL[ÏÏ¿¾~\úˆkæWçÿUóõ×Ü`bŽ/‘Ø(©m‘M¬Õ é¥sï!¨ÿgw£44g°pÁçÕ•¨\Õ~‡žEG¸q;j¡q¾ÁAñçaÕqaÙj.oãžf/-®ñ€ê=lô™¹ wößDÀ~÷ïì]‡ïz‰ C0cîØÑÜ; ëôþÆMˆXÍ•ßÛ-ê›À ëWߌOßÇpÙ2ç‘…ÿgÝÇïû"’ÿ §(¡‚=JŠn;{ _ë;Å —ÄMHøá¢ñì·¼kêEqét±4¯Ú£ zP¿vã¾hí¸ v½»˜ oüÝ¿ŸÊòÿ³FØÝã·áù<¾‡ÓýlîzSÕbÉ_Éîöñ]ì¤>üQ62ÔcÄš=þhi“z fÈøÔ™™®EX‚ H))œù÷ÇÏÛµñé‡X úçkùQäcïÍÇwzûûÇÃ;WÜï¥ w‡Ã'¯é_ã8ßãÆvç)j{}¸â6œÀø‡h<µšý”~ÀMoÚ¾¹}ðêYN=B ü V.´ì ÄÃJÙB­gÃ'Ò 0>Ý'HnVð½êû/ÀpîïÏí‡XÁ©×ÇçÚªÿî ’€OoÌc Ž?3Ø uß×á¼á8øzCnz®½V»î ’Ù» ÛÞRŸz~8ÄSë}?o?xø½ÅWã˜ÊÇP£Â £¬u+¾Ö%{õp”Éî‰äŠ…• b¡!•@ÏíS³ç\·äþ[nÛ÷ú/ùqOÄb£"$A(ÅV(Æ ”B•__^Ê>×ꘈªZþD¥Œ@·c~×PþzkûM²ñªsÛõ°ù 9·“ü.ëqôÔèoN#ÎÄ> ÍŠU¯†Š“5ô|ÓèÖq²µ/°TR*Às¢Ù~¸zã{íÄL›qgÝG& NÌoÛ Jj—uâ™öæÕÄ>¯ß:í¶1Æh·â‰ùarÖ-Ò¾Oãn‚ea $…hìE„Wè@ÓØ5ÙñÙ±Cà_cµ6?ìq2¸ìO©Üµ7Fœ'ö‡Lë‹¢þC×MêœmømoCx¸Uú°·0š· S{Þ¶áv¹ Ôe½µÕ,<DÛ°ò$}üùvîßeã[äÁ’ÿ»Y ÊY›Ý^϶Í:/u÷ÈÙnP&à|õ=yb~T iyŠ8üäýï§`‚Á_Ü«û9Þ‡•dðd´¤€üÂÄPøÌ§•´4Õ&Gˆ˜¤„­——8¯uÈS”Ú+ôÕrÛŒ{k›çú?rhXQ£¸þ³JMž¤ä*PY²Ñ°PMVÖ¡·ˆ¹ch±fPÿ–ßÉÌ‘MâÿB$ A‘ MgéõIÜêŒ ¡$”;ïªSŸç©©ò_­šÜ#ŠzYp^ÿ,M ÕW»§¨Ø‰èà:4óg-¾¼~8O}äX7¥5´ Sm}¶ÚÀ%È?ÔcbmÒÃÊßÞõž…ÖPå"~°TvEC…µbqsõËöý¾ i¥o~Páãêáì -è@úeØï³T9®|¿_×'U;ÿTëþ?ß:AH¢ÀQH±V@':*:÷ð÷ÊûMІŸ²ìáoñkn‹‘>à1nÖ½þÂÀö{;çÚáû¢ƒùöﻳTê 1V´õ“g¯ßìÛöŸ¶ÞÇÙò>MH(A˜xë9«üª­•W¢Úˆ\>üËN*­N7F½€¤U/Úãæ÷]~¾»clì<{{úÙÞ7ØÆÑñKÜ€>1ä`^Žs ,(Þ±ãÚíõ»yÏ\ ‡ìV˜¡ˆfLY=¹^ñâõùšÏ±ñßq²zo°‘D¯M³ãrÝÿ¹àý¯b=5u¬4ô|/΢«$•Of–¼ãoBÍŽk9–½Üê_3ÎÃÈ®=ø÷ÏŠ®ûŠ(åt„oJíNÞþ>/⽃w;‘¨ð¿Ÿöÿ€nßnݼúݶónù_ß\ýû­'ιôùÇËT  ¥AR )!•H]›³z?ÄQóÜH¾hQ~õo‹}pô¬ydßÍçBó\p”®R2]©†|ì÷þm\Rímë¸FHÊmÀq}€Tª*]’S^­3¡jÖe ¥(6g‹6U=¹š¯¾Ó6ÙšMõ$­ƒ{[ñ–Í{ó‘¬Ã`Ž7g ü{'ãó¿çíâÖÞx38=Eg¿¥ÀõxûWü|ý¿ýKt©¦Eü=‡ÚƒÜ{|´ºO§¦tž˜H°ò¾-ºùÛꃊŽ=á“Ö‰÷J½ùçXã‹m’PªêƒÔv(BO?®ù¯ëfù#‘ý”{Š*^½• ©_* Ê}2 túUõ™º•Q(¸aD¦qcûJ@oܵÞŶ´¨—•®êì`‰õhúå[{-FÍf6<@…aZôî#›V˜­rêb­xP¦‚DÈå„fF4œ†Sb¡”<¾" ©rš¬ŠmhZÑ2?fŒ]Dvh{‹»¾å­äo¸v¶TMž=ÿ{{íP£å€Ï»þóË @JžÃëíñ]¢7nݳ×éÓrˆˆJBEü‚`3Ž{(Çú¨ñmÅÓ€Øí¹óSþ>ß'ÏÊ’GµédSáIò«o†§ñüõî êCCð´7ÿ?*¾òÃEJ|<œzþ½uß¾ûïüþ#[y«R#úÿ‹„ ‚™ŠðÿF…úpjÙ;|8ëçAÁ‡í ½¦ïèYZ˜û#š~„èET^)OcìGóö_¸ÙÔSãzbA…RJ !D>¹^@žº`¤tDÝ@˜öªÑ-O«ýŸeöBWCÏã¿ëo¡¿á½ˆ‘ñâkíÞj)u@ƒß¦bX•TvuéÂü™ïŸÇð™ÞàÌøXåO‰«æaݲ u·M3C«ü¦‘§üãB *U‘ú‘Ñj”ÿsèMs,¥i³Ä˜ã¥‹AãUŽ’MY‰€~î©B.n^Ê]ìE„D€iˆ3¨ú Å3Mb‚ÞîÖca« þU}“ÑTB·J8íÝ„nCB¦Û3Œ7ðîÕâ( µD8"üåHÅΚô·èz çƒqóñéÞu(žßʆ¾Ýz×Í|¿öŒŽqK~ä0ñ’6ÌŠ=Esù˺‡¾Ñ‹ü}:‹˜ ŽþÍ«YÛéÍV„u¼›ê® »~°Ÿ¶Öx¢/"ìç}ïÛ¡k棗ø?€>ïOŽ\~¾¹›ÑDµóÎ öþY}x;s^óДâ¶Çe J¯¬2'Š(_¨ai öºÅÏOθµ+z>¶ÈU3âwIqö¦õÃV倩ÎÅuI1ãáE^þÎAF=¶Ï;' ŸÚ§°·]oçÊÑõø‘^{E„û;¤_ì9öyx#•ç€äwjBšw1ë÷ïÒ§É¢ºðÝZ<¾Ëãa`HÝÑ*’xö·æ@¶õ«Ü ‚XQYnÎ.é–4`ðG>]‹‚¸`]í¬°y5rÍ`R?ã¹|C¤?AÊõÿ™u‹c>ùñÏ`:)þ»‘„†íÒÏ@·0•øvc ñÐü;v_áá ‚3¡kÒÀ¢’óÍžj‡fkJÛXaw@—96E‚Œaf‡Ž"&¥ mG¿Pl>õ $UC(“sbóR <û¾¡J‰cµÜUÃnCŸ÷JE„gàØQ`QxZ´<7†‘[¦ÆF³ø÷Z/­«ø÷Ça•%8ýQª°rè®êËÙÙÁ*±L^YD+ÂìÂzqËD—%%W=q¸ûæçëjoÆÜñÐù–&J¤ ÿÄ÷ŒÜ.þÕæáG~ú·è{á»Ü­¡ßan@¶ )š_”ç{.¶_?zOÇy† ³…þ„í ­þÏ~ÿ;kËÐ\Œõ׬6æœtPl°̨ñA]H,H²૕–%J‡{” Ïi ] ÂE’–q‹²^ã!çÁ½|ÆKþ‘ŽlµopÜŒ&Ÿ}¹Rf"È"w€ìóûùÿ^Ïõä+`"YH añBUƒ"ȱ@Xˆ 0óóCP×÷Û!Š?ŸÉH@Ä`±‘U$YIE$PY H $dR(H@P"É’B,a°µ €¤€¡ B(« 2(H (&³âôwïûë—ðû÷пµÓ[°ßÚ‘r§OÌÜô[Öîßeø–¢ün/:B6P¢þµ8™„µ?ä?t!~=‚=hþνýñùŸ&c½}}p:>ÛzÛ8?×û÷¾ãz¼ÌñUJ Èáv¾]i bœŒco¯ŸßQëÊÒÏñ_ßãÚg@( ’ZÏíõw_^£Ñð;è8ÎÏ÷ËŽ¬÷··‰aŒCÅ”Ž^Œ7YÙÒ‘ +á ½ÙFJ”gqW" ¿ëš¥¡3+VlÙ¨ \ƒPõQˆÚ±ûªÆŽÇýÞœÙübl0ŽàGc1‘„ep-ÄÉ![>-H M®§î°AU!n«œíÊ:YÃLjBf†%EÕƒº@},ü™ Q5æÌŒ3É·XþaªµòÇ¡›oõn6·˜ …cpQ[¹¡nlô*I}ýæ°¯O‹¹Å ߊ²{>ƒæÿhr‰Ë{j¯8„‚ŸØ~˜o ýûÞ_´gÁR·´Œ=syÇç—Žî«ùRFw— «D%‰P[JÃJ·Ue‡Q´Þ²ò¿ª<{yCÀOØõ#iÇYÁd|tÀ¡•HoüÏp,Æy¼óÖÍÚ¼óà …£ ¢òG… ò&”§×†€0˜ö›7ƒG½r®ôð}¸ë9Øy¨ž7/Þº@'¹”+‘ÞÉNÕ×5Kø£§;¬¹ >{vÚþßä~Š/ÿÿïý”_êUTº‹û(»¿¯Øàý߯¿¿Þ›c_ÜÑoƒmÌÓcc&ÑÉm üù@a D'ñ=YæȈ'øtÃÿ¿ó¯‰r–­-ý¥ªh*¯ëþLî ‘Zª]:å{÷fìݼ ÅU£ÁVzBÎIÛ7wG¨<çÍ‚¥æ9U„•w9D)ZÝL—s—},ÍÔ»c…²sr`í¡{²º³Fæb=´uUž•œeV›ó*ݰê÷OW>òzŽpéÞrqÎ ².®Ú °øDéçX&ùÜÙÂWl÷#,öâÍFÕÓœk:µ«&ovŽX2²ÊÜS¤çuµ¸aevåæíòyÓ¹€¡xð=Gq—/¹k¼Õs3Ó£/o«¢Öt½JzªrÑìÏ.©í»ÉÙ®»8 Ur§(¢Åa^¬ÑîœÍ|<ÞÖʾä¥f» ¥ucA—q»•³³|÷§nd<“–±¾;L½¬»Ùä6³¥‹Î|o²«“vG"ˆäÂ{4³ k–cæï’o–Ë(UP’¥ÏENOe3¶ž²ö•`©WË,ïn¶óFÝvVé µ•ë³ìñÎÚcíÂL¥wc;1XÜ›º#«±lÞ,'„á í뉾ē&нåzí\òŽçNuËÉËÌ»—.¹²<½²:á»ÎèZøyÎ"—§Úíg6Õ*½êÓÂM<”æÔíš›Ë×|mÚ¹¼ræNk¼\'y6Áěȴlkº4®m‡;s’x³L£Q伺û†w’lP*VÒl…:9¤í#=ÕrèÉ]w}k¹ÜíM\Ñѳ¨Ž}¸¸Õ¨bÞ‚Ò;Ò/"g‚zû4‹º%]Ž"ÕÝuww¸aäè÷up¬bë²ïXð„YˆE˜²&Q6cÄÔ±ìd\H_È[g~Ø¿-ê ¦!Ä7žàoµáght‡¨¼øSÔ“Ôš•‡Œ8“ÇjkÔYˆiò‡‰Þ^:Ã1°8ÏY ÏY'D»r/Èx€$^˜í¼¡„q†GŒ2oŠæñ\×4õ1Ì"‹Õnèæ“/Îs u8ÉÆN˜k(¯ˆv>'ÎS\gŒÄó—c t‡Žõ{`bN"ø“«Aò˜™i;@òr‡iRvøãÝp§Y}Pñx¹n©q2ˇ1 ˆq5¬:`wܤ\qŸ#‰‚@Y)–½¤‡êC‰™V}û4y|—1Äî§ÕZ„0”3<ŒÄ<@Ô…˜Ÿ!ÁzQõYmÅS» I1Ô:IÒ"x“¾ÊõùÝš“Œ5'Œ 3¦xüùEy|ùgî7iLê']k8ÝÒa×4f#‹® j ÜöüꇉXN‘ ³³S¤÷Ûâ´ñgؽhê².ÊGš(ÆòƒNi’|êÌË;9îjzÂ|H6œE3цùOø‡©×3ÒÛ}Â¥H_”…I+ŒÕI_©_:d;ç;ÙÄ›´;Ú@©©¥CŒ:Ië!îPõ!ñ‡¬’kÓ<@ñ›å/:ÀÄ©![Õâž VJÁ‚ñ'†Ó‰Zö%N$˜ É1F´/ŸR!òãd ♈fÌí©<@õ˜›Óç4Ÿ /¶‡‰ÓâCç—y}Ê[g~Sc$øÃRO‡Ä?Q0}šàDFêãzP‰j X0ñˆKטž¤;{}}S™ÏrN…ÏoÆIÞ×2„½ÓÄøú©ãÖuWPž&ŒÔ[ßy!Ÿ>a8%B°©<¥ Ä:LB|êüËv‚¾XCàÃã‰5™ÕÏiÛ:ór,5>m1êÃј¬äÍ|C#)x²ÉõÌyl‹<øx¶o b™?‰ÿ Rôþ?ü0ÿÃLXšUBÿê£þ͉ü8fò”sÿߤ ‰5YÄ:R´+Vâ0Ãί&ž4UEˆü²ƒ¯ÿJsJ«Æ"í–5JËùÌ\´ïn§™Ó¿9 Ì–ðé*T£´ºÔ`Š¢ƒZà–q¢ÝmzÌL|~éfœÌ:nË‘É}Ìã®R¿›®¸•¨á‚«ëeŠCôÝl°¶/þvýoþœ>'EQƒÖ­·ë—ãÏüº˜+2ÉFt\À´J+ÙUF(ªą̊¬ë: ‰¶—ñ\Q` ©ú¥Ÿ§qT¥¶ÒˆŒKKû%{Ó3"9·Œu¨ª¬F¿‡xßiXø¦å¯ä§c·úod~"V¿¬ÿÔñ6<.+}•–¨å¿âo6?]´$‘ÄÃ(¿Ò÷Ì8¦‚6Ê)x”ÆvÔŠ«ÏàÌ”¢øÏp-·¢òÙ–ÑL/»wï”ÄS¿³0F&ôÔÌf …Ï—X§Vñë*¢¬šÊºƒooh³;AhÆ1_ß. ©r˜jX°P?†9F/·íõ˜±b$C€ÊËO¦OŒÔØÊÆ+Z0ªwKsŸVšTµQë ‰{Oçwˆ0UFÚ}Û«Öá›e? *m±jZ‚У7*ŒX§ÐJW?‹1ãF–±Y*oÞ\ŸG øS:¼ÛÕ¦¥bÅD9O§7p¦ZÖÒ¡™Öc‚ _Ñžu~qBŒèhUó ™J5•U J£"“ôÕÿÖÞ’ôÑXŒ\õ¦§Ï 'J+)¸`+2•XԢŴ£´žf¹ê_Õ× 3ª`«ývͯ敂?M–<þ$”bCAU:ƒ‘¼»æôm±XÞäûÁÞ [JŠ'Wb\±å4ƒi¡’¶fq¨vÕCËbùj«Ý–,|¹•Š,TO×™åÓ†â¶Ñ{ˆXÅUÊÇ#þœwjª,TR.x—d¶±)n²¡R^Û%ˆï í×~Œ0F?V¢Š*ù¥ˆ:ÑA Š ¾2¢ÙJ[Z×Á®ßÇ9Öô¤~5g,* ¿-ÊTjú¥úK7™“§œÌ ü~×'v¼ér–‚·.:ÕQö”ˆ‹Ëáó¯¹×Uq3U‚$£)û?œÜ±Šñ¨«ŒY[–×<vèˆÒ•á~d£5æUDÆT©Tzë3œÏßlXûõLãJ–~[Œ¼ª¨±\j¬ÛAá¡´ÿ®JŒÎÿl5X©Ì”üK*Dp¿rŸÙ¸s+ÏÏ3Um*(~_>©œyèßßæè“ŠÄSòXX¸…W·LAH÷¿‡Nò¹br…îÔv†eS”º÷i“2äøãüm9¹…Q(¬G¡%Š0R#1+a”ËC\‚í±Y[hQˆÄÏßnÝ^3ÜÜøµÉjó™‹Úöý¡ÎïC“öoò’»Ê˜3‰mb¤Gža0gV³??„&,tîäQŸlÌ¥?wšâ0bPT¿²Y3îäSJªÄgË)»ðÐõäè¶xÞ‹B·²¬¬TW^ÐÞ’ÛEk_(–Åš3ñ¶h­kå¸4AYEOïtýze6­}2å(‹íöÓ-Š/¬¢"‹ÉoꨊÅËU[l[{LŸË.Ò‡mjQD¾íWÛ ÃæT›,EÄìrZÚ§êÑ|ÉŽÚð%†cVEåï!v•вU¹™šÌÕÚf ¶Ú ã.5ŒÇ µ‹U·ø·nÜÒÇmÊU¶V†‘8[Äë–u™EÉRÚñ­6Ê~©Ì±5•5 q•+m²QX©×Y1G\Ê™xä>Zò׃gmG?Lû¥ÚUTó¬ÉÕ¦1ßË×·¡VuJЍÅ+8˜×0ãŽ7‰ó/V‹8¶ÙOÆW-xÜJÎ& áMÉZ(Ô žPÌrøâk/Ý㪊/ßã0Wº_Ã_*Æî¬úÊžÛÓQEƒRÁel*-‚(••Œ`ÇZ± ´YiæTÆ­¦áöaÛ8èZµ…Q\úúÿ³ë_LüYê."¿)C»QÍ.-}‡Ôz¥ü\΃øz‚i ÒHf"¢½¦&D1|ÌŠÇZ3FÞ[€ëÉBD{ÀL‡öxJU ”S(§„b'…õ h]U ‘ÀC¤I¥QGû"…À ÔPKG"‡aceS*Ž(-;H*… ”°¡èD-”°#qSd 5Dn †!òªs ÁÔOPÐ|Ú½@À©Ò º0ŠÐ’t m ˆT2€ô‚ì±ȧD)Ò»ˆ†Ò 9D+< 3È«iŠD RÚ› ' &[U `ØÃ;)Ô@–‰/WÆwŒPŸ­˜Å—o4Vx€_DwÎqWÇâ"èC¥  là2ÕÐ+…ì‚RzšÏ»«ÒBP0¢d@Â&D ‚ñhCJ¡´ `¦Ñ Éý¸ÏÊ$ÙæSóHqˆ5ó˜âƒ)5ûÖ¼ÓMˆ–…' PD3ó`'‘L.s }j×|Ö5ßûÃ’')|À¾÷Ñzi¥f’ÇÅË©Á°hfÅCq™ÇjÃ%†‘Áe… £5Ä tƒÅ«BÀ¡VÜ4Fs—šýÎ Žuï2CO G>îÍ;Bˆ i“L¦'îfÛ—•™ïDïE"*ƒ¼’è×;EH”axn¡°b0%Tg\ÃÃÎ^yÈ5&K¯|8~pBŠt˜\;⯦À¾IšRãP*•*Wp´ÍÒBÚÎçX ²OžYÎ8'O7÷À‡©aÛñ¹5=hS<â¤'}4ƒð!îTwæâûœ(R n:Çî-«[r_ê³ ñSÂ!¯«ÃšõæöŽz(‡×ÑGe ƒ”ýÓ §‹(1ä; ]†eSakä£VµtA§L”Œ¶Ïg[V Q¤QcV í;1ä¬S5þC¸žÈ0aBÚød>]ïñíóÓìäzN0F ‹ 0¾}èO¦ 7®cÃ>wNQšŽPC‡Š¢µf;LÞ˜!Sœ&36ù{Ý3 Ùm@Í6»¶ƒŒ¶/™šX=ÎPKAA éÑJó‚£(Qw@ß׺¨>åÂ’þ“VR<ïgœrèôЗÓÚN´õÀ[÷{ù 5gÔ·Á†©$šÕme¹T…K(ËbµŽ˜£q°£¢ éjô³¬vVe`Yþ‡ëþ²PJ,Œ°Û» ´~ò¦ _?=0 —£æì¼­÷{Ú'í˜lÓDþ_݆‘;ïËIP7ëóŸs“Ìû|ó„Ð;‘ÂÆ¼T3nì¢õŸGO;6Y²ø ÎG4ËÝ$•˜Ô0\¦Gp9·q1êž4Ñ‘2 2¬¨D+Lòk\mÙÔ40‹r¡öUB‚ª0 jÜ|еRâ3—€4ò¤2>4#Ãw>xpçv;V#R¬·œÐÉã0c¢wÙ’w÷M·¦|û¡:viåM²PÄjêOt²ˆv<0®ü ÃIðw/;„$ G®F¼7H‡ñ¾(ñ©ÝÀ€a6wwÐÆEcœØq…IE*6+Ø ²€I`…ÈŽð~ÝqÆ™fšdîi#ßÊpùxx¤¡>_(ÈM]¥£±Åa|ƒ&±YÔãÿ¯ýÏëÿ;hª­Z¥+ KgýÓþïû¿ôÛ¦8ßûÔ I5,;ÿBD¯óÿ¡Ïôô§‡b!5§¸¹Ëub²®T†ÒiàÝo·=ë˜oH É™ÎöÈbï®™^àõP}{Z`õ"u…ƒ[­ÎÝcœÎÝUX¬’wÑu+ VåáK2tu±YÔd2uq[[H„]ß3¹Wµ“P¦Á—ËÍNe¥0ÖJ¾rdw`0ƒdˆ«ÌÖ;I[.G­j–Ü×É ÖÝÚÇÑN%˜T»g¤@"eóàŽ3yM÷ª¦tèìEs¸l±suä÷UòƒÙûîŒ_–úRk„ûrµ½úÚšü=g6g-rt‰5ÙGÛ’qWOû×’Rëòl„YëBD(\Èz÷'ræ_¾û®DœïJò§?UsÜÏ—”™ q…%%!­Hcgf§ÛVøÑœ\\ïNÆulÞq¬µÃF{¹$–Òœå„9ŽÚ==.nß:9ÒÜîÖõzt_s]#7Ò¥-å¯ÔÑÍ{{ˆ£ÓM+é¥"§ø=õÙõìÞTÇ/yg¯73Fû½'Þr°pÝot*ô­‡!Òp÷õ•Î8½ÃcêKHöÔÀÃXÕã:¤€ŒYY/$kÝHÄ”Èõ+BÌy¡Ìï–óm9Æ8__L®Îªr¬šñÅ‹$ñ’$¹!Ú¨ÌóVk_ó<3Ï}-Ë¥ìLbYô¬õ­|&qð&ïeÉæ‹±s4Ù±™Ýâ:ˆÛ'{5‘˜µPœÔÇ8-éw4¤"B Å NnÛ<èèãéœ=i *?‰f êvFD"^Ljv ÄmmÕ¡)+XuŒÂºynîht‘]MöÏäÊ5Söh/0¥·Î½K&¤ ·œ–ž˜Ï¬"û&Ã9½ÒiâK&yíÕÙ’;¿“hd_,ðX>Ý¡?¨Þ4WÅÂ:Aý\*×ÚeµdùÎ÷˜õiº%/\‹™9©{’ Ÿ4®:Ñ-Q3K;&‘Ô Ì+Bˆ´¬³)üÅd.C&§9GžU^K¶. Q ðÖVæSh‘"xIá…”_T‰f°ÍdÜÌÈ8y’kÙ}Œ-ãQêB‘æ¡[‹H¯:؇È⥓!#£9ÈX>®bâÉǨh¥¤+ÂσU<=_˜çñ#+‹¯Ø¨±Yå Ú<ùÂC˜€çªj² Â!±R± "žH¥S'$ÆH Â㛕B,VBtÈ4:Aê ñPôïícGT*¾Cëõ\f¶³6ÔÐøPé¹c€² ïpä(Y ^:mnÛ¬u:rsy³¢ŽLÙa+aÞV µ6ækz3Lñî=ýtaª7ê•ÃiÁEÚ>?úeé;8 1oá©ó¹ªh‰“š„ø[Ìv¥H­á8°íµS,éÄê犜íõi×Ôxv”LåÑÒôsY{ËžÕw3$ÑãÀ’š}ZtS¸=•u+Û™ëöÔD娕k $ëÕµVŠíVõMͱdåò·Ýs%ÿNÏ?fÙ~T“´9#™Bžúvö©@›®8žëßÝ“éßždàÇç?­e Ùž…¹.0²Çd÷³ÖBè×½×ÜœåÃE 7†ll‰ƒ9Z^JÁ§ViÆçuœP=1¢ˆ'øà›ÅX·Ôã|ææ;N6[¼€òwpÞJá)¼hlâ|ˆ­B”ï'Ê•Ñû®ùöÙÐmœA½ž”*û&×–Þ]½y‹Î™&o½€ŒÎñ0G» îŘ·§¹ìºÙç¿®õúÍ]þ¼Ùbó<@_ ‡I”.UϬ &ØÌÏÕ~ÙºíMú½v,‚ölªRh‚”ά°¨¤áúí1š96böÐÊeˆ.3)Ù•ËsÆ ŠË[=QÒ3-²§gΰ‚ïy6E”­Œ33»ðàI¶‰Äˆ)QI³B?*Ÿ¶À~}þ>Ìâ~Â-bGóZÕå»ý¬î(uµÜTÑl‚6®ÿÊ]¤E~5pãÖ‘ü“Ãí Ÿú%sÐDÎOóxþYqlµÈÁ,BàÈ)pgBiU÷µ =Ë÷´R¢ùùÇÀ”M™?Ùe|´¥ÃlZê(œJ;!I—y„%2ÑGõ³Á¶ú Mbkµó@¼2ÿL£‹Peì¹ìá˜<º³‘\a®IB£8êEá(êkÙ²âÈqŒ‡-[dfõ6‹W³Ûf²¬Úꔺœ`Æ¥Œ#~f©çŒ†‰ÏÔ'ìCMùzïÄcè©&=æ.}^ó¿ï§­}6Ü_«ùh¾”¦üžb‰G“pµÚ4â-@K ]*Ú6Õk8+|eǵXŸ«+éGøYžÀF<±¿ÒiaÌ ÜÅYš°‹røZYo Ko˜kĈ"8ÙñˆØæimXPdz½k/ª#_/\LpV oži{Í”²îÔ¢À$AÐ Fb ¨P¸6ØHq ©êåÝS}î6ÞŠÈ Rõ°†ÀÅ: µ7¬]Tу]×옦ÕzEk`'Okí™ÒæÔí ÌŠ ˆ7â(4Á»½´°h8"âôm iÅéz%¡K-`*¶U¤†ÁØ2%8< ¡Õ$ÕÃÕùÎâ&µ¿z@ÊÓ}²áÉÛiµ¤oUÒÙƒž¨ì"½qxˆazUìÞ?Þ€|R'9|>ÿVx}™Å›ÎF1j´;”´ñÒ¸Ù¨û0ë´Ò4Òv• _ì{‘X¶à0pþöA 5Rò¤j¿²ä,Îí'<ÔÒjÄ(qT—ÄÁÎ6›&°)f‡ÓßÎÜâ•år¿UÛy_LW«ö¿HvÆ<ûÙ/lGøÕú~W=~ý8:.yyƒn@ˆ€Ç+OˆÕÚîâLZ[c³kjµé{«rË•| -†;ÞÖ €¹nÐïj˫չ8&F› =]%ð@EÍÊéãD‹0ÅTP@ªpU…,´Ø@­£’;=¯Ì1¥F¡ðx¢ØÃ«XPX¸øïUîÃØÄn½ur¯_ò¨‰?%~_•0—9¤²q9ÓÖÙT­…k·&R»ÓûÅç毟»û°?Ýç3ߟëFãbùߦž*às/å'9ËQVÖ¥ZŒ.tYóröpÖÀÌRË{•î©@vÒª…&7P J­,¡Ö»hœéjI›­vp]]º©õN|o±üä_{ ïþÝßWòæp-Ý›DDÂÓ"šp¦šƒ¯E)AxÝø3Æe…Ü?mï>Çxa‡ç2Зú|š³S‰Å³›wçd#=*Äή£(czš=kÃSzqŠÕT-[VÊÏ%ÓƒèŠl(â®Ãœ¬ V#‡u°1„,ø–3†›žl“%²<ý°A=Á]} °·…À„–“—rË•cÆh7y>¬ìŽZÓ‚(<¾Ë ü-h*÷Ë6­Š€WµÞ«R#B26™CÛæZØ…¸»œtëíëjsÌ?µæÖ±¤VϱÊë/B/ŠÒ3)#i€r©™FTðÎ7NäéEñ¼ë*i¢Ù½¡Å+ˆª‰CÁKã(×w4mŸ>~Îõ0,a>¤3×X _ñM[[.³ðþmñ¾ÚO/h1éEjý¶•ȈªpÉ-K3×"ÀìˈYwZ¿4·ï^Dâ1·:i[¸ ˆR³Ê¬á(¶» *M¹XƒA[-]V[ŠÞs2ÑWÓ¿,§jC(]\TÓCk+5†²ïYi3k"­š»žÆjZÍ£˜…µúmßÑ‘ûÑ÷ƒER#!Z›ön~Û-…g*ýœ`½/p-DÑcRsVÆTWf»X6­Ï, /MJúWAúõô¿È$SåR¢FGøCú}ô—*š ”Ðâi-ûåiì:­ñ±ÿ\tŸ³AüKÔ×gïjÚϹڑð£yî¢Ü­#ù\f–•¢‰ ßnoš1ò¾îö‘Þ’`ÀèܹŠFüx~ôRi·xˆÍWµsôR•)®× ¶tp½Ý0GòEi˱ÇeîsE‚Ä •)$/9`AãhŸ9f{†£-Iil Ukm]°5}†Œç¹¾Wa³ :=ó+¹¤fÕû_‡u 4½ œ5/}Ñ(sÈ"(b*~/æY¯ÝPD8RÁAÃT*í”r7^7dÁæ+ar¯VE¨!:šV¸üõ®.-\úÙh‡6ñ‹?œè¬yÅ%”unv í ¡ùSj õ§áeû*tPb¶Þº‘g§:à…ÒÕÙ"‘W_›RµÍ5HR8çšáøâ¯$ ›Tà­ Ñò´6Æýðµõ‹V)hßfôr5C‘$€¤^Êñ2a~¨¾°½‰UJ$ehèiŸ…¯.2Ý4ˆà7eìåÕVC"í%ïðAÙÊí%D½Øô p 51Q¹}$ž’Ô;ýÇt¾‹¢·n‹˜ÿ«J(†.ŽÔ ¡˜`Ö`f® èv½0÷GZ£wŸhþ-~ѳ܆öS‘=@Q[ÁvÑqÞü8˜žÞp,cµ(@íÎ_uE¡”¨®Ã^™9‰)¯«ñ*µìÓ*9Èm8(G8îTÑàR5Ãù#Í… Ÿt°á½­¶_Šq-ËbÁá%E˜Už+x\e›Õ1ˆÊà+õL;T9˜MM=ŽˆzþÙ,Ê N×ZÚVhÕ…k÷ëX­n0ÛÓÆ)ƒš"—®Ò÷Ÿ*¾j;àoK¶Ä\«íuM_[V0–M°2ضÂÎ’QtväTf°7w¡É|ûb–ç åxVM¬æ©íÒ‹¡«ÌŠkQÍÑb(½YÞµ«’)?ÅàåsòâÈmž×GÕ+´(!”¾Ï¼rRÎ.¼^|/…¨¥*Þ4¥@Û{ï:÷µŸJã; Vó§•`¡kµÏ2ö@á¶6Åä¥cåÇH‡ QA@9Ú`B޵!Õž%Sq¯Sí›0£-C‚T‡Ê‡í•i)B7!C¨B–ømêhØ;-×iÛK ëÄ¿7}ºæîüã¥âyÐo+_/ Q¿j×UÎ 0‚6gÊõÙž–¥Ô\%nÔB (ÒÏ\j÷k ›0¨fg ñŸh×…®Ø¼{K ]›Ž8Ú–­)ÜjÆÜQèø¾YB˜V¢¬­Ï¥Óɧj¾EÄwÔ`â——ÅNa:ǶZ´†kíª¥FC¨Ú«×ŒaÕ|*¤kâSØàÒE€uݻÊñ½xó¶EO5kÆG³fäb{US½êÞµS*$˜­5ŠM ê̪ACËUžjaŠßö° ‹iêàU†ÎàÁFÒ´Ø7GNiü"ÝQZ¼ãÖyÀG.Ë‚A«­±$óÃÚqîü¼§¡µs5ŸoõXYCJ(Z+v4[LÁû–±íÚöí6v)‘c¸dä†[ë…aŠÀÊeÞ€`†ÆÇÉfo´EHu;á„EEKrÌ×xølâhïš)f>åyîn«i÷ÇQIö×L«ãß}ǵ¬ƒœÓ€û(‘àó„îS% »¶,Î (B«•„’#– pE´³…$bôF…"Û­ÌPðÔ þC1æ@M«IäÂd!¨•eT•Þw£q —%]©ˆdâés#ÆÏzø¹[Ll6«ZiÜ0¥ž¨þšÒh•ð€§¸¨Q•¯OSè…WH!Öƒ†.,³±òËR“L¶J=cà´(ʬîÍup@hTøµ |˜¿\áR0 •"ˆ kö>m!o¨ÁxÝ„5Ø(]ª¼ÐmÞ“Í›nt2Ê\Aظ…ùª)43´Ñür6±qÏBS ¾‚…ƒ9uî7nÊ@·Pϵ7gKó¯kNæÛÙ“ä%{VëëÌ–“W«?u^çdq(›¼ãO>55°¬WUƒmØ7¬Ð0£Xv•!Y¿ä ~ÆÈâFüͱ,Eùú敵ÞoüêÍè•iœ8ÃõË;øZC¢º—Æv1šõÖð“ÉXª¶ë’¥Y˜ »²Ùöãi¶ŽLŽŸ³v¦ZÒ×ÒŠ/¸Ç'šJKΪÁkJB< }"À!ʓƔ¶ÈMe»Os"±nôPÝ-¡Nœ7/qÎõÿB‰_}éž¡7n½; ±¥ËD9Z/õO½GÇnù§oJ÷§¾üÙ_Ñ õ—=â®#ûuy|Q¶)aŠy×çÅrû7íw°±(»’®6Ç=ý¨Ù³`*Ù°4£~ëAž»qˆe¶:½Á‚§1^¦q[»É5%ÖÁòzø34¤—»ÞdÚ–Q–]í6Å« µ‡êsmØRÛÄ<ú†øqׂÚè¯H³ŸqvêÂŽ°D?Q´CUÒCùe¥#hX  …&ýÝúžÌꢄ\acµ*•4£þ²Ó =ªÁ³Ä¸ˆÇ+ÈUpíGr”¡Š5Q»¨}¢ƒÊÔ1RUxk”`¥Ké@rÿµ´±w9êã0Ê¢X0؇;ªÆß•g#A}nÐÃYfEó»°üá“bçÅ–å§&H§#,üáà]iÍ+ņN5Ï!õ ´¢Éâ¯Ä1G)“ǵ“†"—³RrÞõ«P žšéÙ‹å{¼È®Üê¾OG·#wæ™G¾£š'5îaÑ~U{—¹ÌTc¾FsÛ½xæƒ`pym0j€ÿ_Z¥¼%³ªóÙÃþ×=¯×ãƒkf½õbž;rÓJo7µ¡ííy¿<µ¡Ú£ËXÇí¾ÀìV1íÞ)_FùíW=çÚÍ=>Î/ê­ ,­8•§nÖ’Å­ÿ{ãŸÿûÿ拏ÿpÿøï V»êý¦Zý¯Þ±3ÿ|SÕ!–Ÿõšü{ÓU³Qóÿ¿þ_óþãõýq?Þ-ý¿Ë†tSòA@²®C^¿UMÏ2ÖÒÿå¤ÞÞÏün€ÃöB A» ±R”ÿ¤¸ÿ­Ü%4%Ø’÷_õÿ`îrÔšTÖ‰Àyµ þß­/Hä|rMSý?ʼ¨Š¿¼1s™ÿ÷Ž #ƒ‹+A`¡ÖvŠísµ0È8.Ìd¬'B®v4Sì Íåh‘LJ±ZÈ:0&²ÅuŒÀšK…P(„šîØa—ØÎÝ_Yš ›7»T7°ìÔ"0lÊ”`‡DÐ[€ÆÖV bŘ¼W0ç`^U¾]ÖMY MåÕU–7—™Ðˈ]«§ÕUWÁG=K,6VÞB{¢k^´Ãêªb:%årÄkÐh—€¡Q1­z( fîPPXå‚Ü—ƒ>Á}e„Ì +"(‘È3QyÒ†s!—l‡]›±j­Þ r¦*w€ð0yRÑÞžç Ó¹Æ0Ö41„õHÆ}QfÈŽ°†áØD«;»Ë6ºL l.¾– ‚¨ šØ 2,‚‡ jãuÞ"Ã× Æƒ1–±ÅßKà&‚±õÌ›”ÌîœËUc €*Œ+haSjE eÝ!´3Ê.¨†yU0æš±0ŒÌS8uæ¼"’7Ô¶Äì™6À­u¹£ytõªSRè‚÷—Ù¯s„ƒEH¦aL-¦Gs§¦Ã;xë*3#"ƒo³3TS‡j®{(LZ°HP ‡:"Ï%¥Ê#jo•ÈË&hŒÈÀÆ®4öµ\ÅÁZi[ ÖV’%Ûe‘r$9 4¡,ÔuX:èƒÃ’ăPeˆFðÁX˜âÜðÉ“„JƒI½TÃËyQ×(**A@Åô²(i'pZ9XíI$޼bÁ©I‹W"¸8‰]Aö)¾AÅÒNÁB†Êœ’ Ýté-™íË€ñ ‹uÓ`ƒ.)˜ÞÇH¢LHTwDë±2“À¾*34Ëݰ$pÑ×ak.{v(N Ù˜0 áÃ.0"0lpê) £BÌçTÿÔ€û,d]R¹­jˆx(’T2‡¼à<0:²À¢&ùl  fi.S”„±%†ê(u‹]ts™…‡(ÆÀ¡€ŽŠ‹,K ä©Öë)‹xØÌ ¬'®ôÈØ‚„‚°Ãég"Ê‚  (ƒ‚ÑÝW*4)>… tíf‡ƒšœŠ5 ÂdÍAá¢hqGTå»Ìðì½[½Žh |!(|+&h.x¢pÐÎzP›çrЧÜ4!—Òf`ÞqÙuýԘäfˆ#uÚè*æ>µÐ´õÉ{#ÄtmBºæÞ¶*Pº„nÍE;ƒ"¤ aÊ’6$k™ÊpÒ­AV ÒÉÀÒÂʞƇb}ˤÚm6ã¨"ú@îº5tÞQô+ ¬éÈbjÓ΋Z6x‰ÝC¾ÕÚÁ‚µ£AܽÇBÄÆ‘0p«}&6E`r¸JÚ„%¢ø&$Øgƒ†>³AatH»Á¦bÓbx®³ìm>]Ÿl‰Ç™/›¤;) ´`Ù}W:ÇHΧ9ˆÜ;‚òh2 o.ÆU”ÜgRŽˆ›=ìñþ?èÑûòÐô²üœXùýXýh1Án'ƒ?ÝnFìãR<§ÀîdL±~)`“|Ĩ H/¢é‘¡VdåÈ—Õt©ØDºRôˆÎ媢9uöĆ$28¸€ä u÷A‘³qq/%@y;D*0/oMÕ¨Èn&ödôß]«aqvµc ,ÅÀ qíBhÖ•t«r­–ÐéÑ“21™ÄT¨!©UA–`v‚ÏsU‚¹–ǰ›%Ä ÷”»a‹4[¸ ¾4’?,B'­[äîôcµä|Œ¡ºŸ8—ÂH·á¾EÕMÐ`hVA轚»9vÛDšêºQØÃÅçt¡nÑàÀøC4£t‚LM &…f· ‰ºj-rÍ °ÖPQ£F܉u|’^a™½©9´‰­ÎÛº‹‰`07 #‡È,‚1^2Ùˆ^õÑ!b†–‚˜“¹€Þ[Í2r› !UmbË«¦64ÙŒ’Yî@1ñà‘Œß:#†åò¥BB§»“œæƒ²Ddèu2¬»Cxq;U5æ%i6ciDŽ2‡aæãÒ3ЫPÝÈqŽð]M.Q=€ª·€±Í-²–c ‘—LÛ )„Jƒ@¶Ê5—"­uéU6+)a6XÛE<Ô–Šê¡DHËÌw³¬Æ¼)àÀ˜¨Hãba‘ÚbñoÉÄ݉£³²`]À^< Î ìt…€ÎépÊzE$H— ûˆª<0ì¯!lñG†±Ã;ÇœÌ83—€˜À3:DµJ1U8DDm,qMÉŒÎdŠø«E½ËÚé XJËÌ6jØKŠ3•¥1Ô£þ#þÏùNÞØ´ÉAølâø÷ù£úŸ×Ýô+ÍÀÇ;Zþã¯n¾þþ8öà¿ô¥ÿTñÛø÷qú@sãÇÛ=ªÄ öžÇ°^ y÷^8Í®BÉsþÏÿÐÿ°o÷.=üw=wfl÷ª²Ð4*1ž`=9«ßIÿ+&¡‹ÛízÇ-31F‡Æ6Cõ‚(íhb¯1é|’ò•À!ÝfÒ¸wQ Ì-&ö¤=ƒòÓŒÁàZ-Pižy;[¯K¸Ñ·m·šÇÓÕ­¾QS’"pÐF쪤uÈPÁÙ**½ˆzb¦Å êN6Á7IÚ ÷lŸå,Áû,@€jyF¬†‡²Cí,l«14Š#iDvˆÉ¡òòõZ¨[±˜¨ã‹Ed¨5 乯ϣóþ—äKBÓ®EE>œËÇ2™Ë3$0áÆ©ÀÛ ÇHX"ÙA˜tÃæêt†]ʉ 3ç³õh©û7å—ð< S4uÓK ÅÛ®ahåP~i˜lüe\´¼¸±D2_íúÍŠîä¸zþY“oÌ3(–¨µ‰hÖÑÁ•‘èë+½Ïüÿ™][’¿Ö[—µb›8 ZI†_þV°,ïüŽ¢@pçýk¸F4k”j¡Â!î­ŽÌŒÊ`ìJP©×žw¼|ÞÇ­é Ö©Á78Äâšeæ3ìfa5³t ™€ÌrŒl¤VpŸ+w‚¬ñ<$€j@kÚ*"Ò#·Ž°Hsˆ {µÖ§¤W'A€Ìu!iFš 2*2ŸE:-æÈpb”^ ':ŠÙœ°ÝQ†QÙ»×M^ðºjÆ©«kBA„ JÃ-n ²´àêàâiÛeÔÒ¸j¡­] ñÎ\Kí$Ô"J6Fjv†Rš™×Žô-&€ŽpÝy±¶PQ©… I„†bÀ@!çb»»4èvÖ÷S f–´E  •9–·NÌ86ïˆ{íõè|쵫ní°å†»ŽÈ6°4tÔƒOg2¸C)P +r"ò6@kŒ…„ ÂÍ ’&…ÒÏ |cM¢°Œ‹€»M…ÆÃ”íÄ_SÁ•ï¼×Ýè»M¬Ý½Œí5ScýD‰5^¨ÌN·ÎQ¦›Ïb,»1³‹ÈÞ•9rkd•Jèu,#HÒôðéËux¦tWp¥Z2³ìS=x³æwsQÅs=0jçE¾Sçu·ÌZMËÍìÎp±& ÝW‚g'ª“.¯Wúût¯tÏ&ù3ï/Sµ]W¦{öãäìBkÖñõÍL-<ÞõÔ7¦;í÷]‰]ìgÎ׈Äß,¯*be‹§'(‰[y¹V­ 6ÝÌ©ƒuã•T6ÆØ:í,N—hÎÁ£Ÿ%dé;¼•÷Vó•.m ê¼æòd¬Ü¸o{Râçc¸Þ#© ÛT7*Hdâ92,ÙLîÝÙÅ7&6çM,sJˆÝ­®Í8ŸV^ѶG › }jx<€t²‹‘dßsøêé}9]R:nxhy¦4ÇM«êx»2`OL£ @Rr0‰]6w³:D²FËÌí•X}Y§8ª9¬,ò`jV/"Q§bðk #H¼Çê#|³µ›Ý8öð`·»çg¸k^¯XV`‹5òí¡o˜/]zf0Ëuˆ %%‘ؤñâö65¡ UÝigÁ8b®k¥—[«VI:B#¹QЪBK;¡Š²·BÑÕ¤ œØˆ]†cDYº#6\®ªÅ^ÊZ˜E5‹~‘•D:gQ6| lT 0`—œ”†ªÂâcT— ꯞ/[¤4xÀñãÝ"QŽŸ;›óöe“)ÔÒëÎÂÓ´ˆDif¸f®$2±F»tNb*ÝC]Y–$i Žël:tÉC¥‡&F.ȨVÄÅع&§P$Z¹ƒ¦ÌêB‘²éEj² #&ÈÝOKÚ»»/£$ai 0iÈÁAqiŒÛ‘fÉ­2¥A!Y¹ Œ&гÀéH³q$i%ì‹Ê¦Ï)1US+V¶è„FÁä]­í¶X%P[¨fôÙx‰{4@íÇ45‹‘¸ ‘¼l2DŽît*ó[ÄOfÁš¥Œvyœ ‚H h‘Me$`i™sÑÁ.F+:tã´ÕÐ%^uvnÑî3v*h œ±P‰!Ò!ãœÇ}Ø0Ëèâ5 ˜Í£t¦×7·Ã³3I‚j ëX6ÃVE)²†±Æ Öm¸:éOíÄ«I QÃ-&ª¹áëDÝÆ–t„ZMÌÖ1½M—im»E‘ª\»11Y°ÖÀpA”t 3P`„eR¤X,ð§[“8Ü03f_rÍ»3†Ì4Л‘âÐÙç—L:s€ÞKªe †*S•bUóŽ W,«"•Œ H´iœ` U‘fƒ©AÀ **ÝTÁSÛ m‡š¬ÖMä ‰ /PÛu¨B­»€1]'¨ƒC,¦¦äIi¢§,KªE¼æË;Ñb&]:*>(ƤèTΠ:†&¹‹mDØD’!h—pRìL›Úmeu¼jì3 U ×Di‡;iÝíÍD£0ܧ.¸C+jëLš¼3¹“Àº¹V`·¹ºÈÝ8çzzèð³¡ä…"Õ5 ’ÈR,0²fc+_ <¦m¶[´Ùuuç /¹ŽwaX­éÞPLÀ5´Drÿ¤$‘†Ì‰öÕ4˜Ÿ©)”Åa•_––ŠJmÍ$4È&ô0êÝ NкT_C¹Þ¾dè<‡µÕØà6¸Tʌ٭µU/ý*(ñW¬Ù©ž9·,Õd¢a3ºXwô;4\謓z.[_k¾uu2&'-ù™ކr0»ò[ô+ã÷}åz$|5àÊÈâƒwïYVÁ èV ŒB–·£ÃÃe®G½'k PížÝ—SÄ{É›‹¢6Eo¸†e‚‹+!¥IDƒÄæêú¼<éŒrSTÓr'¼ý¹¾³áG;«°¸ „ŃžéÖ‰ÂÈš÷«¼h3RˆöLo‹É„)—wN´BÅÏ:ŸkDñëð ˆèV¥‘ÉX­7Ãdê-5z²ƒ`F£/˜›]£y4ó3ºòSrîòŸ l}_ÚÛô½r<Š@‹»”|pµ§ž±Å›(ß,]j‘Þoî9-ë6B™°(3™[²ÎÙ  YY6 |"‚¨;cÉ|ÊË·DNæö çÝyÁ`Ë)ðÈ–6ó@°Eå-˜œ| d“Á&±ÆièºpµÚWT¡w#žN@Q [—½¡Ûír{ud–jgmñٻ쾬×yw¤¥Ý«ˆÂFŒšÊ‰R$ ‚åº ³†£<à!npaáÆóŽ9Öœû@LÚrT¬"¸ «Žà@¸~ƉY¡–Pd aƒA EÄ1HkLô ›gžaKxXthtÑD:Éá—±O›]ÞÐÚá”@m<ªu”phÖÑ]íP º !¥\pm×o±àËsV—†Ä§“ž†ïƒ4tsXŒœ™ê¹¾«†¢b°9ŠíCØv¢ØB¢$©1¶Más·ÀY³d§CÍ»˜9—P4S 8Ž8¼t”aÕtà*çÔШ4*ÁSՆа‰ ŽÀ¨˜÷¦èÂVª§d²@@ 1!¡nÛ+“ w šÜiSrÛ3&dÜ5Ï`ÄYmœ·ÊèÝ= 4z¥Æúù»¢‰×C¡ CO[C ~ér ±UQd9 O/Gž‰/HÏ ãu¤x2[3±T·SƒÏÙYÂWEMăàÁž ÞS»€Hƒrzà¶Ó A;€Ú‹ÃÊ‘‘88Àæ4;J”IޣШJŽì½A¯HI,‘*ÈÑÊ“š=ÔxPv¬±íó'É«° ‹,Î^|€ó‹:/¨‹ÌÌ—•×ìI î¸ÅLú·@hù4û™¥0ôk)®â ]CÒ÷ªôX$ e^nõ5bëV×z‚àäU•”§hŠjIó³²Ê5[æ‘(+Ùr¥`6]>0GuêÁçlt[^¡Ý˜HwMm°¥õ¸Î…5Ef¼hd­{̳uS×"ž©Å¢Q› Šk:ʵ9Á}4¦ùÓ;§„燓C|2–ÙQ¢8ÀØ£%k žÊ**8G1–ÖDïLVi{@æ0H'ѯX|ÚÝÁYfžÓ“*‰\d·©6%É*AaÕ¦I³gŠ1˜p§HYÌnÒ·Ž,AšÎ“w‘ÙïeèDÆÐžr u‚‡+£ÈÙgy™\o Ð~l hÁÝ(ê÷tfQX˵OÞô¸[ ]˨DÄ¥Ã+ƽ•5t±à^çr•ž‘³Þ°&L—k8ö{(ÎF‹¤'H¦:*] ”ø©#s_‹Çch ®7ÌT<,‚äoUi秃x!¦Ùóû<ïàˆdÉD4È»´|=b|€à0`7´dinÅöúV{Ͱ=‚€9Ñ·b¶ê¬ØÙ⥦uwà>“ëø”ãr§ ‡¿gÉšf7ìÁ4ĘU5·²AÕ;¡I\/›/.ôwuÊ­¤ˆW˜ÇtYD3a¦eÅ»{lg V¹­yj p:•\UÑ&Ù\Ù/‚èr°ÀÊÈ$FhXcFÀèÎcsª6hwBŠ‘!Pc0p3 x“|²©›îž{PI!μO]ƒ“›åsq°O ¡‚&YiDÛ5Ƚf¸ˆõx…j–Á*Ü1–ÙKÉs:ôsëÌöøXnžié%óÌm œ¤G1 9Žs‚‰£žè»k.ûÕSâ*¼êMbà$áÚÌòjí“ܦÏñ˜ßMà‰ |Ý0`\×ü xöz‘a©Ûøûv$ ÝÏœ3úwF7{,W~оòµ¨o`ŒX+½›8fP¹¯`òö>€Üù.{”êB9ôÄÂÃ37Ô·†” ‚—fˆ‘vžV¼¥.Ñ hìíõ÷!Û}VBL3æjky‘³DÄ0î\øŠ™BE…z8®½Þ&ú¹ðí ŽÝä»ÐRœRï.ì×Z-UÖÍâ r‡L0y„ŽVõi¾A£ÚóD× a “qc4‰:‡%.,K"€éÃÝh÷rLà±Ä 4Ý$i*HÞ6E(*ª+6%æ`8T¢–VVA[V±%•*R•I‹çF½FeZd¿ÎjÐ8™d¡ 6²c‰ŸLDú{»ÌÍBðн҈¨8 =å¡vg¸øíK«Æ!ŒTW“¼ E{ćìÐy{Õo(Dô5R001-"±ï¶r.²¤d€ˆzŒÖÎñ sÏoªFèñÂ’#ÒŠa]·›|[önlêfçTÙ<’õË}!ÜŸNÕh°r«‡YÜ“É]ùìÁ3CÒ$°xé>Ê͉Yˆg­zÂ$â…¾¨ÝçÝsx9[›¾„â«’¶eÒš“wΤ.ØÛtx’Ç n¥>Ô(ôîXîU•Ùšˆ±;3Ý#¹5ƒ«dldëÙÛÚŠ"ë¦mÕlmc”;У…àÖâ‰x •Œ·yW[(Ü2ÀaY"Aé@YD»•08‹ŽåQ«›}UhrÊ3¦Éh)›/X¬Ù B l·¡Ê÷æfÚvmÙQµGr®%zë­œUáÒuÊQ"ÅÎ{_6ñâuš¼VÖ™Õ E&ù×5åQQb–×Û™`òÌO[µ·ÂÑÝ)ßI‰Ü êWÉå> l ­¢9hXÝdÖñVS‘giN;0[‘C pYñö†èä5¨ Føˆuïsæ(çZúÕN¼ºš¶4ܨ¢é£×ÍJ'öôêh‚1u+Š‹Qk×.ºÆØó.Wñ—Uõ¹‚ÄQWóÚÛßeÏ~y—£C¯s®@Œ â ±ŽZ Ù²èÖà¶RB¢í²â'±3](4C%4ÝO›º-’ nE’ TdÍÌŠg»†÷¶]Šü<²0¢ìE¤¢A‚TQ^ÕE¥×Ñ4éËENf«Ë5˜ˆ.;ß›¬};kXþ% ¶T\±"‰.(„c%Ѝ- b™VlÙh¹¶šŽß ªç3i6é¦J~7ÎâJ;s™ÐƉæØŽfÀÚ¶ ÷ÛÊVÒÚ5…ªËje­Uq®Z8½žç2•‹J:Šãn\b…R|³$:*†uh6@,Ö!¬R²$Š6Ü¢©YF)´Ïr'Nq*ôón÷~'D‘oõY°¸~ºÓ[yà§0d¾Èdü®{¥v«žà÷OÚKrhVÅÞØºÖ]æ ­2] ëäfvàé‘·Å×Àpí:rù÷ÛŽ¢.€ì_+¯{kÅL­N¿U=grã;êùåÃÁï³XCŒãœï—EX Pñ8“‡tœH0F,Eöyß^`½B`=¤¶´7R6¬J(‚Œ¤»‘Um”1/"@‚hnXS€Ôf¬È…,Å$•ÌL %5zíõ°ì)öŠ$|ÔK;ê”=r$4€vT)DˆâHú$Bòº…2ê‰;òs‰·4ËÎýìç=fI‰ Î*¨­j ²öK@)oÇi´‘@!îtßW¦1ŸNGˆíÞ (¢A^¤’jJ¥&e(pIŽÒ¶Üù@ð’:ài'œU=‚ ‡¯Âñ‹Œ.\·=±l¿9ac–G5oà›TöwõÍéVÈ ;­Q®¶i¤$…i=ÅØL‰ÏE±GjHYƒ«`¬lÌ‘&pÚª Œ›Dù² “ˆûöUÓ§êž2+Of\.Å›=´Ùé=Î7ÆÑ`ò€ ]k¡†.òÇBŒª q莀«ŽŽÀª7VׇR 8A:U„Ì`U]í@ÀîfHÓ”È@{;º<Ç  ­©ÑB¤Xj, xŒ6`ØG +†²ú=É‚tƒj• •"Bì•çÌôdò½mR¦J½‘nT‰·7›Øi›Ò<¥òÑ0Ç Bç/=uFQ î‘„ûwDX6|t_˜ÅÇØâ@·Êò×rá“~UçSUƒ˜©¤&0q÷¯{*ôÏÒã^ÿ—Û)pÏ3#ã¸@ßÇ YxTa¤Hƒ‘üùȰ`f,#ù],ðkl¾yußB˜1ã{|2êN•S;Þ´;D&‹q€†+H•B·QІ›.Gñl Ç;2Å(÷«9"rþç#S‰ÒûN<ê„&0F¡Dâº]êãNŒÀ°×¼ƒ§ÑÑÁSÇ ‰A *IpŽ1Lì‰À$ *©Œù|Fœ[ a*b†ÕlñÁËgæ/<½'—¼:f6GÔüs¬<'T®01Y;óp7—–˜3 ƒ4ÈãWyèÈ õˆÄ‚?ey5íš«“>»uÕnë´‡ÔmîT»x…§$—ŠxðìÐï‚òî°;Ãk:²k+f­ÎÕ[ºw»×D¹ÍÒv¦Ñ§"÷ÎBp³dº¬Þªl¹xõ5Åf)&{ ªÜAÕljÍã|¤2œŽ±{keî©«×¢º‚¾ÎÌ’¨ñÛ(^gtš\ÍОSÈë­Â1ͧÙ$Ü÷LÌ­«zy9ÙÓ³¸z¦o o²õÌœdn÷.bq‡vÜ7˜IçD&îØïTŠòN\šJ·©¡%ÊSM žØ FLõÜôåÌÜ>­[ØìXÕ—¤&u–hô£K¸ídîHѤBT-šqz'¯YçÁÒŒiÕVÊsÊü]ÜRµ×Nò»C™ÊVørçÙÆÖ‰Ó9³\Ïh)DŠÅ¡.}ÉuÜëAð69ð7“]@žZ÷$ö:9 £(¤›ÉìÉ£›ÓuŠîv¬i5Oª÷:Å½í£‹nø“iðeñ[BœºnfA:rmtìÂÛfõcž™Þ¹±»’ʶÝê•R&pH/Pê%²ÑF]ç$M¾®¾Q]\ ÒEªúœ$x«LÑG»CÎ@ÔÛ©àËZD¾S|ßZ™2†^ªÚ8®j½ š¬Èñp¼ÒJ„`tÊC›™ˆ—­g9–.Ø›4n4ÓîU;32Õ+±jQÙ­9Îåe+›èmÏR¬©Ø±y]"·Ev»àªvÜ®F¸ PÜÄó(DÔèóî7”Ê^ø(Úƒz³;ß?yPÆ^gÆÅÇÚ»Ó>6Axîž™óþ;ä9Ê-}³æ‹ ¹j¬9dJϘ>eßìÜ¡;)gl Ú3m5FJ˜éÕ*w($9ƣΥ¼,:À8†Œ‡Êw£§DƒH660e3!Œ¦âÈYPŒX2™Ý‡k ã×ùë‰;Í:5êà Û'‰‚r%eÚv†=¡¶YÐö†p kÔb%>¬+!†Ø ÎJHcY”Bž^¹8Ð#d± ¾•©R7sAĉÃ)Léã<¶½(n²4ÓÌa™Z/2 k‰‰Îki‚®&å‹+¬‡Lw2$/:¦ÝÃæÊ!ÄeÅæä¾RCY#´á–zšGrësð²0M;s½·y°¸Z»ÝÒt‚ƒméi’c'{FÕ˜ñ"iq£ 1[J&#+” o𘙕êHÁb 2›’˜ô§PÚ™QÚ^\f 5.–±VR¢®Åam¢J¤A Ô1:Où½Ù41«hwõìŠCõœíûæýu÷³ëg¬!Š»hÚ7¿u3Cp`³Þˆecç¢ UÉn`“‰ñcÇbðk/µ‰6xuÞiNërøš»E¤&a>t(7Ôš«96îc%z‰×‚éé]¯r QrPÂJÎäky¶KuiÓ«ÑäðŒ·le°`»šþ”L¡Ú ŸÃðQ÷È‚ŒD ˜ü(X‚ÀY‚góAt˜Ó¡»£¯02¨Tžùd5Ȫ 8…‚rïZc¢AYb²‹ÙC‰ˆj1Ÿ ˆG`“„9…¡¤b>™õA"hZŒœFÞ7©ü¾ò:0â‚ÉÞYGÇš¢çʹpÎ}ŒšÌaüþ,ü(dïÜ™ö>»{‘JÁßšSí3(3â•oD1÷í‡Z„Š4 ¯ý ÃöÀî šRç:öS¶Œ”6‰ø€|‘€"7÷=úFÅ=Çá§Óõ š å¹£ÚU‘f¿¼AbÍ\†±ïׯë·úîðò†ˆžÇG‰ø85ˤg͉g`P˜k&µ ]b[!,2šA¨®E‡ë˜BïÀ.wÐڀļ`J!·æ>vêĘ÷‹Ï°ú-ßéœÚ=ÀæÄá{:‹Ù‘0<<ô}<ëð¦^Œa‹K~¢NúU?£Œ²zB3|uW¨%çßž wíbà«õóëïŸ<è>äãŒD?ÞÍaûxX>BÑ4tÖoÖQ®³^S¼—çzäßòuIÞ¨¢Î”ê ‘€02‚€€Nüÿ]Êú«ßƒÁ×î Ä\€Bnô»KëPCdº€`‡Ù(ïÑýÿw»¾ùä„}ëwøßGMàùüÛÁéáæV3ÁÌn;=VÞÍáÅ­™NÍ$>•ÀÛ–;³dq÷³mrÃ1•wjÇ{×foôn&ök®Q¢ÂÝ po’oiå^<¦Õæpº™ ‰„ @˜—+Ý4ÇpS´éæ&i9¼áÊ\ãƒ2‰ã`lVðnu˜Á“2\Ôêá•æÀÓw·88¼æLãC[Jªêd˜a¡Í 7ñ¶$éU:3\øaøYŽ©áÈÉ ¿8‡RÜ^ }öÇò6spö± žSûz³äaQ_ ² HG_½ø­ÅdiuöFYùD Ÿ ±ë*¼²,/»#x ˜¸±rÂ_Là§ò>Sñ>•-þ1ó¸ÂÞÛíÏÁžø]”ÜpÚ •¸Fƒé£÷FçßwNN è ÚÚ—Ï*V `}ø:Ÿ©™Ý¡€ML rX¢]ÛÍ_`OßUþoßN sû`1t/ïÛ:7®V’¾_s÷‡ä¬þ©?±È<48ˆw߯=‘|_ÁJ™‡uz´K3‡×º/À®¿ÑGñ>'Óߨ€µŠQ­í¬#Ó¾,Œ+l°„‚ •*6ÖÙT@R3Îúú6NÖe¨…JɪV>8G< ¬.òÈoÆé~·çÕûÈwÂýV}÷Û¹4a~Ïqw|G½%`ÉHßá8»ñû†ôš:/_«ÇH@Mqü¾1¿qFÀ>ýß³ëå®m•ôæû—ůß_crÒW"†´h½CRLç0p L|:búky9Ê­UØ)†¯ïV]9 û£Ç7 pè!m\pPÈ3‘ÂC0e"½‰¸°p Ò5+#L¥$Å}…JãÆ‹[eYl‚ ÐBÀ# üóΜF‡Fêáð(YïCtù±¢y¼Á<>‡C씋ќJ,Œ9£ï¼­}`wߤ¨=C›¬aÏ>ß½¿>bXѤ½{öò £ÑØFàÊ¡£AöÁ/‘‡=Ì‹ðŒög7¼Íéüv¯•‚ÈϾdz¸Ó¦lŸwëË‘[¼EÜçä±¾÷âøÕÛÑ%âl7oì Šèªøbg½z¯\h#‡ŸáQ]®¦Pw§—‡ û¶®ûÕí&B^+¾{88†Ù5.9âqç{¡–„½¯g¾&Mè2ï2ÂQvpñœ_kã,ØÎyÒ>ïÁÀHjõ€:>?|Çuç±ýOOÈdð"Õ$eéeö¥‹(›H~Í[®°\Üúk±Zâ9^íh;{Τ®UÎ.ðÙîR¡œ+/Üu9ëÄT¨ÁBØÛ$šìA@d©ÆÐcŒNäÂpÑ3½y\SÎY© éjaZY™‚ÁÜÚè96å—$:¡¡¨Òû†!‡t ˬJñ K“)CZˆamE°ffBƒžÚö‘²g 5^õˆð¹ ¿¤„ꑃH>Ëü;»r'<C-GmÚ =¿§Äˆ|¢uÈìMGZó^pîä>àJÚëjû ÇÞ`]óæÀ#¿¥/.”†ùÆÆÆô᯿eÄ™ø«C߯jsóϽz÷¤püºýòŸÌHoîe§!ÜY‚Á­Ï!ïÖñïzè.ú}GË2ÇËΧÐ~øô¸Cwo½ºÉuÍŽð?{˾ûwôí1ñŒú=+ÞyÏxÚðªðS“yò ŽD8’5½læxw\ì¬>=Ï~o;¨@†$ T„¨[†¡›öÞÌ@ðÐ(ÇîÁúû£«ÕNü:­%Ø‹Ð`ïw²¾Ÿ×~@E5aêð¶Eä¿NgÝ_ot§C.˜X0~Xz¾drY—]5 9Ä÷“NOyrËs:5kª¹ywƒžeÖ^Ò¸Š¾¹P0Òy×]Ä¡¸ÜÒwϲÒ`œÎ[zd ¡}Z0d\ŽÝqC Ž 0Ìï½Þæ åXS·™›dJŒºÈ-ºê`iF[PÊdÊLà •³kvŒH‘";X1²±Á*"LH@¤Lb‚÷Æg釾ãê>Õz‡o¦J/‹sÀRÒǼ뜋žŽ[Ñkœäá³@µK>«jª!ë¿DÙï¥}Ѱµ±Äj6oY®i‰²„ŒÝ…°¢å€Æe‘òôO&¿0vzˆ}­«å&Å0 ¦ºY‰öcËŒ Š9µãûÆZ˰6Ôkí¡T–~ÊÖÑõ«ã#¾‹öÏÎ0}û'…Ì3+½:*˜³›ör#IJ›ü2D¡65Š .¡^µ3~Mr~ gìü¬Tð‡5ÙðÕ›bâ©ôcß4‹^ø<ê¾0<ûàkëñà4HéËõÍ‚®ÐßÃãH6š;~ ÅEA'Ÿ~œÞ=BOK£=òø•¥óžg5z'¿Aà<c™÷º~ÙÐö€ŸßÇ*¼[§¼ár…ò-þHW»Í®‰í*eÁá–fC‹º.e½!G—¯&)±á3¥<ÇœEf!x1…¢åzB™›œÎ '/LÕ­›\. J!Üá@¥Õ•ž}fEé¤Ð³Ü•LK ‚0>žNB£ï(8WÂ×ÑJÃù½Âsќܗ>0³·*‚®Þ0¿S¤àUe÷Âk0ÒµáàFŽýrû` Ì,Cz<>¨2sm§ ýîð©K’š‘`!PA ü²\«N},{´}çõöÆ V9D,Ÿq?/×@ê—¾1÷O¸Å»¤>T¾û¹™¬~Ûšqõ¯½_½K'çï¿@yCPs®ª¨Jº?yr_³¼ÀH'E sîïKýxã_ðøŒ¼HJ#>‹Úxî½R¯£†ðýö]õ¾|tbú‚‚£Ÿ]œŽˆ ÒïÜEó²·ò›ð¯±Ú7âfÝÓ³¥Ú—u—‹LÓ#îØÍ½ÆË[•[ÕNz„ÌæÀÍà½}‹¤ë È-Iw6UžÎöéñ@MŽÀ,+î O±Eê€ÁÅÌTˆ®P ‚Ø”‚{1)©aDX{˜nÔ‘d³òn”ª÷|Ú=§˜‰ R½)€Ê•´‚Ù!Ó@øB,Cûà¹~z„{`}ñÓàÝ48Õ-^‚ ÀE rþPJ Xû» XE2Æ›$‚Lu %¯t'¶ƒï0yߊJª•ЖuôÂI$¡÷Û%¯z/ç~ûÉtH¿l@"E‘$$U@Y;i­çÎfÔW•[eÊs%ñ1â o&UŽ6tUØ$h”/ô¸Ã™Òè!íP âF¸=iÐ ô|,N¯&~°ôBT„Yð@/ .çÒ E/7&ø¦2lÙ VJ  <¥Ï›(/Ô´›ïØ=cß?º°Þ æ`¢|µ@| @£è<#‡ãߗÿ÷½šRÖÙÍó•c0”’H¢$“G™“~¨×ĸ#^ÚfåCêó–æj+ÇJ‚$‚DgéŸÉN5ñù¢`x„cìØÇb‚A ‘ï¦I àj$Dwßq½íèå™É :ûD‚ÒOe1¯G¥6³|ò]ð&Ácé—C¤UHb‚ú û÷7/8ÎÌMöT'ÎlžìðNa¯™ò-ºpó¼7¥uPÁ‰k×kºÌ>3¢äM#®rj˜z°³ã‘Á¶¿ñæÒ¡–G•û¾1 PF‹zO;Ã'œV,yJˆ¯Õ¸ÉVÈP­Ô;rm î’a»På¢ cõ¯ ¹Vªk}‚ëô\Oi cÞ»¯®ƒÁùè >ã~X°j]3\¯z}ôl†°Í}ñá\¢º2Aû=Ph ú¨æ!7Y[wƒÕ<ùý“­ùð ¯ec¯M"h‚Xc¬}цÁ÷$ÑÁ‹ã*W<Ø/œòTé|~̱ßk>çßAÑÄyÉ !”,L(ÙŒ5³ƒã¤ŽM—¹šÿOÖ”ïÂpe¯ˆGéP&ï`˳À±ò³©ùIÔ=¢ñPfu}`“^Õ÷›·õi…Ú/ô‘õý‹å?…KTÌYDI™‚FéZuÑ¿Ï/ßàþíÂÊ"‘ë÷Ð`ƒpØÌôæçs$ˆ¥%×\ßœqráàÇn¸<„¼]²F¹íPÀ!¤9"°—wG0|ƒà×ïP_³õ) K¿G_Ú,ÊÛª.©;¿t™”oµ‰¼3Y‡)žš‹ëVæ—]jüèu7ÀH•·gT̓<½ÛÐöc-«š¾[ KØçxyzÑmAÔ©RX0Z(‘aec NØTR¨M3›Ú˜Åf×ÿኔ8aI1Eq9 N Oï¨T5gÀS0§mS ¶Xì³üöÊüôgkï7áu¦ò„?tO¦ÝîÌaœùϹ¹í³]ö #cíçUg\ë$95±©¡çÈìû7ú¯G@ ¶H ïÛã€x|—á^Vý¯¾ž[å<—Ñð3Áâ3‘y©gnhç•{ºøuÜ€¿{õàFûéøÝ«ïQ¦|¸ªmT #N30°Q+`¨T>„™5–(‚(¬ ;Nç_/œNçwÇ·Ãz–º?l.ÐîEQFTb%1„\l |€b PuÅuä²Ô5;€ ®¥Ï<ìÜÿhEÿ†€=zks¸)€Ÿù¥E ‚Á˜ÍZ\<‘HöE—:Ú݃l¬õ‹ß4{ Ô0¼Þë Œ®µï1aXAëÙ¹V¤Gkªâ‰ HĸDjzÃéÑ”m#Òô¿MešƒëßõÇ…q.*HŸU¸lJI—i鯅@ X=7øeÚº¹ªöªRówUšHæ&Í©æfò²rvP,‹ï€ŸÕ~0:~óx`mûÏô$°H\:Gà>·èópÚŸ"AÌŽ0#÷ê¿É¾ðÞ÷·5-œ7ÅXü£õ˜{S<>W¬iO(þ¤5/>áð¼6‡®,FFuPõª?W^|åB5üstm¾ŸXøÖw _yÑÅSÏ¿PÁ»‘>ûÑVSR{Þ ~ ·²#åÒ=uì©Íš‚#¿~Ÿ°Nï•“°"}+, ' Þ‰b÷å¶ p5‰‘@Uš?º§ïË´xã•û4EÄ}cûξð¶­MÉ_ˆ=›û&Åu~®Å•xâ%÷ÃÑ>lÚòÀh¿ ¼~y¾¡¹Êt#ôÌ` @ã&Ÿ„kâê¢æùÌš!,lˆ“‡¾É&”™ÄüC5¦‚= T4ÍG²ä8µóŸXÎcâ(ïßÝø~ôÈÂýÕOêåš„ýns[R5ø6ˆóÁòüü%n£òN:¯\ïçóC=½Nê};†pᛳÕsØj˜»YÎi®Š‘ÍZÙYk;&+{YÙ»=Á5^©ÈÐ JWEîÂmi–œ BƒFVÇÈugPûÂEsú”7ht8;ï_|ý€]ŒŽˆ°ÿž,ÓáP(,+ÅxW“´%b~þ'ÚcßH_Á3€Dxˆí(/!¾üþ?»ƒ‰«ìb ¹ü—¸v²'{ Œp´˜ ªÒR*5¥ ѪÁˆQ.SX[d0  {çå~8Â>Æ=œóäËLéªÒ-c SNóÒ:è ±¿!ïc†…‘êü~oÂxÔ^ÉßÊÁ.ö”ï0…ê8 Ò™÷ñÅ?‚\ŽÁŽ·TÖwó,iºßQïýº¸:wd}õ*t-ªërM˜^CºË^—`tH¢ŒJ‰¨…‘” ¿†|0{wðô<ûóß‘CìHÏtHôÙÂF¿­o.ÇyŸ‹ÁÞO•°4IK =¼T=‡ú[bvóØÇ'¾A i´ãÞJ]oŸgá£Û­°½îF±¡ñž©^ߨ{X«’«߂ߨÓç‚m ò ú·§ÛäXYgj3OÔ8ïîE^ÕÖ®Ò˜v›LÄ+©{¡%í—Í4·}E¬¤kZ º4T«¹Q £R³L5U™µ.b,ðªOnô¤n¦µ<<u»é¼¦Ø–+”ÚU 'ÿ#Ø<÷¼ºÿ0"e¿ûl»ýfW²£ï‡½œ</°5ñ~V;dÅH¢ª•ZŠßcDkæ²÷HÖ-W+GN¬zÌâ(fPw¹ñ‡•1]¸ªXÒ«—Ùû§Êð{ÞAGÁ =LÏ€z+¾"ÜqH¢P½Ö íÎm‡Lüõ-ýðÂG„}¿2Œ ÏeN(ÊXÇRÏÖ/7/¸Îû°SÂ"UZf.€„D@Ü#ÔTêsIyBͽry!½xVÀ\yÇw•C¨ù )q¨ Â0Š0E»"çä&i{ cµéµšÏìIé5ìºå2ºÍ‘›}·“~á%ýûš_ôåOL­¿*»õy ­XóŸ¯Ýë}S”Kí>°/+,õêâHÉwÂé9榱3ˆZ5X,bs¹‘fgy‰.yLr2H)öÝÓ™"TØÇrÇcÃWd’Á“±®‰JcÙ´ŽÐü´ö>C”(û{Ó®ÞCše2@é$ÄÀðkWçzú}ø 0ófÖÁÁðÀ=Ù\+0wx|«ùC,¼qEX#óÞkï“tx`#¾³¯"!bˆˆúk§ÃÃËF¢€ gZ Ç&o¬»—ÄW^gâuë$wÛúÀ…{íù€+ªY½ûÀÖ = ~{«á¢çÑ1UÑ0ÕþÂzcŸ^}›ô@D!õí51$«õ»¥ÝP¥l:ˆŒÞøv‰½J: @€%x%‰ ,ÊViÜ ýwĉ.† ϾÉêýûFø]ûéÊ¢-MdÂÅgßvƒ;ê7}†›yOíŸX²Çíà aˆ€>‘åù"þC1 øÓ.Ûv0?®#õ³‡Þ”„ ù@TN®óŸLœïß¶s•‚øI§¿3‡g¾?óÕë¿Ñ?Ÿ‡áø A…¥ÄÃ38”Ìfq†À‡¾1z:½š™FPCÆt5‘îbbG˜ Šjµ}Äà†ü® JI?†O§f™høTŒYb—Ò°·šåu‹î­ÌQƒ%“î~¢ù»jŽ99ÛV±‹ÉQ”&»Bã5DUö…_3ÏÇ$¾¾>·g/´UP¿Î]ÓyUîz¥­HþR¯Ø«–Èû«7$ óßJ¾êÙž;ç³(qqLÎ`Ž3ÍdÊ€æ $æµ¹&‹ëY~vØÃðæpûÓ<Ùï½4ñèPýe+ §2Ao”q$†o×—6å̾ÞPûòÜGÕ÷é¿ç`8t@ˆ$/”@.šÇÂ#!Q¯¥’§óUêã½ÛÏW‡^k³8ãŒ;1¬à@2L·ö]ÞMã –"ÌNËÖ~ßÈÄüÀß[Öü'¥‘ñzƒk&¤‹RtuÐǧ¥íX!ʶD˜&åýæG턬o‰ú<;çåE²@:[ö}'â_êZ[Sm îÇ 83×P@B³^òL²C•öPÐ*Nz}ôwÚæ?º‡ Í{tÁfÉ$£d’ ~&{j¯mzKí£ÆÖ¦¢´«0|߬)¤D¶±ˆ–¡!lÚÁε5a‰ªšHhŒC¨ý’Xøäª\“™ÙRÙ7Ç4vôìÕ­*ž×sÊð5H^1!öá¶#<Ø­ÊÑ“uƒ3 cÍüê‡vîåëóÈ >±ÕÖ­‰á&ƒG f¬(#$H/Î㮦Ö”oÙ_g Ñd~UïÝe¢z÷öæFLÄÛ˜cl8Ø”¼t,ªdLãnÏs{ÀꪨC]sFsJ9ë6„¨q7ƒw[z”¦âµ ÐI‰ŸÓ&>äßÖX'"#ï~â%þÍoék† Šóì«øŒ1ìY—2 €Ë›S{‚ï¼|ãÆV&î–Ÿ@Ü®P ïç퀦¾à¡ÓTÌïÛïvÔ§G9p‹TL̉vwMì¶G'XDo´¦kƸÚîºÑ¸L¡ 36KW[å@û.q~÷ï×Ùò‹§ò(3=A$ ‰½GÔ¸KO ÄjŒ B áº&MºØùs‘¤qíý=†ëêyñ¡Ý®Ã ÃüXlË"?9á@}à®ýîÆ3vG!Æ€¥o§ôP„GÙ²Ö϶ok3!R–¡h]ü<L4WŒFØÄ_!dvhÔxp+4¤€ã#f1·UÅ–o9ëVÊy=¥±ÏGå·á]'?_·R“÷Þ"ϼÙEà›Ð"’(ˆ\8µ¸ èËÄÁE#`;§ú›âˆ’lʇu»«ÿÒ8µ ÔŠ7+sLðŽ©\zyøBÌ! >DK4vµp¿è«³Š¨kÇdX6nlQlJ –@úŦ!Ý,É|°8faãc ýzzÅߦk›ñÝlŒ²è=¿H–0£4eåÉ;7¹xjÌ× Õ›+IÝÛ<ó0Z(5}Òs${˜Fr›WÀåàJíç]†©ì·¢ëuÛƒjö:®ÝEõ»WvÇ9bí¬Ú×wrM¹½J훜¬C2®Œ­ðêìÑ´È©ÖY|1JÌwµ<&¬enQ¾u¬¼ƒ4èT<êNufÜöÅ›%lͻ̡ÛÙTËÄŠ¹}Ãj܉Ê;<eºB†=”­½3×7:Åä±92ßOYµ}hÞO^î;™ÎÂɹ®Âân²LQgå¸êÝôP¶tZ˜H¡#n§hé·yÏ+{4…, ¼Sܱ21#¼ö{LàÛÑD™á³FÏ'¶ºÃ.ú@“ZˆHç@[IÛ©'^åÉ-ØœV;DéK»·;BÉ ƒ2 Jê…Ï+¨c¹Ù©s›£¹[Ð÷x"‹ÕÚòŽçk7Ö1Ål¬W)¾gšžwX±ÀðÕsdæa›®Ÿ8tÖj\DÒÇ/¤Ù9[}¹Ô8K—J‘"öuÜqwX{¼9;ÓÀÔŒ2·¶RåŽ5²îÜ‘K$Nš´©›®5v3t*»Í=X©gï^‹*ÝPŸ N…ÉL;a÷øœ/"Ì $Ä@BAd¿]GVסlÞd¿ÐÁe ÕÃ0Ä43m5›1 c›š)ô±D\ à "š7ˆ (4aнгz©Þ'6i™hõÜá DÛW³²Þ‰gCõè¢e¿¦>œ…;´v_l¬:‚ÝT  E5ÕvfÁе(ˆ·ˆíJÁÍFzp³Ä”IwsPƒ¾µNr ]3œâpÜr­0C·3£-nbP¼(Þ‡…¤r–#C†àŽ È £Ó͌ז–ÞB ( ¦j–=&Ä]:)s©W‡Œ4£‘¼fœt\.f»¥L‡5Yˈ悎; "*K© ‡D °Ý‚jÄÜ«.Ñ× s¹›ç!¹Ö8!"%2f›ìIOØò0ïc¹ãvQ%V¬ÛÎíbKž>ùš+oˆ÷f'%Ði§F²7³•vÍÉYn„´{uj¨ßtÍ]é­KǪè&dP,y|½êÁ<èÞ<†öJ;dÝr@Ç•\ìï=BÎù5Þ80uε}(¹@º%²ÜQ_¼¼/í8”%Hñߘ>¹ûµ1ÐCŠŸ|H¡dYîóôÍpxòO‹•AŽFûöv}¬S,pÝWª¼‡ °&Ê®L6e LaÉYü4*$QcEß’Ú#Žw:8'Ýë¡ËÁ–Ðx0ðdî&6O=°ÅTTbˆ §³­Þ½ø!÷ؽý°~ý_κü ˜“äò]ÂmˆÀõ†}Éç÷<ï>ÇÍ« J >Rƒ0_å"ˆŸ_© ³^7~ùPŸÎàrú­Þ÷•¤ ùÏI[¿)±ÊètØ›|3V4¹3Nå¶nn-\‚*öÔuëEbW!f× bÝš˜ $r:f£@h$*Þ)m®®w5Ž ˆHðÐn€†0YQHŸ ÂÜÛÙçÁ}~Y‡wç{õPM=î¾ÈW÷ >5ÔÈ”Põ„_ã‹ÎààÎ!`ÓZÍeú_¥ÔÏBK=? üïñ{¿VÐ7Õ\†1§À€CÉc^þ;DMŠùþ PÐ"(vÛcÏÒ§aÏ䪱ŒƒÌ_~B¯¿ËáñÒ|'îŒúÃ~hýDOÚîÇXýû_±b“B†`•€ü5Jî'xÆBâ©ÆpËI‰ƒŒÄîË:—#~4¶'éÄ ?·‰Ìr0QºëÚ@;Æ`V-±cÎ+bW“ï å)᯳÷TáZ>ü>*@2?7€þG.ðIøØ ¼NNoÒ$p{Æ}úAÔÿ:{~ 0`y¢’‰×Yµd ÌÅÉÝ^Ê@çïrXO¤•$ñ‘jö5!”,^í >iKÖ{òçŸg0ë²Ü÷Ãm c+/Þ`>þ«ÆÅ:mÐ ×¼»"P«ûã§ßºÍ3£Ç£ˆ†7eÁ„$z掣ÜISÏ5Ÿ1Ö5×)ž|ÕÞt:Zš÷æ=t*¹†Õ:ׄn¥1¾Y#¤Ã•¢¹ò^!}G×’;bÅ¥=8ÌBÔÉyŒ>CôAü1:ÒG‡&ð^v Ö èÒµ³¶'¶’bí ;Y<ªµ½4Ì©×:‘îS`^ó‰)v U<°xŒÇáÃAut(*Ì×§Læò™Ó¯°|,ýºÎyt¬¦hO>R°×É 5Ò4Óûí߃7éœ"<~ßG#A·åì½agÆïÀ£×UÚŽ­"d "ÛO Çሠz>ñôÕ‰fñŽ)WÓ ™?+•9šÅ•V)~t#"g/†û}hæ}IÌåq —u°Í%I×2:‘¬vÏíDàÆdC"Å<÷ÂÄîŸ}¾óʼ!Öú…q¸².A?Eçß6dÙ@Ą׬ÏM)ÝÏÓ‰¯]Ó´ Šœæ¯ç>ëïE}Ø_ÄÁò…?H¯ RŠò9»Ù»r 6rwØÍf ?q^oå¢?lKú!‘UfÂB†ãÄí"Íú–`ªï%¿„^v_‹ÊEyÜ Õs1î#ˆ "h2Æ…3T=5XpŽ4-ª©8^‘rº´¬Óôºw¦äŒO¾°,Ù¾=z{íJ_3ûô¿É¥§9×&c³†ìÚG„Öu ±c÷+dÞrN‚çx‹[5[å¢[sˆñ憾™<+](Ê@zKZ#}¡lÃZr(`@•"Fó ˆëf²¤ilcU +#ƒÛG&Û 0ò³Ì;ѤäßF˜pr†é±ïg}Üœ*šHØMŒ®o«¦‰òóÖµ@¯Œ‰ò›éÀtíàÊ;yDÔ\×ß\óx~­ö*Þ×*É4Ê5ä@ƒAç» «Ô[HPºC`û÷}ð,6ÞÐ>ߨ:?FæRÛ?¹<‹Â{ïÒ/ÃEÇÛ>D?0BÁÅêts`š¥Pâ¬"y«î!¶;ç;߃Ç|û¡)õ}tÖOpI¼“XÌ®±DÉIÈYBÄàœÏѸ)5¢Þ úÝ`Á~Eþl‹_JgÝÙæBžÙƦU‹Ê­¥kï½ao.¤‡D‹ï’CÖ¨Ú‰ËS@g ï@³ V¦˜ÍœÔ¡3El!B-c9‚¼™¯ ƒó9èõÝCç|pEgÌð·ãhq3Ï7ÊËò¬ì¦.qhËkj«¥D½¬»ÍT'tjÃÄ[¡Õ˜]xæ…äÞJÁÁnÅXcG1RôÇEèsƒÕ~kÒ=Åext Ý|¾k•“ï€qS«Áç~/8€VGmtÝø~‹Ëöü¿4=³û"BckxP»8H¾gA‘˜? -þÝëÅøáûx@DâƒÅIãLBUŸ0"»¯/‡“ü¬eþ[=›¯öþø3Ç'èü›ÙϬȹٳ‰|þ>ðÊ_ tþ¡["è!ŸÁò¥òuº5ç:}"à_çö÷‹’3sáuBi~4—ô ¹§ÜžðZk¯Cç_‹A+¯.$?:ÓÂT/˜Ãƶg÷´a„`rŸÃ¢r{0ýº·êõg=†Æ—RQ£2êFÒÞ~5÷XßÔ À»äA=úáé=:EOÀpÉøgš¸«/Õ…Kñ«½û ¡ùîç;\ ¬Ù¹Ý ã ™áNžj;9ݪla$h&:P¼sYW`±ts8 8 Ùª±Ðc…nOkËѼ¡Rv’¤FD~¹Î¯ÖwË ò#öïß~öž ôþÞ…çš ¨Vrø}óßdï·®}GÏ»IPFˆ}ò£/Tx¤¢ÁãÈkk?O_gk¶G„WžºïÕõmHÍ|"媴8a«úOŸ›ØÝ ~óÎá+à~·˜~›2.(\þ(o!ßô±Ÿ“ ýBjg¥w“NÂxÇrÈ_Y˜üÍþćߘôöL ß°z$Eªu}1=-àiã|4˜¹®è»ÓB’`M +éMÁ¶a&¦*o´d­§ ÞŽªa¶'Ž˜èjgà ✠R#›_¾ø@O,p!þ?DŒ»²Á”:¡žØûËñuJÇægó Yœçg”°fÎÎöåS¤,r>°°\àäÉÌ»›¦ºÜèOo|ä°ëé9¡ß¼î©&"§×g\ÒšY‡×ØãW´¸ˆÔ‰~o®J17Ý×=÷£üÇ:;Ò=¸ÃÁàùîÖhG¢bºüTù ë%ÅLY“ãø+íúŒì9 SÉ“ø 'é_nØë{í=U ÌØ·ïš\ÇÜ~îàŒ •Y#H ÇßÅ lÊji"'¨c©ç"Ö'÷|ä÷Kyèï|³-òkSΠÑt™ç°8‚DëTÏX$wk¸j“q{öÝZ ‘—µ"!0 Z $”Iž!çØ³ õqÜ‘ïwåù_¿A_ ^Ýó‹½ §~«>__ï–ùX¿Þ’ 4ÇŠ bPî!³ŒR¬Hö£C®ôC;á÷™v/_/Þ¯}2ÒX£3GTbÍÝÌ~?Ò0J1ÒÊD:x‘ûöf•ùMÑÜQ¯y›ÊdÛ‰ÚÚƒŸOÂ×*¹˜„9ߟ¶k½LMÒûcχËtP ¨S~`¾Ü½Ýcm)_«„Ö]`ý£§·jµN´¥võ*·¶‹‡sb³æÓÞ¾`É·)˜Û*Í|f,ŸG^LϽ%ƒèÇ·¤W§@y3ƒÈ¾ïaœÕ¸D"¾H,@Æ…—cnê7óËU÷¾êóróݣͺ$"¡c@’š¸AùB¤ E RToö9²uFðT@£'·“—Y7Äp,“îºÜ¸(+”L ²§…œÞ¤Ä‰ NéÛš#°óÈÎoKt†ÑÃTкì¼0îû€¬ãÁáyÈü¬¾ß~›ãóîA5£ GÁ¢l\øŽ:Æ;.zY{½Úuuªš‡h],AD¶†ºß—y Z@7(l0)hÁ –úìÞ4¦ùÔÓªaC«2%x7­¬ ‡0)W›ÃÁƒ€N6BÊ  8$¡)ñPedJ03`‰aºáoe÷·9UDÑB¤FÊ #qáÓ" h;h ³”I&gºR™7ÜÖi^Ú§@ Î„ݶËÛ‡½Z^ëá½À Û…‚VyS3X”s…Óo42!•yŸŒåæs1&:ó6¸Û–šâ޼Ë0ÖS–’‘ Ór°ËV1§˜bÀÈÔY1C¥™:á ˆõ)£2ÐQ^5e/:¸écQæ.^nŠ šõÞâ¢NïÏ/&&ñ”¹bnŠve3™{ÐÈ'Hw¥;xÖxSz¥†Ö!K:f+ÁǧœwCTâpr59Lʲ­¼Â‰‘¦aS)‚Iƒ°ÝɯGiCƒ&')pÝÄÛ–a]0¸²8^\ÑHêÑ¶Ì nRXŠc:2Í5nFÚTs­KpÛ’ÕÖ`™e¶® ®)D²Ôj`†J”˜˜bÖ㜠 ØœÅk ¬Þ h¿ |sØŽù™ÁåŸ)q§¹ñZ”•’ÚN¡Ø©ÂÈ»j^ T[ÅXveÙÓ:¨IÞ¨†)îÒíg[¦’Dî¨ÿ¦çëþç${ß¾GX¨ A‰‹H‘5¢…Ÿ$ìj‡–Å¢ ¢…Š0§¬ Êøà‚ ´²+‡àéõ<`‹ß}½o½¸ª`å1ƒÑÒãkns1îËËü« rg]mÊN^gXH,HÈ©ÂîÙ5¿ Õ@dòØ;ÓS9«ðë^7V·ãó`ºQŒ”ð;‘ågóÑèCÚ6@¡£ð¯G€6<„€šø Ï Aþƒç»ãó¦%˜r'Û0ôƒ“¬l‘? ð1œÕ"”Pà=´> ªP¯ˆŠrÜjá™`ÙV¬¿^ö·97Kâbž|G¯ñ†7}Rnk¿õ“v• BÝ×j¨ ¿œî6O¼cÞÝÚ†Ðû¶;è»MÆAà5z•÷wŒˆ©®º ÄÄÆ3ÄíãQÎHwd+Zãï˸ÍûÙä÷Óž‚ððŸk*v…2äôž ï›>ÕY:DbÄF"Ä'ÛPÈmG0¾ÃžùÁs¯Ƽ:0yÄêsj“¾Y7ºÁáX Ll×X˜ç¬öñÚ×…›b!jfƒl”‰Ð8‹U3©¤J¸H²0}:ïg¨5[†ec7Z%Ú þ÷nŠg3¶Þî®3ÁÃÝ9×qÂÜO%ð¤ÑvÖažáÝ»™¼¬‘_û§÷´K×Îì7«¸,0ãÎe™‡™®‹!Œ÷õ„Øý’~\_xå9øl á›3[öúö•ýró¨«rÿhôèêVû}ëõƒÃs~0…Pš†0õåPC×K«xcVÔU|`Üàßg½ô¤<ÀËèøxš‰&pTÌâÙi({út'8ïíýgãû_âH°y_Ã`Äá EÉ•IÜÏ£ÀƒùÍ?1@#— QÊñx F75QÎ SûÊÝ1>šÉ‰µ•x<åÛí§ÕkgÕ`N9×õSX6»Ý×T'+/PoÈz·~¶oé“úó\~&~à§ß_}Kä®ü;%îTX¨³Æ¢m=DÐ_L4rªð6–Ù®‹ûçÁyœjªžAù nÈWùe°Á€_~†=zï¿E‘«ß4àùsÕWïÝt´!.81 ý7dï0­5Ú Ì™9|oªºeÞĚ̔Ní È Î5¦HÝtiKº"ëy›‹‚ò¾ÉÖE¾=“ÂÇѾûÝ <Ó_X«!ª+¾»>õgv7¿XCÁ¹•é–ôð¼Ù ­ý!|ƒ¬hX{׫}×¼n›°æµƒõœ÷ƸÂô†v=ÁîùÛö3g¤0¢>[•±¤ã«ŽÝî´Ni½céðÐ!‘ FÐPËÏË¥h…ó ±¥(Ìp8î`|Bš>ûʧBF”ðyéðy2¼‚Ê¢0Éî퉚ĿžÄûf˜d~!Žu÷ãŸËêû¿Dü~`¶¸É»l4i!ù©>ïÂ}øfþëï¨S:Zן "]ëoå}ßg† B Z§zP‚ƒ>HµðÔ˜VbCõ͇ŒUˆŠ)•FóÎ)âð¦Çb‹1‰@©ïÕˆPˆ?¬~£rÁ¡†E¹Þ‡#”¼ ™Ë”I8Kßbnƒå@^M)zÒõÍrâò <ŘìsÚT.uîá÷Y;hynÖ 9VxLÙ…¢µÆÒYd˜#yŒ¬c͵PN$QÅUA|¢8Üu ;ÈÕúãú€Éß ‘6ÚÅ ïÔ°PñóøH¡Y<¢Rh»ªÑ5ßW̹ےcêþ^ŠìùªÛÚï¹÷Û϶A[ƒœûê.xZ,€¡÷[3廹Oƒ986Gè°|b-A™É›Æ÷ír©WÁ£_ÕÇ™<ÙäÙlã85å7 "H§0Rà ê"Éçžn§vôÈÁõ×TèÆoU}àXŠQl1 dpX½'õç¤zˆÉïÓõeܵú‡o,*bê?ëTlX|ã0û|<Ý/&…Çîß ù8ÄfþÏÏä Ä&êaÊÞBîò¬ àN¬ÈH˜$ó@Èû»î¿˜C{ÃAñ’}òäòÿ~`ãÄhúe»’b„Œï7‰D½v1qŽg˜'Æ9|u)Û¼W8ß+hçbG%T»R•ÆŽUÈ*BØhevnL n–H»€îPÊÎP±É¥Œ¿+,7y1føjIôµœßF2ú—2fcå~€H&„×¶žjÅ;õz Iåýe~ˆ)çÃÐ1ˆÜp{Gr—__ofJ`j«¡ ÒUÏ7æ×®3ôò¾Gžü<£ó{l˜a\‘¢êƒP,€$Ìä07ÁÇå?!ƒæGßdÄÊôù°qÑc™"®ø.Áûl+õp¸«KãîŒôÜ”@ÊZ>‘8`íŒ-šû븽ñÞQZÇÖÄ¢)ÎÝÁ7¥ßÂþ%{匠3¿" | j¨¹ÆÛ¾~Cc^Ž„Píù·fGl‘o<ËòxPùú+ÝÀ]ë:|÷Œb¦ÇÛ`Îõh÷©÷Á_,ì#çãp«òcðãðÎ9>ø‘•ïß{0w{ïÀèZa†Û(Ž{ufÝ}—8§k>Ýì­éÎÉbzºæú–¥‚ÝÍðìœê-Û‰·“—4äíÌé茞 €ºÆâ˜Æ44ÄqšÈ9eè99…ú/Îy€öUøø Üàw–7d}ãSánG]â~s‘oš5£çùÅŸ@wuò¸Lí/Y%ÊêBÔ$y+8BÉ7=ðôX |?uøwQ7· àa‹m© Ë-²'~ûëÕ³úb‹9ÃËR|´Ë@Ûfšü´‘7âwã/ñ”ä‘ðç‚=—çFŸw2y¨HµÑc¨y³ßG ð;%›‚0o ž¥äb£¼¡Uâ¡f6û»Õaº:çï_¢ìѿеý¾ýÛûR=éÈ7Lg„¢6À\²Ïß¿}rƒÚJAú—[äk£~çËRúþZ½¯tÐÙë\ùòWãõ½»çåµâþT=–3ñûïÈ9›ïmüòõ2nçF­®¾•”cù’èh#CO.š/S¤ZìU;t»†¶ìûb©{tDøf=6„LþÍõ ÅvŸÎþFý~û4€GGhFNJ ¦'â3Áïv²-æ[Bˆ~7eXÆáÜ>ïkžpÁä0×@O‰ø 4£ÌRÂ"A §^}÷‚Î^ºƒ[¾‡b}—cl$ Qˆv¡w"þ·Óa`^С¢Ðujý|;ãLìýÞó˜>øU•O*S®¶ zÅxæøUõÇÛãÓF¼¨êlÑ¿”ý¸® ˜{£ëêû<í‘ëuØV#Aíõ0š»T~ý½=>$OÞóaôøýø=Íý¿ûš;íroÖ<øöR9ì@‰¢Ð¤ w¯õêÑÇÓðë.žþ“ðéâв÷6Y6§s+?‘´)ð©$^çkN¤T2óβ4ÍUåÝhu È­€ f GÕG؈Ý%Õnw}‚LH<¾}wê.ù¼ùR§¹Wß>žÁ‘yûõèß/ <ŠýH ù`â8È“V1aQp5¤1ª¡—J¬[Ï´o¸;4Í>ÙŒÍ~¸Òõñö˜éAú<= ´ (Ê2€Ãyûß?¼'»½$Š®`eàšŸH^Y†¶§0§ñÍïÍî%îâ${Š€Ófÿ~ân°v£d# Á="eè­ÍtÖ ÏÏ™ÉÀ \°uKû·Ëö}?¯áõýøPÝýõÓªtÏî‘ÖÜÔ7^»ÚŸÇ¿fiûöŸ]œó¬1æÐûEQéKUûåš:>¤Y¢‹Ýùe4)QÞ sbTA'ˆDA hGg¥¯”Ç¿JW³Ä†!vWy&‚grBkAĹŸPýÑ™‡Ò"}83¿ªg‰]z踦Ң÷÷† ½4UGWö^¾þ©éó¾³5ÌÈö|PÏÄ»×¢»1-ÞíÜ]“ÎÒ¼{¬m,Vvp×1¢v&e˜›óªv؆•Ú54 hL[šCr hPO Èé¥ÐƬW<ÐzjPâK÷©™àÓ׿›Ôæ= ï.÷æ…^ë&b8[KF­A~f \F§­M·í¬o!˜]`fQ<ÌPPm1~sHš?3«CP[KžÙà*ëÑÖHèdAô¸B×ïnäñÚ¤®nëª2¢'Cp¥^eú³rÈÖ[hõ…q+îcRˆýd¦6?ûR€K^¦DE«ä½ù‰îóíð:JƒE¸:T¯Z¶19ê´¬^i–Ra 5;æmãÔuž1DêÕ:·žžTÆD½] (14ÔAJœAƒ`"’âtI%Ù¸½*í¹\1 vÛ0Ñ4Ê,´j@÷1€üXŸžóÊ>…_tz}+¨w—2§ÄŸOÌ)Û­‚8̘DQˆšÚ•.csìáÅ;ÅǽÝ5ô'9›ç[¹Í¢-}UDPÆòÔïéλÉ×€vȽZ¥½²£0œ’€’aƒ¿³6Áº! Lj$dð…ƒðCšÐbÎ"€Du»{í§ÏõìÜ€=ðЇÃé "{E hŒ´¤LÂû²¨ÎßÃá§^|@’!˜ƒCÕ«¦ÁðÔáýâ>ûßhŒIZLƒÒqàøÏn£,ÒÙ¹Ú±G6ÝY§Ó¢÷tuŠ›œÓ£–h"™y×9«ká¯;äXž†üáA1€ä¼dK™þ]Ÿ~À{oøæîô" [¹€k»¸¹&ADÑJÌ_ .ƸŠ^ÀJ•E(1"™ƒí|Õð^Ê68G‚ö³GÁ-x¨£ïx¡å+—¢¢\…KÒ•mïä%¿; â°å‡àL}*Ì}iRFR/ÅÞø™žÀ$ÆŒ{<¹ ¡ß]À‰ÏÏê6W#+Æ]é—ÈBV)i¤Š˜©Îbƒ9f ¼Œç$q‚SP¸/›¤.(iL@gì¯~÷œè] `áê€Õω‚L1_£~2@Ãc8•„.V¤ö}À‚Dv—'Xjk΍ÿäzC¼S—ë gÙº"ßÇ UàWyÇ:–f À«¬CVò…m2ççL®ó0FDi:Â905Þ¬Û8ó2ì/)SÅÖ6;*ÄDä­é˜D‹äNlíâ¿xŽXZ ۪رeÀ?›÷9[‚gr›b´19nÕ´ø¬N'”$Œ÷ÕŒ ÑÞ¾»º&jb³È‹ ,beÎÎ3{‘Žì5ˆÌذ]Øáã™m‘9•º”;¸CèÉ B;‚LÐjõSÂ-ÎEä‚rB©6Ìåm©fáL„X‘«g©\àzoHW(9Û›xCÌGi2÷§VŒœ[hâ&–hHô_gaÜS59:(,NÆä‰wƒš‘&u‚WsÊ™¥¤è*ÎXͽ³/Ÿ)mÏLÏPX°VæQ†ˆ»u6Ì!®“ë¢u»ãÖçÆfîÞµ®¯jèQžÜÇ7MÏYs.‚Ü®½,^©$Ë_6›ãYS·ƒ¯s`ï /¼šwRá gy­4ÉÞ ,¼TUÌÏ$fÔŠ÷LìZÎÞ=Ú`ö¥¸ÎÏhªyhÚ·Ã7g–£9ymHZ ÞåS³yÁèVåŠ ¹ŠWDKRs¶ÅçpÙŠ™8S¨V•ÎåîâíËFbé_f³< 8‡'M("PÄ»»“ 1\í¹ª’tΘÆg–†úÂÙV*;â×DUÈÜé§œ/] ó¦Â5JEcæ*÷8‡‰Û;eé {¦‹Ï_YÔÕEUÜžC¸ 7ÞÜ9¾Ù“yÜòÐ¥R÷mÔ…Ö½FòÂT{¯.zñ½±£'k°K“º4umê¦Üò/¸2y$¡õ…•Dûù_«(=^[X Ö;Ž&½]…uf=ž·]"«·7z¶¶Á;uÛ9®æÃwiñ`éø55îã, Û!^!ìãJÌÛÝ yÁg—Jé¯Áßužï¼íîк¶…FQcY_·+€Ò”,DäJÌÙ–a†ÌÝÊÌ7M6jVœËJcßRõàS¸áƒÃ:‚a£ÒaÝ޼ë†ð "çf1" Š^KP¥Y`Ü™¦º!ìÁq‘[‘ÊDaô@¨ À«º•dw¢gº•®çªy$ŽÙ$qžÌ4’Á< `_.vv`WÖ­Qñ 0ÆNÓvP¬ƒclYÓŽR™\»ÜM·ÊC¬*0Ôª£báB½í5!Î^ï ç DCU³¤3) îó`Ú%² ¥‚1\É‹ºPËxZdIjQ^ ™t°²eåÃDÄÕ• ¦Ø&æ g|•žðÀÀØËN˜bKne7,ÄרÑymœÂÎjã‰tÖ†$c#]ÍUpV[+îñÄfÌT%K”D¬öÏï9ÍO:ó&úõå@´®Ñ¿«×p2LqÛÜZ 'Wƒz:K™'ñÒ7-+t‹¸N†ðª]HT'#x1”*q‚,qWÄ]ëÛ …Š]Ö“ÔÕ¹=}1Ï2ÆÞ—¶uݵ ¨WªåÄkæN…ô€Â˺ÂÇ<ÁÜŠŒËäØwêùÛã{ìñ­÷wƒx$§ÑäI™„DƒÒ‡uz½O€ïÌ„n7#Ç ´wœÔ:ùF•ÁÓÏF{_¯o~Tôiq6nþmءߪýÅg-šb1 0Ù ¨gADU@®eï¶Ì~؃ÔÅûbýá«­TLï‡ÒbñÒ ÂÇíÑž?~‘õßáZ2>çé4W‘îy‘7A”ÞP¤µà¬=æ€C%|F½;ï¯óÄðEöxþ¡÷ÛñûõÓ½Ýê­çÀG}ôŠGâ'fÎr°bö-_‡›ð¿GÆ ÷¢éÛ UQÖê¼Ùç6|©À.òàà«#ñáõ…7peH9]«Nüº®yïן ÌžIÉÎo!ó2ਣ"çÁ¹,×P$‰LâÂàYSèþ3Þ®Œö9­Nñü=óÀfÕPfñPâ„Ï´&«‡‰£/_FtÎ@X‰"Éå!Ø©dQÈ|½ó0cïÏ#p8ÌB´Àƒh9÷ËcÕžh¹ÖìÖ“_c¹ïWƒº;c´“°>Öû÷`¦óç—XÏiZ1Ûk•MM5ÛGkš=GlH«žÖ¦w”±·Í“µ©_K,Èç˜jºåê6â°M«Ý¸bS#DDÁ)ƒŒB WæGdyç¹ë•¾Ð¨dô ¼±–WC<â¸Â‹ ÃΪ ư–¹éÝQEÛ"=f aºƒ1ãõ^^{Øê¸qï»õÁõì¯/´þB‰ø}ßß¿,®#`åú¤|S½® ª4{†;žýñø~îÏÓÌDNÅ·áŸNfèùŠË™ü7™J3J4,ÆÄÆ 4>®“¡$Ád@^¨[ÑRVk;èÁˆ_=`ó³¤Q÷@YæóÕæÍH>˜UÒ"…F…B‡š<þŸ¡ûGŸÃ}éôQüÖ_ì]©ÉÐö¡v2OX2€Þ&‹ìú ßƒø/|òÈñyèù›Õž¿…{â}ʸ`ÛZÍ~[õ” ¹fˆ…Úûo]OÙwÊ¥þ¥T°,ûW=ê È4ºqb7)•o™ b};À¹ ©Ôu…Y¸µS;A÷‡Ac,6è0 B H•äp†qÝ•Û3ˆOÀðúýï @€¾  7NþÈ¿³=À@Çî·p´(÷VJw }ôÁË÷·^e!‘%;ð±P3 EâúêLîϬòGÚ0È2¼ ¯»p8ŒÏbC§ij· ³Í]¬žªöüG³†ÀHya[A¡Ò§¼ç=0 ]Šä’ÝÉŸ G;–Ê쎅z_ÄDª£ £B‚éÐÂkngFNŒ÷èšÞ0m ˆä$¿‚_¼!.b}ƒ¿#ž ËÊ·0R5Ø÷õ çù_ܺ³rq+ì®wÉÃÅðÃrŸq̰:YЦ#‰ îçÜ©¯[Nv¹Þ¡ÀØ8»û)ØñWZ»{}ï‡nÉÙ Ò„lÌJ¯˜6WÁ(ˆH †MÆG/Žlx}„³¤‡”g^Y¬q¼{ͼâoÌÊØ«¨•\Ý(+Tgƒ}ÝïÏ1¾x®Êé‘ëÊxª Ä»îkÑJ@ƒÃ³1ærH^Ï—Îÿ+°·<èj¡ø† I\ÚtÓ¹õÜfé!c8Ìá¥@µòJ¢ã.–¼ Úf^æ¥ïÑaóíï«|é—òn†špÝÂÁ@{õöŸ©óñïwÔ?)ö?Z©XÃûï>Ø¿ú00Å~˜Gâ„ÆH¯«;ÛlvlãêIQA|Nüòøý™ÏZvfv­u~.Šüg¿zçSù}÷¾-hÅ _a¡D Á«Ð3OʶÌâöý~Âþ+Eõõý•–Ç1NV›å½uj{2˜•”3´wl¡¯-ÎÙºëék^9»I’4h{B… “SLã±P@€E78ž 2ጠD œÕCáQóˆØK=2•ŸLl~ÙÓŒ@€1•rèóï{¾pš#esã‘鯅ñ°'ì“1`C‘1æñb¬™”0†ØÆ>|G{òÈ"úïîªÈÎõHÌ3!">á#pa·{ùèÃ{'“ ^Ôò;˜/d`1ãò…þßCÔÏÞ `ýÀxˆ'¬q”j´þŽ!-D@†hØŒ"Ë¥Ãû8TR?Ÿ=§½!H87çn)Ú5úhÌýžË8î:¿w¢ ÌŸ\ž7gæ!¹§*Êx/Dúsâ%™ƒEIœ÷·8^E^²Î¶ÂE!Úë” -Bq­M”.ï–È1q‚PC½/›ÇÀÄœ+”ñý€V;ïZÎmLR@ë'E®@ðŠós\ yÂÅQtzÔƒ*‡âôìüD­ fçâÂÐÊ÷ß{Þsm^¹csË«œßzk7e­éíL“GÏÝ×™™w… ©Ñ²ªB¬òhÖ.Åu~¾ðÝãÆ(‚|ƒ›"F‡Ô…Äð 32âÐøüØ7½ùrÞ÷hýhÕ7—yÀŒPáÍ¡Ææ;瓘šï¼k³±î+Ýwiä zÞ/~åç š|ûúøàñåÅ{p–­Ùö?Ú†FåHÀmBšLDÚqCÞÍg÷ßj<çtqÁÙžÐóšuÑIˆâ/P‘ࢋ¹ÒÒç¿}#¯OÄî¿z~ýÃÚEˆ ¼:ô|vv³™ãÁ‚2—{ ïló¸óÜæýÎùßè|XSÏ O 'Ëùê˜HÏ}¾ýëlý߸Ú7#Ðhtß1)ÊÂöŒZÀ¾3=ßQõõ~ô}ì'ð´½:B5€l×ãz¾%¼nÌ H/ƪ]Ç­Íümyã¯ÃCõœ-æ]³8ÝûIÒ3”©}=g¯BrFß8y‡vûP-—ÝÂ&M7" ¡8Mm)Çøº“¢2šMÕÞ 17P†B2‚«ZÆçѸìs@ü^± qf¯ØJ½goŸ&*€ï#¯¼óÑxgŽIÀ(Gßoç|c%'6Á¹“áy£ì½Q‘;âlà÷Ÿ¼AóÁ$pù/±|ûDÕ #1 ,wÎ/#©Á@®1"u =yUõ¼Áêû÷ïyÚ?EßLÌH‹ÎƒF]¬CWËs·Â%R''תgÓ$0ljÓ±t7öŸé–)~”=š7ÛR}õ¸c}sjó÷‡†{Pèžïq‰ýƒÒ;Ì[ÔÏ>{Î3kêÒŸéÀ€÷/À¹ýøa¯.ó~’Ý~‘–ÝåeØìß,>A +Þž±ï˾zn¸“WÊ¨Š±•úóìâZìËÛÜÞ‘YÂò‹b´PfÓ r[Î…sVƒ´'S›“é6¤UùÞ@Øã8cñG(Lg&6P"‚œ¹Ï€2‰ý£b¡] è2#˜ûì‹F…}ñv¾çû}µà æ´šTy{d4¯é¨çÕXÚ|Y¢ð1ÒÍÇs˜~Õèøz§¾ø}ïnÚ³òúf=C–”h.RN}ˆWº‡×W=Áˆ—ÂIoÒz:Å|~g+¨CDoÃÏ{ñü‘¨\ŸB²0Œ> A*á`_Ô†O§÷å…|»1+<>ÌÐÞΜ*gwºŸXž9¼Ç “»ÁÁ¬H^¹j“=ªìÌócõ‰½ÍËÇPüÀöy©7ëø g£á’<<„ åOì‡AÅ ‡ˆ£ê@j â#Œ'áÁÖ³7[T8Ä ÇkN‘Æ'TmWo«$ŽQY/cn°bG¦PÓf0«ÉU£ŸÞÛß—£,Î!T‚iÏÅ/õÕÁOì@ÂZÒŒà¾Oí7#|¸áÀF‰rµk¡{÷ìÙ¬ýl?Ãô-}àü <à‹³t²œDáV/áî’¤Nì‡\4f×~0ÇÝû@Cê®*µ/~¹S4¯€õü&AÒg€ð¸•Få(ó »zg_•ú…WÙCòúŸá¾°=ß«öÕ¬}o¢ï‡5c˜—¥ƾ'†ØMdÍí§ÉíU3GŒ4ûa“ΤÇ_X©Ï<~Œ^ƒž¦Iënº]Ár4»Þ‰T>ÀQp4‡{Eûöùåå~¯‡‹?µ£_‡ë<>ßÓ‚{õ'sê銤þSøH¿¼ŽvN±C  ø}*íÒ¶cî[´&+Âðf¾F<™)g׿só %g\°i°¯3¯[ºÎxá$Í9‰dF@ÍÞe5£Ì0FÍù®¶U:9’€•.ºjdw·jYfÏÁ¾¯¾†=GÆ‚ùC¡áõs |»BA ½*/iJ®Êd“Q½¢†`I€> é ËåÀñò}ùO:³×}¸5%f{n$'I}e1”O9 ç/ŽœzÛÄõ7ƒ“¬Q¦J?0¹kN7¹hy†`œùes¶âƒ—4 FJš¯g®BöVƒJ8ñ^lÕ]«ÚBýc/ e®V42 öâëÕÒ°ÖÚUw‹_wqíºì³G0¢k¢¨.¤§º¸7Ü™lo]`Ç΄Õu;±›Ü3håþH®ÅÍ/Q©Áï +%¾%Åbhq{'šxVXçe^Z¥ÖuM%š05:k™H‹¹¼‘™¸(mÍ6çdqìÑ2,Ðjú¦w޶©½)–ØîœÎ»ëëVZ$öŠ…Ú–žk åHí±=DßgYÍê±*BÎÉÁÝ=Í^LôÝÙyµ³ÕšhØœÎÍÛÉ– ܱšHªæÅ̸Ào8â“+CŒp'3u‡ÆåË;•"Z±·5ŽLr Î"å©d¬ÇšW ï{ÐñI¶6ÒM­ë.Òq„tr*diq”÷i ‘pše!{›;(IÎSÝÕ§Ì ÞYës„†%)ºAã«oxmR—UmÝÏ z†¼Xˆ¼‹ÙæW!c]—a­Üšx…Tž‘ºïAÞÁ™jǪŒµ…Ï)ŒÚ7Òs-e^ÝÓÛÛÕ½–Ó+m×x‡™ŽÇÛî ÌåçŒ!»°BÃÀËB*×#à5WÀ» >BxRVMn_,›)ë¸òæêµßåÁÒ;u)ˆ`d1Lƒ¨G qD&§°ª !Û¸ÝØQ‘0bY’e>±BZÀ«&Üz»ƒD…1È4Ü4åì½ä°©Æ,!Œ"…,Å H¶˜œâ–ãX.è Æ;ªAÄ2ŠÄê4pÂ;F æ‘)P¶°º# Ξ“r«¤ “+.Íp6xŠÀž&ƒ;¨À+Œ²S°z`ôáÒŽw{Á"ætdò4ʳsyv2ó.ìufvN1½J{8hÑu3}Öx“j5Íl¡,©BÝF°¶x²­ŽÐžçùÈ’4‚;ÁlD×…}tØ0*ùŒtˆ[ˆŒ ¬É† —²pdŒ0$Œ(Ò™&eÌ"{ëîÙS¯®óO†îØ¢îç¤t¹t‘y`íkž¥·¿„/õƒÓ€vþýCí~LG˜éžè@KCîidxÈP"<=ó¨³kßKu],72ïÞ®ý½jq6  %j Xèá‘p¸u||øOo³„T =úÿdl `£qSé(@AmŒ `†êb~sÌ `ž£pÐÌ÷š) ƨ¤@Kˆ8z,d@4Á©~p4ŽÑœ«Þ‡V†`hLPh>4WMè‘@‹ò‹8cë7³f¾ྟ.at€`@¯ <<2a|¹«#Hˆ/žîútwÉb±0.†Ê•‡k&E ݈¤Dy~é '¶Æ"ï^úáõV' ]øHØñˆQÚrcïÀW¸Ó¥õ~'èØd×g…Wæ{òŒõ/!›á4LÔéU >äþë³ÕïG/¢ë~B""±°ä”€f‹+âÐaS+ÏŽ—;^Õ²¯HlNôµà÷n‡¤‘ÞÏ3Íáûïœé«•-¯ÚØù_fÖÔ‹¹­eÒÍg/­ v¤«©K›°w;£ÚÒ4_z9ݤ0r÷Gë£8;¨Eƒì¥Û÷ËóçÃÞ|ó¯MÜ ÈÑí€'0eCyŠÏ`pn¬©ÍÖ„¥ÖsƒÍU]Qx‰k“¾æ5‹êyü0 C±éšêNޝ}¶[â€d2 ôd`5uã>ôâÄ?E}W~=è,U?Œˆ‹æj–õ¿Õ,ÚD¦Íð\þ‡ùÚÌÄ ú3ÜGæDûeè_¿/½,q ˆŽ™»>ìž×bÚõ;4#ÔƒD…žü©ü²†ü«<àîo:>ûãÆjÍG뺗ëµCÝV–±~Ò«=ûÌ’<0:ó~>Ìú¾î2Š[ùêWØ«@Žé÷Îýó„nQ2i šgàÑúªÃßœû|½»5‚{7yÍqübhvxnyèó_MèůÊèûfÌè‘'{ëί§¼)æ,À¦®ðkÉÊš9§vU9v• B¿gG—»U¡.™rµ(y“6§Ãö€h6ëãZˆD!I¤‰TuÛÞa\kƒ÷¾|ÛßKÄ@ÑŸxô$ȬÆæø“²ä"x' ½lîÚ#ÇßÑyë‰×AŽ9S”ã˜\Ì«£q3øî­ònÎb ¾iG¨*"§›ò¸ï½U9åp–Ìð˜äßG&ªhÖ¸t »q<έ‹ŽéBA*B'|šå³ê^#ï×™´{”—¾L rË|À~ô`gêæ)Ïz<ç¾ >ÈG }äùô!Ý?_´a«†qZ»eí ×22¡ð3‹ Î0*ï‘3ŒLt×½¦ÜðŸ¿E˜­ÈGôPŽ|ýŠ÷M}ðø`”åWòšæ„/•§;Ì{ß½_7x7ï_™~^_°(=û[3ºcç'ß õðÆ¿|>±Åþ߯÷Òq N¾§Paúx±ï¾+}2, ˆ½å£ß¿u+d;³^Ýæñ¶ÝOÄ÷ ËÍ5Ý`Õ«®ç)ç[íÁ%s÷•vzá2)Xs ‹€ÒGö¸1¿—îB*Ѿ›4n•2\<«ËÈ]ÃÊÝqÀŽk ×Fj9ˆg}Ûz¥•Í·šÉu‘|€fs›ëí`üлûc&ká‹¥ØD@ÁUÑ?_„Ï¡ ôǸùû––}¿‡°û÷ 5|(OÚ-®ø©w¡pnkÁLH¯YÂ_h9ùo37TÄìŠ 3´äБÞÃöû¯ÔýµëYDá°mÝ ûõâ› ©ïÅhÞ…â¹>ƒÜF'÷Ð^ýSN8ü¥àï9ï¤ W—~€5ÀKøS>ÏqèKšF"Õ±›p?{aþkiN±÷Üó°þÛ )u×'-»ãÝ;³—,°…a»éˆ]XÚ®'78·ËÆ€/„¯W¯@˜³bôÞÎÙ:j 1ˆ1Œ’"ŒLAŸÖ:VogÔ<á,}P4üwcÀš ¯g ÅùžÒV çÉÔ:÷’€¡éª”DÞ܄݇÷éìxh3¢ü â~Åø½oÆ ¬.½î|,ñ÷ä<€‡½gG¦ÙÅìœ21“”*¸j¨¬~Ûfooð |_£‹çMÔËóy Q2[H5ªkÃáyº@åêÎf*íà'L!„€!Y9[¦¾¾²¶ºV¡çˆÃÙiÔ„Iøð‘– hì (`ñe 6iÆWå6ýó¿@ôRG¨|¾lÌ}ð±×¹ÉŽŠ¦({àUCÆÐ!éCî­,ù1wáïAõã:¨éý ßÕ_}¶ÄöZL6DʨÝ;&®ø«h´Õ¡b…XDõîõÕ­ ¾ø§Ìmnž¦Þ$µ>í­•DÛ’“BscðpPgƒˆp'_ÈwÍ‚›HVCàÐ 1j3ÜòlO꽞M°’&†ÌÀ‹"Ì»­æbU/ºãô¸~ø`‘ž_¿!/h¿Äoáí“aš‰ÂüÒ­ð€>9ÈYŠÎË€@µ—aO‰ª‰=žÅƶz—ÞÛo4{íÓÇš íiAöÑûÛô¾ÙS öd߈8i{ /Þû¦«=?üø{¹Û ùéOPÉÏË\96©öÊuô÷ß”þ÷Scôk°G=ÝBø;2(â \C `épމìBvâÃ^½ û}ˆ?Öyêì‚ìphRÃùnvþ)=hý‚_Þ´ù—}Ã:.Ý^=Årjò·7å¬/òÄ"Ìá¶YJ¨6ñØœ(HVzÔ^VŸ{›½6‡à3ƒ¾Ìü;éΠ릤{##‰ð,€í?,Àˆ£ù½ûdwƒÜ‘¹õP¬×“"ó<ôv¬ë>vKÞû¡38Pä±ò¿¾O~{£~ÎQð$Þ$cò™©ŽðÅÝ×£n»Gë2 >®î§cæÝè‚ɬ!ÈÖ•×SÉi: ñ{•¿nú øTB$àa(|GâÌÈüÄŽÙ8 ß šäv~’OÂ/«Ë'Õä›Êcé½Ïe¯ vþsŸj:œ×îòò ÑÝå–áSôöhàmèÞÐÛ¼¥Us,iÎKFöµ!fc:è³c åðiü»¶ïÍâ;ÁOHÊ$™€òŠÙGÜ7ƒä¨ êÞ†_/3Ì~ŸºƒÈ¹æ¡]?zž{8ñ”€Ž…¾ûôùøúxµ´u Ñ Ú¿ªÇwG¹ƒâÞ) Îbɰ~»£ó"vVMƒ7†÷5æfæZ»§ê¾íé…0u…`D VÅãµø`ÜŠ89GãÍ‚¾…"¼~Û“ôÍ«ÎU†÷±ÑõxHÇÒW«Ãï…hÅ%«o¶Ñ{ˆzjE:ÅwÇxo{;³Ñ¥¢ǫ̂[yàö÷;mo¼&  Q°´+ñ™|ƒ‹Ÿ,تÑ?‡©ç† B„Gª\÷¸Õ›¹X ”®Bî±~a‹A?‡0&+Pe¦~¡«fÁ—ED °ŠÙ5¢RЭrÌñð0 –çÚçØ‡…ûubÂDÚÙJ9°Ap¤‹Á˜•¯ÎÁ™g°,ºë6.Ȫ„ˆ'Rz*›¹ù¨¢m|;.˜å5Ϲ½Ù28çha#ƒxÚ»ÉÞβ¢´›R7çLÞì…½×ÆçÛ&z¯B²e¬žV6÷1åÍH‹O&æ°Nem.jÎË6‰uotΫ‘œY.ïzéæHhÜõæRiË0¯ ÔìÍ.|›mm^³šAÝ6²Øs”‰©5kse÷h³'מ^ïtÙq‰»£&îs{Z>­]U–Fgs챓}u5™¬ï<½(]æã»ì›¶÷po^“ªÆVS®=›3DU¤ õöfÝ£k7K±C‚`-3ÔcŒi¨º³¯°Sb’dJÒ uMm 5Õ»˜ê<æÀ¤1YÃG00¦¶AS{Nˆ’ ÎY“››¹E@œ{RÜéáNjžÍgV\ÌJ·dmõÛ.ë¹fd Ù뺸”ÝX½TKb²dRB8ê‹–¶òFXKN¶÷š3Ó¹8`ÒTdp¦2‚À´muÅ]µ¯:òFsì­UÚÎôÒ¤ S”sw*îN‹éð[xmrcuÝ s¸®C±8‘`ÖdœcDæï3Z騜ÚéÜÙS*Ï$;d]!–„ÔßR7YOXÙŸ¼ßhôå¢*Íäô×Ls3”ʊЗ§Ó[†ŽÕû}”ÍŽw+&¯6:÷Â;‡‚zXÒêìŠb´™9a1aÁÕÓ눋1À„‘@x2kX|¸ššŒJ—lì7˜<¦e0ÏžÞd£ªv&u*&š ¹ÇŒp·¯LÎÞåSH„–°ŠC ÝÚÌ«²áa7‘kdˆ-èÚ¼,]¼¼«g(\ÈQsÀó‘žód8 é­48¡DC‰&Z‚Š)!·´ª@ˆ³’DÒÜÁuaÊq39”uƒqÌUÚÌÀ¼• ÙfX°E@ºjHBmC.ÉrËS†€v‘IeQ2ª$9a¨a·23 ºbwK´=—‚i¹˜8 ñ ·¤âI¤{s#J7¬(Ü’a……WÜF“N%Ã7 õ^þ~³öš =_¥)ü/ Ðje] ùkí.lg7kj\Îh ßAèo¸d4’0¶ud…ròÈç$æÐnoš:9§™l>Ãç7•¹™•ÿÓ<@ûá¹§ß6Ø’1A„€Dˆ,¥Š5¥k¬Àãf²Õ OèG¡&šœN³µ×9 ö ñ9x‰A{Š’´ÝUjÍ û-ãQ7’ʪ—_—_ œö—`÷ÐåDA÷÷&Ž?½3÷Ÿ´ÈËýÙY„`’?T´MAˆŽÃç¼á>udP†½ôi´o|†³Í°™²Ü@sñ’Ñ,g_T0f”¾ûy†}3ðö4Bz*=îŽÇÌR(5Q^þ>ð¤MÐuéØý€P‡f㦠ÓM³ŸX‘`ÚÉÉLσšï×ÚР¢~˯À##†ÃwÆ’iEô&\÷´œ 0.Êfeæ¼¾_ª½Ô€9åšöÂYÃ~ŽÂ: Eß%ï½N9ÆW•?H©À²uþ‚0zOíÍýMü û0 Hx "LA‚ Ù¬§A8AMYBRÛR#ªË2†MêÜ{cFÚÍPØJâí9BêôÎ¥Ú{§¹ìï!.J,|«¢óX’·ñ€²„¿@м¢¤*Sg‚Äñíé üò`¥…Ÿ«€CÂE8#ãH| ´åa™òæ½½+U¼påˬ˜s“ ?;öFMåPtßµŒ@$“\¨‹/ŽÜ°ªÞ@+œ‚ߦ@ð|rgLÉצüTó"rZ•ڒÏJ¥uÑqØØùuUDмú:×óž]Í ïµýÝú…"(‰²´8CŸ|þ'–C¬Ì’ aü¿yU7Òå§?¬Š¸ ü§/ôü<}ìW 5áú†Jb6áû—Âéûç<(t?WžHV½#8ü6ÌwX×MZüçÕ'ÑçD{«^ýŽ¥àϛλ»Då禤>½1!YBål„nô7CÇÓöݽø~ (ô*eŸ\ »L¢"÷–îoÓ,O+¿•ϲUþ×q¡‘î¹éΗHÛÅ«~w8=uº^ ç5e1ø,ÛÛÚ› Ã^qy’ôïÞýàÑqïlÆ™p'Â2Žñs>«òßdî&n… “äøÐ\Þ[øõ.±¢÷¶~ÔCÞ$ñ{wä^ó™%Ÿ}bNuPÒ€œ1bC"Yˆ‘. ¹«ç}-×ÇÁß…®d=ÜÁ•‚JŽÑ—S5º¡7ÙÓµÁ›ƒ¶f¶ùèîT‚(JÀ@ÏQТ*]äâ¦kEûÚæ'°döDÏQÛ. 4 ‘ï«åÂ.5')S[¾sÕ¡ÕŽ"µP[nw>^äǃÈò&5åÕNk¢að½Ó¿|õ‹éUGÙcílà«ö—‡umÖ-àÌEHr8%r$ˆhó‘ž¹÷ yí{3=0ôx£A4±zVÛ=·ÎÇ’¼÷¯ï)úý/÷çuÛõõÙûùl 0øx²l…Ó]wP³"®`ïœ |ëkéÏ€ªà;§é`ý•[ðÅQÚ~ÅÈÞVȈ„b"PS¢éP.(¸‚ù ¾'[˜•Ôàt±ïÜ]$£ë(w˜5`žñ½åêW ËhIÎS)Ñú†Ûû:v}7+B=ç]«ñgrM€•*É”u÷ê½ ¼ÞnÇ|†}ï…yÏBø`+»T7cAïߨeÞüèL 8lM¶LÉ“A«°=(³ˆÒm%`Í •ùŸº÷nú½‡Ú IÒ>¹hÙ!û:SKÝgЗ9ÊRPO~÷o¨¯¡‰^K賂›ûØ9)wĺt…æ]3#àùÑòA‡£k웲ý„ö´B©Ú¥Äkî•Uöƒ¶Æ{­úHUæBfgŽ74A!ôŒrŽ`}ªZ"ÁŠƒ‚AЬH$Ð>0_g‹¼“*Gîg¶45ð‚ÇG×ìʯ„‡=÷ÙP’åWä⽂ßb­Ä{P*TŒDKs@Õ¶.›ü,3·uzr"&^Z–Çeñy«-Ý"¬É¤À­!LÒ‰âË[ÆùûÞZ ¡4Gí#EËmßa®êgÙ‹l}? Ò2E}©šê¡š/ëgpèï}Ÿa½Ñ˶g™åÇŒçŸÎßÚÓõ…Ç½Ž‚ææ¤Pˆ1í| xxK«ë®U71 ?gÝw‰sA”Ê·÷¯Ì›I¹¯9îa{×1ß@Ÿ©,úrG½™_\íË´þéÈ 7¢[HáãÓ×€òÇ‚Öüó9™H¶n…—p¯ì.ÞŠµz©£~ýú±¯_¬]Í~ÇÃ>ûÈ‹\ßìý£7:bQR·—7ªtÍ3`£€ºê×y‰¿ ®ßbFÄ~Ø["þü§ñœº¨2çÇ€Að»ï>yw5¸®'žŽŒ€ˆ€_ ~í9(šéùšqÎn™ìW;3ŒZ½ÜŒgø¯m BöŒ‘ÚF»}4m¡Ø@ ˆ €þ BíO¬U\ö@ˆ”½8CôHÓ[ÁÑBE4uPº–¶À¸}æ6,‘{šÓ„í"#kùYžIo—oª­HÑAšÚ®OMËW¯>xKTù™™Ó.ªÂßmÛϵ¾œƒI´(¤Ô´('®½s¨d¹}ê±]ãÁ‘¶0Xî¯Æ$Ö<¼I"Œa]ÑÆç¯|HŽ î¶xãfJ©±ž¶÷ÞŸBæŒòÉ ïÃØíç"E'×nÁìƒ9éÏpN:ú^ǘÔìÉ!:s•Ón½õ«¸¡kœéy©”m¼I ¼h“v<îf˹֯‚uþsȽ^¨‘ñZ¨çy‘¨ž2\ªÌñn¯ Æx(ij*6ÍR¬wÁâÊœÍÅ84邃¥¬£aóô}ÉΉê³ SóhUlЉ* $w_µßÛ¯ï«õŸÛ’…»ø&&{³{Nš¡ëãiîòTéÕí–††ÕNÄ‹Íì­)25•©[²šÅ\¼á «œµîh¥ê‚áG¦fþt‹<>`¡½RB»÷·|g8{Íj€T‘BbdË^ö™ç7Œ}áCÐ’ñM\‹"A"½“a«8"q:Y|¯:ð‰¬snñ[¬Îê*Œæ]6l~±9îtÄcßsÒìW~í†AØ\°‹YÓ¯Dƒ–\HÂÄ÷Üw[¼Ç>Í}]òs ¹ØÝܨŒûÌïÏ0óš ö;^ÊÃrWÁ‘õù3™Ÿ9ä¾7@Ô’&¹t*' ÌߘÙðV­–êÓvùç–äˆ?‡2™óg“RÂªÈÆ„ˆUQÄ·÷°Y¹s{öîûô;‡ßŠF6Áz‹Œs®…ÇG‹·w®×O¾:LþöbÈ3´(TŒ·V¤¸ˆ8ægæÍ^»ë‚>?rѶ$QDLrUˈ)“ @€&oÏÎX©û[ }wMW±u]çîÍÅ­LÎHcy FªÞÜ·R˜”ôîMÓŽ˜‚!ôç;جŒ=šû.ÓÚSðÐŒÖåʯduâ݉ãW _¨d– É w5ño‘ã^¸ÍÙ†<Áh@Ã4¢Uì ‚ú²žçK…ºml‹€È`N„‹±u šíu­}'«rä2ä–‘ÛXûCñL¼òYn>g,A“Š€kÊî\á¿r¹ÒéýNu‚«Êt{§ÎäGnjºïÙæ·z·Uô-'ê²^ιûë³ð¤­žß„ã™´;+NPìÅ•Xö婜âr«6#ëŒd’®ŸÞ©h%êø$eαš2„è@ms‡äæ¹Î*×ïL9Cñ{eÄO‡¿)¤óóš½vмvdeÎ}r¥-u‘æÖÊ´û¾!Kœ¹]ad†Š£ûU4IåLöÊÜ«Ÿ¤Îà4:ÔÆ,WTI54‹s5ãn™GïÏ6ÏáùTü/°ñ¶4º÷Éê zöíIZ¼»YL¶`´íÞMĦNRuÁþR)¬;¢>Rôû«1ðNÀØh–dÈ\wq‚n“BîžÝÒæM/UY-,úfoBÂÙt°Ñ÷=w¸œ…êSRˆb¥ZDµRFŒCßdîI%zê>»¯¡?£Õ؃O) ›±9™Οz_»2Ñòf‘A늩ú£jRÜ]˜É#ÑcãB€ChÑèñ³ÃlÇO’$Ù±/³ðúèã0YT3š }ÒÈV§~w¼m893Þ>Û, ö×}Ìò]2Qðù°±Ò0¼×‘·vÖ1Æà(a[»$² ]bå˪.C¦uËy:β¨ÌÎæŽ ð×±7¡PÅ&™Ù.Õ†SX6QFMYNçX#·]cÜXÌó⸳¤¥;/’sXëçm“yNu¼ëMq- u8i íʓʅ©ëÝÐ_ Þ™“²3eobÌVijÝ"Û…òuòæs± žË¦žîÞRì2{M«',Ëof]âRÏHO ©Yªš;›D_}k1KžÔ±¹­"·qÚÞ³{c.J—FºIcKb±*Mfvõ,f{w&·o'e¤oVÊgs®ŸukéY»(u9&¾bÉV·#äâqöºœqyÑÃ6\6&õš4š 5¼&«•†pΚÐUE“hâz6ÒçnÃ,t¤°v8Ú²_âY¬fù¹±+çl5áÉ<ìs“ºÜ f–Cè[œÎÆ0¸Æ7GY‡º'A‚H9EB»önÃÏ2¢ï­ºj»3$3ÙUU¬OÚé³¾ëÈ®*¬ÒóœZ F<Y;¨i76¦ƒ¤ç¦f¯q–·\’8‡b[ÛåðßYÌfÒŪ4ë˜)a©â™YSÜ6„!ÄÓ·wy±:䜵\Ö;\æpjÈJ²{1ó}í£niåtí]ÆâÖ.Õ¯OJGPYbêà-©Ss{Å;'n&å)ê/6Ì;bЬqv^¼ãQ±{D@D10ÁÂ#™wb¸² mŽÖ„+Žåø;Ø"î7JEÈ-ŠœxAbW!¥.!–Âa±aY°C±b*@É3Á_H$9´:›š7»Ç-Ñ;6Ï@ë0Á7pêòÅJ% nØ´¨R¨Y[¦bm,ÊkƒÎ©ÍçRä3U÷x,Ænl‰DFJ&%´\„Û&k®ak\­+Ó†Ëv®ÓsLªæfÚƒiN‹Î[8iœSœ.fcS02™–ÆÔ<§J& (s¸HÌbã W¬§e°HT2‹aïº)±Ÿ7gªû‚ÁæÕ1TÆeÊøPu¸ly:|ª³íß$³n‚vÑ;]¯Fw9œ»áwa‘—ÜžãÙ6¶†bæA¤-ËY{¹C¥u¼;3§J¦ÍúhQ#ƒ›H•ö8ÒCÄ[LÅÄ]Î"6 à_ÊH´¬žÌ‚æÕÎG]ê])36µKÏÑÈÏ|ëŒuÃôýô)3ì™®ÎÝñ™òûð3ëžÉ ÷|„$ŒÚÉ7v¯ôà paÝ\`ß>Éñ‡³,;Å%OLÊUùYQÔŸÛ&å¾#z‰¬ä¸ú$`YÌWDøøÎ^%5yiL”QÓôýšrµ4×9b"4-²¶‡‚.øÚAQ0"›^¥ƒû¾3éøë¼Ï-;ëöIæ ìZˆÈ†³œšâóYª°ÄÁ¨V®ÏFfý]sÇHåZÄþÔìÞÎ*ç¼ä#3šn“µ)‘úÞŽGZû¬À4)È–†ÎÔlL…$e]Š*üîðýx>£f«qIÖQ¢Å´ÕFª­Ó.½¿볞³R÷²úÆÀÛ€Ÿ·xí±g3]±rpÊø) bÄSÂSvFÕø_³?Uî²;@ 300…—xÕuÛ–ÁpÅ!+;;»{ÜÌí%vxO3ÍcÀ{Ó×Ì>œ¼ï1êÍå˜\MŒÔ(Þªtk8Øå¼·²AÏÙìñ‰Ø´SŸ¼©ªv~®ÉÚŸ¡Ø‘¼ ·ÀæXú­X~8g†$ÐH-5ÒÅS?eü è  ªÇŽ…Pé¿X·{÷Hs'Øæ\Œ_ƒÃ{ïQò÷CYÜ8ç}£×‡¬àé Öuà ÈÖ•ûÎ3žq|+€€7yìɳ ̱A ^ò«sy0}l(%‚ TºØ™^‘¶­‰<ý†MÏ¢4ŸŽp†A5¸’Ú|åŠÂÛ7s§@ïm& ¡CrûÜãMî\lŽOŸ,ZösèÇ›æÅ(‡rGnA2¸ß“%÷ç¼Ð;ßw‚à¸YòÜÌA€'ˆ%™s1#T<&9²¬‡oïMâù5ã›ï +Ê o¥ºªv¦zgq ÔÆ œü}L颱ú ô>q¤J$ø¸QzWÅDRÌžÆybîùVQ0ïÏö ˆ† Ö¨Ÿåj:“2Õü²}÷Ù¨±ð­ûÈÚ÷äZWl3dhq€À€ˆO;R\'_½÷Dјnà°ºøÚ·¸kÎÁ×2ÌÙotá{³§«‡JqfÞÏIÁWšm ”pì|ý†ŠIÌÞãÔÇÀ…CÛÁŸO¥ÆÌÎþLTìõ žN ‡” "8ÞâÝûÒkv|ÿ qh~õÐ[ïž|}‚æ<ÃåI>§ÈmmÆÍ¿tõLnT7·­Ê;P£Ríà-ûÁ]ìö·[?¾c0­sfb€Þcá^ãSïR ²©m<Žf‚ù|e$ëU²Ø£_~w¿fïRÃV€–ì_Þùä÷í ¥öØ_óŸ¸Æ4àŽ;*ÐNm±mNÄ,¼tp%_L|BóÞù~üÒg̤þ&ùä-¾s¹)t.ñùœÉqå‚áEÌØÃðÒñ#{ÛÌ0@°Ÿœ]xÝôµ—#í¿³o>–/>ŶJsÔ½§Üèy ÊÜ`ˆ¹ÊÀ$Ä!XDW/)Ÿ¶O Óc¼ŸÂ|/"eùý¹~˜n¼hÒ8'ç×ÀÓcê÷6¯=”pþÆL)Ì‘çóàgë_²Þ'’%e_¾+ a²*÷ (†‚N3BïßP·21];ñLm)Í­;¹{²ú…U^½©ë£Ž ‘4T‘x»@æ•iúiW\lÁ‰±ñ²Ì x¼?¿-ßß:‰òsç&Üþ¯¥õ ycÎ.ŽD4*ˆ…1Ž´wÌï‹„ï°_ß¾›?/§ïŸ·+Pó¤ÛRŽÚ¢§L¶qÛºBz0ûÊs€½rnLINs!Þî ¹;Ò©i5 æ»7d­u÷¼/N}dÑÃô]K -ó[6;`ÕO´]V¶¢Š!zVJ¬ciÎXõsîRªø}¾´gáízto°V/³Êg%Tòu>ªY'–†Û|ºs¦ÛfÛë-ˆH|ó£8.úòÉ˯ºË‡ÃÌH·ì+½§éôÏkŠëB¯ÉZ¿nÑÎzÅW¨!u<}#‡˜ÉóÛÍ¥=cÃáÇËòâÖ*»÷®iø¿|‡éÙ:•ðÌTÛ™úï\?²f¥\D 1yµ“îË#oôÊWÕB–kï“™Šèµ‡wFH;Ý¢ÎN,Àò¬Þî½ZDs Ð6Љ¯½¯+Á\ =é·C|¨Ïã^x³oÔšts-¾§=ëꮥUTqNÏ{v‡µ×ö~ö:Åß«}?ŽŒ b³¬UháßnhÄPJØE ®ñÚMíËyº±Ä¦c§0øã íQ²jÐm9,‹“I~ö¾]˜(°d;ßs³.¼Î)aßfý#Èîbl䈊ÒÎÖw?®ÿ òÏÈØDû‚GÀj8çW¾ß&{¼†Ä•ì\ÃÒN#§Ø´.c“ÒȺ¥Â%—U›ib‘ˆ—´1ù)ï°}ò.ûé±”$ýJ׃ðZ-Z܊ͰbéJöåÎT~€ Vσ«øyÌ®ÑöôÇHúüê2§*^ÑÈWjù¢5e¶´å®ôû ¼½v6üøPoK£ƒ32•vÁÙðÑÑ}<»P«ëÞVïmuÒz¨;¿ÏáîÉŸ59ÍØÐqÍ\̽Ñuv½­Ò¹œ—fÆail†åÜ9Z$ÒçÅ¢eN’e'ˆãË»i“.wc!Ç„„˜D˜$ÈbM¬g£¶],'#eðå·ƒw/½n»³ còÓ_¹@gÁûéÁsµ‰ ϸnæýöÕóœéR©NÇBšìVIíJ³A¾êÕ„úž¦žgtLf€¥Ã(RK®?m)ê /Þ¤ä{íû³ µ}NW´§“GbhÞ½Ðgïdׯ.m±˜æÞ˜âg“ÀWcÁÖÔ\>b©¿NÝîú쟳<=Á;dö^ìånV`¥(ƒU=!;Ê>øcËÍQ(­AÇætÏ Ñ÷$ɜܛe3Ÿ–£û5“øû OO‰ð6P¿u뿤da7íÔ¶×íѳïZÜý"·h{çh< :»Œ ‘€ˆ’È¢@ávh}À¢§QÌö½¯T!F‰¿Y(üÛ¯Múœ™!’Næòœ=êïÕý™Û³Í3ÀóÂrçÛÚO{(v«á-Ù!+ƒÝ“Ï}]J“£ëµèµÌõ~šsðÝ–À²ºßŠx}‚â |EæõÓû•hôݨ‘y\Ä÷ÞÚ.úÿ0ô¿§ïÂ~cÏgCÏ¿ÁúuŠö¡{YQ&}õi T£ZýÝž9ûÇõUÛ+Ý¿°õìüÈs†‰s[ìå>õ¯=áæitzNŒ@~‚'ì¼÷ÞE7ÈÃ<Þqú&ØÀõé±î{éGÏÁ^g£îo®d=Ì::Û³³e&rn“ž“y+€îÝ Z;¸ì>^á2*ìAÌOçöTñ­ç'÷öû{áƒÐr£Ó²Hü? wÑín¿g׃ìÍç&Qõ^æ1×o|º…ún-îáôìãÍ»„Ȉác«ñ§½æú*¾‡9ˆ#ĨPÏ?`ïØÙ‹°ªÁµ5†ªË飚³‡:Íò×µ3MmQÇéµ?v3Yê¿n™¸ôÔí¾NÝú§'S¯]hÜÙ}Ý^ˤóÏH–/Çeå…ÏÝ=ïÑ»aüµ|c­ÛªÌOßtelݼìËÓu@þµ]Í<ñ°Ág³}<Í'«pd1¡¿Iöå'*¼UÕþšlm?Us.{µÝæmÞP&Ó†÷Ùª¶H© ÉÐëIsw5¢I"ä‹ÿµ’ÚÑz+EqPÂ5Z‚@º¼ÀŒzèÞŒBèoðv貉›#CŠHŃÁ3RAˆ£NG`ãXÉ…/h#„ 9†ÿŸ|1{ìL¿«ãÔ~Këë]c±QŒP¥>¨¹¨ðgÓàíµ¤{ÞWA‚0‚Ñ“u4¯Åý<À–ª]£ntOVzâßȳØëÀsööWp)—÷Qz|0jÎ4¼E«Õ¾!‘v£ˆÀÌØg^lçœõvÐ÷{õ 0#|Æš-‚©U¹¦×»9òˆÛŸ/jªÅï—54$‚3ççÞÈFnåä ôôæÚXO-ŸÛ³æäXd,£¹wžnÓusSK%­s"Â×\Çv;ZÌédPܱ£„å šìž¹—¶ôŒr›8¸Ü%옓YZëö&®ìÜcÍIdƒàÀĬ=Y!~ZÊ(V´S…'ˆé}›Í–ì8ʘiL3y‡$»œ·4Yº×fÛ @ ‘s8Ænqyc‘ˆ,:ßy-¨°tŒ8`‘¬l !2‘A¢u\§yŒå|À¶ÑÎ1;ͺ¸¯–K¶ÉÁ2ÌäïN†øéæë ^íwü–%KɅΩLŽë íQ,¶q1ˆ¬Á´Ú99ƒÂ«¨Y’ˆ,(£&äªã)´XÂs1ÜγÖuë¶òáôŒÁ•3½/W·É^zK¦®”·CLHÍÓŽë¦jyî­€àñS‡z\˜Õʸ= ßd´hÖF”vV–»5 Æ:ݬ­Þ;@_S9$î€é¿~‹°h”J}”°?³po²±|ÔÃéULÞ™[±ŠsUd|6þ_X®ôvV­üETµnˆÁ£ï¨}G|àmh>ÉpöÂ'ÞÏ©r5ÛRš   ÏÞG;^P©ˆU7|ø|ÖýÊ®NO¬yËÕê¿P×ðip°}8ƒ …Èöýc:kÀÅU9ßT()úV4­Aæ2GÖ¼$¯6!<Ç|HH©ˆ@—Ѿ'&ÜöÊÞ{¾«»ß=Ò£î-~ü? •žù^èÏ¡;ÇôÏ~°Ï;B…š4|›šÁ÷úWNàõÃ’m{ôšú{ñó ñ1Õ¯—ÁX¨½æ ¡û}Ý%ïîuìºlÑ­©‘2ª½øl{:ñ?]ìÚöÓ¿ohÍ lo_&é›AÝØšš"IwU½Y7Ãu ªÝÀ©ò¢XN¼s!Ì©êO™wr,[?&27ZB. 7áï{¦j1]PÌP~šÜÈ¿ V¼|Žü™ËØîÓ¿KÊÇye´³äÂ,_w2о¥á¾Àý¬ª_°Wh©IʉJã|{Oګ᳘A{SŒD9¤õQˆˆÒ~C6Î*kåå`­Îöƒ)"#ÐòtúÆú_¤>û`?zEÑ-£ÙùÞ}íY”3wÒÁójE™ßÍ/WÙëÈ¡l_¿_£ô/ÀÉ$y õ °¸S症צ‰ P4ª¡EbÈ9¡h_ o¾cûÉèóÑœ€l¬ç.¯N–>É"ؼtqýÔùJ74aÎSXYs‘Cvß^e¯¼ïr¼Ò`ê¬ê:¹:;7Þu®wG›6ðqºžy寈ïÃ'Ö,0Ø„¡×mHebuèöú¤]û9ŒC]˜òˆÆ†îðd‚¼_º6UJð–hDtr"m@ü>giRûE|<º×ΰбÙëí’ÙCB††èÈO¯‡ª—£îýô~a¾ü&-" hvŸïY½ÐhÁ;Ø>ð»¾y#¯ÁlaÍ5ŒÚ¯»PP¾§Ï7ôï½ØOœúºulΓx²b—©›œñÊÃt'B67vON¼SØÝOH‘’•×íñâ`Ñ„QZB÷Âk¾÷aá$Nǘ¢‘c÷“¨³Á!i \ÁtâÑq®Ií¼‹|) ¨ÉÙ£åðó|ºÀº1sÎïÒè{í2÷éñúáÑY]áA¢])&¤½£aþß n2(#÷ O‡6ŠO² ìõww·ó;úÏ =yïµ{”¡‚·È¡Ú î.CØ%AëÞ 9ñ ƒéƒë¿AWëQ”³º%ýùŸ};ù¥1%:fQù‰øÏ§'^Pñ†-¤3F‡YÍÞÜrÐŽqiìÂF…Ö=[êÜë$9¾ÎkeÈF ¯z§òB H#ßsßMgΫn‡zµ :z¼Ú˜gåA‹#tÔȤ€å[FR0+–èÎè~±lùÉ)ª^]nøÐÊì6cHÔˆš(*Ùžª9K0ëmUÙÇõX­¬m•¡"®-y1.—Ö&XàãKFs ù,ü´>†üE} ÉÙB¤{Òeêm ¾º²ðª9ÂvÔçZ*ê– 'îWdn«_4_4§ò™Ë Øcd&üÆÁ6«àœÓù¼øÏÏV~ñïPã!Pò¡âŽ„sžìß® â›ÌK™å±šƒ´S«Ñ,*¶•¯".k=Rû¸ã·69Ð@RŒâIšþeWýÚ¯úþ»7t|ú|¤ynä²VZÕŠKÅ_kÚõ¸—ͺ½äVŽ@ žz΢Gh»@ÁJévµZ¥Žãamlq¦°…Ø6*DQãXbvÅD½%n±0x=fÑgLŠ í…3Ä\¶8i—n¬5*£,Ì­wØÔiÅTpð9 äB¸Úïöa4¦Ñù"ÐAz8çá*¿"ðº×j¹Ùê·ˆØZ tõÖU ´¯Àr(~öCq¯Úi*áycMµÔ»à *Ïþ“íM"ƒˆBÈyK?ï3·ÏÃa>ÔŽü3?@êqú{[•Íë–—1Ï¥ føåoEœvNðÓð5éé×gš fó\—‚ ‚jàüN¯¼OÙ¦%÷ž~"T—«LÿŒÌkPm >æäàtï@¯Æø– ž^‘ãsÇJ:'N€›{1 5tƒmýú»p6 0k©^6ûÑ¿°ø}êEyo{ëÐvéðü(0„.¥HÆ!A# HP™“_% gƒß.…^u.T±°wÔ’øûÈBpZk3 ÇôÉ]»Rìè:tKúLi`íÙ×Ñqã„ÈMМÏ`]À„fC"„<}züêdé½™µi»¸£n†±ìí¶pPbé{Q£Ýb¹/É›öÜ»Qb!%1YEg…B *¯ê½ðW轉ŽZ==Nˆr|½Ž=7/R)ÑæRŒsù¡%éo’ b%’¨QtÞiÁÐ?‡`…¼Xg³'ÑëðØ.äæt“U6“ކÈïÜÛ%Ï›C[Ø|‘–dÀIRP`;7BD –@ÁØü‡}“Aêì²8$ul0!èw$EB(è`jBÊ,Îω}‡f=ûüIpÃø"%aì¯ñrnØAI5U!FA‘TüÂ`ž#¥f~;ØÀeAÜ{ÑO XÚÍ:o«—$)`‡ðÍV¥B•ýð¢0Ëcœ2ˆ&J‚VPJ‹E‹È•‚?®sl«ÄÃR²þîêRc, TåxÄæ®ÐÌÔ™Ó&0R"“Z¨\ J“T`MJÒE÷(qP‹Ä“ˆL·¤¸ƒ¨¯ôÍ"ê‚\à77HHRjH ˜š€bEx‡ÆV©R6’T•…IhÙÙ“ŒQPÈ—à†ˆ \uûŒ“¦HtÃÓ»,RÊÊ…a¬“^07”„¬+%BggRî×­Ã4‰Q ·Ž ÄèÊð[›»ÓÁ™KiHË@)D©+A„”‡‘ÅmÐh¨ ÍÌ_³ÚÎêA‡ÿÿ5Ö ff4É+Âz8|áCF~¼Öa§Ž'÷tü½p½ bOÀ[0êà]Vbn¨†s«ÒŽ`FOX§Rœ,!+$IÍæ2…¶åK:xã¯3ï<åœáJ› +¶²BR³êGôd¢¤¬ã&Š$ÂìWôç€;Ýs˜‘!ÂHŒÑÅ“WäÇ$öyš‡³¶)„˜7ëJ˜‚’ Ÿ%CÚ¢…͆EÓ°pE ïØ£„ÉÊHhØå¨Áð»íG”¹s[û¬à—$ÐÔ³bý\ßàjÝ'LHG~mÁÀîÓ$,Xí<ã ‚¤;xgðŒ:0/¡8N÷ó!‘'CaxÇ_(ù^5·#¦ÛâÇÈ€wA]G$Ï™`%Rfq´êsä#ä¹^våê%7ûìº$‡ª¦á÷ºTLCx-AZ±0 R·9œ†ÛðXûúÑ&1²ÖcòT±…–öx?¯‡q9CðÏô¨ ÊAR12Ø#þðFšvî Öš¿(¦…rw7š·x´=f‚âº"PÚSÞÓ¯m¤’%ÎHð:-½<“§Â¦=RZÉj:û›ü(øÎõ­­t¼¨@q,Š,ò¸!Ñ !¾UÅIAFÒ¢Ž¢¹*!XˆÐ…`…¶˜F¤(iX?ðØ[G^~Ì3Êv=»bƒ XsÞÉÀ† ¬'\=ªªbkÔ´­è2q'2¸){6›S —™ß[ˆx~§>;ÇHH<à?V²Ø%Z‚Á aO~žE?õ]…çsØn˜¿×ž×M Z©0BÛ>œnp˜K-`ß³öhpBòТРŠÃ÷ YR¡‚IB„ƒ÷CÈЀ/®„…µnp:ƒ˜6›™@y†ÀtBÇ7Vl ÙÄÛÙw¿Ç¯=3øÏ¹Vðh«¢cèfB `Hr¾;÷»²s"–Ì>Þ~¼c'+%˜Áˆ‚ny.ö|m°Å¨ ²ªD‡ÎA-(QG‹ë=žzÍ »µ3d‡žÿ•9ዜúø9w}}ï“î+Üßp‚'>þIÖ¯SBïÄ,–¡WЀö,aì4ÓÞ _@Pqùe´~ÈÍVã4mѳ ¹!P¼Ë xB‘=Ò[‚€g#Öá®yÞÁ 4J0[ˆF „„å}|C)”¢*Û^›z“‹P¤ãŸÄéÅì˜êŽ«Õ<õ Ii_* ϼðzW’< =¬` `°Xª+‘ðè‡cDœjWo¡|7ï•ùÙR$Ü|Í4DòS¥ù«$lÞjà…K²»P ¯lYŒ•·[Ö9îe2`çðt¶Íµì»%‚C’§ gƒŽÙ ÅŒ·!/6à –n<|;ün¥WoÝQh²GzÁßk¢†j´QÒÕ¼èPüÝJÅàŠ˜'sP*»:CÀüèþf:~O!I¿}¿œÅßÅó(J…(ä*?ˆH yëÏ`è1¸dõôò`0ˆHÙ«˜:‘JÂ}é@ŠA«Ù ‡õæÿfAåVÀü5‹”PJŸž6H ‚ÅR¤>÷ÒÉÂ÷è¡N%Í×¼jb+_ LjtZc°n ýœ¼¡ò‰½h-B®Š ‰ž²{8ÙÛž+þ0 eݲ“Õ>„1Ð+úpYŠ@ÒsÇèÁõ:' œé, œ©jpÉ—Ó$.^~BSâ $öÃÇ ¸Ý:!4‡¦tP3M®‹7-we.Ì¥Òãªþ¿…_ì½ßÙÉs òI0Ê(ì…OƒÊ¥Û–¨èQJ.Šä̆ŸZ£2 Û’¾{h'¬ÜMû;¦IU-U¯/ ŽÇR®)ì1s~Ö(ì£h¡0$$HŒŠ,ŠHEïFªC¤Á°Vpƒ(Ù"zÙJ?“åB»‡*z”{²ÚH‹õE¬Qþì¼BÉRT’ ׌;N†-[øé $‘í)TP4‚˜ŠVé¨H2Dõ$ä'Š4ÐØ!Ôwȇï>½€ðêþDvå2Bv{ >ªØÔ&Ü9ûéÖËßR¤Ã±/! +@Qó¹†\J¢t:3¶À?“aø¨ È©Gv=9Ù-ÜÛ¨@P ƒ‹y:PWŒ)äæh­Ouc$•F€K›k€hèe\ØO¹Ó ©éÛ{¿0OA‘OžÙšP¯Zz¼å5d#]_eW±â¹Üøá|lƒÇs¢§S¬GmºŠwº]B‘„!%ÔÓ³S‚Ÿ›7Œ x*r¯`nŒ$Š(ò¦àbEôœåbÊ»^ GÉw$Š( 29ÖÆÃœhÚuñ¿ß\jE›Ý‰1Cx¦á«~`#iýCF± m /3d7) Hƒn)…œžNyû–½4ðû믰L®)-»¸ÜB¡'pn&$ô¥a-9€Ú+ý¶êq‡:µ?:Óm¡ •˜’¡ˆTd’Gì`ðYôVmÜß>&Î&¤¨ŒŠTÌtÆKùÁÁ» “Fá ˜ëp­¹V…Å<‚&Û^;èmÇÓíµïZŽ?Æf÷ âÿñoCåSÁ£«ª®W¦@G!(„ H HH0I$±ý¤Sê³AËÏá¼$8†*û?‘¸ô&cµÑø!Q‡0ÁEˆ 9 ä!p¡Í ³Œ‚ˆ·üàOå 0"¨±3dBµBê&â¨Ù˜¡HC‚AvÀF!¥ŒF'aü,1=*| ã ‡Ð& yexÓ”+$ “áeT"*‘;FË!Ag?I'A°´CÌ}ûÓª?;Zã{B˜€Ìbs*¤g« ²Ô§âÅ2&’˜iTÅûŠ;U[Ä4­"2'åø(†ŒêŠ# äß› Ô3Â;<9úüû&Äg’AîYþç/58 ŸÊ:wö<‚üÖÀ¯¼9'˜yFã9JBbárc~ÿ.Å_/“˜´÷Ê­—$ÒYá7|œ&Íš¸£Œ‚ ÈÐþö±EDŠ#ÊQb¬_©Y9Ã]«¢Ýr¡x 1ñ ""$’§!ÖåÜšÇB"RѽÏz׋EPRz¾Yr3 B@>b?3þ̤Ÿ¨ÑÂÃD4ÊÛCm%96ŠÁ2% (ÈÔQ* µD$Q ª¢¥@$FDdP$‘T¨¤€‹V@,@@%d²[`@öŸ²d‰ ÷û\€3û4pëöÓUƒiÃ2@ÀП¤Ñd„#c;ÙüþÎHwý¶'0 B„%é*+u5ö|Ye:i ¨”I$Yh\±Dø¢€ö}GHŸ/7p“g HD9/0d¸„.P×µÆ ãP5Æ ¢åm­Ì,]ÄÔA$vÈ’pÌQ“a!ԠˈÉu÷|I=Ò'¯aϧœû¾ ’ÓRB¥âQÁÁK_‡¾‹ Cº¯©®iy†‹ÏO[ûà êdÚ ížÚt"Š£ù2Pƒ¥f¹i*qÝÝÇFç\Hú|Zw»Ÿ3V_b=¢´~ÿ›Ž?ǦgäùýµO˜yûÝÖ°ã8&25fò}üé Oð‡¶LqWjûèTµIs¨ªQXˆAˆ!Ý ËI$•«QÏ`ûDè@ûÁgíòþü¼—隆ÌPYsYª((¨ (¢Ét“ÿ/~ÈgÊíý¨~σÖ<„8±‰%] åL{2T¦¬äK£ò¸¸ŠTR%¢?l U*~¿»‹`àG0;—bh\O¾Rfý¸DI㣱rÀüÌX‚ ‡ÛFaQ‚z…b¢±V >èTN®d*~©Aÿ#)ýHôɽ¬VEÐÏØûKhK ²N¢§04.O`ÈŒ€Ï¿ùKóHgM5ϽI ư¼Äh" &Ï»±‰"ˆÏíHV*(¬A#ƒàx)=ÐB\¦²²*öڕY:À¦5áyœÍ÷Ð4Ô€â~¤·Û¦˜|‚[xgõn}¥™Qêë®Ä]¹Ï;Œ1œA• Æ¢Ì}uh¼ó³ã~Dp…á6ƒm¤*ë EPE) Š$ˆ¢,R@XDH¡a¨¸Th w#2L9׳Òs8Ö»”>G­s^ì«ÑàC`DµW9-Äáß•O bñân'€¦k¸wŠD™}Íž° B$EBF­AàåŸyõ®0Ùl*;¨>· LˆâÅ‘— uZ ß ÈÓ¨G?5›ær’ ­Á˜ép+¿9ºÐ/&âwˆHZ B ¶ê’}Ã).¼X ˲,!ŒV@ŠÆ¶TÈ È¢á×ÏŒŸ[°¹?Ò¡<‘W¨ÓD²rëøŠ:2º8µ"¦îc(‹y<ËÑ ,:²#·–a¤¨ðÍÃrp‘303ÐfÛ*20 IdUJ¢€`¬<›ÐH²FâJÄOž,O² ÎNIì¦Øh£@Ä"!!÷ó|°Òm¥Ó@€Âž3âêQ6¥ß¶Žcc´ËòÐ0wó‹pÂøQ#kˆÞ!ÀmÔ%Hìk+X†{©Ù““Hµ<z?#>ýãÖuÍ|RT‘õ–JÝãQHÍI#="Ál »A‡¸a)É×½hû§ÓY'y`VTüŸ]‚Â¥"1#l±RÏ’Id * ƒufÿ›ö«fŒç|¡¬=ÿŸÙÒA È‚$ 0Oì’² ² B2(¡Hªþ©‚0x^g'”-g/¤ –peZŒOsØÃ$ºÅ"ŒQáeD"È(Ì´çõÖÎÔþŒé†Ÿ)@UH3ÏÇzh‰"”eXe(~)ξ©=c&‚ Òz‹ X“Œ•ƵBÀ$BDY¢¤2ÕH ù~>VEÇ.÷nÅœPWH Ôd$FBH'YP‚¨ Hg© l a 4Oa;1E ¢ÍŒ>[ þ‰ûî0üpâàB‚üJ,NiX™Õ>¾%Ò&B*ë!HIÊVæ÷ËŽ³!hÔ…J[?ðf "ˆŽ6(ˆˆ¢¶’‰PHÄŠ¥´Y ,DAUV1`ˆ¢"ȱAV"¥°´J‚€ ¢-"¥¥¶ª¨±‚ ±b,UU`ŒX‚ÁŒ¬Q,‹R’,‚ ª,UX*‚€ÅEXŒR0PX*ÄFÚ ˆ ¤F¢,"0PDX¨ƒb‚ŠŒU+U1Œ ƒX°X ŠÁTE"¶+‚((¨ŠƒŠ,ˆÄDQŠ¢²ª1P,R²¨ŒQ+X*Šªˆ*ATŠ¢©HÈ•ª‘QPQŒ’²‚°V ÄEHˆ‚"F ¶‹dUŒˆ±‘AŠ b"ˆ""",þÌ…PX$ƨ±£XU”VTéÅ'%…â„ðt£@7¬·2^ƒxm‡ë˜ùÙú”ÌÈ1E/p`ŒÿAEÙñÕ˺Æ)ǪžÅïxÖj¡]';/ûïB‚ôYZrã‹Û“›1 QL¸Íq˜ðáÙˆ4Û™c´ÁËle8/.¬Žåé‘Þ:šÀ½éÃ9‡Oâœèw ã)»+PÝ7$zÐÍx%":<næÞãÒ]RqÂgCkq˜-Ö¬]æ)ÅÀ8Eqd¤À*%û(Â#)¢ìǼ\‰ßW¦›jÙQ²ù“L÷œ[8/‚K0Õ»²TÖpÃ5•ò½_SZ¬‰â H ‰s%ÅäÄ"´ž°c5¦L@ÈJÉ)eÁåÍAM¢ia»“’s"§ /˜c¹eæ¬ÀÇ01¥–IÎ$¡š`6õi¼oMÔi‡.\¢9o3MÊ%lx™š`eË•²Ö˜‰C/4mLÜUn5b‹q(Z1¢Áqr‹s´¬Ä[hÖÆÊk#hå¨ÍÜY…¥bƒmŠõN$Ô:ÆðÔÍÜFÒ°äˆȪ2[A@j© ¬‹ V‚ÙTj•[me-[XEhÁ”¬£Ö¢6ÖZ•"…P²Õ(•hÔRÙZÒ¥-KJ2Öcis X)YQU6•ªÖµ¥O (,EH15µ°EbãÈâ,Õ¢cYí:ìDÿ·”ÄDÚXÚ)DJÚÑDF**q•A R–µU•]ü]‘ˆkÂù»2¹C1K™®; R¶ÆËkDFW¿¬ñúçlÈü+êYÎ Ëå ž0âŠ+AbübvqžþjÈïš„BðâË%òét¢÷¬búŽŠdáˆH°kæý\Ÿ–±¹G©D(Lú¶ÌÍìÞj†Ûn ç8s)à}ì–BŽ)¸°ÂÆqˆ2 *Âïåœ\d m F Ç2™LçèŸï‡r~'?@Äšf›³Db§ðÃ3à%§ëšZÔÜ+$?Ý$†ÔL„¸Æ20A8Šòa—i‚&‰²i¢nbßyØyóååíê?0þÛŸ —j9inï[‡¨¤è>§Î̹ÈÂCe‰u­Jï|ZvÚ<îSDÜ,tP…)¸q3 ëb˜ÄfM}_¿¾ÉbÄgÕ¬Sþ£ áLì´_>R#\Ÿšk&%V±I%²Y²‰dD6RÁ“záòöÉ{ëå_×ò·ª* ñ¨'Lnšœi]÷)5M=|-I7™#Ñ]Dß"Â$€!Â\†{‚ˆ‹X!&’Ï@ÒŒd•>êU:a/gcR‚Môxô/.wh±ƒh‘Ì›3‰†*I †ƒ¥{¬¦Æ°kóÂÐ…Þ=3]÷Vã¢U _¹a„%J"lÖ,…ù™ `Q~Š)„'‹•jP ¤âÊ xå›W†‹I]æ–ŸŒÌ?v½ðÏiûrÀ…@P…Hd2&ÜgêƒFæJÑ¡0oUeÝx5}úD‹>! ô’K§sC©@F(HäÓ†GiD¿'P<‡ |IBÀ‰®µ£Jí·ý÷'bB@bÉBê‚È ¤ zϺå}Ò¾»ø®ñÐÛÃ^pD2@>д~þmeBI$f0‚I"B0ƒtnËúïßw×®ùßb$fᓸ;¡<3_…dÖ‹Rɲê¯S'V²!hTÓé¢MFTT'eØk®˜+0{,mzÈ ª9ty7‡Ü6£üÍg¶o= YZf¨¦kÉ h™——. 30k ­öÕé>kµdÀÄ"F&*¾&¥,§KcÕ÷° ¥Íl€@¶ ÆŸ³†ê“ò Ì0oáÎP0u‚d‡~¹ FpÐ¥ØûÅ ^”uzó¦m~Ögz>„REã.¬xž¾” ¬±cmhÞUEf?¥3|¦ïsW´†ÑJO|ö¤ËªÒ¡–Ñj@àå–Ñ[S˜yÕX@+_4¦e. d܇U½©Q{òšÑÑO|È{)\PfiŽú‘¸zÃÊ¢ÎU˜­'¤¸4¸­ûöã|ATRÌA$ ³ 2”šTj(65•…yí)¥ÑK.Æ‚ñ¾H› Ã<ú9£Þa€Ññü£‰Sõ\Nµôã†ÕÚk*L‚CkJ-Š€'m±1U…[MÃkE¹»MÕE6¶ ÕR”,Ûó»Ñ"¢ŠÇ’³x‡gÕ‘¨w°ß%Fæ1] ÖåDgKé+ ŸlCq@Y'h`Âçw ³ÆV<ø ÑÌÈçO»Ck©›Ò\j¯¼ mÈéùÛ}–ãÀ×Wë‡ómîy~°\œ®AìR®ý« º©Ë^éNf¼Ìð–Ðäé[÷¹c®®éðd2tM^/ƒ×UŒG5Ð4@B.Ê 5Åë§Ñ©8¹F‰ˆSË]õ¢[y[áiQ¡l°®VÇÉ iøtMÌ(i¨Ô.¨‹i¤p…*,! ´XÞ®¹°FRØéÅÀù,ä€H ŽMS&‹5ÊôVpµíÒ³Ú–¡Ñë f°¦ª1‘Fµ4´ÝDÒê»pÈ0EÕ{Pnô ÈZéI"ä $œV`•vF²×Z‘©^<t M ²ŽH¡=Ü×£ÇÃÒÄI訊Æ_iFg V|ò " ² 5q×·gˆ¡tÊ `´us˜ÃÆ”_"1§JÓ¸²A@£‚™`1€$1 ÖëŒp„”Ž W»V¤Ý¶"NDÙÅ[rl«Õå²­1Òl/ÄÕ¾žÅÛR—f †‚ Ü®k,ðø}öÈ]¥‹h¨¶Õ {=ÁçwuY=cŽ*Œ!ï-=0nwÙÏNr•ïÂS¹`Ñ^‚ªv]ã •ŒyzÊ=BÙ¸† í[J8~¢}D/ ¹÷Na îjw¨ÃÁ¼9/¹¬äD ¡b*)Î/Óœ×z¤yÅÒë¸ q”)ÈFŠ¢,M •1UȬtsƒÜT>¡âJR‡w£~êÌû{1„ë¿,á14W ÂuªRFĨdÐÞàɤßjy¢Hõh+Z;kÈ(Á¹¾¼õ´—éõNp׃Ñ@QB€ôD7šïy²“¡ ¢{fÈãºh‡)ü !™€˜RB@;N·(`;ç{Ö)DBD$IˆÍÅôB‘2‡¥ Š]†“ D´³AfS%¢­{8b`É£zDÛT½¶*ë ’°›Þ¦ì"È£Jj¼Ú7(3…ÅX^ÐÝ®Ø! ¬®lT-ó™+ôÔR~í~žÜ¿-ßœôÓ ?ÖegweŸìyÏâãô¹éWb|pÉv¤ Æý²Ã@nÝD  •ˆùWèÔð žw¯‡â3f˜¿½¨>8ׄpbÂò¼[ Ù€ÑQG`¬¡I6#‚¥ñ Ç`@¸ áPT:tÙ¡„âälsUdZ„ëV~ä!£=ý]Á®¿‹íùÁªæ\”'Ô!«ý!ÜX<ý¹Më}KÍÑ>8Ð&…Ÿ”h¡qçè"´ `ÇûMøqÏtújs®‹L;gÄèïÌ­ºTCùpO®¬ãŠ6û—.¦`í:£$3µ\QG˜¬GIóOæœ)³XA/ÀÃ%!@ž&jÈþç½qNxSöüv}?Žþéo(q2(žå?§’—(-ˆkÊ‹‘²2‚ùÃ¥•Eš”*—ˆd„©k¬5ô\TÈ)´»c²±¢ª<Û…Ì(¢æ˜°Ž‘”ýl¿º„pº$ê@3o¯ž?’–"ˆV‚ЧúÀÌ/NbÆ!YZÕ©–ã ±Dö€¨ª ö•-+ý­Šª°ç–S«\Û¬ªš0£ë… C®¬›9 ATR¶ßS<¼bQž&g{¸1N9Ë+1Þúó&ìenæÉù´ÿÍ…ñ«G´ïnë`bl9—ò…`z“÷ý]Ë:üš¬¯ÇX=A˜‚¨*‹ê†8ÁEŒb+ÚQD‹ƒ9n ô™©tEËQÊ YVC»b¨Kò⢊¦.Ù‚(Ù˜÷Wׂ>_˜ÕÞùúzâ0&µ?f³RŠÌï?¤ÏŸ=u¾ü¡È ¼ö®s x¡$d$RãŠam©(É0Ì¥ÿ>vŠt‚iæž“¬CÄ@õ-R­ ·—Oc3KDvÝ,6J{O‡MMãUU,ÈŸhÞ‹~9/6Hó»ÊA|iÓc°EaEV¹ÃŠ AK©Äý*)@ߟ!Sï±[Õ0¥Ã£»×¾7à¹Ù¡:!®iK^@¬kR" Ò¢"Æ” ‚$I(Å("5+"€ÛFA,[>¡ û`†ÀåÚŒ i:8Ý(w —ùÁÁÆxòé·Öy|õ@å®ÝvSð}.á$™Ïç]{û·'בS¤»æk)’‰O˜Aõ¯zæ;V¸òf§N­M(*ù¸^Ñj^þ&°ˆœ4€mü«È‰$‰EP œ}Äõ ŠZ!>3Àª ް¯÷``=%€¿†ç—·²ÓZɬ˜Ÿ~ùœc?2—ûþrCÎÎ}>Ù'ƒ!…VQðséþþ@ô«Ÿƒ¾tžw:á.#ê0†UISõ£fÊ)¦£0‰I‹©4"‚uDCg؉ ãØÞ gD22*B Ê=‚ùQÈ䯽2ÅÇjË&ʺô ËÂrRÍi{Þ«³Ä §Toh¡ STëVª‚HÔ7Q÷O¥îÉ %¥b‰Åjëºb .Œë%F½äÌÜ¿GÈÁ+íïÄGæ|øâÑOÜŸ« …IwlI$a>hÑtg“&®ª®–èÕ•TT[cèQ]vâÓB\9`*ްU·>}&ôñsì*“c¬ ´÷„¾ŠòþY ¸‡°!4_Éjà>\—ê'z0(ÛëäóÄ‘'Bè‚tjô1GôO|ÍBÀ&lôNfTècËó~Ü·!+té_kASO‹ù¢ª¸<­ƒ€×]AM¼Mcꢮ«p$xºÂŠ´ŠQ[(©ŒÚãSLÃÉ‘‘1ÆÞðgq¥‹^a € s¹ƒ Û¹ÍÜN`ž:dCœ|@/¥NþüuÁwØj¤H±›•ò‡¿Q±žŽ·"Z:«ÜÖº†çÔ 2Î@ræÉÊ+!øÆ;ôÓZ·œø¿IqšBÒÀßÇšqãJS¯Ì§]”+v›àÖjýð†bÈuàÒT=!ƒ­ã“^¦³®Æ.”˜¹s(Nöktspe°ÙÍÚë³ Œ¡£^ÞÒOg˜-ä|½dŒÜîð‡ëõ;Ä?VkÙØz7ÇàøqÌÉä'PÍìNNþ¸¨¾ÃHkú1“|öV¶™ ‡.NAâ" Ôô¢ŠŒˆ2‰)ık,ÏMÊÞïܹª%f o‰®Öž« 6sp·£‡ÜÁ¨ZÀ†,cç’µ‰ž/­Ë"?GåuÉFR¡Ãö`vèTú]ž‹ v‚k¯‰A"e”º°­Ù„#½pDyÙÜÜ«´?oÏhÊ"‰CRª™*¤ª­(ù¾C´ó¬ [M¹=?†Ä€€ÁX*À>Ãó÷œ™Ô‘QGáv,9z3Ga׌äêo+Ð0ù¢†#áýñÏ¿×o¾oN¨ÀéÅ3ªÜLó÷ȘÒÌ71âYBÔoq±pzBE—i° ?âlƒ"ñ4IØ8ÊÌ& U'6ô_ÈÀdŠÅEã‚ÃúžxõùùðLf}_#U+T¥Æã!Q’F¢=¿_²Ù”S$ñM3mˆM{ Ï)œêdêšÐ|Ø «Xâyr*75ÊoÁ,Xóuyêéå75OP–Hu–ž`ØcïÑ.û³bcèŸBšP ¤Ð=ï‘ =îÔz¨w ¾y >yöaÙ‘”Ã`7-@ðô¸dÂIЇß#ië½T†NhõšR•(î+ärÒmÍшºÝ«#5ZÚŠ -HÉ&ýéµì˜)È‘U"…0·ÈÒmmŸVj›EY pQ`ùupG${›šp¡¤(¹h N¤ºŠ+ôÒCoI~íŒcD°*¾ú[boH&<:u7Q1>ùè¡Þ:±¡Á‚‚¼£îMð\&½ëÞtmG µà]ÀXÁ ñ¶˜-©j<ä@Ô(d«ÄYrq¯ûÚSÍT3—ÂãuAµ Û·D)‹‹žtç)³wjy×׈ÂA،˿\u`„w¾m€BÈ•¦>=ˆL"$Äûf4ÀÔ&®«û·Ò¨(@™]Î8½( .UH.Dó”â&" "Š2 ŠD€À‰ È’!ˆë³Ã¬â!—‚m(„ÁƒŽõ¾†7G#h¦iw®Ô»í "ÂxŽƒÞÎÆõë&CF:ÏhÛ‡¯‰Eȼ!19ßæyÈÍÓ—¢fOÝÂwù1$HE7ч‚™ULl܃ë½Ù˜‰˜X‰{.™!>¾ÂrÂI0a:&„£B(¬bŠ"ˆþ(TAбb vÝ´A>88~9¸Q&p…ø0²\LA~9QõÎÂp™p`¶¶3G‡g° æ—ïÁƒ‚F­†(Žaa¢nÛ˜àðxÄÄOënv?xfÿ'ÎËžÏä¨.T#ögïÕàµâï¬ËRÑny@™`«4¹‡rdfŠóâ›ÕfÅÈÂ8 c¬&—˜€Œ…G÷Wí±¯j¢Ìö ?ër>ý±ü#62Âü2¼$CnhÎúÂè;ŸbpÊxALªmÔê?ÉÞýe> ÃqÌU®%Ni3õYZÕPaÃA£´°cÍŸ]Ôº|<"ŸQíà­yA­­ ’ v‡í‘EÊƳ} XÚš´–û=kE¹m}tx®Í‹¾(W]´çU¿¥³š8Ãã_q\Ú²oÚ-‡SËÑ?.°=}¯¹2eZÔ>?<¿LÒ[{|F4IÁàÀÖiN¾Pí‡1dr T\Ä Y|~_†µº.<‘ÄdŠTy‰û‹¸QvN îzÎ5͹×ÂA,„q¢?€‡ø×^W)ûqX`@Šó¯… ÀŽ„°Y‘XÿÞzìÐý§Ú ¯…ªQO¢2CEe²ðÍûãabÆr•›N°¯Cl¡¡…•[2ç׳ñ Áöy°ë―Ìã™aI™.®F;S„¹Èqëx£âÌœØ}ÐäÇ}•÷ÏØØ]¨÷ê’¡?uJ@ª÷ÑÛˆq­ý„1Ö"°þ(À¬±„11†0$!‰!U )$ ,d„mö(*íy `Z¾æN d<¬EW÷BVH,–ÒA}¯ùùÞ!Ê_Ь3€ðïÚŒ&-yyqƒ¥½šMJÄGú¼þaþkCðÝ߸~:á´ÌËÕþ­oxj²K‹Žë#òjQ#S*©÷qÛSV(‰¤÷悺¡Û¦Ââ!ê„Õ,HÈ7=sϳK: è|Z”ñ‰h¶áƒ¾æÝ"m±o;ÜXj"U hÍùI¬’x؉"BDÄøå¨öŽ1C\éà 9®YJÕˆÀþO«!-Íûœžý¸óxuҧ립>3Ð4å󽮃ƒPÌUuK Œ #ˆÈ7‘½ÏÌ ntÄåØÑ—ÁOèã®Nß>!åxðÛÃÎJÖó‚ç6„Ρ€d/†¹Š3’’@m ûÀ¿ŸÈX4œjû²Ån›*ÂÂ@KˆL„CÔJ½†Té|ê¥/P? H}´]sój’FM7‰¡ãªrˆsÖő޻{æ9™Å¹šø³÷±´€ˆ/Eú³"¯#ËÌ~¹- ,ÉÅzˆ È ëõ&…hɬH˜ëý“YŸÚÊ€‰¬Öqœå yaöœúŸg³ M8DÑîà®Éçg°~½@=ÂKþ $(Y´æœòÿ½ž?åÏ*þÈt0ìgýéÚ°ØAÒÁÌ<â¼`VŸ±e—E›|EĬ«ª¨¿$NÔbT >´`[$¥tçõcüŒa‹"v P9 TFÂ(ÅD`ª‚—ñ÷>™Üý¸ÅUЂ$¡àÔ½èåjÞïõGÏüi©{P…` Ȥ‘`É I XAd‚"’E€¤ŠH"Š €¬ˆ¤ˆ,ˆŒˆm ¡ÊN[ýêÍÈc>¨PZ"H‚H"HªÄ‚FA‹ÄÓú÷¾¿ÁÑ(ŠÒœaØHØžDÿ’ùÍÅšàÉm*›”—™3›!’Ihí… E )°,Zyùþxêô½1ÃͽŸ¿{þ~¹×'’¬ì Ü?Ö/Zh¸Dk X¤L¢!Æ™ê*$À?‡eÉ‘Ÿ!+5v*0ZÞ\Ó(›Î7Üc yRgÞ‹Š*HĈ ‚Áÿöuq"ÄQNéA‘"•(E´…ƒ"Iô… H)€(DbFOÝ • PðŸ{†‘ç2d!‹V1#*àZ H(±Š~b´EAEPúe:þŽ‹ªRÎg7ôHŒˆ£…Å!` )! ÇV¢‰ƒøÝüKªµp–¨.è`S‚_z· a·qyD´ÖQMáŸ_ðöHEu‚}o™cäÈÔÖ)Ò(€È–[@±âå1 B#·°œhj2(EP>¨J‰œ™ƒÔ¡S³¸)( oÝàÿ¬T$ÞzNÜåÇE´FÔ€}ªÂS•˜ÃŠòÚú(¿µ­‚ ÐÅ)ŠýTX(Q@ß±Ï'¿Ì‰xBI1E¢§‚pK¤lfª5ûëñóléÚûG1Ä;Ïã*<Óƒ÷åõŸOïüZöÚ>¦aθ™¯ì›^=eEŠ)>e•ýutaÄ` 1ˆDQc$Œb(ÈŒˆÄDQ‚‚¢ÁDb²*‚‚1UDˆ‘‡_{_óÁ´‡êGž•'ImùÓȼ„ASð6PRPf†ìB±aöi±h°}‡oݰ™Ä­ŠBä?C7,™ Û[&Ê\ʼnY—7ÃdèÖtSàX=´²e§öÙòCÖÈGg-·ê%=ý¨E©ÕÔϪVrÀ©P£ÿ7ôÎs¬9´Ú©MŒb¢-­Ñ˜{@‰„’°X‚™pÆ" ¥cŽe±Œ‚ZŒ+DKjÙLõù¿ŸòG0ìH‰³'\íþxiïS‚ƒ ¢Ø²1T’ó•_5«&Ëÿ#Ž"xàMœ9…‘Õl‹'þÁ<õSðŒÄñDÿH†å’È¢Œd@b+ƒó„†¬Óà\4ú¡bÀþ Å9kzHñqýŸŠçB'C©ï”Føxg'âšbr}™“¤Š!fHàQ#gTÀ´êß“Ôè‰mŒšÀãjLù½0>%IĬD„ÀB«Š¢é2Ð+"XØ]°Æ,‚Âj)VM‰Ì­[Ð=ˆ¦ "²;lçgpàð²Ã…m¨HÉü¿^`l&`–"¤ ÁPZ2K'÷{ ó?m£[¢d@ÄÄ”¤c0$RIaçûál)ªVÁ3˜”kê–ÏŠ@¡ƒø ‚E1‘Ö2 "Â@Y!‚À‹E‚Â( ,XÑ ýË¢CæÐ€ýìš™‹&†—, rzQ»Œ™óî>¢”IŠOÈE ¡‰$à…@”$UFÛ$•³XÝ›µC9vkHoñ¦ã¦VŠX7Æ)‹´À)*“jÿǃO9ǃ–4A€ÑĦ þýôlÞu€,+!©D‡l‰‘HJФí H¡Yz¤Eë­Ð·¬D±›JM9»¥e@1’)*)¶ÈbJœ@Æ'˜ñRbJÌHV‰Y DÚI:`c»bÆwÕ+TámN¹Ãj-¥Ÿd’N‹ ÖHØ$8Ó–‡i’tKfŽÀI:œI‘‚ ÑÒsu/I¯9ÌÅéÇ“pµ,L‡×]Ü9fÔsk3”Ç#^YªæSwæ²Ù•¦îmQw\‘»–ÍÊèÙ»FÚ¶d¾õ¬ÁLJkK鄯9×ᣴÌA1.ÂŽv&0OéÊ[õû;™´ä vgc¹yUU÷£ùZ¼ fíÑí &r-¬Ó$B1X,®aX IŸDúˆ€K,dˆ—ãÀ—1©ÚáÁ“B]’2#p‰iÏ|8Œ%H”– (‹ø Ua XmB¶,Œ¤x=`1„8"U©@yl }¢…'²e=õ‚l3„V,^§a ™¤õBiÛHN$+:eER¿—Óý½9§Ã‘XÁDOݱ" ÁA"‹>òH`v|“R(‡Þ<Âlu:á< ‚cóU“¬0jë()>™4ä  ÏÌ¥<§ u€3òÞ˜4åªí/|˜Í'EIFQ!€Ð.Ï›I!ÓtÄx³©Ä̈ÐEóxq&Z²ÒL´Ø"•£*t™=¡9ßl‰Ã£LtL¶23x Ý´j±ºb-TY"‹œ¦P\¹“Ô}Äê!pd¯ešª==yp:3 Ó! «#dI‘]‡£ê’ÁÀPUm7ÓÒ®+žd6#†IÝfª-Ë ú1[ÚˆÍl2 `¸0ƒa®¡ôzöÿŽK!@~»¹Ä xÃ#‹*ÆÓ&Sì Í4OÆ¡÷l@RL…”)´‰ß@¨7¥K¸‰ Sñ~Æ…2(UŽt˜»Ê†Vl¼â­)îm÷÷|<èäªl#I$ 5ÌG² e¼h<¡EDT„?¤ ú †ƒEò74ò,„ž€vŠ "Œ‡“”«—Ò½f´å{*Š Ê ô{¬Û¾”q§g 6––~þmOj.¶®'_å|̱¡Vjecžq'åmÇjÜU,&B…JH¢ÄR" DªT?#È#kdî[Âñ¨ã`‘½+Uœbî¼»:Dñ9r¤ý3ùø3¤@½á÷ ¡`¤…«k:[5å§oc1¶]ï÷ÍÎËzÿ.K |æÛ x³™xÄ~k‚(gŽ98^ö­LÌ1¤ RU0²½%Âq™:»‚ÒÐTqÅÊZ,±­Ò™Ë¨ ~\{ú ¢Ã©§>匉´¸"Eö”H¤©%b *°ˆÈ«"Æ@ä®ù WM'^tu惙:¬“—<¸ûK7¢Â²¢ÁOTúìø#LUK@¶¹¢Œ¼™÷Þ¸» ŽÁ©ºE“M¿aáÅ®#`®Ø·3¾†=<Ð¥ý©UŸT?l”êܽ!÷¦xóû¿¿øæ1÷Ï™9€jX¥ î¦M@$’O¦Ò•rBðøÕŸä> vp33(¹X˜5Ç­¦²ì£‹€ÑTË3ë.æ-¶œN]Ìí!–þT™åöÚ¤ŒŒPz…Žý6¢Èóm±‘‚ 1xïà›¨ 3òÏ@pálõžt÷ÚüÖ~mÝD¸BüôLk½C†¢="7KQpõKÓ¹€=¶œE¢I1IPôSíº!ßÁìð;@â-Hl¬ %º¡ ÖÆ@îS=”\ºåœ¡ ìíÜR«7›”Ä ÷ÆÐˆ°Cå²ymçäŶ¶91ß¼1|D“|Ôƒ?Ë·t4ˆ«Xil-¡]? :ÜÖ誎òe樎ŸNHHBO‹ÑÜø ÁUPTA„ÆïÀe^ù2ýð¾;šŠ9êE·µ¤AôÒ)·óOÃhÆuñk)æ‹A_¼˜rÏ>™á 5Y1rÉÏë%Ñ”9«Pu*j«Ì  E€BðX±T8ÂV*$1'H ¢õIRM`Åù¬Ù:çäCÑíw¾Ž- RŒQ˜kVuÕ/7–]ªkÔvÏ´‡ìÒOéˆ>qÏÂbYQ& NªÃÖ>=«øŽê7pȈå>É$ĤŒX,P‹ ASô~ÝI¨(+ý­#±ÍTîZ½ùßÚš!ì^ÕÚTÆ™0ŸÃpµ4þžFóà.˜Q›s.ÕìQTÓ'"áèž›ì™()èn¬OœÅ‰¡a`JR¥…Q©é1 ;D“!ê7 ãÉç¼$žÖŠ”‡-ˆºòEÕDËwmƒìýVÉJ˥­Ù+dïf¾ÝÞ8ã $'w1š6CV)àq/‡Ý°x+8»ÕY° ±PÓ¾2CžýÕ™àî 'V_ät¯éÊ.RÄ?/âþçG+ hòÃ7¬±ëC¨˜×ù Jô[Fгs›µÇ2c°`Ô‘D¨ŠŸ0A€¢2"’(^©QQ‘T$E@¸ Tx]mþ˜pò¢ rÃz¦½;+¢`JÒ@©UKmi-¶´ -¨Yð;v á@ÆlñJj«šh/„RúA„‰zó÷F¡7C×ÈÅâü?œcÊ(èmm˜Ñ ²uò|C”ñ$¿±èq¸¬7ówëò%Š´mPù¾@ùK©x¡<ª‘PÐÆé`ÆÊ"R¼¨Ë>>«´5ÚC¤ö»N<çŽÉzfóà(ã…‡f2¡{´PZ”§•¶EÒ©P\ynúÙ×'œSë^9 Àj^evB”OQSBÖôh½›™Ê÷x÷ÊΩµ”֘ˈ`b(Ùh6¨Ú°[e*EZÉQT2á[n)Óv„™1\W\>ìâ¡+!Š"%R„"òãÈp;Iʃ'a¡»¹Ž½ˆYî^h9p'À•äçÕc $Mæ! v¡Æ!D"¬ª(ŠH2!qÐéç¿)ËSÇ?a€ˆÄCŒjó!$#!$Žœ,âº&æ¢Y5ÒýÃCY*£.HQ‘vðª÷ ŒýJL;F´¿:½z¬oUjȪ‚Ȉ¡#"Ë{ 5²ÈIìà* ŒþŒŽÀî(!ÌUû¿x»Å’T'W³x±Bâ!HHµûî¿V4F,!¾€ØHJ¢Séá>lDßc aö›äsNºò™hn¿/±ÔÅuPcÂÝ:=HÏÐN=ZlE*B¯ê㣩“„¥J’`9u&05 ’Ĩ)Ú@*B²hËB9CY,RÒØ)©*LTˆE ÖneÁ2` 6æ;e`eÆ–Íåæèh*ÂîP¢ËKB,Xâ ZÝ÷1hw-Yòz6/‚@‘3¸|jÔüK:°˜9òÌO¨]•Ýå͵ÉQy$A¡€„FÅ4[— Át©ãsCÕ¶K©†á„OY DM„ü•U=ÿw Y_£ó¿ç‚¡B2’E€¡"(A F#äh€H2 "ÂAˆ2 ‚ÊË'ê ÉD„E"$OEÿCHF}ü{ûö>½V"V(Ú.3*ñ3¥5!¬s.>KJ£‚àK\ºRŠ$ŠÝbIDaF£+‘¦ù×½y’¡ ó)yäåá ¥ ®q’rˆk A€,ìEb,XE┬$à"ƒvll0à´EÁù~sËføC‰pÏ6· 0Ùci‡bi•=ëɼ{ºÿÑÓ¶@ŠI$PE‚É" ¤dˆ€ T+"ÀXFAIDºš…é+ˆÁ0—Dú!¦Å¥ë½Ã±%î@z>³m5O i±`ã`!ÂÕ( à³p•n„”Pd‚PWÕSH@¤ñZ¶xr@ aÁ²º¯ÕãÍâxþ~¼`}¤R@D®ŸƒóÖò§èþÁ~Gƒm®j7M]—Ñ„O‹9‹®z Ù,0P¤l¤ed+Xd*‰œwÉPCôÍèø¾iÑáËÖS–’ RŠÆ$ˆ–˜uøìÈ™é­`ÃVÐÆ9kÈ´ŒRM´ˆ¨ ¤:Ï¢ùÑ\©pÅQ*ªR©•‚pvó­DrÈ{“ Î3¬ni~6¢ø,<‹:¢O5ÃÄÓòÃÀ)ç”8óÃÚdÑ÷÷é<ú(T^¿c¿ ’•F2zºò5$D¥”,5‰¢=ÑR ŸãŸ-Å lRê (]"5؇nIuû†_€{v܃]{o’a”æôBÂj ³\Š,b “@…(шÅ"géGª[šNêpÀÍ%E“ò”@…zEÌ$>å>RÉ"žH@Öb@x–zŸJŸô8È( Çñ™¼z°¯ÙJ‚ ¸ŸiŒÆ „ú0˜ÈzÊ5&¤SR¸×ϬÀü2+ݬHLÖLI/ÂÉã‡ÑlHÚ[kÊWrÕ Œ€"TEà St0P¨+h"â$ˆÔPÐ3Ú-âæ,H,QPŠ"È,`¢+„PÔ¨G)Y?Â|ž%DSª´¬F ªcº[5¨ó— (ˆ1QQY c8™Ý»JšœáQMkâQ–-J+¡ÇóŸNèp·§]KÙjg(+ÓÌ• ¶q‚´ßßõÎ 5+ã HtÊ&³ÄÄ?„ÙÊCGšSY‚N·Üš¦2ŒËÖÍγ4ÐÁÝÈbºÕSôÂCü§5$鳫EVàb3×[À˜ü›Û:T†wݹ— O¦Ç0¶IZå§| @d-$"("ÒJŠH” D%(D€€Vžéä¼Êb†’M ümŒ>FAeæÛe¦ rÍ›nÚFc3)i†J¥n[[ÒkÒ2éB0aRŠ‘¤~‹úýר;ýëýæføÁï|A Í£û¯¾H}¯(Ž÷ÃDˆÒkGIwаë3Ur…Gl¦ÜL°œÏ S‰üøéÃþgáM¡ ñ-Æ!Å:”H„„, ï'ô:PôPY:rrÿgä›(¨F…Q˜0!Ôqaü5„DAŠ/A'ÙCìùMìëíàÉÈ!ò;}àâНÄK ÀõeR"°iàøS&¥f]©»´ÕYuAÕ¦¾êåU‡gF‡ [‘ß!×›@Í”íë%¼ìã³M±IrEPC!â…Š`ÐÀ ®öÉ߉Š+ÐE¨ H¤‹H<K(ÿ {™èJϘ²µOd.:ÙX`š!$ì…ˆ T H€ÁB"Y n¨†(…I$FD“pOQ!‰"Í‘ Q$€²E'i‰R,a ”« VAdÄ–4H¡*M¶°*‰"¢!, ¶Lj)Qd*1˜©ˆAd'}P8êA`[` ^ì%t†@—8Ýâå}!³à©ehß áMd£Ç×Ð!ÛÙ³Ùo}óÔƒùA^ÉGèùšÆns Ýü<< !§Љ"–Ôî„í[° 3œ]™4a,qyßòQCëøyýöì>H¦‘k@rÇ„”LÉ…ô ìG51ŒßÌþwç>`C-1¨íäv´*›÷×Bžé±½kÀNjÈ´NÜú¨%Šúùô‡^öX]ׇ £€…yèéU¹x-vÚ¾¬tˆH¯’iD19Gàɶì/½Üâ÷½j$0nÓ‹«º€ó+SZ¬j®owáz÷Éö½IøÑR‚?%Ò´{ìv»tÚ³jƒ !¤+z’#dÎáü ªŒHŠ+çð0œ¡@Q ÙT&ˆ_Ópà—Ž¡41º?t3x`CqN­ÊçÀ¡l¸êœƒ‚˜&`+¸Ø±ÞÏêC°<€DÓüÀ jB1@9“€óè–›¶(œä|©*‹Ñ‘8·*£\¾Ê‚õd Y{P÷L^n0µ µ‰E5U`í㈨ÌB´J‚Õ¥ÞYMä2©€Œ{Î…YêsŽ—a“"œ­Q&I¬ #BÉ7et¥IÌæŽânÔLIÀ%ä¦ýEt_`Ü@,ÃëÊ<C(ÆYB.µœ Q@gÁÒ(}G’ '2¡èƒÂ£CLa Px%îþ$MÊW8“rR–¬TÖNz`Þµ{çRm Õ¯jÓ±Áã•Ñòý!§‡I>IT{µ£¢v2½úÉ´/neâHÈÂI%2«ª|ëû>ѯ:7üsžXC3³²p÷ŒÏÙ«Abß纺R¶«•©F+«‚˜wŽ–½‹²º`¡Uƒ)BVÖköa;Ÿ}žlØÅÉØ…9ò_3»Ò~œ‚pï÷…ÃÎUñ*äªÙýÌçäÐQQ¸MÑd.1UŠÝ†aP) ˆ*¥d H«m‰mE²²@×Y1O~÷§yþÿÀ<³_èï­ÏˆúäO 0ÉTÑ(éîIA@¨I.ÛfÇ#A]¢´ÅV%Õ¦  9 ä( oñƳ¬4Ø(‡Ú%ây_¥e›Õ”ùbZØppu1AÅ]°H¡TE±M¤H0ãÁ÷kñ«IÌ9°”´$WŠ¢AK×âÞ¹<Ǭʘ„ƒÁ„„!aå*Æ‚¨eX"Ô-*¢ÿÜãRhÀA'Ïeìš&HH6 ?YäõŠ ú ­º¬åªXP)Fcˆ"ä£e‚XâÀ¸¢“€®¾1©Ä­üÎ#E ¤¥€ˆÓ{JlÙ"0…ÚÔ;_ã>´ÜiY¿½ cQa¨']¢Ÿ,©–qÏï~²²|¥b‚€Ÿiæý8’,Š B0d$!H wÁç«ïMÒáý¾ŸÀ™B• lÏÐë—ø¡O>K¡Årã‹dpé€a¸HPÆ¡4 dÝ€®Jðo¢aXÀ§ˆv„ƒ\ðñgÌ%Ыe&@ï÷ÕXWJ¹ ¡ÕA_DŽ̌‚%=„Ë0)þôþ7]f3ÛÝçÛ~ù55‚ÃuPZ*ˆ‹c$DýÏœ²i¬#@V)ü¸A"$4-("H óM£ ü¶ÒàlЍƒQ1VbÁi1›hÔ5iVˆžY%æQ‹¥sM—h EAANç ¦š?Í+,'uD$YH(‘i-O}¨[Äd8© HE"=MÐ6éŽi)Ð'Fc#špŸîÿ“óÙ…{‘` ›õSOÓÿaø’Ô8ŸFAdD-)R!Ònãï® çñ,,YÁ6×9D{–Ë;N"jA€—z¡]ÎÌ"`ô9 ÆF癢n\Á³„†[…ÝKÕ»° ®iaQjç\{ë£çp9‡Bœ×¸,ß°ÎÜ;q’” YF±Œà€ŒidK@¡ƒU·Ï$"E a,•„2fî…˜÷˜YŒÈ«ÐËB˜AQú·‰ÇÛgKk9slÔl~è_/iÚ¯l¢¼Á3à€ñFŒnL J™¬gO3‡îöŽõ™Ê~1^"˜‡yr+ô•þR¤ã*tþÙ¹ôY‡îyzåyCS¡Ä8”ËR³¼’â"^·0³¤:Ç:çÆ¦RSô~<Ó™aâȽiÏÁæt’+Œ~Æ©Ñdèñn¹,,vņLïv0ùlpóó\›ÓfœEͰœÄÌ hÎ! $þŒX'Lþ¹m"c?ònéEÄK—>Ã3Ý:lxSDÊW(sÏÎR¦’£ónÒ@“YõÁ˜îµ Ë©®ã\ܹǩí íQ’å>_,Rw¹çæó:±Îó̪¦ˆÓßJmõìÉÛà ¢ß-æŽ$¢°êÃ0±Œ¢X˜–O¬¦ZQ´DrØå£iR ¢UDÑuÀü¶y88©LÂÐèr¿V^@%"ÔŒJ‘N0£¥·¬”G-Ï~ù¦|¾s†ó`–ÀÅâXm)MÈgiô0éä™ÒEÕ¯×Vxˆ„Y¬UaD‚Š,PÕb!!X±¤ªWi¬Ö¤Ö,‹$‹@¨²¢Á@ªÖ&0© a „¬,Ä+"€±`±VAI`ã  °PR( @P­DQa`e«$"¬+UEQ`!…B,‘dŠO‚ HMd…`*€,$R *„‘Q,QA‰ŒZ…B(E+™Bb(²AÓQE„aøHt˜X #"2E sª )!Œ À­@HŠIP†$bE†[ (ÅŠbB²*"1P ÉY ¢Èc Ƀ ’T¨¤FP0a* °Æ­Ï0Ô„rÈTR 4.öˆÕ Á©H„D °…J€TTD @ µå4w""õTâ!âCQAˆµ´ªcÓ2•”Ÿ¬‡¾‰MÂô€tÁ…‹p—¦dAbÈ™`Fu¡9 DÜ“2ô›”ÁØ„®Œ˜,d5 ”$ÖOÖ]áCƒ¦‰ ŽˆŒ2P,˜À,jK(üB›ESR:†0šÉ“ ˆI ÈVl@ˆ’cYÄáÊð¡šX-&0•†;>S æ9Ó&9Z(§OY»¢×ã8ÉÒT^{déíœB|2VE’Ò÷s)QJÌH™Õ¹k…(qRg,¯¤ÕcÑÎd®¡‰Žr‚&§©1‘CPé“™dÕjh“\dÔPƲë3w%ë™§ T8ÃLO‰¬Îq•%LHÍbÉøFðÙ ÉúÏ^ztè¥E ФH¡°Aˆ¤öÌL‚‚‹,IË@ÊP°IlÁJ`bLP"x£b)pqS%ñ ªÌ1õŒ6q€Öb~ΧŒÄR–Õ@Äœå›`¡13n3B2~˜T˜ÂÞŠàŠˆˆ€ ãa ðP°cŠ9×WcÊQGœHdÖ|€D“QšJ+`°ŠAB ¥©A¨[F ¥‘J”´ ÛV(£"1‘E¥‘E`ñÁΆ/™—ijÀ™˜‰2¯/’s¤ fÙ8aˆˆáF(âXÒ]²H…ª,)EŠ.¤ ŠRÆ(`§cC (’ÇÔú '™:vùÓÓTc¬©Û+h"2Ú#YÒY2Æ€Pî•ÕC¬í0 MLW®KÒÕ¼¹°¡:À'2TæQü%ªQYTV"¥ Û2•$1N‹Õ¥·Z¿%  ûÞ I1ÉÇû*™†|vY„6ré䮲’%^8QÈaûØÐ¿Ï+’9 á!2CÅ‚QvÎ,Q/0HjQ¡ ø+ ¼à©3ÐùJ‰±(4ÙÀPè(’1ó’R(ÛHtY%m¢ÛP»áú´AuX1Ecç”Aõ$‡ü jÈ1’²+"0ƒ0P%"D˜:Éãݾ3ÛìJÆaìì°!ÞWQ­ b2@Š m¢Í;¥dò“RLkYh·ù±¡ ÀU)Ó hsQKU-®nH`ÞFDæêδTÙóÔá$Æ xÐc0’‰‰%’zthØ vNÿoÜÀ¾[àz{߈j)ýoI‡üx²Š5žW†…¾ÈƒŒ<íÌ‘1&ÞåM®–K™¤ (Á¼+UB xØZ¢0TÔ’D$ot€<…Ä0DTÎI @·R¬Šb&ó„zZõõß ë´ &´4šNÿŸ?´ä7…ÑJ^©Y† Zak3BÈJ`d€8²À"dXQË`í ’°É 2Âm‚”‚©¥/7$ }zõax]—ÐÊ…a}‡SÏ8 Ðâ_RB@vveÀ‰Ïba"$aQ`Å‚V"!~™%ŒE+QAd€ƒE!ì'’K3Ëáå¿¿Øq1‹+²Ä7º…ù9È…&¯F7ñe¥ŸmÊT[fG(å2—GSu ÍÌÉ· ¥.fL©1† ìæº}¸þ7Þ´æ}Ó O·ü3>5‡ÚV ö)f«)J¿Çqð•pá7zñ;×"½©‰LVEY†‘xZQcïV²¨Ò'›7³@à@Q…VÛµ~»ÞÃy¯‹øÅ~óŒ¿Íšw»‘$SìE ÙŒPHõ‡3Òä‹l‘ë9(qSBn|ê=ø_;‚ì%¿ÝUœVBd1~Û‹‚Bõáe‰™‰PLcX 8[­ÒÔóK͹iGǹgBUUO—&^s14ÚDó4߆Jg´úd$:IZa…Ò™÷1݇»0ÈŒì¨_Ç“¸ÐøºNÆßdÚÈHH"D€¢È)PU@P‚ª’Ȱ€€¨,ªB²@àÚš·¶Iõˆ\Q-ô&â2D$,„B¼Ššü\ð owºMMÔ‚Þ.Nª´¿}:±N‚õèåG’w³Ð?—ìü(GíÎ @ኸ®m…f!1 ’Lý©EgØe$Q^E¯sÛèè9ðhÅNÐ>ðQ|p4‡êŽÏœa똯f¼ÖÁ7¸Mf==ÿ²XB,’)x•ÙV¢€í /FÄU¢Þ eEóžÉNŽÃÒðÓÚog¼¥Ì ¬8<ïsiB|={"'k(£è]`¡ü`¾"ĽU™—ÝŒe¿,i›Y'º@›SQ‡®×½ø9–Ò'³ÇÎèÄžäP¦œ†OÑøtùþ§K†wʇ&ºú›[ŠéíCPT:pÚ’çÒ)ëUä§Û… Å à9/Êô·aP¥_¬ ´ô(g¨2(‡O?FF¶£™< £ûð>ˆp¡pE¤~R ŠôZV²ì@±VøÍCcøQza™ü3‹Aì˜g7ËãH;º+ö’'ög›¦¦‰TX(&5ÏÚÌþébÄv•%¼¬È¯å¬S-¢´Y!R@÷$$Íi˜oóæÖa× ­Øo ¦¾»4¬åÎY‚Y|™>ÓÐ¥ýþiˆüåõí‡ÛÔ9Zö<ÍQîÕÔ­´>©?w»E…ôµMÿŠž™3¢†Ÿ—RÄY’ H´¨§»ç6NU ¥|åþD»eC¬ªGõf!ë ™kŽaþ2̵z¦A™l0ôeËE­Wö‘'âοœ1 –ϱ/Ë›q ‰p Q$$TY$DUdU*(… B@p+¢Sò’op½$à±t²OÀ:â°=>®H²Ž–*$è<»¹‚È}7š`,‡”¦Cï I¢È΄1’‚C EQŸÎØH`ÉÚcò7\Ì¥*«øzêtö’¾wbȉÕÉ×÷”Ä£PäžàyTÓS/-M{ q "?‹Ïï4>{Á±*~\®8-ë1‹Z`Óèêì6©°Ï ìÒ§é@Àx¡K(eP©È94uðÄûtƒ§Ê`Ø–'ÙÌT1KPÏðþ¨îÓ'¯ Á«ç )!€-" ¡×RæˆArNÝ…ôi§[;þF(¨ˆÈ"ÿ €ÈFHŒ2E ±d€‰£H\ˆ+"Hˆ¤X †àqŽwŸ¾ã»mCì<Íè{B@̃ìøÉð’(@ŒˆÊò|š4)ùP¶Ô:㨊Oð:?¬Tàûì,6_oŸaé)Œ|ô?€ZãðŸ¡JP.þÍ:‹pä9bök^Šéä~1@_ÜGÇI)#$ŠTÞRÔ=Cшß2  l0áH{ëT”2 ü(†Ôé䱿µ£Ã4܃1Nˆ sÌ5êHT'!Ø´s†Ñý9S M!AØÈõo`_·”@:‹! ) ªWdSC³ &°›Pñ°býðAù¹d––Ó~êiq!¨tD ú³hë›ÛUAÑ‚i¿@œÇnŒdŸ±ü’k½>ùÓ ^ht`Ú ªJ©*_::!žlÙ;îbADb²"¤šÏŽ4´"BŠM€àé†ó&@³µA@ÌŸŒ(’BMÝŽ‡èIÉøÇi­¨²xù,ƒ} h"ídhÕ-³¾Ù–ŠœK? Çæl’?¬ ¿%Ý£´ý&¦‹!Ó*Íý•×ëϬ½ÕŸá*]S¨?ÞûÅýKãÎ r}v#X U×Ì|;:Åÿˆ` R¤޹‡¼?©ý¤•Wh„„"*€ªLOæïšA…¨¢Ãq:Âð¥H(ÚÛõÈBýZ=ÄLßy˜Œÿ4$çV …ª ‚x*ƒn”Ø‚AYQ’H Ó*% tXŒA…ÿd2"ÀÁ€ëyÛ$KÌè³Õ9-,Ûe,B2Ê‹'m dÂñÁ€°A‘ä †}èX=zQ ÔÉ€H«àĨ# °‚iô³å©w­¢HoIéÛàŒsšÕ-1ä8 ÂÂ&0’„:B¦øL–­÷<[žm\<4Rµ­ƒ-ôqí«ánW6q°< ¡"¶œË5ÀitAG4BNàé˜!èØF3ÊJF@AIìB¶¹Ì<€b‹"ÈŒQ˜Œ ,„qätƒ\ĨÉ?rÈâ’"u¤¡MËáãJFg D Z¥<™,Æ4eTÜ#¢žáÒi3 )4¯Å®JŠ^$‚‰óU!¹EG÷ E^-]ƒ°rl]BJN B ˆ’)»³Š·äª!åcBûKY#eJ-^/k¿>¨ ­’\½×ËäÃ%ì|Š ¹ƒ‹9¾qF ذÎË1U›€Ê.pÄ—Cs¦ ›ÁÉ×™1™U°då Ú†m÷ÚžL^D:06'b%˼ZÁ£ÛŒCŽ…¢GŸ^ðíÏXsÑ„èÒÁ0 2ÀûXL’H”ËaqµèS ¥a€BR,19bSïgé*NR±xa9?´\J 2TÉ+c ¨¢2Û ´0ÂÒÅb""ÅXÁZ‰×| јtB„-V øš:5LBˆ€3& ùAb®—(íJlsT jCôå¶šälvúɺÀ¨p‘(Ø#l¢BQeÂÆAá^¾=ýanÉÄ DŒ.\A\eª6e¨~Ñï£ö‡];€;=ðwø”×½óØïE Ì7°½>œy—$V«y±û€–dž¸ÁØL¼Âà2(M”nhHVbₘ„N2v[ƒpMNªp6 MG±8Šštªpô ¤SRHN›— jð‘é(Œ–Ê Â "Ì´"² ‹é@ °„A‘` HCî9a–$[m¢¯VR(!?" À’Áñ8MJÄ ÈI/Ô¸p†`Ä‚* È¢ÄIdƒ!# ú{ÿV±ˆ¸J‚±ì1”°$!†èï#LaL(‰i(LÈQ!„”Ä€¢“ÀÊc&F¥–AETCü ‚;¸~öa’ Q ÃXÜ€Ù „I3¶TÝɲ¶Ñq§üÛ2”¶!ˆE€µèýÿÚ’¨¢¥j@?´±CÝFmYPKü\ˆÙK@¥+,IA$‘ÀpA[À ìÁd'&ЦAçÅØ¯Á´æ± ­j}B?yêÃö P”É †Ås:h.ù…ÔÞÈœºD‘!ñNœQòPß”æƒÖÑòHP&|ï…BLÕ@ôCZ ¥ _$tC‚á~Æ×H@ ”ci×BY’Hý.V•=µe0Î ‹~Ç6‰V`¶5S9b°ˆ ŒDQ%`Ú ZÂ¥q„™1 °5$*AH*¨Å“XQYZ µÆ´ “+m¢0øàÀÀB”¨&ÒJ$+$„8„‹$m„¥%kP¨%é ájà£(Â)û5>’ˆ,“@@–Òæa˜Õ fb$¢R±AE‘bÁ,²cÑîÃ@IPž&  ª,œÐÀ‚ÂHbÁ ˆ@¬0B–HI$¥¤Pkp.I&šZ[s—L.Æâci¤ váÍ%$À°IIü0=úê»,.Ãð¾ÌA©4å>| èyãD0Ê‘…*§|Çkˆ@ܨTFˆ R¡鯙ÊÇ•£ é€E“‡ËùpõÎ1×pd¦7Žá¢ØÆÈ7‘ŠMP*¸è(„$²´%á¡Ñ¶…ÈRòæ¦<µæç6jT.kMÇœæ-oÿ€aÃé“ò"d*(” ‚ j/å´çÃvݰâÈmí•ðžÎÓ5®úèÉ®¡EˆBHÔ±pÂ¥º¥Œë¸J ÇU^q`¨Ãf æQ˜¯y¾N«Wë¢{j‰yŒ>æ›$m¡A?ÔP[ M ­ƒz@zD(¼(S€AUú»dèÁÍ+: ¹ÇMªÔl¢m±D´Y—ò\®þmî÷Êù™8~­‰–~õ›õg2£Ä«ýÔE(™§ð«[5Ô$Jx…8¢°Êr;¹k¯bÕrƒ]o¶.3K¶üá¹\×[éB• }ºôÞ”ãVÞ´ŠpŠ·ÌÔú3˜k"ô{^>rÓubëí³ûu˜~©Eòö!œ~f™X¿ÖS|ÏéÏñJ‚ÿ6ú™…U:ï1úsòl/ž;®]ïûp9w2#Á¢ž&éTþíÞc?b,ïÙû˜.6ÝHrèYÁYæ³ ©ãƒ ]éu­H‘D!4dloOÁÊöf#4ŒùÒ’)ÙÑêƒ}b‚æ„ PèT+öâZjöá{À^G{©ÂÊ6®åÔz‡/†q’k Ñ™  j¯ <`I[µR)w{¢gÚ9d Øe‚/\‡¿¥sÄ£à  SBˆÇO»‡`l€ )|IêZÏZJ‹E—¦}ÊS—¦ê‚äVeU0EwˆUÙíÑ2È4‚jÞÜ2gßÚBÆu {ÀPfRX ¥hÊîq…h4¾\XH´4™]«‡ê™ iÚô"×Û¾<ô¼óìöÚ£ßLX.2Ô‹¼Ê(‘²²h²ÛÉ R™Î m:=ë»ßS©\Q*£ÑB,`.RÎ4êÌ+û{c!Kõ|¾Ð¯ôÇMÜ «•WAÍqÖ‰$^Ì¢ää9cë£8;Ø]oSsHû0TQ† Í FCaï-Ü7³’(æNÑ=:Í e\À¥ì\€)Œ,IDI‰ò(ÏaÆIŒ ÷p´kåŸmz¹”=Aqÿ^@Z¤ŠJ1fvâ×ÂO0õÔMÀ‚®”FºÒ¥éUvPðùÆ×¶oaœ\ÎsI¤ojÁ”Ù“,*4F°«f%fv¥iZDBÕÔ@ËYœ¶¿.O¯y»OFõ˜þjD·÷ð,EvÞkêŽX—»èÚ)çÅ‚ “ººçc—-q§,>¼n'ÑÔ?tI7”Dd !æóü#"?³r•ÉIüßž€®ƒY²š…Œ vhK‚$„Q´²p G\ATãUdCïIˆ2`ÁÆCKS¬ fä•¥ ` B*ÀzÀÜ4/©á[HüUH"s•±HÅ/ÍÊD?Ã!È”‚©iUs3'ö¿…αþæ º¨‡ï§NòÞC'ëüg$ãÊXÀ±¹faQn7#¹{³5ë†Þ"¼k§p®Ï„U^Ä>ÅxÔ69ÂYi1I>íTÀ@œº…´×òØÉÙh6œ;¦¶äýý™AlÒ|ý“ðN~|óËþpRXçíÌg:Œ ‚ñ}n ßyNÅR&ç 533›7äðd<à4Wûü…’ç}Ù5€€±€Á‚(gŒ?”„<ßê}‰§f&èháÂØyJbá 8ãßZ &Ñ݇Jèž¶ô¿grÔ@‰$@˪‹¬g‡-ÊP—cšÇGëaÛ•Yúhþ‡’{<쩟Sž!t¬µ”)d*•U-*hRVµü0è“3t)o@Y " @‰œùM™ °­¢hL8âŽCFt(§ZÊ££¡nuÏ@ê¨ãõXA˜jËÐj ³ò8ÓPIlXY‘AºVÊ009¡¡ApÒH®œ‰Dò‹xõU*HíÖõËq¨’be_È‹HùAHÃ,Þ¼l¼¤j¬÷ØNÁYVâ)‰xj©€Yi=K6×nÄë¾rúßsxCõï}ûëáû¤U pž’S ü¨‘"$AX¤úÃçÕ¤9Ó“]AK"C-$/¸e?ƒ‡ò¹q?s{0ßõaÓ³ñiõ×,˜Æ‹‚ÒÐÁéêôÿr«1ª¥E620ÜBZQd@ÐþåZ&ºáƒ.a‡ös6à·*ËôëùL‚?DêAd <†ˆL¡‡Ìí-¢Ñ1´êÊuj†½a\³Œ¡\ÌQ«Öæ#¨U·»üó¢gTêüÊ#óë½n4æÌïÄCR£ 9‰¨jŒ×À|ö^'q‘€O–Ôž_» Ñ£l1_ï Ùˆ1Y(Á>”þé5c0V 0d?"dR("‘1TX«R а±Ûåa*¾‚Z2×5ò:ÍÁ¡3W(SÕ¿¡®8—Y/TÚ×µ{E(P"$Eúÿøs}‡Ü Ÿ}È®Ò%·L¨NÝëe‰ÐóWó‡‡e²F.¬,„ Á«‰VaXm‰m ÈFâ’d`B˜¦ ‘?¥ì?ã³¾"¬X‚£Eˆ8|0^´’‰N74¨áÍaµQó ÉZ!ÛhZ‹A‡Tå4÷̘&£òç}̘TîS#ª‡P6p3É;€t“9ƶ±£Ghf\²Ü-;¼ìèÇ¡lˆ©t뙼‚TãÁ—urñ:i§BU•É€ÿH,a£Ðê«jì"¸%ЧD Íš”P“·m¦xï8H²J†Ѥ©W–cè'½o6üÎi\îYY™oØsG É+v$¹ydÐàÀ˜Ì°AV#Á³&³ ž%9B÷ÞêÎÖ !`ó3tÜŽùÜ%$8mtyÚ )"È 0áqœ eIJ/F玘ra—ºb+»%7T› Y“þÏo-93¼§4MbÚUã\ÑËî±*âq+rQÚZôJŒVKh† 0Bªz‘l¤•’‰D”B²¬kJÕ¶¢Ád z›Ãj(ŠŠ)X‚ªÈ‚=Ó¢ÙQ ÀQbÆ ¤ü¥“Á€²@PUÿaÓ;)ükYó4¿Ýçw¾­öØ:Ù ˆBÔ„'Ú¢÷þs Q‡ziPH†û¤ý"p8°ETXŠ# ûÿ|Ã’Fyþº†’¤(ïä¼™>ûýÔNÈÃæ¨;ÅÚtÅ:ˆ‘m#FÑ"œ`3À…Q(°dìì™§ˆ,c‹0'Áe”œÑL,0œ5a#zPâÃf Q©ìª-î¸(%Ri³%QÂ@QØó7gtÇ̱^Y+w˜ m¥¡<*î½–ùFÏ€ÉdM3'èÈþAt´FΠuëÂ@¨ô!^∯¤MˆLûLÑf:žV¥uþóbÏÕ 1‹AE"ÄAH °R(‰@X ˆ.¤+E‚*""²µ%ã$ÀÈŠEþô,TaØ_ç(ª0œýjfà±)Ñôß͸Uhß´ÄÚ…˜ ©_YHHQôظ٠¹ŠìÔÆf2H`$6 Õ'‹ [HD¥ÀK­íF£Ë+Z>&óPXÖMÕ›ã'P‡y“O2˜ L¹ž´…в(·‰ !̰(հĶ(«]äL1“‡w.l¡HÊAÐzXDx5Òs‡ÞÓ*ÞZ$FŠBEâØ±Ü‡¹Ïeü%}»Óÿuõç 1ªT+ íCߪL¿Énb×W5|fŒ»¯Qw9Þu§ç'ZµÙh ü4ÉRLtÕejU)çòPáOR¡êÑ™ƒä ¹}kÆZQP Î©—‹¬Xà!På&¤ñ1Ï/)êxõýéÓ!7¬2¯ÂÕp†X+ãX׸Ä#1;UU" þøÍ~KŽ ÷²Í}ùv[Yó¦õ÷úìß/Úxî©«,šŒ*T‘‚·+­ªáìCF/ê4ˆÔlÍX…ïÌY€š‰Í‡ú¾yy:§Qz€â ˆ=Uû5if·çY O½õn®™TWéÄú~`Sé‰d‚$éøF ¬%˜woÑ>»­†è sOQ0|Ö®I ÈbÄ"Å™ÿ…rO¨pERЫdý2@?>Ø ³c¨z“L¤íFyšÒÈ*‚Љ‰‚t•û•>ë{ÉhòrQœñbžAäžã °"ò §Ü£a¬=•¡2b^ 9Yb $X’83 ¯Le›¦‘÷Ü=2Òíï7i-ü挜à“rÏÎó¶A Ò6…ÎD R"£_{ÀÒTïNÚé¶C}ß!ȸÜꈕ ûæpæW{špvµêذü9ú¦0ûa¬ÏH*äU "1xªs7/€öBI-=÷$)²ÖÈ« K;#&Y¿{¹Å'¤‚ùÞhZß»'ã7–ÍŸdOLÓ!8Ãñ”gÂKl`S{Î[ÁœVÕ6þ¤À4ÂN†ˆwÝžw~vT&ì»l cA0É›Tæã¬ Û4t¾¸å>99KTtÏ3µ|9ɉ™£CÌ+9Ö'TfÞ“*EV ¢1DAdbVJ5”DbÅ‚¢Ee¢˜R‘€‰úOù Æ#" Š ùaDQS–°Q>%E`$X¨Áí,Q("ÅRÅ_–Tc‰PT`£(ÁŠ"dR Å"¨Æ UÅŠªEŠÈŒŒˆ€°YDdAˆ¾uI‚:ب¬ ¬é*ƒ*X¸æÞ‹ ‰PP"ªƒHZ¬h”`¬_aeaÿK³DRÓ߬?‡®‰bß-rërˆWÚϯϥɩ* ‚ "* Š«Ec:-UŸ†ª‚¢?03‚¨% q¹¶êí–Å€e|WªÅæ²ûMvÑžèz}l{Ûìi­=½.oùSO€Æ…\VÒŠ5j?hpóŒÚ´«-Ut²\Žõ±aw¿­[3ûQÆî!kf÷ÃíR–æ­´Ì _v)KR°ëwòjÂGæ®í`-d‘ÏWGóùü3Á@8ATPS«+:ƒ%(”‡ÐÿƒûRpxܵNZjlæÛLÀDAQUV(¯žÓð <%‡¿ÈxbÞŸåPR((°D‚±êwFhv÷dª0îHíWV ±EEbHÃ}¨fCì}$tŽæz‡3K»­ŽäD‘Nlxç"t½¤OEÿ›2›xZEÙF÷ƒ§T›RÕªh!"ª±PY×ÒQŒ“å ~}a¯çI˜›JR˜É~|å ÝOª$ݳ]Ne׈+ÇIsË!‰% +ûÓDç”êÝ xxõë’¢`•Õq,•¸# ²‹ÌùN“Gèï±\ðpû¿P šiðD€N\XÔê¾ÊÀ”AH@H:ae_ÇïÞ9“}±ê,S¥ttäM: 2C㢹ìÖŸ/w§fÍQ¼¹ÑØ8NY$ÞÉ´×øÎgùõEÝdVbØW€šÐü{¨5îÂamuSu2*A ¤Y;~v×üHwû¼<µAϘ€{lÖ½ O¦wˆs¬þ¿Ïç=*C±¡ìå况B2…¶DøŒAúâ3ñfR€zNôÛßÓAéºhTx8ORT63Ãì¡æüg§ãxs¯ÆûÊóUƒ9Åæ$Å©GÇ}ãI£ÉnÊak­©¥,¨´Ä‡0Œ¢WQÁ2¦ÕS¬–rÓ{§›ôà;Jq ¤ÇÄðÂ'ÁYÏ2eݤE’”!´"*›Cdº€21Ûü\h!Æ­4Émø„iC¯·VÑø×¤>sÜQ~L«ó¬1 æbÏba„T˜ú ü½<‰+N÷?%’Iú_‘2CQæ Õ |z2aR&µ ³a·‘2Ðî÷|·ó=Ä„$—¾BªfØ4  ÜS¤ìàýr¸2g—À£+†ñ5‹úW´åÚçã/Aÿk‘?‡§çè)ïñgS™˜Œû›wº;Õ)ÛEîš™ÎÎòòLdųªG Ó!Û$Ø%J6õƒõÈí -‘DýG{˜‰&P3¸e¸ÝˆJîýŒ5–bš‚oTY@„I\Ö‘&!âßèÑ|û1µU ì]Àæƒ*Ú‰ÝTv™u°ÊµJ×:àË“x)æño4ÁOæ#"55ì¿0TY¥ ”¦7619/C2ªYƒÒDò¢°(*Ûð?A ìÒþçd‡~žX?³Ñ‹¾õ÷2`i†Aþ÷]³2­0Ä! $É j "Œ!JJ@ (¨ÄJŠ¥-¥ÄF V6—JkqÅ”“$”TD­Bb"B ‚Ñ’0%ÛBYm 2®”%aIz9O„áCݱS 1„¾· l ¬ÙV‡ b=$¦/{Ž0Œ‹ý óšc2 CÔÇí?l(< ¤8ÂÉŒ‘@YH©’,„XH(#†$ ¬1"‚’°¨E€°Y `Q›B˜…ˆ(¢–ÑUDE‚Ѝ‘X*£¶VA V8Ò[E™˜H~K`ˆ°€ÍJ«¢ZÛKD¶”†"À£“¤¬Ë¢Š£@W¦Xš!XEY)$ª>Á‘å6;2¨ƒ 2\»ÿË&ø45 w¡Ð®r±®´y×Ò?AöÁömÛç¾ •½'`àèÛoÔ:sNç¿[ ØÙ:†ÏqO={hTŸöòBúª+þ °y>+EMÁ‘0gªÙE<ÖsèFf GOV Ð/^=t ”ú~aå4l–ðØ÷“ /NÁÎáêÁ·Ç#}ò`õ:`¥BÍ’ܪX HF$ Š)"LŒøÃ #?°Ô`È(è‘„h,TEFAX,?epØ{û¾3Ñu€AÐC ‚>˜ö ÈDl„è(~SÀkÀQÚëÇE¼8ó³©IÒ©JJ’¨E¨|$Ù Ùä£؇좉–æ/3Ö‰6¹ ðsH©W‚Šàr78UìÒ—1O°±.&²ƒÈƒ‚ø9»A8"™a/˦vDÄ ÌÄ]wá}ÉÞîv[ý׊Ù,žÐ¶BfúPúDÆ}þ7U?zÓCéÈȬ¬ß`¦JrÑMŠô8¡,/½~·ÏEŽÄÒG.v™YØ™‰0mAî˜cjt…“"3Òdú×²šœ´ÆR$÷4ÂT7™œ&ñÆ@‚D”mª6\ÐN¡¤«L´c/)Í,´˜ûkFÝ€H£R¢IHifI#]С08¡8r†í Æ´­(áj ’¥TCÔq"HG"!6Ó´¿`8ŠÍÖö™Í̵·Ä:¥BáŠõOtë㡌NwÚº3Öå¨#ËAQŠ$‹¤X•˜‚6ÉœH‘¤B.º=e®ïîƒÔÄA@±´pûA„$‰ $ ˜[˜k^¸ÙÉ­’­v©Å9Í=þzÞ,ë {l’,ƒldˆ†RQ!´°ƒ$"Õ´9¶\Y3!AŸÕÖazÂܦ°ßÅ&Á6‰´ ‰0£‘Ó/@}2EB*1 E€ªRÆGææ#éæPjSíÌ^¶QE …~©Q˜›]Tꕈ­JÏ3=dßd/xý=Å(üã¼%ºCâ²a1] ÑÈÛä!¾”4WÆÅ‹‡ƒ( —¢×θŠatfé²™FõŸ’½`(??7ÙëÂØ˜'˜¥ºMAG‚|É¡l’©¸M—ÂÈ`u4ÜÛ¿…Ñ£J]ùHìñrñ—½Ž¬}äébAýŒèîN ¨'¢à.2ܸ<ÐßÏRÒF|Âò2v¸¸…¾ º“èã8 f¶iÅœÂËv÷F“²%"öÿþPŸ÷ £ôÿ#óÿú~ýƒú¬Ÿè3ý”Xî\ý¿Çù¨¿î(ÎÏqåܦI*Ø·ÿÆ÷›ïG0ûªªi·ò?ì ²ñ÷‰cþ¢ ‡¡ÒpjÏú¿«ÓÂ}Š:ÿÏûxšˆ~Ð=î~ÿÞ¦S2î×ûüÉ?ùU?‚uùýÕV;)Öµ„CSô8=ÓHzª“ЇýÞS±Ú¤ÆðŸ—äüò0~\ !â"ˆxü›>NæM?C¯^CŒ>ÕU2_A`|šÃøªª|ÝQnr~´¢øžˆý^ÜñkþʇÈPÖéø¿²ëW´$>ä-ÊTQBÄ–,È¢0"„U HÄa P‚ƒ*„RÀ(AÀXŒE€1 „U`£R1ˆˆU±F !ƒ¤U °B"EŠ„`€À"+ƒ,A ˆ 1b"UбP„Ed"DbE €ª¤ ¢ÄB T ,`’  ARD€Á"@H0F’ Eb«(±‚!X H*A("Á!1€‘‚„H€0PЬ A£‚H‰"$‹ D0‚„ ¬@`¬PŠÄ@‹ ‰F$R#¢ˆ•*…T EŒP $AV(ÙEˆ*©‘ÎýÞ×;AκrãêÕ.p]´÷TQNïõsÍ9—ö@°€‡ž6(ÁE1UPC<'îQºƒ×áýU_Ÿéˆ\ä¢ò;~+ÉòuÿK3ùòQ~M>±g?†çöc¹ð“Z¬(¿¦êw4À~r„H®ƒ’ ˆtDÖß»SÑ€€¯è2`s!g¥+‚‚C(óÂ`7<ëøþQŸ¯cÁÃÛñüÞtï|Þîóµ\ã©J·3uþ“¸c¸ˆx :›››éü.ó?~Csì¹UTä6ß}‘[ò6ù߆ïGò‡aÏnžU4^à uù=¯ÚŽçÈèv&3Ãóc( "{<—?§Uø ôÝ7u>‡èu Ÿ~’ýŒ¦B—ÙûÃë¹".âJQ`&QQ‚ ªÁ‚@"DDˆARªEP AE€ÀE"‚  $Uˆ A ªDD‚AŠ© ň,b XŠ‘"#F,A`¤R"°ˆDB"£P" ÁTˆ4ôª¨!º!ßýO·bòŸbÈ}=sd^…3¢Fé*IûŸ•UA ! ý|ô.HHžóJª‚ÅUAŸ¡ÀY5Û©Mƒ¸þG4R¿Eˆy)Uœ(¾uÑWƒƒ‚£û¥è¢¡îg.^‰ÀàêG? OH¤;;ås–£ü€D1d箢‹iö_|¢«ëÜ&›©¨Øß€¢*ª`K¨¼¯Ÿ¼™·ÉËë  ÀÈÄÅìjZÔd#î.1ª}ßÜôÀò7‚*†ü%‚6,¶¾Ðºàþ¼Ð˜ÅUAû…Q¡Ü­‡áú;œz€t1ú‡ýH´”Ùv°»HÄ@C =’BÖ )E¢é3û2yJjoÝ~D2R€‡¾ŸÌˆr9”E€~ǰÿc„Üçó‡ð?Rt.Ü0Ó0üzºªª\¹Ù:¿ˆbÒþa¼zì`þØuÜ>4.ß™üà4üçû™ü¼SÁ:‡ãýO„ÿ¡öUTîh@èC©ùŸ²‹ï4²hJª ‡¢áèØèë·òñàUêˆuôQa“ƒðŽ0¶^Ô´‚·÷™2ZéÔåû‘vO£€ ;úUTêtô~j,èõA½ pˆj™x)(Ô‘MV‹—B§«€ ˆ`¼~5?ЃEUA ˜D: ¸Æ/j´eVÎ8Qb‹ãÆn€~¿Åòˆol‡“›®Üõ0/y2€t4wÿäöª¨!oýGœñsG’‹¨°)~DBǾÝzÏX­€%¾eøny.ù0vÁÐ9ó|ƒsbˆkd[(´Sød¸½ë©ƒ®D2lG”=¸¤Ô9!áùH (ݼz6l÷óº?ƒnŸ›ÔÉÑ= ˆu9lZuàÃÌ €ˆjl~H„Å@ vLžN†\ܨ€ˆ~õÿ¢È ¿±÷}þãÿû‹k`ôWvp·Ø £ú>WîŸOMeͱ?Þ‹àp}û",óØÿ?*8vQ~ŽA¨ÝCð‚¡’êþ¿týÂ!|y>C{ì@õPÑb÷ðpNd9Zö@æÂ\ß½,Qmª ‡ô¨ˆEUA¢ÿúb‚²L¦²?ÊÀᚿР¤.ÿÅÿÿáÿÿôÅ}ß}ÚÔïLœZ×»¹(hIäû`Dð êñ·N®m„u }ïp íÛêïW}\ 4Í6ÖÄ>€i@h·@4(°iI »€¯C½€;ïÏ‚ãÓÀxBT(ª¥}–†Ú¤04è(”BøP6±ç¾±UÛÞÝÚ‹Û>îõè=ðÐR‚à§JŠ ‰RÛ*)%Q@ùH€CO­4ï£×΀ zÕ  8“®síwËèemaÊW¶÷>µ‘Ðnmð ò" ©²‰hÐìt ­· d5¥‹@ µÜÜQjŬÝÁÈ6t§ Á¥ÞqÎÛÝ®/và-†¯qÝË»±]hkVÉ1°¡½ï{ïo€ÂS§#¤¨Ÿ}¸wžï}”Ð} ÷)"ƒëAG“A¡ £BÛ@jZ7Ûèã€G&How5Ðë¦PÜõœE€yØ@wYŸZª,`  —v uV`P(( (Û(ëÛ-,( ÐT6 HZ%R´h@4 Ö€QÀ -Ct¡T:Ð@P:£5ކŠP(è .À}æ@°€*‡ Ð(  ¾PÓ¶ï„=à=õ¸S»QÅ>©×zã¶³ìjê¢Q±°Ë2‚ ¾îèÖ›o\Työ4è:<@ÓÐUsßR¶ûßm¾ú•Å|gÛ®UÐa› »å·Ûï¶Û®Ò¸qfJ6­¥/fª6bŠÃ&5Š+6¶c}{>÷¾î1Úõ×]íçy޶µm¨ÖƒÜÇL"k¶ëßg<×ØÃ’1 [ ±»Û¹•¶ÞâštÖ€3fÚ¡…µ`ûîß}ÓÎôöÙ qWc[3*úÜ´vîµWXÐÖ€=d¹`6+%µŠmVlômí÷»­_m;ÞG£çfí¶­y³ èŠt6À*µé è°­;gO¾ßE>[Ý÷§¸rØ 61gÌÎ(äÀ•t¦Š³¾²<Ÿ}ö,²©é$žÛ|c £Õ{Þt:ÉPºjÓh­u¥ÓÙ†¨P=ö:·s·1d–çc½Þãí¼ ´zÀ ­Û ÙÝÎ÷ÖÞì3QÆs>û%HHôž¾íOc(¾Ëd‚è7½yxܽ½;Ëìv(ç;Ðz<½¬æìæ+JLÛ=·˜[©ëÍëzÉlRôw½3Ýë¯@ºÙÜáÖ·¸9sb‡»Ë\÷dí6Θa»b°åÚk-·{ìÈ"×¾wŠl{³ÓÝ)½g'£Cž=÷ÝåS_G'.§»zƒs•°ç5u×jM*¢‡7pµwMΠlÖ„[¯qß:¯¶¯^]÷¯¾1ë}o§Ý¾ºî¶,Í*­ëš:íºí÷Ž—³­;zÕ+ÌwÏœöÛßg¬•©Ø´…Ýë½ï=ïmOvË÷»ï7ÕîØi¡@ @”ÓÓPSÄIIRf¦Ñ’i Ñ¦™Ð¦H"4ÔÓM%?!a’6 ž¦€M$A@4Ó@$Äô5§‚hž¢0&˜D€€#@€„Á'¤ÓL”žÉ=FMª‘ @§£Jz2©ù¤ꘞ‘ õ8yÔ'n½^µ.æ+)œeŠË*ò4ÕçF`M8uªyB²@•m^H3Ú¨P¡UY“6ª( '•DÿQH" eVI’E„U AUH ÅF„A:ˆ*¡T¢ˆ$JUà²É ‚È "ª ©"2ˆ’E„Š`°(H  "ˆHˆÈ! ŠÈ„ˆ ŠH)HEEY "‚Âd’ À‹"€,‘¤QA@YH²" )ŠH°PŠ "¨ @‚‘B(ÁdDQ„R,‚DU`*‚$REY$X« ¤YH,EEQd‚„YPAB A`,‚Ȳ ‰UR (²(ФR I ,„XAdb1@ˆ‘`¤RH ((²H²B,€¡V„R,"ÁVd‚À ¤Š*„XHŒ€°U„R  ¨Ä`¤F,T@AHE"QHE@PU‘,X H¨¬R,(‹" (¨ Ä’)‘@U‚ŤUŒ$QH  A`²E„E€)P"Á`ªE„Ad‚¨(*Š@YPU‘AVÉE°‹XAH, ÄPb0ŠBÑRê"+óùÉö¯Ççñù/½Õê#øûFB°§Ëó_|i?¿Ý•ƒÁã¥/‘‡_\ìXX¦ÿ(!…ÃîbGܲìk-ߣó¶K·¦@€ ”»í áA„ƒ9,ðhkÓŒØF*H¼/½a´~:ò°¸•QsÿÛ«F‰«þ 1?Áˆ©úÿõÿ±À±Ïiÿ÷‡ýxÆÇÆ·ÿ¯KëþoÃÛJûüÝgJCÞõ<ý']uÿókû¶æ66~ŸGÄÿÏý"PúòÓÝz6Ýmçælže§$ñ(¤ÿÑ•GbîÁˆ|Ê)_ò¿Ò´† u<ï0Õ*B<Ö$k•wºè?•ך*ÎØyê’°Ú|Ól{ý¬éX«’o,SÃXp÷ø2²oå¿:sž6ol¿×µ¾Rk«ÿøüÐÇêòä£?>³–QJ(ìUו@|‹¬ÛЦ$ Oa—§ vB£OKeñœÛ2žÐÓÉ 1Š*ezÕøÑvÅ%[½Üeøð¸·?.Ýâÿà%£Õº·ÿ—Àhü+'Lš¬ë*¢Ï†xΰ—ÿâQ<þü3Å@Y˜ŸIymû¼ÄŒ ”Þ›Ü+œP q£Ê%ÆMβO„ÂŒÂëvXª¦]UEè3 Ó±(Ê9ëc-¦)JÃñ=ÄäN^ûç“ø7"›ªu`§6}Þ ÿÆR$D† D…ây~/ôÂB+6Kº“âhЂùé%7*ó…B­—r‰s3ç£x¸d#0D=pל‘+ä¡K/1fÑ9Cù`©$y@*b|àš÷)/üQÃ~Ÿ×o–By x7yæ9wvìq Œ¿áeá'Ln ›ª&e,ÿ‘d5õ²ñv/O§'?Np7êãdzAsúR圌çÏ놞™:çöf×àtâ¨~yKÙïh°ÿüenwˆ±Jâ·)"6ù &|Td”w÷¨„($Br<Š<Õ Gu `dG#ÏJ·¤…™K;´÷Lx·ùþÙÓäPýÐñÅ=ÙÂ{.Ý|[Ui˜õÉ»0mWÃr£©(!À*bÁPŸ¨ÕïêεdÈ¥|{Ö.ŠU@e J&¤xo<Êæ†áƒÞa;àP1.È>FJ¤Œ•S>tA¢èþL¹rÏ,îU¼wÖšIóP)’ Åþ¬6å]!SË¥ÒŒ¨¨0žpKËžì–ﱄpÊßßÝüÌtÀ Ìýº3™ðTP„¢1¤D*¦~2Íi¨ÿÓç…ˆ[Ò\ÀíÆÎ\í„Ö¹UtÉ$#":Ö²k]\T‹«ÿ•´È‹T»:¤›ÿôñÜg¥'¬dÁlx!RѼ^–´e…Vöœaió«2ÚuSOm‹w~{ó ió^gËÏÝ?¿³ü=ÿ–|üíþ]d>KÁœÇêíE¨Fÿ½€‡ú,b† ÔDñ©ìª…Ðûe&â4’-Z$ä:aˆ[Ì€R·–Eì ô®°¥TÒuÍ+Œ ÷¶aÂêéÌË"ãŸÂ±WGd3¢QtþάOÿÈY'".¶’ž£ø^D:c쵓1<ô1ïGÒaœhܹBãFbîì\_–1"˜I|áOGVÁ$ý‹˜JÙ—>–úoßáwÍó#fü¶MÞUêÁ,ýóþ\ý%›¢§Ø‡™Žd/s›) µÆ ßÇéwg…c¾ê2æÊ+:6" XÀùϸ°••Œ^êÝÕÿ?XJ~ï_'áL¡ðC¨mãåfÈDí†HxÉfÕ‚~¥ìæÆ)F_e®¸7…¦ o±Í¦²-"Áܬüaذ¯ûÆG±¿áôðnÎx à_³ÈNrØ4NWáœ;8^í^dpÏâÙk8ú±,$M»ê2¸‰”ZÑ~GĵlÏwa¸kImQn¾™Ãø~iþ7¸£bü ÍW„;|,i0µÐK™Ç?¦×âkZ#` èLbÂG”L`òR±ÅÛâœÁ“TQ1‚¬ˆŠ‚Á™àñzçéS›rùÉ·Áë¬,e–Œ72…:FJ(€ a—mÝÓ·ÿ›Ëâ?™ÿüˆÿc&?×üÝvж–Wº-$$¼LL ‹tï K"bꃕiH÷ÿ:÷|¨€h>tr=™\Ðÿúq4@´²p=8øßð0?äø é5Üäõpùió±ðÏÇè8ê4>ÿñ¼{a~ê7@U;FÃŽ”Ó9Ç„„NùÂâvž,&›ª£;ˆ÷ÿ0½d€hÑïËKãÙ×û¹P0ˆ¨œ‹)'D‡Ç…+¬¿å†âµŠç¿“‚$&iͿܞ=)»UƒOàDí¥[ÛÚ*RÅëÀ•ƒ1‡0¼¨yƒEäÔ è~E#ˆŽP#—T2B0BÕW½ÝÖ T`k¿ eíK}h¼Û֋Ĺóõ°e®,:DaHC‰ì)wQ¡¡J.Ì žfm¶.9”"¡‰ˆµ‡ºÁéíI¤wù|Áúú×B¥DY€`ꀂ’÷.n½à‹–§Y‰[[Nf7£`~LšO³'Íšï}œìíÎñ‰›Ì̾§(§ýwø+^ʳõYšuÃPO®‡ïÞ2—¢Ê „Y2Wk¾nÒâ•1ªôqúcï¶“m\ÞsþãÎCJ#nV~«ô5_w’(M C ê»màÐ'@ßùÞ¡cÑŒ¡ö±~Ñr·›æƘuÝ+ô„üÇØÃ“ËûH°bƒŸvÀžËL/EUøþ8ÁÌ@䬀×H4¯*ž@óVÅg—“F„ƒÃ[ÚV‡ìÀoV™•¹óuz9ÍŽ¢qoó aÛ&‘4÷¹¿{5Ï$}èW_´ë¬ÐW§Nqq ¯ä•‹ûHΕbÌE¢=¾è¦÷ôA‘T`KÒ¬ü*Ý©< Ë1„Dk‹jX 2P¤IlϳÐwÚ±š ¬ža$ÐÓWQôùþßg:‰,Où#ùýœ1r¡`º*àñp-òƒ²,ãlmXH>5f á‹…5"ijç„"šó¯º‹2L­6f!Á§öáÈÅäÒ :»GE"5‹€Û®ýº¬V¨Ë›PÀmyüÛ]WómE$NŒH<{ð¯õ‡ ë ë †nÓÛ)ÁÄZˆYþ˜â?É &â×â¿}¡ ÕÞŽía[ŒWJ“¾Ë?ø›ï,ºÓf›qÜ(÷Ü7 g1þáÏ”ùòVñ¯]YÿÏøã«Ã/öÖ×,f#”C @ø\ºå/ñ–¢ù¯ÜH:Àjê°Ìßlâq(»[‡î¶†€¨ ‹‰ ÀËm?‹ûÅ´¾Éq€uî€Tpqn¢Ë2á¯|z|+‹ÕÆ•¡Ó"¬cnñiùõü+épbNø5ó¹ñÿpfGBˆ0–1{ê`ÊC…[!@ø¸ ¾êNG)NŒí0]bÐ>æ E?௱ph¨*ƪÿI¡„Kfã…9D5¾:Óÿäâ;­ xl¹Gó¶™gAˆœï§¾ºŽ“§+µÑão3ÒXgm‡X-/óøM}>×~¿eßÇÍôÅŠE‹E‘`ÙíÜã¼i-rl¿Ü0\)!;yéšÎâ5ç5àêÂ=˜w7.BÄW)c|% ÅŒ¨°|LÌ`ëâÜH€Ï†ýW^|oçÛà¿–ªÐ{ýÒóû°‹ÏàÐE D›i"¢/wü>¹s ĆOã…CØ‹æ gXByöÉù3iÖìžZÍ':i6·2wí™1•ð≬‰ šf„7vÝù5œêf¿¸Öö¿†±ùOºíås+4 ®”EЊ‚/Ú}ÌôªÈÉ:øºÉd@‘У¶å¢hNogRH'°´Ö¦PHnÝßX}žYߺbŠgŠi0Ë"ªü÷– iRÏXͤQ¡fÒ¦ÐgjÈ¬ÓŒÆ )áöx}Ûßt˜‹Òp]Ê‹UCˆàÌö».’ÿ·§u¥qc½¹waøû_¹B!ôoo¶Þ¿iŇëÞ?q/>”§û þ» }HR"7¶\3û0Ñ"fGú<Šð®°y.·ú°ý€…äl«ÃY›ã”0nTV\8D3ðf^5a?Ä6LëÎÏ\6À_B˜4XÅ›÷z?ø‰yƒS•§9Œíþ¤‘Ê7q9b÷aV`pIFxai1¬§:Âís 5‹&‘åCÚܽO·Ä|ËÔø Hûªéˆ¯ËÛ÷¶R‚ vÇõ<=+î·ûÙ¡øÇóöˆüF-’þ  82þøNÆéˆ"è¾ÿñ·ØA!dT»/œ¥Ürq>„~ un±œmw6ºÓo{_îi?Œªÿ {qçwBá´ !på*ž'tJq/úl|æõ´>z£ïdÛñwŒ21¦ÓE•·ÿ_›dçH[ø•~>9ƒLê3)¸øàØ7gËÎ\XAD²ÀýGÛú?£H} uÁ°ŽÞ£áDñ é~ÿ›Ýà5î"šilöæ%ç.–\” ž¸À5”fÁq×_¾7Hé3¹\·üËæ1ÁÍæ¢+ù—ÝñšÇJ,a}eÏjÔƒ¬Æ*÷ʳìÂS¥rq9˜ø…È «?è÷öíþ0cïG×G·ùôÈüV/­v•‚çÚg {âïšë‹ÈäÚݧ8>¾„àò*xN)´4ߟdW­"!ïÚÓÓΣ»híºjÝⓞ³üßò¾ÚðXþ*¼Œ,1¨~~¸B?iå¯ÝÅÿËýZx}¾Í±ÆW½ 2f‡ò5É„ ª‹ÕDœ OÇ÷ýç(Ïoß[vWõŒ‡¡5G÷æ±Þr÷Â7dzQ8ÆÙ·¯NùmóÛÝѽÏOosÈ©…¤~¡-ÿ²P.#eúëO‹ÜãøÊ¾Z%“ö ™K(%X(#~8ýzà‚Àkö|>sçqùÈçòëà®CÂ_"vo­~>õ{T±ù›ÐºŸ„ñ™=»^¢8á9˜)\1ûZ<¦« ¢e[࿱çv•¦Y)µÖ½œ|ƒ|h¼*íì{ðâÞ\ì÷²¶c“Ù–‡s1`feËø·a$e˾c È3áÍZ*¦+–‹ò“Gì4ÛKòååh³Êð4Ê'¶ êªÝg«áÆ­üpñ-Ëûª F±E$¥l­åpq©öy05ã‡5'¡¶ø÷rÚûŽÂßEf$ÔÛ¼<> ÄF*$«§¿,ÎxÔéï­ö¸–ŽeD]±ÅÚ<DHÁV%šý~n|lYà”Ù~ÿ|GÆË¦ãXú²ýûnÀ¬`¥^‚­xÁ¬ßh<4†Pµ¢¿q-­[”°3Ú³¤p’ ×û^°¦räÝVOõesš©lÈÁ÷§Ù–.»Íg£FºææA÷v,êý^¤»7€Üí—¬ãû±¯·Ñnim]½p*;ã}„¤dßhá|ÜZ¬Õj‘ƒÕ@S6YHlñád5ÆÕçú«C $ÐÇ7Ï_ÃLÍEhͦPæYøA¬â&.s™„½ÜõÄ2¶†wyßÎ^Êߌ"è°IÙVœVG[uÝ´ÃÑ]³ ¶jŒˆ0ËXŽ3IëC­#[°Õä0;˜pÙ•¨qYsÂDÔa<±”a Vu€×gl¡žÖºËù×+‘bÄbZ ŠH¨„`%Ž ÒyÄ­*b²#….‹Þ³v:Ij\0¬µÂ8I'÷\s^б䕤Ccl¢•´êÔ¦s³…§;y ñÆÙIHÊK—ÕZ˜d¬nÁëi4ìl¢”Ö Ë#>œ©¼…DÒ—Xœçö?RÛOYÓÚÜûÞN¿¶>Æ–xUiý¨{ì äºÕFÇ)Ê1]$! (Â;ñÙ!!QË÷çÃX‰†Ê£60:Ϫèœi϶T‰Âß¶AF8ŒX* b OvQÒ­2g/¶‘­Éþ¿ÈŠ’J= {¹;ŽEun¬ý9ú8‰É;—„ð:©íYðÉ* —§nŽë½•ùX8ÿV6éel¦å{!ÔMG‘ IB©ú}¾Èòåšo—çéøü2‚«÷üZÒ'Í5þõtžu „©§ô¯Jù|f¹ÎN‘:?dDš¯áîªóúž™Þ>ί)7&›R*ø/Ý…°þµ®¯“žv —ïÃx Ñp eâe‹ï gز¥—öºþ§“WûÅD‡P°— ß9´c²¬ ÀÆ^ çÁp¥èØÚɼEYqßg¹_nØR{c2X=öíhÇôD;zŽ™í ´Œë]©žµÐÆ^Z*ˆâÿ¼?²#ãÝq*DK{ÞºRt á Þ7ø{WH+T” ЧÊ÷ŒùMÙU¸šÑÊÃ"ɺ©ï‡ÃoÚ#w[Z‰ð#*®?­œŽñ†ÆË~øüè2nªa?áŸ5‚Wºõ{Ý„Ç_\/8œ³‚wvQ—›!& ŽBüþªÛŸí!ËHw‚„KÜ(ëðþ²ç9Ÿ+O¿£ú¿ô2x/Ë(3Z©ñ"<^N?2ˆt°a,¾”é?çŽÁzc«fJŸ¯·ëAø?Šðj]×:0$ÇfÈÿzrþùÂV8Pò¬î‘(JÀ–³Á¿]ëm}>Ýž^ÿL7ùù}*=ß$¢°“ç4z|~ß,aH»f\ü?†a OØË&}Tü˜>–öêƒÌž;s‡ÈN°O3i‚{£Fö§ïçÖxÌú|t”s‡¸À|½òÜB;ãQ|#ò\Æ@k§^u¿N x‚F‰”5¿Ð¼«Š§ þ¹A€·! ~ ¦1(«•ñ¯8¸ƒéõŒâ"(Àz¤wÏGžrÓ8ÚO¾ .w^&ð‡öÝwÖ>úc*à8µŒ>§Ÿ{óמã.\»µLžƒÇ†žÿ!òõøNp÷}?¥”Wùÿ7­ܦ?ëÛïȨüãóá¿>Ï/¡ús-ÉmÌñÚ*¨ÞUhˆÝ¾im›?¾˜Í!‚þÚèËN?¿Çïó¢gÒ† í &@¤bY#Øþëû«ð—Ø^z‡ð ôïaÛ |¢˜_¤>=;ˆðãÇ»ßÌ'üß#ã¨j@ñj7ó!ó¬[åÛðöÓߎ¾ðíûñ}Á}WÉcÍ| þzT*‘Þ<Å=gðˆAD™¢„aOD0ëÀSŒÜ·`ôèD9DmåV‡dëæ(#Æ)Öé¼~ñtc¿ÁïËù¯àBþòð^Ï =ÿ&€Œ5Œ)ô¢ä"N>~¾ãû;áß³/˜ecbbýþù#âñŸ/'O‡Ãr;?‰÷§U´»óéä;½ÕÚˆ­êßÃÒÄ’*·vóìkÜú Љ}ö_uD#q¼˘„ŒnùW; æ @ú·ÔÜÀH-Eí}QE©f«Ú<ãž´èÛr×»‚ œuõoŸŸßà£â@ùwaõû}%hT}m‚”^@…þ ˆ1ú(–7¼ ,„’èW¦ÿ/û”iÝÏ4ÿ±öœ¯ÙYAücP^"Kܳ½nb\*Ì2€®óŸÝ|&Þ÷ÒËZ¥À(ó…óYÍT=sx",Ù¤õ¾?6•€ ë/¢¯×. Ó\~_Qõ¾¶(ôüÛjý}ˆA~±lsÄL u”tÌRûÇ&Õô6žã†ÏYójkJ?Öµ÷¢ü¦Úéåš@’ªùO©N1í¹Úï©×)ý©³Ÿ!aCfÇ¥A¼š¹z|=Ü›³Å‡ŽÐÇHåÏWï˜Í¡ :bv›{Bºx–+aÀý§õ§wׇûã™b‚…Wm5ߤ>Ò¶_ºTg±‹v^#¶Zûù7Ç¡z_Òà~èÜ|)½h-%PQ¶ñ\ÅÊ-ÖØê>Ð_.¾ìë(„3h´3¨ð”f‰äÕ0ŒZåZ—u 4ç/&CÆÅòWüѰG&q“EYcþ¾§¾"`Xµ«W‚‘~®¯Fi1“4(È`Tå×·UP‰ó±;»–—!©à€~i5P¤•T ‹ñÓÃñÒ»ÚMØ Î]È2ïã›GÉ×¢èÁŽ©ïÔ\qßÿ¦>*ˆ)Õ9÷¿HéÃñÈö»ÿã§µ+‘áaɱµBc)ÎQ` å§('Î"ró‚ˆ=|®ùx!ÿX¿ÃÙ’åǹ:kÓ]ˆ<[^2ƒ$ÿÉÑY\PeUˆæõߪ¨ãÖ±õZªg‚™ñ»Œå¼>ZøKÐ}J{“Ûéæ'ЈÍSÛï6‰gŸÛ05TGAƬÒšãœÂOfté€B>˜Û©j‚"µ¤Bÿ/ôW¼;3ûÆnwÎ)“•x;½:C±5ui7}p)(M±Æ31”ŸþX5Œ1•ÓU7P÷¬& ÿÓŸ9=ëJ_óÿ_ýTþÙcÞa÷üµðèœèáÚ_6­U‰ÞÀ'ò¤‡…ðô?YËåð^C[?˜®²Ö?4D%äÒDèß±ÃàcÛé÷÷3 )2nâŸQè gdquY;ÿoX°aƒ†ýe?êjçúÒmkÚNÈ PL(1‰ý»ºØ\eÔâ½ûñÇ£~ˆ¾°åÄpàè`þÌ™j« ã/k霴˜žߨö]w4åôçéòO‚|¾h#·¿æF€ê™*HüÿêVúâ²-ºæ5‡IÆ1€hFmcŒ¥œèÉIa¾ñaÔôüv\‘´”až`}½°ÎYá/´ -÷Þ‘§Þ4¥d'ÅÚû­çÛ’ÍrýžŽ?\r¦w”HÊx/5Ï»¦òÂ`ŸòsáÉ@‘á%Žk¸Øé†þCñùú·îßÇûú}ã‡óÛö„šèÊìŠÿ…zþÏ‚€%ërLªZÝ—¯’©Óá d`-|¿Y0—í4Ý`Û#3MGßè¸B µÀdlm͇:¯OiPЋÈDÞørXáÝ‘°ä¸åaþ>ž>lÈg˜/œ?¦ÏD)óú·Âßœiô^OCvi½p§÷ƒ^CÕõy™Æ üOŒc–µr2Ç®?aÈZµ E®5?aÉa}1^ƒ&”…sAT@t. GÿÇ>ÆQšîaÀ/[ÍÒsÕmšõQüϳIÜ]õSH½Äœï(R½®˜Îc6°Âj¤Ü €* o<²Y{GOx÷ù|ÛèŸo‡ÈzH´L¤ë÷Ðýý¯÷›}1ùÖ Ïè_XZ€ÊcG$ˆi -ôøÉVšC[ÉŠ­Ì†ÑxÚ§BÐyÓABi³?ò)ìÒ?åqûüFrŸ¸ûâ³>-ÚËGUo±üy(Y*{ˆûÎrq?œ!@m¤$ž¢* Ôgs¬X@jÁøCë¦eƒ.þ§¬)ûV×Ee'gq¶Qx‚t‹'ß*RR’ç5 ìÙ„ !óË —Ï&ƒN˜?ÓëlÓÍ0ŽgšŠê¬»UFÊ>Î2f#‡1ÈÉË‚ Ëãù¾b</’¥S·_u©†›¶vÒ=Ç#fD4xÊ/¢‡‰ëZþj¯´mTÛ”{SQ·32)÷öñÁöáÝÏòøG3ÚPdU) 6‡­8ÿ0EÈvM‘· ãñ9xáÙè«8ÓêØì î–Dí˜å¬Æ£0™^63¯[S((ô4#z†TGŽçÄŽø‰æ¼ «JQÖ‚" :-ejô’><òŒ-³0€šÁ@»S–ây‰¤ôìªñq õA‡„Ö”ôò!Öšf¬ &ßóFx”räD´Qà0§³Ç¾\rÞ9Õ“œ¹S³l©[3ÞPÕe„~ÁÄÂ#±gé=´«ò:ÈC$:XÃFƒ–D _˜QIÛnKž[þ?dͶ®ò%á¯ëý]6'Jìÿ+ýy7jµ ›;)³‹˜Âÿã/6â%á$]AQSW£\)âìdFÏrþ"›æþ{Ãb˜äùPÜäΙ§èHÝKýèÏ ;D‰àÉ@]§”Ć2rÊyááºÑ;u›Þýø_Ú9jÒq¤DáQW(!Û3à{KÑjz)ÿ¸Z‹}Š¤Ô¥®pžS üÌ)0Öx^*S 3^- å…|×8lq(@á @†¬‚;ñœ›ÚÛYãWʰ‘¥–Ù_5»;×Ëì¿ÏØŸÚ!‰ý.Qv”K°T­ãûÆ3˜šNW¨þ,Dtý¾Sr'ø_žBq¨AnjÀ ÖòLaþ—6Ïõ–/½b)Sw¬¾1\J¢*0eœæEcÇžšô¤®3«ý7Ç Íå"(*±r?¦ç+äê9·)ô¥e9 ŠŽ¦$2p¼-q%Ã8GÜ#o_!Èâ|<—øP#ïQïü¯°öâCì±=!òû>2GÚŸv€RŸ• ðaÅ;oÃ8 .Õñ¯Þ8IñßõOÄ~‰æ)áªý>º½ûóŸtEY#&›½UŠ}™X‡V§WÝ,é磿c×éY²ÐA^Þcˆ ª ¨‹V:må¿^>Ä" ôö >^Zr_Âû©dBI$B*ÅáB ª±UT/—äÂb|·¤KÁPÊ‚‹ €«" H„ƒ „ˆ$‚™Å¨(çPJ€¯ëTñý:šÞ¥”ùÕ°5¤U@„Ÿãø‡Öx|÷p >ò?N¶÷‰€×ËÏÍÀGÒˆÞq‡®;Z´þ7ü?Ç·zùžžþ¶‘ŒzFKÿf€óV‰ð'ÉkãÝ^Ï+ÝÅíö9°µÔ¡EôCü^@~ÞqÂh,Õ˜*rå]Bm.9åékÚ`1˜xyzx||ÛÖ éíòù} “…¿Šü~²XDüXªáúiB"CHÎ*£ïÎö}½<<”íP§@QÈʧöø§-V1ÜÿÏ›c¹».–J=PõM´¿äÏöXRõ—™ÇõúàC~4KÎ\'Æ­¡‚Ž ÿÉ ©½dÑR$e07Õƒýþ‹CâvT;û<>ÿˆ‘mÃ.”e¨ÉG:|ò‡Ï8ôÀ'ã}@] 5Ú0 ³1µ許OæϸíßÃQÀqÍãW¬C4àýå$\ÀŽî·Ï\5«(*%§ß–‘ÈätvbuÈ垃NúÍäªO4M2AVÈvÈ qvLåþÜÝxl´—réúm¸V.–) hX9DÀÿ™ a)Ñ9§wíØ.‘ ë˜øpÿ1ï ñQòç¼Z|]eÉ·_‹†¢},pXÝ{¹YáM *–JÈ’Å1…‡ÃXK[yûö–r5ëX¿Ç–<{<úóÀn€ rèÝ?6N”þÇ—!üÅ»Žá Ë?x}:û?òæj~¯(mÏ¥‡9&p¤/ø¡qßÛ6„Ä‹dQˆ°‡*À˜ÉQCý핇¦a¶r‡„…{IµIx‰%@Ó' ¬í€VCYH<¬¡R( @™Aç¯Õ|6]ù«Äÿjüyøx øˆ\õ¶Û{•5î¢ ìŠ òüÄA2ü:Êéß¿Ó~5+¼†E‹ã³WÑHŽËîí½¸éí([S›—{ )‘ÎêkîØ˜šë7\Nî÷•yB!Ö³m»´AÍžÌ 0:ê˜ìªDì*ààÜCªqdÌ}È«˜¢°ÎïRdîÑP•H«ÉÚêÓÌë3.¯¼.÷²²{¦‡êÅ9Dê˜ê” ¾öaÜPµÞJ̢㇪2ár3ªS§9–5{Õ<êÓhè¡Uè쨭ãÂ"<û3 ]ÇFÆDˈ­çeyÀà7ƒ "3³<ƒ±ëÊ›/»>­Uå~ËY‡i_Jza¨×=¹ÆåYµzãVÄÐéaóœàçr'µ½¾¹¬Šz¯RW ò²¦»&ÆW}‚˯Î2F”©a®ÌFœ·ž—À9Ì¢ÖO Â'beÕÖö¦š³  q7’¢¦ÔayÉ­P: Nmb=¾^õdÞw³ÔÞ<œŒw$Í*ˆÕ¬iî‹•(äö6êÅ›îè—qY1'wœàÙŽ©˜1LåuÍšÎwrúf.Ýñ{ÜÈk;+{ŒHØCœZ‹Þëj :˶û&†Ê¶rÞç^­[“Y[ЉcJÚï%³¨2/bdDÝe‹ºrr;V»—GµjêmõMäÎ1‡£1ˆÚÊQfZìl†mÍYQ“.(¤k&h¤æÖÒͪï“]ÎÀ‘[µØî‹Ûn‘'vnº¶ÞF¦º°j†#‰ôeÓ´)ì—“³S"Lt9Îv»Þã8-ž ï—2®;Ðö±(]—ܼ͊…Q—;»quJ,ïDÍ£ºAØr´Âx]ËswSºšš¥‚åjX‚ÝÍoVViW@'Q}b4w2¯»6VñBŠÙÀdVg6eî …‘FªDXVÔXŠË„èÓžÊê2»ÚÉn¦(hbâÐ4v¬î5º‚ˆ¬íÏy¼ ²T35p3DE ¡™c2òôàѸî-\aÍ9jfC‰Å,ç k¨-ªÆã[ŒÊx#Rбd^ìÌYpëbò«/·ÕÁá‡ÇH>#Ç‹+«¤YÃÆGš•R²uºŸ@Âõf;¶i¡–Áu¶Ï ôÇ3«+ aÏ‹½R¼ë¼06ÂòhdÓÂ@ðÔH3V8¨ŽpC°…¬Îf-—XóFhWzûÈêX§q åÌÍÌ3{c\¼tVˆþgMN³¬ßì{á*íù³åð¥§0Äé&®/]q.iQ¬Fc²XÈŠ©‘ñ‰¬%9 »½m}¿Ãz8枇ÃÀ pc ÙgákÖïÜIí)ù—=XÈÊÈõ¤¿A8G¬áÅ Úèßêí¯¼ö; š{ŠM{×9˜êW Eí^Á«¹Ì4}HI ©%éKŸy‹±Ívõ¬t…ágÁˆY¥os •Ž ÍL±YQIk[ŽFh‹â9¦â(ø¬q3ˆ[뮷χi÷ö÷T¿ñÃÒT¶Ÿ½9aЬQ_û6'¯ù÷pÓ–ÅbŠÿôƕ꠮Ræ¶×ð1‚¼_·ø~;Ç«ú\Õ8ßìÂê×ùgb±ÿÚÏ’b1îÑ}%JÔ¶–ÊŠË"¤¹J¨Š2|Ú*)¬§­jÆ”wlF#ߎ?nX/v8Ž$?U_ÂÊÇ×]§å!üZñ*Ñ>ùg, 1Óf ÏŒ¢oçMš²ˆjüa « ¦(ƒº¶,XªŒéB‚ ³oï€Ä Êð†FŸ f6ýC›c+Ò¡«¥ææ »Æë2{zñ'(ÄQ@Wþ6$ʼnó¶)«Iˆ²*È£–}X¬ö¬ÿmg~þoü÷ìé‘WÓYèQ|µaæ•Gåwö“œÝºCX~˜cRý>5û>^ùôßåöùüø»³Ï¡´QTËIñ»" …ÍVTÕ´"θñ|ßõ-5œªOMAø¥Çç…ÉÛãðç@å(ýÝlÍsušø;ù;ãbÈüëypJÔüîœCm‹[R(¬Veû6#W.³0£(")e±E‡» 9lªªÔYYÿ†ª¤ïYäÎþ™u]7Q8ÅO âÉõëý¸Û²^æ~ÎÿfŸ;å´ Šª‚§žLÉÚUƒögè‡)÷&Æ#ŪŒïeDŽ|³éª:ü0ÅAO½?<¢¬QV;hˆ±E"¬X¢øÂ™i˜e/©š0PXâXrm†ŒD_›C€ƒH7``î ñ§¶ýVE‚ÄQŠ|Ù´ñïŸ7AÂEEDNX¥°ýìùgý=¯¯øáù§ÎïãX¼ÛX±±-è"$!%j,9(rÅ™I,§×dR¡õ€c†Îú-Ûü/ËÕø9Š|}×È·â™ñiïB ¦ Œ?$Y’|¸ÿÆJÍZ1QFn•æ”gvˆnÔøõîÆùn >ñÁ=Õ!ȱE¬¢Kݘ³²ÓUµš´ðßÁ*+%ùZñNr”E•ˆ"ÄOÚ՟ɱýmŠºXέ–Ñb°AQOg¼þ–¾-èý\ÓôO«Ëû³<{xÊ~.¾ ,”g½¨¬àe~â?Œ™…£Ïøæ'Ix´Ú•Á±øøþéü¹>?žõõùáÆó|i€ Š >m€¢ƒó° ,r•?KuoìflšÄŠóÞÖ²¦Y÷&GÕ³éh10¹—m½Y‚9+O¦Ã1‘Gզ챋~¸`ÆvÝVöâÌóC Æ Í`WpäÖCHsxC#WŒ•X«ŠŠŠ"<º2m«jB ¨Å‚Îñ…œ‰Q(Ha×5’…qâÊÏ›jb±fO锘«Ñ\‹©£¿Õˆ±»@´”,rq@¥I#ª©Ü€£eƒŠ¨}èTÓ~¢ü[Ušì (xã.Nðªtú÷öª›ûÿ¹ãúkŸ}jÆý”§ºT=ì*lÌÅEXˆ¢”oì´__Tr|ÜGóhˆDZ‚05ïÀ(|zv(n¾“â¡°xÏ €à’ à,I=ƒÜ­/ö|bÊØ5=ÿ¼!MâÞ¤PK„µ’ˆb§Ýhê'àO_(³Û&fp¶Ó•0ùôõÍï.–Á÷ÑÞFòÇPùÎ¨Ž‹D1º¶¤5ÜXˆ ñX¾2W¨4ѽèÆû=÷Ïüÿh2~ßì°Ç_¡æR¢Óàë/œ>ˆ&‘i2„ˆyY·.}8oÛ†{&‘ME3ÌïÞ¸£‡8#¬Ÿæ§Aˆ£¬»}Ðå½ gÔR¹+ˆ€M'_ %°åxU”@å"¶<ïÛœ\ÆEëBñ=zŠ·¯è ˆf6'ˆ%€Ö6ºo=ºwºÞ$†qÔò@_òl²Æ°‰&°CÔ$A1ŽX\DY‘Hè+ˆ~>ÙñÍ\øTC(-"zÁøÏºý ê ®¿*ñ5ë^ ‚ÈûvŠ:…8k=²?È<÷?È9Å$ò×nsT¼I*&~墖‚$DÄOˆ!|óûûótòƒåzrÓÖu׊1ÂÐГq#鮽-œÒIñcåÔÞ·~ÞVG`‰ºú¶º ¥3¯|ã¿8a€ÙÌBx¿š‚pá=ôáWMýª¦¤¿*z=oÛŽž—óì<à!¼‘óîkÄwŠuT<ÅÄGòŠH Ðrù;ÁûC0yÁx’@ í­i5£Î7ùëç¾;p ”åU„Wy<öV† 2Æ÷AYÆ+’Ê)T•n`uïª1Ûs÷éA|W…[€éãèÜBEÐ^«˜¡¤iB£€C|‹ ýÀÉœ½ÅÚÊeó@é“✢q\þ>ƒñÙ¯¾¼K—þHS‚I¡ùé½õúd6ñF,E'ûÞïDiÿ±õª\8ðXòª¯9¹1¡ùhX“îÖ0TÝ1*+Á³•Oe‹@Œ ˆpê °Ñ?‚°8F©oŒ"†{eþÇ;#DMïEðqMÉ}÷?ÜI'@è!BÆŽRkÀRd1Ð:B\·Æ¶îL]êü¾Üs@l*Dg ª¬Ñ¥ë©ð±qŒcë‡a µ"”èÐd?F´4=ÆùÚ«KšÅê˜&ÈêÏﱋ ½–‹0/ªª«—Á€±vɳ_Fg:äG£„ A . ­iÕïužüØnmœ²rF½N<ŸBS°@5à `}5~Nª¾½=‡±ë„©ÃUÆ­ggçºCäêÛ¹›f‰„s€å¦ ¨Lb^e¢faÜÇem¶x®”gbóJð0,W•R%µ<[>5pU‡³!•}¢NÃÅâû½Whžjû%œjÊkÞŽþ5±ÏMsüÈã<­çÑ…!ûã"è@Qç<«Ò.)2ûgS™ë>ÝQ—Aé‡l<“‹fÏ]÷+Àp×t4¾+†í´ 1æìN“g(GX6!9ˆÑÍQŒ4jbw'xtÆÐb6|Pc‰©¯ŽŸdÄÚ<î™ÖŠ,¢0ÍjYe²âˆõ†sÂ0Â`õõíxC{°¬(q@Û"ÉŒ•Qn¹O&¤f‰‘Ù/‰×cÍ%C˜,‰ ïɵ˜3Á¸c1Ï‹];ÜFR¸º& „¡Q‘©@(ÊpÁ¦ûÀ8¬ ìù@õŸ} û !€=¥1†aà¸N½|Šu£ß£YlóNÎ˸ŸG†"&•')P ˜¡¼.t É^™‡H•bŸOn3æn9ô'u=ÄÉkê än¶S‡`ðpÈæuXãa±dNüíÛ9 @ó¬aNG·«††N#Ú| ­s?_ë÷J‰e28Q¡?m˜`Ñj²•hªÖƈØéRL-ÿKF~ºÌ¶Ú©E‰6•‚‹ ´V]ÜÁU²ÂÆ­´¥°Š*²Ñh‰d£ÕÌš,É‚«UeEF!(Jw*)ý¿oÙ¦ùþ¿ê?ÚÁy4K)1‡ÿeŠ‰È‡5tf+v¨å`‡ŒÎˬ‘‘|x§­jU°AºJ4ɧÛú3mnzN9›)“r“³EJQ~z¶ïl$Y+nõu7qÿßvájéw-ôi—8"]Jœ2Õ©ŽÑB¥ÎÅlZ6cjjZµcbMÆT¨{—b¡¬£YMU@on!º¢¦p…Er]'FêXÃg/7-­Xâ.Ùk?ìJ°JJؼì,›‚baÝžâ§<ÈFå³]˜"1]ëS;¸òB´°ª¦ïš1+ÿgoêø£¨yÌ7Ìë†\y‘¢ ÐzŽÂp­Ì%E?éɨ’w³;ÏãXTªè,&`è•>] ¨•-»|‡{TäeŠúSdFfÒšˆ¼ºÃ¢‰ïsá3”­äØG’q¬,Òìf̈Å­r`¸$}ÁЧ4¶2¿©LöáÕÃiQ5$öë{îÜŠ´m~ŸwËsHTk¦(Ákÿ…M×SÏ-S0 ƒNj;]nȬXåçÕ°cb1sÎ?—ëBevf F#ékbë¤aºË™¢¯°LiÒ¡”ÿV!Ò R/—aeuö'?jÏ^O’01÷øTèIÓ÷Ñ_wEÏNɰT§e”Ùô£²k?ž÷½ß w›+¥¸`É[T7ÁËmÂÕq'¥ÕÐêÙ‘ ÔÎÆaJuIç–â~Ó5æb XréUÊFS£XðIȾE%rÅRÓ’Ùƒ…² ®àd3_Èxd]Yì9ˆ·2$óN⊕Êtøs,EÂXÞÆÄÞ«¡MH­T]¡dФ B"e #MˆPj›õ¹<šÖº£¨+«€å]è}nîžê–¨W²©)‡#3ôi™Zˆ1DÄ™ò6¤¾SŽ×ò. 3YÉŠÒ&L€²ïªNÆ …F¦»s5‘y•‚ò Àzë]äÝ"®näd–éC£QFÒ¢ª˜Æƒ"¥¦i&SšùS˜ò¢ç)Ѱ!¬QÉÑb Æ…š§±Ã4id(É+ΕŒu ¶XTÛ–à‰ÉakÝt!²¹3»­B™¢SR¤Á*«ùö™Î Fj×¾Õw²†Ev”îU^˜ä!àQ1H¨É7Ù€b÷+[‘6ïöeÄ›Êb\&qk²’.éò/³yBŒ ±RŠ™´².7¢&¨ˆKaìÙÉOxòv ÕÌÊW3››–.g‡l#5ÎEU&9æ®ã£{ä8•¥™Xfî"òí\Dv¨]ªDåÒYN-±°d¹¾#† :«7(ã«ØŠ$UÃйj‰^ÇDgšs;6f5…$Píãày´%¿$ÈÇQ“†vÜdÔ®ë(Äí‘N2ÕAŠq;Pè]ƒ*¹ ­Çeˆfå¾Q˜˜eT¨Dœiéέ—Mø¦+¨48„í=(Ÿ: ØmyA£ã¶W-ŠÈjâ•"1KWÙŒ%T‚è‡0-Ží V"fSG+WÀVy‡¼»+ H½|øþõþDxAùA"„OòûìÍk+R¡— –Z¢œä¿îÝ+Ã3¦X§ Y«r—-Q1Ì»¹Í®Pm¨õ¸âÁ-¢¨ÇmJÓ‹XEY½ü¿úëöJŒEb¿•'}\F[gÒÖ"¸Ïþ2›Etœe˜%` §¦£KË'i7šÀ±^‹ŒËV~;ÃV)«XªŒV#´¬DbqO ˆÁo1¶ §N& ù:0‚Ý b‚\Ì8¸ÉˆüÚEtÞ~솰°XïœáÒeª=§ZÑ‚ŠÍ%SŘ⣪¢'(USŠS]4ų†mÒ¥·áÿ£ÂjÒ¨•+Ë\mµÖ¥ky·-” ¸…w½ï{ðãÆ³µ÷g)¤Û)Å0È#-­,¥‡þþß[¡ÿ†VѤTg)Y;-¨VVˆÄZ—-Œ_mPÄFO’JÅ&5ók¿žþÙ£f¿ñ†(õÝp8Ê ŠÁW-ªTb ($Tá¯v¢=Ò媬X¯úPûut‚ˆ'ÖÑEÒÅ“ÃvËb•ð†"âTV ^m´®CUS½^kW%at‡i0DV¡F²Œ¬ã,DoÏPuMµœÖéÁOº…Ûukl£á•èdÛ6†±¡ej15ú\b£tÁ¶JÊʱYU£†9/v®=¿§ß¼ŽÙ올dž¦'L®š¾ZR²íòïGÙ¤Q6ŽQ–ТV]Y\¹“G Tjfk(æî1ÊT®õM|Xf]²¢ÌnìÓ¦cÖY¸ã**ii²¥Y»‰§H*¶ÕM²Zm0´¤DP®×(ª1åÇ8¥Vbq—­J®®œ‚£4þ·ÿÞ´#ˆ‹QC†E u…bÃö–9ÞOûóv›¾ØT~ë§-+Ó^¸ÂŽ­‡ «•zeËo|k^½µ¥P­yNrŠ)2ñ•DÊÕCäæR¿d*"ª ̲ÚÓ¤Èǵy¥‹*§v Yó¥ ¶¶cql+¨Ë?,•ò‡êäb§Å*p÷”_t¨"¯- RÎÁR¤TÀ¹ T…S&8§°‹~4þs¸ù~ÿæ·íø›~ºÿïXæ`½ð˜ßÝû¦dS Ö¿ .õd¡gl"â×–kÓmfø¶7'ý[åæ)Û¯hÿKë”)¿5Û+Aî‡L›N¯'É£¬yë“üݺ޾pfQ£Öˆ>Rÿ1¯h§ú¸ÜÚC³AÆñ¸:­ÄgHË_÷ˆhTr•a2ãÂ÷·Iv˜ÖÍ9B<ãcls¯¡©Ï7p:yô¼ §cž¥{ö‡oû”¡…PR Ƈ¥­ãH9Öì+–ÍQá°…×FȽîÒ 4UÜÏ6ƒ([Ó”½d¹×ÂÎcçÖYë,tÍ­YS…úB2×^Þ']æ%Çju¤6±^b«¶G\) @s¤Õ’1Å©ªŒvì¾Êm¿¡· ÃMalªÂXO-žÇ)YF+8aˆÍÁ{EøÖ³vųÉhaI¡rÎ; F£º™´–4Æêð¯Šù2ô“ùÿÓr†5_9®Yä•=Kô2;vÒØ‘BÜ…‹ÌTÉìªZ爟8ÖþZÝ«M—/:Ö6Ð#PÚ-zqíÞfqÛ|a™Ès€ƒ¥ÿ Ï ìâ+–Úa9ÇÖ¼^Ó%b±n—­'%)‘ËNͧ¤±ì.%‚çZN~:Êà leSxžÞ² Àa=ª±ì¿1ØmS:ž:# ’’qÁebýCñÝry÷Oð…¤;Då+kh=æ-¨¿`Â~µj·o Î’ÖÕì!ÝF¤H¹­¨ÂP¶‰ÐqOæRhFÁ)ŸŸÅ§ºG+mOM(7ŠQªÔç·Æ~4óçÛ¬wC°@7C½ßh­å;‰åOZz¼¯)ZYáÅdü®±èÞ±xc1>¾˜GÞ'ÛÊ—u®¸ŒR}c‘Ò…ÖœYåÃ=VÇŒfËÊ ÎU çÁD©Xs¶­iÊf3„W¤§‡Q­§X4ÑXøw¸îÄP€i‹'“øßÛÒósŒ [_sJ“#³Xê™vƒ”¸åˆÞéËÝ*NXâ@)îݤ¶–þ±“‰)m´oÊ3ï¢C­ÖM0k¿Ω'®µL9m‹Q`¾U³¤öt†Â9c¦[eVnSÙâL]ߦz¤8­°‘ÌF­¤0!ã)ûÁØžèÉôÁE'…ï sÆl$¤tj—å¬pÔ.öQhøia½EÈõu<§ßÓ9Ì_­â9KjÇžáz¥>[— t§¾v0œ~ ÄBGDïwº¼FǼFfTË„ºäÀå#‹(q²¦“#9>õŒ]tûa{f›V—nVXÕxYAÕæzøBv^ìœ ÀRܦ`¼ÃÜE¸B…1”òÖiP­FW‚Ë[2†IòÒw–MuX¶Ùãá–f42[5ûr/*С øW¡dxÚéÔuN¼Ù‰Úk‰ß’Þü1ß„jõUš¨s.r­De±ƒA[Z­h@ë&n¤LIÌ!*ÄÔqLi,,¶Š³E‚ј(›âëâØZäS!—¼-xÞ0ÇIޙʵ5c”Õ{6ŽÃW® Ù&]xsÃá½6¾¶GÔc £¤Im”Ä¢"ÓmZÜO„V @¦›š1=Ða‚Ý|y÷}x§$Û‰ŸÇÑ2¨jbHˆÏÑ«$BL¢F¥[‚Ö AŠ0‚gׯË—" 7ŸÃ‹xM&Äï“ã“…Î:(î­ÙçàÞï/b‘eW“ŽÑIuñãÃaîXs=* {éX=g¦Ex:Ä+Åé(#»V„eI¾‡7ß”·€ÿ$âÜû:ÖPK–0Y33¦T³ÿ¹‘8ñªû‘±!ÇãBˆwú|<¯U‹ÿKWá¼{!m-…2nd7Œ"äŒü¥ýÄœúÐ_Ñð›iìÁUýõÛço—·².-ýM(?~Ù|µ¿¶¯Ë¾+m5þ«yOŽ3¬š,‹’‘‰ËnœðieTÊxš ­÷a äo"喔е²’˜_Ô»Ò™Ré„b#ôþï7ªšX}3%ð¼¦ÍB‚f=ómcÊ(ä`ŒW³ãƒ¼_Öœæq.Ý]%,xCý–ÇÆW~Ÿo³yÀ\þˆ=’«‘| î¦mŒ`°SÎ5®3•ŹYÆx¼%ر2Ÿê&Ï O®C÷˜ba]ª…›¢/_Oa¬Þ² ·ò%–núû¿Œ¡®þÃ&W¬ Dq¦špúúÍ@5¤k94‘ÑÇ"Ó¢Z›ÒU’ÈÆnê Û;Å5ÁEžŸ­‰ÏÇyd{~ïò/ Ív/MaAaMòÿ³ ð«Ô\¼–4ÿúo‹‘펎›ä™ÂÆÁxX9!ÏMÚ€Øü7r÷Õç8Ò5Ÿ¯¬s ˜k0„p˯új0µ÷_1þ7þ˜^`pï¬ÒÇ"õxÚÑÅÅýH÷_£Ëþ?Vç®®yláFˆ÷0äüÚ¸¡„H‘+ ¯»?%gãè¾Ûº†,‘®å^ø‰u¢n©N…ŠS·&› òxƒU ¿6"|Ž·H?.5”Œ"V^ÐÞõzQd Á'œTB;žÇQÓXKB› EÌk‚²Êqc% õÖqj+Œ%‡ÓX·ÌÐO‰À—Ù‹yÊ 5纶+øfB Èç#H—‰ çV¾5– Mñ«×û» ɘ Ù•Œ ½“g„˜ÌK±ãìÙÚ&+’«°hÀ) p*qΣåÇLZ8ãXyÆ.£Æ1tÀÖK«>¾]›%X$‹=ƒ?Iþì‹~|7É ¿Ïô~ÀÞµýwZ8»^ëß³çÇé¥3rR(~M–*À°!YC$$Á‰kêû¤åXàÝ›n×µù—Õzwï*J ÉB¸MØ8,E« Ù ­œH"‘Aÿ$J)yòú, „&j‰J­û~=‹“ƪÓ*H ¥Ë2“í¼ ?ã ‡$Ñ{z+Ímûœòéõ–§ÏñO\¼ì`.¯’‡üˆm =´@Ò 0ªÄÙä/É[y±‹ÇÂf{×´D?½Ô:¨+~(Pœ…Üz0PýìÈݯí% &œ0Ÿà‰q½²qÆÑlš†Ôùâ΂·Áï„0¼Ÿ#¯/V#„|–¹ þ™÷0ÅéÙõ»Á‹õAÐÞsÇ@2Ec‰o0Qs»ð„ÙÑj(8voIÃãøŽ* ( ïvr>1QÐ+ƒ“±Üá/ïXôý\?»c´œe”±+r=ñ³+êUË´Mg6f „Ù˜÷:ú¼ _jË»Yvé%MûÚß¶^žÝù÷f“»êF–—¾Ÿ:K³]õ”bé›Ó¶í8ré?* ö¯)î9òÕ¡³B53â.Åö=d¼¶‡—Ðtd£¿vCÝWÎR] O%Ô†{(F¦y `6$ÄìBi×Z+:ØqÚPgy­L‚ƒœ'Ý4ÊdºR®Qab;ž˜Jxl÷Àåž,þ\!½Ø6UL´X¢äÚÖ¹ð€ÆfÖÓƒ³ãž-e8®W¨å VSѲ#¯¾:6C('FYr—"%Œ6ÓHp–°` ï^qúÅvž!εÖó<7¯x a®ñÈGÌ*5í†|l'4á¦l™*÷¯jÅò„a…å žºì,v…s6”,Ô¤H¦)J|Ú}œ*”Åpà·eñã+yAêÑ‘ÄZšþ6ç‡!*4;ô ³¤'ú¿ßz#p¦5ì"XyBÜà󢃟=(‘”õ3]§žWl 3·wYs±ë× gl–:[N÷‹p ]!Ø#½ÂxÚ¢»®QkÝ£t“·|ù» ]û¦ð®ü1 ^ÊöˆÆ+$¯ž h£%ÃKáYK)œ˜_WêÝ(0Â|¯¿j( ïkµ]aH׿ŽÚè)IA™ßD-¯´'{vÃþ͈}p‰RóVÊ;j¹gWWè¸h0ÈAÌWÏdÖ˜^9´œ*Õ¦×ìÊ9Þ&™­\váÝAÀÆ Öt‚ž\¨.ÓÖLÖXƒã ³¹G d¢\ˆÁœÂ+Å{ØFí¡'Ë”Ü(Ìö9Cݤ2'(21&ì»sÅ‹ÌaÛ㯗'zi*Â#EnÐx–:løÓ¥Bæc8ö>Oyò0™Ú<ü9öS§\ÇŽ!Š×#Œ`u:Ûlò‡ k‰Zå~ÕXDvNåÄ4U•†cÅïî1áN½ËtycÜü¶¾ñ•zDÛx¬"$"Ò6o™c ñjF È!1 |%îóy 8hî1íŸJ$¼Ý™rZu„ÝÌvÍCÄÿÖ ,!áGÖH4ÂJCNùOHä@S>rß FRV¤0x ¼1q#Ý+Ñ«a“äÁGSå“·!"ctà Â/n´ Ch4ëÁÛcGæ¬0Á™•R<· ½o!BP¯,øöÀFç&ðP׊†+ ”8”/œ—Y3C‰Ri2ó¼ôqÆ*œˆAÆP7Ua"80w ÈpÅDZ<¡®Ò yÌM"5”™õœƒ K8f-jO”^rÚ,íª‡ÆÊó,žJ¾™B/¤²Ö¶á ¸êI Øè•×ȧ&Ž4¹¸ä`@}‹£*öaÍã´•4³ÝÆEÆ×Qå%S++g‹Íi&SÍw˜|ŠHS^J½x«RSm S†‘½Ï=ýô¬çŽ+uð#øÉ¥¹z^9véÇs“ZjGE<¸ÄE½YsP7Ñm%¢ý0«@¯6Ed9^Ý ¡yñ¾-»Åž¯Gîkˆ§YbD³ÌŽ—›¿ÅkÃ1ôœKð[Ã6™`G ðåLŽÊª0Ú˜ÒòÞÁ±F\Èh¯-2“î…Q”LÃ6d.Š˜ç aL)ÑÙ—*&B“L3 ISYEO @1)h´õ®í…) Ù©œ—útµŒDHÛ€ˆ¼UšÆWùLdS[ahJ.Î(™®{EZÖl£áXpx2ªI¼›Ë )-Ä&çxSÊñ0S±gaÁÛÞúOœåB“© ÏãNÇ«NgÿxtKa9Ë¢Þ F”/E–g¤¶kzs]co;„áÛ>1j²Pd̆Ž.Ö)Ó¯'’ L|+Ãx-”°Î"·ûÔ;ñàøbcÉÜ_'a¸·æ`N#¶-³êâå1€T'HòŽS³!”fû(TÈ÷Å’²’C`öÊQSÃ^/C±3í /.i¡ÿìD@ÿÏòÐÿÈ¿õBò‹üFÄOýr¥->QÊ?UšŸ~½ ‹ä€I>ã×`öP?~V6à’Jï«së²éŠ‚9§“UMZ«¬ËùzoÌþ´Y>br „‚~QjÈ0ôŠzÅRA_h ~´ExÁH@{Qì ÿCÚýÇÀǺ^V”A‹Õë°’‰ÉV 9Æ¥"¿VrÄiÐ}{\qó–îïð©z]dï -ìß* S.g£öÿpb%ëy¸Kx(üœ˜ŽwÑåõ_R8üÏû½YÉÿˆ.sík ‰=UÛ«r J±e‡à¸ª‡‚ýøó»ö“õ¿l ü·¾¢ÓiÌxè\V?ñt*rËo,»ÎS·ÏW§ŽM/Oâ\úéfÊ=ylòá´±¸vÈ®£®*p¹¶EXC½CF¼±yªá9é Lí ¿váaÙ8¾XÒ¯ kôúý~?/º»§Ôý]KŸ³~0æÈ’Q÷J¢"ŠDUCý¢ÈÂ#ÿµ + ªþñ’Ã_ùÉXÿóþövŸËO÷μwÜb¢¦6µb‡üfRT(ÅVÒ¤&!ÿó¡¡ :i”¤L¥PSEf0…Q{¥bФPÕ êÔÄâØc$ª‚Ȥ¬TŒ›·hJ"¢+ZŸù²ª(«Å¢0XŒŠ±ES¶Qc “|И‘f*L@SH\Ì B 0¬‹?Å ÿéŽ0Þè²²Šc‰X9Oï”TE 5©¬ªŠ‚• ±YieFÒªój æ’ê…[I·Otšq…j 嘪Š  ª †˜4¨ÄE¡UFE€«¨m‡Œ±MݸT‘ll¢ÂÚKhª*$ŸFUê¦ ¸$Ʀ0£R,UŠ,Š MöµRqlY‡ EdPYR7‡™j©Ë?þ0Ú·[båiŒ1ØÄÿŠJŸ|I$Ý3ñöŸ¥ÿnÿÛDTQA_íý¼·þÐ'ëæÒ)õÿj"è%ú×ãõþ›ƒû° ™îU ÷Cÿ›4Wúx÷®}hW.E=J ÈH­:¡cc‰XÏ™h ‹ 0µŸÎ͹P²ÿ[+·D‡WÖ>>?¥Î'á%Ú/ôÊC$°Å§þ—ïAJÂZ³â–qj%Oûeó¯‡L ´öÌ:K¥F¢XûÕˆ™´òQ3ˆž°[ã^°àÕá;gúkË'a“çã6Š„*¢*Š Љá2à€0 ÆÈ. ¨3hÕNÑGnà·§x´IÒH,9B V,HˆƒB1$DñØ3¾B éC>•9]¯_"^´pÂqª"0(¢Äb¬` ‹°ˆˆÆ"ª±bJTÚûâÌJ?ãEFFLÓFßÖ‹Š‚£üE@t'ñå&TDŒŒDPA+"ˆ€°UDXˆÈ,"É"¢,T‹"€ŒYV "ÀR,PREQdŠH E€²1R,P‚¨,YH ’,’ I€ °PP‚€¢È1’É„PH1„QV¢ ¢ŠAdQbÄ`ˆH)(TXE‘bÁT!@X  ¤QBÀU’,‚‘Hª²TX °"ÉŠE‚Æ$ °ŠEY"Å ,‹R,‘dX¤$X,X²Ab$H«$UUŠ (¡ Eˆ‘HŠ‚’(¤ ±Ab€¤PX` €²( )‚’E‘E’((*ÀX ²)"ÀXHÈ‚€ª¤Y"€ ,ddX" )(ABE°U"‘QX ±EX)€‰AIE$X*ȤUA`¤aQR QAH°PRE‚Å$ˆÅX¢ E) аXˆ,‚ ›ÿ¹_ô¶ý,¿Oÿô w÷cM³ˆû×óJ> ³ì#åÝ_9Wgq§F=ÇsÍÄYÈÜ›Lã|±?Iží;$l[ í¾—ˆj{dã?ªœèÍç©ÚPÄÒ/ ‡€°Iâf~‡Ô[÷p'¡þxôÐØ×“ØÙ¡w>W³ÆJë›»ÆSó?-ïøv};ƒëžŒéYÀ_*nØŒTAŸhaIcÚ74–ŠÆá¤b# ^ÂØ½DÖž”“BrË1xÌŒ$.ÑzN!ÜÅBÀ,Ü×Ãà £'hˆeŠ´"ø8œ‘c€<³UœL†k2ªO³†EsÔX'X×ãÇ5alzÛ=ï¾Û­nùØúùð¿üÈ}þÞæÿ@·×ôÏÆrž‡ŒX×Óó—»³ &ź,û©€5Ç礞²€Ž §@À+”‰L”`k?Ön£Hl´—æ9]¹|ÇŠö¨‘?‡g')ËÛûy~VõïóôùŸöþ›ü<}/_»Üð¹ÁWÿ¼T$O?û@£ùè>ÿÀ1ÿNÈAÿ§ÿE¿Ò®ÓI—£¢$MrqávpGwu@²1TŒ‘¶†&ôXÙ3ÅTkd_”fJ,¼BšÆ„DÈÆDN¡ãjÓ8š•vJ†E¸Åf6]å äjMƒy͘ౠ¬|j8I¡`±1dP3&@«âÔâðX5ˈ1´xv¢ã6d“ JKÀƒȰfLTrˆ’E¨ÊÌyl±€àä*à ‰¥†‘G]Îr Q'o0^ Ct肘bo–㙩TJ#j Q(fȪªpaVÜ2g*Õ\ëH­Ã@ÖLòtXÆ6ô1A9 ñÑ0Ñ$@›"HØØ„ÈʬvL_1s+%I ¸ ªË7‚Р]"3mäè´(Æž0.4fÈO'|⌈t Ì ¤æH8À2õÕš†4äR#l:áÈZ …C UÀت§Pàè\@W<x8ªUMÃpùbE0 <ˤå¢q‹p¹'Œ ‚Ѭ[á‚rêNGt‚…,sjE‘ÌÝCràðcvSÀ6]<Ý¡\‘|$j“µB0…Òƒ! nÜ‚ëWŒ0 \>RB „¨lrMpEÅÞб ðAD¦X¡¡8¬ ²ÓÀPØ‘Ââ.ö͹Z*B+mñs‚íŠäÅ,9@Óì9»Àc©y]^ùÍkhñ Ø‹8LŒ¯Ç Ùå»Ûã½{B!Á¹€AÉŸ*Hs¶70%i$¦ÈÈ`‹²Ùº7aÑÙ(' í¶77›ÄA;N£…‹¢A‘J’¤ÐŒ4¨›±œŠ+!z€Ý„3©fQ‘±™`ŒÈ;¡ë$šXCÖdAŠv‰p¡ÃZƒÉÝç9þÀ·{º:;qZS"+­îÌ†ÅÆ^^äæ®KË[Šg#&5\@¡LÛP*ÄT³!¹;° 5y7Ž¢H•Ä2÷!›NèoeƒB+eåÞ5·'&,RvбX‹zí ïú³Óõ–·;èõ/µîÆgúJʸùÔ(Ïk­Å&Ñ»îʈ¨¹‡j%ÆØr•òàœƒ;6 –†ìíÅŒ/gSW¼î1v,«w*ä´„ËFa)¼—ÿ§eð—Á³[ ²ÑŒÊƒ¹“Sp§XÏú²;ƒ vnÓ˜ÞïÁ8i+SþíÅ…Y—´Íî]’(šp‰¾H“jÌŒ‰I«Fs°œ9½Úî´Z’ÍU‘5tä’ d;Öè·C 4#/&îÉȃÍzQ3¶ä›¥È`ËAH˜€‹ÄCcƒL®M žÀÃri@Ê•ÈIÐ|ÉÖ1‰gÎVÕW3`nÇ8 G Ò ŠSÇÂ2îb\T Næj5LRšn;Ä$2*˜€FbUhˆÂ„>MW)™2³qœI‰ ɶ¸Ì ¬4œÀ@Ï ‘E€Ák­mÅѤ6]ðÑØt,“¸ÕS@F\+¹8gØ¢EÜS˜s Ž›€ K[–r”;þ.[ÙAƒk…ãâ‘ÔÞ:½‹Fº 0Ÿqr œ†ð8fÕh¢VR ®Ô4jb!S¸AlDáU&¢¢*âQ ÜÖ¦–Z»Å®&ŽWÉ ˜æx„f‹uÁÉCL/9e˜£5J Ñ"dUd¦FÎdG!0µe㵎(F,—JÖO#D·Tã+5«“& ʺ:H2ŒQ{6ÉnÎp‘VCq€;T5Õ‘É2¦Ò3F©ÆZx­pn&öâãT»°½³ªŒògL_1¶æR›iJÈw@¡Ë#S¹ŽJ\Ýbh¡pohÈÙ½©NÒàlãd¬Ë …H¡„éÅ;ݲħv511<*kn4¼'þÙo½«=ÔF1Èë¸"—" ¬Ê2ö/†jTö,Î8¬¦'ýv ¥†â¡þ‰l’'×:ƒöÆô φÐKUÁ MülV ²¥…âÅó€ÈÁC3Wüª}Wd) Ž±Î¨g¦Zq©$Ÿ¶,ŽêHbW– 2“‹5WŒ3€‰‚–Ðò|ø(éu˜!^lüö·c­þlˆgÂn&ˆE>Îqë¼Ø$èû ‰=[+ZgýëC³B!Õö™4ÿU{eÈd–3}šR‹f%ÌͨÌ/6,79õvqoÞpç ³ð®…k æ­†Jå%’¿+µJwZXc ß©Ð#„ѹ7`üp°B8?Οùþ×{½L486œÍ´”%aô†çF|`°0GÕÞ" ¡¹ÆqcèÕÈ—'Ë@i#îñ9Ñïî·u“ƒ½$QDе‹ó_—¡¿צٶ꽯ìÞ0Ϥ2Ð ÖùöÄ$xp~¤3å O±éß1˜!vð~~¸¸$צwÚ¸ ˜”lÄ¿6¶4Ê­ºGJñÖ)\¨Ö)3±·åq,嵄ri=š0Šßº.u¶ jÔgE¤µ°·WzÉoUÕ¸å0 œeV[egšÎ±XÅdCvQ¨[E¼ýnµ´°6õù6FÁ² _PÜcªfpׯQ7ß~Ï_eæB„Râ Å sQÖ0;ôÍ€H’ßϘad`D:@f³´>ï·Ÿ }esðßýûùŒÄmtŽ.A×lœ¥2¶Ä$!¼Ÿµ¦8Yõ]o>r~½UZ"ÎA.X`p¤ÝÖlhQ¢¡œ¬ûuy®Yò‚lSCcb7šÍ¯“!ƒçŽM,*^06]+YŒZ޲öú> ñ{?”r@‘ ú ýPž¸öhpï‹'U‰t\«‹ PP\¹=ЉdBu|d½Æ4S&QÊ2ð)] ÁijUFÄ ,„'6°Í°Å=Ü݉¤𶇢ÚÙò Â~Œ€~ÿ jGï©ü0°<µ…xaʤòí›Iøû\g)à '_:I×5´4žì9IPö{fq™ÆsöÐcöIʪiº,ŸL6üÐíŸTô3ÛŠ½†{>ÎüЬ‡ÔH |˜zÝ11£YÒ/L˜ÌdÆw» =uÆL[ç4Î}Yìõ À×n3‹/Ò®7_[).w‡Žý&ø$ðÚ[jOaâ—‰ç;“.€i~ú«&˜E`™$;j’@ÆT¬Í,†°KÅâ§8g8#ˆ¡Ä€M`:ÀÄ2…÷$ l{óñßzã/;t¾ø;iåƒÍgSœ3˜‰†dú"î)À®ÜT#~ëä­ü‰ fòÌ&DÝ@ô”KÊ\©aÞ f€Øà‚ ÄU\òurq[N–ÆÀ92-•@£­IâiiE5 Bà&è¬.Zv% $Uíj>¨å ²xÛq\Sp…•<‚å¡Yq€‡!ñ—P"× ‘7†ƒ²5‚h ‰ S™@Q‘)6Î"t³2ÛŽ\ãc^ÖT5E\(ròÁä‘e L³A!ŠjÚu"ë@™«eðŒæCxíB·-B.9„Í’ÐÊH§x‰Æa-¡L‹¡,2*žYoˆ ê²ÒXG kHË—Ëh»¦(áæêæJ\B´«J@^¡gjßD ™“Ê?öF&¬=رÝÞŒ€£DöW(†å"±w¥ÍÅ)Ä)šäÏaܨ¨‡Xrê2;³ÍÅm«‘9Y²fâH"å7§ˆa Mî,˜U¶œeܘŒ-dãI0ÞZÈ*\ËÝŠÛ7gd‚‹Å,‹Ü¸6°\%KhÕØÝš$åªÌH¸¸º 93Mæ nÜ%6ë µ ECv”ñ]Jäß È56¶D °¨:–ntFMÈØ²œr†ÝLˆ\i©%±“¢†ÕeÅ®*`^'—‹©yhQ0"•® S P©FÌÕ"0vn4v3lïŠÝý“IÇVr•éãªpÆp7t‚ˆiùëó†bm‡ɨ¢(Ì®Ë{ùF0Ê¥$JJÕE:aI¨WHpM„,ðëwVÄ*ÔžY ‹"ê“E1Deš€¦È¸á<æÒ’ˆ|ëwDAÛ;EÆÛ õÝ2“¦]ó΃ƒo»‰¥p§ÞrôÔ "/mœåáØëW”ãŽB»CcYÛ&’°ãž®µ Y±FZÃÉX”h%È556 b!/›"M¢Ñt*X&˜ÈCPäAF9Ù ŽÝòȉ¨DjO[¹bH¥D‚a‰"h€¬GŒÝÌ2µ†œl,å¹YœRîä6 ²‘"G1q&RË®T*“‘…™`€ cc8ÆoHrë8Ù«Í˺íÖB H§³¹ 7à._#e‰@V6Š !r7`ÔñÌ…ÈÆ\ÐC!Q†©Áwwñpß Žsr8ìÉZÆMdÖrZXÚ¨ K@P¡@RÍë:ÐXnéÅj¤ìºÙ“‡"én®\2lìš²”Ù;—¥¨Å[±sƒb.çh8:[Çv%æ\ä´8—¤ÅŒ"­IHÚÓA¤:®ó&­Î ªÆ* W©»•w3qº2NÎ[°`¤c6c @ hA•Ì… ;qª¸dÈÄ/M§É•¹y[6%‘q‚u*Êšq{‘’ãhU41 YFµæK–Û—RF1 Áã• ºeN†)S­C`È—(Ôà¼n¢™)pƒY⊩LΘ%ª*ÐDÕ;MÜ‹0 )šºŠÐâ0´XÇF ;®¢ (A¬Ì€¯/—2D zò®îeÄ £›oj(3dT!§·ÐܲwN¬µ3t ŽUIVÜ$FS§ŒÔ pîî]PÛª¦IÑ2XšuWyšHÂô2’Ų€9LQ Mpi‰$…RæhŒáŠ LLpÝ&Åâ”wÉ›ÔÕÎ4Z›ä8¥AÚ"ˆ¥Š"³ N6ŒCE[§HÊ¥'’”ãH<1"À$N*« C˜™m†Ð‡ÅÜ:Œ9 Ó’êÝ]{çÿo9ÎÀ9†ñàñÞ_TŒž<ðú¥™yTv‰˜JŒ{Ùò®‰ª¡»õ/9‹‹bÏ áåêï‚æ÷nR €=ryBdYä»îÐ0B î‚…ms S‰å0Øá±+jbæYC "·v$”±àIë‚•õhÅv q²t¢Ãg½õ)ípF7Ø7aÖ8Ü|W,õ¾ad(³ toqBììÌ¡·6Æ]»ÈŠ=•±Rzy%v•åspKÁih» ŠèIéê¾Ûˆšäts±YDÊžóŒät›&Z7•xã´#o~ôôøè÷²ñ*‚nžèàØ· ‘TêhUm'¯9mÃ!*‚ð+á©ÊÙvÔ®]¢XsõÜ’]èH‘¸F¶vÕf Ì'fBê³rVœØJY¼¼uE ™‹‚÷,ìZ¸ÚéÀƒ±xO9*å‰$‚ Ds'UÝv82J¹fšPj&VµXpE"«h¸Ç+ƒcKÑXÀäV½bXÌ’rÄLݽחNÁö'/Wg,éÇ7e;UkŠ·ªŠ9‘ÁËÐ;™’*<`¡(r¸ ó«9£x0aŽ@ÁaŒ YÆ6Âc&‹7Ôѵ •ß_õùóœP¦¾’ÆìJƒRà£Ãòåµ³mó†SŠ«àU536'¼º”ä¼§-<ð š.SAVÈ•l!ŽûCœ@€Jà8 Çîß|ý—/V¹1\:úÛL èÛÔKŒó<˜æÈQÙˆÑ ¿÷%9E¡¼D}Up<ÅÀ,W¨H½¸¾“"öœn”Õ/« Êà­§œç+.…À’šÍET Žòi ‚œsb¨`àZr©•puðйõÆ, ·©ñÃ8)§™8 UNÀ0"7wTf„Äðó¾–]pݹN^•&ÓyrÚ3NÐÞª0ÓC|ÙRc[Ó·RM#Ý1îñ…ܽaŒdÓÎDÊ,e§B󚚌[jµaƒÎ4ACð`âÚÚÂêç 1aFÄÞRд04‡øPœÂxh8Èsì(ªûì½Ø\CŒðs˜/çÞ¬½…B#vgÇ¡\TL ‚(Õ:«˜´ÃNêò*vîõ}Ö3P›¹”…ÅvD‚Äÿ3æT]S’X‹öXOz@Ó‹z,‰°¯ ÒÚÜr8L˜‘‡j;ÇÞ¤á¥9s—Y,­‰º‹®VÜA/f¶ÄÉ¡R0Ñ{¢™¼ 0…Ì$ì «’Yæ9ÎL¥‚3“¸„.¶¨ ¢BÊ–@ˆ±토:Zî@B.D £ n'p8«Ù›PnJÝÖ±»—v 5zã`a1¯ªDkv‰L†»ÑDBä8#«s9tdû²ýKç{†›à»"üßUß…cèHìòãB™]áçH$˜žÝÆàÍ3*à}Cä«êæW~wΖ‡Ñ}kŽ«&ò/z1ô€¡Ö\äÐà¦ç“?§ëÉWú)íMøˆÓa“=Íi*—®o'dZ»Ëp' ”mΓlœÞ_&- ŽF—SpÜCvññ‘[‚’Š:‰˜y&i Êl‚'’¨Y˜*í¡eà/™C‘&¦‚¢“×AP‚.ìW!p G#ž;Ù¾YÃËrŽô§.Œ•¥Œ¶[‚ÐÛb DÁ×7†ôw¦öñÅï®w"T¨b߇CÑÞ'‘•!ÝÕJ2Sgÿ„‡¼öG½Øï´hl8E¦ä*¯j‘»ñé³>^B0P±ãnEaÛ“ïVX'Crã60J¯¾Ûæ!Ð0äË)-‘^ ˳U’I_lhËeýáb-UÀßNGX¥-é©5ÞêÓš,ÞÜE¥håi‡dmJtZFãÀŽn9»lB?õ9«£zB£†“ÊåŽË1iÎ.3”Ããn7Kh !E±Ã)q/|ÓM&kZÔ &ó1X D<3šhYbO…èdGÂs‚_…Å —‚îÕÊ?Ðêžû@ÎÈBÔò§ˆM4¸¦Eî¯õ/q“Loxy‘ênêØïyCeÙ÷†ƒ }ÊÀpG ¸=£Ø-YYwºÙåz;^ª¿ =•¸G{~ï/Z!=xƤ$ˆÐ{Z2È9vÌÄJ‡PðK»ŒPßV ð\ÎI‹Ó œ¨QRY€ž#ÈÃG“*j …6im‹#$G'‹›Ã€ðŒ¢÷a… Å‰,"]™CÂ;nÀ-9xD2uf÷@ÓwYdÅæÎd jÌMÙ§°´ñvÝÙ³!PXÂq’ª¤£SkÅ_<ßM"œÅ]·’… kI¤Qô4Þÿ‰bõqg¦Ì`M„,ÎÇ›Žx‰›õO5ÂcÕk£«–¬Ø©n.¹K5dΈí*¾*Õâä Ú\ŃAµTA!ÖY›òó‡rž8ÛãV§ccwjŠ"«™™^ËEX ª¦íÞ–Ætï½Më®ç\Dz¨Ú‹etÖ">`âl‹4ˆ!“¬•ÁBºèåŠd›|­.7E) Ù@ë9뎳ÄUËEDWÍ©ÅT½8e*ïO ¾97:뇈sLËQDm %J_72‰J·Ù (ÒAn÷bÉ ¬Õ[ïJ,¡ŒRºß^m €ê¦ñ«×FIBT£K*%MÁîd¢Ó²KzTvØtFî÷«S.f¹@`Rå[àRMÐÀ™,, s’K‡,+‰L ™c&¡€Ë³UÕ4Cnk— º iÄ(5†ÍR¶”Gšf@¬œ5Àv…`Q ‚Ø<s•sC"«g±½ˆ"4/9¥ÓzÌ¡0Ä¥ÈZd)@² ]. Ž‘‚ B’4d‚yáRMª£ó­^:×[3 'ÓDE´¢'vyBªÄ5Ý1g{ºîÞul8ÕÍ í£ AÒ ”*^ÝnÄx,Ó¶šÙÈž(¡Þ‰¿J^0qƒ·²¥_V‡X†Ý>}Ý=ûj:äáà‰á>¨¤CkÑï[–OHzxˆàDQ ½A͉äjç±ÞmÛÔèõÒ"Sž­Ç"…ÀŽáÊž•µx#mªUgi„ë]Ìʽ¹uˆY¥"Eà5je²jèØMV 9ðK—($D7EàÌRot›Öe*–Æ6†°½5ƒ4Œ·X%dãEY­"\–à8Ö¦f ž‘…E„¦. ŽpUž¹Õ¤_ #Ëb9µ¨^#¸%×wÆï™‹B44Ê&«h“D/`¡‰]wÈCX¯–ÙK[>¤#{tTÍ÷{(+îuEÄGcpðl¸ Ý_K:"¢æÐ1…C¸ ×LȰwƒù‘) ¾‰¸\IÒTãW ¢¢¼Á܈. K (M××ʺéìsO |\E‡iÒt=$;Wi•¼nâJ×·IŽž\ ´¥–x¬ÞB¨jÒ¿ú¾ûÃÀ_ò >ÒzÐô&/µñí(™Ë-[ÅÖ·˜†Ù(è¼äÆbçŒÓn<ë­“d1äã0SFÚc‘¸¨‡l@…%€Q_,ÖYÉxËÕ¦Í]¾MºŽ5Ç×V7fçå¤òé xÄ³ÃÆ‹¡¢tÃÊ#Ñ7Û)åгZYFÂ@¬¼*`+Wajæ{–9c¤ `"(¡Ïů…!  Ddôâ°Ç¢…2gëTTV%0²òˆ7R-£1,'7nh¸ÊöS¥¹–ŽÊyš†"vóaìfK¼$DÌí,š—–1µQËfœÌnFíbºbæ]‡U5r 2#rÚ“ynµêÃW³pÌQ•Í X=¦™¥§D ɱ²È"ñ xàŒ#M‹BµY“Ê<¢,ñ¦(Ž ( ÖÂ?ãÇ6[ !=YHiƒÓ6ydƒf«LÝ®Føæ0(’béšµ8Þθðr«©‡H½êW¤Û6ðZÚ¤qÏ*…uP¢BÛŠ12 $A)GaÔ bÌè2©Èœá ¢kƒK›ã bàæ³°öbÈ "E kq{ÕÈëL¬PDS¨dÕ@îP†Âá| +.-ë |ü‡§¾h%éB õ0¾D ÍË®y¬Ðÿ˜í¶ëY‰Ö*¶ŒmjD´ÔQ `Q ð@ç¦OÐÃz¼ç-LÍm¨´‰ÌN"Ë;B¯q²Ӛ݉ØOc3F(–?ÕÚÏh¸Ÿõ?n Vãé"0o4zñVƒ NA9"ëSÔ:ñÆÎÞ1%¥Á–Ò­…Ué1Èi7¢êµ¶²Ô 6JYAe¤2Ñ -«–êÉ 4 8ªu Z }fDDJ$°¹S§oCݲ»VP„D†<ñÏ=뎻ד¤¢Ãýû¦ `¶>݆%ïÄÓ(Ó® lYv¡‹+›±¶:ªo$ÁÏLó’Ù(†jÈËçG®ksŒÞúñäQQŽƒ)<˜K;­¥Îòx èódâXn‘¬óNáÃØÇ7!*€R'”=4ru¾!¼ãĉ<ú !¬xÐWæ9ÎÇÝ/qs<þû˜ì‚;{Oè™*`aÛ'ñîªä™ÑwÅÁ‹ ÝCíB=nÏšB1ÓÌîhÃçixNHŸeÒêAòÎ×*ñ˜¹»?O²¹á‰¡RlØ;Ù½2pÀ?Å=Ž^7:>6ûqG³­òg"gòñá+Íœ›˜cÇ\ÞE, (,æ„"¨ X†Äù‹`›ø º”0O 'ƒ“‹†-$FXw2KþÏp!q˜$Dßê[Ü{ç…pG½"¡Ý•#–2:1¸ ™÷ßTˆ¯4ÌÕ̪%ó”x ¦1VG²v"R@Ö'ÊÒjd­väVdÈ…kR•8#:E§xHI²Z9NManANe£Y³¹s9¤\7¼Í Ág•7|"ɰ¸*\Â[ªÿ[«ßA;2² yD‚7Ü Ç©Cæ±BcÁÑ]¥qÆPôî#7våÔ:@‡8ïÜÇœ‡€œóN€Q˜g>Û‹~Mô›Ñý_6¸3BF|™?@‘ØêHÓFª8 7Añ˜mûð^c¤]ùÝoþ†>Ä*‘Å÷¾g ³§¾5¯Ã4xHZ~«È´|À$pr.hEp _&/`æLÈ‰Ñæ³ˆÅ«yûÁÆ>|7âŽ÷Öþ1ôA× ¾?yzyy~K w¼ç‘‘ Þ,ï¸é¿9<ÊÛÙ+r‰5U¨Ä9Õ€wb8‰QA¢ p¸6بªÅQE•*!—ZÉáEJÔDE‹-bŠ¢ªÊ@ârk«Ç›ÍµÎBÈ)0k'î6°XÇðÑ|¡á¿<²;ïvð­Õ>d HÐÁ±\à×V²$ð™~S"üœÚ™(^¤§‹‡‡H„³rb ½ª\¬=6lVvãŽp[”éÅ €(º@pP 9 ¯AÆ0ÊÌ”l^‚FG|o£×'ƒéXÍõ›Š8¾Èb“÷Üç$ ™1yBÊ"EŒÊƒ~ÚÊãÑÒþs÷–_­á]ºÚŸîp£ÄP<ð<ÃÅÚø¹Zkæ9mh ýü¿rîXˆžÏê{"L…Ð7ÓÖÉÿ×@w”E€‡ð¼m¯¿fÌVV/ þ¿!ÁŸ| ùñö@±õ@ßà71àK iw<<‡®ÅÕÙ£·ú­¾¾MriàÊ®©Øéç2o¼/iG³š‚g³Ï/!–ùë÷ppqxWR£[IãƒÉb'“Y8›½‹ð¨ðLp{ž÷¬.™“ÐEˆ†]?¯êkKÙ!Æ\©’©8D2Ò7ŽŒ6+¯¡³Æx‰Ìši¬ÈÏ w\®uNôL‰CL,ÛCC´"0Å`¾sÏbÌ0|»°àë„ç¦ÇÌáëa¹¾õž'(õЉ®hN–s55ž:y[áå䆯¶wà -ƒ\0ÜTüUB«v»Î?kú.+w£î0h>Ê‘¯¦·šµßn˜ªCÓôÍ=õâfáfýI¿5t¢¡ÅÇÎ ‹™4óEîÌ 6´æk× jOp‚Å9±¼W6- rJÌÎk“5ÁP8 ð¦FÂtÙ¶ÈŽÍP2,Š4Œœ[ó4í ß4\NL¿h$óÑ~±@g #űžAäÈs˜¡âïRB#$˜l®Þ>{ß4:S»xó¾wë}x0Å?ús67¹5Û¸zŒ‡ÓNZÉš1„1X›3œ‘1|±båqJK9&[…ˆIÂ3oJ9Æ8E£"±› ©¤a¼@£‡z$ßv3²n™ãÇ:1Û÷Û•Ì¥ÒÝQú¥A?Wן õ >¿¼7Ó™ë1?Ÿ3Ýs¾úˆû8ޤ‡V¯MWÐæ–à߉ì¹ñ‰úÄd5ݺÖót_Û1ëòðfÆû~?4¾×>»j’Ï+…{ö‰±M9ï> <ËÏ—}ôüHkã+ z jÊ«ÂС–æ¨Ô3¶W+rp­MΚá¦ëš [$FÈÐà˜oH€@$xqFäËÑàƒÈá7(>?·wÐMp|.þµ<ž@öûµè¹—0gû^êûŦøìjXÑÔ Å̸?aOÓÇÑ.¾\×o÷¯@üB ôpÑ‚^§W¿%ØÊT_ÍO0מÁhµ™µèíáí1Ù ä¤o²ê-Öö¼BÒSú®/zÝòhèyä!Ð0O¡P¢(‘Cœ8œÕeï̉-Æâ0A‚&Ûd’?úî–×½× }pI´JáH˜¦¯ì €H󹌇¯dP ŽªÉnØr îyŸ:æåhWzÝBÈZä”+£^;P'µ]Ôî{ŒYâô.ZùsÅB=;Ü=©ÞBmÌî±”a`Ý ®y»›yQ=äÝèf::;È12ùœ'–Öñ…Ä-ªƒSJ— ¬ Ä™XX1Kj4+¤ðG†q®÷Îoªy;ž³¯=NGMEU§L%¶*³„>¨C [¨A¬‚R.Ä!$nŒš}}BTǦgêúäÞ‡ÂAå™þ¥òûߦ:B8‡© ó1\¯Ï‚É$—,ðm!rnö… Uq <çµyÌ=åås¸)ãìûdA‚ñd} 1êÖ‘Isƒ|9Ô‘ÃÍ*ÜÊü9|GZ<Þ²=DZ¾‰Eì@Ó„ØEêÔÏߧ誎Ã:0£;ŸùO·{ø|ž®I’@ŠÇ™VçÙ¿{Ë”ª…¾è«1*Å É ST$#qszäDÜ"c¢,·“06Eß›<¸—ÈJ€ˆŒ³YÅ "#î…dˆ1`£à¤­и•S™¬©@7P3ÁEÖ–ò”lÆX¬‡ÇNÃþU¹ØCìÇ÷z ¸]¹ú{/´.9{;Rüºß¯ívÄý×»ÇÎðaE#×HùNwcàg»w¾?IOwÖ!ô¯ˆb‚G¦¡úâž¡‰6ÁNyäÂc7g¬0òõu°¬ˆ¹½¯Œ†`F Zæà­ùä®B%÷÷X P„p„iùk‘ãÀ> _á°#ý .Eœ˜°E‚ø»\!"2À|Ãý#·ÏÐþ~ßcOéÄâÄ’$„$I¨ü?—ý¾×_?êd\^X=Ú†?t†}-û²Š=ÀžJƒ'J6rswrQIÖ"s ÊKm(¸‰ç•ûBõpYd˜L€ÀØLÁLȬ€ûËÊìŸsØË‘ÁÎ SD^ ÕvV"Ì›¸yÚq˜ÖfÒƒëÚ‘%Õ…·FMÄE^I–ŽìÁˆÜ«¥£æêšb¬Tf=°Öˆh%¯mE$vb mTVPu/)QÕ3"ö7KæX ¤ØÚ7•²íÀ±WNÔ›ÚºÇFÈ›Nv¨ÛvJÅ ¥NlQábhD0xH;¦`Aê Î ¥Ü*à"V*v QÜF›‹» âEÌ]©S´ªP•;mÈÍ g&f$ÓÝ’Z†ê¶”Ñ)FÍ⪹·s0vÃZâ—0Ùf¥2hÝW’n|qw'LÚw˜Q­‘0¬ÂÀtÊS) X…ÍkvVq|¼˜y Ó¼)fqb!w¬]jU‚!f:ÉRÅöê6h6€àL²ÇcÝÊ%™²ÞÃTp•…X<ŒØÁÅV"Otèˆ =1­¤hä!J!PE…K#±1¬#ÈZÁ6p’9påŒ*+bUm 4EÁMT‰²óŠªÇIlåh;l€‰%Ñ $ˆ"Øc(M ¡µËBÿ^Õe;‰Ø`”#C\ B“`G2ù]T̘<í‚EŸös†$Šä¨"ŒIVP0C» 1b"$×™5^ó6i«X—SÀHKPZa˜K8PQ”äq ä5Ð# H!nâAª—Æ4ä |“ć!£9±!ÄdÉX0vs ÓÄe¨ t?_·´QŸ6l*\DpÇ,Þ+´žAæ¼'XÑ©V£R1‚¨:ÔŠ¾ƒ}¼bÊ4o¥ÔÒsfç°$a¼v&–gi`ÙeC;Q©VR†f–ÌÆŒuNá¦iB„Ò ù³ 3‚±`æ(*ËfàÈEV÷§%VN‘/G`€Jéx´²dñà¸$wÁUkƒµfÉ÷yPvCQ¬nôz®ÝùLl ÉÉØÉÙœZÖÆ{@Ú¤IŠèlèœoß8h &:ÐIê-=r Öb¡íé‘|Æô¯.Ÿ©9¾ÎXÑÈ£cŒÈ]äÔò<8&ã•Rº¼ç‘Âïhíêê¶&™çTcÀÞÀC’x¯«eŽÿEO 4<t}ûjƒÜöü:N ÿÁ*ZoùqÑÏtôZS±ê®ºÍ&ôoèß Þ†=W•disàA'jùÚý÷P»¢ï£c'‚´k’瑌n{ᳯö¸!½ÕW¡GSÃ=Níxø½L›ôò´7Ž×‘@//|èîrÖø›ÆE¨Ù(åÖûòg}ˆˆB%÷°€o|̇løMÐY|󭲨8M4<Æüš9*Šëî¦~³Î^}x†W@Fª¼4<‰ õÆöžp4Q†Ká¡ í6&Øðd†‡ 4ÜåЬHžaµnÞnåËRj5ÀŒšÉËÙ„°«±hf'oNAŽ2CÖ ˆÛDgqFMìÕávöã}ú‡9ãRKåÇíÛFM݃c|0t”PbVyÝà‹8RÐJ @$-T`/v[Ñ-z$Àƒi‹Ên)øzz,.JžÆ-v²JÜ‘Aq-Ë–{·8nk¡¦ºàßbäÖÿ$ˆð×O=#èØëþ­ýO“]oœѫ߭Pà= álv–.e/<UAâ,ʪœ×‡{žd“†§"s9zкNùï©»Í×f†úü1_È}ÍK¼9ÕÀâÍl–ÏÄÈÛkBìÎj•Þõ#lÍ:àï§:¼0sÀvnD¹èÞj" n„ô‡hž#Õê÷²›]_ ãÌc–@X@ùçœ?e±²˜{Ü÷½ÓªÈŸD *8%PÓëén—ÿ´ÜA·ëžwÓY£k¹g%F±©–i«¼G>Ÿý8» hé6‹AÍ ŽYáN6,l÷qÕ`´#6渮äMFd@Yü‚Ê (¢Tþ¢::€Bè_Ïp>®æÄÐ&«ßH¨@Š;•{áÑÁ2Þ\½š#†§5(,a{Îã=×\v=^¡ zë}9Xf*¹­XÙYç‚@e™É­oG¸©x]º«fæÄD¨‹¹ŠåÐZç8÷ÜïI—YÔ4A×L+‘å1LÃ\,‡ÃÂHÚîèó>îÑ™ÌùÒ“ÞýÎ=ÇåÏœô¾¾ýA‰ùŽåü#’†µ÷U&ñÇqç’¼' ¼ðyª‡Îàç+˜4ÐUäãˆ1ÝóœzõÆ®õƸX UT9dôÀ6À<0Ny5   ydY'“¤U`¢ÅIÛ§ŸV³/Œ“¯:ðìo•¦ßFsëZðv 'i%I= BóB§Vˆ<'0«†Ð:kV #ÖzG87ã¾ûn¿}Ý eÏ<5Çë_…OïTôX•½‚÷¡Zó£¼ß÷±{î˜?‚Ú…í1uêä"í¥Š•ný±àÅÿTÆBÎwÔ76Vy|-vëú÷õ×üû¹=‰6ˆý“¦}n`ŸÁOéýg¢:>ìu×e0‹í¹Äx9øþûïÒ.j‹‘3ú'¾é¬{î—D@ þÉåç¹ìC1øz ÂÆGsÑûÛp/pPÑ{8k†ÕÅò(,2®§㊂ûSG ÆèŽ#•¸áÌ‘(‡ðâ;ß2qi Z 0‹)±ð€Ïõá÷Z”½IÂíqÚ^¡T.^„’*TZªÊŸ+‘ß.XÂ3.`¤AˆR‡Çí?­‚¾‹¡XÚ,À óœàN›kæ˜g3±õ&7´ifÄ|ã)I…Þ ßBøv8:Ì¥ªtÁ~|ÈVíÁ>2 "J2ä×®?½ëS`|sAçLw" ªoí¡ÑœÑŸ3ÖwÞÖ†Nr…CCàùÞ±)R!” À<ú~÷~úðs€é”½hK@›kÙ=ñÚ]@{cIdzv…ª(Žœö{ }·º ÌÍHÍ¡ ãΊgÈk¸»7ÙÝ™ù ÊXJôg†ÕL HM§ïtNžÿó¾;k'Ÿ!Ü3øoÐqN,ö^z5ÆÏçI'jÀ¬ž\@ðtóƒœæH;ªö1c#×3•9ìUU6´O7'2*‹ˆD1Àhòç‘ðÍÚu{ÅÝDcÆÞÕ^o¸Æ8O80ÛL4óœie¸½]ÊýÎvó æøhåFV«ê°†wçDlЬrú¨´¼Ãœ|å.õ.gp;Oň@G;À‘õdû‡judî1!…o9K!ìxì£Ç×Ú«[ï{Û^ª€¤G«T9†ÂÓG^cÀõÛÄôu6{7 ¿{‘3šèà›˜.‘¨‡km]FCš½º%!@!ÈW šëº€îcÕÁØT3·xøÃÚΑ¤,àosñåâæß}ß;λdÊŠ§L¬ãÖ`,™Ì”ç¡ëD "š ñwîhÎ÷ØN½×F;gE˧„¢ Ч!ÆChB\΃Y$x„>UPø0Ù“ÅŠ@g·o¦Fiž2+`ó>]š o“$bG½\dQ`ˆ„ú±eN®ðö2ë%í¨Œ–Ø!ªTŠ£ã¼˜ ƒ+$†Çƒóv¯ƒÁ‘TáTÈDBdÌIã•ÀÌ‘Ò(ð|@ûM $ Íá½UEâ•g––øµá·Ž Йn­0Ž0cÂ_wfgï DZ]ùß®¦b¬}YDV=÷•èÈW+†Î£ðñluëáß…h«ÔŽ|T@^G?sƒ˜(N.ü6ÏÛ“õÎÞ£ôÛHÂɼЇ[2rù°ð 0Ø¢$ÉÜ@ð±Í–ù´‡&›”`[ª9#&Žp)dŽ+¨°ïô@¡„?{{é«oD6B Ïì¶IBD„‘$‚H¢Ð .867¾3-€âªšïŽ'÷ã²+‡Á"$óÒàÀm g¦Y)$hƒ]'Ošà×½ãHŸpR²ƒ~½«Ø{`sHÕ«KgŒ·[Âê-âàO‡éè*æ+@Þ¤t~c `•-0DÆU{v3¯o¥8ã¡b¦šõ¿.)Ç%:W©ü!Ë·Ÿ«¼°v¼%e ¹¸L~³ÞygAI´T`ò‡%H<ìq_Gƒ¹­ûãx{çߺ“ïÙr¾¿ëìTzbŸc»ÕÐE–= ÙѧG¨P[bLoœÏŽôÍs}-X†UÜ‚.2ã\xÚîx~ߟõ!4¢ƒÉ‰ì~÷ªg;zðÄ%Ó™” †‡¾:¨Ò® þB䥃øŠ`?7ˆm_Ó[,d¥ühæ°3ÏáüÑû™9ìçá*ÌÛ¾úäV;%¿3\7¡V#H¨²ö“úûŸfwYúºU âŸcGî¯ÊùbzÓû”×^wézÉÌÎÜqµã±×ê  ØÖì`ŠH ‚ í¿ õ79érùb^ᔨZÛûsúdg5—Ób†(îhœá¿,„ˆÜa)ØJ"Qˆ²1‰ƒ€¬RÐKÔµlº Ø`ƒ?7&»‹‘ÛÅoó=¸¯ßEãk!¸ŽüIa±Îp–Ì¡‚» ÞâU–¤›¬›Ue,’zò\ÄàyŒ¶²" 1Z̵4ÙJì ËÉ[K£7u˜ÜÓàÌÛÓ8ö¢N](¶u* +ÔÌ› ÆÑ!Ä8ƒ¸Ì†±‚ᘥ™RóNÄfW0ŠŽ-Us·7ƒedB@=²kf*Y å>0a^YPÃÝ‹¸|C™“B4KLQĹ•r\†hª&’ Âó,íW0áÞÍ3l£*Œb‚é+ 6ÕVCa­DÁÀµ¤"rdQÁpŽX–m-tó X¼¸Š{*6q]Ú7sš3†4ÞR„±à¼M˜Ü¨cH, ïFE»‘tvŒ4®©ÂZ)¬ŒÉáÔ%ñUÈÀy3;‘—X.ÌÈÉ€ì[ !,€_òþ“wÉ# ŸA»b£LŽehDj™‡¥Ñ £ ²øBh'A ÇDø®!fBå0€<†µP¥pX ÄFSBØR´NVå ªÔë5:ØPŒ‰È/2¶ªVòÝAƒ&£Ý7ºm‹¾¨TÕªu$Æõ‰Ó^wµ;Ü6âÓ«ÞmÄDí(ëW·PO,íå1t±ue˜X¢Y³ˆè¨ö2¬ƒ0ƒd#“‡-CMTì…Dˆªiz)Uå Œ©V)1 °Lµâ¡(% ±êq4¦(¨Elвí)ˆÌØ´‚îä ) š$Úc60w–÷C[÷:‡·zẔ+5Ã.>Ýê퇖;Ú»{[Ñ3T«F¸ÚV\¬.²`Y pWs"'NmÌÄÜìdÞ¸ì¨ùûù¸ª\èdpnˆÃÛªz4³K&)TH€DòÊ&B8깘‹o:Yh À×2˜†$˜ƒês`Oyg gòeÕ2(øY|ƒðùm×Fh¡§:8 <ÌMŒ1áa×§ž¼àå}=³“¼œá¼¸y9S|ç'ƒƒ‚d.sƒéCÛ\CÑD‚>ïk_ox[cãÄíž{° ÷¼5HK«M)t…õÕèó1Åq9Û{€ ΊKBÔP&Úçյщ;~aˆQ²¶7Åæ' »ƒ3ȵޡ@–ÂDs€H#‚º¾±¿×ú‘Œ¼š?}ÊVÓo.ò¾B©Óµn«£¾žì}ƒ{€“,IjÆktÚ±±ÉÌκ–lIt¹#²­œí{¨>·<ÃÒw%ΰ ñ`Y:d ÕR"Dó“Ö9=}W—E¯}œÁΞ]ßp5]„÷{P$|…Ÿ8|…£x"«»hS‡AÝÅ2ôñQVd˼ۅ˜lM4†±7’/Ñ7”c“ÆŽ°ÌÒÎ+€+‰ðD)µ#Ǭî+"¨hWœ•“cAõ«òç—ÜÑ5S 9æ¨dvè$wÍeýByÞÐ^YG s×læöé°]ã&ðë7Øx€{Æ6cSV. wÕÁÎ3ÁwÈBM‘ÐAoË¿_~‡¦Q²þá‡9ÁÎÕ™B¨dykoÍ=Ö$РܾCÓ™çjÜ6H}r4ó•6¬òQ[ ²z¶í‹ ä‘}b !nà•óÏ: ‘ÁA{ç± s¡zÓJUŸÈu¹ô=áúÛàd\ø¾;ÙC³ñ·f*Ÿ‡šŠa’ë'—OµœJ.~"KÛ„EolÀa„=ç,²E‘P·Ú-É'ô‚OoŸ… ô}‘ A°]QV´ë¢>œÀyOJ 2:/džC˯ÛÔ½÷hG¡ÁmYåóé~Ê_8Áè^ kÃ#sW,?Ë_gÀäýÑ«›CªáÄ…u2x.˜r¸>Ñ1íx˜«±s‘Å˘όôÞÖ«>¾ob½ß×sêÑÜß¹2Ø??…å¢o$V²½&Õ${e÷ËÄ?¨aŽFq?Câ tTüî ʶâüðïD‹2À&§.P<ã¥2³2õàèsÞö ÎQÝw;çÄ¡[ր§¨\´ülEzžf:|÷È}Úçл—ÞÖOÑbÀøäßbGZæðw,sN²E1@¦®¤°û½‚*ÂCHI‡'Œzªª‰2ïÖ=~¼cªt¹qK·~QX/ÎNkÍêþ–ßÔê3šà_Ýû%nf^_Â;|=yú×d&]«R?»/÷æ;,÷ßdG—ÈÁ½½'—zòDñ~±¢r­âˆ‡µènñ®Ç»w&"è”ö>S¡7 D£t3›Ù;ØIØ €ÑGšÊ@Ñb¶‹,t €HúTÐö¸ª¡Uå2¼ Æl7ÜØ¥’Ë`ôjÏÆyº&€"_DCïR= zBìÜFAœ¸ŒïBØá“µß@~ç{£/¶"ÖlHÀFž^0Àx„ùHûÑŸ5ÒÙB{;uƒÇåS<DQ½#Ûu ³ðÉP+ºî€ÂQQMD5³¾¯¯–xØ÷Âëz…û6å avì yhóz Ñè¬ z¼|÷6Ê5h‘,@½_ uwÛ\ÚnÌF¤™Ù1E Ð©½1i¶3— NVlFO,äáãQgkUÔf$»ðQψ¢=ÔD.*±y¡ŒÓ ÌœÚ hCä,‹H.^Ô6뵯N€Hˆ]ϵH=^ò¬C¢jý9µŽÁ²Ðös½‘ÛÚÆ4bâ9B/=…?»±Ú·ýóެ`F¼¼Ýs€¾ò·Ú[ƒÊ ôŽ_ŒI$“D>±W}‚Îà$@29ç4ž3ƒƒ]°1ŠP©_Fû»ÃD;dÛ%ACLœ‚MjŠ HT‘Á;¯ÅtŸYïvÎÝÔ\ ñ‰Ê%ÅYÕ[´²‹ÃÍ’0EcT)_ÙP ÐQ;Y‚òôg¤}Û¬ç'‘;9\$OV1‘Ïrœ}MØbÍ’ùáAˆ¿}½Â¢hÔHÉBׇœ™G‚‰êÐöSåT)y|0â>¨vZ6"ö8|n}íu‹;ίt$»Ø»ÜŽw¯õLÙçÖos¿'S>N²Ÿr#¹/n[s/.&¦Ûj.2wiG Êô~=ÝäÃ4#sEaš@Ò„‡l1¬Ø2&é×Zñâðk9½øäÙ-Žú]ìXNŠ‹¬#åºÉ*„O03æb w‰_MÖÀÂß]1Ú5µã¨hc !iKOŠÍ0lu­Û˜ÆäºœŽ¡ÉØh­„.ª;7Ò25ÙâDHÍî¿´âSh¡Vˆ¿ÂW…_Cp@@…ÇoŠG„|q[{~ûÒM}×ìøMnæu@©{Ñé·õH…àO]!Á½ú ÜÈ[ p}çµÝè¤Úàä&!5Ùp´¢|ú G±w¡wBîoŒw²8E Ñî¼û9Î =³[ï¶Y8¹D ûG•PmYçÇ4ØVŠÑ û^¬Ï½ëËZbdüëØ\¼´dU<ˆ£Ž/²ÄM7‰èb’ÃɪvBÉJG!\ 4X'ºûÚë_s”ª®^é̈§[ß÷îе yläz[\ôÝûœ[g}š+ƒ¡EPQò>œ?^‹ÜöýNxƒbn}«¢ƒí•ä=ÜÇ;&îÆ“+8‘f^ ï c ŒŸixæÍ‡\$NÕâñ`¿wnŽžÊx$ÕdU5VÓa÷{Ë­_xãì¹,1—“0k´+~çKçb1Ý‘¯p³1½°wRö"#·lÎN±- ìªP¦®½[" nfÅ)‹Î »:‹é+[qègíϺs$wíÙõ¤yöu_6Q€¬)K_x}ƒµ}¾FPŠAvBsØ 7#L¶{êöÞw©j`f1ýÚÊBü£®f^u_zIçþýcáîFº‹¨!â%!U~g:Cò°2‚í,äk”ª7ÜÞ‹ûâÏyÎxvzÞ žöŠ1¨¦¯‘-‰ ÉíÈ)Û%nD1o¤%ã<š1Î1à¯;¿5ÙÙÚ?}÷ öìÌ%oµ‚êÍż£Œ¼*Ó8–65’Dq!)ýW …+ƒUödJ4ùЅ뜱c'u¹jûÃ}Ìj+˜2²ÁçÉð›'ž¾’'ȶ ߘ?FE*‘Øè«pÐC%.…wfLå„áGXRÅÍü{p­–Ýš¡ôÜmG¶ä)ªûyÞv1\msHwxlNžÛÝçg)›»AÀ|Ê|ÓȰHƒ¤{ß C(sªðÚ ª_M}uuK ­Ž`2YììTØ´Ç´rê·Äú®Å Y Ëäñ¼ŠQ³Ó?|÷Ò˨%¡bÐQð#):×2†LRV·s&Û²1q%ôÝw·'¸´ #X¡ZdR‘ ušAÀðdE‚oèç'¢sâåCv| ±¢o)x†EmÎÞ-Óàr»Á|¼Œ'sj„Hû½]w¾<^H(÷¶ŸnOWv1ŸFÉÅ‚„18‰æo^?t@ÎöïÄ{›Ý‰YðÔAÐFìI}¯Ä¡Õf¾óö™*Ë·´°23ǤWe.·¢Ã$ÕH¸Ÿ½`;Týï½q³­Y_|íV=ŠdSÍšÌ Á!°)ÌE „5ꈀðÀÑl½tà ì¦Ír̽{ìÇc{žò¯§éõvèQðêòÄ·-òþ BT‹]Ëú?ÓW3Ô¨yý °¿ið2GŒMÒ›ëœè§#¡›žÞ-@v~Éôµ×>Tp#ÝŒ0mšÓ›úùÓËñ­ï U¸#E¦$Af‘öÆœ8¾u-ËòãÞ Hil©]y€Ïe÷Y÷ÖÚ‰šäSSUö9°%`X o8+‹v/qÆ¡Wÿ>3½@*ÞC¶êPÃgªÿ/†}ì<˜sÀ?ž&§¢ÇùtxY/âºûôø]ÔA+:*~¥$åh#{ý`È}Þ,¬ûæMYð*ÏYEÜet1OÃë¨ûÙ+’x>?^. 6™f·Ç>=ÛT²“ž‚.ìR³1û°èßÑ]Ýn ~_=•!lÕ-Ϊ ì}±È›Œ4q â+ãüŸ»Þþü?@›ó¯¦"ájs¢ã?H›suU— ¸ŠnáMÜÁw!ŠažM'ëë¡ÕcóûèåÅôö ú»™lc˜¯ ˆ(¶=g¿ ‘|³èOYcgжåÏ}ðΞ†ÞGÇîг_,Ïw°~A.‘§müa }œožs½{ð '‘…æ†ua z²)é;ÙåѳǎL=oˆ\ ›³Æüóš€@"h@isREï—ÀÌG¢„ðE!0°pÀ¸?ÇÏ–.Gà 1¥nñ[(1$8eŒLYqîó/ÔŸFýò%c€Ö£-Xg‚PlD銠rf6bhmÍTbbåBÖLH'(q‡bZ -ªã£{|³œÊŒm*›6†´¹Œ `Ú±yUO²5•6ÉT®yvƒiÄGn ”D–3*àNàw"Ut$Ôˆ±%š[hÖfT)š©4q›|Ù¸ÃDÃ#'/&š¹Ãi½Í×¶6Ö-%ªIÜé¹U›¹7•³[³w[«Rœ–Û$¨TÙͬSIQØ"C‡T¦²3n Êj¦ãed …#pTh¹hË•—4ö*æ%IG"M懄B™3Œ‚¨æ‹ŒËÔÚY ¶Y3›UrpÂo <ˆFcvY“hXÒsjdZ)»PŽ*{dlŽrÄU’b˜£9ÅˉZŒRÙ -ÍfÀ&J5ˆPuÁ‡)F8³qº;Œ¬¢¢á DÕܲqD¬rÄH…Tù&ÉM(7FÅí=åœp­CÍÛS†ë )½¸<‚ m7.&pÒá‚övD«@^Ä—e€‹»¤ ‰\ ÉGœ½Ù t¨­Ëy†˜1q@ÌÆÑ‹Yp¨µÉË7”Ѭ6X’îSœŽpæLVfˆmsÝ ˆ`ó6q'N.¨0yHEÇ2ÕKhè¼xU¥ÿ¿[Ü¡dF:h†ë«­[ÒL‹ ñ ° ÙN`G¤¡9ÑÄ.—$©»ˆÁ¼`aÒ…ó‚¸u„sQ™'DrnðÍ1L´TrïMÃ0ù.ªe(†œÖúïµ×ÚŒ3.9JpØhE"—XƒàÑ”ì€Æ`NÁ V& L@‹Èz±UÄÛ¦g.ÜØ™7†™«0Lê…Ám´©,ƒ´â[V.kŒ.‚BàG”³ ªî¶4u…dÖ¥Jær×ZÑC'-ËA;§Pš¡aAdE› deœmU²@9¹‰C)8ÍˆРˆ7,àã2‚Õ p3[©•ý¸¥‡‘6ebžÜÅ>ÖjÔ#°j5\2,V*]R`b«©]ƒ¬ÝQ2ó`ÅnC“ 8‰cvØ:ÊÁ€ƒ±ˆgè1º¿èÛŸonC««˜I€xˆŒw[v„|€ùÍ30Äp„ŸÙÃY…ô£hâ~„)b|¨ÒÓö˜%ÁªK ¼æ! ôɃ_¹þÜ,òt> ¶.)=#†DÝt"„*{ ‡ùªã…P!ŒÅòxê5ÃÍ{q«ÎýiÅ}þp©ÏÏß—hGè\C¼Î!xßw¯pP“q½œœõôhÁžcn4v_Ç*ej=û!óîü—ŠoêVq×îä™Óà„ìv™y\<àÀÓ/T|4|Ø®ï£Bªºh>¡UU®ùÌLk/¦ €þåƒÆ%¥êM«“ƒ=zÓ• „*ª…L¹»µÃ>Ï9ÔîŒ —Cýù1ŽGE®Ä‚"ó-™‡ÙÊš}q +ð/²·àG}çùòs²O<ðKî°®P(q4¸‚ÆCOؾû­a>wíð× ª„1¦ *sôä¸Jä÷Ëë{ÄhÞ»??L(@Â9â£<¼ì××÷Q®%‚x#”R-ŽïEã]u€B·Ÿ$HÃÉ¥Ï&„ô\ÈÀ® >û¸ÇÇ+´º{Ž—J}{:ø¢b+(Îv#ë(³Ñέehc(afUH ÊpcÈPìvý¾È÷H“Ù!x8×ìÜ‚;/&ñȈNƒæ±¡ççÎz<:²`ð‰Õ{=Ü»¼²7\K„ò†Y˜©ógzƒÖT>s„¯÷sŸÏŽ»#+¯á"ð?ƒhhûþ[Br¥~Çf‰è÷׳ô^âïÞ÷„É6­<&—ÙŸ·©‰ö¯Eƒï¾¹ŸBGm1¶S™;õ¢r2>ñî‘Dž‘5NA0q'ro’LöB?wÖ}Ó1@YÃÂ;Ìì¾*|Ëñ$$}³µ¬ÓÞ}^îàtíkäbœû¢&néˉ\Šžö»sL‹g£¯p ;ŸÅQÝœDù±ôL™#ìíÞfcÆ]b\Í‘caìОXÎvV WUqÞÖ  áçXtZ†¸x@uøÖ?šARR ú¿NÙ ‘DÕ©ÆnV7|5œºÉ¿¦6VSâ¤e;û¾KÙÃZøÔê-{èåž‹sÕT ù²,3â™í@µ1í+·´äæ¤FÑî±U*ã¥Ù’ ;ôs–êíÝ.2CËcgòüœ¿OÇlÞ4•}‹4,«ˆ‰ !ò¯f'3£ƒgEޝ'H¤Ri§¥Ö»Òç÷=fª´ìp8YÍìL¼!:7%]ÕÑéÄï¥sÖ¡W`)Èwîø°ÔØ4¡ˆ*%ă޿®Á ÁÓQàÇO>±›CÄÕyËKäÍ´R*ïÙ¡&]P€Ä&QŸZêëeó™«ÆK3êà¸>QwÝ÷Îßñ² ñßj5Q“J—Ò¦ªbU}¸‡1P´À® ºQªòâõ@ AdNÛå(OôÆø|+c9³\#éå¬!1SRÛŠJ\HÉ#‹†¶#‹<Ë ¢p•ÌÚºŠÕÌ”ö¹( “ò<G²ªÂ0(!¾ÙÑ.ÊÆhb–FCªŒ"#c”:@ËåžLË.FئœgúÅŒ<þ¤'ÛásÖíû7=±‡Á|uVohY¡¥v1~]²š½FáÄé®, í«D¸¹u¶øvˆK9QÌÚrà­áâ `¬»ÓÕÎR\ªL H»36³)‹x62QwÌfÔæ!“±{Pñ8sCP…Í”â\µŠ£*t¬†UL6Ö‹£»S¦•²"+˜ÕLÕ[Èyy…Z¨5—ƒÞ6cUȈ›VÞ\ÛÓ¡Lb/.ÖmÕ:…3*n­5.£ìÍ—§ Ûɳ²[ªIs6/VO f›4¨]ÚâÆli‘i´ìºX%P'.eg1ñÆ-7’½Â9†¸O.âjb H¦P!m^ƒ¹$ƒ”âªg3“u‘^Ùu#¯AhÛŒY*Žš’õ2¬ðÓ'Zy7t²ç&„ ¢h7ŠíDlš¸w9¹¨I¼²/“q‘šÉØmLB7"v*îòx(¸ÄÍG5ÛÍS™v ÅÔÈwBâvØŒ¡0(º‚˜Â&ر Î¥±xDdr¸'lÆi&KeÉ‚GP€vºû¯‰J®ŽÈrè:¸Ýì@"It^÷ÙÁÀSŽs³©g€fõf†\<– @¨„…ÊpZSc@^†- <`ˆ·Èpæ´$Hž¢âøkEð«Á›‚lêuF‚mƒ†iS¶5)’T¸•nó™ 6 Ø Òtñwîâ7B£B³qîæŒnÙ–ÔÝ,Öö&J(O9”8ƒ1Dµ°žk '.΃.Q@9ÆÜ´Šb ζkN©‚‡9ƒP¨ñ`ñ›çsá\rƒ&Vš€. ¥@‡R­ `flÕÁã݈ÄVÄ-!’]LÕ`;›&LÍM£y„•9{6±Œ8ּŢÚíGkºIDOAÑq} ƒ=ÝÑ[€H°P@¢E ¹ÆÄl ÁLðó4Î8¥ô¾\¦ôW^¬Fýå1·Ó¹ÓNãT­¥«L¬ªgþÁ🿰~>$~zùËòæû§vd‡)‹»ÝCñõC3³4€G•÷²…a 9wÔ ¯ÔìvAððŠç¹ßlNò»™e‹#9Îtðräò~§/Šó}¾Šá^쌰=ºV‚Lü{ðÍêêÒÒï:9½Ð‡×½_%ÛB.y œ1ßÏ÷uÈ8s+åUô.\°ðO§¿z‡ ûÔ#£ž$—˜$| n%ÌÙN±Å:æFý‘“Ý(SÌhÏeGbÃû+GÌXöVæ÷åöø î/Ü+uÄBu_¨ßm£ âÉ9chÌî ‰uNä+qÁ‘©­âì/DáÙ.é^I7aŒPAà¯ÜLÖ”QØüV;s†ë9û“x¬ñ%FƒÙÆ´wÕW ü¤Œ<þÚ¬Rù —¯b¤{¡®‡ß½½ VHªÞ¶bÇÃ;nwì[|aC\=À€|3qÁŸQ–Õ—õžT]YQV˜S´)È¿aÞýYíèIZv|—ÊãúÄR ¥›Î±XªЭÁ¬óºOÆÎ)o“»æø‡nçQг5¤"´òÀpšq¦fXÞ¯šcnnPÇGœ™@HçÌ£Pó~«ƒÆÄéŠÑx‡…y0t)Ûœ~Pù¢„êhÝÁCå½è`Mñ{äÈôû »>Óñ€À =7ÜÝ‡Ñ O¯w³".TæruOû×6~ô:>øz÷>ÛÛÈ©YW”S­ÐMuñfTÝ ï< Hð é³üp\ÝtÑèY÷´wÃÃÀáðÉø¯G_gP¹ÑãÀæyì÷„ÙWÄL1)V}ù]˪Ü0К 1î—srèÜËͪpf‹04ZøØHÁ„î‹:Cg’<«ÃÙÏ=y¨ºìÂ9Y•<¿-Ïyx­AªˆevhÙ» !„;ÉŠ¤Ä!™¹À7œ$hàa #f©·^¥CšˆÛ£†ï gV™Øìöæ}šy2…ÙºLOß}ÑÙqë¯TôÄØ©Ú²,èè78£‡Ãõ "rÝž¹¡×Æêв~_V|P©¼VÏA"}ã]ß}pB¯ÌT[¥Ø¥²`2ðØ;—am•œ«lò3oDØ4‹Kñ* ⳡo Ã$‡6G<äo¼£š±®Þû húP[•¹€…ÏJgœzç£ —Øé;ao9¤s±˜79c B"™dïô5øZx‰6}ø½á9öDÍa5¿§/›¯\½PS;^ŸmÃêãt›]žûÕxuÀá÷9g‹mкÛz߸!8Ñ›é#}~ìZ¢ÐÍÜ àeNŒÅÑûª&rG?~ŽW~ÞfúŠbáhGáhd5†®­Š0w`ß0ƒXö¨Cs]ùÀ‰"˹Ìcð’âc9›èÉ€]q+ðòUæb›>¥»™ÂoƒPBˆÆªÅ8² ƒÉíï½Î`ÕÁÂOv0Ä8£5›8gÂÏÖ•xú"ÈâQé»T…Y# õŸ¦g· /–´æ»` ¨ûXëb˜Ç}ñÀ‘tý¨!Õ^0 åê3`Iå\¯>»’ÎýÝyuížMLu'"“7éÑï¤g˵¦Ð $D*ÚúéAûNY¤%VžÁ&›“¦ëYäàÁN&ÖX†+cºLg{È2,uÄ=ï&BÌÚëû§~at¿DÌr#♊RuW@ú㊰D.¬—„†² VQñž5c´†sE›æ¶4íDˆíAé¥vj¹Ô-Pa\{Z$O7µWÙ°» Œì)£÷Ãï…s{z¦bz D}PmDJÁöˆ¡Ë"µ¾hQàÅ.¾ÊT"'j£Gj¦~ØUÒß¶¢(Mm¶r+T¨7´†Ù°4ÞѤ=¶úƒÕÕ›ãÈ–Â!ö·r/Î~»öwš:tÔ]ïOœåR#¹®Î);¸¯U]Ršðù™÷‰&ûj|½A®0Ж«…ü)ý–úß”_Þöò½<ØÏ?L¯¤×½ÝúôZ_°xs€2¹K øÙ$ å}ºyU^Ø ƒ^Øã¬ TAZxè±1òªù9¥fÉ7›Š®‹!ÃUÊ›p Žˆæ.*]–H Ó‰3(èDÖŠ»šÌpÜÌÁ)òŒÐ¥XäÙÙ¹uf"¦²i¤Öo㬘¹uqbŠšË,7°ç4KÅ4¶ƒÑ³…ìUk†õf*·64bxNÊ™„ÎY¦2bòvÕ˜›ª…V«Úªp`ìÁ‹ÓÆ8ˆ{±7‰„|}6…©tP3ß…öæµÕÀ=°(‚7q #Aåh[Pê¾ ³/pDëÓ ÓVÛ$dxh³¡ ³…s@¢>‡8Q xÞ1-vòTr%3ÓCtÅ.ETŽì°(‹ˆaH¹C¸ê·g‡¾ EùÍ}αwz4¢ e|*v®™ÁÄ\£qdÔrð|ë]Þ"+¢ÑÓ'Æ÷å P/wÇǧæ< u)„È@ø»RBï®êª¬9<}‚|$ XX ’ 6j\‚:wü#ˆ»ù_EÈ¡Ñò#ƒê’þl6í‚+™a&™f³b¬vÒJè®Ó³adY‘nD{CÊÛ€=Ü7¼v*×]CO›K™,2x‚ˆ½…¯skõ¢#ÚœWžùDP‰VY¨Uòí?B_dŽÒ¼yê]ß®›õA0;ÛPºµ3èfˆ¾×ÎßùZ•wèú@Á}K¿¾ýÐÍbå1P®…s}Ê|ªBPyƲ~‘=Tôiöeæï¢K°b C¹‰GÕLËîŸø#ìéûŒ{È3 Ò‘ 4! ˆª-¨Bm½f``>÷?S5狾|ƒ±CˆÞ"w¨)ßãæ°ô?·¯²!~ìâ!+[â¤ßÈ$AãTØªŽ¶^ds;òîèØ>á&©â#žw2ЃR¬+Цývw£Ö}ÎN!æçÜE¯(©C«èÂ軆†;\ªŽT…À›‘ƒ#•öÈ)˄Ͱ’ª<ãŠs“Êi =ÍäCîdð<\œ¾ë›ãѸ§ÕÁ·]õòXŠ>’ß^ôud˜V_Ý©áøºÂܹŽ)¡!NÓƒôWb³míȘ Bª« ÍÌï7йâ10'(`'#«õ‰çs™Ue0Á0á„1ºÜ†/±(„E¶}7¤©à¨BÉÒ¸× IMüÐ…iÉ«¡<ø}ÞLaáñÕ²^ïClãdjV]íȪm®_r΃’°!ƒXMý/€R°Ñ>(é0`éHô?¨ìÀ%rAL“÷´~‘­Hw¥Š„ªìÜ£\•dÝzàf0OÐû•ƒ+xfþ¬ôŠñátÛ©N-ª×áéòn¼„>ì+µÀOmr&;tHÉuSª_7=Sc·¹Ì›š2éâ‚‘msÀ ß{:.È6Â<¸xhÆÛª˜0•ÁÒ$òƒ´Šœ9/ دVã 1I !“„Ñ™ÉÓu627];)C@ñòæÈMsÁ¾Î¢xâÇR.õv1Egˆ7Óp“´<çXmíŠã'"KyÂp'”â=pƒÉ!<ï¨?p†DÚJM_ÀöLŸ”gÒ ñEÊ'š×4 úùìÑ–£Âsä&ãÕuðúk)Øä°+Ô ïCí ¶q>÷Ç«ã^çÞ¼ßW×x×ܾ'³ŸYÙkˆ ((1µ´¢SD224[‰™’y'ƒiž°Î‚8ûõr®t¸´—Ä.p0)‚[ÉïgåéõB9$ÓÖîƒ3fd¬¡uYª‡˜8åˆ÷0‚á =·Ê²½Àü£¸Äï“YöÞˆÙµÀBŒÚ¡ú7ÖP7ÅØÜ𼩨àÖ„$PýÔ}êÛÀ:r "%-õ;\³ZžûϪWL*Ür2j˜ݘÚXî©/NŠ[‘ ãbÖ<œž{ÀŒ>¿ pf¯`]äXDPdÐÜÙÜCÓÙ©÷‚XA)$Žâ…n«’ÞÃQ¬4sQKŽuµ¸—msuª9ŠVwJPŽmÇZíönû#³ÑƒT4JMöUˆ%ÖT¦GlHŒÎø6Î@ÁÉ|B¦‘TŠÒ‰tË? ›àÄ¢Å«ŽŽMñ‚]ÕO@·2$yÌÀ­™•{åômÄX½ØÌÂeÐÉÚ0À™Çvû{@[ÀLíçr…AE0Ï‚£'ÔMˆïO*Ä ÏÒ¯±0ìd³ gnú(}_ZËê&~C ô‡6òäo~ß`¡ç»=×B,n};‘bß %;3Wçmm%&8yDNÌEƒÎÙîBôpýìû»^ðÕñë‹¥TRâP‘s´ŸàeÊ+³\lž“x¡˜‚âl«•…È„â\ìy$dDosº;ÔÐ }лB“¥ã2/½\l FPÊz¡Õr 0 ‰p¹ØÜ^•ÍïCË«#¢ºø¹íÒ#šf%>ÛÅBjá1µ ;Í )ÂEæÁ’œ‰ºàâ>AÞPÉdiÕy©Øß:¦rñ Y¡ Æ`Ð"o/ßbÜJ™Þ£P KA'\O–Å1Æñ(;õ%öõ*¯…igF³\§4ïÇ\kw¸÷í³O„ œ+x,TJ°‰ç8EúTÉÓ!Ö&ó:œ ¦,®3R(0e­­¸®I¥œ5gõ ‡TÝå[Š˜o^5Hd²/dæm伫äȦÃOY“A-’“ÍÛ«¨ºÞÅÏ3i7pœmN@9,!*ƒ­eNí™Íµvœî%ÉX¬åi…®ãP*¼:+EÔ…‚ÞÌ‘-lHÝdžá§˜»Éг"òf-Û)Åh˜;µzimlìB¼‘LH—Š'š™ÕòÓš‡%` )µs@åш¤‘fñŽöQ¹uq7P¥CHÌ<,D劙‘Sj­œ1±$µsJIÜhBi^Ôoe“dQ¶¹§‚ 5 ÃQHT·' ïöØSQR Œ2»<ïc”qá©£Q R:pØ9šâ5ËäÝŒ[UµUX7ÈÝ$(Ë ŒÔ-e]k‹mp\ \';59Jˆˆ{™&ço …@¢” q®š2EB¡6êʪÀ«)CŽ+È"Öшµ¢u—ž¥´­Ø6Üz«ÊwÂs“É$øÀ£àoM‰#[á0#âÀ– @2D7!À$`Ubc¡O!²­Ðæ(tDž@Àâ%¶ñÖ äDÆjºC6o­•P„4ä,† $H'€ÓC(ݺ&£t¢Åc9'9Úd!Òð“CÆU6<=3CÍ7šË;ªZ³žÈe(ɪÁÔÃΓ,´ÐTØÔÚ°ÖÊ,ÚQvj¨f,ÞkSQF1RÒ‚&èTfóœçžµåÅ Å™¶¡£Ž5£)ŘpèÓ48c,ŠRpËèÃŒ¤Ö™ˆaÅ$–! "±º™ ƒ™ê Éànµà“ã܉­.)íõÌå“U˜ˆ.gS4Ë l™»g +NÞPØjÛ‘¼šÛ@+@\[p9_Zé…Ô®24\£™–«¬+‘t…véīܹâÐG„$¹ÀHˆ«Š,m,X£"…JÆ,`ˆ¤ÓX°b*¨ "âü/E à˜@3Ê’ÓèTCÔœv.÷D˜¶œÖÜK(„Ïæä˜¡º’(òÍŽIxíƒF/nw€LÖ`¦`•½)"OO”!»1ÒFw~ëÔ  g/¡hâ_8ï=²Õªe#Umcp-°ÞÄ "M}ô 51¢þ¯+‹/Á—åF9'Ⱦ÷¾øz÷•‚{ˆDßkà ϬuòíÕŠ Øãe/NUí OF‡‘ß ú|8ZêKbìÓ ÀªtÆPd’ã°áZI‚ >.Ä7ô' ýõŠáTPñÜzÀ`wP’œ¤Mq,Ã|•re`,ä¯ôË´¿ŠØ÷a™Ä&„ž =Å‚¢OR£ïO#˾m Vj}:]Nã…g%!Zœd1·Fr4xš"ÈÈj\âýì`W3l4>™Èj˜+bóJ«&˜@ꔌš©!Ü€â®ßeUº"†ŠŒM{·Ê«¢¹3Žƒh£Û¥œîšÂ7GD‘{½Þ:—•ÕËäŠh£qÇÆÛ ·Îãç+„²cíÈÌ÷¯Ö1Á ˆ&ˆÑç³`lÄÝÔ>ÇD´û ¬—|¢¥qU"ÖJâ[¤ƒ®±è_m.ôt}\éÅìØWbo&êÌÏ`Ü=béÁ3šó]xç”èB4H¡^y•ÖG‰ø:ú6-—•Õ÷ÃàO9À÷³ª˜ôñÐâ(ûTPÏs{ÛÅLw#L ‚<~˜öø«9‰š/Àáè¨C&*´ ‹ˆ«žl‡™ ‰y(? vÞ#á.€Á? ÎØtŠG©,À¥ì݇W ¦èåßšlåKcÅGe’$ƒ2y˜ä'ôd³g¡‰«·×Ë R¬¼ïŒ®ßo“‰ŽòO~ ;äöŽúPîpÓŽC—ÓÁ!D¨%­ós2p„õÀ©Ä0òýH|Š(|Ó^}úfDƒî¥°ò¯½‰JµIc V‡=Ç.V;½d¨™4°»˜Þ$Š'&žðà‰B¤¢Ôô“£—†Š•e7Úžý|™À±(h`´þúÇGªy;Fƒj.Ñ]ŠŸ¬×Ú%d}8¬Ë ?$¨ænĺ÷}®'tg:b Ô5&ÔYnÁûS÷Ù3žhXôJlE@±Fërb+*«hjnµ`dàÖ±Z±»ôºèÎìîý]ŽOÙò½”·ƒo ÌPç;ÆO2qñû|ÔŒÕ&X…Ó«&<2°äCà„€3IUÛ™BñQžõÁª×‘£é˜¬ì*Þ¡†#ܽ1!1£­·ÈÝÌE÷Ýj|îàgÍÎ1$Šør'nxX@ÎF¥dC¶²¾…~½Á=4vÂÛ¶Œ‘+"R}?Vuã«£‡£1 ä\WDY¶@—,Kb¿1–‰ô\w½.󃕧ì™§ Ÿ`s´.;BH.^\GíQíWºg&°.©Š´¯%À$f¬7.³¶d:`!{èúEs™ö“°·¶.A·0 0ü:daÁ€V3Ú5Ô!9yÖèˆÊEùÔTªùx[}¹6ÔèÈ/Diňß)ðAšw¾r&‡s6êL—•Fø£ì„ò†è±Í<çÃÀ(ýRw·QÓ­çD ÊÑ„|{ë5¦À<æ±;‹“È‘ÓÀPV¡òŽã†Ç%TŽ//›´, C}WÛ`›]ïmW/‚®È›²±Œ{©Å0 ò!øzFá÷ƒ”V øBbvµeÝߘñ%·iöâg8874ð˜ÁÑñ~'ÕmIãÓMœ9ú‡í~›åQÅX ±ŒAOÍh1öÉyp¸Ë‰Ë¸IClœîqGŒ»¸ô±ð0 ¯šããX5Ov¾õBíM{ÂêJß™ ú¢½ÄÚqòB wªºj-P5)÷l<¯&Yˆs]m‡±f‚¹ŽI0.”rLîÙŠ#œ¾Ó-±’®½ªìnêìulÁ®ËaŽA#™ëYºà0óáƒcf²†¸#¸Bõð1ðç;¤‚'œ'œÎ-ûÞäy‰Å!lÊ<£[fj‰zH[^º£™Ü˜c¦ÈAÁ÷‚…zü†¶Y6”£§Ê9>˜€ÚÀX–•ˆ¸ƒƒ¿ouÓ³PeÚÍÑrë\À èÊs[wôÜuŽÄ¬ˆ-Ž*š½é x}Ý~C‘¥”s÷¦Fñûƒëý WL¥yö=›<¢&6 a Ìμ™á±ÝAùäª]/€#á0¯ÖÈWp¸}j2.¸òFÏŒ£OO‡³lEBsØ|÷±ž÷g5 ê6$€êŸtß$ûÆ&ðZ ·½…Ð[ô|{ÃGždKìÑ{CNgÚá$’8 ‹uvþ<‹¹pf“ŒOCÉÅÖ~ç«Æ›»9ˆ$ŒJ÷Þàt!>ø³ãR¢gÝÈBò¡SƒÚ§¹’ïqs®2@Õ!ÿêæ”RHŠê©Ä\(pjÔ„·"©<®ésž$ò3RyŸ7 ø~]«ÈÄÐFß’…‰K݉Ÿ»¾€¹Ð÷knŽx>Ì÷[iý¿>èø©žæÈOÓ±¹Çê¾ç žGs'¿kÊ@eE}熆dý,Ÿº&¼ÍŸ¯Øß`&•‡88–{ª}¨7Q*j&9±Yçr<ç›ÅD[Db yÎXðŽÒ|G>òq¯CÇŽÄQX±ˆ*¨1—¾Š°?™´:kÛO?GÓ6}±þ0¾3·RjW‰òˆˆËžš;8 lN¡m¥.Î4"Ï-B‡Ã*n—GÅûж‹i6ÐÔ°«hzž˜Ô®Ë ¦#€ÊæÍË<Ò¸æíà²NN »ƒ›;‚7ElKow*"¬Ñ{ t­Œ¹JbV9XkN*qq;œÛªþÏ73ŽŸz I‡Ñ9’§·7x0µ‚³ Õ:”ʩӚÖJZÕ‰Èsn±Unk3qpæÊÕKd^X,™¤ ¹¹±¹ªå\F,3n l¬ºœÕP°æ­Øq¢ [ɪ–2ÔÜ£®AâYST´LFRƒX‰ˆs"»b¦Õ¤¦30 ‹ËS*aI.¥ãÝ–"öc*¶!ìå(ŠÃ_꺂µïjUMË<}»‘(‰bw lY—µbxóLIÙ ¬H!¶° kÇH¹œÈŒZ¯–Š3TœÛPÞª¤R(Y­£!‚*ª¶ÆÖ^Ȇ ¨Š…ãY½Î8œ³~ÙLˆšÝ)µqçjîîÒyºõrn¦,¹bÆZ„HR›±x² ¥f³-¡@ CÔ–-¢x/‰@QÌÇwBø\ vf…¶rn͸‘Ô»,QFQ!‚úxÓ”Ábð‰Ñ†ùèÙ4[Åuj»× U3°Y¢(‹˜#8Œf1" ¹ˆƒ«´1Uå óBðÍå ¬¤æ2›ÕÄGš9xÕZ)œèçi6òìxNwÖ´“”â˜Þ»7Û','y@S—‚±pŸ¡Û®’!V>mÝ÷¢ï{[SÝe*uw8bj¤º»ª4åÈ1˜Äu]¹©ý˜brÁëŒàà?{Û3¥1¡…²úô_>ÎGAœ™vý±Ä$(wZ¥Úð¸¨óD6ã›'~}DV³±ÁÆ@Ê Œ€ ø=f<µ5‚X hóWµxËå6óxçµðöò£ªÈTû»UzœÍ¼¼°ç¦&\ŒìSÆ—3í|ç‘ €ˆßŽíw#£¢‘¡X4*§Pè²N“Òä%Wx;Ù#›Ïò™^¤KbÈþ™'¦¾}×Ñ“Aš^[è‚8V*YÆ_ßFk¤P„<˜‚]Ñ¥@<`œ­K¦h!hægW[Ç"°l^blÓO#¹33n0_Cf´¶ª^§1&·/$ꇈšK–NQ1;*ìvÓăë¼x¸«é3#°[údOŽÐtᄏѧŽ_*‘ 5ºó¦†y#߀ôª¹Š™¥q8ÄsAgƒ€+(fŠsåÊœJŸ\ÏÃàjb'µjóoyÎ<3_;iûo1$n>$€ Gz+"MOœª³»T¶DÁ1w†¡ÄLôæ±®•žv9ÑÒåG1ÌF§bgåÉÍ‘A‰àÄÄ4Q¼Ø ¾'¸.˜”ˆµu¹B lž÷žãÎÌÀéèç©?Wmàßàï>–ôX“ÇíùÈ6…½µŽ…ñ¿hB¾\Oº2AžpB(.ó(AƒBŽ WÖ1\šÕ»šƒ÷X˜Û{,1ÓÊ#cÏð,þ?”Nþ®™=7}`o à÷ÕÛ†jç@½¾Ù¾P­ëœfª ñÍå•å×8ì@÷]®Þ¶æpØeƒ\åµCª‰'Þ922z"^¸Ó;1ßxO—O|Õìu,lÚXF ÒeÊ&`U›”%ò¹ÈžË̾o"ªW?©­öJ牻åÆ#]ÅòG»ós§ÝšÄã1±ÙßÜÜŸ³›ïDG•‘éð³Ø3ìÞV.:wkàCÚ¥b`•™Úäý\‡ š±aŒìý§yÓ£æžõýÀ†8,aº"c²”prm›ø\®)Fa}®ü¼{ãñX<Ñâ=1²>߬)9x_œçlXÑ¥†xú3sz¾7Q·wÕq=¥l¦‚±3XfÈjfAªµ¨…ðh9S57g W—†+¤YdPúW€³éèE{¾΂£ÈçÚ›êQß»ÕaŒL/¼#Õ]uî´] &úø%}}ÁCAD 5—µö€¤ï3„iy„<T IÚMÝõ×ç˜ID”»/ƒ­9öçÕÓÎò [¬™¾[ Pé ½vŽ 6–gÔ>ç¾³’-N†þ9CZ&êa¼¤ÅŒ6¼Èº…%EãÌytµ ìÍUp=˜½BÌ›ëÖô!̲|uÖ÷&DáŽP*6õ9TÝTA"¾°á‰4Ç«+oÄ’„Tìh®Qç3×ʘŽòÆãÎ]™ DByè‹Üqƒœõq¶‡0Šó¯(ºG6&89$pŽØ9ƒÃ×ÏÄîFÐÆ&ª}RÄ룃$Æ(VI•BsÊíhÝÕ/6t ƒ`La¾¡ÚG³±´¾yö=`|F‘! Pð©øHŠr…J¬÷U´'Ž’Kš/¥ÂLÉçžÅüFcãW}|^oGi¸zñ©ÃQ ð¾áw½îe hxhÕdÐ’;-Ÿ\æˆàD‘R„ö¸³%ÝsâºeaZ)¹="d}=ô[4·h° ÓW"è-¤rô@®i«½³|ÉûÀp 9Ñ@5n&i¦ÃÑ ðBÝ‘¸êìávˆgºoŽæ "ò‘MàуÎh3ª!ç(Ê9–F,e­ò,Kà§C™•×6L’,‡·Ò°KGf ‘ÈHrÓîH1N<Ï’Ñý¿M`êâbŸ'ÝËtkƒüA® û4Ô<HàgŸ8ÚG\:Ów¤xPRîŸ=Û‹ ‰#‚U¶Ÿ#‚Èl‘H*ïsÇ:û/£og×rˆëœ¨oT¡9š QÄØ(Ñ…²j"°ñcS£ »l™˜ß}7©2Oïù”5ˆähVûgÃ#Eq¾ýdçÍ&$ïӜޓqå !ànFÔ9ë®vp“¬Ä"%éª.2¢Ìf&1þÏb¡š‡[ÈL=ˆû«´…fÝM*R$£ç Ìs(\ÊB_<ëåÁ‹œ"ˆ( ¾¡þm‚gär‡AN¸D“Ëó&tWiT¡J´©Ñìc“yþÍÍÁ‡ë~Yf:%É“Üuy¤Ò+N«D hwÇ@vµ× ½Í¸¾Ò—µ£*¡LDõMLNO.g`EÅ'š®&–Š 2!à1kŸ†°ü Ä5aÜæ øT‘×"8x@~a$Ž WõJÏj­À`©"Ø?dÍ`šFäϤ@?v·+Öå!È:žFJ©—!VO8*Ð&ÄæŸ8À@².s~åO26›iÙ,Zf¹XÞûfô8ÀO…‡®O/Xê¥äCôý PþD A9E"ÁENY`ŒF’–ÊXêH4$H(„¶#!1ÿbɤ I¡ˆB²"±@F b)"’,Y¦²°UX² @’¤‚„•‘bÀ ÈSd˜ÂV„RJÊÈ*‘A¸£ûÛ‚’5Š ‘I"ÂÒ „ˆŠ 0%FT "¤X,ˆ’‘d(Ô•€ …”‘Š Em…@,dÞX¢È©`R’ £F,(ŒŒAd£"DhZ4UH–UŠ+TRØÛ–Ó2d¢%¢‹$©Ïó dÄr²¥€°#`„!`b)1 c \¤m’`Ái¸@‚à "¬‚ ؤ$XXXŠQP+!$PT)€ T‘BD-¡B˜ ‚@ŠI† !` aˆ†[2 ¡H,!„YŒ ²$, ¤ @X)‘H¤XE$Y‘$I X• E¨¡!Œ%aCaHA FÉ T`E!’A!f ÄÆ)%b" "2F2Ua*€² ¨$B ’*Œf’X$QI‰F © ˆ1A aF"QVD`‘AFH’2A‘!H „XʼnˆVU¤¢ ­²€ÖÅU±G±ˆ’. R–")‹ ""€ @"@bÈ(bY"бN-TÊI ¡,@YUh0d !iHȲ ¨$ERŒ•£IŽ$`¢‹ ÁbÆ ª"ÁLhÅPV–Õƒ«,dIi%D «*KºVD@D$PŠ"1`°"Ádf$…HEXF# À²ÉV%´BEca Ä1 Œ€¢ F#a*1 É­’AHÚ¤‚À‰Zl¡ Z  (°Š[a`‹Y$R $dF,B@Ta"¢Ad€°dAB!BEFAŒ „XDH($D"‚*À„"FTY&’T$Y$ˆƒ`¤’)"‘` „‹ŒAË$•"¢@F@‚‚ @ˆÁ`Œƒ!‚¤Ȥ€,b 1 Y"0P€°9aQ(É"F"„AŒaBe° H,„‚ ÀY$‹B’ ‘c! (²ˆ$F)¤‚À©$TŒ‰Y V°R²gúÎf™Ë+£E jØ!#J[m–[,¤µl°–Ûm¥)d²Ë lµÂÀ°) i X0¶am… @3WZ¥(´¥„¥¥ µ, m´¥)J*Ù@ RÀ–©+m¤ $ÌTLÃ1i-°–YLB ™l²m-¼B0 Ëm¶e–Mq.´¶Û s(R…–Ð’Ë-–ZR”¤¶ÒR0al²Ël¶ÙbD‹Km«Kl–K%-H$)n¦2!ÊST¦c™e–SPfXP ª¨”¥)j¢*ÛQÙe·0ÈL„DD¥¶fbámIb­’Rˆ–KVâLËmÇ -–X­–Ûs 0¶YKim¶„µhbfY Ql‚@B”²”²¨ˆ‹tÈfY,,XËm’’’ÛiJ…[¶’Ûe–Ë,¶¤) JZQÂÖ2„–Ò[mZZ¬bØ! ’”TKjå¸% aJRË)JZ,’[ad²XÛXË @¤2–ÛkqÈd,-¶ÒBÛ ¦e¶ÛfÐ3([d-¶ÒË.< E”fµ@-°¶ËhcX *€¹”¶Éjáà nfe–«ÒP¡f €–Ë5m”ÓB•Tà¶Û)¦›Œb’ ¬` 9˜Ki¤ ÊBÚ[d¶ÛMLË4š8¦÷I`À%4”p”–­¶ËQ,°’ÂKÛ0€bØYKl,…¥ºÍ:ÕµVÚˆ«Kh[BÛŒ†f®Ø[Ki-°¶Ëm´ im$Úi5«J+Im… ¡BÒ–ÚP¡BÉ,’ÊQ‘“x”-¶ÒÚ¢Ù™ e–-%«…¹ l°,E´…!e´¶ÂÚ­ÕZi™–[iK R…¶@ÆfP¶”¥ÓP]ME¥«`Ye–Yd)JÛhHF¶)t†b%µVÛl s&YBP–Ú[BÕU¥`^™,·y™H«qQ`¤@€¤ @‚™˜f[m«m²jšÒÒZ´á®UÌ™2[m–1ˆ!JJL”,…[m-¤,²Ú¶)m¥ @¶Ûm–[h)l±XŲÔJ Ël–Ù)E[¶…´–Ø@¶À-°¶Ûf°Ã$¶ÛiK-  «HZ¶Ûe‹Kl¥˜%Ã-–K%µŒ¶ÒæRÚ–Ьe,„ !…¶”TK,–K-ZIˆf-!ŒQd&fd Ëm-²n$É’’ÉdZ­‚¤hI(d,,Œam à R–’’Ûam1™té%I­RÚBÛ4™–Ú[K,°ÌÌ· à j-’Û i-´([Q,-¥«`Z¶­ Qnfamµm´,±l”¥†9”)Km¥)ˆfX€A m¶Km¶L`f*%-¥(¶Ù¥ª¶”¶ªZQrË2ÛjÛ,¡a`¶”B!,²ÄJÒËÛm¡eˆ–Km´¡B…€X-cİ-´¢ªæfRÉdc(X€ZR„ ”¥¶’–¶–ÛhR–Z´-Zd2jÙjÐ¥À-¶ÙJYJ[m´¥-–Ym™“c]jèLÊZÆ""-kª¶CDÑf´ÆYjÛim-¹lËw™…–R”ÞaaJY-­²Y–ØZ«iKm²Ê´a%hY,”¶…)K,U[e”²Å¶Yam¶ÛKUim–°a†]fÕ RËhI™B”ZÓ†̰¶ã!ÈRKl-°-¶ØIm ÌËhc™Kl¶ã˜´¶ÛLL0 R‹C2È[BÕ¥’Él²…¶¤„R‹BÛjÒR‹l²–Ð`"FÕ¥)Ktfe VÂÚBÛH ¶É-D¶Ù“WMÖ˜ÅÂCd3’Õ¥¶… mª´-¡m¶–Ò†e„¶ã P\±,JQ )LYH‰ %’Ú …„–Y­@Ðh) RRZRÈRšÃ2Û`Z¬e RËh[d¡BÉm¥( ¢L¹)ª¦šdªª F‘¡±TH+m¶Õ¶Ye%% m´¡BËl, `EÖ—Hf"P-´¥-¥ (IKhJ”¥)F -’ÉC@"&H´– mD¥–*"Pµm´ €K%´ m(´-¡ JEº`d™"ÒÚm¶ã3ÉmÆERfRIm¶Ú´¤¤¡m’Õ¡m&·­jÕ¶ÒÛ´$à %¶ÚLLÊJR’ÔE[m%¹„ÃET RÀ¤¤A -`ÁƒÀ-¶’Ém¡m¶…»–¢*å˜L"ÒÛm²Ë-Z@ÌZl™‹@¶Ém-c)m–­-Z¶[a´63D (bbDˆŒe¤I………’À%€E´(-…–B-(B„(P J-¶R–”¥´¥ËHR¥-–R”¡j,, m Ë%…‚2ËV”¥(@¡è@̦32ÛBYe…–-,±”¥),¶ËQ–жۆ–ÕDÌfPµhÒÕ²m™‹mU¤!JXKR!AQ(k3-° P-¶Û m´Ô0ÂÚ¨¡Bä&e¥-)BÛm m¶[£3–Ûn8aiJ”‹JQV…´¶–ªÙ h[Ki))-·n´¶Õ¡jÛn†E333,˜˜¶IŒ‚™”ÁPpÁR$¹3,)JZ¶B”²ÚKm¶KlÄY&e!BP”%´ h([,¥¶B@¥%% i¼Ën[m²[m¥´,%„´ ”¥ JXJB´¢Ûl,„²VÙe²Ë 2¤- dŠ)"9ЍŒb­µUl%(´!-²LJI ÂS2Ëp@5%0ÂÚ¶Ë)&caJ[i¶d2‹Cy™‰˜¶Û¶$!,%¶ÛhPD²Ö2–ÒH[ae–Kl…´¡BÚÁ…¶–жÂ(R” [iK%…%””–€P¶Õ¶Ò”²”¶Ò %ªºµQUUUPB”¢®%%–ÒÚZ¶”Ãa+`²B a!h¨,ƒ "*¬€ ‚„ AI!èUUŠ V)EH°¬U„UA¶Œ$HŒXA`ˆ $ À!D‚ÀFbÈB°¨H¤U b)*,¶á©™(¢ J×ýM'õþ×°ÛCkëðŸú~_§õÀýÊ!üý?ßxëôgþ§ü@ÿúè_\œKÿ Êæ,º@7ýj¶¸Ûó醉!Ò˜^û –‰«¼À7›Tškü„áѱg^TëŒF6A>z$…€j*ÓB´ðÉí96™HR0áF¦ ôæy«Ëˆa¹ÆÈÛ’CÜO¤‘¢Y‚Ê»ðDh0DröÐK4-Ag¢ÇW@MÔ_wŽU ŸÉ»p×<ýñ¬c+—ÓÀlËxã—f––»fÔÂúùðÕçÏ‹i»«_)ŠrÐF V}ò¡±BQJv¶/Œs ¾'ž÷wùßl[ŒåÀK~,»º©æ¬P°@˜iAùÒ @– )ñeR¢™H*ÑbÊ ÕYD@„UNzóo$.ŠòüÍqf-—)júÎh¿>xÊaÕ EÇtìö)î3÷Ó1¸C:,Êá Ž§‰Ã¥\ðxån«¨‡Pó(è‹ñ›îx Aqã3Þ’‹èNFèµ$\rŽ€"€EŒDD ÌÜ>¸F’}`”Œì5¸¸; ö/q³·~ m¶,ó¦?Òý3â ®ÉôWôÿÈEó>¨÷dä‰í(úeš+ä6e_ÆQ°Pc S­3cauTžÇ_;Ÿã=CöÂ'¾çÞß[r¨f&§³=Z£6ðÉ8Ô‡ `%´|ë¶ ŽD‰ ]ÍÚQ¢Î"Q¼•)%̇Vµ‚à^u\æ›Eò8ÝLH´G ÁH*ˆŽõMè¹¼x¥ÓåÔÙH j#(‰(1èݱTýwÏ@¢Ë\9F 3°äx<ÃIHbɕ֥Ԯñµá×mïYÐýä!$çõß\ ¡Ò¾¿/ãåxåGñsUóøéÍå=àq' ÷6¿ÓÇ¡™­‡Ï4ë0?P$ákÌÜ5›šgé,{{&Ï”±fÉuÅÃþ¬nÇ7¬ õI+ó±¹M~¥”#þµÐ +ðó‘¼l_™ÒïŒQN[IÛ§>æ$¨mç<í¿Öþ—lЄ¡ôÞ@”J$¢ìžW>½PN”Z $ŠºN~›—\à¡åœê>™¾ø# É%ñðžMŠÆÙÁS&ñ$|ypE~óSØolâfØñ¶0>Ú¾ H3|¡°„Î °ú`ì9´éà'<›Bˆ—Äux¥Ö{˾’BåÈŠ ‹˜æŸ×¨rŠoáôW>ÉYè@íÀŠåyP’fë×±jš=ÇŸ »ÂøŸOŸžh§¹u ÷ , HÈ/†#ʆ‘3À ù|´@ꈬg² Ú@)`D)ø [ ¶š€ô¿œé6,áN›®rØ÷ö4©dnàTP$@µæzvz†øîn"½Tr))òYA}ðxJCƒ5´íå di±±Žèòˆ)h€,X%g³ßËœý[œüà•ƒ©[¦~a*yœBð4ÜϬC-*ü¤D †k[4j+¥f™–Â"Jƒ8G\Ÿzè=yû/lÄæèkÖûìl õß‚a;r"FÏQCÑ98ñŠ…,½ò(¨CÈù"1T°¨) ²ï`-=iÆ\‡Cz^ë 0sO>œØëTgÎN"lúw¿vísômÉ8IhBI"‘hJª@óL˜sñÉC’øé B³˜Ý.н ½Mšs\ÀDG$ ôÅ žA3;^q¨R±RFÄ@á…hX5CxC éOX—œ"¿¤ÞòÚÇô­ìƒFæ.k­èyYcé) (¤EPåõ¯pœB”sÛòús{/E ï^O¦öĈ™ÞdT?¨6 @æD¤EV {a¾É³½Ÿ]èÍòºpæ3šD© «lþgïç~½lϺ7ô)ê00Tb„UŠÊŸãÛõâ›Áç âBh ‚^’ä’[tƒÉ øñøgQ}ˆtýQ%ÑÐzï 02GŠNBž0ɱ“è‡ß2‚Œ2-%¡A'¸R‚FN`‡$§®øÀvÕbÉü (å"–{‰H#ç\a4*°Ïg:=ä ­xGˆ`•¨eÞö÷Í›Qëë—0©Kú{}=½üp^bÏ'n{ˬr Ì(ѱ±¤[i+ƒrÈ­®›–üìÌe©¬Ì±" "Ñ‘¤.é.ˤ»%Õ®lò¾rœ¼×?ÄþeŸƒgSj„!> X󰅢ذD-£ì{ÓÝÈx;bÀx¸ãëGµ1Â9¼sÕü²-»Íœ¥VàE¦H²&M ³4â¦p‰ž<³±¢O—€ç\œDÕ‘qÜàåôΈ÷à3ªLfIb'^€HÈ`9&VV Ë µR†Õ½¹@Ì;³x gµwßO ES Y:IG¿¡³•îTBT• ÁOÀ8ñ½ß:yPsKEQ[H ‰j¦Q£Ò’¢¡Í,R 2"ÂìW¦Ý…E¬Vî_ õ@,óÑ#Z]Hq¹Öæ¯Ó úÔYm‚±_¦~YO{¾uq”gA=sìÊ"eðv²h8 E P1NRÅ‚ÄHŠ¢¬dAM5UŠqIYˆ©QQ‚1±`£Òn+ ¥HÄF,ADAˆŒ­"1b¬ (H¤TUQ´*‰a"(–…TX°)PShŠAF)¹¬TDв1„]!X,¬*[,©XŠ’#b$dªŠ (,YŒQU€ˆ(±T­dQ`°X#ßj«,UQŠŠŒV¢ ‚0UPŠ")Š*¨±b‹X ˆˆ‘TAb¨±AEQ*ÁQËMµWéezµ¢ýÍŠ×úþ_I¸1ú6}Ð|Âu´Ö“£æ~CO.\“¦CñK‘d‹bÿ… Ê‘ B€"*‰û©ATQYdPX¬"ÄbDEV @D`ÿÊØ1H¬b ÀU #"$ŒšlÚdÿ½±EX$>(T*È‚PA 颬Ÿâ•ˆ,HAŠ0Q‚ÀPD ¤AIþmŒŒ}­TV‘dH¨1ŒY´¨ˆª ©`¢ "Œ‚„ŠAˆ²B(©I$@_øßòL‘ò”ñJ>zßµ¬YüÒˆ0Xȱ=5ÚØed‘‰þñ $‚¢0TIŒDé BCÿ?×Èôñâׄ >”ÂÃXgùe¥‚3B þÇ·EYs¬AL˼17½Üýó`?Öìi­ÌêqÅ7]*b­„¬˜•4“3y‘0ß!ú2rÁßÚæad+€ÓÕ‹§m FI‚× P(ò\DHG_Âc9u£­#'þÀ²èrЄ¬É@Wl*üXNÖ˜‚QgØ!FÙ¼ææ7|%à4³l«¢Z Öµ9Ô§WicÉ5iÖ§®Ú¿Ã  Êλ{6Œ!ˆö™åÖIM èº2¢ÐÐêÐM6–»AH\™ƒ -Úñ£L4Å]°1•Í7l*²k)m¨b°»³à4©«˜)+uJ®8­ºÍ35MkŒ6Í´DK¥Ì„ÁÉlÁ¤<œ•ªÅ£Eói”­T¦)SMQެÀbÂa¨›1”¢³fT&‚@¤Es3-­A@AG„•\B”-¢5-«S̱ºi#K«CÛDÿ‘¹t›k¸l]€ÉÛKš/ؘå2A’OØs‡Ü“ˆùæ—<åƒPò!rY0ˆ:›ÙþIݦFCœë « &·:‘$#A½&iƒ!LšÐ[Zó úcZýçøï^׃AeÖ®“Å-¤ú?Ž®Åm=ó9æfzKO•°^]ï“Ç¢d& F(;5É©®|òîqôäVÿÇðÉ80…A2çØ$€¢2,xÆL0|`*ŠBDëÍ›ƒ¥ü3âØÛáTä3‘(68I$g„§$çcP Bp˜ÖïÂ@ :×,­‡Fd&ÛAÖÓdmЫˆZð™!ºq—&rlj5˜yÑ`»Ôüÿë­¦ý¡ËaJ¯íRQ'fÎN0Øy;˜p±†Ý»ÞMónÈ&®æ´€†™— ‹ªÖÞIÄM-aqíe{ï£&8ý œ‰àyvi˜=a¤  ´`ç Û„ä…b(Žz` 8u79½µXÕ™‚xœSm¨ÖæAÕ.$‚OË"W<¡pº5³ŒÅÄSŽ •Mhïµã SDÃÏBHƒ$VÎØ"¢‘XÜÑ ?‡üÿž¿àÿå>íÞXu#NíHÁÕ+Hº¡dV?Sô~äRŒ[o·Û3_ºW¶¶–˃÷ñôâ¶ÈI‰éå³ÃÄ X ÚiÁƒRÂ#6‚hdÐ¥{Þªî¬Ø ækðÎç“è½éßulqp›îÀ'üy ,eº¦NN…µ1xXi>($üò HHŠ5 ­\–ÙM¤ø@œ@D x @]¡ìH“XŸÅìûÒà«ïß 1)Ž KÛS8Í`(Œ¤4hd+\×(AH]V:ß×¾Œk^]Üq>®{&E~gÒÇ÷GS«;¸Ä™6/®ÃþLüKû]ýêy]ÃÌŒü'PÂrhÆ-6š&Z¹hEU NÕqœàqÂh2]´3ŸŽ×·ü¿TË^Û{wýý9ü‘02zÿuM!]‰èüâÏtͧÙ?U£Í7L-^ñÝãS9¼÷y«ª²¬Klö´k€ k©AZÀSƘp¿”šųCÐâõ1=ú&&ЦZ˜Ö+£ù©DK–júS»¢6?óæ{ó­Ò®4¦M4¯ðÛi8 Ï °c*ȼø™ãv5^WfÜå•i3T"…Ø]tFXÈÚ î*Í¥Ãæw‚ ÉW%¨¸„µ·8¼ðºÂÍpf±\0îÖš[ f×e•“ƒ„ÆžÙ±AW²èuÒÇ 9ãW–6¢N=’ˆCI9‡ZNÐÍ«›¸}<õ-¨|Ú ôìú–x>içªGªÁo¶y c€¡Ó{QËÒñØ0޼6æ+`ÞÙt1´o9n Â13ìë›++v]”kåLéœøºžòÙšÌuª›:kñ6 ¹½‹¨™œ@´ó±f"쫟‚wýoÈG­ä üyÌÛàFA¥‚8¢p®÷æòkÐò‚>Û¨hUß¿{s‚‚ ÙÕØ]ïä?]ÒßÌ“ýT´>¢Þ±òyÑt c0-e—±q†!Íñg¯ã}±¤h+É>Å3Ý =sžÊÏ'žÜ¸…Y³çÁ;ã¶Óþîª>úô^¢Î_NQ†ü”¯Ã`Ãêî{Ø^\c¦âáf²4ìÁè+zt§Êž]òµµDõC”Ö¬*QAELóf0{ºCîux§»Âsº÷ïqîèa‘T‚¤Z•SM)Së0Âüºu\_,`5|ú' " 9’±Q"Äb¨*E5)U‚ËAˆ£ŽR©Ákneµµˆ°ëƒ ¶kTUúšÌg”)(` )ß kBƳ¨¬á]NŒ`=7Db%¢æBĉˆÜÅJ½ë퀬}zí×~€o‘?œN $Ë̃s^2I£¡<Ã:ÁN¨}à’!êÛCÂêŸ1Û™¿nu;i¢0 p˜ X³á‹F,D‚5%XY•Á,b)í&áדJ!}RÑÝ&¶Öù1éáh¥TÌæûê4Þpå½§`Â6LØCžXËaܨP0¿ªÂH‚Bó€D²®9?]ÜA¢ÐŒvÉåHŽW^P¤¿!e2òQ©)3]ášÛŘÃ8 ê˜Ê•Ì ÌUûÙ­KÐ$ù* ¿)èà»ä9…ró Rý‚æ°g2f”˜ƒÅ4t2'¯»ëÇ=TAý*”æ©ÀööÊ_‹(¿ŠëqßC×WKZYª´›ñÛ¡Ï;¼èˆhôèÚ{‘ <„’}mOvj7•4Åä ÀÁ àì ïýö2päÐðLMNvmà±d9\¨†H¬¬§¨‡q}L8£ñœ òÜœ¯e&ÿC¯-XI Å ‡fHH’ö:;¾ž^]W‹î)Ô:)©ÆDN¼z¼]ªBJñ ÏB'NÜN}ôÙÌìPí¦¡U'(jz—ædð¤ë ÍÔNÇSr+ ¯:H"DƒÅ¬¨qP LÙáŠ-$éë‡DìFXܾœ8ÉIð ÆkÍvˆ†ÓÉÀpNuï‰(«ÈÇ ¼*øF*¹ زbsÅ" ,ÌK6<²…èÿ»ð«ð¹ë1ù‡¨I™_Ô !îçöþÆå?;âò~ý?¦ï¿õV}×Ç^—!ùl2†\uY  ¦—šR1®Ú½ FëB5v8^¯…ÝšôÅtÛwt†P“†Tš!Rý gøEJâä‚é`0l™OC å³QŒ0!„A(f‰a¨aÉeÀÆW}PvªÖ(Þ»YÞÈ©¿XcéÕéÆQêȱV¯GdùdÍw³é4Âiš [òKéÐÏ‚X9xà%—¾*Ë(4 Í§`ꃛŒÞ¸Ý=‰­%±œ…ÂV€¥@«´¢ "h÷Â%ŸRè{78ë-!&ïîü´rã†Ñ`œ},ø4<žBŠð6k*°O|Bñm¸½¤š€DCeÅU)ª¨D9 Œ3FWC_3Í…mÌíeÁÜS­(öÕT*Fª¶¿™€ëòM¢u¯|bOfUci¹Âå’Ï*;áS ‰±ý%=³ñ¾ß‹Tr~Ø”È&´E#B±|¥ÈÒ§_qË dõ«¿‹y­_nô,¯¶éã,˜„YX^´êqaÌOºÔ2‡·wxò>ô°šÝ5aª ,.gG˜{|Ø™vÀÚL–†0ãWži3זͲު¼ò¼ö O§’{¹.Ó²ä•]³ éž@±†^¶M›Âv•U*·D··Èž9Rr}"%E<¢…FD$HÁg—Že»yõÍ’†·•h¾ DHJÞUúñ«:LJÔz>¾zç_H9f]¨‰{›bÎó¾¾;W;’ù=`¹Ç‚—ÜïÚø°jWÏÔɹ¢¸ÞBXëépö0d Ö(<šæ(^ÙäsÑ×>þ\ÛODà׿M@­FŒ@î\ GSÑ×Áb|Ï¡‹‚¿§!Õ¥>,CãÍ‘„’HCø‡6αJ‘¦x€7“¡è`ØvJo \ã”ìgãô³RmA| òf˜iŠÚEÕ©4FB ,¶l¡q»J# JYÜ·ÌÖ76à7ñ»ô,añð¢* ˆ À&§ó²¢1QEÿ«QPdb)ÿ"ʨ"3ûÙPQN/óqRAd€¨+AU $„Œ~HœgXWøôù憳jþF0îj‹WI Uÿzq ШŠA—¢’ Š©>.p„€Ý"H˜ú{}ú&­ÐÈE’$8h)‚)¬ÈBæyÍoïHqñy7‰&ôÑtxž•Ïý(*T^±´8ÿJ^]©ÄQY$BE "Â)I!"ÂAA`(Š)bÀŠ :¦¿§á±Éë¹!#©P,XH,R‚ÎëÖÓX!’†Î>KRöjÙTø*&˜ þšÜ¤ÒˆYAÑ#ñµßÌã¼µ¸eHZzôÏ3ý¯˜èY@‚y3MeZÆÍÿ_¾.ðü_z ‚)£^§ÿ™¨m(+?²Ê 1Dd"D#$êÐ-D¢"œê†g¥žªK¦CGâïu{^Í6á:ÕÀð\%XÈôüòëÍ5¯é¹T^ô_ÛlÝ`iðMÐ/3¢†ô’Š*¨’$I9¥3öÿ0æq¤>ßm4¹áívT XRKUUCŒ5&ÿQúl³ò€I Úƒh-!A%(!R(£¤Š<†D$bÀ¸(!"$€?ãúa á „­üh4E¤DŸÕ»„%aK_álæ«¿éO÷Nˆ„Oè’êØ'÷Õ–@ dDdQ„d#?J Oˆb>jލ &Z:FÛ?Àˆ%–µÆÍUˆ•T*¡*Ú*!*È¢‚É}©‚jCï¥G„z.DE™)b ¶@A‰t˜¤$!ù—ô+íQ•1 Ï·Ô­OµÓZªý©«¦"ë|c5_Ãô™†0:‰”¬H1ƒ2”`¸…b‹ƒ8qeöG¯ùzý3ôßAO¨MpÒ`€ì+NŠØéõrGØJ-æI ̇b±þVŸñhÅQ(Z_gQŒQPXÅX?Ø-^„#"b!L! $éoíÕ¸²}b¯ôˆe>¬ïf‰”“ìɃ C›Í¦j«^÷¡I¡Õ°c»öÖ†&ZlË Õ$š¥"ÉË9ÝXiŸèÔ›dÒH¡\`´C¨æ>£ Ÿ”R²îÎA˜3tuÅùù†ÌwàÇŽ¤j)‚ˆxw0ÄA”‹è'Ÿ‹¦zõ½Ég±E ˜ÏŒcŸ:ã]ð¥Æ Tšörh=2A„\£Ak6^/Hqƒs7âqòÅ(€HOSã³z*ôÍ|4Mºç×4SZ)Ù<œäæ^5h5}·æhcÜ…B ù=[Á%ÝU¯Ý=&(ñ°Ô2 ò%uˆ¸…ê02RÐ8«ç¦û‚1vØÕ’IæPB]¬U‰e¸i”˜Y×›N±4½ –²1YÁÑÀLòg6™dÔ“L‘d¡¢~}öóÌ%ìeÀ$Ô[²œ¸¦ÒæóyXÌØS I‚5 l›j4À†œJÝq¸BaR—^D h•¬ìMᱸB<è8ênù™ø|zï¤ÎŒ!¡Ýé㉠¦s€HpÕû»³Ä¥$1VkY$X—ÞýH_ƒy« û=å !Œ1"ÊÚTJÅ@*E­Ž˜1’A``*ˆ€$ˆ,ˆ .‡- òšU(ó›¨3L4ñ‡X‡ÙÈ{÷Ž|C€1¿kçסža¬^‡:_l!\KC¡á1.ä<Ÿr&~ Pô"Ú(a²p@ÁZWo>…ûö*¹ßÎÏnøòM1Rî‘”;ÌÄkKnq£_$Àq>^'Õ„Ä„Žcíп· á3Ûºáà<ý{'x¦É±Ñ$’?_7˘é-­²ï`ç¯xXx9>±|<¹ì¯*Ò)ËÁ$“¯àÏ×\ÝÊTObˆO.új!x :š/€8Ä9 ¹d i×XL2‹à¥u N_¶³ÈDK“N%!±Ó|ŽºÞ:´¼Gˆ ®ü!±bƒË Ê&&3DH(e)1Ym„ÄÝÀ $5!1 ƒª™C0¢8†• ÄPrap¦,¥1CI!Ó¿pÙ}¼[¢·¸ ¤ $å!( â4a›–Ø ¤Axõ½ƒd0 tóŸaT TCö `‡û$ ‚±Dþ,«Ube6”Q'çh(ú}€óžÐ?³90DVöঠ? *:ý$2`‘dú@K%µ„ƒÀ:)!UžÔ©‹F±>ÜŸrOHšÌž9Œ‘›$Ž•#L¹ä¡BÿnûãY8ÅDo7k˜ŠfÛ—Íë‰yÁ ®Àæ!  Â –€åB2bh'SFoe¼K&¡Ù-yñÎ÷®o4¥¥ŒyŽÓ’…äLßê¢G\ë]¼YwÙÙ÷"§T3+¤«ÙçòÔ4ó2)aÚIQ"ft8fªæÜÇãFÔMYHŒD6]s6II?jJ3¨!*¡Þ€Ñ¡æ?]£ãf`K6h¸Â“\'-¨Õã…Ô`XlZë-›åK(õ³ªHt·YM€+ì¥ä¢Ilô0k¯*.qÞ™¨³‡p®»Œ^Öno¶ dÒ{Aîœì®µ£&p —eQ¼}`ó®K%2ÂØ'ëzVpõ@äzÄ7{ œJ±c¬D*,ûÂÁ²§'´9ìRH½àh· È7j$Æ£›¨eЦ` ´t9¢j¨»ñŽRÕ2J ª‹ˆHµSœDð$Sâ ·Ê…TÄDïBà j%E‘g4 T ãEàHVÚ¨0DSæÔWo«ß@¬O-Î0ÄÖóåÁMîà…Ÿ&ób¢ïã]½‰é¨Àr’øgi2@,щi¸˜H$B—wn€æœñtW2†2T;ëÎSšÓ‹¬4Vg#p0ÇѪI¤©s2 è°©¥Šái„‘42 ûb:xUë<0 ¢ ª¡A¹[åÛ ¹Ý/«1g9PâŠ5Ž5V6h€s}^1jæþÇ(öDèó_›äwtò¤’¯ÊMCYAH8ÑÇ0·/Œ‡Ÿ£Ê“RF ‹&ôV˜‘™òV%ùQ˜¸Ÿ‘„â &žQ ;J‡¨º™Œ¤±ÂZˆ 70úÝ`å Í2¶ÛiQf³£``“BZÂ Ô BÔ%f¬²–(% ‚h0%JKI’,Œ+En²f´Ì‡Z©ˆ)BÕJÅŠE,Ñ’d†,¿yª †¼rávdó³íyqÞéó&j IC†0`nêÜ4èDÀË”- ^4¯P#ð~~=æÖÇ_#&²Þì¨dì:tܽ!::Ö0£ˆf‘èŘ(Yo„'/#ÁÖøŒ ò¬lØv¤]'0=¤êN&…´CN’` YTTÒÃÑ$™òâlÙx,ÒeMÍnwÆ6I^Qh¨š@ 5däyÔY­‡<š HB:Í£¥º ÙLÍ8MÛAQðA<7Ã…ï£}I3:-iÅx® ÷x±®…w©R‰G´Õ@µáO±ÑÌ'¸{°`Æ,DQX(Š ©D?öÃû°ÐŒƒQO²JëdüÙˆ,÷ÝÁŸôj1€Ç÷SHc"Å‹0ä¯UibÄó¿éÎØ ¿×=*/²ýæ…›qb.?Õ! ~›•ê†A¯Üª´¾ó<çŸc^ o ä$Œaã’dD‡’~ô”غ¢m(*âAjz5çü|}$žg‹Gö š|yðyBÂ_4˜â ,8|å7îЙ.&[*°ü×ÁÊsl{¶[,⠔ἳŒ—AÇ·§â»LŸœ> «çÏ‚¾Bk÷¼ëDc¹=Ðn@U0´fýrÑÐîÄýžØa-ÖEñ柕·pâMWÆ¥ïiÏ=<éŽÉ© ŠÃNÍI³Cø{q„7éX'¸(èh½!¿Ã÷a‡Žþ”?Ы÷_\ÃÌdŒ£@YI3ãzÙÄA‹¯t×'ÓÓ¥Sb2Šñ+%óßãÛ?†ˆ¥Ö޼v}¼”€DD68Xsï qå¾×$½ïkèzÐî*§ˆDó§)KJÁH|“‚‚Ñb]¡Ðr¡‹2`¡- Oòhâ1'¢£« Õ!t¹3…nß ýžyÁ`| ’,`E (b˜ÂBDH,Ý”†1dbÊ•’ ’i *()ư1…E(E0JŠˆAHB¡ È(O `°ØIX Gt 1``EHµ Y$‹ ’¶ ,"‹`EÓX,"È !+ ‹"†’s Ò $ð!ÄE€¼ÏzI´weˆÍ”;‹ ïk4Ïà@,Ö¬ ƒ# TÓQLa"c(V– X•…LVT•åÛ&A“-"&e\V,Ùh êÄÕ†²˜ãœ1@º®èÁÕÓ–âgVM Œ4›&ÜJ!4â) ñÕY§MC|æº[˜ Œ^Ý”@ݰ7—/.Da·LÞYó=·»¦†ùç:âQÿ¥½«›âJtœ"(a—8«C…ù 3ãÞú©+iªÖS˜O“è$‡,‚2@þ™džÞØd/Ó׌?›s^®¯ŽPG­ÑÖõsNœ´ê&ƒH&ˆZ&¦ûhÌ×óŒ—5’²[J%Ë™»v5MlL¶­-Y«G#x`O¹¦!†àó'/r™ (¹ p_Îrp/Æ:A\ÍÍo°ûÁ Äš8Ž£"ƒJÒ•;þ¼ú• Ñ#—¡­cRP÷ùuú/c™TÐ 1ˆ#º˜ÍdR1ŠEXáaJ¥b®Š` ±>fod‡ƒüfØ(V‰µd• À¬ •°!´3Xä iX±h¦ I ±’’¥$P ²H¡’°°J!detx r;‡l‚‘aÇ[° ©îXL’š¹dÄY0t!¦%E0‘b|ß™NMhÎ585¤H°¨V4äÁs›?j~¼ ½Ûkm²`Ó«‘‡T6¥=kN‹ÆhƒÆ˜ñFÅÂR Ø¡w"†é˜‰¤äBÉ%ƒ¥FR‰š¢ 03DaS}]Ûb³žƒ¼’Еºl Ÿ!£„2¸³i ¦ða‰¶líûévøõ§¢~l8æð& #h~}½OFTã¯_ŠqÉñÇF#9´9£"üU€v¾0_ß¼”* †Š 2Hȯ›Œ%ÛØ ä T¨˜’!PFE~0ä #rRHq&(AUM %¥¢…ÀF0Uj 0^$´_L+¤¼¶á‡˜(i„ÄÆu¬õÐÚ!¾÷!Å#Âú˜8 ´o{¹gs-iãvÊh 0TA%à$“[¦Æ”ÃDA A„´ÌL¡èâ° ¢$ˆZÚ!%ÖÚY® +¸Wgx-C™È’Jd´01Ë:"a¡Å!À\?ŽWy­E/Ñ8ܘ¡¥ÁU-.T«™M%}qœrW¾þçÝa€ñ:fÑÍ>{ÒÉ!’@$H#",dÉЉ$DäH¢±Wx{OsÆ— “Lê¡r bÖæ˜8>\Lbµ¤Ö{ä«–ÝLÝ4æ]j’þʰòu3}ð˜XBh::…ìÞE‚Uéz k_"ã}æ´Œ* Õf8Ô¸¦b¸Ú[(Ìd\¹˜…@ÇM! QLf\’WRÃLCI€J„”X”…° Ý–[aŒ¨ÃjX8)…ÁÂHVÉK¡TKhHMJH…á …¢B`UÈ‹ï¾Ù·þKÞ]»{ˆ{­:X‘á,Kì±8:‹Úm…®ÁSŒœœÜé*Jö߀kÜÛD‚Anjëü"‚iÄU‚À"‚ ¤‘aB, U Á‹£ÿl?\¬0TêÑDF(1 €¡ÁLpE‹Rˆ¢ ÄdEIª£û¯æ{Ow$û¿OÍcX…äfÏqŸ y¤T¨DF ˆ##ª (+bEV ¢*#DA`°Xˆ¨Áb‘EŒ@QF ŠÁ±@Y`‚ª,‚#Š«‘TŠª"QQ‰D@bAQQ@T`êÀýSaɾ?oëO»ñù|ìÔNˆÏ óœ4=g[‘H³¸…œ’\D 2À~ªïš6±òisõsAT¹DH8hÒøî`üæ&‘Ä—)çÑÓk’4ÌiÊkŒÓ8Cã|‰<%¡qŸ9V–Â;žZ¨ʬó–Òa’…zÂÇÐ,×s²o†´øxÇ Ö3Å^é|›Ðð¥!f(>9ìQ"¿It?%º6˜UCúªlZjÝÉï™+™XÝãrÁ¹}YVLNºÔÎ{ãIòMŠãExÆýúÍsÆœ-°§.ãž·E0Ó|ZB !¤Ã6š~)Íã cXåDÒ±xu³y¬Uêè1‹ŒŠ©qEbADdG0JˆŠ–%"3È2Á“ " *.íY<0„*" º²J®Ð©–ˆ›B« «† JéÅ"ÅB¦2J˜Ðq‰‚ÁfÚ"‘@FC-Û 1a•4‡·°E[Å OŒPJ¡¡ˆ>O'• ™Ip(Pø,ùøÑõøöð|k\·æ”H‚_>i¥9¬¢ƒd…îÂüÖg:›iÃ?€X7(T±Å®n¶ù¤9[oN»í´±¾ü¡©`z/r7ùU^‹ÂJ+­íz/²iްï* Q+ ˜P0`h Õ^âQè/Ëøs«`/vé !P%d’‰‘£'hJ@ÌCÁi€ßh´T6A§ìT(£FUBIO,³_̶[@ Æ\KòáÉ zl¦lãÖ R˜!R5 <ìÞcÑÈÐÏ=÷$‡ ‚œèA1SÇrL_{¹zöîwb‹Ò˜vDÈ„+e¢5ê–ÓÃé5³æ³Õ=ùöÎòЈÓLC4ÍPD®Ti¤†‡¾~c@éïÏ=tŠ ŸøÜ“ü½° ÿ6DEbÆÃiÒ¶Á‹?Í’ƒSú‰úïDFyþÙ™e@ÿV ²$H°‘|ÏxOJ{™’:zÁû¢I‡ƒÉÝ Kíöß×-q‚Ø£uD6ÐÄÆ¥‘0EÙ_ó:œG¢„€ ˜5ž¸Î±ŠºH*‹MÐÞ’w%Ôé²  ¢òJαu î&2YÔNr½S dXBhP`J% êÐaû˜Ð+&…`Ì yë»Y¾=09Êl*Ç•´,¼]˜Q#¤é…ð„ #p3tÆ AH$XK=»0M$ë„Öh€†~"·mvÃùEME$ì+c0$l _~8çŠ'à’«{–܈Aì\ˆÎþvz`ÙÔqBþÈqáàÔ’™fC2ð8¢Š1"‡Ù¢ˆ¦ç~QuÁçðõôÎáÃ"ÁøüE% jD„Q=åþ'“X ¤Ã›Ž¯yÜâlh[¢nÿ|ºæ_Tƒ ÚQ@oñÙà!ÊòÏNAD?6XÁIÒX"(AŒb¬`1bDX(‘I¶ÄDü!I˜_¹ W÷µˆ ¡ÿÒÒ'ï@¢,'Þ’™?§õlÿ„ý°ph6ŽVꎮ/|QEd@EEˆÄ:Õȳi%@–ª“Á>“çàó,}ŒÃäúˆÜñŸÐG'ì\%íàà:ƒ† šýǶà/.• ´ ¡m¬Ä®=° –"‡ƒTOø61wBˆwJp&“ù!QGTé¦Ú!ŒÖí)§"Qá¼Y¼¤[]]èþ)ÅÞiÜ6x³N¹µY7dÄ‚Í!¡† ›¶.'¿Ř 6ÃÌ’ÂaÅ(ÉŠ&Á!Œò„•‘`­IY¶Û 츀m/Ë©†6&œÃ¬<æð¯4àEQf[cnO’3"m šRFN<7ÿ¡kO:å‹;@+ ÙI„¾›uÕÈΦ¸0°ˆZåQÌ»Ù'ÆîCœ´[§/Ȱ†Œîœ \ÄüôÞq "E„A‘C”ˆ¬‹ "@@‹„@€(€¡$Y"ÀXH)‹îÂÀ´€Pø”#—áÄó+’‰øõSlÏå]¼ÈÔÚ 캩º#vÆ»=  Ü! :d9“&ˆ'Q<•ÏŽ¼ö‘ȼÎ\3k„±3¶ÛÓÁ9ðæßFsEæÏ@{"A6Od´]Û†²d*¼8d êM@¶èÉŠžÐÕ¢hÇîÌ s2˃1‚&e&e*hÖ¢fSIUÍ]\µb ,F*UXcT`ïY ¬»M,‚)¤¬¦˜;Dš–0‰‘5kÅÁÊ‹…¥°²xu½LÊÉF*…dÕÚ@´ì÷@éÆœï¹]ž°Û¶Øl ]ˆ% …ˆ˜ µèÖÆ4tCtp*, p ŽLÑ5ûëvãu Pñ9À{.M ‘FìHR4!~cšaA’²€ê„1DX,ETF((ˆÁdR"Y‚DRbHa@F `¢Šƒ° Œ&™!*La[¬ <²IEÑDM°1!Œ¶™’‚a‘ÂH"@qÉp½B‘‚ÐÀ`"((„• Rܹ‰EDT‘úÚbk ÕS Ú¨‘¨ÔبÁo+“È8lOo*{Môu°›„:¥íIã`z"WÕ{Åh~qR¢˜@ÀÞTÌû¼¡N>½xÚ«~2âÙΠäCíÂîǵNŽ GªÀÑ©ED'õIXÇø|Y bª~R"‚ª²( ýÉ B¤b VF ¨"g·œð§×ß*–_çß=•^GO$×Ôà\0–$×þÜ =Pãë^ˆ1ß9Р,Ô¡)PÉ ñdQ …ŸÚxÆœºB§.d·À–ÞË'¹j²¹‹à¸ ƒ—>]qd0Þgc¦ûµ‰®þs8B dš*ß´ò,þXdN/cƒ\5œe( >L$\|¶F a´¢õôËQ!Ùîv]‡^Ùã¦ÏÐçÞSž uÕ˜í1S¿Œ½_¸%É ´5 xA ”¿z'ÚÎè«¥C ‘‚Zˤ\í\˜+Já¤7‚‹€58F$æbRÒ5i4Òì…š&¡_wæãÈí˜s,—§kˆ¤Uý-å+4VËt‰ùA3¿ÎH‡`†GÄd‚Ñß['ñуæDYd$ѺØF‚u`!Jaš´L0|¡ÆÀžÓ9”· {|0nÜÖ À¾$ ?À7õt™¼Ä²Äk´D¸ #UY°kÙS&S2U\ˆ2 Ý&HHf³!_I¶Þ7~>ZuÏ\žã×±êñï¥÷ ûz¯°2ÏÏऴqå¹ÇpµÎT`áBÞ勇 !„!I¤ªE—& „ôzß&ñt’»úV¶ÜÎ7ÝÆy¯O0o!àï Òº‚ÖõŒVkU‹óVÙéPÕE91ï!4²ö‡wYž]ÛâMrS{çË4ô68\oïäÍJÇ r¨Ðê@l~àÞ$9ªoã9à¿–¾õv;ÕÏqýüq\F›lóø—ÒÚÀXgr[·$%8’HZ¥e1ätã8CCnœ¥ ëJ'­Þ3‹­QÚ&GXƒ\´Y‘Ê<%ÌAÓßiP.ÖÈb*2”˜6Î)SŒÂÑ“" Uxâµ¥¸]u(P4Âͬùÿîkþ§~¼xùç¾w=µOœTÂÌpâA™!6!f+Ž4¹r\mj)˜fVJ‰—3Aùîùì‚’ !ß…üc}`¿D…îA®²‘‘Š’z¶@RE$<‰ÆPD‰$JI‡¾Ï[ŸX Œ,!?òÖ²rŒHˆª",jñu¹}·S.¼ôîrw œåU½9Ÿäó‡=óG{{N«H„€²0…Ðq!%À\ T@¤°Íß¼)8g’•"ï\ôX¾ÙžÙë¾uÖM<="ª(¬`°AdCÚO PR7 F~Ïݬ@PŠõkb:Vq‰_.N. žL›•sv ,Ø’)Ã[•¸so:Õßb „ƒ!Á÷|AѲtWºC˜& ŠŒˆè&. Èâw-~&v:»T¨q˯#Ìwg£·]±ïó‡åé‹Ék‚4@£U³|k‘_Bà$?µ¡Ô[4#‡·@ˆ¬$NLo«U¯K:kÞrE$„{šq×2ùähš€l¬3\\òOW áFIá 5"Œ[Éz…(Õ"{¾D.\” œNãYäKø~ûùù¸Å/Ee(ý®ó[Ðgñ?_/Sà?HBSúB% lº]Ú 'vi4 ‚Ô5w”{ñíJÀ:ŽÜåÙÓµËÜÒK@:#ˆ¤‰"0(ÁHˆÄŠÄTX " ¨ª08§ÎÊ´D»ð¦ Yüò¢C¥äàÈ岨;TÕ!>88s•‘A'1)K$± 'àY f5‹!Y ¡-mC[ΪW.ÝùtÄ(ç®ø+Ž÷"…âŠ3`cl“|î8ÞÕÍañ~ZDz bÅ‚‚~t±Qb‘ ¨ ‘"È((¨ˆÁEW¹ô÷.V0QAT‚ ÂapÉö>ß?i˜¥à¢î®UÝÆUô‚|Ót;ˆMñ»0Ž —%D÷”/Ñ’óƒêDKÂAŒVF Â1ˆÂB,‡ýéaýZ1Q‹8Hb,Q"Š¿úI3#ÿ7þù$:Oðàþ¿ëÌÜ ¤Q‚‚1~l£ñAÊ)4D÷dª­j"¬úßùáb(Å+PX*ŸÝ…Š"(0@AŠ ,J(DÃ*`°’,U?¾¾xiñka°`¢€ÄzhÆ/«X QB) XÿšmïÒÀ‹`bŒTA\¡RwJþßÙFUE‹þ0¬{|göûz|ôÔØˆþUDƒ!hçÜÃR¤Ô4‚u™•‡¦0 鳇™Ì”{Îuš†X¿àºüîƒö‰‚!ýâšÈ—œøÀŸ, j|£i¦ÖΰŸ„Y–&Ä‘(!úEVŠÕðUL ‘5]³Q”.ÕåŸD.sÞŽ’Z³7~T)—γÝÙ'Ñx å•=8ØÊ†ŽÊLaFÒj:Œ´Sù.§hµ5 <*…PH7,'˜ –Ï,ãçš=áÆOLãB”••o£Ï¥÷su'õ¤¹å0o¾IY¦ åÊÞëçêùÊȳݩ­7“À@'=Sóö(s;˜ð]íTQAbc$®zùÝ ÿj*,†Ðç:ЧJääÉù¦ž½È ÜÍî˜CHR³[ºÕ4¶à[JrÎ¥WtÉÂÚó®8=´¦„Q'7Œ U‹´²(,X³ÂK-gy{ÝÈÅTŒ J0b§‚Å`Í5EA€ŒF"Æ$bEb š-EŒEŒX*¼S2Š(*"¬UPQ@X¦é *ªŒV,_©ñÇ£{‡ß<ùÕûìéƒÚ xíûë㘦Pv‹ÞÖ°Õ+(œÂHüc6!â]çRãòÖ¯U ÷½c1̘¬fÎ6PU›7‡ËC}ÈMï nU޾Ï9„^´ö{ñÞ'pkPX (ˆ#m‰Çƒ“868†hžÛ$ò’mH& Èl(I:g;§ÞSg<ù2ÈÍ^_¢s=­õ;­Ý+ŒF¨±V1"¨¢£1ƒ*ÁEE¢Qd{µ,… ìÓö³&KÅÚå62ˆ!·¶ª¸¤Y4í‡øèÛ’3U,µ6ÉXs5hiÄÓŽjîÑlb‚>ÕB‡@•_ãEä¦*?&rO1dxïW¾}­óõû{hç@pÝbàƒõŽË$HÌ)w'³¿JîÒâ¦Rú}ØhÖÆ³0¥U¤Q'Ò×-DC30³í”Áž|Rn‹r÷.Rñ#l ‰âÐgaw„Ü=!K6ÜÒXê¹ÍI~;ًئ$ˆFHÈ¢¬Ь°²|¾G}>¿‰ç DŒQ*ˆ–™Ÿßû—û³ÿ:ÿó÷³xyvñš›†œþwÿ ¼žÞ“ì‚BˆOLªÌ_7Ö¯³_€¥Šòõí­ #* 1Œ`±IñaÆ;Ö°¿cYï¤@þÕUy|ˆ±ˆGïí‘4a¨8‚X©uŠÑ²°g•¯™³W9ÏçUK܆b+F®Y.)†µò–T@O‹XÅb@¾ùç6jõÁ­O'Æ÷Á$ƒ 7ÊÚÜö'\‡Â¢Ã`Ë!Ò¢ªiÇL娂‚±$ü¸976œœ“C×÷$Í z:಄:üiX¡žn 1"ª,UŠÅXˆÁDaoôЇ£0iÄÏæQ×h_OŒ6ÆoÆŽâmôaÒ”—RÈpR×l<5…BŠÂ ( $RxªqãG !yiºÈPs°›² Ûc«³BF†o±ùý,4óÒÐãõ3ßo€;·]ùŸ,ÚjN52@ó—5ui–©XXÆ"uÁ¾LèLSøV”}á´K×BÍ¡ÄëÆ®^§¯ŒmÓ.RwëÒ'þ4(Hbš"UXøyvÒô)Á³ò•ª¢F¦°[’éUPÕ ­21Aq&MЩ…N»Íîμóˆ/,<ºNË|[põ]*$ ñÍÞ1Ôª²h”D!”,n7¡ƒ1E( ?X2ÆN& ˆÁ¡_‘èÛûЯ;éÖ°Úñ\¥^©1PÅ8 CÊIâxí®LüãÍ›§úè °(щ FÚ(¨QJ¢ÃåmY·^ÎÈÕVÅä06ŒE±°(¼âvÙÔ¯Ÿ†îG†0ïðztåõfË/[?=­Çâ-ÚbÌ'\ ø3 Q€,T¸£J*¸IšÔ„ šºÒ‡‡ Ã.EN»uæ³¼N4öÉX ç}Œ—<¸ì³8çÀ‹yR @:µªÜá ÛÂJÖ)XbȨ*£‹±T¬…Q*˜Ö,‚R+1EbÅ0\jVy2Ì-$Qe¡`€º°RˆI4ɤ„‚€€¦¹9B—g§fÔE‘dQVx¿÷É?ÝÆ#F"ª ‘?ŠCúÚ“ÿg1(‡É%?øƒc”Eñü`Qý`?Û* ÈÕu} $“ÛâUX÷ª?ý¾YBÆk\è1ußaÖ~|@ ²þ %E ±~M (X)QHŨà’å!Y H¡€E$Š E€ ,Z ²E ()¬dbP‘d’D! T!QD‘Ä579&â%`|2LWV€Û&£1 Bœ°Ûݾ&™XV,• ­•ÏÁÔÿõÙÔñ…*2s]GT†ÐTý¿™ÐÁÖö&OØêÐ85Wô%¸¾<«Óù/CüΧço¥'Rνqöím˜Q5¡Höd=Õ…®› L¡½ð¡µûÁÇaÎ^Œ¤\åI¯N¦ÓF.§^¢×"{¤NogõÅd˜óà§)pÖUF[£»dðºï¹‹$†¨å¥©±Ì¬îœÙD  {Cž|Ójräuî¼nùYz’&ðûuÆÏïësÜø„*{ °OÆ…UŒ‰"*:+@PB±zö}ˆÈ}y8§’IZ9zu»¼)pìôÆó¹„¯vÈf‡d\€løãg9à(F‚ýÐ70 ›ÒæH^ý”"œ„ã(3-¦I!©ÂúÀ†íu /˜ÎŽ!`‰ŸÒȪ‘@>̰é¢Â$ê‡ßP¤ÕXp™»ÔS%W$Â"÷H˜c)P(”0DE(–RŒU€‚ȰR (Â0`ª‚ÄAE @ÈÅDTHÁŒb"0X*Å“új‡»3 z7¸d ÎÉäPöªDdë’LýÐAUÚ (ˆ&d³NØh BËCk]E3JªJ¨]–Éš×%|múj´Ý7TÜÄWKJ×7¯µzNÐñšÛYÉÜÀ%Ý7&¤8ØwSÇ@{›ÛôÙ´ *ÖÎFH5·Fš¡’ø" Y@aH,4pÃ-åJJêöÕ^ú×`㘠€®)ª_H[cܼy.‹j)5Œ£f7B‡y“*Ÿù^°%QÆS)ï>ýaÏÎÙùZŒ¡™\eWɬµô%Ö‘E¨ÎDÌ»CZ¦kq84¢‚6*›˜ÊióÃbEü^3ƒ$he,F–ð¥k˜r“„MüpTfØZT+¤tqÁþ;œeâï\TóxÍÏҦIPŠH*—òýO¼•£@*Y^Œ E„KTˆQ{„¨‘‡364jÐÆoæk!ÆO'ÊÒÑDPÍ×åøäµú-Îxpßùþãmfx) bÎ0—nçÞµ>St#sX ö³­k·NèpÍËWz† åG«–B‰И 33§¼MµœÉHq­ûKÎu‚ˆT­^yäF:´wÜAE˜9Ñ„QˆžÅ¨ˆÅAzY¨ œß°gå•MÇ×7@³32#Ÿ\ÅŠ!²Vå3¥­`Œe-‚Ø–¿ja‚Hø²JGîj¬YPë,E@=^ÔE¸Ì”ÁUmPÜ=ËK ÅbwÊý‡$ÓHœD“µ;Bàí‘j)ç[VÝ;P‡4u¬Lû·~šötd»JܱS;< #0²aqá>–Õ]ÁTL<¸^Ïw5}ÿ.t»7™˜RGò³I0¾ ˜~ÓeÓKåÏ^¶g1G¬¥~0¬}]§+û®n ]ºdÒE(š{I§\SiQgÌvãŠéÁãY“V™h²ÿIÖ$Wïż- Ë$íUW²¨hG/[Þ/†ùG«Ó¾ùÍBp¢Š0©)Ô,ò#€Qã„ A9|`ÙnÛú]C6ÒÚ¶õ×[ÚJnòÉŠÁœë' %†Õ û:sƒuÝ‹¯zz—f…q E‚P¯N‘S°ñâgÂ+Í]ñðÙ¶ÉÊ¢á6àÍ[¤w˜yä7Ù­Åx PDDDH19]ÐÀg«>Ϥ'l‹7êæÔ±×6{Ü£\_>5;5K±ÏåÏ¿¯°i6t´¿¯¿³ß+™Éœ‹þNלd´c-”BÛ¥ž_¹ù¢vÆýýObfîò¼äAß]à …]hì±`¸OSJèQ,m'Œ«´giÁšXi®{šÏz´°*q/]’ÑÃ5…3~¸÷ï‡æÂþz¿|Œg§´)ðsrVÆPx4ýw…ÙÕù5²@˜N{JÌ0¾ÿ°ŽP~Ž[ C/½¯Ç+ÜüO—·—œ¶!R&>áþCƒ•¡\èz9ÊßFû[¶Á6@œŽ)ˆF0QçñÇ :( ü¯~YŸý³Óº†m¯/èu/ÜH­A®ž¬ßdO(ƒZwCDM”ðwóÁ*õþ.!ÿØ(ƒ€´÷€{h¹§\=ôûï[¦ž‚<°DŠùœd³ŒïÞ«èå씜 B %O¸MšY´ðä‘’B0ƒøœ}.fíúÙ݇¡¼þÖw ùŸ‡ÛUMo˜}»Ö¾Cªj-ªÉlú'Va—á|Å}µÙt~ Go íyÆîÏ¥ùÖýÑÆµ±wï%­àŒ0?^¼3Õ¯>;äóNG^Ih ô€Iˆ^LŸˆà>Ó‘ŒŠÈŸ¬à[§\þóæ¢ýíÖO! âç}D @Òkª¶dpe˜=¤Y1(H$,ÝÐj·qˆ~o´4N¨˜ À"Æ~#Lí½ß:=á=šŠ·ÿq÷êbx4›GçJ™²Y.á“ýZ«ð$ Ÿ@¶ÿ߯ŽÙ‡¯Ü¸CM¡’A`þäí ðëÙõ‰™v f¿Èîj¨HP’}š*ýæÉ¯ xK³ÇÌ»óúûÒ1~ê’ý,Á\Õ“Z†\ÊŠ±aUO‹Œ‘d,€²?¥Þ›¦Leaˆ9IŒ¬$Šc\B°?v¨¬ÓXr…ÑK]gû;58AâÀåËË£‰£6s³P&0L*B²A´“¡ЛHI¤8Ý„Xåœ&#¾\º.e­.iCxS–ÿ*s¾,âèâæ],Ô@ü—œiÝHc²( 2ÈåÃ2Ï^džÞ2ÚZÁ“‚ãEšhVÒþ— ãV4ui¤«…¢¨ªss°«®q͸D¢Ÿž±1J’áòëww#{¶ÍY>)–%0ÅŽA‰!J•R¡HbÀÔ†w:³„,ª¥V‹$I`ºÃ–¾9ևÀ^&‚è ÅT…[²§& ‰ý Jƒ1Ûò(‰¯§ôþ`~­ì}Íž:Ï­_©ó«N³3o•Œ ƒ—"*œ$Î:9ÈŠ€ðåÔ ¥¤ÿ1Qè‘»sã·Øù”À|òËÀ ¢·}{åçqAAËPƒT~Mòû“Ó1Ñ{2‡y\`˜<Àñ3%€ˆÃISjj=õ Ióôòï k”Û=z‰A;£?ÈíNÑÙ¾~{äB¯£"$ OÇÉ>C,hž· Ž8t⺊(N« ]¹ÓaÿdP@NZpü´Ó1 xI:‹^}ŸQ€ô! \Üq¤vÂ"æÀ E)äÀ çyùq]yf3Oš„xŒ{g´<‘T’`šw.£çÁá¸JÍß_”Á|Š*U`ÄD3¤'k!ák”Ë»ý ˆbUb¨ÖAüç‡äÃåüZqд4V±r ìð÷h&^ùûô¬^¢Kl|æÇ¹U´ì'ˆ þïµPBö-ý¯}µ=þ,Õ¯>,9ÁLuó¤}ûKÙ8`*‰b!à\C-‰ê3Ÿ×`8€„ã; Hu;oÎqUÓ(ÀÿvFÖÆ²Ê•„ûU5‘Sõ_^Ïïç®Ú4ÆFBrüïp/ãð?¯Ë3“š|´ <çÍTH“~ÀÄ}}-‰q¹A@SAó¤ ÌóØ7 $,}›ÌfvPT ùùGo|}ü‹¯žÁÏu7€ ȪH ‹ Š’"€HŠ’ ‰ ‚ÀdX„€‘Y‘ DY$X1U@V YB@" d$FTÀˆ T@HQ Ï×Dø·c‡‘®šh?Ê\‚¯\™°øPP;œ½´·v]…=â]ÿ„ ¡ãzSŸ 'Qa—,ûƘx¿b®ŸSGnÆSñ ÜQÁBN›ŸX&5çÃséšäDC„ûf÷9Šÿv8 cM¾ pŒ€È€Ï¯…{ 6°j¯†óiÖÕAéõý†Â‘ú2’ÕBŒ£^œÎƒ &D †]ô†ü>ün_=«÷Æ{ï·–}ÄZ/‰L~kä ]Xúoœ&ªÄ|”AŽ^ZxzKà€ íê=ÄqÅ7š„¸ž“èZ‚TOÓŒ‡a¬®læp¨Õ*°ïÞaP,ˆîùˆSÔJ5r‚Ž£Ä*𤇻’¿Ü¦_^æãN§ètGœü>¼OŸÎ@‰'Ê©ûýþaÛés)!”çE«ñ«‹¦§'YN}½fÕDD9œ ‚á1¡‘ôÆa8|ÛS²—­ºyàìt"‰ôüžÞ^¿c•æÿ…D°hq/UàêrØÛwØ"t½R#`Å4€Ä[aï"c>xWÍ%AAé„ ºŸCiœLÈúîô·C„.7‰Õéìû·‘™±È"ãŠàê!í8ýzÝx˜’éØ˜ÁaÞK(€)‹˜^wÉ 9ÏèFÐÙ”+KUÆmÅ@PSƒ±åôïa–<0#dPA€dQnwMµQÄdÅŸÈHmÒ’>bcw„Måy¯µçT½µ÷¢Ú>(y¯±.{ê(þ!Ûù¿?\=~_#« ëçÏ)øO©Ùçöü}yŸÄ>ôDcº´¶ÒÒ-²YUNvÚ7Sç–ÜùG[]M $nWßNé°ã b}ç]™ýaR¦öîy®ø?$~7߇ùýý÷×8Ñ#ö/cË}¿'ó€"¬‚I%gõ@/ùYX~´'>©ÊAI‚ÈH8©Còë¼,:Çò<Žpܸoâ„’~ŠB 0ùšÑB”ùk›*méÈiØøë ðÊvüVÞÂx}%ë±ËJXª§ÕJH (5&2}¬ÍÌÖ¶-4xëÇJ0ÏëWÍûþçô=1Å ³±äù?2çå͇ΙçÁÈ[ÑB×—O4‚èªá÷cèŸeï…‡Äb%T–È6ø¢|Éààžß$êÿZÿUŸñ輻ۯÆÇ?ÛÉß,ž¡^ºäd*ÅdPÞát×ÏÛ#n'H ( 'šAˆôÖá¦(æ8ŽñçxF\»ºw|ÁXOâ ¿ËyžíIZšHWø>·~¿+ÀËàK±?¹>°÷ †4‹›Í³hj"蜗aØgîìðO¾ùÞËçíÏÆòE¡¡/Ê'dk'†C–UbÿÂä#_¬u QÃgîB —ïh‹òµÓ|q˜ò;dGÿƒ%>hv†(šÞgüZ‡u§\|¨°Í< e¥tmF8­OÓ²?ˆr4ÊyÉE +§db®‡&êsο,æ¢ùMg.5âNZ¶qZh«%¼;%£ˆ,ØFYÉ(ýÖ‘­¶œËÜ,KÐóa^Oos<ùöç±×Òs}!":ÔÈÉöHLø–/öûÎ… ª³·eµiÎlÌÃ7ge}J†[2â?uðoqGûv=<ù·’Ϩ ÛÌÄÃîQŠØïǵ-YMèT­5iFò´‡Ä D©Â‚Ü.Á…Ýt„1jVr1™ƒ«®gÖ Íàxp} ´ª6…í»8ã{N•ç:é°b± ÊC»ˆŽK¼µª„2 ŒÖ5iËõ(F6‹k÷‡¹” Õ“ÊG(nƒV „w€\Þºb g5ÓÎï._üb¯[ N\&ÙÛ|9Ö*FŒ‡<4M^1vÔ 0–ŒàáÌçӚǷ‹—] $ÎD¦¶•ðÇM^-]²N€ÆJŽTqtE¹H&l+y‘XŽFNx@8°VR3¥&ðÑX†èÌÛP›¼ÃLÑS"²)F¬%Å´¿FzÄ\£²«Áœã͹]±¬Vf*……s¼˜b¤…"œ ( $•Ì[9e?nÛÝì¹Ð°g<®1õ, ”£žgPâaêÑŽR“¾Žñ ÉBkÊû0Í¢\æˆ n €m¸Ò´©Žúvè0­ai„‡íÒ]½ÔÞÎ/ÝAÆ õˆ¦áÙ†î"D@=w È‚ÁH€ "à*¡\³¬U y¯{r¼ˆe‚“%S|‰èËm! 2ÞС5 Üýž¢.„¬cÁY™…(ª6YNŠ¥esQå7™Þ‚«ƒ¯ 'E´xZ½´ïK‡L™£åW‡kFâÉ…Ü1 "ä ––î0’Ë”Vj¶ãv(°ó›;ŒŽáÂæ\ rbD áóÎܸJ¥ãÌ3h©è ~:w÷¿®†V­LôºV0X¿ #xì‡ÕN]?¦Yú°ÚAÕ4˜žù¦Ríl»ál&èCIQy,Û6­n4ˆ‘¯:ôÞtïJhŸc—rór~šcÕ§š¨ª”´D>|gÅí×…ú.7nØá™UR®3ŠÔ¹¦¯|šŽÎ*Ä(“7YFò|¢BÚoÓœiJ2ŒdÔ6âÀpê¥qnÁª ½œCxÇBL UµäCåÀ³ò†Öq^q‘ßãÍùuáßg¦:jéÅ1 ®¡Àë"JH.¥T•‚'Ü”c‚`ÕrÚØŒ£K\ÅD¥AÀjBâ´*_Ý'`¥Í]ædˆ“†W#VŸoËd :G>/£Bi0¨àJat!Z­c"‘ÐÉ„1ËËÌÀ²«qãïcÎÀö›Äõ½~ ºÈ¢›U¢{Á¨«n½˜F,lj7†Eö6ºM0¶Ü¯ÎÛf¥KJXWRc\U^>|ïs3w†Èw:â!Të¯ÃR:²f+msfç0KÈNôi2Ò6E‘*Fñ6õöMD#c”éþ9ìj›Ìø™­¯Î²A™†lëœÃ‡ª Åèd$ÌAt¨þ›Ë’Öㆆú d˜‡±G¯¡Ðqþ¼ÍU)%H)$‰ EÔKa/ £ëÎ’øäØ€´Xš¼ß+c'z7€ú=& É‚b^`âë|kú€*©¯Œ­¯Ž•|ë¼ñ?wXa£—ì¯×ï¸&²—,†H:±Ÿs³5N8¦Ñ‡å‹8²•94PÓ£%r¯9¢Â\Ô@@ç¯Ð³³˜Èsñqøñ01îÓGîÀ(ˆ@kDqMs³ñ:G¡Û?€]Aš‡X·¼ãñ}ǘ<èÀâæ·°ù™oŠvž“×3¥÷ íç@ ª^Ž›Û]}k€ÎM8½#¬óâñ>ù÷¼@Ôâ  ±:°»Ü=¤6EFPP*nyœ¦sÖ7ÄÉŠŠœH݃ê¡Ë²k,aHÇeKFóliHîY`Æ[j¶dI³ gÆ(•ÙäB‚FT) §ž²íç\ìMã‘ä¬cò£¯ýU'>fœqÞŸ·¯Œ=&¯™ÜÁåÄö±V+úÆò£% pž,ɯ}C‘^|Ÿ–’}TQß+ô¬Ÿ{ró½eÀÊ×<¯·¸¥¦" <€r%4`Q[•ª Ocôè<$ÍluƒÀZ$ô]›2ùævÑX¬\ž?3€ÖXƒ=¦Ø@`xÏ>?þ‘烸Äh¡¤¤êéÐ%ÐÃJ0áa—ÅŠLAg?kÑóäÍz°å$!/«ín$¨á7®x}wÅÃÊ3xò¥\ pd¡/Û~µ‰¸Á¹PX5† ºOƒHÖ«3xó™7\=0àð¯X¶=b¯c„ÒŽ_SŸuÃêü‘’NÐõ"YËÛP‹?ÜlApì 9Ä¢5T@ØÛš&pd™èZªj 9(HJÏiZ.ÁT”Ná™pP` ˆó³þ¶Íc”>hi&V…aéò×}_´wöŒ)Vkå³% !éƒ8Ò:² BdT —ÍZ¸ F×'M/£DŠ”¡— °s9¾b“„ˆÂê9MÈŠ<Õ'Ȭ­v,©År| `VK Y“[A‚º"’áfH‰F*¢¦gr7ì‡ml–´>R ßä ˜|zSW½¼ŸF¾‡„VMQÍ ú\uÉùÍ?Ç8ÒÅ®MÚ±‘‘EÍ› mŒ3UOl€Ä$Äå|òYÊ>oÀÌîÎS¿ávþ/–i5Õ¿…;dü·RØði”0På$jxâ´#¯82’„ºî·Â\¯%ã°È…e#0ñÆ9:ŒÓ·³´µ¯Ý¼ 8S2Eí£&šÉŒšOšŒC=»7J:)ÚrÇ!­¦ŸZŽ Ýõ¨¬ v ïŠØÓ5F.ëà ^”ï!£6f!ƒàdEŠb¡St÷á(³VÊߣ´Ù©›ºÆ†¯8âó0Ù»8»DÓ˜äÊÝëj*kTp¡¼Ö-Ž„Él«4ÜÕ)hcgÞæN3qpÕØmÅm-hòÈI…¼'âËQ®4L¶‹j妮aUf–•2ÜQmWቾ)ÆŠMóÉÿ5Eœ^thĬ¬™hUã7¨n#3yüúýùÓÍñ—Ä]ˆ¢:ùêmO9ë[Ýféž~Îf)K”5ËÁ“‡øÿÄ$)èßt¯çîUH¢,AE°F)瓘aßã°ã»í*”•bC8óð—[…øî©P¡À‘qû?sìuò ÙA&ÛüR!Î`ƒVf“’†ô|¡sQir ˜v™— á «cÆqh“ç“  m*-OÈaœYXºUSÞí=y{M_«|v+óS~'éE`Èu9€ÈŒ„³Õ·ŸgÈ/VpŽ•L*ñ ZPYaUŠˆ¢#©^~f@>áÈ ML™ óðlzùxÂ'ão¿vUª^uÎv—ñæ~ýÈ}1B(°;ÞY—ÜþP¸üGÍ«²‘¶s©÷zlB¤ý1 ÙƒÜ>=7ä‹Ü£^^=QgÖÙ**» "äÚuäcNñõ8)áùD2ìxÖ¿¦>_>}[ aÕ¡ãF¸6€±”e†2Û5ôuÅ ÂñžÉ´DGyyÔ)ÁOݬû¹§îÐm÷=äD“)ÔàâάóUë)•RªëŒR>ï' vܵYs˜B `„€ƒÖZÈ„C-¾¥\¼Ì‡XQ¿˜l´L§àÌÖ6% AuÞúF[[ܾ•ññ§®U’ŸXo§Ëõûp:Ì;øöñí³l×ËF•a?]ÞJ…TTmÒ¿Põûõ >ÙX'A",ÃE!C™BÎò¿–âKαôSk"FrýµUï„t¬çòãÉ¢h“f©„©Ì§^“pô…xÚ%ã3 ñg.˜ÞÄËE3ÅÁsÁ÷Ór ±ü8¤©8~Ëú<«cÒyË<$^x È ¼Ä^w´"!s„1ÂÌùÉç”.RÉ9½;’#œ£¼ÃÙþÌò½ædç¼²®ý*ð×Ï‹ÂáµñˆºEWñ@hxßÓ‘ýúær(>Òõ/Ç®á… Œÿˆ“’(^ÇÊ*ÈßF8E(J}q¾»öï8–^Ï牘îg¤ÕýM¾œ÷ðwÝû‰û˶<DM»®›‹ÁrÓªb1+þyŽg†¯~ŒErƒ¬¬bP¦Eîq,õ­‚Ê¡‹¾4Åž¢D*P[Fu¾6z`¤Z’Ì2Ç]Ä¢13„)9ëM#C)V ô½ø°B!t^&\Žœ]Vwîê>/±¹¡yæÊÕ,¥H# ë‘BÅÈ g$ô¶‘ gßÝ0=Î(¡W "zþýóß=àÆ–Ádœ,ÔEy5ع‹ƒfÈ™+DD«Ã |oßé§7æûísëÝ*1éîÔ@PâzŽ*(cN‚•˜âÙmÑÉ—'­Dö÷34)‰ÚQ‘í<“ ïç„‚’(M¿VNR.˜Q©½Ù¨ž}yl³¬ÖgÖq¨Æ+ÙäN‡s$¨HH®d@Dv;`P—Ñ”ÈIUÌØ1N$#“U×7£rùboëÁúzD_zÅ ÍõìÐúé_'‡õ&e48CÆJÖy1øŠç¯¾”È>Yìâ€p^YªyaíëЧú2] ëôó†Þ|ÓYO‹t˜Ÿ¾ÐêúVjíÎ x!×Á ±ìo¡;÷ÆC)¸)B) ”¨BY0 X¢@RB ÆBA"Š0 ¬Ec `ŒbVB€©`«H H¨È+Db¤€2 0PK`¡‘ AE`DR D‘UFD‘BDÈ*"±B(#2,„2(Ä`Adb#bD ŠÈ€ÀBPR0V# @@€Ä B "E0dH!Š„R" ( " F)Ea,0¨„I‹`¢À#"$AˆX€ÅHŒTˆ„$ ÁXÀ"+‚)  ÅˆÅ‚ !,„ *HV* B‚(r€Š´ÀHAxˆ‚E@VðÀ‚‘ÑÛ‡š†ŽÝ³f/¹Ú¯â¯*’œ'ír¡/ëa|¬ŸÂ'øæ‡ûXûý|hD‚…÷ÏçùM"òSÞVAõâcÿzçŠáûþ䀧UQª‰ƒ™ìØXÿß°S×N“¶/ÿ?ñ¬¾Yúz‡t݈~Z×Î}j»÷h¤Ï…¼å´ÿƒ‡CôÛ¡}+Ù öÈÀ1äT6Sýq¿œ†§Nþ\Q™^áumìZ=˹ׯ¾©gÔÛÓ§˜I# ÈH0€¢ˆ( ,€f€† §|h˜W='jœû»Ú„çÆå+F°ðÃq7ÏLa¥'\œåÛ[0«ÁÚÅš°ðÁöÖ¦ý®òt~= ü—ø¾ûvekÏ× Š~ÝÏõ‚y~´Cíàá{LbC›c”×B×½0Š£Ä å’}ClÂBCBNþÖò’>°ù(VLÕùmøIûéí>ß¹ÈZ²!åôâ:`ýX+¸ÝìwD_(0O—Ñ žÀ‡»éT,“‘‚<£/¬©Þ#ÞGM|§º1¯©$wÐflB n¥ÔG`-rûZ'ÞŠ|šâ~‰©úNa|ð‹¼ý:ý‡íOSMõømæ†æšjùwc·×Ü¢åe¸ Š{¶éÃ}KŸ¡^ON&*–˜dŒÀ’ H£È(^Ñ2JJãä;3§.Üïá,ÉÃÓÁ51š%kžoòˆˆ2x8/Sé´hÏÏùú¸¢-°f§ÈéÑ Dã‘™mø<%ÄA+K×ñ¡ø`éã ÕU1™ø6a&|Dþœ×˜Ã¹xv+Ì0`§¼‡.¾éqœfXqgwqè€nü $ºÒõs½FbdSO<­.í>.ÆØ62Ïo×MiÕX2cÉB,ÁO.Âx éç¦ctzK$À@?<&¸Ýor~I˜‚fR’LqIÔN :di«º[êÂCØÞbƒô0–Ð3è7ÿOk|•8Ý‘ðò#h H»ö-ÝG^å§0²o<é{Áë§A$´©YSÓÞA-¯·¦— ïˇmݱL¬ŒËÀÒ™r*FGY&_ÁÛ,¤¶OØëí$ØÌÎD€,I!Îqª4*Íùxê‡ÜÍÐËö¤*Eç=qæ¨tzóõÒZÅúùdvž8z]Å{€ÛègDa!ê~gG^@Ÿ#¯Çé—C¤Ä  Õ ïU×·Q¡ÙœØ‡nj¬¼U’°dsôe…^É~Ò>®H ÂËêÕcxLç¬;roÃCº7öqM6ùgF%A-¶!QŠË³†Ží2VÛ’(ŸãŬèR6hÍI|åȼk'> £FNÛuÕHöøº¾â÷€(Š$HÖ?¨Ž3`¨A"«.Ä^ ^ïâ(J´ù»bùßô ÞYÒƒÎè4µhŽæXóß™¬íÒòNÔäñ˜Qt6ÐüÿŠç€èã]µPw`)å:Ó×%x#S/.½C}ô܆†¦{@‘Âlv·P/órQØ8?P’œG oøùžNõü'°füDH¢(,Ž‹UVÿ,˜ƒü>™DU†íWš‹vu¤¢ý.ÓVb½}‹ÉäJ©þß°4ºl÷ *¿Q‡)hJÚî Utæ ãW jë>ÚÑ®' f¸¸Â»DÁÅ!û7û¯ëVOîƒô°” m^F €Cª#îsÐgÞŽ zÓ¾&ö+U A„C×÷“û¯>SÁÉ_£ØIxûÉé ¦þªÆJ:¨ÌíØ Ü8[æ&vf«ÏÛ;’Þm×´Gþ` A"–’AV"E$R51¨Ë—‚Á¹ðt:Æ_ëØ :CíU¯.ŸÖ & Ô÷§:¬Û6Ï¢NJlf0¶É7ÅéÍk_Òg/\ôçHÊo¢6»gÜehÌÕÛ4œÚëë³DÄ!mâ¬ËeÞ§"~иî™-œA†[ª^}Q£‚„…E€Zeœ=rд ‡ôs àW3ÙèQÈçžFÛ6ý/çš]+P^¾>ß>¿¹QúP(È$ Bê–,&_Ø—-ößóÃûâ3†þ¹ûpÒˆ¦ (ã`‚¡m1*)P®\b0¶/êbùñT\ß§Mo¶ÔÉ$‹QîùèBFF!Ú5.y;fq˜âpá¹$ˆÖ NU$Úšã@aøô<ëÆã¾<S»,¯·1Þ8cˆ®B¼Y•W¦ÎÀ˜#M@ ƒµ0Ï[™¡<²Ã•1êiµïü%Vúð%sp8a5%TFó‘íþ‘Çí×2ª ÁcË#ËIŒéÉ×-}þ-ïºë’£g^ȳê’lLTªšqþ®}]²Ü17Z[oصvÿ”³lœ¼Î5Æø¦¨Î%}?Žçæ hÿJD)€•?b5@u1@Bâ#Ôñøž']ýõy+õˆMä;Ç D"ŠGç$Ÿ‹ ÇLjC/\¸í[Ûé_r7ð»ì,qõH2¢ý©1U~/B J#+§[¬¾ Ï<Í^FýË’ÀHËNõ¶³nrò‹†çvxK• ·“gYÝ@é~pv4^ ÄËkÊÉ_UYbMšÌrº¶ôŒwŽ1¬e [‚çNÔŒH$›eufφŒÃnu9Â,eó½[þ$¯Kð¿ a¸½wkH^Mnj9’a8O*ë¼7†Nr¢æ¦üñ}v·ø–ô®‘…£®·lž¸rÏÆr£¸-ÇV„á}åŽxµâ»ÚÛà×2††ú¬±åx£® Ùi•a†Ø^HA¸òäÖ­ ³\ð‚Ê®ÛéY®b’pó¥ï(Vó†J'!£Í¿ê“ŒIëÂZÖºœxеFZ[™ã<'Ó,ÎíÉgËnQÈÒˆE±Î{^ÍaÇ®»?<ðq¸ÏDì58Õ R*šGº¹c+høãߟy4P0X‡.(l`óä^ðwÎx°–æ‘sU£i™'18áFÖKÓÆÂÂ4H x8Ñ:n“3Ž{ÖÈŸˆcp¿Ü>‰D‚ Bd½*Š2"EEïçlµèñ$¨Óèâ1C-‚2%¥âWØÜù×D¬ÆŒ *-f'Ù0;í_»{öÕâþ;OŒ8ZÍ}E@¡=¦æ4C¨nE*ã˜M×@˜§"BU'&'Z¹ÆtguGÖ+Ÿ¡œ°c v”3@àËËpÚêh€« UO8:äOÉ1"..£Ä›Ið†ÑÑ@xüì¦>0Ì+ mc:j »N„O’_!™’‡0É*ƒÓdϵì:Ÿm}¶žÕTŠâ#ö=‘~?§ÈÏGÃiïC[Û99MÔõŠ u…ˆ¢ÔÁ½[]°+'µ-Ø1^Ož=‹öš ú§Ôí†é`ý<ä÷-“ú5Æ`,ÄRÂЬQ´„Þó›²LI¦."%´* EB©»Š¬Á+‰3 G0©]a†ïÐý8ÙÆ¯á®3vU!½ÀÑçðÝÞî/ƒòøZìP÷?Ú p35šQÏéÇ rÔ'áå…Y¾ yÃ"d6äeèÐÇØ¿¸`2Oz«ÓI#À·Kš€DÚ¼’:²ê0ÌæØ´hré!iœÔ]˜ìT#Œ±×& pîÏ“'Äc¬Ã¢.«‹Q…þZ<'ëÏßÍšþÒ,G¤FE*-ü¸úQ–Òqß™G”6Q’dzG»Ç‰AÄâ „‘&(„J[LÍf Éy¼ÛñÈE€€#sÕ™¹F7~WÉC hŒÛ`LòÊL **E¨Q V¥T„Íe{mÅùýÊÊþ¥´,U$9s×Ì•„æKj}ütTÞbUUHâ(É2g-k™ÝcÅâ;øÇ@S€üÈîÖ ˆÊ‘tñä:Mœ  Ð2y>ÐíÍÏ”8¨PPÖ‹%ŸŽ–Ÿj5¹ˆBÔù…Cï,óIêŽÇuÚ0N¡èá}í ½¿Òâ—€¿}m;Ü_•ʾ––>q7· (ª“¾>z§hø°3!“KüDÅJرÌÕÞé'ýï~ùq½Ï1âMvt¾¦êHãÑ¢uµX@ 7ƒPL ÈB;U=ETõ×Úw…èî…ƒ‹‹ YDƒ"" ¨s¸ðññ­´N6דøÚæÖˆÔD‡ö”/æ€TˆÞ%v9ëüXóM|ƒñ½A/–ð}Ðc+ u¸®SQƒ‚©À¯‘’hYD˜ÛýæEâÆ–Ø–H,„=•™Å+iöŸÓCºÓ£¡¸€6–ïîîCU Œ‘C›a!Š \ÏïjïÓŸ·ÇëbÉi[ «‡1PfÆoS(FBg†m1v÷ÄÜÚ)þ<^Ìüèï,o_ZÓ¡ñ÷ñ¤¢>ÐçµD‡/ì‡R$¶s=(*gæ·}~G;öùz^ß».'ÍÏ4[kªdKlFµ’±"' õòkÔ¼à‚PÈkf#§£«ìWøþ¦ýX#–¹Æa1€´Ôo-$Ö`lâ ‚~›øû<ÿ` "c4Géªc¨;ÁÐ0gÍëô@gë’ŠxÑ)(ò™?‹ë‹\?ËËò!´5<@\ýè6F6ÿòâ_Gø'àÅm•¿éC"~<¿´€Ó“Ïæ‘UAVD`«¶ŽÏÄ«¬p}(ª¢_­îKQìù?äl{ãå\­çò@øìßòŽä q€¿ùXÇB±kܾX§Ì•Ùñ‡å4Sa²økö´ñúyëèYŠÉËK¿ˆZyH·©ÀuÈ\=üû“¹9óMd½½ºžfdö×åÛðºÍ$„„d=ÛÚÞG^]Qú Öv¹¨J’µ€y'@†4óåéÓ5 Æ9úOãÄçò¥ŽuP÷Õü-÷N¾ýÂI1ϤÆXÔŒtï¸qU P°>j;Õ=õ¬%)j0q°~¿·Ë|ôýÌ-·Ç©çYž§Ùû}¶îï$3 BI™ÅKÜôõgæÞ°ut}°c11¾óØÁC?5iýš(E¯ñ^çð/¬?X€[;Y[Á~Ÿ_ñ×#nùžêkûø¿StÛí[Hd8sÅ2U÷—Þ‹Ò+Pß5qV):Py?LVúë4/)H§Þ>3 ôI$é˜$æ¢ÄJ®¨˜É4ÑOE.¾›Ú:ßW!–mÍMu•Ém @ûi¼&27y4¾õB×™5C!Õ<™È¯ŸÃçôû$>Ǩ}ªÜ{WK<ÄÔø…A‘PG5U3-Ñ™ŸÈq@a…‚¯>rˆP QíÈ:Ù?êeñÄ£´…Ì?¡KùãÓ$·oêÏš‡v} –h õü-b ¦ÕŸ}0Ëi$Aj!P¨(ÔRFEˆP2 ˆ%+€X °@ ¨0A€¡‚ªB# €H "¡ )$b @ˆÁ+ 2"DXH ÅDˆÄ@ˆ ‚¬H `¢ ¤@ RH¢ÈDB(TFA¨¢Ô –ŸÂѓëÿ¶w3üI¥&¢í´?dÙ>YLÏϾ¯ë²w߀ª:ÉäLcó9ù–!Sú´úدªñ8HηeŠþ`{+)%ŸŒ§¦HA>(}(à3øÔþF Ÿ€¬IHB"’ H«ùŸ0ßsŽ»ÿŸK;~>EJòWÆ»·æò’¤”•r9ú)_åwdÚÇdÿSc|Q»Žÿo°qüÃÛCÏããŸNuS%êÀŸ–SåUm;;H™ú&c´”ëÍÌÖ£*êЧÁ'áíöL¨i3är8{ú~üýôSêŸ_< HlNn”eÞ²±ÂˆÚå³’ùû_Õ ¢êëd^ Xì_4Ï©ÇëûúóC¬ø*º…U E"„×`þ*ŽþcùšI(†­aV"!¹ºQä&ßLßÀûXôûCØÃèg÷M¾¾£$Ÿ˜/¤ä~‰™kXUõ`¦B¢ˆ—.(‚€µ1¸Y1QûnëTR´C•‡MA@ÒBŒ4ÚÙY†%Aj”Æ™rÌ5«2e.*- B©"lÌE+ P $Ì™$`¡ŽÒåœ&:Bš´¶”­µÄV¸\Ša…‹Ub†d ¹–ä±AiUwnO›8ì;ß@³µ>¡ía¯9ç$û³ã†yŠªéL*¡xŒ*ŽNú¿»¡E;oxÉ=Ó}Ýv£j0ZS#í>¦ô§žŽ½9®OÍ0úï„xÕˆOîgôÃuåúå“D±sCd9¿ö½i Aøñ@«åï¶Œ~Ñ}¢„€HŽþ|€Z{EïÞˆq3Vv‚b%g͆+ ¬»çG{%!Ë ]ÐãçôÄÒK°S›“Aâ`‹&‰Tœ.Q2+ò˜ë@y‡9ŸloãJ·ïZ I ´TMâ& ­D¸%bô˜#ü1¶ÝP,„!XHMµ9tèm,*,Ó_,4;aR|Ù]°Ÿ&cÊ]Rt2H˜œ¸—5£L•Z`‚Å–îÕ~ À-³ ˆgò¡1PÅ#«)qo•¶TøE‡Í”f“Âo÷SnÙý6k+4˜—]èÆN÷Dj‚ódŠ^jð‡§(qÁ! ,ßO²¢y»Ëq·÷áÞºóûwý€ó§Ô>Èy?žß$÷õ Š[ƒ)(ºÎàE%Úà" ݽ…Ü䜓“Ž%ˆ}ãß‘¾voŸŠ1÷ýœ£Í~¿Ïs,AöBJÖYUW¦Ó%G4“ý›OE2—3u¾'D‘üoÐø9 &=!mõåëäùHn¥4ÃÅuÊByšÕx]Žä'*×u„/Ë"ÀZôÆ(3A¸1DÑÝ.f)¤¢T]"•7íE%ËX˜ažüØÙu±Ì&*  )ûi¬üRÝSRiíOž¯ ³fj¢ÂL°¥Jþ#‚)àõXÖ§H™5¼KJÁ±„¤K5äR¢Dm(£v´óqØb\R¬d®`„± ùŠá»(ÅYŒ<µAC+3(k7i¶¥‹11ÄÆygSh}A€c¦¢J)-nn ð®,퉻GjС  $Äzágä!µB¤0 ]]H@ØzŒ‚|œw6¨Bâ “D¢ÿïëí ‡+ú^\³}1t“²ßŸ—L‡Ë‚¥rÛ”tý™¡…˜§³Ú² _—ŒÝ¸\±ªzèû)à¶6!Ô׫d_¡¯µu”©SEÐîwæ“ 6aª™BPR3}ððe¸Ívþô??WÈ]zCD‘¡¬?/}÷z  lÏ­›‘ë~ ¬Ð5ÛŽÜ6†{x²j_taÚe7:íÃ/$ÏíEÈÂ*&±Qï"AIQS0 $BDíÔ³¤(c È‘d†Þ¦pËW[W ê^^FE@˜xêtÁ…#ÅByû/€´Û"‚P¬WÓ¨#êÆÚ©»˜Á‰øš?2†ÀÚ‰¶íÞ_5ì±D)XdJ%%;»ÉHbY"’ ªµ“ŠÆ Â…)’èÔ(™,’Û¢J(FS8BåH†5µðs ‰Å“&Y´¨é cX &!…ÕššWSyÿ¤YΔ÷ )ÌÂ:–ÝÅóìÉN8ÌSOæì¶_к?(g×_÷UR}³u¥í›ïk?÷±Ë©2$0°ç`Æ{C®´,à~¦º¸'Ý3@¾¤¤„BæFý¹CÇ—çâ€Mö£¹è0(¬'RϵY§A"Ê•ï °a?…ßrBõ½˜ñ¢®šÑC¸¼ØÂê `®$1‹Bão0•‹ºº¬FéO)îÙÀŠº?²øyŠÔIÝwÒÑîr¡¼â!߬¦§Û"Ä_ܘ‘ý´R†½!æ9Œ¡Ie(Y®U ØŒ ±efrÁ˜¹“‰ 6ÙU´£ {ÄdD$~qVVÂa¨E T‘E E„€²@Š ,)$ãføs(šH²€m€@¢*€€+DÐÍëû]y©­WëŒGÆ:öàêC^þ'“Ÿ/Š©a+éªÞsè;]`X·£7òS`‚pmö²€~o¶*DŸoµs$ð²çßöè„òïoÊPÄICQF¤8¤9ˆÈV¬Â!q„Ã$ÌgÊpfìVÜ`͈P$PNq±öØ”¨¿H(ñ´KìííQ¨­%D¨êJ Œ$“yPÖŽýÔÀ—J÷‚1‰Ø‰Ÿ¾ªËúPç¶$’ÀëÛÆ3Ûø¶5± B•ÉÓ­‚öÍ´æÓÄé) á» 9° ¶ûÔÓVtÈ«vò²s(™ zCé}ðSÞƒx.7óÎ"ÉîHÈÙE¦Ç]p]Qíä§áúW;ú¨›œ¼ãŠ|F EWo|²1"NôP+¯d\cψ¸•¸[;£5›·¼†ncŽS™`/HÄäÁ‰,ì‹“b{vŒèC1QÌ&§rcy8ùT–’w2ÈS0D‰ŒOÏÎêlVÁi·Ïw ® õÁp5ò±æðBø#h9«è«¿ÝÄá”4Ë/Ì!&‚WÂù‰b+mìׂ‚{Gnç·‘ð3§Ëœª#+s:t^¾Æ$ö5ÆRæ“´dÊlˆ‰F•Å"÷#Æ upF¨ˆÉãi%8 ‘YR!YD* Ú™¿Zn¨ºgTÖk‹­gâgDefÂÖ¹Š[zË×FÍêÅQé8rœØÎîþV!m‹Ò§#Þ0S5QÒ°àEQBi  ˆë²“3{lÞR[WÁš²ŽŠ*¯wƯž,äi®s ·“A‹4*ræWvÜ™Š:Àò“Fi7ùj›ÓQrVa>L„›…a À2Ø@Ú=Ä4†˜[O(^i¤6íU•6šCˉ¥n©QË›æéÛmƒÍ“hqϰÆ(ˆi5— E1¤S37(Y‘C¤A*j:‚·RAŠTª j0ƒ[Ž%#ù¹­úÌÔuM3Ld=faX -ë5`å®[é”yû®8î߆m=oYÀ:Ë÷½j0³H{3-á4Í30ARõïÆMgë~šßlµ¼¹ ]UI¯ÝnÎ)§Ö™«H˜`–BÃD‡÷û†«²‹ÿÇEí¯Ó鞦ÁBõÚºš²Á@*±T*A™% f"·½ó;£c®‚ópÂRáÍVÑ?â‚Á„W¿±ì‚AÔ8ˆ| M<1yæ¾–„ÛŒï8F챤““j4€Ñ) íßuÙU Am¥—8Ÿ³Émèxo@Õ]G¡x~;u­e±mój¼#xxí¡Ž,˜»äÙ¥v‚Æ”£ká&1ô´Ò~–Y¤‚Æ €‚L©ú*Lxñ(— ·£m`Ž£«3zƒW(ÑR¢„ŒŠÈ ‘„y­¯³AFBIec å±z²£>êPϱ膣"w­Ì;a²ãÕ†‘zµg‚òÒa<[;?—çpÔN’4¾GM?‡·š×Óá4®¸“æ<’÷òãÇ0Öª†ud `$Ü`oM{NªˆT}íÓÆ¸ü>”pË~_pçÉGèi€…ºÎ\L«˜ÁÈ9þuµÃº–AöµwÖDpXq\a±Á¹)P}U,®2"Ä<œó°m›äªü·§Ü¥âØb~“y·ËHhb„"·ˆ•‰H5‘Bļ7ŠÐ¤ú¡D£‡Þ‘~y¦²³ @»Jˆ L@$ü\ÏÈÖŠY !¦Â%§6’QÓ|ð`âaMWŽõ1ËÓú×#lâŸæŽð(FÕÆƒpÀ8&`(,¶`18(–@>ž†¯“qKˆÅDÌZ„…@ *ÁVABP„P"2@Y‚ÈBV²QE€ ŠÂé¢\‹> ~¢ZFûNfu×£¶hN¶o>Ç“ö§VôµN—;ÐëP 4\áÈ ª"K "EÕ °O¥á-GáÃ3¤Æ‘G×âî°Mò $ŨœÌmÚ^“^Dy°ŽdïäÁCÒoÒºÃYyÜ•¹êéÛá©Ós[}¯óáð6ãšê`X~ä.YW¥(\Ç…ÊL5d*c%´)¬Jà8—YÕ©…IGÚWÎmä¼›BŒõ,².‚¨Wí*ú½¸õÆ´‚¥ÜšóŸ-ÐLd½B4ù0jd=vf$õîTçCÍÞ\]ìûò§Z‡óõÆ ”ñ½m¢XxëÈ .‡ó¢I¢¾3„) DÐnÓ¨£©IÍU(Ꙋ變IV-&[rʤ ÅYóf‚0šº, -1Æ;­u• T€à?ÁøÃ`0ž U¡ A=Èc‹¹“'¦›¬¤£Qf8L);!B¦*œLr֖רdÉÍâbôœ²,&!®½ûÞ­´„$XâÆ–¼&11k*R¢# °X$¬¨`Hw¿\¨e~³^ð‘óçn:}¯°t¸w´»RDj«mþáñqç—l]6¸x7Úh†\jˆŸ5Ñ•»T‰+"T"eôð#€fáÜ)ኇ\àýÔ£Ԉǟ‹&i#:¿X˜P;ØIX”xQª„&±ÂÕÂFÉ@¬ç0Ñ\ð¬²7èþ¿\óvü>‡“B¯‹\•&çeð‚Qã\OU·“éœÁÛž1é݆c¨x‰#jÃÉ=cô&%â±.Uh÷éªqX'7J·vÙ3ûóâȉ®­ƒ6x<2\T.3‘LèÐP³P$qòo‚žZÖ3®G{ÚíeÿUB%¹íñUhvÛƒþ`vÿ¿õ碙‰¬#%Šªr9ÇË˾2ÏÑ­ý&Ý8Ë­K/~£p4‰â5 ˆˆ6áýY=a3òä‡åÎû§PÃM8(ndäç4Ž Y¡±‘0rK…R¨Š ièÉ/1Ö‡X̧Ûì»ÃíTâ©;iGNÖ@USñúbß2“^ÔfØée[·´Öèóþ⪛¿GBÄBãP{o“·lÍÕ{÷öÑžÇo½§ø‚ òÂ!Ê#h¬´KÆ^½ãíÐþÑVøtP¬X„‹ H‚@ÔH= ©„DK©C‹4éÛÙô!ßçpîPÚ’»1áßÛ\|`:|¿éæg:ŸGûŽlŸ—t?vmå·š~µ—™¨Ÿ=OWCT’yˆ ZB¼€,ãù‘øO0µ_qt2 Lýk ·œæê¹ GD¯n¨‚ÉDQ¤'\æèà§Ãq]RãÁ;Ï‘ÍæMÎa¦€I6«”þG×óôôùœ³’€Äè~Jà~>+Ô Ð ÜÝ1Éï­TDs ˆ #WRc㢗½Ùs2@>K©•’RAÁÄ´‚zž7Α8œ OtßmÉÛ•Y#ªs~ÉCÒ±„‰ Œ€‘AR"²(HÀ¦½‡Óœ¬³dˆÆ$=Á¡ÎÒs?3_O·Òó£ûñÚoV6Ô¨+D´ã‰’Ï/ÖéÆYÃ4#ÇoÛÍÿ¥û£aZ’…Ä݆L¨š¹yQ ¤ˆ„"XL-Çq É—Œ!QaÚm†ækÝ£c%a*`DÆÉ$Š )bR°„õ@•„D˜+!üúÍy7™ziÖ¯áãͶˆ Ö«¦QƌƥJÊùEãD9g¦Æù¡¬Oç "‘ ÖÅŠ¾xÓ]~ Ñ·Ó”;KpÞ÷ÊxÚ³[Í™Àà1­0D*;×Þî²àx”‰,s†sy^ß±ùâTET­ ™œlgAÖ¿>|\p"B„÷†y_¨ÙÒ¤ Ñ<¾ý¾Qá€ÂiŒ%ÜÐ)u‚Ÿ’ $—g+ZÌãϲ8Â|ôh«¾]oŒ^¥PDèÉGæÂ“\²­l#0>åÞÉárT@ÄÑyÎFÏQ„cïÔ"-–‚ê±"¦VÒáb¾¶åˆµ¹ŠÚ(F™,͆¨µ†´€‡ñ•û‡Ôa?~nþå~ƒô6ýäœóõOÕ80Ÿ\ÒÍ~%Y ™¡{Ã{Gï9ÃàšDd°Äœ†AŽŠK5vÙôþ¿× Œ®Û0¬Á»Ççë|ç vˆ[6Éðý¨ þ¾Q!$ÿØýá]±ø¸ó(éc„TŸ¿ýÂá—íúÒËd+Éš<ËÛÅÃìzô÷êB„J&uo?„_0Råauä:ã_¬q¦{KŽ~ßšlV£’@æ=o& û nú‘×|k“½b¨PyýÀM Kr}„|§’Ck[e×È¿/ôÎKö2XxNRÞFy‚Ÿ( áÇKºAL»…GtSCá qŸü6¡wŸ±úß_,gCŽÛø‡‘ª$kµº¨Ðh.â"‡ò ¨k¹çæg¯Ú{@-šØ ÏAä@MÎ tlºN¡ u uuÓn ÒúüÂÃþR<7N‡£çÒztÉ”Š! ûyÖ/-^³å.ËO` XÙbAä©H޼íTç‚d '¦ LµŽ]`"Ú ŒrïŠÀ€"" ;<9KÿàDŸ«i>ûWKÖÄt=Ç¿u™4/Ù‹!Ù”ÄbP?o„é‹DAdE@! BýÌ`Á‚Wæ]pAZ?5Í–`²f4þ9_ÛÓp7Ïþ=c„AQ QT‹,UÜ,% ["±›,€î̆6þÍU »zÓ½S6ÚÚ¶šfÐ֌֋ˆt–{Àú›°üt_Ì5  MøoD´% >ç:ÁEÈ÷F|½zÄ'8cŽAàö郔º–)£TÒt:„!$.dˆ(G}õè|Q8ÿ ¨qécÕ0Ω; Oßë–q¹‘ÇŽ }³=±GȽ‚îΫ¡™©Ç”q¦ýë×Éß^#ï¿9ŸóÓÜÖC€ˆ$¤œ ‰Ê`bHåÆa¢àfi`À I ñ`sZ1T/!ñ’ˆBKp†  Aa@ !D© k@·‘œè§ (~Ò~V}òø’êw†÷ãX² D@ ÿ‘Gž |p¨jwhIµQÄ3 ’}7ÂùB £/HÊÏY÷á^·ÂcC«ÐtÖQ.äª &eQðA\'.;pƺJKï÷ô@·1 ††~Œd!1nÓD:õÕPòò¾EëØ©"š¶ ")°T¶ C^~@“ú‘=ÎÏÒT5„zÄØ'ÝNƒc¤D$#b ‰ŒX¬‰€Y¨2OHºd@Å÷/ÌÔÐad:i©+8å&b "@TC”Y:ÏØ\ Ô‚/ XyÝñÇa“˜È±IÚDI ”a‹ÕšIá…tJ°0‚ÂÁ¦@X aióϯ4ùax/Ïw P‰ÚIdàR4>‚j ð@㯾š›Ë)ÄAh;x]h·‚Š'ccc#¹Ý È8Ε¾º~µkEXΡ¶} ù›þ #rL¡! {~[)Ìö®½ýÎ¥uó|ä9ôäs:Ýû‘‹®Ö-% `$alóÁÑhÜßkŒ$¾§/ÁŸã§Žr*p‰OâW`bE‡ùø°•#G¥QAâ™Jd2Ɉ9)?#ò,4ŸÂìd ¡Š*‚+H*ÈÂh­ËeuùØ8‰ˆ5´¥÷ˆ2 â+ÁD£<0XÄŠH,$Y¤ÙEBðRDZ‘ ?ó²„#R*0‘†Ìñd)jłʄ8ÿB„†²šÌš4a42¥HŠ"I 0„¢Àèd… ÊÃ’”¬ÉóâÀ^2)(þÝï q!.f {ûoÏåíA¤$þ_‡Å´ùe¾†%¯V,Ä-V@’ ‰"¾j|DæjM/WE$@ïU…¢(&Äû„T±ý! z«Zòpa¨s>í¿ÍžÏÍ/7÷çC3§ 8àRÍL4iUJõø„­¶ÍÎ•Ì¹Ò ½ï©ØqO!)%|;Qþˆ ´Øcýs§úz—åâưâmâs3]J’‰œ%=å’‹Ë¥V¥ü”îW®Qg˜˜†3¯ëõäŸ43–"±ìD‡<ôëžšÉÂ"k×­Qã¬ãþÊCGô†Z[9,úþ϶`~~#` 1D’å}P¹EÞ´lk Ý㚃7ÃÄó ŒN¾Õ×)rˆ§1F‡â<Õ‘þ¸6DþS»W«Rñ쮉xW4 {^I‘…íJòiÑîn¾ 9`ë@ƒ¬j>ÖSV“´¡·}•ë ƒôH”úªÛäa–­MÆ8cxùÞ{Bð°oH¾CA«¸ÖÄGz+<£Q¼AÅWu{½!Àhàñ¬Qä1œB3Õr¤æâ”¯løßm¼*¤2uÌŸhóžnbAyóž‚•ç.¼+W˜¢µÙcšsêp u'âwÜ ÕFI7 ®Ä+U U€i æÆ$FQpa§ƒ#_w‰©{–£ñ ~ÂÓËõ¼»’ĵ–múÒ<JÒ3©Õ¯\bˆ&†ßlî£eD7 ïÈZä,æWOâªBU µ¶ã+÷5X*Šé—ÛýãüÿÖ  WxeU­T*¨¢›ã—>¾YÔåUbuG»] –˜é^îןWê§±ò¶´é·›ÕcÝÒNe×p¿ó_oÛêÉ¿òHýûþeykÈ•CüÔ:•j{â3|Á¤Ð>F§½€W͸ ÇŽsš[qè&&ý¼`8·*ª+±Qô.fEËÇÛ~V»jH3Ü´:ÊÑáâ^Êͬ0±ª¡îüƒ#^pñ ‡ƒÐ×^Š©oÚÆ]þF31*ÄA(h›îÊÑN¼™ni·ãÓ^áAO;w‹èmÚ]ðw1IÁ+¬èÄÖ¹©Çîd¡K%q¦‚8‡p ª4(©;¶y$f”&kå¨û_u]Ë@I§÷¿I™„:ŒÊ‰ÒÕUù[Ç­oZsL´XªŸ'\ÝŸ‚–•-[¬U„!yCñÑCÛ†¼x@D¡qV1 „ŒêZâ0¯½à æaƒ<>m¡QdR›£$¬zLnÎÄr_XÀUìR³PS (¦8ã¤Ö°*ÖéÁÎÛÓCB6[kºÛRÛhÁx @Ž•&0P©ªÐÔ!j•M5Ä0Õ¨˜”4+*j–L—FŒšÕ]ZZ”Gj –቉™“E’[—-1'÷£sqbbPjPÆ*[°Qm‚*J•ÂÒ‰t[ Ã-‹&9•dª’T‰°¬†&K/—2èŸüÒÄLCHaŸÔEÕ²7 dŠe,Rœ—2ªXµn÷­ izàÒ9÷; ÚaêÄ £B²ãÃ\zËXûüeøÜü¡Meýö^pKŒžØ?MT|.ýþj1¿97 Rƒ@Îk‡……€†i££°¢I jIiöÍð‘‹e_"¨y´¿,1óoï¹ßæ­lQjµ“òùß¿vpy³ó:¤6’ le¶üÿng%)çúk4çÛZk2Ë:©ërJ2ÁÌô´¾ˆ>±0¤JsçÀhDAH¢‹ø¾}vÔ»tÜã Œ›aDŠVoxgP)ÇÏsCsƒ1ôq÷üpª1ª™db÷o}µ­^G‹ ÕJž‡Ï]:.¨™nRc¼û½Âû¿?¡ùûŠpuKS'' ¶çœ®'×|&}LÛÞÑ®¿¢¨ª˜ñíóŸêÓ·­bš f©‰‚Â'mZÈUW¾Ø÷9”Y  ü[¬ö’Ô•\x°ÛŠÀ¦ýƒ_ý*è=šÉQ䨥Åx6R€‚Hñ–k‹«m) øÈdåGYñ†j÷Åv_\m•ЀR~©¶m§X¥cÂB:yÕÌÖ‡, ‘Bëºu<[›ëˆÉ'/£ÉÏ9¦ïDé3mÖ©U ­¡D•%AX°Y*QY%T«eBˆ ±dªÖ¨ÊÊ2² ¢É£6ä‡hyCrøïdúw8fàæåIÖéj-mOH»NÜvÁ¦q9o˜XxÁ›™Òò  w ÀÖmͳåËø·ó‡mIÊõÎJ•áúÚðo&óÙÒul7Õ yú¹Ò‘ÐÄ0s©9i5”ÌVËOâÜ”Ó+oŒÐjБ>ßX€ùtøæsÙQ@|¹ÛÇkà˜USs|É.mšj˜!¶æP8¯oËmšuµ¨‰4èQ( ,‚ª¬AH9*‰RdEÅ$Ô¾ RÎ9×W·Ba>ÇRdñcjÈ ¨Å)lÇö;}ŒÉèÜÊJNΉŒib¥J%kYeMQÁ*V (+Ý9ز^|M.I¡îÝy†aAȄȸüý·4ÅSM!XN !Y(B,  ƒÑ“‚øñóùç:Vm#o8\<Û+õËתo›¡E=öVkàlLIøÛ«P\ 4@áİBÑÖx§–l@~_ÇÅñ±3“LÉjJ[Æéc§r8,ôu'F¾o­î "’@lU!²„XÑ’I[Ʊý/é_ù‡Çô$ÐåG­©‘¹Rª •*%«]áŸG³tUTU ?‚zwÿ¶,iÿO=HF³¯üæCÖuî5ŸDpŽøia_gêÓn;¶1ùþÓö]l¼¨45þÊ™˜Á!!1MºHA™PyKM/çû9ç=Âþ&½•PŠ£ ìö]õ³©–ð³5s>úqÁ‘5_¬êþC~&y±ƒAUUUDD QQxœ$SØôüƒRYJ„þ…¤?PCh)¹?OÕ…Ç98äX]Ó >õ•\»Ä•—-´Rˆ©@а}¨X03¾Ž¢19ÀÀSRL"¾úýrà'~± 7’)¯A6€Ä×ʃ0‘†‚è㸥6²¥¦…-ýNA£w5ÖŸÏÓÌϹ© ›œŒQíÆ¹dÚ)í ߙΑ!]ŽvìI}D“à”ªxåí•ùzU‰cêį ?9ô¶1{ î4Aµ_C¤¿‰¼üõ©^1Èì†AÛ³K” ‚(ÑôÕ¡²(á‹J2¢Ìƒî;½‰á”D%„œ¸n¥P$”Ù©„¡X(³.µv”@ ”õ¸FàyîVëš²>43ã±CPÖÈ.f.3xM0v=‹u’±Æjˆ†ccj’ñˈ%ÿÔ±¼~‘=è©c^w[s³Wñ¢‘ÀTÄØ t2âŠpfÓ¿› ø.Æ2"€Š¡‡‹œ9îañ<­GMñ9 '‰ó¶Ó­­¥³ AA8‘^¤^Ä:¾÷uTÚ‰6sLg_LœÌæHC$?Cs¸‹Ç‹nƒáŠh“c뎼Lb¨bTŽü-Ñ üÒ°î$&„¡…9(¹ßF$ü9C¼ÆJò‚*¤ 8d¬§h2§¹ÜûÀKUí´ (pOPデ¬ ÁÁ‰Ð£ dBãÀNï‘9ÎÖdâ¸Ü¿‹ªúxùÍC¸ýá¼HDïF‚Å$,U‹` „*T‚‹"‘a8J£ «"Ã-Q+ ’WÉ…Lj+ Å´£„ Òª¢†š‘*1F:BI$–ÂEQb•¨" (  ,‚Å ‚„£3þ_ø!šŠî‚‹ELsãão ñçO"Ê™À9ÄÄAw‚"8ˆ ùAο÷ÿÜÎ×ÿ×øÿ̧¼ÕõG{Ïý/ý´CR".‰¹×ƒçž §ÿˆ•ÍòûÅ6ÙÀ§Óô‡ÉØ8¡ÿ± Jo»šÓ8gm]Ÿù?o¾ÈKÿt @ e<®~î ­d²^W<üüéó2ð3áYðì`]øš,è4pŸKÓĽbÎOù°ÍÎÂQ¸NGþGûù·y'©$aüŸ‰kûBåA2kßÚ,> Ëïò^#†Œ[p‰µ) óïÍ£ó¶®F1èbf‰Ÿá§âduŽÈT‹FLmdOHOÆ“„¸IÖØz½ /z[õÛ>6MoãPÙ{øOxí?¾M­1QnCnäß&1„ tGƒ|>(z&E"Š v ¥]W(ßï¢÷í‘íîÎøL|ü~ÛoÊHkµkƵ~ºQ4ã±U)x‹žt÷xø Ÿhq.¸MqÏò·_'ñüû>bwKè*¢¨ÁÍÿ…ñõ=üj÷…T®–ù(¢ ž4~%O÷ÿµŽÑ…ÕC‚ŠáƒJ(J2( d¤sH|KÔ™Ï ü\½<ô8Í!AÏÊjüìþŸ×ëþb ”~Nß!_$°p:=ÚþGcÿžâ·Ü þdßÓØ—»ü"žƒ¬B\ý‹¥h}Œ¨÷íçüŒ??´¡Äw€ŸÑµ úÀeÜ?Ï‹üÏŽº÷ÏÛÛà…ûcßj äyvH Dõ¯48_¿®·–ýƒÌË—¾ib>rPd@“ûŒÛߦxú†,´Û0¡ÊqZ¦brŸùo§•¦¡BYoÓhôçü¸ûÎ=¿ËéÒ}$ ûAdP?¡m[mFUª(1Š"±TAˆ¢*ŒI¨"ˆ{{Â~_ð.*?¬Î9g»Ûœ&­*TÑ$o:Ô“î¹›†ƒ ¹©å7×üð™¶(š§§À^'ÜD!M‚ƒ«# U²Q†Oq¥EN‘SpˆcïéØ0¼¡ ¢ñ‡2žEAà«_Þn¬<šÅ€@&Á 4Åã CxT’¢yõJ*Õy#F.%(äF]²¹BˆˆˆýöÓ½6ô±ùl©—Ï—_>†h°øûdçÑ´I$ˆIf,‘d¬P¹nõÏCz2½f U:5¬“âKŸ¥Ñ:r"¾™5ùC“ÞßÀ@Ñ£Z¡zú›÷±cF:àŽVgåC+Ÿ9ÞÍþ Ü:$¶ÆA¨ a+ÅÖ5bÜ[!ÆHFØ,L¸åœó†|éœW{g v]P'ü( ‰n&­½<üŸ¢óÑ ý|Î4ÉYðâ0®óÆ[õ=ø¿âóf1v‚ŸŸÜUðFæ6\G!‘å;ˆÝ'lC¢g ÅlŠ{¬>àÏBvëÞ©Ÿ?—úwúc·’mß´-iKëFñ$8ãÎrÅ5R ×¢˜8h c5¬bB°|’yõ½É'ÑÍçÚ‡%A8€!ó€ "ЍoþoÆG@ÖQê|£j…•GWÚþ"ƒ…£4¨²¨ 1k·¥]’l„F!¶M8 ¢Ÿõ›X¸ZÊ’£j‚‘EÇ;Ô·ö œLÝvg?“¢”ÂbÚ& Q[Bd(D1E»º,ÓŒüƒ¼;C^<²N5ÌÐ2·Ä~ßz6šfQ ’$ÚƒðŒÓ=3Ãŵ›k7i¯z3I'Hm˜ríÒôÖAQ‚ÌtÁËr…[NërDÛÂ4¦¸_T˜Š,QLd;yf’p“ŒÎ´]Òû\aåÞéËJ”_’…"CYÝQÊbf âµ\lñ1ˆQ‘‘He¢çÃÆW“›\'>wÁ>þ²³På Ù‡aß N†`żcü|“O7޽òpéžÞxXCmÚmˆžz¡®èr‡Ž)Œz¹œäÞ©¶i7Åç‹4Š¦Â—1Ì8]fU­´õŠS¤R¦“nݳ$Ÿ15ê’rm/þ¼S¤¯º]ñGøßçsö7!´„ÓÑUE& €…Bë“SP7×m*mTq«À"ª˜QD|•À£•2ežÛÿÃʨ8rM<ìˆ)¹ÝB?"Hø0€>†Ê5"É«Òü/·oá CíÕüSOÞúr#߬= á;ÝïœÍ%E€d¬[ñÅ=º»œ¼ýîd¶ÃÜaî~óÇÜIÚN€#ù Ç£„¾Ã8Pcus£mD”n»íeÞµš¹ÖXÖÇèV0Eó!‰±Ušüpϵ°”@Y*‹n°€†wœò¨ÎA1¡Á󯟶 r“`PM#œ{O.!{ŸRéßøó>zÕþÏJÙ+TZ²™}t=½°š38ÛtÞo@kzòÞŽ±êŸoà+È2)-$Aæ~K†»®uó€£ùdpñú~à ªn`ØÑNKËBçÿ¿k1÷TADá‚þb‚²L¦²5Ðß Äð¿ À ¤.ÿÅÿÿáÿÿô Á<|ð >ûÀà¬ù´ch ˆ :e!ÑÞîðæ0Š è`>y=o^ë@!§Õ>½>ö4Þñ“¸0w›°ÝsÏ6tŒìyä(4Ð{ذàøAH„U úŸg»»¥ÝÂì ¶æÜ±rÛ»"ÝÖî»7vmvÜæí§qÙñ^ÌÇèyf²÷p§G¨@€¯O¹Ý´¯WW»»{çÏžðÛ}ZpÐò}}ÂÞQcP¢Kìw¼ç¯wVóÓ«–éTdö»bÝS½n¶2»c„Ú÷aËX]ë.£o}ÝÛÝÜqÜãsn6­•w³éw¼÷Ö¯}ŸPîï{6l÷͇yϦâ¯a™9²­ŒÜ©r–ºÅΘø®]öo»®—Ö%=}áçÝï¼ww»£}Ûï>ÙëåÅ\íõòúJ½ëIzh¼›a,éö}³»æ¡)¤ Ð „ ¦HК'¨ÓÒ™„@¦ ž§¥'⧦hBh= ¦Òˆ‰O5OÕ6ÔŒÔÐh@šI!¥=0Mž¦É3AÔöžPI  €`§ˆ&š4¦OSÓSÔÓM¤Èšˆ‚M*Ÿ¦ Õ'úSÔ̧¥4zš oø PœqÇ=DS l¿ÝPQ6QQÝQX¨¬TV*ª-…À(cTR,"‘±в(¤R(¢È ,EªHª )A`¢2( ‹X« ˆ¢¬QH ŒbˆÁTDE’(DQE‚‚€)°EŠ‘¬ ,F‘H *¨E °TR *ªªÅŠE€¢Š¤UX ¢Á@X E  ˆª ²",QR‘(*Æ1VŠ,R,X AH ŠÀYH¤Y ŒQH,€ªAH ² ‘b‚‘Adˆ‘B,TB"*Q‚ȰŠ"’E€(# ŒbÍä$ŠuDëÿòþŸœ¯õÿ¯ûdŸõÿ#/ÿeÿ­o¦Õùµrü>\ÿ¤ÖJÓ,lvªôý?OÛå/ëþð îbÿÒŒ\BÞ èñAÆoÇãi[Béÿ}Ñ0 NÖD„ºg6Õ%ÿ£v®<<+.iðêÇüùqÄÓZ9ó­´MCÊÌÜY;ж®I úK#ÜÜßcýŒõ¡<ºë¤ÎÉ r€ Г ƒ³™o+®²˜®šÊÔoãcIæé÷j¨#ÂVyZN]3dù&Æ[SÁ—¦œÈvôu7“¥.xF¨Ì„YìêôµØAº¸‘åk*Ž]'†þ]uÀ³'0r¶s-â[1ár[x¦½6ïs¬¢ÄŒ7hˆ¶£l«SúZcQ fîG£âðâêØ­-+R¢lÊ(‹DWŒ3ü3o›Š/nvJ’°ÊÏû£nYÿìó‰óú»zô"6A¦4‹¯óÅÁH”?åmG­=˶¶(Aü )®_ó9¤1gßuM$òr•‰È:'7¢Ø”ßð_çm>6qIYååþcÿÒ!à/2g¯µéЛ{mæ¸P./ú,ºP¶ â¶É¼¯Ú”° ‘Oƒ»‘¼·9«·ÆQΨßHÊW$¥:\Sþ뺯»üªZÒ­ KLgK“ò£X«6úþ?=Øõàmãtèså0}¼z¯5–Lœ""Ëϱ—š£s-_Çø¼ ÊP²~Š¢5«S…@rxl|t]žàí¢Ÿfëùlþoa¢×ª—/ÿâåEd¸r»ú=Ú'êAà†š²íëàˆR´:£ÍȦ¯Íf4A„[Àpò…éű"¹ÔDrù Áz¥ãýg¥¯kÞ¬»þóÜX&KëyS§yOˆTì[ênNOÍæ5¤ähÏ»ÄĿێ&Í~›™#TŒw©2“â:’û*t~í9r‚‡˜¡QMFVR;ÄʱׇÎ×dÞ^ãkÓÔGŽž3¦l­:iúž#ÐýX(ª"±E6Ž9ÞCŽWfñËå‹—êêLj”)3¶î<·ÂU;6«^ª8s—5ú{áûôî‚!|­¸ˆ2è¸òêªÁüH@‹„€åñ8$+R~üµÇW tëßåò‰žu¶éæ·M`ŽpAÿÌ4Ѝb¾”#§åzñ¿Â(‹”ìoó¿}´Äç-¶½ExoÎ2¡*CzÒÜíÂ8ÏÅüœ|ž9]£§JC˜wsؤ';»ö¾ûþΑ’@,X·•²Qì\Jº°—ƒïäW8[ •Ð:»Ý~‹šÁÎoí®6Åo¿Ä½ë e Öcv˜Jì•i¡-表ì:À=qrí'/Þ0²OºÜ§¥®¥™â”ç\ë~;c+ÃŽŸž~J/X(Ô AQ c´¨£ð€6ˆå<-Cx+QO(ÄóŠ^;A‘*‰¬*b†ñs>˜¿uÚ-¯ÿ]Ûà{7Ïg…¿jƒ¨Ó·p¡wôLïH¹Ã?X›µÏí Ó[!ñ¾„äÆ(±dJéÆ(zµ0‚Ä0Âj\eŸ¹>‰Ä0Ö*rîÌ  °‘,‚#÷5¥&ˆò@ŸH9÷,*íÁ,Hòƒñw[(Ñm}ôíÙ7Ä?fFü¹y)“üV ¢ß=Û†áª7Q¢È€H_¨*¨¦§MÐÒ£8 iþç™H² "#’•¨Ä;«ß*·Èzý¸ßŠd‡§[ð%>ðŒ açìÿú¯-ÛO©ïUÕ¿í|´ S¦îû¦µ2±´º»½lçm•R“Îù{å§ïgh|“ÚìõÛJIݽR·¼Ö>øi>9tÂÃÄ}öhUDô{ˆ=Ý—̾ÛÚ¼é;¤©|íÌÃååÂ=øJ9¶9¯×r¼²#ŽWØö+6k.K$Æk%ržëm”‹ãoöÏÖJ‡Ä<gQ ìË´È£eÑZªÿYÝù~û[Àû…± ¢ïTЦü<Øþ´‰®;žG¯z\Yb,ñDkÇ¿Ó?~»±Öý‹‡nY§÷®PŽ5ÒêLÍdæp¤žíÒž¾ï½uÓÇÓç–9’ü]×tgv\”;¹.™f¦û¯ž“‘>?Ì£–úçJ¾ «ÖxÖU—†Ëã¬aÙÎ6åŠÂÕL,Ó—çÚì=“ÉVVGt)9Ù–0?-_ùëý½ùãŸñãŸßR6ÿ:šµcžpõ©õ^~*¯ùëyµáêüF_¥qòÂDñ}l{è"?H#ޱÎE—X'œ§ëâY9)+;Y„CŠ¢¬>uánÖ:¬œŽ+¶Ž>ûò²Ð÷"?4 ¡~ѱ&ZÃ~’þÿ–2/ÿå½íÃë3£N0”~?O½ß­ƒ®–[avrð›O¯Y+.9ñºöÉ­;ÁæF»óÉ1.4Æ’²WtT+mpîOow¶êã¸Êcv'ÙpsuðyTR²7&Hf•²ÀøÄÄÏ'Úw|Ñ×Ë«]­Óå.¸~>g+ª~¦PåÆÇ¸‘/2¿Þ=ü/ã»DÝ+½qÎ\le¤§§½éïíë¹9”´rCâ=ÚáÄÓ=pWMG^Ùé;m¾ü®+G¶6G†8h[öé™[.²êÿ[š›¿Wzvm#© Ÿ¼ší§é3øYŸx›qçŸfãÕn»m¬9_xþ#>‘x%ôͲ·Æ/=cÊ>´:œÐ7î³ "v{iXVSf÷¦ŒTäõƒ§nU¥ïëëBÉW\C—on˜–[±Œ0n—ÏÏ·kÂÄoýþ¯Ã ¿ œ+a±e 'ÂÛ—Y9wË«Ýíot:v¾Ür‡­ù‘ý·^gÏyFFs!e7xJ>Y᫤®}.¨âcõÛŽK™›Yy²Í2C-l^Ó¥?:Côß¿™™Öâø|‹»{ð²à—Gäúk‰)Ç.ˆx­VùëÁðE>Ýd¼§uưީŠÄ¿JÌ\tò²³Iµ‚ØPét,%ï¢ìu q‡Š>)!AøzËHøK3~í3õð÷FÞÏ¸}~1¡A?ñ³Á¤ÿæÝ§þ?ÑîyßÞÿo¯³›Âî:ëOæÝïüeÀž´ž‹«ŠÓÀ™%Üø[¹ça?¥Ç®°&W¡‰58úÂöÒS§Ïõß zññ¡¯x÷PDŸëéØÀWôÙsF—qÇó.Z„–›ú@CÅ)¸x‰roôüßÌP×ïðºï骑ï™dñ Îä!|¯yD—hš÷Nr6.³}Ñζ¢ž±Ï9˜Ôå_Œ°Ëß a W éeø‘î,2Ì˲žËc9Ï`ütùn¿…¶`±ãº1öÐYqHI’h-‘Í ,ˆ¢âLžù@ŠµÇ ‡wlxýÜ›±­ÅÐ={¬"'(*=:Ò t×nÆyr®âmæsû½¯å`ääá ÂÌ}Û³„èÑQ]»íÞvÛ–Øñ_ï ˆOw칞[Y¹·¨YøÓCœNµÖÓÖìãºU‡ŸêÓ+%/…Ÿ:K´ìÝ7'†Œnðû€÷kÂk=›ñ9ÅåH\Gû¤„’Îÿ®Úðç±½èi÷ÔöOvÞö~É£nÃzY”o é14+yË=ݽÑû¼»ûC’UdÙ^õADïTWöª+„~Ä—qr2=¨ùÒRp)JØô¥•UiJ”:"Æ ¹„„^²^rŘ¹Ó ÇŒ’éØd5OÍ!8Öêh“Nþ+B¨-¿?Ú¸t&nó…ê^¹ê…p¡F«')˜‹Ð¢ Æ8ïðÕ^Säj'õ¯È3÷XXyõ0CäiþY4‘a­]° ±` `¥º¶8ÉU˜f™¬Ë¬¿ùÚ௜>ü ·žO¢êˆ3¢Œ÷wu´¶ÕnßnÙÅK…’b"IŒ±A´²Q„…d”BB2 J• ÊÈŒŠ‘QF(¾ï‡V÷s¤gëÓï»Öß+¾¼éÓòããÛ}¶æ§ƒúÉÉZ8°„u7-£oÏÆsõ¦ÑñÇúœ`pâðõ‡ÓÆé ?¤*©ã¶ã1ëáXîá =Øw±[¤m>QãŒ^?¼£uî¹ÊœzÖ»¤ñóxŠ…ñ¦ÿ+9ãÞËR\gµ±Ïgumœ#×[n>‹t÷òÛÀ÷OÝkæ±^B¹,פ5‡C·5?Jÿkÿ Ý­ÅH+%Þ]}º¦`àÁöï{˜ê¿f-UÞNä~‚=jêÕôjzíl½+±zÆœpÅŸjî+5…Åâ±Õ[^³"úÄ탖ŒÞîÜã¼ÄÒ¿‰Í^Ê)õ ˆÁ¥×“oÏð‡ë;‹´Þ9û\¦¿ÝODyâ‹^Ï͇™µÕ Ùû®_ó¬¨û–‹G½{kõëY=šÃ÷7qÆÉpr¼¤¡ÑÕLûJT#dá ­!Ö7XNq Öëß÷‹Ö–w:ׂzÐ=0/_/iæ•Ñpûñ{q}=I¸89¯•ÿqßÖÚûê½lSy]{×y}¥¯¤?½G_Ó; ÚòG7‚j)'ïáOÙײµ±à(3±œäÏÅKÛžûŠC±<çʲjõ•×Èu[6z&G/O̹šÔxd'þæ¿8pX‡ARÚÖÛA¶-ˆ*.š"#âʯ¾Ù íÒpŠ"¥-2§t*ÇAB¥ÑhCÚË>Â…by¥Çx™`,‹:4Tø³«Ct^î˜ 8M™-³6Ö)U…L´6´Ä&­ °YP+d+³ú’ËEgîJ솙UÏKÃáµeT5%dŠ V,Šª¥¶ÙdÌ¥~HmaƒŸíêɤ7JÊ„ªòeéq“Ú`±AAMžw¥ÛbC`al3u DËɆ¶¡³µ¡¤+MjËåšÖ’SŠdèñ”"žXg›!ø'+±“tÒLÙTB+¾°Î)E6i>ôÙÙUY¾E1"ÁäÖ#c§UJ¨)ÂVÒ‡éM³Y v´ÓbÇL 0»¡³ÛNÔÅ"šs*“ëxf"'Wl)R§¥¸œ&7k¦fÄ(¬‚•æãL+-xp1=ª¦[:5"¹AµÓ2¨¢¾hQ+ÐëuŒï¾éÍçÉùØF#ŠÍåÃtˆàíŒ>Ý+<û©×G}fù¦_ì©Ò¿(“Ž”Œcrg (¹mèjÌ„+>œ®nÜÊxü] ­¾ÛÙñºÎªs0w0×6ìƒ>ÂÉVu§ºk!îí¦wâ^½nŽßÄÙœ©NYTÏcUb¬N¼ÿv}îäâgAz¬[  |¶æ‰µ—½¾IœKìíùMÿøOá• mòVðã¾ù79ÙHSN’ÑÛãŠñÅܦgéXVxÔϵc8¢ý¼ñœ¯Ï³ ñN”S‘qÅÃá(Öo·…Iã(êû.ýì¬lqDzËcõü×wc0L Zíùà¹2ãHI$þ!"\†ªÏVÔã-cQIf½å;g¾{¹C'ÁwD/ÐÔN;«tI’åÄÀûàm_Y4mQƒº@©œùÈ„TÕ";"ýÎÑËÚ7J”’Hþ0þñ‡öù:$‘Ýúãl¸B•*¯åeø?Od4wHGÙ B Ä»òÖ){4Œ¨óàxêþÛ]®9µ÷¿•N¤NO¹}¨J]ή4?d}9×ZçFAwr5qÌwAÞuÜÈ«J ¯hú×P#îÓH9C O°ê–Ã%…»ÆPÛùuvóÚŠS_Ÿ_ðº{ÇÝK²çEx¥Òy'ÜÓƒG³¹r"ÜWÝs§DJI4ÿ{¬í,€‹`!8Ò˜øê–Рñõ¯j‰0S½!páæo†â$m}ËDÛQé}$FµœD.¼+çÖÜt…Ðü,!…ÎO„!+žFuŒŒ.Â$'Ë‹ôÀUÂQï çÈqD¶~:FSš‚´¬^:<±zå[ùŽ1ç¾èS“¡Ö3Ë«ö©­…Ê jàöºÐí"ºÔæ¾Òoo;Ñ)ìŒ*âqC̾Uz|÷[ˆä/àªEôyûP„ã¹F'\áÚÞ=.Œ¼gogÊý¹ñ„øY¬8È|dŒQ/28æºÅËð‰|mkˆ}»µ¶+åþ4Vw1Æ-ÏÛ±ÊþYWú€‚ÿ;GíCý=çù¸ñG&« gä^ÝïwsÏx­Ü]¯ü°“Š2)B~Q^êG¾ øñX„Šiþ?º<»°ü¿ÇÎÿ¼ÒýþvþÚ{ϧÅ8v ?¨á$ÒvPñ¿ü?4L¢ÃŽ_O=Üî‡úßçm·XŠ?ü{céfÏkù|áÈëñ8¥æO⊱FCt+ŒAƒ‘R*¤F"}WÝ’ˆ £PþÖª¯õ²üŸèÕ'­*ŸÅžÖ°H‘UJËF+TADU“TM©b§Í”2ŠÏßh?»úà,TQEQ`†ÖõJ,Sµ¨Š1E ±TŠŽ’ˆ±ˆ#"ÅX«|š 0DÄEŒX*(¨"$X±ƒ-ª‚",W±‚‚…BªŒÂÚ`Š“Ú£ŸeÝ5µ¢ƒxµv3 ¢ÇVÅIiclXõh(*‘Q•(lÑb‹R‰YQ• üÉ$ K1’{](¢ˆHû[Ö1⸛ÞzE˜òü³˜exü)ý±`·ú°ß¦“³%kÂ\ãÈ™þjÕC9¹Ð‡FŒàõF"xZÈB‚PAûì“âI”õ³‡ñl¿ƒ³çéEû™Ã¹'§L(P)¸.«6s6œñóþD1á Ã×z«ßAŽ:l˜>- ì¸ûm;”õ`U Ô’<™5 £‡CÈó²ÎÍB¾”lÂÅEw«Óù¥UT!˜™Ø £ß¼SÝsä`!ß};ý­©¥QÝßÕ cî´Y6² õ¶lCµ/­’\ÕÀxÌ$Á`Š*±Š ,Š(£Hx“/³G\»\ËŽÎB'4©W`\L0üØ! ã?//†ÂŠÅ‚ÀAˆ¨¡Š Œ‘H,‘d0€„XE"1b„X $ Ad‘dT‘dPA„U"ÀŠ,"‘I"0‚„XIHŒPR,’ PR‹dQd‘BH‘`¢’,’, ¤ ªIY EX FEEA ªB(2$Y °‘TV,‚0$QDY!H8OÛÐÛù!ø‡³ ä6–™°É¿ø€#ãÛù’:OÇJá‡8HŽÔŒKº“õ÷à?(ŸÇóžù-ÿ"µÙq®‰q•M‡°^~_ƒëößgcR—IãÕÇw׸€E ;Ÿ®ßpà調¹áÆý¨{óZéh×öôãØN©ŠÎª qMðy ÛmGÍJlQw9|=#È¿Œ>¿Ö'I¹šlU:8QA4W´^0áeŸe9[sÀÃ~éß?_Ûg~_ØÜÓþ7ýÿOÞ)Ü_ãë8¢#uIËýKK žÍPÑ#úÅÐØÁScVM*c*ÐÑ„îõZ‚Zæ´4ä‡@ÐHÀ³<‰²!$)õPô -;Ý- ÇÇ6\ õUö+P¬"ÈÔ¡£½•U òf¨µÔ„*.4Â#ØÀʺÊÖ^\mE±¨È’/AjR} 0ù¬‡ˆº ŠS¨Q¡;Ö}ƒè%Xê-âPtÓ‰…I¬Ó—þ…Ü`2&óo9#'7pl< Õ˜×"h$î5:"‰ö I½j¥“ˆIfWaí.ÌËAÂk ̓¡¢mæ%ÀÒNHÉ Zuq©ÃøþCü wÜß¡»Â_m>§®2# ü˧?´‰þúiŸnGò}`£Ej>‡ôPÕÛu°FËýÃÑ›b¸öÀl—Þ="^eÊp1¡´æ¢Ï}Ÿ®ôzŸ­ïåî;0Q¬I)¦Ÿƒ®œ?÷e`¢†€ˆ?ó?É=¨êqY;Gg¿Ûö«ÑÊ"18ݾ¸Ý”X”UEmîy}ý‘æ˜ú}>¥kŒÞsw‹Íþ6@”\Ehÿ˱¨s<_ïé”?£½¿p^lw< Ý“uGtÉ›£ he‡¾ ’?|Ôžßž¶håÐgîåý4°Ë¸ˆOˆ!H’BS kö¨~iðƒÚeýÒŒù‹_²Å1X/ËÃSþíÈB‹ö½…øŸ÷ Ï’ïÿ ®ßÏü®q–ê8îý4˜ªx¯ó7Ï¥ï/ög‡ÏFKëÓçÂî§âG£|èúðóèÈC¿Ç˨Nì÷<ƒ™påêá/ˆ×‡ˆEõûœEìóZyÙWî>úOj_?¦FÕI£ã|^µï@AÑÂHu{êI€[\BþHIÑeì¤ï’ô {ê"B8&r Ã1“ÖPñž5íÇ‘Ÿ|<¨r¨ÃÙ…ò‡Š {|Æ«¡+D[ÎCÇ©ãðŠ÷»ˆq·Cßa?˜ôèÉbD·òóÕ ~| n8yòœªªR+ÍjÇÞ|wu\O5מdç}[¾Æíà©ÓŽ«Ç‘®*¾0î 'Fi6È’I„ó_zq®ó@ú…ä®WeìH l\ï”;ÔG]ϘÑÔ‡ìüß‘2]|ù:2ÏŽ–ýã¢~¼ÔÿŸ»“柇;w£>ê*ûCkN‚Âú´úˆ§öwîG¼#¯$\kGIß#¾”í£Ùç«zͽé ><8êTèÃÁÔPîCëìÌÛ‰Ú‹?ï—Štçš™:¡ÏyûïÎnCI%…yðíG lŒ*à»H{P0¢´ƒƒó¿¨žñãØŒ$dî/?@£§ ËžÊPá?Ê H÷=Zð‹›ùXsªÂ€rÌ!Ë ôœ5àÉß¼k¾ÄçŽ0#C[2ÏÜ€™™ñìikâô!j4Ñp1¸:Ò~€|«ž^R9wò‡G6†K0'—éWQGÑBÒûãHëkëŽÞ›ÙÎ" )"Æ//[¹’vð{úºuíPòdâ‡DèÚDÍ@è… [†ÔwàHÏMÈxWlg’‹£X,Éxp7S¦ä>çz²-°îakÒ ìP¾´£Ä-’É5I-ˆÏÕ·­'–À7‹ %ˆ¡h»AyÊ"K ·Æù\µ[Aä€EH>íéCÅ1‘©o   ÔûŸ¸WçqgŸ†—%º¡¢ ¢ÄÐISÁÀÉtMDô!ìîÍ0ÒcÝÇ_+:ñIÓ§Ù‚†2›Ñ6M3®ô1œÙP½hr@´â%£¦”:Æq­YuœNrÖ³ž[P˸O&à çÁ¢É-»®)Ü’n“±6vz³ÀøÐî“IàqI7JÅ„7S•ùªpÂoÚ†t)¤8Ñå–nö¥;zß~¼ïG{!Ã%˜A W…þÁêúËAr+­Ït;`Åm Ä⑘oftVʺlu´ƒ³åƒîCÌ8»ÓijJøâáR£ºQ—[Ö ‡v—v}ìrŠÜî>§«fcË] Z¸äRZrÕÑDj¤ˆÕëxö“Ör?–µÌ½cd…Òè!‰ÄuÒ}áPtÀ‡>cAú”WHˆ®UâD8ÕÏ2JàY¼•Ö«EˆŒÒxž@Í› ¡»ÓÆÌ~ Fé5ŒÆ ‹ÜåË®^·ä½â «­ô76¢§‚Å]]ÐÇyk­AŽt#åÀûçËQcZwðz$3;¤7óU$œ-©¸ZˆqF¢¹×;æ¯nÁʼnÐÜk^*ô[D “˜á÷ÓŠtÒ'¥ÇŠ)6:¿67DÒŽt"„qØxHw¡]D£Ãç¤Áͧ­‡³g­X$mˆy_¯}á½§Ï ö V¼ Ž éžv _¾c[ ¨í²LÏ5½Ãªs|}h¾£ Fn"á6Á«yÆ«%!›˜6â;¾})ìç+Õ:½Àï}ăޛZÖßñ½Vö) §3¼q.ƒÍ§q’·½7C¢€ÞPÕì8#d†eSï{ñÓÈéˆ×ê,ó YpA—½ìõ §®ç®0eo49®|ãiXÁ#*FÍÌͧ•Üó{BöŠ[I7vàzAµÙ]MWx¥®ù‘[¥EÔÖDÉ¢±¨À Y8(FD §"á  :™˜uXçV%‹|@XŠpP‡7—™7¬ÂÖÿ÷Á­ÞpcË»ÐØÞsº‚ôɪ¬FœÔgÄáìc~Þæzï}WŽß¸x¿Yâþ-ƒH0g{ѽ/—ÝŒtƒŽ-Sƒ†:ÔÆ´úü±èÏCyÈ«˜¹ÿNšo{áûÛrðgÊõ‚;q#²œ/Á¾Ek~9Ç®;v24ð@ÙÚb¥‹Vø÷hI4¯©Ee틪’0ôúÝe´â±‚ЉË¼;²•KvtuÂŽ¶áúÏþÈÊÝÒ¯xóÁàø at%Ó ‡<…B©»¦!æDއaöñÿ]7\òÒíx§>/Gs¹$»8߇#§ˆ.WTUJ‚y{}{qÏ!Ç,wUòßCžáÙ Ø…ÄËš(®ššÝ]ãa€òC<èIŒ>v$U9Àô6D0&zA~9 Ì8w«¬sÖ¦iÁ{ëªætÈþnƒžtìý:ìä¨"Áo)}5$Š·sc¡­æù¾Âa¥à>Øè„Z¸š ÃÑ€mÂ…hg ¡}ñ|œ›WŽ–ï•!t¢ÁÊök¨(´ ¡Ï>xñ~÷i$b;^½(þËÞ3QL!ƒ7 )C¼À:ÜÂ;ÚèM=ÐþL­‹êy}+¶©úÖµ$Iǵj\©CyB¯Ù‡Ä°æœ~o?ß[å w2ïs¬|¡‰à,»ñöx5ÅN"çcÌiÆEÄrƲÃÜ=ûoC:ìê:ãìA”}óRÂÄŒídŽËÊ û§Øì°kÕ—|:·¤Î!Q]u±Î¾}-ò¨7dŽ#¾©@hχÐìÔê €šäsgf®ëÆ"D¸‚]±Ñ gP}: ëbµ½'š[1NÐ  aóP\qD[Æ›²/èöGB5Ð¥ÆÃßoÆÝw,{¿[|&vAß[[Ú3t:=t9<‚Õ€8'uºç·o­.´r'b!ÜWJ #ÓHsÔ,Ô9s7KíÓ‰8L¦ Lèr&ÞËT@¥ $IµnqæM<fíÞ³@Ùš½n„¡¬œ†Š(öƒÑ0\ºº{iSá“Û‚÷xÒ=²45£ØãÏ‘;8W„ÊŸ¯8Óâ:½oa€®„¥ç˜ÞMO£Ñy˜¶ Ú£>RåXàÓø‰ÐuA+Îy~Á[„zaÔ‡èUÚë{qiß±£§³6/Yˉr´„Éä hošˆ#¿ía\©æ´ã®¹Þw ä^Þy¾[Òl;6wÆØÖ mH*ÅÄ²ŒÌÁa7ÛxéóS|~†—lòSV¶û"™ëœuQ7¯gëºê!Kc«¸ì]héãþ'‚ǵãIPèxAâº#ÃLÙÌ•\ÔTâjIÞȨÃT#{F ¸EèCÅÄÅšÁeÝñÚn°>3ÜHÌŒl_)Â&°QPÈÈXíeaP ]˜zò5•1P\>&ËÕ1B ä–ßÄ·:hbK‹05co:P;ÓÚ.<I1–^%êWb®hÐë›xÑZMMJSrhËZÓêõ#Y4}ŠÇÜÏK×g$!Óã>Ýﻎ…O—çGW²¬ˆ‘ã‚)¼ÇÓôv6FÂjÀ"ˆ«&ùÅ7Ð~õTëC˜vû. îMõ,n„¶XŒŠ~ˆë¤élh@$bwEÙx¦Ö»°H™D‘t4"ð_Wž ËeˆíŽv+™C®Uuâ(TI`î¥âk`d¥¨Ô]¼Ï€uìä"ÞºÔoèÖà ki g[æ4GJu ê…6ˆt]ÃÌ,AÓ ,0qáÞ NDã†nÊÊ t`rÂËd&k„H·1AÖ¤6‹ ɼºÇ¶›¹ÇïÄ^µ§ ‰‰ ’Ib ÅQ0F(ˆ ª"¨Š"¢È=h+Ï3W)ðYŽ6 W2š¶á˜¦Po³B™><¦sPÕ½ö¤ÞîDkià‘Da­F1{±Ä@ã.òè7 ±,×U°¯¸&2æéù=ËÇqÀ:ÒÎ.LŠA»Ša<Üi°KÌ<"9 j¡úÙâQ“­º~ûrT™Î`Ž–ìpiÖ M¿}Qʽ[g}DÜã;S@$’Ú@vüÝ`ëܽs~éÒ  ¼Â]žqç±ËŠjtg\ˆ±Q᱈™ÂpvÑ› -:qØé¡fd$P’qgê6”êã›Éy1j^ÖŽ…8’$Gt È”jaâ”–`‹v@zCDõ+4M‡‘s©Š³‘3#ӌҘãADÅ×JÅ$ t`((d^„ Þä]̇¾Aå æìãïK$HÆf½ÀžžÐ9×NÖÒlò+z5Ýq^˜ÌÓ«`ªC9"˜H´$‚ØƒŠŽ¦röL*·3c@±ÑdX¬á(onI¦r¶š«wÈ}÷©ïoU–2»žÁˆþi¶z<ԟâE2<:ð“x0hié Û-µã<ò¬a|çˆ‰à¨¬Õ ÈF"ÀQ`ôhŠ)äIPŒl’Éb‰Þ@ –ÈK¥‹H0SBU"*Š¡DŒÄ•U™ef0³D"k ˆƒ,¡-¶PF5Æm 8™¬Q¶ 0(Æ q³j©m‚%¥Œ ­e%DQJ2Ábe” ´- QˆÅT¸“ …bV€²‰l(ňR– ”¨ÐÊQ“JŽ1&²°¬(ÆÚVÆ$*(HÙa ˆ%¦\°Œ`„©‚Lj„”Cà”b#hbúMͲLË `°DL®,ˆ‰ˆŽ]fµ¬ÐiÍkKAQ11,Ì Q\TD‘ÅEq[hP’E\TTÅs, mÃ-´$ÂB@¥Kmi pJY03l̤¶šC1ãÅ‹TÕ°Ö–“dÌ[0 á‚ÙŽY,²Ûf2) jé\Ŧ3,4€ædß3Z̰16lb„R ±AWZ¡JP¶Ël”Z`ÂÔÁS,4¦0f´­²I™jJRRR-†"î](`“"Ûn ÀÀ¡lJLlÉe´˜Å“1V…¥. " 8²&+Š«uÑ£tµW1UÕ&“Y¬“wp“!3F„DHLˆE°µY°-VÜÂL$s0†1H¤Xd&4jж–Òc™f#I$Ì´¥µ6&È]6 “LË„PÉ’…–RÛ©µÖ—FM’ ­Xc°†¦¢®³mf²†"*êd™ 6†³XŠêRˆ‰)‰’"Ȫ®Yk–am¤˜Z¬ŽYk–”¹fZ–¶4&9%1„Xf[i‚2 f[iŒ‹37ZqÁUsWS0-p B"A$F@P3[@Ä0â ­R!0µ[p.\EpÀÅAS0°2ÕÇËmÌÊLÀµÃƒH(VnÈLB,wµXè IRHE‚È(ª,‚€H¨ˆbȉbŒERT‹(‹D26cRŠÔ¨VCd©#Á HBÖoJ}4ã™Vˆ~G¹Naw³ ?ñôùðýÍ‘íþ‹ê§ÿŒÈ/ü¼E9WsÝs¦øcÏó¼J:µüïêÃþ¿Õo÷èI!µ–& ,´ OŒ>ÙWÀ‡³4 _ýý·2ŒÄßï–ùÛ§vÏÈÜée|w™œ™ÎÞûý«§æí ÿ™Ov,ÓûïCÏ¥XöU|Øl¶Jc  cÆËˆRÏ¿þˆá¶%KF1R ª¨,dÞÉO› " VÂbH…©R ¯Ã#Ÿöøû¿öò–6ö™ò›1!ÂÆÞ”&¾|7Ç;|R€²NrTEý /~^7ðìÎŽ_Ê©H±'bOý'æ?jn…d 0QH*Á`)ÞgcìP¨ˆÔW(‡çCá?M?ÊÊR,Cû>™,UŽíŠwóÉ!íl‘{z鄌$9 £HbUUv’1‹ÄJ'¿ð~ž5o|=½—?ÊøÔÐß]Óp¼W’¶,ÿ3 ª‹qÞfg7¾‡Ÿ” Æ6Dè²?°uœbÚò¬l—´ßIæ;©lÕÊX놓nÿצ •Ž8CþÉþ, ‚DRŠC%? <ÒX„DŠ"‘‡{~®ÏLhêyøÔ×2dˆd’bìâ'É#‡|o¼ð÷µ¨·å|Üï"ß–7†ÆÕÎûɱŠî¶YñŽÑ úE¢GàúRaëßeŠ©"È,H ˆ20èw`ãç¦rKvíeœ¯d"ÓÕ·#‹D’ sŽ#îàfÂïºÊ"ª¢VõÊ'´%=_-_l°£³4\ñªg®úL¶ßݶG·,î·¡êP¡bêE¥R,TX#‘‚#øòqõÍ6Ÿb/Ê"}¢iš¦_­ô!B•5š´{Zl)ø§äÃ]vΨDPƒ‚ÅHˆ.‰ú?“•¡ê]a W¢ǰÿZOæLWÅ[ýË| ŸB»B}.Ê"I„É’_Ó±÷eDDv B²H‚"ˆ)ÒØueø4&Éì~Ÿé­ö'kUEŠ)$‚ErŠ2hv÷Øe¨\/¹NJ„-’Oä½- ¡iý¦+\Vgž,–)>ߺäüc3¥!`H ,DÅ¥D"H„‚ɈsêÓb¿—§G.Í7>o© ø ¢¢±ˆ±€‚ >ïÎÃeµˆˆ‰ô0©OÖ†2‡ª ‘ jCe­¼" ÂGÖ$&R 1"‚©0bø}l8²`b}}½Ëø¹Š}ðt× ÄýZ‚$‹ ¬VÅE€¨ª <¥@õ®Uõ÷\– b…OtT/n>ïYwèoº&C3&iÞáûY¿Vúk”Ûú$oyï¯íìÝC¥¿ !Õñh‘¾Bd ÷„­tµgýÕ°Ô.ãhÛûÆÛBfn8²=kB9êpõfý>F;ðUR÷Ó,QqMé?øòìª,뺿h‰ÿ²ÞrP„!tÿïϧºl2ÀE¤b^¯ A ;«.D…ãL½ÉËMÕÏíOý*3šÛýñ/”ÇÜ«”·Û(HÁÕk8XÓ¤# ^o×ÐÿNd-©–Ÿh¡lØ£0 ¤Zœ­¢û÷K¡ý¿ƒ ¸ˆ9ð¿o‰ž‡)xni>™‹„0MÕÆ4ا¤Tÿ‡…ø ÜÓ2V©ífi•îÛƒûsuðeįøf8ûÿ§/xÙëÐmvÜÜ"gE»jmÖ²nÀÂ~gÑzؘÕ ôe/sSçþŠŠôA=N<,¡;WÆX‹úNáfL ìÎÜaÁ”BYCU.éžìøÖø'±Õ`úxˬíâ‹í'¯”ñ¡§RtYëIÑ l,qÐ(Ráj/k·qè>vLCƒqLûŒ*+kfD‡«ù@!Ý|` íšVÖ7[ztݳì[ÞÚCPª²/Ó;~°y“„4=#Æm—¸ÂÇ•ÇÙì$ÊÖjì¼äÿ_¥7ë‡Q"F¢ptã(夯‚KªûÏ~áŒv¸Íššäé3r—rÍd“‚“Âb¨H°D"‘ß7W×±3GÚ %žš!~1 D ƒ8qèÃÑÈ'÷)3!L ËAú4töâ÷‹Pƒû{ê$É?³”>½×0’/&ÁR8áïÏZ±,?¨ãŸˆC~¼ 0ÒÃûùšo´Ïa!E÷›¶Ð¸.`¡½ÖzúZ%ç`MÇ:6„Y™±feÞr úà3x„>&M£P%î Y¤ñC"\¼j÷a»RÈq¤ùUzÞ²‚qíç©ñ ŠÌÏÜååü\’  £×ãÆmDšRLÙ I¦­9߬qcÇ£]Vͧ;ì[„pÅÛ«yù]Øo{9>/ÌöU„ì²Î3ƒÆà„Hàã‘a£NMàŠ€ ö™eò1ô‹M ã [^Ëy€Tó<õ‘0¤ñ Jâ'èJŒ›Á24‡V¸!Ë aÂm¯Mö˜uÜÂêÁ?B‘ƒ9U$ˆóâtòÉ®×óï©åÒT]¼T:ÁŸý/‡Éþšo7Üï°e»ÊÃ17ÁT¿/ƒH8üOÃà_k²÷‚€ûà©!@!£¡"HÌ"ƒØ{l>ì±—CÖ3\Ö©'¤žŠr³>瘘«‡Qí„Ü(žKtŠ˜:tÈé‡ò4ò ­ÿúþg_Q u~\Hd†‘£CCLÞö"ÈŸB‹ :K§˜’1”ø=¼H]8ç{zá䈦t;½êÛ¾-ÐòPìCnxÜ«jÁÝ·9ñ>X-ïBENõ(³H² –ò´àÑ„²’JÀ![¦P¶`xâæ¸ýhêäu&_½ï'Ø3ì÷M‹ƒû»ïæ LvzÍÈ‹_{NuRÄæ˜G›cQ“›J¬¥Ð›ºåº…Y2d'œå¾)Â,Ü…©oïˆZUµ»œyŸŸeä73»À¤ÈF/ PEV¨oy(_ 1•z¡æFÿL¬ ÛÐåf¦öÏê3z˜Ÿov23ßCfà†äFo~.IqaÄ bˆWÆP¾}Hµ'T‘¸Þ„‰´bÙœé›Gì˜]=ý2?/Ëêw#èy¦Hf>ÉCÝi5K ¬ROS%N¦¼Ì>GÄú'SGCÌÞÇd™Ù%„„dbå½{ áûéÃs¸£IY ë5£V: 7ø,‘d¨R‘$»’ßD Ñaô é§—Ÿ­Ã)5„Cˆ"<ˆå~vìŒý‘¦_.4L{†Èð®èØ‹þüö‡èÃ0/Ÿ¯èIœÏ»Õú~ÎßnO‡Ï2È»‹¨pøµb>ƒ>džЈŽ\ºŸew´ß’"’5n.!3 #ü%I÷(Ců"ÐÒFwàÐc‰ÑÙ¸okðö]Nh4yÀHœú´²Â”ë“Ñz¹(=`8ïz¾ô\—_ϯև( sÀbZ¿óèOQÓ{kù°ñXüxÎ[…d­¥ï\ã¬6ÚçÒîu¶/ŸÞ±†މ_]wØw÷ïÖ¾3O¾Ï1 ?B“ØÎý«ÞÞW¾²}kÝ_Š=lù‡·Ü y‘q Œ“Sžóò¾°Ÿ}uÆêxl„h—¿¿gyç&ñü½¨ïoëNV87ÍyžPßßé»*αó<ê™ó®óª¯”ñeeáŒH•©}B‘SÆY"…ü[ÿÁ˜†?r;íz~gB6WÎáNQŽÔeùÔmÜi j扫‚¶Dx±$é¸;âùÀ¼9éZ´Ô‰ðWHØÆëÑp~,Zò×c=õ™GI’ÎEîrDKËiNùVrÜF;âÚ›á[‹ï3M•‘Qó5ö¿ ÂLXOr€1eÂR DÝ8^­”5ÚÆ eQ¯³,à™=ÃBÝy~¼.†™^=£È ÍTïR›\Y¹õ¦³¸ñ“I6ëø÷÷%µÙ²¤sIe{ì"¥³øG•'\®>|´n,‰pd앸Ûbé<í(~v/ôžÕa˜bÍrjÅŒ8œ©¿¡^}ð–˜`Rü‘1R;+ ‡wÊ`4$ÔØ‘ËÐìÞÂäî©}÷ôf•‚t`~ûw†°œÙƒ5k¾:o„`ûšÒ2ã‚wiJ|9[«àJK~¥n”nf-BFñvLÖá+âÀÜ ‡gaåÃ~‘Š$0b˜¾G st‹{×zЛ¾Ð‡  cyʲép×CL¼-3¤†]p异\†Æq CÊÌÉ%E†k ÊÉá,¬œ9mÂã…;ú±Ãs–‡ &š!NºÍxÊíÎG‡/׆վxm+°¡Ë”ÚX›lqÝËtiÀ´Iœt" àœwNìÉÜTj4Fä$˜Ô̦521~Vo¢ŠyÊ—Ñÿ¿x•»ÒCoq©÷ŽÜP'>(ñNˆ*C¹8÷*uæ­X@ `O“ÝšLÎÊn‡ 2[¯ÃHÖzRw— u¹eÂÜ‹~/Ši¡™[W‚eÝžE»,Ÿ¼ÄîJ1'8‰Ø™' ¸Ìu×eö1‰z§¡¶¤ÞÑMË„×"ç¾p7Úªaío à7ƒAæUY§SuçE $T‘^ÏTøxì‡'®‰[IíjFn 9ÆjÕýÞ÷õ *´ß󉋤[ª·)¶¡,mudË \(þpšßÑ ûç‡zðÊ_&Th¸F 5¡’<ï®JŒjS©{úÎwÅŽÓvÙ(èˆ.{°1ÎþŒÀ0RB…t\ôÆ4¹m¦€IÁÊÂÅ(!ÿAP,mßgSÉàíž—Ö圹<ëËskºµf#LéèUˆ+·+5"Xõ Ó+c¸×™;˜"ß“Õ'©Þˆ¢ôBOx ¢Z“S¾zßϺ´€½ã^Øé6®wF[ͨÛë^ÕÊxÂpë|8O~&JËMôÒÖf)åå+$wÌ•ßý… -sƒn·~»ipI aÙ†E%¢s‰ó#‚zòüý.súQôÑ‘§Ðˆ÷ñQ7øí½qŸ9MÑÃIA¤{J1Jc¹Þ ê_# º[Ä(h$Fþ‰Á2­ÐÃdp˜uðäÒgG‚ÁR®¼Êbp"Nci+ä%}ç*ÁD’—§‹C…¤šC³²#²¼tKñ6GE…4ì,}^Û2†é_^÷2Ì!¢aíª$“D¡Û³""aáçðàõB­zp€a¤ÚèkŽtôÈSos7{sR(qM<¨Æjè÷³NÌáå«Â_ôy®v·3¶¢>iêåCÍÙâ-wE¥ô5TM4Ø¢p²,EòvÌÅP$°[É…‰1 ’W„ûúŸ<õZð·vÍklԧ͆®œ*Ûk>·;›Abwq£5Ù E½neÛ^9·Ž3¼.„,]x¹WH›çefÊ rœœìuSHsr×/NÙuäBHý‘ãˆí 6MÓ'ƒc ­Óz™)»Jæ«  »svMÖ# 9Im¥/ºš GK^]jOï°;M´í0jÖTQFˆ¶À6g ŒöPbblÊj­Ëòlj}鱄0Ü Ä‘X™S,߀•§>šÂ»H:AÐ{öqðýÕ–=}v7¿CŠìñ„¯]ßQÌùÂwT&jìëV“Üèˆùé|ã có·kfm}·0m 1G·-×€ô.› Q¥C+.è @¨_®Â÷d?WÐöAÝÊ~°k!â³P ¯Ë…¶±êÝVŒ‰ÆVxI±1›j½¿p†%yK] @¸â˜Jl¢´W‰ÄR¯è{ŒŸœ1â}¶kqË+\óóÏÖ8‰:u…‹f¸¡?¬»'ÝÉ;Òÿ(öJ¯ìl;Z̾’ucµŠÇNIߺ$k=zß>ù}®ÍõÒç°mGŽ(„Ùm|¹rÆË VҥОý!¾}®³HÝ/ž“²˜Ç Ö—åfµÂy+è‰!SMwe)Ýg*])Ó-ž0ûaßjNøÙ†6gf‘;í{Tm§×®ûó§ç/^'Ò£Ý8+Q®wàq»ÿŸúõ×܉¬¡g%¿†”,ÑÒ·'ÛLët´¾°Ôʾ/ˆ¡ËLãŽ~c>>ß¾„Öu xáŸ1`¸Á¬çøøÓù׎ø9íFõeÛbR/f<'Ê—ÒÞ\'¬´ÏGÏW¶vBÛ5¬à ­ÖÞ ëû(uað«ÝcÅCÁÍ®•ñk_ 8–Ïêý¨TÉ·Hâĺa D¾Ì¶°2ñfùªc†Ák”™±`FÞšpËvâݸQ9x@†Ð¬gM.¦FVÈâR±r\ù`5|k–Õë²ÁÌo¡ õ–µF-$ÈMš…TJƒ´ °2MJ3—<ý³ëŒÎ”[÷*e÷J b\5Z]íû}-7U¨t‰ÛÈÈ€X Ç›6-“J°Î-ÇpÌæñEÉ(ï<7)ÌéL6ˆNì-]3 Cb‹eY >[’½{Å¡_Ü$$ù ¤Ä›0)ïg°‡<б’2(¤d€„ˆ‚ý"¨…Dˆ¾P/3ïyùy30Õª ”ÚÉQ±†Á辶œ5àž4uŒõñ¡”“vÄY-Tl» f¬PdÊQ 6Ñ´ùÑp¡=¥ÁÃðù{¸Nü®Xè=!èQI$˜G±c(b+" 99˜Éw.9 ‰”ðg¥BýûÊq@ñV E¸Ëgb]„vE‰Ñô2›w±œ ( H¼4îK€™ª+(²Q@¦ERÏveq~ùìÛÂéAöMÉîg±ÀÕ)ªG(b´DkJ †2\¦!¥t…VJÆX5u˜Ü¡–Ú± 7ŽÈ!¹"mütåï‘úËA?¾Iôœîì¿¶Ônj™š ¸Èë0ÔI„‹ G#\ü-\p^h³9º®˜Ç¶¨”óÊõ·\âwïà먆~Ë$ B*ÀAuÖÃÜûÊKEêNè5O2ð±±Ý ‡ñó(±/©JùÔ…%  ª¤Òþp·m>Ù“éøäß-í¶®¥rõ`/е¾¾mñ¥§zÑHùSWÚ-ˆàPi]Å+áÒ”Òî“—”ÁE Ýif5£šzŸ„Ö‰ÖÓõó‘m>QIoB“BÞ"3È™š^¦÷Æ ñw"êp…"üíØÜîšãXüï_9óöà ¶µ54¥zÅ‘$B¬¼ÅQéž!ËŠåŽóng!(Þ½¼ {²SÏ0UGA£ |O§rN&ýøø|%´Q¾Ä’M¢U²Ä‚GÓdåÆPã§¡¯3{ô§iðý»ÃQÓrAHЬ˜‹Ì>ô΃~3£CÀ¬1)éeg&]^}zá$ÐC'–m¸“|~í}Œ\‹Û5† 9DZÓ¢¬’¨ÈºDGaJ;v.©¬»ãÆüzÏ]¥ìà¦r e1£a€°ÌÀÌVÇõÜF÷æ]P1› nÒL·<þmôlûCl·ì'qØrÉé§Ñî}ð4,WÞºê éÛßS‚ÅGˆTA¨X…Aj´LBãjÅYçÝUÙÍ€Úš(hÛzá¬L tÑÆ°¾µb |Söóà50¼'Œ% Ø¢Çê…ä‰-É€N“’àv,)g§ÍÆtmYœÄ Ù‹‘íã÷Ã\Q¹|:R>f ´EyÀsÛòÉ‚ú]³‹¬7¥bÉÆf‹«l*@‚Å‚„™ $ŠLC ($ÿ9ž[õ\ËJQÅ+,M  N© Ù¡ÆHÐ vd€Û €º1]£x¢(™kùCs q¯I>7 õÍ´ó³Q—­<–@qÕ ÍrYíž:þ5Çûðu˲ JD€¾RfZB–q 'ç2ŠnR# ‡ÂΗ±­ra¶púBûoÑý¡ÄÛ#¡>EñS½ó¤æiMOV½óÞ0Ö.kQ³O"Š!…Ç<4_Ú Ä `)„?d“1;S @¤¶.Ú!¨‚•"˜ÖT…efVe™K"0Q ²ñL»¹œ]ÉB„AœL¾Ð%¦(è1›³ã½ ÒPȉ°•‡µá5u‡¬ s«¬›¢îîô7´Ûkà†r«š°Ý£{oc™ºáîœSËí™%ÏŽgQÍCÁQ_Ñ44ÏÈÈÛ±=g+ðÍI¹2o½g—Ê»¿/­ÌæÎ¼aPÃ^܉Ë@q ³|OÖÜk6Zì=Þ<3$+É3_.Cz¯`yðvxô)A$˜0Ûeém'”fäÚ‡À«Bˆ-ÈCÀª×ß©põ¢üS\½/C˧®›s÷®Êf0¶ AÅíss7Vm¯Î X]ŽÆx—M½u®áô¶y&nnçm™´ÑÉb¨¯¨f¥^Ç€N·¶ô’ØÈ]h0œ’Ÿ`ãž+E%þ÷ðŽÄd¼¼ý9ON'X]ÃáÕìé‚>)ØÀ³ÂT;ÇDrÉ©Ìâ"Å5Pµ{÷WXÒø«¢@Êè<®ybI 1hªPÕ7íêñ Ù%KÓ—Bxª"ìuÕL_ù|yl¿.ÖÛÈÉÔ:øÖxxðƒ~\Ë-Ôðøâ„rŒe·øž'âãy£‡wmó¼\´¤´’íB(¤"ÏXTXˆ) )%@¨B4Ê£PÊ ‡(‚eD€{clï Mô/Í¿o7CA0Ó¥G¥½r'Éšo d;üt˜Npл6ð²žØô‹¦Ï˜@±Äß‘©èkå¬[`»‡%~QlRAÓ°ÆPf‹Oļ±ÇË-­­w-ɽêì¡y²‰‹†<®ëšÝåÈ]UëJì((”Ê)ráçåÒ¬ù.|kŸ)ñß…t=f·¤5¶¥C½24ªœ@Šåx„á’ÂT ˆÑ! ¡æh&"¢’ 'œj…AB €TTJ##4)("¿ÀGâÔóS;;ì{v~ÁârÌ®[¡¢†oáž04…BS˜¦pNÖ:"Q ±!¢!‡¦%é©GEçùóàç|ŠOdç[¶²Krc$F´®Æ´lšÅb…̦‘T'šætãëÁÞ%÷ñׇ ±««f+Nì\t ±îš’9ÓÆE@¼ÏˆÜ¸ä 6,`Ú¶L>³('ºƒ6-nL—M5ªk!“Z$Ô®ŒP’H–àê&¬°§­=é°nÜ`bà2Ï7{Ý2Í!b¤ƒ’°Ü,Á EäS$H7È—ZB›™‹.yˆwx¹™…V¡BñFwÊY¼A$ î$**’°¶Â³šI‚dP…wmP€ëùï©Ý ç†u%p0*ˆDH±2$ISTYWÃ]3£‹ƆfFHfš<…_M“yº/D\áwœ(†ØÙÊMÇeQNî¥ÀŒ_AÈ×ÌßñÉá Wä‰g#Íø\Hí[á=€]¬…PéñE)Æ82ÔˆÔ‘·Ž‡ÐL“3#÷÷s°šnÕð¾7Á.(‡&+^¯3£B§ñŸÚ-µ]À˜$8Úþ †mX(ÂD«Ïùåýíoïœ÷vo~Mƒ0  Þñ³ŽîÆA`=—"Öñ”R“9nH“½%ÞÈ*]Žþ^†èM˜oŽ®Çt9bbõüãA½†ŽŒÜÖ¹¡ëO³)š<{l3Ðå`êÌE€¢ý©O§éõÊÒ!Ýë@^AV>RDWx»X"§ñÜZ@ü:o÷}ä„ì[å ÕpxrøPϼº3 ¹ú@KîufÀî`<ºÄ˜‘ÌÙÁ†Ò9e'Ìù1âÀçÇáuœ%¹Ñn&¸ÜÌ{¸Cù˜LÍ®v€ô»PŒþ€b®A€È‹4àë·Lñ€ AðÁ€¡„Y$ Á¦ó¸;`¡ñLYçîM³¸HE$0 iÔè^äA‘å¹bÍŠ§åâ2Iµ°I =èY…©K`c€å,ððÍ.¥ü.1a³ \¢Ýð¢Áf|[؃žÛŒ\aHê:ìo]îóLÃ7i!Hi'6Œ T¬©(ã1’ IdòC2õúašµ¼]®“Uˆ³Q„ä?¿-·Ýô™ºÁ4€PF?Ê‹5®„’tãX"q(¡02;v³fMÉó†ž{ò› Ì$=Ä^Þ§ø!ÖÞynkY&5Õª,(¡RcÆÇ…û¾#M»=rŽî¤T.ëßô‹;ÍB4ÛØá÷šº*úu§¯no‚ ¤ã.¹ˆÇá_'d’ wœŽ`­šæ†n(&™‚ïs·µãw¾h}ðô–uo ã¹Úb\¹k]¬ÌhÚùâ_óüýP¬U?§»ðÎñ®T×QƒdÄDéYfúéÓN}Û{Ÿ3©&0¬KŽÌ6vÆgºÉãú/Ÿb¡…F¸ÇæŒXC±$íJ¹%ðåÞ,} §ˆò¿¿zBôÁjnݹøŒÝ%XMtP›BLÃëàÍP&uláƒ1â÷0ø0®âI/Çm@Ç}GÖêW?±cmìy:OßMû_—Ëd¢Uù§Oƒû°‹j„‡sÒ`È‚vd`Ç‘Üß¿·sëÝ<4x£ìû/Ïèý{$æŠ3x?P½ÍXˆyŽÅ[jFïõqΆã×¥¾„[yäyŒÛ­iõ•ÈÜo8~ÙŠ‹ùSÈùü1åêF@«ÈPQ$«á_£âþ¾p”äu@î¯{†ÈÁ’B!®<¹¹lã6Y÷yƒd5/¯Ä…íú †¬ºì4Ê1Øódv<‘#h†Ù†û`«Cî4:vwûÖ8C3¬¡M@I¶¶U§.'é©ü>T=ÿ`öHc Y–£$Po{ÚÒÖ’´PU mô”xgÎÔ×οåü?Ç•ÿ±Èü£ ‘ 2»Ì1θ42› FBVìdÊ”a& úTš‘™F4M^Ùcqòýfç4å–ù²b‘ n:1(zµ†I×jüìЬЗa ¬ekXTY$!P˜[›ùÒ,’p ˜• ¶¾†²¨ˆX•ºõ4aè_>©êSØ&f6ª E“s·qûU†0@®òâÛ(É”!h€Ã1 wØË¿[¼³í÷ÜÅß/yaiaÐ9ª0fÆiü‹Çæ8L¾ÝÙãó"Ü›‘ǧE9ª+ïŒý£ö”gÖÇr†.w}ÆG¸ÓON‡›þ¶¦ ]63¯DTÒ „(È X¡¦ãa~3H™š"'ˆ\iêÎf1”@;ïèmé gu=[Æ2ÁÇßÏŽg‡¤štðîÿ“ë ¯ƒàPHĺøøB]Á‚°w'¢ Q”/ÂZÖw ”ê«áKD’xÌ¥E,U:Èz ?õþÆ·ÀQè»…^šc$FE$HyÞ‚Éæ 3åÛ>ÿ`З¤A èFõ.#”+ šU¼$Jõ¡,l¤:Ë ÄÌ„9›¸·-Ð:põ´àˇ‰Hm^Єæîõ $ȼÃ&L1e‚/øÿYY•°[nñ­°³ðxT¨`ûf`k¦¤s>"I’ÙP‘ È$ÛdÐéÓlƒŸϿÚ'J½Ÿï¸^.ó0cÁõ|>:ÖÐmR¤ ¬ˆ‘@¬•>ÆJõf04Ši€)$ d(@ûn]+¡šE-à ©XDÈ20Úh4"¾úCl… H¡ØIaÁF²ÙàÍŒ´©pÕ8 îh,A‘Êwø= Œš "‚ªO*'Üü€¬ŒwT’ZªrªÓ‰jKàµì¨(•¿O<\Á4äú= å~kÇàÌ?”õ»Ž,‹ÐÔ¡JK‰,´YË@î¨HµT†‰;¤Â ª±?“°\(’ 1,(“ }£CþÜ äpN9ŒíÅê4™ #<«x‡™‹¬¥5NÔY AZ¶1RäÑ’ZAÉ,K#ù/ø8c?(„=¯žnV=¯­~»Õx½ïŽú¯q5ƒC€àhyL=á{ù^ðÉÝ|¥¢ðî.ûó=scA††îÜàÌ Ã šØkGd„ÕQZˆB2B£×Kòmên/ÅQ5@ÎÛP¦O®“¶úhîQ¶ýöN£¹Í-Í,wêìM‚·ÂpÓŽë,ð†Šç9tâF/ -k]i×b3Ë!¦3"—BÏ~ûxN†óÝ ëõÈ„ƒ¯Ê¨'Üdvª•\«Ã+©žÜ¹¾þ‡Æ°Ø@RBñ£ÇÀ¸Y €}Ä×lÓq d[:’îºÑ±Á¤Æ LÌþÃ`Å5tÇ3 œf!¹¼ ‰L“›QÕ$5 !dŒÖ›¦È\Sm©½Ó(d™d Rp°3j[›&@ K1™ˆ‘š¿UÖÝÍéQ\TˆÉ ²]6Xrl•M£2@¼™ÜIÉÝ“)è¢$Ê2x^3Å6õdõãX¹§ ¹^DUŠ%†uÿi©PBI1«º · îZÈ>ª ¨IåñÄ<õà ÷j‘ö-DDÂá``‘ECÖa©½º§3áÛ¶¶«0„™%õÆF–/뺗À «ç^—6P‰ŽuÕï] ´”¨ÛÀ½º>8£ðúÍ ?/```Ï,ØádÌEt1¼„öú—ÆÌ3øÞÍw$:f¿™4cÂÿ{ºè¼8AÛÇ<$:q:苽 Iê9õ 4&áq„aj’1‰À¸x|¨tCs¿,UñkZ4HýË›AÉåU –§ ŠÂo+XVùÞ×I—…Ô.|ÏßattÅÞ­³ƒƒG$öÅ6#…à[%¬°zr05?ÈèPC­rº !;3cRÀÍB@J©ïwÝ«ÆÔ¥Øägk˜4*œúJ¸Œ 1~—ÈÚ›ÎýK$$›Þ@L¹³ #–? Ì‹¼XÜë œ61Ò#"ÀUе%CpÍòk¾¦„a Ù…J!¶ªÀR00úûL/ЪõMÓôâ7ÕT–e4å’aë,§µ»yŸÝðó|§µ7©¾ÀÀº3kQòž\ƒM«*? ®(!L¡Ì 9cA9¸'QÙÈ.Î/¨&U 9ˆ†œGyD¡µ9ÎI„ÁÍ…Àè=6ÓUFcrÊå:Å8+¢» ¯2áë 1ˆŒ;RVmI©  j+;É ø{íÚzk°f‡Îñ€ÀÝîE' –¯Úp†¢Ö1qÁÓX"B s{EÕ7s]2ùÝ'3s·M{^j<„ìô°ú&Öüºõå;’wII(È.‘j ðË0Ù´ Ø\ Z‘6‚ƒ ¶yO¦ø÷o)+$ËH"½=GÛáÀk}Þ7y®Î5q Ðï† ë^®«™%—DFOމ+h p ±`F Ò‘ŸO~`®Þ3®fŒ¥µM™S;:¼á·(æ3-V4P7`ê{°„dï}$njrµc)³OŒ?½ŸðqŽªµ„ë²;Aç'‡þ8”Ù ÜtÒ/í,O‰ $Tw ;Ý>Æí²¯ãv߀¸Øg\ÐN™ŽìÞªÅU)x®RJÖy1?3ÎTJ´ É5+ìLF,NÔÞŤÛê“F —á{fëÜ¡cël·'Ù0%¶ÁGÞî\()Ä´v‰,[ È)Ë585†:5¶Ú¤ ØÎõïäkr9I #ù¡\³]ç,|·V®=h!Gˆa*ÕŨԹY˜w.ZqÁGǵØiGÐ…„;¶×o“&#*X#)ž>òσBý¥ Oz“dÇÇ0öía™† [‚ѹßQ¤A ÚÇ×JuÀzZçG¸ ÞVˆW|Ö‹0œ¢&úÓ¶“ÎÝCl††‚zm]ȲÅa‡á &(Zï­hp>&åm‘RZŒöÔȚv;^ͤÇm:&¦™¡Wy›kq4Jo’ææ¾2çÌUp@2·7ÝŒ=nʓNJ-ÊË‘Fa½¯ÓðÖïïGÚá47SÉb¬„‚Â#U"Šª#"ãØË«c@DDdR¢ˆ…DIò5þŠŠç|sýß;|Ï‘½¢{Æ,<÷°ÔÉÑ$$P…ETooëí+iý™T?·ó¼‹%ÇÓnNG™”Gø€ãcŸZÚÐf: ¡¢Myaý¨t…UM 0;÷Ñaý”‚h_è5«€†¬nÏ\¤ÖQ÷ô‹û#ÿì€tGÁ“ÄŸ‡upŽùå¡0˜«úWû6§BæÁsÊŸ‹ñž‰ƒCTý×ËÄ;øÚvZüÝ¡ÿ'…FÅĤ_ÏÅcNLOØìA¶•‘  {<|z\› ìÞ¬Å÷…•=¬gß4©7ž2ñÏúPb!¢"IžŸ™V*º¥•|gÔó¬;WÝ^çž0>Y`Ö0Cr&ÛÓ`8U)Ìñ›G»Ò¦G¥þÅð É¹ƒ.{! ©„¿NG-M'7B’Þ/Äœþ‰ûÇˆÌ Ãüe¼\¹ YŸL>8ÛiK%÷®k_®UQ}¡’ý0vÞ-0ü™˜fgƒ0óÚ/øýÜ9]<íÔü<ÈD~½–në´igR”ڵȓk°ìI™ŽŽÚøÌêj-3m;ä[¿Í¼Ì÷¢–ÞÑm„_ ‚a˜‘oh˜¦f,ž0cðMÕô<­¸_ˆ Âï•/¥|×’¥ŽÉö˜‡¶ƒwì%•0tÃ:$Z ý9Ç<Í:SÇïöÈwï"v¾õÀ)Uaű‘QIª–ž'3ÔkÈŒbnpH,# 8Ð!®½›¢ªU…*Å(ÕɳdÎîTW:Òå6}ô~6* ¡ˆŸ·/¿ô:031 `ßËô%§ V¿YJ×A ƒÈŠò÷¹¬åJïjܦ,q8;`õžfÆB‹…yÎÑ÷,ÄÆ€»Û¸²ÂQma–çŽø†k9UÂqBT* ‡œ©4yõñÅÅUxж  æcÄíà<ΓoŸ.‹=Ø lÌ-Û„µrkéGrÅór-Iœ(O`¾éÝùPÊ,ænþB/Fd^À¿›¼4ç`˜&:»/è†aÕÉ# 06½¼Üs]$ê¸9}™[ôºÌ9wï{hô¸a×Í r§ĉtÅ`=ìDÂMb4Fÿʉ}|aÅ5€ë”)âä$­ oð·±Ê/“#UÏ_;Ã!¥Ú7É9â™\J0ñë ÇÐ9üH‰ÈU3Š ¡øWº'&šù…ês@>*Ÿ9X@ÏÞåÂ,HyPg¶ø Hl@HÁ’Z"E’§(°-û›‹a*(Yhcêh Kafožæ>™o,,OÙµZÆÝ®É% "6¶§N†ãN‚kÓBz[U Oy >IÅ}zZ|ÚÀúoŒº:í¨N{R¸’m™HTº“wI4èÚ’_¾šy²{&Ç>3lO<ï×xT?KD`.B;8ïð-a*6OçÕ5¬Öб ªSjVt X9“pÎô qº¨2ÚÊîI²ôß}ö| 9rØrmÍ\mª™h¼3k¹©™£Ñd((˜t«?é×LΞýº¿Ûi÷|ùmÎÒ×8Þ° âVÝ¡Éí¬ÁRÉDZM$m "ö˜)ÂÁã©nŠÍOÍõ7ØúÔÈŽ–A¢„Œ¡ª§8¨Rzåÿ“Cà\;RÓÿ¼vs6Ë;ãäs­Ÿ‹AÈÉE\é©ûùr¶ðïªÈÆ/ÂxQŽÆ˜Ä5…¡ŒZ4ðß‹ Œ››ÀUàoÀ!s1z}|…Q ‚‰ýSÿâîH§ bá*Àaqbanking-5.6.4beta/src/plugins/bankinfo/generic/ch.tar.bz20000644000175000017500000036542312364015477020535 00000000000000BZh91AY&SYA^kíFŽÿ¼ä°[ïÿâ?ÿÿòÿÿÿúTqb»ŸD€P@ U J ¬}5ª ¾õÀì7Ç®ï€)wܹ¶êéÒêëÏw­­³^vyïuW¦ÞÚ³ÙÐOSÛÑB÷³€;c½€Èí¥ «×£ÞºäèVµ£èà»Ýïï˜÷±ñX’UVÑ *«¶å©Þ´ús‡”“³ Û¤ù*[C§ÂŽ÷Þäï¹àzµ‚@ öÀhØðï:å´°¬½q½Ýë|`è Pû`«ì³hi«}mœ§´R¶m#l( ”eí¥°4ª¢½ UwLèJ$*”Nï¶À,Q}½Ö@¬Ž§À(·ßr¢J§{qŸLè˜Ú/–}½8îà§…3eì=ìñ==ïzòâ¾öÞ}UuOo“À€@*uŠlXÕîjÊÛRÌF•æb›ºä…f»uÝc·Ýè{Ø/¹ÎŠ+lö®5T  k:{ËGqŽ»:pomưÊl˳»\–m€îw:ö¨¾‡ §¢öÜ: ¹§Zu¥Öm´¶ÊØ[³º¹ÎáÝ1±ÜÝSÞËÛMSF0èÖWi¾µr{Œ6eu­¬§n⻃»uNìuÈ6îÒÙM×sÓ=x Ðï³ÞÆß^xÑí¾ÍMv¦3+o]u•¯{yMSM²õÀ@ÐÑÞx¡v’ËIT£º;9rõ÷{©—»uóc¯»×PRš}wÓÀÎæ:éÂvhK]×pÝkŸx>÷ÌqrÒîq½ž…4Ѻà@+<õBšÐP¥ëGmh‡²½îåè»yÚsçvyžftvïoVžç]éôîûÊP¥:{€Ðzjù¡½µÖwn¬Ò¢œÆm’Ùe¶¯¨ä×@P"@}4ª½ñçÖ>β«Ùô)SÛÉIÓZ™fÊ @¢ïm·=ÐEÝœ`nÂI(‹Þå·PGªAe ¡Ý”·v®cUYv«¡€l„ÕhÚ´ªªª»®å!U*º£Qc.ºu)xû8^>àr«_^è5愉P !–RØb¤ I¬l;¶ö|}{Ÿ{L;Ëàø{æ¾5´«êµ¥±{¹gHíìÓÚØHù$ ”n̰fIUFWÚLUM}ð×¼ª[1ª÷ÞÝðòh½Qµ-öÒôÙn ^¥³kZúµocíU$iQkÀŸR=—j[Zͽ)®´yÔØ$³ïiç»sê@ïUR$”‡™¯›Uw…¦s•wuVµõ®©§^VÍi™#êÌ}j#Ü v0õê€ ÄÓU,Úåîj«¬¼(4ÉìÖ›Z®ã¹õëŸs·í»uBu—çÝóÚÕ¶¶´hÕe÷Ó}j8Ú/fëïqæ·»Žíj޵GLÖ¨¡µ0•–vV¶‘_sr]ÝÔkÎ5îÎk¹Ð»é•Ûî5ÚmU6ÕÆ›ZÒÚ m©¢m˜cRRöÒ–Žrk5µ‰¶šÆÃV™6•^Ø}Æíjn]ÅZzW¦°ò¬º&MÈtÄX6¦lí¹›MmŒè¶ô2Œ*ñíÁ{Û¾ñÞ¤z’–Áµ¢*ûÜâ(Ù°"ÖiÓ©#€Õ`ºuµ²¢U4e9ß}G¾„ÁÖ§Jzßvê5+blÔD”Îîøø¨T£¹eÞç„=£ê¨Ênï}ºúQ>´‚lÙ©¶QŠÛ$C,‚¥V6©¶VØ­½×ß{ìuñçžÛïŸû² ßMJI˜„DÄM4h=¡ È¦F€4a„‰…4& 56§¤ÓCA4€j{Q&4 hL™5O"›DÍM=F€ž©(¢ІJ~”b=&šM@D@ AhI“E6ªyGú˜&Êi”žQµê! ˆd€¦ÔžžRx£Dª2hSÿoû'ü¿îúùöÆ´“påŸóRÇâ|÷0¦uòú–&ƒ_]WÖò7œï•P b§E ¨<1TRZÐ(sÿiÿ†Óò¯½?·ãsœ×ÿ­Ÿ²é羫ú‰çþ?¦·Ì5¼Ÿê|ß^×þòûnÊßæÑâÍ¢Ivo]õ*ÿÞåÃlm¶ÆÛm·wýx{ð;8gBL~ m·þ/«‡‹÷ü\;=îOWþo“ÿ'g‹ÍäÿÜêÿÝ秸äù³ËèW§Ÿcƒ~}$ÿ7þoðêÛÜÆÛz±·ÿœ íºNžŽvx6êöcoGW]¹{=ÇæÆ1øéºÆ­ü;È6ÛÞåÃ;åcýg¹þÞ:|ÈðùÑn_ò‡“áã_·†u0z±Ëø¿gþ·›óvé†^AáÝkðÏ­jz¾]£3ó~çÿgÎÙáà7þn_Õý|ôÀ»ð~N¯_9ƒÑüü£öy¼üßП>õ¤þý=ÕøùŸëæxyjýÏ›«³Ñ¶ßÇÊøž¯ó}ßËÏ?öyxïÔùxññ=Þ^îAåPm¶Ûm¶ùuÏ—¯._]Žx¯—Ôù¿Gâ÷»úý3,ÿSðx¹Ü­Û‡|þeûgÄÿk»ýlï_õ÷ßð<ü;òïâgó!·¡ñû~§Ûè'¥Ï¬ô?_ë -&A}NrT9‚—Ì¿¼¶GÏ}½æ–7o9IcN†Xã¡:ì[¡ËÌå‘—cË©»©ïÞ}‡ò“§p⃠jx!þ'Žg/¹®Sjäë%®ǹÛÁj™óúû=¿Äûùhwøœ$ßÈ¿Sˆ~Ï÷| dqài&}Íî» Å‘ q=€ÇY?w”‡3ÖMùÐ4 boý§>®i¡‡Üûúž=ÎÎv=q-™×S¯#½§¿3p¹¸0 èt’·-ì~–8†Þ'ù‡™¬˜u>ùq=ÒcäG3¥Íä¼éègæZäÈdkRa~!PýGÏÄú}Cm綧˱¦ó¨bþ彋huîLüLwr§}æ;ÌÈ‹ž9˜Ôøäe™òÈÝ‘—3®E¬lɰTÛÿ#¯Û™ôÄÐ?wÄžFþ‡»™îÿÂçmL¶4±óÞuÌøï'‘Ó÷›j €nö9ØýÞ‡€xât‡#§¡ËqÏÜ[¹­Ò`5+üŸC˨v/žð¸`xؾǤŸ0ÃÈ¿áègÀŸSaî:q5“ Áè™oSê8æ!©]Ç»©—ÐþÛµ1›ÊàG™îûò4%t=܃Ì:–“Êç©îêec qàÃàˆs€XØ.àT<À:‡°{ƒßñ9K;þ«×ºª#ÈÇ:Ÿ¦ãÊÅ}4çZωñľÁfœÍxœð=¬o÷þG ŽŸ‘lÂ¥x…jaÜÃî¾ÜëÖÅÃwÌ™+¸™1 Þfí ýLÃ˹»bþ&þî!æcˆq>_cÇþÀêi¡»g§ÐÂÅ\íµqÌïñ4÷˜î?W‰ðú±÷ó:øžºžV>5ËçÒ»{ƒ‘lÏ_CKÞfù7ó?<ö2“ôú5¾dô?;½þŒ0ëìtÐjc±§œ u M*O©í'bÒ~a] d°¯C|•û—ê[RÛp{üBÁï°~°È>á`ƒã‘äf\>áÂÁ ÇÛ¥^_kçzîÌáÀ;¨{ÃÀ 4<tÓMFôx½˜ÿ“7ÉŽÇýÙÃÁ¶ØÛ‡ÁüîumÙ¶Ýœ=4 „€A¯­jæpùÿ±‡r~Ùÿ¿öþ®Neþ<Ÿè:}°^úÅþ-t¯„cêoÈVظlàÞ¸¿¸Ý¼Ý¡üY¦á¶ômòz¸rú=Ï“—gg ¿“üŸ'Ý·Wï£÷¶ÿs³ø½îÍñ¹ÙÕ·£‡ ¹{8|žù9x1¶ÛuupþŒ~­±ù1ä÷¼Þ]^l|XÛo£³‡Í¾üdŹoÇ‹Uk&»5“PÖCX´5ƒþrõcû—à1 "D_—… Eø-’+Ád›öï­M#…ಋdVä=ˆˆèˆ1!ÒCØ‚ü5ÎîùÔg‹\¶]]Ý»—=<ï×HêüšÝPÔ1Ì>­fÐ׳^¯šÓÁxo åù’ÖY2Äáâ÷äõX øµv†›PÐÐ×Á®ÍCÅã-lêÛeeDžÀˆH´#Èù&/Ú:Uè‡K¿•ýˆt‡÷"/‚𒇣’ö#/bþ2š$r¡!eôÅîÄ=ÊY¦÷?¾š‡`#¾ãw¨GCèvÐæ²/À8ÞÃ`ü àãÄ8o$ æÁ¶¦ µ6¶ÆýŒ»ìd_cùAmŽ¡pÄ$6+Ķ¡¨j u1Ôà@÷êrÔ¾¡©°K‡-Ž{Äž!©P8¸õ0Ô¿-å·’xqŠòñ8½Ï»ÕõçlA¹_®/RÎÍÁäåËn¿`pÆ> ¸?{ÞãxÎÜ ýçîð¯¸ü1ÝÃypêý9ÏXž’6Ûpñ±.í³Ï=L«èàŒ¨¿™!l¾ ŠKîHH_ìJDVVHTHVHVêñy8qîÓpf @¨d €0â }Œ=BPPð< 8›³ ‹†¾Ç-æADZωpý›° Œ6 ƒM‰â׉ÉnýIÔ5,¦Úœµ4ÔäjnÔå joÔÛ‰¦ã>&:šp7p/Sñ><Üœ 7à×pn+˜ò+‰¶Eò= ùÍs8÷hc¸38r/¡Ï™Ë™úº<Ž›ùr-ÈÓbx˜êšê·SN™ñ?O¹ò“ùæëìcù+Äâ3¯ÌÛqÌûûƒÐ8Lµ2Ô×Sž§.!ÄÏ‰Ž¦îÚžNúb7៯]>=Œ·Ûæ~¦=Ü>|U|¾œL^÷¿Ï.Ëúúxcçýu>ºôpë·ðóÛ~ÿ¶½}{ð÷wïòïï;ÿ_–™íèP€æä\È>/Þòy<vm^¡äRÞ¡SâO½‰ ~Ç—©= ó;ùzš‡`Ùkì[S t Øýû±Ä3Øß±ñ ìoØŒö2Äé ìNÀ7«xûîW€aï Á!ä¨!Ð5 :›uüÁû{‚Á¼?xbA`þ.Ï÷8mæø8m¶Ûm¶ßòglÞùÜýïgèþ¯ÉäÞŸ¿–ºbõp—&½&?&Øå޶æñw~7†[ÛÑ3%²÷öÍÁh ˆ‹9ÊçŸbú#/EÒ‚"þyBñ¯/vÝ›c&ØÛð?“8xPÜ@H9ÂÑîêZåÂ4'ô €¡À Ë È .„b5Ð0:–À÷p †,‚õÒÃÄ * Á¶ÀjÜ €Â=°´!ð;uq»è3Ø ­ƒø…Î]ñ<>äƒÀ,xÔá€byfCÏpX<Ìd7r †ó— Ì,Ó¨X$†ì èáSpƒx@@AÃ0È>€`!¼0;äg!ˆ`_è<°2;H)# …B û€ šT¦Té$É„„,€²`“Ä“tžY„kZLî 3âeP „P€ `*HZæë…BB ꌀ`¦`K„`$ àX е@2@ ‚Lô BÇ*ØÝpæ`iˆX,mT9›»ú‚L³ @4ìsMÈXë¨jì àB3}ÃyÃ05À0$:M,ƒ‰Î§ 2Ðí!y…C©¾àn Íç}Ńxz¦à5;PŠ€ƒÁP¾§w Þ\:‡»qÄ7u:Ê€‰=KæO7úúO†—G]Æ›|cƒ¶ótßéÆ^:AmXþφcÙÕhˆjÑi¶máßÁ³V™g!kÍÜ‹†é«®Aƒ8†óùpËǯmý²ž—µÚÞuòw^tšùÊYOŸ:gkÏñÕø/y/¹‹ç}zììáÃoÍàêåøsÇV·îíÃËÚíŸLÀr Bè=‚á!`€Ð*Jœ$;ÃöضÚmm­Ëi6ð×ÃÃ…Þ8h‹î;ž¯&o®xî|_G/gÉôÛÈêáË2®ÞÆûv ^Üóöí©É{uô§÷)'÷u!ÙÝåü«{yr1m¿Ã»ùö´˜±·wæÍ0¹wµ¹Tó{ðµv{Ÿo*ž®7{W~½w€†û¿ˆ`yxà±ç˜q 8îÞóÏxhFÜŽWy„™æiè‡`“¨s±Ë#–=¯©~g=qyšÇð×*åÀÞïËuÀÌ C¾úÎ!‹&9¼¶+&8€lCê ±9d­³®^à˦ÓÏCVdxìNºGøô˜Ï„n“'Ë¥ã7†xFNÚÌF9ÃàW3,Ã:Æ} Ü gC}¼³=8jk&\½7ÝëÂkÌ¥ùs?'žR!Tгl±)¶<©ô£TŠLæyãÓ$ë§…ù×q¤n7KÃBu G¸Öor²W‘ÂBφuÜmºkž1˜ÞfàXÌÃcSµ‰¯A ºªÄz3ãïEëoF¾ÇÕ5“´áÉùonŸH¿ÕœàrwÆ·ã1¹›TF~>®_7êô~NÎí¶þOÛ~yë×Yž3w×—S9µyVÙÞZa‡‰}F›Ává`nÇ&ß‹äÇ ¶ú¿“ö}›~,x;¾šéÔ—“õ :t8ŸÛ‰]¹ß¦> ‡àe|Hìé^N¤Ø—§") ñ´Z/sõÞ¶ºÿ(ö/|‚þ…4þ½`7b‡Á5¿÷ögÄ2û»!;jÙ<‚¢+Èhj_fã¹™´ÏŒ¹8ß”ÃZGªå߉ïÿaÿû«Ôæû„d@š@njú~‹^»ó܇S€wÚÆ°ÒáKê{i(6¹ôùÆØ×­ü[y‹8¿…í€ð`°=ª<°9Œ™Ïo8XÄ,±Œ”«ò·…RK—xÝŽASÉÓf¾á'š4…âï>sIó¥ ž!ÆÔ^Ôm?úf»T0Ȥ´¿¦%@¿ÑÆ…e+h½ïÒ-YÁ}˜ÿä¿©gt“£ óùõ0Yü½f«©ŠCæcëZŒd¸B­–¨þ¹8²ÚNÔ#-‚ɈCì~RÉñÃ&¢Dþ:èØ’ Ò8†ÑSCªJúðÇêè€ý# Ê0$,þõ CìaÛÉr`Â0ÁyZ2•dì®Ð‡¶Jª‹*%¶ÖQU»]®-ˆ°DEƒõFõ»-’%(w$H@ÈK³£’Ä¡2|*¶¨ ƒsd¾;ÏÁp%Lå Б&Š4‡¬6"`Ýkl¯÷œ×꘠D_´Z` –ܼèÇèžäó‰Hr&2CÕ”O?dA¦ê¢kuÐß¡‡F,!'ç÷hÌH¯º¹yÙÊågPgׇ‚hþ•ygø]ãä$í¶«ßž½µéo!tx«„/'äø°Ø£õ—mˆ 0ã„3ÒdŒb¨'¢0J=VÄýè92ö#똵tÁ1§À4p¼!ãÇ09‰•’R–4A¢trÀ=þYRãC\˜÷ÒïÒ¶J‡_1HÃo:Ý(],†\“§é¶`¢ç|»ÉΡ“!™%¦IKÅ4€Á’?¡R§~M3ê៳NšýŒ0øá© Mæ^!—¼ÿ³^¥`W &ÉÉ­± _|¦x ðŸ„úûk›ɯŸÃ À× é¢‚pŒi‚~ji˜ÊvÎÕ¥$ð¦Á|¯Ã8&)ßWî …”P'ñ½}~ÀrÜYfñ–1 ¹‚‰ÈHP>‚lG"Ce‚¦¸ì Ãu-ÁŽtŒlYéê9ÿ,?}vñSBN{rŸª>€B¦$ì½ʼ"!¶g°<uÓXRÁ<º]e²Ò93…!ä±§²«µNrø¡ùGØkERÑ)4>”ÍDíSÂnšzW a[“áQqž3… MêÕ¼µíÝ£ÑãÛÎíÈx¼o^3ÉrŒu“Ép^ a“-ØÆŠ¯ŒÀÔí(kØ‘VhjóÇÏÚÓ: ä°ôgâ"Z)øU! Ëä`±ØX‹IPÎ:$DŸØfKZìÌ¥ æMäoìá~¶v¤oKŸ&’VÉßà“¼Ú|ŠH‰q¯TžÙ"bC•‘û)üÈnù>’ÔÍ–’ÈøDÁQ¨O¯ù¶—ÏkBPù²ÇÉëÉ&_Á#ý]*€Ø49k¾£fiÌ•aÂ?e ‡$•çÔŽÜ,{#—ÑSÔa¾‹ù3cèølü”©‚,^ Ù¾q ‹îâ@U!.!h åVö @kÙùÍ*—øÜ Hù »ï:Ø Äsjí†å„ LAÛ…£Ú_¨Å¢g»öZdrû¿¨þ³‚Ñþ”Œ¸µ% ™M Å7u ¹#t¢Q!@žM3¾±:ÈLÄ7–ꮑq8yhâQ=¥§{ÔŸ¤ HbëáÛŽœUmF2}w·ùJ9‹ÔÿŸÿTAxßÿéý§äå_ä¿ñ"oöÇü?ãûGàÝ?±ºÍÿlìÞ"l x–*+œ±›­› ÉΤT³«ˆš2]ó#1*Oý­¤áA‰šÐZ=·Øê8Þ›3|ˆÎg”Ït†3Õ}å¶™K›Ýî ¯Z“•³UjgÕë+w†G˹ӑg:áqz%Õa¶g¨´ÏPíêRbOoή“]l²EÀÔÇ5®¿B÷zr+m´”¼tµÝwEžËï•Q­ë¶{ÊLJqº;æ·6Åš(eS}”Ìß%™NÕf©{K­AŸ{ÍR¯9ÄåÊY³ÏHf÷“^6usr׫zxÌñÅo%ëìÖ{¥Üf;lûT^#„~ÕˆÇv5ìÕf{Wîwžj;جÁòèµ]nm#©«&žìK¤thbç6®—P{å’NÚ8I¬õÊï<ŽçÞës·Ùó3Ó—TQ¹J4^JÛ'2»~6[|A3¾-$³é™,¶‰¢+ÞöWÅÉBe&5Þi˜ó$ü¾컸]nùÌó2uº‡-ÏË,Õz&éó¼Ý ¾_7ž®Ö"ÑRÎéâ=iVâ´îùÝöÐÊ#‡Úá1v;Ìö»§]o}ÜŒ‚n=[¦ºï½´®žr¬‡»™ÞDnË—Ö®o]ÞÑxœ„}æO:>ôÔÒXj"‚^ÏDüVÙ•.ÌßtÍ;*TYÓhû’R”æ '¦Ýw[Ò=Q\¹p7:Ä&\6´£4Ë={”=JNìªB‡0–µYáy{2éPµz­œi=—]•[RêZ齋LÏYÛGÓ(iê ®ï:î`÷{nOTum28!ªùM=—ã’²v6V3|J¨ð]ÙÑoµ±Â›mí#FõuÂ;ÐÊŠ-…Í%A*ªJg•}kÎQJ‡S;ãS»f ±—Ý•¾´ñÜÚNô\æª) Aî!#Õ gE{âƒÚÄ“s{¼¶¶Ýjîû”i9#¦†Wrž¦a,Ÿ-Æ\½Fê¸Ä[ËgsѲ9C:ÜÆæ qžÙBç<ã5FzÍ úEê7)­”sµÝêÕ´ôU®®ó£IÊŽ„·Bõ¤Wõi×(^òº”TÒÔpÈ%12Æ‚r"R‰¬²½i‚Mv¶ŒD»”æk¤ËI,’÷fÛÊqcn\½dÁ¼uv FM=ݳõ&- †÷L7lïŽæ¶­²FDq[i‚ßxw­÷¢+¹-’@e»æ§OÞt„}¶i‚£wŽJÄÊD—=*tZg¦¢íPÕSD\ȇ6…perdÇZè;¬Úò§ªxê‡EC"á¢$w´@û`úHÔUT&5decswU4>³XBUvfùïvé/i[m]Eñ¦Ó:M¯%ìæ4å:–gfÓËÄžœµ<\éžu¬”¡ÛZAn-éúë–ÝÖPIöùΚOJî…[í¢ìÒÒjgÜî4ûsÔd/85ÎpÝ7IZ4¾/ œÑòS1Ýœ¹—W<æà¢ážºÖ} Õz™;}&åƒqr]Ï›7n#7!m‘ö蜗ֆT!¡h§œ¾#ÓSÛI›Žu {1+zã^Cvæù&ZûͽvöÍ—]J';í½»¬ËÕ“ðÔÜmŽm¹Íí•á‘uhšD ´ —=ê-öÌZÉ)k¯z7Y°´w»¬žKtPfÜÍd¤Ÿ!]Ï-å‹}ªå;>LÉT8s¾ÂïqªŠ°½©¤Êiiò޹Î6wÌ🔳:D{ yœéöû>F“fH–EyŽ|dˆµVn’=. •éÎf‚:GV P¼¦¨âuoŒl÷¾oP’‘“3ÖÈmXîD_w¸y ¼›CæBJòKwœ”‹¢­ƒ³.2½Ñ;ž÷žw™‹ mØiÄu#jD™ƒÎ\(ÖŤMÓ›³nåxê´ÜJ„ÌÜ씌øöëÓéòV¶Ç%9pŠ ö|îQú»ÚöjêU—Ö:V=¢;&·5pDZƒŽƒL™ë³ÂInÍ)e[¬}ªäÚpø¤KA—WY#1ZžÀ8nâŒÓÕ-ñ,¹P|Ñ\G;ÊoojH ƒ¤Ö©²…>.µËÜæJžY3žÏw"xhÛ'{žT:jyÞN³mnõÕµÏiH¦+ºÎ:8½×[­{˜zÈãN·Ú\ÕNt\(~"?5åÊq[N‚ηa»Åêk|<÷–¹Ñ™ÈMtïR[]›q·¾º6¸ÐkΫX^æa9®HP¥mÕq¶Xà‹ÜtÈ©ˆõ¸fì Šß\×»9ܶ“kÌ‚çP†œÜû:Ó“¬ÀˆŒ÷Énù{s\± í¹Êô†ÆGu2lÁ Á«2ÆN%‚ágLª×Ö‡š‚)Ë6ÏŒQ’âÖ^ˆË¹h§UÂ)>§:ÚËï¹÷©”–¦¦”$Ò¯5Ns£Žv·Å”‡K –ÍÆzè•Ò’fä¶wR´äm8ÇÈ&In©‹î¶q®¦«™nrfÁ1žòýRN7jÈÛk”3Þr)æø¡5È]ñÈó4êLù=ÃF¹Ûw¼ÚèúSz˜-AjŠË=s^ôй{c½ù¸½wU´nŒšôÛ…¤ä6ôª»$\“g‘¶¼¾ÍF¹#;Û]¯xðZŠGîÝs"¦57¸äé‚‘¯Nù¨ÕÝÝìç£'µLË·Fu#1víw7O+Ž b!=˜ÞŸ;ºI~ÛèpúòR˲cÒT¤œl‹tdeÎê¡Q^ûUeb1z-ã;x°{¾ô÷dY¶ÎóÑÒ9C:ÌÆæ ‘žYBç<ã5FzÍ úEê7)­”sµÝêÕ´ôUÄÞ£i»ì2‘çJ, •Ô^Q^޶€žPGHŽˆ‹ˆyÏ+-¡­ræ¹]âíÜôhhó"*ã¯LÆD”ôZ9KÖÂJH Rñ-Þ ­-¤RÓ]^”lûÁ+‡i¹ìdhòíYj¶€¸-«·'Ã]icµÄ±<éèÉ#¹ë·I¨î-jG'¼¡DôÖSg™Š¸Â:l™É+júržæ•žÍ{Î÷°Qg¹V7㌶T£²¹âܧ%&×™ÞtÒ{ns''±Z©Í•IÓðô³[:p¯N7AÔjŒIiÕ†Êõ¹ÒgW}Ò÷»·Ii±»©·`ºvÖ´Zéë¹\‘wMÉØèÊutÛޕoMÉŽ4/LE2ûÐÖsÌï9ãºÍOV”åM•èxM‚ïXè^Ÿ.­¬Íó“Ò¨-[ò¦æ+[ºå†Þ˜Ì‰³©‹é·ù|Þ÷®A }.$6^u·h¤§J˜r̵Áqæ¸Ño|Ûè¤ôäqqÀ½Ã­vKd9G²×^8š —˶iΦß|¶U½D,¦£/f§L[ôfç$L™k0gu’Ñ^QiÞ,.x!´ÒÌêNàâ¹Ó®ñjíÙX—WµzêÌò©Ér‡k”ãLÞ,{zm)ìÕŸ‚8HoÅ4V&+ÕiÐrJsDQÌÛlºTºÖ›3\ª™Tf¥Ý‹yÖc»mqèéÛ8­ßê j÷ÀtE‡Ù«Qšõë•K×®ÊåÔËc¨´öü´¾YàD*f» •ÜÁU¿57Ò=÷§@™Kz ƒîÜwºj¥X5æšã›DÕ3VN Pºãslâê-Z:©k™ŠÒÑpåûqܬo5äïHÙvÕCÇ+.Öë:Ëu«½n±¦c:Í&‹•Yî{1J—°ÔiÈá-Ç9ÆæÙFìÛ‘´[Œö­V+«oPsØÕζ›ímï¼äÉœô„46k)4$o¥ÁÃm(× u˜|•u‹I¨á&Nj+s­±Ís“Ü¢&É/—Åcî’)ísIy-‚^IDíšYž»•ŒåšlµÜ®’§)’ùBïDÏsSóÎj ¢*N‘O¼žç™ ÷9¾WD¹*56x‘u¡­žÇA'BqÞ'\(åhĽ:s– îák½ÏrÝŒ§Y®Œ˜×/ 6ýz=‘)Œ¶VI sU Pzé”&µx‚ÖÛ]=ï(Äv[íúG“½],^Hù®rZ7 ®Ø“^mw£ÔÕ^JÄSïgq©Ù>õ¾£l§Oz4vÊtÊñ“å­Ö©Í£E²$}fN –ðJMbœé5×Õ‚ zÃìõ._Yå¹K•­4Á'7 ]F"^Jw5Òe¤–I{³må8±·.^²`ŽÞ:»£&žîÙú<¢ ¢ÓŒë«Ú.Î]øë­èŸMÀReªtÙ$ïnÜ…;ÝÃo° _dëg9ÜmÕOD×Ò¥JÊgNrI4öÝ„dÊY¸ÅÝkzCmZ>É2µh¦T5Àù“F’-Dgœå®²Ôú©âæÙ¦ Žw­¹+)\æz§NíÄ•®‚î±w%ÁÜÓF[yÓ¹­­äˆ3h“¹gÓ$»«'èèÔFÖìÆ«/¸æZŠ-àŠ«-ºå·u”}¾s¦“Ò»ƒ¡Vûh»#t´„Z…cÙ÷;„Í>Üõ Î sœ7MÒV/мƒç4qÂLÇwfræ]\ó›‚‹„bzëYô5^  ®´›–×og½¶å]÷*Ì—DÜ¿t2¡ E<åñšj-^às¨[!):ãU‚ŽÔo™Ò[k¼Ñ;×olÙ}I¿;í½»¬ËÕ“ðà™ mÎNלÞÙP4‰”Õ°}°†|¹ïQo¶md‘O]{ѺŅ£½Ýdò[¢ƒn æ²B ò]¾[CûuÊvwÐÒÛ«XáÞûÛfZ(/w4–šZ|±oG®sÅs<'åmª¶ ˆÂ6s¦Ûlù½&Ì‘,Š4ò!øÉj¬Ý$"z \+ÓœÍtެ¡yMQÄë ßÙï|Þ¡%#&g­4(ڱ܈¾ïpòy6‡Ì„•ä–ï9)E[fE+jöÏM«ß8Ñ|0©jÄñ â‰2çžê ðe ”è]æa9nB­ƒ—¡39’‘ŸÝz}>JÖØä²ÀÐìùÛÒÇ[{BÖÈÕÔ®!3Ö4Zâ#·W«Ì‘àâA¦LõÙá$·f—(Ò½cíW&Ðs‡Å"XÒ ººÉŠÔ÷’’ýf˜æíF{+eÛ”wî®#±¾oq¥$&uMMŸ—Z’åî_"J¢/±Ú4m½Nê3;ïfu›Gw®½®z”S]ÑŽŽ/uÖë^æ³Æo´¹ªœè¸PüD~j5Ê!”â¶nÃwŠ;ÔÖøyï-s£=o(Sišä·Ã›R,nSeUÖ¼æ›'['IÁõ¨­¹ Ñ%íwU®fW¦ìõGVÓ#‚¯”ÓÜ'S3[ Hˆ­z{.òÞ¨ùMVXªÚÝw³¨R¶E,™eÝù½ÅÌçFRsM«µ#.¯r×”ì.·Ú,Æ«¶›—¨mqU4 ¼²'›FÍWJi:£=Û+öºÂ‡U÷Lç„le¶]¶ªPGxjÖ—.9NIhðݱªÞìõ=¥ä¹\®N¹ÄÖÐh_g™'ž¢Mmò#nì½(hØ,ƒÍD.„ WÇ%2KÑZ<åZm4Z¡¸Ùs|åƒ$ëjšsZ36>ñº.ås)zåö¹{Ù[Ô»¦––„ç±»m-ê÷ª¢ÆtáäJñIxsg°s9:jEšDXt+h‰Œôgr³.L«›élµ½ÊJëgZ“ÌÖcP«¹év¶yŠìNõ˜Tàî¢ÛIžž“‘Y=f3ÑkÙKÊ“KGÆ Ëêl!Þ˜@4¸žÃÏNäU-;¦U C.»\ìgCw7“HÙ¹LkTMQy"ÉQ‡­&!û*:úß7IuÛ&|ï_$y@¨Úò‰j˹Úó‡½µÍØ›ÝõΜ‘»Ç¨ØÎb%NZU¥¼Ø¾±÷KEo˜Ê±ö7«ËS”h¯tÜJíïTÊÞ{¾"ê]‡(m˜>ŠtbMfzT`¥£$ͦ O›94hiu~84!âM/æ´±|ð„’¬Ð×:ïÄï>.ë‡ Ê­Êž=òÐE¼£ÑíA×P¸ç¾—{£ {=ñQC§6ê£Z µ,¤ÏeçJy½V÷WL¦êÓ0‰Ú,•iP•aˆÏw¡:ÕurTú½:6º¯W¹y#šœ’ÞåfK}íeù’L¨Óß5zBÔè“;žqò[ëhvû*6‘³UΟ}æÝ}­åciËã^äZ)¦hóÇÖ­óÝ™NÔòz6F¹!¦.Ë´Ik¼ïv3<îæO'Ø…)Ë™<“W:i¥Ó²u«]óU“…®éB±3vCk¥±Ye“¬#Þ›:ؚɞNƒ¹KÞÓ’9C†w¨¸¹(ÜöEtg6«šÜ¢Õ:•÷[GBNo¼¡¹½Œ¦¶Ä²÷%zSÉ8éMvzwÂ>teEÂæ’ •U%3º¾5ç(¥C©ñ©Ý³ØËîÊßZxîm §j72¹Qµ“KÕ˜·níÃt¬®Ý¹Ì¬Ý+ÖôŠbwË’í¢¿2Wcvzc1¢¾Íoq‘+%½Åoõ÷ÇýeŒcÆÒmUSY¬emŠÔmmjˆ DMùëxATÿª  ¿æ?ðŸzvöq×›üºíïú{¿m5éÊ”õþ.&Œ¿¦k9)/𮟞×Á‰ö…ö~¯öíì>GŸiÚñ?5¾Û:ç°ùõî“I®³¿õ?¡þ~ßóý÷ýn{ˆ`!þDðx=<}•T¼$õC²/‡¿ÃI˜a{5oðþ_½d»àøó¢Ú‹öužÏËŸ,ÕU“×?ϵz{u·ú3ã8þ^Ëmkmüä§¡^c._›Q§Çå¦tBTIö㣓_u·7ëŒË6Þvë··Éûôý•ÿ‘ Àû‹³ö’”Y¾®›-úÄëU‡Pë9÷‹'Æ×Â}:ÌúAîîûz·žIàŸ‡ÇîO¼>áü¹èÿà~àý™ý¿Ï³ ´`“(îoýð¯ Cý|&@L¶aÈÍhˆ‘¢‘")Ä(L1P<·A '¹eJ¸F(žƒSƒ{šê‡EÄkÔ`q—בp{Wh´­VªP8PÁTÌ /õÞnµ¹48‰u³(Iž×;©L¹å‘À!"°F(Y|'˜Ñ(Ø0ÆÄ$Òžc*{¨;.ÆÚ¡³‚»0¶­¬.¨V5w"b… n …³ …ë‹È‰æ;:“›˜´€©ËU\cNíO]‹N{QÌØ‹CF]ós£[áC &EJnšWs¤,ŽÍ·þäÆÐGóvÜíZC3¥X1ã®Ø41ø.«K«¨…V›µaå—¿—Øúû¯ëóŸïøø|œoÇM~w_àáçC±ªôêô˜Q¥4JïC!¤TÙk'$ Œ³H› ›éá(Ž£:ÍBf¼,.'7üȳÄü31“Çl·?»údm Üê@¥‹s C/g×)¢tà·bâÜ$:ÊRwïÍ“Oòð`£>©7ˆzrB¥Û{`ÅWnÕ¬â8ßÛ=ööOjÞËÒÕuÐ2Џ S…d;…‰w™±Íº:QÉ<…û¶pÏ3´é3à,§wb‡Ì6ž:k„àß»[ƤžtÁAbäPèT`„ÏæC"Ï$Lˆ¼" #€ø aƒ;EÿKè©ý¸ $Ù‰.*E‹4R"EH!JYÊçšÓF®åÃ'"³¦­kÚ߈¤èBPÔAŒMV®Í7µ¸˜R˜šZB+ÄT¬¡65¾wÂ[+—£^KÊž'˜½Îa8óôƒ¥­[^¶m3‡ÐB~®á›õhbtWšPlI!V“)›‘j¤Y6C&@Q1\ÏÉ|‚Ù`Ècرö{Òåú[9˜ÿíÍ}"˜šÀÇnÞÖž=ZP`Góv?—EEOôÕÄm{¹"8{D¦%<ˆ‰/è׊­› ´Ûçá ±öºB‡—¸:×Åo`¾´Ÿ”?ÇÓß/Ì `¶e¢5Ñ0Üv‘,Ÿ£¥9O.KÉsTÎŒ›¹¢µÞÖ¨ù…œ'wð`]# ’ž‰<²ŠE¦`Õ\¶’B"!!MxÔ@‚}üHT¸¬fótoóïc ñ_FíHžÑÂP|ÇíðñµœO0õK¦Æ£# Ž‹© ¡ZТ´êÕa×$’\ZլȨO^ £ÆÏ«²4ìgØdÿfn›O5o‹\›øcÙêü{ÖFº4¹÷#ªš§¨·:&ûõ]úø ^’W ¾4÷"†BV˜P>>±ŒTA£Fö~> ±±*ü XøâPÅ^ ‘"žÔ‹±WäÀÆËÇ(rÁæ5ÍŽc«àwÄÂO ¦ ðBˆ‘†S#¢vp §ß7ð˜øT,z „æøCÔSâ3P‡sמŸz¦±æöõë ŠC’àIT†Â‹‰DÃM‹ó¬p‡@ð±ËñKäT'‘°Oã½ò{¶vóù@8:À“Á Ò\ÔÈg~0éƒz³¦·2×ãͼÇÄ_Q'øŠ”ÍnÖš½ËMµ;œeV0ÃŒ’]c0Âlæ– ITS54–³¶±¥óµ~Iߟ˜)ðAù¹ù§­§ãê$½Í%ö‡—·ÊÅUÕí½ù×R†R Â'3CÉRp] fë+–¡¨±xâR°)ÜAòÿ<+Ée95^7“JF–­/SËPÀ'Ö¬°¸Ü³wü'&%ñuÝãiÝÊd$N†kÑ>??¤ø·ŸêH²àÐà0hÇï’,Ñü%Æ¥ÎæAÔí¹˜¼óHŒ V¡[\*òît~þ˜?¤'ÓÎ~—¼Òx/8$Z oߍ¤Á*̆„àÀt??"¿QŒÂ¥MVDªœÅ#÷^LÄ0–w¤Å)±K}d~ ä†>=ܱ«ñïcH§·Ÿ×°¥¼õ ô>¨táïÖã Q[ݽB2,„ `e!Æ ‰ôi· 0¸™Ìõ. ͘¿wî÷ÁòC¸ (Ïbü*Œu»Ärrƒ‡üJ¼º«Í¶÷óeOHÓüz÷„þB Wb4ûƒ2LpÜÐ/.!ÍCl+«…Ù£»B2$Z¯z­XY`mZ³ˆ«Ÿ£õz:/Nü²§¦šST^‘ÆRQjpŠw×U­Ó¶3"ŒñšaRbô“5¦qbÿÏŽÿê$‰¸ï×PA 0¡ª`‚4D]¼ßl8S(œy .Á±ªT&šGêÄà/7ƒó/nºßYÌ%椨’³}on]°‹ô—ʇð6.íîC2ñ*L\&)@BOŒe c&^yAÔúk‹U7œg%á¦Æt—ÄÒi^úãïÃæ æ¹O}^‚v¦«Sçü}êCG£*éBª”úB°Sñç ‡wÒ“?j_|.B«|,É*“¥2tYØ×‹×¡Ù´vë^ÖUˆVê]ÝÒ±k0R…ö\+ p%a’]ÙdšTÝVöÎÈx =¼yÝ]—Ž«#${W~Ý‹ø3ãKçÞØ·†yt_{ ÁÝ1˽¼)á‚9ß¶¼Ç`;Žh/Z¬*„·Z†çGÖ®1Ê‚êÇ„0ê *m1 4ŸL# îÿS>ÅšhÔbofU­ÉX”‘ã¹ê\3Û@¿µ±bŽT±qp S9Œ'­êºÿ7ŸŸDzÜ€nö’<„ ®yâÅηné¶s‹3c¬¤®õ¦t½g<ßæ¼Gœ+¬9©8*¸d=ð!f«£"®€>Á‚‡ÁlLbWúÈ?Â#ßA,ð1¬¿Û }0P‘>Ô##ذÔÍ•á²W3yÁÜÀp“xãr\BM¥P|ÂmôŠE†2&D(Ù›œŽ“yÎÁcy‡‡ã[ÏÆŸ¡|°°LLBhlî¾hÍy!cbƒú¡„Ám1«V#-*éFBƒ_X­[ˆPµb iE:O*¥ã^€Ú½ðtBI8‡ ‘?C·cë ›J“ÇãwêÑöÁð'ËT{ râû¦éjÌkÝí’ýÄT1vãÓ§.Ýû4QÓ½Õñ¥©„Õ[+k%1ŠÇ‚]=¹ƒ:'¸t(̆çÐQäÓ3q@yN¼˜¬¹ìCÈìw¦‚±eÜW"&9—Å‘ÅH™©cÜÑF´,€P ˜ Ah6!ï¦d'÷ð}è#k2-C¿»&‚Í{å%:´\zOÅ`D„ˆ` Àa2¶ *AVøÚyU«r<î5*i*B7t)÷óÒ0õ¤4K,NÃ)0 ‘"·‹Ô'Ñ#¥#V&7‚ºj-ϲŒ³"Ox ç;´KÇ€©ð1c¢Ý$ùå†1ФŽJ©$H~ð¼¦ôPX æd† “#©£¦t£8÷) ¤A6™I‰A€pÃ"5•âñJºM;pÕ«ß¿üÖ‡˜Ñ: yï¶¾|­Íu3›%%?nÄVXi.Pþ’ 2xþòϦ}‰¨H2,ö~ìúzµz÷@º)hb”‡E­$³ç³9q—+n”ˆ§Uduº-| ¢Ú…?¿ ý¶#Ý­R‡™PÊHZ;è P%Mû‹Â];! !\Ž:¿<0TGMäv£’!¬Ûc€ª†  И/‚Ã6é6-rÏ"ÝØqâÑ6YÒwäĈ€Ø „Q-¢Á`©FUÀ{‹À…)òÌ3ž!¼ÚîÓà9€*؆”À:ññÈ‘Â*HnîÝ-á¤H*@]lÕ’Ì%°$Å2TGiNô¾•¹³4F·É¬äå¾½M¥B F¡a4"2=ó£ðGM숲”gƒü?ÑþÌ©aaçâŠf]hOЂ½)…+ä‡iOÔl0„eõÚ®næX{sQ——Ÿæþ²©c‘`AcÁÙà#Øße7\6RµóRÁ´ X¼”®¡ôÚ©®¶›ÍähÍÞÏ]l¡p ç†%y¯×  cu¥’tZùòòQŠdgvB™:õ‰Ÿ{<¦0øqüûãU6*‚ÿ•!!n%)ç_ëß°|pàþ§6,JR•½æV§å4–ÓÁ—tm­Ì⠼ȄFIÈGøñVÒŠ v…z¢™ ^s½U+îpq=&’³ÂÊ.npß4ÚY]¦BI"‚†ÐÇøŒ|M$XaC)oûÎ m ‚AÄé½A ¹ˆ_RÒ@!-Ú4«Ê„£-¢Zm`è;´=c(«¦çfÛèYÃzjÈ—„R\Á³nƒ°6˜Æì"xlŒ3TT¢5uxºð ¨…ƈç6Ü*‹põ?‹‡Ktm·f+R 5 *ð˜mº7/ã»Ò)áÊó5Ä Áµ,m´ÓM9bœH—D—CZ*¦i7jn#•b[„6›msÿ¢V»ñ¶Ïèõ¥Ÿ? ´ëʉd±TY÷¹[$÷Fç¶1ñKð÷g¬îì}USb¨/ÙKp„*%óÖiðs9÷‰Å»(j ZY§/¾&’Ú¦(C” µ–¡ÏÆÔ¦?lWäÂH¤A>dQ¦îÆÝ7´l"«µÂĵY •nÉåN³ƒ¦÷p‘œ]Îú¦D¿EÛ $ºhˆàÌXÚmWk|ÂnzNÆÚ|ƒ§ÐÂEKôå$ŠJ^ÀOÅH$cöýrú»µ²ÃG74vm´Ô u+¤¹¡'K8MÐ1·fQÞä tN­ 6©Q»DDÇ(¡ÐN•¬R$DÔòpÓÄ®¾÷Wâný;‡ŸÉ¿. |›Ü»ß `ó¹\ ݧac ôå4éçk9ÜдpÔï¨ûˆó6íFƒM·Ü¤Ø˜‡”>Bž`šm·vR·‰èðí ›ÚÉRŸÚª–ïÕîVI/ì‰lÓj$5N\B—*%Ț%Ðgý³m‚%T©»ŸäúGÕ>Ñøn@þmɰfÌ.qòùJ1Ð~Ô_°ûüpð‘ HA’CÊwøþ½y)þìÌC™¢“F趯/½§úÑa¸ãž_ž[½’ÆšAgó‰þΟÓ9Ó­÷¿ŽºñÃÕñpë ‘ÃÕ¶Ÿí^Ì¥CMº8|šÀdÓ‰§4íptM¥_³jVÔ\I U2„˜eÌ^b|l¼+Ú &»nmG¡TÑÀXð [#@)C!8s‘0’?ä4JIR¿ Ö!…¶R’”D˜¤@üØ?Ÿ#P¦oéx/©‹ÚõÝ»Ù:õq“ýCùGwø‰;| þ$çúdÛvwa°æBÀ4 kÈü†Àù„= @Ñp!„W^l¸Js¬ÌC™¢“>~¿ß 6…Õ&¬¡$&—Õ}aV©¯Õ—æ¯é‰›ˆ"Çó:…XvéÜ›X/SbþÅn'Mßò aÕ7íï-…݃€²¨JÜ(ã‘°±Å û»[û^*tÀd?Ÿô¿»’B¼½`Ô:ö5ä¢zd~Cìz ƒÙ³Aù—>Éäb}/è:?ˆd<à>>9/îžå€~!£Ö4×;h{‘§Ji¯&]àëTàÿfÃAqüCððvÝ¡ÒøAäU%’ÂØR<o\˜ åÍãÓC›C!–Û™ÈI3CIÔ6 .wÍý&Kx¿0|á$Œ`D$I$íàÏŸèpÏþf‡“ø:ȳ”ä$€ ¿Ñûþ}™ÿ+~•|þÉàÉäG–å~â|œ_å˜/a‘$‰EäµÜn·‚Aà¢ö£p*Œ†í80#ö£°ç°Ü0 >Íı=pJ0èžÞÛ°û¾Öf*Èbg9’e‹ …H^^‚Åz˜ÉZj7…ÐÒ@üOÀâ×)xÁÉñ=³`$Q7Ô°…ÃÌâñBŠ(rXØt4zˆXxûÌ›Ÿå¶ïEQ_Õq!wEÃî¼6òÊ=Œè{Ù¹;–ðwµ6 >0q ¡b_™AÎ4 ¤ ®¶hZ3C鉃»ŸuÈ¡°žîrÔ¡èw·eÝÓa*Ö dÔÇÕ@K_@!БÉs¨i‘׎à›‘,K0Odiª© ¦šª°ßq¶~ž„ÐOAaÐJ¯_“'`4 ÿ°¸¬ ˜&¡rBC¸»uè¢çÒáa‡nR¬lð{QúäÈäx2ÞÜŒäÐ(üJþñ2NÑOò(+ÛCõ³ßÚ[ì€È3Ø îBÐl ~t(ÆÔ a£!{Œó4»O'fÁgË’ššçÁ¾ä†˜Íþ­lQƒ¸=Ç ‚òBIJäÀ´& xlnÖg¥5Þþÿ¬•’ÆÚi¢JØ¢±lRm©HŠ40´&“X*-¨M¨¶£FеTd¬–´ÓDšÆØÖ-Œš‹jR1Š42¡)6ÄlV¡6¢­‘$r[JþZàÉãA$<㛦:÷O’x¢žÈkÊ®7wd!#uv"^J„O”Þ''2°¢š"Pä=Ä÷§¡,Ð6M\°y=J„(]CC:Žû î†`.FAoGl‘<*çÕè*]ÙW£s;<G~>:Æ£]—u[í¨SÜUÂÎ Ÿç÷¡îuðXSm(îe »ÿÌÿ°úÿ) ˜îLÐÐÿç² RŸ@ ò‡µ–Ú¢õ:¹Âàt>=¬+ÀŸ  53G%“WëGfÅ$$ j ?AŽãuÎap*ZòÜV‡pplä£ý(+‚ÅØó¥¸ÔNo,t†¶£×d-lÕTþnñš´ü𫦦¯àX|@ @ƒ^ã¦×¡Ó±`ìïøÿî?L<žžJ_õݼðþÈ¡H7ûQðlèlb29È<ûÝ®Èÿ#“ï=§Î?Øø ÛÇÊ}º=?lv2ÉÏYîl>Å©t¡û¯Æ& œ@ó¨PkÔ÷Îî©£pÆ=iÀÄõTG× ’Qö?׿[]ïÍ™_Ò‹0ƒÉ±‚å÷€BU(]B[¿¯hŠ>§×öð"ö¼P¿L0+çTçŒ üI=çqóÁjxÏPG»Øûðü?®Éè™$'Âý„ ,, ° , ²¶VR´²Ú–Ë+%“jYRm)m%IYeUe@9çÏ"þh{@}ÄälX»¸ÒéŠnŒƒUÕJ !•ÕÛ­ƒ@6p]àäÁƒ0çâ¡`yÐæè ßQP‚Ta{ƒç!$ ÊXuØà8I1ðŒžØÉ“Ü•j°ÛúC»¤ÉEºcY½«6ÿnìbZ»ÎHóhx¦~ßÕL¡üÿµpiá/ßhÕr¦È‰µkOå+Eaw 'üÅÚ2_ÁâéNRn.ãV•Z³Yæƒöf›†òU][ùЏw­Eš}'…AŽÎ“%]g”ô‚]]që (’¾ªzµÂM÷! [ãJ¼ã8‹ÅªK€9Ä!Â’?•ªQòõ› &¡Ã™(š¶mßÄEïÈD20T¢ÒØÐ¥…hl8† ˆ¡U€ |ÎûÀ&bšXKƒ”›Zô%Q6l&ìÜé¡:áÇApMS1Ïï 0` Œ£¾¥ Y‚`H'0+êÀ¨É#ï7 ѳ")Å/õõמ"ä9#ë­y´Yó¼àJ¢Eë(H´,á–®r&î6õ ‘qŒÈ‰cETë¦C¿¯ƒÀÜOT/ë[¡sÜ_}˜FI>$:2R¶…‡†ry”>Rdd$,Ÿd@²¶’0#òlFF=iJòUw?ðÉaŸ%FUJ¦«$‘ÞŒ€\}ß‘Ó:§ôÿnœáÞC÷'úoèŸ<ú'‡m©$ ªB(@žô+6…$Xòºº•?¥£ƒcn–ÚüK^¢½WT´´²RTE]I§¨XŒÀÑ$ B õEÈÒÅòAÛíXŽDö¢”Æ ¨5A`³Z ¦€S¢„‚Áˆ@ljÆ–¯ñ ÂXØ4 ¥0uçW@Á‚¬Ð•°±^!„"€F†„‚Ül£ÔD°ä”,0$‹ŠR€sápP*@H¤ƒ8¤‚ C   HY`P¯µßgN‹;ë×t]l”][Ë»¤/ª €ãØËS·%ÏÏ¿ÈÈ7Çqa¿hlXö?û¡îŠ~†O¯gôí­¬©un ^!ÿ  ïõœPUœx½¨ÅºCøÎ±}œ§)Óý$‚‰uˆnëR!Ì ûáÃoöþ&hó‡â$Œ~ÐÏàÉPü¤‹UvWé7Æ\ŸÚ4IùOÙƒ§ý)j™0ޱ¼*T‡1T6œºB%JRÌ«1ÜØ r·;¿Í¯Ý|›³ C±! ÿÅ:8ÿ•ð $Kå¡Ç^,;1sØA±P6$ä’ûDÞH‚!ÏÒ%õó*õUwi!ˆö?Þ\û‡£ŒŸCdoHsâõ@´êHÞ²'9wt¥/9“2üö¿»0ô]²b'`àÜîyèî£ûìj”@Ìú‘oô0bøß[^_jÎHÝŽÕ7+ñø›ë§ Íî˜ÿ¨7ú%„ÎBè~B†ÆÜØÿ¯È@$±gãÈóô—XðA`ýZ‰Œ†óÙ ù±] BÐÖ¨^?ªmNþ^gm¹.–¥«’óµý—½O·­oˆ…àðwš%ëOŠ>àÀWâT¨kÿuH‹îñ¬Ç˜Ä/B½DýÝýçOÕ¨sííì-¡“0Gâp¨LFäˆKÄÞÿ?7œÇvIyJEÈÀ¦~Þ? ¸)÷·ççŠáÂß ÚeëÛ5…½ï#á¹]×!sŒ&(U˜žñ3ZÚÒªTuCˆ«k›¥tÂ1Œ`ÌPÔ$æ-qU!!ô‚ýN@£BZ=¾B/ 5ì”MkXpY}¥¦U3š&Ò Ö>SoW…ôW­ý”q½|i¼y:!àc(¾Ëòõ Ñ’J6 ¸°…ÄBÑ[A;èÅìÍ~ y ¾èݲTÔHŠ ÕQÓmð¸Z¶¯µ!<Ró Á¼xŒ7q¶uÁ¸3QºeA‘5™êD\)ÏNQ®A>Øfç¹óáeÇ<|c—[ëÄäu×uÍß”I׫™¼[H¥`ñd@Bab.'>2 –ÎjŸàø”ëcSޏßð«dÛ¾•øýbóQ d8*?•TNÉ@Ñ ¢jҹ턖íës=oœd°![õ£5©&é°TmG<Û„ , 랎ÌÚÑ}Ô;+fåõ_X”a˜Çgh¬ëUÝw7½NDW 鼚Á”åMîPžèT¯+TˉÍbS­úWf±€¢CV¾ØWg{·{FÇ7ŠÄæ;ì@!¨"òa¦V< 4ñÁ¶pCçÖÃÌk5·¤I€$:ã”Û§6#@ÅÁt^õ§—½v­Nè¢ÀŠ}˜)]ë[‡]å¹ÛuW7¤Š¡ÔñFÞ`šcµæ÷F ìåY#‡FÓºåÛÍ>ÌË®]wNf÷T9T •›·¶¦¹dMMÆÍvß ììÈèHžj¢uª·0Luëc©”€¹ËÄã@O¶í­Ò„pu,NpÀ„ aÀlHã$YS QÜ6`qt²ô 0M“X` ) (rmÜ.FØlä³KA,-Ùàxh$ô" ˆ pÑÄ@GÙ –ƒÃБÂe7K 6ÒÐplÄ[îi¦]¨£eÔ/0à7¬.Ã.Plr»<2Œd[háÇ]áÐS±¦‹:J*Qte Ø5€8…í†/Í„IBƒ¬HYéêĬæS;¤ aJ²D gì$ 6#;6OIÜë 7£4¡Äw82›“C:¡ ÙÀÁb!¸F“48‰PÝ6w,Ñ¡¶ô0¹)Ê^¶N"Þ‡K¸Jáɦô—°à4G ˆÉHë,V ³6$Ž0ÒŒ!4ÙæNÈã\( &ÉZ·„äTË$-‚2`X‹ˆµWQ:+ÌËnû©µØºMê$=;(™H ¡ ›tÇE¨l ·Âyöå(@© WL šÐe³·=;SÑ:.:×g<µC]½1Û³qË.çÞáÞ|:+&øD„Ýsʧ6 ,ÌÙÅ­Úî[·n{6&ºÊ›Ý½s}3ÛNj!ÞM]åì··¡ç ˮʡ½½‘œd.)@³ÃB±6F …@æÔ:,`µÑ‚†ŒÐo[MÙ›uVÔÈUØj(!°„Cš%Ñž2Ã8,Wˆ„Yà ŠÁ/B ôc›×;‘9†e €E$†ÐP%S‰Ž»LÃÌ¡1ÆÃb è3dŠ@K+Ù opˆg"THÔê Œ/@B †ešBºé0º8j#鵄5BUì[ÜÁv®„Š;\ A:DÄÅàÇl 2jÙ‘ŠCÌY±HÚº`ÌÎ@©²Ã‘ 8%ÁÁ24¥(, !.H7°؈XÁ±§´^Žj €;2À #DØc2IÌN!‚²¨é6Mvª¤*ÆÄ“& ,*Ì—AÕ³P/ýÊCÀ¨£´Dצú*r…e Ðl ˜˜¡+'nEÌxbâdhaqLË©„¡«Ëƒb±±P‘°àÛ4hÐ8ÄÐí—Y5XÔne]$Ê8@Œs2/Lop˜(:=ËâH#P0Œ«P-Œt4&r”Èp 1ˆÝ‰9¥ ”‰C=á5Ü D ØâŒœ7x Át Ä5€HÉÁ ôA„¹àægˆ®¡‘&HvúðH ¡˜(¹ X¢@ˆ Ì]HEêÝË£¨ÖÑ`ØÔNª4êЩª ®fÈD´˜i€+CIX–*@¡€ë¢4ÐÚ½2‘ÁbWT‘†fÙ0±,4€·*rª%*ÍN‰b°B •  ®G Im$.Ž³Ã£ùùyÇo¾|ºuì¾xG“Î:¥ÛŸjs¢èë)Hj’!&"Q b‚á^Z£ÔdÅPÕ©´,rÈ0ö‚Æ” 6 9T‡÷ÆÝ …Ã;ˆ\ä—@Ötž¢ç  Ñ-‹ÜyT Lˆwf&m¤ÌtÉ̉ª%MˆÙ‘x†á  hR—‰ Á!!`E²¢Ž&.JÁY"ë ‚¤2ŒB·r$Lk;9rPbXè2ÑfK˜Ò6›æ ÑP ÂË#y`»À5#ˆ€(»Eá2,V“}¬uFU¡‹á@b`fQ@²pÀàU :C Ý¢l9{šq¦Ð!`{”(+ vw¢®¦ãÖàLTQN €)€Ê¡V.¡"@áRg!š „š À :Є3†dE´¼¢¬]ÁíŽH*v EE‹/If5A @Ïd)D4žL´TLa\5 uŽh îe2Ñ('tQÍŠ 0—‚ƒ Œ°8,é¾,>…@Â$\À¡DfiU"À¸é¤…sC ¢!h‚H°!è¤ Õ_b•¢Æ£&Ãh SʦF *¤$E¡€ÏI…8 ݃;¶à%Ò Ü*Á»„衊ݾÀ§c²±B4UŠ4&œ”$™DR HéA«ÁTðÐ䤲¨—ŒõD  ¦X7§jM‰^RºâEâ…i„Úp `å]Ä P—DJR¥ `ˆ¬Ë€ŠUTÅ 0¸ 6ˆÑއ\ h£Eâ‰nHRú™Ä:µÐP´'•.·gQš¬ÉVîä Ö‰4@ŽÁkE\;f!&µa×­gâ û³úú:gòNÔ7¢ˆ”‰CÁ¥.úþ؇(ý?d)yŸ\Öi6ÿŸò½®/ ÞõÅÎdœ”i4è×WBÙâŸéX{å`£¼¢± Ä¸à øÿ|W»Ž•ä£-þ>:;Ђs,ÄyÇ2®,â5´‚9€J€‰Ì݉þïx/ útÈ=ÀÂgèi>£µÿJ 4„+™)‡Æð?ψ°þ.— ˆÐ´y£ÈJ•¡Ç±™æ†z±îÚ³/û(LÀ4,{Ü¥ë*Ú#ü•Ã^ŠýVÇ™Ú*æáòU—½TUMqæSp*üQ¬*½¬üÀëXÒshV™¬ç ˜ç­ÃÑ@øû+`K©¢".-ãì4‰ŸŒ˜•Àþõ;{qŒWûüy_d±æÑ¼‘‘EbXÄ,s¼zÎ%åWÙsj«>H—-‰»Vó¨fJß>1ÅìKY ¥‚ÜŠ ´:ÓM%¾ ÒL4žÇüØ“x–ź‘ÁüDÿ¢¿ßä>Ë6¢Ë¿Ç•?ÙLÒ¦ð[“Q\÷E¬í¸½¤á¯É-õY`›u⚊öÜAæse¾6”éz4Ѝ7fýÊ2. ÏŒ/ö/èàsÁ`€’ûh¿µ·^kÁ€åÖs™z™¶¼DÚøˆ&ÐЂÈä¿öbézjÖ Â×>4Ö³‹œY§b¯¤/1®,—•c±Æ­ÌÜ:¾!@Ñç{X-~$·3¨P(ö5,ïí­¨ =ÆHPŃÞ†l‘)Iˆˆ‘?Ó`€\BRBÛ©þut«™½ Þ‰Wokž'Dq2¼¬ƒ­W'¢ß v!J„&Õ6¤ø¼sù~#ÂEÃbûúFŽNg~W­ov¶Á^xã«n‚I"¯Í=jð¾t´Ð¨Þçü½ñœ$ÎÕcX¯Ví€jkÛ Æ\J†x ¨Ob‹e”~™ÁwJdjñ£ÒY+j¨?`DÎPË£Ü*b@ÇCU¢(0£f•(¤TFdÔj»Xo Žú2&TX¸1‚ D¿Â1â¨vô`$ƒdGú##׫öe`‹¤Í¥Ö ðv1„¹Y…DÈI3®–ó†H€–Ä˪LÂ/ùaðûu†²ÿ<ò5ÉÁ%ªi;ÚJ1kÙ §Mdó:Ä[c…DÈ  h1Åç÷BøøÌ-èÄáKñ©¦yUbÅ\PN¼ŠCPÅ\Å:­ñÞô\ ¢F±„ñÇ—13—–ƒ0,Àò}$ Pô>¡cFÜ?Ü×\Þøó!|ݽŠ0^3Å\Æ•ÚÂ$#ì´s‡Îëž{×½¯âçÞèµ÷¸ºêup×ÔVçî—mu×ÆÆ¼”§ü®—œÛ_UtyÛ›»œ;­Ñn¹ÏÄDlÌ{‚ÂR§ Lñ ííÐQâDÞ 2†ÓX®=W.ü@þ¯Ûù'õW©Mñkìþp#hÌIT”ˆÉ8ø´r!Bƒ@ ŒyI!õì~wÌ…þÚQìRà pFm±1:5Fä„›¦Ö[­ã³ž³|´®z˜=LômÍgÆt`ÇT¡Aå †lHÈ”1`†Æ Ñ¡¡:8!ì‘*>åL}=–;=#ÜË–›†²T†n•ü:"EÒ5ÞâAA3’…ûØìñ9rÅêòÛÿ¿µPÄŽGJxÁ°GPÝVJ„@h] äl2Ð94÷Ÿ †heÃÀ·ãë»À‚²éd ET. N|› ÊP~Ç÷Eþ[×5{Ôï l¨™øDÇI߇¦ŠP6e‘T—ƒaåð|/ùÒ;ܸ-¤sƒx,µ|#G½É«×Y^µ®h•űÏy+PNâ} ÝSÜÈ  š#é}9°’^ `¾QARè4\bE }ç×qV¼xRéVa‡£Vœ¢÷ `Ïë¼E$ÚGæÂYA‹a¡%ü`¸ðF}xØæÍ /Â02†d „†V`–rDZĆ?†VËl°øLZ„ñ·1»_©1ò#'Üóâð FÇïûÛ¨ PR^`¨Ë÷ûÈ]ZQ§=Î9»f¹µ¹ñ©E•M5½¬fág»ef mλå|íhC—ÙI¡åÒ!k{Lo‡»-á¿¢—ÈŃ£?ÏñÑ‘PƒrøÜ¢¦tònhÁÞ°þ¡‡…V}£SdÚà­™Àøç¯mz].Cl/p…äüŸ6¾¬#mq%œ‡ =&@ˆLUA=0 ŒõG–­’± »;¦è`Áå‰äÐÅÉ£Ñal¿'e?0Írc>Ë¿(Ù) èL3³&R) ¢Ý?m+b†ïÃ<œè Ï!D±e”¹0 Ó÷¢A-H"ôˆ™õ,&~œé²¾Èãf¤7 ÉžcŠ_ÇÚ­¹RCˆÄƒfÚ\ed}ôšƒüá~¾ÛÒȯµ6ØKˆS__…ÆÀ`¸oVÎôZÃ62ùf2Ô\µ£r6 A0~¾YX1ŠßWð \à߯õöô®–êE‹,F´ˆœ‡UÇÁ)o £“"¬ÞHÁ…RD{ÖòüFرƒÎ\’ 4¡-Á–e4Éh*“Õú^µhL…!à¶X ˜äaí–ô¯ÈhtóâͼRk$‚1E…MUñØn“°ÖŠº0¤ÐûÁä/¦û£@!³6YÄ©+wÄ &ž X3/ËÇ×ÛÓ¸öòck¯42á=“ {óÛr¿—­Ñ…nǤlIY`ý2é&s” ?"E›¼C¼tÛ— Aü–ŒüMvœ9+/W†>0D ˆA©u™*`›äAPT‘ØâL”‘ø)I`ò6ºÏ‹i+’vø$ïÁ䃑_¨ñàýænŒAy/d_“ Ýòi2òW£øô F •ÐOElÚ_Ô:ïÝ¢Ý sêÊpÙç[o}£@eŠŒï¨ÙšE)@Ø~ÅÒP¡Œä’˜û+út—?gøO‹%û'³æ1mü‰“öØI¿(  ÁJ‡oš‘ûýh8$>Ø6«•`˜ lzã~CU«îg4”D2 WÕf0NÕÛcB°L^„ÈwC°˜ý¦ ÏCÉ Bh$²ø.X)HÆ“¹h¢ˆI‰?î¿\fÉ6É‘‡¬·¹sÕµÁ«L Ó5ÄqÍÕ””.ÔCe‰ºLG-!{4:ºµdš<ýG÷Ñ,ÿWü~¦ð3_÷³! ˹¢±)½WU{NWš5ûõ!/TÈí'›‘?ù[?h¥«Zº ¬&‚Õª-î­§ùµgú~_ÁÄ®ŽíÚûæ¸Z:¬xUïýÊo.„'‘å…ª¦}ˆÊ㈼øG€lFOç$¾Áñø/‚%¿ÇèžKû¬*oÝ‘{Ò.ý™=íºGô _hå5«,-!×ô·J…øsŸEÐ ïýeçük–~n„]´åú}«iN‡”kùWÉáŽ7Ÿ‘ŒðáM±£üßïSìBs× ø$ž~Þþïù{w¨2˺–¹^]ÿsûæ¤×ù›þŒ›ûwMþ_‚íÆ¿yérþ “$ÿ)ÿjE'nîÕ¹.aýÅ× ^`¹…J`s…U㌌æmÄRWÑ‚í;”¹÷lM5Y³cB…W)Äe[šþÑ’ÝÃËÕMÆ}¯ é+^\IDùvÝ+¨Ûꛜbj³*¶-H±•kÍéZÀèézùsÁkRx”Z%Ë=½‡¡-fsc¶ÃiÌôt`©Ù”[ˆÈ¨ír²#¦{¦¦ëC®¸uÝ#Îä±Óãuåì¤ÜäOs¹j&<}Y¨jp-lJD±â ¶íõUn»}×/¢”ì52(8\øúµ%²Ú|÷fFo±:œòª±ÞL¿ÅÔ·Î-m@QïDco‚Mbš—§7 ÇÖ:=›ë©©w‘«Í¨TìÂ)¢±¥}\®wD ‡1QXáel^ó˜NR½yÞKx+k,ÕØÜ¥cÈÖÄõ¸´&X¦Ý™æ/ûDŽhín=t…Ó‘uã˜i1T˜ö]SpÚ\­½·Î,¥¥«ñQ„F]LÓ¹hÝÔ$ï~éŒz,zb)(Ppð’hãèäUq X³ñóÆ0lÇ)M·9F¸N|£^›°çw7ý•Ñ"™†_öúù¢_›ûÓ=FrU¶PˆD’ @(°Ìa ï×’ý?Tù"(ÑÛ!D0J‘gëôÿŠQNCá͉Ȫ©ü½‡§^øo+ëñíá{žî |ÊnWN²TPÜ3Ñ[³Y&¾¾y©–²é‹?…óÃT5cD(í3ˆ©I7WwˆQá,3r|˜Ì–kŒÊ ƒÌ0)ó{$d÷8–bÄ›R“ 8˼ÔÍA *pO†Þú_–8ñšåûãO];®ýx`Ë(_ž}"!Ç‚²Ã|Ç’K HM„”y‡<ã„-(z©Ú©òÒs¤%ÄlK…V[.mSäûú‹6¿~\㇎þ—^Ó¦®|ûði‡—Û WÓÃr¹í^a+}uêñ¯¿ÏÞ§SÅkßëìGù¯æ>¡òìA~oDòO–0å,Åh°UY}b$^õa’Iº•.+Ïô©Áçwx‹°HÎARÃ"*#,!:I $n2 ÓGæªZlÈÑ™d0ê Tõí“bNÄ¥†CP„ȨGùKýÏ ¥­‹›®•µv®pcìÈ7 5 Öàó䈪WÓÛZÔÿŒL,zñVC–mì' ¬^Í@njƒüÁÁ-;R ¿h×þEpÏ Ä:°ÉnŠæê–H÷Mãí»+¼*8hPQo'ÌʘwD z&J8¡$½3ɉ&rýÎæQuÕAøæâÄÂö îª¼¹ˆSŽ¥qb‘4¥ZDvR¼K/+/° †Þ˜u)šªbD(ª‰ç(ƒÔ!1D%Ø2f@TZocÈNvù±Ë¿¿GVg/5“” qÕEz €FÚaHËP‘™L,£’BŠxR )…B㑬E(CSƒ¼˜JæØsÍ×Pò5Ø´)lµa¶Þ& 6:[¸Ï{¦…乡øÑÖ½Ù¡ê];¾(;4e.èÆ¥ƒ&jD (ÌGÅÚ…¢Bt[0D¬*îö­ö ÅÀä®*èP”¸[[:¥ÊNn¾dHgIŸÖ„tgiФ öa¿‚>t8ž•—¿Çäo°,i;¯§¦Éoâ­tzüÌW¿·Á„[R‚³~¢4ïÎB<9™ú?•7Owoz`UòWQdJH3bªšAUToA³ ¼ÆJ‘{êÂ3¡aÊ)ÝkZ0‹£«]$°Ë(H2H)(wD%É8bRËj~gŒ$=@ø¥ E#æ¡¡RêR^{—µÎ­É¿+ÈpŠŠ »rf£Tèý@b1_ð|ùy‰yÑ#¡/üôlÍ2m}=á˜JÈ9h†É'L£XÞFT(˵Èw¨ nLP fŒÐЬ²Xc\ÞéM<»kÀ‡ˆ©Â)Cʇ˜F©œÖ}Ò¦ÛÃ4—ŽúxCòŠdñ ¯Àñ÷L%%Ò¡ÌÝl&pXû‚?BñÜëöÉ>r5ôuè¶ùÜ|SÝaõÖð°ñî .o4_åuá:[׊Nðóñ)4±ÐÜ ¿‡”%½B¿)¢ÃNíŸ?¨ëôÎooÀ2­ è5L\)&Çß~xwãàÅñëž/Óq¦THG £J[Zë]ÕÙ4ÂPÿ(žKíÆŠnþÓκ.Ym+mŠ`¥dé8n‡ö¿:£ŽQ¶õ²d+±¡€%úøú¨FˆJÙD,“áÌ?²y³Y¬mc§·A U¶rJ!¿®ŽoP8Öò[ð–Ù>ÚÌGF,ÚµÊsqiQìÆ¼7àã/äZF¨×Œ«àz4©V퀡‹ç÷Ú³ »ç<%{¯‡Ïm·™_u!_Qê)Ñgô âû麢­©è¯]h¸¥4ƒWôSáÅgèÖOñ=bVÉ¢–´zM6 ­ü¯úðŽ®–dŒöÆ%…ŸÆPúѯƒ…€Í¦Tµë^? æîói[𜾷ßgnk϶Zà­Yµ!ªsÀ¶e4ïÊ«×ÁxfiXƒsn¶ ”ýn¸£1ƒÑ>ãë΃ýÍÙl‚ f` …òá99ð¸²áXÄ­³«Ÿ*(® ªKC<Y})b‹”‹ÐúÚ‘áGmÆT_c”nP–‰A‚gÀ`¬œ{yWq2Ȥ¡gõ–³ûIàžíKàñÂÖºDó’ÃSI œo·Î¿wFüÔÝóäÅoŸ„BŠŒ{cÇ^ÔdËÿQ›Í)®8^6¢O>`í¼Æ=žýµÅI¯'º¿á°4XÁ¥>©eÑY¥j¡5žn#ñž©ur{ò÷ð·>HtWîÑÃ\ošV‚65ÜÀ~M`±mý£$×JÆFç 9¯ZÍ>¶ú|O›Ï¨¹Ó~_=ë¥iWÛ îu® bØ2…óü^>0,ágõCÐWsá¹”¨xû㙡¨N ý_³º:†ÝëÇXu…ŸÃñõœSX¾ß@õOÓ¬ë®íLãn:ö$0Ck|YJ…BˆIÍïaèŽqAP+° =3S! Øeš#£|ã9“剜bƒ~(¸\n28£³è˜à"2zö_–×…>Uäå½Éð€°Xƽ‰ Ô0À– =ÍIsðÌ~ðåeÜ ÅCI!~ I þt®ƒéìûãôôÚ#í…ÿ^~¿\¬âÜÍÏAÑMü?úë»®y’ŸŸö8OßµçOí`ÿyixõâಡ¶Q¢‘¾s{L‚` PãÝ–¶ÑóÄ\±ùiÏØœ:°o +”{¥7CÑ~¤{#üÄ“ýBœkÓ?/±ƒñ­4¤•Ÿ\ŽTó/â‹ÐLí˜ “?Ãi½êÈh þ d0£ûŸ+å|Žü¶·£BÁ™{BÏÞ²_ žͧ»Ë[ŸÉü²£ýþSùqƒø/zð+Æ,ÃúØøñåßèU±/Ö {­o××µêôÁ ÑZQ1’ý³äyŽúísF™öøjøú×ÜgWÈ{–Ø'öLƒÐÍñDWv>¶þ¾Ùõà|j²ËfÃ퀛y'öû?ñ¸yýK[ö,CWݶ ß$`¶ô,„ýõæ¿_Ä>kïá•ùГ5Œ·\yïÚ1íNøä,6Q¥:ÌRË–9N•?HóªëÈX: Gçî_=Á)¯ŒÏûG|è’“Å2×¶ÊyíðÔkï¬'J ÔdW„üÓó27ÞžªpéÃJ$_afvtÓjü×lç{=ysÛÞýÇGÏ‚~þ«¢ç†Û§…&w:_4K4õáVºQëÍž—ÌXÚçÕã?y}/Ûj}ãUg÷öNwØ{û`ÞY Œ½cãñãÇPlÇ·WDÌu±){ïð†ÛQPê*™ ÜÂò×ÀWa/ü_ôyhÎhg'lSõN_ãã?†‡ðŠfSý|x÷*Юgô,ɳ E£ß7ž¨=ü™k°Gûs¨pñ“2FûÑ{Wìúoȸº”éþÚÏè_)Ÿ­„ÞNþÐoÂe¿?¿·¾±äyÏ>)²5Ûæ?ƒcÓÚzõé=ôj5îWïæ½µí–YkkWŽØ?_sÊÜçÒ9דÝâÒøÁ¬6KÇ]ËÅ­šç“çê»Îæu½=]E¶³É÷v\hçãš:ó²ÓƒN8¬üW­Zjóñðdè³íuÀe¸5¶“¾vzhæ3ã½Kë;—"<»Ó†šˆÉL•†æ«µ·ãµnÔûÌ:ÇãäÞ ÚÊK_|{}ÜŽ¹ݼϣ2+tOŠ ód¾ß»Ó)?éÎtåùyáþîa3ïÓ¥9cuÇ-ÖDO™Å«J»Æ{’¼Qqû‹Æ·ÿ袖g÷&À= (zOå=¶Üñ - ° tœ†‡I„ò_WæýWÍý§šTéEûÍâ:­„òŸÁì6‹Ï¤Ú·ÉP÷or÷8N®öl¾½Ç®1äïÀ?Ö§hµ)N”Ë £ ^Ñ>~Çù¨x=»q¼iá‚îãkm/FçÓl<°¦þ[£?ÙšsnÔœÐäÜ_}1} ÏŽƒù.ý§‹Hž~Ü%óߟvÒýÓû¾íKœøõáç«åË;w¦{kXî>ÆÒºtàwVÝÍV«Ws,zl­¶¾Gý üŸ©¬WBû¬ø÷|zßÚ$~ý߃/2åá{÷®¯Ÿ‡ÛÀô*9çh¸&¸¹õ kØXSû–<þ!OUË—#útßEŒB7”r¹TüªÕ-¼”¾Bi‚ŸV>0Á)'Ëö±ùmüÝÈ ôHDYöò T9‘d‘^"S=6vW/X@¿8®˜¸º@ŒãÉGÍ­©fädÙ©R´´T3‰6FÛš¨â#±”±³ÐF)¤ ï$ö|,Ñ9 X­ž ´[F€3÷cVçË™~⟽BÃ=Gæ%þ+ ÎãÎA¦GÍÑþA·Ý² PñîÞïÏÔ„I°þïìOßcÜýsÓ~­_VîJP¾cÒ~ £õ×_²xñÏuñÃîÿjSóûo`dÃÆEc=#ù éÉ~°ïx‚ÜEßšÏë>K? Ü{vÚš0 ( ˜ŸÍmçï•’51dªd!K ÞÃd3 žâtV _P³iˆÇ5ãË¿>’Á~7ÕÜ¢Aê Ô ó—¡LLàzAÀ•r]‚ÌÉcN03û˜ÇEd(VôO…c€p–={6zPózÊ~u¯ÓzÊMÆ8áºÈåË z;~¿wøQ[t|úoá®|ÀU žMMïѸìÉP6fŽJV! ` KÀL) 1›DwX õ ë®>1ñìé c)V~}DZÊúý=“EêiŸa&§ò1^ôc<ô¿ ƒìÌ^âÆÜT˜É†Sùé„ùÇOü;äy;—}iÌlú¹m;gás€Gņ„¿=Ø£4ôV/:.mÈõòy/'Ë#߬Ykݲ¿Ù^BÍΧ Ïr¯JÕ_ëJûš9>>‚'Àz”ýKéþ_|—«È)âS}dM™ ìýIA|µý¬ÓãƒêC„æ½ÕÀñÄ÷ø™wõž{çáý7QA˜õ)Û„1Ðsü›øùÝú /¯Ÿgïè¼:í¿nèv¯‡:p‚ïE"í”CßU¹d¬£Ü­.§7ÊýFµ ¦Çàzòc«t7›Ì £&ôŽaò‘@â|ïËèÿEéƒ}ø‰L~ëLò_¸yñÒóø|íÇžµß¿oy‹óâÆ/ö¿¿Çܼ'ã*¢Iÿ¹EDêíÿþ_yǯ¸à¯ÂZɉ!Q)?-nQ§ôÿ‡ß+V«ÿk@ŠïBZôö“X2%IhÔõ~¿Ã¢ú+˜²fLÂàâ8…I#kw:÷þ'îÿwõÿVÿJŠ"·òr³ç\ĉˆŒ˜¡$æá’ Œ‘Wïî’¿wßõþ?ŸßÁ1%P†‚,c %/:Æ]Ü¿kóï~Uw¾ûðט“dûÄY$ƒ E6ƒ$ÑbJL0d¤ÄjHÒb £(¯îÿ_¯Óñïºø‚B¯Ë|_W²”dkÁ;éßú_×£¯>¿®úOÓØú©öGðF€§ÛîïûU÷íÐF‚ä/Ó½?×Ìo¨ñAíè&ãòèkö[ë2`]J$ þ€ÊßÚ""ëëï“©ýCÄ|Kꟾ¡$ò`òŽ?˜iOÐ?ä…¯ì7Oñ;zãú‡#ú/Íy!ƒ§´'‘Ø.H#þ¥ž°îÁþæÞb~­ÕFû†Áè02*®!£ÙlK§D?‹’ÿŠè§Ãù4ÿ‘Iº'‰<\=ÓúýÎÃô?aóû¥‡|}Ràyö,–‡ è¹õ<ŸSð P$~êt–Né@j§¯ƒîŸïìdSÉÜ. ƒó6 ÍË|ÐÜ;ΆCù{Y‡@š ì £ÑuµBw „ÜGb’„.0?ÐôATȹ;! ß#ú΢{©æÁà_ÙÊÙ?dˆtº( (¢äýËÞštU¢à{j&Õ[š ؉‘Àö.\È×ù÷ò:Ó„õÿN?ÉÝ¿[ ìí²¨ÆÞØëíîu«>ÏÇÇÕgàWÃC„ùW6GãØÝñ(ø`üa´<ü¾ÞZsÏŸ(vïÛ÷ö󡯹h_²úã힎§¢Ãh>†‹¯ ´ÛÞH[s§ò1Þý’¥V»ø—Ø2`óWšùþhþ±O>yýùôø{Kvá>Þÿá` ó0‚‚më¡w¿ä|§Ë§ÝûxýáüàHÈî ï·PÉBQ1%;®†K‚ý—$Õ?Ïåøÿgñ·ãBHÆM¢@Å69¢ˆÊßiŒD%ãm²™’1„!"B3åÝ1¦`Àb#Ô¢“Eˆ“&1ED²4I D ˆ¤¿WŒÛlIï'„Î- B@Ç_q¶Æ ñ‰ý&`T šn!‚IˆT|ÄÕqíüçì‰üU{aüb[¸{OOlŸ°ËÙý<Œ—?lgôÿ¯ËMÊ«Í/¹NKu;R™!| ñ%{Å¢…k©h´R`I%Y®i¯%éã5ÂcÌÂ-X´dîÈPÝK‹»¤2¶ŒÐ€+þò‚pÁwIpÓÚ¡ì’rcÃ’¨ñ<÷WsÓñîkìG‹þ|iâí§Óà9ÿn¿Ê~޽ɡéö¯°Ñä‘4ÈFß§º¯g§½ìûÉ·²•+—eÚ˜xü©JPKªTM}Cüöà;œw"/H›(— µ1{ bí05üý»Þæq­´d¥ u4¾q¤ÅÞÕ.>‚ÌÅÀ™ DãÕçÔ|ÃÈ_ =öÐl7Ð{‚ѳù†€ ?a°ŸxòÓÉüÁ±°,õdpaì{ê9&Æßx±,>W£ã¾úuÏÕù†¨d¾Ãƒj00zxW@à½z°yêPpÿCgTÕþ΀ÝÜ Ú@251o@Pr9°ÿ#rn‡nÏ/šöìp-ɨ\‚ BÀh§‚ÈàJxá°å[²h0 ß¼a¸Gt`ÀèÃpBÀ40‚¥qÈØ9^708BàžQør†‡yï’BO4=¹;šá gƒ£üS°üw n./€‚‡Õ<u ø5çSáÜòTƒr”Qr…Îàü ÉÓ¨hì¥Àî6!Û¨[={;.€j07¸ëtÀ—q¸î&Èa°åäà=e9Öƒ>NBʦ’à aÜßû;Û(êõ,¾ëÁ×”¦£ Ø)¦Ž‚µoní2ÆNMù»©*ª‡Hpá‚‚DÜpÛh™câ:÷þžç¿ç*Ïò³i勨ŸÞoÓðí;>ëü0cv(tídOåø,úOò)Z1¶8þO‘ò=»"‰Ã°ëÈùrs³ a˜`Ÿöú¤ÿý?ÎÈ¿v¹`ìñÜäƒGökË»c¼:6iŒtÓéÊ‘;»ç—?3Â{¯åW1X\ÚÃÅÓ^Øk’º]Ô¬¹.wëOäÚk“ Úhéä©çVšúÿzðKû¹>üj”áóÞÛáíô{ԞûäýË„ô¿‰¶É—Û± ÒäIA’u6ÓüûÌHˆ(´ü?¸¸þËý€Ï홽©ýÌË–C ¥Ü±Lìf2&†‹ƒ€x‘wwuUw@›†·B®láB ±Üv6h2ìlìiLjÐpY¦ÁÐ*€°0È 8 €¦ÝÍ‘›œD‘ S3»™C¸HŒœË¸˜j/î6@ä¨ïçù£{Ð=ÿ–øŒŸ’pùGÉ—ˆã¼ß#h§#­—áªQöógo+´Ö‰XÁÁCÂhät³Â®Zwk c;Yk¬ ˜Xâmä¡7ëæ– ªÞêSwÞ^[yÉó;'êîfóÐkN7ÓÏZº6ó”á¡©žìÍ3Ζ96kÃô®Œe2´¤ÛÞN§´ku®$> © 7;KÁ,M{uìÑdöN’6k6düSáß rV[3Ú̺kM7ͺvî¦áéÅeª´ÓùÖY56g±›t=:ÐÙÊu*'AŸXÞ6Bˆ«Ýêõº\ÞPT+å ²òP‡ÛŽmóHKUou)»ç/­¼äù“õw3yèGµ§—›É:#3»<±Vs½wjÕº‚.÷Š¥Â†ÞK€ÇOD^ätM ꈭX&3e©˜†ï\äÄN‰šbôE¼­Þ励[›<ÊæfÓÑ32º;„Ê£'›W°2!:Ð׺ÈÔo¬À´6Ó¦À„Û…–`cÔÜ\5\¸b&5ZžÂAYI„ñÃs ­]()» TȀĢÒâ5 ©v¢`, :E1Šæ`6ä.XKkRÎÚÆw¶¯eA@«N3!„À$uÛ¢è›&D¬ð‚°H(CBA5ê‰-~½¿}Þ÷ïï¯CádÒU—£œZ&k;pà.9¢®ÝˆòãD-–¸[ÝMns[à .Á¥6S†ÖÆfŒ8ÙÐd 4èà¤luv±äA8€¸ß}ásB* .û—ÙŽƒÁ‡{ÛƒÿeDÿÆ |BRˆô‚¨† ˆ,‚¢°H `5¥@("¢ o‚ ª¡¯,ŠaA< a•ÕÎÝÀ,@ D ‚»E k2©f”7+q ÑÚÕT Áƒ Ü8´Oø Tj&¦J‰P6`¢¯†ÆÆ¹à&@KÀD[$'DË«Ѝ( çÍšZã@˜"!ÌàD b qPJØ›–¢"d‚*—~(ª“|®TÈ‚Añ(‹‚¶„2ãv· É4„0ÓXe›Œ.˜@@bìD+#·ÏÐŒçd CÎóo ÁÚ‡çô š†ˆ„-¡“VHóäËN^¬›`Ž—¾Š\Õ€‘ ÖÇC˜M+–àm± 8B„F—|£¹…xL©fA0î§ ‰ÅÕp‡éÏ0‘´/}÷äÝÝ8Â0€@C[²9Kå³ë(— `!›„Çb« :r®ƒ©B s±8:5uŽºjhÃ6D¡€Îð†,o·-÷Àý"&ŒD— $.i ÀÑ ˜ S£q&­(àÃß­‡rê¡ßœibÖ’Ûl&¼ë»ÈÀ$0Åh€é}0ኣ£^X &ìž(C<ÏUØGÑhÊÏC÷À‡Ìî«<ÙüŠ©,YA7Ü «·1¼ýOàÃád}¶—ñE©D„›— ¼8,ÒÓïâi `­ Š]£§ æØ°D€€Š í‰èé›ÈЊÛ>¡¢Àüû &›6QÜ"v!åt¶ƒ8’J@54BÔu¦ˆ&A„Þ(uZ4E 1WeZÎæÛ³BÅWm§Cp ƒ†!C‘Gí¡Ðj‡V DAE#¶…ò%ÖP@ AMÚ 0`—DP$9b˜àiÌXŠ–D ÙŠ.ì “<6FO@žïÝÄ šù°Ã»5‚c1'ö ¦<[8bÞÅàPµÑfE‰ôðŠÁh„öÀÜ àº8 5A ‹è>Bàx /c.ã Õ Š40j"˜.t 4Qƒ“Zmªy`ÐÁ0wb)¦Ž €Ö“^5A€A†)   Šr‚™¾45Ð4‰,‚jjjk±³ ˆÁ B! àìÃ쀂„#‚¥`ç `˲íJYS--¶÷ã’åKô¾z¬¬²Íi+WÙÓRýß”ºõ‘V N»QŒ ¨‡›E–0C8!H!+³9`‡z„(H‚òÄ@„D mÑ`"ñsƒvæes­Ý욕ܙœî-®ÉYªðp½Æ&˜® *¯©v5$,& ­#¦vï|$àá÷.9’bšòõc2xqíŠ6ÕÍÇG*53‡mÚäm‚Gh*÷*#{Ú&Œhƹ)Â[…B†*!Ž8À˜W¡€ÙŽÌCV*îåY­î5‚A‚„ Ûe}4R¸nà ÁÞ\o…n €Ë2…rÀÑìÇ8.`P‚s@¸|;Ó°d†¢ A‚Áƒ€0A]˜  DîÁ]Ý€êÅrAG]ÈRD7’•]X†X è5­œ•`•ž{Uzµ³¯]ôö¸c™²¶ù¨Ž ³wO×ì+lX 8?Èü C¢0:Ã`èÑpš™Ú…¾ó¿lÕVÛC•yƒCe2 4P!³Ùˆ˜<¢„7ºm§Ð`EC`ËsG†ìhR ÁŒ!7b¹ã;eÈX;q ÀX8&Æüj؈P1Ñ€Gº«£¹ž \u0R"A€†¨%é›åÈÀ"°#+Œ sûR!€Á Àb`íP”‰fš0å€ôÁX»~ ;´ÓM¸ ï0°z¡]R^þM|,;ØÁB³)·¹ô±0™LB>™ ÚDÕ<ªCË,A±‰m Ÿ‰àF´Eª ¾Ü•Ê7g£ÃªBˆ41ê€0–8"H18bP„PbW,Bv£¹uCV îì^Èœ1 ÀCF‚‡CcÀ"1ß%(Ü 0"€9Æ·. „ ÀŽÌ¢(øjÆØ  D 1Ùˆš`ðÁõÄ¢QdTŒQ 1†ìDìÁD8ßa,he[ß=õ›oë\Iæq$dÓLáÚ¼Pö„~Šø Dë4¡? "¥dL?¢(‘ ý#ôb䋟¨=„D¯¸¬0føj6«/ ¤Ù+ , 0Œ #Š7b³s 5‹¨à€Á ­žƒŒDˆ@b$ ™˪µyªCÈ‘ÎÆÆ\—eš—²ë,Ë2–Ûô̯Ýu«,DႹæBV£cON”ì'4Ñà ƒD!ìQÊQ½ËˆB ;!lhƒ€;°œ+ÒÆÈ¦¥›eKmß{mëJ”²oË+Ž›xYwu+ ) „0b¯›B–#L(¡\0­ŒÒB"SbPØå…Ë( :`¦u‚ˆ0H2.%©C AG“”~Œ›pý¿}€ÚP==ÓIlÍW¶=Y‡#×§N vƒØ'FÆH ‘„DÜ]L]V1¦±e!ŠeâˆpšmÜ@^4ÉlcdÒn^“`ؽØUZ½nÔN*ªË»5 ­¶Xa8õ¼™R¥Å ‰‡Z „*"^GXŠ$’W‘k£ GÞùî7uÞê%0ƒ`)´˜A„‰ª…VX±v.êî&׉•xE`¬•$@„C£t¢S¯LJs~z¾-lj¢¦J×blNC†<¼=8kFrðìoMž*Ä¢Gw†žY šx{v„6îÎg’‘­„ÂP*™ÒÒæf)ˆgÅáqûmw(££sZ!2ìôvÒäéûÝìñ݇s["2Vr'BcRœâ–H,;›4=4ÆÎ®Ï=ö!+cW§‡ ß­Ê"â’/v€<Ì™œ0¡(IäÄ„•Ì ÄÙÉÓÙÝÕè;Ë£ÝÜ;ººãœçMºìsÛwke§3›èo)îñÌ)º÷ìУ'ÁgìýºótÇG—HH»±Ã¾zïÏ~õ]¶ã¾<ò<|ª‡ÝÝ3=à[ 6”‰A ,éow‡wpÔ’v{¶âBv{œ»o!£nð‡OO,|ÉÄŒ$ v†ÐêÄhÉ\аbˆÅM­>ÿ?¿N!~MNG‘55<×'‡Ýl\æ»™¾åD¯UéÒ×‘ÝÆÕïÍê᳑­Ã#jTÕÞ.d×+Ìç+(БçU/ÚîêÏO%uR– QÜ,®ic{wÉÏ:Œ¦½Î™ö[ëòKyÜñ)â£G7Y3Þîäs±RCS"¡Qà–#À ¾ø­K—ð < ’áVK.æ‹$ÕlèцĨ’%™—*÷ÚBGa(R«`A &ÈFo§V ™ö@v1¡Àš ß\©àŠóEà„1bZ™,œ4%ÍH:݇*ˆa ` @L‘@HJ¦‹jMK5 ÀÐÕ¡PRvab‘—¢l(ÐQÀ„– ‰ Í…í£w„  + ¯xP{tÅÖ !p¨­rá…j2†­.ÞDÁL„‘)V‡0Іìv Ì0(ÛEˆY Á’ñ Ç!¢%BŠ”Öc›Ô‰J n.E-"Jƒê¦$TvM.€š ¼ïƒPâb#’ƒ “D/ PÚ Ü*-oܧ&l»„Ð]6Qx«Üi¤7âêúåî/.SÞßTß?8K° ˜ 8Á4à6ÕáÅb®%¥™…ÜUƒ8n‚ ›Ï'ˆ˜½ë Œ/d+q¸»ˆÔL€Øœ0·ˆ›ˆÛÁ/“ž˜ˆºœjŽ­WoµôˆAD70àõ*­£€É–Âlä6l6ÊPp´Ûã%ã±Äpᄬ(È“dX‘bIšE˜öQ᪮§{3ªD[Wć#u_«~>] Õ}”×ëÆ¯cCÁ\kP}£&úâ§lºË‘6ˆf9Þí"ä£%Õá-ÀR 0^ü^Ü:àdFDÛŽò›_¾Ûí¤3,-¬ËV—ë~“&únn_™W3UX…#4±7Îo,¸IEöíÔ…‹{qw€ºHu³ÜX 䪽󻼉â)ƒª¸RW›¹^y®çÆ»6ñyà»ÖEøMù¼§¥ã¸íé©¥½—)EÖ8]¹›ºT· ¨w1¡ïo9Å%ÄpICʘ*PW­çeÑw ¨î»ºAÖ»œmÏ.Û‰=oVÔ(¼–ЕØÅÔÞÜ[W4:E;x,u¸¨ux R „ô)è€Þù ^¼†T²,ẗÇ\I mŠ“M$Ú+_²»çiª’†ª¡r¹![]¶19‰C‚Vwg¾{~‘÷ïµú7ÈË‹¾-P8Ã{`,„‡$¬SÌ. Œ"TÓÁxV‘2ñ $ªLJfÓH·ax$HãZ£Xî áPܲä ÓÆ¢-4Z” ”+ SI#PíB"[ N9(©EæÜm<]“b +“€Í§D2ᇣbaíÏæÔÂø¡MR‰½if3bær†dfðcQ옜AÜÉIˆLYa,µ€4†˜(1UÉ2î$p¦•¡j5hy«–†ƒB$Êh&^BáuÕKµ&ˆp›ZïŠÛNELEÈHOöàÕÑt¡u‚%ÝŒ7ÆF0 9u¹»,â8­ƒ »>pÐ €Âøþ6yáÌt¢ƒG5i‡"$}$3dÍp׃| Ó6dÛÜYÁ–é݆1§ldH@ Ϋ˜•ÆC€*س Hô—ú'3ù§I ÐÚô#¯/Nάt`ù~…>Hü]ž[8|4>5ÓøÚ>vй¶¸\YÑÁ¨F¬;Ú}\sêùv*ËÖ¯EUÙ¶!À脊ܢ„’‹0ã}9p:³ ÜÛgƘäØ&΂öµÛgˆ»96„ͽµÝé£!±ËMGžk{¶¥É³61Za 0À*š¢Æ!`‚Yù½™Ûgîdž:½ŠzlYÓ«é5#ïh_€Aqe[¯’2 @NL p¡`—pAÔG[6‚D~)F~&¢âJ„ Ï!|Q1¸ €…r#ÂcÏ„6¸C"D¸³"À(±]#Páâ*kÚ&`²-2çðÒ³k¼²ž˜´¶vqzJª6(p¢°X8ei»8·[[m°¤lÅ#LqM;Ž®n€e Ó{,‹µ Ì»¶k+½™`š 6hùv£yY‚DòÇF:˜ªu(.À3 toF„.ìÕ-ê–á–ÂH2Í AI~¿ó7*UQM-^%Œ€ 5—Aôðóä„»åŽi…–_ <– ÀŒ-0œŒ;÷ï$zJZÓ‡Ö§ZeffšÕ•ø‚½02µZcL I @†¥²”êØï£‚wSXÌš8HŽÆs±!±fsN˜T/¬ë¬Ç(€d¨ñ8yᦵi KMØ™H~ ¼³ä™ÝÖž‡¶åî ñëÍZÅU‰°aЉó7%T§`š™l9nÓÙêŽL>´ƒOÛaÝÄo™e؆ž'¢¨”^á–hÅ}Û6$”Öz{7t‚‡ÏŽù–´–.èG­ÈN7’NØBØ„.ÙÝŽžã¢[ìÀ,^#”çðª†Â/ŒœWö%…ØZ“nâúg„¸šêÚ÷Ñ }ä}~Qhà Ñ/ó QA ÍígTÃÝ×%m˜àÝ£KÎJѨð 2 ‘w0г´j~ µ#†¿ ¢ëªlÄ÷ƆÀA•FÌàÒ¯ŠC– FZ¸}Ëö:×ñÆîå‚SÓ§»µgWRÉf!S aúÈ N> Î6 ÙÁÖ(X€ .ºì«g  Òºa³îhŸ-õ¹Ó†Ÿ·ÈHmwÓѦžïvŸ,ifƒZºš–œ^æÐ5|&àH|wúKí½ð[˜êUg¥oj9zh±-~3qË5xLÒáN‚t»Z¹¾5ÝÐ ÀÂ0`w`y·;C ÅP±C(p–Sâ#¼O´@¼]‡!‚ :ÏEݾ²çF‹<®¸L°ö4uëÎ[±4è×AšS·$%<=4÷ÏÖÞ[X–/[›—m©O‡-6á˜Á“ rôôÆ{V$_–Ø>Z|`±[ @Æ+7„\ ¤‡v>ùr:Ù§ŸgÖ^ I¤ŒÂ™Ì´Ë:3»ÑrúËt€úñÍoí´aD6-‹ îN~e¥zp1‹™yËiØè˜"4Bn|$™@("Oñ*áY„(/£»w9pÙƒõÎLÚeÝ·#el«1j$¯ÙP&ǶdP Î^À (ÌJ|í¾×¶Ýݪl4žSNo N0ûüó}=ŸM³»žK>>Œ§ 4å˜ò˜Ô „ÀCKõQ?NÌèä]]Áw+g$¶4±ƒÛå‡"sšK›Bœ ⊨ØR… D 2ØùƒÀžÑ“Dv‡ÒÜ¥ä0oÉ»1“cSr#¨”R@¿! ”4áðÏ”h¢QÙ8êÆyZFŸï1æ\X²Šm‹— º½Ý.&4g–ÎÍ´t.Û¦žNÌ0à»ÑkY†›<9x#v>Þã;ÑÑXCÃv>X>î߃I¯ß!œq6ñç^¼m¿[﹞}t³Š %[3=mçP5 fHK°H£ƒX!ˆÔ%ÐCaBeÀÉ%#tRˆ©˜%IMí”­ëä—†ITY$ÖmÕ)¤๮´kÁ8D‘ÿtÓŽÙ„«p†®î‡J}!Õ‡¨å·©#› o=$ezºÝÑáφâílαwbÍß Ú0`³Æ†!+ †ˆáŒ Ú ,9e˜,Kìo„ö0ííÕJ¯öÛ`ìÃf?1(„ ¸ìðӻݡòÁ»O†œv .éd°ôö7½ùO–H,¿ÔÑ0È,A›¡ç%1sfh‡Ÿ£â %á úsâB˘ã1BœAE¡›Q!’îΚ¾5ƒ£tÚQ¶/²©®(ñˆïæÁ ô‡†Þì¾^_wGFnÓ¤’YŸÂ·ˆYœ¸ëÌ’UÌ0Œ4Â-ÒÁf„ÍÎJo†,tofφªpSIpÏÅ„€Œ,{ºßà’SðÇÒÕ$?z8Oè6?ß@;›¹„þ„‚Qt’éfO*í¾Îîîí{úµýíþLxV`!CS0$ßrÝëoòZ…v'Hî솉B©‹ JØÎ=ưxO†ư£9ð-bªí1å³fXñG’:·çz*UJ.òÇF5b<·~Œ Ï%»uœmÑ}íþ3;»°æ%î†ôFþ½8P?£öY²Œž,ÃãNÚÚ{°|½ŠCÉ^JiŒziÙDzi§ŒÏ7…Š-f;áòǻئæŽ[+ÓˆòÁáó¡ ;1ìݧ³¡OòQeP0$²£ìyŸŸtâ«êv(+Ì—Y:^Òø¾ a¦qØÊ˜ðG§†œ»ö„,ã¦SfùT„îç¦HðrS†=´aCŒOC=ÈKw³©Öþ<ãõÑ]kÎ6qkí}«¦¦¦³¶;iº¿@ød gà@~Š?…Úöe;d…8`á#ÝËNÆæžÉ0X-‚Â…Áà±ë›ß9ÔÒðyâ®s²¶+ [Y݉n UÜ—!ôØÞ¹ º·×3Êã^xU]ë63žœñà+(Îx7Àü41.ï[Ýs¹×w] ÅÓ–…¸Ôõ2¹Îq” =–\kqÝKªˆMU}^E›>µJNz|Ü÷<™JÒd·guˆøÈ'z‰›Ö§DJ\n!ôŽYû®ÝÎzÊBòîÖE•“Ì>ï:5Qs”.”¦.‚!œŽÒ.aÌŸ;ŽçŠÊ¥h&íûÜÔ#Ū®óÛÏNxð”g=F›à~—w­î¹Üë»®†…‚.¥¡n4›ÐçtZ§*å×k Q’Ëë)ÝdDǯŽ|º¾‡ÍÉ5&vsšæ¤NЙÊVOŠnw,n\ kÓg2V{x×Aä(Ø‚=±6”©)@©¢õ)¯µsÎo )ŠWþVc˜óÍ®ÉDɹrÈŠ˜9­BÔs0`’‰)™R¾p«k<Òò€ÖØÀ$™œk”D0`"ñ ÁP6r  ŒéHITC ":TLÓd& × NÊIP ZHï¾ØÐKjŠÎ›I½eÎ!`ˆEæ`™ˆHf79€â„ …Pµ ]˜¹Iˆ;jçLº•{²Õ¨F ¼vHáLˆ0$„@n©I#LÑDª¡Ü»´0œRñ€‘½hš0˜žÉ=.MBðfõV~„ÅÚÕêhÀA’ºÞ[ŽÍ‰…ÓoླྀáU}¢JfaÎ\h«ÑÃä¡a¹±A¸]!šv¤áx6²Ã‚8 ´4Ô…úˆ¢8„/HE…urM5ÝÛÙÑ´å‘4‡44q­DÕaF+ v`Ðàá3LpçŽ ¡ ãp9¢‘²4 ‡ZÀ,å rlë ¡¹¡rFÈ£‡Jµ"…áÑxh#l–š'Š&B %‹š:ãj!¦,f P‹AL@@ìÍD—7¢µ +j G ¸V˜:XT0`H1çh£_›ïØÓA;ƒËAq03™ùà±CÃÙÕk“!–1îðÑí²Ce2\œ›ñ×}Í0ßž7³«»²øuL.œçAÐìé¡v¿¡õî‰(´“/ÁXõòBPÓËTÄ÷aarŸ¨pA‰Gù̬'¼{} ˆ‚#wx:«›ÉŸT“¬¨r7Iˆ:×qz¥q‚ðkU‡5Lš™ª»º¡I( ‘.¨s¤$©Ÿ~9®fÝÅq}I„ɵ;®öm`¶ÜTÌD‘O¥ß¶ýÉU+ß­PçÃmÜö”â(®Z{2ž¯€•ãš;–ƒ]^G“MñSNÖã¶Î¡eÈë«eœdKÀ8?ƒF,ÃÄñÛ3…@®¾Æ»èë¾¹w~€0§¦=ü3–à÷éLawŽc$[Ȉ¦1.ùöÓ,é(à+ѪeNíㇸ¯à¨ºµ$ÄÔ"Cmzs|†A¦oàè4i¦O2¦ÕFLÐíT𢙍Y¸†ÎÔiBÉópTDÊÚçbÝ1áâ³¢Øè3x8P—®ÃLpÁÄ€€uBIí=z(ôpö6mƒ žŒ0R8Ü> ÓÅõØÝÝÜÈQ¶Ö 4»+ˆB„ñ»—FàÏ’IBaÆMŽ`±É—(4v4É¢:&†©™‘Q)†í:55ÔÔTÄ<;´ZÀJ`•¦(§õ|¿æ{ìq-«IåUµñVïqµEµªo ¾ÆGÏ¿àQ(°{°øa͆ƒÌÐ`“.ccf\‡›Îï£ÙëìÍâm𙻬ÖCa×õç×?|£î€ÉnD1™Œc "Ä7M• Àh¢uõ²,{_Vk® Ÿ4 „ ™@ˆó®1‚ãh\ÅÛ<,à ‚/ØCëâˆ}8qBzØìò웟gWP±(Ðð){–,ä.ÏÛ-‚O[¾z77n¡ª†šž7ÉÚÌš|Ø×a5- EuÑåÂ-§?@‡Ïã$÷÷fNoã‚‹`÷`ùa¶à À")‰ß1ƒÏ{Ýüû+"߈ˆK̼‰˜¼ËþÃô¼†;÷T!Äþ‰  (†ÍRmŒ2Òýôú7@¢t†'õ‡sDÄZn^ºígÀ ô?°'çÄŽü1QaÈრ­8)“ïœW$ÍCñË‘J6hϱ±©ÙÔÖÄß²ÍÎ9¸rrÀìözŽžž”´Á]MÝ(³±ÆØv«VœàÑÔðñ::A³ÀĆ킚:p×´t£@=9{;º/³“e×WB:œäß¹—»ìiLå念¡UuêƒÄ›\]ŒÞÏì¾Þ½–2U½9³ÅTCËœµ1‘­äücÀ%Aͽ@¡%~7S‘7¢Šs9÷Ä߸ýLÁô?$ד!LPŸDOʤÌ@‡€æ{áh"õÊj<nD! tìêPRzv Ü.•Ë,{¥òËu±ÎØÎv{4ÒÇŃb `bM>’EY'ìa®pIÀV¦¸³,c«LºÒfã°iÓ#,¦Î\†KF›²ÏNΜvfîåç:¼¸øù~ÀüüÈMv<±¦îúz,{0Õ„ùÑPèQtØÆ>siBþ¾µnºI Ç!ÝÐJnnL¨QYyuü0‘úP‚ÿßô „H™ª´wæ™/Óµ+|G i¥ôÄr2©â]‰¸G €= €<îß։݌–÷;Ì4q«¾4m¹»ÁbôA¨¸=¾¥Í­­kBrÛž ²€YÄw68!mšª¤¢À ¿q0Å‘+>Ž‹4¨6C‡é±CO¬h X”( ˆF.φN äØêhØloƒjºÐõØÃ³¯p Ë™;š» ŒíåØkm’¤!ò½Û³ðzJ ϳÞNpð††sžß6øÒÇ8Ç:VxÚº¬¹Ô€Ðï!©ýA_À÷è%„€WÙ`U H–bZë<Ø „Öz¤c…0fH ]€„kRá­äÖV†Hhi’ÑÒÃÁ5pk“]-} ßu$Iˆ{iií³Ðû›…D×÷ò¬_qÔ›²D‡ËËt,Lj[ÅÒ˜jž[L4tvÐÓPôÞƒMŠÔ²hHzuÆŒä܆K—±ÑsGa™„ưØ!“:ii^¢nÑäEø„ AÓóÏgA°B@ÂpDR+~!Ïç}½_$O²ÎÖâÚÏ-¦¼YàÏ%¸†7Óð"ú ™M”BCí«ÉPæ¬@k"v¬@òÄF^,*õu¢ï8²¯Œ¼"ï$Gao\•ríÈäš5À…“!“Fl8åÌ×,±bãG´Kê“¢×#1(€9£fe×P”ë“8ÕU E2à‰@ulãK“!€ÁpÝѬ&±’ˆH\Ýôj<]ÙtK@±Ñ¨Ñ¾7¼! ^;Khñ   Ñ¯°ï¢[‚˜z,…¥‰z’J6N¼ßrUÚÉ5ž·£Df|‰ Œ= ¢'Wš D=Ã;¼.9‰X}ÀÖlÕCž˜n^Nñ»5Ïo륧·ÔTصPÉAMP°¨Q=½Çv’3 ]Yb»³r cÓŸÏB9í ©XІäÃX9ag)¹€„Ѫ»9s‡§`)Ò`¦˜hØA› Œzp¼ª-d€û-’(혼L4HGZ M;‰ [ØØSO¯ÈN}I&S,|±»á ~Ž zy´ïY—´ xßÃ1;%Â) kUêg4|B‚fNþêY¹rö¸Ü 6Ü¢ŽCRÓb«“6[ Á1¾$Ðp Œä•©2PÔ#aïHB„BƒLIH!L…Îxù¥ÝЄ.BRªîì¬d†A ;(† *W蛇á÷óóæKK˜S3 ¹sm·Î×U…&)K϶HAgf>û=špÇîF1䎄C–<;4nÀÛb—-Þ˜6pïË ¼ç=ùÛ¿µ¬g9©YÌšë<è=Ž¢8cùa¶Ä’€áòÐÈx|¼[¥žšwâ»c³¤’SŸ0… .ðZ 뼋æ•7Ÿ ðê¨ÒhȈ ‰¨ö¿žúHNœ1Öx¢«C¦ÎÛ²œ4Ó³ÇD%7cD|ò÷iߦóA#ÑO–:½Š ˜rÇf<<>=[}ôî^Kç$½³›T¨÷uX4dž<‘Û¨@ìÙ„;0»Ø å†É%±9viðÀâŽNšLÜå¶.<>Yæ´Î]›—­•¢ÛZ›#;»²+[±ÃÕ§¾$’†žšzÏz¢‹<‘áÁNÌtwiîG«BsR”ðÜìÃV.‚<>ˆ>%æ‰ýGÏ[êÖ2„•‰‹ 8¶3¯f=Øó»)îÇwgµlÕä!ãXJyvi^ät0PïÃåšì•»ÓfÏ$ucÃÐ?f‚„‚‘¹ƒ… A¶ƒÒséóÑü‹ <h¡^ ¯0 *ª¶…V¶1A›ÞÚa/ pñÊhÝ£pæSCƒI “)wBøw[6ucpнG"ÄŒÃâÛc›È‰Ÿð—º¾TЦ¥àñDÐ:…;ÉzöM%YK>P½5(Ö}—Ù^2å%H{õv¸4(pW!ߣ¢ï6Q¦8ÒLœ7êsÒ ëGqM>ànÓÓ$^ì.÷),îö,E Œ«,ýá@~¿ŸÐý=ˆ‹þ>®çwÚÚP¯y¸n5ˆ™•(ehçþÉyðä}? L[å&å1aн‚ðÅ7[@$aêTeP !(‰£ìªY§hÀæâ/@©+å‹.¬/s;›ò ø—¦Ú§†ƒ'š e‰è¦É9.í,¬]E<º)§//ÆŽ¬r:y`Ï×ãˆBŒßÅt“S§Éìw.¸!¦¥y(¿¯ë'³sÉ­>´J%ŽtG€Âeí2Y¾E(׿Xß]ÈÈÕXµL`ìDòb›†Ø»DdS°)¾…Lêù$‡æÍ‚E_¡?&@‘æ­³bb¹ ¡ ãͰßd¡Ö·²coŠ(¢ê]62z¶aX9xÒIcW#”ô\ÚòI$“‰I€¹=:%ÒëÓdž.—m©dñÛÅT”h_¸Kœ»÷Œ5ÆVYÉW.C³]”âX”YìÑô÷ÁRQàåÈx{4<FÈv°­Ñ +î ç_éw5阑˜TÑó½™<íx®Êš3 `dZ«À²$0‡‚1vM˜àc AW4Á¢.‘ÂPFhgÑŒñ£#‹Æ‹MY㣠«u¤Ñ˜g†ÇÒX¸š¾J:¾ý¡ ,ö¬0hѸvlT6ä,Œ2;4`ƒ{4¬(¼f¨•¢0¼Föï^´!*ãìÁéðXõfÀñŽR8XS ä´¾«Ï×_e\½ä·3 ª‹šòo™DEuáqG‚ÁÉá‹ÀH ‘ˆ(|DY€õrlþ¶¿Ÿ<D+á¾ œtØâ« cÀO9ø°6Sè4Å-…9¹,môv8$+M^g¦6…¦¹Ë—4¢ˆÚ9:pÑ`¸\^B.œ¹i„pX†nzv{6|< Or©Ô×àúBUÍÞì|ðIMÊvcéˆQì÷3`,4šµåÛ?>5Ì ¨ÈXD:©¸{*_ц6ÍJˆ†n‰«>ExJIlwJ$¢5ᚢº0[qÃhð:x=ƒ.ÑgaÖKÓœ0cËË¥‡Cã¼’Pl]îÆ´¡ØªzÒzSŽƒ’Ýݵfhë£8 0;¦áðä(;˜\0g¾-fô>ƒÍÉ&íØðÐö`ü;´øcÍ7íæ¡(³úþÃ_x‰Mv¯ÌûŸw ÓШnæf¼NbïÏÙ4„£$‘†Ú_ˆ8¸؈qá“DDL} K ˪¡|”óùð$äÁ“¼ô#Ã0ÆšOÂØ£›¢Æ7H¶€[ž$2ܼ¬I¢Ù÷lº—nÃW»füÒkãÙ†Á‹á3ZiòÞîCé¶äh-˜Gçä ³íwƒØölÆCs‚¶<Œs åüy›™e ¶: Õee\ÌÑHÂn”ßyú#pÁ^íæW ¢é«@4VŒ¡*R†( ¤DäN2 žÊ $ÒÁ:‡Ð8hžêðìÐÙu0.Å\ÃXSž\ÖfXÆÓ“+I„l˜lÀÂû8¤Ã5}ñô¢iŒkª:¶za«¢Q„L±a-˜e7ǪÒ^FÌB7Ã,…™íî ª\yÝ›>=>rG» )ðFõÑZâåx…ñEËâö­âSÁ¶ÓTªkŠhT°7R¸©Á6´÷ßÚ´MöÏÍ— ˆV¢Š‰Ñ\<@«!àVˆ†±áÙ>K ç®(µ>˜4Àz"pòѱÁFròB‹&¥&¬ ˜hÀ郩‚1`†º˜öZ‹×cùAK¡ºÌ @6l½¤Ý¯<àÂ>ÿEA¢…:X>”Q@ïP…=Øäbá§s»N¤uš§‡†ÈŽõYJ-ʪ­Â°#thD’% xa‰ÆºÂñÏE=ˆÜˆtÆ Cc]¤–w{4ðD.ÆýÙO4òÇ“’ž%åµã“}¥õï‘bĈÐöDèQÛÂô‘–~ ÓôYñV`SLu|xÏ È*“CB¢$€X!ë¨C»gfÅ9{”7lÓÝìS«á¦1ðGÃÈåŽÌx#»Øã–x HS‡-?5†ÁÉc…5 vÂm© ¹ª]5›†¦–ƒUÖ U ª™ÂH"âip èŽ"„ÀhÐ^Œ6xÀâhØŽpñ9l’€ƒ ­¨P¬p\ˆ:FÑwÒ ÁØ–ªòRÌ̸qŒQÛ'œÓŒ»yºŒà¼¯¦c¼ï¯YÓóyη £G$Ì¢«1”ÜpoÒäÝöåÍHú&Z¶6›µ|xä•¶‘ã’›3ÑW_{gŠUÝ'4©!0pZãëuYhyÚ‘Ñõu ÙvÓb|Êè‹s­d¬®¤ ÅFå¨725m} ~²ŒtTŠ{ÈI×u7}kžÝC˽5UÉvu¡Ìže”è0Ù2o¤çžfk”¥]ÚoJ’šëéwU—wÚÉñu”Îì»i±¾etE¹Íè쮤 Å@[¬¥TÓ¬¬oŽž(ÒÊ^‰ØöŠf›+Ü8òµ“ZÍq"ŽÏªF«ò;’@ï/Œí88Þr©ŠFÐ2S­ÆÕg¯ lŒÑ ;‚2Ð΃(ãsf²fáŽ5h‰™rï&§F‡UnFÂ4(%Q¶Ð*îv'w6¢«AМuAÆcîëЕ© ·{0@ç"@#†'¥K1”k¦ É5Ùr æ"ØØÈz–0s¡À„9¤A:À%еЀºguÖ€©ÔÂÈB[…BÙ3ÈÍØÜÛ“-Ù ÈD r(‚‘4±ª®¹#‚¾¸â9.ÄB‘ ÀÈž£™H Ù P™¨€6Ç0œ­UfŠXÚ$Ú±FED‚à j­a(‘&™|K=0ˆl µ³¨la±7¢„\ÀQ€kYm·sknøËG”ÚrÝÞ6MÍžPRà ¥æŽH>݋ɋÁŠS‰5£ñ$FÀ$4ÚäØÙç–¨0 GÓc$èd£!“¤Ïœn!òà80H@hÒ‚:NDB4F ±uçc莼ÛÎë\aåS@¢vüñ¬å*<¬ UÀ ܼ^_*wBž]ë­*T¨™¥[˨91yjîš b¢Üé᱘&èµmqÉV%mìf!àÈé˜Íó¶Äø¡Å+.œ„8ÿƒ2¡j!„m6¢%€ØVÛãŠa#Z€Û>(qš °š… S*KõÅE@+±H` ±PËG°%\;ŒÇ€3ÿ¢ O"% ˆ<”—Z¼Àv¼†‡8Ÿ4ž=²Pˆ¦ÌLË(ó*ª«(mYÚñU*c‚ú¡ÑÒɾi !Þ‘?¦ Ø]õyá`l¦(:BÒ‹¹¤P€“âŠr}(£g3|ÀNÄÝ¢pì#IMð#ÎÈÌM®ÁO„eæÊYĄDŽpþ…žñB°1¥e–(ƸÂ7"Çž¤.™ã vû2a-ä¼`Ó‡†Ìxñn^×ë@!VíÞï-†'Ïž „¢¬¥žå‹^æÓw4ËíçÛ5É Ë®lbÅÈbT¨LãÂÝ/AÓû†aj0ʆb˜R„ƒ¢¹Y^vÆØÛb·ð›n)dˆP ‚ »°u‡r¤ `*©Lnª6Ò¶ “™ ·nÈGCeÓ°íG4XFÄ2 *TÀa‘çÎÀŸ,àv„8K¦Úê&¯,zt§“¯{BÀ˜³“¯ ä 0ŽÏ*lm¸Z–cw'cºîÛnŠ2n–Y¹¡²Â76³ öl„s¹¶®«=Ÿcn¤&†Àè£yË+³pé䣹ÞÚDœˆæ  éŸÅÆ^½½½¶fÕ4 Ýê¨[’gÇ´˜> _hâ¨T¥l "rÕnWã2FUø³Ãº%Ž0X¢meÓ$DQ™B°ºàê$#QÉÔ’$‰»?Ȥ2°Ä(b8w5ÓF s¢“8úÑ“/&têav µè§!«§èeÊâÃÙÐèÙÛ`j§ññ‰ Eîâštu9,ðå§à4Zz`ëfw,øbчGf﯅ᇱÁ„±µÏ´eíµIï„&7ªMOTH‰t7ào«ë>âÅ€mdGóë¤È}L³Œ P%¿¿(‘ WØDTÎCh\g3G`°n ˜m{€h›8…¥’PááyÀì"'Mzw„.ù§n٦氮=¡µÙN¦l—:!|$vlíâBnY»¡®ƒw h1‹š…ß&åÙ[$}Í6ó[ ,e˽ì1ÕÉäú|Ð @ØÀðdz|Û± k~Œ˜ú#ñâ¡E±/ [¸R·ißÂvÆ~m±ªá:h݈ÉÜÑN¨‡cÎŽ‰ÆÓн°‡:º³¶G‹ªÍ;IÒz³´§ƒå`(³:À`™ éÐý ˆ^Zf$nºæúéѱ+2#¾’I$’I$“‚õd,R Ô46>åÉlƒHÝŽn|d -Éœ±ƒp»Ölu¾RÌ7x0tŒÐ Á¨è’Í ²˜» ²‘šïÛ5 ^²[%ðlUŽ·5äÕÛFŸGË\àv=œ%ߟè°ú#éƒáòS†Í |ã˜2o+ï_#æR=ˆ¾«dq SqZ–ó3/’¿ˆ(Ú2 †L$&BuÆ ¨Èöõ/n¬<1Fݹ¼œêY½Ý ‰­†Ý7KÜoK¨ñ±îŽïÁ¨k²M²·>! ¯\ißm„Ø”Ê8uÉÖÏZhæÓ-·phÁàÐÐh°cM5K‘†ÆOP†ÈØóµš‘úQs&å“'U$—±W®,La†ïÇÀ} ±ßMÌ;@‘ìÓB€ & 0¸ô¸Óm“ܽ©¢‰ÙÞ<ˆ!óô<0>8¹n”Hˆ_àDY8É&¹ÔtN[µ17oŒ[|º–ɺ¶‰hùi­>@lGb‹Ãaº,4è ¸x’ÆÌœš4\.lkslˆQ|g!Ù†¡¢1fHZlå8´ÖŒº-†–˜èÎŒ‡Ma²‘½ô’JÑÂaÊ=rŽäXqó¯2-ipŒ·$”0;:.ÎXÝ­@fl›¬O ª»)¸HH.ÀÖI`É2¦W­ÃgÕÃ2İ› ‰ ]ÈÑFM!mnô³­ÀØé5KcËM–!£‘—Fƒ‹›–scËîÚÇfC¿bÇòP8P(éÝÐ6×nKBB‚Èl£&…±¬˜Z·‹È_xÝd5p\!¾Ý‹±É [Èœ0z{4ôúiøo‚QIëáÖÐǯtgˆæÌ"$!{ù!‚+'ñ…Aƒ-ƒ2-l"€Í¤ £¤ã€0‘ú %øœ¡î°x¦:¥Í&EºÅà³³p)ìe)âÝù(ä±s@899Îû¶q— ²+]‹…¶”×}Y†×rÐS‚ná«rðÓgÜPìêSíÚÚÍôù)ö`ðùiᅫ³}ñr÷ï{U¯[ÌYƯ9ìÔ&Bh/5R,,°öÛ"LKÂ;3EVwRQ‚ø-wÂçܲgÆ€ŽG0‚UU*Ö6ƒÛøŽ‰ ýöYЀ>p¡á¸öc¾Ð…>Z)òÁáŽÌC½ä'GMÝ ÁãA°x°X:|ˆ~ß:ë{eœæMk9¹UV>ÆÎÜÂø`û»4„žhª;”ô‘ðyiXÁðlÐo ÃO[ÕT”—cç…Ââ£2Ð!0ïçÊ.|šx6ÏO3uÖ;#¦ô+ƒº€¯ÖýõûîÅV]üÍj!¼0Q¿>‹(°¶ òǹìÇ&í:áÕ§ÁÃCS¹±³¦?¢¿¡§®xïy5¯6ÖîšTÐjÆäbÍ ¦Š1A6QüA áú,ÎÒIO—ÁCåá§Ë\zÔ±k˜{‘ ‘ìêÐß¼!O%4öcݧŸB÷iìú+N½Zo뉟wc3f9«fŠ0X¸ð cÀSÃ㸡Ø$cu!,±ØŽÆµ·t!WËn&=5ìÐ †$dN5…Ãt®²®{•ˆ‰Y²«BB"®ðeêý‘@æ ƒJ?¡ágôÃ¦ð…‡§F†»2†@Ðã´†{3s†LwñêŠ(Ý»ÀÁ€>bH€H°×újÿ=³&ïkglíw])–‚͵‹D»uR}%ƒõçÛÉæÐW•½û‡¿¿­ÌÁ!P¥< ¯Œ‚l1Œ gá\HªUUSI$4Œ $HÌÓ ðîqc Ǹ)€ Âé2o @ ßF¶VªŠÕºx4a$vHÁ+ËÜî/ ¸ðÕ#P_‚†ÓE`=}|¼û;©_ª%ÐâÛå©ùS¨=ùy%%©×/Ì•vùr¤éÝhUöyÜSvyUm½>¼g(”‰Í£2q³oÓŒÖO1f‘q(»É²ÉØÖÍËSÝ_Ótªx·ØÏxg¬…ðpËeáwÝëT—¹}oõ§û%¤qSÎU*‘Ä™XæFc)¬¶á`[昛56¸²Kh(dè¬ËAEÝåÅDÅ´¦K*ÐÓÕìö{˜åWO4qªëÍ¢UÔsœYß%'72”õd]Ê×hªy¥ë4VÐôiÙé›s,³=$+É•9‰îèâëg˜´H¸”ndÙdìk†å©æ¯Ãtªx·ØÏxg¬…ðpËd£FÝÑTøã§&O”Zç‡Vï;Ÿ~6]ÖҺǚ­š‡ÙhÊ•ûÜ©nAì—>:©Â$-u ·}`¯9G»¾Zš/wäc±ˆ{ङ© fIü–{4ÑÛæÆ$^Ñh ðJÊ®©ÁPxЪ&²²ò80(BR˜mCµŒH‹o"q~1)IrPqš:C‰ÝÚp'`ã`±ƒ*ïsjëlyBIª‡ LD¢êÚ!…–È¡<Ž ;•:½ÑVð±ƒ:º!‚í_^3™Ùb›ÀF ¹«¾Þ‚ ÓlPv°\72s˜ Æã‘dZĹOE‰ÛÀÕ^L ·¨êšqÜÎ26Ù#8h¶á-¢EõqeR­†`  ¦/`*AY»0g•Öc±Øæ^L‹¬å(dF¾álŒåÐ oI;S<ÀeÜ­¨(WKš›2a‘*S-Uç·DX$ |ñ>¥â¾k¤O‹*¸¥”©U„À‚ÖLM&Ö!‚C³)‘)à"ëè 4 &B¦Eűê“Bï"Æk¦Êí ›!—š„!d³6i¹[ òlÙ|³Ì@²‘¢ d‘'ðP•\<ÆZv}½ˆMôÿŽU†tæ¸Í¤“ üm抢[=Œ¾ÿBä+Õ‚èrú}€°ìƘ=†wÑ!B[R0U[‹-ý,ñ’÷9dUß)I{˜Û‰7è<Ò44: °&ú€ȘD«"’j˜‰ÎØ$*Y BÐ~¬À6w“,H2&…‘àÓpóÊÖà²óÊ \áÀYg–˜ÕîÆú B¹ääúo£«É]<`¢Šè¾Üéêkuà4X’n‡ÊyìÙ‚Æ9hÕ³ô÷zæÎ”Ï šbièÉLpÓ˘ðâC¦ÙR–sû¶ªã÷òüç¦v§†ÏLo5^l°¡wã÷Ð @…»nî®û¥)l ïl0ÀQf×cÚßyÜäàÉo&L“”^w¦¥pÄŒSšy8·a£<™raS‚_sí¹ä‡6ãz2àË´åƒrí7ŽÏ¼%˼·i؃֬賹ÓFFÉ—Vç·¹ëy˯J¼Â”(o3!8¨Ÿ¯ÐH¨j~`¸•ðoëÐ ¨xgGH¬&KgÇBxP7÷à \>’->4¡m©JPÆÃÅFMNI“B$H’¼0>*Âá+OÔ§,C=Zh1v;±Œlƒ†;±Ø¹»Ý¸ã,ݳ«»„7mcckS}'¶g3Ätp Nˆ{;7Z}±kºh8‰iA–¦=ÊÓ%Ÿ7߈(€x…Ÿ†0t3ú´`ˆg›wb"ÏIc´gBÓÔ¡§%!Ù3Ü$)t&¥ÔÃ5$YE$ÔJ™šÏKV[M0É»B…*dP!ѵæˆM¦8„ í,ÄLÊÌì8:;ÞÙjdsÊSO¢udÒŒÍĶè͇;Å?;Ú/ŠlÇ/sWfï ß ˆðû½›"]ƒf䳿<±ôîÓËÓOM4øcÙœWœÛnùÏo¼ýWeÃŒQï·0â$d÷$üñz‰ð£e§ÁgV;fI(XôöiáƒÝÃOw„.óÓ({Œpdzñâý³ãqâÝxì[6ÎÛIšˆzB* i geßÁ@Øò`¨ˆ‹ÀLyÄï->·,nG¹ܧ³á¡<$Î  Å/*N[Sj8‚…ˆ‚fWw*Z5!‡³HÜ,Êv$é³ÑvNÍ<‘ÝŽõÏ™EÆpBlÝÝÕÃg§§›DEYG¾Š ÝŸ+÷õ÷"¯q™™iÔÕgÆXlÓݤ;o$”öërw.ÜßFåÛ2IaÙîÓ«Ø<=:¶{Ô„§§V‡˜¬2o1»É'ŽIºÑ W^‡b&»–ÐBÞÔR™Ö,wž.Ah¢üI3é£FèXeZx¹ CO†œÚ]ÚiìS¹ÓC¯RIHXLÞšlðS©Ãƒh78Z9ɸ߱á¨9µ–€¡Ð2ŠÀ²+D$n@«¢UꚊrÖû2ÇY—¾­Èï,7ئÖËàÀÐL¼™GFæëfÛ€šIvív¨—Ýw‡ƒC€w`r]³w"en¦SF.S,44çá¤,l¼\ 0Þä8t6¢ù,L= 8ŽæVÌëm‘Ëyl-‘1“MY6¹8u=:»›o3»¼¿?Pê}†Kªªª¤ª*„„‚HHC#ìÇÃÝ÷,<’ž÷-ÕÖ“[Ñž±í~}óϘWÁhZMK•y‰-®¹Ôàèö9P$-jëbÝÛÂ@30Æ*MUÕ,Fé¨PB"EzÂo'kC‚Í$öy2…‘Ëàu~ÙÚ¾ÓL˵ٕÜ69:]éÔdH2|*@`ÍÐF ÂÊ#â0"¼° Õ€¼áà×ÀâÂ^¤B–öÐ4òê.Á¾$ìÍÒB,ã‡C,>P1îÌ>¶†´KƒÃO‡Á–èú HâtJ™qü­¯Ô}{ý_¦³'Éñ7UÝÚ¼^1ÏSœ¼v«ÛaUMÚêèFë®uY­º6 ´HÁ¨¸ª@ÍUõé>ôDŒ%¿ X®¶à/+vG„(¤i&Á‚—wÈÆƒ‡5Œå\¹;{š›¦ºíÃú0p£Yîûo+3ùI!egÏÐCá¢ô%$’Hñâ,á ~ ³0ÒàC<9 ¾y‰ pᆬի¸ªÀù=¤‰#"@¡îG³sËgÁÙ¥êòîYÔ t>¢$0´jÏê%U¾¹pà(Q“šKÕï¥ä·uï Ê Í‚)âç º^S¥Ô‰§4BÂF]/ÙÒ… (/ ¨‘à/f ¢d2™}' ƒv‡Wwggœ:)Ù†Œ%>Ýá @ë¶ÚÉ£»Î°Ô kï°Œ:þiX‡Þy§ÒŸÌⲨú<ƒ!‡:§%%œ§C0pÙÐx•ƒ&»º²åÜW'ϸH-b<ÚžZzcë’Ÿ‚žÄ h84]JÚŠßor÷ÓŸ…øá2]¯-Îá *-ò ¦ya›KÉ’š²ðÙ#´Ãp©  ÇŒ#Àq1}šæ ÷£EÝu9Ä1šÇ* E'ÛG@-è.Ø#‹˜+Gn0&‡ÄÕ³Žˆm Bˆ`øœ8¾¾š=þ%°ÄFƒDú@“D2ä×Õ¡ 5 ðÄÕçÓ 2™tyrœ>M > ¹[žK?´³¹XᎧO`¬ rÕï‘îcžÔoØZ•g?°ÌçP(= ‡CCÖ‹:õ÷çÐPÚ#$N_Ïaàʼn78çX˜ˆ’X™‘ôØædtÌv@Wæ„ö<Ó%ºÁb·x5ƒjÁ¹Ê®ˆjÝ>€ €Œ86l4äh+sVÆ8/¡¬¯ž*L%ØÊ2<[B¨¡¬ý‹ðu1ûFÊ:: Û£îÀ¡ÎvÓ!—DÔŽn…Øèüû¾5<ú!£å—Bž=‹»à§Ù‡ÑrÁÁ¨ðV„¿î†Eêf>•mýîCQ›‰H«Ç³B"á1x±ŽÇ2Ü¡À4}B‘ìŠW5'$BP ~0l@¥h»*“@e‰ Ø«DAXS¼E–¸WÞó×¥ÍÀ 2–=6‚lßd˜-½‰•Ë˔Řç;ù”Q–ûêû¼bÎ|I$Õšœ9oÓ’²ôaÉá§²mF‰³°—²\ë]éê×}5`Á$˜cü³.lÇKÃ]/ÆþŸÓ~û7+_ç¿»}߯î ~ï[©ÝËg,ncÊݱí&ßççâûiÆ1™i¢›©&¨lº¼ó¢ÅË6’ ”fé½1f†…ÜýFpœ$U Ì·# â@ÝHd!]qŠ‘$ØM2¡¹¢åÓÇ›À5ÃÆ€š0xrQp`$zp[f'0$°†îD£cLqÃDÐa±æ<1³g ‹3ˆìÅ]ÃÉÑN¹Ù…Yö-!c†œ9iÝîSÙØèÇW:ßV̸ÉïãÊóD†§ ™Á’è}g®Ï–.B ’Õ«´"WI!&eöȹ µ&L9šB´Ö!ê´”J,Dìd‡ÂA“³áîè-ð°û›÷ݾo¯«¸tD=¬Óf²hX0„ª(„¶Š„†›p”س<7 ÆŠh©†€ .è (È ‹:k*‚ÒÙ@Yûa˜8%ŒŠäÑá§ãÉÉ$Œ*v.Üù|–â̧`†8 xÀ°²<û?¿ˆø ¤KQQ˜Íâ0Â%‚DD +î9¶û10‚ ¨ŠX2R#x2çêF©ÒÛ$ \3ÒjÀÔÐ:P܃MŒ)Da’]¶¬lC–7§jQÈÓ#’Ãaöé”á…å0ötÖ.À¦ž<õ u¶¯bRAÕcP¦82Ûƒ!èqC‡–%°z´÷—É-óóN³ì~ý¨-h—¾, «éÕõô„(}1úûÈSðǽ7!SJm†î[¢¦«d—B%E"’œ•‚bbQýÊ$ËQ#ú›IiÚ*[IL‘°q(ѰD!Ðr™ôyæuT±òLëK\áÄå^w[wCÕïBAxl£ýò’@|0~Â$\É$¹Ó–ÃåðpîÝ 1ððSÁÆ$ð |ùð&('¹üN[A‡*&IlIŽ]˹&vïgFžÏE9#»ËlS³Èï߉D¢Ã‚šxß¼’‹;<œö„.èdzF={ÛñæåMø¾0sTcBG|:´7cÑÚk¥¥‹v)à-<»4:1åˆpÇ–<6iЃ¹ÁOéýø=ÁúðÏÜ·™9˜gCáAƒÝƒÝŽXþ4J|à†y„#±w†Ï’ìÁÄ„Ùé§±Ï%³¡OO±Ž¼õÕ¦@Ïç³ù»~ßNÔdðlÕô¥vCù,6c–3>*‰E‡ƒ¹Mˆøcåwma Hö`ç’¸nòg¼–y#s’ŸD{i$”Äç>;+ݧ3â󪂉´ÎÑt5­kDH‹5n…Ÿ <0q¬…<0zч‚rÇ¢ìC_ Ê…IV¸önPîôðYðziÕ¢Ÿá7UýtÖÅIlÒ¥•EJ‹! @¥B@H„»õ¢tžŽ‡£ÏpÿP­P¢E€8`óÏ8šTÝÌ$’rÜÊY—!á¤Ã†ÂÓwd7aK¢0Ž=4Ð „˜€ªÙ‚x@ë °ÍÈ)f{³Ì·¦ƒ]uSSFÅîîÞàURšFÒ:P/Rp§à&ýš·9,Ån{o¼EwØ2}”Õð&»C'‘Ñ5¹y»ÓF‚Z#n‚»‡Ì¾I{”^² ^÷¥{¹^JòÜØ×3Î’Ö[oª|‘Öï1Õ¼½fu%+k\袮£ÇqÎê²Ôvýíå'Z¡Zœ…ÚjsÁÍG\ „ti|îû·çu¬š¦zú./hê4eÍ>å•^· jrqµ¼¯Bîvºt3Ü$_z×)©ÙXlWSž´÷½ˆ**Ýs‹›8ÉÊk&g…”®j“(è˼¢ÊlÑ%y=Ýš³½j~; uîø\è>Êð¸W–× :渒³}SŒnó VÖ÷ÝKZ×;¹U2å±ðáï„E¾hö¶»áæ·rv‘—\®ÚÓM9ÜÁoZF-Û4èã}d0ìoГt¨pIÙ FO ò±#ƒA]Ò*86@R“µ2ÈGbtP9!…|hÚiૼ³9vC¹Ò¢7“Õ ÑW½Ce!af±ºñ-ÝÁ„<€zª§*—Zvجl­ÙD¨¢÷•@@™¨&±÷2gyÎ Á7b( ؼ…܃”_S"@0$Ë›îØ;Û\µŽ1:YÜ'¤FÇ.;Tð'ÂV]b°¨36ƒŠ h§½DŒDm’0`í§D¥™5ŠÙÖj·ÐHÌÉÜŠ +±º@Thr$*b$Ê$= ’ÔÎë¿ðóóµ9àÑT<ï(Rtè"ò¬™ŽP“;S‚2åÐZË‹š½ÍHS,L¸[´áÁ“«)À$#As !ÑÚô„D³á@qL‘DpÓĈ"ðmƒ†n¹jeUWfö‹jã¦)4)…Ó8¦6iåÕd¬O]p”6§i ¡s|Z¨š ŒÂèàQ@Aì:fèõX&æ Þ½bsƒ„í:Ä›N‚ˆáY¦7{­±¸Lz ‘HR]{(ksPš¥xÇ•Pë<¸Ê¯zðotÃUtu7 Å­¨+ ÄLcºs3fÒÅA»®¡N¤H·»}®;-thɹu²3^/<ñòhTWŽì“£œwù B¢6üÊ.›ñŒ²å@Z>Ã#0õ4rƒ‡ìZE^ò±F]d/[öi8â+éŒAÓ‹A ¨„ÛM7ðtZ”Ò,O€ðO´sÇÙøß™–Ï¥GC’"`lNð$lx( †É) Å,\¢@aÕ¨/ØÂ†Y·\•Šv¬è› ΓM‡†Îè/Âã¹sŠ,se¯ÆËÃtÀXc…|7L0ŒúÀð "UùôOLjah—[‚Œ 5Œ– Óà`˜%Zì2)°Ýòà’ÿ±Á »HlZé¡În·wti·ìØmÖÕ»£ xb˜ÕÞäq˜«¿_´ÑQ!©$d;m!¦x`û>å`<[›  °HuñããUªŒˆæõFˆ‘jQd¥:u]D*t^·¨^ô¢±Eê’äI ]Ðȼ@‘hÅTÅ,ˆHŒ"^-E\@O]ŠÅÍîÔ»¸à/¼¦æ“ °ìpQ Âl—6s›,IÜ^ƒû¸‹}ÆŸ.ë8ÎôH?ChÚú>H‰ò8_]Ê8Ñúóy™gç>ÚAžî¢ÝhÉé:PÙÉöí?,zc‡ÁNXï°;•.šØõ.TšøUNw© fñ—%fªœX1apA±ÅîK_ePd¯\4SŠ @CÂC~ˆc"jË Ð°ÃÚ³†ÉrÅøG.ßñݸ¥­ë„Ý£‚-:¹3dà5Rå^é•ô3áÑ—¥¼t1€à±p`DCѬÁÓGN1ü•ÄCÃßEŽ(„~‡ÏOŒ> tå ûЂÑ"sÚ/ö(ñàóÏïþÉè&¦¸¥#´&ÏÄÒhUžüƒÆïÄ’ Aqº> _ú@œ{†>îå8`òYôY÷Ð…?S&@°ÊK6c=o‰$‰d,¹ÉLÂ9*µy¦yŸ²°†,wëbŘÂΓ0…Ó7~Ÿ/¢5=½¡ å”÷uiéôSìGßUynËÉ'E›‘£fÁ-ÆõíÎ*IR I¨žn—ÒˆR"”mŠ Ç)¡BÅËÆäÀì†bñÏF_+ÞlðúÒi.^dŒbDƒ 4QÜòì7xÞÇp΃p­¦]:óv6K˜IÔ¤¤Ùª“¼ª’Ki@ÎñØLˆ,ãt¬—`+@­eÒØrì춘(’’HH_w\HH >]ÀîÞù¾Wßݾ[ñ¼øHîþ7¶¯Ÿ~í]ößžÄ&íŸÞò7{1ëßæª¤òyp´Îá`;¼Œ8àœF€«!|f£á,A‚‚%hƒ'_±žÈƒôŠqóåuL€[…hL†22P),*N0€ú8<|Q†8b#1œA?À&kÐ%eŽãíá¿k 3B fp]àšÞp†ÈÆê‰#Œ*%¬SJKtá ±°pð)ç6}¿ný6üWíÕïžÀöîvíóçËŸ¥ó’RJ >}ÞÙ÷æÎ÷ºÚÆ”:1íÁM1çfS–=0rS WE´õê<Îuá²Ì§D9< ¡~9)•3F-H*Nˆ´]î3‰ãP”OòÙÎ*²x:¼äpnììê:…¯RrQD“0$ Ý~¹{ÀÌ &€µ¤’‚ª…³Ëp΄Èi¾£›ÉHrGf¢kgF:·³&ÁŒnk©‚’D’I˜ƒîûí5ü·ç[­÷ðhîGÝ ßÃÀ·»…­ÅÂÞ-¦¦ƒØÕ1¢è•d¤„)±‡GÓCßÚJylÓÝîÓv>ZiðGËäl‡ n–ËfØñlžFÔš=œióÈc7I– øª§F™‡RûÜ/~gXѰ5Ô 6Ò]=[zf¶³q+úö¥^ÕÒjj)Jm6–Y! Ya%)JI#0lÕc¢I€1¹ŸjôUIX õw–í!©E:±âaƬ§W³ìyt|9|Gfò˜G¢5fSåcF•؃ÃÙ¦æ’g™,HYw/‰Ê®\°‘iF„D›É0ÐHT¢e×¾Þ~¿Yÿ*k»“wº$!·3F==0y#3*¨–èÃùÞÅ4òÓéˆv6)áá¡ÃšzðÁé!މ×nçÆdÜÉË+#†#r qXè,[»C´lÇ,{°u:;ßÄ%øx(ycáƒÃ¦!„ݧ£“–Ï\èxâÒÓ©T`…ܹá…!ÙÚ4ôdzMX„ØÙ»×D(x{8³ nhÐ:Ðì÷yynÊîèêÓÜŽ†‡“»O†:±ÕŽHâ§f;·t#“fžšx;4ôqÞBYك˿wЯë~½ïÌIðQƒVíDÌ×xƒ:H@‹A ø!‡]ב{\à!³²Ä,(z«V»i»å¢zc÷ïlYÛ³ÂnìÀÛaY.wa¹Œ7!ÏQÙ†§ ÒIA–ذ冟V9Hjj½::™®&Oœ(ÈcL÷ "DÇóZnéø[PÍ•Ò0mé]§²ã^µ:€Öç¶gV…ngœäÔR\é·¶âëË£No”®ªÎøïz8¯j±•S­èÓ!³Mò¹Aê3·XÚœ´s*ÝÏ5ÉÏu¤‘e¸Ùm`dÏ6ñ“˜~Á¹¾a¤o•ÚN¡.mѧ8„z¶×7­ˆ~n—[J!ž9k/’]‡n<¶D=Ž â' »SÓë½½Ìl³®Ù¶ø²œÞšêÏœžëD±¨~¢*)Úû_ÆD "ݨÄxÃú©4ÞÓžBù‹<“»`it9^‡t¶( ¤Õ.áÙW7Á²e](‡7 o*˜#@†š½©û†¡;¸- ޹¸°Å¨§9¤É—2t^\ÅìÂaÏÛR(]®s£™‰}Œ û3) ÆídÔË»ä^dÝQFŽH˜ÉšèaH!Šš(¸ <5á¦QJ—ˉî[4–­ÂmΡhp‘šèVãFnÐ̹ •vŽpàà!ÃFq‹Žá†¢m<¸6†A¾Ñ§ 1C%P"@ÆëóCÝáaŒî „œDr˜YÚ»„º;œ–†šÑV€¹­ç”©òÔ‡,PÇr5Äh ‹*KÑeæt£Ž„p"0éÍ: Þ}‰{UyÍZV+{;œRˆ[µ6 ÀÀ¸„b<ÜË@^´ z ҥǖ»TÌXšžƒr± 1n+¨:›ƒ£é´Ð´„#7€ °€P£(þÕÜíÄΠКƒ3~y›xêÅvÜÎîvçhÈŒÎÎùž c<ÒÎV¡àò¸gLØë£2[yw]±|ªéšWQ3Ñ¡æLÖVn(ʈÔj(J»–·cpF9›AŒSZ¡„Uø·R£PaEŠT¥4ŠH4êc„³jа„rŠ >dE¹!¯P·Å8¥9|¨ ;ˆžd`H(å”]2Àà,"ÃfABJ˜pOSn[T+jòMõvÈH*ŽžŠü·*ƒø¡ê‹qQüp‰¤‡z!ªÖÕfæK·Vm‡C„6:bØ;dyL›œ¢˜38@*ÄÖ¶S•óë©PšIR¯Ý™™R¥)JfT«öººšieškúnvéÚ­c)£BRšc±d™”¦d™”¦šëïßáZîþ­u5Œ`DSRC‹ ™¬™$™šY¦™Ž¾ý¿K¿…îüþwç3I3$Í’R…5÷uÐÌÍM4ÓC6¯Íùí½$”¦–Yfc$’ME8.]xÎ\±"@c$c3)Lßn®¦fYe”£)M5’IJ›6fVV:ý¯×ï•Ç4Þ‘Ù"D‰ˆÅ"‘ŒoÌë,¥6›L²”“3MB„X±"AƒMöf¦ÛgBŒ! 4ÓI% RI~nä’HfZZIe¾o×õýv½uú{íjüYe)JüÝ·l4ÐÓM4²ÊSM)LÉ33$“M$“0Ì—^üþ?†ý¢Ö¼EÑc‘ Á馘“Lߺívškõ»]¥)JlÙ™™JfI!Jfº÷ð'믻¹R¦e)¦’„ši™JYd„„˜ÉÆ0bc$˜5~ô@ÓðN™%»kÏ|®¶µû+nRQQRQE%’ŠŠ-_7æþøîƒov;Ÿ-.€pÙð@ÓÀQêùÒÞú|Îï5¿ŽnD“IKg9y yÏ8@ fz:—°-@•Cˆfô&`ÔÅ–ïµbÕîëov+µE«Í®ÊÔåÆš8šøž¬†5ÅÚÙ@ÄMtùe¬'Ã(„cD¢X¬cì@¦0„HÑx¹Ò]¯&8(‹ ¶ÑHR’ðÌÍÓ³ 3uÛ° uº¢I$ŒbDéÃsIâÚ‹rQ««Q[°Ù·]]JW[®”®»„º]¦’i¤Ž§Hë®”£«·e(fRŽ»vI™ŒX° lÚçž ,. „Iu×BLÝ.Ì’Y›ñ—ff%–I%)Œ!$2F=Û=wLé³dµïzM¶vd‚=uÓM%úuÒ•êív”¥+®Ý†šHI R’Rši™™JI&`öüþ—îÝùüß¹´M`Ügî¢\.élëDñêؽÓ]<ÙÑÈi š:G}:kžäгñðH$! H>›!Ÿ,)Õ—«2ÎXû‘³êä,äÌoïÊÁå S5132„Ø _íðÀi´0H˜"IŸ2qè¡éˆºÛ}ásScqv†ûLeØÁŒˆÑé=+’,°`„”g[Vx—n §&Mv7RI,Ä~3òBQ©Œ0ÓD‚R íó ’ÆÆL™kKµRI.xzP4í.ìÞ÷¡i$„ŒŽO ôR%Û³B‹DºI0ÐTl¦kI›ʳ=Æ©fÃM$~7]$Ûý³*ýe¾þ¡ïðB{a‹ÝòÐíp¹r®Œc9îé­{Þýâ*c>ûpðÆà]™7¡T‹ˆÊùLûÞ8€ô€éµ2ÓéŽ {õEBæÍãWäë€lˆΙ½ û”ƒA†–øf¥¡}”ºrSTBô–[\‘à‰F¢lìi¹—–WÆÙnM4FZø÷ÒxW~|,!ºD»ËJ˜x—"¨øafX6 ÄþOÁw¢ÆA5dP2…£–à*üÈ«? ’vÚ#Ű1S±<9؆ý¿}÷kÛ^ùµK~oíèíü.TÀ˜B{›q¹©©$’I I->G€Fð=£»’ÀÙI$’ÁÓÀÁø3Á»ô[ qm ’I3 ‹;è»I%$tUx¶½ýò€°ßއ¼•4 v±ŒµLS§;EÐ’¢êô•³TÀ‘Ѫ{”Zr”4Â¥¥žŸƒˆJh(ŒŒçÇ´!Z† #ç §¼! V:8}BŠ¿^à”ѽ:“„@ˆÎ¨hÌYǵŠ0jŠ B Ó0DdP FÇuRÔ×½ äÛ“ŽP.ƒE—a³—Ð&䄦gÑ™¥Ú®K9Ltå˯.@ÎbJ}{A„"@9òΟPðÀ<‘Ã÷cটDa©¨½‚Éd¢ƒ-§œz4¾›iêŒü_·˜÷¾…‡yš•¹= ›¡khN»£Ú”)û¸‰hR¯‚fÐB¥ù=– ¢,€Yl&áÆ&™Ï"1aò<ŠÀ $¿vý7o>o¶õè»»b(Çoá¾aWlÙ²¡/Kç¬è ˜Øß£‡!B #èÕžMÝÇ}]´ÓVŠ$’I:,Ý0À"‡™„‚D$JÙã2’FZ¢Š("I&ºÃf¨:Æ4j¤v‚¤{›~wÏ€²À7·½íß›Ü=ÃâH!‡†9{´‡Åá[8’'wË–Çr9LŽ%’Æok7÷÷Ó]¾6÷ßþw²CHšÐÖ©Yõ­hšLls$l „„‰@¤\D™ˆÔÓ@ÈAà¡DT¿Â,ŽÀйâ1‹| û¹ßd¥ D„?¯è¬b(1«öß­k|ü]ZÝ÷í $¨,,éÀϧ3[I$—¡µ…!eðg2SXhòúl–c™Osa½Ñ»®ø Và9ã 4ØeËLêK)Ê–YfÚd$0]Õ¢¯p¦«’Ï¿¹ ðÙèðÓÉ ÚO›ñ݅кh_C@«üØÎßõ1ŒÐêM%KVR¢+[&¸¥…Æü5´7Z¦…δ4av4Òc«[žÅñ·óeRFÉO·´’I$ˆ¦Ì^M\p%ÕÌØŽŒWC`2íE` ºJŽÌ Øå§ìl<±±`¦ÌøãY(–Ìn@ïò΋{4öaÛ¦R{‡Ä!\°K§ÁÔtnSv>î_bà¯Ö2¬DÌÄ` ‘!Ä 1ð‚“l&#Â]¶z.Êl³Û²:Û«®»Ä(Q%hI*èÊ-ËLxäe±¿ä PŠ¤î¨ˆbdG¶áHˆ˜Œ{cO¢2F{±<â†ZBSÙŽÌŸ™g¹å¡ãBˆ=œ<¶tÞN‹9`òÇuãÔç·móYÑ´íÌ=DHó"LŸ|‘I8… „*äD ñÀ®þJWÐSÔÔ@!2Ün¼(SNÆ3ã[ßãÖžÖ¿¬ïË·ƒ"b&k3s[{¯\¥} |b-9‰x’Jˆ{P‡=`{&·ksvVž6†AÈ®ÛTx\h, .¢»ðÊBƒv»ØÊ ƒ„LHá™°IHó¼:XZQ`‹-0Ç—CÀ×2‰Aé/vC<ãhG,ظM8d T„àl/èÙ¢ P@&̹$Ó“[ Æø³`Á§p(ÆÉ6 ÈM4ù»;ìg@é¥ß¬!±f™§L(=¾À÷*GÃá¤ðAÓÞBž˜‡jš|-V¶÷ñßÍ{Ûœåja#9onëwdæÊÙA0 ¥ŒÈfÃÈÆ,9–dPÖi.. €QYp(VAYË0sÓ@Kšq¢.a|æI$’L¦MÉ¡08ŒY<¬’pÛw#$³Ëx¡À™œp ¤$‘‡ ` Ûx­ª:»©¶\,¡ÀG1Â[-†ŠpÀòÀ¦÷âëw§h]ºòÝ ÚÖ°ù)mcf=˜Ù€oÌ’k–yaLm¿ ɵÌ<’_P<œ;‡•‰ AàÁ°‘À >ÁÚÂJE-‰úúËOœÇ•|OÐ<,†)ºøK±ÕÈ…Jk¡ 9p¬Òe»ª`kN€ït”šÎ[b[…&²dŒn¢¹¦0À<4,¶)ßìà ŒiéØñ tÆÈåíiêÇ– tjƒL¦qRÿ=ŸÖ¹¤ÊÈw7l%öƉ´÷ëCÄ(L6i I„Ñ`JÐ0Qò§Øák@ÐQÔ{…7}nC*ç!—ÃEûí·Ú®¡©!l³ìåQøQ®ÂuôhÁCø6Xà`£8æO¥?Ÿ e°X€ËÖYCú8ãw³³CÓ$wuh{<–Nn—zçœõÞ{û[—Ÿ^ gΩ–œî ËЊ½š±qͼ€‡ÃÜoص«ˆ]“¡§{™º aâç 3NÅ[{»¬‰îÕ†ŠïÞºªµU¤¶W­ ‡.5í9'; ŽîÂgld]˜éçviÌßÑÒˆ>~é Æ“#Ñ„ ëA±gÏ7ÁË,Ü "eÃ…1ƒo›!r>ŸrI@|i!0^퇦ÆwaÓ±¾0C 6=ŸÅfõéw|Ÿv3ß¾ÝÍòÙÊ*ªÝÕ:FHÑG¸Å`·Bà(4î:¸"@@#÷*>ö <êÝ2æg8€u ÆSCŠýÐ:BcKÜQ±á¢o:ÆÃD™ô­cY% (]œÀ$-’IEœÁk¦ù±6fv¹èðßLnäÜÀ`±Ó7nðup{û’6a¥”nöoé—ìC¤Òd1‘8Îon õPõ™[«ö¶¡ieul¢A ?3¼½ïEþ‡ðäAAcÆ>¤•J`4dì~Ä:–Á±\ ˆV†Ëˆoލ”Y7]HCK„¾Ž0Œ†¼Ü7n`ã³7 £©ÆÁ¢LÔ.M4ÚÈqy¦D*Âb¤kÁˆ£H~†qâC½ÁÌ“™ä8ÃÈý8 !,†52z?Š.ÃËâˆÃÆÐ‡MŽ^Å 7ß6Àáoq-¿92ö|¤n><{À(FUUºÕOŸÈhÊHý!Kd~{ùòÂ` ›ÕºØ÷¸Ç„Êã"ïìÑ~ÙdUYBÌI±@8ÿ!D»¸ÃkŒ½îOhC—ÇfÕ›öz}Œ7HGYͤ¡žSjl7&ÎÎO 5ðBem®0ìølAŽÌðrÑ»’ÄÑ5Ü7s:ë·Zã>«Ñù’tñ¨HªIY…ʪ¢ (в€@ò^p¡®Š¶òÜ”·~ÝÒ“:S¾k#­šSaë\¡¿eP™(Ø^$ì,ˆ0r¼>š&­„(3&æK20?C®A>ÙÞÓw!|„¹j Ã&Z:æÒ‰EŽ8„0Øß4/ ¼Q XtK^ÁùÔ‘rÝÈŒ;‘ZVƒx"áí>t$’"!ÀŸ.þZCñ®ª¦’£bÝv…ªÅÛ>y’KrlÐQŽÝۅĸ)ó13úADˆú?†¸ëÀ þ¿h ÅœggË«ÓËÑ»NšjhS{u‹’ªðI*æ 'Ï¿^¾»õûz%öD'Û«ºë—o#ör2òü÷W¼÷½Ý{Þöó»º;˜Zó©B,xÌÍÂ+‡f4 ñã…Ç$ìaá‡-ùïÚZĶï‚íž,cÁØìôêÓÎ?,_®Â\=çÍ?s”ÄD¡ƒ0»»»BEfÎö¿­Ý]^㦌ÝîÆžÏÝÛ;>Xîε=uŸO8µc*¯¾šØ{4ìðöz{8)ìjý¸wvtiû³=€ïÏ[Úo[ßÛ6îÔ(κëZhæªö›ž†>ÿ§k’IégÓGÃGðþÃÀ <·ïµ9Ÿ¨¿jiõ÷8qWCw 8ˆ÷ˆØí¦Ww—,ðw5u}zñ±,Z­^Ÿs­´$Ýܧ—§wÖ„#éö·3­Ê¿3¶ó¾ox„™"(Þ-EER+ˆÇ€(lw ^°tM®¯§¾!žÝžÞ·žÆÇ  j¤ZSJšTY©X™T”kÅ¿çWëÿYJHI¬ÖU*šÓZfmiµ®»]L²Š¡ ‚´>V 5T,ªQbÕʵÊKjƶ×*·4¥k¦#R™i+KM&Ú)–Ù¦®–ÝI›Zçk$h›M±£5{Ý·¨ÒÛ6Zi¦,ªëµ®IP™fî·Z1¤icJêímWš­rB$EB¢ˆ–  @Â5n³UiZݺ¶«…™&ªiM¥RÕ¥²ÌÚZMifš3¶*SSSZ¦I­LÙ¥ 5³@Ò›3QM¥eI3s¶ªX³EFiE4¶êîÚÌɤÐåÙ›ѤÆÉ©”’flË ²Ê*Y³SfE‰2bHÅRF*(ØÊKV´ÙªÕ;­»-Öi´jÒ¶lÕe’Ô´ŠÆÙ-)´jYl¦›5‹I´³lÓm™´š•*Sm5›R•¢¬ÊÔ[ImJÔ«h¶¶›JÉ£m)´kXª¤ÛZ’Ò™6ª›i*Í’M ‚JSJ–ÔÕ+,M)[3a–جÖR–ÓKjR£%ŠI™5&–Ѥ±Š’%”ˆÌ¥¢ÑX6I6ƈ¦&¥™U- ±6)²Á‰2e¬‘LÔ¨)…Š¢©dŠJ*k&ÔBc6’Ñ¢Š¥–ØØ±+]wU­¹ü›62Ù­‚ÿj¨UЂÁqM0…ªÑD’YU]ÝÅ€;nã»–[«¹›»vf뻲USM5Em¥¤–´QBbØ]uîáe½·]unå+»ºÞ½å+ÝtzíÙ›«¸îᘣ×p¥fÇw—]u×wjîí×][nঠ’HI.¶½ói´´%Úß%måá %ŽîµD¥´$Vx¢ãccŒBÆÆ1ŠE)Zªh¢K  ’JPª‘RÈA`  ,‚Ô-[ÞfHKÕ×^½ë×»»WqÝÇmܪU ÝÜ’Gk¸Ie„–Ô¶¤½ª·]Úºººë¤„½nºi¦`¥¯{=àfff`:îë®»¸îàîI Wqîî»»¸íÜ‘ÕÝÝÝÜ’]Û·[»ÝÌÇ®º;®³ow)@Ù·«¹˜I.î™˜îæšêÝu×sfÝæ½à÷ÊÛã\1¶¥jÕ5«Uóà—ª»’>nà뫨íwuÜGm¯=æd„”¡.»„»¹›®º;]k­ v×]w]bÁƒUTR”¥QE¬K»l.ì6î=ÜAë¸]Àµz½îîíïocÝÂI%×] %í»&aJíÜ%îá :î’i¦Í…+«ç½òí­{i•vëÐÜ RIvݲGw%Ú»ºë®ë¤’Y`Kçs30—½ï[Uw$—EXXÝÝI`8# ”á0ŒÝÛ°ÓB”%ÝÀ»ºív»¸K»„»¹³dŽÝÇ]t óÞHw$ÞÛפ’=Û·uÐÌÝ×½àÛæ¼ž)#Û®»¸:ë®ÝÇÎædŽ®Ý]» 3,±Û®™½Ü{u×µïm¯m®ë¥–êö‘zô—]ZêÓMv×wvíÝÀ—[¹˜:»Z^µ¾j¼í5mwÏtÕÝÝn·WZëM¬ÚÊSjm@µ–²JP¬¬ ¬ÚÝwÝ×]v»€I¦ŽêêùW½Wªë®†nîK»vë»×nÝÜ$2^­Ü“0 vîîî¶»ŽîHKÛk]À¥4׺ë·p¥×nÂËmÜww]ÂI %Õ¾mïuó š^÷κ÷¯xfÞ­µ{Ý«»ºèîÝ»»ºë®ººë»»¸I¦†n·w]t¥wpu×BLÇw»Žºé›ºÝaJï^ó7¼–ß>eÚQÓºù$Ì7wjò÷’f=ÜÜ7¯|;çÁ#»v:¯ž½,²CM$ÓIzùñ´ÊÖÏŸ>mÜu×]Ýں뻎ë¦nî’îë»¶ÝÇ]ÝÝÝÍ5Ý·m×q×wuu3uw6lv»»µÚ®à›­|ß ¾kvÊU½æöù–[®àf;·ok®Uw K]×LÇwWsfÉ3%Û¹ „šÔÖ¤½Ýíåï{¸HR$”¯]u×wu×vì$ $zóÞ6Û»µÝÕÛ³7®æÓi˜íµÛkºº€÷]w]+l­°Ü$ÌlÛzªö×­ë3$Ì“M$$¥7[×È«r¾|ùÜ|ÝÂG»»¹ ï^½uµ×AÝÍMIwrGvíÝ·lwnÀ“30,°‘ë¸îKÕ×]ÜÌíµw3ww­{Þ÷wnäŽîJHi :î=ÛvÀÍîº=Úí^îI$€IJfkµÜÓGuÑÞøk|¦ï^ß7»€÷q×m»mÖõk ÞI#·]$—]ÝÝÞ½z÷ª÷™€HHÝÉz½ï —»]¡Jù|½zt3{wVî’ë¸îà;¸d’ïKÞîº;^Õïz»nÛµw$ÌÍÝÃY­ÖîI$€R»Þ÷¾mó-óç|÷’êîîÚ;¸HêîT©JA¸¢¢Q@QQPB¶Ä¨5)˜).ÚÝÝ]]I %ëÛoy³`;nà=ÜÌ$ÄK !ˆ( H¦1uT‚•¾'¯]Ü©QÚÝÀ Ƕî;·e–I¦’KÛÞð’K-íw É$u×@WnÊWnîÝÝwuwwww0 ”4Ð’GWp—ºèö«uu½W½Õ[]ÝÝîºõÜ»ƒæùbE)RšŒ²¯y˜ƒçpÓG|÷Jf=uu 4ÍÝt$$$’”Ì0’LÈ@QER4£e…QEQMp—u×w%×r]Ýïk{Év®å@ ª¶í¶¨ Äh(.å–SUMWwu·p‘ÝÞõïwr]×AÛ¹$ºë¡³d„»¸=×I{¹©©%(=^÷••»]Ý]ÁÛÚÚ^ÞÇuu×LÝuºÇ]ÁÝ]B@Ì3vî;ªÝV=¶¯[Þîv¦Íƒ®âI! BŠ) »ºªnÖÖʪZ(„Hîºfíۮ·p2@www55 W^Þ½¾W¯^Õ×]v»AÕÛ°$Ìvî*Kç½àm›n¯ZËÛÙ/w»„½Úízî=n® H÷rB]×]×IuÜ|ß6Ö·Åm®µ´®í|ø »Ž»›×¯Gk]Évë¦nîHîäŽîI/k¸i¤½»vff•|S×®ùí^Ô{¸íµ®ºHõÜ )AÝÉÍîÕÚ’õm«¸»†në¡ eƒ·w«»Þ½ïU×AÝ·l’@uò¾[¯ŸºèR»¸H[½[× I/u×uÑÝu×nÇw{¸öîî·[®îîíy½½†aJI!Jíºée€ë¸i¦a›ºèîîîîÝ™…©jîºíw)B@3%Û¹¦ºî*[Zîµµ[WKµrä•UUT¡KKQU$!²IwWS7]»Y­ëoox @ˆˆ°X"4,ß¿>¹)Žû«<"Bztwx¯ëX¦ÍCMÕWnw9ÞyrÎrƒ¢áÄt ôÖDÜâˆÓ=/Ó‰§ºÝÇRêÕVÖèêɰåê×X¨ì·][-õX$JθÑÇ‹âÄÌã:pÓ—n†åcXªÆ-¬LcÃ÷ŠúX¢*´ýÆå)wÑ‚iY©Me}ºï«“GÒ‚e«©EÝÙQ$AîªÉ;H×&˜š§&Egab¸¬8ˆ nð¾"G"—°2ŒÎ ±Á”{ €’`XÞΕœ*÷õ;D¡˜™ñu±QÓàÌ­¸Ì¥J` …åÎv©¶¶NÝ}`¯–(„€+ã^¶¶Ý¿”·köMúäÌæwBˆüéÏù €‚Ý?DQGŸ©øo'¬ûÏø’l'ñ(D÷Èz̓qŒ$’6ÛèU[”Ì ÿE¼Œ_’º¤ð5{ÙzƉCúWWüª±F S¾øä‰>’~ó9‚Áa .-W“’ç±ÝPö!Q$wëyUàÐCýNØ'ðèXîÂI$’ D§Œ“µØ(Q æKQ0z‡ôŸz946ÚÇÁss’æ…Åù,X ®¶I£rË3›¨{KÇ&>Ü„€n4voÀð`½ô=ÃÑ¡ ÉFš`L”¿i=cÀG ¡<ðÈî  PÿÂCŸFD‰@„AŽ<€úÛÄù‡ø™! "Æ R!š ¡Z²Ь\• $gÝWeQAS3ËÖêêºîº®èºl–CD …d–åÁ$…´5amÿ•®bÞ@n³ CFžhXbå‹D5µn×-Á(Í;ÑM¤B‚ꀡ¡¢Ê Š `QQhR¼äõ¹bÔÚº¥}Vï·'æû¬A*R‡RJÔÍ"UEÉ6 ¬I¶@(t4Ñp{ÞóÍ÷º&[ïÏz%{s6÷^ü_r ²B]˜ÒD»"ÁeµlÁ¶åêDEùºítZü7¯ÏÏùˆùÛþ*¯^qJø¼Û)RFªù¿ï¿!6›Sçó?}uÚ¢Š^l¬ŠÀ LZµ™§ÚmUWñ°~žôE´ Šo¤,Àa7ûˆø4qä‰Ï1òb4y‡¦fÆJ=Kãý[ZÆ3|kßòçO’ÒÙGÅ“àa‹ ³ØF˜ „"‘"™üë߀܉ñ ÀJ-PPA¢ 'õQ¡ˆ„ü©ÜDìoÄŸ3Øcþ¾_™ƒêp¼,žbbîI$“ÉÂ|áë…Ë—|0T* k%VŽ…\„Œ$ôUI$’Qìj^òIý´ú‚ˆcé bÄ„„%Á ™øÄ™òO"ƒ 2RVZ¿JWU¥´¶Ö–µqTÀoêJlÁ.Ü {pL×·õ¼½ïÜúø8¿?îÆ%æ-ŒyÈ2@ìP P IíUTiÁ÷œuî©]ÇI$’I'£…ÆÅ ƒØþÒQ^ƹˆ1I "mïìžùünà’ÿ'@„;‰$šR~G`Q42}Lç¹ÜM!¿§óý.ïÏäêþŸ×Ç>|I$’I$’H“öªîûkeý÷Ï”ßÒÒ¤ð*´U@ÁÐaÔÆ:™¹$“cbïq¼‚ˆà FáTÆãfsæYw$‡Ëm_o^–lÙ`KÕµÕQ9. ìb…|i'ت±ýhè<¡ìXBߨR5™5Ì’IÀqÅUS@·¼ž~É?Øí#˜ùXÐ1ƒE#KB±™šškJ5d¨¨¬U´m¥5L¬V‹R*B#ò.‹ÑªÂÌ AK%_-ÝÄL‘4¤Rši&d„™’R’fR„”¥)%–™™’I™¦ši! fdši™™˜õS§[uu-¥µÓudlCIK°‚1R€ý ,‰ÂUQL¤L’ĉAGiº[]muiÝ]ÌÝ[nîWW[wu]Ç'KSºî:ÕR]Ç[2mzêï3*–Ö–Õ5¥´ÖVm¦Úm+$ìîs5,ÔÔ˜¥wSu.®Ù›6fSJfe(M2ÊRÒ‚™³Y©¤Ì›JÌm-”Ë3Y¶JRa¥4Ó2I$”Á–š”›-3KÚm*S3M3SS ÌɲÓJS,Í›)%eJRM›$S†¥DR‰ÊU1–FJ¢B…ŠU!RaB`$¡.ˆÁ†Œm.‰5ß“Ónë«ý§5’ù±mÝuÝ]}Ýt/%WuTÚî™··©^õíuÕÕÝ%N¹,ݺ']w1bÆR—RRÊÄ–×f”ÅF¬QRié¯^®¯¶ÖºÚÓiµë×Sœ[L·WnN””I^¥%½íu®®ÎÆq¨Ì ´`Ö÷S’BALÙš¨›¦í]7.·â·¯W«º.«·[­ÛÛÓ+Ö÷Ddõ¼—^]n»Fº»®×uÝÒh’’‹¯^õîè·â½W^ùíw®§.\ºœ‹—®Êï""6éé]½×«9¿â¾_ÄéR2±~¥d£2¼Q«”-º4RиÔ3 U;s9%~.ë«^«ÛzÛÒ¹2ÅÕ×RWn¯]{Ⱥî‰ecM®Í®–&Ýv’ן÷T„!EQCL E‚Af A‡ãñ8È{)ü"§Ñ •vm”)íeù<ºûéOƒ¥=é~ðt686 AÞà™“u›ÆõÝÞx’¬+û€ûÄD@ƒ>dÎhª´7Ü,º¥Îe¤šI¼WÝü×Ý4GÃâÝîßìJ?úþ [¨‹#C¡ÄˆýÝòÿÙãĪªChÛWæBX€ ¬ –t„«®N·\[ä¶Ö½+/'Z¾R’¬²ªI+_‹>*¾føoÝ÷ÀH8CûÐa€?¦‚¦R È;tª`` ßí´#Àýþv€ýv̼¶¿¯ØTÁw‹ì#ùä/¾k¿:ùÝç=ºìCxùóÛ[í{ .ç8¹çÎÓÐpN@;pˆ!çnj°2ÑCp=¶ÙžÝýÐ{ãÀ©Øî‘¡u*‰ä-РQÕ ¬YN‹Ÿ_®‚{¤"Â$","Â!¥R}e?M|h`Èe–ΙÌ?€@Èò::¨Ö™÷ñàæ>½§Æ´EÜç¿#Ã|Á} ÷̰öÞÜ{5€qQÇàL¾÷'1å˜ü=±ä{*ùÞ‡ËùÁy×|jÉ<…ŒŠîcÛB3^É®Øè¾ò}§Ó%ÄíæÕ*a¹G’ÁdúDõÕ’Òà=–DXDë$ ÍUŸn×+mX¢­WQˆ"ž…©IB‰Ü° –„Š€HÈ h?ƾ1{I_¾tÄøá µ¾˜ÓóÇû—_žÑo0™õ«3K¾‹E†áNjüáKÃiNú05™< æ—˶ó8v,Ž÷ž©—µu ËÖrª«RþµƒÑah4É||!ùÆÇG¸fÖ­ú{Àz÷½ÝÞª»óß×üÏŸi&fd†fdšhh>ßÝ{ߺV­WkV¨ÓI ÂM4Ì’I$$0 $$’LÉ )@²É$“0I$$’I 4ÒI$$’I$$’”’I$’BM4 I$$’I$¥ $’I$’” $Ì$$ $$ $’@Ì’BI$Ì’I$ $’M4I$’@“2LÉ$’Ci´¥$’LÉ$3 $’I3$$Ì“0Ì $Ì$’I$’BI$’I3LÂC03$’C0$“2I$ ÌÀ„!$!$!$ž ©(s¿ ÔTƧóÞ§à5$’è.üSà˜1ÉTTW±S­óÒêê[ºê Ë«ºêÕµÊém&»]µóÝNÒ÷¯W®Gº"ëºíuÕú[_É_™­™±T}Ë]òûóñâ[‰©6i%ÚSr±Á…”BT ”“Š\fBSDsP«‰Dm…¶–…—®uÓ-'ZêÑ&ÙwFé]ݫ׵½µ‹¾êúÔ¤”iu•…(RáDH% ¹ÜŽ‚B3Bi˜Q‚¤°(Í)¬â!Œ„% R”¯Åz_*–®Ò‹j£P[S*êÚü|‹ç¹y«¸ú¥Ù!*Æîʆå`Ž0IvåÉÝÔ«WtDî¹Í—5y\¾êõʽÚóïÍ|Þ·[ºç"JJK]wKµÓJì®·MeÕú~¸ I(ŒÀ @-pûí!0«aVˆâ-DUF@`³vVÀR—&‡RhÀb)™­4ÛKwâù]ÒW]Óñ¹ƒIÃý™ý>ÇÆŸyˆ«"Î?!_îÛ"-K~¯å4óp8Q=Ú 2?€!ä(þàȈ‰üǾÿª›ù ö¦|”’ÞuÏÏŸu|4TÆ&¶3™­Qp¬kíÀx›”5'¸@@õ‰ïyžòCBP#GÐ ›úN(”N‡sàòW©äôäÍ®Q$¿«Þó·Ž(9OP*! LÀ áýï›êõÛô-O"À  þE»šÈr~'ÔÐÜ]ÀlWk—vTw“0%߬ï×× ]ÚûN€Yö88 ¸=SÀx¶Ù$ø›8úSƒÑýŽ8ÜÜ}΃ØöøüÄúº‚ÍŒÐwždÈdžÁG±Üwè–‰!Ü¢å€ð&‡‚®p.¡±üÀð} Ÿ&¼ý#0XÉÙP>#!Ü=z’K™<Ÿ&šlUh%V O!rǾ_ÜýÒ„©‘’˜2 ¥‰ HQE$‡àGÔ?eöùò#N¹7kº»ó¹œ“Eêî’»W.“Zë]·´ÓM^Þ‡í|FìÄ(¢‚ª¤¨Pðxl0`6½z§Úû_Ëß‹~:JùôH ÒÏz÷âû_>EÝÑQ{^®õ{K¥uÝ¿]Ùé_zêJù]Û»u¹×n™.ëªíÖ'pUT„ —–ƒXÌ$$ •ÊÉ•ûîO¸øãíÊ­¬)jY;6åÏÁSè’T…Ul| Ü£ÈH^ 4qzäí;˜@¿Ã;SÄŸz(OÌ<³b}:ÎPšˆ{y¥€ˆ }Œ'D$A¸Ào¾¬øKÄLhßy?#¸äà€œtжÜAî~§EÃ(DÁä½îƒÝøŠ‘~µ§ìD¥I_»w_Ó7ºdÆõi BŠ "ÓmÙeS½Q8pYaüìK±È^L10DƒSADÁºíÖYX»^—\ô¯]Þß=Ò¸ A²Id.UŸŽtBI&k5 •,T©\l°ƒT’)±µ†É…ªîÝöêK+]Vꥴ«+´ÑA)¼BÒš)`ñ{’(Õ’~|Ìò„bµß>m]ÍÊ…\Üv–¡TB¥Â–'ãfp‡â”)eI3%"Z ý¢ÄDQãÐ}ãBÏyeà }ÍÛƒÏc·£Ï¢åŒÆlZW“_<¡BR®4ÚÊnÖ¹j«úÕ«÷¢­·Õ«WŪ¾«UˆAF3¨)Œ#*ª,Z (ß-m¨Qê=KÕ)`A$%… äplzOÈÙähÉØ|g>¬~¶Þjærì|Ìà÷¦ðÞ˜¨RþÂü]—.·çä!Øê¤ö<÷(4oâ#}˜ @Æ$Ø×O%Õöw‰7ÞI$³cÀüØ¢@Îp?Þ/`¸£ÉÜ81‰9„7¹B¸‘<p%ª%ª'˜&½äáý"H=ª‘¨ Pf‚Φp=ŽÁ÷@A JYABUDO\žÖ¤¥æY[Ôó%­¬ÔÚɵš+½ï½·Qhˆ£¢ˆ1%©óúg$†@ª¨  ˆi &Á„„$è…Ö–»¯zêUûêUòÙê•].”Mó¢½O/z×§£v[Ú½ºòêùÓÛÞÅ{Ýz»¥ÕÕÉH©+¶²·6×Ï7u<Ýs¯v]»fBáMQLQtPYT0Љ…D°Þô]»¦¦Ô»£Nùy9)PYTPÕ ±ÐÃNQ¢9 #r/´ó¸¦¯.®ºžãý¿ñ¾[ HHd*, Ò×ÏÔý'>\\ÍÂÅÌýÄCð>åõÐÕÕ½ëí¨†ÄDèy€D È?‘##è[EFD‚ z1g¬øcP¢ûH]ûòL5}Îdàìïîþ>vUð(‡ÈôŸ1»'p˜óÀQÏcÏÕ¹œ’B~âÏæcXßÛý»üìï¿@>Õ¶¿„ª­µÞŸÔ¿Â(’¼Ü¿¥»®²ÝHïv¤Õ´ZÛÍ£vÚÝu›uršéDFë§Fæ.ÝÒî‰vºÑ3oózíyI]uv®×8]Ñ]nº‰+­Û¬nÝѧp»®ÒéMKušÜ•ÝåÛÞ›­]W—Sµ•ºÞ¢XÐ$61øzúõûÿSà,~ÂPõ÷?š8Ó“žxæOï5ñϼùCÞ~·&P,Ñè>ežÎ’}Çì1Ð?8]ÙäêY£Ûî%£OÔ£î4zŽ€€¢…‚à¹Ðœñùð€{ÇäÜð{±ÉGs®‚’MDܳgPev?¼èv<‹Øèî“¡É¿›° c@ÁG“£ÁA ¡M³&㡸ÌÈÕPZ([篵ÝzzŸbC(Å@Í6?þ”m;Ûw%œ€1wíÝ_«uïIEÑjíêô¥rå,`@J ‚ Lqøÿúˇ~Þ`¤ƒ £è£Mö7ŽÛŸ?`°ÄIa©òÑ߉$û ñ7=‰¶ÛI$’I䪓äy¢¢jвšBŽAúŸx(›œ• T ¤ˆ1,Ù·íu·[ªý÷øKmkü×%„îÔq¹û‰çš0v! ÙØÎ)¨ŠM{ºíkUM_ã^º»o]åÖ»²WªíÛ=Ç"ënº»·Q¢·+‘N»™f³e·ª\Š/N¥]ÛÛÌÕË×UÚ×wbU2-UIP$!C$Xmúþ_CßWÝW1kÞßr³é%^¥ÃÁù(×;pCrØ Þ×àáw#QxWCáO¨BÐ#dƒjBžÃÓò'Éèø”Q“&KŸI¸:ž“9øŸ¾ H ì>#ëΰt; ‰ä\!B$¯´³éXª*Ì_ä Dö HzÒUNÄûJph`í Ÿ“€%Ç!ÅÛö®ÒÕEåíàâJ«šë$”ˆd àù“¹ÉcŠ“õØôy:êÇAbÇr«¹Ð{œ›šÁÔ"¦àj@1ãâë÷þ@€„¿‡ëûª…^òx ‘C‘„?(È¢À<ÃZÿFoËiú=g­iþYoo@IIÆÅýO0Î0H@€HQ‘ªh{iøíòW½òê/2›Ir%¯›ªf·ezÝ»QWWtÛ„¡h¢ˆB*YmF£¢ZÕuíuÕÝ×wD]uÕÝÒWTD¸,"¡Ê ‚~ö“XÌ,­òòõow[^è’‰JŠŠ£}Ë    ŠP£éB7íÖºêëNËu«ºJ.Úî’… ÝÛÜŒÁ›$"ÒPD€Ñå©'Þ÷­ÅmwY–ívëv0Q`ÄK0d'BTqJ˜ïR¯mÝu¿ÚîªõÕέ·R ¤‚ (ª5¶ `‘Ú¥IP²Ž¦ë­É¶ì興­ÙZüÔ¤…ŒƒY’\#"Gøý×îôTNazLÇ@¼(è¾ÞåÝwYRë%¸Î™î…œ&sZÛ3ðïé‘õ *4@h $ ˆè“¢nÇ5C›ÏDP~kšç2ÝT©.þkú¯ö¯ÓôûwµúïÔùð’NÓìhøÑ@kZ)’NÁ Ýý ¬‰ÈÝn,»*¨ªƒD¢BªšDE;®ªî—q•ÝyË×»zQzÛºëªP!d !Ö¨B0…”z캢‚Ú¸E ¥ÀnÈBBÖÛ¶€j¤§\’«Û[ÛÖë;e±›µÓJäKº.IL³vìÍɲëJÊõ^ô•êîº}=׮軺ó½×Mq.š.»7IJî®”jŠÕ T(¢0h%Ò @nÓ&¬¯{ÑgÍñ—«^íïoM Ô»(e@Ý–5D„(+‚÷ºõ^·½.WZåȽÚëB„…ÕÁ4%Ù!„܆ׅ‚Ø5E ÖÅÂ[m¶ÆÙ „aTâ’„‰ë]tÑ.èºî‹å½{Ñw®Rád!Æ‚€Œª$JÐìç9©öÞ·VêvæšyΖé¤Òj@ˆy{ýÅ«÷Ó7îӊ׸ñÔæ/ˆù2o¹&ï_‹q¥±ýþÂNà=Á¯bw7*Ä’OPõŸpµ Ní2ûà³¢¿CÒnQÁ®» rljld °‹Q4Cb¼ÕŽÛIFÀh^± 4ï%·ÛGE~§<’~äAf<}홪[¢š¢€ª0ÛÀ»d$ ‚±R•‚Ý£åk5¬n½ÒRQ».”°Q4XÑatÛT˜(¤  ˜m¡|㽺õïo3¥=-»¢"ëuÔEëº.½¹çN»_>_ëØõïž»wI]wEÝÒkçjëEéD}~’{Fs$‘TD[ZŸìßë¾Úþ¯Ÿ@I%)´ÚI¦$„†Óhš€–Y¦†šf´ÚIe€R„ŽÛ’¦1ùR}Æ@ìAûÈ#ö'DÕÔYVútêyÝ¿©Áq@þ¡$Ž1õ,`رòcÉØO†Bê—}î'“"^ü›‘|Á$“ƒBÖô~e­þõ¼ºˆÍ m¿“C⨓$€JŠ”@V¶œR‰uk;µµYßá×M›)@Ì¥fË,e”L’fff6³1š›)I$RŒÌÓ­™*f *`l4²5+)!˜ ’”Ëfši¤„Œ¤²ÂM¥M” À°Hi´)CfÀ³Y¦šlÆf²ÐÓLɬڛ3*m0 -”Ìf2¤…™™&Í”¦e–¦d˜)I$¥33,³fÉ$“3SR”̲Í4 44ГM3$’TÌ)J“f¦™&`i¡¦’YfÍ•5Ši3,ie),ÔÙ²šX¦¦Še¤¦3ÓLÉ333)I3SLÊY¥¤š™„”¥fR™²½×K䯔åóº"%J®«ºë+yÕï^N^·tD¥]L,K¢F顃‰p¤*%D„¨¦‚”À]bŨLQ(pö¦jozJëu]­ukt´é듲ޫ®¤¢ét®«º)"Íš®ÜºkL×uÚ\ÝMÝœº·Šç^õܹ9wn³®N%4-HS!e¥‰m—MÆ{×RQu’\¦ë“rJøõ^¾z%]Ú¯fÐQ²2×R©ÈH2èÀýqAQ Aíˆá‹Ê´l˜±ª+móåªÌ0ʆ¥©6³ Ì£-)ëíõü¾žÞÞŸáKL[ZâÕë|LmŒã\.&áä©ùÑôâ¹ø8¢D}ŒTBB@}§´ÁjŸ°€*Q°ü^·çÈòžÇì¾ÆRøòô ÔbžƒlÆ ¼‡´öö-Q%¾Ë.5EQHýÄ?ÌüÊ@WSÅ‹ô¡GÝØ'ð)>Ƨoà§¢ü– è¡JÇr…ðK¢Q™º"#꺪©¢¿ÏéX ¿£ôO윂öÛKËÕás£ÈŠ zõ$ cÀì3’{°UlU3%­€DAJ#*æOc~U Muƒ‹Šœ‰Ã‡’ªI$“±OúØ*aßPR^òI$ŸÞy¤²\•ÉUGF‡b€AÄ€wµø–t=ÿo¶¯¶M‚¬=aÇçQ> ßÑ h¿ôªM‘MAåF½+·X¤ºº]%þZë{Ñvr+-ë’õŸ{_=]×mÕÕ2‰H‚€¨6 TFÂ%A¥{º^ºK–%)zäÞõu]W«©*êIi5·7¦šÝ­uLµ|²ÕÏJM%“bÿoøÞôšMX“_‹»~~{5»ºª LˆT0X¼Šò+@š=šl›1`4„ƒAd lB!Æ0ú»Wž©é]jn\ÍWv.¥·"J/×õ¾^ø¾·"~+”ì·Ëné×$®é4•×:æçþ+åÞ¯sE.‰ a6]…É€ÈdH kp „Njá…¥LŒ‘8¼¾[áëÚêÒµÖ½{§¢êT]ú ¸&/h…"¢”«†QBDm_ž^•ËÛºõ²å_,ši¦½nï•w2žœÌ‘YY¾otW2åÜ£sf•vʧuòî‹«{ž¥Ù4¥»{ñ»Ñ~>2Üàlh»#’ÓB Ô4­5µË圯˜©®ÕÝQk¶[DEévmåºWm•Ïv7¦÷^Ù^²–¹_/[©[Eo]I]ºlºÝ²ö½×ië×S,êë™»±MÕvôɘÍ^ô]wJ‘2ߟÓä­]Z—¯’\ˆÅÖÙÉ©jí«ºR×Ëë5 cF\8Ä–ƒP’ik°ü5*~d,ç×û@=‚µI$îlîK’÷í9H0Ù7„ˆø”|A³¡ð!BnyŸ5õí*¿¤ŸÆþ—￾Ú3‹q3úBŒ§iÁÞˆvŠýçãíàÿ#.M‹lg<VG¹{êöí'ss€4ĉÈ(‰D””'Üè-bBð ûÀ¶ÆB€*‹- ,#B¬)»}W»:÷J»]f–+«ø.óŽEòׯT›w'­:;UÌ´¤`FpÁÁ…RË &(/!.è¡‚î§®¯iYëuó[Ý|²ÝJž¶ë’Quó½ë“¥WºïuABJ Bï…BBöýó‹îž,BD£¹øŸ¸öæI ¢0QÒ¶Ð Poíû?Jß®¯í§CA@`äø ÐNyÉù‰“`=`ˆô>âÁL‘Ç0rFâvHÁNó¼ò &’Ï~HAð!æQG§Öí\Ô–_I^·uÒäöæn^®íúÂþ/ùm‹d : qH¥Ñ”G¸³ü%ì·Ëî%1.ÞëK¨ºœ’‰væî’¯ÓMzÕî—Í^Ýè­AdJˆ‘¦†0cm1Üö~úª­½ÉŒÂC&˜°ó?€¿Ààø¦Å{Ãò> ë^£é™4ãsªÞr$!Ôü ðP7ü ׬Ÿ"ªII$ì[‰ :(Æ6*½g‘µ”U†‚€ D.*¸»„… $H1-P²‚( ÀÞյבueëÉn¯K¼¹=7L„  ¢â¨=çÏßï7ÝM„6º$.D„†Ц"PGr‹o"ínë­»«ª¾{Ô¥»W¥`ïJ%ítÒäD•Õ 4µRT),26â7¨FQY Š °qRb-Œh!*¤ƒ“AWƒL{ÏaEÖÂdCB„ ¡ eC°\ýÎo'°.ÿx•_CÜ]äà´´ä0ç´£ þ_íïõ#•óúÑ+÷]Ò•vŸ¶òä]×]:.D·uöEëuÔ»£uÝnº‹µ§K7]%sÝ׭ݾVyåÔëuÚMKw]g"Mº¤½0˜ùêëåºÅD²¤««ºSl”²±¸¾[<‹×UÕ]WtÍ’žâw\Üî¼õÃ-Û¬]uE¦ê”¶6ÝwFÍÝurºåÛµÑh»uÔ]nèºíïëÜë+u¥Ýk®M]!ONÝüö·˜ºÆˆ >b¨sÐЪ‰yŠ)EsE_¿öÓ883`(‚þ½”)ø¾ÈvB "8û"‚zÆþQÀPYM¬6º©EbI.¨©¬bcÙ3p˜ÊX8“Z < PÛm™T– ¢Ír`F¡ØB°G<®%»A€«sÀëUmVåk´TµxŒ!0DÔZPr†MØÈn«ÌªzŽ&Aš§õSTX§ô½SÂàpØÙ.Û¢ igñ2]8¤çðäØóÌyﲬiÑäu1I@¨øÌÅTï,y«óÆ)ÍèñœZ«‚ZÉVö $§|Z‰ lUH®pD|†+8àê©Kn‘¸¢€N¡4ÓïªûDuü—Ù+-~mø˜#Ð} r@÷ËöCèò²`"— ‡×ãâT´=~¢vŸcò>8!Ç»''teY6TmµKMmV+Z$ Ddï²l~ (ù€‚‡ ûqȃó<Ë Œ‰bz Øí€þb‰Ò FææNŠ(„Ìf¿”™OÎ’—MÍþH22lNá´»­í–Ébõ»¤¦Ý®³JÝM)S*îÎÆî¹;[©Õº•_¾ÙmÍäI]µÝvÙu,Nõµ¦ÚëjÆ-[6’¿*Sø?êÿÃØÿWúÝ!Ì2)P_ÙX“ül쿾¥RÿLÃ]¬u’å ê ÂŒ¯.!𙽩ø«ÙišÞ"bl)! @ÛN%й°BVd Òr)Œë.h®IÚleû‡ú³ýÿÁtËýSü^þäÿÇþÓ² åJ 3?éGkVÿédÖs¤-Ƴ¬íÿÈ´‘ÛÈäò”}Íïjôê-ÞL’A©ç©·  ò‰Hü#2JsØàŠäs;Vå.Aäko²®3Šæº;³êmŽí‰ì"§3Yf>õzŠü,»[ˆÞ·rêš¹BnšœŽÐš ´%Ùh½¡ë‰{˹¥ +¸Iw¯/G-jK¾Të›Ùìg-’ÑžYô’DõRê–õueÜíZts'3oH3™l”&\±²k::†#Y="º¯-`n¥3ÁÒ˜ß ydolÅÎÅôFóÞ•·KDùÛÆl«¬Ç"¹®Žìú›c¼×9ÝrSºÞ¤¯P3}TdÔÖtY)Mç“j›*¶+çs}MÛó¦yÙõnŠ”®.V.9M*Ê‘O\Å6ÛÞúå ØØt6%Wwû^ äD>‚`Ö¬ô¬1ê!­ñEí^Ë0ÿªsaø¹®6»à Èí½ndð8 ÁB)µ78»¦ žÖôVŒÐYÖk'aö ä7¢© :6ˆR@-(¬–¡L-ÍD²Ó_:}ëíŸ |z÷3_Ƴ‘Þªå ß 0Û’qzÿЋ³ƒ@s‘Æ .qΤɽc¢Å˜@²rI°Ä¶ \™$9£ÿàÀ s@¥ÂÅÃPˆOúÙ7*€û‡«»:Q¬Ö}ðvð …,2e}E|ˆª»ªé¿õ„C,Cº… $$iıW"¥»n´á¤a.c*Tƒ® æÛºSx¾z瓟”D$Q?]ÝÏ—îG¢(áèÚ‘ƒeX&Õ9õ^Þ¾vÃ"ÞohŤ%˜§#{{[„ñ^sŒßŒÄ´-æõ)b]5e^p†+ë»×Îyñý ~\áèÔÜô5›ä3zòUÉcÐ ˜%Oî[Q®—ëé×·WÚëÂÝ}k|qÆÂbdÇ{e,w46|ò›ux’P\‡6“áÿdÿ¨lÈÓ€yÐ…S³¡ÃíÆ¹$«Ü»¼<9lò~ÜI;vÃT“}6dáõògç›âÑß[ÍæØ!öE^òÏ"FâP Å$8 ŒŸÃù¸ƒ kA^‰ùoÖoV«Ü½\.×L.ìØå§§—:Û»i{ýþ@Q ¶s.‚)¹ "E¨ÝS§ì#ñè§VN›èBlÓÓ‡³ß´’nøtË 1醲Úè7…2µá¤ŒÉÚØ£ »¸{wVEf¶ûWUœ–-b]ðøu|7neðø{½ßˆN»HxÂã8ÞˆæðC¸î5¢ëTó¼áÍš*¢:µmrîÞ!í:½Ý]ŽÎ—Œ’Zo(Š?áø|±’öóãKô”ÐÈ—mÓ[[—§‡FšznhÁéÞÌÝÝ鳨ÕËÃÃOqCÀ®Í‡&µ5xftc  „ c˜ŒGŒÎ4{¸{½1îÑîî—ù„7„–eï·5}v·0—­4’­“6·‚jnÞ;;;'OþggQ±xÎ à ²"&ưãhOß*O>Pru¶ Þ_‘三á"á÷y&bg)}™|,»ù ¶ÜoäÞjDáЦ=Þ^ÏNíŽ:a¡Fšq×=Ù¥³ ¾kI41¥¦S†Z9{7pòtô÷lñ–nùx,ô÷xoÏ QÓ¿>*J©Oøù|tpq;zýÄ«°˜jîà8Œ‘ôƒ'LžgOì?gŽž}‡G“Ô´Â…7{0Äÿ/¸ö?‚û( `Ò°é€9¿^¼÷Ñ·¿’2xf ©`ŽC .Ï£sWz„4.û;çëÍ´¢¬^øœ<–zzv4=€rÃûw8°{¯ûuÜvRçû©ú8½¹¯[öß«~¿xr“š NVª¥Yœ¯Çß¹}%ŽkÚ[íyöJv¶iêv÷B[ýàåðycãÕêõ>"ÞÃïÉîžÌ2Åý§®ÿE`£yþñRqŒ€1$¡;J"ÓäÅÒ‹˜ª¬QD JƒÚh‰¢@C– g®o(s6H“a€(–CQ,EÃω!Zh{²5dŠªg!X,¥eØHBÕ¥“hZÄjXÒ6ªåÁª¬n3Ú: pÀ Á ÿs;þ"RcBfI8óçî-÷šÂJ•:8.Â/±'ÿzsòÿS±'ý|<ºÄ‡wÚîxzuó’;ùO¿ßŸi9«^ØF2Um—Uœ1¹†$ÉtqÁÏÛ¸‡C±CÞÕb ­V ÉÃû–tðOïÚù•RªØ_Y”AÙý›>®BuæBnpõøOŽþo‡2‰F|÷?P4w‚H ƒJ@oÀ~´ÿ¯×ãÁ«®Â~ßÃýpà/p:ñ¸ßt>Lœ¡¬|?ßïóû›ôWøù”ù#‰4!Lª¢ªQ™]"~Áøº4îòü>nïžÖÞ›Ñëò’~Þp_Ìîãó¯Õ×”_b7ß·¶+RU«3Peª™V»ñ¡ ©—GHI Yò{<¾Ï»w/×Výá_Ä}\÷Ñ(äü”Ëþ#Ç¡ï‘ö¸Ý)-J>ÞÿÊIÿ`Á ×ÀúGä¢Éؾy720 ± Av…ÌCZ…Ëzm×ÎæämÏ\¢ÔL2(Ù·}úõošHŸß]øÙ­ê6‚QP¦i?òÛeLøÝªDñ¶[îœ( €*‹ H  ‡× U³Ö?Ud`RF@H×ÅC½º²¥ËýöÞD‚ D] :=Єªªh’¥zþÐpD¾H"É$މ-a\–@·xä?eý›´;Ç,Ó¦=Œ}?ܽ zAÕMCØyÃp§Œª‡HwŸ»aPú°og¼cÀ©ô;£†`Mp¸µ=í‚ÞH}™¸HCÎv]$`KªpßÚI;!ÐÀ”ÿá`Óßaxé—Ï]8 <þM'ä $Œ¸[T¨{èΛp‘˹脌ŠHHÉéèÅq~ùóùo¯ÈÂzН¼« ‰Ø`ôõ2{Ë#‚ž`Xîߊ8[¡ˆ€&l?j¢^›#1±¾Î‰Þ øш’—‡ü d~‚žn¥Œ}›‚ÁŽWÊ}WGWã$@O‚_7éu÷Ï·­mÔW^é•OKmͲ2º›Ô°Ìd$ø•²’Nl!þì"hýG€öÿ€WÌêèÉaC4ÁŠ÷hXwîýÑî@ƒÞ¾Ã‡èîoFd„$w=lýç2¼‹EBÕI%`o Ô‚‘’¡ŠoœàüOhHÅ$hj™bM¢”ÅQXÖÆŒ1’Ŷ*12Œ•’ňÑXÆÄÁ61mBQQb6 4A‹Ñe5%²ØÄh¶‘-•Ì´$ŠFššF!XI‘¨š@FFÀ†’2 @Ò„˜ ÄÊ@A˜…!“&ŠجĘș‘B4d™ŒŠC ’) †@0Èc0DDÊ&€@ÌdBˆ É’™µ`«RU¬¥T©iU–T¶¥²ª”¶MªV[0Ú²•©)ZU0––––KjM´¥Ye¥¶”¦ÛjVm[&Ò›[iM¥MJ¦¶ÊÚ[IZ+YR¥³V²mmDÍl¤¥i[Kf‰h¶1,±EE‰6ŠSˆÕ£FKÉFÕ1 Œ…©,F£‰„”hµ±FК*4FÄI¢ hÖf*SP“#”Z,Uƒd€PÁj©!î\ûhÂC¨´2q0ì!iú>@Ü÷@íç¦gÄÒ‰y¢I÷¹“iŒè–.b.ÑÌ$“@t@3ŠD5w`ꛡÄ]ÑP¶ó$„ ˜4À’ÕL„•*”Þ€±²'ìù:¸ÏËS½Àöž vÐr¿ÜBÎÿˆ‚A,*, ´=n>‡Ü@êr‡_Bùüüu5 |ÞO°~KÝù‹"HõP*Ê~©ânœ k$#¹`Nº{ ÑO¨ãýÊ&ˆòHvþ ?`Æ‚h'´~Ã9~ŸCçÏ>¦¡û~Ög[‘„*Q¿‘õwpúÉ2ù@B|õ>j9>ü®ä` ÉÓïò9x&À‚z…~ût‹g¡+ìAä÷ ¾âšGâÄ‘ìõÄ;ùNÒÂ"‡¥(ý„ËíK£c÷6¶€vªð!܈W|I;Ž_ÍOá«Ê!À×öüÍwV.‡hBýŒ8Á„¨{Ã'ã‡1ñ ny_Ù°/â4¿!ýÁ ~¡=ßÖ0:ô~`üC¿Ö[Ç“ÛÆQç!`0>ÓjJ"ư»O¨ 1©÷ò÷w0 ü­Gq ýÑ0*n>Øsð{5ì'ôØ7 z;¶ $$FAIƒTY‰X£cV-dÑZ6Å«üUsldÚ£k3E“Qµ£FØØµÑj1·ë.[ØÖ…+hˆÔ[TV¼«¥\¶åXÚÑ‹mcl–¿Ÿ]ªRÅk%³6ÌŠÔj‚­¿Ê¯ÖʲÐ$ ,/Æühö)èCc›ã¼8Š–* Ô&mëÔ;ÈÀ¯zëEE§‹„OO³ü«g˜ŒŸ#ö0¥‡éwùàÓÉ@§• ,€+ðŒMœØØ:ü?£“ú)2vATdä"A€K¸ÄNåHì>ÏÐ|{¡ts$ÈDhŠ’IGÌpÛÞ' á¾=Ãa~ywÐåÔ$ æ(!# dsc懻9½KUë0L¹p) šj‚+‚ÒF®îCØV10SŠ…]ÈU‘ "A¡ˆGbgBa `Jfd$$"Â( ”Ó§r$A–ƒpjE¡Ž ‘HUD Ptë/C9h ÔvÆ/,ÛlY—° (¢€Øt¨žASîøŸgï~Ôôö ?weN;¡ÚìaôÅ*ùžp®A]~žß-~Ž`ü¡îÙ²ôƒð 'çO {¾ „whY„9°)v'‰TŽ`‡.(0$H ècøû_¼~ßH5hÈ'ü“þ¸®4ôþ¯ö´ è\«ûìzõ>ko ÚûÃßTù¦ u;ܬÜî75.§¨þá R}Pö^ }H%D‘ŸÇÞ¯Ð|•ô Þ4?^gòÌ­ñéëŽÍÊ?~6½ŽºsÄ-åÑ.™þ‡±ƒ×ï¾ QÝCËŸv—.‡“º+¯ÅSù? $‡xôøƒë„.È–Û¢¥2É}[_Ïáûÿ»¤¸~uùsþ=ÿ’¬ÏöãV³&¢þŸÍîÐdî¿ÏS«;¢Qk­í5;Ø¿àû-µqé•&xe•ì£U¡^Z50ÔIDË(rëÃX|Ér9ÇAh÷HÌY×ɾw;ïX¡7Ý¿XçG³ßws]ÉËvùÌçzn'JMµ5¥‹ë®w–mZK£ë¶-D½d÷™GÑ­¥ªÜßtCA“(š]Ɍۧ7l…ÃGjâ‰kKZ<î®S»ÔJò·‘#I¸Ö¯fŒ'dîÉnÊ ¦—WÌA¯*žxYR#%5¶­ËrHÏDçdš aÍÒÜØ-ž²ŒÅ\ظ7Îç¼ë&û·ë¨ö›îîk¹9nß9œïMÄè·qËÊ&ö.{{n‰dÖ{=ÌW!ß§‚‘œñîГ•—Lå:WÒ›yxT|î;c&–÷¡ ]Xç í3ؤ#%6WsXað?°{(ø0x+¾îÿ>ëOQ󑉥Ң^Þ‡—~ ¶ž®Ì€Ÿ¯G~¾}¾Ñ33…PÐnðäWQf@}cý7wï!òܳËÙí£>Ç.­?c//ONÊýFÝÏ䈃¢.,dz>Eñ! ˜(ñøl}„t£Çú+Ä¢ƒ3ù—ùÝa±ww ­ÓÓveåÖ‰'cWwg‘ÇŒ0£§wňMߣG Ÿ‡o¼¯Ÿžýü°¢c¹'ºfŽû(ñÂã:c»MݬCGfî.Æ®­Þþ 'oõ|ðSó®n"®©`€çQ¾hI#'á³õi%ôtéÃÇágð~ÂÏÃ_?"ckõ#Ïn)Ö´® 4Àg:ânôìîw.öwwy{:=Ç4u6r/ˆÅá§xÈT!¦GsjPLˆNFd ¼#1§Ã¨þNý„¦‡Äÿ†¨ ÿ ¡.?gÃá °ÇƒÓúð ¯'?~{]úbkFm¯®uÖJ·rïgW†Î¯bž Þž[Ï0…ììòòÝåßS·P¦X§¢õrIR¼MÞ2糽ٻ߼$$ÔäØ{ºÝÛ:<¼¼9Ûë“ãgÞœçðp÷[ÎXŠhç'0†•… Œ™@禞ï//o'-:½s$œ¼‡4Èí§l>c˜ˆ"€\Çä1 à8¿ã‘çgvÍY ß]õµ­{ë?núx|³vx|¼9.nötxÃ#ߟ:w]¨¹1â¼H_éA³ñn 4+tE-(t4Sâ’£»5¥Þï»æ,`g59bÑ ‘ ¬ §'Æâ(J0k kú}L­hð))5 ªÖXMÚ÷:Tk[{¿F›üýc õw~çæ=ÊF€ «˜€Ô[ˆµ@JªT."ªÔDÿWÕÆ/†°„ˆÎêwºZ †Ðj$Þ±Þ ˆÝ)¨…ÀbǦ ˆK¢¢Ù5¢MRbj ˆ];ð«–šNªÞ¥ªÉmIk)m©5j’Ö¥5]*ù+kÄ@2 €+ › ÄIT˜hA1 ‘$Èȹ(¤(ˆ°€¼øÿ¦À&b€o‹Ä¨25T \A*UÜ}?O÷¤{G°ä<½ÇD=˜{½ÿ|ú]ü¸ßÓ¼í µ—œìo“oõµú<{˜`Ó£“âååêîåÿÔþχ§§òï «Ý¿¾I*¿5=­çI¡[xÇôöÎjÑ5·"Ün´û;ý¤³õ÷Œ0øÿ'ú>èáã;Ê(óÁ ÓÃË–ïv;»=<=1ûo¶Ó~jþ§ê¯ö>![îm(‹[¶Ûàðx>Ž>íYÙåî÷îïg/n<Š5lðü©ãÖ—ÏU­å¯ƒ-{4Wͼ³‡Ëã†^>.ήχ˻‡ü2ðö}§—îßåd €6(OßðSÚ!»‡aôŸð)˜üb€`×ÝñìÆ®|±% —:.lT*–-@Dºš7Ž´%@_QÚä¹d n[c÷”;œä©Á¶w(ÅîÜTÜ ´Â#ÄÑÇP)R“ £-Îc¨¨J¶%HÊ…i£•ð>XØIÜ‘6'Ä,FÔ‚'sýmT´î™= 2cý¥úAC°o:!ô¿Û¯ÇðB?Ëöýÿ«þïß‘DP”Puª d¼³¢MD)ˆÇÑÆÃÞM«Ó$®§W«oÍìwx)!Ñáý–Â>æž$'O¸Bèú ä?ŸôASý!ë {^j†UURoí I$¾“q•´½8=ä ÿßÔZî$rÏ御üÏæzÅjq檨©ÐøŽ|_ö­~sj5øÍªæe‹nWoÑÕ<‚K ?ôXþ¥ÿ†FCÎäBiA!7-™ESEUœ‰Î$gªyNWë}Aý‚cvFH„´xVò˜•I;hÏ{Ýün÷Ï—yDÎ\îûw¡[Ö½/Ú›ä½/•÷ç½ï]åw9tªÑš-„«Æ%YœЙ4cðåÞ´hàCÎC.ÌÝzTK\ ߉ f?Ïøû~¿¾?_â õùC¿ùFkðsRI yºFþI_Ù¸uÑ 4דÝÚè1.A¿ªVb†u9Ño7[uTž5<½´U ÓO5vh”¨•«+C|éh¶µ›n7ÝLow©¢·‡ëfA2F„]ÇH+òµ’m7qÚ›†æ¡õO`ô²ÔÁ8ÐY#Qzs®bÎò‡ YtG¡Í:‹Óe ¹¬ÄÏlíWg͇֩r3Í©Bt¯"YtRgÝ™ëd¨ê­Žˆ(«Ö‘ë9HÜß"Hä +xôI¤©æb›=ª– –X(Ûª.Ò˜Ñ6¨œÞÊÐß™Z.-fã[Ád7Ýêh­áúÙ›DRîÆ‰øÜ*Ûâ²AÓ…[à¸zÊ\[=j90sw–áõùÎõq²ä˜FX¢J‹³‘;ÖøÌ̬Á]þE¹cCð£Ü=È yéª$ŸZß|kÉû²Â¹Ãš´*¹^øÆ1îø0Øvv}ŸO‡gú{HNœ¼¼¼6âI/f CXDc]—LJ¥ä/E|væÁÑ™Làˆ©ZV )Û9Ì4JL‰Íf„.A‘hbñÇ <µ§j*ꚢQÙ¹»Ã—‡mYÙÙ§»†Ã ús{îÜúÒ‰‡­õ>dÑóP‡M^å@‡M< ÞÃÃÙÝÝîKvãlh{°*ž­M1µS£_Ç"úDý$—ÃõÉ$Èðø~>2løXcëîkó+yÚÐ&Ff$øÓc§‡§“§W—.]Î^XËÂu¼7†Ãlˆob±ZÁ c[S™~?‡[Q2¦Ç ƒfojTE=KO‡Ãú?GNÏÂ…ÐCìøC>žeK>ŸÑÁu÷íâ™_‹é—3W Ä„+M½4åÑÕéÝéáñ³±OU$”FØg¯9 Aq¬fÈïâ³ÎɈx º j¦ÑET¢î’Ç~[îÝY³·'kØ£µ‡Tqv0 ¯­¾x ˆ% Qôð}ªgÓãÄ!ì÷êð”ÓÔ*¬Í­ETžÍ˜òþ‰³—ë»ÁÓÓç¸>t<ŸˆØ'Ùür%²  ±úóöû}~·ÇÚŠ£9Îs%¯|û} £öunü޳õŒãïˆÆ±ò>±œk ‹¸ûvS\åO:‘á"ZÝ´&¾yŸ;âo(|:|5âQôõ”Ÿ ~ŒŸOg§»ÇŽÔUI×rYú„6zvÖþÃö(Æçotëï>²£2a„ïC³83'R¹¸•£áü/ö`Zû0Ñðùvw8Òœ»›:>]Û;±ìd>ãà¼ùÝõ{çÇ’òHî³ ŽCÄ‘P*ù¡¢†Ë(pQB&"`¢áKIHuu©$ÝÙåÝáåãHCÂvòÃËO—Ã˳ÝÑé»Ù»çC£Ü}}b* ·ñ¿m·÷ô•صå«M;ë=˜ÇFï³£ìèúÒC*æÚuwurêìÿú´Ÿç»\²Q3LÚѬ£G¢¥a$ QTSq I"â#Eâ[ÎZíÓ-XÑ«;ç½òîß#'¢b\ ]™ªÁË XUQX„&h7Y²ÍñlY×RÍMöêóH„ºDÿúè]¢L «­Š¡©WÅêdµwº×Iïzü¾<¯žé¾÷>_5÷7{¨šO—W6Ù /+ï­«¯un1¦”¨ÔR–ùÖë]›˜¥rÇMó窼7»vØØØÚ-' ñ« Œc ‹ …µjÜX.HYFÔ$kÖl…¡“Gú4;œ¼´Ø¯$ ÆŠ õßÿÌÿíÿ¥v,>T‚”ˆŸ?ôy±Ðcð¤02®UO£?ÿ°5'X,2^ö®¢&È‘I%’Ê"l‰D²m«öö~o_î1­÷G‡o&*ùÍÕÜZ ¹¯E…]ëMàÊæbÅŠ˜+0¼ã ŒØ4öXÓ‹Ø&‚.°MG€¸@Fæ(**MT»Á‡0j©º’óB‡!ÛQtŽICìœD A3HR=¿¥WuUg,p- ¦‡òbÚ½ ÐGº,Ø f ´\îw.Â"PAÐ#!a6nYý^ÑΧªªš‰qMŒ.|D$‘0HL Å"ËpŽì¤"ˆ¦„J Ìw€T¢,‚¢‘* "ID&%PHh8ü !4nXÁ4§)£ “@Rj!üUÈäðì©Tt²¨#5UUxð²Î…ë €Q„»» .îªã¢ ¥¸¾h ÁD ¥Ê(×$—£Œ{NGH—N׬ÄíݬKLYi†T¬a—àîdÿ4Ak"n7¼7uD¹5Nκÿž®Ç]ŽÇ¤þÎþ&eNK2STkþ êAj$àà‡Æ¡%'j•JdŠD^I%Ì)‰ŠÓ‹­?+aA"˜DÔqGÎ>2ˆÝ×èK#¨™Ä–æ 5WBްÈiC¢¯Ê?®Ù®5û~}¯ù{°äôü£óÓu\–¡–s+,lÄ×kÁ'¹*Þ‹ygÏLžx•¨Nιf&Y¶¬Ù£+1õ¦¦£P-·× \BÞs®iÃG7·ã–fÙû4WyËÛÍgäïh»8z$âŸexÅÆ’Adœí9M­¦Bîdñš¾q\´Çâ‰^öb›m‰^vj5llƒ%¼¡F`[ÆzOt諸–*ÐÎiæ—›Ù« zR[žç7¢åä–WÀßcj%,5õó“tdâé%nMO+Á ‰IO y³–&…WœÅ*gQÞoP«Æ}ç5 œ˜%UÚ“kŒ|› ¤…Ff\0u;½p„¨W|mÃF×{ã–fáû4WyËÛÍgäïh»8z$âŸexļ“AdeVøED•AJmÞš§!´ˆ8U©©4xŽ@n6Yë'os¥96Rˆó­oH|,§_:uML6²9’)áÙiÍšå÷ Êj­¯GŸ2°úýX‡¦zætL;Qj\Rg%“üe &QBcC¹xá —X$3ˆB„™¡>Þ h6„ÚAÉzY›ë9”G^ÂYxÄ–æ S2AT'­Àa•0a#  ± îšSQ9ÄA%u £â,¡wF@€ƒâñ Fmï_Ò  @‚e‰Ç[ ‰mïà8y§2‚鵤ЖB6ö²Žž^¿Tl»¼Hg R{·!—ÃvìÝùüJ~¯û?w®ð„ty{7«sùOxç$Îd7›pâ#ql#ðý›?‡èáü?gœÛI&8âAõO‡ÃÆÎc_™òa¨ª¦ÝC~OÓhL6xâ»HnîÝé.ÏMŒ¼¼;pÂ9Çš""S 5Ér%uÌü#š%%‹¸²‰zë6ÎŽ?Ëõ¶Óôþ±øpáôÑãf¼#B ±Xæ6¿7Ä1¾äévA^H¥q $fªª›®óÁà£ø…’‚ÇáàsâC4¬?…ŸÑø{â)ð#áßžê4=½ý ¬Ô˜&Š©01¼9l&7ãx× f ˆˆÌÏCŽãÚ˜q¿0…révsßVŠ4tÇ|õ×o10æÂ‹¼¾ÏšÒcìÉãú)ëA1øPü~@’xnØñ|ÑU;:7x{<¼:¼ê·Çn(½W…àÞ$Ö•ÁKI£‚Þ@Ö;ŽŽâ17Ô!^2CgჇ³gC«åÙéï£ ñ9﯅ìüòaAÓ·wz5Ÿ ³ö8}ž> hðÇÄÒ„8ø{ççÕCíð/3ïvU»p\ƒKƒ‡˜”•5ft»æ/dDXŒs1çŽãgGO‡/–ïg»þÔA}óðøÚ¼öõç¿6™/)f,ìÞÂÒ‚/’ËϲQâÓIÑNð ’gà‡fžÏ'¹Ós/[5^Ưчùµý¡7%µyrÙè4g‘78¦ÔJ“‡ÑéO×øî/ºÿ®‰´QJS-ºkáÚ:[žÝ7Ï<Õk1˜™žjqÅýÍ9ß~oÍbÖÛhrnü=‡Ä)ÿ]>L¿`_7LTá·àìþc¹ìô()šñö$œAŠjƒðIß‚¥þ#e˜¢­«¤©,–H9¹ ¡4`˜1ÀÅ“¿näüƒû”Q EUôï²?̦üÉ#$C@Ðt`(»¡Ðòr$ˆÂ ŒŒ‹!c3Y›chÖK¢È Œb1ŠÈÑl5²²ÖKÌ2À(Hñe\”D*¡TDè’mPJ9V۹̻D2'Îók!B‚S–à|àúµT¡ ” ’I3¦†·9ly„ˆÍ‡j ƒV™rrDam$†|[.X…J;µ8œF’¨‰¨"í‚ÕÄAnø8<6‹@˜–¶ÒÖ’UƒÖ¼HÞ!õðeÆÝÖ‘ .„á¹sú(‚»*³Q¿=øÎ.ëÏS6î¹kµ²+êéó,š}<Ûãš$"}MºÒ>iøìkð›jhIçw/Þ2åk”NÚÏ"2—¾¾´sÒ“åÒŽïhÓ5Øn_z³Ò«ÕÏ:Ä«¢¾ž¸|Š×&éz…“s5‡—ÎäèÐ?9 ­œw‘bNÉZÅ:¿tÄp¹ZŒ¤VÓ™j&[spÕ©êï¨ñOJp«Ò—S•Ø]•é*tWpÄ;.Ѥ³ÖÕ»L{æ·hV½Ô”Ç/RÜ cc‡¾wdÜmž‹†ªZM'K±sĩӟI5S9›çYR÷ÂïÏ$È·ÂnÊ+„áË­Håq 5»¾hÞÆÆÕŒÊ{£TϼÏX•vZÉ÷gØ­rn—¨Y73Xy|îNóºÙÇy$앬S©en,BišeÖxœÝ3¥jµ¶“*ZŽrs[ÞôÊÚÝRs–MÙ4–Ü.»ÝæU¹6ìå2ûîu¾wm¸GUw~ÏÇÏÇåöÀø:5 ¤àý¾ƒK²:Êà»Z˜†—sÙþ æ!I!"@&žKöø{¸×O2AÞ)1µÑj^Bûízˆ· ”m #Ìo$@â ¼ C˜Ñ¥„a ‹þQ7'S2º,1AkÊ̈aíÕ¢\5tˆ\F£O– Ä•›)”µ)d‰ €bò Q@&5I´@6uiÙ7¼ÐØ6¤†hFó0{ÒiE/Š.Ù,œA[éÅ E  ZP’J¡1cRË9Þ­Îü"`€Àw‚­ô¤wˆÍôØH“:…µÌBàU;ëß+-Ò-Ë‹˜l[µâ 7,QÕ×1*<ë|!Ì]"¥¢¬*x&Ö…i§Üo "ÀÄ]a¡rŽ ¥\Vâ RóHµ¦…ؘî©Ç%\»7äd®w(7ù‰FñÆk,äΙ|9«%Ë–K7·³µÇÆ!¹ ‚“½FNƒW¬2 K‰KÝÐ @À¸Þ`Ö3p T&Ð4ô6°È¤„CpÝ´—ôúoнö,èhkN²6)Ô,bÕŽ‹® ¢FÅdØhÔ:+]ÌQÖ…P²äx &†€˜ï27q2ëBdMÒ„4@ÆÒs{¦æ­ €Aô8„`c—‘±À€lY ä{†ñPÙ¸R´|§eD‚ѳÁ` ‡að8Pd ! û)gõž©Qnʰ¤] ÿXàL¹ÆpØhR.ÐCˆð3º2,xä߬†Ä-lšlÈd`Øß@p`9›†§qKgl6Ý#Ež#È7‘LìhZµ/Ï€À·0—òVÍÉÄÉGóöüW­ÙcåmKíޛꮌCìÉ´ºÉÚòÅÝÇ.M*þ¸…@! Ú\à(J’$‹o ’T…'ƒa!‹8‚Iç4J&€Ê eV'…P\™¬ÌLJˆÆÅHÐKkk`L‰ ¼ö€*`ή:Y.Ìñ0Œb H+ÒønœI–J'³ £È”ÁQ…³Ñæáú¨òçr§>˜b©û LA ©®óp×£[Qiy xbáÍ`SV)€P~Oºý°ˆAK´°}±ê ¦µ¥ 0”{LÔòµ ˜ùçÈõ ú |CTª@µúO^6å“e9¤4}(ž ~†Ê¡Pì‰OC 2cL5™ ÿ¸ÎS =qq;aà –Á urWBwK±Ô  vrK%s)•œKÄÊQO ”ÞɦCÈÀl©O}‹‚32@ß䛇÷é%UPB$›d¦Äà[6=ºâÃqÉ£â°=‚@Ý„`g  ®°’‡l9B•ÓHÆš[‘i°M˜<R‹:¥vl»÷÷úyû>rþ|m¬dÖÆKÆÛTªÇÇçiý®«§wg—è|èb‡Þ½(•=Ò*wTË:i§–±ç^qZÊ´Ì–­¬xUµ± õ)»ðgä‡Ñ§èåÙÛHCWíßÿ‡——3‡ôèúßüþÿàOù¿ø»ãêp¼ïï#Ûêûz=¸ó¾™5ŒÖv *cm¤ÜǼ÷>—Üôròôyz<½‰ë÷ïrÊ´›½?Ééÿ£1Ú¡Ew;îCó7y¡ò‡êý…€SñHAìŤ~Ãïaú¡õý ÓöGv™Å§>\øÇ§ˆ¥tòíz¡«ÖÔÙÝ<ÌT-(¹ ôAêRÚÉd‘±b™?‡Ö§§îö>¯Ýîú;?wòöeÞ^¡ ìïíw{ŸÞÃìS§Õâø¾‡þˆ› |†õb üßú…?î`'âH{P0óû¤’}Ü/qýüâT`Š7AÑ6¨¼8ó÷gÉxZÞž7ôîEÉËÈVËŠxNe¸£û“¡;±NìV¡QJªU%7ôyx|>^›¾Oѯ™ ×¹ äÚˆ» zúCÕ³¾0ì;˜k ‚ CæÆå„ù4}Ÿ?ÌŸôדö¸ xˆ@}ÞžãÄ/ŸÇÜ}Ÿ¿ËDªÍ ÜCŠ!@ŒŽà5!$Áø?…3vîÃ<’Qãø;wGîw{ÏOËÝAú¾"?3á‹ú¡¤Š‘Ië÷²‡)í'â-!ú¸ú9è;Ÿw×R™ ÓJ)’¿ø$I>aO] USTv?ð¨W9ßÁñÈ B©G³d7ù|œ¼¯õ*n0éQ¯ýïÔøüYáMXÄÈÿ5((õåD!„òМ‰ìPù’ÚCÍö‹öîwF&Hn‰]ŸÌýáœw€þâ0ˆ&à(¡‡l‡ðÚQéˆÄ˜6Ó.—H1&I.]´ÝЄý!”‰ 7Ã0%¥LÈËâö×ðßËuwËàËm°jXÕUœ “'&ÊP¤>ïvc¶^Oh°qû¾1Àþeøô oé²$!"I<ý>¢ËÀ¾Ìf½;Üñš.·d@‘’D‘~ÙÖ¯8¼m”Íãøo¹±Èƒ ’På 'ôtT1ÏaÏ‚{!ü$‘&DºÑJ¢¢'ä‚!>&¢È!$›E*†Ñâ%훘o ²ð ˆÉ¾ù«šf¶ÑvÎø™7ú‰ÜRÆÃÚ r ¼Â?ÃB÷+wö; qe¥ôôÀ,=ZDºþº)÷D/û ¦HjÝ-îîøôòЃð†éÿºÔýòç^ãØC×òúp|:~oqyb%¿Ã”*Äîø ~þLÞ†€À{ÂO(‚HT)g@b÷þß)iÛå'åot„õ!^§`RŒt½°îJ%ëHÓZJ%ÕË ª¯Âð |åá ·Ûëí»»6#ŒàŽ …]âî|L$ Cð~"÷!Øã{LjT?+P}8ylþ7 ÷Üî}}ŸIúƒÉí¨ŸÝýÍø’OÄ]ÐÝ¿I±Ã…?R‡Â\À‘$y+ÃC@~÷°˜‘‡­æÔ äOù2TÉ܃{ã(ä΋²ª›\EÈJËÊŠfÐpÊ U¨C\e„µØTØH¬O©iZÛ¤žN¡=Ð,ZîI+ÁP§LUBH(B’+Ù ¬Pë¦Xk’Òp£B1 ‹B½óý‰»ÇXéAgË¥å3ýOdLÅD‡Ýl†‹lÔÄ  åKi >·ÏÄ7âú‹F)R²0@†­2‚Éܪ‡XF"¡´¶…‚ j¢T„ &ßµ=—",*jÔJR |B¢£b+RÈ{Rfv&S™Â>¡ßX~è~/#вXŸñ™2‚5è_$}Mº Ô?W*¬‘~jj,ñ‰C+9«™ê„Ȉ©¨µN- †P€’P!$Û¶ˆpìÜ—k®½u\44Û§½Ýœ×Fÿ›ÑY ZˆÝŽ—Œ8›uš…P•N-V‰H )°™¦‚a°›3*¨¤‚0@95ŒŒ”&âX MC¡/fvƒÿXÉÕo™$ 9 7@lÁ(`€} 6€èÁ^ t’HBT¨ÕUJåvçÿç®÷ï|ך(¯´.¯ØHHHKa7)øÐžÄSW{wlÀul9ƒ„?P‡«Þp`y#éB¶.,?œÕÅù­ù·yý\˜"fy|¹BšÂK; ¤)l|·¾ÍÃ}GˆòºcŶþ¾ž¹ØëÏb\ NT†‡B„2.Ó¡ ǜņϵñPмŒFœæ ¾@jű*ênºe5+Wf(á1°ž´ )Ö·†‚±A XNÈ@€p@wä-¦CP±hd¸`t2€wK=)A{§ö B²–¿ycªâüÞölrÂBZ‰RŠÃ„,iε ½jÜGŒd´Ì ‡%õÍXl €=½pq[óЅþÔæòÇm^ˆ`bÈÜÜmlÏõøÐa@†Kû¤R$ë̲‰.å—v§BÜ1%wvÂè•vàv~ëQƒ:§öV»‡æÇÍ´6ƒ÷´wxžzõ_ÎÆ1rƒ‹Ø²B®bái{Â÷½£›3÷øý”=#áÓxÉ'Ùé͵DX?0P‚}Q‰är4™þçèì@$Ycí¿·žë.ý6w½“6ü9~òHÔ¨U}ìÂÿd9tn…ŸÅ }¿9 n‡)ätñ¿é ÍÇõ~CãÐ=Á³ú+Ç®=!Ðc·ÕÙDÞÃîÜõè¸Ýëë×»¸ªôjí;î³­'¤5Š= $Ü?éúý”#ý;ïžâ óûóË4aÙ /ö)×Þ]_œY‚ÑóaGDåTâÛP Im¯¡¡Ó€Ù?ÕüÄØf}C¡ã¹$rcøB¥—E‘—uE‰‘„zƒüv„«J¯ì©ä GÆ=«¦á{^íµ]K߈ÈG"ÒXUT0¤ UTY‘êDzâÁHvÁÒƒý /fh-•­:\º IƒLìM̃|b–$a HÁóùx¸U¬•o  ‡ðmûws›‰\®hÜ1 Ô„j!Q ê%ˆ±.¿½ƒï z!´%oiÂñ€ ,—²Êìσ÷Ó³“Ðýßo«Â1Œ=À^”< üÃÖPxÊ ["‘©(…!M‚èsòœ ü‡ÆÄäíöÐ_ÁúÞ¤¨„¯^·ÅzL«Jc/93x™ÁyÜ`ƒòEï(v~D,ígè ‡>MÈ¢˜aÛõì§O÷MŽ€}ê•×jFqCqß!roU7ÅÕ<â‚ÂÁL¨£Ñxf @©˜º±"VÓ¥JƤ @„óŸk>ðÛéd &Û«¾â1I @„4=Æ£Xx©!"H‚b—67!ûŽÆ’MÂõyywF,îˆ&3 æ«3i5˜¢Å2Í)Ó–á+wL*»•tæCˆLBA´Ó®…å„&¢)„š´p)͉¥u5"‚˜ˆ± «—.bà%7T„#J [–1Ôu6&éЗu0EŧËj]\ºÌ»»-/5/L¨¡ª6“.T¨†&‰š’¢PHB±n‘€¦ÌB¶ C4 KN\BJÝÓ ®æê&CˆLBBâ&Ð!º†šJU è2Å\ nÅÜÅ ؆JåÌÄ[ Mа€”eD Ä[h$\Ä S$0bªÄÊâ*긤አ´®œ©r¢"Áˆ.VYLÿ»t3–BE‘‘‘dy(7 `-˜äÁ‘éÛó´¼ý¬MÔåÑ6#qkа³ùg0Ž1TÎ/•ã4ƒFPa¦CH UÔÊ@4wŽH¨7Žû$‰¢ÀÉÑ×­ZJé5g„*ÌY‚BsàV €ì9 KkÚ@ëÖÒFJü† `=4mf±é4ðHÆž=лr Qž½Bª¬IV¯,>ß‹øoöDåC܇QÎ$’H”’£‘â;|¿°pa}Èî§ähʦp!‡ôî´›øwKœ5ýêêçÒ’û Ÿç8’„à # ¨þãíbðžT’IH ’, »<#f¿ Ñ@|‚$`¢ä'q!a@žÇá›–Õ×ä“þ{V²Œ˜úPö_²`bFßDßµwÝéÕïÝoxGô¹Gò‰ÝþºX.D1˜$KŸg\%ÿÊH—,q?OÔ„åô'î>Déì§>ü‡×ø;Ñ= ü© ýA¤C‰åEõB¤«²åvîr½mw/uÍåÒsÞÝÍÜå~€w‚õÎ %¾×F_؇¥:' SÅݧØ~ci Â$Œþw+¥´ÜíÅ‘d$‡Z²ms¦»íÐYB ÕgyÁÀÇÚ5#$‹ È’ ¸$ÌMuÀœbÊÏ ç²ð!æ\¸H2B(Pl eű E^)zу¹Ù޶*‰xªáKJm6¯K^x”`#q>³Y¤L“©Ö[ÞQí 6ÜrnHh Ä§r*b7äf]D¥15!RÀD¡ô£ô9M=ãJeù^*¡$©$¦¤©*¡Tqåîzµ™Z£ # íú„4½ä‰¨Ð ÃÞØz@莉²jŸ::¦—Lq6íGåñÄL©‹lØòðx0ö@ªQÄI›6)•ÕTÚkDÝ8a eÕHÆ'X± 6¢ˆY.F]H•iUæM ÈkÎ.‡?^rÓÄ×uØT„4XÁMÊ—*é± <㘈?Ãx‹ß ‘I ÏDάJŠD•I‰óÂS£[ô÷[ ç÷µyCnFò$ƒ4ö$'è§*‚öúiðI6èjîÁí¸UÉŒjˆtb´]‚ÇêløCóCº&q!îWýgãÚöü!öç84ÎÚ¯ùá~'Qj«ø7ÿYÀ†ZI1í@J#ãÑóçZ33Ðè/dÀ h¹‘° ‰ÜBÄ«?AàdH몒10·»ÏËå {²þg€b–—ö?àæ 7ƒ @ƳEMhD:ª P +i«Ì䃽k5}v3cÇc’Oárá\¸] 84€mú23±àÿ°e$’Ý‹¨F€Î6Sßf„äGŒ€|r ~Áç~¢ô§¯_!½‡Éʆˆƒ÷ŒOàÇgá=?b0 IÀp«Iâ_€:KOÀzõôq$jwâ›ûQPóLçã;7z†¼¤ ®+oÁ×ï"@Þž3+õ1“™£=€laüM6`@@O¸! ¸h@m÷{®‹§ö CÈó„ÔSfÂ$Ù[6øñîKÈB0Ô|aOÃŒtUT­=’Ôr~^@þp$Ä9ϳëñDö<°h~Ènh>„ú C¢áÀ ,ûÇCâ=P‚òϳ>@ÃAû¨C À!`ø±ûûœËøpHHú{ÎPÃüI3ÚÓüûˆ@ƒù|tl2®Jê$^†øÀ`¯µáöß j³@5ÞI£ädCGO;Oɧü„Á´ÕÑðÜ?qÂaãïâÕnßÖý1ÞôI¨ÜÈË݇ª"„©©‚X;þßÁð”ccö?ºgûïVyýBê5`jŽPÖÈò\Û8†§Ön®ÌLÙ‚ŸÉÝç“Öø/Ð_PÓ´óÞ¡u¢º´Fè£j]T’÷Ñ€ƒ{í€r|:´+æ HÚ5ŸOŸñÿqÿb¿þ0yÿ:Oóÿ›øÊ)N·¸<´ÿžt©œÎQŠÀ[F½(cÌ ^^æBñSIy›¯÷Aõ[íÃÆQópÓ­Þv›ås”Ý"³­öªý”~?rêÚ%ËaÚÎvëÞep…«ÉäÊ6 øw£Š—wf˜õ×ÉïlNNwm'ÕéœÂç{ïÙ]¤â£J‰Ò>×:…¢‡ZµÛ½Qj¯:Mf˜õ¼'½*ÏWP‘Ím7³ª×uI®„Õo[ßUJuž%ÊNÞòKnDpyU ®¦æÌÙ@”´Vw§¬Ó¤>Z^k{>¡ g‹mÉÞR©"&"ŠŒÏ”.ŸBfù6vˆs”^sY¥ÖÙz›˜=NÙeÕ²KÖõœíלÊá W“Éœ&Ð'oK/:îÍ™µ×ÎÙ…"û)½sl×JÙäS"ÓÌÑ3E´ÔÞxýˆß 5œôuv[F,¤h-ìÈŽøšœÝ>ÉfO:=Y´"餲/1}œßL¶YX;yòX""Cý¥0–TɵRm¿±­ÓZ5cjÆÙšå]‘RZ-?Þµ¿ÙÏ{GE4Úˆ…NZ宜«¯ o*ñ›lѼͰ3¶`VÚ_4o¼£%¸áÃÙÿ“¹ðêü¼i!vž¶íTJ8X³O øWÃî=ÑùØOçÈB÷q§jPÌiDN¿>Ι4pú?OÙø~ÏÑ£Y‚ÇhøÌ‹–ñ¹mS­**›P2‹FfPB“bÌ5vÆŒ+whÀ³ÓϪ%ný¤-¸Zaq¬ko7á&< ¤Ûk ‚•ê*£·‡{™—x£}bG‡èþ6B@ðü#E|+Ìo `@³ŠŠÇq1ªM4Ù#x$BTHÎò 8ŠÀó_êמW¾¸—>  Wéƒ^ …<<ÚHÎï/c»ÃþŽŽö›2ÕU%±åÙטË1øFðFCU&" ë9ˆÀæˆÞÇÌQ8¤54“ OáýŸFðIa³ÇOÃ8!¬_‚ã_†Õ1œ+éJ HššAª„²!Œ‡ww[STNu’MMœ;8 á:wr|ŸŸŸ­·õõ^ù¿g† íÝÔâ)ðû0xუ©w§ÃÙìhîG—®HG¸kpltôÓU‹>Œ¿aß"õº™3:ˆœ•äÈ2a×'‰SÌYáÑèîBË=¸žÃ»Ùðì÷röx.ðkÓš:±ã9ñ{dͳŒgùÉg—‡w¦Ö!ÓÄ„Á¡Ú´%Ù¦ïg‡‘å屫±Oý]»÷6ÁOÁøäEf0ÓŽÍÙI´>É(údýŸ³ûøa»NÏbîχü·ÄÃ_wè§ËøŽlx~¼?³ÿ¹OŸ_^ÿ§œ[õböÆ)Æi—¬Ÿn[8<~—ݾd*íQ>¯$„'Ñìü¼½ ÂýÖ5à±¼ü-e£4 aÝ¡YÃÅë‚ûvy0vm± Žð‡.qáûÙîáäžúáömçžGƒEÝ"К331…<-Q¹¹¾sƒ°òôöaà|>_ÀÆì5v:ÖðëÞI83Ô[û?FÑðqàâ;úQüo™Þ±çÖ©vébp±ù}ä(…˜<òT„ÔLÞ > Iølýš1—c°îîìÇwgïE;|u$?R‘UöXzäž›²Ô¨Q*F~p.”;çn‹ú×måu47—_ ®çgÎ,—œq§7±ðï’‹æ»÷zxÉùàáîíÙ!ÕâØur©QâÆÏ^“)õ€`_·c|©Â¥?ù+Áϯ«é,î†8l}­¹ O³—áÓ‰$„$’äÍ¥–F†àÐÜ*@•ERØß¶½ÃnŒ–*p]c•ùgÑ7PÓD£I*oÚýÿ¶ÿ+_¿ñom¿N®üŒ”ˆˆ6e±™L½Ý(c$ÀÊ!cFŠ,”j‘š@ÆŠ$Øîì”Ã2“!„‹($±–„ˆ›¨yÅ8›¾o˜Ø¡ûT‰éÿñþ§dëÛù:¾GÙ«ÀóíDª‘‘*T’»ßÓž:÷sió‹ú›äÏœhß½rü«:Àb`º$A’ÈUTÅ‚\n yU_>{×Åñú¾WÞêm}KòÜóv˜µøÊ®Ï»uðk´¸nÕÝ®IrZci)øº® Ã %§#h”D¢!"jD*ƒ…4È Š(ÀÎ[ ƒm[µæòÐmähª¾|÷¯Ëëo¯Ê½îü:Wá¾My¯žé“ݹ\ékÒ£’`˜ béA$s2C3˜³,*hc2ª’šfE‚ñÀ:¢æƒœÃ"Q"ÁÈߟ-`rò* l½ÏGô‚ü|}¡ÉHt—Ÿ·¹aâ©äð½Ú™'·hÆÁ ÀŒ<¶9 T.àÿ´fb×K•o¿aóG§µ’ X ¢+q ÒÿöqG¡¿òÈi I :v Rã Ä¶*ôÓb4jkà;¸RDÒžGd/Õûn¾$ý;·K&ææìß½¹¯û~çίÃ馋ŸÖ×ÖÞH…¿šÝÿ½ qÚ6uAH 4Ob $ù÷Ž^øí½ÝºW'uŒ\Ë*†£TT•EHœ±Y¦ÈPÁtª±bÆQ‚Ö0B¢ÜÈ\mPA>gBýð©¡4oÄ $S|r½ñÔ“×WéîRÞëñÕè«ÙÙŽb‹}pÚ¾¶ÉзwgκE~Šì”šWƾµå¼ß¤«ô–ƒp€šd(8l8s$’$’H]ä@ø–|Y;^{´ ¬ÀœGID¡k—K]ÖW|²ßµò1"A© Ì“.Û¤Bú+¾ÆûHMBÚãT,• 4–æª÷©BÍWT)ô˜DâgŠ@”Põ}…X1 öbt/TQ T[YØòH ÆUT„Œ3.ʶ|¸ÈÂHHBÑô w8;˜CЇÁX½»E†1.Q$„Rî‹$„ºJ»LF0$Èí±VlhT†åLXúP¥ÄD2ÑLÀˆD4b!ôþêE@³² @·ý“'ìBF¹mÖÉ´BªFª…‚4 ÉDc@­+77?ãhÈDwfî‹ç¶.Fø% äŒ"E2óLümÙfær:h@(»¸À*îãR¯HXò¹5# ¬Œ„ M$í$"¶  Ð×!1‚›Bå–Bê˰„Bø¹³6¨›ºÛ53^î®üMÒ$€k ªt¥¬Lé‰h±ÜLáH8s«B‰U{¸ OLÐóª ˆbèdJ“ªJ°—¥¹r…Å4…ê´Ñˆ”á1ÀÿQâ*(’*© É­«øÍ«¦•´ÖÕFÔU…d‘OxQD¡‚° |}ß์zl;?èi¨Â¢ÏáÙK¸t‚¿ƒ¤AÈ0¡ˆŽH´*&ø™9â @‚’$b,‚±Ó¬°á4Bå‚ÂW˜¥@Ø™¼ƒI¶€j0!ù?Ð5x¹†ƒ?g@©¯É>-_5à!rJž¥’AJÓv,”ÔB諌…‘N㱞+ˆT$;L!^ÌCД£æ‰DPsÄ2:<çö±bv•/j—ät —2c)i*›°…UñEð^ǯ”ÚÂÂâ»@@wˆvS½кWö^íáh e2þ_¦¶êÛÕð§$¸ËnÔÌà¡ `±$Ä·óÓvlm2ÛU~j\Œ¦Cb÷¤M ™ÈA…xBÃð¸QµàƒCæa¡ Æ Wq}ä ¾µÒî¸äûvÊXmF*ˆBB™¥ wQ§–Æ!P¢$„caOèu)MP¼É]ÍœÿH`Þ( v§L(€Zå¬Dx5~žòûÛÌ.Ä¢@.M!óøãç0ÅÞ+l˜ÎpuȦb¥Ä¨«¨¬Š`{sÙs01Œ\˜WˆS|ýH _ípÌ’Œ’?7çÈg‡á##O±Jö5‘ÑŸ'E7mˆ #‰¿…Z|””ˆ¯SWTÅ@JPš™Bíku­NŸ'ÜHHHFC(yMn §Ú¿h Þ©9„&¬múþeÞÔ$>žî€¼÷õª~KWÛg©èTУ îKUÖÇÏöLôAˆ±ú?v¼ãxr)H´ÊPñü,ÖjM^LúeÛW)/°áÓPÓª‡”*ᇅm ;¸Ør^ÚBGxíã:䥌3!C’ØÊ”D´ÆÈ¾CÅCás€\;.±Ž”ñý?°1þÛFpÝ×U\ŸÜ:»™ˆni“üœ©í‹‚)cÌ}ƒH’ 샄=Õ ò‡`Ô¿ƒÊ!cPt¶ÃÕ© Ä’A‡ }ƒÿ7ÿQ‚£±¢…Pˆ¢5Á0u¤UAhDˆ ¹ŠÂ"BQ ‚ TQªx2‡.#!&V£ Ș… p=!þ.©ùŠ™Wb(d „ ð\„…Äøm’ž ~eú¯°äêN‡0šV x¿’'âû>o¸|ê÷¯pû¼q,‡kê4:GÑF"ÉxŬ>ŸÎôÅH0?„§Ý³Ð‹ôBHâ°‚ž÷}#í˜}F~ïþ3žž°ªåô‡ÁòçT;ýÃæn~.Lå Œ¨'ãø þÀʸ$ %!‘ˆ¶£mªnIb=9cñiˆ!MZžÞ–¼ä‘›ÜJy±˜° ´ÿÊ>PbÿTÉî¥aXG {7é‚!2‚B¶]P£™cnc ¹W(FÕêkun_:ë¤"Ü»«òràè¼ôÚ$‰ H!.¸?]XQ.ɪïûõÿ˼ ©Ö½¯©û ,÷ UëC ûÒ›:ªÓö"ŸrŸË¶°‚FQ#$!0`ð}j}¼|Y½Z¯v£x^õypø~è ˆ~ÕìÉòàž«l²‚Š ¾Q¯GðÙ J¤bˆœ€mpj}b °hª ª`Ø5Q„$›AÄÚq4`J(ÕZ÷1ŒKÊz¢Ð¥ š] ½$ËJš ?rGåëåø–>‡Í]ßibÏBÑ󌌅ŸÛ/ojõxm{&1D•z¼»×§Uƨ~‚ƒ±æ»"|îÚœÕ/Ò˜}=tà ÛAU@ØA.}ÉéL*‰ è…Ý ã~Ù„13^Ò­BÀi Ä$€‘ Å£ ˆfœäÊ–ØÖ Õ¦"]Qšjë˜/{n¶»b[F½¹ÃîU8lm¿‹±m_–Õ¾JÕñF&Ù©– l¥«Dm¾1¡U*P¨Xö~GÝ?qË÷ù"Õ'Sqᑼ4”5 $H(Z£J‰}OÔKÿ¡Ó¯ÅǃѷÝCFÍ+òbTddBFHüšó‡qã÷šr÷Š­~ð´díðô'gwöºì#î‡ìQ‘ÿxR ÷çZ:>ƒC€=ŠR÷ùÇL~õO[²Œ O½×¤‘„$#p0+؉ȗåÉŠ*µçôÑœžº³uŸaÅÖë<@JE .&0@†$…8QŒ£7(ð¼xáUu-6—œ¥Í(^”½Û—BÈjrsÑ¥óÖåø ¥˜ã¢’* ”Ž :& MR Lr˜ÂaA¦ˆ™œ"QÂcZÈúÌS& x-“|„CwŒ!ñz[dŒ!”dìºÜ¿Šoœ’KÆÖÕÉm§‹ï þ‹ó÷eQ¡EQ>Ð>]3ÿ û¡Ý…1 þÌ™Þ(ªlK¬”x¿3Ëݸ%8¤³M´ÒŸ€”% *u]»÷Ý$Ì`ÔU+”*ŠÌýDØód£ªÛºk*ÝSÑVï»rÿËvb<© <ñ<[~L\Dù#£ ò¯*u3š ¢Š Êj¢JaD|†ã°ë³¨Zýt<Ñ}#ßojƒ ˜„PŒ|m{!PÏC&Ã\ë·«ƒâ¯ªoP¥w {uÓ´æÓs~zã¨G™à€¤&&Ü…j¡Ù$W³()‰#Ã" ˆÆ`‡›¹t1뿹Ü7 C!®„†ÐçüѳM^xÜëîòëT¼ö™8ÜJ—gâCó÷C¤=„Ÿ‚¨{{ׄ=—F‚bÀB4>ñîàD™D¥ À8â‰pjêï5’½pÈI©ùޱ쉜™É…—1`^2©¡½z> “z6ŒŠ~@ý€÷U}çì ü¼~‡Õö Àƒ¢ãìîJ/·Þ'¿š“ëVë[Úáz¬¿9²M¬Cx\†&§ÃØ á×°7À¼°,xÆL7Gv q7…o LÍìHM0_¥‚T1Ê„-ƉƧHiùb‰­AÕ  A½ûàòRHFH²[RV¯ì×øÖ½½¢a²º´’Di# ä8{¡`¸Ë„³p§ú÷’M %ÇögOp·•pl‚¨/°Ý÷èù7ñ쇰?/XÐ÷ûE?¥CëVZ¾ð>ß?°¡õ‚ÅØ;uŸ-ú{“È÷À$Y{òGðöýCÙ Çð DG¿Îßj©|ýgzÿ4ðXý?ßV.íÿ7Ÿµ£ßCl†B†AY»r@ÈWãoØpÃøõ+Øv¼ã¤ØíMa~5ñÐûŸY¾ø`ì20F*3έ£.,:±ƒ*®۱È[±ÃÞÛ¯oe±á#ý^²pÈÖèæ˜@!Fd ¢È ‡2,?  ˆE½¤“æmîü(7|ÐD8`ùWûÇ Ëãøô(–`«WB‰*Z§ÄQ ‰òP°êÄ2!ë¤ÃìÝÜÒ"Ø;xPó²}”›>ð~€òFÏJp+C ×9žEÛ1ü4ùâÉ#R«„»sÒàKêcÌôþ:ÑŒx…z°¹n1\âØÅãývDZ$ ‰hUÊRWLT°¡ç5z( Ö­/B°Ç°=2X’ýŠy¤ØÐèÓ æpÆíêl@£ø[ºçÜàBÍŒ‡Y£Öþî öƒÔ`‡E£îHRÜâ¤&§ÝPZÞÝ~ °?*>þñHkçé@¾£AõÚRY ‰(,}av—”<“±ìO—±Ünu’2{ß|5$ ªWTÚynyÀ °ÅSQ.ÄBpA?¨å{}º>ÃM¶Ÿ¥g¹Î§Ý×OÄ{šõk¸~À~ÉÛº°Å$A¨$‰b­t5Xܵnm[–®jbÛr¤ÖÓ-´Ím~œº-mmµµ­Ò¶¤«Y-µ¨ù‰"‚#h ¥Æ *ÝH›UE[›E¬m«³jÅËVåkr«›QXÛš±Z²$¡ûñRm…PPAP^àÈmõ 0ã:B 4 ÑD$(hH`7D0oDØ”—\ûžÝyÖ»|Ô·G£çn¼ìÄŒ„H!`˜ùDÌBÈàüŸ“pI$R¶2Ò(QFw D¡$ qpĨHûñäOè7‰xrä£è\Xò™:´Š-'ô4³ŽŽh @ÐT#œÕGˆ ì;ïÆ…k*»Ö{ußÍ®OMïv½uÜ[Ú&c\Ìj%Âì.C4Q0æ5š0Âd¿Ÿ2¹º¯“/«¾|ûíõo¿zúל·"ï{ÞŒÜí)¸m¹ê÷w»¼w]ºcËÏL÷\ºî´„[â¼ó|]/:˜Îê>.–6ß7»½Û‘d»®½î²Ó0¹1‹` ¹E@vÝ…å^Ñ­¨àkëãÉó®%¾w|tÛI5½\5B¤b[,FÛ!(!íaˆa\@¢¶!#è¸Úš .WÇnü]òûº¾êv“CãnYçZå]öï{tê­Ø»@ÔÆÊ¾5|É=ó­šï»×WÎ]¹ó»È×Lyyéžë—]Éh‚ž®—‡7ÅÔÞîÅs_HÛ||Þî÷\Å“w]î»­.÷w=šòë]“¾¯7•¢âº:¼ÛÕéÚåÛ(\]·mß=ï]cÝïf»®MÛ7Içov\¦ß;ï¾M¾·gÙÉ_÷ßÑÆüwãíÒ2¾yµ×®t2Hjè rfÊc$ féÉä#˜–c9°÷ Ðìu6 S@¼ñ¼~ôàñ+Ç?‡·ýüo¯…ã£ÂE(H!`=àŠ•+/Uš×TµÕ’×ZÝl4"Ùû8,-\—Ù$›-lÝaƒ5T²Ë6Š·ýæµòž¸û³—×R€È>ŸA¿²ç¾¤ª? 1««ºê°™Ho "âÖ´ƒï+ìê`_(2Á#ðàu>;“?Sn \$‘«¢ Ü$ ºd¸†Ž¥ llG;Ú7 º* ÂD»¢Kˆd2ÃcׄÑ±Ø ¡’žßTª*¶{¿º¾0òN.J ­‹¶ >ê´¥•ܰ@<—8[~–ÎÏ#5mO)—Ú"ÛImfXY[2e«öþ_ŽÎëªmþ‰MhûÇ¿€˜…/Ql’IoÁªx¦0 ‚(ˆRà%RU+ëI `݇у«Ü£-&4oZkr›44Í„²§õëÔ·šÒ½½©ÖÁ—ÎÕušÍÝZämë¿èJùó}µ÷ã|·®÷°{z”ݯtÄ/WX @¤i H4Ü/2)˜T1ìÅUF¥Iª°¸DzºHˆ#ˆœ”:k%3CäÓü,¤ˆX „ïŠÔA$‘‰ÄRµÅUTjT—ˆHŒG˜5d' >GˆXþBûíòø)L¹õÃþJÝqÄd !ª”žÓÍåU_Z¶ X¨„kJ/5cpI«¶$„a îa¶ò”ÞnUÈnFõFf,»†Õ+Q[Ô‘.ZiX½rÖ ‘,|ŒmX—CÈGp#˜2ÅÖm©Æ$%›šŸÕ5öÁUT/P¡!"@¡!6>‘¯ù¦…jk¢ÀMμ03œ·æL NLæØpDdäŸÿSTJ`Ýùxñ¹SÜöÇ‚„2;ñ×ÏšAתŠ-&|àÑ¿îB›¿A€Da$$#$Ⱦïò?È$·|½bU¦Ëuè&„ÃýG?V;”é-ÙÛ©áõó ïlqmmzØÐçä$‰ ŸGÈtè@qk};¿‰„ƒå7ð)÷L×”^é£Û«uæÉµú]»§åöù·"+“®ÒÝ´®7É­pTݪù¶X ?ÞhPË‘”TŽD½‚5[d†±ÈÑ«±ÈY—Ä*¤%.’þöòû–ûu|u¾Óz$É%„ÅMM¨‚”H£iM+庾®¹Û•Þ¸ßjöõ^-£ÆQ5}ÕÛúý]r»yß.K4Ñå±³ ˆL:]ª2qõ9©!(hh¸ë$V„Qœˆl*S¢lÝCg`ÉHÈ3#áÂFá;4ö^³ç¥WâÚnùÙú#zŨ’,t²”}%ª”ãÃô( à±B'ˆ]zJ01Œ #=¡éÿtAk°@Rèl[ô÷tõÛ˜ÑSoYçzï]¹›ÎñGæ9“ìíC_@õDð÷ ó@w@öÌ;¼_›0!#$ùÒµ à]zënWÅö\×)5Òå—vÅÁòJW å ¥HÀ‡ËTCòÒá›31x-’èd©Q*؇dºKz—VPª@¨Œ…KB ʦ 3 @§U˜d̄¹.ЄRìiýÒ=‚”7=߃۶ànF4·{ÚÆ Ⱦm½%ÉIhK#mûEŸ!k¥kõþ lÁwaá³»`)ÒÿvBÔÒîî=>Co™¶ÅHãii+k2I´(©ífÔaè0Z–ƒqº¢Ñš#•ƒnBW`S~ãhf&òØ^õHÌ{«ã¯eÖã»êGºï®>þ·Ì—ô1”ÑÎòÌF¸ï³‡l_⟤èbÒQöÜ=2\¦·{E<w,i¶çñÿ4ÿúMø‚j>Gš ýh¨vµBÌ›iÑœŽ ”B‰ ”Jªm4εÏ-½ÞÌû¯åØéJjÎ!!«¶ßßzÛä²¥z·Ú¿7­lJ/€"÷ŽáKVïp¨en’á!Su1B¾¯Q·°8wNϨlrP~yÔd‘PÐtWsÄ¢önøPu1¯!çÇc(uãR‰`Ðþ< aþA„î=qÒ|¨hî_Ôï{±=üBoæuÙµ¤² Úþ1Í„ƒ$¬„ê‡õ Æ B|aÀŠ´Õ Óùã—w;MNë» 30Ç…J`Ót07VèÔR!çý¼œ¹2Éõ+AäãiDj—ȰB©ÕIEÊÚ$>7ʰrSJ”rÒX´0{ƒ‘\6ÆDǘ}Þ,£`‘r‰{·q€¨²Íè½9§>¾ØÎO¡]"Àà`YÅÞÂ%ÑÑë Á¯Ûæú×ë÷«•õ\ó'9bº\·Dd]ÞÐÆe! \,’Ž¡›ÕgàûÜ¿;^üuwãåësWÅñøÕß.èo¬îÆù M£|_Ÿ2-Å©$jZ ejÊ©éÆù Èm½Ú¿ óçE½Ý6~F×áä_¸,/Él!Lñ™«Ö×#rjªl[ë=ÞPh.UùU|›ëÊøhe Ðâ"®M;N @b:)†tæ9‹q‡ñ™±J™TUnªB=ÚÜ?WsŒœoÏËÔ|ú]øòìŠúß[Ì]|o1‰/7^ni½Éw«·ß]uï{Ý®|Ÿ§]|o‰ÝÞ»Òùܼq_—3ï^îÊ^täQ¨‚m ÎRK5-CI ˆ‰Mµ$LB ’H.R“T«H†D‰NÔ' )Hy ha‰R—P*$Ãd#©¤Ø´!D0!&™„З&š”ÞËÔÛÒòæÄ»zX\@ÚsEÄpÍ[xqQÚiD˜ˆmД!‚€µHÒL)*”ÌXq„-€—*©ÎJR&ð*êI’ç?E«ß;¾p[>{¼Jøªû(¿"..ÕITP D Š4DÚêý7]]ºgL›}ù]cj¼Æ0J(ˆÞå,‚Ø@„È”\1PÁ ÈQä…;¤i#2šõuT—Kk®«± Œ¶–f_&6×Vö»«R–½uúèØ³µ-ìµ|V×Yªò‹jŠÝKB­D![V‚PQ„µ4¶F’œ@,½®ì)*…¦emwÆL‚Df¶»€Àº†’î X†D¹ÌG0d ˆÓ6Âꤘ€Å$.‚ˆÁ¨‚”ÆÓ¥`ÜÓ`™‚HbŒ"—PB0¶ÛA“TÓçQª<×ÜߺñiŽ‘Ó)™Ée¢l Aà ÜR(ˆn )O %¦!„b¥˜èêCM@‰j" 6„„´Ì»B„iÄD¦Ú“LÊ ’HÈV+a» 1z1r¢Yrµ.T.H'½Ï—»Ú×ÍÙ°oÑÍK×Éß–ü«â¾+ŸUÏ2î¹b»»y~=u•åÖù.nÙo¨«òÞ~øyB)3*UT "ChºHSe¦¾iz×M‹ÝÝ®~VÝ5{çW.±V\¥&e°ÌÅÕ ÔáŒÑhH¶ëÈfÑ6¥…Ì´BDja Ä]@8Œ5I¹«²Œ\Ã3&ô³Ak5ˆÉqsŒ”…5Va¬Dm˜a$˜¢Ù Úâ&o‹1 5X—à© ‹ L1 Ýn’‚õIe[iRÈY!Au†ZQ ‚d%Ý#P]³µ†v(¸À—JÈê Lh²å›ä D®"AÙ„ÿ(Z‹)BKQh†¡Æ( 18‹QnQTXš%Á.( xÕ¡ÞÂQ£””ÒG%E†Š².ÃJ$`à0`Æ @E( aQS‚X¡mä|—P¹1$ !"V嶬Ì^ ©KÅTš…Kªº ¹Rò7¼(³2¢ikYUÑ% €†‡“DU¶– ]º³2àÈ´APÉz–vâ²`Žð’³eÅ´Sî¸Â²‹Â®±ÝýE u8tÆÖ!IÄß4§‹Ò€H ¡¿úeÛ’È'¼ŽGŽ•¸~ e´|˜|ºûv#á¬v誺Z²@ ÎL‰8¬," ¥"íR êÎ3IhbÀ:ãꆺÎP˜É* ¢Q*UD)§½‰ áƒñ3 Q"æ ’2Ù J_–aà7î ALBÆ4Õ !)¥÷ OjÀZÂ…$-±€YaP™Ñ\+l( =zS­_ÜÌɶÅk-³KoUÛvh¶ÆÖJ$Ô%oMl\HL$"±ŒN\GA`Ê ,~›v®¢¿Mœ±±J~-Õÿ#ôÝpá €|Ûh×”¶›ä\éüÇ-Ùd5r¨œª$ „ÕD.ˆ…ˆ nPtXŠâ7ÁI¥¿¾;À*¨*Q¨7?[ªDÈÿ»þ&ä5]ª˜¦„¹–Œ¨Â.Ujfó~èIÚ=+g¾$‹¨HÝÞ08$.”¼JFó¡@tl!³@¥A²‘èº[Aþ[¹ÿžJÊ÷WmW5Si s!¡j0‹”íTTH”H’E ÐµrÎ Q ™@¡eÎfÈ0œfÎêrG‚ph]w¼J$!*Y¦1ŒŒ9{< ƒónÓdÑ –½Týêÿ2|“ ‰»dJ$à"èÌÚR,!7î¦@…ýÅ Eˆº•.æ"ÂT±‚Ð:l‹ÿ'Þï.ÊK‰„Ønœ)³°Â:ì˜ ?£FØØÛ2¨5R¶¶Z66Æ”ªA XmŠxØFÐ Pö¡Ò¦jJ”VôQhYn‘èh¿ðL)Q$, wdI Ò¿­.q: Zbg g'®Ò‡4Nà¸âªîì’¦ÎÃuH*@üY–G…ÂÈÌAƒ!CQh!#0¾p>pwÆH|Ü´^ ¦*‚QAóºIîì. HÔ[•µÍmz–ºÙX·šní‘­rÖòº[cáo ·‘µ½5s—-]/Õmï]µÊÙ[nF2BBÆ€2†òÝXoó0QµBÀ6p§ àÞZ¡!½¹¶˜„Á%¡Lqt„:’È‘²ÎùÆv·ðR6í}]e¶( OžCM¥Cí%TšÞ'£õ…Çà~éô;fÂóÉvÅéi‰R½‡–¼m±s©âú… ƒT¢iBP5± ˆ†Zi@ˆl ‰cQ±É€êKq«¢ê‹— •%•P~=ãw]{Êó×½ïw#u÷ÛëæE@ŨÉYÍÚp h0£¡—€.\ÃJ&R^ I"¦¶CÈÌÉšD¤ ôB]RnA¹D%RS(ï è¹)É,€&Àl!Y‰# è‰cñÝŽîãwG_Ï®_–娄Œ*­ %å^š‚v9(Ë1¢ ¤Ô›~i"D ×å5Û­V‹ª½Õ»x AdËVDò0‰†À¬ä DôA¢Æbcõ]~‹¯w]Ü<ä"zq΋ݻY 1å×—^î.î^p•î8çEîÝmuKmïÎÝ«îÛd ¡n*Ž*¤*—!¨M„¨² ‡PBA„I!Nëm¾×ÚþRÊù[Mb´V¢¢”i1§ ¶±†N¨* ) š€D+#ª7lЀ`¢ÀP)†i•­Rm‘ý\¡À“¸ ÓBÑìjç/wçu+ª_ÒýTšÈm2²ôkÙjºî—gXw_¥šÂuz†NŽ ˆRj‘´’FB©@\À$…®Ïz” ‡åþß×s¹?‘,ks?ë°+õ0"f&ædÒ*Ö0‚B…×ÔQ‹CÀ.ë ["« Þ_•ù1—jXêw52-‘% AHµh†„xû„Â+aËŒK$~êë•­A¨¤Z¥zëBí·¤ ’@$W=B¼päJ`9UŒë.µ¦ä”%J¥ÝF-µ•CpÌÈ·6l^NAÅ¿™±Á¹€ŒØ ’Àv”ÑCÉáÎDDHø%Æ‚ (iìÁ2‚Âq‘F_m€†§oÅñZ¬Rix4Dad»A„7©Ê$,¨ñ4æ™eÛ‰5­<¢ hEXT$R4…Ȇ„xûDÂ! NX¤bY#ÚºÁMkPj)©^Ô`B`’B;F¢Âꮪ[TÍ6Y†›×$7•6‡j $ƒ k‚¬éNnáÆ(.5'Æ/«OÌg1ù/Ä|®i¥ÜbM ®`7,Íd˜ç6Ml³Gð*×´2:'`PP ä8 ‡h¥ÿpSä‰È^ÖÁ¸?qð:!ÿ'¸ lªþ¡‘GƒQ1Çù¢P_CþˆaÂGCô’Hšv6þ§ñçÚoH*‚ÙO²x2¿ü±÷»Wùr¿ù§úß‹ì÷Cñà€R/Óð*I„’D;üœ8ÙÿUZ2(@"²ýàö¡ówq#:¾¤<€)÷ý8¦ª¥W¥?_«#2~Ã?8„Œ‘ëôÈ7òŸóQÁîqÕ„bOE=ŸöíTò÷ž“^Pø.<_ùÿ„÷·w«ÛC4FŒZ‰),TQ¥m~j¿¶öÞ DhŨɒÅEdÆHý6ýÓà Q…ÐÄ»Rÿ¼¬ªLÍÐð\R[ÖJÑ)$gÛ„öÃîÑKþj>Õ€%Úûç$#CØ]€ü:³@{¯Ù_Ñ$d¡ì¯‡õîa÷Bþïz × ¼7r…· ÇØaP%:¡¸¸@>@†ßUNÏÑÔöêõáw{)ìè„DÏýûþ†M~K4) BG¼üb{¦Äà”(~$øƒ¸ Å!C–@„1Þ(†?™…”:ê®3_1ÀcÀvÅ%+È¥(8m&ƒm0Šl@”I#ÄEß´¦ â‚ç% A¡âcÆEG{æÇªû]ÊÁÒ4«™÷ÑÀÐD‚@"€…â26nM€li@_õÿ ˆ—íÛýbïvñu½êÅè%ÊŒ S!…—ôÊ’?%Um¶¢­bÚÚ“UˆªŠÕZ‹UXµS ±‰çöŸêÀô$‡kîò~/_sÔ} }·9ꢟìk±„ôO è¸Od*¥…ÛQ °(ƒ”•›Ãx&aU(Ì-Š˜„0V*¥šá~*ŸQú ûÏÅñ|_Ô=OÛ>¤ž=ç¨ëgˆL¾óíÓvGÚ¿FÐó>ŸãáüM·Š}è>prû£œèÙíRžpzoôûßBs@JVAjšE>ß ÅX„„%–Ò˜‡Ú¸zSŒ',HI¯¸,.…Æ>.Ÿ‚üMBàútä~ƒýÈ¡ªˆQïý¯Ñû¥d>ŠýOi«dù~óú%ŸïÀžS÷ HAýì!ÝÐp%„õÜà …ü@ü·äwx?ºÁ¨:Þ~ÆuèÆŒn² ºåݢ-Ô·+b«šeÜjë®ÆÝ5¹sœÜ¹Ív²µËs”n]×t±®Í¸ë®NæîçuuA×mÆ!Ba¹r$Ù*–°–1b¨©É $$BA„ £;þb‰Õ§ í ÇÁz ~8úEù½çgÔöâ’ J*àZH%Š«p‡‘ò­'î4žÂþ+÷×åЊ_²‡•É÷?d ñ Cñ~ÿùàø{û‹õÛò~^éõz•L¦›•r®ª ¨P ( Ço]ÙÛ·ç{»¼u¼¦f¿Ÿètwd`Óû—~o„¥tô>7tNïõ¶ õÝ÷‹¹0íБ‹ÔÀ$ 0?!%ügíÍÛO€2C‘ùå~œŠöF‚] ½BX*›»9l ê< &¡òû?¶A?<¼‰È;-žS'âö½Tu'ÛááÅà¿cO r¯(ÖÄ™-lŠºÞ–ßjP{àŠU°Ùƒò÷ÉäþY-”DüÜù 2çà2ô/»OÛæï ÇdÙ>0j$€}ÎôKêYd!{y¼9b×»D’?QÜ>¤#"ÀÊ$$‘ÅX8OŠM Çû†‡ ïú!ù¿„õD|\ç¡ìwÀ®ÐL‹þ>([ôê¾90Ü‚À€°C—óº  ¾ŽÅÈHTö´‘„D„ Ý\¡`Ó% –i^ "kKaש»Ã¿ó{Ïü=Èx-U¿íÿ¢öòZW¾ÚŽÆùr;„wÐcÐAþëaŒ¢ƒgÕ—Õ>p¥¸›î›cBZ ƒ•n ëj§H·ìˆ™ŸÝH®MBåÿj‘Ú³üIµjúá¬S‘m6\k2Ã9ÖúL1Ñ«F_î7<ËaCÉä_û€Ð0Çæ,^ÐᶃÆjQx’h†¢žóà?ÞíEÀ=ð£!x!wp½Óc=ÿQ³Ýð'ýæÊYò›»;³±þöŽÀk¹Õ}h™OÕ>–ÌÑw÷_`yÅP‡û±>g¼ï<U2Žè•eÉÝuþ]Ž5Ýk‹çîï}Z¼ÞW—Õï¿yï¯`ͼ¤Ý¹×]í5¿ÓH®Óúšßõ©ÚV¾¯Â{²jƒð£0á€øþ R T¢l_Ãð¤VâÉ '3’‘1ˆ•7Šp- ¶ÂĘ{ŠZ@÷nu×]îºûÛ´¬²YNÝq ÕÝHÇ%U•@\–`ªËTLQQIÞf¦&aAú„R÷÷2 ºlr‡$?i£ú–npX~¨4h  ï÷nÛš746šÉ˸œ‚viˆ~¬hb€ÆVÿz¿µuýOŒƒD ÿUò¼ÿ˜Å߯WoÆ[_Œîè4@®îÞDü ÷„~ èuß¹$ëwd.®Ê%Ò¿~.ÞL~›ûÙ} Ý>„Ù»áÑûnxþe¬H.Á¯’’-!êQ6ºHj<«ô?âîØÐWGìöúÑ~ZÐF 9—Ša³CþƒüžP O„øŸñ$%öÂÄU_åE S—Ðj?hˆH…Ù†ÆnlWÊ|§È?ÈfI#=H@¥(©!BQDô*'pÅDŠ•mƒ}|з¥Ž[îaÔzˆa_Lå D ˆÛ€bçë‰>mI*½,’J˜åüŽÁ߉! HÉ#¡±±H&ÂD ‘Õ R¹¬Öè©&³Ýu¥¾†¯-^à(pÀ #¤á• $cŠÝ…#@c!K¢ ‘lhv«B ‹ÿZ$S#ü”HÕu¯™6×Zï ª¿Åür³wt©BEq•N½Áø4}±y#¿ÎmTB’È0$ZŸHQ4@¸÷U$¾Q€È£1TE€üòlv,l!‚‘¶°o†¡©½¿MPàw£µ"ìQû/ï…í?”'´øzK ÞxÎDDéÂþƒ=€òÂÐþ¯Òl1ó€òžBBaØlû‰$c$ ¿™ìæB¾­ÐÐR è ~“_ª|‘ƒP.^ªUªÐ.1듯*2zÐ! ‡¡ªŸè_‡€ÌÃÛÒ¾ñ•÷Ž*ë„ñb4t}hÞìî’I$ÛgÇàüu¸­–¸Œ• ¼>Âu¾æ÷èøÁ Óè¿’¾l?áð~ÿ—eü蟰²Œ‡·BCÜÃp<‚ ä"ùa”€p ¤„[T$!K ‰$#l4²*,Ä¢A””`’dËcfÆ[&JL¥“TÖ“4Djce±QeH3 °‘2a¢RCl̰R$ÆÐËd¨¥+¥kµ‚B‡–¥PÚ#[Zµ¯Ý¥Wô›¶b¹w_+n¤ÔŒµK(~ö„rd!B¶¹ …\šÙÍøˆ ˜ÃI·-êf)ý†*?¬ûÈ@ÂMóT„&$%@Ú÷,' ®¦ŸrçñRÁÙ_ÜTK@ª ˆBHÆGûD@^KQ^^ÍÂë¤Mƒâ ²}Ñȸy5$Üv‘‰P  [ød‘½ŸÐû'wóûþX@Â({Ú{üì^é'cTóçÁt s×è";Ò& ó±õü‡Ãú0{Šÿ}hQ#/{Úä¥ñ|Wâô<¾›8úÁ4t†²^m´AAK ¼ÛhM6ÔL(§ííŸ5ªÖd"FrxÍp+ÃÑhkO‹k¹†Ä žøüHò p=Ãø™XBBaW_ÞmUBJªŒâý!äÕÜȨ| wío °éE®©h8¼Àп!—–©kõʪÝiÈLÔݿܴSã-(aR&̳a8 ݸ8 ™£ûGNKxx˜0† b!%6òjé|W7t±Eˆ6Ù AMJ…j Ì(mºhEkêÖíKo‰$³v]MÎ]-ßZò±&ÜÚ¾5èEWƺËnÇâš»YŒûÅLKí­Ô¯´´±‹Š X!ÊnsTE®ë¤²;¹ó_­Éc«knÜX€A6),)2ôaÑhRÄZ4ym¶tب©-€›M ˆ˜BŸt3Š  ²4ei…Ù“öa°ðv§ëFKv€HM?wÒÇEÐvŽl¨’µ‰‹ÆUý(p€½Ýƒª£Ã ƒ¨FGéH”„1Bwb6ÁKÛö.4CÄã?6×bÇÂ4e.¯oO¼k€ Ë&FêDDÄVµ‡­R¬R´(ÛN ˜ûHÜIISòª­Zì×Ú®V1ŠoïrßWí./ÏÇçï¾ÁÝÛïö¼U”KŠ Lôˆ.û"-6va¿t ¤„çpêhz¦™+ªÄ„Å5rÊ–ít DŨ´pƤ…%-ƒ•pé£oI"ɈîåÀR¼˜2)‹Œ›Åã{„nß”)ü‘V‡Í÷bþ ÐóãjîìM«P@:„ìTûCmUÉ„å…x:X¬ít¢(fÑ(<$?é {IT© —( „5 j’¤©9b‰Ô3Ù›¹*ìnU]¥b;8!\2RÓo·Ïüòåà™!F°6мKb^"IÍåUÄ,þÛô}‹èjxXæI’S‘¡è">þøw776½À6Ä>î.Ë¢ª ̉%2ˆ“[ÑçtLÃEÚYfÛ3μ;E!‡¦¨z0œBu¨šŽ®33nl°Á˜QƒPàFO÷ wíïÝPÂCžÙ]VPp"ä.І©Ä|¯ g— œ¡ vŒlʱs›#íhñt%±ä¦’ÒÌŠbãɰõîóá»~Hªù4,üßbƒè|ÌD7ddL,¤ƒ S…!IiË ²›~XõX¤l@Ƙ@FN È1¬Ä¢“jhÜÛX¤Àl$A‚SâûsOÆlf1JRa´•TMQA Á`KèdÉ!¡Eœi>1¨tý(Cq/°ß²+ô0½ž³¢É<,,׿91§=Àm $v{®b$©R¡D8¦È¦Å…€;YFXŸ¯êBNšè\ì’?Q§ÈêÎF@Ó?ßëÓìrŽÆåׄ'¥@ðXÛEDª (±Å¨"Øù>_ztGÊ¥1U#E Ù{Œ:Ñ%CÎè*D²œCn$…ÑIdnÛ÷@‘6<®YTHÓ$&ÝÕÑ’n”ëºMúïèþ´_x¢ˆ>²…ĸL¡¯FÒ¤•*G,.XT© URs`,‹ 0Ï"…ß¡ãùñ{š¢eQM(çé> õIEX)‰û–ªu²ä¦’£ý]«|·øæ×óþTB0Y?ºPügɰ…"B!  7ìC›–èz€SÌèá£íà°ÙÄö–ö° WFÃû Hèo¹$ƒgÖêrNÐâ“÷ô/Ä®,ªª’£D$9º²$•RHH”J%T [‡½…´7ê@i¯Éóêr&·&d—I V¥\*o@ »ÝÞë­þÇÈú™oÚÜ×àqS0&*Eà ¨¤Š(†ÐC[š•µ×k[Š–«%ÝþÂü/½ºÅn[ê­æÚü)ó¾ ûPš"¡&‡Êñ6 &ôT(æì©!A^¯[Ë¥ºõÅÕ˼¹¢]wžBÔw±Kѳ«QÀm‚ ÃRA„X@À– ^4…÷`ŸâTn\z¡P¶ ZAK€ì9¼]j„¸²%À¨IpqšXÜýOÔpÜArœógA&( $P/O2Ù* yË• ´K'c 6LÈ’ê©–¿JêïÖ¦¾_ÃÖà°@Fí+;âVñ²¥¦_òAT_`îàå ç¯C³¶~¡ú§½L›JÚI,É B!~70æ)tJLÌ–@¡¦a•! bøî± û[1Œu]'1yµ#PJ±c.u\ŒbhA(BH`@÷ƒƒqöG‘ëÎ0¡ ‡c²òá sÒ„½±ïÞ¦UØÔdBÄÌ K¤M@Ž)lÂRQ]°úRˆºr–Ò.cñÄãÚ¾Þ˜Æp·PÆ,w ´ÉµPT¨ÔC»q¯Ô—‚¾K†D9.Ÿ¡íç&Ëí·Ñ¸ÂÔqeÉÄ„*@§°õ„saÈc)!( àrbZ„¢ªÁÃiHÁÀÊh[0  h‚B°V#x…ŸŸ’Y`PoCŒhÄ#A'È6b@]–ÁѤ¥ ƒaÌK±úÑ<Ðt9Œ¶ŠÓ£Úë‰Ä—iBl›&Ñ‘dC“fÛ¶£îï ‹‡8 ÂLÔ)“0+¬÷ÑzÁmÂQrä(”l«¦[ÆœUˆû/G„CÁ¹—PÎstj!ˆÙˆàúƒa¶R?Øãé*™µµ¹ÛØexM"È¡<òèlì›5×èI/é_\;ƒ¡(­üÊ"ðybø…ÎÒIUj– ±uÞáÝî{®m¿Ž¯Ó[÷ïÔÓ4@»O›ŸîÂU7.„Dîß¶×ÏŸ¾ÒµwzÿÝÝ­/d£ØMr5}¸Í+ª—-²l¹ŠÉ#“6=û‡Þ!~y¨†ÛêE‡]ª£ US!Q,´¿Á-«{Lý‘ÉIþUA·‘Ys’Á,hÃÝ- )ˆ¹[)fHuDÿDü)M© 0Ø+á+f1˜c½ ÖœjZc V d‚ƒY‡*!ƒéØ@ô¦OøxH–9Î`Éu†Hü_HBìSç•ÈŽ£ó®B˜%¦„UÀcûöHÉ6©-ÃpµàS˜~?&GíÝ':ü÷äÐj±„ !U4¡\6QÑ’ Pz8àÙJ„¾A¤\ü—ðõÈÐý‹!ñ†¡éÔ(‘ ŠÉನd4àÄ•$ õH5X™ÍçvÁ` bwÐÞÃÆ^ÌŽShšÃo¦dTõðj6LMpˆC‘*ì0*4 Ô‘á¥Û cI²¢T`3œ‚€Fd ‚Á¢&ÏÜH¹dÀ“"úÚ€(WŸlÉõpìC1°X`ÄdÔ#‡ÚKᆡ‹@’Ì0J˜C< Œ!Ip<‡#&HTóíÅŠpP–Ô9BhÉR^þ]~ 8ÞOŒ2=oóØ…² ˆ´bV šSl° vX@¦/‘!Þ ÎO` uì p²oÆé4FÜYÕû‰³(=€¡!Ä804PƸ‚•Rò& AA iü;¸ŠÛc%ÌÀ€×Ñž…ܜтKÆy™âHB<³F+4q¶ÈkZºøôû Ù8î\X îp00ÿ#Gù€Zø”óeh6ÓÕÈIÄ«F­ÁÄ«c f`¹›,¨[ ÍQ±d’+vihH@˜4 ‰ J‘ B1M”#MQ„DˆR¦\¦•r™tƒJ&äØ Ð9, Ûµ“¨ÿÎd$ð“Á8ðŒ&3h†ÂZô¨9>˜:+mh<©o`¥•Ãr·ƒ*‹µªgV¶˜ÀQ%Ä\³».”ÚM%CC›Å3bY€ü©Lp?Õýtƒ3IžöµŽ›‰ 6xµ£)cþÙOV0¸‚b,`$‚9èÚ¢IDÖÝp)àmCÙìa?ЊDÿS¸îl;.H‡M‘xÁHcM_Ç]ºÛ É©m–Ò‰ 9m°Pè=ì$HA’ÓD†‚zl$° (ÿÈ$Ù,»h )¥ÚôÙåv¡B`‚P·B„ÓÙ‚Xœ”¼aÜC@HA÷À]Z¢ö£Ý7ÎpR›ºÄ6²b%’ݸRI—5C6©‡A´‚ÂkÔ¦tbܘ­ À` %G,4ú%è¦P̾š¦ªYÐsM{ `ÍjæŠðJp6ŠÅ(”ì[‚YH†€‰â„KRäŠ8‰`œ^mZ8Œ‚HaP8tJ2!…J…Ñn®Ú’S*‚ª‚¨…UŸÓÄÃbåÕ^8Þ¿yƒ’»þá„q‚áR¦©‘œb³NæLÐP2ôåNìD$åv þ1àí)þp‰"B2BBV=»uÁÿÉíÈ)ŒæUX?ˆ½£g(åÍÍŠvêÜ×);º£qJ·éàÍÉ"s•LþÞ_(¿Ëõ÷¹Í>‚PõGØ{³`Ã@¤"¶ù/©¨˜-ƒÛoãä ýb|Ä“mÇ@7éòËV•ðˆE°Æ)’V,nAóìá_ÎÉ ¾N©ì‡—f Y‹ º*5x¼JK>^àÜ$ ‰Pªì–îb‚mW« %”\¨\ª“IÂ4‘EX¹…T}‡´×H0 "‡Ÿ™Úq틟i„;«“ï×Oª_¨cAønAìr á5àÈ¡k¶L;eÛ#byZ©.ÛÒZ[åk×7Û­/—Uû…J1qŒ”NÃca¿€"Ÿ­šáÓ¹‘$Yk“Ó+¶ðÐÿ'³t=Û0º¯œN‡7T~®Ö! —k³€¨Š1[j5£Q´UlZƶ5´ZÕ¶6±mFÔkB„Àzá {``@@KšJ6ÌÍWâÝuý†Juüšù¶£Ú`Dó(»ø:ó`÷û`@ °{ aé°,ªSÀ¡í‘ï÷mRÄÉÙGQOÜ6~ßöïèyGw€(to˜I˜¸a¯+ø5ÉýÌ[ãšØÞùÞm|îe™öÄ ’㎪ª©¡àP*ð(‘„€|›6‡.<‘Ñ€~–UöØGzúµí¬¬Û_­òêDh^¹v¦‡@Û‡HHBD‰¥“M6Ô‘›`lZÚè 3LŒ cŒ†’üO)Šªò(ª)²ÛÎF~˜”Ð#Y…‹”e/;¼pr–ÀI&‹ÑÑ(¢ˆ‡Y ä7 ¥˜^C!¹¹{FT©»Aìý=És ÉN-x݇c+ÊÌ]Tü¤€I lstÃŪ¡P$¼¢Iy‚l‚¨/xŒ–I)4™M+FÖ™µQ:"<Á[ˆçËÈô\ ‡Érì…-G—±G‘Ý<ƒùŒÃÙ¾7¡æHHŒ‡âÉ5&á!ßèE[ URÍHFƒlAZˆX0Xˆ•$_Y ‘6gýÿõ„ïþ­X$áÿ1Ëÿ‡*{ Êcáº/ü°¢wÝ¥Dªäÿ`þˆ;¢<¥þùßü®£e_ý»”CpÔ‹µ#ù3—£à,‡c7Xíü—ñúÏ\¯ùJÆ1Tî)¸ü*YEQw €‚5ÖÀlŲŠHbÒ†UZ—BƒT,Eº”8¢ˆbÀ²Vq–­ À0⯋\ôå2µéÖ*%“Y-Ír¤Å¢ÜÖì-Ê’‘j%˜·—+yXLæ˜mi"@ö¸î r‡B0Š„”ülë–?Þù°Û@ˆAB3CÙh± } ƒ‹O`Oørwбžey!~÷þ½ó;§y¶XÈúŸô6”>?5ö+¹ßÿÉb;‚¿N@ÿtûtlàô„v>ÊÀ§üAÐ4'Õ>ÿýæ6—b›œ«³ñâ|_.Øúä•<–]·Qd²¿’^äöG£òDØôjà•è~E‰°ôÿw`Ñáø]TÜÛ/#b'RÔb PYˆüÏïø|£çí×iU_à B‰b¤”}Óì.‚C<¡Ü¸‘î8‚”W‡oÈZð{ŸõŽî ‡óv:?SîúFïi;€ýƒëÒ/¿æ4ØëòŠy~~L×Ô}=7P⟎ÕPJFŠ@±$J€Æ5”:ö‹Ç¼¡K€Íþ.ý‡@uwî|¿Èo °Ë þq’A™4Éûw0ÌZ@ÙF’-bÔ–m¦«ieH¶bMwu4ȲÓ,Ù‹ Dw±À8ÈÎFŠ’$…Ë¢~ZxCßìÛúv¿QàéëF…]ä„! d¢'pu´Ùÿ ¥¡Ô #é›ALs‡xnÓ¡‘ø|¡ŽËèô~ÃyÄÀ$C´”Gî2:—´ÌÛ œÖzh —íhAN×Ey°ÚŒ H¥lQX2IQjÿ“ÿ )\{Rzp¿ì$ŒI$ ê…Ðï >hGaýÂcÜ?3Þ–¿caO`óÿªzü‘ù~¦ýg‘ Íåñð"ñ/zêyЀ¿Ã»à±u~1A‘ÜÎâ<ƒÄ#Ë✇ä ö:2õá]Œ7õë¿~^Ý!:Û¦ËÞÝbPžªªªU4”À±Ð±GR>±$CÐá ,*„!: å>pŒI[Ä~0Çþ‡v}¡˜ÂPÝ…@•Ûnï!–F¹èBè qKBŸòÃÑTÌR¦ƒ õä›E$a!ÿPMR 7AHEˆbT$ ŒÝøõêùÕÕ³V#G]ºÍ/‹(l•HIjUÎ àVôT’UT$ª£lÅ…ƒb@·wþà…Ñ)ˆeÿÈt?t ¨èÁ½Æúô/Iür /MÈLkƒoßýçþlø»ƒ¾Ð¶ŠÆüSEPUQÃiÀÇ#ìb}‚íØÙ®ÂzÇ6·†¯§£/éà66äv½Ì!GŽ=¾úùürk²ÊÎ u«†UU™º5N5Š~~d’A$ +Ö¿Klú£÷«W¿ß¢ŸÀVúÒkrưta©q&Kú @° @aÃÿ>›‹l Ùí6®Ž¡Ñz$©'h>ç‹d$Á“ytw6Ó 3«rn\¥ùà,m@qFÖMJyĹ›ÈÛCL ˆ™õ ª"š¤(:ªÅl¼¦"ØaõÍ÷ðÛð®mÊï—ñ0ëM[ѺâÀ»¼`¼]Œ®ùdÀáÓ³·R<(ÈB06„ˆïé„B&¨1ÌLPÙ6PR~Ã2¤I€Qb2"9BE&ê¡RÕj¹µH‡L4à:BÖK¬ìŸP…¥æ <©C7 ¬4ìÐИj­Ïò p1!ÂB`@‚á™÷MDŸ°À,¡nA„;6 pC`ظön5K!Aw5{ÕK”c5´ @χUÜ~Á’ €“Lhœ½»Í*5RHÕ0¬”Qì§WUv:ºÂwùê»Û|ÕÛ¥%ÓμA).Ýï^÷Î]TQ«ePŒB Q% ")Ã`6°Ã~÷‚%VªKÑ’K—\~•Ýz"̾ jÚÕu´B1†6ȼº¯Õ™sgUï{ÝM/…—Å…KJ?µïž[Ú«Äw¡G “TëU[|§UÂÓ aôK û ªZû7*®º55$%4© ¬_Ô5Eíw[BFF„20P¶Á›Åv¢0C z¢A¦-è3z` &PH €ÐŒÊ2-³z4б"!€Ò4\^„áb€Æn¡ò \"SïÊ›’‡NRó2„äR0ž8vß ¼˜9 EE©Ð `r,Xª˜Pˆ²Õ ÑQÄFkàÞR½,.r+¸þðÚÅv+¤dI£ÈA à,á¡­‡ê©ô"š;“U%22¦üÿ€ÂŸéýÛˆ=]’NÔ'ërNªªªHÕ¢ ×_n¶Ë·._sfQÒÕÓ4¥Âس<Ïdô Î@Í‘)CÀ¨6<ÑEQUU0ÙÈ–)žp£ÀjHB2wRl»¯h?ð‚¨/ÐÛüýÏsq{òèÿ§r˜Ñ!R2uBTT • F”üv¸À†@ýKØæª™L[º¹F»»…ÎåÁÙ#€S %ßÈ*‚ø ª ÿ°" }×ÄŸÁñOñµóAIõ]‡ð>ãð4¿x{ÃûnŸß· nÿ‹È~AýÇy§3ß1`ÆÇû¸òÛº„?bÖ…F‡†QÁAEæÌK½OÖô†_ø¬̉éØô¤Ñß{ðÛáéN¯íNÿàžÁéŸXa1áèÁÕtú/ëðõ{J(Ÿ|¡|ÏéÕ-ìêíñ÷õí”}w.6?=·ÞÇÂêø8Áõ?Ê`8&K)É›+Âë€*‡¹r?ºòBÁH]¶É è‚è*™=’nùOÐØÔ=ÖÜ=ëôt¶D¬<¬(-E][»·:txä .ÚŸ8MA¾‹Ú&CÚ÷÷ÿùŠ É2šÈ7 DøH†ƒÿøB‹Ã¹ÛTÿMOLQá‰ÑüDiŠ$`$$™¢§¦Ñû†fhvã†nãWŒ€:ÕTÌ’TÏP&f"žM “d‰²ª«²”I™% ª2P$ßµÍbϬšó§…ò~·Üõ¾ÐÞî¶{ ˆ@“jpÄå“h‚ÍÑËžÅq¯«®¼lÏ<Ì«¾§Ä„‹¤„‹Ñý•-OºGÕã^4«q¨ mH@>N]â·œ÷œ×=ãž>m.3^â]3LÝJTH&Ç|&LuÉ&d”Ù§,rïÏ>y¹x¼+ëF({Û ­–N‘ìºsœÜ5f”o<¦H€²…‡LÜ»lFGSœÓÄeÙ.âÑdä%· +  ÖÕVÑšª¹Ô£‘l ª„€®mߣ®/H©4ü\¸Œ+¶ôùÝÌÂJª‘Uº‘9 ¥,2Ã*Ä! r›xm§W:fjm¬bFú“×Á)¤™ÏP5^æ/™ÞµËîïdß0 vБ4tÄ/*5w…¢ô÷ÔRñhY™‚wv‰Eæ#–•â°:øíƒ“e=©)H¢¿üˆ†LÃï”§¡«»¿‚ü]ÉáBBvýaqbanking-5.6.4beta/src/plugins/bankinfo/generic/dbb.conf0000644000175000017500000000147312364015477020325 00000000000000 fixedWidth="1" condense="1" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="0" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match group="bank" width=8,1,58,5,35,27,5,11,2,6,11,8 # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="bankId" 2="xOwnBLZ" 3="bankName" 4="zipCode" 5="location" 6="xShortName" 7="xPAN" 8="BIC" 9="xCheckSum" 10="xnumber" 11="xChangeMark" 12="xToDelete" 13="xNextBLZ" } # columns aqbanking-5.6.4beta/src/plugins/bankinfo/generic/README0000644000175000017500000000202512364015477017601 00000000000000 This folder contains a convenience library which is used by bank info plugins to provide basic administration of bank info data. It is used by the plugin for AT and DE. Creating Data Files =================== The makefiles in this folder expect the following files to exist in the folder "data": German Banks: - blz.csv The CSV file of the Deutsche Bundesbank containing information about German banks (http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_bankleitzahlen_download.php) - fints_institute.csv CSV file containing information about banks supporting FinTS (see homepage of FinTS) Austrian Banks: - blz-at.csv CSV file containing the list of Austrian banks (as provided by the Oesterreichische Bundesbank) http://www.oenb.at/idakilz/kiverzeichnis?action=toDownloadPage http://www.stuzza.at/BLZEDI.php Swiss Banks: - http://www.sic.ch/de/tkicch_index/tkicch_onlineservices/tkicch_onlineservices_downloadbcbankmasterdata.htm US Banks: - FedACHdir.txt https://www.fededirectory.frb.org/FedACHdir.txt aqbanking-5.6.4beta/src/plugins/bankinfo/de/0000755000175000017500000000000012643540655015757 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/de/Makefile.in0000644000175000017500000006727712643540061017756 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo/de DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/de.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = de.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bankinfoplugindir)" \ "$(DESTDIR)$(bankinfoplugindir)" LTLIBRARIES = $(bankinfoplugin_LTLIBRARIES) am__DEPENDENCIES_1 = de_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../generic/libbankinfo_generic.la $(am__DEPENDENCIES_1) am_de_la_OBJECTS = de.lo de_la_OBJECTS = $(am_de_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = de_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(de_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(de_la_SOURCES) DIST_SOURCES = $(de_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(bankinfoplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) $(ktoblzcheck_includes) noinst_HEADERS = de_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES = de.la bankinfoplugin_DATA = de.xml de_la_SOURCES = de.c de_la_LIBADD = $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la @ktoblzcheck_libs@ $(gwenhywfar_libs) de_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/de/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/de/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): de.xml: $(top_builddir)/config.status $(srcdir)/de.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-bankinfopluginLTLIBRARIES: $(bankinfoplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bankinfoplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bankinfoplugindir)"; \ } uninstall-bankinfopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bankinfoplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bankinfoplugindir)/$$f"; \ done clean-bankinfopluginLTLIBRARIES: -test -z "$(bankinfoplugin_LTLIBRARIES)" || rm -f $(bankinfoplugin_LTLIBRARIES) @list='$(bankinfoplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } de.la: $(de_la_OBJECTS) $(de_la_DEPENDENCIES) $(EXTRA_de_la_DEPENDENCIES) $(AM_V_CCLD)$(de_la_LINK) -rpath $(bankinfoplugindir) $(de_la_OBJECTS) $(de_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/de.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-bankinfopluginDATA: $(bankinfoplugin_DATA) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bankinfoplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bankinfoplugindir)" || exit $$?; \ done uninstall-bankinfopluginDATA: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bankinfoplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bankinfoplugindir)" "$(DESTDIR)$(bankinfoplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-bankinfopluginDATA \ install-bankinfopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-bankinfopluginDATA install-bankinfopluginLTLIBRARIES \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES sources: for f in $(de_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/de/de.c0000644000175000017500000001214012364015477016430 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "de_p.h" #include "../generic/generic_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_DE); /* interface to gwens plugin loader */ GWEN_PLUGIN *bankinfo_de_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_BankInfo_new(pm, name, fileName); assert(pl); AB_Plugin_BankInfo_SetFactoryFn(pl, AB_Plugin_BankInfoDE_Factory); return pl; } /* interface to bankinfo plugin */ AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoDE_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_DE *bde; #ifdef HAVE_KTOBLZCHECK const char *s; GWEN_STRINGLIST *paths; #endif bip=AB_BankInfoPluginGENERIC_new(ab, "de"); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_DE, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_DE, bip, bde, AB_BankInfoPluginDE_FreeData); bde->banking=ab; #ifdef HAVE_KTOBLZCHECK s=AccountNumberCheck_libraryVersion(); if (s && GWEN_Text_ComparePattern(s, "1.8*", 0)!=-1) { DBG_WARN(AQBANKING_LOGDOMAIN, "WARNING:\n" "Bad version of KtoBlzCheck detected, " "please upgrade to 1.9.x or better.\n" " There is at least one known version of the 1.8 branch\n" " which corrupts the heap.\n"); } /* try to find the data file */ paths=AB_Banking_GetGlobalDataDirs(); if (paths) { GWEN_BUFFER *fbuf; int rv; /* for debian look also in /var/lib */ GWEN_StringList_AppendString(paths, "/var/lib", 0, 0); fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Directory_FindFileInPaths(paths, "ktoblzcheck" DIRSEP "bankdata.txt", fbuf); if (rv) { /* for debian look also in /var/lib/ktoblzcheck1 */ rv=GWEN_Directory_FindFileInPaths(paths, "ktoblzcheck1" DIRSEP "bankdata.txt", fbuf); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "File [%s] not found, falling back to default", "libktoblzcheck1" DIRSEP "bankdata.txt"); } } GWEN_StringList_free(paths); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bank data for KtoBlzCheck not found (%d), falling back to default", rv); } else { bde->checker=AccountNumberCheck_new_file(GWEN_Buffer_GetStart(fbuf)); if (!bde->checker) { DBG_ERROR(AQBANKING_LOGDOMAIN, "KtoBlzCheck returned an error"); GWEN_Buffer_free(fbuf); AB_BankInfoPlugin_free(bip); return 0; } } GWEN_Buffer_free(fbuf); } if (bde->checker==NULL) { bde->checker=AccountNumberCheck_new(); if (!bde->checker) { DBG_ERROR(AQBANKING_LOGDOMAIN, "KtoBlzCheck returned an error"); AB_BankInfoPlugin_free(bip); return 0; } } #endif AB_BankInfoPlugin_SetCheckAccountFn(bip, AB_BankInfoPluginDE_CheckAccount); return bip; } void GWENHYWFAR_CB AB_BankInfoPluginDE_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_DE *bde; bde=(AB_BANKINFO_PLUGIN_DE*)p; #ifdef HAVE_KTOBLZCHECK if (bde->checker) AccountNumberCheck_delete(bde->checker); #endif GWEN_FREE_OBJECT(bde); } AB_BANKINFO_CHECKRESULT AB_BankInfoPluginDE_CheckAccount(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId, const char *accountId){ AB_BANKINFO_PLUGIN_DE *bde; #ifdef HAVE_KTOBLZCHECK AccountNumberCheck_Result res; #endif AB_BANKINFO_CHECKRESULT cr; assert(bankId); assert(accountId); assert(bip); bde=GWEN_INHERIT_GETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_DE, bip); assert(bde); #ifdef HAVE_KTOBLZCHECK assert(bde->checker); res=AccountNumberCheck_check(bde->checker, bankId, accountId); switch(res) { case 0: cr=AB_BankInfoCheckResult_Ok; break; case 1: cr=AB_BankInfoCheckResult_UnknownResult; break; case 2: cr=AB_BankInfoCheckResult_NotOk; break; case 3: cr=AB_BankInfoCheckResult_UnknownBank; break; default: cr=AB_BankInfoCheckResult_UnknownResult; break; } /* switch */ #else cr=AB_BankInfoCheckResult_UnknownResult; #endif return cr; } aqbanking-5.6.4beta/src/plugins/bankinfo/de/de_p.h0000644000175000017500000000257412364015477016766 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_DE_P_H #define AQBANKING_BANKINFO_DE_P_H #include #include #ifdef HAVE_KTOBLZCHECK # include #endif typedef struct AB_BANKINFO_PLUGIN_DE AB_BANKINFO_PLUGIN_DE; struct AB_BANKINFO_PLUGIN_DE { AB_BANKING *banking; #ifdef HAVE_KTOBLZCHECK AccountNumberCheck *checker; #endif }; static void GWENHYWFAR_CB AB_BankInfoPluginDE_FreeData(void *bp, void *p); static AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoDE_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static AB_BANKINFO_CHECKRESULT AB_BankInfoPluginDE_CheckAccount(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId, const char *accountId); AQBANKING_EXPORT GWEN_PLUGIN *bankinfo_de_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); #endif /* AQBANKING_BANKINFO_DE_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/de/Makefile.am0000644000175000017500000000114212364015477017730 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) $(ktoblzcheck_includes) noinst_HEADERS=de_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES=de.la bankinfoplugin_DATA=de.xml de_la_SOURCES=de.c de_la_LIBADD= $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la @ktoblzcheck_libs@ $(gwenhywfar_libs) de_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(de_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/de/de.xml.in0000644000175000017500000000044012364015477017413 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Bank info checker for Germany This plugin handles German banks and accounts. aqbanking-5.6.4beta/src/plugins/bankinfo/Makefile.am0000644000175000017500000000026012364015477017340 00000000000000DIST_SUBDIRS=generic at ca ch de us SUBDIRS=generic $(aqbanking_plugins_bankinfo_dirs) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: aqbanking-5.6.4beta/src/plugins/bankinfo/ca/0000755000175000017500000000000012643540655015752 500000000000000aqbanking-5.6.4beta/src/plugins/bankinfo/ca/ca_p.h0000644000175000017500000000210012364015477016735 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_BANKINFO_CA_P_H #define AQBANKING_BANKINFO_CA_P_H #include #include typedef struct AB_BANKINFO_PLUGIN_CA AB_BANKINFO_PLUGIN_CA; struct AB_BANKINFO_PLUGIN_CA { AB_BANKING *banking; }; static void GWENHYWFAR_CB AB_BankInfoPluginCA_FreeData(void *bp, void *p); static AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoCA_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_EXPORT GWEN_PLUGIN *bankinfo_ca_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); #endif /* AQBANKING_BANKINFO_CA_P_H */ aqbanking-5.6.4beta/src/plugins/bankinfo/ca/ca.xml.in0000644000175000017500000000042512364015477017404 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Bank info provider for Canada This plugin handles Canadian banks. aqbanking-5.6.4beta/src/plugins/bankinfo/ca/Makefile.in0000644000175000017500000006722312643540060017737 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/bankinfo/ca DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/ca.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = ca.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bankinfoplugindir)" \ "$(DESTDIR)$(bankinfoplugindir)" LTLIBRARIES = $(bankinfoplugin_LTLIBRARIES) am__DEPENDENCIES_1 = ca_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../generic/libbankinfo_generic.la $(am__DEPENDENCIES_1) am_ca_la_OBJECTS = ca.lo ca_la_OBJECTS = $(am_ca_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ca_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ca_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ca_la_SOURCES) DIST_SOURCES = $(ca_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(bankinfoplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS = ca_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES = ca.la bankinfoplugin_DATA = ca.xml ca_la_SOURCES = ca.c ca_la_LIBADD = $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) ca_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/bankinfo/ca/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/bankinfo/ca/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ca.xml: $(top_builddir)/config.status $(srcdir)/ca.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-bankinfopluginLTLIBRARIES: $(bankinfoplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(bankinfoplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(bankinfoplugindir)"; \ } uninstall-bankinfopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_LTLIBRARIES)'; test -n "$(bankinfoplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(bankinfoplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(bankinfoplugindir)/$$f"; \ done clean-bankinfopluginLTLIBRARIES: -test -z "$(bankinfoplugin_LTLIBRARIES)" || rm -f $(bankinfoplugin_LTLIBRARIES) @list='$(bankinfoplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ca.la: $(ca_la_OBJECTS) $(ca_la_DEPENDENCIES) $(EXTRA_ca_la_DEPENDENCIES) $(AM_V_CCLD)$(ca_la_LINK) -rpath $(bankinfoplugindir) $(ca_la_OBJECTS) $(ca_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ca.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-bankinfopluginDATA: $(bankinfoplugin_DATA) @$(NORMAL_INSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bankinfoplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bankinfoplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bankinfoplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bankinfoplugindir)" || exit $$?; \ done uninstall-bankinfopluginDATA: @$(NORMAL_UNINSTALL) @list='$(bankinfoplugin_DATA)'; test -n "$(bankinfoplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bankinfoplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bankinfoplugindir)" "$(DESTDIR)$(bankinfoplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-bankinfopluginDATA \ install-bankinfopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-bankinfopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-bankinfopluginDATA install-bankinfopluginLTLIBRARIES \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-bankinfopluginDATA \ uninstall-bankinfopluginLTLIBRARIES sources: for f in $(ca_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/bankinfo/ca/Makefile.am0000644000175000017500000000106612364015477017730 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS=ca_p.h bankinfoplugindir = $(aqbanking_plugindir)/bankinfo bankinfoplugin_LTLIBRARIES=ca.la bankinfoplugin_DATA=ca.xml ca_la_SOURCES=ca.c ca_la_LIBADD= $(aqbanking_internal_libs) ../generic/libbankinfo_generic.la $(gwenhywfar_libs) ca_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(ca_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(bankinfoplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/bankinfo/ca/ca.c0000644000175000017500000000344312364015477016424 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ca_p.h" #include "../generic/generic_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_CA); /* interface to gwens plugin loader */ GWEN_PLUGIN *bankinfo_ca_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_BankInfo_new(pm, name, fileName); assert(pl); AB_Plugin_BankInfo_SetFactoryFn(pl, AB_Plugin_BankInfoCA_Factory); return pl; } /* interface to bankinfo plugin */ AB_BANKINFO_PLUGIN *AB_Plugin_BankInfoCA_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_BANKINFO_PLUGIN *bip; AB_BANKINFO_PLUGIN_CA *bde; bip=AB_BankInfoPluginGENERIC_new(ab, "ca"); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN_CA, bde); GWEN_INHERIT_SETDATA(AB_BANKINFO_PLUGIN, AB_BANKINFO_PLUGIN_CA, bip, bde, AB_BankInfoPluginCA_FreeData); bde->banking=ab; return bip; } void GWENHYWFAR_CB AB_BankInfoPluginCA_FreeData(void *bp, void *p){ AB_BANKINFO_PLUGIN_CA *bde; bde=(AB_BANKINFO_PLUGIN_CA*)p; GWEN_FREE_OBJECT(bde); } aqbanking-5.6.4beta/src/plugins/backends/0000755000175000017500000000000012643540660015346 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/0000755000175000017500000000000012643540657016603 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/Makefile.in0000644000175000017500000006026512643540056020572 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = plugin tools CLEANFILES = $(BUILT_SOURCES) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/0000755000175000017500000000000012643540657020101 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/0000755000175000017500000000000012643540657021177 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobtransferbase_p.h0000644000175000017500000000262412375175275024767 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBTRANSFERBASE_P_H #define AH_JOBTRANSFERBASE_P_H #include "jobtransferbase_l.h" #include typedef struct AH_JOB_TRANSFERBASE AH_JOB_TRANSFERBASE; struct AH_JOB_TRANSFERBASE { AB_TRANSACTION_TYPE transactionType; AB_TRANSACTION_SUBTYPE transactionSubType; char *fiid; AH_JOB_TRANSFERBASE_EXCHANGE_FN exchangeParamsFn; AH_JOB_TRANSFERBASE_EXCHANGE_FN exchangeArgsFn; AH_JOB_TRANSFERBASE_EXCHANGE_FN exchangeResultsFn; }; static void GWENHYWFAR_CB AH_Job_TransferBase_FreeData(void *bp, void *p); static int AH_Job_TransferBase_ExchangeResults(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_TransferBase_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_TransferBase_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBTRANSFERBASE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetbalance.xml0000644000175000017500000002426512375175275024434 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfersingle_p.h0000644000175000017500000000140412375175275025322 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPAXFERSINGLE_P_H #define AH_JOBSEPAXFERSINGLE_P_H #include "jobsepaxfersingle_l.h" #include static int AH_Job_SepaTransferSingle_Prepare(AH_JOB *j); static int AH_Job_SepaTransferSingle_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); #endif /* AH_JOBSEPAXFERSINGLE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobforeignxferwh.c0000644000175000017500000000702012375175275024634 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: jobmultitransfer.c 1309 2007-10-24 01:48:05Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobforeignxferwh_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_FOREIGNXFERWH); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_ForeignTransferWH_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_FOREIGNXFERWH *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *dbParams; j=AH_AccountJob_new("JobForeignTransferWH", u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 60); GWEN_NEW_OBJECT(AH_JOB_FOREIGNXFERWH, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_FOREIGNXFERWH, j, aj, AH_Job_ForeignTransferWH_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_ForeignTransferWH_Process); AH_Job_SetExchangeFn(j, AH_Job_ForeignTransferWH_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankCode", AB_Account_GetBankCode(account)); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountId", AB_Account_GetAccountNumber(account)); dbParams=AH_Job_GetParams(j); aj->maxTransfers=GWEN_DB_GetIntValue(dbParams, "maxTransfers", 0, 0); if (aj->maxTransfers==0 || aj->maxTransfers>AH_JOBFOREIGNXFERWH_MAXTRANS) aj->maxTransfers=AH_JOBFOREIGNXFERWH_MAXTRANS; return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_ForeignTransferWH_FreeData(void *bp, void *p){ AH_JOB_FOREIGNXFERWH *aj; aj=(AH_JOB_FOREIGNXFERWH*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_ForeignTransferWH_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_FOREIGNXFERWH *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_FOREIGNXFERWH, j); assert(aj); DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobForeignTransferWH"); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_ForeignTransferWH_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ /* this function is not needed since there is no AB_Job for this */ return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_ForeignTransferWH_SetDtazv(AH_JOB *j, const uint8_t *dataPtr, uint32_t dataLen) { GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetBinValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "transfers", dataPtr, dataLen); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsingletransfer.c0000644000175000017500000014515312375175275025017 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsingletransfer_p.h" #include "job_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_SINGLETRANSFER); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SingleTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeTransfer); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SingleDebitNote_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeDebitNote); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_CreateStandingOrder_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeCreateStandingOrder); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_ModifyStandingOrder_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeModifyStandingOrder); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_DeleteStandingOrder_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeDeleteStandingOrder); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_CreateDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeCreateDatedTransfer); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_ModifyDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeModifyDatedTransfer); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_DeleteDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeDeleteDatedTransfer); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_InternalTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_SingleTransferBase_new(u, account, AB_Job_TypeInternalTransfer); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SingleTransferBase_new(AB_USER *u, AB_ACCOUNT *account, AB_JOB_TYPE jobType) { AH_JOB *j; AH_JOB_SINGLETRANSFER *aj; switch(jobType) { case AB_Job_TypeTransfer: j=AH_AccountJob_new("JobSingleTransfer", u, account); break; case AB_Job_TypeDebitNote: j=AH_AccountJob_new("JobSingleDebitNote", u, account); break; case AB_Job_TypeCreateStandingOrder: j=AH_AccountJob_new("JobCreateStandingOrder", u, account); break; case AB_Job_TypeModifyStandingOrder: j=AH_AccountJob_new("JobModifyStandingOrder", u, account); break; case AB_Job_TypeDeleteStandingOrder: j=AH_AccountJob_new("JobDeleteStandingOrder", u, account); break; case AB_Job_TypeCreateDatedTransfer: j=AH_AccountJob_new("JobCreateDatedTransfer", u, account); break; case AB_Job_TypeModifyDatedTransfer: j=AH_AccountJob_new("JobModifyDatedTransfer", u, account); break; case AB_Job_TypeDeleteDatedTransfer: j=AH_AccountJob_new("JobDeleteDatedTransfer", u, account); break; case AB_Job_TypeInternalTransfer: j=AH_AccountJob_new("JobInternalTransfer", u, account); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown job type %d", jobType); j=0; } if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_SINGLETRANSFER, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j, aj, AH_Job_SingleTransfer_FreeData); aj->jobType=jobType; /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_SingleTransfer_Process); AH_Job_SetExchangeFn(j, AH_Job_SingleTransfer_Exchange); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SingleTransfer_AddChallengeParams); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_SingleTransfer_FreeData(void *bp, void *p){ AH_JOB_SINGLETRANSFER *aj; aj=(AH_JOB_SINGLETRANSFER*)p; free(aj->fiid); free(aj->oldFiid); AB_Transaction_free(aj->validatedTransaction); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Job_SingleTransfer_GetFiid(AH_JOB *j) { AH_JOB_SINGLETRANSFER *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j); assert(aj); return aj->fiid; } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Job_SingleTransfer_GetOldFiid(AH_JOB *j) { AH_JOB_SINGLETRANSFER *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j); assert(aj); return aj->oldFiid; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SingleTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_SINGLETRANSFER *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j); assert(aj); DBG_INFO(AQHBCI_LOGDOMAIN, "Processing %s", AB_Job_Type2Char(aj->jobType)); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); switch(aj->jobType) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: case AB_Job_TypeDeleteStandingOrder: case AB_Job_TypeDeleteDatedTransfer: case AB_Job_TypeInternalTransfer: dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } break; case AB_Job_TypeCreateStandingOrder: /* search for "CreateStandingOrderResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/CreateStandingOrderResponse"); if (dbXA) { const char *s; s=GWEN_DB_GetCharValue(dbXA, "referenceId", 0, 0); if (s) { free(aj->fiid); aj->fiid=strdup(s); } } /* if "standingOrderResponse" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } break; case AB_Job_TypeModifyStandingOrder: /* search for "ModifyStandingOrderResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/ModifyStandingOrderResponse"); if (dbXA) { const char *s; s=GWEN_DB_GetCharValue(dbXA, "referenceIdOld", 0, 0); if (s) { free(aj->oldFiid); aj->oldFiid=strdup(s); } s=GWEN_DB_GetCharValue(dbXA, "referenceIdNew", 0, 0); if (s) { free(aj->fiid); aj->fiid=strdup(s); } } /* if "standingOrderResponse" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } break; case AB_Job_TypeCreateDatedTransfer: /* search for "CreateDatedTransferResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/CreateDatedTransferResponse"); if (dbXA) { const char *s; s=GWEN_DB_GetCharValue(dbXA, "referenceId", 0, 0); if (s) { free(aj->fiid); aj->fiid=strdup(s); } } /* if "standingOrderResponse" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } break; case AB_Job_TypeModifyDatedTransfer: /* search for "ModifyDatedTransferResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/ModifyDatedTransferResponse"); if (dbXA) { const char *s; s=GWEN_DB_GetCharValue(dbXA, "referenceIdOld", 0, 0); if (s) { free(aj->oldFiid); aj->oldFiid=strdup(s); } s=GWEN_DB_GetCharValue(dbXA, "referenceIdNew", 0, 0); if (s) { free(aj->fiid); aj->fiid=strdup(s); } } /* if "standingOrderResponse" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled job type %d", aj->jobType); return -1; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SingleTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t) { const GWEN_STRINGLIST *sl; int maxn; int maxs; int n; const char *s; AH_JOB_SINGLETRANSFER *aj; const AB_TRANSACTION_LIMITS *lim; assert(mj); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, mj); assert(aj); lim=AB_Job_GetFieldLimits(bj); /* check purpose */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesPurpose(lim); maxs=AB_TransactionLimits_GetMaxLenPurpose(lim); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No transaction limits"); maxn=0; maxs=0; } sl=AB_Transaction_GetPurpose(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; GWEN_STRINGLIST *nsl; const char *p; nsl=GWEN_StringList_new(); se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { char *np; int l; GWEN_BUFFER *tbuf; n++; if (maxn && n>maxn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many purpose lines (%d>%d)", n, maxn); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Too many purpose lines (%d>%d)"), n, maxn); GWEN_StringList_free(nsl); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); GWEN_Text_CondenseBuffer(tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (maxs && l>maxs) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many chars in purpose line %d (%d>%d)", n, l, maxs); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Too many chars in purpose line %d (%d>%d)"), n, l, maxs); GWEN_StringList_free(nsl); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } np=(char*)malloc(l+1); memmove(np, GWEN_Buffer_GetStart(tbuf), l+1); GWEN_Buffer_free(tbuf); /* let string list take the newly alllocated string */ GWEN_StringList_AppendString(nsl, np, 1, 0); } se=GWEN_StringListEntry_Next(se); } /* while */ AB_Transaction_SetPurpose(t, nsl); GWEN_StringList_free(nsl); } if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No purpose lines"); return GWEN_ERROR_INVALID; } /* check remote name */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesRemoteName(lim); maxs=AB_TransactionLimits_GetMaxLenRemoteName(lim); } else { maxn=0; maxs=0; } sl=AB_Transaction_GetRemoteName(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; GWEN_STRINGLIST *nsl; const char *p; nsl=GWEN_StringList_new(); se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { char *np; int l; GWEN_BUFFER *tbuf; n++; if (maxn && n>maxn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many remote name lines (%d>%d)", n, maxn); GWEN_StringList_free(nsl); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); GWEN_Text_CondenseBuffer(tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (l>maxs) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many chars in remote name line %d (%d>%d)", n, l, maxs); GWEN_StringList_free(nsl); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } np=(char*)malloc(l+1); memmove(np, GWEN_Buffer_GetStart(tbuf), l+1); GWEN_Buffer_free(tbuf); /* let string list take the newly alllocated string */ GWEN_StringList_AppendString(nsl, np, 1, 0); } se=GWEN_StringListEntry_Next(se); } /* while */ AB_Transaction_SetRemoteName(t, nsl); GWEN_StringList_free(nsl); } if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote name lines"); return GWEN_ERROR_INVALID; } /* check local name */ s=AB_Transaction_GetLocalName(t); if (!s) { AB_ACCOUNT *a; DBG_NOTICE(AQHBCI_LOGDOMAIN, "No local name, filling in"); a=AB_Job_GetAccount(bj); assert(a); s=AB_Account_GetOwnerName(a); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No owner name in account, giving up"); return GWEN_ERROR_INVALID; } AB_Transaction_SetLocalName(t, s); } /* check local bank code */ s=AB_Transaction_GetLocalBankCode(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local bank code, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetBankCode(a); assert(s); AB_Transaction_SetLocalBankCode(t, s); } /* check local account number */ s=AB_Transaction_GetLocalAccountNumber(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local account number, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetAccountNumber(a); assert(s); AB_Transaction_SetLocalAccountNumber(t, s); } /* check local account suffix */ s=AB_Transaction_GetLocalSuffix(t); if (!s) { AB_ACCOUNT *a; DBG_INFO(AQHBCI_LOGDOMAIN, "No local suffix, filling in (if possible)"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetSubAccountId(a); if (s && *s) AB_Transaction_SetLocalSuffix(t, s); } /* check text key */ if (lim) { if (GWEN_StringList_Count(AB_TransactionLimits_GetValuesTextKey(lim))){ char numbuf[32]; n=AB_Transaction_GetTextKey(t); if (n==0) { switch(aj->jobType) { case AB_Job_TypeDebitNote: n=5; /* "Lastschrift" */ break; case AB_Job_TypeTransfer: case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: case AB_Job_TypeInternalTransfer: default: n=51; /* "Ueberweisung" */ break; } AB_Transaction_SetTextKey(t, n); } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesTextKey(lim, numbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Text key \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Text key \"%d\" not supported by the bank"), n); return GWEN_ERROR_INVALID; } } } if (lim) { const GWEN_TIME *ti; switch(aj->jobType) { case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: /* additional checks for standing orders */ /* check period */ if (AB_Transaction_GetPeriod(t)==AB_Transaction_PeriodMonthly) { const GWEN_STRINGLIST *sl; /* check cycle */ sl=AB_TransactionLimits_GetValuesCycleMonth(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; n=AB_Transaction_GetCycle(t); if (n==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No cycle given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesCycleMonth(lim, numbuf) && !AB_TransactionLimits_HasValuesCycleMonth(lim, "0")) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* check execution day */ sl=AB_TransactionLimits_GetValuesExecutionDayMonth(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; n=AB_Transaction_GetExecutionDay(t); if (n==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No execution day given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesExecutionDayMonth(lim, numbuf) && !AB_TransactionLimits_HasValuesExecutionDayMonth(lim, "0")) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Execution month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Execution month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ } else if (AB_Transaction_GetPeriod(t)==AB_Transaction_PeriodWeekly) { const GWEN_STRINGLIST *sl; /* check cycle */ sl=AB_TransactionLimits_GetValuesCycleWeek(lim); if (GWEN_StringList_Count(sl)) { char numbuf[32]; n=AB_Transaction_GetCycle(t); if (n==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No cycle given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesCycleWeek(lim, numbuf) && !AB_TransactionLimits_HasValuesCycleWeek(lim, "0")) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Week day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Week day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ /* check execution day */ sl=AB_TransactionLimits_GetValuesExecutionDayWeek(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; n=AB_Transaction_GetExecutionDay(t); if (n==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No execution day given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesExecutionDayWeek(lim, numbuf) && !AB_TransactionLimits_HasValuesExecutionDayWeek(lim, "0")) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Execution month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Execution month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unsupported period %d", AB_Transaction_GetPeriod(t)); return GWEN_ERROR_INVALID; } /* check setup times */ ti=AB_Transaction_GetFirstExecutionDate(t); if (ti && aj->jobType==AB_Job_TypeCreateStandingOrder) { GWEN_TIME *currDate; int dt; currDate=GWEN_CurrentTime(); assert(currDate); dt=((int)GWEN_Time_DiffSeconds(ti, currDate))/(60*60*24); GWEN_Time_free(currDate); /* check minimum setup time */ n=AB_TransactionLimits_GetMinValueSetupTime(lim); if (n && dtn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Maximum setup time violated"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Maximum setup time violated. " "Dated transactions need to be at most %d days away"), n); return GWEN_ERROR_INVALID; } } break; case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: /* check setup times */ ti=AB_Transaction_GetDate(t); if (ti) { GWEN_TIME *currDate; int dt; currDate=GWEN_CurrentTime(); assert(currDate); dt=((int)GWEN_Time_DiffSeconds(ti, currDate))/(60*60*24); GWEN_Time_free(currDate); /* check minimum setup time */ n=AB_TransactionLimits_GetMinValueSetupTime(lim); if (n && dtn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Maximum setup time violated"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Maximum setup time violated. " "Dated transactions need to be at most %d days away"), n); return GWEN_ERROR_INVALID; } } break; case AB_Job_TypeDeleteDatedTransfer: break; /* --------------- add more jobs here ---------------------- */ default: break; } /* switch */ } return 0; } int AH_Job_SingleTransfer_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { AH_JOB_SINGLETRANSFER *aj; const AB_TRANSACTION *t; const char *s; int tanVer=AH_JOB_TANVER_1_4; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j); assert(aj); t=aj->validatedTransaction; if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No validated transaction"); return GWEN_ERROR_INVALID; } s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } if (tanVer==AH_JOB_TANVER_1_4) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); switch(aj->jobType) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: { const char *s; const AB_VALUE *v; /* select challenge class (why the heck doesn't the bank derive this from the job??) */ switch(aj->jobType) { case AB_Job_TypeTransfer: AH_Job_SetChallengeClass(j, 4); break; case AB_Job_TypeDebitNote: AH_Job_SetChallengeClass(j, 15); break; case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: AH_Job_SetChallengeClass(j, 34); break; default: /* TSNH */ break; } /* P1: Betrag */ v=AB_Transaction_GetValue(t); if (v) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_Job_ValueToChallengeString(v, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* P2: BLZ Zahler/Empfaenger */ s=AB_Transaction_GetRemoteBankCode(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P3: Konto Zahler/Empfaenger */ s=AB_Transaction_GetRemoteAccountNumber(t); if (s && *s) { int i; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Buffer_AppendString(tbuf, s); i=10-strlen(s); if (i>0) { /* need to left-fill the account number with leading zeroes * to a length of exactly 10 digits */ GWEN_Buffer_Rewind(tbuf); GWEN_Buffer_FillLeftWithBytes(tbuf, '0', i); } AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No account number"); return GWEN_ERROR_INVALID; } #if 0 /* don't provide more info than needed, more data=more trouble sources */ /* P4: BLZ Absender (O) */ s=AB_Transaction_GetLocalBankCode(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P5: Konto Absender (O) */ s=AB_Transaction_GetLocalAccountNumber(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); if (aj->jobType==AB_Job_TypeTransfer) { /* P6: Name Absender (O) */ s=AB_Transaction_GetLocalName(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); } #endif } break; case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: case AB_Job_TypeDeleteDatedTransfer: { const char *s; const AB_VALUE *v; const GWEN_TIME *ti; GWEN_BUFFER *tbuf; /* P1: Betrag */ v=AB_Transaction_GetValue(t); assert(v); tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(v, tbuf, 2, 0); /* TODO: currency needed?? */ AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); /* P2: BLZ Empfaenger */ s=AB_Transaction_GetRemoteBankCode(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P3: Konto Empfaenger */ s=AB_Transaction_GetRemoteAccountNumber(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P4: Termin (M) */ ti=AB_Transaction_GetDate(t); assert(ti); tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); /* P5: BLZ Absender (O) */ s=AB_Transaction_GetLocalBankCode(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P6: Konto Absender (O) */ s=AB_Transaction_GetLocalAccountNumber(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P7: Name Absender (O) */ s=AB_Transaction_GetLocalName(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); } break; case AB_Job_TypeInternalTransfer: { const char *s; const AB_VALUE *v; GWEN_BUFFER *tbuf; AH_Job_SetChallengeClass(j, 5); /* P1: Betrag */ v=AB_Transaction_GetValue(t); assert(v); tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(v, tbuf, 2, 0); /* TODO: currency needed?? */ AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); /* P2: Konto Empfaenger */ s=AB_Transaction_GetRemoteAccountNumber(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P3: Konto Absender (O) */ s=AB_Transaction_GetLocalAccountNumber(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); /* P4: Name Empfaenger (O) (we use the local name here instead, but it is the same as the remote name) */ s=AB_Transaction_GetLocalName(t); assert(s && *s); AH_Job_AddChallengeParam(j, s); } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled job type %d", aj->jobType); return GWEN_ERROR_INVALID; } /* switch */ } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SingleTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_SINGLETRANSFER *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SINGLETRANSFER, j); assert(aj); if (aj->jobType!=AB_Job_GetType(bj)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Different job types"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: { GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbTk; AB_TRANSACTION_LIMITS *lim; const char *s; int i; dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* read limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 27); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 2); AB_TransactionLimits_SetNeedDate(lim, -1); i=GWEN_DB_GetIntValue(dbParams, "maxpurposeLines", 0, 0); AB_TransactionLimits_SetMaxLinesPurpose(lim, i); /* read text keys */ dbTk=GWEN_DB_GetGroup(dbParams, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "textkey"); if (dbTk) { for (i=0; ; i++) { int k; char numbuf[16]; k=GWEN_DB_GetIntValue(dbTk, "key", i, -1); if (k==-1) break; snprintf(numbuf, sizeof(numbuf), "%d", k); AB_TransactionLimits_AddValuesTextKey(lim, numbuf, 0); } GWEN_StringList_Sort(AB_TransactionLimits_GetValuesTextKey(lim), 1, GWEN_StringList_SortModeInt); } /* some special limits for standing order jobs */ switch(aj->jobType) { case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: s=GWEN_DB_GetCharValue(dbParams, "AllowedTurnusMonths", 0, 0); if (s && *s) { AB_TransactionLimits_SetAllowMonthly(lim, 1); while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesCycleMonth(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesCycleMonth(lim), 1, GWEN_StringList_SortModeInt); } else AB_TransactionLimits_SetAllowMonthly(lim, -1); s=GWEN_DB_GetCharValue(dbParams, "AllowedMonthDays", 0, 0); if (s && *s) { while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesExecutionDayMonth(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesExecutionDayMonth(lim), 1, GWEN_StringList_SortModeInt); } s=GWEN_DB_GetCharValue(dbParams, "AllowedTurnusWeeks", 0, 0); if (s && *s) { AB_TransactionLimits_SetAllowWeekly(lim, 1); while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesCycleWeek(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesCycleWeek(lim), 1, GWEN_StringList_SortModeInt); } else AB_TransactionLimits_SetAllowWeekly(lim, -1); s=GWEN_DB_GetCharValue(dbParams, "AllowedWeekDays", 0, 0); if (s && *s) { while(*s) { char buf[2]; const char *x; buf[0]=*s; buf[1]=0; x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesExecutionDayWeek(lim, x, 0); s++; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesExecutionDayWeek(lim), 1, GWEN_StringList_SortModeInt); } i=GWEN_DB_GetIntValue(dbParams, "minDelay", 0, 0); AB_TransactionLimits_SetMinValueSetupTime(lim, i); i=GWEN_DB_GetIntValue(dbParams, "maxDelay", 0, 0); AB_TransactionLimits_SetMaxValueSetupTime(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgOtherAccount", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeRecipientAccount(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgOtherName", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeRecipientName(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgValue", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeValue(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgTextKey", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeTextKey(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgPurpose", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangePurpose(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgFirstDate", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeFirstExecutionDate(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgUnit", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangePeriod(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgTurnus", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeCycle(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgDay", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeExecutionDay(lim, i); s=GWEN_DB_GetCharValue(dbParams, "AllowChgLastDate", 0, ""); if (*s=='J') i=1; else if (*s=='N') i=-1; else i=0; AB_TransactionLimits_SetAllowChangeLastExecutionDate(lim, i); break; case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: AB_TransactionLimits_SetNeedDate(lim, 1); i=GWEN_DB_GetIntValue(dbParams, "minDelay", 0, 0); AB_TransactionLimits_SetMinValueSetupTime(lim, i); i=GWEN_DB_GetIntValue(dbParams, "maxDelay", 0, 0); AB_TransactionLimits_SetMaxValueSetupTime(lim, i); break; default: break; } /* store field limits */ AB_Job_SetFieldLimits(bj, lim); AB_TransactionLimits_free(lim); return 0; } case AH_Job_ExchangeModeArgs: { GWEN_DB_NODE *dbArgs; const AB_TRANSACTION *ot; const AB_VALUE *v; dbArgs=AH_Job_GetArguments(j); assert(dbArgs); ot=AB_Job_GetTransaction(bj); if (ot) { GWEN_DB_NODE *dbT; const char *p; const GWEN_STRINGLIST *sl; AB_TRANSACTION *t; const GWEN_TIME *ti; t=AB_Transaction_dup(ot); assert(t); if (AH_Job_SingleTransfer__ValidateTransfer(bj, j, t)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_INVALID; } /* store the validated transaction back into application job, * to allow the application to recognize answers to this job later */ AB_Job_SetTransaction(bj, t); /* preset challenge stuff */ AH_Job_SetChallengeClass(j, 4); AH_Job_SetChallengeValue(j, AB_Transaction_GetValue(t)); dbT=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "transaction"); assert(dbT); /* store transaction */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/country", 280); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/bankCode", AB_Transaction_GetLocalBankCode(t)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/accountId", AB_Transaction_GetLocalAccountNumber(t)); p=AB_Transaction_GetLocalSuffix(t); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/accountsubid", p); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", AB_Transaction_GetLocalName(t)); GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/country", 280); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/bankCode", AB_Transaction_GetRemoteBankCode(t)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/accountId", AB_Transaction_GetRemoteAccountNumber(t)); sl=AB_Transaction_GetRemoteName(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); GWEN_DB_DeleteVar(dbT, "otherName"); while(se) { p=GWEN_StringListEntry_Data(se); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT, "otherName", p); se=GWEN_StringListEntry_Next(se); } /* while */ } v=AB_Transaction_GetValue(t); if (v) { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; char *p; const char *s; int l; dbV=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); if (GWEN_Text_DoubleToBuffer(AB_Value_GetValueAsDouble(v), nbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Buffer overflow"); GWEN_Buffer_free(nbuf); abort(); } l=GWEN_Buffer_GetUsedBytes(nbuf); if (!l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); abort(); } /* replace "C" comma with "DE" comma, remove thousand's comma */ p=GWEN_Buffer_GetStart(nbuf); s=p; while(*s) { if (*s=='.') { *p=','; p++; } else if (*s!=',') { *p=*s; p++; } s++; } /* while */ *p=0; if (strchr(GWEN_Buffer_GetStart(nbuf), ',')) { /* kill all trailing '0' behind the comma */ p=GWEN_Buffer_GetStart(nbuf)+l; while(l--) { --p; if (*p=='0') *p=0; else break; } } else GWEN_Buffer_AppendString(nbuf, ","); /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); s=AB_Value_GetCurrency(v); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } /* if value */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "textKey", AB_Transaction_GetTextKey(t)); sl=AB_Transaction_GetPurpose(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); GWEN_DB_DeleteVar(dbT, "purpose"); while(se) { p=GWEN_StringListEntry_Data(se); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT, "purpose", p); se=GWEN_StringListEntry_Next(se); } /* while */ } switch(aj->jobType) { case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: /* additional data for standing orders */ /* first execution date */ ti=AB_Transaction_GetFirstExecutionDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/xfirstExecutionDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } #if 0 /* don't ever set lastExecutionDate */ /* lastExecutionDate */ ti=AB_Transaction_GetLastExecutionDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/xlastExecutionDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } #endif #if 0 /* don't ever set nextExecutionDate */ if (aj->jobType==AB_Job_TypeCreateStandingOrder) { /* nextExecutionDate */ ti=AB_Transaction_GetNextExecutionDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/xnextExecutionDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } #endif /* period */ switch(AB_Transaction_GetPeriod(t)) { case AB_Transaction_PeriodMonthly: p="M"; break; case AB_Transaction_PeriodWeekly: p="W"; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unsupported period %d", AB_Transaction_GetPeriod(t)); return GWEN_ERROR_INVALID; } GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/xperiod", p); /* cycle */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/cycle", AB_Transaction_GetCycle(t)); /* execution day */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "special/executionDay", AB_Transaction_GetExecutionDay(t)); /* fiid */ p=AB_Transaction_GetFiId(t); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "fiid", p); break; case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: case AB_Job_TypeDeleteDatedTransfer: /* fiid */ p=AB_Transaction_GetFiId(t); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "fiid", p); /* date */ ti=AB_Transaction_GetDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "xdate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } break; /* --------------- add more jobs here -------------- */ default: break; } /* switch */ /* store pointer to the validated transaction */ aj->validatedTransaction=t; } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } return 0; } case AH_Job_ExchangeModeResults: { AH_RESULT_LIST *rl; AH_RESULT *r; int has10; int has20; const AB_TRANSACTION *ot; AB_TRANSACTION_STATUS tStatus; rl=AH_Job_GetSegResults(j); assert(rl); r=AH_Result_List_First(rl); if (!r) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No segment results"); AB_Job_SetStatus(bj, AB_Job_StatusError); /* return GWEN_ERROR_NO_DATA; */ return 0; } has10=0; has20=0; while(r) { int rcode; rcode=AH_Result_GetCode(r); if (rcode <=19) has10=1; else if (rcode>=20 && rcode <=29) has20=1; r=AH_Result_List_Next(r); } if (has20) { AB_Job_SetStatus(bj, AB_Job_StatusFinished); DBG_INFO(AQHBCI_LOGDOMAIN, "Job finished"); } else if (has10) { switch(aj->jobType) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: case AB_Job_TypeInternalTransfer: AB_Job_SetStatus(bj, AB_Job_StatusPending); DBG_INFO(AQHBCI_LOGDOMAIN, "Job pending"); break; case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: case AB_Job_TypeDeleteStandingOrder: case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: case AB_Job_TypeDeleteDatedTransfer: AB_Job_SetStatus(bj, AB_Job_StatusFinished); DBG_INFO(AQHBCI_LOGDOMAIN, "Job finished"); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown job type %d", aj->jobType); abort(); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Error status (neither 0010 nor 0020)"); AB_Job_SetStatus(bj, AB_Job_StatusError); } if (has20) tStatus=AB_Transaction_StatusAccepted; else if (has10) tStatus=AB_Transaction_StatusPending; else tStatus=AB_Transaction_StatusRejected; switch(aj->jobType) { case AB_Job_TypeTransfer: ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_Transaction_SetType(t, AB_Transaction_TypeTransfer); AB_ImExporterContext_AddTransfer(ctx, t); } break; case AB_Job_TypeDebitNote: ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_Transaction_SetType(t, AB_Transaction_TypeDebitNote); AB_ImExporterContext_AddTransfer(ctx, t); } break; case AB_Job_TypeInternalTransfer: ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_Transaction_SetType(t, AB_Transaction_TypeInternalTransfer); AB_ImExporterContext_AddTransfer(ctx, t); } break; case AB_Job_TypeCreateStandingOrder: case AB_Job_TypeModifyStandingOrder: ot=AB_Job_GetTransaction(bj); if (ot && aj->fiid) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetFiId(t, aj->fiid); AB_Transaction_SetStatus(t, tStatus); AB_Job_SetTransaction(bj, t); AB_ImExporterContext_AddStandingOrder(ctx, t); } break; case AB_Job_TypeDeleteStandingOrder: ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); switch(tStatus) { case AB_Transaction_StatusAccepted: AB_Transaction_SetStatus(t, AB_Transaction_StatusRevoked); break; case AB_Transaction_StatusPending: AB_Transaction_SetStatus(t, AB_Transaction_StatusPending); break; case AB_Transaction_StatusRejected: default: /* don't modify status */ break; } AB_Job_SetTransaction(bj, t); AB_ImExporterContext_AddStandingOrder(ctx, t); } break; case AB_Job_TypeCreateDatedTransfer: case AB_Job_TypeModifyDatedTransfer: ot=AB_Job_GetTransaction(bj); if (ot && aj->fiid) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetFiId(t, aj->fiid); AB_Transaction_SetStatus(t, tStatus); AB_Job_SetTransaction(bj, t); AB_ImExporterContext_AddDatedTransfer(ctx, t); } break; case AB_Job_TypeDeleteDatedTransfer: ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); switch(tStatus) { case AB_Transaction_StatusAccepted: AB_Transaction_SetStatus(t, AB_Transaction_StatusRevoked); break; case AB_Transaction_StatusPending: AB_Transaction_SetStatus(t, AB_Transaction_StatusPending); break; case AB_Transaction_StatusRejected: default: /* don't modify status */ break; } AB_Job_SetTransaction(bj, t); AB_ImExporterContext_AddDatedTransfer(ctx, t); } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled job type %d", aj->jobType); return -1; } return 0; } default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsingledebitnote.xml0000644000175000017500000001161112375175275025515 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgettransactions_p.h0000644000175000017500000000270012375175275025513 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETTRANSACTIONS_P_H #define AH_JOBGETTRANSACTIONS_P_H #include "jobgettransactions_l.h" #include typedef struct AH_JOB_GETTRANSACTIONS AH_JOB_GETTRANSACTIONS; struct AH_JOB_GETTRANSACTIONS { int dummy; }; static void GWENHYWFAR_CB AH_Job_GetTransactions_FreeData(void *bp, void *p); static int AH_Job_GetTransactions_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetTransactionsCreditCard_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetTransactions_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetTransactions__ReadTransactions(AH_JOB *j, AB_IMEXPORTER_ACCOUNTINFO *ai, const char *docType, int noted, GWEN_BUFFER *buf); #endif /* AH_JOBGETTRANSACTIONS_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderget.c0000644000175000017500000001477712635554731026211 00000000000000/*************************************************************************** begin : Sat Aug 03 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepastandingorderget_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaStandingOrderGet_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobSepaStandingOrderGet", u, account); if (!j) return 0; /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaStandingOrderGet_Prepare); AH_Job_SetProcessFn(j, AH_Job_SepaStandingOrdersGet_Process); AH_Job_SetExchangeFn(j, AH_Job_SepaStandingOrdersGet_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; } /* --------------------------------------------------------------- FUNCTION */ static const char *_findPatternInStringList(const GWEN_STRINGLIST *sl, const char *pattern){ GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s && *s && -1!=GWEN_Text_ComparePattern(s, pattern, 0)) { return s; } se=GWEN_StringListEntry_Next(se); } return NULL; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderGet_Prepare(AH_JOB *j) { GWEN_DB_NODE *dbArgs; const GWEN_STRINGLIST *descriptors; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing job"); dbArgs=AH_Job_GetArguments(j); descriptors=AH_User_GetSepaDescriptors(AH_Job_GetUser(j)); if (descriptors) { const char *s; s=_findPatternInStringList(descriptors, "*pain.001.*"); if (s) { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "SupportedSepaFormats/Format", s); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No matching SEPA descriptor found"); return GWEN_ERROR_GENERIC; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No list of supported SEPA descriptor found"); return GWEN_ERROR_GENERIC; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrdersGet__ReadSto(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx, const uint8_t *ptr, uint32_t len, const char *fiId){ int rv; AB_IMEXPORTER_CONTEXT *tmpCtx; GWEN_BUFFER *tbuf; AB_IMEXPORTER_ACCOUNTINFO *ai; tmpCtx=AB_ImExporterContext_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendBytes(tbuf, (const char*) ptr, len); rv=AB_Banking_ImportBuffer(AH_Job_GetBankingApi(j), tmpCtx, "sepa", "default", tbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); AB_ImExporterContext_free(tmpCtx); return rv; } GWEN_Buffer_free(tbuf); ai=AB_ImExporterContext_GetFirstAccountInfo(tmpCtx); if (ai) { AB_TRANSACTION *t; while( (t=AB_ImExporterAccountInfo_GetFirstTransaction(ai)) ) { AB_Transaction_List_Del(t); AB_Transaction_SetFiId(t, fiId); /* add to real im/exporter context */ AB_ImExporterContext_AddTransaction(ctx, t); } } AB_ImExporterContext_free(tmpCtx); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrdersGet_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; const char *responseName; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobSepaStandingOrdersGet"); assert(j); responseName=AH_Job_GetResponseName(j); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } if (responseName && *responseName) { GWEN_DB_NODE *dbXA; dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data"); if (dbXA) dbXA=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, responseName); if (dbXA) { const void *p; unsigned int bs; const char *fiId; fiId=GWEN_DB_GetCharValue(dbXA, "fiId", 0, NULL); p=GWEN_DB_GetBinValue(dbXA, "transfer", 0, 0, 0, &bs); if (p && bs) { rv=AH_Job_SepaStandingOrdersGet__ReadSto(j, ctx, p, bs, fiId); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); DBG_WARN(AQHBCI_LOGDOMAIN, "Error reading standing order from data, ignoring (%d)", rv); } } } } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrdersGet_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); if (AB_Job_GetType(bj)!=AB_Job_TypeSepaGetStandingOrders) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetStandingOrders job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: return 0; case AH_Job_ExchangeModeArgs: return 0; case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgettransactions.c0000644000175000017500000004377112533042667025176 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgettransactions_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_GETTRANSACTIONS); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetTransactions_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETTRANSACTIONS *aj; GWEN_DB_NODE *dbArgs; int useCreditCardJob = 0; //Check if we should use DKKKU GWEN_DB_NODE *updgroup; updgroup=AH_User_GetUpd(u); assert(updgroup); updgroup=GWEN_DB_GetGroup(updgroup, GWEN_PATH_FLAGS_NAMEMUSTEXIST, AB_Account_GetAccountNumber(account)); if (updgroup) { GWEN_DB_NODE *n; n=GWEN_DB_GetFirstGroup(updgroup); while(n) { if (strcasecmp(GWEN_DB_GetCharValue(n, "job", 0, ""), "DKKKU")==0) { useCreditCardJob = 1; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ } /* if updgroup for the given account found */ if(useCreditCardJob) j=AH_AccountJob_new("JobGetTransactionsCreditCard", u, account); else j=AH_AccountJob_new("JobGetTransactions", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETTRANSACTIONS, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j, aj, AH_Job_GetTransactions_FreeData); /* overwrite some virtual functions */ if(useCreditCardJob) AH_Job_SetProcessFn(j, AH_Job_GetTransactionsCreditCard_Process); else AH_Job_SetProcessFn(j, AH_Job_GetTransactions_Process); AH_Job_SetExchangeFn(j, AH_Job_GetTransactions_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if(useCreditCardJob) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountNumber", AB_Account_GetAccountNumber(account)); else GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_GetTransactions_FreeData(void *bp, void *p){ AH_JOB_GETTRANSACTIONS *aj; aj=(AH_JOB_GETTRANSACTIONS*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions__ReadTransactions(AH_JOB *j, AB_IMEXPORTER_ACCOUNTINFO *ai, const char *docType, int noted, GWEN_BUFFER *buf){ GWEN_DBIO *dbio; GWEN_SYNCIO *sio; int rv; GWEN_DB_NODE *db; GWEN_DB_NODE *dbDay; GWEN_DB_NODE *dbParams; AB_ACCOUNT *a; AB_USER *u; uint32_t progressId; uint64_t cnt=0; a=AH_AccountJob_GetAccount(j); assert(a); u=AH_Job_GetUser(j); assert(u); dbio=GWEN_DBIO_GetPlugin("swift"); if (!dbio) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin SWIFT is not found"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Plugin \"SWIFT\" not found.")); return AB_ERROR_PLUGIN_MISSING; } GWEN_Buffer_Rewind(buf); sio=GWEN_SyncIo_Memory_new(buf, 0); db=GWEN_DB_Group_new("transactions"); dbParams=GWEN_DB_Group_new("params"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", docType); if (AH_User_GetFlags(u) & AH_USER_FLAGS_KEEP_MULTIPLE_BLANKS) GWEN_DB_SetIntValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "keepMultipleBlanks", 1); else GWEN_DB_SetIntValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "keepMultipleBlanks", 0); rv=GWEN_DBIO_Import(dbio, sio, db, dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing SWIFT %s (%d)", docType, rv); GWEN_DB_Group_free(dbParams); GWEN_DB_Group_free(db); GWEN_SyncIo_free(sio); GWEN_DBIO_free(dbio); return rv; } GWEN_DB_Group_free(dbParams); GWEN_SyncIo_free(sio); GWEN_DBIO_free(dbio); /* first count the groups */ dbDay=GWEN_DB_FindFirstGroup(db, "day"); while(dbDay) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbDay, "transaction"); while(dbT) { cnt++; dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } /* while */ dbDay=GWEN_DB_FindNextGroup(dbDay, "day"); } /* while */ progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Importing transactions..."), NULL, cnt, 0); /* add transactions to list */ dbDay=GWEN_DB_FindFirstGroup(db, "day"); while(dbDay) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbDay, "transaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad transaction data:"); GWEN_DB_Dump(dbT, 2); } else { AB_Transaction_SetLocalBankCode(t, AB_User_GetBankCode(u)); AB_Transaction_SetLocalAccountNumber(t, AB_Account_GetAccountNumber(a)); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); if (noted) AB_ImExporterAccountInfo_AddNotedTransaction(ai, t); else AB_ImExporterAccountInfo_AddTransaction(ai, t); } if (GWEN_ERROR_USER_ABORTED== GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_ONE)) { GWEN_Gui_ProgressEnd(progressId); return GWEN_ERROR_USER_ABORTED; } dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } /* while */ /* read all endsaldos */ if (!noted) { dbT=GWEN_DB_FindFirstGroup(dbDay, "endSaldo"); while (dbT) { GWEN_DB_NODE *dbX; GWEN_TIME *ti=0; dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); if (dbX) ti=GWEN_Time_fromDb(dbX); dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbX) { AB_VALUE *v; v=AB_Value_fromDb(dbX); if (v) { AB_BALANCE *bal; AB_ACCOUNT_STATUS *as; bal=AB_Balance_new(v, ti); AB_Value_free(v); as=AB_AccountStatus_new(); if (ti) AB_AccountStatus_SetTime(as, ti); AB_AccountStatus_SetNotedBalance(as, bal); AB_Balance_free(bal); AB_ImExporterAccountInfo_AddAccountStatus(ai, as); } } GWEN_Time_free(ti); dbT=GWEN_DB_FindNextGroup(dbT, "endSaldo"); } /* while */ } dbDay=GWEN_DB_FindNextGroup(dbDay, "day"); } /* while */ GWEN_Gui_ProgressEnd(progressId); GWEN_DB_Group_free(db); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETTRANSACTIONS *aj; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_BUFFER *tbooked; GWEN_BUFFER *tnoted; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetTransactions"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); tbooked=GWEN_Buffer_new(0, 1024, 0, 1); tnoted=GWEN_Buffer_new(0, 1024, 0, 1); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/transactions"); if (dbXA) { const void *p; unsigned int bs; if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbXA, 2); p=GWEN_DB_GetBinValue(dbXA, "booked", 0, 0, 0, &bs); if (p && bs) GWEN_Buffer_AppendBytes(tbooked, p, bs); p=GWEN_DB_GetBinValue(dbXA, "noted", 0, 0, 0, &bs); if (p && bs) GWEN_Buffer_AppendBytes(tnoted, p, bs); } /* if "Transactions" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } GWEN_Buffer_Rewind(tbooked); GWEN_Buffer_Rewind(tnoted); /* now the buffers contain data to be parsed by DBIOs */ a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); assert(ai); AB_ImExporterAccountInfo_SetAccountId(ai, AB_Account_GetUniqueId(a)); /* read booked transactions */ if (GWEN_Buffer_GetUsedBytes(tbooked)) { if (getenv("AQHBCI_LOGBOOKED")) { FILE *f; f=fopen("/tmp/booked.mt", "w+"); if (f) { if (fwrite(GWEN_Buffer_GetStart(tbooked), GWEN_Buffer_GetUsedBytes(tbooked), 1, f)!=1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } if (AH_Job_GetTransactions__ReadTransactions(j, ai, "mt940", 0, tbooked)){ GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); DBG_INFO(AQHBCI_LOGDOMAIN, "Error parsing booked transactions"); AH_Job_SetStatus(j, AH_JobStatusError); return -1; } } /* read noted transactions */ if (GWEN_Buffer_GetUsedBytes(tnoted)) { if (getenv("AQHBCI_LOGNOTED")) { FILE *f; f=fopen("/tmp/noted.mt", "w+"); if (f) { if (fwrite(GWEN_Buffer_GetStart(tnoted), GWEN_Buffer_GetUsedBytes(tnoted), 1, f)!=1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } if (AH_Job_GetTransactions__ReadTransactions(j, ai, "mt942", 1, tnoted)) { GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); DBG_INFO(AQHBCI_LOGDOMAIN, "Error parsing noted transactions"); AH_Job_SetStatus(j, AH_JobStatusError); return -1; } } GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); return 0; } int AH_Job_GetTransactionsCreditCard_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETTRANSACTIONS *aj; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; AB_USER *u; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_BUFFER *tbooked; GWEN_BUFFER *tnoted; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetTransactionsCreditCard"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); tbooked=GWEN_Buffer_new(0, 1024, 0, 1); tnoted=GWEN_Buffer_new(0, 1024, 0, 1); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_INFO(AQHBCI_LOGDOMAIN, "Response:"); GWEN_DB_Dump(dbResponses, 2); DBG_INFO(AQHBCI_LOGDOMAIN, "Response end"); a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); assert(ai); AB_ImExporterAccountInfo_SetAccountId(ai, AB_Account_GetUniqueId(a)); u=AH_Job_GetUser(j); assert(u); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/transactionscreditcard"); if (dbXA) { GWEN_DB_NODE *dbT; GWEN_DB_NODE *dbV; GWEN_TIME *date; GWEN_TIME *valutaDate; const char *p; const char *ref; int i; dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "entries"); while (dbT) { AB_VALUE *v1; AB_VALUE *v2; GWEN_STRINGLIST* purpose; AB_TRANSACTION *t; /* read date (Buchungsdatum) */ p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) date=GWEN_Time_fromString(p, "YYYYMMDD"); else date=NULL; /* read valutaData (Umsatzdatum) */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) valutaDate=GWEN_Time_fromString(p, "YYYYMMDD"); else valutaDate=NULL; /* read value */ dbV=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbV) v1=AB_Value_fromDb(dbV); else v1=NULL; v2=0; if (!v1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing value from DB"); } else { p=GWEN_DB_GetCharValue(dbT, "debitMark", 0, 0); if (p) { if (strcasecmp(p, "D")==0 || strcasecmp(p, "RC")==0) { v2=AB_Value_dup(v1); AB_Value_Negate(v2); } else if (strcasecmp(p, "C")==0 || strcasecmp(p, "RD")==0) v2=AB_Value_dup(v1); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad debit mark \"%s\"", p); v2=0; } } AB_Value_free(v1); } /* read purpose */ purpose=GWEN_StringList_new(); for (i=0; i<10; i++) { p=GWEN_DB_GetCharValue(dbT, "purpose", i, 0); if (!p) break; GWEN_StringList_AppendString(purpose, p, 0, 0); } /* read reference */ ref=GWEN_DB_GetCharValue(dbT, "reference", 0, 0); if (ref) GWEN_StringList_AppendString(purpose, ref, 0, 0); t=AB_Transaction_new(); if(ref) AB_Transaction_SetFiId(t, ref); AB_Transaction_SetLocalBankCode(t, AB_User_GetBankCode(u)); AB_Transaction_SetLocalAccountNumber(t, AB_Account_GetAccountNumber(a)); AB_Transaction_SetValutaDate(t, valutaDate); AB_Transaction_SetDate(t, date); AB_Transaction_SetValue(t, v2); AB_Transaction_SetPurpose(t, purpose); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(ai, t); GWEN_StringList_free(purpose); AB_Value_free(v2); GWEN_Time_free(date); GWEN_Time_free(valutaDate); dbT = GWEN_DB_FindNextGroup(dbT, "entries"); } //while (dbT) } //if (dbXA) dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETTRANSACTIONS *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeGetTransactions) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetTransactions job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: { GWEN_DB_NODE *dbParams; dbParams=AH_Job_GetParams(j); AB_JobGetTransactions_SetMaxStoreDays(bj, GWEN_DB_GetIntValue(dbParams, "storeDays", 0, 0) ); return 0; } case AH_Job_ExchangeModeArgs: { const GWEN_TIME *ti; ti=AB_JobGetTransactions_GetFromTime(bj); if (ti) { int year, month, day; char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); if (GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Internal error: bad fromTime"); return GWEN_ERROR_INVALID; } snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", year, month+1, day); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "fromDate", dbuf); } ti=AB_JobGetTransactions_GetToTime(bj); if (ti) { int year, month, day; char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); if (GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Internal error: bad toTime"); return GWEN_ERROR_INVALID; } snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", year, month+1, day); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "toDate", dbuf); } return 0; } case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingordercreate.c0000644000175000017500000002516012634042457026655 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepastandingordercreate_l.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaStandingOrderCreate_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_TransferBase_new("JobSepaStandingOrderCreate", AB_Transaction_TypeSepaTransfer, AB_Transaction_SubTypeStandingOrder, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 35); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaStandingOrderCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaStandingOrderCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaStandingOrderCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_SepaStandingOrderCreate_ExchangeArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AB_TRANSACTION_LIMITS *lim; GWEN_DB_NODE *dbParams; const char *s; int i; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetMaxLenRemoteName(lim, 70); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); /* get specific limits for creation of standing orders */ s=GWEN_DB_GetCharValue(dbParams, "AllowedTurnusMonths", 0, 0); if (s && *s) { AB_TransactionLimits_SetAllowMonthly(lim, 1); while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesCycleMonth(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesCycleMonth(lim), 1, GWEN_StringList_SortModeInt); } else AB_TransactionLimits_SetAllowMonthly(lim, -1); s=GWEN_DB_GetCharValue(dbParams, "AllowedMonthDays", 0, 0); if (s && *s) { while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesExecutionDayMonth(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesExecutionDayMonth(lim), 1, GWEN_StringList_SortModeInt); } s=GWEN_DB_GetCharValue(dbParams, "AllowedTurnusWeeks", 0, 0); if (s && *s) { AB_TransactionLimits_SetAllowWeekly(lim, 1); while(*s) { char buf[3]; const char *x; buf[2]=0; strncpy(buf, s, 2); x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesCycleWeek(lim, x, 0); s+=2; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesCycleWeek(lim), 1, GWEN_StringList_SortModeInt); } else AB_TransactionLimits_SetAllowWeekly(lim, -1); s=GWEN_DB_GetCharValue(dbParams, "AllowedWeekDays", 0, 0); if (s && *s) { while(*s) { char buf[2]; const char *x; buf[0]=*s; buf[1]=0; x=buf; if (*x=='0') x++; AB_TransactionLimits_AddValuesExecutionDayWeek(lim, x, 0); s++; } /* while */ GWEN_StringList_Sort(AB_TransactionLimits_GetValuesExecutionDayWeek(lim), 1, GWEN_StringList_SortModeInt); } i=GWEN_DB_GetIntValue(dbParams, "minDelay", 0, 0); AB_TransactionLimits_SetMinValueSetupTime(lim, i); i=GWEN_DB_GetIntValue(dbParams, "maxDelay", 0, 0); AB_TransactionLimits_SetMaxValueSetupTime(lim, i); AB_Job_SetFieldLimits(bj, lim); AB_TransactionLimits_free(lim); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderCreate_ExchangeArgs(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { const AB_TRANSACTION_LIMITS *lim=NULL; AB_BANKING *ab; const AB_TRANSACTION *t=NULL; AB_TRANSACTION *tCopy=NULL; int rv; AB_USER *u; uint32_t uflags; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging args"); ab=AH_Job_GetBankingApi(j); assert(ab); u=AH_Job_GetUser(j); assert(u); uflags=AH_User_GetFlags(u); /* get limits and transaction */ lim=AB_Job_GetFieldLimits(bj); t=AB_Job_GetTransaction(bj); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INVALID; } /* DISABLED according to a discussion on aqbanking-user: * The application should do this, not the library. AB_Transaction_FillLocalFromAccount(t, a); */ /* validate transaction */ rv=AB_Transaction_CheckForSepaConformity(t, (uflags & AH_USER_FLAGS_USE_STRICT_SEPA_CHARSET)?1:0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckPurposeAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckNamesAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckRecurrenceAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckFirstExecutionDateAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } tCopy=AB_Transaction_dup(t); /* set group id so the application can now which transfers went together in one setting */ AB_Transaction_SetGroupId(tCopy, AH_Job_GetId(j)); /* store validated transaction in job */ AB_Job_SetTransaction(bj, tCopy); /* store copy of transaction for later */ AH_Job_AddTransfer(j, tCopy); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { const AB_TRANSACTION *t; const char *s; int tanVer=AH_JOB_TANVER_1_4; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No validated transaction"); return GWEN_ERROR_INVALID; } s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } if (tanVer==AH_JOB_TANVER_1_4) { int rv; DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); rv=AH_HHD14_AddChallengeParams_35(j, AB_Transaction_GetValue(t), AB_Transaction_GetRemoteIban(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderCreate_Prepare(AH_JOB *j) { GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *profile; int rv; const GWEN_TIME *ti; const char *s; AB_TRANSACTION *t; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfer"); dbArgs=AH_Job_GetArguments(j); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); assert(t); /* debug */ return GWEN_ERROR_INTERNAL; } /* find the right profile to produce pain.001 messages */ profile=AH_Job_FindSepaProfile(j, "001*", AH_User_GetSepaTransferProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* first execution date */ ti=AB_Transaction_GetFirstExecutionDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "details/xfirstExecutionDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing first execution date."); } /* period */ switch(AB_Transaction_GetPeriod(t)) { case AB_Transaction_PeriodMonthly: s="M"; break; case AB_Transaction_PeriodWeekly: s="W"; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unsupported period %d", AB_Transaction_GetPeriod(t)); return GWEN_ERROR_INVALID; } GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "details/xperiod", s); /* cycle */ GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "details/cycle", AB_Transaction_GetCycle(t)); /* execution day */ GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "details/executionDay", AB_Transaction_GetExecutionDay(t)); /* SET fiId, if present */ s=AB_Transaction_GetFiId(t); if (s) { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "fiId", AB_Transaction_GetFiId(t)); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobforeignxferwh_l.h0000644000175000017500000000157112375175275025161 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: jobgetbalance_p.h 1283 2007-07-25 14:28:36Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOB_FOREIGNXFERWH_L_H #define AH_JOB_FOREIGNXFERWH_L_H #include "accountjob_l.h" AH_JOB *AH_Job_ForeignTransferWH_new(AB_USER *u, AB_ACCOUNT *account); int AH_Job_ForeignTransferWH_SetDtazv(AH_JOB *j, const uint8_t *dataPtr, uint32_t dataLen); #endif /* AH_JOB_FOREIGNXFERWH_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedsinglecreate.c0000644000175000017500000001375512375175275027100 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepacor1datedsinglecreate_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaCor1DebitDatedSingleCreate_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; GWEN_DB_NODE *dbArgs; j=AH_Job_TransferBase_new("JobSepaCor1DebitDatedSingleCreate", AB_Transaction_TypeSepaDebitNote, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 29); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaCor1DebitDatedSingleCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaCor1DebitDatedSingleCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaCor1DebitDatedSingleCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaCor1DebitDatedSingleCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AB_TRANSACTION_LIMITS *lim; GWEN_DB_NODE *dbParams; int i, i1, i2; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetNeedDate(lim, 1); /* set info from BPD */ i1=GWEN_DB_GetIntValue(dbParams, "minDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "minDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMinValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1>i2)?i1:i2; AB_TransactionLimits_SetMinValueSetupTime(lim, i); i1=GWEN_DB_GetIntValue(dbParams, "maxDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "maxDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMaxValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitsingle.xml0000644000175000017500000000347012375175275025504 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedmulticreate_p.h0000644000175000017500000000251712530646060027253 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPACOR1DATEDMULTICREATE_P_H #define AH_JOBSEPACOR1DATEDMULTICREATE_P_H #include "jobsepacor1datedmulticreate_l.h" #include #include typedef struct AH_JOB_CREATESEPAMULTICOR1 AH_JOB_CREATESEPAMULTICOR1; struct AH_JOB_CREATESEPAMULTICOR1 { char *fiid; int sumFieldNeeded; int singleBookingAllowed; AB_VALUE *sumValues; char *localIban; }; static void GWENHYWFAR_CB AH_Job_SepaCor1DebitDatedMultiCreate_FreeData(void *bp, void *p); static int AH_Job_SepaCor1DebitDatedMultiCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaCor1DebitDatedMultiCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_SepaCor1DebitDatedMultiCreate_Prepare(AH_JOB *j); #endif /* AH_JOBSEPACOR1DATEDMULTICREATE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsingletransfer_l.h0000644000175000017500000000337712375175275025340 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSINGLETRANSFER_L_H #define AH_JOBSINGLETRANSFER_L_H #include "accountjob_l.h" #include AH_JOB *AH_Job_SingleTransfer_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_SingleDebitNote_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_CreateStandingOrder_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_ModifyStandingOrder_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_DeleteStandingOrder_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_CreateDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_ModifyDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_DeleteDatedTransfer_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_InternalTransfer_new(AB_USER *u, AB_ACCOUNT *account); const char *AH_Job_SingleTransfer_GetFiid(AH_JOB *j); const char *AH_Job_SingleTransfer_GetOldFiid(AH_JOB *j); #endif /* AH_JOBSINGLETRANSFER_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobdeletedatedxfer.xml0000644000175000017500000000526312375175275025475 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetstandingorders.xml0000644000175000017500000002411112375175275026063 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfermulti_l.h0000644000175000017500000000120112375175275025162 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPAXFERMULTI_L_H #define AH_JOBSEPAXFERMULTI_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaTransferMulti_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPAXFERMULTI_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedmulticreate.c0000644000175000017500000002224712375175275027170 00000000000000/*************************************************************************** begin : Wed Jan 08 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepadebitdatedmulticreate_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_CREATESEPAMULTIDEBIT); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaDebitDatedMultiCreate_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_CREATESEPAMULTIDEBIT *aj; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbArgs; const char *s; j=AH_Job_TransferBase_new("JobSepaDebitDatedMultiCreate", AB_Transaction_TypeSepaDebitNote, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 32); GWEN_NEW_OBJECT(AH_JOB_CREATESEPAMULTIDEBIT, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_CREATESEPAMULTIDEBIT, j, aj, AH_Job_SepaDebitDatedMultiCreate_FreeData); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaDebitDatedMultiCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaDebitDatedMultiCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaDebitDatedMultiCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit); /* get params */ dbParams=AH_Job_GetParams(j); assert(dbParams); AH_Job_SetMaxTransfers(j, GWEN_DB_GetIntValue(dbParams, "maxTransfers", 0, 0)); s=GWEN_DB_GetCharValue(dbParams, "sumFieldNeeded", 0, "j"); if (s && toupper(*s)=='J') aj->sumFieldNeeded=1; else aj->sumFieldNeeded=0; s=GWEN_DB_GetCharValue(dbParams, "singleBookingAllowed", 0, "j"); if (s && toupper(*s)=='J') aj->singleBookingAllowed=1; else aj->singleBookingAllowed=0; /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_SepaDebitDatedMultiCreate_FreeData(void *bp, void *p){ AH_JOB_CREATESEPAMULTIDEBIT *aj; aj=(AH_JOB_CREATESEPAMULTIDEBIT*)p; free(aj->fiid); AB_Value_free(aj->sumValues); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitDatedMultiCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_CREATESEPAMULTIDEBIT *aj; AB_TRANSACTION_LIMITS *lim; GWEN_DB_NODE *dbParams; int i, i1, i2; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_CREATESEPAMULTIDEBIT, j); assert(aj); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLenRemoteName(lim, 70); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetNeedDate(lim, 1); /* set info from BPD */ i1=GWEN_DB_GetIntValue(dbParams, "minDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "minDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMinValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1>i2)?i1:i2; AB_TransactionLimits_SetMinValueSetupTime(lim, i); i1=GWEN_DB_GetIntValue(dbParams, "maxDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "maxDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMaxValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1sumValues, AB_Transaction_GetLocalIban(t), AB_Transaction_GetDate(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitDatedMultiCreate_Prepare(AH_JOB *j) { AH_JOB_CREATESEPAMULTIDEBIT *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *profile; int rv; AB_TRANSACTION *t; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfers"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_CREATESEPAMULTIDEBIT, j); assert(aj); dbArgs=AH_Job_GetArguments(j); /* calculate sum */ AB_Value_free(aj->sumValues); aj->sumValues=AB_Value_new(); AB_Value_SetCurrency(aj->sumValues, "EUR"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); assert(t); /* debug */ return GWEN_ERROR_INTERNAL; } while(t) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) AB_Value_AddValue(aj->sumValues, v); t=AB_Transaction_List_Next(t); } /* find the right profile to produce pain.008 messages */ profile=AH_Job_FindSepaProfile(j, "008*", AH_User_GetSepaDebitNoteProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* set singleBookingWanted */ if (aj->singleBookingAllowed && GWEN_DB_GetIntValue(profile, "singleBookingWanted", 0, 1)) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "J"); else { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "N"); GWEN_DB_SetIntValue(profile, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", 0); } /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* store sum value */ if (aj->sumValues) { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; const char *s; dbV=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "totalSum"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHbciString(aj->sumValues, nbuf); if (GWEN_Buffer_GetUsedBytes(nbuf)<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); return GWEN_ERROR_BAD_DATA; } /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); /* store currency */ s=AB_Value_GetCurrency(aj->sumValues); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfermulti.c0000644000175000017500000001571012375175275024654 00000000000000/*************************************************************************** begin : Wed Jan 08 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepaxfermulti_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_SEPAXFERMULTI); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaTransferMulti_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_SEPAXFERMULTI *aj; GWEN_DB_NODE *dbParams; const char *s; j=AH_Job_TransferBase_new("JobSepaTransferMulti", AB_Transaction_TypeSepaTransfer, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 13); GWEN_NEW_OBJECT(AH_JOB_SEPAXFERMULTI, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_SEPAXFERMULTI, j, aj, AH_Job_SepaTransferMulti_FreeData); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaTransferMulti_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaTransferMulti_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_TransferBase_ExchangeParams_SepaUndated); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaUndated); /* get params */ dbParams=AH_Job_GetParams(j); assert(dbParams); AH_Job_SetMaxTransfers(j, GWEN_DB_GetIntValue(dbParams, "maxTransfers", 0, 0)); s=GWEN_DB_GetCharValue(dbParams, "sumFieldNeeded", 0, "j"); if (s && toupper(*s)=='J') aj->sumFieldNeeded=1; else aj->sumFieldNeeded=0; s=GWEN_DB_GetCharValue(dbParams, "singleBookingAllowed", 0, "j"); if (s && toupper(*s)=='J') aj->singleBookingAllowed=1; else aj->singleBookingAllowed=0; return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_SepaTransferMulti_FreeData(void *bp, void *p){ AH_JOB_SEPAXFERMULTI *aj; aj=(AH_JOB_SEPAXFERMULTI*)p; AB_Value_free(aj->sumValues); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaTransferMulti_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { AH_JOB_SEPAXFERMULTI *aj; const AB_TRANSACTION *t; const char *s; int tanVer=AH_JOB_TANVER_1_4; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SEPAXFERMULTI, j); assert(aj); /* get data from first transaction */ t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No validated transaction"); return GWEN_ERROR_INVALID; } s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } if (tanVer==AH_JOB_TANVER_1_4) { int rv; DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); rv=AH_HHD14_AddChallengeParams_13(j, AH_Job_GetTransferCount(j), aj->sumValues, AB_Transaction_GetLocalIban(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaTransferMulti_Prepare(AH_JOB *j) { AH_JOB_SEPAXFERMULTI *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *profile; int rv; AB_TRANSACTION *t; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfers"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_SEPAXFERMULTI, j); assert(aj); dbArgs=AH_Job_GetArguments(j); /* calculate sum */ AB_Value_free(aj->sumValues); aj->sumValues=AB_Value_new(); AB_Value_SetCurrency(aj->sumValues, "EUR"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INTERNAL; } while(t) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) { const char *s; s=AB_Value_GetCurrency(v); if (s && strcmp(s, "EUR")) { DBG_ERROR(AQHBCI_LOGDOMAIN, "EUR required in SEPA transactions (%s)", s); return GWEN_ERROR_BAD_DATA; } AB_Value_AddValue(aj->sumValues, v); } t=AB_Transaction_List_Next(t); } /* find the right profile to produce pain.001 messages */ profile=AH_Job_FindSepaProfile(j, "001*", AH_User_GetSepaTransferProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* set singleBookingWanted */ if (aj->singleBookingAllowed && GWEN_DB_GetIntValue(profile, "singleBookingWanted", 0, 1)) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "J"); else { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "N"); GWEN_DB_SetIntValue(profile, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", 0); } /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* store sum value */ if (1) { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; const char *s; dbV=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "totalSum"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHbciString(aj->sumValues, nbuf); if (GWEN_Buffer_GetUsedBytes(nbuf)<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); return GWEN_ERROR_BAD_DATA; } /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); /* store currency */ s=AB_Value_GetCurrency(aj->sumValues); assert(s); GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderget_p.h0000644000175000017500000000170312375175275026521 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPASTANDINGORDERGET_P_H #define AH_JOBSEPASTANDINGORDERGET_P_H #include "jobsepastandingorderget_l.h" static int AH_Job_SepaStandingOrderGet_Prepare(AH_JOB *j); static int AH_Job_SepaStandingOrdersGet_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaStandingOrdersGet_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBSEPASTANDINGORDERGET_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobforeignxferwh.xml0000644000175000017500000001041212375175275025211 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedsinglecreate_p.h0000644000175000017500000000176012375175275027640 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITDATEDSINGLECREATE_P_H #define AH_JOBSEPADEBITDATEDSINGLECREATE_P_H #include "jobsepadebitdatedsinglecreate_l.h" #include static int AH_Job_SepaDebitDatedSingleCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaDebitDatedSingleCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_SepaDebitDatedSingleCreate_Prepare(AH_JOB *j); #endif /* AH_JOBSEPADEBITDATEDSINGLECREATE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmodifydatedxfer.xml0000644000175000017500000001025112375175275025513 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderget.xml0000644000175000017500000000700612375175275026555 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobloadcellphone.xml0000644000175000017500000000356712375175275025162 00000000000000 %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfersingle.c0000644000175000017500000000720112375175275024777 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepaxfersingle_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaTransferSingle_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_TransferBase_new("JobSepaTransferSingle", AB_Transaction_TypeSepaTransfer, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 9); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaTransferSingle_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaTransferSingle_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_TransferBase_ExchangeParams_SepaUndated); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaUndated); return j; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaTransferSingle_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { const AB_TRANSACTION *t; const char *s; int tanVer=AH_JOB_TANVER_1_4; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No validated transaction"); return GWEN_ERROR_INVALID; } s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } if (tanVer==AH_JOB_TANVER_1_4) { int rv; DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); rv=AH_HHD14_AddChallengeParams_09(j, AB_Transaction_GetValue(t), AB_Transaction_GetRemoteIban(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaTransferSingle_Prepare(AH_JOB *j) { GWEN_DB_NODE *profile; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfer"); /* find the right profile to produce pain.001 messages */ profile=AH_Job_FindSepaProfile(j, "001*", AH_User_GetSepaTransferProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfersingle_l.h0000644000175000017500000000120512375175275025315 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPAXFERSINGLE_L_H #define AH_JOBSEPAXFERSINGLE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaTransferSingle_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPAXFERSINGLE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedsinglecreate.c0000644000175000017500000001345712375175275027322 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepadebitdatedsinglecreate_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaDebitDatedSingleCreate_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; GWEN_DB_NODE *dbArgs; j=AH_Job_TransferBase_new("JobSepaDebitDatedSingleCreate", AB_Transaction_TypeSepaDebitNote, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 29); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaDebitDatedSingleCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaDebitDatedSingleCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaDebitDatedSingleCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitDatedSingleCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AB_TRANSACTION_LIMITS *lim; GWEN_DB_NODE *dbParams; int i, i1, i2; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetNeedDate(lim, 1); /* set info from BPD */ i1=GWEN_DB_GetIntValue(dbParams, "minDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "minDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMinValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1>i2)?i1:i2; AB_TransactionLimits_SetMinValueSetupTime(lim, i); i1=GWEN_DB_GetIntValue(dbParams, "maxDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "maxDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMaxValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1 typedef struct AH_JOB_LOADCELLPHONE AH_JOB_LOADCELLPHONE; struct AH_JOB_LOADCELLPHONE { int dummy; }; static void GWENHYWFAR_CB AH_Job_LoadCellPhone_FreeData(void *bp, void *p); static int AH_Job_LoadCellPhone_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_LoadCellPhone_ExchangeArgs(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_LoadCellPhone_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBLOADCELLPHONE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfermulti.xml0000644000175000017500000000333612375175275025233 00000000000000 %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderdelete.xml0000644000175000017500000000430612635530746027235 00000000000000 %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedsinglecreate_p.h0000644000175000017500000000201512375175275027407 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_P_H #define AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_P_H #include "jobsepacor1datedsinglecreate_l.h" #include static int AH_Job_SepaCor1DebitDatedSingleCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaCor1DebitDatedSingleCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_SepaCor1DebitDatedSingleCreate_Prepare(AH_JOB *j); #endif /* AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetdatedxfers.c0000644000175000017500000001634612375175275024623 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetdatedxfers_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_GETDATEDTRANSFERS); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetDatedTransfers_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETDATEDTRANSFERS *aj; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobGetDatedTransfers", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETDATEDTRANSFERS, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETDATEDTRANSFERS, j, aj, AH_Job_GetDatedTransfers_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_GetDatedTransfers_Process); AH_Job_SetExchangeFn(j, AH_Job_GetDatedTransfers_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_GetDatedTransfers_FreeData(void *bp, void *p){ AH_JOB_GETDATEDTRANSFERS *aj; aj=(AH_JOB_GETDATEDTRANSFERS*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetDatedTransfers_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETDATEDTRANSFERS *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; int rv; int i; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetDatedTransfers"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETDATEDTRANSFERS, j); assert(aj); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); assert(ai); /* search for "DatedTransfer" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/GetDatedTransfersResponse"); if (dbXA) { GWEN_DB_NODE *dbT; AB_TRANSACTION *t; const char *s; dbXA=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "datedTransfer"); assert(dbXA); /* create transaction: raw */ t=AB_Transaction_fromDb(dbXA); assert(t); /* now work out some of the fields */ /* date */ s=GWEN_DB_GetCharValue(dbXA, "xDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } /* local account */ dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "ouraccount"); if (dbT) { const AB_COUNTRY *cn; cn=AB_Banking_FindCountryByNumeric(AH_Job_GetBankingApi(j), GWEN_DB_GetIntValue(dbT, "country", 0, 280)); assert(cn); AB_Transaction_SetLocalCountry(t, AB_Country_GetCode(cn)); s=GWEN_DB_GetCharValue(dbT, "bankCode", 0, 0); if (s && *s) AB_Transaction_SetLocalBankCode(t, s); s=GWEN_DB_GetCharValue(dbT, "accountId", 0, 0); if (s && *s) AB_Transaction_SetLocalAccountNumber(t, s); s=GWEN_DB_GetCharValue(dbT, "accountSubId", 0, 0); if (s && *s) AB_Transaction_SetLocalSuffix(t, s); } /* remote account */ dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "otheraccount"); if (dbT) { const AB_COUNTRY *cn; cn=AB_Banking_FindCountryByNumeric(AH_Job_GetBankingApi(j), GWEN_DB_GetIntValue(dbT, "country", 0, 280)); assert(cn); AB_Transaction_SetRemoteCountry(t, AB_Country_GetCode(cn)); s=GWEN_DB_GetCharValue(dbT, "bankCode", 0, 0); if (s && *s) AB_Transaction_SetRemoteBankCode(t, s); s=GWEN_DB_GetCharValue(dbT, "accountId", 0, 0); if (s && *s) AB_Transaction_SetRemoteAccountNumber(t, s); s=GWEN_DB_GetCharValue(dbT, "accountSubId", 0, 0); if (s && *s) AB_Transaction_SetRemoteSuffix(t, s); } /* remote name */ AB_Transaction_ClearRemoteName(t); for (i=0; ; i++) { s=GWEN_DB_GetCharValue(dbXA, "otherName", i, 0); if (s) { if (*s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 27, 0, 1); AB_ImExporter_DtaToUtf8(s, strlen(s), dbuf); AB_Transaction_AddRemoteName(t, GWEN_Buffer_GetStart(dbuf), 1); GWEN_Buffer_free(dbuf); } } else break; } /* purpose name */ AB_Transaction_ClearPurpose(t); for (i=0; ; i++) { s=GWEN_DB_GetCharValue(dbXA, "purpose", i, 0); if (s) { if (*s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 27, 0, 1); AB_ImExporter_DtaToUtf8(s, strlen(s), dbuf); AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(dbuf), 0); GWEN_Buffer_free(dbuf); } } else break; } /* add to list */ AB_ImExporterAccountInfo_AddDatedTransfer(ai, t); } /* if "datedTransfer" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetDatedTransfers_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETDATEDTRANSFERS *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETDATEDTRANSFERS, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeGetDatedTransfers) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetDatedTransfers job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: return 0; case AH_Job_ExchangeModeArgs: return 0; case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobcreatesto.xml0000644000175000017500000001531212375175275024331 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedsinglecreate_l.h0000644000175000017500000000130112375175275027400 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_L_H #define AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaCor1DebitDatedSingleCreate_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPACOR1DEBITDATEDSINGLECREATE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobeutransfer_p.h0000644000175000017500000000250412375175275024463 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBEUTRANSFER_P_H #define AH_JOBEUTRANSFER_P_H #include "jobsingletransfer_l.h" #include typedef struct AH_JOB_EUTRANSFER AH_JOB_EUTRANSFER; struct AH_JOB_EUTRANSFER { int isTransfer; }; static void GWENHYWFAR_CB AH_Job_EuTransfer_FreeData(void *bp, void *p); static int AH_Job_EuTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_EuTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_EuTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t); static AH_JOB *AH_Job_EuTransferBase_new(AB_USER *u, AB_ACCOUNT *account, int isTransfer); #endif /* AH_JOBEUTRANSFER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgettransactions_l.h0000644000175000017500000000142612375175275025513 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETTRANSACTIONS_L_H #define AH_JOBGETTRANSACTIONS_L_H #include "accountjob_l.h" #include AH_JOB *AH_Job_GetTransactions_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBGETTRANSACTIONS_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedmulticreate.c0000644000175000017500000002256012530646060026727 00000000000000/*************************************************************************** begin : Wed Jan 08 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepacor1datedmulticreate_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_CREATESEPAMULTICOR1); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaCor1DebitDatedMultiCreate_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_CREATESEPAMULTICOR1 *aj; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbArgs; const char *s; j=AH_Job_TransferBase_new("JobSepaCor1DebitDatedMultiCreate", AB_Transaction_TypeSepaDebitNote, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 32); GWEN_NEW_OBJECT(AH_JOB_CREATESEPAMULTICOR1, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_CREATESEPAMULTICOR1, j, aj, AH_Job_SepaCor1DebitDatedMultiCreate_FreeData); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaCor1DebitDatedMultiCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaCor1DebitDatedMultiCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaCor1DebitDatedMultiCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit); /* get params */ dbParams=AH_Job_GetParams(j); assert(dbParams); AH_Job_SetMaxTransfers(j, GWEN_DB_GetIntValue(dbParams, "maxTransfers", 0, 0)); s=GWEN_DB_GetCharValue(dbParams, "sumFieldNeeded", 0, "j"); if (s && toupper(*s)=='J') aj->sumFieldNeeded=1; else aj->sumFieldNeeded=0; s=GWEN_DB_GetCharValue(dbParams, "singleBookingAllowed", 0, "j"); if (s && toupper(*s)=='J') aj->singleBookingAllowed=1; else aj->singleBookingAllowed=0; /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_SepaCor1DebitDatedMultiCreate_FreeData(void *bp, void *p){ AH_JOB_CREATESEPAMULTICOR1 *aj; aj=(AH_JOB_CREATESEPAMULTICOR1*)p; free(aj->fiid); AB_Value_free(aj->sumValues); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaCor1DebitDatedMultiCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_CREATESEPAMULTICOR1 *aj; AB_TRANSACTION_LIMITS *lim; GWEN_DB_NODE *dbParams; int i, i1, i2; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_CREATESEPAMULTICOR1, j); assert(aj); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLenRemoteName(lim, 70); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetNeedDate(lim, 1); /* set info from BPD */ i1=GWEN_DB_GetIntValue(dbParams, "minDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "minDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMinValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMinValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1>i2)?i1:i2; AB_TransactionLimits_SetMinValueSetupTime(lim, i); i1=GWEN_DB_GetIntValue(dbParams, "maxDelay_FNAL_RCUR", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeRecurring(lim, i1); AB_TransactionLimits_SetMinValueSetupTimeFinal(lim, i1); i2=GWEN_DB_GetIntValue(dbParams, "maxDelay_FRST_OOFF", 0, 0); AB_TransactionLimits_SetMaxValueSetupTimeFirst(lim, i2); AB_TransactionLimits_SetMaxValueSetupTimeOnce(lim, i2); /* combine into minimum values for older apps */ i=(i1sumValues, AB_Transaction_GetLocalIban(t), AB_Transaction_GetDate(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaCor1DebitDatedMultiCreate_Prepare(AH_JOB *j) { AH_JOB_CREATESEPAMULTICOR1 *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *profile; int rv; AB_TRANSACTION *t; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfers"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_CREATESEPAMULTICOR1, j); assert(aj); dbArgs=AH_Job_GetArguments(j); /* calculate sum */ AB_Value_free(aj->sumValues); aj->sumValues=AB_Value_new(); AB_Value_SetCurrency(aj->sumValues, "EUR"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); assert(t); /* debug */ return GWEN_ERROR_INTERNAL; } while(t) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) AB_Value_AddValue(aj->sumValues, v); t=AB_Transaction_List_Next(t); } /* find the right profile to produce pain.008 messages */ profile=AH_Job_FindSepaProfile(j, "008*", AH_User_GetSepaDebitNoteProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* set singleBookingWanted */ if (aj->singleBookingAllowed && GWEN_DB_GetIntValue(profile, "singleBookingWanted", 0, 1)) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "J"); else { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", "N"); GWEN_DB_SetIntValue(profile, GWEN_DB_FLAGS_OVERWRITE_VARS, "singleBookingWanted", 0); } /* adjust parameters for COR1 transactions */ GWEN_DB_SetCharValue(profile, GWEN_DB_FLAGS_OVERWRITE_VARS, "LocalInstrumentSEPACode", "COR1"); /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* store sum value */ if (aj->sumValues) { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; const char *s; dbV=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "totalSum"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHbciString(aj->sumValues, nbuf); if (GWEN_Buffer_GetUsedBytes(nbuf)<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); return GWEN_ERROR_BAD_DATA; } /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); /* store currency */ s=AB_Value_GetCurrency(aj->sumValues); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/accountjob.c0000644000175000017500000001403212375175275023414 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "accountjob_p.h" #include "aqhbci_l.h" #include "job_l.h" #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_ACCOUNTJOB); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_AccountJob_new(const char *name, AB_USER *u, AB_ACCOUNT *account){ AH_ACCOUNTJOB *aj; AH_JOB *j; GWEN_DB_NODE *dbArgs; const char *s; int jobVersion=0; assert(name); assert(u); assert(account); if (!(AH_Account_GetFlags(account) & AH_BANK_FLAGS_KTV2)) { int maxVer=0; /* no account suffix, so we try to determine the highest usable * version of the job which still doesn't need the suffix */ if (strcasecmp(name, "JobGetTransactions")==0) maxVer=4; else if (strcasecmp(name, "JobGetBalance")==0) maxVer=4; else if (strcasecmp(name, "JobSingleTransfer")==0) maxVer=3; else if (strcasecmp(name, "JobSingleDebitNote")==0) maxVer=3; else if (strcasecmp(name, "JobInternalTransfer")==0 || strcasecmp(name, "JobLoadCellPhone")==0) /* this job needs a suffix, so if there is none you don't get it */ maxVer=-1; else if (strcasecmp(name, "JobGetDatedTransfers")==0) maxVer=1; else if (strcasecmp(name, "JobCreateDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobModifyDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteDatedTransfer")==0) maxVer=1; else if (strcasecmp(name, "JobCreateStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobModifyStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteStandingOrder")==0) maxVer=1; if (maxVer==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "This job needs an account suffix, but your bank didn't provide one. " "Therefore this job is not supported with your account."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("This job needs an account suffix, but your bank did not provide one. " "Therefore this job is not supported with your account.\n" "Setting a higher HBCI version in the user settings might fix " "the problem.")); return NULL; } if (maxVer>0) { jobVersion=AH_Job_GetMaxVersionUpUntil(name, u, maxVer); if (jobVersion<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No job [%s] below version %d, falling back to 0", name, maxVer); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, "No version for job [%s] up to %d found, falling back to 0", name, maxVer); jobVersion=0; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Reducing version of job [%s] to %d", name, jobVersion); } } } j=AH_Job_new(name, u, AB_Account_GetAccountNumber(account), jobVersion); if (!j) return 0; GWEN_NEW_OBJECT(AH_ACCOUNTJOB, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_ACCOUNTJOB, j, aj, AH_AccountJob_FreeData); aj->account=account; /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); s=AB_Account_GetAccountNumber(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountId", s); s=AB_Account_GetSubAccountId(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountSubId", s); s=AB_Account_GetBankCode(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bankCode", s); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "country", 280); /* new for SEPA jobs */ s=AB_Account_GetIBAN(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "iban", s); s=AB_Account_GetBIC(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bic", s); return j; } /* --------------------------------------------------------------- FUNCTION */ AB_ACCOUNT *AH_AccountJob_GetAccount(const AH_JOB *j){ AH_ACCOUNTJOB *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_ACCOUNTJOB, j); assert(aj); return aj->account; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_AccountJob_FreeData(void *bp, void *p) { AH_ACCOUNTJOB *aj; aj=(AH_ACCOUNTJOB*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_AccountJob_IsAccountJob(const AH_JOB *j) { return GWEN_INHERIT_ISOFTYPE(AH_JOB, AH_ACCOUNTJOB, j); } /* --------------------------------------------------------------- FUNCTION */ int AH_AccountJob_AddCurrentTime(GWEN_BUFFER *buf) { GWEN_TIME *t; int hours, mins, secs; char numbuf[16]; t=GWEN_CurrentTime(); assert(t); if (GWEN_Time_GetBrokenDownTime(t, &hours, &mins, &secs)) { GWEN_Time_free(t); return -1; } snprintf(numbuf, sizeof(numbuf), "%02d%02d%02d", hours, mins, secs); GWEN_Buffer_AppendString(buf, numbuf); GWEN_Time_free(t); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_AccountJob_AddCurrentDate(GWEN_BUFFER *buf) { GWEN_TIME *t; int year, month, day; char numbuf[16]; t=GWEN_CurrentTime(); assert(t); if (GWEN_Time_GetBrokenDownDate(t, &day, &month, &year)) { GWEN_Time_free(t); return -1; } snprintf(numbuf, sizeof(numbuf), "%04d%02d%02d", year, month, day); GWEN_Buffer_AppendString(buf, numbuf); GWEN_Time_free(t); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobloadcellphone.c0000644000175000017500000002044412375175275024575 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobloadcellphone_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_LOADCELLPHONE); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_LoadCellPhone_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_LOADCELLPHONE *aj; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobLoadCellPhone", u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 41); GWEN_NEW_OBJECT(AH_JOB_LOADCELLPHONE, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_LOADCELLPHONE, j, aj, AH_Job_LoadCellPhone_FreeData); /* overwrite some virtual functions */ AH_Job_SetExchangeFn(j, AH_Job_LoadCellPhone_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_LoadCellPhone_FreeData(void *bp, void *p){ AH_JOB_LOADCELLPHONE *aj; aj=(AH_JOB_LOADCELLPHONE*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_LoadCellPhone_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_LOADCELLPHONE *aj; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbProduct; AB_CELLPHONE_PRODUCT_LIST *pl; int i; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_LOADCELLPHONE, j); assert(aj); dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* read products */ pl=AB_CellPhoneProduct_List_new(); dbProduct=GWEN_DB_FindFirstGroup(dbParams, "product"); while (dbProduct) { AB_CELLPHONE_PRODUCT *cp; char numbuf[16]; const char *s; cp=AB_CellPhoneProduct_new(); i=GWEN_DB_GetIntValue(dbProduct, "Code", 0, -1); snprintf(numbuf, sizeof(numbuf), "%d", i); AB_CellPhoneProduct_SetId(cp, numbuf); i=GWEN_DB_GetIntValue(dbParams, "FreeValueAllowed", 0, 0); AB_CellPhoneProduct_SetAllowFreeValue(cp, i); s=GWEN_DB_GetCharValue(dbProduct, "Name", 0, NULL); if (s) AB_CellPhoneProduct_SetProviderName(cp, s); s=GWEN_DB_GetCharValue(dbProduct, "ProductName", 0, NULL); if (s) AB_CellPhoneProduct_SetProductName(cp, s); s=GWEN_DB_GetCharValue(dbProduct, "MinimumValue", 0, NULL); if (s) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_INFO(GWEN_LOGDOMAIN, "Bad minimum value [%s]", s); } else { AB_CellPhoneProduct_SetMinimumValue(cp, v); AB_Value_free(v); } } s=GWEN_DB_GetCharValue(dbProduct, "MaximumValue", 0, NULL); if (s) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_INFO(GWEN_LOGDOMAIN, "Bad maximum value [%s]", s); } else { AB_CellPhoneProduct_SetMaximumValue(cp, v); AB_Value_free(v); } } s=GWEN_DB_GetCharValue(dbProduct, "ValueList", 0, NULL); if (s) { char *ns; char *p; AB_VALUE_LIST *vl; /* read value list */ vl=AB_CellPhoneProduct_GetValues(cp); ns=strdup(s); p=ns; while(*p) { char *p0; p0=p; p=strchr(p0, ';'); if (p) *p=0; if (*p0) { AB_VALUE *v; v=AB_Value_fromString(p0); if (v) { AB_Value_List_Add(v, vl); } else { DBG_INFO(GWEN_LOGDOMAIN, "Bad value [%s]", p0); } } if (p) p++; else break; } } AB_CellPhoneProduct_List_Add(cp, pl); dbProduct=GWEN_DB_FindNextGroup(dbProduct, "product"); } AB_JobLoadCellPhone_SetProductList(bj, pl); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_LoadCellPhone_ExchangeArgs(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_LOADCELLPHONE *aj; GWEN_DB_NODE *dbArgs; const AB_CELLPHONE_PRODUCT *cp; const AB_VALUE *v; const char *s; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging args"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_LOADCELLPHONE, j); assert(aj); dbArgs=AH_Job_GetArguments(j); cp=AB_JobLoadCellPhone_GetCellPhoneProduct(bj); if (cp==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No product"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } /* cell phone card provider */ s=AB_CellPhoneProduct_GetId(cp); assert(s); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "ProviderCode", s); /* phone number */ s=AB_JobLoadCellPhone_GetPhoneNumber(bj); if (s==NULL || *s==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No phone number"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "PhoneNumber", s); /* value */ v=AB_JobLoadCellPhone_GetValue(bj); if (v==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No value"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } else if (AB_Value_IsZero(v) || AB_Value_IsNegative(v)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad value"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_INVALID; } else { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; char *p; const char *s; int l; dbV=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); if (GWEN_Text_DoubleToBuffer(AB_Value_GetValueAsDouble(v), nbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Buffer overflow"); GWEN_Buffer_free(nbuf); abort(); } l=GWEN_Buffer_GetUsedBytes(nbuf); if (!l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); abort(); } /* replace "C" comma with "DE" comma, remove thousand's comma */ p=GWEN_Buffer_GetStart(nbuf); s=p; while(*s) { if (*s=='.') { *p=','; p++; } else if (*s!=',') { *p=*s; p++; } s++; } /* while */ *p=0; if (strchr(GWEN_Buffer_GetStart(nbuf), ',')) { /* kill all trailing '0' behind the comma */ p=GWEN_Buffer_GetStart(nbuf)+l; while(l--) { --p; if (*p=='0') *p=0; else break; } } else GWEN_Buffer_AppendString(nbuf, ","); /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); s=AB_Value_GetCurrency(v); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_LoadCellPhone_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_LOADCELLPHONE *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_LOADCELLPHONE, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeLoadCellPhone) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetLoadCellPhone job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: return AH_Job_LoadCellPhone_ExchangeParams(j, bj, ctx); case AH_Job_ExchangeModeArgs: return AH_Job_LoadCellPhone_ExchangeArgs(j, bj, ctx); case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetbalance_p.h0000644000175000017500000000214012375175275024366 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETBALANCE_P_H #define AH_JOBGETBALANCE_P_H #include "jobgetbalance_l.h" #include typedef struct AH_JOB_GETBALANCE AH_JOB_GETBALANCE; struct AH_JOB_GETBALANCE { int dummy; }; static void GWENHYWFAR_CB AH_Job_GetBalance_FreeData(void *bp, void *p); static int AH_Job_GetBalance_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetBalance_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static AB_BALANCE *AH_Job_GetBalance__ReadBalance(GWEN_DB_NODE *dbT); #endif /* AH_JOBGETBALANCE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsingletransfer.xml0000644000175000017500000001144212375175275025366 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedmulticreate_l.h0000644000175000017500000000125612530646060027246 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPACOR1DATEDMULTICREATE_L_H #define AH_JOBSEPACOR1DATEDMULTICREATE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaCor1DebitDatedMultiCreate_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPACOR1DATEDMULTICREATE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedsinglecreate.xml0000644000175000017500000000417612375175275027676 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/Makefile.in0000644000175000017500000007122612643540057023166 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/ajobs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libhbciaccjobs_la_LIBADD = am_libhbciaccjobs_la_OBJECTS = accountjob.lo jobgetbalance.lo \ jobgettransactions.lo jobgetdatedxfers.lo \ jobgetstandingorders.lo jobsingletransfer.lo jobeutransfer.lo \ jobmultitransfer.lo jobforeignxferwh.lo jobloadcellphone.lo \ jobsepadebitdatedsinglecreate.lo \ jobsepadebitdatedmulticreate.lo jobsepacor1datedmulticreate.lo \ jobsepaxfermulti.lo jobsepaxfersingle.lo jobsepadebitsingle.lo \ jobsepacor1datedsinglecreate.lo jobtransferbase.lo \ jobsepastandingordercreate.lo jobsepastandingorderget.lo \ jobsepastandingorderdelete.lo libhbciaccjobs_la_OBJECTS = $(am_libhbciaccjobs_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libhbciaccjobs_la_SOURCES) DIST_SOURCES = $(libhbciaccjobs_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../joblayer \ -I$(srcdir)/../msglayer \ -I$(srcdir)/../banking \ -I$(srcdir)/../applayer \ -I$(srcdir)/.. noinst_LTLIBRARIES = libhbciaccjobs.la noinst_HEADERS = \ accountjob_l.h \ accountjob_p.h \ jobgetbalance_l.h \ jobgetbalance_p.h \ jobgettransactions_l.h \ jobgettransactions_p.h \ jobgetstandingorders_l.h \ jobgetstandingorders_p.h \ jobgetdatedxfers_l.h \ jobgetdatedxfers_p.h \ jobsingletransfer_l.h \ jobsingletransfer_p.h \ jobeutransfer_l.h \ jobeutransfer_p.h \ jobmultitransfer_l.h \ jobmultitransfer_p.h \ jobforeignxferwh_l.h \ jobforeignxferwh_p.h \ jobloadcellphone_l.h \ jobloadcellphone_p.h \ jobsepadebitdatedsinglecreate_l.h \ jobsepadebitdatedsinglecreate_p.h \ jobsepadebitdatedmulticreate_l.h \ jobsepadebitdatedmulticreate_p.h \ jobsepacor1datedmulticreate_l.h \ jobsepacor1datedmulticreate_p.h \ jobsepaxfermulti_l.h \ jobsepaxfermulti_p.h \ jobsepaxfersingle_l.h \ jobsepaxfersingle_p.h \ jobsepadebitsingle_l.h \ jobsepadebitsingle_p.h \ jobsepacor1datedsinglecreate_l.h \ jobsepacor1datedsinglecreate_p.h \ jobtransferbase_l.h jobtransferbase_p.h \ jobsepastandingordercreate_l.h \ jobsepastandingorderget_l.h jobsepastandingorderget_p.h \ jobsepastandingorderdelete_l.h libhbciaccjobs_la_SOURCES = \ accountjob.c \ jobgetbalance.c \ jobgettransactions.c \ jobgetdatedxfers.c \ jobgetstandingorders.c \ jobsingletransfer.c \ jobeutransfer.c \ jobmultitransfer.c \ jobforeignxferwh.c \ jobloadcellphone.c \ jobsepadebitdatedsinglecreate.c \ jobsepadebitdatedmulticreate.c \ jobsepacor1datedmulticreate.c \ jobsepaxfermulti.c \ jobsepaxfersingle.c \ jobsepadebitsingle.c \ jobsepacor1datedsinglecreate.c \ jobtransferbase.c \ jobsepastandingordercreate.c \ jobsepastandingorderget.c \ jobsepastandingorderdelete.c xmlfiles = \ $(srcdir)/jobgetbalance.xml \ $(srcdir)/jobgettransactions.xml \ $(srcdir)/jobgetstandingorders.xml \ $(srcdir)/jobsingletransfer.xml \ $(srcdir)/jobsingledebitnote.xml \ $(srcdir)/jobinternaltransfer.xml \ $(srcdir)/jobeutransfer.xml \ $(srcdir)/jobmultitransfer.xml \ $(srcdir)/jobforeignxferwh.xml \ $(srcdir)/jobcreatesto.xml \ $(srcdir)/jobmodifysto.xml \ $(srcdir)/jobdeletesto.xml \ $(srcdir)/jobgetdatedxfers.xml \ $(srcdir)/jobcreatedatedxfer.xml \ $(srcdir)/jobmodifydatedxfer.xml \ $(srcdir)/jobdeletedatedxfer.xml \ $(srcdir)/jobloadcellphone.xml \ $(srcdir)/jobsepadebitdatedsinglecreate.xml \ $(srcdir)/jobsepadebitdatedmulticreate.xml \ $(srcdir)/jobsepacor1datedmulticreate.xml \ $(srcdir)/jobsepaxfermulti.xml \ $(srcdir)/jobsepaxfersingle.xml \ $(srcdir)/jobsepadebitsingle.xml \ $(srcdir)/jobsepacor1datedsinglecreate.xml \ $(srcdir)/jobsepastandingordercreate.xml \ $(srcdir)/jobsepastandingorderget.xml \ $(srcdir)/jobsepastandingorderdelete.xml EXTRA_DIST = $(xmlfiles) CLEANFILES = accountjobs.xml all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/ajobs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/ajobs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libhbciaccjobs.la: $(libhbciaccjobs_la_OBJECTS) $(libhbciaccjobs_la_DEPENDENCIES) $(EXTRA_libhbciaccjobs_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libhbciaccjobs_la_OBJECTS) $(libhbciaccjobs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accountjob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobeutransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobforeignxferwh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetbalance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetdatedxfers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetstandingorders.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgettransactions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobloadcellphone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobmultitransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepacor1datedmulticreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepacor1datedsinglecreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepadebitdatedmulticreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepadebitdatedsinglecreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepadebitsingle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepastandingordercreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepastandingorderdelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepastandingorderget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepaxfermulti.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepaxfersingle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsingletransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobtransferbase.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am sources: for f in $(libhbciaccjobs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done accountjobs.xml: $(xmlfiles) $(XMLMERGE) -v --compact -o $@ $(xmlfiles) all-local: accountjobs.xml # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetdatedxfers_l.h0000644000175000017500000000133112375175275025127 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETDATEDTRANSFERS_L_H #define AH_JOBGETDATEDTRANSFERS_L_H #include "accountjob_l.h" AH_JOB *AH_Job_GetDatedTransfers_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBGETDATEDTRANSFERS_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderdelete.c0000644000175000017500000000301412634042527026644 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepastandingorderdelete_l.h" #include "jobsepastandingordercreate_l.h" #include "jobtransferbase_l.h" /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaStandingOrderDelete_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_TransferBase_new("JobSepaStandingOrderDelete", AB_Transaction_TypeSepaTransfer, AB_Transaction_SubTypeStandingOrder, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 35); /* overwrite some virtual functions (use those from AH_Job_SepaStandingOrderCreate) */ AH_Job_SetPrepareFn(j, AH_Job_SepaStandingOrderCreate_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaStandingOrderCreate_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaStandingOrderCreate_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_SepaStandingOrderCreate_ExchangeArgs); return j; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/accountjob_l.h0000644000175000017500000000200412375175275023730 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ACCOUNTJOBS_L_H #define AH_ACCOUNTJOBS_L_H #include "job_l.h" #include #include AH_JOB *AH_AccountJob_new(const char *name, AB_USER *u, AB_ACCOUNT *account); int AH_AccountJob_IsAccountJob(const AH_JOB *j); AB_ACCOUNT *AH_AccountJob_GetAccount(const AH_JOB *j); int AH_AccountJob_AddCurrentTime(GWEN_BUFFER *buf); int AH_AccountJob_AddCurrentDate(GWEN_BUFFER *buf); #endif /* AH_ACCOUNTJOBS_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedsinglecreate.xml0000644000175000017500000000472712375175275027455 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobtransferbase.c0000644000175000017500000004046012375175275024443 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobtransferbase_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_TRANSFERBASE); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_TransferBase_new(const char *jobName, AB_TRANSACTION_TYPE tt, AB_TRANSACTION_SUBTYPE tst, AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_TRANSFERBASE *aj; j=AH_AccountJob_new(jobName, u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_TRANSFERBASE, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j, aj, AH_Job_TransferBase_FreeData); aj->transactionType=tt; aj->transactionSubType=tst; /* overwrite some virtual functions */ AH_Job_SetExchangeFn(j, AH_Job_TransferBase_Exchange); AH_Job_SetProcessFn(j, AH_Job_TransferBase_Process); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_TransferBase_FreeData(void *bp, void *p){ AH_JOB_TRANSFERBASE *aj; aj=(AH_JOB_TRANSFERBASE*)p; free(aj->fiid); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Job_TransferBase_GetFiid(const AH_JOB *j) { AH_JOB_TRANSFERBASE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); return aj->fiid; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_SepaExportTransactions(AH_JOB *j, GWEN_DB_NODE *profile) { AH_JOB_TRANSFERBASE *aj; GWEN_DB_NODE *dbArgs; AB_BANKING *ab; const char *descriptor; const AB_TRANSACTION *t; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Exporting transaction"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); ab=AH_Job_GetBankingApi(j); assert(ab); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); descriptor=GWEN_DB_GetCharValue(profile, "descriptor", 0, 0); assert(descriptor); DBG_INFO(AQHBCI_LOGDOMAIN, "Using SEPA descriptor %s and profile %s", descriptor, GWEN_DB_GetCharValue(profile, "name", 0, 0)); /* set data in job */ t=AH_Job_GetFirstTransfer(j); if (t) { AB_IMEXPORTER_CONTEXT *ioc; AB_TRANSACTION *cpy; AB_IMEXPORTER *ie; /* add transfers as transactions for export (exporters only use transactions) */ ioc=AB_ImExporterContext_new(); while(t) { cpy=AB_Transaction_dup(t); AB_ImExporterContext_AddTransaction(ioc, cpy); t=AB_Transaction_List_Next(t); } ie=AB_Banking_GetImExporter(ab, "sepa"); if (ie) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=AB_ImExporter_ExportToBuffer(ie, ioc, dbuf, profile); AB_ImExporterContext_free(ioc); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); return rv; } /* store descriptor */ GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "descriptor", descriptor); /* store transfer */ GWEN_DB_SetBinValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "transfer", GWEN_Buffer_GetStart(dbuf), GWEN_Buffer_GetUsedBytes(dbuf)); GWEN_Buffer_free(dbuf); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "here"); AB_ImExporterContext_free(ioc); return GWEN_ERROR_NO_DATA; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_ExchangeParams_SepaUndated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AB_TRANSACTION_LIMITS *lim; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetMaxLenRemoteName(lim, 70); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetNeedDate(lim, -1); AB_Job_SetFieldLimits(bj, lim); AB_TransactionLimits_free(lim); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_ExchangeArgs_SepaUndated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { const AB_TRANSACTION_LIMITS *lim=NULL; AB_BANKING *ab; const AB_TRANSACTION *t=NULL; AB_TRANSACTION *tCopy=NULL; int rv; AB_USER *u; uint32_t uflags; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging args"); ab=AH_Job_GetBankingApi(j); assert(ab); u=AH_Job_GetUser(j); assert(u); uflags=AH_User_GetFlags(u); /* get limits and transaction */ lim=AB_Job_GetFieldLimits(bj); t=AB_Job_GetTransaction(bj); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INVALID; } /* DISABLED according to a discussion on aqbanking-user: * The application should do this, not the library. AB_Transaction_FillLocalFromAccount(t, a); */ /* validate transaction */ rv=AB_Transaction_CheckForSepaConformity(t, (uflags & AH_USER_FLAGS_USE_STRICT_SEPA_CHARSET)?1:0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckPurposeAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckNamesAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } tCopy=AB_Transaction_dup(t); /* set group id so the application can now which transfers went together in one setting */ AB_Transaction_SetGroupId(tCopy, AH_Job_GetId(j)); /* store validated transaction in job */ AB_Job_SetTransaction(bj, tCopy); /* store copy of transaction for later */ AH_Job_AddTransfer(j, tCopy); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_ExchangeArgs_SepaDated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { const AB_TRANSACTION_LIMITS *lim=NULL; AB_BANKING *ab; const AB_TRANSACTION *t=NULL; AB_TRANSACTION *tCopy=NULL; int rv; AB_USER *u; uint32_t uflags; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging args"); ab=AH_Job_GetBankingApi(j); assert(ab); u=AH_Job_GetUser(j); assert(u); uflags=AH_User_GetFlags(u); /* get limits and transaction */ lim=AB_Job_GetFieldLimits(bj); t=AB_Job_GetTransaction(bj); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INVALID; } /* DISABLED according to a discussion on aqbanking-user: * The application should do this, not the library. AB_Transaction_FillLocalFromAccount(t, a); */ /* validate transaction */ rv=AB_Transaction_CheckForSepaConformity(t, (uflags & AH_USER_FLAGS_USE_STRICT_SEPA_CHARSET)?1:0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckPurposeAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckNamesAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckDateAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } tCopy=AB_Transaction_dup(t); /* set group id so the application can now which transfers went together in one setting */ AB_Transaction_SetGroupId(tCopy, AH_Job_GetId(j)); /* store validated transaction in job */ AB_Job_SetTransaction(bj, tCopy); /* store copy of transaction for later */ AH_Job_AddTransfer(j, tCopy); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { const AB_TRANSACTION_LIMITS *lim=NULL; AB_BANKING *ab; const AB_TRANSACTION *t=NULL; AB_TRANSACTION *tCopy=NULL; int rv; AB_USER *u; uint32_t uflags; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging args"); ab=AH_Job_GetBankingApi(j); assert(ab); u=AH_Job_GetUser(j); assert(u); uflags=AH_User_GetFlags(u); /* get limits and transaction */ lim=AB_Job_GetFieldLimits(bj); t=AB_Job_GetTransaction(bj); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction in job"); return GWEN_ERROR_INVALID; } /* DISABLED according to a discussion on aqbanking-user: * The application should do this, not the library. AB_Transaction_FillLocalFromAccount(t, a); */ /* validate transaction */ rv=AB_Transaction_CheckForSepaConformity(t, (uflags & AH_USER_FLAGS_USE_STRICT_SEPA_CHARSET)?1:0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckPurposeAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckNamesAgainstLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Transaction_CheckDateAgainstSequenceLimits(t, lim); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } tCopy=AB_Transaction_dup(t); /* set group id so the application can now which transfers went together in one setting */ AB_Transaction_SetGroupId(tCopy, AH_Job_GetId(j)); /* store validated transaction in job */ AB_Job_SetTransaction(bj, tCopy); /* store copy of transaction for later */ AH_Job_AddTransfer(j, tCopy); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_ExchangeResults(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_TRANSFERBASE *aj; AH_RESULT_LIST *rl; AH_RESULT *r; int has10; int has20; AB_TRANSACTION_STATUS tStatus; const AB_TRANSACTION *t; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); rl=AH_Job_GetSegResults(j); assert(rl); r=AH_Result_List_First(rl); if (!r) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No segment results"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } has10=0; has20=0; while(r) { int rcode; rcode=AH_Result_GetCode(r); if (rcode>=10 && rcode<=19) has10=1; else if (rcode>=20 && rcode <=29) has20=1; r=AH_Result_List_Next(r); } if (has20) { AB_Job_SetStatus(bj, AB_Job_StatusFinished); DBG_INFO(AQHBCI_LOGDOMAIN, "Job finished"); } else if (has10) { AB_Job_SetStatus(bj, AB_Job_StatusPending); DBG_INFO(AQHBCI_LOGDOMAIN, "Job pending"); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Error status (neither 0010 nor 0020)"); AB_Job_SetStatus(bj, AB_Job_StatusError); } if (has20) tStatus=AB_Transaction_StatusAccepted; else if (has10) tStatus=AB_Transaction_StatusPending; else tStatus=AB_Transaction_StatusRejected; t=AB_Job_GetTransaction(bj); if (t) { AB_TRANSACTION *cpy; cpy=AB_Transaction_dup(t); AB_Transaction_SetFiId(cpy, aj->fiid); AB_Transaction_SetStatus(cpy, tStatus); AB_Transaction_SetType(cpy, aj->transactionType); AB_Transaction_SetSubType(cpy, aj->transactionSubType); switch(aj->transactionType) { case AB_Transaction_TypeUnknown: case AB_Transaction_TypeTransaction: AB_ImExporterContext_AddTransaction(ctx, cpy); /* takes over cpy */ break; case AB_Transaction_TypeTransfer: case AB_Transaction_TypeDebitNote: case AB_Transaction_TypeEuTransfer: case AB_Transaction_TypeSepaTransfer: case AB_Transaction_TypeSepaDebitNote: case AB_Transaction_TypeInternalTransfer: if (aj->transactionSubType==AB_Transaction_SubTypeStandingOrder) AB_ImExporterContext_AddStandingOrder(ctx, cpy); /* takes over cpy */ else AB_ImExporterContext_AddTransfer(ctx, cpy); /* takes over cpy */ break; } } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_TRANSFERBASE *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); switch(m) { case AH_Job_ExchangeModeParams: if (aj->exchangeParamsFn) return aj->exchangeParamsFn(j, bj, ctx); break; case AH_Job_ExchangeModeArgs: if (aj->exchangeArgsFn) return aj->exchangeArgsFn(j, bj, ctx); break; case AH_Job_ExchangeModeResults: if (aj->exchangeResultsFn) return aj->exchangeResultsFn(j, bj, ctx); else return AH_Job_TransferBase_ExchangeResults(j, bj, ctx); break; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ /* just ignore */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Exchange mode %d not implemented", m); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_TransferBase_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_TRANSFERBASE *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; const char *responseName; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); DBG_INFO(AQHBCI_LOGDOMAIN, "Processing"); responseName=AH_Job_GetResponseName(j); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "TransferBaseSingleResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } if (responseName && *responseName) { GWEN_DB_NODE *dbXA; dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data"); if (dbXA) dbXA=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, responseName); if (dbXA) { const char *s; s=GWEN_DB_GetCharValue(dbXA, "referenceId", 0, 0); if (s) { free(aj->fiid); aj->fiid=strdup(s); } } } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ void AH_Job_TransferBase_SetExchangeParamsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f){ AH_JOB_TRANSFERBASE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); aj->exchangeParamsFn=f; } /* --------------------------------------------------------------- FUNCTION */ void AH_Job_TransferBase_SetExchangeArgsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f){ AH_JOB_TRANSFERBASE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); aj->exchangeArgsFn=f; } /* --------------------------------------------------------------- FUNCTION */ void AH_Job_TransferBase_SetExchangeResultsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f){ AH_JOB_TRANSFERBASE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TRANSFERBASE, j); assert(aj); aj->exchangeResultsFn=f; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobeutransfer.xml0000644000175000017500000000475012375175275024522 00000000000000 %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobtransferbase_l.h0000644000175000017500000000337512375175275024767 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBTRANSFERBASE_L_H #define AH_JOBTRANSFERBASE_L_H #include "accountjob_l.h" typedef int (*AH_JOB_TRANSFERBASE_EXCHANGE_FN)(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); AH_JOB *AH_Job_TransferBase_new(const char *jobName, AB_TRANSACTION_TYPE tt, AB_TRANSACTION_SUBTYPE tst, AB_USER *u, AB_ACCOUNT *account); const char *AH_Job_TransferBase_GetFiid(const AH_JOB *j); void AH_Job_TransferBase_SetExchangeParamsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f); void AH_Job_TransferBase_SetExchangeArgsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f); void AH_Job_TransferBase_SetExchangeResultsFn(AH_JOB *j, AH_JOB_TRANSFERBASE_EXCHANGE_FN f); int AH_Job_TransferBase_SepaExportTransactions(AH_JOB *j, GWEN_DB_NODE *profile); int AH_Job_TransferBase_ExchangeParams_SepaUndated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_TransferBase_ExchangeArgs_SepaDated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_TransferBase_ExchangeArgs_SepaUndated(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_TransferBase_ExchangeArgs_SepaDatedDebit(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBTRANSFERBASE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitsingle_l.h0000644000175000017500000000120512375175275025440 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITSINGLE_L_H #define AH_JOBSEPADEBITSINGLE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaDebitSingle_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPADEBITSINGLE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderdelete_l.h0000644000175000017500000000122612624441727027173 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPASTANDINGORDERDELETE_L_H #define AH_JOBSEPASTANDINGORDERDELETE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaStandingOrderDelete_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPASTANDINGORDERDELETE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobdeletesto.xml0000644000175000017500000001051112375175275024324 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobforeignxferwh_p.h0000644000175000017500000000210312375175275025155 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOB_FOREIGNXFERWH_P_H #define AH_JOB_FOREIGNXFERWH_P_H #include "jobforeignxferwh_l.h" #include #define AH_JOBFOREIGNXFERWH_MAXTRANS 256 typedef struct AH_JOB_FOREIGNXFERWH AH_JOB_FOREIGNXFERWH; struct AH_JOB_FOREIGNXFERWH { int maxTransfers; }; static void GWENHYWFAR_CB AH_Job_ForeignTransferWH_FreeData(void *bp, void *p); static int AH_Job_ForeignTransferWH_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_ForeignTransferWH_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOB_FOREIGNXFERWH_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetstandingorders_p.h0000644000175000017500000000203212375175275026027 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETSTANDINGORDERS_P_H #define AH_JOBGETSTANDINGORDERS_P_H #include "jobgetstandingorders_l.h" #include typedef struct AH_JOB_GETSTANDINGORDERS AH_JOB_GETSTANDINGORDERS; struct AH_JOB_GETSTANDINGORDERS { int dummy; }; static void GWENHYWFAR_CB AH_Job_GetStandingOrders_FreeData(void *bp, void *p); static int AH_Job_GetStandingOrders_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetStandingOrders_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBGETSTANDINGORDERS_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmultitransfer_l.h0000644000175000017500000000145012375175275025177 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBMULTITRANSFER_L_H #define AH_JOBMULTITRANSFER_L_H #include "accountjob_l.h" #include AH_JOB *AH_Job_MultiTransfer_new(AB_USER *u, AB_ACCOUNT *account); AH_JOB *AH_Job_MultiDebitNote_new(AB_USER *cu, AB_ACCOUNT *account); #endif /* AH_JOBMULTITRANSFER_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/Makefile.am0000644000175000017500000000643012634042721023143 00000000000000 AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../joblayer \ -I$(srcdir)/../msglayer \ -I$(srcdir)/../banking \ -I$(srcdir)/../applayer \ -I$(srcdir)/.. noinst_LTLIBRARIES=libhbciaccjobs.la noinst_HEADERS=\ accountjob_l.h \ accountjob_p.h \ jobgetbalance_l.h \ jobgetbalance_p.h \ jobgettransactions_l.h \ jobgettransactions_p.h \ jobgetstandingorders_l.h \ jobgetstandingorders_p.h \ jobgetdatedxfers_l.h \ jobgetdatedxfers_p.h \ jobsingletransfer_l.h \ jobsingletransfer_p.h \ jobeutransfer_l.h \ jobeutransfer_p.h \ jobmultitransfer_l.h \ jobmultitransfer_p.h \ jobforeignxferwh_l.h \ jobforeignxferwh_p.h \ jobloadcellphone_l.h \ jobloadcellphone_p.h \ jobsepadebitdatedsinglecreate_l.h \ jobsepadebitdatedsinglecreate_p.h \ jobsepadebitdatedmulticreate_l.h \ jobsepadebitdatedmulticreate_p.h \ jobsepacor1datedmulticreate_l.h \ jobsepacor1datedmulticreate_p.h \ jobsepaxfermulti_l.h \ jobsepaxfermulti_p.h \ jobsepaxfersingle_l.h \ jobsepaxfersingle_p.h \ jobsepadebitsingle_l.h \ jobsepadebitsingle_p.h \ jobsepacor1datedsinglecreate_l.h \ jobsepacor1datedsinglecreate_p.h \ jobtransferbase_l.h jobtransferbase_p.h \ jobsepastandingordercreate_l.h \ jobsepastandingorderget_l.h jobsepastandingorderget_p.h \ jobsepastandingorderdelete_l.h libhbciaccjobs_la_SOURCES=\ accountjob.c \ jobgetbalance.c \ jobgettransactions.c \ jobgetdatedxfers.c \ jobgetstandingorders.c \ jobsingletransfer.c \ jobeutransfer.c \ jobmultitransfer.c \ jobforeignxferwh.c \ jobloadcellphone.c \ jobsepadebitdatedsinglecreate.c \ jobsepadebitdatedmulticreate.c \ jobsepacor1datedmulticreate.c \ jobsepaxfermulti.c \ jobsepaxfersingle.c \ jobsepadebitsingle.c \ jobsepacor1datedsinglecreate.c \ jobtransferbase.c \ jobsepastandingordercreate.c \ jobsepastandingorderget.c \ jobsepastandingorderdelete.c sources: for f in $(libhbciaccjobs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done xmlfiles=\ $(srcdir)/jobgetbalance.xml \ $(srcdir)/jobgettransactions.xml \ $(srcdir)/jobgetstandingorders.xml \ $(srcdir)/jobsingletransfer.xml \ $(srcdir)/jobsingledebitnote.xml \ $(srcdir)/jobinternaltransfer.xml \ $(srcdir)/jobeutransfer.xml \ $(srcdir)/jobmultitransfer.xml \ $(srcdir)/jobforeignxferwh.xml \ $(srcdir)/jobcreatesto.xml \ $(srcdir)/jobmodifysto.xml \ $(srcdir)/jobdeletesto.xml \ $(srcdir)/jobgetdatedxfers.xml \ $(srcdir)/jobcreatedatedxfer.xml \ $(srcdir)/jobmodifydatedxfer.xml \ $(srcdir)/jobdeletedatedxfer.xml \ $(srcdir)/jobloadcellphone.xml \ $(srcdir)/jobsepadebitdatedsinglecreate.xml \ $(srcdir)/jobsepadebitdatedmulticreate.xml \ $(srcdir)/jobsepacor1datedmulticreate.xml \ $(srcdir)/jobsepaxfermulti.xml \ $(srcdir)/jobsepaxfersingle.xml \ $(srcdir)/jobsepadebitsingle.xml \ $(srcdir)/jobsepacor1datedsinglecreate.xml \ $(srcdir)/jobsepastandingordercreate.xml \ $(srcdir)/jobsepastandingorderget.xml \ $(srcdir)/jobsepastandingorderdelete.xml EXTRA_DIST=$(xmlfiles) accountjobs.xml: $(xmlfiles) $(XMLMERGE) -v --compact -o $@ $(xmlfiles) all-local: accountjobs.xml CLEANFILES = accountjobs.xml aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetstandingorders_l.h0000644000175000017500000000133012375175275026023 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETSTANDINGORDERS_L_H #define AH_JOBGETSTANDINGORDERS_L_H #include "accountjob_l.h" AH_JOB *AH_Job_GetStandingOrders_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBGETSTANDINGORDERS_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetbalance_l.h0000644000175000017500000000134012375175275024363 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETBALANCE_L_H #define AH_JOBGETBALANCE_L_H #include "accountjob_l.h" #include AH_JOB *AH_Job_GetBalance_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBGETBALANCE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitsingle_p.h0000644000175000017500000000163312375175275025451 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITSINGLE_P_H #define AH_JOBSEPADEBITSINGLE_P_H #include "jobsepadebitsingle_l.h" #include static int AH_Job_SepaDebitSingle_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaDebitSingle_Prepare(AH_JOB *j); static int AH_Job_SepaDebitSingle_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); #endif /* AH_JOBSEPADEBITSINGLE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmultitransfer.xml0000644000175000017500000003067612375175275025251 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobeutransfer_l.h0000644000175000017500000000134212375175275024456 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBEUTRANSFER_L_H #define AH_JOBEUTRANSFER_L_H #include "accountjob_l.h" #include AH_JOB *AH_Job_EuTransfer_new(AB_USER *cu, AB_ACCOUNT *account); #endif /* AH_JOBEUTRANSFER_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobeutransfer.c0000644000175000017500000004743712375175275024155 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobeutransfer_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_EUTRANSFER); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_EuTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_EuTransferBase_new(u, account, 1); if (j!=NULL) AH_Job_SetChallengeClass(j, 20); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_EuTransferBase_new(AB_USER *u, AB_ACCOUNT *account, int isTransfer) { AH_JOB *j; AH_JOB_EUTRANSFER *aj; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobEuTransfer", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_EUTRANSFER, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_EUTRANSFER, j, aj, AH_Job_EuTransfer_FreeData); aj->isTransfer=isTransfer; /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_EuTransfer_Process); AH_Job_SetExchangeFn(j, AH_Job_EuTransfer_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_EuTransfer_FreeData(void *bp, void *p){ AH_JOB_EUTRANSFER *aj; aj=(AH_JOB_EUTRANSFER*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_EuTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_EUTRANSFER *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_EUTRANSFER, j); assert(aj); DBG_INFO(AQHBCI_LOGDOMAIN, "Processing %s", "JobEuTransfer"); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_EuTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t) { const GWEN_STRINGLIST *sl; int maxn; int maxs; int n; const char *s; AH_JOB_EUTRANSFER *aj; const AB_EUTRANSFER_INFO *ei=0; const AB_TRANSACTION_LIMITS *lim=0; assert(mj); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_EUTRANSFER, mj); assert(aj); /* get country info (check for IBAN) */ s=AB_Transaction_GetRemoteIban(t); if (s) { char cnt[3]; if (AB_JobEuTransfer_GetIbanAllowed(bj)) { memmove(cnt, s, 2); cnt[2]=0; ei=AB_JobEuTransfer_FindCountryInfo(bj, cnt); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "IBAN not allowed for this account"); return GWEN_ERROR_INVALID; } } else { s=AB_Transaction_GetRemoteCountry(t); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "remote country code not set"); return GWEN_ERROR_INVALID; } ei=AB_JobEuTransfer_FindCountryInfo(bj, s); } if (ei) lim=AB_EuTransferInfo_GetFieldLimits(ei); /* check purpose */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesPurpose(lim); if (maxn==-1) maxn=1; maxs=AB_TransactionLimits_GetMaxLenPurpose(lim); if (maxs==-1) maxs=27; } else { maxn=1; maxs=27; } sl=AB_Transaction_GetPurpose(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; GWEN_STRINGLIST *nsl; const char *p; nsl=GWEN_StringList_new(); se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { char *np; int l; GWEN_BUFFER *tbuf; n++; if (maxn!=-1 && n>maxn) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many purpose lines (%d>%d), cutting off", n, maxn); break; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (l>maxs) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many chars in line %d (%d>27), cutting off", n, l); l=maxs; } np=(char*)malloc(l+1); memmove(np, GWEN_Buffer_GetStart(tbuf), l+1); GWEN_Buffer_free(tbuf); /* let string list take the newly alllocated string */ GWEN_StringList_AppendString(nsl, np, 1, 0); } se=GWEN_StringListEntry_Next(se); } /* while */ AB_Transaction_SetPurpose(t, nsl); } /* check remote name */ maxn=1; if (lim) { maxn=AB_TransactionLimits_GetMaxLinesRemoteName(lim); if (maxn==-1) maxn=1; maxs=AB_TransactionLimits_GetMaxLenRemoteName(lim); if (maxs==-1) maxs=27; } else { maxs=27; } sl=AB_Transaction_GetRemoteName(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; GWEN_STRINGLIST *nsl; const char *p; nsl=GWEN_StringList_new(); se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { char *np; int l; GWEN_BUFFER *tbuf; n++; if (maxn!=-1 && n>maxn) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many remote name lines (%d>%d), cutting off", n, maxn); break; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (l>maxs) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many chars in line %d (%d>27), cutting off", n, l); l=maxs; } np=(char*)malloc(l+1); memmove(np, GWEN_Buffer_GetStart(tbuf), l+1); GWEN_Buffer_free(tbuf); /* let string list take the newly alllocated string */ GWEN_StringList_AppendString(nsl, np, 1, 0); } se=GWEN_StringListEntry_Next(se); } /* while */ AB_Transaction_SetRemoteName(t, nsl); } /* check local name */ s=AB_Transaction_GetLocalName(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local name, filling in"); a=AB_Job_GetAccount(bj); assert(a); s=AB_Account_GetOwnerName(a); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No owner name in account, giving up"); return GWEN_ERROR_INVALID; } AB_Transaction_SetLocalName(t, s); } s=AB_Transaction_GetLocalName(t); if (s) { int l; GWEN_BUFFER *tbuf; if (lim) { maxs=AB_TransactionLimits_GetMaxLenRemoteName(lim); if (maxs==-1) maxs=27; } else { maxs=27; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(s, -1, tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (l>maxs) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many chars in local name (%d>27), cutting off", l); GWEN_Buffer_Crop(tbuf, 0, maxs); } AB_Transaction_SetLocalName(t, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* check local bank code */ s=AB_Transaction_GetLocalBankCode(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local bank code, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetBankCode(a); assert(s); AB_Transaction_SetLocalBankCode(t, s); } /* check local account number */ s=AB_Transaction_GetLocalAccountNumber(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local account number, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetAccountNumber(a); assert(s); AB_Transaction_SetLocalAccountNumber(t, s); } /* check local account suffix */ s=AB_Transaction_GetLocalSuffix(t); if (!s) { AB_ACCOUNT *a; DBG_INFO(AQHBCI_LOGDOMAIN, "No local suffix, filling in (if possible)"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetSubAccountId(a); if (s && *s) AB_Transaction_SetLocalSuffix(t, s); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_EuTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_EUTRANSFER *aj; AB_BANKING *ab; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_EUTRANSFER, j); assert(aj); ab=AB_Account_GetBanking(AB_Job_GetAccount(bj)); assert(ab); if (AB_Job_GetType(bj)!=AB_Job_TypeEuTransfer) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a %s job job", "EuTransfer"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: { GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbT; int i; const char *s; dbParams=AH_Job_GetParams(j); /*DBG_NOTICE(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); GWEN_DB_Dump(dbParams, stderr, 2);*/ s=GWEN_DB_GetCharValue(dbParams, "IbanAllowed", 0, "N"); AB_JobEuTransfer_SetIbanAllowed(bj, strcasecmp(s, "J")==0); dbT=GWEN_DB_FindFirstGroup(dbParams, "country"); if (dbT) { AB_EUTRANSFER_INFO_LIST *eil; eil=AB_EuTransferInfo_List_new(); while(dbT) { i=GWEN_DB_GetIntValue(dbT, "code", 0, 0); if (i) { const AB_COUNTRY *cnt; AB_BANKING *ab; ab=AB_Account_GetBanking(AB_Job_GetAccount(bj)); assert(ab); cnt=AB_Banking_FindCountryByNumeric(ab, i); if (cnt) { AB_EUTRANSFER_INFO *ei; const char *v, *cur; AB_TRANSACTION_LIMITS *lim; ei=AB_EuTransferInfo_new(); lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetNeedDate(lim, -1); AB_EuTransferInfo_SetCountryCode(ei, AB_Country_GetCode(cnt)); i=GWEN_DB_GetIntValue(dbT, "MaxLenOurName", 0, -1); AB_TransactionLimits_SetMaxLenLocalName(lim, i); i=GWEN_DB_GetIntValue(dbT, "MaxLenOtherName", 0, -1); AB_TransactionLimits_SetMaxLenRemoteName(lim, i); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); i=GWEN_DB_GetIntValue(dbT, "MaxLenPurpose", 0, -1); AB_TransactionLimits_SetMaxLenPurpose(lim, i); AB_TransactionLimits_SetMaxLinesPurpose(lim, 1); v=GWEN_DB_GetCharValue(dbT, "LimitLocalValue", 0, 0); cur=GWEN_DB_GetCharValue(dbT, "LimitLocalCurrency", 0, 0); if (v) { double dv; if (GWEN_Text_StringToDouble(v, &dv)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad value"); } else { AB_VALUE *val; val=AB_Value_fromDouble(dv); assert(val); AB_Value_SetCurrency(val, cur); AB_EuTransferInfo_SetLimitLocalValue(ei, val); AB_Value_free(val); } } v=GWEN_DB_GetCharValue(dbT, "LimitForeignValue", 0, 0); cur=GWEN_DB_GetCharValue(dbT, "LimitforeignCurrency", 0, 0); if (v) { double dv; if (GWEN_Text_StringToDouble(v, &dv)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad value"); } else { AB_VALUE *val; val=AB_Value_fromDouble(dv); assert(val); AB_Value_SetCurrency(val, cur); AB_EuTransferInfo_SetLimitForeignValue(ei, val); AB_Value_free(val); } } /* set limits */ AB_EuTransferInfo_SetFieldLimits(ei, lim); /* add country info */ AB_EuTransferInfo_List_Add(ei, eil); } /* if cnt */ } /* if numeric country code given */ dbT=GWEN_DB_FindNextGroup(dbT, "country"); } /* while dbT */ AB_JobEuTransfer_SetCountryInfoList(bj, eil); } /* if countryInfo in params */ return 0; } case AH_Job_ExchangeModeArgs: { GWEN_DB_NODE *dbArgs; const AB_TRANSACTION *ot; const AB_VALUE *v; dbArgs=AH_Job_GetArguments(j); assert(dbArgs); ot=AB_JobEuTransfer_GetTransaction(bj); if (ot) { GWEN_DB_NODE *dbT; const char *p; const GWEN_STRINGLIST *sl; AB_TRANSACTION *t; const AB_COUNTRY *cy=0; int i; t=AB_Transaction_dup(ot); assert(t); if (AH_Job_EuTransfer__ValidateTransfer(bj, j, t)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_INVALID; } /* get remote country information */ p=AB_Transaction_GetRemoteIban(t); if (p) { char cnt[3]; memmove(cnt, p, 2); cnt[2]=0; cy=AB_Banking_FindCountryByCode(ab, cnt); } else { p=AB_Transaction_GetRemoteCountry(t); if (!p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "remote country code not set"); return GWEN_ERROR_INVALID; } cy=AB_Banking_FindCountryByCode(ab, p); } if (!cy) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No country info available"); return GWEN_ERROR_INVALID; } /* store the validated transaction back into application job, * to allow the application to recognize answers to this job later */ AB_JobEuTransfer_SetTransaction(bj, t); dbT=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "transaction"); assert(dbT); /* store local account */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/country", 280); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/bankCode", AB_Transaction_GetLocalBankCode(t)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/accountId", AB_Transaction_GetLocalAccountNumber(t)); p=AB_Transaction_GetLocalSuffix(t); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourAccount/accountsubid", p); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "ourName", AB_Transaction_GetLocalName(t)); p=AB_Transaction_GetRemoteIban(t); if (p) { /* store IBAN */ GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "iban", p); } else { const char *s; /* store remote account */ if (cy) { GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/country", AB_Country_GetNumericCode(cy)); } s=AB_Transaction_GetRemoteBankCode(t); if (s) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/bankCode", s); s=AB_Transaction_GetRemoteAccountNumber(t); if (s) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherAccount/accountId", s); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Remote account id not set"); return GWEN_ERROR_INVALID; } } p=AB_Transaction_GetRemoteBankName(t); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "otherBankName", p); /* store remote name */ sl=AB_Transaction_GetRemoteName(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); GWEN_DB_DeleteVar(dbT, "otherName"); while(se) { p=GWEN_StringListEntry_Data(se); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT, "otherName", p); se=GWEN_StringListEntry_Next(se); } /* while */ } /* store value */ v=AB_Transaction_GetValue(t); if (v) { GWEN_DB_NODE *dbV; GWEN_BUFFER *nbuf; char *p; const char *s; int l; dbV=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); assert(dbV); nbuf=GWEN_Buffer_new(0, 32, 0, 1); if (GWEN_Text_DoubleToBuffer(AB_Value_GetValueAsDouble(v), nbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Buffer overflow"); GWEN_Buffer_free(nbuf); abort(); } l=GWEN_Buffer_GetUsedBytes(nbuf); if (!l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); abort(); } /* replace "C" comma with "DE" comma, remove thousand's comma */ p=GWEN_Buffer_GetStart(nbuf); s=p; while(*s) { if (*s=='.') { *p=','; p++; } else if (*s!=',') { *p=*s; p++; } s++; } /* while */ *p=0; if (strchr(GWEN_Buffer_GetStart(nbuf), ',')) { /* kill all trailing '0' behind the comma */ p=GWEN_Buffer_GetStart(nbuf)+l; while(l--) { --p; if (*p=='0') *p=0; else break; } } else GWEN_Buffer_AppendString(nbuf, ","); /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); s=AB_Value_GetCurrency(v); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); } /* if value */ /* store purpose */ sl=AB_Transaction_GetPurpose(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); GWEN_DB_DeleteVar(dbT, "purpose"); while(se) { p=GWEN_StringListEntry_Data(se); if (p) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_DEFAULT, "purpose", p); se=GWEN_StringListEntry_Next(se); } /* while */ } /* store "chargeWhom" */ switch (AB_JobEuTransfer_GetChargeWhom(bj)) { case AB_JobEuTransfer_ChargeWhom_Local: i=1; break; case AB_JobEuTransfer_ChargeWhom_Remote: i=3; break; case AB_JobEuTransfer_ChargeWhom_Share: i=2; break; default: i=1; break; } /* switch */ GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "chargeWhom", i); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } return 0; } case AH_Job_ExchangeModeResults: { AH_RESULT_LIST *rl; AH_RESULT *r; int has10; int has20; rl=AH_Job_GetSegResults(j); assert(rl); r=AH_Result_List_First(rl); if (!r) { DBG_INFO(AQHBCI_LOGDOMAIN, "No segment results"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } has10=0; has20=0; while(r) { int rcode; rcode=AH_Result_GetCode(r); DBG_INFO(AQHBCI_LOGDOMAIN, "Found job result: %d", rcode); if (rcode<=19) has10=1; else if (rcode>=20 && rcode <=29) has20=1; r=AH_Result_List_Next(r); } if (has20) { AB_Job_SetStatus(bj, AB_Job_StatusFinished); DBG_INFO(AQHBCI_LOGDOMAIN, "Job finished"); } else if (has10) { AB_Job_SetStatus(bj, AB_Job_StatusPending); DBG_INFO(AQHBCI_LOGDOMAIN, "Job pending"); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Can't determine the status (neither 0010 nor 0020)"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } return 0; } default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedsinglecreate_l.h0000644000175000017500000000126112375175275027630 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITDATEDSINGLECREATE_L_H #define AH_JOBSEPADEBITDATEDSINGLECREATE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaDebitDatedSingleCreate_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPADEBITDATEDSINGLECREATE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingordercreate.xml0000644000175000017500000000472112375175275027242 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgettransactions.xml0000644000175000017500000004146712533042667025554 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version N %code %version %code %version %code %version %code %version %code %version N %code %version %code %version %code %version N %code %version %code %version %code %version %code %version %code %version %code %version N %code %version N aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmodifysto.xml0000644000175000017500000002127512375175275024362 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobcreatedatedxfer.xml0000644000175000017500000000743112375175275025475 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfersingle.xml0000644000175000017500000000270312375175275025357 00000000000000 %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderget_l.h0000644000175000017500000000121312375175275026511 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPASTANDINGORDERGET_L_H #define AH_JOBSEPASTANDINGORDERGET_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaStandingOrderGet_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPASTANDINGORDERGET_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedmulticreate_l.h0000644000175000017500000000125512375175275027504 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITDATEDMULTICREATE_L_H #define AH_JOBSEPADEBITDATEDMULTICREATE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaDebitDatedMultiCreate_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBSEPADEBITDATEDMULTICREATE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedmulticreate.xml0000644000175000017500000000542012530646060027301 00000000000000 %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobloadcellphone_l.h0000644000175000017500000000117512375175275025115 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBLOADCELLPHONE_L_H #define AH_JOBLOADCELLPHONE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_LoadCellPhone_new(AB_USER *u, AB_ACCOUNT *account); #endif /* AH_JOBLOADCELLPHONE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetdatedxfers.xml0000644000175000017500000000752412375175275025177 00000000000000 %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitsingle.c0000644000175000017500000001055312375175275025126 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepadebitsingle_p.h" #include "jobtransferbase_l.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include "provider_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include #include /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaDebitSingle_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; GWEN_DB_NODE *dbArgs; j=AH_Job_TransferBase_new("JobSepaDebitSingle", AB_Transaction_TypeSepaDebitNote, AB_Transaction_SubTypeStandard, u, account); if (!j) return 0; AH_Job_SetChallengeClass(j, 17); /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaDebitSingle_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_SepaDebitSingle_AddChallengeParams); /* overwrite virtual functions of transferBase class */ AH_Job_TransferBase_SetExchangeParamsFn(j, AH_Job_SepaDebitSingle_ExchangeParams); AH_Job_TransferBase_SetExchangeArgsFn(j, AH_Job_TransferBase_ExchangeArgs_SepaUndated); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); return j; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitSingle_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx) { AB_TRANSACTION_LIMITS *lim; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging params"); /* set some default limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 35); AB_TransactionLimits_SetMaxLinesPurpose(lim, 4); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetNeedDate(lim, -1); AB_Job_SetFieldLimits(bj, lim); AB_TransactionLimits_free(lim); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitSingle_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { const AB_TRANSACTION *t; const char *s; int tanVer=AH_JOB_TANVER_1_4; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); t=AH_Job_GetFirstTransfer(j); if (t==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No validated transaction"); return GWEN_ERROR_INVALID; } s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } if (tanVer==AH_JOB_TANVER_1_4) { int rv; DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); rv=AH_HHD14_AddChallengeParams_17(j, AB_Transaction_GetValue(t), AB_Transaction_GetRemoteIban(t)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version %d for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaDebitSingle_Prepare(AH_JOB *j) { GWEN_DB_NODE *profile; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing transfer"); /* find the right profile to produce pain.008 messages */ profile=AH_Job_FindSepaProfile(j, "008*", AH_User_GetSepaDebitNoteProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } /* export transfers to SEPA */ rv=AH_Job_TransferBase_SepaExportTransactions(j, profile); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetbalance.c0000644000175000017500000002033012375175275024043 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetbalance_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_GETBALANCE); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetBalance_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETBALANCE *aj; GWEN_DB_NODE *dbArgs; int useCreditCardJob=0; GWEN_DB_NODE *updgroup; //Check if we should use DKKKS updgroup=AH_User_GetUpd(u); assert(updgroup); updgroup=GWEN_DB_GetGroup(updgroup, GWEN_PATH_FLAGS_NAMEMUSTEXIST, AB_Account_GetAccountNumber(account)); if (updgroup) { GWEN_DB_NODE *n; n=GWEN_DB_GetFirstGroup(updgroup); while(n) { if (strcasecmp(GWEN_DB_GetCharValue(n, "job", 0, ""), "DKKKS")==0) { useCreditCardJob = 1; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ } /* if updgroup for the given account found */ if(useCreditCardJob) j=AH_AccountJob_new("JobGetBalanceCreditCard", u, account); else j=AH_AccountJob_new("JobGetBalance", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETBALANCE, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETBALANCE, j, aj, AH_Job_GetBalance_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_GetBalance_Process); AH_Job_SetExchangeFn(j, AH_Job_GetBalance_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if(useCreditCardJob) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountNumber", AB_Account_GetAccountNumber(account)); else GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_GetBalance_FreeData(void *bp, void *p){ AH_JOB_GETBALANCE *aj; aj=(AH_JOB_GETBALANCE*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ AB_BALANCE *AH_Job_GetBalance__ReadBalance(GWEN_DB_NODE *dbT) { GWEN_BUFFER *buf; GWEN_TIME *t; AB_VALUE *v1, *v2; AB_BALANCE *bal; const char *p; bal=0; /* read date and time */ buf=GWEN_Buffer_new(0, 32, 0, 1); p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) GWEN_Buffer_AppendString(buf, p); else { AH_AccountJob_AddCurrentDate(buf); } p=GWEN_DB_GetCharValue(dbT, "time", 0, 0); if (p) GWEN_Buffer_AppendString(buf, p); else { AH_AccountJob_AddCurrentTime(buf); } t=GWEN_Time_fromString(GWEN_Buffer_GetStart(buf), "YYYYMMDDhhmmss"); if (!t) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing date and time"); } GWEN_Buffer_free(buf); /* read value */ v1=AB_Value_fromDb(dbT); v2=0; if (!v1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing value from DB"); } else { p=GWEN_DB_GetCharValue(dbT, "debitMark", 0, 0); if (p) { if (strcasecmp(p, "D")==0 || strcasecmp(p, "RC")==0) { v2=AB_Value_dup(v1); AB_Value_Negate(v2); } else if (strcasecmp(p, "C")==0 || strcasecmp(p, "RD")==0) v2=AB_Value_dup(v1); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad debit mark \"%s\"", p); v2=0; } } if (v2) bal=AB_Balance_new(v2, t); else bal=0; } AB_Value_free(v2); AB_Value_free(v1); GWEN_Time_free(t); return bal; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetBalance_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETBALANCE *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetBalance"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETBALANCE, j); assert(aj); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "Balance" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbBalance; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbBalance=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/balance"); if (!dbBalance) dbBalance=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/balancecreditcard"); if (dbBalance) { AB_ACCOUNT_STATUS *acst; GWEN_DB_NODE *dbT; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Got a balance"); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbBalance, 2); acst=AB_AccountStatus_new(); /* read booked balance */ dbT=GWEN_DB_GetGroup(dbBalance, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "booked"); if (dbT) { AB_BALANCE *bal; bal=AH_Job_GetBalance__ReadBalance(dbT); if (bal) { AB_AccountStatus_SetBookedBalance(acst, bal); AB_AccountStatus_SetTime(acst, AB_Balance_GetTime(bal)); AB_Balance_free(bal); } } /* read noted balance */ dbT=GWEN_DB_GetGroup(dbBalance, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "noted"); if (dbT) { AB_BALANCE *bal; bal=AH_Job_GetBalance__ReadBalance(dbT); if (bal) { AB_AccountStatus_SetNotedBalance(acst, bal); if (AB_AccountStatus_GetTime(acst)==NULL) AB_AccountStatus_SetTime(acst, AB_Balance_GetTime(bal)); AB_Balance_free(bal); } } /* read credit Line */ dbT=GWEN_DB_GetGroup(dbBalance, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "creditLine"); if (dbT) { AB_VALUE *v; v=AB_Value_fromDb(dbT); if (!v) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing value from DB"); } else { AB_AccountStatus_SetBankLine(acst, v); } AB_Value_free(v); } a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); assert(ai); /* add new account status */ AB_ImExporterAccountInfo_AddAccountStatus(ai, acst); break; /* break loop, we found the balance */ } /* if "Balance" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetBalance_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETBALANCE *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETBALANCE, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeGetBalance) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetBalance job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: DBG_NOTICE(AQHBCI_LOGDOMAIN, "No params to exchange"); return 0; case AH_Job_ExchangeModeArgs: DBG_NOTICE(AQHBCI_LOGDOMAIN, "No arguments to exchange"); return 0; case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmultitransfer_p.h0000644000175000017500000000312612375175275025205 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBMULTITRANSFER_P_H #define AH_JOBMULTITRANSFER_P_H #include "jobmultitransfer_l.h" #include typedef struct AH_JOB_MULTITRANSFER AH_JOB_MULTITRANSFER; struct AH_JOB_MULTITRANSFER { int isTransfer; AB_VALUE *sumRemoteAccountId; AB_VALUE *sumRemoteBankCode; AB_VALUE *sumValues; }; static void GWENHYWFAR_CB AH_Job_MultiTransfer_FreeData(void *bp, void *p); static int AH_Job_MultiTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_MultiTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_MultiTransfer_Prepare(AH_JOB *j); static int AH_Job_MultiTransfer_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_MultiTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t); static AH_JOB *AH_Job_MultiTransferBase_new(AB_USER *u, AB_ACCOUNT *account, int isTransfer); #endif /* AH_JOBMULTITRANSFER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfermulti_p.h0000644000175000017500000000205412375175275025175 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPAXFERMULTI_P_H #define AH_JOBSEPAXFERMULTI_P_H #include "jobsepaxfermulti_l.h" #include #include typedef struct AH_JOB_SEPAXFERMULTI AH_JOB_SEPAXFERMULTI; struct AH_JOB_SEPAXFERMULTI { int sumFieldNeeded; int singleBookingAllowed; AB_VALUE *sumValues; char *localIban; }; static void GWENHYWFAR_CB AH_Job_SepaTransferMulti_FreeData(void *bp, void *p); static int AH_Job_SepaTransferMulti_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_SepaTransferMulti_Prepare(AH_JOB *j); #endif /* AH_JOBSEPAXFERMULTI_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobmultitransfer.c0000644000175000017500000004760712375175275024675 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobmultitransfer_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*#define CHALLENGE_ADD_ONLY_PREKOMMA_VALUES*/ #define AH_MULTI_CHALLENGE_CLASS_HKSUB 12 #define AH_MULTI_CHALLENGE_CLASS_HKSLA 19 GWEN_INHERIT(AH_JOB, AH_JOB_MULTITRANSFER); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_MultiTransfer_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_MultiTransferBase_new(u, account, 1); if (j) AH_Job_SetChallengeClass(j, AH_MULTI_CHALLENGE_CLASS_HKSUB); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_MultiDebitNote_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; j=AH_Job_MultiTransferBase_new(u, account, 0); if (j) AH_Job_SetChallengeClass(j, AH_MULTI_CHALLENGE_CLASS_HKSLA); return j; } /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_MultiTransferBase_new(AB_USER *u, AB_ACCOUNT *account, int isTransfer) { AH_JOB *j; AH_JOB_MULTITRANSFER *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *dbT; GWEN_DB_NODE *dbParams; const char *s; int userMaxTrans; int maxTransfers; j=AH_AccountJob_new(isTransfer?"JobMultiTransfer":"JobMultiDebitNote", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_MULTITRANSFER, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_MULTITRANSFER, j, aj, AH_Job_MultiTransfer_FreeData); aj->isTransfer=isTransfer; aj->sumRemoteAccountId=AB_Value_new(); aj->sumRemoteBankCode=AB_Value_new(); aj->sumValues=AB_Value_new(); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_MultiTransfer_Process); AH_Job_SetExchangeFn(j, AH_Job_MultiTransfer_Exchange); AH_Job_SetPrepareFn(j, AH_Job_MultiTransfer_Prepare); AH_Job_SetAddChallengeParamsFn(j, AH_Job_MultiTransfer_AddChallengeParams); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); dbT=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "transfers"); assert(dbT); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankCode", AB_Account_GetBankCode(account)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountId", AB_Account_GetAccountNumber(account)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", "EUR"); s=AB_Account_GetOwnerName(account); if (s) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", s); else { DBG_WARN(AQHBCI_LOGDOMAIN, "No owner name for account, some banks don't accept this"); } GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", isTransfer?"transfer":"debitNote"); dbParams=AH_Job_GetParams(j); if (isTransfer) userMaxTrans=AH_User_GetMaxTransfersPerJob(u); else userMaxTrans=AH_User_GetMaxDebitNotesPerJob(u); maxTransfers=GWEN_DB_GetIntValue(dbParams, "maxTransfers", 0, 0); if (maxTransfers==0 || maxTransfers>userMaxTrans) AH_Job_SetMaxTransfers(j, userMaxTrans); else AH_Job_SetMaxTransfers(j, maxTransfers); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_MultiTransfer_FreeData(void *bp, void *p){ AH_JOB_MULTITRANSFER *aj; aj=(AH_JOB_MULTITRANSFER*)p; AB_Value_free(aj->sumValues); AB_Value_free(aj->sumRemoteBankCode); AB_Value_free(aj->sumRemoteAccountId); GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_MultiTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_MULTITRANSFER *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_MULTITRANSFER, j); assert(aj); DBG_INFO(AQHBCI_LOGDOMAIN, "Processing %s", (aj->isTransfer)?"JobMultiTransfer":"JobMultiDebitNote"); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_MultiTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t) { const GWEN_STRINGLIST *sl; int maxn; int maxs; int n; const char *s; AH_JOB_MULTITRANSFER *aj; const AB_TRANSACTION_LIMITS *lim; assert(mj); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_MULTITRANSFER, mj); assert(aj); lim=AB_Job_GetFieldLimits(bj); /* check purpose */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesPurpose(lim); maxs=AB_TransactionLimits_GetMaxLenPurpose(lim); } else { maxn=0; maxs=0; } sl=AB_Transaction_GetPurpose(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; const char *p; se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { int l; GWEN_BUFFER *tbuf; n++; if (maxn && n>maxn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many purpose lines (%d>%d)", n, maxn); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); GWEN_Buffer_free(tbuf); if (l>maxs) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many chars in purpose line %d (%d>%d)", n, l, maxs); return GWEN_ERROR_INVALID; } } se=GWEN_StringListEntry_Next(se); } /* while */ } if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No purpose lines"); return GWEN_ERROR_INVALID; } /* check remote name */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesRemoteName(lim); maxs=AB_TransactionLimits_GetMaxLenRemoteName(lim); } else { maxn=0; maxs=0; } sl=AB_Transaction_GetRemoteName(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; const char *p; se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { int l; GWEN_BUFFER *tbuf; n++; if (maxn && n>maxn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many remote name lines (%d>%d)", n, maxn); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); GWEN_Buffer_free(tbuf); if (l>maxs) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many chars in remote name line %d (%d>%d)", n, l, maxs); return GWEN_ERROR_INVALID; } } se=GWEN_StringListEntry_Next(se); } /* while */ } if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote name lines"); return GWEN_ERROR_INVALID; } /* check local name */ s=AB_Transaction_GetLocalName(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local name, filling in"); a=AB_Job_GetAccount(bj); assert(a); s=AB_Account_GetOwnerName(a); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No owner name in account, giving up"); return GWEN_ERROR_INVALID; } AB_Transaction_SetLocalName(t, s); } /* check local bank code */ s=AB_Transaction_GetLocalBankCode(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local bank code, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetBankCode(a); assert(s); AB_Transaction_SetLocalBankCode(t, s); } /* check local account number */ s=AB_Transaction_GetLocalAccountNumber(t); if (!s) { AB_ACCOUNT *a; DBG_WARN(AQHBCI_LOGDOMAIN, "No local account number, filling in"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetAccountNumber(a); assert(s); AB_Transaction_SetLocalAccountNumber(t, s); } /* check local account suffix */ s=AB_Transaction_GetLocalSuffix(t); if (!s) { AB_ACCOUNT *a; DBG_INFO(AQHBCI_LOGDOMAIN, "No local suffix, filling in (if possible)"); a=AH_AccountJob_GetAccount(mj); assert(a); s=AB_Account_GetSubAccountId(a); if (s && *s) AB_Transaction_SetLocalSuffix(t, s); } /* check text key */ if (lim) { if (GWEN_StringList_Count(AB_TransactionLimits_GetValuesTextKey(lim))){ char numbuf[32]; n=AB_Transaction_GetTextKey(t); if (n==0) { if (aj->isTransfer) n=51; /* "Ueberweisung" */ else n=5; /* "Lastschrift" */ AB_Transaction_SetTextKey(t, n); } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesTextKey(lim, numbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Text key \"%s\" not supported by bank", numbuf); return GWEN_ERROR_INVALID; } } } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_MultiTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_MULTITRANSFER *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_MULTITRANSFER, j); assert(aj); if ((aj->isTransfer && AB_Job_GetType(bj)!=AB_Job_TypeTransfer) || (!aj->isTransfer && AB_Job_GetType(bj)!=AB_Job_TypeDebitNote)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a %s job job", (aj->isTransfer)?"MultiTransfer":"MultiDebitNote"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: { GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbTk; AB_TRANSACTION_LIMITS *lim; int i; dbParams=AH_Job_GetParams(j); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Have this parameters to exchange:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbParams, 2); /* read limits */ lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 27); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 2); AB_TransactionLimits_SetNeedDate(lim, -1); i=GWEN_DB_GetIntValue(dbParams, "maxpurposeLines", 0, 0); AB_TransactionLimits_SetMaxLinesPurpose(lim, i); /* read text keys */ dbTk=GWEN_DB_GetGroup(dbParams, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "textkey"); if (dbTk) { for (i=0; ; i++) { int k; char numbuf[16]; k=GWEN_DB_GetIntValue(dbTk, "key", i, -1); if (k==-1) break; snprintf(numbuf, sizeof(numbuf), "%d", k); AB_TransactionLimits_AddValuesTextKey(lim, numbuf, 1); } GWEN_StringList_Sort(AB_TransactionLimits_GetValuesTextKey(lim), 1, GWEN_StringList_SortModeInt); } AB_Job_SetFieldLimits(bj, lim); return 0; } case AH_Job_ExchangeModeArgs: { GWEN_DB_NODE *dbArgs; const AB_TRANSACTION *ot; char groupIdBuf[10]; groupIdBuf[0]=0; dbArgs=AH_Job_GetArguments(j); assert(dbArgs); ot=AB_Job_GetTransaction(bj); if (ot) { GWEN_DB_NODE *dbT; AB_TRANSACTION *t; t=AB_Transaction_dup(ot); assert(t); if (AH_Job_MultiTransfer__ValidateTransfer(bj, j, t)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_INVALID; } AB_Transaction_SetGroupId(t, AH_Job_GetId(j)); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Setting groupID to %d", AH_Job_GetId(j)); if (groupIdBuf[0]==0) { snprintf(groupIdBuf, sizeof(groupIdBuf)-1, "%08d", AH_Job_GetId(j)); groupIdBuf[sizeof(groupIdBuf)-1]=0; } /* store the validated transaction back into application job, * to allow the application to recognize answers to this job later */ AB_Job_SetTransaction(bj, t); dbT=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "transfers"); assert(dbT); /* store customer reference */ GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "custref", groupIdBuf); dbT=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_DEFAULT, "transactions"); assert(dbT); if (aj->isTransfer) dbT=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_CREATE_GROUP, "transfer"); else dbT=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_CREATE_GROUP, "debitNote"); assert(dbT); /* store transaction */ if (AB_Transaction_toDb(t, dbT)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error storing transaction to db"); AB_Transaction_free(t); return GWEN_ERROR_BAD_DATA; } else { const char *s; char tbuf[11]; AB_VALUE *tv; /* sum up account ids */ s=AB_Transaction_GetRemoteAccountNumber(t); assert(s); tbuf[0]=0; strncat(tbuf, s, 10); tv=AB_Value_fromString(tbuf); assert(tv); AB_Value_AddValue(aj->sumRemoteAccountId, tv); AB_Value_free(tv); /* sum up bank codes */ s=AB_Transaction_GetRemoteBankCode(t); assert(s); tbuf[0]=0; strncat(tbuf, s, 10); tv=AB_Value_fromString(tbuf); assert(tv); AB_Value_AddValue(aj->sumRemoteBankCode, tv); AB_Value_free(tv); #ifdef CHALLENGE_ADD_ONLY_PREKOMMA_VALUES if (1) { GWEN_BUFFER *tbuf; char *p; AB_VALUE *tv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHumanReadableString2(AB_Transaction_GetValue(t), tbuf, 0, 0); p=strchr(GWEN_Buffer_GetStart(tbuf), ','); if (p) *p=0; tv=AB_Value_fromString(GWEN_Buffer_GetStart(tbuf)); assert(tv); AB_Value_AddValue(aj->sumValues, tv); AB_Value_free(tv); GWEN_Buffer_free(tbuf); } #else AB_Value_AddValue(aj->sumValues, AB_Transaction_GetValue(t)); #endif } AB_Transaction_free(t); AH_Job_IncTransferCount(j); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No transaction"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } return 0; } case AH_Job_ExchangeModeResults: { AH_RESULT_LIST *rl; AH_RESULT *r; int has10; int has20; AB_TRANSACTION_STATUS tStatus; rl=AH_Job_GetSegResults(j); assert(rl); r=AH_Result_List_First(rl); if (!r) { DBG_INFO(AQHBCI_LOGDOMAIN, "No segment results"); AB_Job_SetStatus(bj, AB_Job_StatusError); return GWEN_ERROR_NO_DATA; } has10=0; has20=0; while(r) { int rcode; rcode=AH_Result_GetCode(r); DBG_INFO(AQHBCI_LOGDOMAIN, "Found job result: %d", rcode); if (rcode<=19) has10=1; else if (rcode>=20 && rcode <=29) has20=1; r=AH_Result_List_Next(r); } if (has20) { AB_Job_SetStatus(bj, AB_Job_StatusFinished); DBG_INFO(AQHBCI_LOGDOMAIN, "Job finished"); } else if (has10) { AB_Job_SetStatus(bj, AB_Job_StatusPending); DBG_INFO(AQHBCI_LOGDOMAIN, "Job pending"); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Error status (neither 0010 nor 0020)"); AB_Job_SetStatus(bj, AB_Job_StatusError); } if (has20) tStatus=AB_Transaction_StatusAccepted; else if (has10) tStatus=AB_Transaction_StatusPending; else tStatus=AB_Transaction_StatusRejected; if (aj->isTransfer) { const AB_TRANSACTION *ot; ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_Transaction_SetType(t, AB_Transaction_TypeTransfer); AB_ImExporterContext_AddTransfer(ctx, t); } } else { const AB_TRANSACTION *ot; ot=AB_Job_GetTransaction(bj); if (ot) { AB_TRANSACTION *t; t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_Transaction_SetType(t, AB_Transaction_TypeDebitNote); AB_ImExporterContext_AddTransfer(ctx, t); } } return 0; } default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode %d", m); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } int AH_Job_MultiTransfer_Prepare(AH_JOB *j){ #if 0 /* this code should no longer be needed since we use * AH_Job_MultiTransfer_AddChallengeParams now */ AH_JOB_MULTITRANSFER *aj; GWEN_BUFFER *tbuf; char *p; DBG_ERROR(AQHBCI_LOGDOMAIN, "Prepare function called"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_MULTITRANSFER, j); assert(aj); tbuf=GWEN_Buffer_new(0, 32, 0, 1); /* set challenge parameter */ /* add sum of account numbers */ AB_Value_toHumanReadableString2(aj->sumRemoteAccountId, tbuf, 0, 0); p=strchr(GWEN_Buffer_GetStart(tbuf), '.'); if (p) *p=0; AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* add sum of bank codes */ AB_Value_toHumanReadableString2(aj->sumRemoteBankCode, tbuf, 0, 0); p=strchr(GWEN_Buffer_GetStart(tbuf), '.'); if (p) *p=0; AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); if (aj->sumValues) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Setting value"); } AH_Job_SetChallengeValue(j, aj->sumValues); #endif return 0; } int AH_Job_MultiTransfer_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { AH_JOB_MULTITRANSFER *aj; const char *s; int tanVer=AH_JOB_TANVER_1_4; char *p; AB_ACCOUNT *acc=NULL; DBG_ERROR(AQHBCI_LOGDOMAIN, "AddChallengeParams function called"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_MULTITRANSFER, j); assert(aj); s=GWEN_DB_GetCharValue(dbMethod, "zkaTanVersion", 0, NULL); if (s && *s && strncasecmp(s, "1.3", 3)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.3 (%s)", s); tanVer=AH_JOB_TANVER_1_3; } /* set challenge parameter */ if (tanVer==AH_JOB_TANVER_1_4) { GWEN_BUFFER *tbuf; char numbuf[16]; DBG_ERROR(AQHBCI_LOGDOMAIN, "TAN version is 1.4.x"); tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (aj->isTransfer) AH_Job_SetChallengeClass(j, 12); else AH_Job_SetChallengeClass(j, 19); /* P1: number of transfers */ snprintf(numbuf, sizeof(numbuf)-1, "%d", AH_Job_GetTransferCount(j)); numbuf[sizeof(numbuf)-1]=0; AH_Job_AddChallengeParam(j, numbuf); /* P2: sum of amount */ AH_Job_ValueToChallengeString(aj->sumValues, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* P3: local account number */ acc=AH_AccountJob_GetAccount(j); assert(acc); s=AB_Account_GetAccountNumber(acc); if (s && *s) { int i; GWEN_Buffer_AppendString(tbuf, s); i=10-strlen(s); if (i>0) { /* need to left-fill the account number with leading zeroes * to a length of exactly 10 digits */ GWEN_Buffer_Rewind(tbuf); GWEN_Buffer_FillLeftWithBytes(tbuf, '0', i); } AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No account number"); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } /* add sum of account numbers */ AB_Value_toHumanReadableString2(aj->sumRemoteAccountId, tbuf, 0, 0); p=strchr(GWEN_Buffer_GetStart(tbuf), '.'); if (p) *p=0; /* only use first 10 digits */ GWEN_Buffer_Crop(tbuf, 0, 10); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* done */ GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unhandled tan version 0x%02x for now", tanVer); return GWEN_ERROR_INTERNAL; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobinternaltransfer.xml0000644000175000017500000000257312375175275025726 00000000000000 %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedmulticreate_p.h0000644000175000017500000000250212375175275027504 00000000000000/*************************************************************************** begin : Tue Dec 31 2013 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPADEBITDATEDMULTICREATE_P_H #define AH_JOBSEPADEBITDATEDMULTICREATE_P_H #include "jobsepadebitdatedmulticreate_l.h" #include #include typedef struct AH_JOB_CREATESEPAMULTIDEBIT AH_JOB_CREATESEPAMULTIDEBIT; struct AH_JOB_CREATESEPAMULTIDEBIT { char *fiid; int sumFieldNeeded; int singleBookingAllowed; AB_VALUE *sumValues; char *localIban; }; static void GWENHYWFAR_CB AH_Job_SepaDebitDatedMultiCreate_FreeData(void *bp, void *p); static int AH_Job_SepaDebitDatedMultiCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SepaDebitDatedMultiCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); static int AH_Job_SepaDebitDatedMultiCreate_Prepare(AH_JOB *j); #endif /* AH_JOBSEPADEBITDATEDMULTICREATE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetdatedxfers_p.h0000644000175000017500000000214412375175275025136 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBGETDATEDTRANSFERS_P_H #define AH_JOBGETDATEDTRANSFERS_P_H #include "jobgetdatedxfers_l.h" #include typedef struct AH_JOB_GETDATEDTRANSFERS AH_JOB_GETDATEDTRANSFERS; struct AH_JOB_GETDATEDTRANSFERS { int dummy; }; static void GWENHYWFAR_CB AH_Job_GetDatedTransfers_FreeData(void *bp, void *p); static int AH_Job_GetDatedTransfers_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetDatedTransfers_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_JOBGETDATEDTRANSFERS_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/accountjob_p.h0000644000175000017500000000143712375175275023745 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ACCOUNTJOBS_P_H #define AH_ACCOUNTJOBS_P_H #include "accountjob_l.h" typedef struct AH_ACCOUNTJOB AH_ACCOUNTJOB; struct AH_ACCOUNTJOB { AB_ACCOUNT *account; }; static void GWENHYWFAR_CB AH_AccountJob_FreeData(void *bp, void *p); #endif /* AH_ACCOUNTJOBS_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingordercreate_l.h0000644000175000017500000000200312634042421027153 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSEPASTANDINGORDERCREATE_L_H #define AH_JOBSEPASTANDINGORDERCREATE_L_H #include "accountjob_l.h" AH_JOB *AH_Job_SepaStandingOrderCreate_new(AB_USER *u, AB_ACCOUNT *account); int AH_Job_SepaStandingOrderCreate_ExchangeParams(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_SepaStandingOrderCreate_ExchangeArgs(AH_JOB *j, AB_JOB *bj, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_SepaStandingOrderCreate_Prepare(AH_JOB *j); int AH_Job_SepaStandingOrderCreate_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); #endif /* AH_JOBSEPASTANDINGORDERCREATE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobsingletransfer_p.h0000644000175000017500000000305712375175275025337 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBSINGLETRANSFER_P_H #define AH_JOBSINGLETRANSFER_P_H #include "jobsingletransfer_l.h" #include typedef struct AH_JOB_SINGLETRANSFER AH_JOB_SINGLETRANSFER; struct AH_JOB_SINGLETRANSFER { AB_JOB_TYPE jobType; char *fiid; char *oldFiid; AB_TRANSACTION *validatedTransaction; }; static void GWENHYWFAR_CB AH_Job_SingleTransfer_FreeData(void *bp, void *p); static int AH_Job_SingleTransfer_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SingleTransfer_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_SingleTransfer__ValidateTransfer(AB_JOB *bj, AH_JOB *mj, AB_TRANSACTION *t); static AH_JOB *AH_Job_SingleTransferBase_new(AB_USER *u, AB_ACCOUNT *account, AB_JOB_TYPE jobType); static int AH_Job_SingleTransfer_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); #endif /* AH_JOBSINGLETRANSFER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/ajobs/jobgetstandingorders.c0000644000175000017500000002255712375175275025521 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetstandingorders_p.h" #include "aqhbci_l.h" #include "accountjob_l.h" #include "job_l.h" #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AH_JOB, AH_JOB_GETSTANDINGORDERS); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetStandingOrders_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETSTANDINGORDERS *aj; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobGetStandingOrders", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETSTANDINGORDERS, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETSTANDINGORDERS, j, aj, AH_Job_GetStandingOrders_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_GetStandingOrders_Process); AH_Job_SetExchangeFn(j, AH_Job_GetStandingOrders_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB AH_Job_GetStandingOrders_FreeData(void *bp, void *p){ AH_JOB_GETSTANDINGORDERS *aj; aj=(AH_JOB_GETSTANDINGORDERS*)p; GWEN_FREE_OBJECT(aj); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetStandingOrders_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETSTANDINGORDERS *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; int rv; int i; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetStandingOrders"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSTANDINGORDERS, j); assert(aj); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); assert(ai); /* search for "StandingOrder" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/GetStandingOrdersResponse"); if (dbXA) { GWEN_DB_NODE *dbT; AB_TRANSACTION *t; const char *s; dbXA=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "standingOrder"); assert(dbXA); /* create transaction: raw */ t=AB_Transaction_fromDb(dbXA); assert(t); /* now work out some of the fields */ /* date */ s=GWEN_DB_GetCharValue(dbXA, "xDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); GWEN_Buffer_free(dbuf); } /* firstExecutionDate */ s=GWEN_DB_GetCharValue(dbXA, "special/xfirstExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); AB_Transaction_SetFirstExecutionDate(t, ti); GWEN_Time_free(ti); GWEN_Buffer_free(dbuf); } /* lastExecutionDate */ s=GWEN_DB_GetCharValue(dbXA, "special/xlastExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); AB_Transaction_SetLastExecutionDate(t, ti); GWEN_Time_free(ti); GWEN_Buffer_free(dbuf); } /* nextExecutionDate */ s=GWEN_DB_GetCharValue(dbXA, "xnextExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; GWEN_TIME *ti; dbuf=GWEN_Buffer_new(0, 16, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); AB_Transaction_SetNextExecutionDate(t, ti); GWEN_Time_free(ti); GWEN_Buffer_free(dbuf); } /* period */ s=GWEN_DB_GetCharValue(dbXA, "special/xperiod", 0, 0); if (s && *s) { if (strcasecmp(s, "W")==0) AB_Transaction_SetPeriod(t, AB_Transaction_PeriodWeekly); else if (strcasecmp(s, "M")==0) AB_Transaction_SetPeriod(t, AB_Transaction_PeriodMonthly); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown period \"%s\"", s); abort(); } } /* cycle */ i=GWEN_DB_GetIntValue(dbXA, "special/cycle", 0, 0); AB_Transaction_SetCycle(t, i); /* execution day */ i=GWEN_DB_GetIntValue(dbXA, "special/executionDay", 0, 0); AB_Transaction_SetExecutionDay(t, i); /* local account */ dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "ouraccount"); if (dbT) { const AB_COUNTRY *cn; cn=AB_Banking_FindCountryByNumeric(AH_Job_GetBankingApi(j), GWEN_DB_GetIntValue(dbT, "country", 0, 280)); assert(cn); AB_Transaction_SetLocalCountry(t, AB_Country_GetCode(cn)); s=GWEN_DB_GetCharValue(dbT, "bankCode", 0, 0); if (s && *s) AB_Transaction_SetLocalBankCode(t, s); s=GWEN_DB_GetCharValue(dbT, "accountId", 0, 0); if (s && *s) AB_Transaction_SetLocalAccountNumber(t, s); s=GWEN_DB_GetCharValue(dbT, "accountSubId", 0, 0); if (s && *s) AB_Transaction_SetLocalSuffix(t, s); } /* remote account */ dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "otheraccount"); if (dbT) { const AB_COUNTRY *cn; cn=AB_Banking_FindCountryByNumeric(AH_Job_GetBankingApi(j), GWEN_DB_GetIntValue(dbT, "country", 0, 280)); assert(cn); AB_Transaction_SetRemoteCountry(t, AB_Country_GetCode(cn)); s=GWEN_DB_GetCharValue(dbT, "bankCode", 0, 0); if (s && *s) AB_Transaction_SetRemoteBankCode(t, s); s=GWEN_DB_GetCharValue(dbT, "accountId", 0, 0); if (s && *s) AB_Transaction_SetRemoteAccountNumber(t, s); s=GWEN_DB_GetCharValue(dbT, "accountSubId", 0, 0); if (s && *s) AB_Transaction_SetRemoteSuffix(t, s); } /* remote name */ AB_Transaction_ClearRemoteName(t); for (i=0; ; i++) { s=GWEN_DB_GetCharValue(dbXA, "otherName", i, 0); if (s) { if (*s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 27, 0, 1); AB_ImExporter_DtaToUtf8(s, strlen(s), dbuf); AB_Transaction_AddRemoteName(t, GWEN_Buffer_GetStart(dbuf), 1); GWEN_Buffer_free(dbuf); } } else break; } /* purpose name */ AB_Transaction_ClearPurpose(t); for (i=0; ; i++) { s=GWEN_DB_GetCharValue(dbXA, "purpose", i, 0); if (s) { if (*s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 27, 0, 1); AB_ImExporter_DtaToUtf8(s, strlen(s), dbuf); AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(dbuf), 0); GWEN_Buffer_free(dbuf); } } else break; } /* add to list */ AB_ImExporterAccountInfo_AddStandingOrder(ai, t); } /* if "standingOrder" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetStandingOrders_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETSTANDINGORDERS *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSTANDINGORDERS, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeGetStandingOrders) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetStandingOrders job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: return 0; case AH_Job_ExchangeModeArgs: return 0; case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/aqhbci_l.h0000644000175000017500000000136712364015477021740 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_AQHBCI_L_H #define AQHBCI_AQHBCI_L_H #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg #endif /* AQHBCI_AQHBCI_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dummy.c0000644000175000017500000000000012364015477021303 00000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/0000755000175000017500000000000012643540656021707 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/jobqueue_p.h0000644000175000017500000000215612364015477024140 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBQUEUE_P_H #define AH_JOBQUEUE_P_H #include "jobqueue_l.h" #include "job_l.h" #include struct AH_JOBQUEUE { GWEN_LIST_ELEMENT(AH_JOBQUEUE); AB_USER *user; GWEN_STRINGLIST *signers; uint32_t usage; AH_JOB_LIST *jobs; uint32_t msgNum; uint32_t flags; int secProfile; int secClass; char *usedTan; char *usedPin; }; static void AH_JobQueue_SetUsedTan(AH_JOBQUEUE *jq, const char *s); static void AH_JobQueue_SetUsedPin(AH_JOBQUEUE *jq, const char *s); static int AH_JobQueue__CheckTans(AH_JOBQUEUE *jq, uint32_t guiid); #endif /* AH_JOBQUEUE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/job_p.h0000644000175000017500000000376612364015477023103 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOB_P_H #define AH_JOB_P_H #include "job_l.h" #include #include struct AH_JOB { GWEN_LIST_ELEMENT(AH_JOB); GWEN_INHERIT_ELEMENT(AH_JOB); char *name; char *code; char *accountId; char *description; char *responseName; int segmentVersion; int challengeClass; char *expectedSigner; char *expectedCrypter; char *usedTan; AB_USER *user; unsigned int msgNum; char *dialogId; uint32_t firstSegment; uint32_t lastSegment; GWEN_STRINGLIST *signers; GWEN_STRINGLIST *sepaDescriptors; GWEN_XMLNODE *xmlNode; GWEN_XMLNODE *msgNode; GWEN_DB_NODE *jobParams; GWEN_DB_NODE *jobArguments; GWEN_DB_NODE *jobResponses; GWEN_DB_NODE *sepaProfile; AH_JOB_STATUS status; uint32_t flags; int minSigs; int secProfile; int secClass; int jobsPerMsg; GWEN_MSGENGINE *msgEngine; uint32_t usage; AH_JOB_PROCESS_FN processFn; AH_JOB_COMMIT_FN commitFn; AH_JOB_PREPARE_FN prepareFn; AH_JOB_EXCHANGE_FN exchangeFn; AH_JOB_NEXTMSG_FN nextMsgFn; AH_JOB_ADDCHALLENGEPARAMS_FN addChallengeParamsFn; AH_RESULT_LIST *segResults; AH_RESULT_LIST *msgResults; uint32_t id; AB_MESSAGE_LIST *messages; GWEN_STRINGLIST *log; GWEN_STRINGLIST *challengeParams; AB_VALUE *challengeValue; int maxTransfers; int transferCount; AB_TRANSACTION_LIST *transferList; }; static void AH_Job_SampleResults(AH_JOB *j); static AH_JOB *AH_Job__freeAll_cb(AH_JOB *j, void *userData); static int AH_Job__CommitSystemData(AH_JOB *j, int doLock); #endif /* AH_JOB_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/job_l.h0000644000175000017500000002354312364015477023072 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOB_L_H #define AH_JOB_L_H typedef struct AH_JOB AH_JOB; #define AH_JOB_FLAGS_IGNORE_ERROR 0x00001000 #define AH_JOB_FLAGS_NOITAN 0x00002000 #define AH_JOB_FLAGS_TANUSED 0x00004000 #define AH_JOB_FLAGS_NOSYSID 0x00008000 #define AH_JOB_FLAGS_NEEDCRYPT 0x00010000 #define AH_JOB_FLAGS_NEEDSIGN 0x00020000 #define AH_JOB_FLAGS_ATTACHABLE 0x00040000 #define AH_JOB_FLAGS_SINGLE 0x00080000 #define AH_JOB_FLAGS_DLGJOB 0x00100000 #define AH_JOB_FLAGS_CRYPT 0x00200000 #define AH_JOB_FLAGS_SIGN 0x00400000 #define AH_JOB_FLAGS_MULTIMSG 0x00800000 #define AH_JOB_FLAGS_HASATTACHPOINT 0x01000000 #define AH_JOB_FLAGS_HASMOREMSGS 0x02000000 #define AH_JOB_FLAGS_HASWARNINGS 0x04000000 #define AH_JOB_FLAGS_HASERRORS 0x08000000 #define AH_JOB_FLAGS_PROCESSED 0x10000000 #define AH_JOB_FLAGS_COMMITTED 0x20000000 #define AH_JOB_FLAGS_NEEDTAN 0x40000000 #define AH_JOB_FLAGS_OUTBOX 0x80000000 #define AH_JOB_TANVER_1_4 0x14 #define AH_JOB_TANVER_1_3 0x13 #include #include #include GWEN_LIST_FUNCTION_DEFS(AH_JOB, AH_Job); GWEN_INHERIT_FUNCTION_DEFS(AH_JOB); GWEN_LIST2_FUNCTION_DEFS(AH_JOB, AH_Job); void AH_Job_List2_FreeAll(AH_JOB_LIST2 *jl); #include "hbci_l.h" #include "result_l.h" #include #include #include #include #include typedef enum { AH_JobStatusUnknown=0, AH_JobStatusToDo, AH_JobStatusEnqueued, AH_JobStatusEncoded, AH_JobStatusSent, AH_JobStatusAnswered, AH_JobStatusError, AH_JobStatusAll=255 } AH_JOB_STATUS; typedef enum { AH_Job_ExchangeModeParams=0, AH_Job_ExchangeModeArgs, AH_Job_ExchangeModeResults } AH_JOB_EXCHANGE_MODE; /** @name Prototypes For Virtual Functions * */ /*@{*/ typedef int (*AH_JOB_PROCESS_FN)(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); typedef int (*AH_JOB_COMMIT_FN)(AH_JOB *j, int doLock); typedef int (*AH_JOB_EXCHANGE_FN)(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); typedef int (*AH_JOB_PREPARE_FN)(AH_JOB *j); typedef int (*AH_JOB_ADDCHALLENGEPARAMS_FN)(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); /** * This function is called on multi-message jobs and should return: *

    *
  • 0 if it is sure that no message is to follow
  • *
  • 1 if there might be more message (will be checked by AqHBCI)
  • *
  • any other value (indicating an error)
  • *
*/ typedef int (*AH_JOB_NEXTMSG_FN)(AH_JOB *j); /*@}*/ /** @name Constructors, Destructors * */ /*@{*/ AH_JOB *AH_Job_new(const char *name, AB_USER *u, const char *accountId, int jobVersion); void AH_Job_free(AH_JOB *j); void AH_Job_Attach(AH_JOB *j); /*@}*/ /** @name Informational Functions * */ /*@{*/ const char *AH_Job_GetName(const AH_JOB *j); const char *AH_Job_GetAccountId(const AH_JOB *j); const char *AH_Job_GetDescription(const AH_JOB *j); const char *AH_Job_GetCode(const AH_JOB *j); const char *AH_Job_GetResponseName(const AH_JOB *j); int AH_Job_GetMinSignatures(const AH_JOB *j); int AH_Job_GetSecurityProfile(const AH_JOB *j); int AH_Job_GetSecurityClass(const AH_JOB *j); int AH_Job_GetJobsPerMsg(const AH_JOB *j); int AH_Job_GetChallengeClass(const AH_JOB *j); void AH_Job_SetChallengeClass(AH_JOB *j, int i); AB_USER *AH_Job_GetUser(const AH_JOB *j); GWEN_DB_NODE *AH_Job_GetParams(const AH_JOB *j); GWEN_DB_NODE *AH_Job_GetArguments(const AH_JOB *j); GWEN_DB_NODE *AH_Job_GetResponses(const AH_JOB *j); unsigned int AH_Job_GetMsgNum(const AH_JOB *j); const char *AH_Job_GetDialogId(const AH_JOB *j); AH_JOB_STATUS AH_Job_GetStatus(const AH_JOB *j); const char *AH_Job_StatusName(AH_JOB_STATUS st); void AH_Job_AddSigner(AH_JOB *j, const char *s); int AH_Job_HasWarnings(const AH_JOB *j); int AH_Job_HasErrors(const AH_JOB *j); AH_RESULT_LIST *AH_Job_GetSegResults(const AH_JOB *j); AH_RESULT_LIST *AH_Job_GetMsgResults(const AH_JOB *j); AB_MESSAGE_LIST *AH_Job_GetMessages(const AH_JOB *j); /*@}*/ /** @name Virtual Functions * */ /*@{*/ int AH_Job_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); int AH_Job_Commit(AH_JOB *j, int doLock); /** exchanges data between the HBCI job and the banking job */ int AH_Job_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); /** * Check whether the results for this job contain warning 3920. In this * case the result must be commited. * @return 0 if there is no such result, !=0 otherwise */ int AH_Job_HasItanResult(AH_JOB *j); /** * You can use this from the Commit function of the inheriting class to * additionally let the job do some basic stuff (like saving UPD, BPD, * messages etc). */ int AH_Job_CommitSystemData(AH_JOB *j, int doLock); /** * You can use this from the Process function of the inheriting class to * additionally let the job do some basic stuff (like catching UPD, BPD, * messages etc). */ int AH_Job_DefaultProcessHandler(AH_JOB *j); /** * You can use this from the Commit function of the inheriting class. * It calls @ref AH_Job_CommitSystemData. */ int AH_Job_DefaultCommitHandler(AH_JOB *j, int doLock); int AH_Job_Prepare(AH_JOB *j); /** * This function lets the job add its challenge parameters itself. * Unfortunately this is needed, because the ZKA decided to make FinTS * even more complicated than it already is :-/ * For some HKTAN versions the list of parameters differs from others. */ int AH_Job_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod); /*@}*/ /** @name Setters For Virtual Functions * */ /*@{*/ void AH_Job_SetProcessFn(AH_JOB *j, AH_JOB_PROCESS_FN f); void AH_Job_SetCommitFn(AH_JOB *j, AH_JOB_COMMIT_FN f); void AH_Job_SetExchangeFn(AH_JOB *j, AH_JOB_EXCHANGE_FN f); void AH_Job_SetNextMsgFn(AH_JOB *j, AH_JOB_NEXTMSG_FN f); void AH_Job_SetPrepareFn(AH_JOB *j, AH_JOB_PREPARE_FN f); void AH_Job_SetAddChallengeParamsFn(AH_JOB *j, AH_JOB_ADDCHALLENGEPARAMS_FN f); /*@}*/ void AH_Job_Dump(const AH_JOB *j, FILE *f, unsigned int insert); const GWEN_STRINGLIST *AH_Job_GetLogs(const AH_JOB *j); uint32_t AH_Job_GetFirstSegment(const AH_JOB *j); void AH_Job_SetFirstSegment(AH_JOB *j, uint32_t i); uint32_t AH_Job_GetLastSegment(const AH_JOB *j); void AH_Job_SetLastSegment(AH_JOB *j, uint32_t i); int AH_Job_HasSegment(const AH_JOB *j, int seg); /** * Takes over ownership of the given group. */ void AH_Job_AddResponse(AH_JOB *j, GWEN_DB_NODE *db); void AH_Job_SetStatus(AH_JOB *j, AH_JOB_STATUS st); GWEN_XMLNODE *AH_Job_GetXmlNode(const AH_JOB *j); const GWEN_STRINGLIST *AH_Job_GetSigners(const AH_JOB *j); int AH_Job_PrepareNextMessage(AH_JOB *j); void AH_Job_SetMsgNum(AH_JOB *j, unsigned int i); void AH_Job_SetDialogId(AH_JOB *j, const char *s); uint32_t AH_Job_GetFlags(const AH_JOB *j); void AH_Job_SetFlags(AH_JOB *j, uint32_t f); void AH_Job_AddFlags(AH_JOB *j, uint32_t f); void AH_Job_SubFlags(AH_JOB *j, uint32_t f); uint32_t AH_Job_GetId(const AH_JOB *j); void AH_Job_SetId(AH_JOB *j, uint32_t i); AH_HBCI *AH_Job_GetHbci(const AH_JOB *j); AB_BANKING *AH_Job_GetBankingApi(const AH_JOB *j); const char *AH_Job_GetExpectedSigner(const AH_JOB *j); void AH_Job_SetExpectedSigner(AH_JOB *j, const char *s); const char *AH_Job_GetExpectedCrypter(const AH_JOB *j); void AH_Job_SetExpectedCrypter(AH_JOB *j, const char *s); int AH_Job_CheckEncryption(AH_JOB *j, GWEN_DB_NODE *dbRsp); int AH_Job_CheckSignature(AH_JOB *j, GWEN_DB_NODE *dbRsp); const char *AH_Job_GetUsedTan(const AH_JOB *j); void AH_Job_SetUsedTan(AH_JOB *j, const char *s); void AH_Job_Log(AH_JOB *j, GWEN_LOGGER_LEVEL ll, const char *txt); GWEN_STRINGLIST *AH_Job_GetChallengeParams(const AH_JOB *j); void AH_Job_AddChallengeParam(AH_JOB *j, const char *s); void AH_Job_ClearChallengeParams(AH_JOB *j); const AB_VALUE *AH_Job_GetChallengeValue(const AH_JOB *j); void AH_Job_SetChallengeValue(AH_JOB *j, const AB_VALUE *v); int AH_Job_GetChallengeClass(const AH_JOB *j); void AH_Job_SetChallengeClass(AH_JOB *j, int i); void AH_Job_ValueToChallengeString(const AB_VALUE *v, GWEN_BUFFER *buf); /** * This function adds all BPD groups of the job with the given name and for * which XML descriptions are available. So basically, the user can choose * a job version from the returned list. */ int AH_Job_SampleBpdVersions(const char *name, AB_USER *u, GWEN_DB_NODE *dbResult); int AH_Job_GetMaxVersionUpUntil(const char *name, AB_USER *u, int maxVersion); int AH_Job_GetSegmentVersion(const AH_JOB *j); int AH_Job_GetTransferCount(AH_JOB *j); void AH_Job_IncTransferCount(AH_JOB *j); int AH_Job_GetMaxTransfers(AH_JOB *j); void AH_Job_SetMaxTransfers(AH_JOB *j, int i); AB_TRANSACTION_LIST *AH_Job_GetTransferList(const AH_JOB *j); void AH_Job_AddTransfer(AH_JOB *j, AB_TRANSACTION *t); AB_TRANSACTION *AH_Job_GetFirstTransfer(const AH_JOB *j); /** * Finds a profile of the SEPA ImExporter whose type option matches * the pattern provided in the tmpl parameter. The pattern "001", for * instance, will choose a profile suitable for credit transfer jobs. * Specifying the NULL pointer for tmpl will return the profile * selected during an earlier call to this function for the same job. */ GWEN_DB_NODE *AH_Job_FindSepaProfile(AH_JOB *j, const char *type, const char *name); #endif /* AH_JOB_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c0000644000175000017500000010020512364015477023606 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobqueue_p.h" #include "aqhbci_l.h" #include "job_l.h" #include "user_l.h" #include "message_l.h" #include "hbci_l.h" #include "dialog_l.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_JOBQUEUE, AH_JobQueue); AH_JOBQUEUE *AH_JobQueue_new(AB_USER *u){ AH_JOBQUEUE *jq; assert(u); GWEN_NEW_OBJECT(AH_JOBQUEUE, jq); GWEN_LIST_INIT(AH_JOBQUEUE, jq); jq->user=u; jq->signers=GWEN_StringList_new(); jq->jobs=AH_Job_List_new(); jq->usage=1; return jq; } void AH_JobQueue_free(AH_JOBQUEUE *jq){ if (jq) { assert(jq->usage); if (--(jq->usage)==0) { GWEN_StringList_free(jq->signers); AH_Job_List_free(jq->jobs); free(jq->usedTan); free(jq->usedPin); GWEN_LIST_FINI(AH_JOBQUEUE, jq); GWEN_FREE_OBJECT(jq); } } } void AH_JobQueue_Attach(AH_JOBQUEUE *jq){ assert(jq); jq->usage++; } AH_JOBQUEUE *AH_JobQueue_fromQueue(AH_JOBQUEUE *oldq){ AH_JOBQUEUE *jq; assert(oldq); jq=AH_JobQueue_new(oldq->user); jq->signers=GWEN_StringList_dup(oldq->signers); jq->secProfile=oldq->secProfile; jq->secClass=oldq->secClass; if (oldq->usedTan) jq->usedTan=strdup(oldq->usedTan); if (oldq->usedPin) jq->usedPin=strdup(oldq->usedPin); return jq; } void AH_JobQueue_SetUsedTan(AH_JOBQUEUE *jq, const char *s){ assert(jq); assert(jq->usage); free(jq->usedTan); if (s) jq->usedTan=strdup(s); else jq->usedTan=0; } void AH_JobQueue_SetUsedPin(AH_JOBQUEUE *jq, const char *s){ assert(jq); assert(jq->usage); free(jq->usedPin); if (s) jq->usedPin=strdup(s); else jq->usedPin=0; } AH_JOBQUEUE_ADDRESULT AH_JobQueue_AddJob(AH_JOBQUEUE *jq, AH_JOB *j){ int jobsPerMsg; int maxJobTypes; int jobCount; int jobTypeCount; int thisJobTypeCount; int hasSingle; int crypt; int needTAN; int noSysId; int noItan; GWEN_STRINGLIST *jobTypes; AH_JOB *cj; AH_BPD *bpd; assert(jq); assert(jq->usage); /* job owner must equal queue owner */ if (AH_Job_GetUser(j)!=jq->user) { DBG_INFO(AQHBCI_LOGDOMAIN, "Owner of the job doesn't match"); return AH_JobQueueAddResultJobLimit; } /* sample some variables */ bpd=AH_User_GetBpd(jq->user); jobsPerMsg=AH_Job_GetJobsPerMsg(j); maxJobTypes=AH_Bpd_GetJobTypesPerMsg(bpd); jobCount=0; jobTypeCount=0; thisJobTypeCount=0; hasSingle=0; crypt=0; needTAN=0; noSysId=0; noItan=0; jobTypes=GWEN_StringList_new(); cj=AH_Job_List_First(jq->jobs); while(cj) { jobCount++; GWEN_StringList_AppendString(jobTypes, AH_Job_GetName(cj), 0, 1); if (strcasecmp(AH_Job_GetName(cj), AH_Job_GetName(j))==0) thisJobTypeCount++; hasSingle|=((AH_Job_GetFlags(cj) & AH_JOB_FLAGS_SINGLE) || (AH_Job_GetFlags(cj) & AH_JOB_FLAGS_DLGJOB)); crypt|=(AH_Job_GetFlags(cj) & AH_JOB_FLAGS_CRYPT); needTAN|=(AH_Job_GetFlags(cj) & AH_JOB_FLAGS_NEEDTAN); noSysId|=(AH_Job_GetFlags(cj) & AH_JOB_FLAGS_NOSYSID); noItan|=(AH_Job_GetFlags(cj) & AH_JOB_FLAGS_NOITAN); cj=AH_Job_List_Next(cj); } /* while */ /* Account for new job when checking limits for thisJobTypeCount and * jobTypeCount */ thisJobTypeCount++; GWEN_StringList_AppendString(jobTypes, AH_Job_GetName(j), 0, 1); jobTypeCount=GWEN_StringList_Count(jobTypes); GWEN_StringList_free(jobTypes); if (strcasecmp(AH_Job_GetName(j), "JobTan")!=0) { if (jobCount && ( (crypt!=(AH_Job_GetFlags(j) & AH_JOB_FLAGS_CRYPT)) || (needTAN!=(AH_Job_GetFlags(j) & AH_JOB_FLAGS_NEEDTAN)) || (noSysId!=(AH_Job_GetFlags(j) & AH_JOB_FLAGS_NOSYSID)) || (noItan!=(AH_Job_GetFlags(j) & AH_JOB_FLAGS_NOITAN)) ) ) { DBG_INFO(AQHBCI_LOGDOMAIN, "Encryption/TAN/SysId flags for queue and this job differ"); return AH_JobQueueAddResultJobLimit; } /* check for single jobs */ if (hasSingle) { DBG_INFO(AQHBCI_LOGDOMAIN, "Queue already contains a job which wants to be left alone"); return AH_JobQueueAddResultQueueFull; } /* check if this job is single and there already are jobs in the queue */ if (((AH_Job_GetFlags(j) & AH_JOB_FLAGS_SINGLE) || (AH_Job_GetFlags(j) & AH_JOB_FLAGS_DLGJOB)) && jobCount) { DBG_INFO(AQHBCI_LOGDOMAIN, "Queue already contains jobs and this one has the SINGLE flag"); return AH_JobQueueAddResultJobLimit; } /* check if adding this job would exceed the limit of jobs of this kind */ if (jobsPerMsg && thisJobTypeCount>jobsPerMsg) { DBG_INFO(AQHBCI_LOGDOMAIN, "Too many jobs of this kind (limit is %d)", jobsPerMsg); return AH_JobQueueAddResultJobLimit; } /* check for maximum of different job types per message */ if (maxJobTypes && jobTypeCount>maxJobTypes) { DBG_INFO(AQHBCI_LOGDOMAIN, "Too many different job types (limit is %d)", maxJobTypes); return AH_JobQueueAddResultJobLimit; } /* check security class */ if (jq->secClass==0) jq->secClass=AH_Job_GetSecurityClass(j); else { if (jq->secClass!=AH_Job_GetSecurityClass(j)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job's security class doesn't match that of the queue (%d != %d)", jq->secClass, AH_Job_GetSecurityClass(j)); return AH_JobQueueAddResultJobLimit; } } /* check for signers */ if (!jobCount && !GWEN_StringList_Count(jq->signers)) { const GWEN_STRINGLIST *sl; /* no jobs in queue and no signers, * so simply copy the signers of this job */ sl=AH_Job_GetSigners(j); if (sl) { DBG_INFO(AQHBCI_LOGDOMAIN, "Copying signers from job to queue"); GWEN_StringList_free(jq->signers); jq->signers=GWEN_StringList_dup(sl); } } else { const GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; sl=AH_Job_GetSigners(j); if (GWEN_StringList_Count(sl)!=GWEN_StringList_Count(jq->signers)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Number of signers of the job differs from that of the queue"); return AH_JobQueueAddResultJobLimit; } se=GWEN_StringList_FirstEntry(sl); while(se) { if (!GWEN_StringList_HasString(jq->signers, GWEN_StringListEntry_Data(se))) { DBG_INFO(AQHBCI_LOGDOMAIN, "Signers of the job differ from those of the queue"); return AH_JobQueueAddResultJobLimit; } se=GWEN_StringListEntry_Next(se); } /* while se */ } /* adjust queue flags according to current job */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_CRYPT) jq->flags|=AH_JOBQUEUE_FLAGS_CRYPT; if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) jq->flags|=AH_JOBQUEUE_FLAGS_SIGN; if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_NEEDTAN) jq->flags|=AH_JOBQUEUE_FLAGS_NEEDTAN; if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_NOSYSID) jq->flags|=AH_JOBQUEUE_FLAGS_NOSYSID; if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_NOITAN) jq->flags|=AH_JOBQUEUE_FLAGS_NOITAN; } /* update maximum security profile */ if (AH_Job_GetSecurityProfile(j)>jq->secProfile) jq->secProfile=AH_Job_GetSecurityProfile(j); /* actually add job to queue */ AH_Job_List_Add(j, jq->jobs); AH_Job_SetStatus(j, AH_JobStatusEnqueued); DBG_INFO(AQHBCI_LOGDOMAIN, "Job added to the queue"); return AH_JobQueueAddResultOk; } const AH_JOB_LIST *AH_JobQueue_GetJobList(const AH_JOBQUEUE *jq){ assert(jq); assert(jq->usage); return jq->jobs; } AH_JOB_LIST *AH_JobQueue_TakeJobList(AH_JOBQUEUE *jq){ AH_JOB_LIST *jl; assert(jq); assert(jq->usage); jl=jq->jobs; jq->jobs=AH_Job_List_new(); return jl; } uint32_t AH_JobQueue_GetMsgNum(const AH_JOBQUEUE *jq){ assert(jq); assert(jq->usage); return jq->msgNum; } AH_MSG *AH_JobQueue_ToMessage(AH_JOBQUEUE *jq, AH_DIALOG *dlg){ AH_MSG *msg; AH_JOB *j; unsigned int encodedJobs; GWEN_STRINGLISTENTRY *se; int rv; assert(jq); assert(jq->usage); assert(dlg); if (!AH_Job_List_GetCount(jq->jobs)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Empty queue"); return 0; } msg=AH_Msg_new(dlg); AH_Msg_SetHbciVersion(msg, AH_User_GetHbciVersion(jq->user)); AH_Msg_SetSecurityProfile(msg, jq->secProfile); AH_Msg_SetSecurityClass(msg, jq->secClass); if (AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_NEEDTAN) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Queue needs a TAN"); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Queue doesn't need a TAN"); } AH_Msg_SetNeedTan(msg, (AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_NEEDTAN)); AH_Msg_SetNoSysId(msg, (AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_NOSYSID)); /* copy signers */ if (AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_SIGN) { se=GWEN_StringList_FirstEntry(jq->signers); if (!se) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signatures needed but no signer given"); AH_Msg_free(msg); return 0; } while(se) { AH_Msg_AddSignerId(msg, GWEN_StringListEntry_Data(se)); se=GWEN_StringListEntry_Next(se); } /* while */ } /* copy crypter */ if (jq->flags & AH_JOBQUEUE_FLAGS_CRYPT) { const char *s; s=AH_User_GetPeerId(jq->user); if (!s) s=AB_User_GetUserId(jq->user); AH_Msg_SetCrypterId(msg, s); } encodedJobs=0; j=AH_Job_List_First(jq->jobs); while(j) { AH_JOB_STATUS st; st=AH_Job_GetStatus(j); /* only encode jobs which have not already been sent or which have * have no errors */ if (st==AH_JobStatusEnqueued) { unsigned int firstSeg; unsigned int lastSeg; GWEN_DB_NODE *jargs; GWEN_XMLNODE *jnode; GWEN_BUFFER *msgBuf; DBG_INFO(AQHBCI_LOGDOMAIN, "Encoding job \"%s\"", AH_Job_GetName(j)); jargs=AH_Job_GetArguments(j); jnode=AH_Job_GetXmlNode(j); if (strcasecmp(GWEN_XMLNode_GetData(jnode), "message")==0) { const char *s; s=GWEN_XMLNode_GetProperty(jnode, "name", 0); if (s) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Getting for message specific data (%s)", s); jargs=GWEN_DB_GetGroup(jargs, GWEN_PATH_FLAGS_NAMEMUSTEXIST, s); if (!jargs) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "No message specific data"); jargs=AH_Job_GetArguments(j); } } } firstSeg=AH_Msg_GetCurrentSegmentNumber(msg); msgBuf=AH_Msg_GetBuffer(msg); assert(msgBuf); lastSeg=AH_Msg_AddNode(msg, jnode, jargs); if (!lastSeg) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encode job \"%s\"", AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusError); } else { AH_Job_SetFirstSegment(j, firstSeg); AH_Job_SetLastSegment(j, lastSeg); if (AH_Job_GetStatus(j)!=AH_JobStatusError) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" encoded", AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusEncoded); encodedJobs++; } } } /* if status matches */ j=AH_Job_List_Next(j); } /* while */ if (!encodedJobs) { DBG_INFO(AQHBCI_LOGDOMAIN, "No job encoded"); AH_Msg_free(msg); return 0; } rv=AH_Msg_EncodeMsg(msg); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not encode message (%d)", rv); j=AH_Job_List_First(jq->jobs); while(j) { if (AH_Job_GetStatus(j)==AH_JobStatusEncoded) AH_Job_SetStatus(j, AH_JobStatusError); j=AH_Job_List_Next(j); } /* while */ AH_Msg_free(msg); return 0; } /* * inform all jobs that they have been encoded * this is needed for multi-message jobs so that they can prepare * themselves for the next message */ j=AH_Job_List_First(jq->jobs); AH_JobQueue_SetUsedTan(jq, AH_Msg_GetTan(msg)); AH_JobQueue_SetUsedPin(jq, AH_Msg_GetPin(msg)); while(j) { const char *s; if (AH_Job_GetStatus(j)==AH_JobStatusEncoded) { /* store some information about the message in the job */ AH_Job_SetMsgNum(j, AH_Msg_GetMsgNum(msg)); AH_Job_SetDialogId(j, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg); if (s) AH_Job_SetExpectedSigner(j, s); s=AH_Msg_GetExpectedCrypter(msg); if (s) AH_Job_SetExpectedCrypter(j, s); /* store used TAN (if any) */ s=AH_Msg_GetTan(msg); if (s) AH_Job_SetUsedTan(j, s); } j=AH_Job_List_Next(j); } /* while */ jq->msgNum=AH_Msg_GetMsgNum(msg); DBG_INFO(AQHBCI_LOGDOMAIN, "Job queue encoded and ready to be sent (msgNum=%d)", jq->msgNum); return msg; } int AH_JobQueue__CheckTans(AH_JOBQUEUE *jq, uint32_t guiid){ AH_JOB *j; assert(jq); j=AH_Job_List_First(jq->jobs); while(j) { const char *tan; AB_USER *u; u=AH_Job_GetUser(j); assert(u); tan=AH_Job_GetUsedTan(j); if (tan) { int rv; if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_TANUSED) { char tbuf[256]; DBG_INFO(AQHBCI_LOGDOMAIN, "TAN \"%s\" used", tan); snprintf(tbuf, sizeof(tbuf)-1, I18N("TAN \"%s\" has been used, please strike it out."), tan); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Notice, tbuf); rv=AH_User_SetTanStatus(jq->user, NULL, /* no challenge here */ tan, GWEN_Gui_PasswordStatus_Used); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "TAN not used"); rv=AH_User_SetTanStatus(jq->user, NULL, /* no challenge here */ tan, GWEN_Gui_PasswordStatus_Unused); } if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error adjusting TAN status (%d), ignoring", rv); /*return rv;*/ } } /* if tan */ j=AH_Job_List_Next(j); } return 0; } int AH_JobQueue_DispatchMessage(AH_JOBQUEUE *jq, AH_MSG *msg, GWEN_DB_NODE *db) { GWEN_DB_NODE *dbSecurity; GWEN_DB_NODE *dbCurr; AH_JOB *j; AH_DIALOG *dlg; const char *p; int tanRecycle; int rv; int dialogAborted=0; int abortQueue=0; int badPin=0; GWEN_STRINGLISTENTRY *se; uint32_t guiid; assert(jq); assert(jq->usage); assert(msg); assert(db); dlg=AH_Msg_GetDialog(msg); assert(dlg); guiid=0; /* log all results */ tanRecycle=0; dbCurr=GWEN_DB_GetFirstGroup(db); while(dbCurr) { if (strcasecmp(GWEN_DB_GroupName(dbCurr), "SegResult")==0 || strcasecmp(GWEN_DB_GroupName(dbCurr), "MsgResult")==0) { int rcode; const char *p; int isMsgResult; GWEN_BUFFER *logmsg; GWEN_LOGGER_LEVEL level; GWEN_DB_NODE *dbResult; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Found a result"); level=GWEN_LoggerLevel_Notice; isMsgResult=(strcasecmp(GWEN_DB_GroupName(dbCurr), "MsgResult")==0); dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); p=GWEN_DB_GetCharValue(dbResult, "text", 0, ""); if (rcode>=9000 && rcode<10000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Result: Error (%d: %s)", rcode, p); level=GWEN_LoggerLevel_Error; if (isMsgResult) { if (rcode==9800) dialogAborted=1; else if (rcode>9300 && rcode<9400) abortQueue=1; } } else if (rcode>=3000 && rcode<4000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Result: Warning (%d: %s)", rcode, p); if (rcode==3910) tanRecycle=1; else if (rcode==3920) { int i; AH_User_ClearTanMethodList(jq->user); for (i=0; ; i++) { int j; j=GWEN_DB_GetIntValue(dbResult, "param", i, 0); if (j==0) break; AH_User_AddTanMethod(jq->user, j); } /* for */ if (i==0) /* add single step if empty list */ AH_User_AddTanMethod(jq->user, 999); } level=GWEN_LoggerLevel_Warning; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment result: Ok (%d: %s)", rcode, p); level=GWEN_LoggerLevel_Notice; } logmsg=GWEN_Buffer_new(0, 256, 0, 1); if (p) { char numbuf[16]; GWEN_Buffer_AppendString(logmsg, "HBCI: "); snprintf(numbuf, sizeof(numbuf), "%04d", rcode); GWEN_Buffer_AppendString(logmsg, numbuf); GWEN_Buffer_AppendString(logmsg, " - "); GWEN_Buffer_AppendString(logmsg, p); if (isMsgResult) GWEN_Buffer_AppendString(logmsg, " (M)"); else GWEN_Buffer_AppendString(logmsg, " (S)"); } else { char numbuf[16]; GWEN_Buffer_AppendString(logmsg, "HBCI: "); snprintf(numbuf, sizeof(numbuf), "%04d", rcode); GWEN_Buffer_AppendString(logmsg, numbuf); GWEN_Buffer_AppendString(logmsg, " - (no text)"); if (isMsgResult) GWEN_Buffer_AppendString(logmsg, " (M)"); else GWEN_Buffer_AppendString(logmsg, " (S)"); } GWEN_Gui_ProgressLog(0, level, GWEN_Buffer_GetStart(logmsg)); GWEN_Buffer_free(logmsg); /* check for bad pins here */ if (rcode==9340 || rcode==9942) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad PIN flagged: %d", rcode); badPin=1; if (jq->usedPin) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("PIN seems to be invalid")); AH_User_SetPinStatus(jq->user, jq->usedPin, GWEN_Gui_PasswordStatus_Bad); } } dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } /* while results */ } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* prepare security group */ dbSecurity=GWEN_DB_Group_new("security"); p=AH_Dialog_GetDialogId(dlg); assert(p); GWEN_DB_SetIntValue(dbSecurity, GWEN_DB_FLAGS_DEFAULT, "msgnum", AH_Msg_GetMsgNum(msg)); GWEN_DB_SetCharValue(dbSecurity, GWEN_DB_FLAGS_DEFAULT, "dialogId", p); /* get all signers */ se=GWEN_StringList_FirstEntry(AH_Msg_GetSignerIdList(msg)); while(se) { const char *p; p=GWEN_StringListEntry_Data(se); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding signer \"%s\"", p); GWEN_DB_SetCharValue(dbSecurity, GWEN_DB_FLAGS_DEFAULT, "signer", p); se=GWEN_StringListEntry_Next(se); } /* while */ /* set crypter */ p=AH_Msg_GetCrypterId(msg); if (p) { DBG_INFO(AQHBCI_LOGDOMAIN, "Storing crypter \"%s\"", p); GWEN_DB_SetCharValue(dbSecurity, GWEN_DB_FLAGS_DEFAULT, "crypter", p); } /* remove attach points of all jobs */ j=AH_Job_List_First(jq->jobs); while(j) { AH_JOB_STATUS st; st=AH_Job_GetStatus(j); if (st==AH_JobStatusSent) { if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_ATTACHABLE) { GWEN_DB_NODE *args; AH_Job_SubFlags(j, AH_JOB_FLAGS_HASATTACHPOINT); /* remove the attach point */ args=AH_Job_GetArguments(j); if (GWEN_DB_DeleteVar(args, "attach")) { DBG_INFO(AQHBCI_LOGDOMAIN, "Attach point removed"); } } /* if job is attachable */ } /* if status matches */ j=AH_Job_List_Next(j); } /* while */ dbCurr=GWEN_DB_GetFirstGroup(db); while(dbCurr) { GWEN_DB_NODE *dbResponse; GWEN_DB_NODE *dbData; int segNum; DBG_INFO(AQHBCI_LOGDOMAIN, "Handling response \"%s\"", GWEN_DB_GroupName(dbCurr)); dbResponse=GWEN_DB_Group_new("response"); /* add security group */ GWEN_DB_AddGroup(dbResponse, GWEN_DB_Group_dup(dbSecurity)); /* create data group */ dbData=GWEN_DB_GetGroup(dbResponse, GWEN_DB_FLAGS_DEFAULT, "data"); assert(dbData); /* store copy of original response there */ GWEN_DB_AddGroup(dbData, GWEN_DB_Group_dup(dbCurr)); segNum=GWEN_DB_GetIntValue(dbCurr, "head/ref", 0, 0); if (segNum) { /* search for job to which this response belongs */ j=AH_Job_List_First(jq->jobs); while(j) { AH_JOB_STATUS st; st=AH_Job_GetStatus(j); if (st==AH_JobStatusSent || st==AH_JobStatusAnswered) { DBG_INFO(AQHBCI_LOGDOMAIN, "Checking whether job \"%s\" has segment %d", AH_Job_GetName(j), segNum); if ((AH_Msg_GetMsgNum(msg)==AH_Job_GetMsgNum(j)) && AH_Job_HasSegment(j, segNum)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" claims to have the segment %d", AH_Job_GetName(j), segNum); break; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Skipping job \"%s\" because of status \"%s\" (%d)", AH_Job_GetName(j), AH_Job_StatusName(st), st); } j=AH_Job_List_Next(j); } /* while j */ if (j) { /* check for attachability */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_ATTACHABLE) { /* job is attachable, check whether this is segment result */ if (strcasecmp(GWEN_DB_GroupName(dbCurr), "SegResult")==0) { GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { int rcode; rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); /* it is a segment result, does it contain an attach point ? */ if (rcode==3040) { const char *p; /* it should... */ p=GWEN_DB_GetCharValue(dbResult, "param", 0, 0); if (!p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Segment result 3040 without attachpoint"); } else { GWEN_DB_NODE *args; /* store the attach point */ DBG_INFO(AQHBCI_LOGDOMAIN, "Storing attach point"); args=AH_Job_GetArguments(j); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "attach", p); AH_Job_AddFlags(j, AH_JOB_FLAGS_HASATTACHPOINT); } } /* if code 3040 (means "more data available") */ dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } /* while */ } /* if segresult */ } /* if attachable */ /* check for segment results */ if (strcasecmp(GWEN_DB_GroupName(dbCurr), "SegResult")==0) { GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { int rcode; const char *p; rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); p=GWEN_DB_GetCharValue(dbResult, "text", 0, ""); if (rcode>=9000 && rcode<10000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment result: Error (%d: %s)", rcode, p); if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_IGNORE_ERROR)) { AH_Job_AddFlags(j, AH_JOB_FLAGS_HASERRORS); AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASERRORS); } } else if (rcode>=3000 && rcode<4000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment result: Warning (%d: %s)", rcode, p); if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_IGNORE_ERROR)) { AH_Job_AddFlags(j, AH_JOB_FLAGS_HASWARNINGS); AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASWARNINGS); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment result: Ok (%d: %s)", rcode, p); } dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } /* while */ } /* if SegResult */ DBG_INFO(AQHBCI_LOGDOMAIN, "Adding response \"%s\" to job \"%s\"", GWEN_DB_GroupName(dbCurr), AH_Job_GetName(j)); AH_Job_AddResponse(j, dbResponse); AH_Job_SetStatus(j, AH_JobStatusAnswered); } /* if matching job found */ else { uint32_t plusFlags; DBG_WARN(AQHBCI_LOGDOMAIN, "No job found, adding response \"%s\" to all jobs", GWEN_DB_GroupName(dbCurr)); /* add response to all jobs (as queue response) and to queue */ plusFlags=0; if (strcasecmp(GWEN_DB_GroupName(dbCurr), "MsgResult")==0) { GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { int rcode; const char *p; /* FIXME: This code will never be used, I guess, since * a MsgResult wil most likely not have a reference segment... */ rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); p=GWEN_DB_GetCharValue(dbResult, "text", 0, ""); if (rcode>=9000 && rcode<10000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Error (%d: %s)", rcode, p); plusFlags|=AH_JOB_FLAGS_HASERRORS; AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASERRORS); } else if (rcode>=3000 && rcode<4000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Warning (%d: %s)", rcode, p); plusFlags|=AH_JOB_FLAGS_HASWARNINGS; AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASWARNINGS); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Ok (%d: %s)", rcode, p); } dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } } else if (strcasecmp(GWEN_DB_GroupName(dbCurr), "SegResult")==0) { GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { // int rcode; // rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); /* nothing to do right now */ dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } /* while */ } /* if segresult */ j=AH_Job_List_First(jq->jobs); while(j) { AH_JOB_STATUS st; st=AH_Job_GetStatus(j); if (st==AH_JobStatusSent || st==AH_JobStatusAnswered) { if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_IGNORE_ERROR)) { AH_Job_AddFlags(j, plusFlags); AH_Job_AddResponse(j, GWEN_DB_Group_dup(dbResponse)); } AH_Job_SetStatus(j, AH_JobStatusAnswered); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Status %d of job doesn't match", st); } j=AH_Job_List_Next(j); } /* while */ GWEN_DB_Group_free(dbResponse); } } else { uint32_t plusFlags; /* no reference segment number, add response to all jobs and * to the queue */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "No segment reference number, " "adding response \"%s\" to all jobs", GWEN_DB_GroupName(dbCurr)); /* add response to all jobs (as queue response) and to queue */ plusFlags=0; if (strcasecmp(GWEN_DB_GroupName(dbCurr), "MsgResult")==0) { GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbCurr, "result"); while(dbResult) { int rcode; const char *p; rcode=GWEN_DB_GetIntValue(dbResult, "resultcode", 0, 0); p=GWEN_DB_GetCharValue(dbResult, "text", 0, ""); if (rcode>=9000 && rcode<10000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Error (%d: %s)", rcode, p); plusFlags|=AH_JOB_FLAGS_HASERRORS; AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASERRORS); } else if (rcode>=3000 && rcode<4000) { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Warning (%d: %s)", rcode, p); plusFlags|=AH_JOB_FLAGS_HASWARNINGS; AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_HASWARNINGS); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Msg result: Ok (%d: %s)", rcode, p); } dbResult=GWEN_DB_FindNextGroup(dbResult, "Result"); } } j=AH_Job_List_First(jq->jobs); while(j) { AH_JOB_STATUS st; st=AH_Job_GetStatus(j); if (st==AH_JobStatusSent || st==AH_JobStatusAnswered) { if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_IGNORE_ERROR)) { AH_Job_AddFlags(j, plusFlags); AH_Job_AddResponse(j, GWEN_DB_Group_dup(dbResponse)); } AH_Job_SetStatus(j, AH_JobStatusAnswered); } j=AH_Job_List_Next(j); } /* while */ GWEN_DB_Group_free(dbResponse); } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ GWEN_DB_Group_free(dbSecurity); /* set usedTan status accordingly */ j=AH_Job_List_First(jq->jobs); while(j) { const char *utan; utan=AH_Job_GetUsedTan(j); if (utan) { AH_JOB_STATUS st; AH_Job_AddFlags(j, AH_JOB_FLAGS_TANUSED); st=AH_Job_GetStatus(j); if (st==AH_JobStatusSent || st==AH_JobStatusAnswered) { if (tanRecycle) AH_Job_SubFlags(j, AH_JOB_FLAGS_TANUSED); } else { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad status %d", st); } } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "No TAN in job [%s]", AH_Job_GetName(j)); } j=AH_Job_List_Next(j); } /* while */ /* tell the application/medium about used and unused TANs */ rv=AH_JobQueue__CheckTans(jq, guiid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error checking TANs (%d)", rv); } if (dialogAborted) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Dialog logically aborted by peer"); if (jq->usedPin) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Dialog aborted by bank, assuming bad PIN")); AH_User_SetPinStatus(jq->user, jq->usedPin, GWEN_Gui_PasswordStatus_Bad); } return GWEN_ERROR_ABORTED; } if (abortQueue) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Aborting queue"); return GWEN_ERROR_ABORTED; } if (!badPin) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog not aborted, assuming correct PIN"); if (jq->usedPin) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Dialog not aborted, assuming PIN is ok")); AH_User_SetPinStatus(jq->user, jq->usedPin, GWEN_Gui_PasswordStatus_Ok); } } return rv; } uint32_t AH_JobQueue_GetFlags(AH_JOBQUEUE *jq){ assert(jq); assert(jq->usage); return jq->flags; } void AH_JobQueue_SetFlags(AH_JOBQUEUE *jq, uint32_t f){ assert(jq); assert(jq->usage); jq->flags=f; } void AH_JobQueue_AddFlags(AH_JOBQUEUE *jq, uint32_t f){ assert(jq); assert(jq->usage); jq->flags|=f; } void AH_JobQueue_SubFlags(AH_JOBQUEUE *jq, uint32_t f){ assert(jq); assert(jq->usage); jq->flags&=~f; } AB_USER *AH_JobQueue_GetUser(const AH_JOBQUEUE *jq){ assert(jq); assert(jq->usage); return jq->user; } void AH_JobQueue_SetJobStatusOnMatch(AH_JOBQUEUE *jq, AH_JOB_STATUS matchSt, AH_JOB_STATUS newSt) { AH_JOB *j; assert(jq); assert(jq->usage); j=AH_Job_List_First(jq->jobs); while(j) { if (matchSt==AH_JobStatusAll || AH_Job_GetStatus(j)==matchSt) AH_Job_SetStatus(j, newSt); j=AH_Job_List_Next(j); } /* while */ } void AH_JobQueue_Dump(AH_JOBQUEUE *jq, FILE *f, unsigned int insert) { uint32_t k; AH_JOB *j; GWEN_STRINGLISTENTRY *se; for (k=0; kusage); for (k=0; kuser)); for (k=0; kflags); if (jq->flags & AH_JOBQUEUE_FLAGS_CRYPT) fprintf(f, "CRYPT "); if (jq->flags & AH_JOBQUEUE_FLAGS_SIGN) fprintf(f, "SIGN "); if (jq->flags & AH_JOBQUEUE_FLAGS_BEGINDIALOG) fprintf(f, "BEGINDIALOG "); if (jq->flags & AH_JOBQUEUE_FLAGS_ENDDIALOG) fprintf(f, "ENDDIALOG "); if (jq->flags & AH_JOBQUEUE_FLAGS_ISDIALOG) fprintf(f, "ISDIALOG "); if (jq->flags & AH_JOBQUEUE_FLAGS_OUTBOX) fprintf(f, "OUTBOX "); if (jq->flags & AH_JOBQUEUE_FLAGS_HASWARNINGS) fprintf(f, "HASWARNINGS "); if (jq->flags & AH_JOBQUEUE_FLAGS_HASERRORS) fprintf(f, "HASERRORS "); if (jq->flags & AH_JOBQUEUE_FLAGS_DLGSTARTED) fprintf(f, "DLGSTARTED "); fprintf(f, ")\n"); for (k=0; ksigners); while(se) { for (k=0; kjobs); while(j) { AH_Job_Dump(j, f, insert+2); j=AH_Job_List_Next(j); } /* while j */ } unsigned int AH_JobQueue_GetCount(const AH_JOBQUEUE *jq){ assert(jq); assert(jq->usage); return AH_Job_List_GetCount(jq->jobs); } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/tanmethod.xml0000644000175000017500000000300512364015477024330 00000000000000 This group represents a TAN method within AqHBCI.
aqhbci/aqhbci.h
aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/jobqueue_l.h0000644000175000017500000000555512364015477024142 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_JOBQUEUE_L_H #define AH_JOBQUEUE_L_H #include "job_l.h" typedef struct AH_JOBQUEUE AH_JOBQUEUE; #define AH_JOBQUEUE_FLAGS_CRYPT 0x00000001 #define AH_JOBQUEUE_FLAGS_SIGN 0x00000002 #define AH_JOBQUEUE_FLAGS_ISDIALOG 0x00000004 #define AH_JOBQUEUE_FLAGS_DLGSTARTED 0x00000008 #define AH_JOBQUEUE_FLAGS_NEEDTAN 0x00000010 #define AH_JOBQUEUE_FLAGS_NOSYSID 0x00000020 #define AH_JOBQUEUE_FLAGS_NOITAN 0x00000040 #define AH_JOBQUEUE_FLAGS_COPYMASK 0x0000ffff #define AH_JOBQUEUE_FLAGS_BEGINDIALOG 0x00010000 #define AH_JOBQUEUE_FLAGS_ENDDIALOG 0x00020000 #define AH_JOBQUEUE_FLAGS_OUTBOX 0x00040000 #define AH_JOBQUEUE_FLAGS_HASWARNINGS 0x00080000 #define AH_JOBQUEUE_FLAGS_HASERRORS 0x00100000 /** a dialog job has been started */ #include #include "message_l.h" typedef enum { AH_JobQueueAddResultOk=0, AH_JobQueueAddResultJobLimit, AH_JobQueueAddResultQueueFull, AH_JobQueueAddResultError, } AH_JOBQUEUE_ADDRESULT; GWEN_LIST_FUNCTION_DEFS(AH_JOBQUEUE, AH_JobQueue); AH_JOBQUEUE *AH_JobQueue_new(AB_USER *u); void AH_JobQueue_free(AH_JOBQUEUE *jq); void AH_JobQueue_Attach(AH_JOBQUEUE *jq); AH_JOBQUEUE *AH_JobQueue_fromQueue(AH_JOBQUEUE *oldq); AB_USER *AH_JobQueue_GetUser(const AH_JOBQUEUE *jq); AH_JOBQUEUE_ADDRESULT AH_JobQueue_AddJob(AH_JOBQUEUE *jq, AH_JOB *j); const AH_JOB_LIST *AH_JobQueue_GetJobList(const AH_JOBQUEUE *jq); AH_JOB_LIST *AH_JobQueue_TakeJobList(AH_JOBQUEUE *jq); uint32_t AH_JobQueue_GetMsgNum(const AH_JOBQUEUE *jq); AH_MSG *AH_JobQueue_ToMessage(AH_JOBQUEUE *jq, AH_DIALOG *dlg); int AH_JobQueue_DispatchMessage(AH_JOBQUEUE *jq, AH_MSG *msg, GWEN_DB_NODE *db); unsigned int AH_JobQueue_GetCount(const AH_JOBQUEUE *jq); void AH_JobQueue_Dump(AH_JOBQUEUE *jq, FILE *f, unsigned int insert); void AH_JobQueue_AddSigner(AH_JOBQUEUE *jq, const char *s); uint32_t AH_JobQueue_GetFlags(AH_JOBQUEUE *jq); void AH_JobQueue_SetFlags(AH_JOBQUEUE *jq, uint32_t f); void AH_JobQueue_AddFlags(AH_JOBQUEUE *jq, uint32_t f); void AH_JobQueue_SubFlags(AH_JOBQUEUE *jq, uint32_t f); void AH_JobQueue_SetJobStatusOnMatch(AH_JOBQUEUE *jq, AH_JOB_STATUS matchSt, AH_JOB_STATUS newSt); #endif /* AH_JOBQUEUE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/result.c0000644000175000017500000000607212364015477023314 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "result_p.h" #include "aqhbci_l.h" #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_RESULT, AH_Result); AH_RESULT *AH_Result_new(int code, const char *text, const char *ref, const char *param, int isMsgResult){ AH_RESULT *r; GWEN_NEW_OBJECT(AH_RESULT, r); GWEN_LIST_INIT(AH_RESULT, r); r->code=code; if (text) r->text=strdup(text); if (ref) r->ref=strdup(ref); if (param) r->param=strdup(param); r->isMsgResult=isMsgResult; return r; } void AH_Result_free(AH_RESULT *r){ if (r) { GWEN_LIST_FINI(AH_RESULT, r); free(r->text); free(r->ref); free(r->param); GWEN_FREE_OBJECT(r); } } AH_RESULT *AH_Result_dup(const AH_RESULT *or) { AH_RESULT *r; assert(or); r=AH_Result_new(or->code, or->text, or->ref, or->param, or->isMsgResult); return r; } int AH_Result_GetCode(const AH_RESULT *r){ assert(r); return r->code; } const char *AH_Result_GetText(const AH_RESULT *r){ assert(r); return r->text; } const char *AH_Result_GetRef(const AH_RESULT *r){ assert(r); return r->ref; } const char *AH_Result_GetParam(const AH_RESULT *r){ assert(r); return r->param; } int AH_Result_IsError(const AH_RESULT *r){ assert(r); return (r->code>=9000); } int AH_Result_IsWarning(const AH_RESULT *r){ assert(r); return (r->code>=3000 && r->code<4000); } int AH_Result_IsInfo(const AH_RESULT *r){ assert(r); return (r->code>=1000 && r->code<2000); } int AH_Result_IsOk(const AH_RESULT *r){ assert(r); return (r->code<9000); } int AH_Result_IsMsgResult(const AH_RESULT *r){ assert(r); return r->isMsgResult; } void AH_Result_Dump(const AH_RESULT *r, FILE *f, unsigned int insert) { uint32_t k; for (k=0; kcode); if (r->text) { for (k=0; ktext); } if (r->ref) { for (k=0; kref); } if (r->param) { for (k=0; kparam); } } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/job.c0000644000175000017500000021177112364015477022554 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "job_p.h" #include "aqhbci_l.h" #include "hbci_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_JOB, AH_Job); GWEN_LIST2_FUNCTIONS(AH_JOB, AH_Job); GWEN_INHERIT_FUNCTIONS(AH_JOB); AH_JOB *AH_Job_new(const char *name, AB_USER *u, const char *accountId, int jobVersion) { AH_JOB *j; GWEN_XMLNODE *node; GWEN_XMLNODE *jobNode=0; GWEN_XMLNODE *msgNode; GWEN_XMLNODE *descrNode; const char *segCode=NULL; const char *paramName; const char *responseName; int needsBPD; int needTAN; int noSysId; int noItan; GWEN_DB_NODE *bpdgrp; const AH_BPD *bpd; GWEN_MSGENGINE *e; assert(name); assert(u); needTAN=0; GWEN_NEW_OBJECT(AH_JOB, j); j->usage=1; GWEN_LIST_INIT(AH_JOB, j); GWEN_INHERIT_INIT(AH_JOB, j); j->name=strdup(name); if (accountId) j->accountId=strdup(accountId); j->user=u; j->signers=GWEN_StringList_new(); j->log=GWEN_StringList_new(); j->challengeParams=GWEN_StringList_new(); /* get job descriptions */ e=AH_User_GetMsgEngine(u); assert(e); bpd=AH_User_GetBpd(u); /* just to make sure the XMLNode is not freed before this job is */ j->msgEngine=e; GWEN_MsgEngine_Attach(e); if (AH_User_GetHbciVersion(u)==0) GWEN_MsgEngine_SetProtocolVersion(e, 210); else GWEN_MsgEngine_SetProtocolVersion(e, AH_User_GetHbciVersion(u)); GWEN_MsgEngine_SetMode(e, AH_CryptMode_toString(AH_User_GetCryptMode(u))); /* first select any version, we simply need to know the BPD job name */ node=GWEN_MsgEngine_FindNodeByProperty(e, "JOB", "id", 0, name); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" not supported by local XML files", name); AH_Job_free(j); return 0; } jobNode=node; j->jobParams=GWEN_DB_Group_new("jobParams"); j->jobArguments=GWEN_DB_Group_new("jobArguments"); j->jobResponses=GWEN_DB_Group_new("jobResponses"); /* get some properties */ needsBPD=(atoi(GWEN_XMLNode_GetProperty(node, "needbpd", "0"))!=0); needTAN=(atoi(GWEN_XMLNode_GetProperty(node, "needtan", "0"))!=0); noSysId=(atoi(GWEN_XMLNode_GetProperty(node, "nosysid", "0"))!=0); noItan=(atoi(GWEN_XMLNode_GetProperty(node, "noitan", "0"))!=0); paramName=GWEN_XMLNode_GetProperty(node, "params", ""); responseName=GWEN_XMLNode_GetProperty(node, "response", ""); free(j->responseName); if (responseName) j->responseName=strdup(responseName); else j->responseName=NULL; /* get and store segment code for later use in TAN jobs */ segCode=GWEN_XMLNode_GetProperty(node, "code", ""); free(j->code); if (segCode && *segCode) j->code=strdup(segCode); else j->code=NULL; if (bpd) { bpdgrp=AH_Bpd_GetBpdJobs(bpd, AH_User_GetHbciVersion(u)); assert(bpdgrp); } else bpdgrp=0; if (paramName && *paramName) { GWEN_DB_NODE *jobBPD; GWEN_DB_NODE *jobPT; GWEN_DB_NODE *dbHighestVersion; int highestVersion; DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" needs BPD job \"%s\"", name, paramName); if (!bpd) { DBG_ERROR(AQHBCI_LOGDOMAIN,"No BPD"); AH_Job_free(j); return 0; } /* get BPD job */ jobBPD=GWEN_DB_GetGroup(bpdgrp, GWEN_PATH_FLAGS_NAMEMUSTEXIST, paramName); if (jobBPD) { /* children are one group per version */ jobBPD=GWEN_DB_GetFirstGroup(jobBPD); } jobPT=GWEN_DB_GetGroup(bpdgrp, GWEN_PATH_FLAGS_NAMEMUSTEXIST, segCode); if (jobPT) { /* sample flag NEEDTAN */ needTAN=GWEN_DB_GetIntValue(jobPT, "needTan", 0, needTAN); } /* check for a job for which we have a BPD */ node=NULL; dbHighestVersion=NULL; highestVersion=-1; if (jobVersion) { /* a job version has been selected from outside, look for * the BPD of that particular version */ while(jobBPD) { int version; /* get version from BPD */ version=atoi(GWEN_DB_GroupName(jobBPD)); if (version==jobVersion) { /* now get the correct version of the JOB */ DBG_INFO(AQHBCI_LOGDOMAIN, "Checking Job %s (%d)", name, version); node=GWEN_MsgEngine_FindNodeByProperty(e, "JOB", "id", version, name); if (node) { dbHighestVersion=jobBPD; highestVersion=version; jobNode=node; } } jobBPD=GWEN_DB_GetNextGroup(jobBPD); } /* while */ jobBPD=dbHighestVersion; } else { while(jobBPD) { int version; /* get version from BPD */ version=atoi(GWEN_DB_GroupName(jobBPD)); if (version>highestVersion) { /* now get the correct version of the JOB */ DBG_INFO(AQHBCI_LOGDOMAIN, "Checking Job %s (%d)", name, version); node=GWEN_MsgEngine_FindNodeByProperty(e, "JOB", "id", version, name); if (node) { dbHighestVersion=jobBPD; highestVersion=version; jobNode=node; } } jobBPD=GWEN_DB_GetNextGroup(jobBPD); } /* while */ jobBPD=dbHighestVersion; } if (!jobBPD) { if (needsBPD) { if (AH_User_GetCryptMode(u)!=AH_CryptMode_Pintan && strcasecmp(name, "JobTan")==0) { /* lower loglevel for JobTan in non-PINTAN mode because this is * often confusing */ DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" not supported by your bank", name); } else { /* no BPD when needed, error */ DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"%s\" not supported by your bank", name); } AH_Job_free(j); return 0; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Highest version is %d", highestVersion); GWEN_DB_AddGroupChildren(j->jobParams, jobBPD); /* sample some variables from BPD jobs */ j->segmentVersion=highestVersion; j->minSigs=GWEN_DB_GetIntValue(jobBPD, "minsigs", 0, 0); j->secProfile=GWEN_DB_GetIntValue(jobBPD, "secProfile", 0, 1); j->secClass=GWEN_DB_GetIntValue(jobBPD, "securityClass", 0, 0); j->jobsPerMsg=GWEN_DB_GetIntValue(jobBPD, "jobspermsg", 0, 0); } } /* if paramName */ /* get UPD jobs (if any) */ if (accountId) { GWEN_DB_NODE *updgroup; GWEN_DB_NODE *updnode=NULL; updgroup=AH_User_GetUpd(u); assert(updgroup); updgroup=GWEN_DB_GetGroup(updgroup, GWEN_PATH_FLAGS_NAMEMUSTEXIST, accountId); if (updgroup) { const char *code; code=GWEN_XMLNode_GetProperty(jobNode, "code", 0); if (code) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Code is \"%s\"", code); updnode=GWEN_DB_GetFirstGroup(updgroup); while(updnode) { if (strcasecmp(GWEN_DB_GetCharValue(updnode, "job", 0, ""), code)==0) { break; } updnode=GWEN_DB_GetNextGroup(updnode); } /* while */ } /* if code given */ } /* if updgroup for the given account found */ if (updnode) { GWEN_DB_NODE *dgr; /* upd job found */ dgr=GWEN_DB_GetGroup(j->jobParams, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "upd"); assert(dgr); GWEN_DB_AddGroupChildren(dgr, updnode); } else if (needsBPD) { DBG_INFO(AQHBCI_LOGDOMAIN,"Job \"%s\" not enabled for account \"%s\"", name, accountId); AH_Job_free(j); return NULL; } } /* if accountId given */ /* sample flags from XML file */ if (atoi(GWEN_XMLNode_GetProperty(jobNode, "dlg", "0"))!=0) { j->flags|=AH_JOB_FLAGS_DLGJOB; j->flags|=AH_JOB_FLAGS_SINGLE; } if (atoi(GWEN_XMLNode_GetProperty(jobNode, "attachable", "0"))!=0) j->flags|=AH_JOB_FLAGS_ATTACHABLE; if (atoi(GWEN_XMLNode_GetProperty(jobNode, "single", "0"))!=0) j->flags|=AH_JOB_FLAGS_SINGLE; /* sample other flags */ if (AH_User_GetCryptMode(u)==AH_CryptMode_Pintan) { /* always make jobs single when in PIN/TAN mode */ j->flags|=AH_JOB_FLAGS_SINGLE; } if (needTAN) { j->flags|=AH_JOB_FLAGS_NEEDTAN; DBG_INFO(AQHBCI_LOGDOMAIN, "This job needs a TAN"); } if (noSysId) { j->flags|=AH_JOB_FLAGS_NOSYSID; j->flags|=AH_JOB_FLAGS_SINGLE; } if (noItan) { j->flags|=AH_JOB_FLAGS_NOITAN; } /* get description */ descrNode=GWEN_XMLNode_FindFirstTag(jobNode, "DESCR", 0, 0); if (descrNode) { GWEN_BUFFER *descrBuf; GWEN_XMLNODE *dn; descrBuf=GWEN_Buffer_new(0, 64, 0, 1); dn=GWEN_XMLNode_GetFirstData(descrNode); while(dn) { const char *d; d=GWEN_XMLNode_GetData(dn); if (d) { GWEN_Buffer_AppendString(descrBuf, d); } dn=GWEN_XMLNode_GetNextData(dn); } /* while */ if (GWEN_Buffer_GetUsedBytes(descrBuf)) { j->description=strdup(GWEN_Buffer_GetStart(descrBuf)); } GWEN_Buffer_free(descrBuf); } /* if there is a description */ /* check for multi message job */ msgNode=GWEN_XMLNode_FindFirstTag(jobNode, "MESSAGE", 0, 0); if (msgNode) { /* we have nodes, so this is not a simple case */ DBG_INFO(AQHBCI_LOGDOMAIN, "Multi message job"); /* GWEN_XMLNode_Dump(msgNode, stderr, 2); */ j->flags|=(AH_JOB_FLAGS_MULTIMSG); /* a multi message job must be single, too */ j->flags|=AH_JOB_FLAGS_SINGLE; j->msgNode=msgNode; if (atoi(GWEN_XMLNode_GetProperty(msgNode, "sign", "1"))!=0) { if (j->minSigs==0) j->minSigs=1; j->flags|=(AH_JOB_FLAGS_NEEDSIGN | AH_JOB_FLAGS_SIGN); } if (atoi(GWEN_XMLNode_GetProperty(msgNode, "crypt", "1"))!=0) j->flags|=(AH_JOB_FLAGS_NEEDCRYPT| AH_JOB_FLAGS_CRYPT); if (atoi(GWEN_XMLNode_GetProperty(msgNode, "nosysid", "0"))!=0) j->flags|=AH_JOB_FLAGS_NOSYSID; if (atoi(GWEN_XMLNode_GetProperty(msgNode, "noitan", "0"))!=0) { j->flags|=AH_JOB_FLAGS_NOITAN; } } /* if msgNode */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Single message job"); if (atoi(GWEN_XMLNode_GetProperty(jobNode, "sign", "1"))!=0) { if (j->minSigs==0) j->minSigs=1; j->flags|=(AH_JOB_FLAGS_NEEDSIGN | AH_JOB_FLAGS_SIGN); } if (atoi(GWEN_XMLNode_GetProperty(jobNode, "crypt", "1"))!=0) j->flags|=(AH_JOB_FLAGS_NEEDCRYPT| AH_JOB_FLAGS_CRYPT); } j->flags|=AH_JOB_FLAGS_HASMOREMSGS; j->xmlNode=jobNode; j->segResults=AH_Result_List_new(); j->msgResults=AH_Result_List_new(); j->messages=AB_Message_List_new(); /* check BPD for job specific SEPA descriptors */ if (needsBPD) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(j->jobParams, "SupportedSepaFormats"); if (dbT) { GWEN_STRINGLIST *descriptors; unsigned int i; const char *s; descriptors=GWEN_StringList_new(); while(dbT) { for (i=0; i<10; i++) { s=GWEN_DB_GetCharValue(dbT, "format", i, NULL); if (!(s && *s)) break; GWEN_StringList_AppendString(descriptors, s, 0, 1); } dbT=GWEN_DB_FindNextGroup(dbT, "SupportedSepaFormats"); } if (GWEN_StringList_Count(descriptors)>0) j->sepaDescriptors=descriptors; else GWEN_StringList_free(descriptors); } } AH_Job_Log(j, GWEN_LoggerLevel_Info, "HBCI-Job created"); return j; } void AH_Job_free(AH_JOB *j) { if (j) { assert(j->usage); if (--(j->usage)==0) { AB_Value_free(j->challengeValue); GWEN_StringList_free(j->challengeParams); GWEN_StringList_free(j->log); GWEN_StringList_free(j->signers); GWEN_StringList_free(j->sepaDescriptors); free(j->responseName); free(j->code); free(j->name); free(j->accountId); free(j->dialogId); free(j->expectedSigner); free(j->expectedCrypter); free(j->usedTan); GWEN_MsgEngine_free(j->msgEngine); GWEN_DB_Group_free(j->jobParams); GWEN_DB_Group_free(j->jobArguments); GWEN_DB_Group_free(j->jobResponses); GWEN_DB_Group_free(j->sepaProfile); AH_Result_List_free(j->msgResults); AH_Result_List_free(j->segResults); AB_Message_List_free(j->messages); AB_Transaction_List_free(j->transferList); GWEN_LIST_FINI(AH_JOB, j); GWEN_INHERIT_FINI(AH_JOB, j); GWEN_FREE_OBJECT(j); } } } int AH_Job_SampleBpdVersions(const char *name, AB_USER *u, GWEN_DB_NODE *dbResult) { GWEN_XMLNODE *node; const char *paramName; GWEN_DB_NODE *bpdgrp; const AH_BPD *bpd; GWEN_MSGENGINE *e; assert(name); assert(u); /* get job descriptions */ e=AH_User_GetMsgEngine(u); assert(e); bpd=AH_User_GetBpd(u); if (AH_User_GetHbciVersion(u)==0) GWEN_MsgEngine_SetProtocolVersion(e, 210); else GWEN_MsgEngine_SetProtocolVersion(e, AH_User_GetHbciVersion(u)); GWEN_MsgEngine_SetMode(e, AH_CryptMode_toString(AH_User_GetCryptMode(u))); /* first select any version, we simply need to know the BPD job name */ node=GWEN_MsgEngine_FindNodeByProperty(e, "JOB", "id", 0, name); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" not supported by local XML files", name); return GWEN_ERROR_NOT_FOUND; } /* get some properties */ paramName=GWEN_XMLNode_GetProperty(node, "params", ""); if (bpd) { bpdgrp=AH_Bpd_GetBpdJobs(bpd, AH_User_GetHbciVersion(u)); assert(bpdgrp); } else bpdgrp=NULL; if (paramName && *paramName) { GWEN_DB_NODE *jobBPD; DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" needs BPD job \"%s\"", name, paramName); if (!bpd) { DBG_ERROR(AQHBCI_LOGDOMAIN,"No BPD"); return GWEN_ERROR_BAD_DATA; } /* get BPD job */ jobBPD=GWEN_DB_GetGroup(bpdgrp, GWEN_PATH_FLAGS_NAMEMUSTEXIST, paramName); if (jobBPD) { /* children are one group per version */ jobBPD=GWEN_DB_GetFirstGroup(jobBPD); } /* check for jobs for which we have a BPD */ while(jobBPD) { int version; /* get version from BPD */ version=atoi(GWEN_DB_GroupName(jobBPD)); /* now get the correct version of the JOB */ DBG_INFO(AQHBCI_LOGDOMAIN, "Checking Job %s (%d)", name, version); node=GWEN_MsgEngine_FindNodeByProperty(e, "JOB", "id", version, name); if (node) { GWEN_DB_NODE *cpy; cpy=GWEN_DB_Group_dup(jobBPD); GWEN_DB_AddGroup(dbResult, cpy); } jobBPD=GWEN_DB_GetNextGroup(jobBPD); } /* while */ } /* if paramName */ else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has no BPDs"); return 0; } return 0; } int AH_Job_GetMaxVersionUpUntil(const char *name, AB_USER *u, int maxVersion) { GWEN_DB_NODE *db; int rv; db=GWEN_DB_Group_new("bpd"); rv=AH_Job_SampleBpdVersions(name, u, db); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } else { GWEN_DB_NODE *dbT; int m=-1; /* determine maximum version */ dbT=GWEN_DB_GetFirstGroup(db); while(dbT) { int v; v=atoi(GWEN_DB_GroupName(dbT)); if (v>0 && v>m && v<=maxVersion) m=v; dbT=GWEN_DB_GetNextGroup(dbT); } GWEN_DB_Group_free(db); DBG_INFO(AQHBCI_LOGDOMAIN, "Max version of [%s] up until %d: %d", name, maxVersion, m); return m; } } AB_MESSAGE_LIST *AH_Job_GetMessages(const AH_JOB *j) { assert(j); assert(j->usage); return j->messages; } int AH_Job_GetChallengeClass(const AH_JOB *j) { assert(j); assert(j->usage); return j->challengeClass; } int AH_Job_GetSegmentVersion(const AH_JOB *j) { assert(j); assert(j->usage); return j->segmentVersion; } void AH_Job_SetChallengeClass(AH_JOB *j, int i) { assert(j); assert(j->usage); j->challengeClass=i; } void AH_Job_Attach(AH_JOB *j) { assert(j); assert(j->usage); j->usage++; } int AH_Job_PrepareNextMessage(AH_JOB *j) { assert(j); assert(j->usage); if (j->nextMsgFn) { int rv; rv=j->nextMsgFn(j); if (rv==0) { /* callback flagged that no message follows */ DBG_INFO(AQHBCI_LOGDOMAIN, "Job says: No more messages"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return 0; } else if (rv!=1) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job says: Error"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return rv; } } if (j->status==AH_JobStatusUnknown || j->status==AH_JobStatusError) { DBG_INFO(AQHBCI_LOGDOMAIN, "At least one message had errors, aborting job"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return 0; } if (j->status==AH_JobStatusToDo) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Hmm, job has never been sent, so we do nothing here"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return 0; } if (j->flags & AH_JOB_FLAGS_HASATTACHPOINT) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Job has an attachpoint, so yes, we need more messages"); j->flags|=AH_JOB_FLAGS_HASMOREMSGS; AH_Job_Log(j, GWEN_LoggerLevel_Debug, "Job has an attachpoint"); return 1; } if (!(j->flags & AH_JOB_FLAGS_MULTIMSG)) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Not a Multi-message job, so we don't need more messages"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return 0; } assert(j->msgNode); j->msgNode=GWEN_XMLNode_FindNextTag(j->msgNode, "MESSAGE", 0, 0); if (j->msgNode) { /* there is another message, so set flags accordingly */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Multi-message job, still more messages"); AH_Job_Log(j, GWEN_LoggerLevel_Debug, "Job has more messages"); /* sample some flags for the next message */ if (atoi(GWEN_XMLNode_GetProperty(j->msgNode, "sign", "1"))!=0) { if (j->minSigs==0) j->minSigs=1; j->flags|=(AH_JOB_FLAGS_NEEDSIGN | AH_JOB_FLAGS_SIGN); } else { j->flags&=~(AH_JOB_FLAGS_NEEDSIGN | AH_JOB_FLAGS_SIGN); } if (atoi(GWEN_XMLNode_GetProperty(j->msgNode, "crypt", "1"))!=0) j->flags|=(AH_JOB_FLAGS_NEEDCRYPT| AH_JOB_FLAGS_CRYPT); else j->flags&=~(AH_JOB_FLAGS_NEEDCRYPT| AH_JOB_FLAGS_CRYPT); if (atoi(GWEN_XMLNode_GetProperty(j->msgNode, "nosysid", "0"))!=0) j->flags|=AH_JOB_FLAGS_NOSYSID; else j->flags&=~AH_JOB_FLAGS_NOSYSID; if (atoi(GWEN_XMLNode_GetProperty(j->msgNode, "noitan", "0"))!=0) { j->flags|=AH_JOB_FLAGS_NOITAN; } else j->flags&=~AH_JOB_FLAGS_NOITAN; if (atoi(GWEN_XMLNode_GetProperty(j->msgNode, "ignerrors", "0"))!=0) j->flags|=AH_JOB_FLAGS_IGNORE_ERROR; else j->flags&=~AH_JOB_FLAGS_IGNORE_ERROR; j->flags|=AH_JOB_FLAGS_HASMOREMSGS; return 1; } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Job \"%s\" is finished", j->name); AH_Job_Log(j, GWEN_LoggerLevel_Debug, "Job has no more messages"); j->flags&=~AH_JOB_FLAGS_HASMOREMSGS; return 0; } } uint32_t AH_Job_GetId(const AH_JOB *j){ assert(j); assert(j->usage); return j->id; } void AH_Job_SetId(AH_JOB *j, uint32_t i){ assert(j); assert(j->usage); j->id=i; } const char *AH_Job_GetName(const AH_JOB *j) { assert(j); assert(j->usage); return j->name; } const char *AH_Job_GetCode(const AH_JOB *j) { assert(j); assert(j->usage); return j->code; } const char *AH_Job_GetResponseName(const AH_JOB *j) { assert(j); assert(j->usage); return j->responseName; } int AH_Job_GetMinSignatures(const AH_JOB *j){ assert(j); assert(j->usage); return j->minSigs; } int AH_Job_GetSecurityProfile(const AH_JOB *j){ assert(j); assert(j->usage); return j->secProfile; } int AH_Job_GetSecurityClass(const AH_JOB *j) { assert(j); assert(j->usage); return j->secClass; } int AH_Job_GetJobsPerMsg(const AH_JOB *j){ assert(j); assert(j->usage); return j->jobsPerMsg; } uint32_t AH_Job_GetFlags(const AH_JOB *j) { assert(j); assert(j->usage); return j->flags; } void AH_Job_SetFlags(AH_JOB *j, uint32_t f) { assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Changing flags of job \"%s\" from %08x to %08x", j->name, j->flags, f); j->flags=f; } void AH_Job_AddFlags(AH_JOB *j, uint32_t f){ assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Changing flags of job \"%s\" from %08x to %08x", j->name, j->flags, j->flags|f); j->flags|=f; } void AH_Job_SubFlags(AH_JOB *j, uint32_t f){ assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Changing flags of job \"%s\" from %08x to %08x", j->name, j->flags, j->flags&~f); j->flags&=~f; } GWEN_DB_NODE *AH_Job_GetParams(const AH_JOB *j){ assert(j); assert(j->usage); return j->jobParams; } GWEN_DB_NODE *AH_Job_GetArguments(const AH_JOB *j){ assert(j); assert(j->usage); return j->jobArguments; } GWEN_DB_NODE *AH_Job_GetResponses(const AH_JOB *j){ assert(j); assert(j->usage); return j->jobResponses; } uint32_t AH_Job_GetFirstSegment(const AH_JOB *j){ assert(j); assert(j->usage); return j->firstSegment; } void AH_Job_SetFirstSegment(AH_JOB *j, uint32_t i){ assert(j); assert(j->usage); j->firstSegment=i; } uint32_t AH_Job_GetLastSegment(const AH_JOB *j){ assert(j); assert(j->usage); return j->lastSegment; } void AH_Job_SetLastSegment(AH_JOB *j, uint32_t i){ assert(j); assert(j->usage); j->lastSegment=i; } int AH_Job_HasSegment(const AH_JOB *j, int seg){ assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" checked for %d: first=%d, last=%d", j->name,seg, j->firstSegment, j->lastSegment); return (seg<=j->lastSegment && seg>=j->firstSegment); } void AH_Job_AddResponse(AH_JOB *j, GWEN_DB_NODE *db){ assert(j); assert(j->usage); GWEN_DB_AddGroup(j->jobResponses, db); } AH_JOB_STATUS AH_Job_GetStatus(const AH_JOB *j){ assert(j); assert(j->usage); return j->status; } void AH_Job_SetStatus(AH_JOB *j, AH_JOB_STATUS st){ assert(j); assert(j->usage); if (j->status!=st) { GWEN_BUFFER *lbuf; lbuf=GWEN_Buffer_new(0, 64, 0, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "Changing status of job \"%s\" from \"%s\" (%d) to \"%s\" (%d)", j->name, AH_Job_StatusName(j->status), j->status, AH_Job_StatusName(st), st); GWEN_Buffer_AppendString(lbuf, "Status changed from \""); GWEN_Buffer_AppendString(lbuf, AH_Job_StatusName(j->status)); GWEN_Buffer_AppendString(lbuf, "\" to \""); GWEN_Buffer_AppendString(lbuf, AH_Job_StatusName(st)); GWEN_Buffer_AppendString(lbuf, "\""); AH_Job_Log(j, GWEN_LoggerLevel_Info, GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); j->status=st; } } void AH_Job_AddSigner(AH_JOB *j, const char *s){ GWEN_BUFFER *lbuf; assert(j); assert(j->usage); assert(s); lbuf=GWEN_Buffer_new(0, 128, 0, 1); if (!GWEN_StringList_AppendString(j->signers, s, 0, 1)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Signer \"%s\" already in list", s); GWEN_Buffer_AppendString(lbuf, "Signer \""); GWEN_Text_EscapeToBufferTolerant(s, lbuf); GWEN_Buffer_AppendString(lbuf, "\" already in list"); AH_Job_Log(j, GWEN_LoggerLevel_Warning, GWEN_Buffer_GetStart(lbuf)); } else { GWEN_Buffer_AppendString(lbuf, "Signer \""); GWEN_Text_EscapeToBufferTolerant(s, lbuf); GWEN_Buffer_AppendString(lbuf, "\" added"); AH_Job_Log(j, GWEN_LoggerLevel_Info, GWEN_Buffer_GetStart(lbuf)); } GWEN_Buffer_free(lbuf); j->flags|=AH_JOB_FLAGS_SIGN; } AB_USER *AH_Job_GetUser(const AH_JOB *j){ assert(j); assert(j->usage); return j->user; } const GWEN_STRINGLIST *AH_Job_GetSigners(const AH_JOB *j){ assert(j); assert(j->usage); return j->signers; } GWEN_XMLNODE *AH_Job_GetXmlNode(const AH_JOB *j){ assert(j); assert(j->usage); if (j->flags & AH_JOB_FLAGS_MULTIMSG) { DBG_INFO(AQHBCI_LOGDOMAIN, "Multi message node, returning current message node"); return j->msgNode; } return j->xmlNode; } unsigned int AH_Job_GetMsgNum(const AH_JOB *j){ assert(j); assert(j->usage); return j->msgNum; } const char *AH_Job_GetDialogId(const AH_JOB *j){ assert(j); assert(j->usage); return j->dialogId; } void AH_Job_SetMsgNum(AH_JOB *j, unsigned int i){ assert(j); assert(j->usage); j->msgNum=i; } void AH_Job_SetDialogId(AH_JOB *j, const char *s){ assert(j); assert(j->usage); assert(s); free(j->dialogId); j->dialogId=strdup(s); } const char *AH_Job_StatusName(AH_JOB_STATUS st) { switch(st) { case AH_JobStatusUnknown: return "unknown"; case AH_JobStatusToDo: return "todo"; case AH_JobStatusEnqueued: return "enqueued"; case AH_JobStatusEncoded: return "encoded"; case AH_JobStatusSent: return "sent"; case AH_JobStatusAnswered: return "answered"; case AH_JobStatusError: return "error"; case AH_JobStatusAll: return "any"; default: return "?"; } } const char *AH_Job_GetAccountId(const AH_JOB *j) { assert(j); assert(j->usage); return j->accountId; } int AH_Job_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ assert(j); assert(j->usage); AH_Job_SampleResults(j); if (j->processFn) return j->processFn(j, ctx); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No processFn set"); return AH_Job_DefaultProcessHandler(j); } } int AH_Job_Commit(AH_JOB *j, int doLock){ assert(j); assert(j->usage); if (j->commitFn) return j->commitFn(j, doLock); else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No commitFn set"); return AH_Job_DefaultCommitHandler(j, doLock); } } int AH_Job_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ GWEN_DB_NODE *db; assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging %d (%s)", m, j->name); db=AB_Job_GetProviderData(bj, AH_HBCI_GetProvider(AH_Job_GetHbci(j))); assert(db); switch(m) { case AH_Job_ExchangeModeParams: { AB_USER *u; u=AH_Job_GetUser(j); assert(u); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "customerId", AB_User_GetCustomerId(u)); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankId", AB_User_GetBankCode(u)); break; } case AH_Job_ExchangeModeArgs: /* no generic action here */ break; case AH_Job_ExchangeModeResults: if (GWEN_DB_GetCharValue(db, "msgref/dialogId", 0, 0)==0) { const char *s; GWEN_DB_NODE *dbT; /* don't overwrite existing msgref */ dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "msgref"); assert(dbT); s=AH_Job_GetDialogId(j); if (s) GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialogId", s); GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "msgnum", AH_Job_GetMsgNum(j)); GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "firstseg", AH_Job_GetFirstSegment(j)); GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastseg", AH_Job_GetLastSegment(j)); } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown exchange mode %d", m); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ if (j->exchangeFn) return j->exchangeFn(j, bj, m, ctx); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No exchangeFn set"); return GWEN_ERROR_NOT_SUPPORTED; } } int AH_Job_Prepare(AH_JOB *j){ assert(j); assert(j->usage); if (j->prepareFn) return j->prepareFn(j); else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No prepareFn set"); return GWEN_ERROR_NOT_SUPPORTED; } } int AH_Job_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod) { assert(j); assert(j->usage); if (j->addChallengeParamsFn) return j->addChallengeParamsFn(j, hkTanVer, dbMethod); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No addChallengeParamsFn set"); return GWEN_ERROR_NOT_SUPPORTED; } } void AH_Job_SetProcessFn(AH_JOB *j, AH_JOB_PROCESS_FN f){ assert(j); assert(j->usage); j->processFn=f; } void AH_Job_SetCommitFn(AH_JOB *j, AH_JOB_COMMIT_FN f){ assert(j); assert(j->usage); j->commitFn=f; } void AH_Job_SetExchangeFn(AH_JOB *j, AH_JOB_EXCHANGE_FN f){ assert(j); assert(j->usage); j->exchangeFn=f; } void AH_Job_SetNextMsgFn(AH_JOB *j, AH_JOB_NEXTMSG_FN f){ assert(j); assert(j->usage); j->nextMsgFn=f; } void AH_Job_SetPrepareFn(AH_JOB *j, AH_JOB_PREPARE_FN f) { assert(j); assert(j->usage); j->prepareFn=f; } void AH_Job_SetAddChallengeParamsFn(AH_JOB *j, AH_JOB_ADDCHALLENGEPARAMS_FN f) { assert(j); assert(j->usage); j->addChallengeParamsFn=f; } int AH_Job_HasWarnings(const AH_JOB *j){ assert(j); assert(j->usage); return (j->flags & AH_JOB_FLAGS_HASWARNINGS); } int AH_Job_HasErrors(const AH_JOB *j){ assert(j); assert(j->usage); return (j->status==AH_JobStatusError) || (j->flags & AH_JOB_FLAGS_HASERRORS); } void AH_Job_SampleResults(AH_JOB *j) { GWEN_DB_NODE *dbCurr; assert(j); assert(j->usage); dbCurr=GWEN_DB_GetFirstGroup(j->jobResponses); while(dbCurr) { GWEN_DB_NODE *dbResults; dbResults=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/SegResult"); if (dbResults) { GWEN_DB_NODE *dbRes; dbRes=GWEN_DB_GetFirstGroup(dbResults); while(dbRes) { if (strcasecmp(GWEN_DB_GroupName(dbRes), "result")==0) { AH_RESULT *r; int code; const char *text; code=GWEN_DB_GetIntValue(dbRes, "resultcode", 0, 0); text=GWEN_DB_GetCharValue(dbRes, "text", 0, 0); if (code) { GWEN_BUFFER *lbuf; char numbuf[32]; GWEN_LOGGER_LEVEL ll; if (code>=9000) ll=GWEN_LoggerLevel_Error; else if (code>=3000 && code!=3920) ll=GWEN_LoggerLevel_Warning; else ll=GWEN_LoggerLevel_Info; lbuf=GWEN_Buffer_new(0, 128, 0, 1); GWEN_Buffer_AppendString(lbuf, "SegResult: "); snprintf(numbuf, sizeof(numbuf), "%d", code); GWEN_Buffer_AppendString(lbuf, numbuf); if (text) { GWEN_Buffer_AppendString(lbuf, "("); GWEN_Buffer_AppendString(lbuf, text); GWEN_Buffer_AppendString(lbuf, ")"); } AH_Job_Log(j, ll, GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); } /* found a result */ r=AH_Result_new(code, text, GWEN_DB_GetCharValue(dbRes, "ref", 0, 0), GWEN_DB_GetCharValue(dbRes, "param", 0, 0), 0); AH_Result_List_Add(r, j->segResults); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Segment result:"); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) AH_Result_Dump(r, stderr, 4); /* check result */ if (code>=9000) j->flags|=AH_JOB_FLAGS_HASERRORS; else if (code>=3000 && code<4000) j->flags|=AH_JOB_FLAGS_HASWARNINGS; } /* if result */ dbRes=GWEN_DB_GetNextGroup(dbRes); } /* while */ } /* if segResult */ else { dbResults=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/MsgResult"); if (dbResults) { GWEN_DB_NODE *dbRes; dbRes=GWEN_DB_GetFirstGroup(dbResults); while(dbRes) { if (strcasecmp(GWEN_DB_GroupName(dbRes), "result")==0) { AH_RESULT *r; int code; const char *text; code=GWEN_DB_GetIntValue(dbRes, "resultcode", 0, 0); text=GWEN_DB_GetCharValue(dbRes, "text", 0, 0); if (code) { GWEN_BUFFER *lbuf; char numbuf[32]; GWEN_LOGGER_LEVEL ll; if (code>=9000) ll=GWEN_LoggerLevel_Error; else if (code>=3000) ll=GWEN_LoggerLevel_Warning; else ll=GWEN_LoggerLevel_Info; lbuf=GWEN_Buffer_new(0, 128, 0, 1); GWEN_Buffer_AppendString(lbuf, "MsgResult: "); snprintf(numbuf, sizeof(numbuf), "%d", code); GWEN_Buffer_AppendString(lbuf, numbuf); if (text) { GWEN_Buffer_AppendString(lbuf, "("); GWEN_Buffer_AppendString(lbuf, text); GWEN_Buffer_AppendString(lbuf, ")"); } AH_Job_Log(j, ll, GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); } /* found a result */ r=AH_Result_new(code, text, GWEN_DB_GetCharValue(dbRes, "ref", 0, 0), GWEN_DB_GetCharValue(dbRes, "param", 0, 0), 1); AH_Result_List_Add(r, j->msgResults); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message result:"); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) AH_Result_Dump(r, stderr, 4); /* check result */ if (code>=9000) { /* FIXME: Maybe disable here, let only the segment results * influence the error flags */ j->flags|=AH_JOB_FLAGS_HASERRORS; } else if (code>=3000 && code<4000) j->flags|=AH_JOB_FLAGS_HASWARNINGS; } /* if result */ dbRes=GWEN_DB_GetNextGroup(dbRes); } /* while */ } /* if msgResult */ } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ } const char *AH_Job_GetDescription(const AH_JOB *j){ assert(j); assert(j->usage); if (j->description) return j->description; return j->name; } void AH_Job_Dump(const AH_JOB *j, FILE *f, unsigned int insert) { uint32_t k; for (k=0; kname); for (k=0; kstatus),j->status); for (k=0; kmsgNum); for (k=0; kdialogId); for (k=0; kuser)); } int AH_Job__CommitSystemData(AH_JOB *j, int doLock) { GWEN_DB_NODE *dbCurr; AB_USER *u; AB_BANKING *ab; AH_HBCI *h; const char *p; int i; GWEN_MSGENGINE *e; int bpdDeleted; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Committing data"); assert(j); assert(j->usage); bpdDeleted=0; u=j->user; assert(u); h=AH_Job_GetHbci(j); assert(h); ab=AH_Job_GetBankingApi(j); assert(ab); e=AH_User_GetMsgEngine(j->user); assert(e); dbCurr=GWEN_DB_GetFirstGroup(j->jobResponses); while(dbCurr) { GWEN_DB_NODE *dbRd; dbRd=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data"); if (dbRd) { dbRd=GWEN_DB_GetFirstGroup(dbRd); } if (dbRd) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Checking group \"%s\"", GWEN_DB_GroupName(dbRd)); if (strcasecmp(GWEN_DB_GroupName(dbRd), "bpd")==0){ AH_BPD *bpd; GWEN_DB_NODE *n; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Found BPD"); bpd=AH_User_GetBpd(j->user); AH_Bpd_SetBpdVersion(bpd, GWEN_DB_GetIntValue(dbRd, "version", 0, 0)); /* read bank name */ p=GWEN_DB_GetCharValue(dbRd, "name", 0, 0); if (p) AH_Bpd_SetBankName(bpd, p); AH_Bpd_SetJobTypesPerMsg(bpd, GWEN_DB_GetIntValue(dbRd, "jobtypespermsg", 0, 0)); AH_Bpd_SetMaxMsgSize(bpd, GWEN_DB_GetIntValue(dbRd, "maxmsgsize", 0, 0)); /* read languages */ n=GWEN_DB_GetGroup(dbRd, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "languages"); if (n) { AH_Bpd_ClearLanguages(bpd); for (i=0;;i++) { int k; k=GWEN_DB_GetIntValue(n, "language", i, 0); if (k) { if (AH_Bpd_AddLanguage(bpd, k)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many languages (%d)", i); break; } } else break; } /* for */ } /* if languages */ /* read supported version */ n=GWEN_DB_GetGroup(dbRd, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "versions"); if (n) { AH_Bpd_ClearHbciVersions(bpd); for (i=0;;i++) { int k; k=GWEN_DB_GetIntValue(n, "version", i, 0); if (k) { if (AH_Bpd_AddHbciVersion(bpd, k)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many versions (%d)", i); break; } } else break; } /* for */ } /* if versions */ /* FIXME: remove this AH_Bank_SetBpd(b, AH_Bpd_dup(bpd)); */ if (!bpdDeleted) { AH_Bpd_ClearBpdJobs(bpd); AH_Bpd_ClearAddr(bpd); bpdDeleted=1; } } /* if BPD found */ else if (strcasecmp(GWEN_DB_GroupName(dbRd), "ComData")==0){ /* communication parameters */ GWEN_DB_NODE *currService; AH_BPD *bpd; DBG_INFO(AQHBCI_LOGDOMAIN, "Found communication infos"); bpd=AH_User_GetBpd(j->user); assert(bpd); if (!bpdDeleted) { AH_Bpd_ClearBpdJobs(bpd); AH_Bpd_ClearAddr(bpd); bpdDeleted=1; } currService=GWEN_DB_FindFirstGroup(dbRd, "service"); while(currService) { AH_BPD_ADDR *ba; ba=AH_BpdAddr_FromDb(currService); if (ba) { DBG_INFO(AQHBCI_LOGDOMAIN, "Adding service"); AH_Bpd_AddAddr(bpd, ba); } currService=GWEN_DB_FindNextGroup(currService, "service"); } } /* if ComData found */ else if (strcasecmp(GWEN_DB_GroupName(dbRd), "PinTanBPD")==0){ /* special extension of BPD for PIN/TAN mode */ GWEN_DB_NODE *bn; GWEN_DB_NODE *currJob; AH_BPD *bpd; bpd=AH_User_GetBpd(j->user); assert(bpd); if (!bpdDeleted) { AH_Bpd_ClearBpdJobs(bpd); AH_Bpd_ClearAddr(bpd); bpdDeleted=1; } bn=AH_Bpd_GetBpdJobs(bpd, GWEN_MsgEngine_GetProtocolVersion(e)); assert(bn); currJob=GWEN_DB_FindFirstGroup(dbRd, "job"); while(currJob) { const char *jobName; int needTAN; GWEN_DB_NODE *dbJob; jobName=GWEN_DB_GetCharValue(currJob, "job", 0, 0); assert(jobName); dbJob=GWEN_DB_GetGroup(bn, GWEN_DB_FLAGS_DEFAULT, jobName); assert(dbJob); needTAN=strcasecmp(GWEN_DB_GetCharValue(currJob, "needTan", 0, "N"), "J")==0; GWEN_DB_SetIntValue(dbJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "needTan", needTAN); currJob=GWEN_DB_FindNextGroup(currJob, "job"); } /* while */ } /* if PIN/TAN extension found */ else if (strcasecmp(GWEN_DB_GroupName(dbRd), "SegResult")==0){ GWEN_DB_NODE *dbRes; dbRes=GWEN_DB_GetFirstGroup(dbRd); while(dbRes) { if (strcasecmp(GWEN_DB_GroupName(dbRes), "result")==0) { int code; // const char *text; code=GWEN_DB_GetIntValue(dbRes, "resultcode", 0, 0); // text=GWEN_DB_GetCharValue(dbRes, "text", 0, 0); if (code==3920) { int i; AH_User_ClearTanMethodList(u); for (i=0; ; i++) { int j; j=GWEN_DB_GetIntValue(dbRes, "param", i, 0); if (j==0) break; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Adding allowed TAN method %d", j); AH_User_AddTanMethod(u, j); } /* for */ if (i==0) { /* add single step if empty list */ DBG_INFO(AQHBCI_LOGDOMAIN, "No allowed TAN method reported, assuming 999"); AH_User_AddTanMethod(u, 999); } } } /* if result */ dbRes=GWEN_DB_GetNextGroup(dbRes); } /* while */ } else if (strcasecmp(GWEN_DB_GroupName(dbRd), "GetKeyResponse")==0){ /* TODO: Read the key received and ask the user to accept it */ } else if (strcasecmp(GWEN_DB_GroupName(dbRd), "SecurityMethods")==0){ GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbRd, "SecProfile"); while(dbT) { const char *code; int version; code=GWEN_DB_GetCharValue(dbT, "code", 0, NULL); version=GWEN_DB_GetIntValue(dbT, "version", 0, -1); if (code && (version>0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bank supports mode %s %d", code, version); /* TODO: store possible modes */ } dbT=GWEN_DB_FindNextGroup(dbT, "SecProfile"); } /* while */ } else { GWEN_XMLNODE *bpdn; int segver; /* check for BPD job */ DBG_INFO(AQHBCI_LOGDOMAIN, "Checking whether \"%s\" is a BPD job", GWEN_DB_GroupName(dbRd)); segver=GWEN_DB_GetIntValue(dbRd, "head/version", 0, 0); /* get segment description (first try id, then code) */ bpdn=GWEN_MsgEngine_FindNodeByProperty(e, "SEG", "id", segver, GWEN_DB_GroupName(dbRd)); if (!bpdn) bpdn=GWEN_MsgEngine_FindNodeByProperty(e, "SEG", "code", segver, GWEN_DB_GroupName(dbRd)); if (bpdn) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Found a candidate"); if (atoi(GWEN_XMLNode_GetProperty(bpdn, "isbpdjob", "0"))) { /* segment contains a BPD job, move contents */ GWEN_DB_NODE *bn; AH_BPD *bpd; char numbuffer[32]; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Found BPD job \"%s\"", GWEN_DB_GroupName(dbRd)); bpd=AH_User_GetBpd(j->user); assert(bpd); if (!bpdDeleted) { AH_Bpd_ClearBpdJobs(bpd); AH_Bpd_ClearAddr(bpd); bpdDeleted=1; } bn=AH_Bpd_GetBpdJobs(bpd, GWEN_MsgEngine_GetProtocolVersion(e)); assert(bn); bn=GWEN_DB_GetGroup(bn, GWEN_DB_FLAGS_DEFAULT, GWEN_DB_GroupName(dbRd)); assert(bn); if (GWEN_Text_NumToString(segver, numbuffer, sizeof(numbuffer)-1, 0)<1) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Buffer too small"); abort(); } bn=GWEN_DB_GetGroup(bn, GWEN_DB_FLAGS_OVERWRITE_GROUPS, numbuffer); assert(bn); GWEN_DB_AddGroupChildren(bn, dbRd); /* remove "head" and "segment" group */ GWEN_DB_DeleteGroup(bn, "head"); GWEN_DB_DeleteGroup(bn, "segment"); DBG_INFO(AQHBCI_LOGDOMAIN, "Added BPD Job %s:%d", GWEN_DB_GroupName(dbRd), segver); } /* if isbpdjob */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"%s\" is known but not as a BPD job", GWEN_DB_GroupName(dbRd)); } } /* if segment found */ else { DBG_WARN(AQHBCI_LOGDOMAIN, "Did not find segment \"%s\" (%d) ignoring", GWEN_DB_GroupName(dbRd), segver); } } if (strcasecmp(GWEN_DB_GroupName(dbRd), "UserData")==0){ /* UserData found */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Found UserData"); AH_User_SetUpdVersion(j->user, GWEN_DB_GetIntValue(dbRd, "version", 0, 0)); } else if (strcasecmp(GWEN_DB_GroupName(dbRd), "AccountData")==0 || strcasecmp(GWEN_DB_GroupName(dbRd), "AccountData2")==0){ const char *accountId; const char *accountSuffix; const char *userName; const char *accountName; const char *bankCode; const char *custId; const char *iban; AB_ACCOUNT *acc; GWEN_DB_NODE *gr; AH_BPD *bpd; GWEN_DB_NODE *dbUpd; int accCreated; int mayModifyAcc=1; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Found AccountData"); AH_Job_Log(j, GWEN_LoggerLevel_Info, "Job contains account data"); /* account data found */ accountId=GWEN_DB_GetCharValue(dbRd, "accountId", 0, 0); if (accountId==NULL) accountId=I18N("AH_JOB|-- no account id --"); accountSuffix=GWEN_DB_GetCharValue(dbRd, "accountSubId", 0, 0); accountName=GWEN_DB_GetCharValue(dbRd, "account/name", 0, 0); userName=GWEN_DB_GetCharValue(dbRd, "name1", 0, 0); iban=GWEN_DB_GetCharValue(dbRd, "iban", 0, 0); bankCode=GWEN_DB_GetCharValue(dbRd, "bankCode", 0, 0); if (bankCode==NULL) bankCode=I18N("AH_JOB|-- no bank code --"); assert(bankCode); custId=GWEN_DB_GetCharValue(dbRd, "customer", 0, 0); assert(custId); if (1) { GWEN_BUFFER *mbuf; mbuf=GWEN_Buffer_new(0, 128, 0, 1); GWEN_Buffer_AppendString(mbuf, I18N("Received account:")); GWEN_Buffer_AppendString(mbuf, " "); GWEN_Buffer_AppendString(mbuf, bankCode); GWEN_Buffer_AppendString(mbuf, " / "); if (accountName) GWEN_Buffer_AppendString(mbuf, accountName); else GWEN_Buffer_AppendString(mbuf, accountId); if (accountSuffix) { GWEN_Buffer_AppendString(mbuf, "("); GWEN_Buffer_AppendString(mbuf, accountSuffix); GWEN_Buffer_AppendString(mbuf, ")"); } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, GWEN_Buffer_GetStart(mbuf)); GWEN_Buffer_free(mbuf); } acc=AB_Banking_FindAccount(ab, AH_PROVIDER_NAME, "de", /* TODO: get country */ bankCode, accountId, accountSuffix); if (acc) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Account \"%s\" already exists", accountId); accCreated=0; rv=AB_Banking_BeginExclUseAccount(ab, acc); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv); mayModifyAcc=0; } else mayModifyAcc=1; } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating account \"%s\"", accountId); accCreated=1; mayModifyAcc=1; acc=AB_Banking_CreateAccount(ab, AH_PROVIDER_NAME); assert(acc); AB_Account_SetCountry(acc, "de"); AB_Account_SetBankCode(acc, bankCode); AB_Account_SetAccountNumber(acc, accountId); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting user \"%s\" for account \"%s\"", AB_User_GetUserId(u), accountId); AB_Account_SetUser(acc, j->user); AB_Account_SetSelectedUser(acc, j->user); } if (mayModifyAcc) { /* modify account */ if (accountName) AB_Account_SetAccountName(acc, accountName); if (userName) AB_Account_SetOwnerName(acc, userName); if (iban) AB_Account_SetIBAN(acc, iban); if (accountSuffix && *accountSuffix) AB_Account_SetSubAccountId(acc, accountSuffix); if (strcasecmp(GWEN_DB_GroupName(dbRd), "AccountData2")==0) { /* KTV in version 2 available */ AH_Account_AddFlags(acc, AH_BANK_FLAGS_KTV2); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Extended account information is available"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Extended account information available")); } else { AH_Account_SubFlags(acc, AH_BANK_FLAGS_KTV2); DBG_WARN(AQHBCI_LOGDOMAIN, "Extended account information is not available, some jobs might not work"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, I18N("Extended account information is not available, some jobs might not work")); } /* set bank name */ bpd=AH_User_GetBpd(j->user); if (bpd) { const char *s; s=AH_Bpd_GetBankName(bpd); if (s) AB_Account_SetBankName(acc, s); } /* get UPD jobs */ dbUpd=AH_User_GetUpd(j->user); assert(dbUpd); dbUpd=GWEN_DB_GetGroup(dbUpd, GWEN_DB_FLAGS_OVERWRITE_GROUPS, accountId); assert(dbUpd); gr=GWEN_DB_GetFirstGroup(dbRd); while(gr) { if (strcasecmp(GWEN_DB_GroupName(gr), "updjob")==0) { /* found an upd job */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Adding UPD job"); GWEN_DB_AddGroup(dbUpd, GWEN_DB_Group_dup(gr)); } gr=GWEN_DB_GetNextGroup(gr); } /* while */ } if (accCreated) AB_Banking_AddAccount(ab, acc); else { if (mayModifyAcc) { rv=AB_Banking_EndExclUseAccount(ab, acc, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_EndExclUseAccount(ab, acc, 1); /* abort */ } } } } /* if accountData */ if (strcasecmp(GWEN_DB_GroupName(dbRd), "BankMsg")==0){ const char *subject; const char *text; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Found a bank message"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Bank message received")); subject=GWEN_DB_GetCharValue(dbRd, "subject", 0, "(Kein Betreff)"); text=GWEN_DB_GetCharValue(dbRd, "text", 0, 0); if (subject && text) { AB_MESSAGE *amsg; GWEN_TIME *ti; ti=GWEN_CurrentTime(); amsg=AB_Message_new(); AB_Message_SetSubject(amsg, subject); AB_Message_SetText(amsg, text); AB_Message_SetDateReceived(amsg, ti); GWEN_Time_free(ti); AB_Message_SetUserId(amsg, AB_User_GetUniqueId(u)); AB_Message_List_Add(amsg, j->messages); if (1) { GWEN_DB_NODE *dbTmp; /* save message, later this will no longer be necessary */ dbTmp=GWEN_DB_Group_new("bank message"); GWEN_DB_SetCharValue(dbTmp, GWEN_DB_FLAGS_OVERWRITE_VARS, "subject", subject); GWEN_DB_SetCharValue(dbTmp, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", text); if (AH_HBCI_SaveMessage(h, j->user, dbTmp)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save this message:"); GWEN_DB_Dump(dbTmp, 2); } GWEN_DB_Group_free(dbTmp); } } /* if subject and text given */ } /* if bank msg */ } /* if response data found */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Finished."); return 0; } int AH_Job_CommitSystemData(AH_JOB *j, int doLock) { AB_USER *u; AB_BANKING *ab; int rv, rv2; u=j->user; assert(u); ab=AH_Job_GetBankingApi(j); assert(ab); /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } /* commit data */ rv2=AH_Job__CommitSystemData(j, doLock); if (doLock) { /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_EndExclUseUser(ab, u, 1); /* abandon */ return rv; } } return rv2; } int AH_Job_HasItanResult(AH_JOB *j) { GWEN_DB_NODE *dbCurr; assert(j); assert(j->usage); dbCurr=GWEN_DB_GetFirstGroup(j->jobResponses); while(dbCurr) { GWEN_DB_NODE *dbRd; dbRd=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data"); if (dbRd) { dbRd=GWEN_DB_GetFirstGroup(dbRd); } if (dbRd) { if (strcasecmp(GWEN_DB_GroupName(dbRd), "SegResult")==0){ GWEN_DB_NODE *dbRes; dbRes=GWEN_DB_GetFirstGroup(dbRd); while(dbRes) { if (strcasecmp(GWEN_DB_GroupName(dbRes), "result")==0) { int code; // const char *text; code=GWEN_DB_GetIntValue(dbRes, "resultcode", 0, 0); // text=GWEN_DB_GetCharValue(dbRes, "text", 0, 0); if (code==3920) { return 1; } } /* if result */ dbRes=GWEN_DB_GetNextGroup(dbRes); } /* while */ } } /* if response data found */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ return 0; /* no iTAN response */ } int AH_Job_DefaultProcessHandler(AH_JOB *j){ assert(j); assert(j->usage); if (j->flags & AH_JOB_FLAGS_PROCESSED) { DBG_WARN(AQHBCI_LOGDOMAIN, "Already processed job \"%s\"", j->name); return 0; } return 0; } int AH_Job_DefaultCommitHandler(AH_JOB *j, int doLock){ int rv; assert(j); assert(j->usage); if (j->flags & AH_JOB_FLAGS_COMMITTED) { DBG_WARN(AQHBCI_LOGDOMAIN, "Already committed job \"%s\"", j->name); return 0; } rv=AH_Job_CommitSystemData(j, doLock); j->flags|=AH_JOB_FLAGS_COMMITTED; return rv; } AH_JOB *AH_Job__freeAll_cb(AH_JOB *j, void *userData) { assert(j); assert(j->usage); AH_Job_free(j); return 0; } void AH_Job_List2_FreeAll(AH_JOB_LIST2 *jl){ AH_Job_List2_ForEach(jl, AH_Job__freeAll_cb, 0); AH_Job_List2_free(jl); } AH_HBCI *AH_Job_GetHbci(const AH_JOB *j){ assert(j); assert(j->usage); return AH_User_GetHbci(j->user); } AB_BANKING *AH_Job_GetBankingApi(const AH_JOB *j){ AH_HBCI *hbci; assert(j); assert(j->usage); hbci=AH_Job_GetHbci(j); assert(hbci); return AH_HBCI_GetBankingApi(hbci); } AH_RESULT_LIST *AH_Job_GetSegResults(const AH_JOB *j){ assert(j); assert(j->usage); return j->segResults; } AH_RESULT_LIST *AH_Job_GetMsgResults(const AH_JOB *j){ assert(j); assert(j->usage); return j->msgResults; } const char *AH_Job_GetExpectedSigner(const AH_JOB *j){ assert(j); assert(j->usage); return j->expectedSigner; } void AH_Job_SetExpectedSigner(AH_JOB *j, const char *s){ assert(j); assert(j->usage); free(j->expectedSigner); if (s) j->expectedSigner=strdup(s); else j->expectedSigner=0; } const char *AH_Job_GetExpectedCrypter(const AH_JOB *j){ assert(j); assert(j->usage); return j->expectedCrypter; } void AH_Job_SetExpectedCrypter(AH_JOB *j, const char *s){ assert(j); assert(j->usage); free(j->expectedCrypter); if (s) j->expectedCrypter=strdup(s); else j->expectedCrypter=0; } int AH_Job_CheckEncryption(AH_JOB *j, GWEN_DB_NODE *dbRsp) { if (AH_User_GetCryptMode(j->user)==AH_CryptMode_Pintan) { DBG_INFO(AQHBCI_LOGDOMAIN, "Not checking security in PIN/TAN mode"); } else { GWEN_DB_NODE *dbSecurity; const char *s; assert(j); assert(j->usage); assert(dbRsp); dbSecurity=GWEN_DB_GetGroup(dbRsp, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "security"); if (!dbSecurity) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No security settings, should not happen"); GWEN_Gui_ProgressLog( 0, GWEN_LoggerLevel_Error, I18N("Response without security info (internal)")); return AB_ERROR_SECURITY; } s=GWEN_DB_GetCharValue(dbSecurity, "crypter", 0, 0); if (s) { if (*s=='!' || *s=='?') { DBG_ERROR(AQHBCI_LOGDOMAIN, "Encrypted with invalid key (%s)", s); GWEN_Gui_ProgressLog( 0, GWEN_LoggerLevel_Error, I18N("Response encrypted with invalid key")); return AB_ERROR_SECURITY; } } if (j->expectedCrypter) { /* check crypter */ if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Response is not encrypted (but expected to be)"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Response is not encrypted as expected")); return AB_ERROR_SECURITY; } if (strcasecmp(s, j->expectedCrypter)!=0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Not encrypted with the expected key " "(exp: \"%s\", is: \"%s\"", j->expectedCrypter, s); /* GWEN_Gui_ProgressLog( 0, GWEN_LoggerLevel_Error, I18N("Response not encrypted with expected key")); return AB_ERROR_SECURITY; */ } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Encrypted as expected"); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No encryption expected"); } } return 0; } int AH_Job_CheckSignature(AH_JOB *j, GWEN_DB_NODE *dbRsp) { if (AH_User_GetCryptMode(j->user)==AH_CryptMode_Pintan) { DBG_INFO(AQHBCI_LOGDOMAIN, "Not checking signature in PIN/TAN mode"); } else { GWEN_DB_NODE *dbSecurity; int i; uint32_t uFlags; assert(j); assert(j->usage); uFlags=AH_User_GetFlags(j->user); assert(dbRsp); dbSecurity=GWEN_DB_GetGroup(dbRsp, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "security"); if (!dbSecurity) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No security settings, should not happen"); GWEN_Gui_ProgressLog( 0, GWEN_LoggerLevel_Error, I18N("Response without security info (internal)")); return GWEN_ERROR_GENERIC; } /* check for invalid signers */ for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(dbSecurity, "signer", i, 0); if (!s) break; if (*s=='!') { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature found, will not tolerate it"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Invalid bank signature")); return AB_ERROR_SECURITY; } } /* for */ if (j->expectedSigner && !(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { /* check signer */ for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(dbSecurity, "signer", i, 0); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not signed by expected signer (%d)", i); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Response not signed by the bank")); if (i==0) { int but; /* check whether the user want's to accept the unsigned message */ but=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_CONFIRM_B1 | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Security Warning"), I18N( "The HBCI response of the bank has not been signed by the bank, \n" "contrary to what has been expected. This can be the case because the \n" "bank just stopped signing their HBCI responses. This error message \n" "would also occur if there were a replay attack against your computer \n" "in progress right now, which is probably quite unlikely. \n" " \n" "Please contact your bank and ask them whether their HBCI server \n" "stopped signing the HBCI responses. If the bank is concerned about \n" "your security, it should not stop signing the HBCI responses. \n" " \n" "Do you nevertheless want to accept this response this time or always?" "

" "The HBCI response of the bank has not been signed by the bank, \n" "contrary to what has been expected. This can be the case because the \n" "bank just stopped signing their HBCI responses. This error message \n" "would also occur if there were a replay attack against your computer \n" "in progress right now, which is probably quite unlikely. \n" "

" "Please contact your bank and ask them whether their HBCI server \n" "stopped signing the HBCI responses. If the bank is concerned about \n" "your security, it should not stop signing the HBCI responses. \n" "

" "Do you nevertheless want to accept this response this time or always?" "

" ), I18N("Accept this time"), I18N("Accept always"), I18N("Abort"), 0); if (but==1) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("User accepts this unsigned " "response")); AH_Job_SetExpectedSigner(j, 0); break; } else if (but==2) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("User accepts all further unsigned " "responses")); AH_User_AddFlags(j->user, AH_USER_FLAGS_BANK_DOESNT_SIGN); AH_Job_SetExpectedSigner(j, 0); break; } else { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Aborted")); return AB_ERROR_SECURITY; } } else { int ii; DBG_ERROR(AQHBCI_LOGDOMAIN, "Job signed with unexpected key(s)" "(was expecting \"%s\"):", j->expectedSigner); for (ii=0; ; ii++) { s=GWEN_DB_GetCharValue(dbSecurity, "signer", ii, 0); if (!s) break; DBG_ERROR(AQHBCI_LOGDOMAIN, "Signed unexpectedly with key \"%s\"", s); } return AB_ERROR_SECURITY; } } else { if (strcasecmp(s, j->expectedSigner)==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Jobs signed as expected with \"%s\"", j->expectedSigner); break; } else if (*s!='!' && *s!='?') { DBG_INFO(AQHBCI_LOGDOMAIN, "Signer name does not match expected name (%s!=%s), " "but we accept it anyway", s, j->expectedSigner); break; } } } /* for */ DBG_INFO(AQHBCI_LOGDOMAIN, "Signature check ok"); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No signature expected"); } } return 0; } const char *AH_Job_GetUsedTan(const AH_JOB *j){ assert(j); assert(j->usage); return j->usedTan; } void AH_Job_SetUsedTan(AH_JOB *j, const char *s){ assert(j); assert(j->usage); DBG_INFO(AQHBCI_LOGDOMAIN, "Changing TAN in job [%s](%08x) from [%s] to [%s]", j->name, j->id, (j->usedTan)?(j->usedTan):"(empty)", s?s:"(empty)"); free(j->usedTan); if (s) { j->usedTan=strdup(s); } else j->usedTan=0; } void AH_Job_Log(AH_JOB *j, GWEN_LOGGER_LEVEL ll, const char *txt) { char buffer[32]; GWEN_TIME *ti; GWEN_BUFFER *lbuf; assert(j); lbuf=GWEN_Buffer_new(0, 128, 0, 1); snprintf(buffer, sizeof(buffer), "%02d", ll); GWEN_Buffer_AppendString(lbuf, buffer); GWEN_Buffer_AppendByte(lbuf, ':'); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, "YYYYMMDD:hhmmss:", lbuf); GWEN_Time_free(ti); GWEN_Text_EscapeToBufferTolerant(AH_PROVIDER_NAME, lbuf); GWEN_Buffer_AppendByte(lbuf, ':'); GWEN_Text_EscapeToBufferTolerant(txt, lbuf); GWEN_StringList_AppendString(j->log, GWEN_Buffer_GetStart(lbuf), 0, 0); GWEN_Buffer_free(lbuf); } const GWEN_STRINGLIST *AH_Job_GetLogs(const AH_JOB *j) { assert(j); return j->log; } GWEN_STRINGLIST *AH_Job_GetChallengeParams(const AH_JOB *j) { assert(j); return j->challengeParams; } void AH_Job_ClearChallengeParams(AH_JOB *j) { assert(j); GWEN_StringList_Clear(j->challengeParams); } void AH_Job_AddChallengeParam(AH_JOB *j, const char *s) { assert(j); GWEN_StringList_AppendString(j->challengeParams, s, 0, 0); } const AB_VALUE *AH_Job_GetChallengeValue(const AH_JOB *j) { assert(j); return j->challengeValue; } void AH_Job_SetChallengeValue(AH_JOB *j, const AB_VALUE *v) { assert(j); AB_Value_free(j->challengeValue); if (v) j->challengeValue=AB_Value_dup(v); else j->challengeValue=NULL; } void AH_Job_ValueToChallengeString(const AB_VALUE *v, GWEN_BUFFER *buf) { AB_Value_toHbciString(v, buf); } int AH_Job_GetTransferCount(AH_JOB *j) { assert(j); return j->transferCount; } void AH_Job_IncTransferCount(AH_JOB *j) { assert(j); j->transferCount++; } int AH_Job_GetMaxTransfers(AH_JOB *j) { assert(j); return j->maxTransfers; } void AH_Job_SetMaxTransfers(AH_JOB *j, int i) { assert(j); j->maxTransfers=i; } AB_TRANSACTION_LIST *AH_Job_GetTransferList(const AH_JOB *j) { assert(j); return j->transferList; } AB_TRANSACTION *AH_Job_GetFirstTransfer(const AH_JOB *j) { assert(j); if (j->transferList==NULL) return NULL; return AB_Transaction_List_First(j->transferList); } void AH_Job_AddTransfer(AH_JOB *j, AB_TRANSACTION *t) { assert(j); if (j->transferList==NULL) j->transferList=AB_Transaction_List_new(); AB_Transaction_List_Add(t, j->transferList); j->transferCount++; } static int AH_Job__SepaProfileSupported(GWEN_DB_NODE *profile, const GWEN_STRINGLIST *descriptors) { GWEN_STRINGLISTENTRY *se; char pattern[13]; const char *s; /* patterns shall always have the form *xxx.yyy.zz* */ pattern[0]=pattern[11]='*'; pattern[12]='\0'; /* Well formed type strings are exactly 10 characters long. Others * will either not match or be rejected by the exporter. */ strncpy(pattern+1, GWEN_DB_GetCharValue(profile, "type", 0, ""), 10); se=GWEN_StringList_FirstEntry(descriptors); while(se) { s=GWEN_StringListEntry_Data(se); if (s && GWEN_Text_ComparePattern(s, pattern, 1)!=-1) { /* record the descriptor matching this profile */ GWEN_DB_SetCharValue(profile, GWEN_DB_FLAGS_OVERWRITE_VARS, "descriptor", s); break; } se=GWEN_StringListEntry_Next(se); } if (se) return 1; else return 0; } static int AH_Job__SortSepaProfiles(const void *a, const void *b) { GWEN_DB_NODE **ppa=(GWEN_DB_NODE **)a; GWEN_DB_NODE **ppb=(GWEN_DB_NODE **)b; GWEN_DB_NODE *pa=*ppa; GWEN_DB_NODE *pb=*ppb; int res; /* This function is supposed to return a list of profiles in order * of decreasing precedence. */ res=strcmp(GWEN_DB_GetCharValue(pb, "type", 0, ""), GWEN_DB_GetCharValue(pa, "type", 0, "")); if (res) return res; res=strcmp(GWEN_DB_GetCharValue(pb, "name", 0, ""), GWEN_DB_GetCharValue(pa, "name", 0, "")); return res; } GWEN_DB_NODE *AH_Job_FindSepaProfile(AH_JOB *j, const char *type, const char *name) { const GWEN_STRINGLIST *descriptors; GWEN_DB_NODE *dbProfiles; assert(j); if (j->sepaDescriptors) descriptors=j->sepaDescriptors; else descriptors=AH_User_GetSepaDescriptors(j->user); if (GWEN_StringList_Count(descriptors)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No SEPA descriptor found, please update your account information"); return NULL; } if (name) { GWEN_DB_NODE *profile; profile=AB_Banking_GetImExporterProfile(AH_Job_GetBankingApi(j), "sepa", name); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Profile \"%s\" not available", name); return NULL; } if (GWEN_Text_ComparePattern(GWEN_DB_GetCharValue(profile, "type", 0, ""), type, 1)==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Profile \"%s\" does not match type speecification (\"%s\")", name, type); return NULL; } if (!AH_Job__SepaProfileSupported(profile, descriptors)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Profile \"%s\" not supported by bank server", name); return NULL; } j->sepaProfile=profile; return profile; } if (!type) return j->sepaProfile; if (j->sepaProfile) { if (GWEN_Text_ComparePattern(GWEN_DB_GetCharValue(j->sepaProfile, "type", 0, ""), type, 1)!=-1) return j->sepaProfile; else { GWEN_DB_Group_free(j->sepaProfile); j->sepaProfile=NULL; } } dbProfiles=AB_Banking_GetImExporterProfiles(AH_Job_GetBankingApi(j), "sepa"); if (dbProfiles) { GWEN_DB_NODE *n, *nn; unsigned int pCount=0; n=GWEN_DB_GetFirstGroup(dbProfiles); while(n) { nn=n; n=GWEN_DB_GetNextGroup(n); if (GWEN_Text_ComparePattern(GWEN_DB_GetCharValue(nn, "type", 0, ""), type, 1)!=-1 && AH_Job__SepaProfileSupported(nn, descriptors)) pCount++; else { GWEN_DB_UnlinkGroup(nn); GWEN_DB_Group_free(nn); } } if (pCount) { GWEN_DB_NODE **orderedProfiles; unsigned int i; orderedProfiles=malloc(pCount*sizeof(GWEN_DB_NODE *)); assert(orderedProfiles); n=GWEN_DB_GetFirstGroup(dbProfiles); for (i=0; isepaProfile=orderedProfiles[0]; free(orderedProfiles); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No supported SEPA format found for job \"%s\"", j->name); } GWEN_DB_Group_free(dbProfiles); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No SEPA profiles found"); } return j->sepaProfile; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/tanmethod.c0000644000175000017500000003502412364015477023760 00000000000000/* This file is auto-generated from "tanmethod.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "tanmethod_p.h" #include #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AH_TAN_METHOD) GWEN_LIST_FUNCTIONS(AH_TAN_METHOD, AH_TanMethod) GWEN_LIST2_FUNCTIONS(AH_TAN_METHOD, AH_TanMethod) AH_TAN_METHOD *AH_TanMethod_new() { AH_TAN_METHOD *st; GWEN_NEW_OBJECT(AH_TAN_METHOD, st) st->_usage=1; GWEN_INHERIT_INIT(AH_TAN_METHOD, st) GWEN_LIST_INIT(AH_TAN_METHOD, st) return st; } void AH_TanMethod_free(AH_TAN_METHOD *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { GWEN_INHERIT_FINI(AH_TAN_METHOD, st) if (st->methodId) free(st->methodId); if (st->methodName) free(st->methodName); if (st->zkaTanName) free(st->zkaTanName); if (st->zkaTanVersion) free(st->zkaTanVersion); if (st->formatId) free(st->formatId); if (st->prompt) free(st->prompt); GWEN_LIST_FINI(AH_TAN_METHOD, st) GWEN_FREE_OBJECT(st); } } } AH_TAN_METHOD *AH_TanMethod_dup(const AH_TAN_METHOD *d) { AH_TAN_METHOD *st; assert(d); st=AH_TanMethod_new(); st->function=d->function; st->process=d->process; if (d->methodId) st->methodId=strdup(d->methodId); if (d->methodName) st->methodName=strdup(d->methodName); if (d->zkaTanName) st->zkaTanName=strdup(d->zkaTanName); if (d->zkaTanVersion) st->zkaTanVersion=strdup(d->zkaTanVersion); st->tanMaxLen=d->tanMaxLen; if (d->formatId) st->formatId=strdup(d->formatId); if (d->prompt) st->prompt=strdup(d->prompt); st->returnMaxLen=d->returnMaxLen; st->maxActiveLists=d->maxActiveLists; st->multiTanAllowed=d->multiTanAllowed; st->timeShiftAllowed=d->timeShiftAllowed; st->tanListMode=d->tanListMode; st->stornoAllowed=d->stornoAllowed; st->needSmsAccount=d->needSmsAccount; st->needLocalAccount=d->needLocalAccount; st->needChallengeClass=d->needChallengeClass; st->needChallengeAmount=d->needChallengeAmount; st->challengeIsStructured=d->challengeIsStructured; st->initMode=d->initMode; st->needTanMediumId=d->needTanMediumId; st->maxActiveTanMedia=d->maxActiveTanMedia; st->gvVersion=d->gvVersion; return st; } int AH_TanMethod_toDb(const AH_TAN_METHOD *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "function", st->function)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "process", st->process)) return -1; if (st->methodId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "methodId", st->methodId)) return -1; if (st->methodName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "methodName", st->methodName)) return -1; if (st->zkaTanName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "zkaTanName", st->zkaTanName)) return -1; if (st->zkaTanVersion) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "zkaTanVersion", st->zkaTanVersion)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanMaxLen", st->tanMaxLen)) return -1; if (st->formatId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "formatId", st->formatId)) return -1; if (st->prompt) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "prompt", st->prompt)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "returnMaxLen", st->returnMaxLen)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxActiveLists", st->maxActiveLists)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "multiTanAllowed", st->multiTanAllowed)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "timeShiftAllowed", st->timeShiftAllowed)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanListMode", st->tanListMode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "stornoAllowed", st->stornoAllowed)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needSmsAccount", st->needSmsAccount)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needLocalAccount", st->needLocalAccount)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needChallengeClass", st->needChallengeClass)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needChallengeAmount", st->needChallengeAmount)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "challengeIsStructured", st->challengeIsStructured)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "initMode", st->initMode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needTanMediumId", st->needTanMediumId)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxActiveTanMedia", st->maxActiveTanMedia)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "gvVersion", st->gvVersion)) return -1; return 0; } int AH_TanMethod_ReadDb(AH_TAN_METHOD *st, GWEN_DB_NODE *db) { assert(st); assert(db); AH_TanMethod_SetFunction(st, GWEN_DB_GetIntValue(db, "function", 0, 0)); AH_TanMethod_SetProcess(st, GWEN_DB_GetIntValue(db, "process", 0, 0)); AH_TanMethod_SetMethodId(st, GWEN_DB_GetCharValue(db, "methodId", 0, 0)); AH_TanMethod_SetMethodName(st, GWEN_DB_GetCharValue(db, "methodName", 0, 0)); AH_TanMethod_SetZkaTanName(st, GWEN_DB_GetCharValue(db, "zkaTanName", 0, 0)); AH_TanMethod_SetZkaTanVersion(st, GWEN_DB_GetCharValue(db, "zkaTanVersion", 0, 0)); AH_TanMethod_SetTanMaxLen(st, GWEN_DB_GetIntValue(db, "tanMaxLen", 0, 0)); AH_TanMethod_SetFormatId(st, GWEN_DB_GetCharValue(db, "formatId", 0, 0)); AH_TanMethod_SetPrompt(st, GWEN_DB_GetCharValue(db, "prompt", 0, 0)); AH_TanMethod_SetReturnMaxLen(st, GWEN_DB_GetIntValue(db, "returnMaxLen", 0, 0)); AH_TanMethod_SetMaxActiveLists(st, GWEN_DB_GetIntValue(db, "maxActiveLists", 0, 0)); AH_TanMethod_SetMultiTanAllowed(st, GWEN_DB_GetIntValue(db, "multiTanAllowed", 0, 0)); AH_TanMethod_SetTimeShiftAllowed(st, GWEN_DB_GetIntValue(db, "timeShiftAllowed", 0, 0)); AH_TanMethod_SetTanListMode(st, GWEN_DB_GetIntValue(db, "tanListMode", 0, 0)); AH_TanMethod_SetStornoAllowed(st, GWEN_DB_GetIntValue(db, "stornoAllowed", 0, 0)); AH_TanMethod_SetNeedSmsAccount(st, GWEN_DB_GetIntValue(db, "needSmsAccount", 0, 0)); AH_TanMethod_SetNeedLocalAccount(st, GWEN_DB_GetIntValue(db, "needLocalAccount", 0, 0)); AH_TanMethod_SetNeedChallengeClass(st, GWEN_DB_GetIntValue(db, "needChallengeClass", 0, 0)); AH_TanMethod_SetNeedChallengeAmount(st, GWEN_DB_GetIntValue(db, "needChallengeAmount", 0, 0)); AH_TanMethod_SetChallengeIsStructured(st, GWEN_DB_GetIntValue(db, "challengeIsStructured", 0, 0)); AH_TanMethod_SetInitMode(st, GWEN_DB_GetIntValue(db, "initMode", 0, 0)); AH_TanMethod_SetNeedTanMediumId(st, GWEN_DB_GetIntValue(db, "needTanMediumId", 0, 0)); AH_TanMethod_SetMaxActiveTanMedia(st, GWEN_DB_GetIntValue(db, "maxActiveTanMedia", 0, 0)); AH_TanMethod_SetGvVersion(st, GWEN_DB_GetIntValue(db, "gvVersion", 0, 0)); return 0; } AH_TAN_METHOD *AH_TanMethod_fromDb(GWEN_DB_NODE *db) { AH_TAN_METHOD *st; assert(db); st=AH_TanMethod_new(); AH_TanMethod_ReadDb(st, db); st->_modified=0; return st; } int AH_TanMethod_GetFunction(const AH_TAN_METHOD *st) { assert(st); return st->function; } void AH_TanMethod_SetFunction(AH_TAN_METHOD *st, int d) { assert(st); st->function=d; st->_modified=1; } int AH_TanMethod_GetProcess(const AH_TAN_METHOD *st) { assert(st); return st->process; } void AH_TanMethod_SetProcess(AH_TAN_METHOD *st, int d) { assert(st); st->process=d; st->_modified=1; } const char *AH_TanMethod_GetMethodId(const AH_TAN_METHOD *st) { assert(st); return st->methodId; } void AH_TanMethod_SetMethodId(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->methodId) free(st->methodId); if (d && *d) st->methodId=strdup(d); else st->methodId=0; st->_modified=1; } const char *AH_TanMethod_GetMethodName(const AH_TAN_METHOD *st) { assert(st); return st->methodName; } void AH_TanMethod_SetMethodName(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->methodName) free(st->methodName); if (d && *d) st->methodName=strdup(d); else st->methodName=0; st->_modified=1; } const char *AH_TanMethod_GetZkaTanName(const AH_TAN_METHOD *st) { assert(st); return st->zkaTanName; } void AH_TanMethod_SetZkaTanName(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->zkaTanName) free(st->zkaTanName); if (d && *d) st->zkaTanName=strdup(d); else st->zkaTanName=0; st->_modified=1; } const char *AH_TanMethod_GetZkaTanVersion(const AH_TAN_METHOD *st) { assert(st); return st->zkaTanVersion; } void AH_TanMethod_SetZkaTanVersion(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->zkaTanVersion) free(st->zkaTanVersion); if (d && *d) st->zkaTanVersion=strdup(d); else st->zkaTanVersion=0; st->_modified=1; } int AH_TanMethod_GetTanMaxLen(const AH_TAN_METHOD *st) { assert(st); return st->tanMaxLen; } void AH_TanMethod_SetTanMaxLen(AH_TAN_METHOD *st, int d) { assert(st); st->tanMaxLen=d; st->_modified=1; } const char *AH_TanMethod_GetFormatId(const AH_TAN_METHOD *st) { assert(st); return st->formatId; } void AH_TanMethod_SetFormatId(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->formatId) free(st->formatId); if (d && *d) st->formatId=strdup(d); else st->formatId=0; st->_modified=1; } const char *AH_TanMethod_GetPrompt(const AH_TAN_METHOD *st) { assert(st); return st->prompt; } void AH_TanMethod_SetPrompt(AH_TAN_METHOD *st, const char *d) { assert(st); if (st->prompt) free(st->prompt); if (d && *d) st->prompt=strdup(d); else st->prompt=0; st->_modified=1; } int AH_TanMethod_GetReturnMaxLen(const AH_TAN_METHOD *st) { assert(st); return st->returnMaxLen; } void AH_TanMethod_SetReturnMaxLen(AH_TAN_METHOD *st, int d) { assert(st); st->returnMaxLen=d; st->_modified=1; } int AH_TanMethod_GetMaxActiveLists(const AH_TAN_METHOD *st) { assert(st); return st->maxActiveLists; } void AH_TanMethod_SetMaxActiveLists(AH_TAN_METHOD *st, int d) { assert(st); st->maxActiveLists=d; st->_modified=1; } int AH_TanMethod_GetMultiTanAllowed(const AH_TAN_METHOD *st) { assert(st); return st->multiTanAllowed; } void AH_TanMethod_SetMultiTanAllowed(AH_TAN_METHOD *st, int d) { assert(st); st->multiTanAllowed=d; st->_modified=1; } int AH_TanMethod_GetTimeShiftAllowed(const AH_TAN_METHOD *st) { assert(st); return st->timeShiftAllowed; } void AH_TanMethod_SetTimeShiftAllowed(AH_TAN_METHOD *st, int d) { assert(st); st->timeShiftAllowed=d; st->_modified=1; } int AH_TanMethod_GetTanListMode(const AH_TAN_METHOD *st) { assert(st); return st->tanListMode; } void AH_TanMethod_SetTanListMode(AH_TAN_METHOD *st, int d) { assert(st); st->tanListMode=d; st->_modified=1; } int AH_TanMethod_GetStornoAllowed(const AH_TAN_METHOD *st) { assert(st); return st->stornoAllowed; } void AH_TanMethod_SetStornoAllowed(AH_TAN_METHOD *st, int d) { assert(st); st->stornoAllowed=d; st->_modified=1; } int AH_TanMethod_GetNeedSmsAccount(const AH_TAN_METHOD *st) { assert(st); return st->needSmsAccount; } void AH_TanMethod_SetNeedSmsAccount(AH_TAN_METHOD *st, int d) { assert(st); st->needSmsAccount=d; st->_modified=1; } int AH_TanMethod_GetNeedLocalAccount(const AH_TAN_METHOD *st) { assert(st); return st->needLocalAccount; } void AH_TanMethod_SetNeedLocalAccount(AH_TAN_METHOD *st, int d) { assert(st); st->needLocalAccount=d; st->_modified=1; } int AH_TanMethod_GetNeedChallengeClass(const AH_TAN_METHOD *st) { assert(st); return st->needChallengeClass; } void AH_TanMethod_SetNeedChallengeClass(AH_TAN_METHOD *st, int d) { assert(st); st->needChallengeClass=d; st->_modified=1; } int AH_TanMethod_GetNeedChallengeAmount(const AH_TAN_METHOD *st) { assert(st); return st->needChallengeAmount; } void AH_TanMethod_SetNeedChallengeAmount(AH_TAN_METHOD *st, int d) { assert(st); st->needChallengeAmount=d; st->_modified=1; } int AH_TanMethod_GetChallengeIsStructured(const AH_TAN_METHOD *st) { assert(st); return st->challengeIsStructured; } void AH_TanMethod_SetChallengeIsStructured(AH_TAN_METHOD *st, int d) { assert(st); st->challengeIsStructured=d; st->_modified=1; } int AH_TanMethod_GetInitMode(const AH_TAN_METHOD *st) { assert(st); return st->initMode; } void AH_TanMethod_SetInitMode(AH_TAN_METHOD *st, int d) { assert(st); st->initMode=d; st->_modified=1; } int AH_TanMethod_GetNeedTanMediumId(const AH_TAN_METHOD *st) { assert(st); return st->needTanMediumId; } void AH_TanMethod_SetNeedTanMediumId(AH_TAN_METHOD *st, int d) { assert(st); st->needTanMediumId=d; st->_modified=1; } int AH_TanMethod_GetMaxActiveTanMedia(const AH_TAN_METHOD *st) { assert(st); return st->maxActiveTanMedia; } void AH_TanMethod_SetMaxActiveTanMedia(AH_TAN_METHOD *st, int d) { assert(st); st->maxActiveTanMedia=d; st->_modified=1; } int AH_TanMethod_GetGvVersion(const AH_TAN_METHOD *st) { assert(st); return st->gvVersion; } void AH_TanMethod_SetGvVersion(AH_TAN_METHOD *st, int d) { assert(st); st->gvVersion=d; st->_modified=1; } int AH_TanMethod_IsModified(const AH_TAN_METHOD *st) { assert(st); return st->_modified; } void AH_TanMethod_SetModified(AH_TAN_METHOD *st, int i) { assert(st); st->_modified=i; } void AH_TanMethod_Attach(AH_TAN_METHOD *st) { assert(st); st->_usage++; } AH_TAN_METHOD *AH_TanMethod_List2__freeAll_cb(AH_TAN_METHOD *st, void *user_data) { AH_TanMethod_free(st); return 0; } void AH_TanMethod_List2_freeAll(AH_TAN_METHOD_LIST2 *stl) { if (stl) { AH_TanMethod_List2_ForEach(stl, AH_TanMethod_List2__freeAll_cb, 0); AH_TanMethod_List2_free(stl); } } AH_TAN_METHOD_LIST *AH_TanMethod_List_dup(const AH_TAN_METHOD_LIST *stl) { if (stl) { AH_TAN_METHOD_LIST *nl; AH_TAN_METHOD *e; nl=AH_TanMethod_List_new(); e=AH_TanMethod_List_First(stl); while(e) { AH_TAN_METHOD *ne; ne=AH_TanMethod_dup(e); assert(ne); AH_TanMethod_List_Add(ne, nl); e=AH_TanMethod_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/Makefile.in0000644000175000017500000006453112643540057023700 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/joblayer DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libhbcijob_la_LIBADD = am_libhbcijob_la_OBJECTS = job.lo jobqueue.lo result.lo tanmethod.lo libhbcijob_la_OBJECTS = $(am_libhbcijob_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libhbcijob_la_SOURCES) DIST_SOURCES = $(libhbcijob_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../msglayer -I$(srcdir)/.. typefiles = tanmethod.xml EXTRA_DIST = $(typefiles) noinst_LTLIBRARIES = libhbcijob.la noinst_HEADERS = \ job_l.h \ job_p.h \ jobqueue_l.h \ jobqueue_p.h \ result_l.h \ result_p.h \ tanmethod_l.h \ tanmethod_p.h iheaderdir = @aqbanking_headerdir_am@/aqhbci iheader_HEADERS = \ tanmethod.h libhbcijob_la_SOURCES = \ job.c \ jobqueue.c \ result.c \ tanmethod.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/joblayer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/joblayer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libhbcijob.la: $(libhbcijob_la_OBJECTS) $(libhbcijob_la_DEPENDENCIES) $(EXTRA_libhbcijob_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libhbcijob_la_OBJECTS) $(libhbcijob_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/result.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tanmethod.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS types: $(typefiles) $(gwenhywfar_bindir)/typemaker -d AQHBCI_API $(typefiles) sources: for f in $(libhbcijob_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/tanmethod_p.h0000644000175000017500000000161512364015477024303 00000000000000/* This file is auto-generated from "tanmethod.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TANMETHOD_P_H #define TANMETHOD_P_H #include "tanmethod_l.h" struct AH_TAN_METHOD { GWEN_INHERIT_ELEMENT(AH_TAN_METHOD) GWEN_LIST_ELEMENT(AH_TAN_METHOD) int _usage; int _modified; int function; int process; char *methodId; char *methodName; char *zkaTanName; char *zkaTanVersion; int tanMaxLen; char *formatId; char *prompt; int returnMaxLen; int maxActiveLists; int multiTanAllowed; int timeShiftAllowed; int tanListMode; int stornoAllowed; int needSmsAccount; int needLocalAccount; int needChallengeClass; int needChallengeAmount; int challengeIsStructured; int initMode; int needTanMediumId; int maxActiveTanMedia; int gvVersion; }; #endif /* TANMETHOD_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/Makefile.am0000644000175000017500000000141112364015477023656 00000000000000 AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../msglayer -I$(srcdir)/.. typefiles=tanmethod.xml EXTRA_DIST=$(typefiles) noinst_LTLIBRARIES=libhbcijob.la noinst_HEADERS=\ job_l.h \ job_p.h \ jobqueue_l.h \ jobqueue_p.h \ result_l.h \ result_p.h \ tanmethod_l.h \ tanmethod_p.h iheaderdir=@aqbanking_headerdir_am@/aqhbci iheader_HEADERS=\ tanmethod.h libhbcijob_la_SOURCES=\ job.c \ jobqueue.c \ result.c \ tanmethod.c types: $(typefiles) $(gwenhywfar_bindir)/typemaker -d AQHBCI_API $(typefiles) sources: for f in $(libhbcijob_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/tanmethod_l.h0000644000175000017500000000100412364015477024267 00000000000000/* This file is auto-generated from "tanmethod.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TANMETHOD_L_H #define TANMETHOD_L_H /** @page P_AH_TAN_METHOD_LIB AH_TanMethod (lib) This page describes the properties of AH_TAN_METHOD This group represents a TAN method within AqHBCI. */ #include "tanmethod.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TANMETHOD_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/result_l.h0000644000175000017500000000273712364015477023640 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_RESULT_L_H #define AH_RESULT_L_H #include #include typedef struct AH_RESULT AH_RESULT; GWEN_LIST_FUNCTION_DEFS(AH_RESULT, AH_Result); AH_RESULT *AH_Result_new(int code, const char *text, const char *ref, const char *param, int isMsgResult); void AH_Result_free(AH_RESULT *r); AH_RESULT *AH_Result_dup(const AH_RESULT *or); int AH_Result_GetCode(const AH_RESULT *r); const char *AH_Result_GetText(const AH_RESULT *r); const char *AH_Result_GetRef(const AH_RESULT *r); const char *AH_Result_GetParam(const AH_RESULT *r); int AH_Result_IsError(const AH_RESULT *r); int AH_Result_IsWarning(const AH_RESULT *r); int AH_Result_IsInfo(const AH_RESULT *r); int AH_Result_IsOk(const AH_RESULT *r); int AH_Result_IsMsgResult(const AH_RESULT *r); void AH_Result_Dump(const AH_RESULT *r, FILE *f, unsigned int insert); #endif /* AH_RESULT_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/tanmethod.h0000644000175000017500000003144512364015477023770 00000000000000/* This file is auto-generated from "tanmethod.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TANMETHOD_H #define TANMETHOD_H /** @page P_AH_TAN_METHOD_PUBLIC AH_TanMethod (public) This page describes the properties of AH_TAN_METHOD This group represents a TAN method within AqHBCI. @anchor AH_TAN_METHOD_Function

Function

Set this property with @ref AH_TanMethod_SetFunction, get it with @ref AH_TanMethod_GetFunction

@anchor AH_TAN_METHOD_Process

Process

Set this property with @ref AH_TanMethod_SetProcess, get it with @ref AH_TanMethod_GetProcess

@anchor AH_TAN_METHOD_MethodId

MethodId

Set this property with @ref AH_TanMethod_SetMethodId, get it with @ref AH_TanMethod_GetMethodId

@anchor AH_TAN_METHOD_MethodName

MethodName

Set this property with @ref AH_TanMethod_SetMethodName, get it with @ref AH_TanMethod_GetMethodName

@anchor AH_TAN_METHOD_ZkaTanName

ZkaTanName

Set this property with @ref AH_TanMethod_SetZkaTanName, get it with @ref AH_TanMethod_GetZkaTanName

@anchor AH_TAN_METHOD_ZkaTanVersion

ZkaTanVersion

Set this property with @ref AH_TanMethod_SetZkaTanVersion, get it with @ref AH_TanMethod_GetZkaTanVersion

@anchor AH_TAN_METHOD_TanMaxLen

TanMaxLen

Set this property with @ref AH_TanMethod_SetTanMaxLen, get it with @ref AH_TanMethod_GetTanMaxLen

@anchor AH_TAN_METHOD_FormatId

FormatId

Set this property with @ref AH_TanMethod_SetFormatId, get it with @ref AH_TanMethod_GetFormatId

@anchor AH_TAN_METHOD_Prompt

Prompt

Set this property with @ref AH_TanMethod_SetPrompt, get it with @ref AH_TanMethod_GetPrompt

@anchor AH_TAN_METHOD_ReturnMaxLen

ReturnMaxLen

Set this property with @ref AH_TanMethod_SetReturnMaxLen, get it with @ref AH_TanMethod_GetReturnMaxLen

@anchor AH_TAN_METHOD_MaxActiveLists

MaxActiveLists

Set this property with @ref AH_TanMethod_SetMaxActiveLists, get it with @ref AH_TanMethod_GetMaxActiveLists

@anchor AH_TAN_METHOD_MultiTanAllowed

MultiTanAllowed

Set this property with @ref AH_TanMethod_SetMultiTanAllowed, get it with @ref AH_TanMethod_GetMultiTanAllowed

@anchor AH_TAN_METHOD_TimeShiftAllowed

TimeShiftAllowed

Set this property with @ref AH_TanMethod_SetTimeShiftAllowed, get it with @ref AH_TanMethod_GetTimeShiftAllowed

@anchor AH_TAN_METHOD_TanListMode

TanListMode

Set this property with @ref AH_TanMethod_SetTanListMode, get it with @ref AH_TanMethod_GetTanListMode

@anchor AH_TAN_METHOD_StornoAllowed

StornoAllowed

Set this property with @ref AH_TanMethod_SetStornoAllowed, get it with @ref AH_TanMethod_GetStornoAllowed

@anchor AH_TAN_METHOD_NeedSmsAccount

NeedSmsAccount

Set this property with @ref AH_TanMethod_SetNeedSmsAccount, get it with @ref AH_TanMethod_GetNeedSmsAccount

@anchor AH_TAN_METHOD_NeedLocalAccount

NeedLocalAccount

Set this property with @ref AH_TanMethod_SetNeedLocalAccount, get it with @ref AH_TanMethod_GetNeedLocalAccount

@anchor AH_TAN_METHOD_NeedChallengeClass

NeedChallengeClass

Set this property with @ref AH_TanMethod_SetNeedChallengeClass, get it with @ref AH_TanMethod_GetNeedChallengeClass

@anchor AH_TAN_METHOD_NeedChallengeAmount

NeedChallengeAmount

Set this property with @ref AH_TanMethod_SetNeedChallengeAmount, get it with @ref AH_TanMethod_GetNeedChallengeAmount

@anchor AH_TAN_METHOD_ChallengeIsStructured

ChallengeIsStructured

Set this property with @ref AH_TanMethod_SetChallengeIsStructured, get it with @ref AH_TanMethod_GetChallengeIsStructured

@anchor AH_TAN_METHOD_InitMode

InitMode

Set this property with @ref AH_TanMethod_SetInitMode, get it with @ref AH_TanMethod_GetInitMode

@anchor AH_TAN_METHOD_NeedTanMediumId

NeedTanMediumId

Set this property with @ref AH_TanMethod_SetNeedTanMediumId, get it with @ref AH_TanMethod_GetNeedTanMediumId

@anchor AH_TAN_METHOD_MaxActiveTanMedia

MaxActiveTanMedia

Set this property with @ref AH_TanMethod_SetMaxActiveTanMedia, get it with @ref AH_TanMethod_GetMaxActiveTanMedia

@anchor AH_TAN_METHOD_GvVersion

GvVersion

Set this property with @ref AH_TanMethod_SetGvVersion, get it with @ref AH_TanMethod_GetGvVersion

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AH_TAN_METHOD AH_TAN_METHOD; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include #include /* pre-headers */ #include #ifdef __cplusplus extern "C" { #endif GWEN_INHERIT_FUNCTION_LIB_DEFS(AH_TAN_METHOD, AQHBCI_API) GWEN_LIST_FUNCTION_LIB_DEFS(AH_TAN_METHOD, AH_TanMethod, AQHBCI_API) AQHBCI_API AH_TAN_METHOD_LIST *AH_TanMethod_List_dup(const AH_TAN_METHOD_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AH_TAN_METHOD, AH_TanMethod, AQHBCI_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQHBCI_API void AH_TanMethod_List2_freeAll(AH_TAN_METHOD_LIST2 *stl); /** Creates a new object. */ AQHBCI_API AH_TAN_METHOD *AH_TanMethod_new(); /** Creates an object from the data in the given GWEN_DB_NODE */ AQHBCI_API AH_TAN_METHOD *AH_TanMethod_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQHBCI_API AH_TAN_METHOD *AH_TanMethod_dup(const AH_TAN_METHOD*st); /** Destroys the given object. */ AQHBCI_API void AH_TanMethod_free(AH_TAN_METHOD *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQHBCI_API void AH_TanMethod_Attach(AH_TAN_METHOD *st); /** Reads data from a GWEN_DB. */ AQHBCI_API int AH_TanMethod_ReadDb(AH_TAN_METHOD *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQHBCI_API int AH_TanMethod_toDb(const AH_TAN_METHOD*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQHBCI_API int AH_TanMethod_IsModified(const AH_TAN_METHOD *st); /** Sets the modified state of the given object */ AQHBCI_API void AH_TanMethod_SetModified(AH_TAN_METHOD *st, int i); /** * Returns the property @ref AH_TAN_METHOD_Function */ AQHBCI_API int AH_TanMethod_GetFunction(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_Function */ AQHBCI_API void AH_TanMethod_SetFunction(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_Process */ AQHBCI_API int AH_TanMethod_GetProcess(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_Process */ AQHBCI_API void AH_TanMethod_SetProcess(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_MethodId */ AQHBCI_API const char *AH_TanMethod_GetMethodId(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_MethodId */ AQHBCI_API void AH_TanMethod_SetMethodId(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_MethodName */ AQHBCI_API const char *AH_TanMethod_GetMethodName(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_MethodName */ AQHBCI_API void AH_TanMethod_SetMethodName(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_ZkaTanName */ AQHBCI_API const char *AH_TanMethod_GetZkaTanName(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_ZkaTanName */ AQHBCI_API void AH_TanMethod_SetZkaTanName(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_ZkaTanVersion */ AQHBCI_API const char *AH_TanMethod_GetZkaTanVersion(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_ZkaTanVersion */ AQHBCI_API void AH_TanMethod_SetZkaTanVersion(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_TanMaxLen */ AQHBCI_API int AH_TanMethod_GetTanMaxLen(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_TanMaxLen */ AQHBCI_API void AH_TanMethod_SetTanMaxLen(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_FormatId */ AQHBCI_API const char *AH_TanMethod_GetFormatId(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_FormatId */ AQHBCI_API void AH_TanMethod_SetFormatId(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_Prompt */ AQHBCI_API const char *AH_TanMethod_GetPrompt(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_Prompt */ AQHBCI_API void AH_TanMethod_SetPrompt(AH_TAN_METHOD *el, const char *d); /** * Returns the property @ref AH_TAN_METHOD_ReturnMaxLen */ AQHBCI_API int AH_TanMethod_GetReturnMaxLen(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_ReturnMaxLen */ AQHBCI_API void AH_TanMethod_SetReturnMaxLen(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_MaxActiveLists */ AQHBCI_API int AH_TanMethod_GetMaxActiveLists(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_MaxActiveLists */ AQHBCI_API void AH_TanMethod_SetMaxActiveLists(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_MultiTanAllowed */ AQHBCI_API int AH_TanMethod_GetMultiTanAllowed(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_MultiTanAllowed */ AQHBCI_API void AH_TanMethod_SetMultiTanAllowed(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_TimeShiftAllowed */ AQHBCI_API int AH_TanMethod_GetTimeShiftAllowed(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_TimeShiftAllowed */ AQHBCI_API void AH_TanMethod_SetTimeShiftAllowed(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_TanListMode */ AQHBCI_API int AH_TanMethod_GetTanListMode(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_TanListMode */ AQHBCI_API void AH_TanMethod_SetTanListMode(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_StornoAllowed */ AQHBCI_API int AH_TanMethod_GetStornoAllowed(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_StornoAllowed */ AQHBCI_API void AH_TanMethod_SetStornoAllowed(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_NeedSmsAccount */ AQHBCI_API int AH_TanMethod_GetNeedSmsAccount(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_NeedSmsAccount */ AQHBCI_API void AH_TanMethod_SetNeedSmsAccount(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_NeedLocalAccount */ AQHBCI_API int AH_TanMethod_GetNeedLocalAccount(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_NeedLocalAccount */ AQHBCI_API void AH_TanMethod_SetNeedLocalAccount(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_NeedChallengeClass */ AQHBCI_API int AH_TanMethod_GetNeedChallengeClass(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_NeedChallengeClass */ AQHBCI_API void AH_TanMethod_SetNeedChallengeClass(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_NeedChallengeAmount */ AQHBCI_API int AH_TanMethod_GetNeedChallengeAmount(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_NeedChallengeAmount */ AQHBCI_API void AH_TanMethod_SetNeedChallengeAmount(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_ChallengeIsStructured */ AQHBCI_API int AH_TanMethod_GetChallengeIsStructured(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_ChallengeIsStructured */ AQHBCI_API void AH_TanMethod_SetChallengeIsStructured(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_InitMode */ AQHBCI_API int AH_TanMethod_GetInitMode(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_InitMode */ AQHBCI_API void AH_TanMethod_SetInitMode(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_NeedTanMediumId */ AQHBCI_API int AH_TanMethod_GetNeedTanMediumId(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_NeedTanMediumId */ AQHBCI_API void AH_TanMethod_SetNeedTanMediumId(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_MaxActiveTanMedia */ AQHBCI_API int AH_TanMethod_GetMaxActiveTanMedia(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_MaxActiveTanMedia */ AQHBCI_API void AH_TanMethod_SetMaxActiveTanMedia(AH_TAN_METHOD *el, int d); /** * Returns the property @ref AH_TAN_METHOD_GvVersion */ AQHBCI_API int AH_TanMethod_GetGvVersion(const AH_TAN_METHOD *el); /** * Set the property @ref AH_TAN_METHOD_GvVersion */ AQHBCI_API void AH_TanMethod_SetGvVersion(AH_TAN_METHOD *el, int d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TANMETHOD_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/joblayer/result_p.h0000644000175000017500000000134512364015477023636 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_RESULT_P_H #define AH_RESULT_P_H #include "result_l.h" struct AH_RESULT { GWEN_LIST_ELEMENT(AH_RESULT); int code; char *text; char *ref; char *param; int isMsgResult; }; #endif /* AH_RESULT_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/Makefile.in0000644000175000017500000011710012643540057022060 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testlib$(EXEEXT) subdir = src/plugins/backends/aqhbci/plugin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/aqhbci.xml.in $(srcdir)/header.xml.in \ $(srcdir)/version.h.in $(top_srcdir)/depcomp \ $(iheader_HEADERS) $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = aqhbci.xml header.xml version.h CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" \ "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(xmldatadir)" \ "$(DESTDIR)$(iheaderdir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) \ $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = aqhbci_la_DEPENDENCIES = libaqhbciplugin.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_aqhbci_la_OBJECTS = dummy.lo aqhbci_la_OBJECTS = $(am_aqhbci_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqhbci_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(aqhbci_la_LDFLAGS) $(LDFLAGS) -o $@ libaqhbci_la_DEPENDENCIES = msglayer/libhbcimsg.la \ joblayer/libhbcijob.la ajobs/libhbciaccjobs.la \ applayer/libhbciapp.la banking/libhbcibanking.la \ dialogs/libaqhbci_dlgs.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libaqhbci_la_OBJECTS = aqhbci.lo libaqhbci_la_OBJECTS = $(am_libaqhbci_la_OBJECTS) libaqhbci_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libaqhbci_la_LDFLAGS) $(LDFLAGS) -o $@ libaqhbciplugin_la_DEPENDENCIES = libaqhbci.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libaqhbciplugin_la_OBJECTS = aqhbci-plugin.lo libaqhbciplugin_la_OBJECTS = $(am_libaqhbciplugin_la_OBJECTS) PROGRAMS = $(noinst_PROGRAMS) am_testlib_OBJECTS = testlib.$(OBJEXT) testlib_OBJECTS = $(am_testlib_OBJECTS) testlib_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqhbci_la_SOURCES) $(libaqhbci_la_SOURCES) \ $(libaqhbciplugin_la_SOURCES) $(testlib_SOURCES) DIST_SOURCES = $(aqhbci_la_SOURCES) $(libaqhbci_la_SOURCES) \ $(libaqhbciplugin_la_SOURCES) $(testlib_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(plugin_DATA) $(xmldata_DATA) HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = msglayer joblayer ajobs applayer banking dialogs AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ EXTRA_DIST = aqhbci.xml.in header.xml.in INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(srcdir)/joblayer BUILT_SOURCES = version.h CLEANFILES = $(BUILT_SOURCES) hbci.xml plugindir = $(aqbanking_plugindir)/providers plugin_LTLIBRARIES = aqhbci.la plugin_DATA = aqhbci.xml iheaderdir = @aqbanking_headerdir_am@/aqhbci iheader_HEADERS = aqhbci.h noinst_HEADERS = aqhbci_l.h xmldatadir = $(aqbanking_pkgdatadir)/backends/aqhbci xmldata_DATA = hbci.xml # libaqhbci lib_LTLIBRARIES = libaqhbci.la libaqhbci_la_SOURCES = aqhbci.c libaqhbci_la_LIBADD = \ msglayer/libhbcimsg.la \ joblayer/libhbcijob.la \ ajobs/libhbciaccjobs.la \ applayer/libhbciapp.la \ banking/libhbcibanking.la \ dialogs/libaqhbci_dlgs.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqhbci_la_LDFLAGS = -no-undefined \ -version-info @AQHBCI_SO_CURRENT@:@AQHBCI_SO_REVISION@:@AQHBCI_SO_AGE@ # AqHBCI plugin library noinst_LTLIBRARIES = libaqhbciplugin.la libaqhbciplugin_la_SOURCES = aqhbci-plugin.c libaqhbciplugin_la_LIBADD = \ libaqhbci.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) # AqHBCI module aqhbci_la_SOURCES = dummy.c aqhbci_la_LIBADD = \ libaqhbciplugin.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) aqhbci_la_LDFLAGS = -no-undefined -module -avoid-version testlib_SOURCES = testlib.c testlib_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): aqhbci.xml: $(top_builddir)/config.status $(srcdir)/aqhbci.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ header.xml: $(top_builddir)/config.status $(srcdir)/header.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ version.h: $(top_builddir)/config.status $(srcdir)/version.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } aqhbci.la: $(aqhbci_la_OBJECTS) $(aqhbci_la_DEPENDENCIES) $(EXTRA_aqhbci_la_DEPENDENCIES) $(AM_V_CCLD)$(aqhbci_la_LINK) -rpath $(plugindir) $(aqhbci_la_OBJECTS) $(aqhbci_la_LIBADD) $(LIBS) libaqhbci.la: $(libaqhbci_la_OBJECTS) $(libaqhbci_la_DEPENDENCIES) $(EXTRA_libaqhbci_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqhbci_la_LINK) -rpath $(libdir) $(libaqhbci_la_OBJECTS) $(libaqhbci_la_LIBADD) $(LIBS) libaqhbciplugin.la: $(libaqhbciplugin_la_OBJECTS) $(libaqhbciplugin_la_DEPENDENCIES) $(EXTRA_libaqhbciplugin_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libaqhbciplugin_la_OBJECTS) $(libaqhbciplugin_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testlib$(EXEEXT): $(testlib_OBJECTS) $(testlib_DEPENDENCIES) $(EXTRA_testlib_DEPENDENCIES) @rm -f testlib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testlib_OBJECTS) $(testlib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aqhbci-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aqhbci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pluginDATA: $(plugin_DATA) @$(NORMAL_INSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(plugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(plugindir)" || exit $$?; \ done uninstall-pluginDATA: @$(NORMAL_UNINSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(plugindir)'; $(am__uninstall_files_from_dir) install-xmldataDATA: $(xmldata_DATA) @$(NORMAL_INSTALL) @list='$(xmldata_DATA)'; test -n "$(xmldatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xmldatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xmldatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xmldatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xmldatadir)" || exit $$?; \ done uninstall-xmldataDATA: @$(NORMAL_UNINSTALL) @list='$(xmldata_DATA)'; test -n "$(xmldatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xmldatadir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(xmldatadir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-iheaderHEADERS install-pluginDATA \ install-pluginLTLIBRARIES install-xmldataDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-iheaderHEADERS uninstall-libLTLIBRARIES \ uninstall-pluginDATA uninstall-pluginLTLIBRARIES \ uninstall-xmldataDATA .MAKE: $(am__recursive_targets) all check install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ clean-pluginLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-pluginDATA install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip install-xmldataDATA \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-iheaderHEADERS uninstall-libLTLIBRARIES \ uninstall-pluginDATA uninstall-pluginLTLIBRARIES \ uninstall-xmldataDATA hbci.xml: header.xml applayer/xml/base.xml ajobs/accountjobs.xml $(XMLMERGE) --compact --header -v header.xml applayer/xml/base.xml ajobs/accountjobs.xml -o $@ sources: for f in $(libaqhbci_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: $(BUILT_SOURCES) # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/version.h.in0000644000175000017500000000166512364015477022271 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_VERSION_H #define AQHBCI_VERSION_H #define AQHBCI_VERSION_MAJOR @AQHBCI_VERSION_MAJOR@ #define AQHBCI_VERSION_MINOR @AQHBCI_VERSION_MINOR@ #define AQHBCI_VERSION_PATCHLEVEL @AQHBCI_VERSION_PATCHLEVEL@ #define AQHBCI_VERSION_BUILD @AQHBCI_VERSION_BUILD@ #define AQHBCI_VERSION_TAG "@AQHBCI_VERSION_TAG@" #define AQHBCI_VERSION_FULL_STRING "@AQHBCI_VERSION_FULL_STRING@" #define AQHBCI_VERSION_STRING "@AQHBCI_VERSION_STRING@" #endif /* AQHBCI_VERSION_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/aqhbci.c0000644000175000017500000000236012364015477021412 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "aqhbci_l.h" #include AH_CRYPT_MODE AH_CryptMode_fromString(const char *s) { if (strcasecmp(s, "none")==0) return AH_CryptMode_None; else if (strcasecmp(s, "ddv")==0) return AH_CryptMode_Ddv; else if (strcasecmp(s, "pintan")==0) return AH_CryptMode_Pintan; else if (strcasecmp(s, "rdh")==0) return AH_CryptMode_Rdh; else return AH_CryptMode_Unknown; } const char *AH_CryptMode_toString(AH_CRYPT_MODE v) { switch(v) { case AH_CryptMode_None: return "none"; case AH_CryptMode_Ddv: return "ddv"; case AH_CryptMode_Pintan: return "pintan"; case AH_CryptMode_Rdh: return "rdh"; default: return "unknown"; } } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/aqhbci.xml.in0000644000175000017500000000044212364015477022374 00000000000000 @AQHBCI_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) HBCI backend using AqHBCI This backend provides support for HBCI using AqHBCI. aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/testlib.c0000644000175000017500000001637212364015477021641 00000000000000 #undef BUILDING_AQHBCI #include #include #include #include #include #include #include #include #include #include #include #if 0 static int _getPin(GWEN_GUI *gui, uint32_t flags, const char *token, const char *title, const char *text, char *buffer, int minLen, int maxLen, uint32_t guiid) { assert(maxLen>5); strcpy(buffer, "12345"); return 0; } int check1() { AB_BANKING *ab; AB_PROVIDER *pro; int rv; AH_MEDIUM *medium=0; GWEN_CRYPTKEY *remotePrivCryptKey=0; GWEN_CRYPTKEY *remotePubCryptKey=0; int err; GWEN_DB_NODE *dbKey; GWEN_GUI *gui; gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGetPasswordFn(gui, _getPin); unlink("check1.medium"); fprintf(stderr, "Check1:\n"); ab=AB_Banking_new("hbci-check1", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); medium=AH_Provider_MediumFactory(pro, "ohbci", 0, "check1.medium"); if (!medium) { DBG_ERROR(0, "Could not create medium object"); return 3; } fprintf(stderr, " Creating medium ...\n"); rv=AH_Medium_Create(medium); if (rv) { DBG_ERROR(0, "Could not create medium (%d)", rv); return 3; } fprintf(stderr, " Mounting medium ...\n"); rv=AH_Medium_Mount(medium); if (rv) { DBG_ERROR(0, "Could not mount medium (%d)", rv); return 3; } fprintf(stderr, " Selecting context ...\n"); rv=AH_Medium_SelectContext(medium, 0); if (rv) { DBG_ERROR(0, "Could not select context (%d)", rv); return 3; } fprintf(stderr, " Creating keys ...\n"); rv=AH_Medium_CreateKeys(medium); if (rv) { DBG_ERROR(0, "Could not create keys (%d)", rv); return 3; } remotePrivCryptKey=GWEN_CryptKey_Factory("RSA"); if (!remotePrivCryptKey) { DBG_ERROR(0, "Could not create key (%d)", rv); return 3; } fprintf(stderr, " Generating remote crypt key ...\n"); err=GWEN_CryptKey_Generate(remotePrivCryptKey, 768); if (err) { DBG_ERROR_ERR(0, err); return 3; } fprintf(stderr, " Extracting remote public key ...\n"); dbKey=GWEN_DB_Group_new("key"); err=GWEN_CryptKey_toDb(remotePrivCryptKey, dbKey, 1); if (err) { DBG_ERROR_ERR(0, err); return 3; } remotePubCryptKey=GWEN_CryptKey_fromDb(dbKey); if (!remotePubCryptKey) { DBG_ERROR(0, "Could not create remote pub crypt key"); return 3; } fprintf(stderr, " Storing remote public key ...\n"); rv=AH_Medium_SetPubCryptKey(medium, remotePubCryptKey); if (rv) { DBG_ERROR(0, "Could not store remote crypt key (%d)", rv); return 3; } fprintf(stderr, " Unmounting medium ...\n"); rv=AH_Medium_Unmount(medium, 1); if (rv) { DBG_ERROR(0, "Could not unmount medium (%d)", rv); return 3; } rv=AB_Banking_Fini(ab); if (rv) { DBG_ERROR(0, "Could not deinit banking (%d)", rv); return 3; } unlink("check1.medium"); fprintf(stderr, "Check1: PASSED\n"); return 0; } int check2() { AB_BANKING *ab; AB_PROVIDER *pro; int rv; AH_MEDIUM *medium=0; GWEN_CRYPTKEY *localCryptKey=0; GWEN_CRYPTKEY *msgKey=0; int err; char keybuffer[16]; unsigned int bsize; AH_MEDIUM_RESULT res; GWEN_BUFFER *plainKeyBuf; GWEN_BUFFER *encKeyBuf; GWEN_BUFFER *decKeyBuf; const char *p1, *p2; int i; GWEN_GUI *gui; fprintf(stderr, "Check2:\n"); gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGetPasswordFn(gui, _getPin); unlink("check2.medium"); ab=AB_Banking_new("hbci-check1", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); medium=AH_Provider_MediumFactory(pro, "ohbci", 0, "check2.medium"); if (!medium) { DBG_ERROR(0, "Could not create medium object"); AB_Banking_Fini(ab); return 3; } fprintf(stderr, " Creating medium ...\n"); rv=AH_Medium_Create(medium); if (rv) { DBG_ERROR(0, "Could not create medium (%d)", rv); return 3; } fprintf(stderr, " Mounting medium ...\n"); rv=AH_Medium_Mount(medium); if (rv) { DBG_ERROR(0, "Could not mount medium (%d)", rv); return 3; } fprintf(stderr, " Selecting context ...\n"); rv=AH_Medium_SelectContext(medium, 0); if (rv) { DBG_ERROR(0, "Could not select context (%d)", rv); return 3; } fprintf(stderr, " Creating keys ...\n"); rv=AH_Medium_CreateKeys(medium); if (rv) { DBG_ERROR(0, "Could not create keys (%d)", rv); return 3; } localCryptKey=AH_Medium_GetLocalPubCryptKey(medium); if (!localCryptKey) { DBG_ERROR(0, "No local crypt key."); return 3; } fprintf(stderr, " Storing remote public key ...\n"); rv=AH_Medium_SetPubCryptKey(medium, localCryptKey); if (rv) { DBG_ERROR(0, "Could not store remote crypt key (%d)", rv); return 3; } fprintf(stderr, " Creating DES key object ...\n"); msgKey=GWEN_CryptKey_Factory("DES"); if (!msgKey) { DBG_ERROR(0, "Could not create message key (%d)", rv); return 3; } fprintf(stderr, " Generating DES message key ...\n"); err=GWEN_CryptKey_Generate(msgKey, 16); if (err) { DBG_ERROR_ERR(0, err); return 3; } fprintf(stderr, " Getting data of message key ...\n"); bsize=sizeof(keybuffer); err=GWEN_CryptKey_GetData(msgKey, keybuffer, &bsize); if (err) { DBG_ERROR_ERR(0, err); return 3; } fprintf(stderr, " Encrypting message key ...\n"); plainKeyBuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendBytes(plainKeyBuf, keybuffer, bsize); encKeyBuf=GWEN_Buffer_new(0, 256, 0, 1); res=AH_Medium_EncryptKey(medium, plainKeyBuf, encKeyBuf, 1); if (res!=AH_MediumResultOk) { DBG_ERROR(0, "Error %d", res); return 3; } fprintf(stderr, " Decrypting message key ...\n"); decKeyBuf=GWEN_Buffer_new(0, 256, 0, 1); res=AH_Medium_DecryptKey(medium, encKeyBuf, decKeyBuf, 1); if (res!=AH_MediumResultOk) { DBG_ERROR(0, "Error %d", res); return 3; } fprintf(stderr, " Comparing message key ...\n"); p1=GWEN_Buffer_GetStart(plainKeyBuf); p2=GWEN_Buffer_GetStart(decKeyBuf); rv=0; for (i=0; i>$(top_srcdir)/i18nsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # libaqhbci lib_LTLIBRARIES=libaqhbci.la libaqhbci_la_SOURCES=aqhbci.c libaqhbci_la_LIBADD = \ msglayer/libhbcimsg.la \ joblayer/libhbcijob.la \ ajobs/libhbciaccjobs.la \ applayer/libhbciapp.la \ banking/libhbcibanking.la \ dialogs/libaqhbci_dlgs.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqhbci_la_LDFLAGS = -no-undefined \ -version-info @AQHBCI_SO_CURRENT@:@AQHBCI_SO_REVISION@:@AQHBCI_SO_AGE@ # AqHBCI plugin library noinst_LTLIBRARIES=libaqhbciplugin.la libaqhbciplugin_la_SOURCES=aqhbci-plugin.c libaqhbciplugin_la_LIBADD=\ libaqhbci.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) # AqHBCI module aqhbci_la_SOURCES=dummy.c aqhbci_la_LIBADD = \ libaqhbciplugin.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) aqhbci_la_LDFLAGS = -no-undefined -module -avoid-version testlib_SOURCES=testlib.c testlib_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) built_sources: $(BUILT_SOURCES) aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/0000755000175000017500000000000012643540657021716 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/hhd.c0000644000175000017500000004700412635602515022543 00000000000000/*************************************************************************** begin : Sat Dec 10 2011 copyright : (C) 2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "aqhbci_l.h" #include "job_l.h" #include "hhd_p.h" #include #include #include int AH_HHD14_ReadBytesDec(const char *p, int len) { int r=0; int i; const char *pSave; pSave=p; for (i=0; i'9') { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad char in data (no decimal digit), pos=%d, byte=%02x", i, c); GWEN_Text_LogString(pSave, len, AQHBCI_LOGDOMAIN, GWEN_LoggerLevel_Error); return GWEN_ERROR_INVALID; } c-='0'; r*=10; r+=c; p++; } return r; } int AH_HHD14_ReadBytesHex(const char *p, int len) { unsigned int r=0; int i; for (i=0; i='0' && c<='9') || (c>='A' && c<='F')) { c-='0'; if (c>9) c-=7; r*=16; r+=c; p++; } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad char in data (no hexadecimal digit)"); return GWEN_ERROR_INVALID; } } return (int) r; } unsigned int AH_HHD14_Quersumme(unsigned int i) { unsigned int qs=0; while(i) { qs+=i % 10; i/=10; } return qs; } int AH_HHD14_ExtractDataForLuhnSum(const char *code, GWEN_BUFFER *xbuf) { int rv; unsigned int len; unsigned int i=0; unsigned int LSandFlags; unsigned int numCtrlBytes; unsigned int moreCtrlBytes; unsigned int numBytes; /* read LC */ rv=AH_HHD14_ReadBytesHex(code, 2); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d) at [%s]", rv, code); return rv; } len=((unsigned int) rv); code+=2; if ((strlen(code)+2) len) { DBG_INFO(AQHBCI_LOGDOMAIN, "try to read past the end of code (%d) at [%s]", v, code); return GWEN_ERROR_INVALID; } GWEN_Buffer_AppendBytes(xbuf, code, v*2); code+=v*2; i+=v+1; } return 0; } int AH_HHD14_CalcLuhnSum(const char *code, int len) { int i; int sum=0; int next; int dif; if (len % 2) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid number of bytes in payload (%d)", len); return GWEN_ERROR_INVALID; } for (i=0; i>4) & 0xf)) + (AH_HHD14_Quersumme(2*(v & 0xf))); code+=2; } next=10*((sum+9)/10); dif=next-sum; return (unsigned int) dif; } int AH_HHD14_CalcXorSum(const char *code, int len) { int i; int sum=0; for (i=0; i='0' && c<='9') || (c>='A' && c<='Z') || c==',') GWEN_Buffer_AppendByte(cbuf, c); p++; } } void AH_HHD14_ExtractCode(GWEN_BUFFER *cbuf) { const char *pStart=NULL; const char *pEnd=NULL; pStart=GWEN_Text_StrCaseStr(GWEN_Buffer_GetStart(cbuf), "CHLGUC"); if (pStart) { pStart+=10; /* skip "CHLGUC" and following 4 digits */ pEnd=GWEN_Text_StrCaseStr(pStart, "CHLGTEXT"); } if (pStart && pEnd) { GWEN_Buffer_Crop(cbuf, pStart-GWEN_Buffer_GetStart(cbuf), pEnd-pStart); GWEN_Buffer_SetPos(cbuf, 0); GWEN_Buffer_InsertByte(cbuf, '0'); GWEN_Buffer_SetPos(cbuf, GWEN_Buffer_GetUsedBytes(cbuf)); } } int AH_HHD14__Translate(const char *code, GWEN_BUFFER *cbuf) { /*unsigned int totalLength;*/ /*TODO: handle total length */ unsigned int inLenAndFlags; unsigned int inLen; unsigned int outLenAndFlags; unsigned int outLen; int rv; GWEN_BUFFER *xbuf; char numbuf[16]; uint32_t cBufStartPos; uint32_t cBufEndPos; unsigned int checkSum; xbuf=GWEN_Buffer_new(0, 256, 0, 1); /* read length */ rv=AH_HHD14_ReadBytesDec(code, 3); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } /*totalLength=(unsigned int) rv;*/ code+=3; /* translate startCode (length is in hex) */ rv=AH_HHD14_ReadBytesHex(code, 2); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } inLenAndFlags=(unsigned int) rv; inLen=inLenAndFlags & 0x3f; code+=2; outLen=(inLen+1)/2; outLenAndFlags=outLen | (inLenAndFlags & 0x80); snprintf(numbuf, sizeof(numbuf)-1, "%02x", outLenAndFlags); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(xbuf, numbuf); /* copy control bytes, if necessary */ if (inLenAndFlags & 0x80) { unsigned int ctrl=0; do { /* control byte(s) follow (HHD1.4) */ rv=AH_HHD14_ReadBytesHex(code, 2); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } ctrl=(unsigned int) rv; /* write to output buffer */ snprintf(numbuf, sizeof(numbuf)-1, "%02x", ctrl); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(xbuf, numbuf); code+=2; } while (ctrl & 0x80); } if (inLen) { GWEN_Buffer_AppendBytes(xbuf, code, inLen); if (inLen % 2) /* fill with "F" if necessary */ GWEN_Buffer_AppendByte(xbuf, 'F'); } code+=inLen; /* read DE's */ while (*code) { /* length is in dec and contains flags */ rv=AH_HHD14_ReadBytesDec(code, 2); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } inLenAndFlags=(unsigned int) rv; inLen=inLenAndFlags & 0x3f; code+=2; /* check whether we need to switch to ASC */ if ((inLenAndFlags & 0x40)==0) { int i; for (i=0; i'9'){ /* contains something other than digits, use ascii encoding */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Switched to ASCII"); inLenAndFlags|=0x40; break; } } } /* write to outbuffer */ if (inLenAndFlags & 0x40) { /* ascii */ //outLen=(inLen+1)/2; outLen=inLen; outLenAndFlags=outLen | 0x40; /* add encoding flag to length (bit 6) */ snprintf(numbuf, sizeof(numbuf)-1, "%02x", outLenAndFlags); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(xbuf, numbuf); if (inLen) /* hex encode data */ GWEN_Text_ToHexBuffer(code, inLen, xbuf, 0, 0, 0); code+=inLen; } else { /* bcd */ outLen=(inLen+1)/2; outLenAndFlags=outLen; snprintf(numbuf, sizeof(numbuf)-1, "%02x", outLenAndFlags); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(xbuf, numbuf); if (inLen) { /* data is bcd, just copy */ GWEN_Buffer_AppendBytes(xbuf, code, inLen); if (inLen % 2) /* fill with "F" if necessary */ GWEN_Buffer_AppendByte(xbuf, 'F'); } code+=inLen; } } /* while */ /* cbuf starts here */ cBufStartPos=GWEN_Buffer_GetPos(cbuf); /* calculate full length (payload plus checksums) */ outLen=(GWEN_Buffer_GetUsedBytes(xbuf)+2+1)/2; snprintf(numbuf, sizeof(numbuf)-1, "%02x", outLen); numbuf[sizeof(numbuf)-1]=0; /* add length to outbuffer */ GWEN_Buffer_AppendString(cbuf, numbuf); /* add translated buffer to output buffer */ GWEN_Buffer_AppendBuffer(cbuf, xbuf); /* cbuf ends here */ cBufEndPos=GWEN_Buffer_GetPos(cbuf); /* get payload for luhn sum */ GWEN_Buffer_Reset(xbuf); rv=AH_HHD14_ExtractDataForLuhnSum(GWEN_Buffer_GetStart(cbuf)+cBufStartPos, xbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } /* calculate luhn sum */ rv=AH_HHD14_CalcLuhnSum(GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } checkSum=(unsigned int) rv; /* add luhn sum */ if (checkSum>9) checkSum+=7; checkSum+='0'; GWEN_Buffer_AppendByte(cbuf, checkSum); /* calculate XOR sum */ rv=AH_HHD14_CalcXorSum(GWEN_Buffer_GetStart(cbuf)+cBufStartPos, cBufEndPos-cBufStartPos); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return rv; } checkSum=(unsigned int) rv; /* add XOR sum */ if (checkSum>9) checkSum+=7; checkSum+='0'; GWEN_Buffer_AppendByte(cbuf, checkSum); /* finish */ GWEN_Buffer_free(xbuf); return 0; } int AH_HHD14_Translate(const char *code, GWEN_BUFFER *cbuf) { GWEN_BUFFER *xbuf; int rv; xbuf=GWEN_Buffer_new(0, 256, 0, 1); AH_HHD14_CompressCode((const uint8_t*) code, xbuf); AH_HHD14_ExtractCode(xbuf); DBG_ERROR(AQHBCI_LOGDOMAIN, "HHD: Raw data is [%s]", GWEN_Buffer_GetStart(xbuf)); rv=AH_HHD14__Translate(GWEN_Buffer_GetStart(xbuf), cbuf); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error translating HHD code (%d)", rv); GWEN_Text_LogString(code, strlen(code), AQHBCI_LOGDOMAIN, GWEN_LoggerLevel_Error); GWEN_Buffer_free(xbuf); return rv; } GWEN_Buffer_free(xbuf); return 0; } int AH_HHD14_AddChallengeParams_04(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteBankCode, const char *sRemoteAccountNumber) { /* P1: Betrag */ if (vAmount) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_Job_ValueToChallengeString(vAmount, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* P2: BLZ Zahler/Empfaenger */ if (sRemoteBankCode && *sRemoteBankCode) AH_Job_AddChallengeParam(j, sRemoteBankCode); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote bank code number"); return GWEN_ERROR_INVALID; } /* P3: Konto Zahler/Empfaenger */ if (sRemoteAccountNumber && *sRemoteAccountNumber) { int i; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); i=10-strlen(sRemoteAccountNumber); if (i>0) GWEN_Buffer_FillWithBytes(tbuf, '0', i); GWEN_Buffer_AppendString(tbuf, sRemoteAccountNumber); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote account number"); return GWEN_ERROR_INVALID; } /* done */ return 0; } int AH_HHD14_AddChallengeParams_05(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteAccountNumber) { GWEN_BUFFER *tbuf; /* P1: Betrag */ if (vAmount) { tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(vAmount, tbuf, 2, 0); /* TODO: currency needed?? -> apparently not */ AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No amount"); return GWEN_ERROR_INVALID; } /* P2: Konto Empfaenger */ if (sRemoteAccountNumber && *sRemoteAccountNumber) { int i; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); i=10-strlen(sRemoteAccountNumber); if (i>0) GWEN_Buffer_FillWithBytes(tbuf, '0', i); GWEN_Buffer_AppendString(tbuf, sRemoteAccountNumber); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote account number"); return GWEN_ERROR_INVALID; } /* done */ return 0; } int AH_HHD14_AddChallengeParams_09(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban) { /* P1: Betrag */ if (vAmount) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_Job_ValueToChallengeString(vAmount, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* P2: IBAN Empfaenger */ if (sRemoteIban && *sRemoteIban) AH_Job_AddChallengeParam(j, sRemoteIban); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote iban"); return GWEN_ERROR_INVALID; } /* done */ return 0; } int AH_HHD14_AddChallengeParams_12(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalAccount, const AB_VALUE *vSumOfRemoteAccounts) { char numbuf[16]; /* P1: number of transfers */ snprintf(numbuf, sizeof(numbuf)-1, "%d", numTransfers); numbuf[sizeof(numbuf)-1]=0; AH_Job_AddChallengeParam(j, numbuf); /* P2: Betrag */ if (vSumOfAmount) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(vSumOfAmount, tbuf, 2, 0); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No amount"); return GWEN_ERROR_INVALID; } /* P3: Konto Zahler */ if (sLocalAccount && *sLocalAccount) { int i; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); i=10-strlen(sLocalAccount); if (i>0) GWEN_Buffer_FillWithBytes(tbuf, '0', i); GWEN_Buffer_AppendString(tbuf, sLocalAccount); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No local account"); return GWEN_ERROR_INVALID; } /* P4: Referenzzahl */ if (vSumOfRemoteAccounts) { GWEN_BUFFER *tbuf; char *p; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(vSumOfRemoteAccounts, tbuf, 0, 0); /* remove decimal point */ p=strchr(GWEN_Buffer_GetStart(tbuf), '.'); if (p) *p=0; /* only use first 10 digits */ GWEN_Buffer_Crop(tbuf, 0, 10); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* done */ return 0; } int AH_HHD14_AddChallengeParams_13(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalIban) { /* same as 12, but uses IBAN */ return AH_HHD14_AddChallengeParams_12(j, numTransfers, vSumOfAmount, sLocalIban, NULL); } int AH_HHD14_AddChallengeParams_17(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban) { return AH_HHD14_AddChallengeParams_09(j, vAmount, sRemoteIban); } int AH_HHD14_AddChallengeParams_19(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalAccountNumber, const AB_VALUE *vSumOfRemoteAccounts) { /* same as 12 */ return AH_HHD14_AddChallengeParams_12(j, numTransfers, vSumOfAmount, sLocalAccountNumber, vSumOfRemoteAccounts); } int AH_HHD14_AddChallengeParams_20(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalIban) { /* same as 12 */ return AH_HHD14_AddChallengeParams_12(j, numTransfers, vSumOfAmount, sLocalIban, NULL); } int AH_HHD14_AddChallengeParams_23(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban, const GWEN_TIME *ti) { /* P1: Betrag */ if (vAmount) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_Job_ValueToChallengeString(vAmount, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* P2: IBAN Empfaenger */ if (sRemoteIban && *sRemoteIban) AH_Job_AddChallengeParam(j, sRemoteIban); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No remote iban"); return GWEN_ERROR_INVALID; } /* P3: Termin */ if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No execution date"); return GWEN_ERROR_INVALID; } /* done */ return 0; } int AH_HHD14_AddChallengeParams_29(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban, const GWEN_TIME *ti) { /* same as 23 */ return AH_HHD14_AddChallengeParams_23(j, vAmount, sRemoteIban, ti); } int AH_HHD14_AddChallengeParams_32(AH_JOB *j, int transferCount, const AB_VALUE *vAmount, const char *sLocalIban, const GWEN_TIME *ti) { char numBuf[32]; /* P1: Anzahl */ snprintf(numBuf, sizeof(numBuf)-1, "%d", transferCount); numBuf[sizeof(numBuf)-1]=0; AH_Job_AddChallengeParam(j, numBuf); /* P2: Summe */ if (vAmount) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_Job_ValueToChallengeString(vAmount, tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing amount"); return GWEN_ERROR_INVALID; } /* P3: Eigene IBAN */ if (sLocalIban && *sLocalIban) AH_Job_AddChallengeParam(j, sLocalIban); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No local iban"); return GWEN_ERROR_INVALID; } /* P4: Referenzzahl */ AH_Job_AddChallengeParam(j, ""); /* P5: Termin */ if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Time_toString(ti, "YYYYMMDD", tbuf); AH_Job_AddChallengeParam(j, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No execution date"); return GWEN_ERROR_INVALID; } /* done */ return 0; } int AH_HHD14_AddChallengeParams_35(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban) { /* same as 09 */ return AH_HHD14_AddChallengeParams_09(j, vAmount, sRemoteIban); } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/itan1.inc0000644000175000017500000002140112364015477023340 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /* This file is included by outbox.c */ #include "message_l.h" #include "user_l.h" #include int AH_Outbox__CBox_Itan1(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *qJob){ const AH_JOB_LIST *jl; AH_MSG *msg1; AH_MSG *msg2; int rv; AH_JOB *j; AH_JOB *jTan; AB_USER *u; GWEN_DB_NODE *dbParams; uint32_t um=0; GWEN_BUFFER *bHash; AH_JOBQUEUE *jq; const char *challenge; const char *challengeHhd; //GWEN_STRINGLIST *sl; AB_ACCOUNT *acc=NULL; DBG_INFO(AQHBCI_LOGDOMAIN, "Handling iTAN process type 1"); jl=AH_JobQueue_GetJobList(qJob); assert(jl); assert(AH_Job_List_GetCount(jl)==1); j=AH_Job_List_First(jl); assert(j); u=AH_Job_GetUser(j); assert(u); um=AH_Dialog_GetItanMethod(dlg); assert(um); /* get account for HKTAN5 */ if (j) { AH_JOB *aj; aj=j; while(aj) { if (AH_AccountJob_IsAccountJob(aj)) break; aj=AH_Job_List_Next(aj); } if (aj) acc=AH_AccountJob_GetAccount(aj); } /* prepare HKTAN */ jTan=AH_Job_Tan_new(u, 1, AH_Dialog_GetTanJobVersion(dlg)); if (!jTan) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job HKTAN not available"); return -1; } AH_Job_Tan_SetTanMethod(jTan, um); AH_Job_Tan_SetTanMediumId(jTan, AH_User_GetTanMediumId(u)); DBG_INFO(AQHBCI_LOGDOMAIN, "Setting up HKTAN from job [%s]", AH_Job_GetName(j)); if (acc) { const char *baBankCode; const char *baAccountId; const char *baAccountSubId; baBankCode=AB_Account_GetBankCode(acc); baAccountId=AB_Account_GetAccountNumber(acc); baAccountSubId=AB_Account_GetSubAccountId(acc); DBG_INFO(AQHBCI_LOGDOMAIN, "Setting local and sms bank account for HKTAN to %s/%s/%s", baBankCode?baBankCode:"(none)", baAccountId?baAccountId:"(none)", baAccountSubId?baAccountSubId:"(none)"); AH_Job_Tan_SetLocalAccountInfo(jTan, baBankCode, baAccountId, baAccountSubId); if (!(AH_User_GetFlags(u) & AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT)) /* only set SMS account if allowed */ AH_Job_Tan_SetSmsAccountInfo(jTan, baBankCode, baAccountId, baAccountSubId); } #if 0 /* copy challenge params */ sl=AH_Job_GetChallengeParams(j); if (sl) { GWEN_STRINGLISTENTRY *e; e=GWEN_StringList_FirstEntry(sl); while(e) { AH_Job_AddChallengeParam(jTan, GWEN_StringListEntry_Data(e)); e=GWEN_StringListEntry_Next(e); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No challenge params"); } /* copy challenge amount */ AH_Job_SetChallengeValue(jTan, AH_Job_GetChallengeValue(j)); #endif /* copy challenge class */ AH_Job_SetChallengeClass(jTan, AH_Job_GetChallengeClass(j)); /* copy signers */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(AH_Job_GetSigners(j)); if (!se) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signatures needed but no signer given"); return GWEN_ERROR_INVALID; } while(se) { AH_Job_AddSigner(jTan, GWEN_StringListEntry_Data(se)); se=GWEN_StringListEntry_Next(se); } /* while */ } /* find DB_NODE for selected TanMethod */ dbParams=AH_Job_GetParams(jTan); assert(dbParams); /* calculate the job's hash */ msg1=AH_Msg_new(dlg); AH_Msg_SetItanMethod(msg1, um); AH_Msg_SetItanHashMode(msg1, GWEN_DB_GetIntValue(dbParams, "hashMethod", 0, 0)); rv=AH_Outbox__CBox_JobToMessage(j, msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); AH_Job_free(jTan); return rv; } /* get the job's hash */ bHash=AH_Msg_GetItanHashBuffer(msg1); assert(bHash); /* create second message: This will be sent first */ msg2=AH_Msg_new(dlg); AH_Msg_SetItanMethod(msg2, 0); AH_Msg_SetItanHashMode(msg2, 0); AH_Job_Tan_SetHash(jTan, (const unsigned char*)GWEN_Buffer_GetStart(bHash), GWEN_Buffer_GetUsedBytes(bHash)); AH_Job_Tan_SetSegCode(jTan, AH_Job_GetCode(j)); rv=AH_Job_Tan_FinishSetup(jTan, j); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); AH_Job_free(jTan); return rv; } jq=AH_JobQueue_new(u); rv=AH_JobQueue_AddJob(jq, jTan); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } rv=AH_Outbox__CBox_JobToMessage(jTan, msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } /* encode HKTAN message */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Encoding queue")); AH_Msg_SetNeedTan(msg2, 0); rv=AH_Msg_EncodeMsg(msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } if (AH_Job_GetStatus(jTan)==AH_JobStatusEncoded) { const char *s; AH_Job_SetMsgNum(jTan, AH_Msg_GetMsgNum(msg2)); AH_Job_SetDialogId(jTan, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg2); if (s) AH_Job_SetExpectedSigner(jTan, s); s=AH_Msg_GetExpectedCrypter(msg2); if (s) AH_Job_SetExpectedCrypter(jTan, s); } /* send HKTAN message */ rv=AH_Outbox__CBox_Itan_SendMsg(cbox, dlg, msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } AH_Msg_free(msg2); AH_Job_SetStatus(jTan, AH_JobStatusSent); /* wait for response, dispatch it */ rv=AH_Outbox__CBox_RecvQueue(cbox, dlg, jq); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Outbox__CBox_CopyJobResultsToJobList(jTan, jl); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } AH_Outbox__CBox_CopyJobResultsToJobList(jTan, jl); /* get challenge */ rv=AH_Job_Process(jTan, cbox->outbox->context); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } challengeHhd=AH_Job_Tan_GetHhdChallenge(jTan); challenge=AH_Job_Tan_GetChallenge(jTan); /* ask for TAN */ if (challenge || challengeHhd) { char tanBuffer[64]; memset(tanBuffer, 0, sizeof(tanBuffer)); rv=AH_User_InputTanWithChallenge2(u, challenge, challengeHhd, tanBuffer, 1, sizeof(tanBuffer)); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); AH_JobQueue_free(jq); return rv; } /* set TAN in msg 1 */ AH_Msg_SetTan(msg1, tanBuffer); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No challenge received"); AH_Msg_free(msg1); AH_JobQueue_free(jq); return GWEN_ERROR_BAD_DATA; } AH_JobQueue_free(jq); jq=NULL; /* now handle the real job */ /* encode job message */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Encoding queue")); rv=AH_Msg_EncodeMsg(msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } /* store used TAN in original job (if any) */ DBG_INFO(AQHBCI_LOGDOMAIN, "Storing TAN in job [%s]", AH_Job_GetName(j)); AH_Job_SetUsedTan(j, AH_Msg_GetTan(msg1)); if (AH_Job_GetStatus(j)==AH_JobStatusEncoded) { const char *s; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Job encoded"); AH_Job_SetMsgNum(j, AH_Msg_GetMsgNum(msg1)); AH_Job_SetDialogId(j, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg1); if (s) AH_Job_SetExpectedSigner(j, s); s=AH_Msg_GetExpectedCrypter(msg1); if (s) AH_Job_SetExpectedCrypter(j, s); } /* send job message */ rv=AH_Outbox__CBox_Itan_SendMsg(cbox, dlg, msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } AH_Msg_free(msg1); AH_Job_SetStatus(j, AH_JobStatusSent); /* wait for response, dispatch it */ rv=AH_Outbox__CBox_RecvQueue(cbox, dlg, qJob); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/outbox_p.h0000644000175000017500000001461012364015477023645 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_OUTBOX_P_H #define AH_OUTBOX_P_H /* private flags */ //#define AH_OUTBOX_FLAGS_FINISHED 0x00010000 #define AH_OUTBOX_FLAGS_LAST 0x00020000 #define AH_OUTBOX_TIME_DISTANCE 750 typedef enum { AH_Outbox_SendResultSent=0, AH_Outbox_SendResultError, AH_Outbox_SendResultNoSend, AH_Outbox_SendResultFinished, AH_Outbox_SendResultAborted } AH_OUTBOX_SENDRESULT; #include "jobqueue_l.h" #include #include #include "outbox_l.h" typedef struct AH_OUTBOX__CBOX AH_OUTBOX__CBOX; GWEN_LIST_FUNCTION_DEFS(AH_OUTBOX__CBOX, AH_Outbox__CBox); /** Customer's outbox */ struct AH_OUTBOX__CBOX { GWEN_LIST_ELEMENT(AH_OUTBOX__CBOX); AH_OUTBOX *outbox; AH_HBCI *hbci; AB_USER *user; AH_JOBQUEUE_LIST *todoQueues; AH_JOBQUEUE_LIST *finishedQueues; AB_JOB_LIST2 *pendingJobs; AH_JOB_LIST *todoJobs; AH_JOB_LIST *finishedJobs; int isLocked; uint32_t usage; }; static AH_OUTBOX__CBOX *AH_Outbox__CBox_new(AH_HBCI *hbci, AB_USER *u, AH_OUTBOX *ob); static void AH_Outbox__CBox_free(AH_OUTBOX__CBOX *cbox); static void AH_Outbox__CBox_Finish(AH_OUTBOX__CBOX *cbox); static void AH_Outbox__CBox_AddTodoJob(AH_OUTBOX__CBOX *cbox, AH_JOB *j); static void AH_Outbox__CBox_AddPendingJob(AH_OUTBOX__CBOX *cbox, AB_JOB *bj); static AB_USER* AH_Outbox__CBox_GetUser(const AH_OUTBOX__CBOX *cbox); static AH_JOB_LIST* AH_Outbox__CBox_TakeFinishedJobs(AH_OUTBOX__CBOX *cbox); static GWEN_TIME* AH_Outbox__CBox_GetEarliestPendingDate(AH_OUTBOX__CBOX *cbox); static GWEN_TIME *AH_Outbox__CBox_GetLatestPendingDate(AH_OUTBOX__CBOX *cbox); static int AH_Outbox__CBox_Prepare(AH_OUTBOX__CBOX *cbox); static int AH_Outbox__CBox__Hash(int mode, const uint8_t *p, unsigned int l, AH_MSG *msg); struct AH_OUTBOX { GWEN_INHERIT_ELEMENT(AH_OUTBOX); AH_HBCI *hbci; AH_OUTBOX__CBOX_LIST *userBoxes; AH_JOB_LIST *finishedJobs; AB_IMEXPORTER_CONTEXT *context; uint32_t usage; }; static int AH_Outbox_Prepare(AH_OUTBOX *ob); static void AH_Outbox__FinishCBox(AH_OUTBOX *ob, AH_OUTBOX__CBOX *cbox); static int AH_Outbox__Execute(AH_OUTBOX *ob); static int AH_Outbox_StartSending(AH_OUTBOX *ob); static unsigned int AH_Outbox__CountJobList(const AH_JOB_LIST *jl); static int AH_Outbox__CBox_SendQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); static int AH_Outbox__CBox_RecvQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); static int AH_Outbox__CBox_PerformQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); static void AH_Outbox__CBox_HandleQueueError(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE *jq, const char *logStr); static void AH_Outbox__CBox_HandleQueueListError(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE_LIST *jql, const char *logStr); static int AH_Outbox__CBox_SendAndRecvQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); static int AH_Outbox__CBox_OpenDialog(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, uint32_t jqFlags); static int AH_Outbox__CBox_CloseDialog(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, uint32_t jqFlags); static int AH_Outbox__CBox_PerformNonDialogQueues(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE_LIST *jql); static int AH_Outbox__CBox_PerformDialogQueue(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE *jq); static void AH_Outbox__CBox_ExtractMatchingQueues(AH_JOBQUEUE_LIST *jql, AH_JOBQUEUE_LIST *jqlWanted, AH_JOBQUEUE_LIST *jqlRest, uint32_t jqflags, uint32_t jqmask); static int AH_Outbox__CBox_SendAndRecvSelected(AH_OUTBOX__CBOX *cbox, uint32_t jqflags, uint32_t jqmask); static int AH_Outbox__CBox_SendAndRecvDialogQueues(AH_OUTBOX__CBOX *cbox); static int AH_Outbox__CBox_SendAndRecvBox(AH_OUTBOX__CBOX *cbox); static int AH_Outbox_SendAndRecv(AH_OUTBOX *ob); static AH_JOB *AH_Outbox__FindTransferJobInCheckJobList(const AH_JOB_LIST *jl, AB_USER *u, AB_ACCOUNT *a, const char *jobName); static int AH_Outbox__CBox_JobToMessage(AH_JOB *j, AH_MSG *msg); static int AH_Outbox__CBox_Itan_SendMsg(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_MSG *msg); static int AH_Outbox__CBox_Itan1(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); static int AH_Outbox__CBox_Itan2(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *qJob); static int AH_Outbox__CBox_Itan(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *qJob); static int AH_Outbox__CBox_SelectItanMode(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg); static void AH_Outbox__CBox_CopyJobResultsToJobList(const AH_JOB *j, const AH_JOB_LIST *qjl); static int AH_Outbox_LockUsers(AH_OUTBOX *ob, AB_USER_LIST2 *lockedUsers); static int AH_Outbox_UnlockUsers(AH_OUTBOX *ob, AB_USER_LIST2 *lockedUsers, int abandon); #endif /* AH_OUTBOX_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/adminjobs.c0000644000175000017500000014632112364015477023754 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "aqhbci_l.h" #include "adminjobs_p.h" #include "job_l.h" #include "jobqueue_l.h" #include "hbci_l.h" #include #include #include #include #include #include #include #include #include #include #include /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_GETKEYS); /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetKeys_new(AB_USER *u){ AH_JOB *j; AH_JOB_GETKEYS *jd; GWEN_DB_NODE *args; int version; assert(u); j=AH_Job_new("JobGetKeys", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobGetKeys not supported, should not happen"); return 0; } /* create data for inheriting class */ GWEN_NEW_OBJECT(AH_JOB_GETKEYS, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETKEYS, j, jd, AH_Job_GetKeys_FreeData); /* overwrite virtual function */ AH_Job_SetProcessFn(j, AH_Job_GetKeys_Process); /* set args */ args=AH_Job_GetArguments(j); assert(args); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/customerId", "9999999999"); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/status", 0); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/systemId", "0"); version=AH_User_GetRdhType(u); if (version==0) version=1; GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/cryptKey/secprofile/code", "RDH"); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/cryptKey/secprofile/version", version); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/signKey/secprofile/code", "RDH"); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/signKey/secprofile/version", version); return j; } /* --------------------------------------------------------------- FUNCTION */ void GWENHYWFAR_CB GWENHYWFAR_CB AH_Job_GetKeys_FreeData(void *bp, void *p){ // AH_JOB *j; AH_JOB_GETKEYS *jd; // j=(AH_JOB*) bp; jd=(AH_JOB_GETKEYS*) p; GWEN_Crypt_Token_KeyInfo_free(jd->signKeyInfo); GWEN_Crypt_Token_KeyInfo_free(jd->cryptKeyInfo); GWEN_Crypt_Token_KeyInfo_free(jd->authKeyInfo); free(jd->peerId); GWEN_FREE_OBJECT(jd); } /* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetKeys_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_HBCI *h; AH_JOB_GETKEYS *jd; AB_USER *u; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; int rv; int haveKey; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETKEYS, j); assert(jd); h=AH_Job_GetHbci(j); u=AH_Job_GetUser(j); rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (cctx==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "CT context %d not found", AH_User_GetTokenContextId(u)); return GWEN_ERROR_NOT_FOUND; } dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "GetKeyResponse" */ haveKey=0; dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbKeyResponse; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); return rv; } dbKeyResponse=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/GetKeyResponse"); if (dbKeyResponse) { unsigned int bs; const uint8_t *p; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Got this key response:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbKeyResponse, 2); p=GWEN_DB_GetBinValue(dbKeyResponse, "key/modulus", 0, 0, 0 , &bs); if (!p || !bs) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No modulus"); return GWEN_ERROR_BAD_DATA; } else { const uint8_t defaultExpo[3]={0x01, 0x00, 0x01}; const char *s; uint32_t keyId; GWEN_CRYPT_TOKEN_KEYINFO *ki; int keySize; uint32_t flags=0; /* skip zero bytes if any */ while(bs && *p==0) { p++; bs--; } /* calculate key size in bytes */ if (bs<=96) keySize=96; else { keySize=bs; } s=GWEN_DB_GetCharValue(dbKeyResponse, "keyname/keytype", 0, "V"); if (strcasecmp(s, "V")==0) keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); else if (strcasecmp(s, "S")==0) keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); else keyId=GWEN_Crypt_Token_Context_GetAuthVerifyKeyId(cctx); ki=GWEN_Crypt_Token_KeyInfo_new(keyId, GWEN_Crypt_CryptAlgoId_Rsa, keySize); GWEN_Crypt_Token_KeyInfo_SetModulus(ki, p, bs); GWEN_Crypt_Token_KeyInfo_SetExponent(ki, defaultExpo, sizeof(defaultExpo)); flags|= GWEN_CRYPT_TOKEN_KEYFLAGS_HASACTIONFLAGS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER; if (strcasecmp(s, "V")==0) { flags|=GWEN_CRYPT_TOKEN_KEYFLAGS_CANENCIPHER; jd->cryptKeyInfo=ki; s=GWEN_DB_GetCharValue(dbKeyResponse, "keyname/userId", 0, NULL); free(jd->peerId); if (s) jd->peerId=strdup(s); else jd->peerId=NULL; } else if (strcasecmp(s, "S")==0) { flags|=GWEN_CRYPT_TOKEN_KEYFLAGS_CANVERIFY; jd->signKeyInfo=ki; } else { flags|=GWEN_CRYPT_TOKEN_KEYFLAGS_CANVERIFY; jd->authKeyInfo=ki; } GWEN_Crypt_Token_KeyInfo_SetFlags(ki, flags); GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, GWEN_DB_GetIntValue(dbKeyResponse, "keyname/keynum", 0, 0)); GWEN_Crypt_Token_KeyInfo_SetKeyVersion(ki, GWEN_DB_GetIntValue(dbKeyResponse, "keyname/keyversion", 0, 0)); } haveKey++; } /* if we have one */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ if (haveKey==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No server keys found"); AH_Job_SetStatus(j, AH_JobStatusError); return GWEN_ERROR_NO_DATA; } return 0; } /* --------------------------------------------------------------- FUNCTION */ GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetSignKeyInfo(const AH_JOB *j){ AH_JOB_GETKEYS *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETKEYS, j); assert(jd); return jd->signKeyInfo; } /* --------------------------------------------------------------- FUNCTION */ GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetCryptKeyInfo(const AH_JOB *j){ AH_JOB_GETKEYS *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETKEYS, j); assert(jd); return jd->cryptKeyInfo; } /* --------------------------------------------------------------- FUNCTION */ GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetAuthKeyInfo(const AH_JOB *j){ AH_JOB_GETKEYS *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETKEYS, j); assert(jd); return jd->authKeyInfo; } const char *AH_Job_GetKeys_GetPeerId(const AH_JOB *j) { AH_JOB_GETKEYS *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETKEYS, j); assert(jd); return jd->peerId; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_SendKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SendKeys_new(AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo, const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo, const GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo) { AH_JOB *j; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *dbKey; int version; assert(u); if (authKeyInfo) j=AH_Job_new("JobSendKeysWithAuthKey", u, 0, 0); else j=AH_Job_new("JobSendKeys", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobSendKeys not supported, should not happen"); return NULL; } /* set arguments */ dbArgs=AH_Job_GetArguments(j); dbKey=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "cryptKey"); assert(dbKey); DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing crypt key"); if (AH_Job_SendKeys_PrepareKey(j, dbKey, cryptKeyInfo, 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not prepare cryptkey"); AH_Job_free(j); return 0; } dbKey=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "signKey"); assert(dbKey); DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing sign key"); if (AH_Job_SendKeys_PrepareKey(j, dbKey, signKeyInfo, 1)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not prepare signkey"); AH_Job_free(j); return 0; } if (authKeyInfo) { dbKey=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "authKey"); assert(dbKey); DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing auth key"); if (AH_Job_SendKeys_PrepareKey(j, dbKey, authKeyInfo, 2)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not prepare authkey"); AH_Job_free(j); return 0; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No auth key info"); } version=AH_User_GetRdhType(u); if (version==0) version=1; GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "cryptKey/secprofile/code", "RDH"); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "cryptKey/secprofile/version", version); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "signKey/secprofile/code", "RDH"); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "signKey/secprofile/version", version); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "authKey/secprofile/code", "RDH"); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "authKey/secprofile/version", version); DBG_INFO(AQHBCI_LOGDOMAIN, "JobSendKeys created"); return j; } int AH_Job_SendKeys_PrepareKey(AH_JOB *j, GWEN_DB_NODE *dbKey, const GWEN_CRYPT_TOKEN_KEYINFO *ki, int kn) { uint32_t bsize; const uint8_t *p; AB_USER *u; const char *userId; const AB_COUNTRY *pcountry; int country; int hbciVersion; assert(j); assert(dbKey); assert(ki); u=AH_Job_GetUser(j); assert(u); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); /* set keyname */ pcountry=AB_Banking_FindCountryByName(AH_Job_GetBankingApi(j), AB_User_GetCountry(u)); if (pcountry) country=AB_Country_GetNumericCode(pcountry); else country=280; hbciVersion=AH_User_GetHbciVersion(u); if (hbciVersion==0) hbciVersion=220; GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/country", country); GWEN_DB_SetCharValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/bankCode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/userid", userId); switch(kn) { case 0: GWEN_DB_SetCharValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/keyType", "V"); break; case 1: GWEN_DB_SetCharValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/keyType", "S"); break; case 2: default: GWEN_DB_SetCharValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/keyType", "D"); break; } GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/keyNum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "keyName/keyVersion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); /* set key */ if (kn==0) { /* crypt key */ GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/purpose", 5); switch(AH_User_GetRdhType(u)) { case 10: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 2); break; case 5: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 18); break; case 2: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 2); break; case 1: if (hbciVersion<300) /* for HBCI up until 2.20 the opmode has to be set to 16 even for crypt keys */ GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 16); else /* since FinTS 3.00 the crypt key uses the value "2" (meaning CBC) */ GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 2); break; case 0: default: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 2); break; } } else { /* sign key */ GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/purpose", 6); switch(AH_User_GetRdhType(u)) { case 10: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 19); break; case 5: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 18); break; case 2: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 17); break; case 0: case 1: default: GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/opmode", 16); break; } } GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/type", 10); GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/modname", 12); GWEN_DB_SetIntValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/expname", 13); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); bsize=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !bsize) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No modulus in key"); return GWEN_ERROR_INVALID; } GWEN_DB_SetBinValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/modulus", p, bsize); p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); bsize=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !bsize) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No exponent in key"); return GWEN_ERROR_INVALID; } GWEN_DB_SetBinValue(dbKey, GWEN_DB_FLAGS_OVERWRITE_VARS, "key/exponent", p, bsize); return 0; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_UpdateBank * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_UPDATEBANK) /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_UpdateBank_new(AB_USER *u) { AH_JOB *j; GWEN_DB_NODE *args; AH_JOB_UPDATEBANK *jd; assert(u); j=AH_Job_new("JobUpdateBankInfo", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobUpdateBankInfo not supported, should not happen"); return 0; } GWEN_NEW_OBJECT(AH_JOB_UPDATEBANK, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_UPDATEBANK, j, jd, AH_Job_UpdateBank_FreeData) AH_Job_SetProcessFn(j, AH_Job_UpdateBank_Process); jd->accountList=AB_Account_List2_new(); /* set arguments */ args=AH_Job_GetArguments(j); assert(args); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/prepare/bpdversion", 0); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/prepare/updversion", 0); DBG_INFO(AQHBCI_LOGDOMAIN, "JobUpdateBankInfo created"); return j; } void GWENHYWFAR_CB AH_Job_UpdateBank_FreeData(void *bp, void *p){ AH_JOB_UPDATEBANK *jd; jd=(AH_JOB_UPDATEBANK*)p; AB_Account_List2_FreeAll(jd->accountList); GWEN_FREE_OBJECT(jd); } int AH_Job_UpdateBank_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_UPDATEBANK *jd; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_DB_NODE *dbAccountData; AB_USER *u; AB_BANKING *ab; int accs; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_UPDATEBANK, j); assert(jd); if (jd->scanned) return 0; jd->scanned=1; dbResponses=AH_Job_GetResponses(j); assert(dbResponses); u=AH_Job_GetUser(j); assert(u); ab=AH_Job_GetBankingApi(j); assert(ab); /* search for "AccountData" */ accs=0; dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { dbAccountData=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/AccountData2"); if (dbAccountData==NULL) dbAccountData=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/AccountData"); if (dbAccountData) { const char *accountId; const char *userName; const char *accountName; const char *bankCode; const char *accountSuffix; AB_ACCOUNT *acc; DBG_INFO(AQHBCI_LOGDOMAIN, "Found an account candidate"); /* account data found */ accountId=GWEN_DB_GetCharValue(dbAccountData, "accountId", 0, 0); accountSuffix=GWEN_DB_GetCharValue(dbAccountData, "accountsubid", 0, 0); accountName=GWEN_DB_GetCharValue(dbAccountData, "account/name", 0, 0); userName=GWEN_DB_GetCharValue(dbAccountData, "name1", 0, 0); bankCode=GWEN_DB_GetCharValue(dbAccountData, "bankCode", 0, 0); if (accountId && *accountId && bankCode && *bankCode) { acc=AB_Banking_CreateAccount(ab, AH_PROVIDER_NAME); assert(acc); if (strcasecmp(GWEN_DB_GroupName(dbAccountData), "AccountData2")==0) /* KTV in version 2 available */ AH_Account_AddFlags(acc, AH_BANK_FLAGS_KTV2); else AH_Account_SubFlags(acc, AH_BANK_FLAGS_KTV2); AB_Account_SetBankCode(acc, bankCode); AB_Account_SetAccountNumber(acc, accountId); if (accountName) AB_Account_SetAccountName(acc, accountName); if (accountSuffix) AB_Account_SetSubAccountId(acc, accountSuffix); if (userName) AB_Account_SetOwnerName(acc, userName); accs++; AB_Account_List2_PushBack(jd->accountList, acc); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing information in account: BLZ=[%s], Kto=[%s], AccName=[%s]", bankCode?bankCode:"", accountId?accountId:"", accountName?accountName:""); } } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } if (!accs) { DBG_WARN(AQHBCI_LOGDOMAIN, "No accounts found"); } return 0; } AB_ACCOUNT_LIST2 *AH_Job_UpdateBank_GetAccountList(const AH_JOB *j){ AH_JOB_UPDATEBANK *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_UPDATEBANK, j); assert(jd); return jd->accountList; } AB_ACCOUNT_LIST2 *AH_Job_UpdateBank_TakeAccountList(AH_JOB *j){ AH_JOB_UPDATEBANK *jd; AB_ACCOUNT_LIST2 *tal; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_UPDATEBANK, j); assert(jd); tal=jd->accountList; jd->accountList=0; return tal; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetSysId * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_GETSYSID) AH_JOB *AH_Job_GetSysId_new(AB_USER *u){ AH_JOB *j; GWEN_DB_NODE *args; AH_JOB_GETSYSID *jd; assert(u); j=AH_Job_new("JobSync", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobSync not supported, should not happen"); return 0; } GWEN_NEW_OBJECT(AH_JOB_GETSYSID, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETSYSID, j, jd, AH_Job_GetSysId_FreeData); AH_Job_SetProcessFn(j, AH_Job_GetSysId_Process); AH_Job_SetNextMsgFn(j, AH_Job_GetSysId_NextMsg); /* set arguments */ args=AH_Job_GetArguments(j); assert(args); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/country", 280); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/bankCode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/ident/customerId", AB_User_GetCustomerId(u)); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/sync/mode", 0); GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "open/sync/systemId", "0"); DBG_INFO(AQHBCI_LOGDOMAIN, "JobGetSysId created"); return j; } void GWENHYWFAR_CB AH_Job_GetSysId_FreeData(void *bp, void *p){ AH_JOB_GETSYSID *jd; jd=(AH_JOB_GETSYSID*)p; free(jd->sysId); GWEN_FREE_OBJECT(jd); } int AH_Job_GetSysId_ExtractSysId(AH_JOB *j){ AH_JOB_GETSYSID *jd; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_DB_NODE *dbSyncResponse; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSYSID, j); assert(jd); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Extracting system-id from this response:"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbResponses, 2); /* search for "SyncResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { dbSyncResponse=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/SyncResponse"); if (dbSyncResponse) { const char *s; DBG_INFO(AQHBCI_LOGDOMAIN, "Found a sync response"); s=GWEN_DB_GetCharValue(dbSyncResponse, "systemId", 0, 0); if (s) { free(jd->sysId); jd->sysId=strdup(s); return 0; } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id found"); free(jd->sysId); jd->sysId=0; AH_Job_SetStatus(j, AH_JobStatusError); return -1; } } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } DBG_ERROR(AQHBCI_LOGDOMAIN, "No syncresponse found"); AH_Job_SetStatus(j, AH_JobStatusError); return -1; } int AH_Job_GetSysId_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETSYSID *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSYSID, j); assert(jd); return AH_Job_GetSysId_ExtractSysId(j); } const char *AH_Job_GetSysId_GetSysId(AH_JOB *j){ AH_JOB_GETSYSID *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSYSID, j); assert(jd); return jd->sysId; } int AH_Job_GetSysId_NextMsg(AH_JOB *j) { AH_JOB_GETSYSID *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSYSID, j); assert(jd); if (AH_Job_GetSysId_ExtractSysId(j)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not extract system id"); return 0; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Setting system id [%s]", jd->sysId); AH_User_SetSystemId(AH_Job_GetUser(j), jd->sysId); } return 1; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_TestVersion * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_TESTVERSION); AH_JOB *AH_Job_TestVersion_new(AB_USER *u, int anon){ AH_JOB *j; GWEN_DB_NODE *args; AH_JOB_TESTVERSION *jd; assert(u); if (anon) j=AH_Job_new("JobDialogInitAnon", u, 0, 0); else j=AH_Job_new("JobDialogInit", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobTestVersion not supported, should not happen"); return 0; } AH_Job_AddFlags(j, AH_JOB_FLAGS_DLGJOB); GWEN_NEW_OBJECT(AH_JOB_TESTVERSION, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_TESTVERSION, j, jd, AH_Job_TestVersion_FreeData); AH_Job_SetProcessFn(j, AH_Job_TestVersion_Process); jd->versionSupported=AH_JobTestVersion_ResultUnknown; /* set arguments */ args=AH_Job_GetArguments(j); assert(args); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "prepare/bpdversion", 0); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "prepare/updversion", 0); DBG_INFO(AQHBCI_LOGDOMAIN, "JobTestVersion created"); return j; } void GWENHYWFAR_CB AH_Job_TestVersion_FreeData(void *bp, void *p){ AH_JOB_TESTVERSION *jd; jd=(AH_JOB_TESTVERSION*)p; GWEN_FREE_OBJECT(jd); } int AH_Job_TestVersion_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_TESTVERSION *jd; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_DB_NODE *dbMsgResponse; int hadAGoodResult=0; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TESTVERSION, j); assert(jd); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Parsing this response"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbResponses, 2); /* search for "MsgResult" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr && jd->versionSupported==AH_JobTestVersion_ResultUnknown) { dbMsgResponse=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/MsgResult"); if (dbMsgResponse){ GWEN_DB_NODE *dbResult; dbResult=GWEN_DB_FindFirstGroup(dbMsgResponse, "result"); while(dbResult && jd->versionSupported==AH_JobTestVersion_ResultUnknown){ int code; DBG_INFO(AQHBCI_LOGDOMAIN, "Found message result"); code=GWEN_DB_GetIntValue(dbResult, "resultCode", 0, -1); if (code>=9000) { if (code==9180) { /* version is definately not supported */ jd->versionSupported=AH_JobTestVersion_ResultNotSupported; } else { if (code>=9300 && code<9400) { /* error with the signature/encryption, so there was * no complaint about the version */ jd->versionSupported=AH_JobTestVersion_ResultMaybeSupported; } else { const char *s; /* any other error, check for substring "version" */ s=GWEN_DB_GetCharValue(dbResult, "text", 0, 0); if (s) { if (strstr(s, "version") || strstr(s, "Version")) { /* seems to be a complaint about the version */ jd->versionSupported=AH_JobTestVersion_ResultNotSupported; } } /* still undecided ? */ if (jd->versionSupported==AH_JobTestVersion_ResultUnknown) /* yes, so there was no complaint about the version */ jd->versionSupported=AH_JobTestVersion_ResultMaybeSupported; } } } /* if error */ else { /* not an error, so the version is definately supported */ hadAGoodResult=1; } dbResult=GWEN_DB_FindNextGroup(dbResult, "result"); } /* while result */ } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ /* still undecided ? */ if (jd->versionSupported==AH_JobTestVersion_ResultUnknown) if (hadAGoodResult) /* in dubio pro reo */ jd->versionSupported=AH_JobTestVersion_ResultSupported; return 0; } AH_JOB_TESTVERSION_RESULT AH_Job_TestVersion_GetResult(const AH_JOB *j){ AH_JOB_TESTVERSION *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TESTVERSION, j); assert(jd); return jd->versionSupported; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetStatus * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_GETSTATUS); AH_JOB *AH_Job_GetStatus_new(AB_USER *u, const GWEN_TIME *fromDate, const GWEN_TIME *toDate) { AH_JOB *j; AH_JOB_GETSTATUS *aj; GWEN_DB_NODE *dbArgs; j=AH_Job_new("JobGetStatus", u, 0, 0); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETSTATUS, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETSTATUS, j, aj, AH_Job_GetStatus_FreeData); aj->results=AH_Result_List_new(); if (fromDate) aj->fromDate=GWEN_Time_dup(fromDate); if (toDate) aj->toDate=GWEN_Time_dup(toDate); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_GetStatus_Process); AH_Job_SetExchangeFn(j, AH_Job_GetStatus_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (fromDate) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); if (GWEN_Time_toString(fromDate, "YYYYMMDD", dbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in fromDate"); } else { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "fromDate", GWEN_Buffer_GetStart(dbuf)); } GWEN_Buffer_free(dbuf); } if (toDate) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); if (GWEN_Time_toString(toDate, "YYYYMMDD", dbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in toDate"); } else { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "toDate", GWEN_Buffer_GetStart(dbuf)); } GWEN_Buffer_free(dbuf); } return j; } void GWENHYWFAR_CB AH_Job_GetStatus_FreeData(void *bp, void *p){ AH_JOB_GETSTATUS *aj; aj=(AH_JOB_GETSTATUS*)p; AH_Result_List_free(aj->results); GWEN_FREE_OBJECT(aj); } int AH_Job_GetStatus_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETSTATUS *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetStatus"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSTATUS, j); assert(aj); /* nothing to do here (because this is not a real job and it is processed * by AH_Outbox) */ return 0; } int AH_Job_GetStatus_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETSTATUS *aj; DBG_WARN(AQHBCI_LOGDOMAIN, "Exchanging (%d), should not happen...", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETSTATUS, j); assert(aj); return 0; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_Tan * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_TAN); AH_JOB *AH_Job_Tan_new(AB_USER *u, int process, int jobVersion) { AH_JOB *j; AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *dbParams; const char *s; DBG_INFO(AQHBCI_LOGDOMAIN, "Looking for TAN job in version %d", jobVersion); j=AH_Job_new("JobTan", u, 0, jobVersion); if (!j) { DBG_INFO(AQHBCI_LOGDOMAIN, "TAN job in version %d not found", jobVersion); return NULL; } GWEN_NEW_OBJECT(AH_JOB_TAN, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_TAN, j, aj, AH_Job_Tan_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_Tan_Process); AH_Job_SetExchangeFn(j, AH_Job_Tan_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); dbParams=AH_Job_GetParams(j); assert(dbParams); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "process", process); if (process==1 || process==2) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "moreTans", "N"); /* set tanmedium id (if any) */ s=AH_User_GetTanMediumId(u); if (s && *s) AH_Job_Tan_SetTanMediumId(j, s); return j; } void GWENHYWFAR_CB AH_Job_Tan_FreeData(void *bp, void *p){ AH_JOB_TAN *aj; aj=(AH_JOB_TAN*)p; free(aj->tanMediumId); free(aj->reference); free(aj->challenge); free(aj->challengeHhd); GWEN_FREE_OBJECT(aj); } int AH_Job_Tan_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_TAN *aj; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; int rv; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Processing JobTan"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); /* search for "TanResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbTanResponse; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbTanResponse=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/tanResponse"); if (dbTanResponse) { const char *s; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Got a TAN response"); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbTanResponse, 2); s=GWEN_DB_GetCharValue(dbTanResponse, "challenge", 0, 0); if (s) { free(aj->challenge); aj->challenge=strdup(s); } /* get special HHD challenge */ if (GWEN_DB_VariableExists(dbTanResponse, "challengeHHD")) { const uint8_t *p; unsigned int l; p=GWEN_DB_GetBinValue(dbTanResponse, "challengeHHD", 0, NULL, 0, &l); if (p && l) { GWEN_BUFFER *bbuf; DBG_INFO(AQHBCI_LOGDOMAIN, "Job has a challengeHHD string:"); GWEN_Text_LogString((const char*)p, l, AQHBCI_LOGDOMAIN, GWEN_LoggerLevel_Info); bbuf=GWEN_Buffer_new(0, 256, 0, 1); #if 0 GWEN_Text_ToHexBuffer((const char*) p, l, bbuf, 0, 0, 0); #else /* data is a string, no need to transform to hex */ GWEN_Buffer_AppendBytes(bbuf, (const char*) p, l); #endif free(aj->challengeHhd); aj->challengeHhd=strdup(GWEN_Buffer_GetStart(bbuf)); GWEN_Buffer_free(bbuf); } } s=GWEN_DB_GetCharValue(dbTanResponse, "jobReference", 0, 0); if (s) { free(aj->reference); aj->reference=strdup(s); } break; /* break loop, we found the tanResponse */ } /* if "TanResponse" */ dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } int AH_Job_Tan_GetTanMethod(const AH_JOB *j) { AH_JOB_TAN *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); return aj->tanMethod; } void AH_Job_Tan_SetTanMethod(AH_JOB *j, int i) { AH_JOB_TAN *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); aj->tanMethod=i; } int AH_Job_Tan_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_TAN *aj; DBG_WARN(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); switch(m) { case AH_Job_ExchangeModeParams: break; case AH_Job_ExchangeModeArgs: break; case AH_Job_ExchangeModeResults: break; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ return 0; } void AH_Job_Tan_SetHash(AH_JOB *j, const unsigned char *p, unsigned int len) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetBinValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "jobHash", p, len); } void AH_Job_Tan_SetReference(AH_JOB *j, const char *p) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "jobReference", p); } void AH_Job_Tan_SetTanList(AH_JOB *j, const char *p) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanList", p); } void AH_Job_Tan_SetTanInfo(AH_JOB *j, const char *p) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanInfo", p); } void AH_Job_Tan_SetSegCode(AH_JOB *j, const char *p) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (p && *p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Setting segment id in TAN to [%s]", p); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "segmentId", p); } else { GWEN_DB_DeleteVar(dbArgs, "segmentId"); } } const char *AH_Job_Tan_GetChallenge(const AH_JOB *j) { AH_JOB_TAN *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); return aj->challenge; } const char *AH_Job_Tan_GetHhdChallenge(const AH_JOB *j) { AH_JOB_TAN *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); return aj->challengeHhd; } const char *AH_Job_Tan_GetReference(const AH_JOB *j) { AH_JOB_TAN *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); return aj->reference; } void AH_Job_Tan_SetTanMediumId(AH_JOB *j, const char *s) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanMediumId", s); else GWEN_DB_DeleteVar(dbArgs, "tanMediumId"); } void AH_Job_Tan_SetLocalAccountInfo(AH_JOB *j, const char *bankCode, const char *accountId, const char *accountSubId) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (bankCode && *bankCode) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccount/bankCode", bankCode); if (accountId && *accountId) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccount/accountId", accountId); if (accountSubId && *accountSubId) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccount/accountSubId", accountSubId); } void AH_Job_Tan_SetSmsAccountInfo(AH_JOB *j, const char *bankCode, const char *accountId, const char *accountSubId) { AH_JOB_TAN *aj; GWEN_DB_NODE *dbArgs; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (bankCode && *bankCode) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "smsAccount/bankCode", bankCode); if (accountId && *accountId) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "smsAccount/accountId", accountId); if (accountSubId && *accountSubId) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "smsAccount/accountSubId", accountSubId); } int AH_Job_Tan_FinishSetup(AH_JOB *j, AH_JOB *accJob) { AH_JOB_TAN *aj; int rv; GWEN_DB_NODE *args; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbMethod; const char *s; assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_TAN, j); assert(aj); args=AH_Job_GetArguments(j); assert(args); dbParams=AH_Job_GetParams(j); assert(dbParams); /* get data for the selected tan method */ dbMethod=GWEN_DB_FindFirstGroup(dbParams, "tanMethod"); while(dbMethod) { int tm; tm=GWEN_DB_GetIntValue(dbMethod, "function", 0, -1); if (tm!=-1 && tm==aj->tanMethod) break; dbMethod=GWEN_DB_FindNextGroup(dbMethod, "tanMethod"); } if (!dbMethod) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No info for the selected iTAN method"); return GWEN_ERROR_GENERIC; } rv=AH_Job_AddChallengeParams(accJob, AH_Job_GetSegmentVersion(j), dbMethod); if (rv<0) { if (rv==GWEN_ERROR_NOT_SUPPORTED) { DBG_INFO(AQHBCI_LOGDOMAIN, "Challenge parameters not supported by job, ignoring"); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { GWEN_STRINGLIST *sl; /* add challenge params as provided by addChallengeParams function */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Using result of AddChallengeParams function"); sl=AH_Job_GetChallengeParams(accJob); if (sl) { GWEN_STRINGLISTENTRY *e; e=GWEN_StringList_FirstEntry(sl); while(e) { GWEN_DB_SetCharValue(args, GWEN_DB_FLAGS_DEFAULT, "challengeParams/param", GWEN_StringListEntry_Data(e)); e=GWEN_StringListEntry_Next(e); } } } /* set challenge class */ s=GWEN_DB_GetCharValue(dbMethod, "needChallengeClass", 0, "N"); if (strcasecmp(s, "J")==0) GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "challengeClass", AH_Job_GetChallengeClass(accJob)); return 0; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetItanModes * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_GETITANMODES); AH_JOB *AH_Job_GetItanModes_new(AB_USER *u){ AH_JOB *j; GWEN_DB_NODE *args; AH_JOB_GETITANMODES *jd; assert(u); j=AH_Job_new("JobGetItanModes", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobGetItanModes not supported, should not happen"); return 0; } GWEN_NEW_OBJECT(AH_JOB_GETITANMODES, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETITANMODES, j, jd, AH_Job_GetItanModes_FreeData); AH_Job_SetProcessFn(j, AH_Job_GetItanModes_Process); /* set arguments */ args=AH_Job_GetArguments(j); assert(args); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "prepare/bpdversion", 0); GWEN_DB_SetIntValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "prepare/updversion", 0); jd->modeList[0]=-1; jd->modeCount=0; DBG_INFO(AQHBCI_LOGDOMAIN, "JobGetItanModes created"); return j; } void GWENHYWFAR_CB AH_Job_GetItanModes_FreeData(void *bp, void *p){ AH_JOB_GETITANMODES *jd; jd=(AH_JOB_GETITANMODES*)p; GWEN_FREE_OBJECT(jd); } int AH_Job_GetItanModes_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETITANMODES *jd; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_DB_NODE *dbMsgResponse; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETITANMODES, j); assert(jd); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Parsing this response"); if (GWEN_Logger_GetLevel(AQHBCI_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbResponses, 2); /* search for "SegResult" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { dbMsgResponse=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/SegResult"); if (dbMsgResponse){ GWEN_DB_NODE *dbRes; dbRes=GWEN_DB_FindFirstGroup(dbMsgResponse, "result"); while(dbRes){ int code; code=GWEN_DB_GetIntValue(dbRes, "resultCode", 0, -1); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Found message result (%d)", code); if (code==3920) { int i; jd->modeList[0]=-1; jd->modeCount=0; for (i=0; ; i++) { int k; k=GWEN_DB_GetIntValue(dbRes, "param", i, 0); if (k==0) break; if (jd->modeCountmodeList[jd->modeCount++]=k; jd->modeList[jd->modeCount]=-1; } else break; } /* for */ if (i==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad server response: No TAN method reported"); return -1; } } /* if correct result found */ dbRes=GWEN_DB_FindNextGroup(dbRes, "result"); } /* while result */ } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ return 0; } const int *AH_Job_GetItanModes_GetModes(const AH_JOB *j){ AH_JOB_GETITANMODES *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETITANMODES, j); assert(jd); return jd->modeList; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_ChangePin * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_ChangePin_new(AB_USER *u, const char *newPin){ AH_JOB *j; GWEN_DB_NODE *dbArgs; assert(u); j=AH_Job_new("JobChangePin", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobChangePin not supported, should not happen"); return 0; } /* set challenge class */ AH_Job_SetChallengeClass(j, 90); /* set arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "newPin", newPin); DBG_INFO(AQHBCI_LOGDOMAIN, "JobChangePin created"); return j; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetAccountSepaInfo * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ GWEN_INHERIT(AH_JOB, AH_JOB_GETACCSEPAINFO) /* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetAccountSepaInfo_new(AB_USER *u, AB_ACCOUNT *acc) { AH_JOB *j; GWEN_DB_NODE *dbArgs; AH_JOB_GETACCSEPAINFO *jd; const char *s; assert(u); j=AH_Job_new("JobGetAccountSepaInfo", u, 0, 0); if (!j) { DBG_ERROR(AQHBCI_LOGDOMAIN, "JobGetAccountSepaInfo not supported, should not happen"); return 0; } GWEN_NEW_OBJECT(AH_JOB_GETACCSEPAINFO, jd); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETACCSEPAINFO, j, jd, AH_Job_GetAccountSepaInfo_FreeData) AH_Job_SetProcessFn(j, AH_Job_GetAccountSepaInfo_Process); jd->account=acc; /* set arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); s=AB_Account_GetAccountNumber(jd->account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountId", s); s=AB_Account_GetSubAccountId(jd->account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountSubId", s); s=AB_Account_GetBankCode(jd->account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bankCode", s); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "country", 280); s=AB_Account_GetIBAN(jd->account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "iban", s); s=AB_Account_GetBIC(jd->account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bic", s); DBG_INFO(AQHBCI_LOGDOMAIN, "JobGetAccountSepaInfo created"); return j; } void GWENHYWFAR_CB AH_Job_GetAccountSepaInfo_FreeData(void *bp, void *p){ AH_JOB_GETACCSEPAINFO *jd; jd=(AH_JOB_GETACCSEPAINFO*)p; GWEN_FREE_OBJECT(jd); } int AH_Job_GetAccountSepaInfo_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETACCSEPAINFO *jd; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; AB_USER *u; AB_BANKING *ab; assert(j); jd=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETACCSEPAINFO, j); assert(jd); if (jd->scanned) return 0; jd->scanned=1; dbResponses=AH_Job_GetResponses(j); assert(dbResponses); u=AH_Job_GetUser(j); assert(u); ab=AH_Job_GetBankingApi(j); assert(ab); /* search for "GetAccountSepaInfoResponse" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while(dbCurr) { GWEN_DB_NODE *dbXA; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/GetAccountSepaInfoResponse"); if (dbXA) { const char *accountId; const char *bankCode; const char *accountSuffix; const char *iban; const char *bic; const char *sSepa; int useWithSepa=0; /* account data found */ DBG_INFO(AQHBCI_LOGDOMAIN, "Found a GetAccountSepaInfoResponse segment"); accountId=GWEN_DB_GetCharValue(dbXA, "accountId", 0, 0); accountSuffix=GWEN_DB_GetCharValue(dbXA, "accountsubid", 0, 0); bankCode=GWEN_DB_GetCharValue(dbXA, "bankCode", 0, 0); sSepa=GWEN_DB_GetCharValue(dbXA, "sepa", 0, "n"); if (strcasecmp(sSepa, "j")==0) useWithSepa=1; iban=GWEN_DB_GetCharValue(dbXA, "iban", 0, 0); bic=GWEN_DB_GetCharValue(dbXA, "bic", 0, 0); rv=AB_Banking_BeginExclUseAccount(ab, jd->account); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to lock account"); } else { if (accountSuffix) AB_Account_SetSubAccountId(jd->account, accountSuffix); AH_Account_AddFlags(jd->account, AH_BANK_FLAGS_KTV2); /* we have a sub id (even if emtpy), set flag */ if (useWithSepa) { DBG_INFO(AQHBCI_LOGDOMAIN, "SEPA available with this account"); AH_Account_AddFlags(jd->account, AH_BANK_FLAGS_SEPA); /* we have a sub id (even if emtpy), set flag */ } else { DBG_INFO(AQHBCI_LOGDOMAIN, "SEPA not available with this account"); AH_Account_SubFlags(jd->account, AH_BANK_FLAGS_SEPA); /* we have a sub id (even if emtpy), set flag */ } if (iban && *iban) { if (bic && *bic) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting IBAN and BIC: %s/%s", iban, bic); AB_Account_SetIBAN(jd->account, iban); AB_Account_SetBIC(jd->account, bic); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting IBAN (no BIC): %s", iban); AB_Account_SetIBAN(jd->account, iban); } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing information in account: BLZ=[%s], Kto=[%s], IBAN=[%s], BIC=[%s]", bankCode?bankCode:"", accountId?accountId:"", iban?iban:"", bic?bic:""); } AB_Banking_EndExclUseAccount(ab, jd->account, 0); } } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/0000755000175000017500000000000012643540657022516 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci210job.xml0000644000175000017500000001166312364015477025007 00000000000000 9999999999 0 0 0 0 9999999999 0 0 V 999 999 999 S 999 999 999 V S 0 9999999999 0 0 0 0 %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/fints300job.xml0000644000175000017500000001745412364015477025231 00000000000000 9999999999 0 0 0 0 9999999999 0 0 V 999 999 999 S 999 999 999 D 999 999 999 V S V S D 0 9999999999 0 0 0 0 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci201seg.xml0000644000175000017500000005661412364015477025020 00000000000000 %code %version %pversion $MessageNumber $DialogId %code %version %code %version $MessageNumber %code %version 2 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 1 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 999 1 1 1 ?userId 1 1 S %code %version %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 998 1 1 0 ?userId 1 1 V %code %version 999 %code %version %code %version %code %version %code %version %code %version %code %version ?customerId 0 0 %code %version ?customerId ?systemId 1 %code %version ?customerId ?systemId 1 %code %version ?bpdversion ?updversion 1 ?product ?productversion %code %version $DialogId %code %version %code %version %code %version %code %version %code %version 2 124 %code %version 1 224 %code %version 2 112 %code %version 2 112 %code %version 2 112 %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci201job.xml0000644000175000017500000001170312364015477025002 00000000000000 9999999999 0 0 0 0 9999999999 0 0 V 999 999 9999999999 S 999 999 9999999999 V S 0 9999999999 0 0 0 0 %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbciallgrp.xml0000644000175000017500000004632412367207344025274 00000000000000 +SegmentNumber 280 ?bankcode S V 16 10 12 13 6 5 1 999 1 6 2 2 13 1 1 999 5 10 16 6 10 16 6 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbciallseg.xml0000644000175000017500000002640412364015477025260 00000000000000 %code %version %pversion $MessageNumber $DialogId %code %version %pversion $MessageNumber $DialogId %code %version %code %version %code %version $MessageNumber %code %version 2 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 1 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 999 1 1 1 ?userId 1 1 S %code %version %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 998 1 1 0 ?userId 1 1 V %code %version 999 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile.in0000644000175000017500000004436512643540057024511 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/applayer/xml DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ xmlfiles = \ $(srcdir)/hbciallgrp.xml \ $(srcdir)/hbci210seg.xml \ $(srcdir)/hbci210job.xml \ $(srcdir)/hbci201seg.xml \ $(srcdir)/hbci201job.xml \ $(srcdir)/hbci220seg.xml \ $(srcdir)/hbci220job.xml \ $(srcdir)/fints300seg.xml \ $(srcdir)/fints300job.xml \ $(srcdir)/hbciallseg.xml EXTRA_DIST = $(xmlfiles) CLEANFILES = base.xml all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am sources: base.xml: $(xmlfiles) $(XMLMERGE) $(xmlfiles) -v --compact -o $@ all-local: base.xml # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci210seg.xml0000644000175000017500000005661212364015477025016 00000000000000 %code %version %pversion $MessageNumber $DialogId %code %version %code %version $MessageNumber %code %version 2 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 1 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 999 1 1 1 ?userId 1 1 S %code %version %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 998 1 1 0 ?userId 1 1 V %code %version 999 %code %version %code %version %code %version %code %version %code %version %code %version ?customerId 0 0 %code %version ?customerId ?systemid 1 %code %version ?customerId ?systemid 1 %code %version 1 ?bpdversion ?updversion ?product ?productversion %code %version $DialogId %code %version %code %version %code %version %code %version %code %version 2 124 %code %version 1 224 %code %version 2 112 %code %version 2 112 %code %version 2 112 %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile.am0000644000175000017500000000067012364015477024472 00000000000000 xmlfiles=\ $(srcdir)/hbciallgrp.xml \ $(srcdir)/hbci210seg.xml \ $(srcdir)/hbci210job.xml \ $(srcdir)/hbci201seg.xml \ $(srcdir)/hbci201job.xml \ $(srcdir)/hbci220seg.xml \ $(srcdir)/hbci220job.xml \ $(srcdir)/fints300seg.xml \ $(srcdir)/fints300job.xml \ $(srcdir)/hbciallseg.xml EXTRA_DIST=$(xmlfiles) sources: base.xml: $(xmlfiles) $(XMLMERGE) $(xmlfiles) -v --compact -o $@ all-local: base.xml CLEANFILES = base.xml aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/fints300seg.xml0000644000175000017500000011716112643536650025232 00000000000000 %code %version %pversion $MessageNumber $DialogId %code %version %code %version $MessageNumber %code %version 2 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 1 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 999 1 1 1 ?userId 1 1 S %code %version %code %version %code %version %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 998 1 1 0 ?userId 1 1 V %code %version 999 %code %version %code %version %code %version %code %version %code %version %code %version %code %version 0 ?customerId 0 %code %version ?systemid ?customerId 1 %code %version ?systemid ?customerId 1 %code %version ?bpdversion ?updversion 1 ?product ?productversion %code %version ?bpdversion ?updversion 1 ?product ?productversion %code %version $DialogId %code %version %code %version %code %version %code %version %code %version %code %version 2 124 %code %version 1 224 %code %version 2 112 %code %version 2 112 %code %version 2 112 %code %version 2 112 %code %version %code %version %code %version 1 %code %version %code %version %code %version 1 1 %code %version %code %version %code %version 1 1 %code %version %code %version %code %version 1 1 %code %version %code %version %code %version 1 1 %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci220seg.xml0000644000175000017500000007453412364015477025022 00000000000000 %code %version %pversion $MessageNumber $DialogId %code %version %code %version $MessageNumber %code %version 2 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 1 1 1 1 ?userId ?signkeynumber ?signkeyversion S %code %version 999 1 1 1 ?userId 1 1 S %code %version %code %version %code %version %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 4 1 1 0 ?userId ?cryptkeynumber ?cryptkeyversion V %code %version 998 998 1 1 0 ?userId 1 1 V %code %version 999 %code %version %code %version %code %version %code %version 0 ?customerId 0 %code %version ?systemid ?customerId 1 %code %version ?systemid ?customerId 1 %code %version ?bpdversion ?updversion 1 ?product ?productversion %code %version $DialogId %code %version %code %version %code %version %code %version %code %version 2 124 %code %version 1 224 %code %version 2 112 %code %version 2 112 %code %version 2 112 %code %version %code %version %code %version %code %version 1 1 %code %version %code %version 1 %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version %code %version aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/xml/hbci220job.xml0000644000175000017500000001510512364015477025003 00000000000000 9999999999 0 0 0 0 9999999999 0 0 V 999 999 999 S 999 999 999 V S 0 9999999999 0 0 0 0 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/itan2.inc0000644000175000017500000002363612364015477023355 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /* This file is included by outbox.c */ #include "message_l.h" #include "user_l.h" #include int AH_Outbox__CBox_Itan2(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *qJob){ const AH_JOB_LIST *jl; AH_MSG *msg1; AH_MSG *msg2; int rv; AH_JOB *j; AH_JOB *jTan1; AH_JOB *jTan2; AB_USER *u; const char *challenge; const char *challengeHhd; AH_JOBQUEUE *qJob2=NULL; DBG_INFO(AQHBCI_LOGDOMAIN, "Handling iTAN process type 2"); jl=AH_JobQueue_GetJobList(qJob); assert(jl); assert(AH_Job_List_GetCount(jl)==1); j=AH_Job_List_First(jl); assert(j); u=AH_Job_GetUser(j); assert(u); /* prepare HKTAN (process type 4) */ jTan1=AH_Job_Tan_new(u, 4, AH_Dialog_GetTanJobVersion(dlg)); if (!jTan1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job HKTAN not available"); return -1; } AH_Job_Tan_SetTanMediumId(jTan1, AH_User_GetTanMediumId(u)); AH_Job_Tan_SetSegCode(jTan1, AH_Job_GetCode(j)); /* copy signers */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(AH_Job_GetSigners(j)); if (!se) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signatures needed but no signer given"); return GWEN_ERROR_INVALID; } while(se) { AH_Job_AddSigner(jTan1, GWEN_StringListEntry_Data(se)); se=GWEN_StringListEntry_Next(se); } /* while */ } /* add job to queue */ rv=AH_JobQueue_AddJob(qJob, jTan1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Job_free(jTan1); return rv; } /* create message */ msg1=AH_Msg_new(dlg); /* add original job */ rv=AH_Outbox__CBox_JobToMessage(j, msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } /* add HKTAN message */ rv=AH_Outbox__CBox_JobToMessage(jTan1, msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } /* encode message */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Encoding queue")); AH_Msg_SetNeedTan(msg1, 0); rv=AH_Msg_EncodeMsg(msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } /* update job status */ if (AH_Job_GetStatus(j)==AH_JobStatusEncoded) { const char *s; AH_Job_SetMsgNum(j, AH_Msg_GetMsgNum(msg1)); AH_Job_SetDialogId(j, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg1); if (s) AH_Job_SetExpectedSigner(j, s); s=AH_Msg_GetExpectedCrypter(msg1); if (s) AH_Job_SetExpectedCrypter(j, s); } if (AH_Job_GetStatus(jTan1)==AH_JobStatusEncoded) { const char *s; AH_Job_SetMsgNum(jTan1, AH_Msg_GetMsgNum(msg1)); AH_Job_SetDialogId(jTan1, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg1); if (s) AH_Job_SetExpectedSigner(jTan1, s); s=AH_Msg_GetExpectedCrypter(msg1); if (s) AH_Job_SetExpectedCrypter(jTan1, s); } /* send message */ rv=AH_Outbox__CBox_Itan_SendMsg(cbox, dlg, msg1); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg1); return rv; } AH_Msg_free(msg1); AH_Job_SetStatus(j, AH_JobStatusSent); AH_Job_SetStatus(jTan1, AH_JobStatusSent); /* wait for response, dispatch it */ rv=AH_Outbox__CBox_RecvQueue(cbox, dlg, qJob); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* get challenge */ rv=AH_Job_Process(jTan1, cbox->outbox->context); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } challengeHhd=AH_Job_Tan_GetHhdChallenge(jTan1); challenge=AH_Job_Tan_GetChallenge(jTan1); /* prepare second message (the one with the TAN) */ qJob2=AH_JobQueue_fromQueue(qJob); msg2=AH_Msg_new(dlg); AH_Msg_SetNeedTan(msg2, 1); AH_Msg_SetItanMethod(msg2, 0); AH_Msg_SetItanHashMode(msg2, 0); /* ask for TAN */ if (challenge || challengeHhd) { char tanBuffer[64]; memset(tanBuffer, 0, sizeof(tanBuffer)); rv=AH_User_InputTanWithChallenge2(u, challenge, challengeHhd, tanBuffer, 1, sizeof(tanBuffer)); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); return rv; } /* set TAN in msg 2 */ AH_Msg_SetTan(msg2, tanBuffer); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No challenge received"); AH_Msg_free(msg2); return GWEN_ERROR_BAD_DATA; } /* prepare HKTAN (process type 2) */ jTan2=AH_Job_Tan_new(u, 2, AH_Dialog_GetTanJobVersion(dlg)); if (!jTan2) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job HKTAN not available"); AH_Job_free(jTan2); AH_Msg_free(msg2); return -1; } AH_Job_Tan_SetReference(jTan2, AH_Job_Tan_GetReference(jTan1)); AH_Job_Tan_SetTanMediumId(jTan2, AH_User_GetTanMediumId(u)); AH_Job_Tan_SetSegCode(jTan2, AH_Job_GetCode(j)); /* copy signers */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(AH_Job_GetSigners(j)); if (!se) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signatures needed but no signer given"); AH_Job_free(jTan2); AH_Msg_free(msg2); AH_JobQueue_free(qJob2); return GWEN_ERROR_INVALID; } while(se) { AH_Job_AddSigner(jTan2, GWEN_StringListEntry_Data(se)); se=GWEN_StringListEntry_Next(se); } /* while */ } rv=AH_JobQueue_AddJob(qJob2, jTan2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Job_free(jTan2); AH_Msg_free(msg2); AH_JobQueue_free(qJob2); return rv; } rv=AH_Outbox__CBox_JobToMessage(jTan2, msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_JobQueue_free(qJob2); return rv; } /* encode HKTAN message */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Encoding queue")); AH_Msg_SetNeedTan(msg2, 1); rv=AH_Msg_EncodeMsg(msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_JobQueue_free(qJob2); return rv; } /* store used TAN in original job (if any) */ DBG_INFO(AQHBCI_LOGDOMAIN, "Storing TAN in job [%s]", AH_Job_GetName(j)); AH_Job_SetUsedTan(j, AH_Msg_GetTan(msg2)); if (AH_Job_GetStatus(jTan2)==AH_JobStatusEncoded) { const char *s; AH_Job_SetMsgNum(jTan2, AH_Msg_GetMsgNum(msg2)); AH_Job_SetDialogId(jTan2, AH_Dialog_GetDialogId(dlg)); /* store expected signer and crypter (if any) */ s=AH_Msg_GetExpectedSigner(msg2); if (s) AH_Job_SetExpectedSigner(jTan2, s); s=AH_Msg_GetExpectedCrypter(msg2); if (s) AH_Job_SetExpectedCrypter(jTan2, s); /* store TAN in TAN job */ AH_Job_SetUsedTan(jTan2, AH_Msg_GetTan(msg2)); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "jTAN2 not encoded? (%d)", AH_Job_GetStatus(jTan2)); } /* send HKTAN message */ rv=AH_Outbox__CBox_Itan_SendMsg(cbox, dlg, msg2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Msg_free(msg2); AH_JobQueue_free(qJob2); return rv; } AH_Msg_free(msg2); AH_Job_SetStatus(jTan2, AH_JobStatusSent); /* wait for response, dispatch it */ rv=AH_Outbox__CBox_RecvQueue(cbox, dlg, qJob2); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_JobQueue_free(qJob2); return rv; } else { const AH_JOB_LIST *qjl; rv=AH_Job_Process(jTan2, cbox->outbox->context); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_JobQueue_free(qJob2); return rv; } /* dispatch results from jTan2 to all members of the queue */ DBG_INFO(AQHBCI_LOGDOMAIN, "Dispatching results for HKTAN to queue jobs"); qjl=AH_JobQueue_GetJobList(qJob); if (qjl) { AH_RESULT_LIST *rl; /* segment results */ rl=AH_Job_GetSegResults(jTan2); if (rl) { AH_RESULT *or; or=AH_Result_List_First(rl); if (or==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "No segment result in job HKTAN"); } while(or) { AH_JOB *qj; qj=AH_Job_List_First(qjl); while(qj) { if (qj!=jTan2) { AH_RESULT *nr; nr=AH_Result_dup(or); DBG_ERROR(AQHBCI_LOGDOMAIN, "Adding result %d to job %s", AH_Result_GetCode(or), AH_Job_GetName(qj)); AH_Result_List_Add(nr, AH_Job_GetSegResults(qj)); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Not adding result to the same job"); } qj=AH_Job_List_Next(qj); } or=AH_Result_List_Next(or); } /* while or */ } /* if rl */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "No segment results in HKTAN"); } /* msg results */ rl=AH_Job_GetMsgResults(jTan2); if (rl) { AH_RESULT *or; or=AH_Result_List_First(rl); while(or) { AH_JOB *qj; qj=AH_Job_List_First(qjl); while(qj) { AH_RESULT *nr; nr=AH_Result_dup(or); AH_Result_List_Add(nr, AH_Job_GetMsgResults(qj)); qj=AH_Job_List_Next(qj); } or=AH_Result_List_Next(or); } /* while or */ } /* if rl */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "No message results in HKTAN"); } } /* if qjl */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "No job list"); } } AH_JobQueue_free(qJob2); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/hhd_p.h0000644000175000017500000000206712364015477023073 00000000000000/*************************************************************************** begin : Sat Dec 10 2011 copyright : (C) 2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_HHD_P_H #define AQHBCI_HHD_P_H #include "hhd_l.h" static int AH_HHD14_ReadBytesDec(const char *p, int len); static int AH_HHD14_ReadBytesHex(const char *p, int len); static unsigned int AH_HHD14_Quersumme(unsigned int i); static int AH_HHD14_CalcLuhnSum(const char *code, int len); static int AH_HHD14_CalcXorSum(const char *code, int len); static int AH_HHD14_ExtractDataForLuhnSum(const char *code, GWEN_BUFFER *xbuf); static void AH_HHD14_CompressCode(const uint8_t *code, GWEN_BUFFER *cbuf); static void AH_HHD14_ExtractCode(GWEN_BUFFER *cbuf); static int AH_HHD14__Translate(const char *code, GWEN_BUFFER *cbuf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/Makefile.in0000644000175000017500000007030312643540057023700 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/applayer DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libhbciapp_la_LIBADD = am_libhbciapp_la_OBJECTS = adminjobs.lo outbox.lo hhd.lo libhbciapp_la_OBJECTS = $(am_libhbciapp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libhbciapp_la_SOURCES) DIST_SOURCES = $(libhbciapp_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = xml AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../ajobs \ -I$(srcdir)/../joblayer -I$(srcdir)/../msglayer -I$(srcdir)/.. EXTRA_DIST = README itan.inc itan1.inc itan2.inc noinst_LTLIBRARIES = libhbciapp.la noinst_HEADERS = \ adminjobs_l.h adminjobs_p.h\ outbox_l.h outbox_p.h \ hhd_l.h hhd_p.h libhbciapp_la_SOURCES = \ adminjobs.c \ outbox.c \ hhd.c CLEANFILES = $(xmldata_DATA) tmp.xml all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/applayer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/applayer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libhbciapp.la: $(libhbciapp_la_OBJECTS) $(libhbciapp_la_DEPENDENCIES) $(EXTRA_libhbciapp_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libhbciapp_la_OBJECTS) $(libhbciapp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adminjobs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hhd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outbox.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am sources: for f in $(libhbciapp_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/outbox.c0000644000175000017500000016414412364015477023331 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "outbox_p.h" #include "aqhbci_l.h" #include "job_l.h" #include "accountjob_l.h" #include "jobqueue_l.h" #include "hbci_l.h" #include "adminjobs_l.h" #include "dialog_l.h" #include "jobmultitransfer_l.h" #include #include #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_OUTBOX__CBOX, AH_Outbox__CBox); AH_OUTBOX__CBOX *AH_Outbox__CBox_new(AH_HBCI *hbci, AB_USER *u, AH_OUTBOX *ob) { AH_OUTBOX__CBOX *cbox; assert(hbci); assert(u); GWEN_NEW_OBJECT(AH_OUTBOX__CBOX, cbox); cbox->usage=1; GWEN_LIST_INIT(AH_OUTBOX__CBOX, cbox); cbox->user=u; cbox->todoQueues=AH_JobQueue_List_new(); cbox->finishedQueues=AH_JobQueue_List_new(); cbox->todoJobs=AH_Job_List_new(); cbox->finishedJobs=AH_Job_List_new(); cbox->pendingJobs=AB_Job_List2_new(); cbox->hbci=hbci; cbox->outbox=ob; return cbox; } void AH_Outbox__CBox_free(AH_OUTBOX__CBOX *cbox){ if (cbox) { assert(cbox->usage); if (--(cbox->usage)==0) { GWEN_LIST_FINI(AH_OUTBOX__CBOX, cbox); AB_Job_List2_free(cbox->pendingJobs); AH_JobQueue_List_free(cbox->todoQueues); AH_JobQueue_List_free(cbox->finishedQueues); AH_Job_List_free(cbox->todoJobs); AH_Job_List_free(cbox->finishedJobs); GWEN_FREE_OBJECT(cbox); } } } void AH_Outbox__CBox_AddTodoJob(AH_OUTBOX__CBOX *cbox, AH_JOB *j) { assert(cbox); assert(j); AH_Job_SetStatus(j, AH_JobStatusToDo); AH_Job_List_Add(j, cbox->todoJobs); } void AH_Outbox__CBox_AddPendingJob(AH_OUTBOX__CBOX *cbox, AB_JOB *bj) { assert(cbox); assert(bj); AB_Job_List2_PushBack(cbox->pendingJobs, bj); } int AH_Outbox__CBox_CheckPending(AH_OUTBOX__CBOX *cbox) { AH_JOB *j; if (AB_Job_List2_GetSize(cbox->pendingJobs)==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No pending jobs to check"); return 0; } j=AH_Job_List_First(cbox->finishedJobs); while(j) { if (AH_Job_GetStatus(j)!=AH_JobStatusError) { const char *s; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Got a job without errors"); s=AH_Job_GetName(j); assert(s); if (strcasecmp(s, "JobGetStatus")==0) { GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Got a GetStatus job"); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while (dbCurr) { GWEN_DB_NODE *dbResult; int rv; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_WARN(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_WARN(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); return rv; } dbResult=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/GetStatusResponse"); if (dbResult) { const char *rDialogId; uint32_t rMsgNum; uint32_t rSegNum; int rCode; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Checking status response"); rDialogId=GWEN_DB_GetCharValue(dbResult, "msgref/dialogId", 0, 0); rMsgNum=GWEN_DB_GetIntValue(dbResult, "msgref/msgNum", 0, 0); rSegNum=GWEN_DB_GetIntValue(dbResult, "refSegNum", 0, 0); rCode=GWEN_DB_GetIntValue(dbResult, "result/resultcode", 0, 0); if (rDialogId && rMsgNum && rSegNum && rCode) { AB_JOB_LIST2_ITERATOR *it; /* find pending job for this result */ it=AB_Job_List2_First(cbox->pendingJobs); if (it) { AB_JOB *bj; bj=AB_Job_List2Iterator_Data(it); while(bj) { GWEN_DB_NODE *dbJ; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Checking pending job"); dbJ=AB_Job_GetProviderData(bj, AH_HBCI_GetProvider(cbox->hbci)); assert(dbJ); dbJ=GWEN_DB_GetGroup(dbJ, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "msgRef"); if (dbJ) { const char *jDialogId; uint32_t jMsgNum; uint32_t jFirstSeg; uint32_t jLastSeg; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Pending job has a message reference"); jDialogId=GWEN_DB_GetCharValue(dbJ, "dialogId", 0, 0); jMsgNum=GWEN_DB_GetIntValue(dbJ, "msgnum", 0, 0); jFirstSeg=GWEN_DB_GetIntValue(dbJ, "firstSeg", 0, 0); jLastSeg=GWEN_DB_GetIntValue(dbJ, "lastSeg", 0, 0); if (jDialogId && jMsgNum && jFirstSeg && jLastSeg) { if ((rMsgNum==jMsgNum) && ((rSegNum>=jFirstSeg && rSegNum<=jLastSeg)) && (strcasecmp(rDialogId, jDialogId)==0)) { /* result matches */ if (rCode>=9000 && rCode<=9999) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error result for pending job"); AB_Job_SetStatus(bj, AB_Job_StatusError); } else { if (AB_Job_GetStatus(bj)==AB_Job_StatusPending) { /* only modify status here if job is still * pending. So if some result flagged an error * the result will not be changed */ if (rCode==10) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job is still pending"); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Pending job now finished"); AB_Job_SetStatus(bj, AB_Job_StatusFinished); } } /* if status is pending */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Status is not \"pending\""); } } /* if non-error response */ break; } /* if result is for this job */ else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Result is not for this pending job"); } } /* if all needed fields in job are valid */ else { DBG_WARN(AQHBCI_LOGDOMAIN, "Pending job is incomplete"); } } /* if job has a message reference */ else { DBG_WARN(AQHBCI_LOGDOMAIN, "Pending job has no message reference"); } bj=AB_Job_List2Iterator_Next(it); } /* while */ AB_Job_List2Iterator_free(it); } /* if there are pending jobs */ } /* if all needed fields in result are valid */ } /* if current response group is a result */ else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Not a status response"); } dbCurr=GWEN_DB_GetNextGroup(dbCurr); } /* while */ } /* if jobGetStatus */ } /* if job is ok */ else { DBG_WARN(AQHBCI_LOGDOMAIN, "Skipping job, it has errors"); } j=AH_Job_List_Next(j); } /* while jobs */ return 0; } void AH_Outbox__CBox_Finish(AH_OUTBOX__CBOX *cbox){ AH_JOBQUEUE *jq; assert(cbox); DBG_INFO(AQHBCI_LOGDOMAIN, "Finishing customer box"); while((jq=AH_JobQueue_List_First(cbox->finishedQueues))) { AH_JOB_LIST *jl; AH_JOB *j; jl=AH_JobQueue_TakeJobList(jq); assert(jl); while((j=AH_Job_List_First(jl))) { DBG_INFO(AQHBCI_LOGDOMAIN, "Moving job \"%s\" from finished queue to finished jobs", AH_Job_GetName(j)); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); } /* while */ AH_Job_List_free(jl); AH_JobQueue_free(jq); } /* while */ while((jq=AH_JobQueue_List_First(cbox->todoQueues))) { AH_JOB_LIST *jl; AH_JOB *j; jl=AH_JobQueue_TakeJobList(jq); assert(jl); while((j=AH_Job_List_First(jl))) { DBG_INFO(AQHBCI_LOGDOMAIN, "Moving job \"%s\" from todo queue to finished jobs", AH_Job_GetName(j)); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); } /* while */ AH_Job_List_free(jl); AH_JobQueue_free(jq); } /* while */ if (AH_Job_List_GetCount(cbox->todoJobs)) { AH_JOB *j; while((j=AH_Job_List_First(cbox->todoJobs))) { DBG_INFO(AQHBCI_LOGDOMAIN, "Moving job \"%s\" from todo queue to finished jobs", AH_Job_GetName(j)); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); } /* while */ } /* check for results for pending jobs */ AH_Outbox__CBox_CheckPending(cbox); } AB_USER *AH_Outbox__CBox_GetUser(const AH_OUTBOX__CBOX *cbox){ assert(cbox); return cbox->user; } AH_JOB_LIST *AH_Outbox__CBox_TakeFinishedJobs(AH_OUTBOX__CBOX *cbox){ AH_JOB_LIST *jl; assert(cbox); jl=cbox->finishedJobs; cbox->finishedJobs=AH_Job_List_new(); return jl; } GWEN_TIME *AH_Outbox__CBox_GetEarliestPendingDate(AH_OUTBOX__CBOX *cbox) { AB_JOB_LIST2_ITERATOR *it; GWEN_TIME *ti; assert(cbox); assert(cbox->pendingJobs); ti=0; it=AB_Job_List2_First(cbox->pendingJobs); if (it) { AB_JOB *bj; bj=AB_Job_List2Iterator_Data(it); while(bj) { GWEN_DB_NODE *db; GWEN_TIME *tti; db=AB_Job_GetProviderData(bj, AH_HBCI_GetProvider(cbox->hbci)); assert(db); tti=AB_Job_DateFromDb(db, "sendtime"); if (tti) { if (!ti) ti=tti; else { if (GWEN_Time_Diff(tti, ti)>0) { GWEN_Time_free(ti); ti=tti; } else GWEN_Time_free(tti); } } bj=AB_Job_List2Iterator_Next(it); } AB_Job_List2Iterator_free(it); } return ti; } GWEN_TIME *AH_Outbox__CBox_GetLatestPendingDate(AH_OUTBOX__CBOX *cbox) { AB_JOB_LIST2_ITERATOR *it; GWEN_TIME *ti; assert(cbox); assert(cbox->pendingJobs); ti=0; it=AB_Job_List2_First(cbox->pendingJobs); if (it) { AB_JOB *bj; bj=AB_Job_List2Iterator_Data(it); while(bj) { GWEN_DB_NODE *db; GWEN_TIME *tti; db=AB_Job_GetProviderData(bj, AH_HBCI_GetProvider(cbox->hbci)); assert(db); tti=AB_Job_DateFromDb(db, "sendtime"); if (tti) { if (!ti) ti=tti; else { if (GWEN_Time_Diff(ti, tti)>0) { GWEN_Time_free(ti); ti=tti; } else GWEN_Time_free(tti); } } bj=AB_Job_List2Iterator_Next(it); } AB_Job_List2Iterator_free(it); } return ti; } int AH_Outbox__CBox_Prepare(AH_OUTBOX__CBOX *cbox){ AH_JOB *j; unsigned int errors; AH_JOBQUEUE *jq; int firstJob; assert(cbox); errors=0; /* call AH_Job_Prepare() for all jobs */ j=AH_Job_List_First(cbox->todoJobs); while(j) { AH_JOB_STATUS st; AH_JOB *next; next=AH_Job_List_Next(j); st=AH_Job_GetStatus(j); if (st==AH_JobStatusToDo) { int rv=AH_Job_Prepare(j); if (rv<0 && rv!=GWEN_ERROR_NOT_SUPPORTED) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); errors++; } } /* if status TODO */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Skip job \"%s\" for its status \"%s\" (%d)", AH_Job_GetName(j), AH_Job_StatusName(st), st); AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); errors++; } j=next; } /* while */ /* add JobGetStatus if there are any pending jobs for this customer */ if (AB_Job_List2_GetSize(cbox->pendingJobs)) { AH_JOB *sj; GWEN_TIME *t1; GWEN_TIME *t2; /* have some pending jobs, add status call */ DBG_INFO(AQHBCI_LOGDOMAIN, "Will ask for status reports"); t1=AH_Outbox__CBox_GetEarliestPendingDate(cbox); t2=AH_Outbox__CBox_GetLatestPendingDate(cbox); sj=AH_Job_GetStatus_new(cbox->user, t1, t2); GWEN_Time_free(t2); GWEN_Time_free(t1); if (sj) { AH_Job_AddFlags(sj, AH_JOB_FLAGS_OUTBOX); AH_Job_AddSigner(sj, AB_User_GetUserId(cbox->user)); AH_Outbox__CBox_AddTodoJob(cbox, sj); } else { DBG_WARN(AQHBCI_LOGDOMAIN, "JobGetStatus not available, cannot check pending jobs"); } } /* if attached jobs */ /* move all dialog jobs to new queues or to the list of finished jobs */ DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing dialog jobs"); j=AH_Job_List_First(cbox->todoJobs); while(j) { AH_JOB_STATUS st; AH_JOB *next; next=AH_Job_List_Next(j); st=AH_Job_GetStatus(j); if (st==AH_JobStatusToDo) { if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_DLGJOB) { /* this is a dialog job, create a new queue for it */ AH_JOBQUEUE *jq; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing dialog job \"%s\"", AH_Job_GetName(j)); jq=AH_JobQueue_new(cbox->user); AH_Job_List_Del(j); if (AH_JobQueue_AddJob(jq, j)!=AH_JobQueueAddResultOk) { /* error adding a single job to the queue */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add dialog job \"%s\" to queue", AH_Job_GetName(j)); /* set status to ERROR and move to finished queue */ AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Add(j, cbox->finishedJobs); AH_JobQueue_free(jq); errors++; } else { AH_Job_Log(j, GWEN_LoggerLevel_Info, "Dialog job enqueued"); /* job added. This is a dialog job, so we need to begin and * and end the dialog */ AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_BEGINDIALOG); /*AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_ENDDIALOG); DEBUG */ AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_ISDIALOG); AH_JobQueue_List_Add(jq, cbox->todoQueues); } /* if added to queue */ } /* if dialog job */ } /* if status TODO */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Skip job \"%s\" for its status \"%s\" (%d)", AH_Job_GetName(j), AH_Job_StatusName(st), st); AH_Job_List_Add(j, cbox->finishedJobs); } j=next; } /* while */ /* now todoJobs only contains non-dialog jobs with a correct status, * append them to new queues as needed */ DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing non-dialog jobs"); jq=AH_JobQueue_new(cbox->user); AH_JobQueue_AddFlags(jq, AH_JOBQUEUE_FLAGS_BEGINDIALOG); firstJob=1; DBG_INFO(AQHBCI_LOGDOMAIN, "We have %d jobs to handle", AH_Job_List_GetCount(cbox->todoJobs)); while(AH_Job_List_GetCount(cbox->todoJobs)) { int jobsAdded; int queueCreated; AH_JOB_LIST *retryJobs; DBG_INFO(AQHBCI_LOGDOMAIN, "Still some jobs left todo"); jobsAdded=0; queueCreated=0; retryJobs=AH_Job_List_new(); while( (j=AH_Job_List_First(cbox->todoJobs)) ) { AH_JOBQUEUE_ADDRESULT res; DBG_INFO(AQHBCI_LOGDOMAIN, "Queueing job \"%s\"", AH_Job_GetName(j)); AH_Job_List_Del(j); res=AH_JobQueue_AddJob(jq, j); if (res!=AH_JobQueueAddResultOk) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not add job \"%s\" to the current queue", AH_Job_GetName(j)); if (firstJob) { /* error adding a single job to the queue */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add single non-dialog job \"%s\" to queue", AH_Job_GetName(j)); /* set status to ERROR and move to finished queue */ AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Add(j, cbox->finishedJobs); AH_Job_Log(j, GWEN_LoggerLevel_Error, "Could not enqueing HBCI-job"); errors++; } /* if first job failed */ else { /* not the first job, check for reason of failure */ if (res==AH_JobQueueAddResultQueueFull) { /* queue is full, so add it to the todo queue list and start * a new queue */ DBG_INFO(AQHBCI_LOGDOMAIN, "Queue full, starting next one"); AH_JobQueue_List_Add(jq, cbox->todoQueues); jq=AH_JobQueue_new(cbox->user); firstJob=1; queueCreated=1; /* put job back into queue (same pos, try it again in next loop)*/ AH_Job_List_Insert(j, cbox->todoJobs); break; } else if (res==AH_JobQueueAddResultJobLimit) { DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" does not fit into queue, will retry later", AH_Job_GetName(j)); /* move job to the end of the queue (retry it later) */ AH_Job_List_Add(j, retryJobs); } else { /* error adding a job to the queue */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add non-dialog job \"%s\" to queue for " "unknown reason %d", AH_Job_GetName(j), res); /* set status to ERROR and move to finished queue */ AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Add(j, cbox->finishedJobs); errors++; } } /* if it wasn't the first job to fail */ } /* if adding to the queue failed */ else { /* job added successfully */ DBG_INFO(AQHBCI_LOGDOMAIN, "Job \"%s\" successfully added", AH_Job_GetName(j)); AH_Job_Log(j, GWEN_LoggerLevel_Info, "HBCI-job enqueued (1)"); firstJob=0; jobsAdded++; } } /* while */ /* put back all jobs we dismissed */ j=AH_Job_List_First(retryJobs); if (j) { while(j) { AH_JOB *jnext; jnext=AH_Job_List_Next(j); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Moving job \"%s\" back to queue", AH_Job_GetName(j)); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->todoJobs); j=jnext; } /* there are some retry jobs, retry them */ if (AH_JobQueue_GetCount(jq)!=0) { AH_JobQueue_List_Add(jq, cbox->todoQueues); jq=AH_JobQueue_new(cbox->user); firstJob=1; queueCreated=1; } } AH_Job_List_free(retryJobs); retryJobs=NULL; /* check whether we could do something in the last loop */ if (!jobsAdded && !queueCreated) { AH_JOB *j; DBG_ERROR(AQHBCI_LOGDOMAIN, "Could do nothing in last loop, " "discarding remaining jobs"); j=AH_Job_List_First(cbox->todoJobs); while(j) { AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_List_Del(j); AH_Job_List_Add(j, cbox->finishedJobs); errors++; j=AH_Job_List_Next(j); } /* while */ /* break the loop */ break; } /* if we couldn't do anything */ else { DBG_INFO(AQHBCI_LOGDOMAIN, "Still something to do"); } } /* while still todoJobs */ /* check whether to free the current queue */ if (AH_JobQueue_GetCount(jq)==0) { /* current queue is empty, free it */ DBG_INFO(AQHBCI_LOGDOMAIN, "Last queue is empty, deleting it"); AH_JobQueue_free(jq); } else { /* it is not, so add it to the todo list */ DBG_INFO(AQHBCI_LOGDOMAIN, "Adding last queue"); AH_JobQueue_List_Add(jq, cbox->todoQueues); } if (errors) { DBG_INFO(AQHBCI_LOGDOMAIN, "Some errors (%d) occurred", errors); return -1; } return 0; } int AH_Outbox__CBox_SendQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq){ AH_MSG *msg; int rv; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Encoding queue")); msg=AH_JobQueue_ToMessage(jq, dlg); if (!msg) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encode queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Unable to encode")); return GWEN_ERROR_GENERIC; } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Sending queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Sending queue")); rv=AH_Dialog_SendMessage(dlg, msg); AH_Msg_free(msg); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not send message"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Unable to send (network error)")); return rv; } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Message sent"); return 0; } int AH_Outbox__CBox_RecvQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq){ AH_MSG *msg; GWEN_DB_NODE *rsp; int rv; assert(cbox); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Waiting for response")); rv=AH_Dialog_RecvMessage(dlg, &msg); if (rv>=200 && rv<300) rv=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error receiving response (%d)", rv); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Error receiving response (%d)"), rv); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Got a message"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Response received")); /* try to dispatch the message */ rsp=GWEN_DB_Group_new("response"); if (AH_Msg_DecodeMsg(msg, rsp, GWEN_MSGENGINE_READ_FLAGS_DEFAULT)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message:"); AH_Msg_Dump(msg, 2); GWEN_DB_Group_free(rsp); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad response (unable to decode)")); return GWEN_ERROR_GENERIC; } /* transform from ISO 8859-1 to UTF8 */ AB_ImExporter_DbFromIso8859_1ToUtf8(rsp); /* check for message reference */ if (AH_Msg_GetMsgRef(msg)==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unrequested message, deleting it"); AH_Msg_Dump(msg, 2); GWEN_DB_Dump(rsp, 2); GWEN_DB_Group_free(rsp); AH_Msg_free(msg); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad response (bad message reference)")); return GWEN_ERROR_GENERIC; } rv=AH_JobQueue_DispatchMessage(jq, msg, rsp); if (rv) { if (rv==GWEN_ERROR_ABORTED) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog aborted by server"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Dialog aborted by server")); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not dispatch response"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad response (unable to dispatch)")); } GWEN_DB_Group_free(rsp); AH_Msg_free(msg); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Message dispatched"); GWEN_DB_Group_free(rsp); AH_Msg_free(msg); return 0; } int AH_Outbox__CBox_SendAndRecvQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq){ int rv; if ((AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_NEEDTAN) && AH_Dialog_GetItanProcessType(dlg)!=0) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "iTAN mode"); rv=AH_Outbox__CBox_Itan(cbox, dlg, jq); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Normal mode"); rv=AH_Outbox__CBox_SendQueue(cbox, dlg, jq); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error sending queue"); return rv; } AH_JobQueue_SetJobStatusOnMatch(jq, AH_JobStatusEncoded, AH_JobStatusSent); rv=AH_Outbox__CBox_RecvQueue(cbox, dlg, jq); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error receiving queue response"); return rv; } } return 0; } int AH_Outbox__CBox_OpenDialog(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, uint32_t jqFlags) { AH_JOBQUEUE *jqDlgOpen; AH_JOB *jDlgOpen; int rv; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating dialog open request"); AH_Dialog_SetItanProcessType(dlg, 0); if ((jqFlags & AH_JOBQUEUE_FLAGS_CRYPT) || (jqFlags & AH_JOBQUEUE_FLAGS_SIGN)) { /* sign and crypt, not anonymous */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating non-anonymous dialog open request"); jDlgOpen=AH_Job_new("JobDialogInit", cbox->user, 0, 0); if (!jDlgOpen) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create job JobDialogInit"); return GWEN_ERROR_GENERIC; } if (jqFlags & AH_JOBQUEUE_FLAGS_SIGN) AH_Job_AddSigner(jDlgOpen, AB_User_GetUserId(cbox->user)); AH_Dialog_SubFlags(dlg, AH_DIALOG_FLAGS_ANONYMOUS); if (AH_User_GetCryptMode(cbox->user)==AH_CryptMode_Pintan) { if (AH_User_HasTanMethodOtherThan(cbox->user, 999) && !(jqFlags & AH_JOBQUEUE_FLAGS_NOITAN)) { /* only use itan if any other mode than singleStep is available * and the job queue does not request non-ITAN mode */ rv=AH_Outbox__CBox_SelectItanMode(cbox, dlg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } } } else { /* neither sign nor crypt, use anonymous dialog */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating anonymous dialog open request"); jDlgOpen=AH_Job_new("JobDialogInitAnon", cbox->user, 0, 0); if (!jDlgOpen) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create job JobDialogInitAnon"); return GWEN_ERROR_GENERIC; } AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_ANONYMOUS); } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Opening dialog")); jqDlgOpen=AH_JobQueue_new(cbox->user); AH_JobQueue_AddFlags(jqDlgOpen, AH_JOBQUEUE_FLAGS_OUTBOX); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Enqueueing dialog open request"); if (AH_JobQueue_AddJob(jqDlgOpen, jDlgOpen)!= AH_JobQueueAddResultOk) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add single job to queue"); AH_Job_free(jDlgOpen); AH_JobQueue_free(jqDlgOpen); return GWEN_ERROR_GENERIC; } rv=AH_Outbox__CBox_SendAndRecvQueue(cbox, dlg, jqDlgOpen); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not exchange message"); AH_JobQueue_free(jqDlgOpen); return rv; } if (AH_Job_HasErrors(jDlgOpen)) { /* TODO: check for iTAN related error and try again */ if (AH_Job_HasItanResult(jDlgOpen)) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Adjusting to iTAN modes of the server"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Adjusting to iTAN modes of the server")); /* do not call AH_Job_CommitSystemData() here, the iTAN modes have already * been caught by AH_JobQueue_DispatchMessage() AH_Job_CommitSystemData(jDlgOpen); */ AH_JobQueue_free(jqDlgOpen); return 1; } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error opening dialog, aborting"); AH_JobQueue_free(jqDlgOpen); return GWEN_ERROR_GENERIC; } } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Dialog open request done"); rv=AH_Job_CommitSystemData(jDlgOpen, 0); AH_JobQueue_free(jqDlgOpen); return rv; } int AH_Outbox__CBox_CloseDialog(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, uint32_t jqFlags) { AH_JOBQUEUE *jqDlgClose; AH_JOB *jDlgClose; GWEN_DB_NODE *db; uint32_t dlgFlags; int rv; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Closing dialog")); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Sending dialog close request (flags=%08x)", jqFlags); dlgFlags=AH_Dialog_GetFlags(dlg); jDlgClose=AH_Job_new("JobDialogEnd", cbox->user, 0, 0); if (!jDlgClose) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create job JobDialogEnd"); return GWEN_ERROR_GENERIC; } /* set some parameters */ db=AH_Job_GetArguments(jDlgClose); assert(db); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "dialogId", AH_Dialog_GetDialogId(dlg)); if (!(dlgFlags & AH_DIALOG_FLAGS_ANONYMOUS)) { /* sign and encrypt job */ DBG_INFO(AQHBCI_LOGDOMAIN, "Will encrypt and sign dialog close request"); AH_Job_AddSigner(jDlgClose, AB_User_GetUserId(cbox->user)); AH_Job_AddFlags(jDlgClose, AH_JOB_FLAGS_CRYPT | AH_JOB_FLAGS_SIGN); } jqDlgClose=AH_JobQueue_new(cbox->user); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Adding dialog close request to queue"); if (AH_JobQueue_AddJob(jqDlgClose, jDlgClose)!= AH_JobQueueAddResultOk) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add single job to queue"); AH_JobQueue_free(jqDlgClose); return GWEN_ERROR_GENERIC; } rv=AH_Outbox__CBox_SendAndRecvQueue(cbox, dlg, jqDlgClose); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not exchange message"); AH_JobQueue_free(jqDlgClose); return rv; } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Dialog closed"); rv=AH_Job_CommitSystemData(jDlgClose, 0); AH_JobQueue_free(jqDlgClose); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not commit system data"); return rv; } return 0; } void AH_Outbox__CBox_HandleQueueError(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE *jq, const char *logStr) { AH_JOB *j; AH_JOB_LIST *jl; jl=AH_JobQueue_TakeJobList(jq); assert(jl); while((j=AH_Job_List_First(jl))) { AH_Job_List_Del(j); if (AH_Job_GetStatus(j)!=AH_JobStatusAnswered) { DBG_INFO(AQHBCI_LOGDOMAIN, "Setting status of job \"%s\" to ERROR", AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusError); if (logStr) AH_Job_Log(j, GWEN_LoggerLevel_Error, logStr); } AH_Job_List_Add(j, cbox->finishedJobs); } AH_Job_List_free(jl); AH_JobQueue_free(jq); } int AH_Outbox__CBox_PerformQueue(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq) { int rv; for (;;) { AH_JOBQUEUE *jqTodo; int jobsTodo; uint32_t jqFlags; AH_JOB *j; AH_JOB_LIST *jl; jobsTodo=0; jl=AH_JobQueue_TakeJobList(jq); assert(jl); jqTodo=AH_JobQueue_new(AH_JobQueue_GetUser(jq)); /* copy some flags */ jqFlags=AH_JobQueue_GetFlags(jq); jqFlags&=~(AH_JOBQUEUE_FLAGS_CRYPT | AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_NOSYSID | AH_JOBQUEUE_FLAGS_NOITAN); AH_JobQueue_SetFlags(jqTodo, (jqFlags&AH_JOBQUEUE_FLAGS_COPYMASK)); /* copy todo jobs */ while((j=AH_Job_List_First(jl))) { AH_Job_List_Del(j); if (AH_Job_GetStatus(j)==AH_JobStatusAnswered) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message finished"); /* prepare job for next message * (if attachpoint or multi-message job) */ AH_Job_PrepareNextMessage(j); if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_HASMOREMSGS) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Requeueing job"); /* we shall redo this job */ if (AH_JobQueue_AddJob(jqTodo, j)!= AH_JobQueueAddResultOk){ DBG_ERROR(AQHBCI_LOGDOMAIN, "That's weird, I could not add the job to redo queue"); AH_Job_Log(j, GWEN_LoggerLevel_Error, "Could not re-enqueue HBCI-job"); AH_Job_SetStatus(j, AH_JobStatusError); } else { jobsTodo++; AH_Job_Log(j, GWEN_LoggerLevel_Info, "HBCI-job re-enqueued (multi-message job)"); j=0; /* mark that this job has been dealt with */ } } /* if more messages */ else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Not requeing job"); } } /* if status matches */ else if (AH_Job_GetStatus(j)==AH_JobStatusEnqueued) { if (AH_JobQueue_AddJob(jqTodo, j)!= AH_JobQueueAddResultOk){ DBG_ERROR(AQHBCI_LOGDOMAIN, "That's weird, I could not add the job to redo queue"); AH_Job_SetStatus(j, AH_JobStatusError); AH_Job_Log(j, GWEN_LoggerLevel_Error, "Could not enqueue HBCI-job"); } else { jobsTodo++; AH_Job_Log(j, GWEN_LoggerLevel_Info, "HBCI-job enqueued (2)"); j=0; /* mark that this job has been dealt with */ } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Bad status \"%s\" (%d)", AH_Job_StatusName(AH_Job_GetStatus(j)), AH_Job_GetStatus(j)); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) AH_Job_Dump(j, stderr, 4); } if (j) { /* move job to finished list if we still have the job */ AH_Job_List_Add(j, cbox->finishedJobs); } } /* while */ AH_Job_List_free(jl); AH_JobQueue_free(jq); jq=jqTodo; if (!jobsTodo) break; /* jq now contains all jobs to be executed */ rv=AH_Outbox__CBox_SendAndRecvQueue(cbox, dlg, jq); if (rv) { AH_Outbox__CBox_HandleQueueError(cbox, jq, "Error performing queue"); return rv; } /* if error */ } /* for */ AH_JobQueue_free(jq); return 0; } int AH_Outbox__CBox_PerformNonDialogQueues(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE_LIST *jql){ AH_DIALOG *dlg; AH_JOBQUEUE *jq; int rv=0; int i; uint32_t jqflags; if (AH_JobQueue_List_GetCount(jql)==0) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "No queues to handle, doing nothing"); AH_JobQueue_List_free(jql); return 0; } for(i=0; i<2; i++) { dlg=AH_Dialog_new(cbox->user); rv=AH_Dialog_Connect(dlg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not begin a dialog for customer \"%s\" (%d)", AB_User_GetCustomerId(cbox->user), rv); /* finish all queues */ AH_Outbox__CBox_HandleQueueListError(cbox, jql, "Could not begin dialog"); AH_Dialog_free(dlg); return rv; } jq=AH_JobQueue_List_First(jql); jqflags=AH_JobQueue_GetFlags(jq); /* open dialog */ rv=AH_Outbox__CBox_OpenDialog(cbox, dlg, jqflags); if (rv==0) break; else if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open dialog"); AH_Dialog_Disconnect(dlg); /* finish all queues */ AH_Outbox__CBox_HandleQueueListError(cbox, jql, "Could not open dialog"); AH_Dialog_free(dlg); return rv; } else if (rv==1) { AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Retrying to open dialog")); } } if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open dialog"); AH_Dialog_Disconnect(dlg); /* finish all queues */ AH_Outbox__CBox_HandleQueueListError(cbox, jql, "Could not open dialog"); AH_Dialog_free(dlg); return rv; } /* handle queues */ rv=0; while((jq=AH_JobQueue_List_First(jql))) { AH_JobQueue_List_Del(jq); rv=AH_Outbox__CBox_PerformQueue(cbox, dlg, jq); if (rv) break; } /* while */ if (rv) { /* finish all remaining queues */ AH_Outbox__CBox_HandleQueueListError(cbox, jql, "Could not send "); AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); return rv; } /* close dialog */ rv=AH_Outbox__CBox_CloseDialog(cbox, dlg, jqflags); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not close dialog, ignoring"); /*AH_HBCI_EndDialog(cbox->hbci, dlg); return rv;*/ } DBG_INFO(AQHBCI_LOGDOMAIN, "Closing connection"); AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); AH_JobQueue_List_free(jql); return 0; } int AH_Outbox__CBox_PerformDialogQueue(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE *jq){ AH_DIALOG *dlg; int rv; /* open connection */ dlg=AH_Dialog_new(cbox->user); rv=AH_Dialog_Connect(dlg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not begin a dialog for customer \"%s\" (%d)", AB_User_GetCustomerId(cbox->user), rv); /* finish all queues */ AH_Outbox__CBox_HandleQueueError(cbox, jq, "Could not begin dialog"); AH_Dialog_free(dlg); return rv; } /* select iTAN mode */ if (!(AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_NOITAN)) { rv=AH_Outbox__CBox_SelectItanMode(cbox, dlg); if (rv) { AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); return rv; } } /* handle queue */ rv=AH_Outbox__CBox_PerformQueue(cbox, dlg, jq); if (rv) { AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); return rv; } /* close connection */ DBG_INFO(AQHBCI_LOGDOMAIN, "Closing connection"); AH_Dialog_Disconnect(dlg); AH_Dialog_free(dlg); return 0; } void AH_Outbox__CBox_ExtractMatchingQueues(AH_JOBQUEUE_LIST *jql, AH_JOBQUEUE_LIST *jqlWanted, AH_JOBQUEUE_LIST *jqlRest, uint32_t jqflags, uint32_t jqmask) { AH_JOBQUEUE *jq; while((jq=AH_JobQueue_List_First(jql))) { uint32_t flags; AH_JobQueue_List_Del(jq); flags=AH_JobQueue_GetFlags(jq); if ((flags^jqflags) & jqmask) /* no match */ AH_JobQueue_List_Add(jq, jqlRest); else AH_JobQueue_List_Add(jq, jqlWanted); } /* while */ } void AH_Outbox__CBox_HandleQueueListError(AH_OUTBOX__CBOX *cbox, AH_JOBQUEUE_LIST *jql, const char *logStr){ AH_JOBQUEUE *jq; while((jq=AH_JobQueue_List_First(jql))) { AH_JobQueue_List_Del(jq); AH_Outbox__CBox_HandleQueueError(cbox, jq, logStr); } /* while */ AH_JobQueue_List_free(jql); } int AH_Outbox__CBox_SendAndRecvDialogQueues(AH_OUTBOX__CBOX *cbox) { AH_JOBQUEUE_LIST *jqlWanted; AH_JOBQUEUE_LIST *jqlRest; int rv; jqlWanted=AH_JobQueue_List_new(); jqlRest=AH_JobQueue_List_new(); AH_Outbox__CBox_ExtractMatchingQueues(cbox->todoQueues, jqlWanted, jqlRest, AH_JOBQUEUE_FLAGS_ISDIALOG, AH_JOBQUEUE_FLAGS_ISDIALOG); AH_JobQueue_List_free(cbox->todoQueues); cbox->todoQueues=jqlRest; if (AH_JobQueue_List_GetCount(jqlWanted)) { AH_JOBQUEUE *jq; /* there are matching queues, handle them */ while((jq=AH_JobQueue_List_First(jqlWanted))) { AH_JobQueue_List_Del(jq); rv=AH_Outbox__CBox_PerformDialogQueue(cbox, jq); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing queue (%d)", rv); AH_Outbox__CBox_HandleQueueListError(cbox, jqlWanted, "Could not perform " "dialog queue"); AH_Outbox__CBox_HandleQueueListError(cbox, cbox->todoQueues, "Could not perform " "dialog queue"); cbox->todoQueues=AH_JobQueue_List_new(); return rv; } } /* while */ } AH_JobQueue_List_free(jqlWanted); return 0; } int AH_Outbox__CBox_SendAndRecvSelected(AH_OUTBOX__CBOX *cbox, uint32_t jqflags, uint32_t jqmask){ AH_JOBQUEUE_LIST *jqlWanted; AH_JOBQUEUE_LIST *jqlRest; int rv; jqlWanted=AH_JobQueue_List_new(); jqlRest=AH_JobQueue_List_new(); AH_Outbox__CBox_ExtractMatchingQueues(cbox->todoQueues, jqlWanted, jqlRest, jqflags, jqmask); AH_JobQueue_List_free(cbox->todoQueues); cbox->todoQueues=jqlRest; if (AH_JobQueue_List_GetCount(jqlWanted)) { /* there are matching queues, handle them */ rv=AH_Outbox__CBox_PerformNonDialogQueues(cbox, jqlWanted); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error performing queue (%d)", rv); AH_Outbox__CBox_HandleQueueListError(cbox, cbox->todoQueues, "Error performing " "selected jobs"); cbox->todoQueues=AH_JobQueue_List_new(); return rv; } } /* if matching queuees */ else AH_JobQueue_List_free(jqlWanted); return 0; } int AH_Outbox__CBox_SendAndRecvBox(AH_OUTBOX__CBOX *cbox){ int rv; /* dialog queues */ rv=AH_Outbox__CBox_SendAndRecvDialogQueues(cbox); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing dialog queues (%d)", rv); return rv; } /* non-dialog queues: unsigned, uncrypted */ rv=AH_Outbox__CBox_SendAndRecvSelected(cbox, 0, AH_JOBQUEUE_FLAGS_ISDIALOG | AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_CRYPT); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing queues (-S, -C: %d)", rv); return rv; } /* non-dialog queues: unsigned, crypted */ rv=AH_Outbox__CBox_SendAndRecvSelected(cbox, AH_JOBQUEUE_FLAGS_CRYPT, AH_JOBQUEUE_FLAGS_ISDIALOG | AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_CRYPT); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing queues (-S, +C: %d)", rv); return rv; } /* non-dialog queues: signed, uncrypted */ rv=AH_Outbox__CBox_SendAndRecvSelected(cbox, AH_JOBQUEUE_FLAGS_SIGN, AH_JOBQUEUE_FLAGS_ISDIALOG | AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_CRYPT); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing queues (+S, -C: %d)", rv); return rv; } /* non-dialog queues: signed, crypted */ rv=AH_Outbox__CBox_SendAndRecvSelected(cbox, AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_CRYPT, AH_JOBQUEUE_FLAGS_ISDIALOG | AH_JOBQUEUE_FLAGS_SIGN | AH_JOBQUEUE_FLAGS_CRYPT); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error performing queues (+S, +C: %d)", rv); return rv; } return 0; } AH_OUTBOX *AH_Outbox_new(AH_HBCI *hbci) { AH_OUTBOX *ob; assert(hbci); GWEN_NEW_OBJECT(AH_OUTBOX, ob); GWEN_INHERIT_INIT(AH_OUTBOX, ob); ob->hbci=hbci; ob->userBoxes=AH_Outbox__CBox_List_new(); ob->finishedJobs=AH_Job_List_new(); ob->usage=1; return ob; } void AH_Outbox_free(AH_OUTBOX *ob){ if (ob) { assert(ob->usage); if (--(ob->usage)==0) { AH_Outbox__CBox_List_free(ob->userBoxes); AH_Job_List_free(ob->finishedJobs); GWEN_INHERIT_FINI(AH_OUTBOX, ob); GWEN_FREE_OBJECT(ob); } } } void AH_Outbox_Attach(AH_OUTBOX *ob){ assert(ob); ob->usage++; } int AH_Outbox_Prepare(AH_OUTBOX *ob){ AH_OUTBOX__CBOX *cbox; unsigned int errors; assert(ob); errors=0; cbox=AH_Outbox__CBox_List_First(ob->userBoxes); while(cbox) { AB_USER *u; u=AH_Outbox__CBox_GetUser(cbox); DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing queues for customer \"%s\"", AB_User_GetCustomerId(u)); if (AH_Outbox__CBox_Prepare(cbox)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error preparing cbox"); errors++; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing queues for customer \"%s\": done", AB_User_GetCustomerId(u)); } cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ if (errors) { DBG_INFO(AQHBCI_LOGDOMAIN, "%d errors occurred", errors); return GWEN_ERROR_GENERIC; } return 0; } int AH_Outbox_LockUsers(AH_OUTBOX *ob, AB_USER_LIST2 *lockedUsers){ AH_OUTBOX__CBOX *cbox; AB_BANKING *ab; assert(ob); ab=AH_HBCI_GetBankingApi(ob->hbci); cbox=AH_Outbox__CBox_List_First(ob->userBoxes); while(cbox) { int rv; char tbuf[256]; DBG_INFO(AQHBCI_LOGDOMAIN, "Locking customer \"%s\"", AB_User_GetCustomerId(cbox->user)); snprintf(tbuf, sizeof(tbuf)-1, I18N("Locking user %s"), AB_User_GetUserId(cbox->user)); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, tbuf); rv=AB_Banking_BeginExclUseUser(ab, cbox->user); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not lock customer [%s] (%d)", AB_User_GetCustomerId(cbox->user), rv); snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not lock user %s (%d)"), AB_User_GetUserId(cbox->user), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); AH_Outbox_UnlockUsers(ob, lockedUsers, 1); /* abandon */ return rv; } cbox->isLocked=1; AB_User_List2_PushBack(lockedUsers, cbox->user); cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ return 0; } int AH_Outbox_UnlockUsers(AH_OUTBOX *ob, AB_USER_LIST2 *lockedUsers, int abandon){ int errors=0; AB_BANKING *ab; AB_USER_LIST2_ITERATOR *it; assert(ob); ab=AH_HBCI_GetBankingApi(ob->hbci); it=AB_User_List2_First(lockedUsers); if (it) { AB_USER *u; u=AB_User_List2Iterator_Data(it); while(u) { int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Unlocking customer \"%s\"", AB_User_GetCustomerId(u)); rv=AB_Banking_EndExclUseUser(ab, u, abandon); if (rv<0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); errors++; } u=AB_User_List2Iterator_Next(it); } AB_User_List2Iterator_free(it); } if (errors) return GWEN_ERROR_GENERIC; return 0; } static AH_OUTBOX__CBOX *AH_Outbox__FindCBox(const AH_OUTBOX *ob, const AB_USER *u) { AH_OUTBOX__CBOX *cbox; assert(ob); assert(u); cbox=AH_Outbox__CBox_List_First(ob->userBoxes); while(cbox) { if (AH_Outbox__CBox_GetUser(cbox)==u) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "CBox for customer \"%s\" found", AB_User_GetCustomerId(u)); return cbox; } cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ DBG_INFO(AQHBCI_LOGDOMAIN, "CBox for customer \"%s\" not found", AB_User_GetCustomerId(u)); return 0; } void AH_Outbox_AddJob(AH_OUTBOX *ob, AH_JOB *j){ AB_USER *u; AH_OUTBOX__CBOX *cbox; assert(ob); assert(j); u=AH_Job_GetUser(j); assert(u); cbox=AH_Outbox__FindCBox(ob, u); if (!cbox) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating CBox for customer \"%s\"", AB_User_GetCustomerId(u)); cbox=AH_Outbox__CBox_new(ob->hbci, u, ob); AH_Outbox__CBox_List_Add(cbox, ob->userBoxes); } /* attach to job so that it will never be destroyed from me */ AH_Job_Attach(j); AH_Outbox__CBox_AddTodoJob(cbox, j); } void AH_Outbox_AddPendingJob(AH_OUTBOX *ob, AB_JOB *bj){ AB_USER *u; AH_OUTBOX__CBOX *cbox; GWEN_DB_NODE *db; const char *customerId; const char *bankId; assert(ob); assert(bj); db=AB_Job_GetProviderData(bj, AH_HBCI_GetProvider(ob->hbci)); assert(db); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, 0); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); if (!customerId || !bankId) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job has never been sent by AqHBCI"); return; } u=AB_Banking_FindUser(AH_HBCI_GetBankingApi(ob->hbci), AH_PROVIDER_NAME, 0, bankId, "*", customerId); if (!u) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Customer %s at bank %s not found", customerId, bankId); return; } cbox=AH_Outbox__FindCBox(ob, u); if (!cbox) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating CBox for customer \"%s\"", AB_User_GetCustomerId(u)); cbox=AH_Outbox__CBox_new(ob->hbci, u, ob); AH_Outbox__CBox_List_Add(cbox, ob->userBoxes); } AH_Outbox__CBox_AddPendingJob(cbox, bj); } int AH_Outbox_StartSending(AH_OUTBOX *ob) { return AH_Outbox_Prepare(ob); } void AH_Outbox__FinishCBox(AH_OUTBOX *ob, AH_OUTBOX__CBOX *cbox){ AH_JOB_LIST *jl; AH_JOB *j; assert(ob); assert(cbox); AH_Outbox__CBox_Finish(cbox); jl=AH_Outbox__CBox_TakeFinishedJobs(cbox); assert(jl); while((j=AH_Job_List_First(jl))) { int rv; AH_JOB_STATUS st; AH_Job_List_Del(j); st=AH_Job_GetStatus(j); if (st==AH_JobStatusAnswered) { rv=AH_Job_Process(j, ob->context); if (rv) { char buf[256]; DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in job \"%s\": %d", AH_Job_GetName(j), rv); buf[0]=0; buf[sizeof(buf)-1]=0; snprintf(buf, sizeof(buf)-1, I18N("Error processing job %s"), AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusError); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, buf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Skipping job \"%s\" because of status \"%s\" (%d)", AH_Job_GetName(j), AH_Job_StatusName(st), st); } AH_Job_List_Add(j, ob->finishedJobs); } /* while */ AH_Job_List_free(jl); #if 0 /* unlock customer if necessary */ if (cbox->isLocked) { if (cbox->isLocked) { int rv; GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Info, I18N("Unlocking user %s"), AB_User_GetUserId(cbox->user)); DBG_INFO(AQHBCI_LOGDOMAIN, "Unlocking customer \"%s\"", AB_User_GetCustomerId(cbox->user)); rv=AB_Banking_EndExclUseUser(AH_HBCI_GetBankingApi(cbox->hbci), cbox->user, 0); cbox->isLocked=0; if (rv<0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(cbox->user), rv); } } } #endif } static void AH_Outbox__FinishOutbox(AH_OUTBOX *ob) { AH_OUTBOX__CBOX *cbox; assert(ob); while((cbox=AH_Outbox__CBox_List_First(ob->userBoxes))) { AH_Outbox__FinishCBox(ob, cbox); AH_Outbox__CBox_List_Del(cbox); AH_Outbox__CBox_free(cbox); } /* while */ } int AH_Outbox_SendAndRecv(AH_OUTBOX *ob){ AH_OUTBOX__CBOX *cbox; int rv; int errors; errors=0; while((cbox=AH_Outbox__CBox_List_First(ob->userBoxes))) { AB_USER *u; u=AH_Outbox__CBox_GetUser(cbox); DBG_INFO(AQHBCI_LOGDOMAIN, "Sending next message for customer \"%s\"", AB_User_GetCustomerId(u)); rv=AH_Outbox__CBox_SendAndRecvBox(cbox); AH_Outbox__FinishCBox(ob, cbox); AH_Outbox__CBox_List_Del(cbox); AH_Outbox__CBox_free(cbox); if (rv) errors++; if (rv==GWEN_ERROR_USER_ABORTED) { AH_Outbox__FinishOutbox(ob); return rv; } } /* while */ AH_Outbox__FinishOutbox(ob); return 0; } AH_JOB_LIST *AH_Outbox_GetFinishedJobs(AH_OUTBOX *ob){ assert(ob); assert(ob->usage); AH_Outbox__FinishOutbox(ob); return ob->finishedJobs; } void AH_Outbox_Commit(AH_OUTBOX *ob, int doLock){ AH_JOB *j; assert(ob); j=AH_Job_List_First(ob->finishedJobs); while(j) { if (AH_Job_GetStatus(j)==AH_JobStatusAnswered) { /* only commit answered jobs */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Committing job \"%s\"", AH_Job_GetName(j)); AH_Job_Commit(j, doLock); } j=AH_Job_List_Next(j); } /* while */ } void AH_Outbox_CommitSystemData(AH_OUTBOX *ob, int doLock){ AH_JOB *j; assert(ob); j=AH_Job_List_First(ob->finishedJobs); while(j) { if (AH_Job_GetStatus(j)==AH_JobStatusAnswered) { /* only commit answered jobs */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Committing job \"%s\"", AH_Job_GetName(j)); AH_Job_DefaultCommitHandler(j, doLock); } j=AH_Job_List_Next(j); } /* while */ } void AH_Outbox_Process(AH_OUTBOX *ob){ AH_JOB *j; assert(ob); j=AH_Job_List_First(ob->finishedJobs); while(j) { if (AH_Job_GetStatus(j)==AH_JobStatusAnswered) { int rv; /* only process answered jobs */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Processing job \"%s\"", AH_Job_GetName(j)); rv=AH_Job_Process(j, ob->context); if (rv) { char buf[256]; DBG_INFO(AQHBCI_LOGDOMAIN, "Error processing job \"%s\": %d", AH_Job_GetName(j), rv); AH_Job_SetStatus(j, AH_JobStatusError); buf[0]=0; buf[sizeof(buf)-1]=0; snprintf(buf, sizeof(buf)-1, I18N("Error processing job %s"), AH_Job_GetName(j)); GWEN_Gui_ProgressLog( 0, GWEN_LoggerLevel_Error, buf); } } j=AH_Job_List_Next(j); } /* while */ } unsigned int AH_Outbox_CountTodoJobs(AH_OUTBOX *ob){ unsigned int cnt; AH_OUTBOX__CBOX *cbox; assert(ob); cnt=0; cbox=AH_Outbox__CBox_List_First(ob->userBoxes); while(cbox) { AH_JOBQUEUE *jq; cnt+=AH_Job_List_GetCount(cbox->todoJobs); jq=AH_JobQueue_List_First(cbox->todoQueues); while(jq) { if (!(AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_OUTBOX)) { const AH_JOB_LIST *jl; jl=AH_JobQueue_GetJobList(jq); if (jl) { AH_JOB *j; j=AH_Job_List_First(jl); while(j) { if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_OUTBOX)) cnt++; j=AH_Job_List_Next(j); } /* while */ } } jq=AH_JobQueue_List_Next(jq); } /* while */ cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ return cnt; } unsigned int AH_Outbox__CountJobList(const AH_JOB_LIST *jl) { AH_JOB *j; unsigned int cnt; assert(jl); cnt=0; j=AH_Job_List_First(jl); while(j) { if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_OUTBOX)) cnt++; j=AH_Job_List_Next(j); } /* while */ return cnt; } unsigned int AH_Outbox_CountFinishedJobs(AH_OUTBOX *ob){ unsigned int cnt; AH_OUTBOX__CBOX *cbox; assert(ob); cnt=0; cnt+=AH_Outbox__CountJobList(ob->finishedJobs); cbox=AH_Outbox__CBox_List_First(ob->userBoxes); while(cbox) { AH_JOBQUEUE *jq; /* count jobs in queues */ jq=AH_JobQueue_List_First(cbox->finishedQueues); while(jq) { if (!(AH_JobQueue_GetFlags(jq) & AH_JOBQUEUE_FLAGS_OUTBOX)) { const AH_JOB_LIST *jl; jl=AH_JobQueue_GetJobList(jq); if (jl) { AH_JOB *j; j=AH_Job_List_First(jl); while(j) { if (!(AH_Job_GetFlags(j) & AH_JOB_FLAGS_OUTBOX)) cnt++; j=AH_Job_List_Next(j); } /* while */ } } jq=AH_JobQueue_List_Next(jq); } /* while */ /* count other finished jobs */ cnt+=AH_Outbox__CountJobList(cbox->finishedJobs); cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ return cnt; } int AH_Outbox__Execute(AH_OUTBOX *ob){ unsigned int jobCount; int rv; assert(ob); jobCount=AH_Outbox_CountTodoJobs(ob); if (jobCount==0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Empty outbox"); return 0; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("AqHBCI started")); rv=AH_Outbox_StartSending(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not start sending outbox."); return rv; } rv=AH_Outbox_SendAndRecv(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error while sending outbox."); return rv; } rv=AB_Banking_ExecutionProgress(AH_HBCI_GetBankingApi(ob->hbci)); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User aborted (%d)", rv); AH_Outbox__FinishOutbox(ob); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("AqHBCI finished.")); return 0; } int AH_Outbox_Execute(AH_OUTBOX *ob, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { int rv; uint32_t pid=0; AB_USER_LIST2 *lockedUsers = NULL; assert(ob); if (withProgress) { pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Jobs"), I18N("Now the jobs are send via their " "backends to the credit institutes."), AH_Outbox_CountTodoJobs(ob), 0); } ob->context=ctx; if (doLock) { GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Info, I18N("Locking users")); lockedUsers=AB_User_List2_new(); rv=AH_Outbox_LockUsers(ob, lockedUsers); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users")); AB_User_List2_free(lockedUsers); } } else rv=0; if (rv==0) { GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Info, I18N("Executing HBCI jobs")); rv=AH_Outbox__Execute(ob); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } if (doLock) { int rv2; rv2=AH_Outbox_UnlockUsers(ob, lockedUsers, 0); if (rv2<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to unlock users")); } AB_User_List2_free(lockedUsers); if (rv==0 && rv2!=0) rv=rv2; } } /* unmount currently mounted medium */ if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(ob->hbci)); if (withProgress) { GWEN_Gui_ProgressEnd(pid); } ob->context=0; return rv; } AH_JOB *AH_Outbox__FindTransferJobInCheckJobList(const AH_JOB_LIST *jl, AB_USER *u, AB_ACCOUNT *a, const char *jobName) { AH_JOB *j; assert(jl); j=AH_Job_List_First(jl); while(j) { DBG_INFO(AQHBCI_LOGDOMAIN, "Checking job \"%s\"", AH_Job_GetName(j)); if (strcasecmp(AH_Job_GetName(j), jobName)==0 && AH_AccountJob_GetAccount(j)==a) { if (AH_Job_GetTransferCount(j)userBoxes); while(cbox) { if (cbox->user==u) { AH_JOBQUEUE *jq; /* check jobs in lists */ j=AH_Outbox__FindTransferJobInCheckJobList(cbox->todoJobs, u, a, jobName); if (j) return j; /* check jobs in queues */ jq=AH_JobQueue_List_First(cbox->todoQueues); while(jq) { const AH_JOB_LIST *jl; jl=AH_JobQueue_GetJobList(jq); if (jl) { j=AH_Outbox__FindTransferJobInCheckJobList(jl, u, a, jobName); if (j) return j; } jq=AH_JobQueue_List_Next(jq); } /* while */ } else { DBG_WARN(AQHBCI_LOGDOMAIN, "Customer doesn't match"); } cbox=AH_Outbox__CBox_List_Next(cbox); } /* while */ DBG_INFO(AQHBCI_LOGDOMAIN, "No matching multi job found"); return 0; } #include "itan.inc" #include "itan1.inc" #include "itan2.inc" aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/Makefile.am0000644000175000017500000000121612375175275023674 00000000000000SUBDIRS=xml AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(srcdir)/../ajobs \ -I$(srcdir)/../joblayer -I$(srcdir)/../msglayer -I$(srcdir)/.. EXTRA_DIST=README itan.inc itan1.inc itan2.inc noinst_LTLIBRARIES=libhbciapp.la noinst_HEADERS=\ adminjobs_l.h adminjobs_p.h\ outbox_l.h outbox_p.h \ hhd_l.h hhd_p.h libhbciapp_la_SOURCES=\ adminjobs.c \ outbox.c \ hhd.c sources: for f in $(libhbciapp_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done CLEANFILES = $(xmldata_DATA) tmp.xml aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/itan.inc0000644000175000017500000002502012364015477023260 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /* This file is included by outbox.c */ #include "message_l.h" #include int AH_Outbox__CBox__Hash(int mode, const uint8_t *p, unsigned int l, AH_MSG *msg) { GWEN_MDIGEST *md=NULL; int rv; GWEN_BUFFER *hbuf; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Hashmode: %d", mode); switch(mode) { case 0: DBG_NOTICE(AQHBCI_LOGDOMAIN, "No ITAN hash mode, assuming RMD160"); /* fall through */ case 1: /* RMD160 over buffer */ DBG_INFO(AQHBCI_LOGDOMAIN, "Using RMD160"); md=GWEN_MDigest_Rmd160_new(); if (md==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create MD RMD160"); } break; case 2: /* SHA over buffer */ DBG_INFO(AQHBCI_LOGDOMAIN, "Using SHA1"); md=GWEN_MDigest_Sha1_new(); if (md==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create MD SHA1"); } break; default: /* invalid mode */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid ITAN hash mode \"%d\"", mode); return GWEN_ERROR_INVALID; } if (md==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No message digestion algo (mode %d)", mode); return GWEN_ERROR_INVALID; } rv=GWEN_MDigest_Begin(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_Update(md, p, l); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } hbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); AH_Msg_SetItanHashBuffer(msg, hbuf); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Hashed job segment"); return 0; } int AH_Outbox__CBox_JobToMessage(AH_JOB *j, AH_MSG *msg){ AB_USER *user; unsigned int firstSeg; unsigned int lastSeg; GWEN_DB_NODE *jargs; GWEN_XMLNODE *jnode; GWEN_BUFFER *msgBuf; uint32_t startPos; uint32_t endPos; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Encoding job \"%s\"", AH_Job_GetName(j)); user=AH_Job_GetUser(j); assert(user); /* setup message */ AH_Msg_SetHbciVersion(msg, AH_User_GetHbciVersion(user)); if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_NEEDTAN) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Queue needs a TAN"); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Jobs doesn't need a TAN"); } AH_Msg_SetNeedTan(msg, (AH_Job_GetFlags(j) & AH_JOB_FLAGS_NEEDTAN)); /* copy signers */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(AH_Job_GetSigners(j)); if (!se) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signatures needed but no signer given"); return GWEN_ERROR_INVALID; } while(se) { AH_Msg_AddSignerId(msg, GWEN_StringListEntry_Data(se)); se=GWEN_StringListEntry_Next(se); } /* while */ } /* copy crypter */ if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_CRYPT) { /* The name doesn't matter here, since jobs are only used by clients * and the client code for getMedium always uses the name of the dialog * owner instead of the name from the keyspec when retrieving the medium * for encryption. */ AH_Msg_SetCrypterId(msg, "owner"); } /* get arguments and XML node */ jargs=AH_Job_GetArguments(j); jnode=AH_Job_GetXmlNode(j); if (strcasecmp(GWEN_XMLNode_GetData(jnode), "message")==0) { const char *s; s=GWEN_XMLNode_GetProperty(jnode, "name", 0); if (s) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Getting for message specific data (%s)", s); jargs=GWEN_DB_GetGroup(jargs, GWEN_PATH_FLAGS_NAMEMUSTEXIST, s); if (!jargs) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "No message specific data"); jargs=AH_Job_GetArguments(j); } } } /* add job node to message */ firstSeg=AH_Msg_GetCurrentSegmentNumber(msg); msgBuf=AH_Msg_GetBuffer(msg); assert(msgBuf); startPos=GWEN_Buffer_GetPos(msgBuf); lastSeg=AH_Msg_AddNode(msg, jnode, jargs); if (!lastSeg) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not encode job \"%s\"", AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusError); return GWEN_ERROR_INTERNAL; } else { AH_Job_SetFirstSegment(j, firstSeg); AH_Job_SetLastSegment(j, lastSeg); /* iTAN management */ if (AH_Msg_GetItanHashBuffer(msg)==0) { int rv; endPos=GWEN_Buffer_GetPos(msgBuf); rv=AH_Outbox__CBox__Hash(AH_Msg_GetItanHashMode(msg), (const uint8_t*)GWEN_Buffer_GetStart(msgBuf)+startPos, endPos-startPos, msg); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not hash data (%d)", rv); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } } if (AH_Job_GetStatus(j)!=AH_JobStatusError) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Job \"%s\" encoded", AH_Job_GetName(j)); AH_Job_SetStatus(j, AH_JobStatusEncoded); } } return 0; } int AH_Outbox__CBox_Itan_SendMsg(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_MSG *msg) { int rv; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Sending queue"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Sending queue")); rv=AH_Dialog_SendMessage(dlg, msg); if (rv) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Could not send message"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Unable to send (network error)")); return rv; } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Message sent"); return 0; } int AH_Outbox__CBox_Itan(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *qJob){ int rv; int process; process=AH_Dialog_GetItanProcessType(dlg); if (process==1) rv=AH_Outbox__CBox_Itan1(cbox, dlg, qJob); else if (process==2) rv=AH_Outbox__CBox_Itan2(cbox, dlg, qJob); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "iTAN method %d not supported", process); return GWEN_ERROR_INVALID; } return rv; } int AH_Outbox__CBox_SelectItanMode(AH_OUTBOX__CBOX *cbox, AH_DIALOG *dlg) { AB_USER *u; const AH_TAN_METHOD_LIST *tml; u=cbox->user; assert(u); tml=AH_User_GetTanMethodDescriptions(u); if (tml==NULL || AH_TanMethod_List_GetCount(tml)<1) { /* no or empty list, select 999 */ DBG_WARN(AQHBCI_LOGDOMAIN, "No tan methods, trying One-Step TAN"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, I18N("There are no tan method descriptions (yet), trying One-Step TAN.")); AH_Dialog_SetItanMethod(dlg, 999); AH_Dialog_SetItanProcessType(dlg, 1); AH_Dialog_SetTanJobVersion(dlg, 0); return 0; } else { const AH_TAN_METHOD *tm=NULL; int fn; fn=AH_User_GetSelectedTanMethod(u); if (fn) { int utFunction; int utJobVersion; utFunction=fn % 1000; utJobVersion=fn / 1000; DBG_INFO(AQHBCI_LOGDOMAIN, "Selected TAN method: %d (Job version %d, Function %d)", fn, utFunction, utJobVersion); if (AH_User_HasTanMethod(u, utFunction)) { tm=AH_TanMethod_List_First(tml); while(tm) { int proc; if (AH_TanMethod_GetFunction(tm)==utFunction && AH_TanMethod_GetGvVersion(tm)==utJobVersion) { proc=AH_TanMethod_GetProcess(tm); if (proc==1 || proc==2) { DBG_INFO(AQHBCI_LOGDOMAIN, "Found description for selected TAN method %d (process: %d)", fn, proc); break; } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "iTan process type \"%d\" not supported, ignoring", proc); } } tm=AH_TanMethod_List_Next(tm); } if (tm==NULL) { GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, I18N("TAN method (%d) selected by user is no longer valid," "please choose another one"), fn); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "AH_User_HasTanMethod(%d): no", fn); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No Tan method selected"); } if (tm==NULL) { /* choose a method */ DBG_INFO(AQHBCI_LOGDOMAIN, "Autoselecting a usable TAN method"); tm=AH_TanMethod_List_First(tml); while(tm) { int proc; proc=AH_TanMethod_GetProcess(tm); if (proc==1 || proc==2) { DBG_INFO(AQHBCI_LOGDOMAIN, "Found description for selected TAN method %d (process: %d)", fn, proc); if (AH_User_HasTanMethod(u, AH_TanMethod_GetFunction(tm))) { DBG_INFO(AQHBCI_LOGDOMAIN, "AH_User_HasTanMethod(%d): yes", AH_TanMethod_GetFunction(tm)); break; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "AH_User_HasTanMethod(%d): no", AH_TanMethod_GetFunction(tm)); } } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "iTan process type \"%d\" not supported, ignoring", proc); } tm=AH_TanMethod_List_Next(tm); } } if (tm==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No matching iTAN mode found (fn=%d)", fn); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("No iTAN method available for automatic selection")); return GWEN_ERROR_NOT_FOUND; } else { const char *s; s=AH_TanMethod_GetMethodName(tm); if (!s || !*s) s=AH_TanMethod_GetMethodId(tm); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Selecting iTAN mode \"%s\" (needs HKTAN:%d)", s, AH_TanMethod_GetGvVersion(tm)); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Info, I18N("Selecting iTAN mode \"%s\" (%d)"), s?s:I18N("(unnamed)"), AH_TanMethod_GetFunction(tm)); AH_Dialog_SetItanMethod(dlg, AH_TanMethod_GetFunction(tm)); AH_Dialog_SetItanProcessType(dlg, AH_TanMethod_GetProcess(tm)); AH_Dialog_SetTanJobVersion(dlg, AH_TanMethod_GetGvVersion(tm)); AH_Dialog_SetTanMethodDescription(dlg, tm); return 0; } } } void AH_Outbox__CBox_CopyJobResultsToJobList(const AH_JOB *j, const AH_JOB_LIST *qjl) { /* dispatch results from jTan to all other members of the queue */ if (qjl) { AH_RESULT_LIST *rl; /* segment results */ rl=AH_Job_GetSegResults(j); if (rl) { AH_RESULT *or; or=AH_Result_List_First(rl); while(or) { AH_JOB *qj; qj=AH_Job_List_First(qjl); while(qj) { if (qj!=j) { AH_RESULT *nr; nr=AH_Result_dup(or); AH_Result_List_Add(nr, AH_Job_GetSegResults(qj)); } qj=AH_Job_List_Next(qj); } or=AH_Result_List_Next(or); } /* while or */ } /* if rl */ } /* if qjl */ } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/hhd_l.h0000644000175000017500000000527512364015477023073 00000000000000/*************************************************************************** begin : Sat Dec 10 2011 copyright : (C) 2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_HHD_L_H #define AQHBCI_HHD_L_H #include int AH_HHD14_Translate(const char *code, GWEN_BUFFER *cbuf); int AH_HHD14_AddChallengeParams_04(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteBankCode, const char *sRemoteAccountNumber); int AH_HHD14_AddChallengeParams_05(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteAccountNumber); int AH_HHD14_AddChallengeParams_09(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban); int AH_HHD14_AddChallengeParams_12(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalAccount, const AB_VALUE *vSumOfRemoteAccounts); int AH_HHD14_AddChallengeParams_13(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalIban); int AH_HHD14_AddChallengeParams_17(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban); int AH_HHD14_AddChallengeParams_19(AH_JOB *j, int numTransfers, const AB_VALUE *vSumOfAmount, const char *sLocalAccountNumber, const AB_VALUE *vSumOfRemoteAccounts); int AH_HHD14_AddChallengeParams_23(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban, const GWEN_TIME *ti); int AH_HHD14_AddChallengeParams_29(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban, const GWEN_TIME *ti); int AH_HHD14_AddChallengeParams_32(AH_JOB *j, int transferCount, const AB_VALUE *vAmount, const char *sLocalIban, const GWEN_TIME *ti); int AH_HHD14_AddChallengeParams_35(AH_JOB *j, const AB_VALUE *vAmount, const char *sRemoteIban); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/adminjobs_p.h0000644000175000017500000001400012364015477024264 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ADMINJOBS_P_H #define AH_ADMINJOBS_P_H #include "adminjobs_l.h" /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_GETKEYS AH_JOB_GETKEYS; struct AH_JOB_GETKEYS { char *peerId; GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo; GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo; GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo; }; static void GWENHYWFAR_CB AH_Job_GetKeys_FreeData(void *bp, void *p); static int AH_Job_GetKeys_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_SendKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ /* no data needed */ static int AH_Job_SendKeys_PrepareKey(AH_JOB *j, GWEN_DB_NODE *dbKey, const GWEN_CRYPT_TOKEN_KEYINFO *ki, int kn); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetSysId * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_GETSYSID AH_JOB_GETSYSID; struct AH_JOB_GETSYSID { char *sysId; }; static void GWENHYWFAR_CB AH_Job_GetSysId_FreeData(void *bp, void *p); static int AH_Job_GetSysId_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetSysId_NextMsg(AH_JOB *j); static int AH_Job_GetSysId_ExtractSysId(AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_UpdateBank * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_UPDATEBANK AH_JOB_UPDATEBANK; struct AH_JOB_UPDATEBANK { AB_ACCOUNT_LIST2 *accountList; int scanned; }; static void GWENHYWFAR_CB AH_Job_UpdateBank_FreeData(void *bp, void *p); static int AH_Job_UpdateBank_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_TestVersion * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_TESTVERSION AH_JOB_TESTVERSION; struct AH_JOB_TESTVERSION { AH_JOB_TESTVERSION_RESULT versionSupported; }; static void GWENHYWFAR_CB AH_Job_TestVersion_FreeData(void *bp, void *p); static int AH_Job_TestVersion_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetStatus * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_GETSTATUS AH_JOB_GETSTATUS; struct AH_JOB_GETSTATUS { AH_RESULT_LIST *results; GWEN_TIME *fromDate; GWEN_TIME *toDate; }; static void GWENHYWFAR_CB AH_Job_GetStatus_FreeData(void *bp, void *p); static int AH_Job_GetStatus_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_GetStatus_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_Tan * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_TAN AH_JOB_TAN; struct AH_JOB_TAN { char *challenge; char *challengeHhd; char *reference; int tanMethod; char *tanMediumId; }; static void GWENHYWFAR_CB AH_Job_Tan_FreeData(void *bp, void *p); static int AH_Job_Tan_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Job_Tan_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetItanModes * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ #define AH_JOB_GETITANMODES_MAXMODES 20 typedef struct AH_JOB_GETITANMODES AH_JOB_GETITANMODES; struct AH_JOB_GETITANMODES { int modeList[AH_JOB_GETITANMODES_MAXMODES+1]; int modeCount; }; static void GWENHYWFAR_CB AH_Job_GetItanModes_FreeData(void *bp, void *p); static int AH_Job_GetItanModes_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetAccountSepaInfo * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef struct AH_JOB_GETACCSEPAINFO AH_JOB_GETACCSEPAINFO; struct AH_JOB_GETACCSEPAINFO { AB_ACCOUNT *account; int scanned; }; static void GWENHYWFAR_CB AH_Job_GetAccountSepaInfo_FreeData(void *bp, void *p); static int AH_Job_GetAccountSepaInfo_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx); #endif /* AH_ADMINJOBS_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/outbox_l.h0000644000175000017500000000404412364015477023641 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_OUTBOX_L_H #define AH_OUTBOX_L_H #define AH_OUTBOX_FLAGS_ENDDIALOG 0x00000001 #define AH_OUTBOX_FLAGS_DEFAULT \ (\ AH_OUTBOX_FLAGS_ENDDIALOG \ ) #define AH_OUTBOX_EXECUTE_WCB_ID "AH_OUTBOX_EXECUTE_WCB_ID" typedef struct AH_OUTBOX AH_OUTBOX; #include #include #include #include "hbci_l.h" #include "job_l.h" #include AH_OUTBOX *AH_Outbox_new(AH_HBCI *hbci); void AH_Outbox_free(AH_OUTBOX *ob); void AH_Outbox_Attach(AH_OUTBOX *ob); void AH_Outbox_AddJob(AH_OUTBOX *ob, AH_JOB *j); void AH_Outbox_AddPendingJob(AH_OUTBOX *ob, AB_JOB *bj); /* makes all jobs commit their data */ void AH_Outbox_Commit(AH_OUTBOX *ob, int doLock); /* makes all jobs process their data */ void AH_Outbox_Process(AH_OUTBOX *ob); /* makes all jobs commit their system data (only calls * @ref AH_Job_DefaultCommitHandler which only commits system data * like account data, bank parameter data etc according to the flags in * @ref AH_HBCIClient). */ void AH_Outbox_CommitSystemData(AH_OUTBOX *ob, int doLock); unsigned int AH_Outbox_CountTodoJobs(AH_OUTBOX *ob); unsigned int AH_Outbox_CountFinishedJobs(AH_OUTBOX *ob); int AH_Outbox_Execute(AH_OUTBOX *ob, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); AH_JOB *AH_Outbox_FindTransferJob(AH_OUTBOX *ob, AB_USER *u, AB_ACCOUNT *a, const char *jobName); AH_JOB_LIST *AH_Outbox_GetFinishedJobs(AH_OUTBOX *ob); #endif /* AH_OUTBOX_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/adminjobs_l.h0000644000175000017500000001641612364015477024275 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ADMINJOBS_L_H #define AH_ADMINJOBS_L_H #include "joblayer/job_l.h" #include #include #ifdef __cplusplus extern "C" { #endif /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_GetKeys_new(AB_USER *u); GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetSignKeyInfo(const AH_JOB *j); GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetCryptKeyInfo(const AH_JOB *j); GWEN_CRYPT_TOKEN_KEYINFO *AH_Job_GetKeys_GetAuthKeyInfo(const AH_JOB *j); const char *AH_Job_GetKeys_GetPeerId(const AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_SendKeys * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_SendKeys_new(AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo, const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo, const GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetSysId * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_GetSysId_new(AB_USER *u); const char *AH_Job_GetSysId_GetSysId(AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_UpdateBank * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_UpdateBank_new(AB_USER *u); /** * Returns a list of accounts found by this job. This list might be empty * (meaning the server did not send an account list). * The jobs remains the owner of that list and all its members. * Please note that the accounts returned are just local copies to be * inspected by the application (most likely the setup wizard). * You can not use any of these accounts directly for account jobs ! */ AB_ACCOUNT_LIST2 *AH_Job_UpdateBank_GetAccountList(const AH_JOB *j); /** * Returns a list of accounts found by this job. This list might be empty * (meaning the server did not send an account list). * The jobs is no longer the owner of that list and all its members, instead * the caller becomes the new owner thus leaving him responsible for * calling @ref AB_Account_List2_FreeAll on that list. * Please note that the accounts returned are just local copies to be * inspected by the application (most likely the setup wizard). * You can not use any of these accounts directly for account jobs ! */ AB_ACCOUNT_LIST2 *AH_Job_UpdateBank_TakeAccountList(AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_TestVersion * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ typedef enum { AH_JobTestVersion_ResultUnknown=0, AH_JobTestVersion_ResultNotSupported, AH_JobTestVersion_ResultMaybeSupported, AH_JobTestVersion_ResultSupported } AH_JOB_TESTVERSION_RESULT; AH_JOB *AH_Job_TestVersion_new(AB_USER *u, int anon); AH_JOB_TESTVERSION_RESULT AH_Job_TestVersion_GetResult(const AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetStatus * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_GetStatus_new(AB_USER *u, const GWEN_TIME *fromDate, const GWEN_TIME *toDate); AH_RESULT_LIST *AH_Job_GetStatus_GetResults(const AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_Tan * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ /** * This is an internal job. It is only used to present a TAN using a * two-step mechanism (iTAN). */ AH_JOB *AH_Job_Tan_new(AB_USER *u, int process, int jobVersion); void AH_Job_Tan_SetHash(AH_JOB *j, const unsigned char *p, unsigned int len); void AH_Job_Tan_SetReference(AH_JOB *j, const char *p); void AH_Job_Tan_SetTanList(AH_JOB *j, const char *s); void AH_Job_Tan_SetTanInfo(AH_JOB *j, const char *p); const char *AH_Job_Tan_GetChallenge(const AH_JOB *j); const char *AH_Job_Tan_GetHhdChallenge(const AH_JOB *j); const char *AH_Job_Tan_GetReference(const AH_JOB *j); int AH_Job_Tan_GetTanMethod(const AH_JOB *j); void AH_Job_Tan_SetTanMethod(AH_JOB *j, int i); void AH_Job_Tan_SetTanMediumId(AH_JOB *j, const char *s); void AH_Job_Tan_SetLocalAccountInfo(AH_JOB *j, const char *bankCode, const char *accountId, const char *accountSubId); void AH_Job_Tan_SetSmsAccountInfo(AH_JOB *j, const char *bankCode, const char *accountId, const char *accountSubId); void AH_Job_Tan_SetSegCode(AH_JOB *j, const char *p); int AH_Job_Tan_FinishSetup(AH_JOB *j, AH_JOB *accJob); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetItanModes * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_GetItanModes_new(AB_USER *u); const int *AH_Job_GetItanModes_GetModes(const AH_JOB *j); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_ChangePin * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_ChangePin_new(AB_USER *u, const char *newPin); /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * AH_Job_GetAccountSepaInfo * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AH_JOB *AH_Job_GetAccountSepaInfo_new(AB_USER *u, AB_ACCOUNT *acc); #ifdef __cplusplus } #endif #endif /* AH_ADMINJOBS_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/applayer/README0000644000175000017500000000151112364015477022511 00000000000000 This folder contains high-level modules to be used by applications. HBCI-XML Descriptions ===================== Segmente fuer Geschaeftsvorfaelle --------------------------------- Fuer die meisten Geschaeftvorfaelle werden mindestens 3 Segmente benoetigt: 1) Kundennachricht : beschreibt die Struktur der Nachricht, die das Kundensystem an die Bank sendet 2) Institutsnachr. : beschreibt die Struktur der Nachricht, die das Kreditinstitut als Antwort sendet 3) GV-parameter : beschreibt Parameter zu einem Geschaeftsvorfall (z.B. die Anzahl der Verwendungszweck-Zeilen) Ausserdem ist zu beachten, dass in der -Sektion der Versionsdatei entsprechende Jobs angelegt werden muessen, damit die Anwendung einen solchen Job auch erzeugen kann (siehe JOBGetBalance) aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/aqhbci.h0000644000175000017500000000343712364015477021425 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_AQHBCI_H #define AQHBCI_AQHBCI_H #include #ifdef BUILDING_AQHBCI # /* building AqHBCI */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQHBCI_API __declspec (dllexport) # else /* if __declspec */ # define AQHBCI_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQHBCI_API __attribute__((visibility("default"))) # else # define AQHBCI_API # endif # endif #else # /* not building AqHBCI */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQHBCI_API __declspec (dllimport) # else /* if __declspec */ # define AQHBCI_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # define AQHBCI_API # endif #endif #define AH_PROVIDER_NAME "AQHBCI" #define AQHBCI_LOGDOMAIN "aqhbci" typedef enum { AH_CryptMode_Unknown=-1, /** No type. */ AH_CryptMode_None=0, /** DES-DES-Verfahren */ AH_CryptMode_Ddv, /** PIN/TAN mode */ AH_CryptMode_Pintan, /** RSA-DES-Hybridverfahren */ AH_CryptMode_Rdh } AH_CRYPT_MODE; AQHBCI_API AH_CRYPT_MODE AH_CryptMode_fromString(const char *s); AQHBCI_API const char *AH_CryptMode_toString(AH_CRYPT_MODE v); #endif /* AQHBCI_AQHBCI_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/aqhbci-plugin.c0000644000175000017500000000217412364015477022711 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "banking/provider.h" #include static AB_PROVIDER *AB_Plugin_ProviderHBCI_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ return AH_Provider_new(ab, AH_PROVIDER_NAME); } /* interface to gwens plugin loader */ AQBANKING_EXPORT GWEN_PLUGIN *provider_aqhbci_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_Provider_new(pm, name, fileName); AB_Plugin_Provider_SetFactoryFn(pl, AB_Plugin_ProviderHBCI_Factory); return pl; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/0000755000175000017500000000000012643540656021723 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/message_l.h0000644000175000017500000001024012364015477023746 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_MESSAGE_L_H #define AH_MESSAGE_L_H #include typedef struct AH_MSG AH_MSG; GWEN_LIST_FUNCTION_DEFS(AH_MSG, AH_Msg); #include "dialog_l.h" #include #include AH_MSG *AH_Msg_new(AH_DIALOG *dlg); void AH_Msg_free(AH_MSG *hmsg); const GWEN_STRINGLIST *AH_Msg_GetSignerIdList(const AH_MSG *hmsg); unsigned int AH_Msg_GetSignerCount(AH_MSG *hmsg); int AH_Msg_AddSignerId(AH_MSG *hmsg, const char *s); int AH_Msg_IsSignedBy(const AH_MSG *hmsg, const char *s); const char *AH_Msg_GetCrypterId(const AH_MSG *hmsg); void AH_Msg_SetCrypterId(AH_MSG *hmsg, const char *s); GWEN_BUFFER *AH_Msg_GetBuffer(AH_MSG *hmsg); GWEN_BUFFER *AH_Msg_TakeBuffer(AH_MSG *hmsg); void AH_Msg_SetBuffer(AH_MSG *hmsg, GWEN_BUFFER *bf); unsigned int AH_Msg_GetMsgNum(const AH_MSG *hmsg); unsigned int AH_Msg_GetMsgRef(const AH_MSG *hmsg); void AH_Msg_SetMsgRef(AH_MSG *hmsg, unsigned int i); unsigned int AH_Msg_GetNodes(AH_MSG *hmsg); AH_DIALOG *AH_Msg_GetDialog(const AH_MSG *hmsg); int AH_Msg_EnableInsert(AH_MSG *hmsg); int AH_Msg_HasWarnings(const AH_MSG *hmsg); void AH_Msg_SetHasWarnings(AH_MSG *hmsg, int i); int AH_Msg_HasErrors(const AH_MSG *hmsg); void AH_Msg_SetHasErrors(AH_MSG *hmsg, int i); int AH_Msg_GetResultCode(const AH_MSG *hmsg); void AH_Msg_SetResultCode(AH_MSG *hmsg, int i); const char *AH_Msg_GetResultText(const AH_MSG *hmsg); void AH_Msg_SetResultText(AH_MSG *hmsg, const char *s); const char *AH_Msg_GetResultParam(const AH_MSG *hmsg); void AH_Msg_SetResultParam(AH_MSG *hmsg, const char *s); unsigned int AH_Msg_GetHbciVersion(const AH_MSG *hmsg); void AH_Msg_SetHbciVersion(AH_MSG *hmsg, unsigned int i); int AH_Msg_GetSecurityProfile(const AH_MSG *hmsg); void AH_Msg_SetSecurityProfile(AH_MSG *hmsg, int i); int AH_Msg_GetSecurityClass(const AH_MSG *hmsg); void AH_Msg_SetSecurityClass(AH_MSG *hmsg, int i); const char *AH_Msg_GetTan(const AH_MSG *hmsg); void AH_Msg_SetTan(AH_MSG *hmsg, const char *s); int AH_Msg_GetNeedTan(const AH_MSG *hmsg); void AH_Msg_SetNeedTan(AH_MSG *hmsg, int i); int AH_Msg_NoSysId(const AH_MSG *hmsg); void AH_Msg_SetNoSysId(AH_MSG *hmsg, int i); unsigned int AH_Msg_GetCurrentSegmentNumber(AH_MSG *hmsg); unsigned int AH_Msg_AddNode(AH_MSG *hmsg, GWEN_XMLNODE *node, GWEN_DB_NODE *data); void AH_Msg_SetItanMethod(AH_MSG *hmsg, uint32_t i); uint32_t AH_Msg_GetItanMethod(const AH_MSG *hmsg); void AH_Msg_SetItanHashMode(AH_MSG *hmsg, int i); int AH_Msg_GetItanHashMode(const AH_MSG *hmsg); void AH_Msg_SetItanHashBuffer(AH_MSG *hmsg, GWEN_BUFFER *hbuf); GWEN_BUFFER *AH_Msg_GetItanHashBuffer(const AH_MSG *hmsg); unsigned int AH_Msg_InsertNode(AH_MSG *hmsg, GWEN_XMLNODE *node, GWEN_DB_NODE *data); int AH_Msg_EncodeMsg(AH_MSG *hmsg); int AH_Msg_DecodeMsg(AH_MSG *hmsg, GWEN_DB_NODE *gr, unsigned int flags); void AH_Msg__Dump(const AH_MSG *hmsg, unsigned int indent); #define AH_Msg_Dump(hmsg, indent) \ {fprintf(stderr, "Dumping message from "__FILE__" %d\n", __LINE__);\ AH_Msg__Dump(hmsg, indent);} GWEN_BUFFER *AH_Msg_GetOrigBuffer(AH_MSG *hmsg); void AH_Msg_LogMessage(AH_MSG *msg, GWEN_BUFFER *buf, int rec, int crypt); const char *AH_Msg_GetExpectedSigner(const AH_MSG *msg); void AH_Msg_SetExpectedSigner(AH_MSG *msg, const char *s); const char *AH_Msg_GetExpectedCrypter(const AH_MSG *msg); void AH_Msg_SetExpectedCrypter(AH_MSG *msg, const char *s); const char *AH_Msg_GetPin(const AH_MSG *msg); #endif /* AH_MESSAGE_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c0000644000175000017500000010324712364015477024662 00000000000000/*************************************************************************** begin : Tue Nov 25 2008 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #define AH_MSGRDH10_MAXKEYBUF 4096 int AH_MsgRdh_PrepareCryptoSeg10(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No PeerId in user, using user id"); peerId=userId; } tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "RDH"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", AH_User_GetRdhType(u)); if (crypt) { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "function", 4); /* crypt */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/algo", 13); /* 2-KEY-TRIPLE-DES */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/mode", 2); /* CBC (0-Padding) */ } else { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "function", 2); /* sign with signature key */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/algo", 10); /* RSA */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/mode", 19); /* RSASSA-PSS */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hashAlgo/algo", 6); /* SHA-256/SHA-256 */ } return 0; } int AH_Msg_SignRdh10(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgRdh_PrepareCryptoSeg10(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(su); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; uint8_t hash1[32]; /* hash sighead + data (CAVEAT: SHA256 is used here twice!! SHA256(SHA256(M)) ) */ md=GWEN_MDigest_Sha256_new(); /* first round */ rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } memmove(hash1, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); /* second round */ rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, hash1, sizeof(hash1)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); signLen=GWEN_Buffer_GetMaxUnsegmentedWrite(sigbuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptRdh10(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[AH_MSGRDH10_MAXKEYBUF+64]; int encKeyLen; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } encKeyLen=elen; } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgRdh_PrepareCryptoSeg10(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(u); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No System id on RDH medium, using default"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, encKeyLen); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptRdh10(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[AH_MSGRDH10_MAXKEYBUF+64]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; uint8_t encKey[AH_MSGRDH10_MAXKEYBUF+64]; int ksize; ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); if (ksizeorigbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyRdh10(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* only now we need the verify key */ keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No verify key id on crypt token [%s:%s]", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); /* no longer return an error, it might be ok to not have a key info * even if we do not propagate the error here the check functions will * later find out that the signature is missing */ return 0; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); assert(ksize<=AH_MSGRDH10_MAXKEYBUF); /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[32]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; uint8_t hash1[32]; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Sha256_new(); /* first round */ rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash1, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); /* second round */ rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, hash1, sizeof(hash1)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 32, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_NO_KEY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to verify signature of user \"%s\" (no key)", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Unable to verify signature (no key)")); } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Invalid signature!!!")); GWEN_Buffer_AppendString(tbuf, "!"); } else { GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Could not verify signature")); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); GWEN_Buffer_AppendString(tbuf, "?"); } GWEN_Buffer_AppendString(tbuf, signerId); AH_Msg_AddSignerId(hmsg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/user.h0000644000175000017500000001655612364015477023005 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_USER_H #define AH_USER_H #include #include #include #include /** @defgroup G_AB_BE_AQHBCI_USER HBCI User Extensions * @ingroup G_AB_BE_AQHBCI * @short HBCI-specific user functions * @author Martin Preuss * */ /*@{*/ #include #include #include #ifdef __cplusplus extern "C" { #endif /** @name HBCI User Flags * */ /*@{*/ /** bank doesn't sign its messages */ #define AH_USER_FLAGS_BANK_DOESNT_SIGN 0x00000001 /** bank uses correct signature sequence counters for its messages */ #define AH_USER_FLAGS_BANK_USES_SIGNSEQ 0x00000002 #define AH_USER_FLAGS_RESERVED1 0x00000004 #define AH_USER_FLAGS_RESERVED2 0x00000008 /** for pin/tan mode: keep HTTP connections alive (reuse for multiple * requests) */ #define AH_USER_FLAGS_KEEPALIVE 0x00000010 /** this flag is set automatically by AqHBCI upon BPD/UPD receiption. It * indicates that some jobs are supported even when there is no UPD job * description for it */ #define AH_USER_FLAGS_IGNORE_UPD 0x00000020 /** forces use of SSLv3 for Pin/TAN mode */ #define AH_USER_FLAGS_FORCE_SSL3 0x00000040 /** do not encode message in BASE64 (needed for APO bank) */ #define AH_USER_FLAGS_NO_BASE64 0x00000080 /** Normally the SWIFT parser removed double blanks, with this flag set it * no longer does (as requested by Andreas Filsinger). */ #define AH_USER_FLAGS_KEEP_MULTIPLE_BLANKS 0x00000100 /** Some TAN jobs have a field for the account to be used to charge * for SMS. This field is semi-optional (some banks need it, some need * you not to use it). * If this flag is set then the SMS account specification is omitted. */ #define AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT 0x00000200 #define AH_USER_FLAGS_TLS_ONLY_SAFE_CIPHERS 0x00000400 #define AH_USER_FLAGS_USE_STRICT_SEPA_CHARSET 0x00000800 /*@}*/ /** @name Functions for Flags and Status * */ /*@{*/ AQHBCI_API void AH_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags); AQHBCI_API uint32_t AH_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name); typedef enum { AH_UserStatusNew=0, AH_UserStatusEnabled, AH_UserStatusPending, AH_UserStatusDisabled, AH_UserStatusUnknown=999 } AH_USER_STATUS; AQHBCI_API const char *AH_User_Status_toString(AH_USER_STATUS st); AQHBCI_API AH_USER_STATUS AH_User_Status_fromString(const char *s); AQHBCI_API AH_USER_STATUS AH_User_GetStatus(const AB_USER *u); AQHBCI_API void AH_User_SetStatus(AB_USER *u, AH_USER_STATUS i); /** * Returns 0 if the bank doesn't sign messages, 1 otherwise. * This can be used in case the bank sends a sign key upon request but * never signs it's messages. */ AQHBCI_API uint32_t AH_User_GetFlags(const AB_USER *u); AQHBCI_API void AH_User_SetFlags(AB_USER *u, uint32_t flags); AQHBCI_API void AH_User_AddFlags(AB_USER *u, uint32_t flags); AQHBCI_API void AH_User_SubFlags(AB_USER *u, uint32_t flags); /*@}*/ /** @name PIN/TAN Specific Functions * */ /*@{*/ AQHBCI_API const int *AH_User_GetTanMethodList(const AB_USER *u); AQHBCI_API int AH_User_GetTanMethodCount(const AB_USER *u); AQHBCI_API int AH_User_HasTanMethod(const AB_USER *u, int method); AQHBCI_API int AH_User_HasTanMethodOtherThan(const AB_USER *u, int method); AQHBCI_API void AH_User_AddTanMethod(AB_USER *u, int method); AQHBCI_API void AH_User_ClearTanMethodList(AB_USER *u); AQHBCI_API int AH_User_GetSelectedTanMethod(const AB_USER *u); AQHBCI_API void AH_User_SetSelectedTanMethod(AB_USER *u, int i); AQHBCI_API const char *AH_User_GetHttpContentType(const AB_USER *u); AQHBCI_API void AH_User_SetHttpContentType(AB_USER *u, const char *s); /*@}*/ AQHBCI_API const char *AH_User_GetTokenType(const AB_USER *u); AQHBCI_API void AH_User_SetTokenType(AB_USER *u, const char *s); AQHBCI_API const char *AH_User_GetTokenName(const AB_USER *u); AQHBCI_API void AH_User_SetTokenName(AB_USER *u, const char *s); AQHBCI_API uint32_t AH_User_GetTokenContextId(const AB_USER *u); AQHBCI_API void AH_User_SetTokenContextId(AB_USER *u, uint32_t id); /** @name Miscellanous Settings * */ /*@{*/ /** * Crypt mode (see @ref AH_CryptMode_Ddv and following). */ AQHBCI_API AH_CRYPT_MODE AH_User_GetCryptMode(const AB_USER *u); AQHBCI_API void AH_User_SetCryptMode(AB_USER *u, AH_CRYPT_MODE m); AQHBCI_API int AH_User_GetRdhType(const AB_USER *u); AQHBCI_API void AH_User_SetRdhType(AB_USER *u, int i); AQHBCI_API const char *AH_User_GetPeerId(const AB_USER *u); AQHBCI_API void AH_User_SetPeerId(AB_USER *u, const char *s); AQHBCI_API const char *AH_User_GetSystemId(const AB_USER *u); AQHBCI_API void AH_User_SetSystemId(AB_USER *u, const char *s); AQHBCI_API const GWEN_URL *AH_User_GetServerUrl(const AB_USER *u); AQHBCI_API void AH_User_SetServerUrl(AB_USER *u, const GWEN_URL *url); AQHBCI_API int AH_User_GetHbciVersion(const AB_USER *u); AQHBCI_API void AH_User_SetHbciVersion(AB_USER *u, int i); AQHBCI_API const char *AH_User_GetSepaTransferProfile(const AB_USER *u); AQHBCI_API void AH_User_SetSepaTransferProfile(AB_USER *u, const char *profileName); AQHBCI_API const char *AH_User_GetSepaDebitNoteProfile(const AB_USER *u); AQHBCI_API void AH_User_SetSepaDebitNoteProfile(AB_USER *u, const char *profileName); /*@}*/ /** @name Pin/Tan Settings * */ /*@{*/ /** * Returns the major HTTP version to be used in PIN/TAN mode (defaults to 1). */ AQHBCI_API int AH_User_GetHttpVMajor(const AB_USER *u); AQHBCI_API void AH_User_SetHttpVMajor(AB_USER *u, int i); /** * Returns the minor HTTP version to be used in PIN/TAN mode (defaults to 1). */ AQHBCI_API int AH_User_GetHttpVMinor(const AB_USER *u); AQHBCI_API void AH_User_SetHttpVMinor(AB_USER *u, int i); AQHBCI_API const char *AH_User_GetHttpUserAgent(const AB_USER *u); AQHBCI_API void AH_User_SetHttpUserAgent(AB_USER *u, const char *s); AQHBCI_API const char *AH_User_GetTanMediumId(const AB_USER *u); AQHBCI_API void AH_User_SetTanMediumId(AB_USER *u, const char *s); /*@}*/ /** @name Passwords/Pins/Tans * */ /*@{*/ AQHBCI_API int AH_User_MkPasswdName(const AB_USER *u, GWEN_BUFFER *buf); AQHBCI_API int AH_User_MkPinName(const AB_USER *u, GWEN_BUFFER *buf); AQHBCI_API int AH_User_MkTanName(const AB_USER *u, const char *challenge, GWEN_BUFFER *buf); /** * The list returned is only valid until the next call to this function! */ AQHBCI_API const AH_TAN_METHOD_LIST *AH_User_GetTanMethodDescriptions(AB_USER *u); /*@}*/ AQHBCI_API int AH_User_GetMaxTransfersPerJob(const AB_USER *u); AQHBCI_API void AH_User_SetMaxTransfersPerJob(AB_USER *u, int i); AQHBCI_API int AH_User_GetMaxDebitNotesPerJob(const AB_USER *u); AQHBCI_API void AH_User_SetMaxDebitNotesPerJob(AB_USER *u, int i); AQHBCI_API const char *AH_User_FindSepaDescriptor(AB_USER *u, const char *tmpl); /*@}*/ /* defgroup */ #ifdef __cplusplus } #endif #endif /* AH_USER_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci-updates.c0000644000175000017500000002742612364015477024370 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "i18n_l.h" #include "hbci-updates_p.h" #include "user_l.h" #include "account_l.h" #include #include #include #include #include int AH_HBCI_UpdateDbUser(AH_HBCI *hbci, GWEN_DB_NODE *db) { int rv; uint32_t oldVersion; uint32_t currentVersion; oldVersion=AH_HBCI_GetLastVersion(hbci); currentVersion= (AQHBCI_VERSION_MAJOR<<24) | (AQHBCI_VERSION_MINOR<<16) | (AQHBCI_VERSION_PATCHLEVEL<<8) | AQHBCI_VERSION_BUILD; if (currentVersion>oldVersion) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from %d.%d.%d.%d", (oldVersion>>24) & 0xff, (oldVersion>>16) & 0xff, (oldVersion>>8) & 0xff, oldVersion & 0xff); if (oldVersion<((1<<24) | (9<<16) | (7<<8) | 7)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 1.9.7.7"); rv=AH_HBCI_UpdateUser_1_9_7_7(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } if (oldVersion<((2<<24) | (1<<16) | (1<<8) | 1)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 2.1.1.1"); rv=AH_HBCI_UpdateUser_2_1_1_1(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } if (oldVersion<((2<<24) | (9<<16) | (3<<8) | 2)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 2.9.3.2"); rv=AH_HBCI_UpdateUser_2_9_3_2(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } if (oldVersion<((2<<24) | (9<<16) | (3<<8) | 3)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 2.9.3.3"); rv=AH_HBCI_UpdateUser_2_9_3_3(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } if (oldVersion<((3<<24) | (1<<16) | (1<<8) | 2)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 3.1.1.2"); rv=AH_HBCI_UpdateUser_3_1_1_2(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } if (oldVersion<((5<<24) | (0<<16) | (3<<8) | 1)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating user from pre 5.0.3.1"); rv=AH_HBCI_UpdateUser_5_0_3_1(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } /* insert more updates here */ /* updated! */ return 1; } /* if update */ else /* not updated */ return 0; } int AH_HBCI_UpdateDbAccount(AH_HBCI *hbci, GWEN_DB_NODE *db) { uint32_t oldVersion; uint32_t currentVersion; int rv; oldVersion=AH_HBCI_GetLastVersion(hbci); currentVersion= (AQHBCI_VERSION_MAJOR<<24) | (AQHBCI_VERSION_MINOR<<16) | (AQHBCI_VERSION_PATCHLEVEL<<8) | AQHBCI_VERSION_BUILD; if (currentVersion>oldVersion) { DBG_WARN(AQHBCI_LOGDOMAIN, "Updating account from %d.%d.%d.%d", (oldVersion>>24) & 0xff, (oldVersion>>16) & 0xff, (oldVersion>>8) & 0xff, oldVersion & 0xff); if (oldVersion<((1<<24) | (9<<16) | (7<<8) | 9)) { rv=AH_HBCI_UpdateAccount_1_9_7_9(hbci, db); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } /* insert more updates here */ /* updated! */ return 1; } /* if update */ else /* not updated */ return 0; } int AH_HBCI_UpdateUser_1_9_7_7(AH_HBCI *hbci, GWEN_DB_NODE *db) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "server"); if (dbT) { const char *s_addr; const char *s_port; const char *s_type; s_addr=GWEN_DB_GetCharValue(dbT, "address", 0, 0); s_port=GWEN_DB_GetCharValue(dbT, "suffix", 0, 0); s_type=GWEN_DB_GetCharValue(dbT, "type", 0, "tcp"); if (s_addr) { GWEN_URL *url; int bankPort=0; GWEN_BUFFER *ubuf; if (s_port) bankPort=atoi(s_port); url=GWEN_Url_fromString(s_addr); assert(url); if (s_type && strcasecmp(s_type, "ssl")==0) { GWEN_Url_SetProtocol(url, "https"); if (bankPort==0) bankPort=443; GWEN_Url_SetPort(url, bankPort); } else { GWEN_Url_SetProtocol(url, "hbci"); if (bankPort==0) bankPort=3000; GWEN_Url_SetPort(url, bankPort); } GWEN_DB_UnlinkGroup(dbT); GWEN_DB_Group_free(dbT); ubuf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Url_toString(url, ubuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not store url"); GWEN_Url_free(url); return -1; } GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "server", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); GWEN_Url_free(url); } } return 0; } int AH_HBCI_UpdateUser_2_1_1_1(AH_HBCI *hbci, GWEN_DB_NODE *db) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanMethods", "singleStep"); return 0; } int AH_HBCI_UpdateUser_2_9_3_2(AH_HBCI *hbci, GWEN_DB_NODE *db) { int i; /* adjust token settings */ if (GWEN_DB_GetCharValue(db, "tokenType", 0, NULL)==NULL) { GWEN_DB_NODE *dbMedia; dbMedia=AH_HBCI_GetProviderDb(hbci); if (dbMedia) dbMedia=GWEN_DB_GetGroup(dbMedia, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "media"); if (dbMedia) { int mediumId; mediumId=GWEN_DB_GetIntValue(db, "medium", 0, 0); if (mediumId) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbMedia, "medium"); while(dbT) { i=GWEN_DB_GetIntValue(dbT, "uniqueId", 0, 0); if (i) { if (i==mediumId) { const char *typeName; const char *name; name=GWEN_DB_GetCharValue(dbT, "mediumName", 0, 0); assert(name); typeName=GWEN_DB_GetCharValue(dbT, "mediumTypeName", 0, 0); assert(typeName); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenType", typeName); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenName", name); break; } } dbT=GWEN_DB_FindNextGroup(dbT, "medium"); } } } } /* adjust context id */ i=GWEN_DB_GetIntValue(db, "contextIdx", 0, 0); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "contextId", i); /* adjust rdh type */ i=GWEN_DB_GetIntValue(db, "rdhType", 0, -1); if (i<1) { const char *s; s=GWEN_DB_GetCharValue(db, "cryptMode", 0, 0); if (s && strcasecmp(s, "rdh")==0) i=1; /* default is 1 if no type was set in RDH mode */ else i=0; /* default is 0 in any mode other than rdh */ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "rdhType", i); } return 0; } int AH_HBCI_UpdateUser_2_9_3_3(AH_HBCI *hbci, GWEN_DB_NODE *db) { int i; /* create tokenContextId from medium context id */ i=GWEN_DB_GetIntValue(db, "contextId", 0, 0); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenContextId", i+1); return 0; } int AH_HBCI_UpdateUser_3_1_1_2(AH_HBCI *hbci, GWEN_DB_NODE *db) { int i; GWEN_DB_DeleteVar(db, "tanMethodList"); for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "tanMethods", i, 0); if (!s) break; if (strcasecmp(s, "singleStep")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 999); else if (strcasecmp(s, "twoStep0")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 990); else if (strcasecmp(s, "twoStep1")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 991); else if (strcasecmp(s, "twoStep2")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 992); else if (strcasecmp(s, "twoStep3")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 993); else if (strcasecmp(s, "twoStep4")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 994); else if (strcasecmp(s, "twoStep5")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 995); else if (strcasecmp(s, "twoStep6")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 996); else if (strcasecmp(s, "twoStep7")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 997); else if (strcasecmp(s, "twoStep00")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 900); else if (strcasecmp(s, "twoStep01")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 901); else if (strcasecmp(s, "twoStep02")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 902); else if (strcasecmp(s, "twoStep03")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 903); else if (strcasecmp(s, "twoStep04")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 904); else if (strcasecmp(s, "twoStep05")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 905); else if (strcasecmp(s, "twoStep06")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 906); else if (strcasecmp(s, "twoStep07")==0) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", 907); } return 0; } int AH_HBCI_UpdateUser_5_0_3_1(AH_HBCI *hbci, GWEN_DB_NODE *db) { int tmn; /* update selectedTanMethod */ tmn=GWEN_DB_GetIntValue(db, "selectedTanMethod", 0, 0); if (tmn>0 && tmn < 1000) { GWEN_DB_NODE *dbT; /* get first version group of "bpd/bpdjobs/HITANS" */ dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bpd"); if (dbT) dbT=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bpdjobs"); if (dbT) dbT=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "HITANS"); if (dbT) dbT=GWEN_DB_GetFirstGroup(dbT); if (dbT) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Starting with group %s", GWEN_DB_GroupName(dbT)); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No group"); } while(dbT) { int foundTm=0; int version; /* find tanMethod group in any of the tanMethod groups of every HITANS version */ version=atoi(GWEN_DB_GroupName(dbT)); if (version>0) { GWEN_DB_NODE *dbM; dbM=GWEN_DB_FindFirstGroup(dbT, "tanMethod"); while(dbM) { int fn; fn=GWEN_DB_GetIntValue(dbM, "function", 0, 0); if (fn==tmn) { int newFn; newFn=(version*1000)+fn; DBG_WARN(AQHBCI_LOGDOMAIN, "Updating selectedTanMethod from %d to %d", tmn, newFn); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "selectedTanMethod", newFn); foundTm=1; break; } dbM=GWEN_DB_FindNextGroup(dbM, "tanMethod"); } } if (foundTm) break; dbT=GWEN_DB_GetNextGroup(dbT); } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No selectedTanMethod"); } return 0; } int AH_HBCI_UpdateAccount_1_9_7_9(AH_HBCI *hbci, GWEN_DB_NODE *db) { uint32_t flags; flags=AH_Account_Flags_fromDb(db, "accountFlags"); if (flags==0) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting account flags to default"); flags=AH_BANK_FLAGS_DEFAULT; AH_Account_Flags_toDb(db, "accountFlags", flags); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c0000644000175000017500000010066212364015477024601 00000000000000/*************************************************************************** begin : Tue Nov 25 2008 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgRdh_PrepareCryptoSeg2(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No PeerId in user, using user id"); peerId=userId; } tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "RDH"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", AH_User_GetRdhType(u)); if (crypt) { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "function", 4); /* crypt */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/algo", 13); /* 2-KEY-TRIPLE-DES */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/mode", 2); /* CBC (0-Padding) */ } else { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "function", 2); /* sign with signature key */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/algo", 10); /* RSA */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/mode", 17); /* ISO-9796-2 */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hashAlgo/algo", 999); /* RMD160 */ } return 0; } int AH_Msg_SignRdh2(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgRdh_PrepareCryptoSeg2(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(su); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; /* hash sighead + data */ md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); signLen=GWEN_Buffer_GetMaxUnsegmentedWrite(sigbuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptRdh2(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[300]; int encKeyLen; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } encKeyLen=elen; } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgRdh_PrepareCryptoSeg2(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(u); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No System id on RDH medium, using default"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, encKeyLen); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptRdh2(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[300]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; uint8_t encKey[300]; int ksize; ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); if (ksizeorigbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyRdh2(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* only now we need the verify key */ keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No verify key id on crypt token [%s:%s]", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); /* no longer return an error, it might be ok to not have a key info * even if we do not propagate the error here the check functions will * later find out that the signature is missing */ return 0; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); assert(ksize<=256); /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[20]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 20, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_NO_KEY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to verify signature of user \"%s\" (no key)", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Unable to verify signature (no key)")); } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Invalid signature!!!")); GWEN_Buffer_AppendString(tbuf, "!"); } else { GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Could not verify signature")); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); GWEN_Buffer_AppendString(tbuf, "?"); } GWEN_Buffer_AppendString(tbuf, signerId); AH_Msg_AddSignerId(hmsg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/bpd_l.h0000644000175000017500000000733612364015477023103 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_BPD_L_H #define AH_BPD_L_H #include #include #include #include #include typedef enum { AH_BPD_AddrTypeTCP=0, AH_BPD_AddrTypeBTX, AH_BPD_AddrTypeSSL, AH_BPD_AddrTypeUnknown=99 } AH_BPD_ADDR_TYPE; typedef enum { AH_BPD_FilterTypeNone=0, AH_BPD_FilterTypeBase64, AH_BPD_FilterTypeUUE } AH_BPD_FILTER_TYPE; typedef struct AH_BPD AH_BPD; typedef struct AH_BPD_ADDR AH_BPD_ADDR; GWEN_LIST_FUNCTION_LIB_DEFS(AH_BPD_ADDR, AH_BpdAddr, AQHBCI_API); GWEN_LIST2_FUNCTION_LIB_DEFS(AH_BPD_ADDR, AH_BpdAddr, AQHBCI_API); AH_BPD *AH_Bpd_new(); void AH_Bpd_free(AH_BPD *bpd); AH_BPD *AH_Bpd_dup(const AH_BPD *oldBpd); AH_BPD *AH_Bpd_FromDb(GWEN_DB_NODE *db); int AH_Bpd_ToDb(const AH_BPD *bpd, GWEN_DB_NODE *db); int AH_Bpd_GetBpdVersion(const AH_BPD *bpd); void AH_Bpd_SetBpdVersion(AH_BPD *bpd, int i); GWEN_DB_NODE *AH_Bpd_GetBpdJobs(const AH_BPD *bpd, int hbciVersion); void AH_Bpd_SetBpdJobs(AH_BPD *bpd, GWEN_DB_NODE *n); void AH_Bpd_ClearBpdJobs(AH_BPD *bpd); int AH_Bpd_GetJobTypesPerMsg(const AH_BPD *bpd); void AH_Bpd_SetJobTypesPerMsg(AH_BPD *bpd, int i); int AH_Bpd_GetMaxMsgSize(const AH_BPD *bpd); void AH_Bpd_SetMaxMsgSize(AH_BPD *bpd, int i); /** * Returns a NULL terminated list of HBCI versions supported by the server. */ const int *AH_Bpd_GetHbciVersions(const AH_BPD *bpd); int AH_Bpd_AddHbciVersion(AH_BPD *bpd, int i); void AH_Bpd_ClearHbciVersions(AH_BPD *bpd); /** * Returns a NULL terminated list of languages supported by the server. */ const int *AH_Bpd_GetLanguages(const AH_BPD *bpd); int AH_Bpd_AddLanguage(AH_BPD *bpd, int i); void AH_Bpd_ClearLanguages(AH_BPD *bpd); const char *AH_Bpd_GetBankAddr(const AH_BPD *bpd); void AH_Bpd_SetBankAddr(AH_BPD *bpd, const char *addr); int AH_Bpd_GetBankPort(const AH_BPD *bpd); void AH_Bpd_SetBankPort(AH_BPD *bpd, int p); AH_BPD_ADDR_TYPE AH_Bpd_GetAddrType(const AH_BPD *bpd); void AH_Bpd_SetAddrType(AH_BPD *bpd, AH_BPD_ADDR_TYPE i); const char *AH_Bpd_GetBankName(const AH_BPD *bpd); void AH_Bpd_SetBankName(AH_BPD *bpd, const char *s); int AH_Bpd_IsDirty(const AH_BPD *bpd); void AH_Bpd_SetIsDirty(AH_BPD *bpd, int dirty); void AH_Bpd_Dump(const AH_BPD *bpd, int insert); void AH_Bpd_ClearAddr(AH_BPD *bpd); /** takes over ownership of the given BPD address */ void AH_Bpd_AddAddr(AH_BPD *bpd, AH_BPD_ADDR *ba); AH_BPD_ADDR_LIST *AH_Bpd_GetAddrList(const AH_BPD *bpd); AH_BPD_ADDR *AH_BpdAddr_new(); void AH_BpdAddr_free(AH_BPD_ADDR *ba); AH_BPD_ADDR *AH_BpdAddr_dup(const AH_BPD_ADDR *ba); AH_BPD_ADDR *AH_BpdAddr_FromDb(GWEN_DB_NODE *db); int AH_BpdAddr_ToDb(const AH_BPD_ADDR *ba, GWEN_DB_NODE *db); AH_BPD_ADDR_TYPE AH_BpdAddr_GetType(const AH_BPD_ADDR *ba); void AH_BpdAddr_SetType(AH_BPD_ADDR *ba, AH_BPD_ADDR_TYPE t); const char *AH_BpdAddr_GetAddr(const AH_BPD_ADDR *ba); void AH_BpdAddr_SetAddr(AH_BPD_ADDR *ba, const char *s); const char *AH_BpdAddr_GetSuffix(const AH_BPD_ADDR *ba); void AH_BpdAddr_SetSuffix(AH_BPD_ADDR *ba, const char *s); AH_BPD_FILTER_TYPE AH_BpdAddr_GetFType(const AH_BPD_ADDR *ba); void AH_BpdAddr_SetFType(AH_BPD_ADDR *ba, AH_BPD_FILTER_TYPE t); int AH_BpdAddr_GetFVersion(const AH_BPD_ADDR *ba); void AH_BpdAddr_SetFVersion(AH_BPD_ADDR *ba, int i); #endif /* AH_BPD_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/user_l.h0000644000175000017500000000566212364015477023314 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_USER_L_H #define AH_USER_L_H #include #include "bpd_l.h" #include "hbci_l.h" #include #include #include int AH_User_Extend(AB_USER *u, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); AH_HBCI *AH_User_GetHbci(const AB_USER *u); GWEN_MSGENGINE *AH_User_GetMsgEngine(const AB_USER *u); int AH_User_GetBpdVersion(const AB_USER *u); void AH_User_SetBpdVersion(AB_USER *u, int i); AH_BPD *AH_User_GetBpd(const AB_USER *u); void AH_User_SetBpd(AB_USER *u, AH_BPD *bpd); /** * The upd (User Parameter Data) contains groups for every account * the customer has access to. The name of the group ressembles the * accountId. The structure is as follows (assuming an account id of * "123456" and a per day limit of 4000,- Euro for the job HKUEB which * is to be signed by at least one user): * * @code * * 11111 { * updjob { * char job="HKUEB" * int minsign="1" * limit { * char type="E" * char value="4000," * char currency="EUR" * } # limit * } # updjob * } # 11111 * @endcode * */ GWEN_DB_NODE *AH_User_GetUpd(const AB_USER *u); void AH_User_SetUpd(AB_USER *u, GWEN_DB_NODE *n); int AH_User_GetUpdVersion(const AB_USER *u); void AH_User_SetUpdVersion(AB_USER *u, int i); int AH_User_InputPin(AB_USER *u, char *pwbuffer, int minLen, int maxLen, int flags); int AH_User_InputPasswd(AB_USER *u, char *pwbuffer, int minLen, int maxLen, int flags); int AH_User_InputTan(AB_USER *u, char *pwbuffer, int minLen, int maxLen); int AH_User_InputTanWithChallenge(AB_USER *u, const char *challenge, char *pwbuffer, int minLen, int maxLen); /* for optical challenges */ int AH_User_InputTanWithChallenge2(AB_USER *u, const char *challenge, const char *challengeHhd, char *pwbuffer, int minLen, int maxLen); int AH_User_SetTanStatus(AB_USER *u, const char *challenge, const char *tan, GWEN_GUI_PASSWORD_STATUS status); int AH_User_SetPinStatus(AB_USER *u, const char *pin, GWEN_GUI_PASSWORD_STATUS status); const GWEN_STRINGLIST *AH_User_GetSepaDescriptors(AB_USER *u); #endif /* AH_USER_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci-updates_p.h0000644000175000017500000000405012364015477024700 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_HBCI_UPDATES_P_H #define AH_HBCI_UPDATES_P_H #include "hbci-updates_l.h" /** @name Init Update Functions * * Functions of this group are called from AB_Provider_Init(). */ /*@{*/ /*@}*/ /** @name User DB Update Functions * * Functions in this group called from @ref AB_User_Extend. */ /*@{*/ /** * This update converts AH_BPDADDR groups to GWEN_URL strings. */ static int AH_HBCI_UpdateUser_1_9_7_7(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This update adds the variable "tanMethods" with an initial value of * "singleStep" */ static int AH_HBCI_UpdateUser_2_1_1_1(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This update creates the crypt token settings from the medium id * and sets the rdhType if it not already is. */ static int AH_HBCI_UpdateUser_2_9_3_2(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This update creates tokenContextId from contextId for media. */ static int AH_HBCI_UpdateUser_2_9_3_3(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This update transforms tanMethods to tanMethodList */ static int AH_HBCI_UpdateUser_3_1_1_2(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This update transforms selectedTanMethod */ static int AH_HBCI_UpdateUser_5_0_3_1(AH_HBCI *hbci, GWEN_DB_NODE *db); /*@}*/ /** @name Account DB Update Functions * * Functions in this group called from @ref AB_Account_Extend. */ /*@{*/ /** * This update sets the account flags to the default value if they are "0". * This now makes single transfers the default. */ static int AH_HBCI_UpdateAccount_1_9_7_9(AH_HBCI *hbci, GWEN_DB_NODE *db); /*@}*/ #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c0000644000175000017500000001142212364015477024231 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /* this file is included from dialog.c" */ int AH_Dialog_CreateIoLayer_Hbci(AH_DIALOG *dlg) { const GWEN_URL *url; GWEN_SYNCIO *sio; int rv; GWEN_BUFFER *tbuf; assert(dlg); /* take bank addr from user */ url=AH_User_GetServerUrl(dlg->dialogOwner); if (!url) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User has no valid address settings"); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Url_toString(url, tbuf); rv=GWEN_Gui_GetSyncIo(GWEN_Buffer_GetStart(tbuf), "hbci", 3000, &sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return GWEN_ERROR_GENERIC; } GWEN_Buffer_free(tbuf); dlg->ioLayer=sio; return 0; } int AH_Dialog_Connect_Hbci(AH_DIALOG *dlg) { if (dlg->ioLayer==NULL) { int rv; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Connecting to bank...")); rv=AH_Dialog_CreateIoLayer_Hbci(dlg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } do { rv=GWEN_SyncIo_Connect(dlg->ioLayer); } while (rv==GWEN_ERROR_INTERRUPTED); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not connect to bank (%d)", rv); GWEN_SyncIo_free(dlg->ioLayer); dlg->ioLayer=NULL; GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not connect (%d)"), rv); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Connected.")); } return 0; } int AH_Dialog_Disconnect_Hbci(AH_DIALOG *dlg) { if (dlg->ioLayer) { int rv; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Disconnecting from bank...")); do { rv=GWEN_SyncIo_Disconnect(dlg->ioLayer); } while (rv==GWEN_ERROR_INTERRUPTED); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Disconnected.")); GWEN_SyncIo_free(dlg->ioLayer); dlg->ioLayer=NULL; } return 0; } int AH_Dialog_SendPacket_Hbci(AH_DIALOG *dlg, const char *buf, int blen) { int rv; rv=GWEN_SyncIo_WriteForced(dlg->ioLayer, (const uint8_t*)buf, blen); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AH_Dialog_RecvMessage_Hbci(AH_DIALOG *dlg, AH_MSG **pMsg) { AH_MSG *msg; GWEN_BUFFER *tbuf; int rv; char *p1; char *p2; char header[32]; int msgSize; assert(dlg->ioLayer); /* receive header */ rv=GWEN_SyncIo_ReadForced(dlg->ioLayer, (uint8_t*)header, sizeof(header)-1); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error reading header (%d)", rv); return rv; } else if (rv!=sizeof(header)-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "EOF met"); return GWEN_ERROR_EOF; } header[rv]=0; /* check for beginning of HBCI message */ if (strncmp(header, "HNHBK:", 6)!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message does not start with HNHBK"); return GWEN_ERROR_BAD_DATA; } /* seek to begin of size */ p1=strchr(header, '+'); if (p1==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad data (missing '+')"); return GWEN_ERROR_BAD_DATA; } p1++; /* seek to end of size */ p2=strchr(p1, '+'); if (p2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad data (missing '+')"); GWEN_Text_DumpString(header, 21, 2); return GWEN_ERROR_BAD_DATA; } /* save received bytes */ tbuf=GWEN_Buffer_new(0, 512, 0, 1); GWEN_Buffer_AppendBytes(tbuf, header, rv); /* read message size */ *p2=0; if (1!=sscanf(p1, "%d", &msgSize)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad size field [%s]", p1); GWEN_Buffer_free(tbuf); return GWEN_ERROR_BAD_DATA; } /* subtract bytes already received */ msgSize-=rv; /* make room for the rest of the message */ GWEN_Buffer_AllocRoom(tbuf, msgSize); /* receive rest of the message */ rv=GWEN_SyncIo_ReadForced(dlg->ioLayer, (uint8_t*)GWEN_Buffer_GetPosPointer(tbuf), msgSize); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error reading message (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } else if (rv!=msgSize) { DBG_ERROR(AQHBCI_LOGDOMAIN, "EOF met"); GWEN_Buffer_free(tbuf); return GWEN_ERROR_EOF; } /* advance pointer and counter in buffer */ GWEN_Buffer_IncrementPos(tbuf, msgSize); GWEN_Buffer_AdjustUsedBytes(tbuf); /* create message and assign the buffer */ msg=AH_Msg_new(dlg); AH_Msg_SetBuffer(msg, tbuf); /* done */ *pMsg=msg; return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c0000644000175000017500000010062412364015477024602 00000000000000/*************************************************************************** begin : Tue Nov 25 2008 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgRdh_PrepareCryptoSeg5(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No PeerId in user, using user id"); peerId=userId; } tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "RDH"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", AH_User_GetRdhType(u)); if (crypt) { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/algo", 13); /* RSA */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/mode", 18); /* PKCS#1 */ } else { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/algo", 10); /* RSA */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/mode", 18); /* PKCS#1 */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hashAlgo/algo", 1); /* SHA-1 */ } return 0; } int AH_Msg_SignRdh5(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgRdh_PrepareCryptoSeg5(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) { GWEN_BUFFER *idBuf; idBuf=GWEN_Buffer_new(0, 128, 0, 1); rv=GWEN_Text_FromHexBuffer(p, idBuf); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad system id on RDH medium, should not happen (%d)", rv); GWEN_Buffer_free(idBuf); GWEN_DB_Group_free(cfg); return rv; } GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/CID", GWEN_Buffer_GetStart(idBuf), GWEN_Buffer_GetUsedBytes(idBuf)); GWEN_Buffer_free(idBuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on RDH medium, should not happen."); GWEN_DB_Group_free(cfg); return GWEN_ERROR_INTERNAL; } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; /* hash sighead + data */ md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); signLen=GWEN_Buffer_GetMaxUnsegmentedWrite(sigbuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptRdh5(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[300]; int encKeyLen; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } encKeyLen=elen; } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgRdh_PrepareCryptoSeg5(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) { GWEN_BUFFER *idBuf; idBuf=GWEN_Buffer_new(0, 128, 0, 1); rv=GWEN_Text_FromHexBuffer(p, idBuf); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad system id on RDH medium, should not happen (%d)", rv); GWEN_Buffer_free(idBuf); GWEN_DB_Group_free(cfg); return rv; } GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/CID", GWEN_Buffer_GetStart(idBuf), GWEN_Buffer_GetUsedBytes(idBuf)); GWEN_Buffer_free(idBuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on RDH medium, should not happen."); GWEN_DB_Group_free(cfg); return GWEN_ERROR_INTERNAL; } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, encKeyLen); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptRdh5(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[300]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; uint8_t encKey[300]; int ksize; ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); if (ksizeorigbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyRdh5(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* only now we need the verify key */ keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No verify key id on crypt token [%s:%s]", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); /* no longer return an error, it might be ok to not have a key info * even if we do not propagate the error here the check functions will * later find out that the signature is missing */ return 0; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); assert(ksize<=256); /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[20]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 20, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_NO_KEY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to verify signature of user \"%s\" (no key)", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Unable to verify signature (no key)")); } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Invalid signature!!!")); GWEN_Buffer_AppendString(tbuf, "!"); } else { GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Could not verify signature")); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); GWEN_Buffer_AppendString(tbuf, "?"); } GWEN_Buffer_AppendString(tbuf, signerId); AH_Msg_AddSignerId(hmsg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/account_l.h0000644000175000017500000000154412364015477023765 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ACCOUNT_L_H #define AH_ACCOUNT_L_H #include "account.h" #include "hbci_l.h" #include int AH_Account_Extend(AB_ACCOUNT *a, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE um, GWEN_DB_NODE *db); AH_HBCI *AH_Account_GetHbci(const AB_ACCOUNT *a); #endif /* AH_ACCOUNT_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/message.c0000644000175000017500000013763312364015477023446 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif /* #define AH_MSG_HEAVY_DEBUG */ #include "message_p.h" #include "aqhbci_l.h" #include "hbci_l.h" #include "dialog_l.h" #include "msgengine_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_MSG, AH_Msg); /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_AddSignerId(AH_MSG *hmsg, const char *s) { assert(hmsg); if (hmsg->nodes) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Signers must be added before nodes !"); return GWEN_ERROR_INVALID; } return GWEN_StringList_AppendString(hmsg->signerIdList, s, 0, 1); } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetSignerCount(AH_MSG *hmsg){ assert(hmsg); return GWEN_StringList_Count(hmsg->signerIdList); } /* --------------------------------------------------------------- FUNCTION */ GWEN_BUFFER *AH_Msg_GetBuffer(AH_MSG *hmsg){ assert(hmsg); return hmsg->buffer; } /* --------------------------------------------------------------- FUNCTION */ GWEN_BUFFER *AH_Msg_TakeBuffer(AH_MSG *hmsg){ GWEN_BUFFER *bf; assert(hmsg); bf=hmsg->buffer; hmsg->buffer=0; return bf; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetBuffer(AH_MSG *hmsg, GWEN_BUFFER *bf){ assert(hmsg); GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=bf; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetMsgNum(const AH_MSG *hmsg){ assert(hmsg); return hmsg->msgNum; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetMsgRef(const AH_MSG *hmsg){ assert(hmsg); return hmsg->refMsgNum; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetMsgRef(AH_MSG *hmsg, unsigned int i){ assert(hmsg); hmsg->refMsgNum=i; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetNodes(AH_MSG *hmsg){ assert(hmsg); return hmsg->nodes; } /* --------------------------------------------------------------- FUNCTION */ AH_MSG *AH_Msg_new(AH_DIALOG *dlg){ AH_MSG *hmsg; assert(dlg); GWEN_NEW_OBJECT(AH_MSG, hmsg); GWEN_LIST_INIT(AH_MSG, hmsg); hmsg->dialog=dlg; AH_Dialog_Attach(dlg); hmsg->buffer=GWEN_Buffer_new(0, AH_MSG_DEFAULTSIZE, 0, 1); GWEN_Buffer_ReserveBytes(hmsg->buffer, AH_MSG_DEFAULTRESERVE); GWEN_Buffer_SetStep(hmsg->buffer, AH_MSG_DEFAULTSTEP); hmsg->signerIdList=GWEN_StringList_new(); return hmsg; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_free(AH_MSG *hmsg){ if (hmsg) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Destroying AH_MSG"); GWEN_LIST_FINI(AH_MSG, hmsg); GWEN_StringList_free(hmsg->signerIdList); GWEN_Buffer_free(hmsg->itanHashBuffer); GWEN_Buffer_free(hmsg->buffer); GWEN_Buffer_free(hmsg->origbuffer); AH_Dialog_free(hmsg->dialog); free(hmsg->crypterId); free(hmsg->resultText); free(hmsg->resultParam); free(hmsg->usedTan); free(hmsg->expectedSigner); free(hmsg->expectedCrypter); if (hmsg->usedPin) { memset(hmsg->usedPin, 0, strlen(hmsg->usedPin)); free(hmsg->usedPin); } GWEN_DB_Group_free(hmsg->decodedMsg); GWEN_FREE_OBJECT(hmsg); } } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_GetSecurityProfile(const AH_MSG *hmsg) { assert(hmsg); return hmsg->secProfile; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetSecurityProfile(AH_MSG *hmsg, int i) { assert(hmsg); hmsg->secProfile=i; } int AH_Msg_GetSecurityClass(const AH_MSG *hmsg) { assert(hmsg); return hmsg->secClass; } void AH_Msg_SetSecurityClass(AH_MSG *hmsg, int i) { assert(hmsg); hmsg->secClass=i; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_AddMsgTail(AH_MSG *hmsg){ GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; int rv; GWEN_MSGENGINE *e; assert(hmsg); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "MsgTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"MsgTail\" not found"); return -1; } cfg=GWEN_DB_Group_new("msgtail"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); GWEN_Buffer_SetPos(hmsg->buffer, GWEN_Buffer_GetUsedBytes(hmsg->buffer)); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hmsg->buffer, cfg); GWEN_DB_Group_free(cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create msgTail"); return -1; } return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_AddMsgHead(AH_MSG *hmsg) { GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *hbuf; unsigned int msize; int rv; GWEN_MSGENGINE *e; assert(hmsg); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "MsgHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"MsgHead\"not found"); return -1; } cfg=GWEN_DB_Group_new("msghead"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "dialogid", AH_Dialog_GetDialogId(hmsg->dialog)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "msgnum", hmsg->msgNum); if (hmsg->refMsgNum) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding Reference Message Number"); /* add message reference */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "msgref/msgnum", hmsg->refMsgNum); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "msgref/dialogid", AH_Dialog_GetDialogId(hmsg->dialog)); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Protocol version is %d", GWEN_MsgEngine_GetProtocolVersion(e)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hversion", GWEN_MsgEngine_GetProtocolVersion(e)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "size", 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 1); hbuf=GWEN_Buffer_new(0, 128, 0, 1); /* create first version of msgHead just to calculate the size */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create msgHead"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } msize=GWEN_Buffer_GetUsedBytes(hmsg->buffer)+ GWEN_Buffer_GetUsedBytes(hbuf); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message size is: %d", msize); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "size", msize); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 1); GWEN_Buffer_Reset(hbuf); /* create final version of msgHead (we now know the size) */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create 2nd version of msgHead"); GWEN_Buffer_free(hbuf); return -1; } /* insert msgHead */ GWEN_Buffer_SetPos(hmsg->buffer, 0); if (GWEN_Buffer_InsertBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not insert msgHead"); GWEN_Buffer_free(hbuf); return -1; } GWEN_Buffer_free(hbuf); return 0; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetCurrentSegmentNumber(AH_MSG *hmsg) { if (hmsg->firstSegment==0) { unsigned int rv; rv=2; if (hmsg->enableInsert) rv++; rv+=GWEN_StringList_Count(hmsg->signerIdList); return rv; } return hmsg->lastSegment+1; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_AddNode(AH_MSG *hmsg, GWEN_XMLNODE *node, GWEN_DB_NODE *data) { int rv; GWEN_MSGENGINE *e; unsigned int usedBefore; assert(hmsg); assert(node); assert(data); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); if (hmsg->firstSegment==0) { /* first node */ hmsg->firstSegment=2; if (hmsg->enableInsert) hmsg->firstSegment++; hmsg->firstSegment+=GWEN_StringList_Count(hmsg->signerIdList); GWEN_MsgEngine_SetIntValue(e, "SegmentNumber", hmsg->firstSegment); hmsg->lastSegment=hmsg->firstSegment-1; } usedBefore=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hmsg->buffer, data); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_Crop(hmsg->buffer, 0, usedBefore); GWEN_Buffer_SetPos(hmsg->buffer, usedBefore); DBG_ERROR(AQHBCI_LOGDOMAIN, "Buffer:"); GWEN_Buffer_Dump(hmsg->buffer, 2); DBG_ERROR(AQHBCI_LOGDOMAIN, "XML:"); GWEN_XMLNode_Dump(node, 2); DBG_ERROR(0, "MsgEngine - mode: %s version:%d", GWEN_MsgEngine_GetMode(e), GWEN_MsgEngine_GetProtocolVersion(e)); return 0; } hmsg->lastSegment=GWEN_MsgEngine_GetIntValue(e, "SegmentNumber", 1)-1; hmsg->nodes++; return hmsg->lastSegment; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_InsertNode(AH_MSG *hmsg, GWEN_XMLNODE *node, GWEN_DB_NODE *data) { int rv; GWEN_MSGENGINE *e; GWEN_BUFFER *tmpbuf; unsigned int pos; assert(hmsg); assert(node); assert(data); if (hmsg->nodes==0) return AH_Msg_AddNode(hmsg, node, data); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); if (!hmsg->enableInsert) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Inserting a node without enableInsert flag"); return 0; } if (hmsg->firstSegment<(2+GWEN_StringList_Count(hmsg->signerIdList))) { DBG_ERROR(AQHBCI_LOGDOMAIN, "First segment is %d (%d signers), can't insert a new one", hmsg->firstSegment, GWEN_StringList_Count(hmsg->signerIdList)); return 0; } hmsg->firstSegment--; GWEN_MsgEngine_SetIntValue(e, "SegmentNumber", hmsg->firstSegment); tmpbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, tmpbuf, data); GWEN_MsgEngine_SetIntValue(e, "SegmentNumber", hmsg->lastSegment+1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(tmpbuf); return 0; } pos=GWEN_Buffer_GetPos(hmsg->buffer); GWEN_Buffer_SetPos(hmsg->buffer, 0); GWEN_Buffer_InsertBuffer(hmsg->buffer, tmpbuf); GWEN_Buffer_SetPos(hmsg->buffer, pos+GWEN_Buffer_GetUsedBytes(tmpbuf)); GWEN_Buffer_free(tmpbuf); hmsg->nodes++; return hmsg->firstSegment; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_EncodeMsg(AH_MSG *hmsg) { GWEN_MSGENGINE *e; int rv; assert(hmsg); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetProtocolVersion(e, hmsg->hbciVersion); if (hmsg->firstSegment==0) { /* first node */ hmsg->firstSegment=2; hmsg->firstSegment+=GWEN_StringList_Count(hmsg->signerIdList); GWEN_MsgEngine_SetIntValue(e, "SegmentNumber", hmsg->firstSegment); hmsg->lastSegment=hmsg->firstSegment-1; } hmsg->msgNum=AH_Dialog_GetNextMsgNum(hmsg->dialog); GWEN_MsgEngine_SetIntValue(AH_Dialog_GetMsgEngine(hmsg->dialog), "MessageNumber", hmsg->msgNum); GWEN_MsgEngine_SetValue(AH_Dialog_GetMsgEngine(hmsg->dialog), "DialogId", AH_Dialog_GetDialogId(hmsg->dialog)); /* sign message */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Letting all signers sign"); if (GWEN_StringList_Count(hmsg->signerIdList)) { GWEN_BUFFER *rawBuf; GWEN_STRINGLISTENTRY *se; rawBuf=GWEN_Buffer_dup(hmsg->buffer); se=GWEN_StringList_FirstEntry(hmsg->signerIdList); while (se) { rv=AH_Msg__Sign(hmsg, rawBuf, GWEN_StringListEntry_Data(se)); if (rv) { GWEN_Buffer_free(rawBuf); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } se=GWEN_StringListEntry_Next(se); } /* while */ GWEN_Buffer_free(rawBuf); } /* if signing is needed */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Letting all signers sign: done"); /* log unencrypted message */ AH_Msg_LogMessage(hmsg, hmsg->buffer, 0, 0); /* encrypt message */ if (hmsg->crypterId) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Encrypting message"); rv=AH_Msg__Encrypt(hmsg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Encrypting message: done"); } /* add msg tail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding message tail"); if (AH_Msg_AddMsgTail(hmsg)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding message tail: done"); /* add msg head */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding message head"); if (AH_Msg_AddMsgHead(hmsg)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding message head: done"); /* log final message */ AH_Msg_LogMessage(hmsg, hmsg->buffer, 0, 1); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message finished"); return 0; } /* --------------------------------------------------------------- FUNCTION */ /* return -1 on error (with group "seg/error" set) or -2 if the message is * faulty */ int AH_Msg_ReadSegment(AH_MSG *msg, GWEN_MSGENGINE *e, const char *gtype, GWEN_BUFFER *mbuf, GWEN_DB_NODE *gr, unsigned int flags) { GWEN_XMLNODE *node; unsigned int posBak; const char *p; GWEN_DB_NODE *tmpdb; int segVer; /* find head segment description */ tmpdb=GWEN_DB_Group_new("head"); node=GWEN_MsgEngine_FindGroupByProperty(e, "id", 0, "SegHead"); if (node==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Segment description not found (internal error)"); GWEN_DB_Group_free(tmpdb); return -2; } /* parse head segment */ posBak=GWEN_Buffer_GetPos(mbuf); if (GWEN_MsgEngine_ParseMessage(e, node, mbuf, tmpdb, flags)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing segment head"); GWEN_DB_Group_free(tmpdb); return -2; } GWEN_Buffer_SetPos(mbuf, posBak); /* get segment code */ segVer=GWEN_DB_GetIntValue(tmpdb, "version", 0, 0); p=GWEN_DB_GetCharValue(tmpdb, "code", 0, 0); if (!p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No segment code for %s ? This seems to be a bad msg...", gtype); DBG_ERROR(AQHBCI_LOGDOMAIN, "Full message (pos=%04x)", posBak); GWEN_Text_DumpString(GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf), 1); GWEN_DB_Dump(tmpdb, 1); GWEN_DB_Group_free(tmpdb); return -1; } /* try to find corresponding XML node */ node=GWEN_MsgEngine_FindNodeByProperty(e, gtype, "code", segVer, p); if (node==0) { GWEN_DB_NODE *storegrp; unsigned int startPos; GWEN_Buffer_SetPos(mbuf, posBak); startPos=posBak; storegrp=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_CREATE_GROUP, p); assert(storegrp); GWEN_DB_AddGroup(storegrp, GWEN_DB_Group_dup(tmpdb)); /* store the start position of this segment within the DB */ GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/pos", startPos); GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/code", 9130); GWEN_DB_SetCharValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/text", "Unbekanntes segment (Parser)"); GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/pos", startPos); /* node not found, skip it */ DBG_WARN(AQHBCI_LOGDOMAIN, "Unknown segment \"%s\" (Segnum=%d, version=%d, ref=%d)", p, GWEN_DB_GetIntValue(tmpdb, "seq", 0, -1), GWEN_DB_GetIntValue(tmpdb, "version", 0, -1), GWEN_DB_GetIntValue(tmpdb, "ref", 0, -1)); if (GWEN_MsgEngine_SkipSegment(e, mbuf, '?', '\'')) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error skipping segment \"%s\"", p); GWEN_DB_Group_free(tmpdb); return -1; } /* store segment size within DB */ GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/length", GWEN_Buffer_GetPos(mbuf)-startPos); /* handle trust info */ if (flags & GWEN_MSGENGINE_READ_FLAGS_TRUSTINFO) { unsigned int usize; usize=GWEN_Buffer_GetPos(mbuf)-(startPos+1)-1; if (GWEN_MsgEngine_AddTrustInfo(e, GWEN_Buffer_GetStart(mbuf)+startPos, usize, p, GWEN_MsgEngineTrustLevelHigh, startPos)) { DBG_INFO(AQHBCI_LOGDOMAIN, "called from here"); GWEN_DB_Group_free(tmpdb); return -1; } } /* if trustInfo handling wanted */ } else { /* ok, node available, get the corresponding description and parse * the segment */ const char *id; GWEN_DB_NODE *storegrp; unsigned int startPos; /* restore start position, since the segment head is part of a full * description, so we need to restart reading from the very begin */ GWEN_Buffer_SetPos(mbuf, posBak); /* create group in DB for this segment */ id=GWEN_XMLNode_GetProperty(node, "id", p); storegrp=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_CREATE_GROUP, id); assert(storegrp); /* store the start position of this segment within the DB */ startPos=GWEN_Buffer_GetPos(mbuf); GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/pos", startPos); /* parse the segment */ if (GWEN_MsgEngine_ParseMessage(e, node, mbuf, storegrp, flags)) { GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/code", 9130); GWEN_DB_SetCharValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/text", "Syntaxfehler"); GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/pos", GWEN_Buffer_GetPos(mbuf)-startPos); DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing segment \"%s\"",p); GWEN_Text_DumpString(GWEN_Buffer_GetStart(mbuf)+startPos, GWEN_Buffer_GetUsedBytes(mbuf)-startPos, 1); GWEN_DB_Group_free(tmpdb); return -1; } /* store segment size within DB */ GWEN_DB_SetIntValue(storegrp, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/length", GWEN_Buffer_GetPos(mbuf)-startPos); if (strcasecmp(id, "MsgHead")==0) { int protocolVersion; protocolVersion=GWEN_DB_GetIntValue(storegrp, "hversion", 0, 0); if (!protocolVersion) { DBG_WARN(AQHBCI_LOGDOMAIN, "Unknown protocol version, using default of 210"); protocolVersion=210; } /* set HBCI protocol version to be used (taken from MsgHead) */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Setting protocol version to %d", protocolVersion); GWEN_MsgEngine_SetProtocolVersion(e, protocolVersion); msg->hbciVersion=protocolVersion; } } /* if node found */ GWEN_DB_Group_free(tmpdb); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_ReadMessage(AH_MSG *msg, GWEN_MSGENGINE *e, const char *gtype, GWEN_BUFFER *mbuf, GWEN_DB_NODE *gr, unsigned int flags) { unsigned int segments; unsigned int errors; int rv; segments=0; errors=0; while(GWEN_Buffer_GetBytesLeft(mbuf)) { rv=AH_Msg_ReadSegment(msg, e, gtype, mbuf, gr, flags); if (rv==-2) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return -1; } else if (rv==-1) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); DBG_ERROR(AQHBCI_LOGDOMAIN, "Error here:"); GWEN_Buffer_Dump(mbuf, 2); #ifdef AH_MSG_HEAVY_DEBUG return -1; #endif if (GWEN_MsgEngine_SkipSegment(e, mbuf, '?', '\'')) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error skipping segment"); return -1; } errors++; } segments++; } /* while */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Parsed %d segments (%d had errors)", segments, errors); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_SequenceCheck(GWEN_DB_NODE *gr) { GWEN_DB_NODE *n; unsigned int sn; unsigned int errors; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Sequence check"); sn=1; errors=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { unsigned int rsn; rsn=GWEN_DB_GetIntValue(n, "head/seq", 0, 0); if (rsn<900) { if (rsn!=sn) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected sequence number (%d, expected %d)", rsn, sn); GWEN_DB_Dump(n, 2); GWEN_DB_SetIntValue(n, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/code", 9120); GWEN_DB_SetCharValue(n, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/text", "Unerwartete Segmentnummer"); errors++; } sn++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (errors) return -1; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Sequence check ok"); return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_DecodeMsg(AH_MSG *hmsg, GWEN_DB_NODE *gr, unsigned int flags) { GWEN_MSGENGINE *e; int rv; GWEN_DB_NODE *n, *n2; AB_USER *u; const char *mode; uint32_t expMsgNum; uint32_t guiid; assert(hmsg->dialog); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); /* set mode */ u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); guiid=0; mode=AH_CryptMode_toString(AH_User_GetCryptMode(u)); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Mode is: %s", mode); GWEN_MsgEngine_SetMode(e, mode); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Decoding message:"); /* log encrypted message */ AH_Msg_LogMessage(hmsg, hmsg->buffer, 1, 1); GWEN_Buffer_Rewind(hmsg->buffer); rv=AH_Msg_ReadMessage(hmsg, e, "SEG", hmsg->buffer, gr, flags); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return GWEN_ERROR_BAD_DATA; } /* take some values out of the message head (with checks) */ n=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "MsgHead"); if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No message head segment"); return GWEN_ERROR_BAD_DATA; } /* sample message number */ expMsgNum=AH_Dialog_GetLastMsgNum(hmsg->dialog); hmsg->msgNum=GWEN_DB_GetIntValue(n, "msgnum", 0, 0); if (AH_Dialog_CheckReceivedMsgNum(hmsg->dialog, hmsg->msgNum)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad message number, ignoring"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, I18N("Bad message number, ignoring")); /* FIXME: this is sometimes returned by the Sparkasse server, when * the server is currently out of service * We will for now ignore this, since this message still returns an * error code and text which might be of interest to the user. */ /* return -1; */ hmsg->msgNum=expMsgNum; } /* sample dialog id if necessary */ if (strcasecmp(AH_Dialog_GetDialogId(hmsg->dialog), "0")==0) { /* dialog id not yet known, copy it */ const char *p; p=GWEN_DB_GetCharValue(n, "dialogid", 0, 0); if (!p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No dialog id in message"); return GWEN_ERROR_BAD_DATA; } if (AH_Dialog_GetFlags(hmsg->dialog) & AH_DIALOG_FLAGS_INITIATOR) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Setting new dialog id (%s)", p); AH_Dialog_SetDialogId(hmsg->dialog, p); GWEN_MsgEngine_SetValue(e, "dialogid", p); } else { const char *myDlgId; myDlgId=AH_Dialog_GetDialogId(hmsg->dialog); assert(myDlgId); if (strcasecmp(myDlgId, p)!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad dialog id received from peer"); GWEN_DB_SetIntValue(n, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/code", 9210); GWEN_DB_SetCharValue(n, GWEN_DB_FLAGS_OVERWRITE_VARS, "segment/error/text", "Ungueltige Dialog Kennung"); return GWEN_ERROR_BAD_DATA; } /* if bad dialog id */ } /* if !initialtor */ } n2=GWEN_DB_GetGroup(n, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "msgref"); if (n2) { /* we have a message reference, get it */ const char *p; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Found a message reference"); p=GWEN_DB_GetCharValue(n2, "dialogid", 0, 0); if (!p) { DBG_WARN(AQHBCI_LOGDOMAIN, "No reference dialog id in message, ignoring"); /*return GWEN_ERROR_BAD_DATA;*/ } else { if (strcasecmp(AH_Dialog_GetDialogId(hmsg->dialog), p)!=0) { /* some servers send error responses with invalid dialog id and * message number 9999; we don't rely on the correct id anyway, so * we might as well ignore that error here */ DBG_WARN(AQHBCI_LOGDOMAIN, "Dialog id does not match current dialog id, ignoring"); GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Warning, I18N("Dialog id does not match, ignoring")); /*return GWEN_ERROR_BAD_DATA;*/ } hmsg->refMsgNum=GWEN_DB_GetIntValue(n2, "msgnum", 0, 0); if (hmsg->refMsgNum!=expMsgNum) { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad message reference number, ignoring"); GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Warning, I18N("Bad message reference number, ignoring")); hmsg->refMsgNum=expMsgNum; } } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No message reference found"); GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Warning, I18N("No message reference found, ignoring")); } /* find Crypt head */ n=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (n) { if (GWEN_DB_GetIntValue(n, "segment/error/code", 0, 0)>=9000) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Encryption error"); return GWEN_ERROR_GENERIC; } rv=AH_Msg__Decrypt(hmsg, gr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return AB_ERROR_SECURITY; } /* unlink and delete crypthead */ GWEN_DB_UnlinkGroup(n); GWEN_DB_Group_free(n); /* unlink and delete cryptdata */ n=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (n) { GWEN_DB_UnlinkGroup(n); GWEN_DB_Group_free(n); } /* parse decrypted message part */ n=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "MsgTail"); if (n) { /* temporarily unlink MsgTail, it will be appended after decoding * the crypted part, to keep the segment sequence correct */ GWEN_DB_UnlinkGroup(n); } rv=AH_Msg_ReadMessage(hmsg, e, "SEG", hmsg->buffer, gr, flags); if (n) GWEN_DB_AddGroup(gr, n); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return GWEN_ERROR_BAD_DATA; } } /* if crypthead */ /* log decrypted message */ AH_Msg_LogMessage(hmsg, hmsg->buffer, 1, 0); /* check segment sequence numbers */ rv=AH_Msg_SequenceCheck(gr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return AB_ERROR_SECURITY; } /* verify signatures */ rv=AH_Msg__Verify(hmsg, gr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return rv; } return 0; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg__Dump(const AH_MSG *hmsg, unsigned int indent) { unsigned int i; GWEN_STRINGLISTENTRY *se; for (i=0; iorigbuffer) { for (i=0; iorigbuffer, indent+2); } else { for (i=0; ibuffer) { for (i=0; ibuffer, indent+2); } else { for (i=0; icrypterId) { fprintf(stderr, "Crypter: %s\n", hmsg->crypterId); } else { fprintf(stderr, "Crypter: none\n"); } for (i=0; isignerIdList)); se=GWEN_StringList_FirstEntry(AH_Msg_GetSignerIdList(hmsg)); while(se) { for (i=0; inodes); for (i=0; imsgNum); for (i=0; irefMsgNum); for (i=0; ifirstSegment); for (i=0; ilastSegment); for (i=0; idialog; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_IsSignedBy(const AH_MSG *hmsg, const char *s){ GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(hmsg->signerIdList); while(se) { if (strcasecmp(GWEN_StringListEntry_Data(se), s)==0) break; se=GWEN_StringListEntry_Next(se); } if (se) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", s); return 1; } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Customer \"%s\" did not sign the message", s); return 0; } } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_EnableInsert(AH_MSG *hmsg) { assert(hmsg); if (hmsg->nodes && !hmsg->enableInsert) { DBG_INFO(AQHBCI_LOGDOMAIN, "There already are nodes in the buffer, " "cannot insert"); return GWEN_ERROR_INVALID; } hmsg->enableInsert=1; return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_HasWarnings(const AH_MSG *hmsg) { assert(hmsg); return hmsg->hasWarnings; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetHasWarnings(AH_MSG *hmsg, int i) { assert(hmsg); hmsg->hasWarnings=i; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_HasErrors(const AH_MSG *hmsg) { assert(hmsg); return hmsg->hasErrors; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetHasErrors(AH_MSG *hmsg, int i) { assert(hmsg); hmsg->hasErrors=i; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_GetResultCode(const AH_MSG *hmsg){ assert(hmsg); return hmsg->resultCode; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetResultCode(AH_MSG *hmsg, int i){ assert(hmsg); hmsg->resultCode=i; } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Msg_GetResultText(const AH_MSG *hmsg){ assert(hmsg); return hmsg->resultText; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetResultText(AH_MSG *hmsg, const char *s){ assert(hmsg); free(hmsg->resultText); if (s) hmsg->resultText=strdup(s); else hmsg->resultText=0; } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Msg_GetResultParam(const AH_MSG *hmsg){ assert(hmsg); return hmsg->resultParam; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetResultParam(AH_MSG *hmsg, const char *s){ assert(hmsg); free(hmsg->resultParam); if (s) hmsg->resultParam=strdup(s); else hmsg->resultParam=0; } /* --------------------------------------------------------------- FUNCTION */ unsigned int AH_Msg_GetHbciVersion(const AH_MSG *hmsg) { assert(hmsg); return hmsg->hbciVersion; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetHbciVersion(AH_MSG *hmsg, unsigned int i) { assert(hmsg); hmsg->hbciVersion=i; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetTan(AH_MSG *hmsg, const char *s){ assert(hmsg); free(hmsg->usedTan); if (s) hmsg->usedTan=strdup(s); else hmsg->usedTan=0; } /* --------------------------------------------------------------- FUNCTION */ const char *AH_Msg_GetTan(const AH_MSG *hmsg){ assert(hmsg); return hmsg->usedTan; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_GetNeedTan(const AH_MSG *hmsg){ assert(hmsg); return hmsg->needTan; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetNeedTan(AH_MSG *hmsg, int i){ assert(hmsg); hmsg->needTan=i; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg_NoSysId(const AH_MSG *hmsg){ assert(hmsg); return hmsg->noSysId; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_SetNoSysId(AH_MSG *hmsg, int i){ assert(hmsg); hmsg->noSysId=i; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg__AnonHnsha(const char *psegment, unsigned int slen, GWEN_SYNCIO *sio){ int plusCount=0; int lastWasEscape=0; int segDone=0; const char *p; unsigned int count; p=psegment; count=slen; while(*p && !segDone && count--) { int normalChar=1; int err; err=0; if (lastWasEscape) { lastWasEscape=0; normalChar=0; } else { if (*p=='?') { lastWasEscape=1; } else { if (*p=='\'') segDone=1; else if (*p=='+') plusCount++; lastWasEscape=0; } } if (plusCount>=3 && normalChar && *p!='+' && *p!='\'' && *p!=':') err=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "*", 1); else err=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) p, 1); if (err<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", err); return err; } p++; } /* while */ return 0; } /* --------------------------------------------------------------- FUNCTION */ int AH_Msg__AnonHkpae(const char *psegment, unsigned int slen, GWEN_SYNCIO *sio){ int plusCount=0; int lastWasEscape=0; int segDone=0; const char *p; unsigned int count; p=psegment; count=slen; while(*p && !segDone && count--) { int normalChar=1; int err; err=0; if (lastWasEscape) { lastWasEscape=0; normalChar=0; } else { if (*p=='?') { lastWasEscape=1; } else { if (*p=='\'') segDone=1; else if (*p=='+') plusCount++; lastWasEscape=0; } } if (plusCount>=1 && normalChar && *p!='+' && *p!='\'' && *p!=':') err=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "*", 1); else err=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) p, 1); if (err<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", err); return err; } p++; } /* while */ return 0; } /* --------------------------------------------------------------- FUNCTION */ void AH_Msg_LogMessage(AH_MSG *msg, GWEN_BUFFER *buf, int rec, int crypt) { GWEN_DB_NODE *db; AB_USER *u; AH_HBCI *h; GWEN_SYNCIO *sio; unsigned int bsize; const char *logFile; int vmajor, vminor, vpatchlevel, vbuild; char vbuf[32]; int rv; assert(msg); assert(buf); logFile=AH_Dialog_GetLogFile(msg->dialog); if (!logFile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No log file, logging disabled for this dialog"); return; } DBG_INFO(AQHBCI_LOGDOMAIN, "Logging to file [%s]", logFile); db=GWEN_DB_Group_new("header"); u=AH_Dialog_GetDialogOwner(msg->dialog); h=AH_Dialog_GetHbci(msg->dialog); assert(h); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "mode", AH_CryptMode_toString(AH_User_GetCryptMode(u))); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "rdhtype", AH_User_GetRdhType(u)); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "hbciVersion", AH_User_GetHbciVersion(u)); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenType", AH_User_GetTokenType(u)); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "crypt", crypt?"yes":"no"); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "sender", rec?"bank":"user"); GWEN_Version(&vmajor, &vminor, &vpatchlevel, &vbuild); snprintf(vbuf, sizeof(vbuf)-1, "%d.%d.%d.%d", vmajor, vminor, vpatchlevel, vbuild); vbuf[sizeof(vbuf)-1]=0; GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "gwenhywfar", vbuf); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "aqhbci", AQHBCI_VERSION_FULL_STRING); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "appname", AH_HBCI_GetProductName(h)); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "appversion", AH_HBCI_GetProductVersion(h)); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "size", GWEN_Buffer_GetUsedBytes(buf)); if (GWEN_Directory_GetPath(logFile, GWEN_PATH_FLAGS_VARIABLE)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Path \"%s\" is not available, cannot log", logFile); GWEN_DB_Group_free(db); return; } sio=GWEN_SyncIo_File_new(logFile, GWEN_SyncIo_File_CreationMode_OpenAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_APPEND); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } /* write header */ rv=GWEN_DB_WriteToIo(db, sio, GWEN_DB_FLAGS_WRITE_SUBGROUPS | GWEN_DB_FLAGS_DETAILED_GROUPS | GWEN_DB_FLAGS_USE_COLON| GWEN_DB_FLAGS_OMIT_TYPES); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } /* append empty line to separate header from data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } /* write data */ bsize=GWEN_Buffer_GetUsedBytes(buf); if (bsize && msg->usedPin) { char *p; unsigned int bleft; bleft=bsize; p=GWEN_Buffer_GetStart(buf); while(bleft) { char *segEnd; unsigned int slen; if (*p=='\'') { rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) p, 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } p++; bleft--; } else { segEnd=strchr(p, '\''); if (segEnd==NULL) { /* no segment end found, write rest of the buffer */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*)p, bleft); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } break; } assert(segEnd); slen=segEnd-p+1; assert(slen); if (strncasecmp(p, "HNSHA:", 6)==0) rv=AH_Msg__AnonHnsha(p, slen, sio); else if (strncasecmp(p, "HKPAE:", 6)==0 || strncasecmp(p, "DKPAE:", 6)==0) rv=AH_Msg__AnonHkpae(p, slen, sio); /* add more segments with confidential data here */ else { unsigned int l; l=slen; rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*)p, l); } if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } bleft-=slen; p=segEnd+1; } } /* while bleft */ } else { rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*)GWEN_Buffer_GetStart(buf), bsize); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } } /* add LF for better readability */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); return; } /* close layer */ rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return; } GWEN_SyncIo_free(sio); GWEN_DB_Group_free(db); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message logged"); } const char *AH_Msg_GetExpectedSigner(const AH_MSG *msg){ assert(msg); return msg->expectedSigner; } void AH_Msg_SetExpectedSigner(AH_MSG *msg, const char *s){ assert(msg); free(msg->expectedSigner); if (s) msg->expectedSigner=strdup(s); else msg->expectedSigner=0; } const char *AH_Msg_GetExpectedCrypter(const AH_MSG *msg){ assert(msg); return msg->expectedCrypter; } void AH_Msg_SetExpectedCrypter(AH_MSG *msg, const char *s){ assert(msg); free(msg->expectedCrypter); if (s) msg->expectedCrypter=strdup(s); else msg->expectedCrypter=0; } void AH_Msg_SetPin(AH_MSG *msg, const char *s){ assert(msg); if (msg->usedPin) { memset(msg->usedPin, 0, strlen(msg->usedPin)); free(msg->usedPin); } if (s) msg->usedPin=strdup(s); else msg->usedPin=0; } const char *AH_Msg_GetPin(const AH_MSG *msg){ assert(msg); return msg->usedPin; } void AH_Msg_SetItanHashMode(AH_MSG *hmsg, int i) { assert(hmsg); hmsg->itanHashMode=i; } int AH_Msg_GetItanHashMode(const AH_MSG *hmsg) { assert(hmsg); return hmsg->itanHashMode; } void AH_Msg_SetItanHashBuffer(AH_MSG *hmsg, GWEN_BUFFER *hbuf) { assert(hmsg); if (hmsg->itanHashBuffer!=hbuf) { GWEN_Buffer_free(hmsg->itanHashBuffer); hmsg->itanHashBuffer=hbuf; } } GWEN_BUFFER *AH_Msg_GetItanHashBuffer(const AH_MSG *hmsg) { assert(hmsg); return hmsg->itanHashBuffer; } void AH_Msg_SetItanMethod(AH_MSG *hmsg, uint32_t i) { assert(hmsg); hmsg->itanMethod=i; } uint32_t AH_Msg_GetItanMethod(const AH_MSG *hmsg) { assert(hmsg); return hmsg->itanMethod; } const GWEN_STRINGLIST *AH_Msg_GetSignerIdList(const AH_MSG *hmsg) { assert(hmsg); return hmsg->signerIdList; } void AH_Msg_SetCrypterId(AH_MSG *hmsg, const char *s) { assert(hmsg); free(hmsg->crypterId); if (s) hmsg->crypterId=strdup(s); else hmsg->crypterId=NULL; } const char *AH_Msg_GetCrypterId(const AH_MSG *hmsg) { assert(hmsg); return hmsg->crypterId; } #include "msgcrypt_ddv.c" #include "msgcrypt_rdh1.c" #include "msgcrypt_rdh2.c" #include "msgcrypt_rdh3.c" #include "msgcrypt_rdh5.c" #include "msgcrypt_rdh10.c" #include "msgcrypt_rdh.c" #include "msgcrypt_pintan.c" #include "msgcrypt.inc" aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci-updates_l.h0000644000175000017500000000173012364015477024676 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_HBCI_UPDATES_L_H #define AH_HBCI_UPDATES_L_H #include "hbci_l.h" #include /** * This function is called from AH_User_Extend to extend the given user data * DB to the latest version. */ int AH_HBCI_UpdateDbUser(AH_HBCI *hbci, GWEN_DB_NODE *db); /** * This function is called from AH_User_Extend to extend the given account * data DB to the latest version. */ int AH_HBCI_UpdateDbAccount(AH_HBCI *hbci, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/user.c0000644000175000017500000013511312364015477022767 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "i18n_l.h" #include "user_p.h" #include "hbci_l.h" #include "provider_l.h" #include "hbci-updates_l.h" #include "msgengine_l.h" #include "tanmethod_l.h" #include #include "adminjobs_l.h" #include "hhd_l.h" #include #include #include #include #include #include #include GWEN_INHERIT(AB_USER, AH_USER) const char *AH_User_Status_toString(AH_USER_STATUS st){ switch(st) { case AH_UserStatusNew: return "new"; case AH_UserStatusEnabled: return "enabled"; case AH_UserStatusPending: return "pending"; case AH_UserStatusDisabled: return "disabled"; default: return "unknown"; } /* switch */ } AH_USER_STATUS AH_User_Status_fromString(const char *s){ assert(s); if (strcasecmp(s, "new")==0) return AH_UserStatusNew; else if (strcasecmp(s, "enabled")==0) return AH_UserStatusEnabled; else if (strcasecmp(s, "pending")==0) return AH_UserStatusPending; else if (strcasecmp(s, "disabled")==0) return AH_UserStatusDisabled; else return AH_UserStatusUnknown; } void AH_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags) { GWEN_DB_DeleteVar(db, name); if (flags & AH_USER_FLAGS_BANK_DOESNT_SIGN) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "bankDoesntSign"); if (flags & AH_USER_FLAGS_BANK_USES_SIGNSEQ) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "bankUsesSignSeq"); if (flags & AH_USER_FLAGS_KEEPALIVE) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "keepAlive"); if (flags & AH_USER_FLAGS_IGNORE_UPD) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "ignoreUpd"); if (flags & AH_USER_FLAGS_FORCE_SSL3) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "forceSsl3"); if (flags & AH_USER_FLAGS_NO_BASE64) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "noBase64"); if (flags & AH_USER_FLAGS_KEEP_MULTIPLE_BLANKS) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "keepMultipleBlanks"); if (flags & AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "omitSmsAccount"); if (flags & AH_USER_FLAGS_TLS_ONLY_SAFE_CIPHERS) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "tlsOnlySafeCiphers"); } uint32_t AH_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name) { uint32_t fl=0; int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, name, i, 0); if (!s) break; if (strcasecmp(s, "bankDoesntSign")==0) fl|=AH_USER_FLAGS_BANK_DOESNT_SIGN; else if (strcasecmp(s, "bankUsesSignSeq")==0) fl|=AH_USER_FLAGS_BANK_USES_SIGNSEQ; else if (strcasecmp(s, "keepAlive")==0) fl|=AH_USER_FLAGS_KEEPALIVE; else if (strcasecmp(s, "ignoreUpd")==0) fl|=AH_USER_FLAGS_IGNORE_UPD; else if (strcasecmp(s, "forceSsl3")==0 || strcasecmp(s, "forceSslv3")==0) fl|=AH_USER_FLAGS_FORCE_SSL3; else if (strcasecmp(s, "noBase64")==0) fl|=AH_USER_FLAGS_NO_BASE64; else if (strcasecmp(s, "keepMultipleBlanks")==0) fl|=AH_USER_FLAGS_KEEP_MULTIPLE_BLANKS; else if (strcasecmp(s, "omitSmsAccount")==0) fl|=AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT; else if (strcasecmp(s, "tlsOnlySafeCiphers")==0) fl|=AH_USER_FLAGS_TLS_ONLY_SAFE_CIPHERS; else { DBG_WARN(AQHBCI_LOGDOMAIN, "Unknown user flag \"%s\"", s); } } return fl; } int AH_User_Extend(AB_USER *u, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { DBG_INFO(AQHBCI_LOGDOMAIN, "Extending user with mode %d", em); if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { AH_USER *ue; const char *s; int rv; GWEN_NEW_OBJECT(AH_USER, ue); GWEN_INHERIT_SETDATA(AB_USER, AH_USER, u, ue, AH_User_freeData); ue->tanMethodList[0]=-1; ue->tanMethodCount=0; ue->hbci=AH_Provider_GetHbci(pro); ue->tanMethodDescriptions=AH_TanMethod_List_new(); ue->sepaDescriptors=GWEN_StringList_new(); s=AB_User_GetCountry(u); if (!s || !*s) AB_User_SetCountry(u, "de"); ue->msgEngine=AH_MsgEngine_new(); GWEN_MsgEngine_SetEscapeChar(ue->msgEngine, '?'); GWEN_MsgEngine_SetCharsToEscape(ue->msgEngine, ":+\'"); AH_MsgEngine_SetUser(ue->msgEngine, u); GWEN_MsgEngine_SetDefinitions(ue->msgEngine, AH_HBCI_GetDefinitions(ue->hbci), 0); if (em==AB_ProviderExtendMode_Create) { ue->hbciVersion=210; ue->bpd=AH_Bpd_new(); ue->dbUpd=GWEN_DB_Group_new("upd"); ue->maxTransfersPerJob=AH_USER_MAX_TRANSFERS_PER_JOB; ue->maxDebitNotesPerJob=AH_USER_MAX_DEBITNOTES_PER_JOB; } else { /* update db to latest version */ rv=AH_HBCI_UpdateDbUser(ue->hbci, db); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not update user db (%d)", rv); GWEN_Gui_ShowError(I18N("AqBanking Settings Database Error"), I18N("Your settings database might be in an inconsistent state!")); return rv; } AH_User_ReadDb(u, db); AH_User_LoadTanMethods(u); AH_User_LoadSepaDescriptors(u); if (rv==1) { /* updated config, write it now */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Writing back updated HBCI user %d", AB_User_GetUniqueId(u)); rv=AB_Banking_SaveUserConfig(AB_Provider_GetBanking(pro), u, 1); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save user db (%d)", rv); GWEN_Gui_ShowError(I18N("AqBanking Settings Database Error"), I18N("Your settings database might be in an inconsistent state!")); return rv; } } } } else if (em==AB_ProviderExtendMode_Reload) { /* just reload user */ AH_User_ReadDb(u, db); AH_User_LoadTanMethods(u); AH_User_LoadSepaDescriptors(u); } else { AH_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (em==AB_ProviderExtendMode_Add) { } else if (em==AB_ProviderExtendMode_Save) { AH_User_toDb(u, db); } /* if save */ } return 0; } void GWENHYWFAR_CB AH_User_freeData(void *bp, void *p) { AH_USER *ue; ue=(AH_USER*)p; free(ue->peerId); free(ue->systemId); free(ue->httpContentType); free(ue->httpUserAgent); free(ue->tokenType); free(ue->tokenName); free(ue->prompt); GWEN_Url_free(ue->serverUrl); GWEN_DB_Group_free(ue->dbUpd); AH_Bpd_free(ue->bpd); GWEN_MsgEngine_free(ue->msgEngine); AH_TanMethod_List_free(ue->tanMethodDescriptions); GWEN_StringList_free(ue->sepaDescriptors); GWEN_FREE_OBJECT(ue); } void AH_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db) { AH_USER *ue; const char *s; GWEN_DB_NODE *gr; int i; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); s=GWEN_DB_GetCharValue(db, "cryptMode", 0, "unknown"); ue->cryptMode=AH_CryptMode_fromString(s); s=GWEN_DB_GetCharValue(db, "status", 0, "unknown"); ue->status=AH_User_Status_fromString(s); ue->hbciVersion=GWEN_DB_GetIntValue(db, "hbciVersion", 0, 210); /* load server address */ GWEN_Url_free(ue->serverUrl); s=GWEN_DB_GetCharValue(db, "server", 0, 0); if (s) { ue->serverUrl=GWEN_Url_fromString(s); assert(ue->serverUrl); if (GWEN_Url_GetPort(ue->serverUrl)==0) { if (AH_User_GetCryptMode(u)==AH_CryptMode_Pintan) { GWEN_Url_SetPort(ue->serverUrl, 443); GWEN_Url_SetProtocol(ue->serverUrl, "https"); } else { GWEN_Url_SetProtocol(ue->serverUrl, "hbci"); GWEN_Url_SetPort(ue->serverUrl, 3000); } } } else ue->serverUrl=NULL; /* load BPD */ AH_Bpd_free(ue->bpd); gr=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bpd"); if (gr) { ue->bpd=AH_Bpd_FromDb(gr); assert(ue->bpd); } else ue->bpd=AH_Bpd_new(); /* load UPD */ if (ue->dbUpd) GWEN_DB_Group_free(ue->dbUpd); gr=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "upd"); if (gr) { ue->dbUpd=GWEN_DB_Group_dup(gr); } else ue->dbUpd=GWEN_DB_Group_new("upd"); /* get peer id */ free(ue->peerId); s=GWEN_DB_GetCharValue(db, "peerId", 0, 0); if (s) ue->peerId=strdup(s); else ue->peerId=NULL; /* get system id */ free(ue->systemId); s=GWEN_DB_GetCharValue(db, "systemId", 0, 0); if (s) ue->systemId=strdup(s); else ue->systemId=NULL; ue->updVersion=GWEN_DB_GetIntValue(db, "updVersion", 0, 0); /* setup HTTP version */ ue->httpVMajor=GWEN_DB_GetIntValue(db, "httpVMajor", 0, -1); ue->httpVMinor=GWEN_DB_GetIntValue(db, "httpVMinor", 0, -1); if (ue->httpVMajor==-1 || ue->httpVMinor==-1) { ue->httpVMajor=1; ue->httpVMinor=0; } free(ue->httpContentType); s=GWEN_DB_GetCharValue(db, "httpContentType", 0, 0); if (s) ue->httpContentType=strdup(s); else ue->httpContentType=NULL; /* read user flags */ ue->flags=AH_User_Flags_fromDb(db, "userFlags"); /* setup medium stuff */ free(ue->tokenType); s=GWEN_DB_GetCharValue(db, "tokenType", 0, 0); if (s) ue->tokenType=strdup(s); else ue->tokenType=NULL; free(ue->tokenName); s=GWEN_DB_GetCharValue(db, "tokenName", 0, 0); if (s) ue->tokenName=strdup(s); else ue->tokenName=NULL; ue->tokenContextId=GWEN_DB_GetIntValue(db, "tokenContextId", 0, 1); /* get rdh type */ ue->rdhType=GWEN_DB_GetIntValue(db, "rdhType", 0, -1); if (ue->rdhType<1) ue->rdhType=1; /* read supported TAN methods */ for (i=0; itanMethodList[i]=-1; ue->tanMethodCount=0; for (i=0; itanMethodList[ue->tanMethodCount++]=method; ue->tanMethodList[ue->tanMethodCount]=-1; } ue->selectedTanMethod=GWEN_DB_GetIntValue(db, "selectedTanMethod", 0, 0); /* read some settings */ ue->maxTransfersPerJob=GWEN_DB_GetIntValue(db, "maxTransfersPerJob", 0, AH_USER_MAX_TRANSFERS_PER_JOB); ue->maxDebitNotesPerJob=GWEN_DB_GetIntValue(db, "maxDebitNotesPerJob", 0, AH_USER_MAX_DEBITNOTES_PER_JOB); free(ue->sepaTransferProfile); s=GWEN_DB_GetCharValue(db, "sepaTransferProfile", 0, NULL); if (s) ue->sepaTransferProfile=strdup(s); else ue->sepaTransferProfile=NULL; free(ue->sepaDebitNoteProfile); s=GWEN_DB_GetCharValue(db, "sepaDebitNoteProfile", 0, NULL); if (s) ue->sepaDebitNoteProfile=strdup(s); else ue->sepaDebitNoteProfile=NULL; free(ue->tanMediumId); s=GWEN_DB_GetCharValue(db, "tanMediumId", 0, NULL); if (s) ue->tanMediumId=strdup(s); else ue->tanMediumId=NULL; } void AH_User_toDb(AB_USER *u, GWEN_DB_NODE *db) { AH_USER *ue; int i; GWEN_DB_NODE *gr; const char *s; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); /* save crypt mode */ s=AH_CryptMode_toString(ue->cryptMode); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "cryptMode", s); /* save status */ s=AH_User_Status_toString(ue->status); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "status", s); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "hbciVersion", ue->hbciVersion); if (ue->httpContentType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpContentType", ue->httpContentType); else GWEN_DB_DeleteVar(db, "httpContentType"); /* save URL */ if (ue->serverUrl) { GWEN_BUFFER *nbuf; nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Url_toString(ue->serverUrl, nbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not store url"); GWEN_Buffer_free(nbuf); assert(0); } GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "server", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); } /* if serverUrl */ /* save BPD */ assert(ue->bpd); gr=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "bpd"); assert(gr); AH_Bpd_ToDb(ue->bpd, gr); /* save UPD */ if (ue->dbUpd) { gr=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "upd"); assert(gr); GWEN_DB_AddGroupChildren(gr, ue->dbUpd); } if (ue->peerId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "peerId", ue->peerId); if (ue->systemId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "systemId", ue->systemId); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "updVersion", ue->updVersion); /* save http settings */ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMajor", ue->httpVMajor); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMinor", ue->httpVMinor); if (ue->httpUserAgent) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpUserAgent", ue->httpUserAgent); /* save flags */ AH_User_Flags_toDb(db, "userFlags", ue->flags); /* save crypt token settings */ if (ue->tokenType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenType", ue->tokenType); if (ue->tokenName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenName", ue->tokenName); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenContextId", ue->tokenContextId); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "rdhType", ue->rdhType); /* store list of supported/allowed tan methods */ GWEN_DB_DeleteVar(db, "tanMethodList"); for (i=0; itanMethodCount; i++) { if (ue->tanMethodList[i]==-1) break; GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "tanMethodList", ue->tanMethodList[i]); } GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "selectedTanMethod", ue->selectedTanMethod); /* store some settings */ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxTransfersPerJob", ue->maxTransfersPerJob); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxDebitNotesPerJob", ue->maxDebitNotesPerJob); if (ue->sepaTransferProfile) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "sepaTransferProfile", ue->sepaTransferProfile); if (ue->sepaDebitNoteProfile) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "sepaDebitNoteProfile", ue->sepaDebitNoteProfile); if (ue->tanMediumId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tanMediumId", ue->tanMediumId); } const char *AH_User_GetPeerId(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->peerId; } void AH_User_SetPeerId(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->peerId); if (s) ue->peerId=strdup(s); else ue->peerId=NULL; } uint32_t AH_User_GetTokenContextId(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tokenContextId; } void AH_User_SetTokenContextId(AB_USER *u, uint32_t id){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->tokenContextId=id; } AH_CRYPT_MODE AH_User_GetCryptMode(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->cryptMode; } void AH_User_SetCryptMode(AB_USER *u, AH_CRYPT_MODE m) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->cryptMode=m; } AH_USER_STATUS AH_User_GetStatus(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->status; } void AH_User_SetStatus(AB_USER *u, AH_USER_STATUS i){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->status=i; } AH_HBCI *AH_User_GetHbci(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->hbci; } const GWEN_URL *AH_User_GetServerUrl(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->serverUrl; } void AH_User_SetServerUrl(AB_USER *u, const GWEN_URL *url) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); GWEN_Url_free(ue->serverUrl); if (url) ue->serverUrl=GWEN_Url_dup(url); else ue->serverUrl=0; } int AH_User_GetUpdVersion(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->updVersion; } void AH_User_SetUpdVersion(AB_USER *u, int i){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->updVersion=i; } GWEN_DB_NODE *AH_User_GetUpd(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->dbUpd; } void AH_User_SetUpd(AB_USER *u, GWEN_DB_NODE *n){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (ue->dbUpd) GWEN_DB_Group_free(ue->dbUpd); if (n) { ue->dbUpd=GWEN_DB_Group_dup(n); } else ue->dbUpd=GWEN_DB_Group_new("upd"); } AH_BPD *AH_User_GetBpd(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->bpd; } void AH_User_SetBpd(AB_USER *u, AH_BPD *bpd){ AH_USER *ue; assert(bpd); assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (ue->bpd!=bpd) { AH_Bpd_free(ue->bpd); ue->bpd=AH_Bpd_dup(bpd); } } int AH_User_GetBpdVersion(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); assert(ue->bpd); return AH_Bpd_GetBpdVersion(ue->bpd); } void AH_User_SetBpdVersion(AB_USER *u, int i){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); assert(ue->bpd); AH_Bpd_SetBpdVersion(ue->bpd, i); } const char *AH_User_GetSystemId(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->systemId; } void AH_User_SetSystemId(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->systemId); if (s) ue->systemId=strdup(s); else ue->systemId=NULL; } GWEN_MSGENGINE *AH_User_GetMsgEngine(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->msgEngine; } uint32_t AH_User_GetFlags(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->flags; } void AH_User_SetFlags(AB_USER *u, uint32_t flags) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->flags=flags; } void AH_User_AddFlags(AB_USER *u, uint32_t flags) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->flags|=flags; } void AH_User_SubFlags(AB_USER *u, uint32_t flags) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->flags&=~flags; } int AH_User_GetHbciVersion(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->hbciVersion; } void AH_User_SetHbciVersion(AB_USER *u, int i) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->hbciVersion=i; } const char *AH_User_GetHttpUserAgent(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->httpUserAgent; } void AH_User_SetHttpUserAgent(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->httpUserAgent); if (s) ue->httpUserAgent=strdup(s); else ue->httpUserAgent=NULL; } int AH_User_GetHttpVMajor(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->httpVMajor; } void AH_User_SetHttpVMajor(AB_USER *u, int i) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->httpVMajor=i; } int AH_User_GetHttpVMinor(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->httpVMinor; } void AH_User_SetHttpVMinor(AB_USER *u, int i) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->httpVMinor=i; } uint32_t AH_User_GetTanMethods(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tanMethods; } void AH_User_SetTanMethods(AB_USER *u, uint32_t m) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->tanMethods=m; } void AH_User_AddTanMethods(AB_USER *u, uint32_t m) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->tanMethods|=m; } void AH_User_SubTanMethods(AB_USER *u, uint32_t m) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->tanMethods&=~m; } int AH_User_GetRdhType(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->rdhType; } void AH_User_SetRdhType(AB_USER *u, int i) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->rdhType=i; } const char *AH_User_GetTokenType(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tokenType; } void AH_User_SetTokenType(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->tokenType); if (s) ue->tokenType=strdup(s); else ue->tokenType=NULL; } const char *AH_User_GetTokenName(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tokenName; } void AH_User_SetTokenName(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->tokenName); if (s) ue->tokenName=strdup(s); else ue->tokenName=NULL; } int AH_User_MkPasswdName(const AB_USER *u, GWEN_BUFFER *buf) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (ue->tokenType==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing tokenType or tokenName"); return GWEN_ERROR_NO_DATA; } if (strcasecmp(ue->tokenType, "pintan")==0) { const char *s; GWEN_Buffer_AppendString(buf, "PIN_"); s=AB_User_GetBankCode(u); if (s) GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, AB_User_GetUserId(u)); return 0; } else { if (ue->tokenName) { GWEN_Buffer_AppendString(buf, "PASSWORD_"); GWEN_Buffer_AppendString(buf, ue->tokenType); GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, ue->tokenName); return 0; } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing tokenName"); return GWEN_ERROR_NO_DATA; } } } int AH_User_MkPinName(const AB_USER *u, GWEN_BUFFER *buf) { return AH_User_MkPasswdName(u, buf); } int AH_User_MkTanName(const AB_USER *u, const char *challenge, GWEN_BUFFER *buf) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (ue->tokenType && ue->tokenName) { GWEN_Buffer_AppendString(buf, "TAN_"); GWEN_Buffer_AppendString(buf, ue->tokenType); GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, ue->tokenName); if (challenge) { GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, challenge); } return 0; } else { const char *s; DBG_DEBUG(AQHBCI_LOGDOMAIN, "No tokenType or tokenName"); GWEN_Buffer_AppendString(buf, "TAN_"); s=AB_User_GetBankCode(u); if (s) GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, AB_User_GetUserId(u)); if (challenge) { GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, challenge); } return 0; } } int AH_User_InputPin(AB_USER *u, char *pwbuffer, int minLen, int maxLen, int flags){ GWEN_BUFFER *nbuf; int rv; const char *numeric_warning = ""; char buffer[512]; const char *un; const char *bn=NULL; AB_BANKINFO *bi; assert(u); un=AB_User_GetUserId(u); /* find bank name */ bi=AB_Banking_GetBankInfo(AB_User_GetBanking(u), "de", "*", AB_User_GetBankCode(u)); if (bi) bn=AB_BankInfo_GetBankName(bi); if (!bn) AB_User_GetBankCode(u); buffer[0]=0; buffer[sizeof(buffer)-1]=0; if (flags & GWEN_GUI_INPUT_FLAGS_NUMERIC) { numeric_warning = I18N(" You must only enter numbers, not letters."); } if (flags & GWEN_GUI_INPUT_FLAGS_CONFIRM) { snprintf(buffer, sizeof(buffer)-1, I18N("Please enter a new PIN for \n" "user %s at %s\n" "The input must be at least %d characters long.%s" "" "

" "Please enter a new PIN for user %s at " "%s." "

" "

" "The input must be at least %d characters long.%s" "

" ""), un, bn, minLen, numeric_warning, un, bn, minLen, numeric_warning); } else { snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the PIN for \n" "user %s at %s\n" "%s" "" "Please enter the PIN for user %s at " "%s.
" "%s" ""), un, bn, numeric_warning, un, bn, numeric_warning); } buffer[sizeof(buffer)-1]=0; AB_BankInfo_free(bi); nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkPinName(u, nbuf); rv=GWEN_Gui_GetPassword(flags, GWEN_Buffer_GetStart(nbuf), I18N("Enter PIN"), buffer, pwbuffer, minLen, maxLen, 0); GWEN_Buffer_free(nbuf); return rv; } int AH_User_InputPasswd(AB_USER *u, char *pwbuffer, int minLen, int maxLen, int flags){ GWEN_BUFFER *nbuf; int rv; const char *numeric_warning = ""; char buffer[512]; const char *un; const char *bn=NULL; AB_BANKINFO *bi; assert(u); un=AB_User_GetUserId(u); /* find bank name */ bi=AB_Banking_GetBankInfo(AB_User_GetBanking(u), "de", "*", AB_User_GetBankCode(u)); if (bi) bn=AB_BankInfo_GetBankName(bi); if (!bn) AB_User_GetBankCode(u); buffer[0]=0; buffer[sizeof(buffer)-1]=0; if (flags & GWEN_GUI_INPUT_FLAGS_NUMERIC) { numeric_warning = I18N(" You must only enter numbers, not letters."); } if (flags & GWEN_GUI_INPUT_FLAGS_CONFIRM) { snprintf(buffer, sizeof(buffer)-1, I18N("Please enter a new password for \n" "user %s at %s\n" "The input must be at least %d characters long.%s" "" "

" "Please enter a new password for user %s at " "%s." "

" "

" "The input must be at least %d characters long.%s" "

" ""), un, bn, minLen, numeric_warning, un, bn, minLen, numeric_warning); } else { snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the password for \n" "user %s at %s\n" "%s" "" "Please enter the password for user %s at" "%s.
" "%s" ""), un, bn, numeric_warning, un, bn, numeric_warning); } buffer[sizeof(buffer)-1]=0; AB_BankInfo_free(bi); nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkPasswdName(u, nbuf); rv=GWEN_Gui_GetPassword(flags, GWEN_Buffer_GetStart(nbuf), I18N("Enter Password"), buffer, pwbuffer, minLen, maxLen, 0); GWEN_Buffer_free(nbuf); return rv; } int AH_User_InputTan(AB_USER *u, char *pwbuffer, int minLen, int maxLen){ int rv; char buffer[512]; const char *un; const char *bn=NULL; GWEN_BUFFER *nbuf; AB_BANKINFO *bi; assert(u); un=AB_User_GetUserId(u); /* find bank name */ bi=AB_Banking_GetBankInfo(AB_User_GetBanking(u), "de", "*", AB_User_GetBankCode(u)); if (bi) bn=AB_BankInfo_GetBankName(bi); if (!bn) AB_User_GetBankCode(u); buffer[0]=0; buffer[sizeof(buffer)-1]=0; snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the next TAN\n" "for user %s at %s." "" "Please enter the next TAN for user %s at " "%s." ""), un, bn, un, bn); buffer[sizeof(buffer)-1]=0; nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkTanName(u, NULL, nbuf); rv=GWEN_Gui_GetPassword(GWEN_GUI_INPUT_FLAGS_TAN | /*GWEN_GUI_INPUT_FLAGS_NUMERIC |*/ GWEN_GUI_INPUT_FLAGS_SHOW, GWEN_Buffer_GetStart(nbuf), I18N("Enter TAN"), buffer, pwbuffer, minLen, maxLen, 0); GWEN_Buffer_free(nbuf); AB_BankInfo_free(bi); return rv; } int AH_User_InputTanWithChallenge(AB_USER *u, const char *challenge, char *pwbuffer, int minLen, int maxLen){ int rv; char buffer[1024]; const char *un; const char *bn=NULL; GWEN_BUFFER *nbuf; GWEN_BUFFER *xbuf; AB_BANKINFO *bi; assert(u); un=AB_User_GetUserId(u); /* find bank name */ bi=AB_Banking_GetBankInfo(AB_User_GetBanking(u), "de", "*", AB_User_GetBankCode(u)); if (bi) bn=AB_BankInfo_GetBankName(bi); if (!bn) AB_User_GetBankCode(u); buffer[0]=0; buffer[sizeof(buffer)-1]=0; xbuf=GWEN_Buffer_new(0, 256, 0, 1); /* text version */ snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the TAN\n" "for user %s at %s.\n"), un, bn); buffer[sizeof(buffer)-1]=0; GWEN_Buffer_AppendString(xbuf, buffer); if (challenge && *challenge) { GWEN_Buffer_AppendString(xbuf, I18N("The server provided the following challenge:")); GWEN_Buffer_AppendString(xbuf, "\n"); GWEN_Buffer_AppendString(xbuf, challenge); } /* html version */ GWEN_Buffer_AppendString(xbuf, "" "

"); snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the TAN for user %s at %s."), un, bn); buffer[sizeof(buffer)-1]=0; GWEN_Buffer_AppendString(xbuf, buffer); GWEN_Buffer_AppendString(xbuf, "

"); if (challenge && *challenge) { GWEN_Buffer_AppendString(xbuf, "

"); GWEN_Buffer_AppendString(xbuf, I18N("The server provided the following challenge:")); GWEN_Buffer_AppendString(xbuf, "

" "

" ""); GWEN_Buffer_AppendString(xbuf, challenge); GWEN_Buffer_AppendString(xbuf, "" "

" ""); } nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkTanName(u, challenge, nbuf); rv=GWEN_Gui_GetPassword(GWEN_GUI_INPUT_FLAGS_TAN | /*GWEN_GUI_INPUT_FLAGS_NUMERIC |*/ GWEN_GUI_INPUT_FLAGS_SHOW, GWEN_Buffer_GetStart(nbuf), I18N("Enter TAN"), GWEN_Buffer_GetStart(xbuf), pwbuffer, minLen, maxLen, 0); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(nbuf); AB_BankInfo_free(bi); return rv; } int AH_User_SetTanStatus(AB_USER *u, const char *challenge, const char *tan, GWEN_GUI_PASSWORD_STATUS status){ GWEN_BUFFER *nbuf; int rv; nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkTanName(u, challenge, nbuf); rv=GWEN_Gui_SetPasswordStatus(GWEN_Buffer_GetStart(nbuf), tan, status, 0); GWEN_Buffer_free(nbuf); return rv; } int AH_User_SetPinStatus(AB_USER *u, const char *pin, GWEN_GUI_PASSWORD_STATUS status){ GWEN_BUFFER *nbuf; int rv; nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkPinName(u, nbuf); rv=GWEN_Gui_SetPasswordStatus(GWEN_Buffer_GetStart(nbuf), pin, status, 0); GWEN_Buffer_free(nbuf); return rv; } const char *AH_User_GetHttpContentType(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->httpContentType; } void AH_User_SetHttpContentType(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->httpContentType); if (s) ue->httpContentType=strdup(s); else ue->httpContentType=NULL; } const int *AH_User_GetTanMethodList(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tanMethodList; } int AH_User_HasTanMethod(const AB_USER *u, int method) { AH_USER *ue; int i; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); for (i=0; itanMethodList[i]==method) return 1; } DBG_INFO(AQHBCI_LOGDOMAIN, "TAN method %d not available", method); return 0; } int AH_User_HasTanMethodOtherThan(const AB_USER *u, int method) { AH_USER *ue; int i; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); for (i=0; itanMethodList[i]!=method && ue->tanMethodList[i]!=-1) return 1; } return 0; } void AH_User_AddTanMethod(AB_USER *u, int method) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (!AH_User_HasTanMethod(u, method)) { if (ue->tanMethodCounttanMethodList[ue->tanMethodCount++]=method; ue->tanMethodList[ue->tanMethodCount]=-1; } } } void AH_User_ClearTanMethodList(AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->tanMethodList[0]=-1; ue->tanMethodCount=0; } int AH_User_GetTanMethodCount(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tanMethodCount; } int AH_User_GetSelectedTanMethod(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->selectedTanMethod; } void AH_User_SetSelectedTanMethod(AB_USER *u, int i) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->selectedTanMethod=i; } const char *AH_User_GetTanMediumId(const AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->tanMediumId; } void AH_User_SetTanMediumId(AB_USER *u, const char *s) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->tanMediumId); if (s) ue->tanMediumId=strdup(s); else ue->tanMediumId=NULL; } void AH_User_LoadTanMethods(AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); /* read directly from BPD */ if (ue->cryptMode==AH_CryptMode_Pintan) { GWEN_DB_NODE *db; int rv; AH_TanMethod_List_Clear(ue->tanMethodDescriptions); db=GWEN_DB_Group_new("bpd"); rv=AH_Job_SampleBpdVersions("JobTan", u, db); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No BPD for TAN job"); } else { GWEN_DB_NODE *dbV; dbV=GWEN_DB_GetFirstGroup(db); while(dbV) { int version; version=atoi(GWEN_DB_GroupName(dbV)); if (version>0) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbV, "tanMethod"); if (!dbT) { DBG_INFO(AQHBCI_LOGDOMAIN, "No tan method found"); } while(dbT) { AH_TAN_METHOD *tm; const char *s; tm=AH_TanMethod_new(); AH_TanMethod_SetFunction(tm, GWEN_DB_GetIntValue(dbT, "function", 0, 0)); AH_TanMethod_SetProcess(tm, GWEN_DB_GetIntValue(dbT, "process", 0, 0)); AH_TanMethod_SetMethodId(tm, GWEN_DB_GetCharValue(dbT, "methodId", 0, 0)); AH_TanMethod_SetMethodName(tm, GWEN_DB_GetCharValue(dbT, "methodName", 0, 0)); AH_TanMethod_SetTanMaxLen(tm, GWEN_DB_GetIntValue(dbT, "tanMaxLen", 0, 0)); AH_TanMethod_SetFormatId(tm, GWEN_DB_GetCharValue(dbT, "formatId", 0, 0)); AH_TanMethod_SetPrompt(tm, GWEN_DB_GetCharValue(dbT, "prompt", 0, 0)); AH_TanMethod_SetReturnMaxLen(tm, GWEN_DB_GetIntValue(dbT, "returnMaxLen", 0, 0)); AH_TanMethod_SetMaxActiveLists(tm, GWEN_DB_GetIntValue(dbT, "maxActiveLists", 0, 0)); AH_TanMethod_SetGvVersion(tm, GWEN_DB_GetIntValue(dbT, "gvVersion", 0, 0)); s=GWEN_DB_GetCharValue(dbT, "multiTanAllowed", 0, NULL); if (s && strcasecmp(s, "j")==0) AH_TanMethod_SetMultiTanAllowed(tm, 1); AH_TanMethod_SetTimeShiftAllowed(tm, GWEN_DB_GetIntValue(dbT, "timeShiftAllowed", 0, 0)); AH_TanMethod_SetTanListMode(tm, GWEN_DB_GetIntValue(dbT, "tanListMode", 0, 0)); s=GWEN_DB_GetCharValue(dbT, "stornoAllowed", 0, NULL); if (s && strcasecmp(s, "j")==0) AH_TanMethod_SetStornoAllowed(tm, 1); s=GWEN_DB_GetCharValue(dbT, "needChallengeClass", 0, NULL); if (s && strcasecmp(s, "j")==0) AH_TanMethod_SetNeedChallengeClass(tm, 1); s=GWEN_DB_GetCharValue(dbT, "needChallengeAmount", 0, NULL); if (s && strcasecmp(s, "j")==0) AH_TanMethod_SetNeedChallengeAmount(tm, 1); AH_TanMethod_SetInitMode(tm, GWEN_DB_GetIntValue(dbT, "initMode", 0, 0)); s=GWEN_DB_GetCharValue(dbT, "tanMediumIdNeeded", 0, NULL); if (s && strcasecmp(s, "j")==0) AH_TanMethod_SetNeedTanMediumId(tm, 1); AH_TanMethod_SetMaxActiveTanMedia(tm, GWEN_DB_GetIntValue(dbT, "maxActiveMedia", 0, 0)); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding TAN method %d [%s] for GV version %d", AH_TanMethod_GetFunction(tm), AH_TanMethod_GetMethodId(tm), version); AH_TanMethod_SetGvVersion(tm, version); AH_TanMethod_List_Add(tm, ue->tanMethodDescriptions); dbT=GWEN_DB_FindNextGroup(dbT, "tanMethod"); } } dbV=GWEN_DB_GetNextGroup(dbV); } } GWEN_DB_Group_free(db); } } void AH_User_LoadSepaDescriptors(AB_USER *u) { AH_USER *ue; GWEN_DB_NODE *db; int rv; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); /* read directly from BPD */ GWEN_StringList_Clear(ue->sepaDescriptors); db=GWEN_DB_Group_new("bpd"); rv=AH_Job_SampleBpdVersions("JobGetAccountSepaInfo", u, db); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No BPD for TAN job"); } else { GWEN_DB_NODE *dbV; dbV=GWEN_DB_GetFirstGroup(db); while(dbV) { int version; version=atoi(GWEN_DB_GroupName(dbV)); if (version>0) { GWEN_DB_NODE *dbT; /* always overwrite with latest version received */ GWEN_StringList_Clear(ue->sepaDescriptors); dbT=GWEN_DB_FindFirstGroup(dbV, "SupportedSepaFormats"); if (!dbT) { DBG_INFO(AQHBCI_LOGDOMAIN, "No SEPA descriptor found"); } while(dbT) { int i; for (i=0; i<100; i++) { const char *s; s=GWEN_DB_GetCharValue(dbT, "format", i, NULL); if (! (s && *s)) break; GWEN_StringList_AppendString(ue->sepaDescriptors, s, 0, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding SEPA descriptor [%s] for GV version %d", s, version); } dbT=GWEN_DB_FindNextGroup(dbT, "SupportedSepaFormats"); } } dbV=GWEN_DB_GetNextGroup(dbV); } } GWEN_DB_Group_free(db); } const AH_TAN_METHOD_LIST *AH_User_GetTanMethodDescriptions(AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); /* always reload TAN methods from BPD */ AH_User_LoadTanMethods(u); return ue->tanMethodDescriptions; } int AH_User_GetMaxTransfersPerJob(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->maxTransfersPerJob; } void AH_User_SetMaxTransfersPerJob(AB_USER *u, int i){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->maxTransfersPerJob=i; } int AH_User_GetMaxDebitNotesPerJob(const AB_USER *u){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->maxDebitNotesPerJob; } void AH_User_SetMaxDebitNotesPerJob(AB_USER *u, int i){ AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); ue->maxDebitNotesPerJob=i; } int AH_User_AddTextWithoutTags(const char *s, GWEN_BUFFER *obuf) { while(*s) { if (*s=='<') { const char *s2; int l; s2=s; s2++; while(*s2 && *s2!='>') s2++; l=s2-s-2; if (l>0) { const char *s3; s3=s; s3++; if (l==2) { if (strncasecmp(s3, "br", 2)==0) GWEN_Buffer_AppendString(obuf, "\n"); } else if (l==3) { if (strncasecmp(s3, "br/", 3)==0) GWEN_Buffer_AppendString(obuf, "\n"); } } s=s2; /* set s to position of closing bracket */ } else GWEN_Buffer_AppendByte(obuf, *s); /* next char */ s++; } return 0; } int AH_User_InputTanWithChallenge2(AB_USER *u, const char *challenge, const char *challengeHhd, char *pwbuffer, int minLen, int maxLen){ int rv; char buffer[1024]; const char *un; const char *bn=NULL; GWEN_BUFFER *nbuf; GWEN_BUFFER *xbuf; AB_BANKINFO *bi; uint32_t iflags=0; assert(u); un=AB_User_GetUserId(u); /* find bank name */ bi=AB_Banking_GetBankInfo(AB_User_GetBanking(u), "de", "*", AB_User_GetBankCode(u)); if (bi) bn=AB_BankInfo_GetBankName(bi); if (!bn) AB_User_GetBankCode(u); iflags=GWEN_GUI_INPUT_FLAGS_TAN | GWEN_GUI_INPUT_FLAGS_SHOW; buffer[0]=0; buffer[sizeof(buffer)-1]=0; xbuf=GWEN_Buffer_new(0, 256, 0, 1); if (challengeHhd && *challengeHhd) { DBG_ERROR(AQHBCI_LOGDOMAIN, "ChallengeHHD is [%s]", challengeHhd); GWEN_Buffer_AppendString(xbuf, "$OBEGIN$"); rv=AH_HHD14_Translate(challengeHhd, xbuf); if (rv<0) { GWEN_Buffer_free(xbuf); AB_BankInfo_free(bi); return rv; } GWEN_Buffer_AppendString(xbuf, "$OEND$"); iflags|=GWEN_GUI_INPUT_FLAGS_OPTICAL; /* text version */ snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the TAN\n" "for user %s at %s.\n"), un, bn); buffer[sizeof(buffer)-1]=0; GWEN_Buffer_AppendString(xbuf, buffer); if (challenge && *challenge) { GWEN_Buffer_AppendString(xbuf, challenge); GWEN_Buffer_AppendString(xbuf, "\n"); } else { GWEN_Buffer_AppendString(xbuf, I18N("Please enter the TAN from the device.")); } } else if (challenge && *challenge) { const char *s; /* look for "CHLGUC" */ s=GWEN_Text_StrCaseStr(challenge, "CHLGUC"); if (s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Challenge contains CHLGUC"); GWEN_Buffer_AppendString(xbuf, "$OBEGIN$"); rv=AH_HHD14_Translate(s, xbuf); if (rv<0) { GWEN_Buffer_free(xbuf); AB_BankInfo_free(bi); return rv; } GWEN_Buffer_AppendString(xbuf, "$OEND$"); iflags|=GWEN_GUI_INPUT_FLAGS_OPTICAL; /* text version */ snprintf(buffer, sizeof(buffer)-1, I18N("Please enter the TAN\n" "for user %s at %s.\n"), un, bn); buffer[sizeof(buffer)-1]=0; GWEN_Buffer_AppendString(xbuf, buffer); /* extract text */ s=GWEN_Text_StrCaseStr(challenge, "CHLGTEXT"); if (s) { /* skip "CHLGTEXT" and 4 digits */ s+=12; /* add rest of the message (replace HTML tags, if any) */ AH_User_AddTextWithoutTags(s, xbuf); } else { /* create own text */ GWEN_Buffer_AppendString(xbuf, I18N("Please enter the TAN from the device.")); } } else { /* no optical challenge */ DBG_ERROR(AQHBCI_LOGDOMAIN, "Challenge contains no optical data"); GWEN_Buffer_AppendString(xbuf, I18N("The server provided the following challenge:")); GWEN_Buffer_AppendString(xbuf, "\n"); GWEN_Buffer_AppendString(xbuf, challenge); } } nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); AH_User_MkTanName(u, challenge, nbuf); rv=GWEN_Gui_GetPassword(iflags, GWEN_Buffer_GetStart(nbuf), I18N("Enter TAN"), GWEN_Buffer_GetStart(xbuf), pwbuffer, minLen, maxLen, 0); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(nbuf); AB_BankInfo_free(bi); return rv; } const char *AH_User_FindSepaDescriptor(AB_USER *u, const char *tmpl) { AH_USER *ue; GWEN_STRINGLISTENTRY *se; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); if (GWEN_StringList_Count(ue->sepaDescriptors)<1) AH_User_LoadSepaDescriptors(u); se=GWEN_StringList_FirstEntry(ue->sepaDescriptors); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s && *s && -1!=GWEN_Text_ComparePattern(s, tmpl, 1)) return s; se=GWEN_StringListEntry_Next(se); } return NULL; } const GWEN_STRINGLIST *AH_User_GetSepaDescriptors(AB_USER *u) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->sepaDescriptors; } const char *AH_User_GetSepaTransferProfile(const AB_USER *u) { const AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->sepaTransferProfile; } void AH_User_SetSepaTransferProfile(AB_USER *u, const char *profileName) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->sepaTransferProfile); if (profileName) ue->sepaTransferProfile=strdup(profileName); else ue->sepaTransferProfile=NULL; } const char *AH_User_GetSepaDebitNoteProfile(const AB_USER *u) { const AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); return ue->sepaDebitNoteProfile; } void AH_User_SetSepaDebitNoteProfile(AB_USER *u, const char *profileName) { AH_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AH_USER, u); assert(ue); free(ue->sepaDebitNoteProfile); if (profileName) ue->sepaDebitNoteProfile=strdup(profileName); else ue->sepaDebitNoteProfile=NULL; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_pintan.c0000644000175000017500000004431112637754347025242 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgPinTan_PrepareCryptoSeg(AH_MSG *hmsg, AB_USER *u, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=userId; tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "PIN"); /* if (crypt) GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", 1); else */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", (hmsg->itanMethod==999)?1:2); return 0; } int AH_Msg_SignPinTan(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *hbuf; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; AB_USER *su; uint32_t uFlags; char pin[64]; uint32_t tm; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "pintan"); su=AB_Banking_FindUser(AH_HBCI_GetBankingApi(h), AH_PROVIDER_NAME, "de", "*", signer, "*"); if (!su) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown user \"%s\"", signer); return GWEN_ERROR_NOT_FOUND; } uFlags=AH_User_GetFlags(su); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* for iTAN mode: set selected mode (Sicherheitsfunktion, kodiert) */ tm=AH_Msg_GetItanMethod(hmsg); if (tm==0) { tm=AH_Dialog_GetItanMethod(hmsg->dialog); if (tm) /* this is needed by AH_MsgPinTan_PrepareCryptoSeg */ AH_Msg_SetItanMethod(hmsg, tm); } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgPinTan_PrepareCryptoSeg(hmsg, su, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ p=NULL; if (!hmsg->noSysId) p=AH_User_GetSystemId(su); if (!p) p="0"; GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); if (tm) { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "function", tm); } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", 1); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", "NOSIGNATURE", 11); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* handle pin */ memset(pin, 0, sizeof(pin)); rv=AH_User_InputPin(su, pin, 4, sizeof(pin), 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error getting pin from medium (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(hbuf); memset(pin, 0, sizeof(pin)); return rv; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "pin", pin); AH_Msg_SetPin(hmsg, pin); memset(pin, 0, sizeof(pin)); /* handle tan */ if (hmsg->needTan) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "This queue needs a TAN"); if (hmsg->usedTan) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Using existing TAN"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "tan", hmsg->usedTan); } else { char tan[16]; memset(tan, 0, sizeof(tan)); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Asking for TAN"); rv=AH_User_InputTan(su, tan, 4, sizeof(tan)); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error getting TAN from medium"); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(hbuf); return rv; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "tan", tan); AH_Msg_SetTan(hmsg, tan); } } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "This queue doesn't need a TAN"); } /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return GWEN_ERROR_INTERNAL; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return GWEN_ERROR_MEMORY_FULL; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptPinTan(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *hbuf; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "pintan"); u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgPinTan_PrepareCryptoSeg(hmsg, u, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* store system id */ p=NULL; if (!hmsg->noSysId) p=AH_User_GetSystemId(u); if (!p) p="0"; GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", "NOKEY", 5); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer)); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptPinTan(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "pintan"); u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); /* get encrypted data */ p=GWEN_DB_GetBinValue(ndata, "CryptData", 0, 0,0, &l); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } /* decipher message with session key */ mbuf=GWEN_Buffer_new(0, l, 0, 1); GWEN_Buffer_AppendBytes(mbuf, (const char*)p, l); /* store crypter id */ AH_Msg_SetCrypterId(hmsg, crypterId); /* store new buffer inside message */ GWEN_Buffer_free(hmsg->origbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyPinTan(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; // char *dataStart; // unsigned int dataLength; unsigned int i; AB_USER *u; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } // dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ // dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* verify signature */ DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c0000644000175000017500000007672212364015477024611 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgRdh_PrepareCryptoSeg1(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No PeerId in user, using user id"); peerId=userId; } tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "RDH"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", AH_User_GetRdhType(u)); return 0; } int AH_Msg_SignRdh1(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgRdh_PrepareCryptoSeg1(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(su); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } #if 0 DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on RDH medium, should not happen (%d)", rv); GWEN_DB_Group_free(cfg); return GWEN_ERROR_INTERNAL; #endif } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; /* hash sighead + data */ md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_1A4); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, 96); signLen=96; rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptRdh1(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[128]; int encKeyLen; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, 96); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } encKeyLen=elen; } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgRdh_PrepareCryptoSeg1(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(u); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No System id on RDH medium, using default"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); #if 0 DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on RDH medium, should not happen (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return GWEN_ERROR_INTERNAL; #endif } } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, encKeyLen); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptRdh1(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[128]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; uint8_t encKey[96]; /* fill encoded key with 0 */ memset(encKey, 0, sizeof(encKey)); memmove(encKey+(96-l), p, l); algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_None); elen=sizeof(decKey); rv=GWEN_Crypt_Token_Decipher(ct, keyId, algo, encKey, 96, decKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* unpadd key (take right-handed 16 bytes) */ p=decKey+(elen-16); sk=GWEN_Crypt_KeyDes3K_fromData(GWEN_Crypt_CryptMode_Cbc, 24, p, 16); if (sk==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create DES key from data"); return GWEN_ERROR_BAD_DATA; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing message key"); return GWEN_ERROR_BAD_DATA; } /* get encrypted data */ p=GWEN_DB_GetBinValue(ndata, "CryptData", 0, 0,0, &l); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_BAD_DATA; } /* decipher message with session key */ mbuf=GWEN_Buffer_new(0, l, 0, 1); rv=GWEN_Crypt_Key_Decipher(sk, (const uint8_t*)p, l, (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); GWEN_Crypt_Key_free(sk); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not decipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* unpadd message */ rv=GWEN_Padd_UnpaddWithAnsiX9_23(mbuf); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error unpadding message with ANSI X9.23 (%d)", rv); GWEN_Buffer_free(mbuf); return rv; } /* store crypter id */ AH_Msg_SetCrypterId(hmsg, crypterId); /* store new buffer inside message */ GWEN_Buffer_free(hmsg->origbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyRdh1(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* only now we need the verify key */ keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No verify key id on crypt token [%s:%s]", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); /* no longer return an error, it might be ok to not have a key info * even if we do not propagate the error here the check functions will * later find out that the signature is missing */ return 0; } /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[20]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_1A4); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, 96); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 20, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_NO_KEY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to verify signature of user \"%s\" (no key)", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Unable to verify signature (no key)")); } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Invalid signature!!!")); GWEN_Buffer_AppendString(tbuf, "!"); } else { GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Could not verify signature")); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); GWEN_Buffer_AppendString(tbuf, "?"); } GWEN_Buffer_AppendString(tbuf, signerId); AH_Msg_AddSignerId(hmsg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/bpd_p.h0000644000175000017500000000217512364015477023103 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_BPD_P_H #define AH_BPD_P_H #include "bpd_l.h" #define AH_BPD_MAXHBCIVERSIONS 16 #define AH_BPD_MAXLANGUAGES 16 struct AH_BPD { int bpdVersion; GWEN_DB_NODE *bpdJobs; char *bankName; char *bankAddr; int bankPort; AH_BPD_ADDR_TYPE addrType; int jobTypesPerMsg; int maxMsgSize; int hbciVersions[AH_BPD_MAXHBCIVERSIONS+1]; int languages[AH_BPD_MAXLANGUAGES+1]; int isDirty; AH_BPD_ADDR_LIST *addrList; }; struct AH_BPD_ADDR { GWEN_LIST_ELEMENT(AH_BPD_ADDR) AH_BPD_ADDR_TYPE type; char *addr; char *suffix; AH_BPD_FILTER_TYPE ftype; int fversion; }; #endif /* AH_BPD_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/user_p.h0000644000175000017500000000347512364015477023320 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_USER_P_H #define AH_USER_P_H #include "user_l.h" #include #define AH_USER_MAX_TANMETHODS 16 #define AH_USER_MAX_TRANSFERS_PER_JOB 64 #define AH_USER_MAX_DEBITNOTES_PER_JOB 64 typedef struct AH_USER AH_USER; struct AH_USER { AH_HBCI *hbci; GWEN_MSGENGINE *msgEngine; AH_CRYPT_MODE cryptMode; AH_USER_STATUS status; int hbciVersion; GWEN_URL *serverUrl; AH_BPD *bpd; GWEN_DB_NODE *dbUpd; char *peerId; char *systemId; int updVersion; int httpVMajor; int httpVMinor; char *httpUserAgent; char *httpContentType; uint32_t flags; uint32_t tanMethods; char *tokenType; char *tokenName; uint32_t tokenContextId; int rdhType; int tanMethodList[AH_USER_MAX_TANMETHODS+1]; int tanMethodCount; int selectedTanMethod; char *prompt; AH_TAN_METHOD_LIST *tanMethodDescriptions; char *tanMediumId; GWEN_STRINGLIST *sepaDescriptors; char *sepaTransferProfile; char *sepaDebitNoteProfile; int maxTransfersPerJob; int maxDebitNotesPerJob; }; static void GWENHYWFAR_CB AH_User_freeData(void *bp, void *p); static void AH_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db); static void AH_User_toDb(AB_USER *u, GWEN_DB_NODE *db); static void AH_User_LoadTanMethods(AB_USER *u); static void AH_User_LoadSepaDescriptors(AB_USER *u); static int AH_User_AddTextWithoutTags(const char *s, GWEN_BUFFER *obuf); #endif /* AH_USER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_ddv.c0000644000175000017500000007456512364015477024533 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: msgcrypt.inc 1109 2007-01-10 14:30:14Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgDdv_PrepareCryptoSeg(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || !*peerId) peerId=userId; tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "DDV"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", 1); return 0; } int AH_Msg_SignDdv(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; AB_USER *su; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "ddv"); gid=0; su=AB_Banking_FindUser(AH_HBCI_GetBankingApi(h), AH_PROVIDER_NAME, "de", "*", signer, "*"); if (!su) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown user \"%s\"", signer); return GWEN_ERROR_NOT_FOUND; } uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgDdv_PrepareCryptoSeg(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) { GWEN_BUFFER *idBuf; idBuf=GWEN_Buffer_new(0, 128, 0, 1); rv=GWEN_Text_FromHexBuffer(p, idBuf); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad system id on DDV medium, should not happen (%d)", rv); GWEN_Buffer_free(idBuf); GWEN_DB_Group_free(cfg); return rv; } GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", GWEN_Buffer_GetStart(idBuf), GWEN_Buffer_GetUsedBytes(idBuf)); GWEN_Buffer_free(idBuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on DDV medium, should not happen (%d)", rv); GWEN_DB_Group_free(cfg); return GWEN_ERROR_INTERNAL; } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; /* hash sighead + data */ md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_None); signLen=20; rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptDdv(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[16]; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "ddv"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_None); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); } } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgDdv_PrepareCryptoSeg(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) { GWEN_BUFFER *idBuf; idBuf=GWEN_Buffer_new(0, 128, 0, 1); rv=GWEN_Text_FromHexBuffer(p, idBuf); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad system id on DDV medium, should not happen (%d)", rv); GWEN_Buffer_free(idBuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", GWEN_Buffer_GetStart(idBuf), GWEN_Buffer_GetUsedBytes(idBuf)); GWEN_Buffer_free(idBuf); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id on DDV medium, should not happen (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return GWEN_ERROR_INTERNAL; } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, 16); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptDdv(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[16]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "ddv"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_None); elen=sizeof(decKey); rv=GWEN_Crypt_Token_Decipher(ct, keyId, algo, (const uint8_t*)p, l, decKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } sk=GWEN_Crypt_KeyDes3K_fromData(GWEN_Crypt_CryptMode_Cbc, 24, decKey, elen); if (sk==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create DES key from data"); return GWEN_ERROR_BAD_DATA; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Missing message key"); return GWEN_ERROR_BAD_DATA; } /* get encrypted data */ p=GWEN_DB_GetBinValue(ndata, "CryptData", 0, 0,0, &l); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_BAD_DATA; } /* decipher message with session key */ mbuf=GWEN_Buffer_new(0, l, 0, 1); rv=GWEN_Crypt_Key_Decipher(sk, (const uint8_t*)p, l, (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); GWEN_Crypt_Key_free(sk); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not decipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* unpadd message */ rv=GWEN_Padd_UnpaddWithAnsiX9_23(mbuf); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error unpadding message with ANSI X9.23 (%d)", rv); GWEN_Buffer_free(mbuf); return rv; } /* store crypter id */ AH_Msg_SetCrypterId(hmsg, crypterId); /* store new buffer inside message */ GWEN_Buffer_free(hmsg->origbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyDdv(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[20]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_None); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 20, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); } GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgengine_l.h0000644000175000017500000000124312364015477024301 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_MSGENGINE_L_H #define AH_MSGENGINE_L_H #include "msgengine.h" void AH_MsgEngine_SetUser(GWEN_MSGENGINE *e, AB_USER *u); #endif /* AH_MSGENGINE_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/account.c0000644000175000017500000001364112364015477023446 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "account_p.h" #include "aqhbci_l.h" #include "provider_l.h" #include "hbci-updates_l.h" #include #include #include #include #include #include #include GWEN_INHERIT(AB_ACCOUNT, AH_ACCOUNT) int AH_Account_Extend(AB_ACCOUNT *a, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend) { AH_ACCOUNT *ae; assert(a); if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { int rv; GWEN_NEW_OBJECT(AH_ACCOUNT, ae); GWEN_INHERIT_SETDATA(AB_ACCOUNT, AH_ACCOUNT, a, ae, AH_Account_freeData); ae->hbci=AH_Provider_GetHbci(pro); if (em==AB_ProviderExtendMode_Create) ae->flags=AH_BANK_FLAGS_DEFAULT; else { /* update db to latest version */ rv=AH_HBCI_UpdateDbAccount(ae->hbci, dbBackend); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not update account db (%d)", rv); GWEN_Gui_ShowError(I18N("AqBanking Settings Database Error"), I18N("Your settings database might be in an inconsistent state!")); return rv; } AH_Account_ReadDb(a, dbBackend); if (rv==1) { /* updated config, write it now */ rv=AB_Banking_SaveAccountConfig(AB_Provider_GetBanking(pro), a, 1); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save account db (%d)", rv); GWEN_Gui_ShowError(I18N("AqBanking Settings Database Error"), I18N("Your settings database might be in an inconsistent state!")); return rv; } } } } else if (em==AB_ProviderExtendMode_Reload) { AH_Account_ReadDb(a, dbBackend); } else if (em==AB_ProviderExtendMode_Save) { AH_Account_toDb(a, dbBackend); } return 0; } void GWENHYWFAR_CB AH_Account_freeData(void *bp, void *p) { AH_ACCOUNT *ae; ae=(AH_ACCOUNT*) p; GWEN_FREE_OBJECT(ae); } void AH_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db) { AH_ACCOUNT *ae; const char *s; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); ae->flags=AH_Account_Flags_fromDb(db, "accountFlags"); s=GWEN_DB_GetCharValue(db, "suffix", 0, NULL); if (s && *s) { ae->flags|=AH_BANK_FLAGS_KTV2; if (strcasecmp(s, "")!=0) AB_Account_SetSubAccountId(a, s); } } void AH_Account_toDb(AB_ACCOUNT *a, GWEN_DB_NODE *db) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); AH_Account_Flags_toDb(db, "accountFlags", ae->flags); GWEN_DB_DeleteVar(db, "suffix"); } AH_HBCI *AH_Account_GetHbci(const AB_ACCOUNT *a) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); return ae->hbci; } void AH_Account_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags) { GWEN_DB_DeleteVar(db, name); if (flags & AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "preferSingleTransfer"); if (flags & AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "preferSingleDebitNote"); if (flags & AH_BANK_FLAGS_KTV2) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "ktv2"); if (flags & AH_BANK_FLAGS_SEPA) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepa"); if (flags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepaPreferSingleTransfer"); if (flags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sepaPreferSingleDebitNote"); } uint32_t AH_Account_Flags_fromDb(GWEN_DB_NODE *db, const char *name) { uint32_t fl=0; int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, name, i, 0); if (!s) break; if (strcasecmp(s, "preferSingleTransfer")==0) fl|=AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER; else if (strcasecmp(s, "preferSingleDebitNote")==0) fl|=AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE; else if (strcasecmp(s, "ktv2")==0) fl|=AH_BANK_FLAGS_KTV2; else if (strcasecmp(s, "sepa")==0) fl|=AH_BANK_FLAGS_SEPA; else if (strcasecmp(s, "sepaPreferSingleTransfer")==0) fl|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER; else if (strcasecmp(s, "sepaPreferSingleDebitNote")==0) fl|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE; else { DBG_WARN(AQHBCI_LOGDOMAIN, "Unknown account flag \"%s\"", s); } } return fl; } uint32_t AH_Account_GetFlags(const AB_ACCOUNT *a) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); return ae->flags; } void AH_Account_SetFlags(AB_ACCOUNT *a, uint32_t flags) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); ae->flags=flags; } void AH_Account_AddFlags(AB_ACCOUNT *a, uint32_t flags) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); ae->flags|=flags; } void AH_Account_SubFlags(AB_ACCOUNT *a, uint32_t flags) { AH_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AH_ACCOUNT, a); assert(ae); ae->flags&=~flags; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgengine.c0000644000175000017500000003114112364015477023761 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "msgengine_p.h" #include "aqhbci_l.h" #include "hbci_l.h" #include "user_l.h" #include #include #include #include #include #include #include #include GWEN_INHERIT(GWEN_MSGENGINE, AH_MSGENGINE); int AH_MsgEngine_TypeRead(GWEN_MSGENGINE *e, GWEN_BUFFER *msgbuf, GWEN_XMLNODE *node, GWEN_BUFFER *vbuf, char escapeChar, const char *delimiters){ AH_MSGENGINE *x; const char *type; int v; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "AH_MsgEngine_TypeRead"); assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); type=GWEN_XMLNode_GetProperty(node, "type",""); if (strcasecmp(type, "date")==0) { char buffer[9]; unsigned int i; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Supporting type \"date\""); memset(buffer,0, sizeof(buffer)); if (GWEN_Buffer_GetBytesLeft(msgbuf)<8) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too few bytes for date (%d<8)", GWEN_Buffer_GetBytesLeft(msgbuf)); return -1; } for (i=0; i<8; i++) { int c; c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; if (!isdigit(c)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-digit found in date"); return -1; } buffer[i]=c; if (i==3) { /* year is full, check it */ v=atoi(buffer); if (v<1970 || v>2100) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Year out of range (%d)", v); return -1; } } /* if i==3 */ else if (i==5) { /* month is full, check it */ v=atoi(buffer+4); if (v<1 || v>12) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Month out of range (%d)", v); return -1; } } /* if i==6 */ } v=atoi(buffer+6); if (v<1 || v>31) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Day out of range (%d)", v); return -1; } /* date read, now store it */ if (GWEN_Buffer_AppendBytes(vbuf, buffer, 8)) { DBG_INFO(AQHBCI_LOGDOMAIN, "called from here"); return -1; } return 0; } /* if date */ else if (strcasecmp(type, "time")==0) { char buffer[7]; unsigned int i; DBG_INFO(AQHBCI_LOGDOMAIN, "Supporting type \"time\""); memset(buffer,0, sizeof(buffer)); if (GWEN_Buffer_GetBytesLeft(msgbuf)<6) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too few bytes for time (%d<6)", GWEN_Buffer_GetBytesLeft(msgbuf)); return -1; } for (i=0; i<6; i++) { int c; c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; if (!isdigit(c)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-digit found in date"); return -1; } buffer[i]=c; if (i==1) { /* hour is full, check it */ v=atoi(buffer); if (v>23) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hour out of range (%d)", v); return -1; } } /* if i==1 */ else if (i==3) { /* minutes full, check */ v=atoi(buffer+2); if (v>59) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Minutes out of range (%d)", v); return -1; } } /* if i==3 */ } v=atoi(buffer+4); if (v>59) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Seconds out of range (%d)", v); return -1; } /* date read, now store it */ if (GWEN_Buffer_AppendBytes(vbuf, buffer, 6)) { DBG_INFO(AQHBCI_LOGDOMAIN, "called from here"); return -1; } return 0; } else { DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Type \"%s\" not supported by HBCI MsgEngine", type); return 1; } } int AH_MsgEngine_BinTypeWrite(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *dbuf) { const char *s; s=GWEN_XMLNode_GetProperty(node, "binType", 0); if (s && *s) { if (strcasecmp(s, "dtaus")==0) { int rv; GWEN_DBIO *dbio; GWEN_DB_NODE *dbCfg; GWEN_DB_NODE *dbTransfers; dbio=GWEN_DBIO_GetPlugin("dtaus"); if (!dbio) { DBG_ERROR(AQHBCI_LOGDOMAIN, "DTAUS parser plugin not available"); return GWEN_ERROR_NOT_SUPPORTED; } s=GWEN_XMLNode_GetProperty(node, "name", 0); assert(s); dbCfg=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, s); assert(dbCfg); dbTransfers=GWEN_DB_GetGroup(dbCfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "transactions"); rv=GWEN_DBIO_ExportToBuffer(dbio, dbuf, dbTransfers, dbCfg, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error creating DTAUS object"); return rv; } return 0; } } return 1; } int AH_MsgEngine_TypeWrite(GWEN_MSGENGINE *e, GWEN_BUFFER *gbuf, GWEN_BUFFER *data, GWEN_XMLNODE *node){ AH_MSGENGINE *x; const char *type; int v; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "AH_MsgEngine_TypeWrite"); assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); type=GWEN_XMLNode_GetProperty(node, "type",""); if (strcasecmp(type, "date")==0) { char buffer[9]; unsigned int i; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Supporting type \"date\""); memset(buffer,0, sizeof(buffer)); if (GWEN_Buffer_GetBytesLeft(data)<8) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too few bytes for date (%d<8)", GWEN_Buffer_GetBytesLeft(data)); return -1; } for (i=0; i<8; i++) { int c; c=GWEN_Buffer_ReadByte(data); if (c==-1) return -1; if (!isdigit(c)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-digit found in date"); return -1; } buffer[i]=c; if (i==3) { /* year is full, check it */ v=atoi(buffer); if (v<1970 || v>2100) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Year out of range (%d)", v); return -1; } } /* if i==3 */ else if (i==5) { /* month is full, check it */ v=atoi(buffer+4); if (v<1 || v>12) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Month out of range (%d)", v); return -1; } } /* if i==5 */ } v=atoi(buffer+6); if (v<1 || v>31) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Day out of range (%d)", v); return -1; } /* date read, now store it */ if (GWEN_Buffer_AppendBytes(gbuf, buffer, 8)) { DBG_INFO(AQHBCI_LOGDOMAIN, "called from here"); return -1; } return 0; } /* if date */ else if (strcasecmp(type, "time")==0) { char buffer[7]; unsigned int i; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Supporting type \"time\""); memset(buffer,0, sizeof(buffer)); if (GWEN_Buffer_GetBytesLeft(data)<6) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Too few bytes for time (%d<6)", GWEN_Buffer_GetBytesLeft(data)); return -1; } for (i=0; i<6; i++) { int c; c=GWEN_Buffer_ReadByte(data); if (c==-1) return -1; if (!isdigit(c)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-digit found in date"); return -1; } buffer[i]=c; if (i==1) { /* hour is full, check it */ v=atoi(buffer); if (v>23) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hour out of range (%d)", v); return -1; } } /* if i==1 */ else if (i==3) { /* minutes full, check */ v=atoi(buffer+2); if (v>59) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Minutes out of range (%d)", v); return -1; } } /* if i==3 */ } v=atoi(buffer+4); if (v>59) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Seconds out of range (%d)", v); return -1; } /* date read, now store it */ if (GWEN_Buffer_AppendBytes(gbuf, buffer, 6)) { DBG_INFO(AQHBCI_LOGDOMAIN, "called from here"); return -1; } return 0; } else { DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Type \"%s\" not supported by MsgEngineHBCI", type); return 1; } } GWEN_DB_NODE_TYPE AH_MsgEngine_TypeCheck(GWEN_MSGENGINE *e, const char *tname){ AH_MSGENGINE *x; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "AH_MsgEngine_TypeCheck"); assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); if (strcasecmp(tname, "date")==0 || strcasecmp(tname, "time")==0) return GWEN_DB_NodeType_ValueChar; else return GWEN_DB_NodeType_Unknown; } const char *AH_MsgEngine_GetCharValue(GWEN_MSGENGINE *e, const char *name, const char *defValue){ AH_MSGENGINE *x; AH_HBCI *h; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "AH_MsgEngine_GetCharValue"); assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); DBG_INFO(AQHBCI_LOGDOMAIN, "Mode is: \"%s\"", GWEN_MsgEngine_GetMode(e)); DBG_INFO(AQHBCI_LOGDOMAIN, "Variable is: \"%s\"", name); assert(x->user); h=AH_User_GetHbci(x->user); assert(h); if (strcasecmp(name, "product")==0) return AH_HBCI_GetProductName(h); else if (strcasecmp(name, "productversion")==0) return AH_HBCI_GetProductVersion(h); if (strcasecmp(name, "customerid")==0) return AB_User_GetCustomerId(x->user); else if (strcasecmp(name, "userid")==0) return AB_User_GetUserId(x->user); else if (strcasecmp(name, "bankcode")==0) return AB_User_GetBankCode(x->user); else if (strcasecmp(name, "systemId")==0){ const char *p; DBG_WARN(AQHBCI_LOGDOMAIN, "SystemId requested (deprecated), in mode \"%s\" variable \"%s\"", GWEN_MsgEngine_GetMode(e), name); p=AH_User_GetSystemId(x->user); if (p) return p; return "0"; } else { DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Unknown char variable \"%s\", returning default value", name); return defValue; } } int AH_MsgEngine_GetIntValue(GWEN_MSGENGINE *e, const char *name, int defValue){ AH_MSGENGINE *x; DBG_VERBOUS(AQHBCI_LOGDOMAIN, "AH_MsgEngine_GetIntValue"); assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); assert(x->user); if (strcasecmp(name, "country")==0) { const char *s; const AB_COUNTRY *cnt; s=AB_User_GetCountry(x->user); if (!s || !*s) return defValue; cnt=AB_Banking_FindCountryByName(AB_User_GetBanking(x->user), s); if (cnt) return AB_Country_GetNumericCode(cnt); return defValue; } else if (strcasecmp(name, "updversion")==0) return AH_User_GetUpdVersion(x->user); else if (strcasecmp(name, "bpdversion")==0) return AH_User_GetBpdVersion(x->user); else { DBG_VERBOUS(AQHBCI_LOGDOMAIN, "Unknown int variable \"%s\", returning default value", name); return defValue; } } AH_MSGENGINE *AH_MsgEngine_Data_new() { AH_MSGENGINE *x; GWEN_NEW_OBJECT(AH_MSGENGINE, x); return x; } void AH_MsgEngine_Data_free(AH_MSGENGINE *x) { assert(x); DBG_INFO(AQHBCI_LOGDOMAIN, "Destroying AH_MSGENGINE"); GWEN_FREE_OBJECT(x); } void GWENHYWFAR_CB AH_MsgEngine_FreeData(void *bp, void *p) { AH_MSGENGINE *x; x=(AH_MSGENGINE*)p; AH_MsgEngine_Data_free(x); } void AH_MsgEngine_SetUser(GWEN_MSGENGINE *e, AB_USER *u){ AH_MSGENGINE *x; assert(e); x=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e); assert(x); x->user=u; } GWEN_MSGENGINE *AH_MsgEngine_new(){ GWEN_MSGENGINE *e; AH_MSGENGINE *x; e=GWEN_MsgEngine_new(); assert(e); x=AH_MsgEngine_Data_new(); GWEN_INHERIT_SETDATA(GWEN_MSGENGINE, AH_MSGENGINE, e, x, AH_MsgEngine_FreeData); GWEN_MsgEngine_SetTypeReadFunction(e, AH_MsgEngine_TypeRead); GWEN_MsgEngine_SetTypeWriteFunction(e, AH_MsgEngine_TypeWrite); GWEN_MsgEngine_SetTypeCheckFunction(e, AH_MsgEngine_TypeCheck); GWEN_MsgEngine_SetBinTypeWriteFunction(e, AH_MsgEngine_BinTypeWrite); GWEN_MsgEngine_SetGetCharValueFunction(e, AH_MsgEngine_GetCharValue); GWEN_MsgEngine_SetGetIntValueFunction(e, AH_MsgEngine_GetIntValue); GWEN_MsgEngine_SetEscapeChar(e, '?'); return e; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c0000644000175000017500000010034212364015477024575 00000000000000/*************************************************************************** begin : Tue Nov 25 2008 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_MsgRdh_PrepareCryptoSeg3(AH_MSG *hmsg, AB_USER *u, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_DB_NODE *cfg, int crypt, int createCtrlRef) { char sdate[9]; char stime[7]; char ctrlref[15]; struct tm *lt; time_t tt; const char *userId; const char *peerId; assert(hmsg); assert(u); assert(cfg); userId=AB_User_GetUserId(u); assert(userId); assert(*userId); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No PeerId in user, using user id"); peerId=userId; } tt=time(0); lt=localtime(&tt); if (createCtrlRef) { /* create control reference */ if (!strftime(ctrlref, sizeof(ctrlref), "%Y%m%d%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "CtrlRef string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); } /* create date */ if (!strftime(sdate, sizeof(sdate), "%Y%m%d", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } /* create time */ if (!strftime(stime, sizeof(stime), "%H%M%S", lt)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Date string too long"); return GWEN_ERROR_INTERNAL; } GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/dir", 1); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/date", sdate); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecStamp/time", stime); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/bankcode", AB_User_GetBankCode(u)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/userid", crypt?peerId:userId); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keytype", crypt?"V":"S"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keynum", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "key/keyversion", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/code", "RDH"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "secProfile/version", AH_User_GetRdhType(u)); if (crypt) { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/algo", 13); /* 2-key-DES */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptAlgo/mode", 18); /* PKCS#1 */ } else { GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/algo", 10); /* RSA */ if (AH_Msg_GetSecurityClass(hmsg)<3) { /* S-key */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/mode", 18); /* PKCS#1 */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hashAlgo/algo", 1); /* SHA-1 */ } else { /* D-key */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signAlgo/mode", 17); /* ISO-9796-2 */ GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "hashAlgo/algo", 999); /* RMD160 */ } } return 0; } int AH_Msg_SignRdh3(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *sigbuf; GWEN_BUFFER *hbuf; unsigned int l; int rv; char ctrlref[15]; const char *p; GWEN_MSGENGINE *e; uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; uFlags=AH_User_GetFlags(su); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(su), AH_User_GetTokenName(su), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(su), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(su), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(su), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigHead\" not found"); return GWEN_ERROR_INTERNAL; } /* prepare config for segment */ cfg=GWEN_DB_Group_new("sighead"); rv=AH_MsgRdh_PrepareCryptoSeg3(hmsg, su, ki, cfg, 0, 1); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); return rv; } /* set expected signer */ if (!(uFlags & AH_USER_FLAGS_BANK_DOESNT_SIGN)) { const char *remoteId; remoteId=AH_User_GetPeerId(su); if (!remoteId || *remoteId==0) remoteId=AB_User_GetUserId(su); assert(remoteId); assert(*remoteId); DBG_DEBUG(AQHBCI_LOGDOMAIN, "Expecting \"%s\" to sign the response", remoteId); AH_Msg_SetExpectedSigner(hmsg, remoteId); } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(su); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* retrieve control reference for sigtail (to be used later) */ p=GWEN_DB_GetCharValue(cfg, "ctrlref", 0, ""); if (strlen(p)>=sizeof(ctrlref)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Control reference too long (14 bytes maximum)"); GWEN_DB_Group_free(cfg); return -1; } strcpy(ctrlref, p); /* create SigHead */ hbuf=GWEN_Buffer_new(0, 128+GWEN_Buffer_GetUsedBytes(rawBuf), 0, 1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->firstSegment-1); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signseq", GWEN_Crypt_Token_KeyInfo_GetSignCounter(ki)); /* create signature head segment */ rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); GWEN_DB_Group_free(cfg); cfg=0; if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigHead"); GWEN_Buffer_free(hbuf); return rv; } /* remember size of sighead for now */ l=GWEN_Buffer_GetUsedBytes(hbuf); /* add raw data to to-sign data buffer */ GWEN_Buffer_AppendBuffer(hbuf, rawBuf); /* sign message */ sigbuf=GWEN_Buffer_new(0, 512, 0, 1); if (1) { uint32_t signLen; GWEN_CRYPT_PADDALGO *algo; GWEN_MDIGEST *md; uint32_t seq; /* hash sighead + data */ md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } /* sign hash */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); signLen=GWEN_Buffer_GetMaxUnsegmentedWrite(sigbuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), (uint8_t*)GWEN_Buffer_GetPosPointer(sigbuf), &signLen, &seq, gid); GWEN_Crypt_PaddAlgo_free(algo); GWEN_MDigest_free(md); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not sign data with medium of user \"%s\" (%d)", AB_User_GetUserId(su), rv); GWEN_Buffer_free(sigbuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sigbuf, signLen); GWEN_Buffer_AdjustUsedBytes(sigbuf); } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Signing done"); /* insert new SigHead at beginning of message buffer */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Inserting signature head"); GWEN_Buffer_Rewind(hmsg->buffer); GWEN_Buffer_InsertBytes(hmsg->buffer, GWEN_Buffer_GetStart(hbuf), l); /* create sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Completing signature tail"); cfg=GWEN_DB_Group_new("sigtail"); GWEN_Buffer_Reset(hbuf); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", hmsg->lastSegment+1); /* store to DB */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "signature", GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "ctrlref", ctrlref); /* get node */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "SigTail"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"SigTail\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create SigTail"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } /* append sigtail */ DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail"); if (GWEN_Buffer_AppendBuffer(hmsg->buffer, hbuf)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Appending signature tail: done"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); /* adjust segment numbers (for next signature and message tail */ hmsg->firstSegment--; hmsg->lastSegment++; return 0; } int AH_Msg_EncryptRdh3(AH_MSG *hmsg) { AH_HBCI *h; GWEN_XMLNODE *node; GWEN_DB_NODE *cfg; GWEN_BUFFER *mbuf; GWEN_BUFFER *hbuf; uint32_t l; int rv; const char *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk; uint8_t encKey[300]; int encKeyLen; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } rv=GWEN_Padd_PaddWithAnsiX9_23(hmsg->buffer); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Error padding message with ANSI X9.23 (%d)", rv); return rv; } /* create session key */ sk=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (sk==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not generate DES key"); return GWEN_ERROR_INTERNAL; } /* encrypt message with that session key */ mbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(hmsg->buffer), 0, 1); l=GWEN_Buffer_GetUsedBytes(hmsg->buffer); rv=GWEN_Crypt_Key_Encipher(sk, (uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer), GWEN_Buffer_GetUsedBytes(hmsg->buffer), (uint8_t*)GWEN_Buffer_GetPosPointer(mbuf), &l); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not encipher with DES session key (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } GWEN_Buffer_IncrementPos(mbuf, l); GWEN_Buffer_AdjustUsedBytes(mbuf); /* encrypt session key */ if (1) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, GWEN_Crypt_Token_KeyInfo_GetKeySize(ki)); elen=sizeof(encKey); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, GWEN_Crypt_KeyDes3K_GetKeyDataPtr(sk), 16, encKey, &elen, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return rv; } encKeyLen=elen; } GWEN_Crypt_Key_free(sk); /* create crypt head */ node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptHead"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptHead\" not found"); GWEN_Buffer_free(mbuf); GWEN_Crypt_Key_free(sk); return GWEN_ERROR_INTERNAL; } /* create CryptHead */ cfg=GWEN_DB_Group_new("crypthead"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 998); rv=AH_MsgRdh_PrepareCryptoSeg3(hmsg, u, ki, cfg, 1, 0); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } /* store system id */ if (hmsg->noSysId) { GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } else { p=AH_User_GetSystemId(u); if (p==NULL) p=GWEN_Crypt_Token_Context_GetSystemId(ctx); if (p) GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", p); else { DBG_INFO(AQHBCI_LOGDOMAIN, "No System id on RDH medium, using default"); GWEN_DB_SetCharValue(cfg, GWEN_DB_FLAGS_DEFAULT, "SecDetails/SecId", "0"); } } /* store encrypted message key */ GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "CryptAlgo/MsgKey", encKey, encKeyLen); hbuf=GWEN_Buffer_new(0, 256+GWEN_Buffer_GetUsedBytes(mbuf), 0, 1); rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptHead (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); GWEN_Buffer_free(mbuf); return rv; } GWEN_DB_Group_free(cfg); /* create cryptdata */ cfg=GWEN_DB_Group_new("cryptdata"); GWEN_DB_SetIntValue(cfg, GWEN_DB_FLAGS_DEFAULT, "head/seq", 999); GWEN_DB_SetBinValue(cfg, GWEN_DB_FLAGS_DEFAULT, "cryptdata", GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); GWEN_Buffer_free(mbuf); node=GWEN_MsgEngine_FindNodeByPropertyStrictProto(e, "SEG", "id", 0, "CryptData"); if (!node) { DBG_INFO(AQHBCI_LOGDOMAIN, "Segment \"CryptData\"not found"); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return -1; } rv=GWEN_MsgEngine_CreateMessageFromNode(e, node, hbuf, cfg); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create CryptData (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_DB_Group_free(cfg); return rv; } /* replace existing buffer by encrypted one */ GWEN_Buffer_free(hmsg->buffer); hmsg->buffer=hbuf; GWEN_DB_Group_free(cfg); return 0; } int AH_Msg_DecryptRdh3(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AH_HBCI *h; GWEN_BUFFER *mbuf; uint32_t l; int rv; const uint8_t *p; GWEN_MSGENGINE *e; AB_USER *u; const char *peerId; // uint32_t uFlags; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_KEY *sk=NULL; uint8_t decKey[300]; GWEN_DB_NODE *nhead=NULL; GWEN_DB_NODE *ndata=NULL; const char *crypterId; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); e=AH_Dialog_GetMsgEngine(hmsg->dialog); assert(e); GWEN_MsgEngine_SetMode(e, "rdh"); gid=0; u=AH_Dialog_GetDialogOwner(hmsg->dialog); // uFlags=AH_User_GetFlags(u); peerId=AH_User_GetPeerId(u); if (!peerId || *peerId==0) peerId=AB_User_GetUserId(u); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* get encrypted session key */ nhead=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptHead"); if (!nhead) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt head"); return GWEN_ERROR_BAD_DATA; } ndata=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_NAMEMUSTEXIST, "CryptData"); if (!ndata) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt data"); return GWEN_ERROR_BAD_DATA; } crypterId=GWEN_DB_GetCharValue(nhead, "key/userId", 0, I18N("unknown")); p=GWEN_DB_GetBinValue(nhead, "CryptAlgo/MsgKey", 0, 0,0, &l); if (p && l) { uint32_t elen; GWEN_CRYPT_PADDALGO *algo; uint8_t encKey[300]; int ksize; ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); if (ksizeorigbuffer); hmsg->origbuffer=hmsg->buffer; GWEN_Buffer_Rewind(mbuf); hmsg->buffer=mbuf; return 0; } int AH_Msg_VerifyRdh3(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AH_HBCI *h; GWEN_LIST *sigheads; GWEN_LIST *sigtails; GWEN_DB_NODE *n; int nonSigHeads; int nSigheads; unsigned int dataBegin; char *dataStart; unsigned int dataLength; unsigned int i; AB_USER *u; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; int rv; uint32_t gid; assert(hmsg); h=AH_Dialog_GetHbci(hmsg->dialog); assert(h); u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); gid=0; /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, gid); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), gid); if (ctx==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", AH_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } /* let's go */ sigheads=GWEN_List_new(); /* enumerate signature heads */ nonSigHeads=0; nSigheads=0; n=GWEN_DB_GetFirstGroup(gr); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigHead")==0) { /* found a signature head */ if (nonSigHeads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found some unsigned parts at the beginning"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } GWEN_List_PushBack(sigheads, n); nSigheads++; } else if (strcasecmp(GWEN_DB_GroupName(n), "MsgHead")!=0) { if (nSigheads) break; nonSigHeads++; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { if (nSigheads) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Found Signature heads but no other segments"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signatures"); GWEN_List_free(sigheads); return 0; } /* only now we need the verify key */ keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No verify key id on crypt token [%s:%s]", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, gid); if (ki==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); /* no longer return an error, it might be ok to not have a key info * even if we do not propagate the error here the check functions will * later find out that the signature is missing */ return 0; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); assert(ksize<=256); /* store begin of signed data */ dataBegin=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!dataBegin) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No position specifications in segment"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } /* now get first signature tail */ while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")==0) { unsigned int currpos; /* found a signature tail */ currpos=GWEN_DB_GetIntValue(n, "segment/pos", 0, 0); if (!currpos || dataBegin>currpos) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad position specification in Signature tail"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } dataLength=currpos-dataBegin; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature tail found"); GWEN_List_free(sigheads); return GWEN_ERROR_BAD_DATA; } sigtails=GWEN_List_new(); while(n) { if (strcasecmp(GWEN_DB_GroupName(n), "SigTail")!=0) break; GWEN_List_PushBack(sigtails, n); n=GWEN_DB_GetNextGroup(n); } /* while */ if (!n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Message tail expected"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(GWEN_DB_GroupName(n), "MsgTail")!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (msg tail expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } n=GWEN_DB_GetNextGroup(n); if (n) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unexpected segment (end expected)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } if (GWEN_List_GetSize(sigheads)!= GWEN_List_GetSize(sigtails)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Number of signature heads (%d) does not match " "number of signature tails (%d)", GWEN_List_GetSize(sigheads), GWEN_List_GetSize(sigtails)); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* ok, now verify all signatures */ dataStart=GWEN_Buffer_GetStart(hmsg->buffer)+dataBegin; for (i=0; i< GWEN_List_GetSize(sigtails); i++) { GWEN_DB_NODE *sighead; GWEN_DB_NODE *sigtail; const uint8_t *p; uint32_t l; int rv; uint8_t hash[20]; const char *signerId; /* get signature tail */ sigtail=(GWEN_DB_NODE*)GWEN_List_GetBack(sigtails); /* get corresponding signature head */ sighead=(GWEN_DB_NODE*)GWEN_List_GetFront(sigheads); if (!sighead || !sigtail) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No signature head/tail left (internal error)"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_INTERNAL; } GWEN_List_PopBack(sigtails); GWEN_List_PopFront(sigheads); signerId=GWEN_DB_GetCharValue(sighead, "key/userid", 0, I18N("unknown")); /* some checks */ if (strcasecmp(GWEN_DB_GetCharValue(sighead, "ctrlref", 0, ""), GWEN_DB_GetCharValue(sigtail, "ctrlref", 0, ""))!=0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Non-matching signature tail"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } /* hash signature head and data */ if (1) { GWEN_MDIGEST *md; /* hash sighead + data */ p=(const uint8_t*)GWEN_Buffer_GetStart(hmsg->buffer); p+=GWEN_DB_GetIntValue(sighead, "segment/pos", 0, 0); l=GWEN_DB_GetIntValue(sighead, "segment/length", 0, 0); md=GWEN_MDigest_Rmd160_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) /* digest signature head */ rv=GWEN_MDigest_Update(md, p, l); if (rv==0) /* digest data */ rv=GWEN_MDigest_Update(md, (const uint8_t*)dataStart, dataLength); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return rv; } memmove(hash, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); } /* verify signature */ p=GWEN_DB_GetBinValue(sigtail, "signature", 0, 0, 0, &l); if (p && l) { GWEN_CRYPT_PADDALGO *algo; algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); rv=GWEN_Crypt_Token_Verify(ct, keyId, algo, hash, 20, p, l, 0, gid); GWEN_Crypt_PaddAlgo_free(algo); if (rv) { if (rv==GWEN_ERROR_NO_KEY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unable to verify signature of user \"%s\" (no key)", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Unable to verify signature (no key)")); } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (rv==GWEN_ERROR_VERIFY) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Invalid signature of user \"%s\"", signerId); GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Invalid signature!!!")); GWEN_Buffer_AppendString(tbuf, "!"); } else { GWEN_Gui_ProgressLog(gid, GWEN_LoggerLevel_Error, I18N("Could not verify signature")); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not verify data with medium of user \"%s\" (%d)", AB_User_GetUserId(u), rv); GWEN_Buffer_AppendString(tbuf, "?"); } GWEN_Buffer_AppendString(tbuf, signerId); AH_Msg_AddSignerId(hmsg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Message signed by \"%s\"", signerId); AH_Msg_AddSignerId(hmsg, signerId); } } else { DBG_DEBUG(AQHBCI_LOGDOMAIN, "No signature"); GWEN_List_free(sigheads); GWEN_List_free(sigtails); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Verification done"); } /* for */ GWEN_List_free(sigheads); GWEN_List_free(sigtails); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci.c0000644000175000017500000003456612364015477022730 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif /* #define AH_HBCI_HEAVY_DEBUG */ #ifdef OS_WIN32 # define AH_PATH_SEP "\\" #else # define AH_PATH_SEP "/" #endif #include "hbci_p.h" #include "aqhbci_l.h" #include "hbci-updates_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include AH_HBCI *AH_HBCI_new(AB_PROVIDER *pro){ AH_HBCI *hbci; char numbuf[32]; int rv; assert(pro); if (!GWEN_Logger_IsOpen(AQHBCI_LOGDOMAIN)) { GWEN_Logger_Open(AQHBCI_LOGDOMAIN, "aqhbci", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); } GWEN_NEW_OBJECT(AH_HBCI, hbci); hbci->provider=pro; hbci->banking=AB_Provider_GetBanking(pro); hbci->productName=strdup("AQHBCI"); rv=snprintf(numbuf, sizeof(numbuf), "%d.%d", AQHBCI_VERSION_MAJOR, AQHBCI_VERSION_MINOR); if (rv==-1 || rv>=sizeof(numbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "What ?? %zd bytes isn't enough space for two decimals ?!", sizeof(numbuf)); hbci->productVersion=strdup("0"); } else hbci->productVersion=strdup(numbuf); hbci->transferTimeout=AH_HBCI_DEFAULT_TRANSFER_TIMEOUT; hbci->connectTimeout=AH_HBCI_DEFAULT_CONNECT_TIMEOUT; return hbci; } void AH_HBCI_free(AH_HBCI *hbci){ if (hbci) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Destroying AH_HBCI"); GWEN_DB_Group_free(hbci->dbProviderConfig); free(hbci->productName); free(hbci->productVersion); GWEN_XMLNode_free(hbci->defs); GWEN_FREE_OBJECT(hbci); GWEN_Logger_Close(AQHBCI_LOGDOMAIN); } } int AH_HBCI_Init(AH_HBCI *hbci, GWEN_DB_NODE *db) { GWEN_XMLNODE *node; assert(hbci); /* store config */ GWEN_DB_Group_free(hbci->dbProviderConfig); hbci->dbProviderConfig=GWEN_DB_Group_dup(db); /* load and update config data */ hbci->lastVersion=GWEN_DB_GetIntValue(db, "lastVersion", 0, 0); GWEN_PathManager_DefinePath(AH_PM_LIBNAME, AH_PM_XMLDATADIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) GWEN_PathManager_AddPathFromWinReg(AH_PM_LIBNAME, AH_PM_LIBNAME, AH_PM_XMLDATADIR, AH_REGKEY_PATHS, AH_REGKEY_XMLDATADIR); GWEN_PathManager_AddRelPath(AH_PM_LIBNAME, AH_PM_LIBNAME, AH_PM_XMLDATADIR, AH_XMLDATADIR, GWEN_PathManager_RelModeExe); #else GWEN_PathManager_AddPath(AH_PM_LIBNAME, AH_PM_LIBNAME, AH_PM_XMLDATADIR, AH_XMLDATADIR); #endif /* Load XML files */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Loading XML files"); node=AH_HBCI_LoadDefaultXmlFiles(hbci); if (!node) { DBG_ERROR(AQHBCI_LOGDOMAIN, "AqHBCI: Error loading XML files."); return 0; } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Adding XML descriptions"); if (AH_HBCI_AddDefinitions(hbci, node)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "ERROR: Could not add XML definitions.\n"); GWEN_XMLNode_free(node); return 0; } GWEN_XMLNode_free(node); hbci->sharedRuntimeData=GWEN_DB_Group_new("sharedRuntimeData"); hbci->transferTimeout=GWEN_DB_GetIntValue(db, "transferTimeout", 0, AH_HBCI_DEFAULT_TRANSFER_TIMEOUT); hbci->connectTimeout=GWEN_DB_GetIntValue(db, "connectTimeout", 0, AH_HBCI_DEFAULT_CONNECT_TIMEOUT); return 0; } int AH_HBCI_Fini(AH_HBCI *hbci, GWEN_DB_NODE *db) { uint32_t currentVersion; DBG_INFO(AQHBCI_LOGDOMAIN, "Deinitializing AH_HBCI"); assert(hbci); currentVersion= (AQHBCI_VERSION_MAJOR<<24) | (AQHBCI_VERSION_MINOR<<16) | (AQHBCI_VERSION_PATCHLEVEL<<8) | AQHBCI_VERSION_BUILD; /* save configuration */ DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting version %08x", currentVersion); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", currentVersion); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "transferTimeout", hbci->transferTimeout); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "connectTimeout", hbci->connectTimeout); GWEN_PathManager_UndefinePath(AH_PM_LIBNAME, AH_PM_XMLDATADIR); GWEN_DB_Group_free(hbci->sharedRuntimeData); hbci->sharedRuntimeData=0; GWEN_XMLNode_free(hbci->defs); hbci->defs=0; return 0; } AB_BANKING *AH_HBCI_GetBankingApi(const AH_HBCI *hbci){ assert(hbci); return hbci->banking; } GWEN_DB_NODE *AH_HBCI_GetProviderDb(const AH_HBCI *hbci) { assert(hbci); return hbci->dbProviderConfig; } const char *AH_HBCI_GetProductName(const AH_HBCI *hbci){ assert(hbci); return hbci->productName; } void AH_HBCI_SetProductName(AH_HBCI *hbci, const char *s){ assert(hbci); assert(s); free(hbci->productName); hbci->productName=strdup(s); } const char *AH_HBCI_GetProductVersion(const AH_HBCI *hbci){ assert(hbci); return hbci->productVersion; } void AH_HBCI_SetProductVersion(AH_HBCI *hbci, const char *s){ assert(hbci); assert(s); free(hbci->productVersion); hbci->productVersion=strdup(s); } GWEN_XMLNODE *AH_HBCI_GetDefinitions(const AH_HBCI *hbci){ assert(hbci); return hbci->defs; } GWEN_XMLNODE *AH_HBCI_LoadDefaultXmlFiles(const AH_HBCI *hbci){ GWEN_STRINGLIST *paths; paths=GWEN_PathManager_GetPaths(AH_PM_LIBNAME, AH_PM_XMLDATADIR); if (paths) { GWEN_BUFFER *fbuf; int rv; fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Directory_FindFileInPaths(paths, "hbci.xml", fbuf); GWEN_StringList_free(paths); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "XML data file not found (%d)", rv); GWEN_Buffer_free(fbuf); return NULL; } else { GWEN_XMLNODE *xmlNode; xmlNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); rv=GWEN_XML_ReadFile(xmlNode, GWEN_Buffer_GetStart(fbuf), GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not load XML file [%s]: %d.\n", GWEN_Buffer_GetStart(fbuf), rv); GWEN_XMLNode_free(xmlNode); GWEN_Buffer_free(fbuf); return NULL; } GWEN_Buffer_free(fbuf); return xmlNode; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No data files found."); return NULL; } } int AH_HBCI_AddDefinitions(AH_HBCI *hbci, GWEN_XMLNODE *node) { GWEN_XMLNODE *nsrc, *ndst; assert(node); if (!hbci->defs) { hbci->defs=GWEN_XMLNode_dup(node); return 0; } nsrc=GWEN_XMLNode_GetChild(node); while(nsrc) { if (GWEN_XMLNode_GetType(nsrc)==GWEN_XMLNodeTypeTag) { ndst=GWEN_XMLNode_FindNode(hbci->defs, GWEN_XMLNodeTypeTag, GWEN_XMLNode_GetData(nsrc)); if (ndst) { GWEN_XMLNODE *n; n=GWEN_XMLNode_GetChild(nsrc); while (n) { GWEN_XMLNODE *newNode; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding node \"%s\"", GWEN_XMLNode_GetData(n)); newNode=GWEN_XMLNode_dup(n); GWEN_XMLNode_AddChild(ndst, newNode); n=GWEN_XMLNode_Next(n); } /* while n */ } else { GWEN_XMLNODE *newNode; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Adding branch \"%s\"", GWEN_XMLNode_GetData(nsrc)); newNode=GWEN_XMLNode_dup(nsrc); GWEN_XMLNode_AddChild(hbci->defs, newNode); } } /* if TAG */ nsrc=GWEN_XMLNode_Next(nsrc); } /* while */ return 0; } void AH_HBCI_AppendUniqueName(AH_HBCI *hbci, GWEN_BUFFER *nbuf) { char buffer[16]; GWEN_TIME *ti; ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, "YYYYMMDD-hhmmss", nbuf); GWEN_Time_free(ti); snprintf(buffer, sizeof(buffer), "%03d", ++(hbci->counter)); GWEN_Buffer_AppendString(nbuf, "-"); GWEN_Buffer_AppendString(nbuf, buffer); } int AH_HBCI_SaveSettings(const char *path, GWEN_DB_NODE *db){ /* check for existence of that file */ if (GWEN_Directory_GetPath(path, GWEN_PATH_FLAGS_VARIABLE)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Path \"%s\" is not available", path); return -1; } /* write file */ if (GWEN_DB_WriteFile(db, path, GWEN_DB_FLAGS_DEFAULT)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not write file \"%s\"", path); return -1; } return 0; } GWEN_DB_NODE *AH_HBCI_LoadSettings(const char *path) { GWEN_DB_NODE *db; /* check for existence of the file */ if (GWEN_Directory_GetPath(path, GWEN_PATH_FLAGS_PATHMUSTEXIST | GWEN_PATH_FLAGS_VARIABLE)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Path \"%s\" does not exist", path); return 0; } /* file exists, load it */ db=GWEN_DB_Group_new("cfg"); if (GWEN_DB_ReadFile(db, path, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not read file \"%s\"", path); GWEN_DB_Group_free(db); return 0; } return db; } int AH_HBCI_SaveMessage(AH_HBCI *hbci, const AB_USER *u, GWEN_DB_NODE *dbMsg) { GWEN_BUFFER *nbuf; int rv; assert(hbci); assert(u); /* create path */ nbuf=GWEN_Buffer_new(0, 64, 0, 1); AH_HBCI_AddCustomerPath(hbci, u, nbuf); GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "messages" AH_PATH_SEP "in" AH_PATH_SEP); AH_HBCI_AppendUniqueName(hbci, nbuf); GWEN_Buffer_AppendString(nbuf, ".msg"); rv=AH_HBCI_SaveSettings(GWEN_Buffer_GetStart(nbuf), dbMsg); GWEN_Buffer_free(nbuf); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not save message"); return -1; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message for customer saved"); return 0; } int AH_HBCI_AddBankPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf) { const char *country; const char *bankId; assert(hbci); assert(nbuf); country=AB_User_GetCountry(u); if (!country) country="de"; bankId=AB_User_GetBankCode(u); assert(bankId); AB_Provider_GetUserDataDir(hbci->provider, nbuf); GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "banks" AH_PATH_SEP); while(*country) GWEN_Buffer_AppendByte(nbuf, tolower(*(country++))); GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP); GWEN_Buffer_AppendString(nbuf, bankId); return 0; } int AH_HBCI_AddUserPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf) { const char *userId; assert(hbci); assert(u); if (AH_HBCI_AddBankPath(hbci, u, nbuf)) return -1; userId=AB_User_GetUserId(u); GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "users" AH_PATH_SEP); /* escape and append user name */ if (GWEN_Path_Convert(userId, nbuf, GWEN_PATH_FLAGS_ESCAPE | GWEN_PATH_FLAGS_TOLERANT_ESCAPE)) { return -1; } return 0; } int AH_HBCI_AddCustomerPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf) { const char *customerId; assert(hbci); assert(u); if (AH_HBCI_AddUserPath(hbci, u, nbuf)) return -1; GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP); /* escape and append customer name */ customerId=AB_User_GetCustomerId(u); if (GWEN_Path_Convert(customerId, nbuf, GWEN_PATH_FLAGS_ESCAPE | GWEN_PATH_FLAGS_TOLERANT_ESCAPE)) { return -1; } return 0; } int AH_HBCI_AddObjectPath(const AH_HBCI *hbci, const char *country, const char *bankId, const char *accountId, const char *userId, const char *customerId, GWEN_BUFFER *nbuf) { assert(hbci); AB_Provider_GetUserDataDir(hbci->provider, nbuf); GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "banks" AH_PATH_SEP); if (country==0) return 0; GWEN_Buffer_AppendString(nbuf, country); if (!bankId) return 0; GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP); GWEN_Buffer_AppendString(nbuf, bankId); if (accountId) { GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "accounts" AH_PATH_SEP); if (GWEN_Path_Convert(accountId, nbuf, GWEN_PATH_FLAGS_ESCAPE | GWEN_PATH_FLAGS_TOLERANT_ESCAPE)) { return -1; } } else { /* escape and append user name */ if (!userId) return 0; GWEN_Buffer_AppendString(nbuf, AH_PATH_SEP "users" AH_PATH_SEP); if (GWEN_Path_Convert(userId, nbuf, GWEN_PATH_FLAGS_ESCAPE | GWEN_PATH_FLAGS_TOLERANT_ESCAPE)) { return -1; } /* escape and append customer name */ if (!customerId) return 0; if (GWEN_Path_Convert(customerId, nbuf, GWEN_PATH_FLAGS_ESCAPE | GWEN_PATH_FLAGS_TOLERANT_ESCAPE)) { return -1; } } return 0; } int AH_HBCI_CheckStringSanity(const char *s) { assert(s); while(*s) { if (iscntrl(*s) || isspace(*s)) { return -1; } s++; } /* while */ return 0; } AB_PROVIDER *AH_HBCI_GetProvider(const AH_HBCI *hbci) { assert(hbci); return hbci->provider; } GWEN_DB_NODE *AH_HBCI_GetSharedRuntimeData(const AH_HBCI *hbci){ assert(hbci); return hbci->sharedRuntimeData; } int AH_HBCI_GetTransferTimeout(const AH_HBCI *hbci) { assert(hbci); return hbci->transferTimeout; } void AH_HBCI_SetTransferTimeout(AH_HBCI *hbci, int i){ assert(hbci); hbci->transferTimeout=i; } int AH_HBCI_GetConnectTimeout(const AH_HBCI *hbci) { assert(hbci); return hbci->connectTimeout; } void AH_HBCI_SetConnectTimeout(AH_HBCI *hbci, int i){ assert(hbci); hbci->connectTimeout=i; } uint32_t AH_HBCI_GetLastVersion(const AH_HBCI *hbci) { assert(hbci); return hbci->lastVersion; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/Makefile.in0000644000175000017500000006626512643540057023722 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/msglayer DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libhbcimsg_la_LIBADD = am_libhbcimsg_la_OBJECTS = account.lo bpd.lo dialog.lo hbci.lo \ hbci-updates.lo message.lo msgengine.lo user.lo libhbcimsg_la_OBJECTS = $(am_libhbcimsg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libhbcimsg_la_SOURCES) DIST_SOURCES = $(libhbcimsg_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ \ -DAH_XMLDATADIR=\"$(aqbanking_data_searchdir)/aqbanking/backends/aqhbci\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../banking \ -I$(srcdir)/../applayer \ -I$(srcdir)/../joblayer \ -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST = \ msgcrypt.inc \ msgcrypt_ddv.c \ msgcrypt_rdh.c \ msgcrypt_rdh1.c \ msgcrypt_rdh2.c \ msgcrypt_rdh3.c \ msgcrypt_rdh5.c \ msgcrypt_rdh10.c \ msgcrypt_pintan.c \ dialog_hbci.c \ dialog_https.c noinst_LTLIBRARIES = libhbcimsg.la noinst_HEADERS = \ account_p.h \ account_l.h \ bpd_l.h \ bpd_p.h \ dialog_l.h \ dialog_p.h \ hbci_l.h \ hbci_p.h \ hbci-updates_l.h \ hbci-updates_p.h \ message_l.h \ message_p.h \ msgengine_l.h \ msgengine_p.h \ user_p.h \ user_l.h iheaderdir = @aqbanking_headerdir_am@/aqhbci iheader_HEADERS = \ account.h \ msgengine.h \ user.h libhbcimsg_la_SOURCES = \ account.c \ bpd.c \ dialog.c \ hbci.c \ hbci-updates.c \ message.c \ msgengine.c \ user.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/msglayer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/msglayer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libhbcimsg.la: $(libhbcimsg_la_OBJECTS) $(libhbcimsg_la_DEPENDENCIES) $(EXTRA_libhbcimsg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libhbcimsg_la_OBJECTS) $(libhbcimsg_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/account.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bpd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hbci-updates.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hbci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgengine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS sources: for f in $(libhbcimsg_la_SOURCES) $(EXTRA_DIST); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done types: $(typefiles) typemaker -d AQHBCI_API $(typefiles) # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/message_p.h0000644000175000017500000000761012364015477023761 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_MESSAGE_P_H #define AH_MESSAGE_P_H #define AH_MSG_DEFAULTSIZE 512 #define AH_MSG_DEFAULTRESERVE 256 #define AH_MSG_DEFAULTSTEP 512 #include "message_l.h" struct AH_MSG { GWEN_LIST_ELEMENT(AH_MSG); AH_DIALOG *dialog; GWEN_BUFFER *buffer; GWEN_BUFFER *origbuffer; GWEN_STRINGLIST *signerIdList; char *crypterId; char *expectedSigner; char *expectedCrypter; unsigned int hbciVersion; int secProfile; int secClass; unsigned int nodes; unsigned int firstSegment; unsigned int lastSegment; unsigned int msgNum; unsigned int refMsgNum; int enableInsert; int hasWarnings; int hasErrors; int resultCode; char *resultText; char *resultParam; char *usedTan; int needTan; int noSysId; char *usedPin; int itanMethod; int itanHashMode; GWEN_BUFFER *itanHashBuffer; GWEN_DB_NODE *decodedMsg; }; static void AH_Msg_SetPin(AH_MSG *hmsg, const char *s); static int AH_Msg_AddMsgTail(AH_MSG *hmsg); static int AH_Msg_AddMsgHead(AH_MSG *hmsg); static int AH_Msg_ReadSegment(AH_MSG *hmsg, GWEN_MSGENGINE *e, const char *gtype, GWEN_BUFFER *mbuf, GWEN_DB_NODE *gr, unsigned int flags); static int AH_Msg_ReadMessage(AH_MSG *hmsg, GWEN_MSGENGINE *e, const char *gtype, GWEN_BUFFER *mbuf, GWEN_DB_NODE *gr, unsigned int flags); static int AH_Msg_SequenceCheck(GWEN_DB_NODE *gr); static int AH_Msg__Sign(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg__Encrypt(AH_MSG *hmsg); static int AH_Msg__Decrypt(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg__Verify(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_SignRdh(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg_EncryptRdh(AH_MSG *hmsg); static int AH_Msg_DecryptRdh(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_VerifyRdh(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_SignRdh1(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg_EncryptRdh1(AH_MSG *hmsg); static int AH_Msg_DecryptRdh1(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_VerifyRdh1(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_SignRdh2(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg_EncryptRdh2(AH_MSG *hmsg); static int AH_Msg_DecryptRdh2(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_VerifyRdh2(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_SignRdh3(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg_EncryptRdh3(AH_MSG *hmsg); static int AH_Msg_DecryptRdh3(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_VerifyRdh3(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_SignRdh5(AH_MSG *hmsg, AB_USER *su, GWEN_BUFFER *rawBuf, const char *signer); static int AH_Msg_EncryptRdh5(AH_MSG *hmsg); static int AH_Msg_DecryptRdh5(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg_VerifyRdh5(AH_MSG *hmsg, GWEN_DB_NODE *gr); static int AH_Msg__AnonHnsha(const char *psegment, unsigned int slen, GWEN_SYNCIO *sio); static int AH_Msg__AnonHkpae(const char *psegment, unsigned int slen, GWEN_SYNCIO *sio); #endif /* AH_MESSAGE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh.c0000644000175000017500000000617212364015477024520 00000000000000/*************************************************************************** begin : Tue Nov 25 2008 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_Msg_SignRdh(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer) { AB_USER *su; int rv; assert(hmsg); su=AB_Banking_FindUser(AH_HBCI_GetBankingApi(AH_Dialog_GetHbci(hmsg->dialog)), AH_PROVIDER_NAME, "de", "*", signer, "*"); if (!su) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown user \"%s\"", signer); return GWEN_ERROR_NOT_FOUND; } switch(AH_User_GetRdhType(su)) { case 0: case 1: rv=AH_Msg_SignRdh1(hmsg, su, rawBuf, signer); break; case 2: rv=AH_Msg_SignRdh2(hmsg, su, rawBuf, signer); break; case 3: rv=AH_Msg_SignRdh3(hmsg, su, rawBuf, signer); break; case 5: rv=AH_Msg_SignRdh5(hmsg, su, rawBuf, signer); break; case 10: rv=AH_Msg_SignRdh10(hmsg, su, rawBuf, signer); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH %d not supported", AH_User_GetRdhType(su)); rv=GWEN_ERROR_INVALID; } return rv; } int AH_Msg_EncryptRdh(AH_MSG *hmsg) { AB_USER *u; int rv; assert(hmsg); u=AH_Dialog_GetDialogOwner(hmsg->dialog); switch(AH_User_GetRdhType(u)) { case 0: case 1: rv=AH_Msg_EncryptRdh1(hmsg); break; case 2: rv=AH_Msg_EncryptRdh2(hmsg); break; case 3: rv=AH_Msg_EncryptRdh3(hmsg); break; case 5: rv=AH_Msg_EncryptRdh5(hmsg); break; case 10: rv=AH_Msg_EncryptRdh10(hmsg); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH %d not supported", AH_User_GetRdhType(u)); rv=GWEN_ERROR_INVALID; } return rv; } int AH_Msg_DecryptRdh(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AB_USER *u; int rv; assert(hmsg); u=AH_Dialog_GetDialogOwner(hmsg->dialog); switch(AH_User_GetRdhType(u)) { case 0: case 1: rv=AH_Msg_DecryptRdh1(hmsg, gr); break; case 2: rv=AH_Msg_DecryptRdh2(hmsg, gr); break; case 3: rv=AH_Msg_DecryptRdh3(hmsg, gr); break; case 5: rv=AH_Msg_DecryptRdh5(hmsg, gr); break; case 10: rv=AH_Msg_DecryptRdh10(hmsg, gr); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH %d not supported", AH_User_GetRdhType(u)); rv=GWEN_ERROR_INVALID; } return rv; } int AH_Msg_VerifyRdh(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AB_USER *u; int rv; assert(hmsg); u=AH_Dialog_GetDialogOwner(hmsg->dialog); switch(AH_User_GetRdhType(u)) { case 0: case 1: rv=AH_Msg_VerifyRdh1(hmsg, gr); break; case 2: rv=AH_Msg_VerifyRdh2(hmsg, gr); break; case 3: rv=AH_Msg_VerifyRdh3(hmsg, gr); break; case 5: rv=AH_Msg_VerifyRdh5(hmsg, gr); break; case 10: rv=AH_Msg_VerifyRdh10(hmsg, gr); break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH %d not supported", AH_User_GetRdhType(u)); rv=GWEN_ERROR_INVALID; } return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgengine.h0000644000175000017500000000246612364015477023776 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_MSGENGINE_H #define AH_MSGENGINE_H /** @defgroup G_AB_BE_AQHBCI_MSGENGINE HBCI Message Engine * @ingroup G_AB_BE_AQHBCI * @short HBCI-specific message engine extension * @author Martin Preuss * * This is an extension for @ref GWEN_MSGENGINE which additionally supports * some HBCI types (like date, time, DTAUS binary type, SWIFT binary type * etc). * It is used by AqHBCI internally and by the tool hbcixml2. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif typedef struct AH_MSGENGINE AH_MSGENGINE; #ifdef __cplusplus } #endif #include #include #include #ifdef __cplusplus extern "C" { #endif AQHBCI_API GWEN_MSGENGINE *AH_MsgEngine_new(); #ifdef __cplusplus } #endif /*@}*/ #endif /* AH_MSGENGINE_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/dialog_p.h0000644000175000017500000000333012364015477023567 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef GWHBCI_DIALOG_P_H #define GWHBCI_DIALOG_P_H #include "dialog_l.h" #include #include struct AH_DIALOG { uint32_t lastMsgNum; uint32_t lastReceivedMsgNum; char *dialogId; AB_USER *dialogOwner; GWEN_MSGENGINE *msgEngine; GWEN_SYNCIO *ioLayer; GWEN_HTTP_SESSION *httpSession; uint32_t flags; uint32_t usage; GWEN_DB_NODE *globalValues; char *logName; uint32_t itanMethod; int itanProcessType; int tanJobVersion; AH_TAN_METHOD *tanMethodDescription; }; static int AH_Dialog_SendPacket(AH_DIALOG *dlg, const char *buf, int blen); static int AH_Dialog_CreateIoLayer_Hbci(AH_DIALOG *dlg); static int AH_Dialog_Connect_Hbci(AH_DIALOG *dlg); static int AH_Dialog_Disconnect_Hbci(AH_DIALOG *dlg); static int AH_Dialog_SendPacket_Hbci(AH_DIALOG *dlg, const char *buf, int blen); static int AH_Dialog_RecvMessage_Hbci(AH_DIALOG *dlg, AH_MSG **pMsg); static int AH_Dialog_CreateIoLayer_Https(AH_DIALOG *dlg); static int AH_Dialog_Connect_Https(AH_DIALOG *dlg); static int AH_Dialog_Disconnect_Https(AH_DIALOG *dlg); static int AH_Dialog_SendPacket_Https(AH_DIALOG *dlg, const char *buf, int blen); static int AH_Dialog_RecvMessage_Https(AH_DIALOG *dlg, AH_MSG **pMsg); #endif /* GWHBCI_DIALOG_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/Makefile.am0000644000175000017500000000244012364015477023675 00000000000000 AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../banking \ -I$(srcdir)/../applayer \ -I$(srcdir)/../joblayer \ -I$(aqbanking_symlinkdir) $(all_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST=\ msgcrypt.inc \ msgcrypt_ddv.c \ msgcrypt_rdh.c \ msgcrypt_rdh1.c \ msgcrypt_rdh2.c \ msgcrypt_rdh3.c \ msgcrypt_rdh5.c \ msgcrypt_rdh10.c \ msgcrypt_pintan.c \ dialog_hbci.c \ dialog_https.c DEFS+=-DAH_XMLDATADIR=\"$(aqbanking_data_searchdir)/aqbanking/backends/aqhbci\" noinst_LTLIBRARIES=libhbcimsg.la noinst_HEADERS=\ account_p.h \ account_l.h \ bpd_l.h \ bpd_p.h \ dialog_l.h \ dialog_p.h \ hbci_l.h \ hbci_p.h \ hbci-updates_l.h \ hbci-updates_p.h \ message_l.h \ message_p.h \ msgengine_l.h \ msgengine_p.h \ user_p.h \ user_l.h iheaderdir=@aqbanking_headerdir_am@/aqhbci iheader_HEADERS=\ account.h \ msgengine.h \ user.h libhbcimsg_la_SOURCES=\ account.c \ bpd.c \ dialog.c \ hbci.c \ hbci-updates.c \ message.c \ msgengine.c \ user.c sources: for f in $(libhbcimsg_la_SOURCES) $(EXTRA_DIST); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done types: $(typefiles) typemaker -d AQHBCI_API $(typefiles) aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/account.h0000644000175000017500000000441712364015477023454 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ACCOUNT_H #define AH_ACCOUNT_H #include /* for AQHBCI_API */ #include /** @defgroup G_AB_BE_AQHBCI_Account HBCI Account Extensions * @ingroup G_AB_BE_AQHBCI * @short HBCI-specific user functions * @author Martin Preuss * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Flags * */ /*@{*/ /** Prefer single transfers over multi transfers for this account */ #define AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER 0x00000001 /** Prefer single debit notes over multi debit notes for this account */ #define AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE 0x00000002 /* for this account there are KTV2 information availabel (e.g. account sub id) */ #define AH_BANK_FLAGS_KTV2 0x00000004 /* this account can be used with SEPA jobs */ #define AH_BANK_FLAGS_SEPA 0x00000008 /** Prefer single transfers over multi transfers for this account (SEPA) */ #define AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER 0x00000010 /** Prefer single debit notes over multi debit notes for this account (SEPA) */ #define AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE 0x00000020 #define AH_BANK_FLAGS_DEFAULT 0 /*@}*/ /** @name Flag Manipulation Functions * * See @ref AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER and following. */ /*@{*/ AQHBCI_API void AH_Account_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags); AQHBCI_API uint32_t AH_Account_Flags_fromDb(GWEN_DB_NODE *db, const char *name); AQHBCI_API uint32_t AH_Account_GetFlags(const AB_ACCOUNT *a); AQHBCI_API void AH_Account_SetFlags(AB_ACCOUNT *a, uint32_t flags); AQHBCI_API void AH_Account_AddFlags(AB_ACCOUNT *a, uint32_t flags); AQHBCI_API void AH_Account_SubFlags(AB_ACCOUNT *a, uint32_t flags); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AH_ACCOUNT_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgengine_p.h0000644000175000017500000000377512364015477024321 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_MSGENGINE_P_H #define AH_MSGENGINE_P_H #include "msgengine_l.h" struct AH_MSGENGINE { AB_USER *user; }; static int AH_MsgEngine_TypeRead(GWEN_MSGENGINE *e, GWEN_BUFFER *msgbuf, GWEN_XMLNODE *node, GWEN_BUFFER *vbuf, char escapeChar, const char *delimiters); static int AH_MsgEngine_TypeWrite(GWEN_MSGENGINE *e, GWEN_BUFFER *gbuf, GWEN_BUFFER *data, GWEN_XMLNODE *node); static GWEN_DB_NODE_TYPE AH_MsgEngine_TypeCheck(GWEN_MSGENGINE *e, const char *tname); static int AH_MsgEngine_BinTypeWrite(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *dbuf); static const char *AH_MsgEngine_GetCharValue(GWEN_MSGENGINE *e, const char *name, const char *defValue); static int AH_MsgEngine_GetIntValue(GWEN_MSGENGINE *e, const char *name, int defValue); static AH_MSGENGINE *AH_MsgEngine_Data_new(); static void AH_MsgEngine_Data_free(AH_MSGENGINE *x); static void GWENHYWFAR_CB AH_MsgEngine_FreeData(void *bp, void *p); #endif /* AH_MSGENGINE_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c0000644000175000017500000002147412364015477024476 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /* this file is included from dialog.c" */ int AH_Dialog_CreateIoLayer_Https(AH_DIALOG *dlg) { const GWEN_URL *url; int rv; GWEN_HTTP_SESSION *sess; GWEN_BUFFER *tbuf; uint32_t flags; const char *s; assert(dlg); /* take bank addr from user */ url=AH_User_GetServerUrl(dlg->dialogOwner); if (!url) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User has no valid address settings"); return GWEN_ERROR_INVALID; } tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Url_toString(url, tbuf); sess=AB_HttpSession_new(AB_User_GetProvider(dlg->dialogOwner), dlg->dialogOwner, GWEN_Buffer_GetStart(tbuf), "https", 443); GWEN_Buffer_free(tbuf); /* setup session */ flags=AH_User_GetFlags(dlg->dialogOwner); if (flags & AH_USER_FLAGS_FORCE_SSL3) GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_FORCE_SSL3); if (flags & AH_USER_FLAGS_TLS_ONLY_SAFE_CIPHERS) GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_TLS_ONLY_SAFE_CIPHERS); GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_NO_CACHE); s=AH_User_GetHttpContentType(dlg->dialogOwner); if (s && *s) GWEN_HttpSession_SetHttpContentType(sess, s); s=AH_User_GetHttpUserAgent(dlg->dialogOwner); if (s && *s) GWEN_HttpSession_SetHttpUserAgent(sess, s); GWEN_HttpSession_SetHttpVMajor(sess, AH_User_GetHttpVMajor(dlg->dialogOwner)); GWEN_HttpSession_SetHttpVMinor(sess, AH_User_GetHttpVMinor(dlg->dialogOwner)); /* init session */ rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } dlg->httpSession=sess; return 0; } int AH_Dialog_Connect_Https(AH_DIALOG *dlg) { if (dlg->httpSession==NULL) { int rv; rv=AH_Dialog_CreateIoLayer_Https(dlg); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } return 0; } int AH_Dialog_Disconnect_Https(AH_DIALOG *dlg) { if (dlg->httpSession) { GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; } return 0; } int AH_Dialog_SendPacket_Https(AH_DIALOG *dlg, const char *buf, int blen) { int rv; GWEN_BUFFER *tbuf; uint32_t fl; fl=AH_User_GetFlags(dlg->dialogOwner); /* possibly base64 encode message */ tbuf=GWEN_Buffer_new(0, blen, 0, 1); if (fl & AH_USER_FLAGS_NO_BASE64) { DBG_INFO(AQHBCI_LOGDOMAIN, "Not encoding message using BASE64"); GWEN_Buffer_AppendBytes(tbuf, buf, blen); } else { rv=GWEN_Base64_Encode((const unsigned char*)buf, blen, tbuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not BASE64 encode data (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } GWEN_Buffer_AppendString(tbuf, "\r\n"); } rv=GWEN_HttpSession_SendPacket(dlg->httpSession, "POST", (const uint8_t*) GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Message sent."); return 0; } int AH_Dialog_RecvMessage_Https(AH_DIALOG *dlg, AH_MSG **pMsg) { GWEN_BUFFER *tbuf; AH_MSG *msg; int rv; const char *p; unsigned int i; char c; char *p1; char *p2; int msgSize; tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* read HBCI message */ rv=GWEN_HttpSession_RecvPacket(dlg->httpSession, tbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } else if (rv==0) { /* not a HTTP code */ DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return GWEN_ERROR_INTERNAL; } else if (!(rv>=200 && rv<=299)) { /* not a HTTP: ok code */ DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } /* optionally decode BASE64 encoded message */ if (strstr(GWEN_Buffer_GetStart(tbuf), "HNHBK:")==NULL) { GWEN_BUFFER *bbuf; bbuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(tbuf), 0, 1); rv=GWEN_Base64_Decode((const unsigned char*) GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), bbuf); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not decode BASE64 message (%d)", rv); /* for debugging purposes */ GWEN_Buffer_Dump(tbuf, 2); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not BASE64-decode the message")); GWEN_Buffer_free(bbuf); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } GWEN_Buffer_free(tbuf); tbuf=bbuf; if (strstr(GWEN_Buffer_GetStart(tbuf), "HNHBK:")==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "Received message is not HBCI"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Received message is not HBCI")); /* for debugging purposes */ GWEN_Buffer_Dump(tbuf, 2); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return rv; } } /* trim response */ i=GWEN_Buffer_GetUsedBytes(tbuf); p=GWEN_Buffer_GetStart(tbuf); while(i>0) { if (p[i-1]!=0) break; i--; } GWEN_Buffer_Crop(tbuf, 0, i); /* seek to begin of size */ p1=strchr(GWEN_Buffer_GetStart(tbuf), '+'); if (p1==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad data (missing '+')"); /* for debugging purposes */ GWEN_Buffer_Dump(tbuf, 2); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return GWEN_ERROR_BAD_DATA; } p1++; /* seek to end of size */ p2=strchr(p1, '+'); if (p2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad data (missing '+')"); /* for debugging purposes */ GWEN_Buffer_Dump(tbuf, 2); GWEN_Buffer_free(tbuf); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return GWEN_ERROR_BAD_DATA; } /* read message size */ c=*p2; *p2=0; if (1!=sscanf(p1, "%d", &msgSize)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad size field [%s]", p1); /* for debugging purposes */ GWEN_Buffer_Dump(tbuf, 2); GWEN_Buffer_free(tbuf); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Unparsable message received")); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return GWEN_ERROR_BAD_DATA; } *p2=c; /* check message size */ if (GWEN_Buffer_GetUsedBytes(tbuf)httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; return GWEN_ERROR_BAD_DATA; } msg=AH_Msg_new(dlg); AH_Msg_SetBuffer(msg, tbuf); *pMsg=msg; return 0; } int AH_Dialog_TestServer_Https(AH_DIALOG *dlg) { int rv; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Preparing connection")); rv=AH_Dialog_CreateIoLayer_Https(dlg); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not create io layer (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error preparing connection")); return rv; } rv=GWEN_HttpSession_ConnectionTest(dlg->httpSession); GWEN_HttpSession_Fini(dlg->httpSession); GWEN_HttpSession_free(dlg->httpSession); dlg->httpSession=NULL; if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/dialog.c0000644000175000017500000001602712364015477023252 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif /* #define AH_DIALOG_HEAVY_DEBUG */ #include "dialog_p.h" #include "aqhbci_l.h" #include "hbci_l.h" #include "user_l.h" #include "msgengine_l.h" #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define AH_PATH_SEP "\\" #else # define AH_PATH_SEP "/" #endif AH_DIALOG *AH_Dialog_new(AB_USER *u) { AH_DIALOG *dlg; AH_HBCI *h; GWEN_BUFFER *pbuf; assert(u); h=AH_User_GetHbci(u); GWEN_NEW_OBJECT(AH_DIALOG, dlg); dlg->usage=1; dlg->globalValues=GWEN_DB_Group_new("globalValues"); dlg->dialogId=strdup("0"); dlg->msgEngine=AH_User_GetMsgEngine(u); GWEN_MsgEngine_Attach(dlg->msgEngine); dlg->dialogOwner=u; /* create path */ pbuf=GWEN_Buffer_new(0, 256, 0, 1); if (AH_HBCI_AddBankPath(h, u, pbuf)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add bank path, cannot log"); GWEN_Buffer_free(pbuf); } else { GWEN_Buffer_AppendString(pbuf, AH_PATH_SEP "logs" AH_PATH_SEP); AH_HBCI_AppendUniqueName(h, pbuf); GWEN_Buffer_AppendString(pbuf, ".log"); dlg->logName=strdup(GWEN_Buffer_GetStart(pbuf)); } GWEN_Buffer_free(pbuf); return dlg; } void AH_Dialog_Attach(AH_DIALOG *dlg){ assert(dlg); dlg->usage++; } void AH_Dialog_free(AH_DIALOG *dlg){ if (dlg) { assert(dlg->usage); if (--(dlg->usage)==0) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Destroying AH_DIALOG"); GWEN_SyncIo_free(dlg->ioLayer); GWEN_HttpSession_free(dlg->httpSession); free(dlg->dialogId); free(dlg->logName); GWEN_MsgEngine_free(dlg->msgEngine); GWEN_DB_Group_free(dlg->globalValues); AH_TanMethod_free(dlg->tanMethodDescription); GWEN_FREE_OBJECT(dlg); } } } const char *AH_Dialog_GetLogFile(const AH_DIALOG *dlg){ assert(dlg); return dlg->logName; } uint32_t AH_Dialog_GetNextMsgNum(AH_DIALOG *dlg){ assert(dlg); return ++dlg->lastMsgNum; } uint32_t AH_Dialog_GetLastReceivedMsgNum(const AH_DIALOG *dlg){ assert(dlg); return dlg->lastReceivedMsgNum; } const char *AH_Dialog_GetDialogId(const AH_DIALOG *dlg){ assert(dlg); return dlg->dialogId; } void AH_Dialog_SetDialogId(AH_DIALOG *dlg, const char *s){ assert(dlg); free(dlg->dialogId); if (s) dlg->dialogId=strdup(s); else dlg->dialogId=0; } AB_USER *AH_Dialog_GetDialogOwner(const AH_DIALOG *dlg){ assert(dlg); return dlg->dialogOwner; } GWEN_MSGENGINE *AH_Dialog_GetMsgEngine(const AH_DIALOG *dlg){ assert(dlg); assert(dlg->msgEngine); return dlg->msgEngine; } int AH_Dialog_CheckReceivedMsgNum(AH_DIALOG *dlg, uint32_t msgnum){ assert(dlg); if (msgnum!=dlg->lastReceivedMsgNum+1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Continuity error in received message " "(expected %d, got %d)", dlg->lastReceivedMsgNum+1, msgnum); return -1; } dlg->lastReceivedMsgNum++; return 0; } uint32_t AH_Dialog_GetFlags(const AH_DIALOG *dlg){ assert(dlg); return dlg->flags; } void AH_Dialog_SetFlags(AH_DIALOG *dlg, uint32_t f){ assert(dlg); dlg->flags=f; } GWEN_DB_NODE *AH_Dialog_GetGlobalValues(const AH_DIALOG *dlg){ assert(dlg); return dlg->globalValues; } void AH_Dialog_AddFlags(AH_DIALOG *dlg, uint32_t f){ assert(dlg); dlg->flags|=f; } void AH_Dialog_SubFlags(AH_DIALOG *dlg, uint32_t f){ assert(dlg); dlg->flags&=~f; } AH_HBCI *AH_Dialog_GetHbci(const AH_DIALOG *dlg) { assert(dlg); return AH_User_GetHbci(dlg->dialogOwner); } AB_BANKING *AH_Dialog_GetBankingApi(const AH_DIALOG *dlg) { return AH_HBCI_GetBankingApi(AH_Dialog_GetHbci(dlg)); } uint32_t AH_Dialog_GetLastMsgNum(const AH_DIALOG *dlg){ assert(dlg); return dlg->lastMsgNum; } /* network stuff */ int AH_Dialog_RecvMessage(AH_DIALOG *dlg, AH_MSG **pMsg) { assert(dlg); if (AH_User_GetCryptMode(dlg->dialogOwner)==AH_CryptMode_Pintan) return AH_Dialog_RecvMessage_Https(dlg, pMsg); else return AH_Dialog_RecvMessage_Hbci(dlg, pMsg); } int AH_Dialog_SendPacket(AH_DIALOG *dlg, const char *buf, int blen) { assert(dlg); if (AH_User_GetCryptMode(dlg->dialogOwner)==AH_CryptMode_Pintan) return AH_Dialog_SendPacket_Https(dlg, buf, blen); else return AH_Dialog_SendPacket_Hbci(dlg, buf, blen); } int AH_Dialog_SendMessage(AH_DIALOG *dlg, AH_MSG *msg) { int rv; GWEN_BUFFER *mbuf; assert(dlg); assert(msg); if (AH_Msg_GetDialog(msg)!=dlg) { DBG_WARN(AQHBCI_LOGDOMAIN, "Message wasn't created for this dialog !"); return GWEN_ERROR_INVALID; } mbuf=AH_Msg_GetBuffer(msg); assert(mbuf); rv=AH_Dialog_SendPacket(dlg, GWEN_Buffer_GetStart(mbuf), GWEN_Buffer_GetUsedBytes(mbuf)); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error sending message for dialog (%d)", rv); return rv; } DBG_DEBUG(AQHBCI_LOGDOMAIN, "Message sent"); return 0; } int AH_Dialog_Connect(AH_DIALOG *dlg) { AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR); if (AH_User_GetCryptMode(dlg->dialogOwner)==AH_CryptMode_Pintan) return AH_Dialog_Connect_Https(dlg); else return AH_Dialog_Connect_Hbci(dlg); } int AH_Dialog_Disconnect(AH_DIALOG *dlg) { if (AH_User_GetCryptMode(dlg->dialogOwner)==AH_CryptMode_Pintan) return AH_Dialog_Disconnect_Https(dlg); else return AH_Dialog_Disconnect_Hbci(dlg); } void AH_Dialog_SetItanMethod(AH_DIALOG *dlg, uint32_t i) { assert(dlg); dlg->itanMethod=i; } uint32_t AH_Dialog_GetItanMethod(const AH_DIALOG *dlg) { assert(dlg); return dlg->itanMethod; } int AH_Dialog_GetItanProcessType(const AH_DIALOG *dlg) { assert(dlg); return dlg->itanProcessType; } void AH_Dialog_SetItanProcessType(AH_DIALOG *dlg, int i) { assert(dlg); dlg->itanProcessType=i; } int AH_Dialog_GetTanJobVersion(const AH_DIALOG *dlg) { assert(dlg); return dlg->tanJobVersion; } void AH_Dialog_SetTanJobVersion(AH_DIALOG *dlg, int i) { assert(dlg); dlg->tanJobVersion=i; } const AH_TAN_METHOD *AH_Dialog_GetTanMethodDescription(const AH_DIALOG *dlg) { assert(dlg); return dlg->tanMethodDescription; } void AH_Dialog_SetTanMethodDescription(AH_DIALOG *dlg, const AH_TAN_METHOD *tm) { assert(dlg); AH_TanMethod_free(dlg->tanMethodDescription); if (tm) dlg->tanMethodDescription=AH_TanMethod_dup(tm); else dlg->tanMethodDescription=NULL; } #include "dialog_hbci.c" #include "dialog_https.c" aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/dialog_l.h0000644000175000017500000000574512364015477023577 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef GWHBCI_DIALOG_L_H #define GWHBCI_DIALOG_L_H typedef struct AH_DIALOG AH_DIALOG; #define AH_DIALOG_FLAGS_INITIATOR 0x0001 #define AH_DIALOG_FLAGS_OPEN 0x0002 #define AH_DIALOG_FLAGS_AUTHENTICATED 0x0004 #define AH_DIALOG_FLAGS_SECURED 0x0008 #define AH_DIALOG_FLAGS_ANONYMOUS 0x0010 #define AH_DIALOG_FLAGS_HAVEKEYS 0x0020 #include "hbci_l.h" #include "message_l.h" #include "tanmethod.h" #include #include #include #include #include #include #include AH_DIALOG *AH_Dialog_new(AB_USER *owner); void AH_Dialog_free(AH_DIALOG *dlg); void AH_Dialog_Attach(AH_DIALOG *dlg); AB_BANKING *AH_Dialog_GetBankingApi(const AH_DIALOG *dlg); int AH_Dialog_Connect(AH_DIALOG *dlg); int AH_Dialog_Disconnect(AH_DIALOG *dlg); uint32_t AH_Dialog_GetFlags(const AH_DIALOG *dlg); void AH_Dialog_SetFlags(AH_DIALOG *dlg, uint32_t f); void AH_Dialog_AddFlags(AH_DIALOG *dlg, uint32_t f); void AH_Dialog_SubFlags(AH_DIALOG *dlg, uint32_t f); const char *AH_Dialog_GetLogFile(const AH_DIALOG *dlg); uint32_t AH_Dialog_GetNextMsgNum(AH_DIALOG *dlg); uint32_t AH_Dialog_GetLastMsgNum(const AH_DIALOG *dlg); uint32_t AH_Dialog_GetLastReceivedMsgNum(const AH_DIALOG *dlg); const char *AH_Dialog_GetDialogId(const AH_DIALOG *dlg); void AH_Dialog_SetDialogId(AH_DIALOG *dlg, const char *s); AB_USER *AH_Dialog_GetDialogOwner(const AH_DIALOG *dlg); GWEN_MSGENGINE *AH_Dialog_GetMsgEngine(const AH_DIALOG *dlg); void AH_Dialog_SetMsgEngine(AH_DIALOG *dlg, GWEN_MSGENGINE *e); GWEN_DB_NODE *AH_Dialog_GetGlobalValues(const AH_DIALOG *dlg); int AH_Dialog_CheckReceivedMsgNum(AH_DIALOG *dlg, uint32_t msgnum); int AH_Dialog_RecvMessage(AH_DIALOG *dlg, AH_MSG **pMsg); int AH_Dialog_SendMessage(AH_DIALOG *dlg, AH_MSG *msg); AH_HBCI *AH_Dialog_GetHbci(const AH_DIALOG *dlg); void AH_Dialog_SetItanMethod(AH_DIALOG *dlg, uint32_t i); uint32_t AH_Dialog_GetItanMethod(const AH_DIALOG *dlg); int AH_Dialog_GetItanProcessType(const AH_DIALOG *dlg); void AH_Dialog_SetItanProcessType(AH_DIALOG *dlg, int i); int AH_Dialog_GetTanJobVersion(const AH_DIALOG *dlg); void AH_Dialog_SetTanJobVersion(AH_DIALOG *dlg, int i); const AH_TAN_METHOD *AH_Dialog_GetTanMethodDescription(const AH_DIALOG *dlg); void AH_Dialog_SetTanMethodDescription(AH_DIALOG *dlg, const AH_TAN_METHOD *tm); int AH_Dialog_TestServer_Https(AH_DIALOG *dlg); #endif /* GWHBCI_DIALOG_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/account_p.h0000644000175000017500000000151512364015477023767 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_ACCOUNT_P_H #define AH_ACCOUNT_P_H #include "hbci_l.h" #include "account_l.h" typedef struct AH_ACCOUNT AH_ACCOUNT; struct AH_ACCOUNT { AH_HBCI *hbci; uint32_t flags; }; static void GWENHYWFAR_CB AH_Account_freeData(void *bp, void *p); static void AH_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); static void AH_Account_toDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); #endif /* AH_ACCOUNT_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci_l.h0000644000175000017500000000754312364015477023243 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef GWHBCI_HBCI_L_H #define GWHBCI_HBCI_L_H #include #include #include #include #include #include typedef struct AH_HBCI AH_HBCI; #include #include #define AH_DEFAULT_KEYLEN 768 #define AH_HBCI_LAST_VERSION_NONE 0xffffffff int AH_HBCI_AddObjectPath(const AH_HBCI *hbci, const char *country, const char *bankId, const char *accountId, const char *userId, const char *customerId, GWEN_BUFFER *nbuf); int AH_HBCI_GetAccountPath(const AH_HBCI *hbci, const AB_ACCOUNT *acc, GWEN_BUFFER *buf); int AH_HBCI_GetCustomerPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *buf); int AH_HBCI_AddBankPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddUserPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddCustomerPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddAccountPath(const AH_HBCI *hbci, const AB_ACCOUNT *a, GWEN_BUFFER *nbuf); void AH_HBCI_AppendUniqueName(AH_HBCI *hbci, GWEN_BUFFER *nbuf); GWEN_XMLNODE *AH_HBCI_GetDefinitions(const AH_HBCI *hbci); uint32_t AH_HBCI_GetLastVersion(const AH_HBCI *hbci); GWEN_DB_NODE *AH_HBCI_GetProviderDb(const AH_HBCI *hbci); /** @name Constructors, Destructors * */ /*@{*/ AH_HBCI *AH_HBCI_new(AB_PROVIDER *pro); void AH_HBCI_free(AH_HBCI *hbci); /*@}*/ /** @name Informational Functions * */ /*@{*/ const char *AH_HBCI_GetProductName(const AH_HBCI *hbci); void AH_HBCI_SetProductName(AH_HBCI *hbci, const char *s); const char *AH_HBCI_GetProductVersion(const AH_HBCI *hbci); void AH_HBCI_SetProductVersion(AH_HBCI *hbci, const char *s); AB_BANKING *AH_HBCI_GetBankingApi(const AH_HBCI *hbci); AB_PROVIDER *AH_HBCI_GetProvider(const AH_HBCI *hbci); /*@}*/ int AH_HBCI_Init(AH_HBCI *hbci, GWEN_DB_NODE *db); int AH_HBCI_Fini(AH_HBCI *hbci, GWEN_DB_NODE *db); int AH_HBCI_AddBankPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddUserPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddCustomerPath(const AH_HBCI *hbci, const AB_USER *u, GWEN_BUFFER *nbuf); int AH_HBCI_AddAccountPath(const AH_HBCI *hbci, const AB_ACCOUNT *a, GWEN_BUFFER *nbuf); int AH_HBCI_SaveMessage(AH_HBCI *hbci, const AB_USER *u, GWEN_DB_NODE *dbMsg); GWEN_DB_NODE *AH_HBCI_GetSharedRuntimeData(const AH_HBCI *hbci); int AH_HBCI_GetTransferTimeout(const AH_HBCI *hbci); void AH_HBCI_SetTransferTimeout(AH_HBCI *hbci, int i); int AH_HBCI_GetConnectTimeout(const AH_HBCI *hbci); void AH_HBCI_SetConnectTimeout(AH_HBCI *hbci, int i); int AH_HBCI_CheckStringSanity(const char *s); #endif /* GWHBCI_HBCI_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/bpd.c0000644000175000017500000004210112364015477022550 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "bpd_p.h" #include "aqhbci_l.h" #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_BPD_ADDR, AH_BpdAddr); GWEN_LIST2_FUNCTIONS(AH_BPD_ADDR, AH_BpdAddr); AH_BPD *AH_Bpd_new(){ AH_BPD *bpd; GWEN_NEW_OBJECT(AH_BPD, bpd); bpd->bpdVersion=1; bpd->bpdJobs=GWEN_DB_Group_new("bpdjobs"); bpd->addrList=AH_BpdAddr_List_new(); bpd->isDirty=0; return bpd; } void AH_Bpd_free(AH_BPD *bpd){ if (bpd) { DBG_DEBUG(AQHBCI_LOGDOMAIN, "Destroying AH_BPD"); free(bpd->bankName); free(bpd->bankAddr); GWEN_DB_Group_free(bpd->bpdJobs); AH_BpdAddr_List_free(bpd->addrList); GWEN_FREE_OBJECT(bpd); } } AH_BPD *AH_Bpd_dup(const AH_BPD *oldBpd){ AH_BPD *bpd; GWEN_DB_NODE *db; db=GWEN_DB_Group_new("tmp"); if (AH_Bpd_ToDb(oldBpd, db)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); GWEN_DB_Group_free(db); return 0; } bpd=AH_Bpd_FromDb(db); GWEN_DB_Group_free(db); if (!bpd) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return 0; } return bpd; } AH_BPD *AH_Bpd_FromDb(GWEN_DB_NODE *db){ GWEN_DB_NODE *gr; int i; const char *p; AH_BPD *bpd; GWEN_NEW_OBJECT(AH_BPD, bpd); bpd->addrList=AH_BpdAddr_List_new(); p=GWEN_DB_GetCharValue(db, "bankAddr", 0, 0); if (p) bpd->bankAddr=strdup(p); bpd->bankPort=GWEN_DB_GetIntValue(db, "bankPort", 0, 3000); p=GWEN_DB_GetCharValue(db, "addrType", 0, "tcp"); if (strcasecmp(p, "tcp")==0) bpd->addrType=AH_BPD_AddrTypeTCP; else if (strcasecmp(p, "btx")==0) bpd->addrType=AH_BPD_AddrTypeBTX; else if (strcasecmp(p, "ssl")==0) bpd->addrType=AH_BPD_AddrTypeSSL; else { DBG_WARN(AQHBCI_LOGDOMAIN, "Unsupported address type (%s), assuming TCP", p); bpd->addrType=AH_BPD_AddrTypeTCP; } p=GWEN_DB_GetCharValue(db, "bankName", 0, 0); if (p) bpd->bankName=strdup(p); bpd->jobTypesPerMsg=GWEN_DB_GetIntValue(db, "jobtypespermsg", 0, 0); bpd->maxMsgSize=GWEN_DB_GetIntValue(db, "maxmsgsize", 0, 0); bpd->bpdVersion=GWEN_DB_GetIntValue(db, "bpdversion", 0, 1); gr=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_PATHMUSTEXIST, "bpdjobs"); if (gr) { bpd->bpdJobs=GWEN_DB_Group_dup(gr); } else bpd->bpdJobs=GWEN_DB_Group_new("bpdjobs"); /* read supported hbci versions */ for (i=0; ; i++) { int j; j=GWEN_DB_GetIntValue(db, "hbciversions", i, 0); if (j) { if (AH_Bpd_AddHbciVersion(bpd, j)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many HBCI versions"); break; } } else break; } /* for */ /* read supported languages */ for (i=0; ; i++) { int j; j=GWEN_DB_GetIntValue(db, "languages", i, 0); if (j) { if (AH_Bpd_AddLanguage(bpd, j)) { DBG_WARN(AQHBCI_LOGDOMAIN, "Too many languages"); break; } } else break; } /* for */ /* store BPD addresses */ gr=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_PATHMUSTEXIST, "addresses"); if (gr) { gr=GWEN_DB_FindFirstGroup(gr, "addr"); while(gr) { AH_BPD_ADDR *ba; ba=AH_BpdAddr_FromDb(gr); if (ba) AH_BpdAddr_List_Add(ba, bpd->addrList); else { DBG_WARN(AQHBCI_LOGDOMAIN, "Bad BPD address"); } gr=GWEN_DB_FindNextGroup(gr, "addr"); } } bpd->isDirty=0; return bpd; } int AH_Bpd_ToDb(const AH_BPD *bpd, GWEN_DB_NODE *db){ GWEN_DB_NODE *gr; unsigned int i; const char *p; AH_BPD_ADDR *ba; if (bpd->bankName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "bankName", bpd->bankName); if (bpd->bankAddr) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankAddr", bpd->bankAddr); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankPort", bpd->bankPort); switch(bpd->addrType) { case AH_BPD_AddrTypeTCP: p="tcp"; break; case AH_BPD_AddrTypeBTX: p="btx"; break; case AH_BPD_AddrTypeSSL: p="ssl"; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Unsupported address type (%d)", bpd->addrType); return -1; } GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "addrType", p); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "jobtypespermsg", bpd->jobTypesPerMsg); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "maxmsgsize", bpd->maxMsgSize); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "bpdversion", bpd->bpdVersion); if (bpd->bpdJobs) { gr=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "bpdjobs"); assert(gr); GWEN_DB_AddGroupChildren(gr, bpd->bpdJobs); } GWEN_DB_DeleteVar(db, "hbciversions"); for (i=0; ihbciVersions[i]; if (!j) break; GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "hbciversions", j); } GWEN_DB_DeleteVar(db, "languages"); for (i=0; ilanguages[i]; if (!j) break; GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "languages", j); } /* store BPD addresses */ ba=AH_BpdAddr_List_First(bpd->addrList); if (ba) { gr=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "addresses"); while(ba) { GWEN_DB_NODE *dbA; dbA=GWEN_DB_GetGroup(gr, GWEN_PATH_FLAGS_CREATE_GROUP, "addr"); assert(dbA); if (AH_BpdAddr_ToDb(ba, dbA)) { DBG_INFO(AQHBCI_LOGDOMAIN, "here"); return -1; } ba=AH_BpdAddr_List_Next(ba); } } return 0; } int AH_Bpd_GetJobTypesPerMsg(const AH_BPD *bpd){ assert(bpd); return bpd->jobTypesPerMsg; } void AH_Bpd_SetJobTypesPerMsg(AH_BPD *bpd, int i){ assert(bpd); bpd->jobTypesPerMsg=i; bpd->isDirty=1; } int AH_Bpd_GetMaxMsgSize(const AH_BPD *bpd){ assert(bpd); return bpd->maxMsgSize; } void AH_Bpd_SetMaxMsgSize(AH_BPD *bpd, int i){ assert(bpd); bpd->maxMsgSize=i; bpd->isDirty=1; } int AH_Bpd_GetBpdVersion(const AH_BPD *bpd){ assert(bpd); return bpd->bpdVersion; } void AH_Bpd_SetBpdVersion(AH_BPD *bpd, int i){ assert(bpd); bpd->bpdVersion=i; bpd->isDirty=1; } GWEN_DB_NODE *AH_Bpd_GetBpdJobs(const AH_BPD *bpd, int hbciVersion){ GWEN_DB_NODE *gr; char numbuf[16]; assert(bpd); snprintf(numbuf, sizeof(numbuf), "%3d", hbciVersion); gr=GWEN_DB_GetGroup(bpd->bpdJobs, GWEN_PATH_FLAGS_NAMEMUSTEXIST, numbuf); if (gr) return gr; return bpd->bpdJobs; } void AH_Bpd_SetBpdJobs(AH_BPD *bpd, GWEN_DB_NODE *n){ assert(bpd); GWEN_DB_Group_free(bpd->bpdJobs); bpd->bpdJobs=n; bpd->isDirty=1; } void AH_Bpd_ClearBpdJobs(AH_BPD *bpd){ assert(bpd); GWEN_DB_ClearGroup(bpd->bpdJobs, 0); bpd->isDirty=1; } const int *AH_Bpd_GetHbciVersions(const AH_BPD *bpd){ assert(bpd); return bpd->hbciVersions; } int AH_Bpd_AddHbciVersion(AH_BPD *bpd, int i){ int j; assert(bpd); assert(i); for (j=0; jhbciVersions[j]==i) { DBG_ERROR(AQHBCI_LOGDOMAIN, "HBCI version %d already enlisted", i); return -1; } if (bpd->hbciVersions[j]==0) { bpd->hbciVersions[j]=i; bpd->isDirty=1; return 0; } } DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many HBCI versions."); return -1; } void AH_Bpd_ClearHbciVersions(AH_BPD *bpd){ unsigned int i; assert(bpd); /* note: i<= is correct here, since the field size is k+1 */ for (i=0; i<=AH_BPD_MAXHBCIVERSIONS; i++) bpd->hbciVersions[i]=0; bpd->isDirty=1; } int AH_Bpd_AddLanguage(AH_BPD *bpd, int i){ int j; assert(bpd); assert(i); for (j=0; jlanguages[j]==i) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Language %d already enlisted", i); return -1; } if (bpd->languages[j]==0) { bpd->languages[j]=i; bpd->isDirty=1; return 0; } } DBG_ERROR(AQHBCI_LOGDOMAIN, "Too many languages."); return -1; } const int *AH_Bpd_GetLanguages(const AH_BPD *bpd){ assert(bpd); return bpd->languages; } void AH_Bpd_ClearLanguages(AH_BPD *bpd){ unsigned int i; assert(bpd); /* note: i<= is correct here, since the field size is k+1 */ for (i=0; i<=AH_BPD_MAXLANGUAGES; i++) bpd->languages[i]=0; bpd->isDirty=1; } int AH_Bpd_IsDirty(const AH_BPD *bpd){ assert(bpd); if (bpd->isDirty) return 1; return 0; } void AH_Bpd_SetIsDirty(AH_BPD *bpd, int dirty){ assert(bpd); bpd->isDirty=dirty; } void AH_Bpd_Dump(const AH_BPD *bpd, int insert) { uint32_t k; unsigned int i; for (k=0; kbpdVersion); for (k=0; kjobTypesPerMsg); for (k=0; kmaxMsgSize); for (k=0; khbciVersions[i]) fprintf(stderr, "%d ",bpd->hbciVersions[i]); } fprintf(stderr, "\n"); for (k=0; klanguages[i]) fprintf(stderr, "%d ",bpd->languages[i]); } fprintf(stderr, "\n"); for (k=0; kbpdJobs, insert+17); } const char *AH_Bpd_GetBankAddr(const AH_BPD *bpd){ assert(bpd); return bpd->bankAddr; } void AH_Bpd_SetBankAddr(AH_BPD *bpd, const char *addr){ assert(bpd); assert(addr); free(bpd->bankAddr); bpd->bankAddr=strdup(addr); bpd->isDirty=1; } int AH_Bpd_GetBankPort(const AH_BPD *bpd){ assert(bpd); return bpd->bankPort; } void AH_Bpd_SetBankPort(AH_BPD *bpd, int p){ assert(bpd); bpd->bankPort=p; bpd->isDirty=1; } AH_BPD_ADDR_TYPE AH_Bpd_GetAddrType(const AH_BPD *bpd){ assert(bpd); return bpd->addrType; } void AH_Bpd_SetAddrType(AH_BPD *bpd, AH_BPD_ADDR_TYPE i){ bpd->addrType=i; bpd->isDirty=1; } const char *AH_Bpd_GetBankName(const AH_BPD *bpd){ assert(bpd); return bpd->bankName; } void AH_Bpd_SetBankName(AH_BPD *bpd, const char *s){ assert(bpd); assert(s); free(bpd->bankName); bpd->bankName=strdup(s); bpd->isDirty=1; } void AH_Bpd_ClearAddr(AH_BPD *bpd){ assert(bpd); AH_BpdAddr_List_Clear(bpd->addrList); } void AH_Bpd_AddAddr(AH_BPD *bpd, AH_BPD_ADDR *ba){ assert(bpd); assert(ba); AH_BpdAddr_List_Add(ba, bpd->addrList); } AH_BPD_ADDR_LIST *AH_Bpd_GetAddrList(const AH_BPD *bpd){ assert(bpd); return bpd->addrList; } AH_BPD_ADDR *AH_BpdAddr_new(){ AH_BPD_ADDR *ba; GWEN_NEW_OBJECT(AH_BPD_ADDR, ba); GWEN_LIST_INIT(AH_BPD_ADDR, ba); return ba; } void AH_BpdAddr_free(AH_BPD_ADDR *ba){ if (ba) { GWEN_LIST_FINI(AH_BPD_ADDR, ba); free(ba->addr); free(ba->suffix); GWEN_FREE_OBJECT(ba); } } AH_BPD_ADDR *AH_BpdAddr_dup(const AH_BPD_ADDR *ba){ AH_BPD_ADDR *newBa; assert(ba); newBa=AH_BpdAddr_new(); newBa->type=ba->type; if (ba->addr) newBa->addr=strdup(ba->addr); if (ba->suffix) newBa->suffix=strdup(ba->suffix); newBa->ftype=ba->ftype; newBa->fversion=ba->fversion; return newBa; } AH_BPD_ADDR_TYPE AH_BpdAddr_GetType(const AH_BPD_ADDR *ba){ assert(ba); return ba->type; } void AH_BpdAddr_SetType(AH_BPD_ADDR *ba, AH_BPD_ADDR_TYPE t){ assert(ba); ba->type=t; } const char *AH_BpdAddr_GetAddr(const AH_BPD_ADDR *ba){ assert(ba); return ba->addr; } void AH_BpdAddr_SetAddr(AH_BPD_ADDR *ba, const char *s){ assert(ba); free(ba->addr); if (s) ba->addr=strdup(s); else ba->addr=0; } const char *AH_BpdAddr_GetSuffix(const AH_BPD_ADDR *ba){ assert(ba); return ba->suffix; } void AH_BpdAddr_SetSuffix(AH_BPD_ADDR *ba, const char *s){ assert(ba); free(ba->suffix); if (s) ba->suffix=strdup(s); else ba->suffix=0; } AH_BPD_FILTER_TYPE AH_BpdAddr_GetFType(const AH_BPD_ADDR *ba){ assert(ba); return ba->ftype; } void AH_BpdAddr_SetFType(AH_BPD_ADDR *ba, AH_BPD_FILTER_TYPE t){ assert(ba); ba->ftype=t; } int AH_BpdAddr_GetFVersion(const AH_BPD_ADDR *ba){ assert(ba); return ba->fversion; } void AH_BpdAddr_SetFVersion(AH_BPD_ADDR *ba, int i){ assert(ba); ba->fversion=i; } AH_BPD_ADDR *AH_BpdAddr_FromDb(GWEN_DB_NODE *db){ AH_BPD_ADDR *ba; const char *p; ba=AH_BpdAddr_new(); p=GWEN_DB_GetCharValue(db, "type", 0, 0); if (!p) { int i; i=GWEN_DB_GetIntValue(db, "type", 0, -1); if (i==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "bad BPD address"); GWEN_DB_Dump(db, 2); AH_BpdAddr_free(ba); return 0; } switch(i) { case 1: ba->type=AH_BPD_AddrTypeBTX; break; case 2: ba->type=AH_BPD_AddrTypeTCP; break; case 3: ba->type=AH_BPD_AddrTypeSSL; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "bad BPD address: unknown type %i", i); ba->type=AH_BPD_AddrTypeUnknown; break; GWEN_DB_Dump(db, 2); AH_BpdAddr_free(ba); return 0; } } else { if (strcasecmp(p, "tcp")==0) ba->type=AH_BPD_AddrTypeTCP; else if (strcasecmp(p, "btx")==0) ba->type=AH_BPD_AddrTypeBTX; else if (strcasecmp(p, "ssl")==0) ba->type=AH_BPD_AddrTypeSSL; else { DBG_ERROR(AQHBCI_LOGDOMAIN, "bad BPD address: bad type %s", p); GWEN_DB_Dump(db, 2); AH_BpdAddr_free(ba); return 0; } } p=GWEN_DB_GetCharValue(db, "filter", 0, 0); if (p) { if (strcasecmp(p, "mim")==0) ba->ftype=AH_BPD_FilterTypeBase64; else if (strcasecmp(p, "uue")==0) ba->ftype=AH_BPD_FilterTypeUUE; else if (strcasecmp(p, "none")==0) ba->ftype=AH_BPD_FilterTypeNone; else { DBG_ERROR(AQHBCI_LOGDOMAIN, "bad BPD address: bad filter type %s", p); GWEN_DB_Dump(db, 2); AH_BpdAddr_free(ba); return 0; } ba->fversion=GWEN_DB_GetIntValue(db, "fversion", 0, 0); } else { ba->ftype=AH_BPD_FilterTypeNone; } p=GWEN_DB_GetCharValue(db, "address", 0, 0); if (!p) { DBG_ERROR(AQHBCI_LOGDOMAIN, "bad BPD address: no address"); GWEN_DB_Dump(db, 2); AH_BpdAddr_free(ba); return 0; } ba->addr=strdup(p); p=GWEN_DB_GetCharValue(db, "suffix", 0, 0); if (p) ba->suffix=strdup(p); return ba; } int AH_BpdAddr_ToDb(const AH_BPD_ADDR *ba, GWEN_DB_NODE *db){ assert(ba); assert(db); if (!ba->addr) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No address in BPD address"); return -1; } switch(ba->type) { case AH_BPD_AddrTypeTCP: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", "tcp"); break; case AH_BPD_AddrTypeBTX: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", "btx"); break; case AH_BPD_AddrTypeSSL: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", "ssl"); break; default: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", "unknown"); break; } switch(ba->ftype) { case AH_BPD_FilterTypeBase64: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "ftype", "mim"); break; case AH_BPD_FilterTypeUUE: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "ftype", "uue"); break; case AH_BPD_FilterTypeNone: default: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "filter", "none"); break; } GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "fversion", ba->fversion); if (ba->addr) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "address", ba->addr); if (ba->suffix) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "suffix", ba->suffix); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt.inc0000644000175000017500000000510412364015477024204 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AH_Msg__Sign(AH_MSG *hmsg, GWEN_BUFFER *rawBuf, const char *signer) { AB_USER *u; u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); switch(AH_User_GetCryptMode(u)) { case AH_CryptMode_Ddv: return AH_Msg_SignDdv(hmsg, rawBuf, signer); case AH_CryptMode_Rdh: return AH_Msg_SignRdh(hmsg, rawBuf, signer); case AH_CryptMode_Pintan: return AH_Msg_SignPinTan(hmsg, rawBuf, signer); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptMode %d not supported", AH_User_GetCryptMode(u)); return GWEN_ERROR_NOT_SUPPORTED; } } int AH_Msg__Encrypt(AH_MSG *hmsg) { AB_USER *u; u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); switch(AH_User_GetCryptMode(u)) { case AH_CryptMode_Ddv: return AH_Msg_EncryptDdv(hmsg); case AH_CryptMode_Rdh: return AH_Msg_EncryptRdh(hmsg); case AH_CryptMode_Pintan: return AH_Msg_EncryptPinTan(hmsg); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptMode %d not supported", AH_User_GetCryptMode(u)); return GWEN_ERROR_NOT_SUPPORTED; } } int AH_Msg__Decrypt(AH_MSG *hmsg, GWEN_DB_NODE *gr){ AB_USER *u; u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); switch(AH_User_GetCryptMode(u)) { case AH_CryptMode_Ddv: return AH_Msg_DecryptDdv(hmsg, gr); case AH_CryptMode_Rdh: return AH_Msg_DecryptRdh(hmsg, gr); case AH_CryptMode_Pintan: return AH_Msg_DecryptPinTan(hmsg, gr); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptMode %d not supported", AH_User_GetCryptMode(u)); return GWEN_ERROR_NOT_SUPPORTED; } } int AH_Msg__Verify(AH_MSG *hmsg, GWEN_DB_NODE *gr) { AB_USER *u; u=AH_Dialog_GetDialogOwner(hmsg->dialog); assert(u); switch(AH_User_GetCryptMode(u)) { case AH_CryptMode_Ddv: return AH_Msg_VerifyDdv(hmsg, gr); case AH_CryptMode_Rdh: return AH_Msg_VerifyRdh(hmsg, gr); case AH_CryptMode_Pintan: return AH_Msg_VerifyPinTan(hmsg, gr); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptMode %d not supported", AH_User_GetCryptMode(u)); return GWEN_ERROR_NOT_SUPPORTED; } } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/msglayer/hbci_p.h0000644000175000017500000000313512364015477023240 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef GWHBCI_HBCI_P_H #define GWHBCI_HBCI_P_H #include "hbci_l.h" /* Note: We use the key "AqBanking" because from the windows registry * point of view, these plugins all belong to the large AqBanking * package. */ #define AH_REGKEY_PATHS "Software\\AqBanking\\Paths" #define AH_REGKEY_XMLDATADIR "xmldatadir" #define AH_PM_LIBNAME "aqhbci" #define AH_PM_XMLDATADIR "xmldatadir" #define AH_HBCI_DEFAULT_CONNECT_TIMEOUT 30 #define AH_HBCI_DEFAULT_TRANSFER_TIMEOUT 60 struct AH_HBCI { AB_BANKING *banking; AB_PROVIDER *provider; char *productName; char *productVersion; GWEN_XMLNODE *defs; uint32_t counter; GWEN_DB_NODE *sharedRuntimeData; int transferTimeout; int connectTimeout; uint32_t lastVersion; GWEN_DB_NODE *dbProviderConfig; }; static int AH_HBCI_SaveSettings(const char *path, GWEN_DB_NODE *db); #if 0 static GWEN_DB_NODE *AH_HBCI_LoadSettings(const char *path); #endif static int AH_HBCI_AddDefinitions(AH_HBCI *hbci, GWEN_XMLNODE *node); static GWEN_XMLNODE *AH_HBCI_LoadDefaultXmlFiles(const AH_HBCI *hbci); #endif /* GWHBCI_HBCI_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/header.xml.in0000644000175000017500000000013712364015477022376 00000000000000 Martin Preuss @DATETIME@ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/0000755000175000017500000000000012643540657021512 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/provider_l.h0000644000175000017500000000170312364015477023746 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_PROVIDER_L_H #define AH_PROVIDER_L_H #include "provider.h" #include "hbci_l.h" AH_HBCI *AH_Provider_GetHbci(const AB_PROVIDER *pro); AQHBCI_API int AH_Provider_SendDtazv(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_IMEXPORTER_CONTEXT *ctx, const uint8_t *dataPtr, uint32_t dataLen, int withProgress, int nounmount, int doLock); AQHBCI_API int AH_Provider_WriteValueToDb(const AB_VALUE *v, GWEN_DB_NODE *dbV); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/Makefile.in0000644000175000017500000006412012643540057023474 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/banking DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libhbcibanking_la_LIBADD = am_libhbcibanking_la_OBJECTS = provider.lo libhbcibanking_la_OBJECTS = $(am_libhbcibanking_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libhbcibanking_la_SOURCES) DIST_SOURCES = $(libhbcibanking_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DAQHBCI_PLUGINS=\"$(aqhbci_plugindir)\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(srcdir)/../msglayer -I$(srcdir)/../joblayer \ -I$(srcdir)/../applayer -I$(srcdir)/../ajobs -I$(srcdir)/.. \ -I$(srcdir)/../dialogs noinst_LTLIBRARIES = libhbcibanking.la noinst_HEADERS = \ provider_l.h \ provider_p.h iheaderdir = @aqbanking_headerdir_am@/aqhbci iheader_HEADERS = \ provider.h libhbcibanking_la_SOURCES = \ provider.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/banking/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/banking/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libhbcibanking.la: $(libhbcibanking_la_OBJECTS) $(libhbcibanking_la_DEPENDENCIES) $(EXTRA_libhbcibanking_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libhbcibanking_la_OBJECTS) $(libhbcibanking_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/provider.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS sources: for f in $(libhbcibanking_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/provider.c0000644000175000017500000037224312624441730023432 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "provider_p.h" #include "aqhbci_l.h" #include "account_l.h" #include "hbci_l.h" #include "dialog_l.h" #include "outbox_l.h" #include "user_l.h" #include "jobgetbalance_l.h" #include "jobgettransactions_l.h" #include "jobgetstandingorders_l.h" #include "jobgetdatedxfers_l.h" #include "jobsingletransfer_l.h" #include "jobmultitransfer_l.h" #include "jobeutransfer_l.h" #include "jobloadcellphone_l.h" #include "jobsepaxfersingle_l.h" #include "jobsepaxfermulti_l.h" #include "jobsepadebitdatedsinglecreate_l.h" #include "jobsepadebitdatedmulticreate_l.h" #include "jobsepacor1datedsinglecreate_l.h" #include "jobsepacor1datedmulticreate_l.h" #include "jobsepastandingorderdelete_l.h" #include "jobsepastandingordercreate_l.h" #include "jobsepastandingorderget_l.h" #include "jobsepadebitsingle_l.h" /* deprecated job */ /* special jobs */ #include "jobforeignxferwh_l.h" #include "dlg_newuser_l.h" #include "dlg_pintan_l.h" #include "dlg_ddvcard_l.h" #include "dlg_newkeyfile_l.h" #include "dlg_importkeyfile_l.h" #include "dlg_edituserpintan_l.h" #include "dlg_edituserddv_l.h" #include "dlg_edituserrdh_l.h" #include "dlg_choose_usertype_l.h" #include "dlg_editaccount_l.h" #include "adminjobs_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define AH_PATH_SEP "\\" #else # define AH_PATH_SEP "/" #endif GWEN_INHERIT(AB_PROVIDER, AH_PROVIDER); AB_PROVIDER *AH_Provider_new(AB_BANKING *ab, const char *name){ AB_PROVIDER *pro; AH_PROVIDER *hp; GWEN_BUFFER *pbuf; pbuf=0; pro=AB_Provider_new(ab, name); assert(pro); AB_Provider_SetInitFn(pro, AH_Provider_Init); AB_Provider_SetFiniFn(pro, AH_Provider_Fini); AB_Provider_SetUpdateJobFn(pro, AH_Provider_UpdateJob); AB_Provider_SetAddJobFn(pro, AH_Provider_AddJob); AB_Provider_SetExecuteFn(pro, AH_Provider_Execute); AB_Provider_SetResetQueueFn(pro, AH_Provider_ResetQueue); AB_Provider_SetExtendUserFn(pro, AH_Provider_ExtendUser); AB_Provider_SetExtendAccountFn(pro, AH_Provider_ExtendAccount); AB_Provider_SetUpdateFn(pro, AH_Provider_Update); AB_Provider_SetGetNewUserDialogFn(pro, AH_Provider_GetNewUserDialog); AB_Provider_SetGetEditUserDialogFn(pro, AH_Provider_GetEditUserDialog); AB_Provider_SetGetUserTypeDialogFn(pro, AH_Provider_GetUserTypeDialog); AB_Provider_SetGetEditAccountDialogFn(pro, AH_Provider_GetEditAccountDialog); AB_Provider_AddFlags(pro, AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG | AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG | AB_PROVIDER_FLAGS_HAS_EDITACCOUNT_DIALOG | AB_PROVIDER_FLAGS_HAS_USERTYPE_DIALOG); GWEN_NEW_OBJECT(AH_PROVIDER, hp); GWEN_INHERIT_SETDATA(AB_PROVIDER, AH_PROVIDER, pro, hp, AH_Provider_FreeData); hp->hbci=AH_HBCI_new(pro); assert(hp->hbci); GWEN_Buffer_free(pbuf); hp->dbTempConfig=GWEN_DB_Group_new("tmpConfig"); hp->bankingJobs=AB_Job_List2_new(); return pro; } void GWENHYWFAR_CB AH_Provider_FreeData(void *bp, void *p) { AH_PROVIDER *hp; DBG_INFO(AQHBCI_LOGDOMAIN, "Destroying AH_PROVIDER"); hp=(AH_PROVIDER*)p; AB_Job_List2_FreeAll(hp->bankingJobs); AH_Outbox_free(hp->outbox); GWEN_DB_Group_free(hp->dbTempConfig); AH_HBCI_free(hp->hbci); GWEN_FREE_OBJECT(hp); } int AH_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { AH_PROVIDER *hp; int rv; const char *logLevelName; if (!GWEN_Logger_IsOpen(AQHBCI_LOGDOMAIN)) { GWEN_Logger_Open(AQHBCI_LOGDOMAIN, "aqhbci", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); } logLevelName=getenv("AQHBCI_LOGLEVEL"); if (logLevelName) { GWEN_LOGGER_LEVEL ll; ll=GWEN_Logger_Name2Level(logLevelName); if (ll!=GWEN_LoggerLevel_Unknown) { GWEN_Logger_SetLevel(AQHBCI_LOGDOMAIN, ll); DBG_WARN(AQHBCI_LOGDOMAIN, "Overriding loglevel for AqHBCI with \"%s\"", logLevelName); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown loglevel \"%s\"", logLevelName); } } DBG_NOTICE(AQHBCI_LOGDOMAIN, "Initializing AqHBCI backend"); assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); GWEN_DB_ClearGroup(hp->dbTempConfig, 0); rv=AH_HBCI_Init(hp->hbci, dbData); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } return rv; } int AH_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { AH_PROVIDER *hp; int rv; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Deinitializing AqHBCI backend"); assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); AB_Job_List2_FreeAll(hp->bankingJobs); hp->bankingJobs=AB_Job_List2_new(); AH_Outbox_free(hp->outbox); hp->outbox=0; rv=AH_HBCI_Fini(hp->hbci, dbData); GWEN_DB_ClearGroup(hp->dbTempConfig, 0); return rv; } const char *AH_Provider_GetProductName(const AB_PROVIDER *pro) { AH_HBCI *h; assert(pro); h=AH_Provider_GetHbci(pro); assert(h); return AH_HBCI_GetProductName(h); } const char *AH_Provider_GetProductVersion(const AB_PROVIDER *pro) { AH_HBCI *h; assert(pro); h=AH_Provider_GetHbci(pro); assert(h); return AH_HBCI_GetProductVersion(h); } int AH_Provider_CheckCryptToken(AB_PROVIDER *pro, GWEN_CRYPT_TOKEN_DEVICE devt, GWEN_BUFFER *typeName, GWEN_BUFFER *tokenName) { GWEN_PLUGIN_MANAGER *pm; int rv; /* get crypt token */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptToken plugin manager not found"); return GWEN_ERROR_NOT_FOUND; } /* try to determine the type and name */ rv=GWEN_Crypt_Token_PluginManager_CheckToken(pm, devt, typeName, tokenName, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AH_Provider__CreateHbciJob(AB_PROVIDER *pro, AB_JOB *j, AH_JOB **pHbciJob){ AH_PROVIDER *hp; GWEN_DB_NODE *dbJob; AH_JOB *mj; uint32_t jid; AB_ACCOUNT *ma; AB_USER *mu; uint32_t aFlags; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); dbJob=AB_Job_GetProviderData(j, pro); assert(dbJob); ma=AB_Job_GetAccount(j); assert(ma); /* determine customer to use */ mu=AB_Account_GetFirstUser(ma); if (!mu) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No customers noted for account \"%s/%s\"", AB_Account_GetBankCode(ma), AB_Account_GetAccountNumber(ma)); return GWEN_ERROR_NOT_AVAILABLE; } aFlags=AH_Account_GetFlags(ma); mj=0; switch(AB_Job_GetType(j)) { case AB_Job_TypeGetBalance: mj=AH_Job_GetBalance_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeGetTransactions: mj=AH_Job_GetTransactions_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeGetStandingOrders: mj=AH_Job_GetStandingOrders_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeGetDatedTransfers: mj=AH_Job_GetDatedTransfers_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeTransfer: mj=0; if (!(aFlags & AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Customer prefers multi jobs"); /* create new job */ mj=AH_Job_MultiTransfer_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Multi-job not supported with this account, " "using single-job"); } } if (!mj) { mj=AH_Job_SingleTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } break; case AB_Job_TypeDebitNote: mj=0; if (!(aFlags & AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Customer prefers multi jobs"); /* create new job */ mj=AH_Job_MultiDebitNote_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Multi-job not supported with this account, " "using single-job"); } } if (!mj) { mj=AH_Job_SingleDebitNote_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } break; case AB_Job_TypeInternalTransfer: mj=AH_Job_InternalTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeEuTransfer: mj=AH_Job_EuTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeCreateStandingOrder: mj=AH_Job_CreateStandingOrder_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeModifyStandingOrder: mj=AH_Job_ModifyStandingOrder_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeDeleteStandingOrder: mj=AH_Job_DeleteStandingOrder_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeCreateDatedTransfer: mj=AH_Job_CreateDatedTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeModifyDatedTransfer: mj=AH_Job_ModifyDatedTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeDeleteDatedTransfer: mj=AH_Job_DeleteDatedTransfer_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeLoadCellPhone: mj=AH_Job_LoadCellPhone_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeSepaTransfer: if (!(aFlags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Customer prefers multi jobs"); /* try multi transfer first */ mj=AH_Job_SepaTransferMulti_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"SepaTransferMulti\" not supported with this account"); /* try single transfer */ mj=AH_Job_SepaTransferSingle_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"SepaTransferSingle\" not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } else { /* try single job first */ mj=AH_Job_SepaTransferSingle_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"SepaTransferSingle\" not supported with this account"); /* try multi transfer next */ mj=AH_Job_SepaTransferMulti_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job \"SepaTransferMulti\" not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } break; case AB_Job_TypeSepaDebitNote: if (!(aFlags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Customer prefers multi jobs"); /* try multi transfer first */ mj=AH_Job_SepaDebitDatedMultiCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "SepaDebitDatedMultiCreate not supported with this account"); /* try single transfer */ mj=AH_Job_SepaDebitDatedSingleCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"SepaDebitDatedSingleCreate\" not supported with this account, trying old single debit"); /* try old singleDebit job next */ mj=AH_Job_SepaDebitSingle_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job \"SepaDebitSingle\" not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } } else { /* try single job first */ mj=AH_Job_SepaDebitDatedSingleCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "SepaDebitDatedSingleCreate not supported with this account"); /* try old singleDebit job next */ mj=AH_Job_SepaDebitSingle_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job \"SepaDebitSingle\" not supported with this account"); /* try multi transfer next */ mj=AH_Job_SepaDebitDatedMultiCreate_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "SepaDebitDatedMultiCreate not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } } break; case AB_Job_TypeSepaFlashDebitNote: if (!(aFlags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE)) { DBG_INFO(AQHBCI_LOGDOMAIN, "Customer prefers multi jobs"); /* try multi transfer first */ mj=AH_Job_SepaCor1DebitDatedMultiCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "SepaCor1DebitDatedMultiCreate not supported with this account"); /* try single transfer */ mj=AH_Job_SepaCor1DebitDatedSingleCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job \"SepaCor1DebitDatedSingleCreate\" not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } else { /* try single job first */ mj=AH_Job_SepaCor1DebitDatedSingleCreate_new(mu, ma); if (!mj) { DBG_WARN(AQHBCI_LOGDOMAIN, "SepaCor1DebitDatedSingleCreate not supported with this account"); /* try multi transfer next */ mj=AH_Job_SepaCor1DebitDatedMultiCreate_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "SepaCor1DebitDatedMultiCreate not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } } } break; case AB_Job_TypeSepaCreateStandingOrder: mj=AH_Job_SepaStandingOrderCreate_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeSepaDeleteStandingOrder: mj=AH_Job_SepaStandingOrderDelete_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; case AB_Job_TypeSepaGetStandingOrders: mj=AH_Job_SepaStandingOrderGet_new(mu, ma); if (!mj) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported with this account"); return GWEN_ERROR_NOT_AVAILABLE; } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported by AqHBCI"); return GWEN_ERROR_NOT_AVAILABLE; } /* switch */ assert(mj); /* store HBCI job, link both jobs */ if (AH_Job_GetId(mj)==0) { jid=AB_Job_GetJobId(j); assert(jid); /* we now use the same id here */ AH_Job_SetId(mj, jid); } DBG_INFO(AQHBCI_LOGDOMAIN, "Job successfully created"); *pHbciJob=mj; return 0; } int AH_Provider__GetMultiHbciJob(AB_PROVIDER *pro, AB_JOB *j, AH_JOB **pHbciJob){ AH_PROVIDER *hp; GWEN_DB_NODE *dbJob; AH_JOB *mj=NULL; AB_ACCOUNT *ma; AB_USER *mu; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); if (hp->outbox==0) hp->outbox=AH_Outbox_new(hp->hbci); assert(hp->outbox); dbJob=AB_Job_GetProviderData(j, pro); assert(dbJob); ma=AB_Job_GetAccount(j); assert(ma); /* determine customer to use */ mu=AB_Account_GetFirstUser(ma); if (!mu) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No customers noted for account \"%s/%s\"", AB_Account_GetBankCode(ma), AB_Account_GetAccountNumber(ma)); return GWEN_ERROR_NOT_AVAILABLE; } switch(AB_Job_GetType(j)) { case AB_Job_TypeTransfer: mj=AH_Outbox_FindTransferJob(hp->outbox, mu, ma, "JobMultiTransfer"); break; case AB_Job_TypeDebitNote: mj=AH_Outbox_FindTransferJob(hp->outbox, mu, ma, "JobMultiDebitNote"); break; case AB_Job_TypeSepaTransfer: mj=AH_Outbox_FindTransferJob(hp->outbox, mu, ma, "JobSepaTransferMulti"); break; case AB_Job_TypeSepaDebitNote: mj=AH_Outbox_FindTransferJob(hp->outbox, mu, ma, "JobSepaDebitDatedMultiCreate"); break; default: DBG_INFO(AQHBCI_LOGDOMAIN, "No Multi jobs defined for this job type"); break; } /* switch */ if (mj) { DBG_INFO(AQHBCI_LOGDOMAIN, "Multi job found"); AB_Job_SetIdForProvider(j, AH_Job_GetId(mj)); *pHbciJob=mj; return 0; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No multi job found"); return GWEN_ERROR_NOT_FOUND; } } int AH_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j){ AH_PROVIDER *hp; AH_JOB *mj=NULL; AB_USER *mu; AB_ACCOUNT *ma; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); ma=AB_Job_GetAccount(j); assert(ma); /* determine customer to use */ mu=AB_Account_GetFirstUser(ma); if (!mu) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No customer for this account"); return GWEN_ERROR_NOT_AVAILABLE; } rv=AH_Provider__CreateHbciJob(pro, j, &mj); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } /* exchange parameters */ rv=AH_Job_Exchange(mj, j, AH_Job_ExchangeModeParams, NULL); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error exchanging params"); AH_Job_free(mj); return rv; } /* free my job, it is no longer needed here */ AH_Job_free(mj); DBG_INFO(AQHBCI_LOGDOMAIN, "Job successfully updated"); return 0; } int AH_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j){ AH_PROVIDER *hp; AH_JOB *mj=NULL; uint32_t jid; AB_JOB_STATUS jst; AB_ACCOUNT *ma; AB_USER *mu; int rv; int sigs; int jobIsNew=1; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); if (hp->outbox==0) hp->outbox=AH_Outbox_new(hp->hbci); assert(hp->outbox); /* check status */ jst=AB_Job_GetStatus(j); if (jst==AB_Job_StatusPending) { DBG_INFO(AQHBCI_LOGDOMAIN, "Adding pending job for verification"); AH_Outbox_AddPendingJob(hp->outbox, j); return 0; } /* check id */ jid=AB_Job_GetIdForProvider(j); if (jid) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Jobs has already been sent to this backend, rejecting"); return GWEN_ERROR_INVALID; } /* get account and user */ ma=AB_Job_GetAccount(j); assert(ma); /* determine customer to use */ mu=AB_Account_GetFirstUser(ma); if (!mu) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No customer for this account"); return GWEN_ERROR_NOT_AVAILABLE; } /* try to get an existing multi job to add the new one to */ rv=AH_Provider__GetMultiHbciJob(pro, j, &mj); if (rv==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Reusing existing multi job"); jobIsNew=0; } else { if (rv!=GWEN_ERROR_NOT_FOUND) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error looking for multi job (%d), ignoring", rv); } } /* create new job if necessary */ if (mj==NULL) { rv=AH_Provider__CreateHbciJob(pro, j, &mj); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return rv; } } assert(mj); if (jobIsNew) { /* check whether we need to sign the job */ sigs=AH_Job_GetMinSignatures(mj); if (sigs) { if (sigs>1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Multiple signatures not yet supported"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("ERROR: Multiple signatures not " "yet supported")); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(mj, AB_User_GetUserId(mu)); } } /* store HBCI job, link both jobs */ if (AH_Job_GetId(mj)==0) { jid=AB_Job_GetJobId(j); assert(jid); /* we now use the same id here */ AH_Job_SetId(mj, jid); } AB_Job_SetIdForProvider(j, AH_Job_GetId(mj)); /* exchange arguments */ rv=AH_Job_Exchange(mj, j, AH_Job_ExchangeModeArgs, NULL); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error exchanging params"); if (jobIsNew) AH_Job_free(mj); return rv; } if (jobIsNew) { /* add job to outbox */ AH_Outbox_AddJob(hp->outbox, mj); AH_Job_free(mj); } AB_Job_Attach(j); AB_Job_List2_PushBack(hp->bankingJobs, j); AB_Job_SetStatus(j, AB_Job_StatusSent); DBG_INFO(AQHBCI_LOGDOMAIN, "Job successfully added"); return 0; } AH_JOB *AH_Provider__FindMyJob(AH_JOB_LIST *mjl, uint32_t jid){ AH_JOB *mj; assert(mjl); DBG_INFO(AQHBCI_LOGDOMAIN, "Looking for id %08x", jid); mj=AH_Job_List_First(mjl); while(mj) { DBG_INFO(AQHBCI_LOGDOMAIN, "Comparing %08x", AH_Job_GetId(mj)); if (AH_Job_GetId(mj)==jid) break; mj=AH_Job_List_Next(mj); } return mj; } int AH_Provider__AddAccountSepaInfoJobsToOutBox(AB_PROVIDER *pro, AH_OUTBOX *ob) { AH_PROVIDER *hp; AB_BANKING *ab; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT_LIST2_ITERATOR *ait; AB_JOB_LIST2_ITERATOR *jit; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); ab=AB_Provider_GetBanking(pro); assert(ab); if (hp->bankingJobs==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No job list, SNH"); return GWEN_ERROR_INTERNAL; } /* get list of all accounts used */ al=AB_Account_List2_new(); jit=AB_Job_List2_First(hp->bankingJobs); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); while(j) { AB_ACCOUNT *a; a=AB_Job_GetAccount(j); if (a) { if (AB_Account_List2_GetAccountByUniqueId(al, AB_Account_GetUniqueId(a))==NULL) AB_Account_List2_PushBack(al, a); } j=AB_Job_List2Iterator_Next(jit); } AB_Job_List2Iterator_free(jit); } /* add jobs */ ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { const char *s; s=AB_Account_GetIBAN(a); if (!(s && *s)) { AB_USER *u; DBG_NOTICE(AQHBCI_LOGDOMAIN, "No IBAN for account, requesting SEPA info"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Info, I18N("No IBAN for account %llu, requesting SEPA info"), (unsigned long long int) AB_Account_GetUniqueId(a)); u=AB_Account_GetFirstUser(a); if (!u) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No user for this account"); } else { AH_JOB *job; job=AH_Job_GetAccountSepaInfo_new(u, a); if (job) { AH_Job_AddSigner(job, AB_User_GetUserId(u)); AH_Outbox_AddJob(ob, job); } else { DBG_WARN(AQHBCI_LOGDOMAIN, "Job not supported with this account"); } } } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); return 0; } int AH_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx){ AH_PROVIDER *hp; int rv; AB_JOB_LIST2_ITERATOR *jit; int successfull; AH_JOB_LIST *mjl; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); successfull=0; if (hp->outbox==0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Empty outbox"); return 0; } rv=AH_Provider__AddAccountSepaInfoJobsToOutBox(pro, hp->outbox); if (rv<0) { DBG_WARN(AQHBCI_LOGDOMAIN, "Error adding accountSepaInfo jobs to outbox, ignoring."); } rv=AH_Outbox_Execute(hp->outbox, ctx, 0, 1, 1); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error executing outbox."); rv=GWEN_ERROR_GENERIC; } /* fill gaps */ AB_Banking_FillGapsInImExporterContext(AB_Provider_GetBanking(pro), ctx); mjl=AH_Outbox_GetFinishedJobs(hp->outbox); assert(mjl); /* copy job results to Banking-job, set status etc */ jit=AB_Job_List2_First(hp->bankingJobs); if (jit) { AB_JOB *bj; bj=AB_Job_List2Iterator_Data(jit); assert(bj); while(bj) { AH_JOB *mj; GWEN_DB_NODE *beData; const char *s; const GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; AB_MESSAGE_LIST *ml; mj=AH_Provider__FindMyJob(mjl, AB_Job_GetIdForProvider(bj)); assert(mj); beData=AB_Job_GetProviderData(bj, pro); assert(beData); /* store used TAN (if any) */ s=AH_Job_GetUsedTan(mj); if (s) { GWEN_DB_SetCharValue(beData, GWEN_DB_FLAGS_OVERWRITE_VARS, "usedTan", s); AB_Job_SetUsedTan(bj, s); } if (getenv("AQHBCI_DEBUG_JOBS")) { /* DEBUG */ GWEN_DB_NODE *dbDebug; dbDebug=GWEN_DB_GetGroup(beData, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "rawParams"); assert(dbDebug); GWEN_DB_AddGroupChildren(dbDebug, AH_Job_GetParams(mj)); dbDebug=GWEN_DB_GetGroup(beData, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "rawArgs"); assert(dbDebug); GWEN_DB_AddGroupChildren(dbDebug, AH_Job_GetArguments(mj)); dbDebug=GWEN_DB_GetGroup(beData, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "rawResponses"); assert(dbDebug); GWEN_DB_AddGroupChildren(dbDebug, AH_Job_GetResponses(mj)); } /* exchange logs */ sl=AH_Job_GetLogs(mj); assert(sl); se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); AB_Job_LogRaw(bj, s); se=GWEN_StringListEntry_Next(se); } /* copy messages from AH_JOB to imexporter context */ ml=AH_Job_GetMessages(mj); if (ml) { AB_MESSAGE *msg; msg=AB_Message_List_First(ml); while(msg) { AB_ImExporterContext_AddMessage(ctx, AB_Message_dup(msg)); msg=AB_Message_List_Next(msg); } } /* exchange results */ rv=AH_Job_Exchange(mj, bj, AH_Job_ExchangeModeResults, ctx); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error exchanging results"); AB_Job_SetStatus(bj, AB_Job_StatusError); AB_Job_SetResultText(bj, "Could not exchange results"); } else { /* exchange was ok */ if (AH_Job_HasErrors(mj)) { if (AB_Job_GetStatus(bj)==AB_Job_StatusSent) { AB_Job_SetStatus(bj, AB_Job_StatusError); /* TODO: Copy errors */ AB_Job_SetResultText(bj, "Job contains errors"); AB_Job_Log(bj, GWEN_LoggerLevel_Warning, "aqhbci", "Job contains errors"); } } else { /* job is ok */ if (AB_Job_GetStatus(bj)==AB_Job_StatusSent) { AB_Job_SetStatus(bj, AB_Job_StatusFinished); AB_Job_Log(bj, GWEN_LoggerLevel_Notice, "aqhbci", "Job finished successfully"); AB_Job_SetResultText(bj, "Ok."); } successfull++; } } bj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } /* free outbox, the next AddJob call will create a new one */ AH_Outbox_free(hp->outbox); hp->outbox=0; /* release all jobs from my hold. If the application still has a hold * on a job then the following "free" will not actually free * that job but decrement its usage counter. */ AB_Job_List2_FreeAll(hp->bankingJobs); hp->bankingJobs=AB_Job_List2_new(); if (!successfull) return GWEN_ERROR_GENERIC; return 0; } int AH_Provider_ResetQueue(AB_PROVIDER *pro){ AH_PROVIDER *hp; AH_HBCI *h; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); h=AH_Provider_GetHbci(pro); assert(h); /* free outbox, the next AddJob call will create a new one */ AH_Outbox_free(hp->outbox); hp->outbox=0; /* release all jobs from my hold. If the application still has a hold * on a job then the following "free" will not actually free * that job but decrement its usage counter. */ AB_Job_List2_FreeAll(hp->bankingJobs); hp->bankingJobs=AB_Job_List2_new(); return 0; } int AH_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { return AH_User_Extend(u, pro, em, db); } int AH_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db){ return AH_Account_Extend(a, pro, em, db); } int AH_Provider_Update(AB_PROVIDER *pro, uint32_t lastVersion, uint32_t currentVersion) { if (lastVersion<((1<<24) | (8<<16) | (1<<8) | 3)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Version is too old, can't autoupgrade"); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_INFO | GWEN_GUI_MSG_FLAGS_CONFIRM_B1 | GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL, I18N("AqHBCI-Notice"), I18N( "The version of AqBanking/AqHBCI previously used is too old to be\n" "upgraded automatically.\n" "Therefore you should delete the settings file and setup AqBanking\n" "completely from scratch.\n" "The settings file usually is\n" " $HOME/.banking/settings.conf\n" "" "

" "The version of AqBanking/AqHBCI previously used is too old to be\n" "upgraded automatically.\n" "

" "

" "Therefore you should delete the settings file and setup AqBanking\n" "completely from scratch.\n" "

" "

" "The settings file usually is: \n" "" "$HOME/.banking/settings.conf\n" ".\n" "

" "" ), I18N("Continue"), 0, 0, 0); return GWEN_ERROR_INTERNAL; } return 0; } GWEN_DIALOG *AH_Provider_GetNewCardUserDialog(AB_PROVIDER *pro) { int rv; GWEN_BUFFER *mtypeName; GWEN_BUFFER *mediumName; GWEN_CRYPT_TOKEN *ct; mtypeName=GWEN_Buffer_new(0, 64, 0, 1); mediumName=GWEN_Buffer_new(0, 64, 0, 1); rv=AB_Banking_CheckCryptToken(AB_Provider_GetBanking(pro), GWEN_Crypt_Token_Device_Card, mtypeName, mediumName); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ShowError(I18N("Chipcard Error"), I18N("Error checking chip card (%d).\n" "Maybe libchipcard or its plugins are not installed?")); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return NULL; } rv=AB_Banking_GetCryptToken(AB_Provider_GetBanking(pro), GWEN_Buffer_GetStart(mtypeName), GWEN_Buffer_GetStart(mediumName), &ct); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return NULL; } if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "ddvcard")==0) { GWEN_DIALOG *dlg2; DBG_ERROR(0, "DDV card"); dlg2=AH_DdvCardDialog_new(AB_Provider_GetBanking(pro), ct); if (dlg2==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return NULL; } GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS DDV User")); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return dlg2; } else if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "starcoscard")==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "STARCOS RSA card currently not supported by this dialog"); // TODO } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Card type \"%s\" not yet supported", GWEN_Buffer_GetStart(mtypeName)); } GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); AB_Banking_ClearCryptTokenList(AB_Provider_GetBanking(pro)); return NULL; } GWEN_DIALOG *AH_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u) { AH_PROVIDER *hp; GWEN_DIALOG *dlg; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); switch(AH_User_GetCryptMode(u)) { case AH_CryptMode_Pintan: dlg=AH_EditUserPinTanDialog_new(AB_Provider_GetBanking(pro), u, 1); break; case AH_CryptMode_Ddv: dlg=AH_EditUserDdvDialog_new(AB_Provider_GetBanking(pro), u, 1); break; case AH_CryptMode_Rdh: dlg=AH_EditUserRdhDialog_new(AB_Provider_GetBanking(pro), u, 1); break; default: dlg=NULL; break; } if (dlg==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } GWEN_DIALOG *AH_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i) { AH_PROVIDER *hp; GWEN_DIALOG *dlg; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); DBG_INFO(AQHBCI_LOGDOMAIN, "Get user dialog %d", i); switch(i) { case AqHBCI_NewUserDialog_CodeExistingPinTan: dlg=AH_PinTanDialog_new(AB_Provider_GetBanking(pro)); break; case AqHBCI_NewUserDialog_CodeExistingChipcard: dlg=AH_Provider_GetNewCardUserDialog(pro); break; case AqHBCI_NewUserDialog_CodeCreateKeyFile: dlg=AH_NewKeyFileDialog_new(AB_Provider_GetBanking(pro)); break; case AqHBCI_NewUserDialog_CodeExistingKeyFile: dlg=AH_ImportKeyFileDialog_new(AB_Provider_GetBanking(pro)); break; case AqHBCI_NewUserDialog_CodeCreateChipcard: case AqHBCI_NewUserDialog_CodeGeneric: default: dlg=AH_NewUserDialog_new(AB_Provider_GetBanking(pro)); break; } if (dlg==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } GWEN_DIALOG *AH_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a) { AH_PROVIDER *hp; GWEN_DIALOG *dlg; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); dlg=AH_EditAccountDialog_new(AB_Provider_GetBanking(pro), a, 1); if (dlg==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } GWEN_DIALOG *AH_Provider_GetUserTypeDialog(AB_PROVIDER *pro) { AH_PROVIDER *hp; GWEN_DIALOG *dlg; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); dlg=AH_ChooseUserTypeDialog_new(AB_Provider_GetBanking(pro)); if (dlg==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } AH_HBCI *AH_Provider_GetHbci(const AB_PROVIDER *pro){ AH_PROVIDER *hp; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); return hp->hbci; } int AH_Provider_GetAccounts(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; AH_OUTBOX *ob; AB_ACCOUNT_LIST2 *accs; int rv; AH_PROVIDER *hp; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); job=AH_Job_UpdateBank_new(u); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, 1, doLock); AH_Outbox_free(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } if (AH_Job_HasErrors(job)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has errors"); // TODO: show errors AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } else { rv=AH_Job_Commit(job, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } /* check whether we got some accounts */ accs=AH_Job_UpdateBank_GetAccountList(job); assert(accs); if (AB_Account_List2_GetSize(accs)==0) { DBG_INFO(AQHBCI_LOGDOMAIN, "No accounts found"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NO_DATA; } AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_GetSysId(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; int rv; AH_PROVIDER *hp; const char *s; int i; char tbuf[256]; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); job=0; rv=0; for (i=0; ; i++) { AH_OUTBOX *ob; job=AH_Job_GetSysId_new(u); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, 1, doLock); AH_Outbox_free(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* check whether we received a sysid */ s=AH_Job_GetSysId_GetSysId(job); if (s && *s) { /* we did, commit the job and break loop */ rv=AH_Job_Commit(job, doLock); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } break; } if (AH_Job_HasItanResult(job)) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Adjusting to iTAN modes of the server")); rv=AH_Job_Commit(job, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } #if 0 /* save user in order to get the info written to config database for * inspection while debugging */ rv=AB_Banking_SaveUser(ab, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error saving user (%d)", rv); AH_Outbox_free(ob); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } #endif rv=GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Retrying to get system id.")); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in progress log, maybe user aborted?"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has no system id and no iTAN results"); // TODO: show errors AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } AH_Job_free(job); if (i>1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Tried too often, giving up"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not get system id after multiple trials")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } } /* for */ /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)\n", rv); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } s=AH_Job_GetSysId_GetSysId(job); if (!s) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No system id"); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NO_DATA; } AH_User_SetSystemId(u, s); AH_Job_free(job); /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); AB_Banking_EndExclUseUser(ab, u, 1); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_GetServerKeys(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; AH_OUTBOX *ob; int rv; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const char *s; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); job=AH_Job_GetKeys_new(u); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); return GWEN_ERROR_GENERIC; } ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, 1, doLock); AH_Outbox_free(ob); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not execute outbox.")); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } if (AH_Job_GetKeys_GetCryptKeyInfo(job)==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No crypt key received"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("No crypt key received.")); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } else { rv=AH_Job_Commit(job, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not commit result")); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } if (AH_Job_GetKeys_GetSignKeyInfo(job)==0) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Bank does not use a sign key.")); } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)\n", rv); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } s=AH_User_GetPeerId(u); if (!s || !*s) { s=AH_Job_GetKeys_GetPeerId(job); if (s && *s) { char tbuf[256]; snprintf(tbuf, sizeof(tbuf)-1, I18N("Setting peer ID to \"%s\")"), s); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, tbuf); AH_User_SetPeerId(u, s); } } /* get crypt token */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } else { GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t kid; /* store sign key (if any) */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); ki=AH_Job_GetKeys_GetSignKeyInfo(job); if (kid && ki) { rv=GWEN_Crypt_Token_SetKeyInfo(ct, kid, ki, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save key info (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error saving sign key")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Sign key saved"); } /* store crypt key */ kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); ki=AH_Job_GetKeys_GetCryptKeyInfo(job); if (kid && ki) { rv=GWEN_Crypt_Token_SetKeyInfo(ct, kid, ki, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save key info (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error saving crypt key")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Crypt key saved"); } /* store auth key (if any) */ kid=GWEN_Crypt_Token_Context_GetAuthVerifyKeyId(cctx); ki=AH_Job_GetKeys_GetAuthKeyInfo(job); if (kid && ki) { rv=GWEN_Crypt_Token_SetKeyInfo(ct, kid, ki, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not save key info (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error saving auth key")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 0); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } DBG_INFO(AQHBCI_LOGDOMAIN, "Auth key saved"); } } AH_Job_free(job); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Keys saved.")); /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not unlock user (%d)\n", rv); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_SendUserKeys2(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withAuthKey, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; AH_OUTBOX *ob; int rv; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; uint32_t kid; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo=NULL; const GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo=NULL; const GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo=NULL; int mounted=0; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); /* get crypt token */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(cctx); if (kid) { signKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (signKeyInfo==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Sign key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Sign key info not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No sign key id"); } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetDecipherKeyId(cctx); if (kid) { cryptKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (cryptKeyInfo==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Crypt key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Crypt key info not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No decipher key id"); } /* get auth sign key info */ if (withAuthKey) { kid=GWEN_Crypt_Token_Context_GetAuthSignKeyId(cctx); if (kid) { authKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (authKeyInfo==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Auth key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Auth key info not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } } else { DBG_INFO(AQHBCI_LOGDOMAIN, "No auth key id"); } } /* create job */ job=AH_Job_SendKeys_new(u, cryptKeyInfo, signKeyInfo, authKeyInfo); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Job not supported, should not happen")); if (!nounmount && mounted) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); /* enqueue job */ ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); /* execute queue */ rv=AH_Outbox_Execute(ob, ctx, withProgress, 0, doLock); AH_Outbox_free(ob); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not execute outbox.")); AH_Job_free(job); if (!nounmount && mounted) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* check result */ if (AH_Job_HasErrors(job)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has errors"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Job contains errors.")); AH_Job_free(job); if (!nounmount && mounted) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } else { rv=AH_Job_Commit(job, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not commit result")); AH_Job_free(job); if (!nounmount && mounted) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Keys sent")); AH_Job_free(job); if (!nounmount && mounted) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_SendUserKeys(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { return AH_Provider_SendUserKeys2(pro, u, ctx, 0, withProgress, nounmount, doLock); } int AH_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; int rv; AH_PROVIDER *hp; AH_DIALOG *dialog; uint32_t pid; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Getting Certificate"), I18N("We are now asking the server for its " "SSL certificate"), GWEN_GUI_PROGRESS_NONE, 0); /* first try */ dialog=AH_Dialog_new(u); assert(dialog); rv=AH_Dialog_TestServer_Https(dialog); AH_Dialog_Disconnect(dialog); AH_Dialog_free(dialog); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not connect to server (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Could not connect to server")); GWEN_Gui_ProgressEnd(pid); return rv; } GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Got certificate")); GWEN_Gui_ProgressEnd(pid); return 0; } int AH_Provider_GetItanModes(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; AH_OUTBOX *ob; int rv; AH_PROVIDER *hp; const int *tm; char tbuf[256]; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not lock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not lock user %s (%d)"), AB_User_GetUserId(u), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); return rv; } } job=AH_Job_GetItanModes_new(u); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, 1, 0); AH_Outbox_free(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox."); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } tm=AH_Job_GetItanModes_GetModes(job); if (tm[0]==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No iTAN modes reported"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("No iTAN modes reported.")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NO_DATA; } /* we have received tan methods, so there was a 3920 response. In this * special case we need to apply the job data, because otherwise we couldn't * fully connect to the server next time. */ rv=AH_Job_Commit(job, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not commit result to the system")); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); AB_Banking_EndExclUseUser(ab, u, 1); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_ChangePin(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AB_BANKING *ab; AH_HBCI *h; AH_JOB *job; AH_OUTBOX *ob; int rv; AH_PROVIDER *hp; char pwbuf[32]; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); memset(pwbuf, 0, sizeof(pwbuf)); rv=GWEN_Gui_InputBox(GWEN_GUI_INPUT_FLAGS_NUMERIC | GWEN_GUI_INPUT_FLAGS_CONFIRM, I18N("Enter New Banking PIN"), I18N("Please enter a new banking PIN.\n" "You must only enter numbers, not letters.\n" "" "

" "Please enter a new banking PIN." "

" "

" "You must only enter numbers, not letters." "

" ""), pwbuf, 0, 8, 0); job=AH_Job_ChangePin_new(u, pwbuf); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, nounmount, doLock); AH_Outbox_free(ob); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } if (AH_Job_HasErrors(job)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has errors"); // TODO: show errors AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } else { rv=AH_Job_Commit(job, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not commit result.\n"); AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } } AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider__HashRmd160(const uint8_t *p, unsigned int l, uint8_t *buf) { GWEN_MDIGEST *md; int rv; md=GWEN_MDigest_Rmd160_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_Update(md, p, l); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } memmove(buf, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); return 0; } int AH_Provider__HashSha256(const uint8_t *p, unsigned int l, uint8_t *buf) { GWEN_MDIGEST *md; int rv; md=GWEN_MDigest_Sha256_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_Update(md, p, l); if (rv<0) { GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { GWEN_MDigest_free(md); return rv; } memmove(buf, GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); return 0; } int AH_Provider_GetIniLetterTxt(AB_PROVIDER *pro, AB_USER *u, int useBankKey, int variant, GWEN_BUFFER *lbuf, int nounmount) { if (variant==0) { switch(AH_User_GetRdhType(u)) { case 0: case 1: variant=1; break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: variant=2; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH mode %d not supported", AH_User_GetRdhType(u)); return GWEN_ERROR_INVALID; } } switch(variant) { case 1: return AH_Provider_GetIniLetterTxt1(pro, u, useBankKey, lbuf, nounmount); case 2: return AH_Provider_GetIniLetterTxt2(pro, u, useBankKey, lbuf, nounmount); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Variant %d not supported", variant); return GWEN_ERROR_INVALID; } } int AH_Provider_GetIniLetterHtml(AB_PROVIDER *pro, AB_USER *u, int useBankKey, int variant, GWEN_BUFFER *lbuf, int nounmount) { if (variant==0) { switch(AH_User_GetRdhType(u)) { case 0: case 1: variant=1; break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: variant=2; break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH mode %d not supported", AH_User_GetRdhType(u)); return GWEN_ERROR_INVALID; } } switch(variant) { case 1: return AH_Provider_GetIniLetterHtml1(pro, u, useBankKey, lbuf, nounmount); case 2: return AH_Provider_GetIniLetterHtml2(pro, u, useBankKey, lbuf, nounmount); default: DBG_ERROR(AQHBCI_LOGDOMAIN, "Variant %d not supported", variant); return GWEN_ERROR_INVALID; } } int AH_Provider_GetIniLetterTxt1(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount) { AB_BANKING *ab; AH_HBCI *h; const void *p; unsigned int l; GWEN_BUFFER *bbuf; GWEN_BUFFER *keybuf; int i; GWEN_TIME *ti; char numbuf[32]; char hashbuffer[21]; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; uint32_t kid; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } if (useBankKey) { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "Server keys missing, please get them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Server keys missing, " "please get them first")); return GWEN_ERROR_NOT_FOUND; } } else { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "User keys missing, please generate them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User keys missing, " "please generate them first")); return GWEN_ERROR_NOT_FOUND; } } keybuf=GWEN_Buffer_new(0, 257, 0, 1); /* prelude */ GWEN_Buffer_AppendString(lbuf, I18N("\n\n\nINI-Letter\n\n")); GWEN_Buffer_AppendString(lbuf, I18N("Date : ")); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, I18N("YYYY/MM/DD"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Time : ")); GWEN_Time_toString(ti, I18N("hh:mm:ss"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); if (useBankKey) { GWEN_Buffer_AppendString(lbuf, I18N("Bank Code : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetBankCode(u)); } else { GWEN_Buffer_AppendString(lbuf, I18N("User : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetUserId(u)); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key number : ")); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key version : ")); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, I18N("Customer system: ")); GWEN_Buffer_AppendString(lbuf, AH_HBCI_GetProductName(h)); GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Public key for electronic signature")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "\n\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, 97, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<96) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 96-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<6; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_FillWithBytes(keybuf, 0, 128-l); GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); /* modulus */ GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Modulus")); GWEN_Buffer_AppendString(lbuf, "\n\n"); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); l=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, 97, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<96) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 96-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<6; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_FillWithBytes(keybuf, 0, 128-l); GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Hash")); GWEN_Buffer_AppendString(lbuf, "\n\n"); rv=AH_Provider__HashRmd160((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_free(keybuf); GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 20, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("I confirm that I created the above key " "for my electronic signature.\n")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("____________________________ " "____________________________\n" "Place, date " "Signature\n")); } return 0; } int AH_Provider_GetIniLetterHtml1(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount) { AB_BANKING *ab; AH_HBCI *h; const void *p; unsigned int l; GWEN_BUFFER *bbuf; GWEN_BUFFER *keybuf; int i; GWEN_TIME *ti; char numbuf[32]; char hashbuffer[21]; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; uint32_t kid; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } if (useBankKey) { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "Server keys missing, please get them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Server keys missing, " "please get them first")); return GWEN_ERROR_NOT_FOUND; } } else { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "User keys missing, please generate them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User keys missing, " "please generate them first")); return GWEN_ERROR_NOT_FOUND; } } keybuf=GWEN_Buffer_new(0, 257, 0, 1); /* prelude */ GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("INI-Letter")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); if (useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n"); } else { GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Date")); GWEN_Buffer_AppendString(lbuf, "\n"); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, I18N("YYYY/MM/DD"), lbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Time")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Time_toString(ti, I18N("hh:mm:ss"), lbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Bank Code")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AB_User_GetBankCode(u)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("User")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key number")); GWEN_Buffer_AppendString(lbuf, "\n"); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key version")); GWEN_Buffer_AppendString(lbuf, "\n"); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Customer system")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AH_HBCI_GetProductName(h)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Public key for electronic signature")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "

\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(lbuf, "\n"); bbuf=GWEN_Buffer_new(0, 97, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<96) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 96-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<6; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "
\n"); } GWEN_Buffer_FillWithBytes(keybuf, 0, 128-l); GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); /* modulus */ GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Modulus")); GWEN_Buffer_AppendString(lbuf, "

\n"); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); l=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(lbuf, "\n"); bbuf=GWEN_Buffer_new(0, 97, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<96) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 96-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<6; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "
\n"); } GWEN_Buffer_FillWithBytes(keybuf, 0, 128-l); GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Hash")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); rv=AH_Provider__HashRmd160((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_free(keybuf); GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 20, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, I18N("I confirm that I created the above key " "for my electronic signature.\n")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "____________________________ "); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "____________________________ "); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Place, date")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Signature")); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); } return 0; } int AH_Provider_GetIniLetterTxt2(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount) { AB_BANKING *ab; AH_HBCI *h; const void *p; unsigned int l; unsigned int modLen; GWEN_BUFFER *bbuf; GWEN_BUFFER *keybuf; int i; GWEN_TIME *ti; char numbuf[32]; char hashbuffer[33]; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; uint32_t kid; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } if (useBankKey) { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "Server keys missing, please get them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Server keys missing, " "please get them first")); return GWEN_ERROR_NOT_FOUND; } } else { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "User keys missing, please generate them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User keys missing, " "please generate them first")); return GWEN_ERROR_NOT_FOUND; } } #if 0 modLen=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); #else /* use the real modulus length */ modLen=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); #endif keybuf=GWEN_Buffer_new(0, (modLen*2)+1, 0, 1); /* prelude */ GWEN_Buffer_AppendString(lbuf, I18N("\n\n\nINI-Letter\n\n")); GWEN_Buffer_AppendString(lbuf, I18N("Date : ")); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, I18N("YYYY/MM/DD"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Time : ")); GWEN_Time_toString(ti, I18N("hh:mm:ss"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); if (useBankKey) { GWEN_Buffer_AppendString(lbuf, I18N("Bank Code : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetBankCode(u)); } else { GWEN_Buffer_AppendString(lbuf, I18N("User : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetUserId(u)); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key number : ")); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key version : ")); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, I18N("Customer system: ")); GWEN_Buffer_AppendString(lbuf, AH_HBCI_GetProductName(h)); GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Public key for electronic signature")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "\n\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, modLen+1, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l16) rl=16; GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, rl, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=rl; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); /* modulus */ GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Modulus")); GWEN_Buffer_AppendString(lbuf, "\n\n"); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); l=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, modLen+1, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i16) rl=16; GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, rl, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=rl; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Hash (RMD-160)")); GWEN_Buffer_AppendString(lbuf, "\n\n"); rv=AH_Provider__HashRmd160((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 10, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n "); if (GWEN_Text_ToHexBuffer(hashbuffer+10, 10, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Hash (SHA-256)")); GWEN_Buffer_AppendString(lbuf, "\n\n"); rv=AH_Provider__HashSha256((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_free(keybuf); GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n "); if (GWEN_Text_ToHexBuffer(hashbuffer+16, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("I confirm that I created the above key " "for my electronic signature.\n")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("____________________________ " "____________________________\n" "Place, date " "Signature\n")); } return 0; } int AH_Provider_GetIniLetterHtml2(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount) { AB_BANKING *ab; AH_HBCI *h; const void *p; unsigned int l; GWEN_BUFFER *bbuf; GWEN_BUFFER *keybuf; int i; GWEN_TIME *ti; char numbuf[32]; char hashbuffer[33]; AH_PROVIDER *hp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; uint32_t kid; int rv; int modLen; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error getting crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open crypt token (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error opening crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } /* get context */ cctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (!cctx) { DBG_ERROR(AQHBCI_LOGDOMAIN, "User context not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User context not found on crypt token")); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_NOT_FOUND; } if (useBankKey) { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "Server keys missing, please get them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Server keys missing, " "please get them first")); return GWEN_ERROR_NOT_FOUND; } } else { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(cctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); DBG_ERROR(AQHBCI_LOGDOMAIN, "User keys missing, please generate them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User keys missing, " "please generate them first")); return GWEN_ERROR_NOT_FOUND; } } #if 0 modLen=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); #else /* use the real modulus length */ modLen=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); #endif keybuf=GWEN_Buffer_new(0, 257, 0, 1); /* prelude */ GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("INI-Letter")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); if (useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n"); } else { GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Date")); GWEN_Buffer_AppendString(lbuf, "\n"); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, I18N("YYYY/MM/DD"), lbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Time")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Time_toString(ti, I18N("hh:mm:ss"), lbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Bank Code")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AB_User_GetBankCode(u)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("User")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key number")); GWEN_Buffer_AppendString(lbuf, "\n"); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyNumber(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Key version")); GWEN_Buffer_AppendString(lbuf, "\n"); snprintf(numbuf, sizeof(numbuf), "%d", GWEN_Crypt_Token_KeyInfo_GetKeyVersion(ki)); GWEN_Buffer_AppendString(lbuf, numbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Customer system")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, AH_HBCI_GetProductName(h)); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Public key for electronic signature")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "

\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(lbuf, "\n"); bbuf=GWEN_Buffer_new(0, modLen+1, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l16) rl=16; GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, rl, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=rl; GWEN_Buffer_AppendString(lbuf, "
\n"); } GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); /* modulus */ GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Modulus")); GWEN_Buffer_AppendString(lbuf, "

\n"); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); l=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(lbuf, "\n"); bbuf=GWEN_Buffer_new(0, modLen+1, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i16) rl=16; GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, rl, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } p+=rl; GWEN_Buffer_AppendString(lbuf, "
\n"); } GWEN_Buffer_AppendBuffer(keybuf, bbuf); GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Hash (RMD-160)")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); rv=AH_Provider__HashRmd160((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 20, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "

"); GWEN_Buffer_AppendString(lbuf, I18N("Hash (SHA-256)")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); rv=AH_Provider__HashSha256((const uint8_t*)GWEN_Buffer_GetStart(keybuf), GWEN_Buffer_GetUsedBytes(keybuf), (uint8_t*)hashbuffer); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } GWEN_Buffer_free(keybuf); GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(hashbuffer, 32, lbuf, 2, ' ', 0)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error converting to hex??"); abort(); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, I18N("I confirm that I created the above key " "for my electronic signature.\n")); GWEN_Buffer_AppendString(lbuf, "

\n"); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "____________________________ "); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, "____________________________ "); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, I18N("Place, date")); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Signature")); GWEN_Buffer_AppendString(lbuf, "
\n"); GWEN_Buffer_AppendString(lbuf, "
\n"); } return 0; } int AH_Provider_CreateKeys(AB_PROVIDER *pro, AB_USER *u, int nounmount) { GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t keyId; GWEN_CRYPT_CRYPTALGO *algo; int rv; AH_HBCI *h; const GWEN_CRYPT_TOKEN_KEYINFO *oki; GWEN_CRYPT_TOKEN_KEYINFO *ki; int rdhType; int maxServerKeySizeInBits=0; h=AH_Provider_GetHbci(pro); assert(h); /* check crypt mode */ if (AH_User_GetCryptMode(u)!=AH_CryptMode_Rdh) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Key generation not supported with this token"); return GWEN_ERROR_INVALID; } rdhType=AH_User_GetRdhType(u); if (rdhType==0) rdhType=1; /* get token */ rv=AB_Banking_GetCryptToken(AH_HBCI_GetBankingApi(h), AH_User_GetTokenType(u), AH_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error getting the user's crypt token (%d)", rv); return rv; } /* we always use 65537 as public exponent */ GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_EXP_65537); /* create algo */ algo=GWEN_Crypt_CryptAlgo_new(GWEN_Crypt_CryptAlgoId_Rsa, GWEN_Crypt_CryptMode_None); /* open token for admin */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error opening crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } /* get context */ ctx=GWEN_Crypt_Token_GetContext(ct, AH_User_GetTokenContextId(u), 0); if (ctx==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get context %d", AH_User_GetTokenContextId(u)); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } if (rdhType==10) { /* the specs say that for RDH-10 we must not create keys longer than the server's * sign key (or, if absent, the server's encipher key) */ uint32_t skeyId; const GWEN_CRYPT_TOKEN_KEYINFO *ski; skeyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (skeyId==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No verify key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } ski=GWEN_Crypt_Token_GetKeyInfo(ct, skeyId, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS, 0); /* the fact that a key info exists does not mean that it contains key data (modulus and exp), * so we need to check for key data explicitly */ if (!(ski && GWEN_Crypt_Token_KeyInfo_GetModulusData(ski) && GWEN_Crypt_Token_KeyInfo_GetModulusLen(ski))) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Server has no sign key, using encipher key")); skeyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); if (skeyId==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No encipher key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } ski=GWEN_Crypt_Token_GetKeyInfo(ct, skeyId, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS, 0); } if (ski) { const uint8_t *modPtr; uint32_t modLen; modPtr=GWEN_Crypt_Token_KeyInfo_GetModulusData(ski); modLen=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ski); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Server key has a modulus size of %d bytes", modLen); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Notice, I18N("Server key has a modulus size of %d bytes"), modLen); if (modPtr && modLen) { /* The specs require us to use a key no longer than that of the server, * so for our key we use the largest multiple of 8 smaller or equal to * the length of the server key in order to keep everyone happy. */ maxServerKeySizeInBits=modLen*8; while(modLen && *modPtr==0) { maxServerKeySizeInBits-=8; modLen--; modPtr++; } if (modLen && (*modPtr&0x80)==0) maxServerKeySizeInBits-=8; DBG_NOTICE(AQHBCI_LOGDOMAIN, "Max Server Keysize in bits: %d", maxServerKeySizeInBits); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "Key info for key %d has no modulus data, using default key size (2048 bits)", (int) skeyId); } } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "No key info found for key %d", (int) skeyId); } } switch(rdhType) { case 1: GWEN_Crypt_CryptAlgo_SetChunkSize(algo, 96); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, 768); break; case 2: GWEN_Crypt_CryptAlgo_SetChunkSize(algo, 256); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, 2048); break; case 3: GWEN_Crypt_CryptAlgo_SetChunkSize(algo, 256); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, 2048); break; case 5: GWEN_Crypt_CryptAlgo_SetChunkSize(algo, 256); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, 2048); break; case 10: if (maxServerKeySizeInBits) { int n=maxServerKeySizeInBits/8; assert(maxServerKeySizeInBits%8==0); GWEN_Crypt_CryptAlgo_SetChunkSize(algo, n); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, maxServerKeySizeInBits); DBG_NOTICE(AQHBCI_LOGDOMAIN, "Creating keys of size: %d bytes, %d bits", n, maxServerKeySizeInBits); } else { GWEN_Crypt_CryptAlgo_SetChunkSize(algo, 256); GWEN_Crypt_CryptAlgo_SetKeySizeInBits(algo, 2048); } break; default: DBG_ERROR(AQHBCI_LOGDOMAIN, "RDH %d not supported", AH_User_GetRdhType(u)); return GWEN_ERROR_INVALID; } GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Notice, I18N("Creating keys with %d bits (%d bytes), please wait..."), GWEN_Crypt_CryptAlgo_GetKeySizeInBits(algo), GWEN_Crypt_CryptAlgo_GetChunkSize(algo)); /* get cipher key id */ keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (keyId==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No decipher key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } /* generate cipher key */ rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Error creating cipher key (%d)"), rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* set key number/version */ oki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (oki==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get KeyInfo for newly created key %d", keyId); GWEN_Crypt_CryptAlgo_free(algo); return rv; } ki=GWEN_Crypt_Token_KeyInfo_dup(oki); if (rdhType>1) GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, rdhType); else GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, 1); GWEN_Crypt_Token_KeyInfo_SetKeyVersion(ki, 1); GWEN_Crypt_Token_KeyInfo_AddFlags(ki, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER); rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* get sign key id */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (keyId==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No sign key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } /* generate sign key */ rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Error creating sign key (%d)"), rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* set key number/version */ oki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (oki==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get KeyInfo for newly created key %d", keyId); GWEN_Crypt_CryptAlgo_free(algo); return rv; } ki=GWEN_Crypt_Token_KeyInfo_dup(oki); if (rdhType>1) GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, rdhType); else { if (AH_User_GetHbciVersion(u)>=300) GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, 1); else GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, 2); } GWEN_Crypt_Token_KeyInfo_SetKeyVersion(ki, 1); GWEN_Crypt_Token_KeyInfo_AddFlags(ki, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER); rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* get auth sign key id */ keyId=GWEN_Crypt_Token_Context_GetAuthSignKeyId(ctx); if (keyId) { /* generate auth sign key */ rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Error creating auth key (%d)"), rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* set key number/version */ oki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (oki==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not get KeyInfo for newly created key %d", keyId); GWEN_Crypt_CryptAlgo_free(algo); return rv; } ki=GWEN_Crypt_Token_KeyInfo_dup(oki); if (rdhType>1) GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, rdhType); else { if (AH_User_GetHbciVersion(u)>=300) GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, 1); else GWEN_Crypt_Token_KeyInfo_SetKeyNumber(ki, 3); } GWEN_Crypt_Token_KeyInfo_SetKeyVersion(ki, 1); GWEN_Crypt_Token_KeyInfo_AddFlags(ki, GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER); rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } if (!nounmount) { /* close token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error closing crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } GWEN_Crypt_CryptAlgo_free(algo); return 0; } int AH_Provider_SendDtazv(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_IMEXPORTER_CONTEXT *ctx, const uint8_t *dataPtr, uint32_t dataLen, int withProgress, int nounmount, int doLock) { AH_PROVIDER *hp; AB_BANKING *ab; AH_HBCI *h; AB_USER *u; AH_JOB *job; AH_OUTBOX *ob; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); assert(a); /* gather all objects */ u=AB_Account_GetFirstUser(a); if (!u) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No user for this account"); return GWEN_ERROR_NOT_AVAILABLE; } ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); job=AH_Job_ForeignTransferWH_new(u, a); if (!job) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job not supported, should not happen"); return GWEN_ERROR_GENERIC; } rv=AH_Job_ForeignTransferWH_SetDtazv(job, dataPtr, dataLen); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AH_Job_free(job); return rv; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); ob=AH_Outbox_new(h); AH_Outbox_AddJob(ob, job); rv=AH_Outbox_Execute(ob, ctx, withProgress, 1, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); AH_Job_free(job); AH_Outbox_free(ob); return rv; } AH_Outbox_free(ob); if (AH_Job_HasErrors(job) || AH_Job_GetStatus(job)==AH_JobStatusError) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Job has errors"); // TODO: show errors AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return GWEN_ERROR_GENERIC; } AH_Job_free(job); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_GetAccountSepaInfo(AB_PROVIDER *pro, AB_ACCOUNT_LIST2 *al, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock) { AH_PROVIDER *hp; AB_BANKING *ab; AH_HBCI *h; AH_OUTBOX *ob; AB_ACCOUNT_LIST2_ITERATOR *ait; int rv; assert(pro); hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro); assert(hp); ab=AB_Provider_GetBanking(pro); assert(ab); h=AH_Provider_GetHbci(pro); assert(h); ob=AH_Outbox_new(h); /* sample jobs */ ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { AB_USER *u; AH_JOB *job; u=AB_Account_GetFirstUser(a); if (!u) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No user for this account"); } else { job=AH_Job_GetAccountSepaInfo_new(u, a); if (!job) { DBG_WARN(AQHBCI_LOGDOMAIN, "Job not supported with this account"); AB_Account_List2Iterator_free(ait); AH_Outbox_free(ob); return GWEN_ERROR_GENERIC; } AH_Job_AddSigner(job, AB_User_GetUserId(u)); AH_Outbox_AddJob(ob, job); AH_Job_free(job); } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } rv=AH_Outbox_Execute(ob, ctx, withProgress, nounmount, doLock); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); AH_Outbox_free(ob); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return rv; } AH_Outbox_free(ob); if (!nounmount) AB_Banking_ClearCryptTokenList(AH_HBCI_GetBankingApi(h)); return 0; } int AH_Provider_WriteValueToDb(const AB_VALUE *v, GWEN_DB_NODE *dbV) { if (v) { GWEN_BUFFER *nbuf; char *p; const char *s; int l; nbuf=GWEN_Buffer_new(0, 32, 0, 1); AH_Job_ValueToChallengeString(v, nbuf); l=GWEN_Buffer_GetUsedBytes(nbuf); if (!l) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion"); GWEN_Buffer_free(nbuf); abort(); } /* replace "C" comma with "DE" comma, remove thousand's comma */ p=GWEN_Buffer_GetStart(nbuf); s=p; while(*s) { if (*s=='.') { *p=','; p++; } else if (*s!=',') { *p=*s; p++; } s++; } /* while */ *p=0; if (strchr(GWEN_Buffer_GetStart(nbuf), ',')) { /* kill all trailing '0' behind the comma */ p=GWEN_Buffer_GetStart(nbuf)+l; while(l--) { --p; if (*p=='0') *p=0; else break; } } else GWEN_Buffer_AppendString(nbuf, ","); /* store value */ GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); s=AB_Value_GetCurrency(v); if (!s) s="EUR"; GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", s); return 0; } /* if value */ else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No value"); return GWEN_ERROR_NO_DATA; } } #include "message_l.h" #include #include #if 0 static int AH_Provider_Test1(AB_PROVIDER *pro) { AB_BANKING *ab; FILE *f; ab=AB_Provider_GetBanking(pro); assert(ab); f=fopen("test.msg", "r"); if (f) { GWEN_BUFFER *tbuf; AB_USER *u; AH_DIALOG *dlg; AH_MSG *msg; GWEN_DB_NODE *rsp; tbuf=GWEN_Buffer_new(0, 1024, 0, 1); while(!feof(f)) { char buffer[256]; ssize_t i; i=fread(buffer, 1, sizeof(buffer), f); if (i<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error on read: %d (%s)", errno, strerror(errno)); return -1; } GWEN_Buffer_AppendBytes(tbuf, buffer, i); } fclose(f); GWEN_Buffer_Rewind(tbuf); u=AB_Banking_FindUser(ab, "aqhbci", "de", "28250110", "*", "*"); assert(u); dlg=AH_Dialog_new(u, 0); assert(dlg); AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR); msg=AH_Msg_new(dlg); assert(msg); AH_Msg_SetBuffer(msg, tbuf); rsp=GWEN_DB_Group_new("response"); if (AH_Msg_DecodeMsg(msg, rsp, GWEN_MSGENGINE_READ_FLAGS_DEFAULT)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message:"); AH_Msg_Dump(msg, stderr, 2); return -1; } fprintf(stderr, "Response is:\n"); AH_Msg_Dump(msg, stderr, 2); } return 0; } static int AH_Provider_Test2(AB_PROVIDER *pro) { AB_BANKING *ab; AB_USER *u; AH_DIALOG *dlg; AH_MSG *msg; GWEN_BUFFER *tbuf; ab=AB_Provider_GetBanking(pro); assert(ab); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AppendString(tbuf, "(Test-String)"); GWEN_Buffer_Rewind(tbuf); u=AB_Banking_FindUser(ab, "aqhbci", "de", "28250110", "*", "*"); assert(u); dlg=AH_Dialog_new(u, 0); assert(dlg); AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR); msg=AH_Msg_new(dlg); assert(msg); AH_Msg_SetBuffer(msg, tbuf); AH_Msg_AddSignerId(msg, AB_User_GetUserId(u)); AH_Msg_SetCrypterId(msg, AB_User_GetUserId(u)); if (AH_Msg_EncodeMsg(msg)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message:"); AH_Msg_Dump(msg, stderr, 2); return -1; } fprintf(stderr, "Message is:\n"); AH_Msg_Dump(msg, stderr, 2); return 0; } static int AH_Provider_Test3(AB_PROVIDER *pro) { AB_BANKING *ab; FILE *f; ab=AB_Provider_GetBanking(pro); assert(ab); f=fopen("test.msg", "r"); if (f) { GWEN_BUFFER *tbuf; AB_USER *u; AH_DIALOG *dlg; AH_MSG *msg; int rv; GWEN_DB_NODE *rsp; tbuf=GWEN_Buffer_new(0, 1024, 0, 1); while(!feof(f)) { char buffer[256]; ssize_t i; i=fread(buffer, 1, sizeof(buffer), f); if (i<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error on read: %d (%s)", errno, strerror(errno)); return -1; } GWEN_Buffer_AppendBytes(tbuf, buffer, i); } fclose(f); GWEN_Buffer_Rewind(tbuf); u=AB_Banking_FindUser(ab, "aqhbci", "de", "20090500", "*", "*"); assert(u); dlg=AH_Dialog_new(u, 0); assert(dlg); AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR); msg=AH_Msg_new(dlg); assert(msg); AH_Msg_SetBuffer(msg, tbuf); rsp=GWEN_DB_Group_new("response"); rv=AH_Msg_DecodeMsg(msg, rsp, GWEN_MSGENGINE_READ_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message: (%d)", rv); AH_Msg_Dump(msg, stderr, 2); return -1; } fprintf(stderr, "Response is:\n"); AH_Msg_Dump(msg, stderr, 2); } return 0; } #endif static int AH_Provider_Test4(AB_PROVIDER *pro) { AB_BANKING *ab; AB_USER *u; AH_DIALOG *dlg; AH_MSG *msg; GWEN_BUFFER *tbuf; ab=AB_Provider_GetBanking(pro); assert(ab); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AppendString(tbuf, "(Test-String)"); GWEN_Buffer_Rewind(tbuf); u=AB_Banking_FindUser(ab, "aqhbci", "de", "20090500", "*", "*"); assert(u); dlg=AH_Dialog_new(u); assert(dlg); AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR); msg=AH_Msg_new(dlg); assert(msg); AH_Msg_SetBuffer(msg, tbuf); AH_Msg_SetHbciVersion(msg, 220); AH_Msg_AddSignerId(msg, AB_User_GetUserId(u)); AH_Msg_SetCrypterId(msg, AB_User_GetUserId(u)); if (AH_Msg_EncodeMsg(msg)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message:"); AH_Msg_Dump(msg, 2); return -1; } fprintf(stderr, "Message is:\n"); AH_Msg_Dump(msg, 2); return 0; } int AH_Provider_Test(AB_PROVIDER *pro) { return AH_Provider_Test4(pro); } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/provider.h0000644000175000017500000002146212364015477023437 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_PROVIDER_H #define AH_PROVIDER_H #include #include #include #include #include /** @defgroup G_AB_BE_AQHBCI HBCI Backend (AqHBCI) * @ingroup G_AB_BACKENDS * * AqHBCI supports the German HBCI (Homebanking Computer Interface) protocol * for online banking. It currently supports version 2.01, 2.10 and 2.20 of * the HBCI specification. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * This enum can be used as argument to @ref AB_Provider_GetNewUserDialog */ enum AQHBCI_NEWUSER_DIALOG_CODE { AqHBCI_NewUserDialog_CodeGeneric=0, AqHBCI_NewUserDialog_CodeExistingPinTan, AqHBCI_NewUserDialog_CodeCreateKeyFile, AqHBCI_NewUserDialog_CodeExistingKeyFile, AqHBCI_NewUserDialog_CodeCreateChipcard, AqHBCI_NewUserDialog_CodeExistingChipcard }; AQHBCI_API AB_PROVIDER *AH_Provider_new(AB_BANKING *ab, const char *name); /** @name Informative Functions * */ /*@{*/ AQHBCI_API const char *AH_Provider_GetProductName(const AB_PROVIDER *pro); AQHBCI_API const char *AH_Provider_GetProductVersion(const AB_PROVIDER *pro); /*@}*/ /** @name Server Interactive Functions * * Functions in this group are used from setup wizards or tools. * They send requests to the server (including opening and closing of the * progress dialog by calling @ref AB_Banking_ProgressStart etc). */ /*@{*/ /** * Retrieve a list of accounts. Not all banks support this. If the bank does * then the retrieved accounts are automatically added to AqBanking. * @param pro pointer to the HBCI provider * @param u user for which the list of accounts is to be received * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetAccounts(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Retrieve the system id for the given user. This is only needed for * PIN/TAN and for RDH mode. * @param pro pointer to the HBCI provider * @param u user for which the system id is to be received * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetSysId(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Retrieve the public server keys for the given user. This is only needed for * PIN/TAN and for RDH mode. * @param pro pointer to the HBCI provider * @param u user for which the public keys are to be received * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetServerKeys(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Send the public keys of the given user. This is only needed for * PIN/TAN and for RDH mode. * @param pro pointer to the HBCI provider * @param u user for which the public keys are to be sent * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_SendUserKeys(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Send the public keys of the given user. This is only needed for * PIN/TAN and for RDH mode. * In addition to @ref AH_Provider_SendUserKeys this function also sends the * authentication key if requested. * @param pro pointer to the HBCI provider * @param u user for which the public keys are to be sent * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_SendUserKeys2(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withAuthKey, int withProgress, int nounmount, int doLock); /** * Retrieve the SSL certificate for the given user. This is only needed for * PIN/TAN mode. * @param pro pointer to the HBCI provider * @param u user for which the SSL certificate is to be received * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u, int withProgress, int nounmount, int doLock); /** * Ask the server for the list of supported iTAN modes. Not all servers * support iTAN so it is ok for the server to not report any modes. * @param pro pointer to the HBCI provider * @param u user for which the list of iTAN modes is to be received * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetItanModes(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Ask the user for a new PIN and make the server change the PIN to the * newly entered one. * @param pro pointer to the HBCI provider * @param u user for which the pin is to be changed * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_ChangePin(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /** * Request SEPA information for a given account. This info is then stored * within the AqBanking account information (IBAN, BIC). * @param pro pointer to the HBCI provider * @param a account for which the info is to be requested * @param nounmount if !=0 then the user's medium is not unmounted in the end. * This is used by setup wizards to avoid having to enter a pin too often. */ AQHBCI_API int AH_Provider_GetAccountSepaInfo(AB_PROVIDER *pro, AB_ACCOUNT_LIST2 *al, AB_IMEXPORTER_CONTEXT *ctx, int withProgress, int nounmount, int doLock); /*@}*/ /** @name Generating Ini-Letters * * INI letters are used in RDH mode only. They are used to verify the public * server keys and to create a letter to be sent to the bank for verification * of the public user keys. */ /*@{*/ /** * Creates a text version of the INI letter. This function needs to mount * the medium so the user will be ask for the pin. * @param pro provider * @param u user for which the iniletter is to be created * @param useBankKey if !=0 create an iniletter for the bank key * @param variant use 1 for RDH1, 2 for RDH2-10 (or 0 for autoselection) * @param lbuf buffer to write the iniletter to * @param nounmount if !=0 the CryptToken will not be unmounted after use */ AQHBCI_API int AH_Provider_GetIniLetterTxt(AB_PROVIDER *pro, AB_USER *u, int useBankKey, int variant, GWEN_BUFFER *lbuf, int nounmount); /** * Creates a HTML version of the INI letter. This function needs to mount * the medium so the user will be ask for the pin. * @param pro provider * @param u user for which the iniletter is to be created * @param useBankKey if !=0 create an iniletter for the bank key * @param variant use 1 for RDH1, 2 for RDH2-10 (or 0 for autoselection) * @param lbuf buffer to write the iniletter to * @param nounmount if !=0 the CryptToken will not be unmounted after use */ AQHBCI_API int AH_Provider_GetIniLetterHtml(AB_PROVIDER *pro, AB_USER *u, int useBankKey, int variant, GWEN_BUFFER *lbuf, int nounmount); /*@}*/ AQHBCI_API int AH_Provider_CreateKeys(AB_PROVIDER *pro, AB_USER *u, int nounmount); AQHBCI_API int AH_Provider_Test(AB_PROVIDER *pro); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AH_PROVIDER_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/provider_p.h0000644000175000017500000000634512364015477023761 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AH_PROVIDER_P_H #define AH_PROVIDER_P_H #define AH_PROVIDER_DATADIR ".libaqhbci" #include "provider_l.h" #include "job_l.h" #include "outbox_l.h" typedef struct AH_PROVIDER AH_PROVIDER; struct AH_PROVIDER { AH_HBCI *hbci; AB_JOB_LIST2 *bankingJobs; AH_OUTBOX *outbox; GWEN_DB_NODE *dbTempConfig; }; static void GWENHYWFAR_CB AH_Provider_FreeData(void *bp, void *p); static AH_JOB *AH_Provider__FindMyJob(AH_JOB_LIST *mjl, uint32_t jid); static int AH_Provider__HashRmd160(const uint8_t *p, unsigned int l, uint8_t *buf); static int AH_Provider__HashSha256(const uint8_t *p, unsigned int l, uint8_t *buf); /** @name Overwritten Virtual Functions * */ /*@{*/ static int AH_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int AH_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int AH_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j); static int AH_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j); static int AH_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); static int AH_Provider_ResetQueue(AB_PROVIDER *pro); static int AH_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); static int AH_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); static int AH_Provider_Update(AB_PROVIDER *pro, uint32_t lastVersion, uint32_t currentVersion); static GWEN_DIALOG *AH_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i); static GWEN_DIALOG *AH_Provider_GetNewCardUserDialog(AB_PROVIDER *pro); static GWEN_DIALOG *AH_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u); static GWEN_DIALOG *AH_Provider_GetUserTypeDialog(AB_PROVIDER *pro); static GWEN_DIALOG *AH_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a); static int AH_Provider_GetIniLetterTxt1(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); static int AH_Provider_GetIniLetterHtml1(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); static int AH_Provider_GetIniLetterTxt2(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); static int AH_Provider_GetIniLetterHtml2(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); static int AH_Provider__GetMultiHbciJob(AB_PROVIDER *pro, AB_JOB *j, AH_JOB **pHbciJob); static int AH_Provider__CreateHbciJob(AB_PROVIDER *pro, AB_JOB *j, AH_JOB **pHbciJob); static int AH_Provider__AddAccountSepaInfoJobsToOutBox(AB_PROVIDER *pro, AH_OUTBOX *ob); /*@}*/ #endif /* AH_PROVIDER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/banking/Makefile.am0000644000175000017500000000135212375175275023471 00000000000000 AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(srcdir)/../msglayer -I$(srcdir)/../joblayer \ -I$(srcdir)/../applayer -I$(srcdir)/../ajobs -I$(srcdir)/.. \ -I$(srcdir)/../dialogs localedir = $(datadir)/locale DEFS += -DLOCALEDIR=\"$(localedir)\" \ -DAQHBCI_PLUGINS=\"$(aqhbci_plugindir)\" noinst_LTLIBRARIES=libhbcibanking.la noinst_HEADERS=\ provider_l.h \ provider_p.h iheaderdir=@aqbanking_headerdir_am@/aqhbci iheader_HEADERS=\ provider.h libhbcibanking_la_SOURCES=\ provider.c sources: for f in $(libhbcibanking_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/0000755000175000017500000000000012643540657021523 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh_l.h0000644000175000017500000000152112364015477025273 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_RDH_H #define AQHBCI_DLG_EDITUSER_RDH_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_EditUserRdhDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c0000644000175000017500000003664112364015477024766 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituserddv_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG) GWEN_DIALOG *AH_EditUserDdvDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; AH_EDIT_USER_DDV_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_edit_user_ddv"); GWEN_NEW_OBJECT(AH_EDIT_USER_DDV_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg, xdlg, AH_EditUserDdvDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_EditUserDdvDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_edituserddv.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* preset */ xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AH_EditUserDdvDialog_FreeData(void *bp, void *p) { AH_EDIT_USER_DDV_DIALOG *xdlg; xdlg=(AH_EDIT_USER_DDV_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQHBCI_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } const AB_COUNTRY *AH_EditUserDdvDialog_GetCurrentCountry(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void AH_EditUserDdvDialog_Init(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit User"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_User_GetCountry(xdlg->user); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_User_GetUserName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetBankCode(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetUserId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetCustomerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, s, 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.01", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.10", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); /* toGui */ switch(AH_User_GetHbciVersion(xdlg->user)) { case 201: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 210: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AH_EditUserDdvDialog_fromGui(GWEN_DIALOG *dlg, AB_USER *u, int quiet) { AH_EDIT_USER_DDV_DIALOG *xdlg; const char *s; const AB_COUNTRY *c; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserName(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (u) AB_User_SetBankCode(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetCustomerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get country */ c=AH_EditUserDdvDialog_GetCurrentCountry(dlg); if (c) { if (u) AB_User_SetCountry(u, AB_Country_GetCode(c)); } i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: AH_User_SetHbciVersion(xdlg->user, 201); break; case 1: AH_User_SetHbciVersion(xdlg->user, 210); break; case 2: AH_User_SetHbciVersion(xdlg->user, 220); break; default: case 3: AH_User_SetHbciVersion(xdlg->user, 300); break; } return 0; } void AH_EditUserDdvDialog_Fini(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_EditUserDdvDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could create dialog, maybe incomplete installation?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserDdvDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); rv=AH_EditUserDdvDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock user. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AH_EditUserDdvDialog_fromGui(dlg, xdlg->user, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock user."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } static int AH_EditUserDdvDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { AH_EDIT_USER_DDV_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserDdvDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AH_EditUserDdvDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "getAccountsButton")==0) return AH_EditUserDdvDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "okButton")==0) return AH_EditUserDdvDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_EditUserDdvDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_EDIT_USER_DDV_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_DDV_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_EditUserDdvDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_EditUserDdvDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_EditUserDdvDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_p.h0000644000175000017500000000216512364015477024253 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_PINTAN_P_H #define AQHBCI_DLG_PINTAN_P_H #include "dlg_pintan_l.h" typedef struct AH_PINTAN_DIALOG AH_PINTAN_DIALOG; struct AH_PINTAN_DIALOG { AB_BANKING *banking; char *bankCode; char *bankName; char *userName; char *userId; char *customerId; char *url; int httpVMajor; int httpVMinor; int hbciVersion; uint32_t flags; char *tanMediumId; AB_USER *user; }; static void GWENHYWFAR_CB AH_PinTanDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_PinTanDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv_p.h0000644000175000017500000000204412364015477025300 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_DDV_P_H #define AQHBCI_DLG_EDITUSER_DDV_P_H #include "dlg_edituserddv_l.h" #include typedef struct AH_EDIT_USER_DDV_DIALOG AH_EDIT_USER_DDV_DIALOG; struct AH_EDIT_USER_DDV_DIALOG { AB_BANKING *banking; AB_USER *user; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB AH_EditUserDdvDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_EditUserDdvDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg0000644000175000017500000001100112364015477026005 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser_p.h0000644000175000017500000000134612364015477024452 00000000000000/*************************************************************************** begin : Mon Apr 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_NEWUSER_DIALOG_P_H #define AQHBCI_NEWUSER_DIALOG_P_H #include "dlg_newuser_l.h" static int GWENHYWFAR_CB AH_NewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c0000644000175000017500000010152512364015477024045 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_ddvcard_p.h" #include "i18n_l.h" #include #include #include #include #include #include "dlg_ddvcard_special_l.h" #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_BANK 1 #define PAGE_USER 2 #define PAGE_CREATE 3 #define PAGE_END 4 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 #define MAX_CONTEXT_ID_ENTRIES 64 GWEN_INHERIT(GWEN_DIALOG, AH_DDVCARD_DIALOG) GWEN_DIALOG *AH_DdvCardDialog_new(AB_BANKING *ab, GWEN_CRYPT_TOKEN *ct) { GWEN_DIALOG *dlg; AH_DDVCARD_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_ddvcard"); GWEN_NEW_OBJECT(AH_DDVCARD_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg, xdlg, AH_DdvCardDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_DdvCardDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_ddvcard.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->cryptToken=ct; xdlg->contextList=GWEN_Crypt_Token_Context_List_new(); if (1) { uint32_t idList[MAX_CONTEXT_ID_ENTRIES]; uint32_t idCount; uint32_t i; if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error opening token (%d)", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not contact card. Maybe removed? (%d)"), rv); GWEN_Dialog_free(dlg); return NULL; } } idCount=MAX_CONTEXT_ID_ENTRIES; rv=GWEN_Crypt_Token_GetContextIdList(ct, idList, &idCount, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not read context id list"); GWEN_Dialog_free(dlg); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not read context id list from card (%d)"), rv); return NULL; } for (i=0; icontextList); DBG_INFO(AQHBCI_LOGDOMAIN, "Added context %08x", idList[i]); } } } /* for */ /* preset */ xdlg->hbciVersion=210; xdlg->flags=0; /* done */ return dlg; } void GWENHYWFAR_CB AH_DdvCardDialog_FreeData(void *bp, void *p) { AH_DDVCARD_DIALOG *xdlg; xdlg=(AH_DDVCARD_DIALOG*) p; GWEN_Crypt_Token_Context_List_free(xdlg->contextList); free(xdlg->bankCode); free(xdlg->bankName); free(xdlg->userName); free(xdlg->userId); free(xdlg->customerId); free(xdlg->peerId); GWEN_FREE_OBJECT(xdlg); } AB_USER *AH_DdvCardDialog_GetUser(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->user; } GWEN_CRYPT_TOKEN *AH_DdvCardDialog_GetCryptToken(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->cryptToken; } const char *AH_DdvCardDialog_GetBankCode(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->bankCode; } void AH_DdvCardDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->bankCode); if (s) xdlg->bankCode=strdup(s); else xdlg->bankCode=NULL; } const char *AH_DdvCardDialog_GetBankName(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AH_DdvCardDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AH_DdvCardDialog_GetUserName(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AH_DdvCardDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AH_DdvCardDialog_GetUserId(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AH_DdvCardDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AH_DdvCardDialog_GetCustomerId(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->customerId; } void AH_DdvCardDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->customerId); if (s) xdlg->customerId=strdup(s); else xdlg->customerId=NULL; } const char *AH_DdvCardDialog_GetUrl(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AH_DdvCardDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } const char *AH_DdvCardDialog_GetPeerId(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->peerId; } void AH_DdvCardDialog_SetPeerId(GWEN_DIALOG *dlg, const char *s) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); free(xdlg->peerId); if (s) xdlg->peerId=strdup(s); else xdlg->peerId=NULL; } int AH_DdvCardDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_DdvCardDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } uint32_t AH_DdvCardDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_DdvCardDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_DdvCardDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_DdvCardDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_DdvCardDialog_Init(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI DDV-Card Setup Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("" "

This dialog assists you in setting up a DDV Chipcard User.

" "

Some chipcards contain user information. You can click the button below " "to read that information from the card.

" "" "This dialog assists you in setting up a DDV Chipcard User.\n" "Some chipcards contain user information. You can click the button below\n" "to read that information from the card."), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please select the bank.

" "

AqBanking has an internal database which " "contains HBCI/FinTS information about many banks.

" "

If there is an entry for your bank this dialog will use the " "information from the database.

" "" "Please select the bank.\n" "AqBanking has an internal database which contains\n" "HBCI/FinTS information about many banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database."), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

For most banks the customer id must be the same as the user id.

" "

However, some banks actually use the customer id, so please look into " "the documentation provided by your bank to discover whether this is the " "case with your bank.

" "" "For most banks the customer id must be the same as the user id.\n" "However, some banks actually use the customer id, so please look into\n" "the documentation provided by your bank to discover whether this is the\n" "case with your bank."), 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user and retrieve the account list.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user and retrieve the account list.\n" "Click the NEXT button to proceed or ABORT to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The user has been successfully setup."), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_ClearValues, 0, 0, 0); if (1) { const GWEN_CRYPT_TOKEN_CONTEXT *ctx; int i; i=1; ctx=GWEN_Crypt_Token_Context_List_First(xdlg->contextList); while(ctx) { char numbuf[64]; GWEN_BUFFER *tbuf; const char *s; tbuf=GWEN_Buffer_new(0, 256, 0, 1); snprintf(numbuf, sizeof(numbuf)-1, I18N("Context %d:"), i); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); s=GWEN_Crypt_Token_Context_GetServiceId(ctx); if (s && *s && strcasecmp(s, "20202020")!=0) GWEN_Buffer_AppendString(tbuf, s); else GWEN_Buffer_AppendString(tbuf, I18N("")); GWEN_Buffer_AppendString(tbuf, "-"); s=GWEN_Crypt_Token_Context_GetUserId(ctx); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); else GWEN_Buffer_AppendString(tbuf, I18N("")); GWEN_Dialog_SetCharProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_free(tbuf); i++; ctx=GWEN_Crypt_Token_Context_List_Next(ctx); } } GWEN_Dialog_SetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_Value, 0, 0, 0); AH_DdvCardDialog_FromContext(dlg, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AH_DdvCardDialog_Fini(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_DdvCardDialog_GetBankPageData(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetBankCode(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing bank code"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetBankName(dlg, s); else AH_DdvCardDialog_SetBankName(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetUrl(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_DdvCardDialog_GetUserPageData(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetUserName(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetUserId(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_DdvCardDialog_SetCustomerId(dlg, s); else AH_DdvCardDialog_SetCustomerId(dlg, NULL); return 0; } int AH_DdvCardDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AH_DDVCARD_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_DdvCardDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_DdvCardDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_DoIt(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create user, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "ddvcard"); AH_User_SetTokenName(u, GWEN_Crypt_Token_GetTokenName(xdlg->cryptToken)); AH_User_SetCryptMode(u, AH_CryptMode_Ddv); AH_User_SetTokenContextId(u, 1); AH_User_SetStatus(u, AH_UserStatusEnabled); url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); AH_User_SetHbciVersion(u, xdlg->hbciVersion); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add user (%d)"), rv); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up DDV User"), I18N("The list of accounts will be retrieved."), 1, 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get account list */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving account list")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The user has been successfully setup."), 0); GWEN_Gui_ProgressEnd(pid); AH_DdvCardDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_Next(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return AH_DdvCardDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return AH_DdvCardDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; AB_BANKINFO_SERVICE *sv; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s && strcasecmp(s, "HBCI")==0) { s=AB_BankInfoService_GetMode(sv); if (s && *s && strcasecmp(s, "ddv")==0) break; } sv=AB_BankInfoService_List_Next(sv); } if (sv) { /* DDV service found */ s=AB_BankInfoService_GetAddress(sv); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfoService_GetPversion(sv); if (s && *s) { if (strcasecmp(s, "2.01")==0 || strcasecmp(s, "2")==0) xdlg->hbciVersion=201; else if (strcasecmp(s, "2.10")==0 || strcasecmp(s, "2.1")==0) xdlg->hbciVersion=210; else if (strcasecmp(s, "2.20")==0 || strcasecmp(s, "2.2")==0) xdlg->hbciVersion=220; else if (strcasecmp(s, "3.00")==0 || strcasecmp(s, "3.0")==0 || strcasecmp(s, "3")==0) xdlg->hbciVersion=300; else if (strcasecmp(s, "4.00")==0 || strcasecmp(s, "4.0")==0 || strcasecmp(s, "4")==0) xdlg->hbciVersion=400; } } } } GWEN_Dialog_free(dlg2); if (AH_DdvCardDialog_GetBankPageData(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AH_DDVCARD_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); dlg2=AH_DdvCardSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } AH_DdvCardSpecialDialog_SetHbciVersion(dlg2, xdlg->hbciVersion); AH_DdvCardSpecialDialog_SetFlags(dlg2, xdlg->flags); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { xdlg->hbciVersion=AH_DdvCardSpecialDialog_GetHbciVersion(dlg2); xdlg->flags=AH_DdvCardSpecialDialog_GetFlags(dlg2); } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_FromContext(GWEN_DIALOG *dlg, int i) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); if (i>=0) { GWEN_CRYPT_TOKEN_CONTEXT *ctx; ctx=GWEN_Crypt_Token_Context_List_First(xdlg->contextList); while(ctx && i--) ctx=GWEN_Crypt_Token_Context_List_Next(ctx); if (ctx) { const char *s; s=GWEN_Crypt_Token_Context_GetServiceId(ctx); if (s && strcasecmp(s, "20202020")==0) s=NULL; GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=GWEN_Crypt_Token_Context_GetAddress(ctx); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=GWEN_Crypt_Token_Context_GetUserId(ctx); GWEN_Dialog_SetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_HandleActivatedContext(GWEN_DIALOG *dlg) { int i; i=GWEN_Dialog_GetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_Value, 0, -1); if (i>=0) AH_DdvCardDialog_FromContext(dlg, i); return GWEN_DialogEvent_ResultHandled; } int AH_DdvCardDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_bankcode_button")==0) return AH_DdvCardDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "wiz_prev_button")==0) return AH_DdvCardDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AH_DdvCardDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_special_button")==0) return AH_DdvCardDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } else if (strcasecmp(sender, "wiz_context_combo")==0) return AH_DdvCardDialog_HandleActivatedContext(dlg); return GWEN_DialogEvent_ResultNotHandled; } int AH_DdvCardDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_bankcode_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_customerid_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AH_DdvCardDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AH_DdvCardDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_DdvCardDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_DDVCARD_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_DdvCardDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_DdvCardDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AH_DdvCardDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AH_DdvCardDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.dlg0000644000175000017500000000736512364015477024400 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c0000644000175000017500000005236312364015477024765 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituserrdh_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG) GWEN_DIALOG *AH_EditUserRdhDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; AH_EDIT_USER_RDH_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_edit_user_rdh"); GWEN_NEW_OBJECT(AH_EDIT_USER_RDH_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg, xdlg, AH_EditUserRdhDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_EditUserRdhDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_edituserrdh.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* preset */ xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AH_EditUserRdhDialog_FreeData(void *bp, void *p) { AH_EDIT_USER_RDH_DIALOG *xdlg; xdlg=(AH_EDIT_USER_RDH_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQHBCI_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } const AB_COUNTRY *AH_EditUserRdhDialog_GetCurrentCountry(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void AH_EditUserRdhDialog_Init(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit User"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_User_GetCountry(xdlg->user); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_User_GetUserName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetBankCode(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetUserId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetCustomerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, s, 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.01", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.10", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("HBCIUserStatus|new"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("HBCIUserStatus|enabled"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("HBCIUserStatus|pending"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("HBCIUserStatus|disabled"), 0); /* toGui */ switch(AH_User_GetHbciVersion(xdlg->user)) { case 201: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 210: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, I18N("(auto)"), 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "1", 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "2", 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "10", 0); switch(AH_User_GetRdhType(xdlg->user)) { case 0: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 1: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 2: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 10: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } switch(AH_User_GetStatus(xdlg->user)) { case AH_UserStatusNew: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case AH_UserStatusEnabled: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case AH_UserStatusPending: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case AH_UserStatusDisabled: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } flags=AH_User_GetFlags(xdlg->user); GWEN_Dialog_SetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, (flags & AH_USER_FLAGS_BANK_DOESNT_SIGN)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, (flags & AH_USER_FLAGS_BANK_USES_SIGNSEQ)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AH_EditUserRdhDialog_fromGui(GWEN_DIALOG *dlg, AB_USER *u, int quiet) { AH_EDIT_USER_RDH_DIALOG *xdlg; const char *s; const AB_COUNTRY *c; int i; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserName(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (u) AB_User_SetBankCode(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetCustomerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get country */ c=AH_EditUserRdhDialog_GetCurrentCountry(dlg); if (c) { if (u) AB_User_SetCountry(u, AB_Country_GetCode(c)); } i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: AH_User_SetHbciVersion(xdlg->user, 201); break; case 1: AH_User_SetHbciVersion(xdlg->user, 210); break; case 2: AH_User_SetHbciVersion(xdlg->user, 220); break; default: case 3: AH_User_SetHbciVersion(xdlg->user, 300); break; } i=GWEN_Dialog_GetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 1: AH_User_SetRdhType(xdlg->user, 1); break; case 2: AH_User_SetRdhType(xdlg->user, 2); break; case 3: AH_User_SetRdhType(xdlg->user, 10); break; default: case 0: AH_User_SetRdhType(xdlg->user, 0); break; } i=GWEN_Dialog_GetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: AH_User_SetStatus(xdlg->user, AH_UserStatusNew); break; case 1: AH_User_SetStatus(xdlg->user, AH_UserStatusEnabled); break; case 2: AH_User_SetStatus(xdlg->user, AH_UserStatusPending); break; case 3: AH_User_SetStatus(xdlg->user, AH_UserStatusDisabled); break; default: break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_DOESNT_SIGN; if (GWEN_Dialog_GetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_USES_SIGNSEQ; AH_User_SetFlags(xdlg->user, flags); return 0; } void AH_EditUserRdhDialog_Fini(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_EditUserRdhDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could create dialog, maybe incomplete installation?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserRdhDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); rv=AH_EditUserRdhDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock user. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AH_EditUserRdhDialog_fromGui(dlg, xdlg->user, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock user."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } static int AH_EditUserRdhDialog_HandleActivatedGetSysId(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetSysId(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } static int AH_EditUserRdhDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } static int AH_EditUserRdhDialog_HandleActivatedIniLetter(GWEN_DIALOG *dlg) { AH_EDIT_USER_RDH_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ GWEN_Buffer_AppendString(tbuf, ""); rv=AH_Provider_GetIniLetterHtml(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, ""); /* add ASCII version of the INI letter for frontends which don't support HTML */ rv=AH_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_Print(I18N("INI Letter"), "HBCI-INILETTER", I18N("INI Letter for HBCI"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserRdhDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AH_EditUserRdhDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "getSysIdButton")==0) return AH_EditUserRdhDialog_HandleActivatedGetSysId(dlg); else if (strcasecmp(sender, "getAccountsButton")==0) return AH_EditUserRdhDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "iniLetterButton")==0) return AH_EditUserRdhDialog_HandleActivatedIniLetter(dlg); else if (strcasecmp(sender, "okButton")==0) return AH_EditUserRdhDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_EditUserRdhDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_EDIT_USER_RDH_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_RDH_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_EditUserRdhDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_EditUserRdhDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_EditUserRdhDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/chipcard.png0000644000175000017500000000034712364015477023727 00000000000000‰PNG  IHDR szzô pHYs a Äî–@µ™IDATX…c`£` 0`D欸óÿ?=,Pa„Û gÐËrtG0ÑÓRl`ÔX®ÌˆÑAGˆ!»#ÄE] ]§Ž9Œ—T¬9baÅšó kÎãTÏ‚MÐÆÆƒ¿ò.f&Áæ#˜¥ÄŠB›ïC€l` brÀƒÏA£ѨF0àíQ0 FÁ( oB[G¼OôIEND®B`‚aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan_l.h0000644000175000017500000000153212364015477026011 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_PINTAN_H #define AQHBCI_DLG_EDITUSER_PINTAN_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_EditUserPinTanDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special_l.h0000644000175000017500000000234112364015477026061 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_DDVCARD_SPECIAL_H #define AQHBCI_DLG_DDVCARD_SPECIAL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_DdvCardSpecialDialog_new(AB_BANKING *ab); int AH_DdvCardSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_DdvCardSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_DdvCardSpecialDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_DdvCardSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_DdvCardSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_DdvCardSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/keyfile.png0000644000175000017500000000030212364015477023571 00000000000000‰PNG  IHDR szzô pHYs a Äî–@µtIDATX…c` Ñ"""þÓÚÒ+VÀíe¢µe„À¨F@‘–/Ï`X¾ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile_p.h0000644000175000017500000000267612364015477025654 00000000000000/*************************************************************************** begin : Sat Aug 07 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_IMPORTKEYFILE_P_H #define AQHBCI_DLG_IMPORTKEYFILE_P_H #include "dlg_importkeyfile_l.h" #include typedef struct AH_IMPORTKEYFILE_DIALOG AH_IMPORTKEYFILE_DIALOG; struct AH_IMPORTKEYFILE_DIALOG { AB_BANKING *banking; char *fileName; char *bankCode; char *bankName; char *userName; char *userId; char *customerId; char *url; int hbciVersion; int rdhVersion; uint32_t flags; GWEN_CRYPT_TOKEN_CONTEXT_LIST *contextList; AB_USER *user; }; static void GWENHYWFAR_CB AH_ImportKeyFileDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_ImportKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static int AH_ImportKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg); static int AH_ImportKeyFileDialog_CheckFileType(GWEN_DIALOG *dlg); static int AH_ImportKeyFileDialog_HandleActivatedContext(GWEN_DIALOG *dlg); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special.dlg0000644000175000017500000000303112364015477026062 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile_p.h0000644000175000017500000000241412364015477025121 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_NEWKEYFILE_P_H #define AQHBCI_DLG_NEWKEYFILE_P_H #include "dlg_newkeyfile_l.h" typedef struct AH_NEWKEYFILE_DIALOG AH_NEWKEYFILE_DIALOG; struct AH_NEWKEYFILE_DIALOG { AB_BANKING *banking; char *fileName; char *bankCode; char *bankName; char *userName; char *userId; char *customerId; char *url; int hbciVersion; int rdhVersion; uint32_t flags; AB_USER *user; }; static void GWENHYWFAR_CB AH_NewKeyFileDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_NewKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static int AH_NewKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg); static int AH_NewKeyFileDialog_CheckBankIniLetter(GWEN_DIALOG *dlg, AB_USER *u); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special_p.h0000644000175000017500000000200712364015477026064 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_DDVCARD_SPECIAL_P_H #define AQHBCI_DLG_DDVCARD_SPECIAL_P_H #include "dlg_ddvcard_special_l.h" typedef struct AH_DDVCARD_SPECIAL_DIALOG AH_DDVCARD_SPECIAL_DIALOG; struct AH_DDVCARD_SPECIAL_DIALOG { AB_BANKING *banking; int hbciVersion; uint32_t flags; }; static void GWENHYWFAR_CB AH_DdvCardSpecialDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_DdvCardSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg0000644000175000017500000000275612364015477026210 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special.c0000644000175000017500000002347212364015477024717 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_rdh_special_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 GWEN_INHERIT(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG) GWEN_DIALOG *AH_RdhSpecialDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_RDH_SPECIAL_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_rdh_special"); GWEN_NEW_OBJECT(AH_RDH_SPECIAL_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg, xdlg, AH_RdhSpecialDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_RdhSpecialDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_rdh_special.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->hbciVersion=210; xdlg->rdhVersion=0; /* done */ return dlg; } void GWENHYWFAR_CB AH_RdhSpecialDialog_FreeData(void *bp, void *p) { AH_RDH_SPECIAL_DIALOG *xdlg; xdlg=(AH_RDH_SPECIAL_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } int AH_RdhSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_RdhSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } int AH_RdhSpecialDialog_GetRdhVersion(const GWEN_DIALOG *dlg) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->rdhVersion; } void AH_RdhSpecialDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->rdhVersion=i; } uint32_t AH_RdhSpecialDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_RdhSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_RdhSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_RdhSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_RdhSpecialDialog_Init(GWEN_DIALOG *dlg) { AH_RDH_SPECIAL_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI Keyfile Special Settings"), 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.01", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.10", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); /* toGui */ switch(xdlg->hbciVersion) { case 201: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 210: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, I18N("(auto)"), 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "1", 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "2", 0); GWEN_Dialog_SetCharProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_AddValue, 0, "10", 0); /* toGui */ switch(xdlg->rdhVersion) { case 0: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 1: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 2: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 10: GWEN_Dialog_SetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } GWEN_Dialog_SetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_BANK_DOESNT_SIGN)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_BANK_USES_SIGNSEQ)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AH_RdhSpecialDialog_Fini(GWEN_DIALOG *dlg) { AH_RDH_SPECIAL_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* fromGui */ i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->hbciVersion=201; break; default: case 1: xdlg->hbciVersion=210; break; case 2: xdlg->hbciVersion=220; break; case 3: xdlg->hbciVersion=300; break; } i=GWEN_Dialog_GetIntProperty(dlg, "rdhVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 1: xdlg->rdhVersion=1; break; case 2: xdlg->rdhVersion=2; break; case 3: xdlg->rdhVersion=10; break; default: case 0: xdlg->rdhVersion=0; break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_DOESNT_SIGN; if (GWEN_Dialog_GetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_USES_SIGNSEQ; xdlg->flags=flags; /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_RdhSpecialDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_RdhSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_RDH_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_RDH_SPECIAL_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_RdhSpecialDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_RdhSpecialDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_RdhSpecialDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount_l.h0000644000175000017500000000153712364015477025262 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_EDITACCOUNT_DIALOG_L_H #define AQHBCI_EDITACCOUNT_DIALOG_L_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_EditAccountDialog_new(AB_BANKING *ab, AB_ACCOUNT *a, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_l.h0000644000175000017500000000446712364015477024256 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_PINTAN_H #define AQHBCI_DLG_PINTAN_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_PinTanDialog_new(AB_BANKING *ab); const char *AH_PinTanDialog_GetBankCode(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s); const char *AH_PinTanDialog_GetBankName(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetBankName(GWEN_DIALOG *dlg, const char *s); const char *AH_PinTanDialog_GetUserName(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *AH_PinTanDialog_GetUserId(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *AH_PinTanDialog_GetCustomerId(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s); const char *AH_PinTanDialog_GetUrl(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); int AH_PinTanDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int AH_PinTanDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); int AH_PinTanDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_PinTanDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_PinTanDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_PinTanDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); const char *AH_PinTanDialog_GetTanMediumId(const GWEN_DIALOG *dlg); void AH_PinTanDialog_SetTanMediumId(GWEN_DIALOG *dlg, const char *s); AB_USER *AH_PinTanDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special_l.h0000644000175000017500000000247612364015477025240 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_RDH_SPECIAL_H #define AQHBCI_DLG_RDH_SPECIAL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_RdhSpecialDialog_new(AB_BANKING *ab); int AH_RdhSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_RdhSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); int AH_RdhSpecialDialog_GetRdhVersion(const GWEN_DIALOG *dlg); void AH_RdhSpecialDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_RdhSpecialDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_RdhSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_RdhSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_RdhSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype_l.h0000644000175000017500000000146212364015477026175 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_CHOOSEUSERTYPE_DIALOG_H #define AQHBCI_CHOOSEUSERTYPE_DIALOG_H #include #include #include #ifdef __cplusplus extern "C" { #endif AQHBCI_API GWEN_DIALOG *AH_ChooseUserTypeDialog_new(AB_BANKING *ab); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c0000644000175000017500000007063612364015477024750 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010-2011 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_editaccount_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 300 #define USER_LIST_MINCOLWIDTH 50 GWEN_INHERIT(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG) GWEN_DIALOG *AH_EditAccountDialog_new(AB_BANKING *ab, AB_ACCOUNT *a, int doLock) { GWEN_DIALOG *dlg; AH_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_edit_account"); GWEN_NEW_OBJECT(AH_EDIT_ACCOUNT_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg, xdlg, AH_EditAccountDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_EditAccountDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci//dialogs/dlg_editaccount.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->account=a; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AH_EditAccountDialog_FreeData(void *bp, void *p) { AH_EDIT_ACCOUNT_DIALOG *xdlg; xdlg=(AH_EDIT_ACCOUNT_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQBANKING_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } static int createCurrencyString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalCurrencyName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCurrencyCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQBANKING_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } static void createUserString(const AB_USER *u, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; uint32_t uid; /* column 1 */ uid=AB_User_GetUniqueId(u); snprintf(numbuf, sizeof(numbuf)-1, "%d", uid); numbuf[sizeof(numbuf)-1]=0; s=AB_User_GetUserName(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "-"); s=AB_User_GetBankCode(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "-"); s=AB_User_GetCustomerId(u); if (!(s && *s)) s=AB_User_GetUserId(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, ")"); } AB_USER *AH_EditAccountDialog_GetCurrentUser(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; AB_USER_LIST2 *ul; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); /* user list */ ul=AB_Banking_GetUsers(xdlg->banking); if (ul) { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "userCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "userCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); u=AB_User_List2Iterator_Data(it); while(u) { createUserString(u, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); AB_User_List2_free(ul); return u; } GWEN_Buffer_Reset(tbuf); u=AB_User_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); } AB_User_List2_free(ul); } } } return NULL; } int AH_EditAccountDialog_FindUserEntry(GWEN_DIALOG *dlg, AB_USER *u) { AH_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_BUFFER *tbuf; int i; int num; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 256, 0, 1); createUserString(u, tbuf); s=GWEN_Buffer_GetStart(tbuf); /* user list */ num=GWEN_Dialog_GetIntProperty(dlg, "userCombo", GWEN_DialogProperty_ValueCount, 0, 0); for (i=0; i=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } const AB_COUNTRY *AH_EditAccountDialog_GetCurrentCurrency(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCurrencyString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void AH_EditAccountDialog_RebuildUserLists(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; AB_USER_LIST2 *users; GWEN_STRINGLIST *sl; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); GWEN_Dialog_SetIntProperty(dlg, "userCombo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "userCombo", GWEN_DialogProperty_AddValue, 0, I18N("-- select --"), 0); /* setup lists of available and selected users */ sl=GWEN_StringList_new(); users=AB_Banking_FindUsers(xdlg->banking, AB_Account_GetBackendName(xdlg->account), "*", "*", "*", "*"); if (users) { AB_USER_LIST2_ITERATOR *it1; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); it1=AB_User_List2_First(users); if (it1) { AB_USER *u1; u1=AB_User_List2Iterator_Data(it1); while(u1) { createUserString(u1, tbuf); GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); GWEN_Buffer_Reset(tbuf); u1=AB_User_List2Iterator_Next(it1); } AB_User_List2Iterator_free(it1); } GWEN_Buffer_free(tbuf); } AB_User_List2_free(users); if (GWEN_StringList_Count(sl)) { GWEN_STRINGLISTENTRY *se; /* sort user list */ GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "userCombo", GWEN_DialogProperty_AddValue, 0, s, 0); se=GWEN_StringListEntry_Next(se); } } GWEN_StringList_free(sl); } void AH_EditAccountDialog_Init(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; AB_ACCOUNT_TYPE t; AB_USER *u; uint32_t aflags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit Account"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_Account_GetCountry(xdlg->account); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } /* setup currency */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCurrency; selectedCurrency=AB_Account_GetCurrency(xdlg->account); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCurrencyString(c, tbuf)==0) { const char *s; s=AB_Country_GetCurrencyCode(c); if (idx==-1 && selectedCurrency && s && strcasecmp(s, selectedCurrency)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "currencyCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "currencyCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_Account_GetBankCode(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBankName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBIC(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountNumber(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNumberEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetIBAN(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ibanEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetOwnerName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ownerNameEdit", GWEN_DialogProperty_Value, 0, s, 0); /* setup account type */ GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("unknown"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Bank Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Credit Card Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Checking Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Savings Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Investment Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Cash Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Moneymarket Account"), 0); t=AB_Account_GetAccountType(xdlg->account); if (taccount); if (u) { int idx; idx=AH_EditAccountDialog_FindUserEntry(dlg, u); if (idx>=0) GWEN_Dialog_SetIntProperty(dlg, "userCombo", GWEN_DialogProperty_Value, 0, idx, 0); } /* setup flags */ aflags=AH_Account_GetFlags(xdlg->account); GWEN_Dialog_SetIntProperty(dlg, "preferSingleTransferCheck", GWEN_DialogProperty_Value, 0, (aflags & AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "preferSingleDebitNoteCheck", GWEN_DialogProperty_Value, 0, (aflags & AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "sepaPreferSingleTransferCheck", GWEN_DialogProperty_Value, 0, (aflags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "sepaPreferSingleDebitNoteCheck", GWEN_DialogProperty_Value, 0, (aflags & AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AH_EditAccountDialog_fromGui(GWEN_DIALOG *dlg, AB_ACCOUNT *a, int quiet) { AH_EDIT_ACCOUNT_DIALOG *xdlg; int i; const char *s; const AB_COUNTRY *c; uint32_t aflags=0; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "accountNumberEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); s=GWEN_Buffer_GetStart(tbuf); if (a) AB_Account_SetAccountNumber(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "accountNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetAccountName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "ibanEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetIBAN(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "ownerNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetOwnerName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get currency */ c=AH_EditAccountDialog_GetCurrentCurrency(dlg); if (c) AB_Account_SetCurrency(a, AB_Country_GetCurrencyCode(c)); i=GWEN_Dialog_GetIntProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_Value, 0, 0); if (a) AB_Account_SetAccountType(a, i); /* get country */ c=AH_EditAccountDialog_GetCurrentCountry(dlg); if (c) { if (a) AB_Account_SetCountry(a, AB_Country_GetCode(c)); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetBankCode(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetBankName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetBIC(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } aflags=0; if (GWEN_Dialog_GetIntProperty(dlg, "preferSingleTransferCheck", GWEN_DialogProperty_Value, 0, 0)) aflags|=AH_BANK_FLAGS_PREFER_SINGLE_TRANSFER; if (GWEN_Dialog_GetIntProperty(dlg, "preferSingleDebitNoteCheck", GWEN_DialogProperty_Value, 0, 0)) aflags|=AH_BANK_FLAGS_PREFER_SINGLE_DEBITNOTE; if (GWEN_Dialog_GetIntProperty(dlg, "sepaPreferSingleTransferCheck", GWEN_DialogProperty_Value, 0, 0)) aflags|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_TRANSFER; if (GWEN_Dialog_GetIntProperty(dlg, "sepaPreferSingleDebitNoteCheck", GWEN_DialogProperty_Value, 0, 0)) aflags|=AH_BANK_FLAGS_SEPA_PREFER_SINGLE_DEBITNOTE; if (a) AH_Account_SetFlags(a, aflags); if (a) { AB_USER *u; u=AH_EditAccountDialog_GetCurrentUser(dlg); AB_Account_SetSelectedUser(a, u); } return 0; } void AH_EditAccountDialog_Fini(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_EditAccountDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBic(bi); GWEN_Dialog_SetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_EditAccountDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); rv=AH_EditAccountDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseAccount(xdlg->banking, xdlg->account); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock account. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AH_EditAccountDialog_fromGui(dlg, xdlg->account, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseAccount(xdlg->banking, xdlg->account, 0); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock account."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } int AH_EditAccountDialog_HandleActivatedSepa(GWEN_DIALOG *dlg) { AH_EDIT_ACCOUNT_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; AB_ACCOUNT_LIST2 *al; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); al=AB_Account_List2_new(); AB_Account_List2_PushBack(al, xdlg->account); rv=AH_Provider_GetAccountSepaInfo(AB_Account_GetProvider(xdlg->account), al, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); AB_Account_List2_free(al); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } else { const char *s; /* update dialog */ s=AB_Account_GetBankCode(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBankName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBIC(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountNumber(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNumberEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetIBAN(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ibanEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetOwnerName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ownerNameEdit", GWEN_DialogProperty_Value, 0, s, 0); } return GWEN_DialogEvent_ResultHandled; } int AH_EditAccountDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AH_EditAccountDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "getSepaButton")==0) return AH_EditAccountDialog_HandleActivatedSepa(dlg); else if (strcasecmp(sender, "okButton")==0) return AH_EditAccountDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_EditAccountDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_EDIT_ACCOUNT_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_EditAccountDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_EditAccountDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: DBG_NOTICE(0, "ValueChanged: %s", sender); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_EditAccountDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c0000644000175000017500000002356212364015477024132 00000000000000/*************************************************************************** begin : Mon Apr 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newuser_p.h" #include "i18n_l.h" #include "dlg_pintan_l.h" #include "dlg_ddvcard_l.h" #include "dlg_newkeyfile_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 GWEN_DIALOG *AH_NewUserDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; GWEN_BUFFER *fbuf; int rv; dlg=AB_NewUserDialog_new(ab, "ah_new_user"); GWEN_Dialog_SetSignalHandler(dlg, AH_NewUserDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_newuser.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* add media paths for icons */ GWEN_Dialog_AddMediaPathsFromPathManager(dlg, GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/backends/aqhbci/dialogs"); /* done */ return dlg; } void AH_NewUserDialog_Init(GWEN_DIALOG *dlg) { GWEN_DB_NODE *dbPrefs; int i; dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Create a New User"), 0); GWEN_Dialog_SetCharProperty(dlg, "introLabel", GWEN_DialogProperty_Title, 0, I18N("" "

You can now create a new HBCI/FinTS user.

" "AqBanking supports the following user types:" "
    " "
  • Keyfile-based user
  • " "
  • Chipcard-based user
  • " "
  • PIN/TAN user
  • " "
" "

Which type of user you need to setup is determined " "by the bank. The letter from your bank should contain this " "information.

" "" "You can now create a new HBCI/FinTS user.\n" "AqBanking supports the following user types:\n" " - Keyfile-based user\n" " - Chipcard-based user\n" " - PIN/TAN user\n" "Which type of user you need to setup is determined\n" "by the bank. The letter from your bank should contain this\n" "information."), 0); /* temporarily disable not-implemented buttons */ GWEN_Dialog_SetIntProperty(dlg, "importKeyFileButton", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "initChipcardButton", GWEN_DialogProperty_Enabled, 0, 0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AH_NewUserDialog_Fini(GWEN_DIALOG *dlg) { int i; GWEN_DB_NODE *dbPrefs; dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } static int AH_NewUserDialog_HandleActivatedPinTan(GWEN_DIALOG *dlg) { GWEN_DIALOG *dlg2; int rv; dlg2=AH_PinTanDialog_new(AB_NewUserDialog_GetBanking(dlg)); if (dlg2==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS PIN/TAN User")); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } AB_NewUserDialog_SetUser(dlg, AH_PinTanDialog_GetUser(dlg2)); GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultAccept; } static int AH_NewUserDialog_HandleActivatedUseCard(GWEN_DIALOG *dlg) { int rv; GWEN_BUFFER *mtypeName; GWEN_BUFFER *mediumName; uint32_t pid; GWEN_CRYPT_TOKEN *ct; mtypeName=GWEN_Buffer_new(0, 64, 0, 1); mediumName=GWEN_Buffer_new(0, 64, 0, 1); pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Checking Chipcard"), I18N("Checking chipcard type, please wait..."), GWEN_GUI_PROGRESS_NONE, 0); rv=AB_Banking_CheckCryptToken(AB_NewUserDialog_GetBanking(dlg), GWEN_Crypt_Token_Device_Card, mtypeName, mediumName); GWEN_Gui_ProgressEnd(pid); if (rv<0) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return GWEN_DialogEvent_ResultHandled; } rv=AB_Banking_GetCryptToken(AB_NewUserDialog_GetBanking(dlg), GWEN_Buffer_GetStart(mtypeName), GWEN_Buffer_GetStart(mediumName), &ct); if (rv<0) { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return GWEN_DialogEvent_ResultHandled; } if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "ddvcard")==0) { GWEN_DIALOG *dlg2; DBG_NOTICE(0, "DDV card"); dlg2=AH_DdvCardDialog_new(AB_NewUserDialog_GetBanking(dlg), ct); if (dlg2==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS DDV User")); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); AB_Banking_ClearCryptTokenList(AB_NewUserDialog_GetBanking(dlg)); return GWEN_DialogEvent_ResultHandled; } AB_NewUserDialog_SetUser(dlg, AH_PinTanDialog_GetUser(dlg2)); GWEN_Dialog_free(dlg2); GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); AB_Banking_ClearCryptTokenList(AB_NewUserDialog_GetBanking(dlg)); return GWEN_DialogEvent_ResultAccept; } else if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "starcoscard")==0) { DBG_NOTICE(0, "STARCOS RSA card"); // TODO } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Card type \"%s\" not yet supported", GWEN_Buffer_GetStart(mtypeName)); } GWEN_Buffer_free(mediumName); GWEN_Buffer_free(mtypeName); AB_Banking_ClearCryptTokenList(AB_NewUserDialog_GetBanking(dlg)); return GWEN_DialogEvent_ResultHandled; } static int AH_NewUserDialog_HandleActivatedNewKeyFile(GWEN_DIALOG *dlg) { GWEN_DIALOG *dlg2; int rv; dlg2=AH_NewKeyFileDialog_new(AB_NewUserDialog_GetBanking(dlg)); if (dlg2==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)"); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS Keyfile User")); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } AB_NewUserDialog_SetUser(dlg, AH_NewKeyFileDialog_GetUser(dlg2)); GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultAccept; } int AH_NewUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "usePinTanButton")==0) return AH_NewUserDialog_HandleActivatedPinTan(dlg); else if (strcasecmp(sender, "useChipcardButton")==0) return AH_NewUserDialog_HandleActivatedUseCard(dlg); else if (strcasecmp(sender, "createKeyFileButton")==0) return AH_NewUserDialog_HandleActivatedNewKeyFile(dlg); else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_NewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { switch(t) { case GWEN_DialogEvent_TypeInit: AH_NewUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_NewUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_NewUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.dlg0000644000175000017500000001104112364015477025636 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special_p.h0000644000175000017500000000176012364015477025237 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_RDH_SPECIAL_P_H #define AQHBCI_DLG_RDH_SPECIAL_P_H #include "dlg_rdh_special_l.h" typedef struct AH_RDH_SPECIAL_DIALOG AH_RDH_SPECIAL_DIALOG; struct AH_RDH_SPECIAL_DIALOG { AB_BANKING *banking; int hbciVersion; int rdhVersion; uint32_t flags; }; static void GWENHYWFAR_CB AH_RdhSpecialDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_RdhSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.dlg0000644000175000017500000000776212364015477025274 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.c0000644000175000017500000001352212364015477025655 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_choose_usertype_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_DIALOG *AH_ChooseUserTypeDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; GWEN_BUFFER *fbuf; int rv; dlg=AB_UserTypePageDialog_new(ab, "ah_choose_usertype"); GWEN_Dialog_SetSignalHandler(dlg, AH_ChooseUserTypeDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_choose_usertype.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* add media paths for icons */ GWEN_Dialog_AddMediaPathsFromPathManager(dlg, GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/backends/aqhbci/dialogs"); /* done */ return dlg; } void AH_ChooseUserTypeDialog_Init(GWEN_DIALOG *dlg) { GWEN_Dialog_SetCharProperty(dlg, "hbciIntroLabel", GWEN_DialogProperty_Title, 0, I18N("" "

The HBCI module supports a broad range of security " "media. Please choose the user setup mode from the following " "list.

" "

Click on the run button below to create the user.

" "" "The HBCI module supports a broad range of security\n" "media. Please choose the user setup mode from the following\n" "list.\n" "Click on the RUN button below to create the user." ), 0); switch(AB_UserTypePageDialog_GetSelectedType(dlg)) { case AqHBCI_NewUserDialog_CodeGeneric: case AqHBCI_NewUserDialog_CodeExistingPinTan: GWEN_Dialog_SetIntProperty(dlg, "hbciPinTanRadio", GWEN_DialogProperty_Value, 0, 1, 0); break; case AqHBCI_NewUserDialog_CodeCreateKeyFile: GWEN_Dialog_SetIntProperty(dlg, "hbciCreateKeyFileRadio", GWEN_DialogProperty_Value, 0, 1, 0); break; case AqHBCI_NewUserDialog_CodeExistingKeyFile: GWEN_Dialog_SetIntProperty(dlg, "hbciImportKeyFileRadio", GWEN_DialogProperty_Value, 0, 1, 0); break; case AqHBCI_NewUserDialog_CodeCreateChipcard: GWEN_Dialog_SetIntProperty(dlg, "hbciInitChipcardRadio", GWEN_DialogProperty_Value, 0, 1, 0); break; case AqHBCI_NewUserDialog_CodeExistingChipcard: GWEN_Dialog_SetIntProperty(dlg, "hbciUseChipcardRadio", GWEN_DialogProperty_Value, 0, 1, 0); break; } /* temporarily disable not-implemented buttons */ GWEN_Dialog_SetIntProperty(dlg, "hbciInitChipcardRadio", GWEN_DialogProperty_Enabled, 0, 0, 0); } void AH_ChooseUserTypeDialog_Fini(GWEN_DIALOG *dlg) { int i; if (GWEN_Dialog_GetIntProperty(dlg, "hbciPinTanRadio", GWEN_DialogProperty_Value, 0, 0)!=0) i=AqHBCI_NewUserDialog_CodeExistingPinTan; else if (GWEN_Dialog_GetIntProperty(dlg, "hbciUseChipcardRadio", GWEN_DialogProperty_Value, 0, 0)!=0) i=AqHBCI_NewUserDialog_CodeExistingChipcard; else if (GWEN_Dialog_GetIntProperty(dlg, "hbciCreateKeyFileRadio", GWEN_DialogProperty_Value, 0, 0)!=0) i=AqHBCI_NewUserDialog_CodeCreateKeyFile; else if (GWEN_Dialog_GetIntProperty(dlg, "hbciImportKeyFileRadio", GWEN_DialogProperty_Value, 0, 0)!=0) i=AqHBCI_NewUserDialog_CodeExistingKeyFile; else if (GWEN_Dialog_GetIntProperty(dlg, "hbciInitChipcardRadio", GWEN_DialogProperty_Value, 0, 0)!=0) i=AqHBCI_NewUserDialog_CodeCreateChipcard; else i=AqHBCI_NewUserDialog_CodeGeneric; DBG_NOTICE(0, "Setting selected type to %d", i); AB_UserTypePageDialog_SetSelectedType(dlg, i); } int AH_ChooseUserTypeDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { /* nothing for now */ return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_ChooseUserTypeDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { switch(t) { case GWEN_DialogEvent_TypeInit: AH_ChooseUserTypeDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_ChooseUserTypeDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_ChooseUserTypeDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/Makefile.in0000644000175000017500000007271312643540057023514 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/plugin/dialogs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libaqhbci_dlgs_la_LIBADD = am_libaqhbci_dlgs_la_OBJECTS = dlg_edituserddv.lo \ dlg_edituserpintan.lo dlg_edituserrdh.lo dlg_pintan.lo \ dlg_pintan_special.lo dlg_newuser.lo dlg_ddvcard.lo \ dlg_ddvcard_special.lo dlg_newkeyfile.lo dlg_rdh_special.lo \ dlg_importkeyfile.lo dlg_choose_usertype.lo dlg_editaccount.lo libaqhbci_dlgs_la_OBJECTS = $(am_libaqhbci_dlgs_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libaqhbci_dlgs_la_SOURCES) DIST_SOURCES = $(libaqhbci_dlgs_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(dlgimagedir)" DATA = $(dlgdata_DATA) $(dlgimage_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) \ -I.. -I$(srcdir)/.. \ -I$(top_srcdir)/src/libs/aqbanking $(gwenhywfar_includes) AM_CFLAGS = -DBUILDING_AQHBCI @visibility_cflags@ noinst_LTLIBRARIES = libaqhbci_dlgs.la #iheaderdir=@aqbanking_headerdir_am@/aqhbci #iheader_HEADERS= noinst_HEADERS = \ dlg_edituserddv_l.h dlg_edituserddv_p.h \ dlg_edituserpintan_l.h dlg_edituserpintan_p.h \ dlg_edituserrdh_l.h dlg_edituserrdh_p.h \ dlg_pintan_l.h dlg_pintan_p.h \ dlg_pintan_special_l.h dlg_pintan_special_p.h \ dlg_newuser_l.h dlg_newuser_p.h \ dlg_ddvcard_l.h dlg_ddvcard_p.h \ dlg_ddvcard_special_l.h dlg_ddvcard_special_p.h \ dlg_newkeyfile_l.h dlg_newkeyfile_p.h \ dlg_rdh_special_l.h dlg_rdh_special_p.h \ dlg_importkeyfile_l.h dlg_importkeyfile_p.h \ dlg_choose_usertype_l.h dlg_choose_usertype_p.h \ dlg_editaccount_l.h dlg_editaccount_p.h libaqhbci_dlgs_la_SOURCES = \ dlg_edituserddv.c \ dlg_edituserpintan.c \ dlg_edituserrdh.c \ dlg_pintan.c \ dlg_pintan_special.c \ dlg_newuser.c \ dlg_ddvcard.c \ dlg_ddvcard_special.c \ dlg_newkeyfile.c \ dlg_rdh_special.c \ dlg_importkeyfile.c \ dlg_choose_usertype.c \ dlg_editaccount.c dlgdatadir = $(aqbanking_pkgdatadir)/backends/aqhbci/dialogs dlgdata_DATA = \ dlg_edituserddv.dlg \ dlg_edituserpintan.dlg \ dlg_edituserrdh.dlg \ dlg_ddvcard.dlg \ dlg_ddvcard_special.dlg \ dlg_pintan.dlg \ dlg_pintan_special.dlg \ dlg_newkeyfile.dlg \ dlg_rdh_special.dlg \ dlg_importkeyfile.dlg \ dlg_newuser.dlg \ dlg_choose_usertype.dlg \ dlg_editaccount.dlg dlgimagedir = $(aqbanking_pkgdatadir)/backends/aqhbci/dialogs dlgimage_DATA = \ chipcard.png \ keyfile.png \ pintan.png EXTRA_DIST = $(typefiles) $(dlgdata_DATA) $(dlgimage_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/dialogs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/plugin/dialogs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libaqhbci_dlgs.la: $(libaqhbci_dlgs_la_OBJECTS) $(libaqhbci_dlgs_la_DEPENDENCIES) $(EXTRA_libaqhbci_dlgs_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libaqhbci_dlgs_la_OBJECTS) $(libaqhbci_dlgs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_choose_usertype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_ddvcard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_ddvcard_special.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_editaccount.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituserddv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituserpintan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituserrdh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_importkeyfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newkeyfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newuser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_pintan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_pintan_special.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_rdh_special.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dlgdataDATA: $(dlgdata_DATA) @$(NORMAL_INSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgdatadir)" || exit $$?; \ done uninstall-dlgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgdatadir)'; $(am__uninstall_files_from_dir) install-dlgimageDATA: $(dlgimage_DATA) @$(NORMAL_INSTALL) @list='$(dlgimage_DATA)'; test -n "$(dlgimagedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgimagedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgimagedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgimagedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgimagedir)" || exit $$?; \ done uninstall-dlgimageDATA: @$(NORMAL_UNINSTALL) @list='$(dlgimage_DATA)'; test -n "$(dlgimagedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgimagedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(dlgimagedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dlgdataDATA install-dlgimageDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dlgdataDATA uninstall-dlgimageDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dlgdataDATA install-dlgimageDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dlgdataDATA uninstall-dlgimageDATA sources: for f in $(libaqhbci_dlgs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special.c0000644000175000017500000002062212364015477025543 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_ddvcard_special_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 GWEN_INHERIT(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG) GWEN_DIALOG *AH_DdvCardSpecialDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_DDVCARD_SPECIAL_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_ddvcard_special"); GWEN_NEW_OBJECT(AH_DDVCARD_SPECIAL_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg, xdlg, AH_DdvCardSpecialDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_DdvCardSpecialDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_ddvcard_special.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->hbciVersion=210; /* done */ return dlg; } void GWENHYWFAR_CB AH_DdvCardSpecialDialog_FreeData(void *bp, void *p) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; xdlg=(AH_DDVCARD_SPECIAL_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } int AH_DdvCardSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_DdvCardSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } uint32_t AH_DdvCardSpecialDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_DdvCardSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_DdvCardSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_DdvCardSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_DdvCardSpecialDialog_Init(GWEN_DIALOG *dlg) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI PIN/TAN Special Settings"), 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.01", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.10", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); /* toGui */ switch(xdlg->hbciVersion) { case 201: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 210: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; default: break; } GWEN_Dialog_SetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_BANK_DOESNT_SIGN)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_BANK_USES_SIGNSEQ)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AH_DdvCardSpecialDialog_Fini(GWEN_DIALOG *dlg) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* fromGui */ i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->hbciVersion=201; break; default: case 1: xdlg->hbciVersion=210; break; case 2: xdlg->hbciVersion=220; break; case 3: xdlg->hbciVersion=300; break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "bankDoesntSignCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_DOESNT_SIGN; if (GWEN_Dialog_GetIntProperty(dlg, "bankUsesSignSeqCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_BANK_USES_SIGNSEQ; xdlg->flags=flags; /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_DdvCardSpecialDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_DdvCardSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_DDVCARD_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_DDVCARD_SPECIAL_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_DdvCardSpecialDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_DdvCardSpecialDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_DdvCardSpecialDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile_l.h0000644000175000017500000000463212364015477025642 00000000000000/*************************************************************************** begin : Sat Aug 07 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_IMPORTKEYFILE_H #define AQHBCI_DLG_IMPORTKEYFILE_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_ImportKeyFileDialog_new(AB_BANKING *ab); const char *AH_ImportKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s); const char *AH_ImportKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); int AH_ImportKeyFileDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); int AH_ImportKeyFileDialog_GetRdhVersion(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_ImportKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_ImportKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_ImportKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_ImportKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); AB_USER *AH_ImportKeyFileDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c0000644000175000017500000006071212364015477025476 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituserpintan_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG) GWEN_DIALOG *AH_EditUserPinTanDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; AH_EDIT_USER_PINTAN_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_edit_user_pintan"); GWEN_NEW_OBJECT(AH_EDIT_USER_PINTAN_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg, xdlg, AH_EditUserPinTanDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_EditUserPinTanDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_edituserpintan.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* preset */ xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AH_EditUserPinTanDialog_FreeData(void *bp, void *p) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; xdlg=(AH_EDIT_USER_PINTAN_DIALOG*) p; AH_TanMethod_List_free(xdlg->tanMethodList); GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQHBCI_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } static int createTanMethodString(const AH_TAN_METHOD *tm, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; snprintf(numbuf, sizeof(numbuf)-1, "%d", AH_TanMethod_GetFunction(tm)); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); s=AH_TanMethod_GetMethodName(tm); if (!(s && *s)) s=AH_TanMethod_GetMethodId(tm); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " - "); GWEN_Buffer_AppendString(tbuf, s); } /* add HKTAN version */ GWEN_Buffer_AppendString(tbuf, " (Version "); snprintf(numbuf, sizeof(numbuf)-1, "%d", AH_TanMethod_GetGvVersion(tm)); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, ")"); return 0; } const AB_COUNTRY *AH_EditUserPinTanDialog_GetCurrentCountry(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } const AH_TAN_METHOD *AH_EditUserPinTanDialog_GetCurrentTanMethod(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->tanMethodList) { AH_TAN_METHOD *tm; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); tm=AH_TanMethod_List_First(xdlg->tanMethodList); while(tm) { if (createTanMethodString(tm, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); return tm; } GWEN_Buffer_Reset(tbuf); tm=AH_TanMethod_List_Next(tm); } GWEN_Buffer_free(tbuf); } } return NULL; } static void AH_EditUserPinTanDialog_UpdateTanMethods(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; const AH_TAN_METHOD_LIST *ctl; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); if (xdlg->tanMethodList) { AH_TanMethod_List_free(xdlg->tanMethodList); xdlg->tanMethodList=NULL; } ctl=AH_User_GetTanMethodDescriptions(xdlg->user); if (ctl) xdlg->tanMethodList=AH_TanMethod_List_dup(ctl); /* setup tanmethod combo */ GWEN_Dialog_SetIntProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_AddValue, 0, I18N("-- select --"), 0); if (xdlg->tanMethodList) { AH_TAN_METHOD *tm; GWEN_BUFFER *tbuf; int i; int idx; int selectedMethod; int tjv; int tfn; selectedMethod=AH_User_GetSelectedTanMethod(xdlg->user); tjv=selectedMethod / 1000; tfn=selectedMethod % 1000; tbuf=GWEN_Buffer_new(0, 256, 0, 1); idx=-1; i=1; tm=AH_TanMethod_List_First(xdlg->tanMethodList); while(tm) { if (createTanMethodString(tm, tbuf)==0) { if (AH_TanMethod_GetFunction(tm)==tfn && AH_TanMethod_GetGvVersion(tm)==tjv) idx=i; GWEN_Dialog_SetCharProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); i++; } GWEN_Buffer_Reset(tbuf); tm=AH_TanMethod_List_Next(tm); } GWEN_Buffer_free(tbuf); if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "tanMethodCombo", GWEN_DialogProperty_Value, 0, idx, 0); } } void AH_EditUserPinTanDialog_Init(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; uint32_t flags; const GWEN_URL *gu; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit User"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_User_GetCountry(xdlg->user); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } /* also selects currently selected TAN method */ AH_EditUserPinTanDialog_UpdateTanMethods(dlg); s=AB_User_GetUserName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetBankCode(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); gu=AH_User_GetServerUrl(xdlg->user); if (gu) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Url_toString(gu, tbuf); GWEN_Dialog_SetCharProperty(dlg, "urlEdit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_free(tbuf); } s=AB_User_GetUserId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetCustomerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, s, 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); /* toGui */ switch(((AH_User_GetHttpVMajor(xdlg->user))<<8)+AH_User_GetHttpVMinor(xdlg->user)) { case 0x0100: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 0x0101: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } switch(AH_User_GetHbciVersion(xdlg->user)) { case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } /* TAN medium id */ s=AH_User_GetTanMediumId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_Value, 0, s, 0); GWEN_Dialog_SetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_ToolTip, 0, I18N("For smsTAN or mTAN this is your mobile phone number. " "Please ask your bank for the necessary format of this number."), 0); flags=AH_User_GetFlags(xdlg->user); GWEN_Dialog_SetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, (flags & AH_USER_FLAGS_FORCE_SSL3)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "noBase64Check", GWEN_DialogProperty_Value, 0, (flags & AH_USER_FLAGS_NO_BASE64)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "omitSmsAccountCheck", GWEN_DialogProperty_Value, 0, (flags & AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AH_EditUserPinTanDialog_fromGui(GWEN_DIALOG *dlg, AB_USER *u, int quiet) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; const char *s; const AB_COUNTRY *c; int i; uint32_t flags; const AH_TAN_METHOD *tm; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserName(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (u) AB_User_SetBankCode(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetCustomerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get country */ c=AH_EditUserPinTanDialog_GetCurrentCountry(dlg); if (c) { if (u) AB_User_SetCountry(u, AB_Country_GetCode(c)); } i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: AH_User_SetHbciVersion(xdlg->user, 220); break; default: case 1: AH_User_SetHbciVersion(xdlg->user, 300); break; } i=GWEN_Dialog_GetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: AH_User_SetHttpVMajor(xdlg->user, 1); AH_User_SetHttpVMinor(xdlg->user, 0); break; default: case 1: AH_User_SetHttpVMajor(xdlg->user, 1); AH_User_SetHttpVMinor(xdlg->user, 1); break; } tm=AH_EditUserPinTanDialog_GetCurrentTanMethod(dlg); if (tm) { int fn; fn=(AH_TanMethod_GetGvVersion(tm)*1000)+AH_TanMethod_GetFunction(tm); AH_User_SetSelectedTanMethod(xdlg->user, fn); } /* handle tan medium id */ s=GWEN_Dialog_GetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AH_User_SetTanMediumId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "urlEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; GWEN_URL *gu; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); gu=GWEN_Url_fromString(GWEN_Buffer_GetStart(tbuf)); if (gu==NULL) { if (!quiet) { GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Invalid URL")); } GWEN_Buffer_free(tbuf); return GWEN_ERROR_BAD_DATA; } if (u) AH_User_SetServerUrl(u, gu); GWEN_Url_free(gu); GWEN_Buffer_free(tbuf); } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_FORCE_SSL3; if (GWEN_Dialog_GetIntProperty(dlg, "noBase64Check", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_NO_BASE64; if (GWEN_Dialog_GetIntProperty(dlg, "omitSmsAccountCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT; AH_User_SetFlags(xdlg->user, flags); return 0; } void AH_EditUserPinTanDialog_Fini(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_EditUserPinTanDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could create dialog, maybe incomplete installation?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserPinTanDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); rv=AH_EditUserPinTanDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock user. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AH_EditUserPinTanDialog_fromGui(dlg, xdlg->user, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock user."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } static int AH_EditUserPinTanDialog_HandleActivatedGetCert(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); rv=AH_Provider_GetCert(AB_User_GetProvider(xdlg->user), xdlg->user, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } return GWEN_DialogEvent_ResultHandled; } static int AH_EditUserPinTanDialog_HandleActivatedGetSysId(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetSysId(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AH_EditUserPinTanDialog_UpdateTanMethods(dlg); AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } static int AH_EditUserPinTanDialog_HandleActivatedGetItanModes(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetItanModes(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AH_EditUserPinTanDialog_UpdateTanMethods(dlg); AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } static int AH_EditUserPinTanDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; int rv; AB_IMEXPORTER_CONTEXT *ctx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(AB_User_GetProvider(xdlg->user), xdlg->user, ctx, 1, /* withProgress */ 0, /* nounmount */ xdlg->doLock); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); } AH_EditUserPinTanDialog_UpdateTanMethods(dlg); AB_ImExporterContext_free(ctx); return GWEN_DialogEvent_ResultHandled; } int AH_EditUserPinTanDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AH_EditUserPinTanDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "getCertButton")==0) return AH_EditUserPinTanDialog_HandleActivatedGetCert(dlg); else if (strcasecmp(sender, "getSysIdButton")==0) return AH_EditUserPinTanDialog_HandleActivatedGetSysId(dlg); else if (strcasecmp(sender, "getItanModesButton")==0) return AH_EditUserPinTanDialog_HandleActivatedGetItanModes(dlg); else if (strcasecmp(sender, "getAccountsButton")==0) return AH_EditUserPinTanDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "okButton")==0) return AH_EditUserPinTanDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_EditUserPinTanDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_EDIT_USER_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_EDIT_USER_PINTAN_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_EditUserPinTanDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_EditUserPinTanDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_EditUserPinTanDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount_p.h0000644000175000017500000000202612364015477025260 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010-2011 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_EDITACCOUNT_DIALOG_P_H #define AQHBCI_EDITACCOUNT_DIALOG_P_H #include "dlg_editaccount_l.h" typedef struct AH_EDIT_ACCOUNT_DIALOG AH_EDIT_ACCOUNT_DIALOG; struct AH_EDIT_ACCOUNT_DIALOG { AB_BANKING *banking; AB_ACCOUNT *account; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB AH_EditAccountDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_EditAccountDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/Makefile.am0000644000175000017500000000373712364015477023506 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) \ -I.. -I$(srcdir)/.. \ -I$(top_srcdir)/src/libs/aqbanking $(gwenhywfar_includes) AM_CFLAGS=-DBUILDING_AQHBCI @visibility_cflags@ noinst_LTLIBRARIES=libaqhbci_dlgs.la #iheaderdir=@aqbanking_headerdir_am@/aqhbci #iheader_HEADERS= noinst_HEADERS=\ dlg_edituserddv_l.h dlg_edituserddv_p.h \ dlg_edituserpintan_l.h dlg_edituserpintan_p.h \ dlg_edituserrdh_l.h dlg_edituserrdh_p.h \ dlg_pintan_l.h dlg_pintan_p.h \ dlg_pintan_special_l.h dlg_pintan_special_p.h \ dlg_newuser_l.h dlg_newuser_p.h \ dlg_ddvcard_l.h dlg_ddvcard_p.h \ dlg_ddvcard_special_l.h dlg_ddvcard_special_p.h \ dlg_newkeyfile_l.h dlg_newkeyfile_p.h \ dlg_rdh_special_l.h dlg_rdh_special_p.h \ dlg_importkeyfile_l.h dlg_importkeyfile_p.h \ dlg_choose_usertype_l.h dlg_choose_usertype_p.h \ dlg_editaccount_l.h dlg_editaccount_p.h libaqhbci_dlgs_la_SOURCES=\ dlg_edituserddv.c \ dlg_edituserpintan.c \ dlg_edituserrdh.c \ dlg_pintan.c \ dlg_pintan_special.c \ dlg_newuser.c \ dlg_ddvcard.c \ dlg_ddvcard_special.c \ dlg_newkeyfile.c \ dlg_rdh_special.c \ dlg_importkeyfile.c \ dlg_choose_usertype.c \ dlg_editaccount.c dlgdatadir=$(aqbanking_pkgdatadir)/backends/aqhbci/dialogs dlgdata_DATA=\ dlg_edituserddv.dlg \ dlg_edituserpintan.dlg \ dlg_edituserrdh.dlg \ dlg_ddvcard.dlg \ dlg_ddvcard_special.dlg \ dlg_pintan.dlg \ dlg_pintan_special.dlg \ dlg_newkeyfile.dlg \ dlg_rdh_special.dlg \ dlg_importkeyfile.dlg \ dlg_newuser.dlg \ dlg_choose_usertype.dlg \ dlg_editaccount.dlg dlgimagedir=$(aqbanking_pkgdatadir)/backends/aqhbci/dialogs dlgimage_DATA=\ chipcard.png \ keyfile.png \ pintan.png EXTRA_DIST=$(typefiles) $(dlgdata_DATA) $(dlgimage_DATA) sources: for f in $(libaqhbci_dlgs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c0000644000175000017500000007757312364015477023746 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_pintan_p.h" #include "i18n_l.h" #include #include #include #include #include #include "dlg_pintan_special_l.h" #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_BANK 1 #define PAGE_USER 2 #define PAGE_CREATE 3 #define PAGE_END 4 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AH_PINTAN_DIALOG) GWEN_DIALOG *AH_PinTanDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_PINTAN_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_pintan"); GWEN_NEW_OBJECT(AH_PINTAN_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg, xdlg, AH_PinTanDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_PinTanDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_pintan.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->hbciVersion=300; xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB AH_PinTanDialog_FreeData(void *bp, void *p) { AH_PINTAN_DIALOG *xdlg; xdlg=(AH_PINTAN_DIALOG*) p; free(xdlg->bankCode); free(xdlg->bankName); free(xdlg->userName); free(xdlg->userId); free(xdlg->customerId); free(xdlg->tanMediumId); GWEN_FREE_OBJECT(xdlg); } AB_USER *AH_PinTanDialog_GetUser(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *AH_PinTanDialog_GetBankCode(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->bankCode; } void AH_PinTanDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->bankCode); if (s) xdlg->bankCode=strdup(s); else xdlg->bankCode=NULL; } const char *AH_PinTanDialog_GetBankName(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AH_PinTanDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AH_PinTanDialog_GetUserName(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AH_PinTanDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AH_PinTanDialog_GetUserId(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AH_PinTanDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AH_PinTanDialog_GetCustomerId(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->customerId; } void AH_PinTanDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->customerId); if (s) xdlg->customerId=strdup(s); else xdlg->customerId=NULL; } const char *AH_PinTanDialog_GetUrl(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AH_PinTanDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } int AH_PinTanDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int AH_PinTanDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void AH_PinTanDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } int AH_PinTanDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_PinTanDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } uint32_t AH_PinTanDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_PinTanDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_PinTanDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_PinTanDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } const char *AH_PinTanDialog_GetTanMediumId(const GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); return xdlg->tanMediumId; } void AH_PinTanDialog_SetTanMediumId(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); free(xdlg->tanMediumId); if (s) xdlg->tanMediumId=strdup(s); else xdlg->tanMediumId=NULL; } void AH_PinTanDialog_Init(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI PIN/TAN Setup Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("This dialog assists you in setting up a Pin/TAN User.\n"), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please select the bank.

" "

AqBanking has an internal database which " "contains HBCI/FinTS information about many banks.

" "

If there is an entry for your bank this dialog will use the " "information from the database.

" "" "Please select the bank.\n" "AqBanking has an internal database which contains\n" "HBCI/FinTS information about many banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database."), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

For most banks the customer id must be the same as the user id.

" "

However, some banks actually use the customer id, so please look into " "the documentation provided by your bank to discover whether this is the " "case with your bank.

" "" "For most banks the customer id must be the same as the user id.\n" "However, some banks actually use the customer id, so please look into\n" "the documentation provided by your bank to discover whether this is the\n" "case with your bank."), 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user and retrieve the account list.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user and retrieve the account list.\n" "Click the NEXT button to proceed or ABORT to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The user has been successfully setup."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AH_PinTanDialog_Fini(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AH_PinTanDialog_GetBankPageData(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); AH_PinTanDialog_SetBankCode(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing bank code"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); AH_PinTanDialog_SetBankName(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else AH_PinTanDialog_SetBankName(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); AH_PinTanDialog_SetUrl(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_PinTanDialog_GetUserPageData(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); AH_PinTanDialog_SetUserName(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); AH_PinTanDialog_SetUserId(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); AH_PinTanDialog_SetCustomerId(dlg, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else AH_PinTanDialog_SetCustomerId(dlg, NULL); return 0; } int AH_PinTanDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AH_PINTAN_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_PinTanDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_PinTanDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AH_PinTanDialog_DoIt(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; DBG_NOTICE(0, "Doit"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } DBG_NOTICE(0, "Creating user"); u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "pintan"); AH_User_SetCryptMode(u, AH_CryptMode_Pintan); AH_User_SetStatus(u, AH_UserStatusEnabled); url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "https"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 443); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); AH_User_SetHbciVersion(u, xdlg->hbciVersion); AH_User_SetHttpVMajor(u, xdlg->httpVMajor); AH_User_SetHttpVMinor(u, xdlg->httpVMinor); AH_User_SetFlags(u, xdlg->flags); DBG_NOTICE(0, "Adding user"); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up PIN/TAN User"), I18N("The system id and a list of accounts will be retrieved."), 3, 0); /* lock new user */ DBG_NOTICE(0, "Locking user"); rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users")); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get certificate */ DBG_NOTICE(0, "Getting certs (%08x)", AH_User_GetFlags(u)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving SSL certificate")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetCert(pro, u, 0, 1, 0); if (rv<0) { // TODO: retry with SSLv3 if necessary AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get system id */ DBG_NOTICE(0, "Getting sysid"); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving system id")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetSysId(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get account list */ DBG_NOTICE(0, "Getting account list"); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving account list")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ DBG_NOTICE(0, "Unlocking user"); rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The user has been successfully setup."), 0); GWEN_Gui_ProgressEnd(pid); AH_PinTanDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int AH_PinTanDialog_Next(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return AH_PinTanDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return AH_PinTanDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AH_PinTanDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; AB_BANKINFO_SERVICE *sv; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s && strcasecmp(s, "HBCI")==0) { s=AB_BankInfoService_GetMode(sv); if (s && *s && strcasecmp(s, "PINTAN")==0) break; } sv=AB_BankInfoService_List_Next(sv); } if (sv) { /* PIN/TAN service found */ s=AB_BankInfoService_GetAddress(sv); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfoService_GetPversion(sv); if (s && *s) { if (strcasecmp(s, "2.01")==0 || strcasecmp(s, "2")==0) xdlg->hbciVersion=201; else if (strcasecmp(s, "2.10")==0 || strcasecmp(s, "2.1")==0) xdlg->hbciVersion=210; else if (strcasecmp(s, "2.20")==0 || strcasecmp(s, "2.2")==0) xdlg->hbciVersion=220; else if (strcasecmp(s, "3.00")==0 || strcasecmp(s, "3.0")==0 || strcasecmp(s, "3")==0) xdlg->hbciVersion=300; else if (strcasecmp(s, "4.00")==0 || strcasecmp(s, "4.0")==0 || strcasecmp(s, "4")==0) xdlg->hbciVersion=400; } } } } GWEN_Dialog_free(dlg2); if (AH_PinTanDialog_GetBankPageData(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); return GWEN_DialogEvent_ResultHandled; } int AH_PinTanDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AH_PINTAN_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); dlg2=AH_PinTanSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } AH_PinTanSpecialDialog_SetHttpVersion(dlg2, xdlg->httpVMajor, xdlg->httpVMinor); AH_PinTanSpecialDialog_SetHbciVersion(dlg2, xdlg->hbciVersion); AH_PinTanSpecialDialog_SetFlags(dlg2, xdlg->flags); AH_PinTanSpecialDialog_SetTanMediumId(dlg2, xdlg->tanMediumId); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { xdlg->httpVMajor=AH_PinTanSpecialDialog_GetHttpVMajor(dlg2); xdlg->httpVMinor=AH_PinTanSpecialDialog_GetHttpVMinor(dlg2); xdlg->hbciVersion=AH_PinTanSpecialDialog_GetHbciVersion(dlg2); xdlg->flags=AH_PinTanSpecialDialog_GetFlags(dlg2); AH_PinTanDialog_SetTanMediumId(dlg, AH_PinTanSpecialDialog_GetTanMediumId(dlg2)); } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_PinTanDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "wiz_bankcode_button")==0) return AH_PinTanDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "wiz_prev_button")==0) return AH_PinTanDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AH_PinTanDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_special_button")==0) return AH_PinTanDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int AH_PinTanDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_bankcode_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_customerid_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AH_PinTanDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AH_PinTanDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_PinTanDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_PINTAN_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_PinTanDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_PinTanDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AH_PinTanDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AH_PinTanDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c0000644000175000017500000012477712364015477025337 00000000000000/*************************************************************************** begin : Sat Aug 07 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_importkeyfile_p.h" #include "i18n_l.h" #include #include #include #include #include #include "dlg_rdh_special_l.h" #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_FILE 1 #define PAGE_BANK 2 #define PAGE_USER 3 #define PAGE_CREATE 4 #define PAGE_END 5 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 #define MAX_CONTEXT_ID_ENTRIES 64 GWEN_INHERIT(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG) GWEN_DIALOG *AH_ImportKeyFileDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_IMPORTKEYFILE_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_importkeyfile"); GWEN_NEW_OBJECT(AH_IMPORTKEYFILE_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg, xdlg, AH_ImportKeyFileDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_ImportKeyFileDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_importkeyfile.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->contextList=GWEN_Crypt_Token_Context_List_new(); /* preset */ xdlg->hbciVersion=210; xdlg->rdhVersion=0; /* done */ return dlg; } void GWENHYWFAR_CB AH_ImportKeyFileDialog_FreeData(void *bp, void *p) { AH_IMPORTKEYFILE_DIALOG *xdlg; xdlg=(AH_IMPORTKEYFILE_DIALOG*) p; GWEN_Crypt_Token_Context_List_free(xdlg->contextList); free(xdlg->fileName); free(xdlg->bankCode); free(xdlg->bankName); free(xdlg->userName); free(xdlg->userId); free(xdlg->customerId); GWEN_FREE_OBJECT(xdlg); } AB_USER *AH_ImportKeyFileDialog_GetUser(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *AH_ImportKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->fileName; } void AH_ImportKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->fileName); if (s) xdlg->fileName=strdup(s); else xdlg->fileName=NULL; } const char *AH_ImportKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankCode; } void AH_ImportKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankCode); if (s) xdlg->bankCode=strdup(s); else xdlg->bankCode=NULL; } const char *AH_ImportKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AH_ImportKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AH_ImportKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AH_ImportKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AH_ImportKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AH_ImportKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AH_ImportKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->customerId; } void AH_ImportKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->customerId); if (s) xdlg->customerId=strdup(s); else xdlg->customerId=NULL; } const char *AH_ImportKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AH_ImportKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } int AH_ImportKeyFileDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_ImportKeyFileDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } int AH_ImportKeyFileDialog_GetRdhVersion(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->rdhVersion; } void AH_ImportKeyFileDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->rdhVersion=i; } uint32_t AH_ImportKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_ImportKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_ImportKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_ImportKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_ImportKeyFileDialog_Init(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI Keyfile Import Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("This dialog assists you in importing a Keyfile User.\n"), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please select the bank.

" "

AqBanking has an internal database which " "contains HBCI/FinTS information about many banks.

" "

If there is an entry for your bank this dialog will use the " "information from the database.

" "" "Please select the bank.\n" "AqBanking has an internal database which contains\n" "HBCI/FinTS information about many banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database."), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

For most banks the customer id must be the same as the user id.

" "

However, some banks actually use the customer id, so please look into " "the documentation provided by your bank to discover whether this is the " "case with your bank.

" "" "For most banks the customer id must be the same as the user id.\n" "However, some banks actually use the customer id, so please look into\n" "the documentation provided by your bank to discover whether this is the\n" "case with your bank."), 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user and exchange keys with the server.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user and exchange keys with the server.\n" "Click the NEXT button to proceed or ABORT to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("" "

The user has been successfully created.

" "" "The user has been successfully created."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AH_ImportKeyFileDialog_Fini(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_ImportKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetFileName(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing file name"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_ImportKeyFileDialog_GetBankPageData(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetBankCode(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing bank code"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetBankName(dlg, s); else AH_ImportKeyFileDialog_SetBankName(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetUrl(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_ImportKeyFileDialog_GetUserPageData(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetUserName(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetUserId(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_ImportKeyFileDialog_SetCustomerId(dlg, s); else AH_ImportKeyFileDialog_SetCustomerId(dlg, NULL); return 0; } int AH_ImportKeyFileDialog_CheckFileType(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_BUFFER *tnBuf; GWEN_BUFFER *ttBuf; GWEN_CRYPT_TOKEN *ct; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); GWEN_Crypt_Token_Context_List_Clear(xdlg->contextList); /* create CryptToken */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin manager not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); return GWEN_ERROR_INTERNAL; } tnBuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tnBuf, xdlg->fileName); ttBuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Crypt_Token_PluginManager_CheckToken(pm, GWEN_Crypt_Token_Device_File, ttBuf, tnBuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ttBuf); GWEN_Buffer_free(tnBuf); return rv; } pl=GWEN_PluginManager_GetPlugin(pm, GWEN_Buffer_GetStart(ttBuf)); if (pl==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_Buffer_GetStart(ttBuf)); GWEN_Buffer_free(ttBuf); GWEN_Buffer_free(tnBuf); return GWEN_ERROR_NOT_SUPPORTED; } DBG_INFO(AQHBCI_LOGDOMAIN, "Plugin found"); ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, GWEN_Buffer_GetStart(tnBuf)); if (ct==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create crypt token"); GWEN_Buffer_free(ttBuf); GWEN_Buffer_free(tnBuf); return GWEN_ERROR_INTERNAL; } GWEN_Buffer_free(ttBuf); GWEN_Buffer_free(tnBuf); /* create crypt token */ rv=GWEN_Crypt_Token_Open(ct, 0, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not open token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be opened. Please check permissions (%d)."), GWEN_Crypt_Token_GetTokenName(ct), rv); GWEN_Crypt_Token_free(ct); return rv; } GWEN_Dialog_SetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_AddValue, 0, I18N("-- custom --"), 0); if (1) { uint32_t idList[MAX_CONTEXT_ID_ENTRIES]; uint32_t idCount; uint32_t i; idCount=MAX_CONTEXT_ID_ENTRIES; rv=GWEN_Crypt_Token_GetContextIdList(ct, idList, &idCount, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not read context id list"); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not read context id list (%d)."), rv); GWEN_Crypt_Token_Close(ct, 1, 0); GWEN_Crypt_Token_free(ct); return rv; } for (i=0; icontextList); tbuf=GWEN_Buffer_new(0, 256, 0, 1); snprintf(numbuf, sizeof(numbuf)-1, I18N("Context %d:"), i+1); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); s=GWEN_Crypt_Token_Context_GetServiceId(nctx); if (s && *s && strcasecmp(s, "20202020")!=0) GWEN_Buffer_AppendString(tbuf, s); else GWEN_Buffer_AppendString(tbuf, I18N("")); GWEN_Buffer_AppendString(tbuf, "-"); s=GWEN_Crypt_Token_Context_GetUserId(nctx); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); else GWEN_Buffer_AppendString(tbuf, I18N("")); GWEN_Dialog_SetCharProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_free(tbuf); DBG_INFO(AQHBCI_LOGDOMAIN, "Added context %08x", idList[i]); } } } /* for */ /* close crypt token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not close token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be closed. Please check disc space."), GWEN_Crypt_Token_GetTokenName(ct), rv); GWEN_Crypt_Token_free(ct); return rv; } GWEN_Crypt_Token_free(ct); return 0; } int AH_ImportKeyFileDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AH_IMPORTKEYFILE_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_FILE: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_ImportKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: if (forwards) { /* leaving FILE page, check whether we can open the file */ rv=AH_ImportKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } rv=AH_ImportKeyFileDialog_CheckFileType(dlg); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } } GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_ImportKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_ImportKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_DoIt(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; int contextId=1; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); rv=AH_ImportKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No file?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } i=GWEN_Dialog_GetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_Value, 0, -1); if (i>0) { GWEN_CRYPT_TOKEN_CONTEXT *tctx; tctx=GWEN_Crypt_Token_Context_List_First(xdlg->contextList); while(tctx && --i) tctx=GWEN_Crypt_Token_Context_List_Next(tctx); if (tctx) contextId=GWEN_Crypt_Token_Context_GetId(tctx); } DBG_NOTICE(0, "Creating user"); u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create HBCI user (internal error)")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "ohbci"); AH_User_SetTokenName(u, AH_ImportKeyFileDialog_GetFileName(dlg)); AH_User_SetTokenContextId(u, contextId); AH_User_SetCryptMode(u, AH_CryptMode_Rdh); AH_User_SetStatus(u, AH_UserStatusPending); AH_User_SetHbciVersion(u, xdlg->hbciVersion); AH_User_SetRdhType(u, xdlg->rdhVersion); AH_User_SetFlags(u, xdlg->flags); url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add HBCI user, maybe there already is a user of that id (%d)"), rv); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Keyfile User"), I18N("The server keys and system id will now be retrieved."), 2, /* getkeys, getsysid */ 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get server keys id */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving server keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetServerKeys(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* TODO: show bank key hash */ rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get sysid keys id */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving system id")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetSysId(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AH_ImportKeyFileDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_Next(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return AH_ImportKeyFileDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return AH_ImportKeyFileDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; AB_BANKINFO_SERVICE *sv; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s && strcasecmp(s, "HBCI")==0) { s=AB_BankInfoService_GetMode(sv); if (s && *s && strncasecmp(s, "RDH", 3)==0) break; } sv=AB_BankInfoService_List_Next(sv); } if (sv) { /* RDH service found */ s=AB_BankInfoService_GetMode(sv); if (s && *s) { if (strcasecmp(s, "RDH1")==0) xdlg->rdhVersion=1; else if (strcasecmp(s, "RDH2")==0) xdlg->rdhVersion=2; else if (strcasecmp(s, "RDH3")==0) xdlg->rdhVersion=3; else if (strcasecmp(s, "RDH4")==0) xdlg->rdhVersion=4; else if (strcasecmp(s, "RDH5")==0) xdlg->rdhVersion=5; else if (strcasecmp(s, "RDH6")==0) xdlg->rdhVersion=6; else if (strcasecmp(s, "RDH7")==0) xdlg->rdhVersion=7; else if (strcasecmp(s, "RDH8")==0) xdlg->rdhVersion=8; else if (strcasecmp(s, "RDH9")==0) xdlg->rdhVersion=9; else if (strcasecmp(s, "RDH10")==0) xdlg->rdhVersion=10; else if (strcasecmp(s, "RDH")==0) xdlg->rdhVersion=1; } s=AB_BankInfoService_GetAddress(sv); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfoService_GetPversion(sv); if (s && *s) { if (strcasecmp(s, "2.01")==0 || strcasecmp(s, "2")==0) xdlg->hbciVersion=201; else if (strcasecmp(s, "2.10")==0 || strcasecmp(s, "2.1")==0) xdlg->hbciVersion=210; else if (strcasecmp(s, "2.20")==0 || strcasecmp(s, "2.2")==0) xdlg->hbciVersion=220; else if (strcasecmp(s, "3.00")==0 || strcasecmp(s, "3.0")==0 || strcasecmp(s, "3")==0) xdlg->hbciVersion=300; else if (strcasecmp(s, "4.00")==0 || strcasecmp(s, "4.0")==0 || strcasecmp(s, "4")==0) xdlg->hbciVersion=400; } } } } GWEN_Dialog_free(dlg2); if (AH_ImportKeyFileDialog_GetBankPageData(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=AH_RdhSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } AH_RdhSpecialDialog_SetFlags(dlg2, xdlg->flags); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { xdlg->hbciVersion=AH_RdhSpecialDialog_GetHbciVersion(dlg2); xdlg->rdhVersion=AH_RdhSpecialDialog_GetRdhVersion(dlg2); xdlg->flags=AH_RdhSpecialDialog_GetFlags(dlg2); } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_HandleActivatedFileButton(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; int rv; const char *s; GWEN_BUFFER *pathBuffer; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); pathBuffer=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) GWEN_Buffer_AppendString(pathBuffer, s); rv=GWEN_Gui_GetFileName(I18N("Select Keyfile"), GWEN_Gui_FileNameType_OpenFileName, 0, I18N("All Files (*)\tOHBCI Files (*ohbci;*.medium)"), pathBuffer, GWEN_Dialog_GetGuiId(dlg)); if (rv==0) { GWEN_Dialog_SetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(pathBuffer), 0); rv=AH_ImportKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); } GWEN_Buffer_free(pathBuffer); return GWEN_DialogEvent_ResultHandled; } static int AH_ImportKeyFileDialog_HandleActivatedIniLetter(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ GWEN_Buffer_AppendString(tbuf, ""); rv=AH_Provider_GetIniLetterHtml(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, ""); /* add ASCII version of the INI letter for frontends which don't support HTML */ rv=AH_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_Print(I18N("INI Letter"), "HBCI-INILETTER", I18N("INI Letter for HBCI"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_HandleActivatedContext(GWEN_DIALOG *dlg) { AH_IMPORTKEYFILE_DIALOG *xdlg; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); i=GWEN_Dialog_GetIntProperty(dlg, "wiz_context_combo", GWEN_DialogProperty_Value, 0, -1); if (i>0) { GWEN_CRYPT_TOKEN_CONTEXT *ctx; ctx=GWEN_Crypt_Token_Context_List_First(xdlg->contextList); while(ctx && --i) ctx=GWEN_Crypt_Token_Context_List_Next(ctx); if (ctx) { const char *s; s=GWEN_Crypt_Token_Context_GetServiceId(ctx); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=GWEN_Crypt_Token_Context_GetAddress(ctx); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=GWEN_Crypt_Token_Context_GetUserId(ctx); GWEN_Dialog_SetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } return GWEN_DialogEvent_ResultHandled; } int AH_ImportKeyFileDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_button")==0) return AH_ImportKeyFileDialog_HandleActivatedFileButton(dlg); else if (strcasecmp(sender, "wiz_bankcode_button")==0) return AH_ImportKeyFileDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "wiz_prev_button")==0) return AH_ImportKeyFileDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AH_ImportKeyFileDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_special_button")==0) return AH_ImportKeyFileDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_iniletter_button")==0) return AH_ImportKeyFileDialog_HandleActivatedIniLetter(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } else if (strcasecmp(sender, "wiz_context_combo")==0) return AH_ImportKeyFileDialog_HandleActivatedContext(dlg); return GWEN_DialogEvent_ResultNotHandled; } int AH_ImportKeyFileDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_edit")==0 || strcasecmp(sender, "wiz_bankcode_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_customerid_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_FILE) { rv=AH_ImportKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AH_ImportKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AH_ImportKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_ImportKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_IMPORTKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_IMPORTKEYFILE_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_ImportKeyFileDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_ImportKeyFileDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AH_ImportKeyFileDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AH_ImportKeyFileDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/pintan.png0000644000175000017500000000055312364015477023442 00000000000000‰PNG  IHDR szzô pHYs a Äî–@µIDATX…í–݃ „!cCtR,ÁR,A;I´NÌÓ1'ÜHb’qß?Î…ƒçN–Ç˲l<Ž£ïÍ ð°m‡09看qNðº>w0 `k¹[î*@ „‚Ô¸¦Äp\aÏš.¨qš•`Ä-­Ææ\“jHÂËm-h5ÄímOíV ‡µ™jÅcœ y­”øRòþîßÁ®ßLB®÷1ΟIB\L %KbÞòÖ³M™±ÆJ-¨ù¸åxaI\±–‚DûÉP,Å Ê[z{Tâ&”fï%3îJÂïJž ל„Zºá¢–;¡Æí ô8VµboDGÇ™ Ô‘–„ZK»Ü 9Yî„M®$ü+½hüT ÕTß+IEND®B`‚aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.dlg0000644000175000017500000001056712364015477025131 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg0000644000175000017500000000613712364015477025307 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser_l.h0000644000175000017500000000137212364015477024445 00000000000000/*************************************************************************** begin : Mon Apr 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_NEWUSER_DIALOG_H #define AQHBCI_NEWUSER_DIALOG_H #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_NewUserDialog_new(AB_BANKING *ab); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile_l.h0000644000175000017500000000451412364015477025120 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_NEWKEYFILE_H #define AQHBCI_DLG_NEWKEYFILE_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_NewKeyFileDialog_new(AB_BANKING *ab); const char *AH_NewKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s); const char *AH_NewKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); int AH_NewKeyFileDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); int AH_NewKeyFileDialog_GetRdhVersion(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_NewKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_NewKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_NewKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_NewKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); AB_USER *AH_NewKeyFileDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.dlg0000644000175000017500000000731712364015477025310 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special_p.h0000644000175000017500000000207012364015477025746 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_PINTAN_SPECIAL_P_H #define AQHBCI_DLG_PINTAN_SPECIAL_P_H #include "dlg_pintan_special_l.h" typedef struct AH_PINTAN_SPECIAL_DIALOG AH_PINTAN_SPECIAL_DIALOG; struct AH_PINTAN_SPECIAL_DIALOG { AB_BANKING *banking; int httpVMajor; int httpVMinor; int hbciVersion; uint32_t flags; char *tanMediumId; }; static void GWENHYWFAR_CB AH_PinTanSpecialDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_PinTanSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv_l.h0000644000175000017500000000152112364015477025273 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_DDV_H #define AQHBCI_DLG_EDITUSER_DDV_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_EditUserDdvDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.dlg0000644000175000017500000000705212364015477024253 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special.dlg0000644000175000017500000000322512364015477025235 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special.c0000644000175000017500000002555512364015477025437 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_pintan_special_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 GWEN_INHERIT(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG) GWEN_DIALOG *AH_PinTanSpecialDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_PINTAN_SPECIAL_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_pintan_special"); GWEN_NEW_OBJECT(AH_PINTAN_SPECIAL_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg, xdlg, AH_PinTanSpecialDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_PinTanSpecialDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_pintan_special.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->hbciVersion=300; xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB AH_PinTanSpecialDialog_FreeData(void *bp, void *p) { AH_PINTAN_SPECIAL_DIALOG *xdlg; xdlg=(AH_PINTAN_SPECIAL_DIALOG*) p; free(xdlg->tanMediumId); GWEN_FREE_OBJECT(xdlg); } int AH_PinTanSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int AH_PinTanSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void AH_PinTanSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } int AH_PinTanSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_PinTanSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } uint32_t AH_PinTanSpecialDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_PinTanSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_PinTanSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_PinTanSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } const char *AH_PinTanSpecialDialog_GetTanMediumId(const GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->tanMediumId; } void AH_PinTanSpecialDialog_SetTanMediumId(GWEN_DIALOG *dlg, const char *s) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->tanMediumId); if (s && *s) xdlg->tanMediumId=strdup(s); else xdlg->tanMediumId=NULL; } void AH_PinTanSpecialDialog_Init(GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI PIN/TAN Special Settings"), 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.20", 0); GWEN_Dialog_SetCharProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_AddValue, 0, "3.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); /* toGui */ switch(((xdlg->httpVMajor)<<8)+xdlg->httpVMinor) { case 0x0100: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 0x0101: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } switch(xdlg->hbciVersion) { case 220: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 300: GWEN_Dialog_SetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } GWEN_Dialog_SetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_FORCE_SSL3)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "noBase64Check", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_NO_BASE64)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "omitSmsAccountCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT)?1:0, 0); if (xdlg->tanMediumId) GWEN_Dialog_SetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_Value, 0, xdlg->tanMediumId, 0); /* set tooltip */ GWEN_Dialog_SetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_ToolTip, 0, I18N("For smsTAN or mTAN this is your mobile phone number. " "Please ask your bank for the necessary format of this number."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AH_PinTanSpecialDialog_Fini(GWEN_DIALOG *dlg) { AH_PINTAN_SPECIAL_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; uint32_t flags; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* fromGui */ i=GWEN_Dialog_GetIntProperty(dlg, "hbciVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->hbciVersion=220; break; default: case 1: xdlg->hbciVersion=300; break; } i=GWEN_Dialog_GetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->httpVMajor=1; xdlg->httpVMinor=0; break; default: case 1: xdlg->httpVMajor=1; xdlg->httpVMinor=1; break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_FORCE_SSL3; if (GWEN_Dialog_GetIntProperty(dlg, "noBase64Check", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_NO_BASE64; if (GWEN_Dialog_GetIntProperty(dlg, "omitSmsAccountCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AH_USER_FLAGS_TAN_OMIT_SMS_ACCOUNT; xdlg->flags=flags; s=GWEN_Dialog_GetCharProperty(dlg, "tanMediumIdEdit", GWEN_DialogProperty_Value, 0, NULL); AH_PinTanSpecialDialog_SetTanMediumId(dlg, s); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_PinTanSpecialDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_PinTanSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_PINTAN_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_PINTAN_SPECIAL_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_PinTanSpecialDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_PinTanSpecialDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AH_PinTanSpecialDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_p.h0000644000175000017500000000237212364015477024371 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_DDVCARD_P_H #define AQHBCI_DLG_DDVCARD_P_H #include "dlg_ddvcard_l.h" #include typedef struct AH_DDVCARD_DIALOG AH_DDVCARD_DIALOG; struct AH_DDVCARD_DIALOG { AB_BANKING *banking; char *bankCode; char *bankName; char *userName; char *userId; char *customerId; char *url; char *peerId; int hbciVersion; uint32_t flags; GWEN_CRYPT_TOKEN *cryptToken; GWEN_CRYPT_TOKEN_CONTEXT_LIST *contextList; AB_USER *user; }; static void GWENHYWFAR_CB AH_DdvCardDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_DdvCardDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static int AH_DdvCardDialog_FromContext(GWEN_DIALOG *dlg, int i); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special_l.h0000644000175000017500000000311312364015477025741 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_PINTAN_SPECIAL_H #define AQHBCI_DLG_PINTAN_SPECIAL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_PinTanSpecialDialog_new(AB_BANKING *ab); int AH_PinTanSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int AH_PinTanSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void AH_PinTanSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); int AH_PinTanSpecialDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_PinTanSpecialDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_PinTanSpecialDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_PinTanSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_PinTanSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_PinTanSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); const char *AH_PinTanSpecialDialog_GetTanMediumId(const GWEN_DIALOG *dlg); void AH_PinTanSpecialDialog_SetTanMediumId(GWEN_DIALOG *dlg, const char *s); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh_p.h0000644000175000017500000000204412364015477025300 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_RDH_P_H #define AQHBCI_DLG_EDITUSER_RDH_P_H #include "dlg_edituserrdh_l.h" #include typedef struct AH_EDIT_USER_RDH_DIALOG AH_EDIT_USER_RDH_DIALOG; struct AH_EDIT_USER_RDH_DIALOG { AB_BANKING *banking; AB_USER *user; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB AH_EditUserRdhDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_EditUserRdhDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special.dlg0000644000175000017500000000355112364015477025753 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype_p.h0000644000175000017500000000142012364015477026173 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_CHOOSEUSERTYPE_DIALOG_P_H #define AQHBCI_CHOOSEUSERTYPE_DIALOG_P_H #include "dlg_choose_usertype_l.h" static int GWENHYWFAR_CB AH_ChooseUserTypeDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c0000644000175000017500000012353512364015477024605 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newkeyfile_p.h" #include "i18n_l.h" #include #include #include #include #include #include "dlg_rdh_special_l.h" #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_FILE 1 #define PAGE_BANK 2 #define PAGE_USER 3 #define PAGE_CREATE 4 #define PAGE_END 5 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG) GWEN_DIALOG *AH_NewKeyFileDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AH_NEWKEYFILE_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_newkeyfile"); GWEN_NEW_OBJECT(AH_NEWKEYFILE_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg, xdlg, AH_NewKeyFileDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AH_NewKeyFileDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqhbci/dialogs/dlg_newkeyfile.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not read dialog description file [%s], maybe an installation error (%d)?"), GWEN_Buffer_GetStart(fbuf), rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->hbciVersion=210; xdlg->rdhVersion=0; /* done */ return dlg; } void GWENHYWFAR_CB AH_NewKeyFileDialog_FreeData(void *bp, void *p) { AH_NEWKEYFILE_DIALOG *xdlg; xdlg=(AH_NEWKEYFILE_DIALOG*) p; free(xdlg->fileName); free(xdlg->bankCode); free(xdlg->bankName); free(xdlg->userName); free(xdlg->userId); free(xdlg->customerId); GWEN_FREE_OBJECT(xdlg); } AB_USER *AH_NewKeyFileDialog_GetUser(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *AH_NewKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->fileName; } void AH_NewKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->fileName); if (s) xdlg->fileName=strdup(s); else xdlg->fileName=NULL; } const char *AH_NewKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankCode; } void AH_NewKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankCode); if (s) xdlg->bankCode=strdup(s); else xdlg->bankCode=NULL; } const char *AH_NewKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AH_NewKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AH_NewKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AH_NewKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AH_NewKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AH_NewKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AH_NewKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->customerId; } void AH_NewKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->customerId); if (s) xdlg->customerId=strdup(s); else xdlg->customerId=NULL; } const char *AH_NewKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AH_NewKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } int AH_NewKeyFileDialog_GetHbciVersion(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->hbciVersion; } void AH_NewKeyFileDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->hbciVersion=i; } int AH_NewKeyFileDialog_GetRdhVersion(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->rdhVersion; } void AH_NewKeyFileDialog_SetRdhVersion(GWEN_DIALOG *dlg, int i) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->rdhVersion=i; } uint32_t AH_NewKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AH_NewKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AH_NewKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_NewKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AH_NewKeyFileDialog_Init(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("HBCI Keyfile Setup Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("This dialog assists you in setting up a Keyfile User.\n"), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please select the bank.

" "

AqBanking has an internal database which " "contains HBCI/FinTS information about many banks.

" "

If there is an entry for your bank this dialog will use the " "information from the database.

" "" "Please select the bank.\n" "AqBanking has an internal database which contains\n" "HBCI/FinTS information about many banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database."), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

For most banks the customer id must be the same as the user id.

" "

However, some banks actually use the customer id, so please look into " "the documentation provided by your bank to discover whether this is the " "case with your bank.

" "" "For most banks the customer id must be the same as the user id.\n" "However, some banks actually use the customer id, so please look into\n" "the documentation provided by your bank to discover whether this is the\n" "case with your bank."), 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user and exchange keys with the server.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user and exchange keys with the server.\n" "Click the NEXT button to proceed or ABORT to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("" "

The user has been successfully created.

" "

You must now print the INI letter (click the button below) " "and send it to the bank.

" "

The activation of your account by the bank can take a few days.

" "" "The user has been successfully created.\n" "You must now PRINT the INI letter (click the button below)\n" "and SEND it to the bank.\n" "The activation of your account by the bank can take a few days."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AH_NewKeyFileDialog_Fini(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AH_NewKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetFileName(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing file name"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_NewKeyFileDialog_GetBankPageData(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetBankCode(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing bank code"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetBankName(dlg, s); else AH_NewKeyFileDialog_SetBankName(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetUrl(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } return 0; } int AH_NewKeyFileDialog_GetUserPageData(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetUserName(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetUserId(dlg, s); else { DBG_INFO(AQHBCI_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AH_NewKeyFileDialog_SetCustomerId(dlg, s); else AH_NewKeyFileDialog_SetCustomerId(dlg, NULL); return 0; } int AH_NewKeyFileDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AH_NEWKEYFILE_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_FILE: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_NewKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AH_NewKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_CheckBankIniLetter(GWEN_DIALOG *dlg, AB_USER *u) { AH_NEWKEYFILE_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ GWEN_Buffer_AppendString(tbuf, ""); GWEN_Buffer_AppendString(tbuf, I18N("

The following is the INI letter describing the keys of your bank. " "Please look at it carefully and compare the information against that " "in the letter from your bank.

" "

Important Warning: Only proceed if the hash matches! " "Contact your bank immediately if the hash does not match!

")); rv=AH_Provider_GetIniLetterHtml(AB_User_GetProvider(u), u, 1, 0, tbuf, 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, ""); /* add ASCII version of the INI letter for frontends which don't support HTML */ GWEN_Buffer_AppendString(tbuf, I18N("The following is the INI letter describing the keys of your bank.\n" "Please look at it carefully and compare the information against that\n" "in the letter from your bank.\n" "\n" "IMPORTANT WARNING: Only proceed if the hash matches!\n" "Contact your bank immediately if the hash does not match!\n\n")); rv=AH_Provider_GetIniLetterTxt(AB_User_GetProvider(u), u, 1, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } if (1!=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_INFO | GWEN_GUI_MSG_FLAGS_CONFIRM_B1 | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Check Bank Keys"), GWEN_Buffer_GetStart(tbuf), I18N("Keys are ok"), I18N("Keys do not match!"), NULL, 0)) { GWEN_Buffer_free(tbuf); return GWEN_ERROR_VERIFY; } GWEN_Buffer_free(tbuf); return 0; } int AH_NewKeyFileDialog_DoIt(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No file?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "ohbci"); AH_User_SetTokenName(u, AH_NewKeyFileDialog_GetFileName(dlg)); AH_User_SetTokenContextId(u, 1); AH_User_SetCryptMode(u, AH_CryptMode_Rdh); AH_User_SetStatus(u, AH_UserStatusPending); AH_User_SetHbciVersion(u, xdlg->hbciVersion); AH_User_SetRdhType(u, xdlg->rdhVersion); AH_User_SetFlags(u, xdlg->flags); /* create CryptToken */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin manager not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, AH_User_GetTokenType(u)); if (pl==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), AH_User_GetTokenType(u)); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, AH_User_GetTokenName(u)); if (ct==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create crypt token"); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* create crypt token */ rv=GWEN_Crypt_Token_Create(ct, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be created. Maybe there already is a file of that name (%d)."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* close crypt token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not close token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be closed. Please check disc space."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); unlink(AH_User_GetTokenName(u)); return GWEN_DialogEvent_ResultHandled; } url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add HBCI user, maybe there already is a user of that id (%d)"), rv); AB_User_free(u); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user, maybe there already is a user of the same id (%d)?", rv); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Keyfile User"), I18N("The server keys will now be retrieved, keys created and sent to the bank."), 3, /* getkeys, mkKeys, sendKeys */ 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get server keys id */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving server keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetServerKeys(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=AH_NewKeyFileDialog_CheckBankIniLetter(dlg, u); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Bad bank keys, you should contact your bank.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* generate keys */ rv=AH_Provider_CreateKeys(pro, u, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Error generating keys: %d"), rv); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* send user keys */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Sending user keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_SendUserKeys2(pro, u, ctx, 0, 0, 1, 0); /* withAuthKey, withProgress, nounmount, doLock */ if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); //unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AH_NewKeyFileDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_Next(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return AH_NewKeyFileDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return AH_NewKeyFileDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; AB_BANKINFO_SERVICE *sv; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s && strcasecmp(s, "HBCI")==0) { s=AB_BankInfoService_GetMode(sv); if (s && *s && strncasecmp(s, "RDH", 3)==0) break; } sv=AB_BankInfoService_List_Next(sv); } if (sv) { /* RDH service found */ s=AB_BankInfoService_GetMode(sv); if (s && *s) { if (strcasecmp(s, "RDH1")==0) xdlg->rdhVersion=1; else if (strcasecmp(s, "RDH2")==0) xdlg->rdhVersion=2; else if (strcasecmp(s, "RDH3")==0) xdlg->rdhVersion=3; else if (strcasecmp(s, "RDH4")==0) xdlg->rdhVersion=4; else if (strcasecmp(s, "RDH5")==0) xdlg->rdhVersion=5; else if (strcasecmp(s, "RDH6")==0) xdlg->rdhVersion=6; else if (strcasecmp(s, "RDH7")==0) xdlg->rdhVersion=7; else if (strcasecmp(s, "RDH8")==0) xdlg->rdhVersion=8; else if (strcasecmp(s, "RDH9")==0) xdlg->rdhVersion=9; else if (strcasecmp(s, "RDH10")==0) xdlg->rdhVersion=10; else if (strcasecmp(s, "RDH")==0) xdlg->rdhVersion=1; } s=AB_BankInfoService_GetAddress(sv); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfoService_GetPversion(sv); if (s && *s) { if (strcasecmp(s, "2.01")==0 || strcasecmp(s, "2")==0) xdlg->hbciVersion=201; else if (strcasecmp(s, "2.10")==0 || strcasecmp(s, "2.1")==0) xdlg->hbciVersion=210; else if (strcasecmp(s, "2.20")==0 || strcasecmp(s, "2.2")==0) xdlg->hbciVersion=220; else if (strcasecmp(s, "3.00")==0 || strcasecmp(s, "3.0")==0 || strcasecmp(s, "3")==0) xdlg->hbciVersion=300; else if (strcasecmp(s, "4.00")==0 || strcasecmp(s, "4.0")==0 || strcasecmp(s, "4")==0) xdlg->hbciVersion=400; } } } } GWEN_Dialog_free(dlg2); if (AH_NewKeyFileDialog_GetBankPageData(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=AH_RdhSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } AH_RdhSpecialDialog_SetFlags(dlg2, xdlg->flags); AH_RdhSpecialDialog_SetHbciVersion(dlg2, xdlg->hbciVersion); AH_RdhSpecialDialog_SetRdhVersion(dlg2, xdlg->rdhVersion); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { xdlg->hbciVersion=AH_RdhSpecialDialog_GetHbciVersion(dlg2); xdlg->rdhVersion=AH_RdhSpecialDialog_GetRdhVersion(dlg2); xdlg->flags=AH_RdhSpecialDialog_GetFlags(dlg2); } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_HandleActivatedFileButton(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; int rv; const char *s; GWEN_BUFFER *pathBuffer; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); pathBuffer=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) GWEN_Buffer_AppendString(pathBuffer, s); rv=GWEN_Gui_GetFileName(I18N("Create Keyfile"), GWEN_Gui_FileNameType_SaveFileName, 0, I18N("All Files (*)\tOHBCI Files (*ohbci;*.medium)"), pathBuffer, GWEN_Dialog_GetGuiId(dlg)); if (rv==0) { GWEN_Dialog_SetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(pathBuffer), 0); rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else { DBG_NOTICE(AQHBCI_LOGDOMAIN, "here (%d)", rv); } GWEN_Buffer_free(pathBuffer); return GWEN_DialogEvent_ResultHandled; } static int AH_NewKeyFileDialog_HandleActivatedIniLetter(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ GWEN_Buffer_AppendString(tbuf, ""); rv=AH_Provider_GetIniLetterHtml(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 1); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, ""); /* add ASCII version of the INI letter for frontends which don't support HTML */ rv=AH_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_Print(I18N("INI Letter"), "HBCI-INILETTER", I18N("INI Letter for HBCI"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } int AH_NewKeyFileDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_button")==0) return AH_NewKeyFileDialog_HandleActivatedFileButton(dlg); else if (strcasecmp(sender, "wiz_bankcode_button")==0) return AH_NewKeyFileDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "wiz_prev_button")==0) return AH_NewKeyFileDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AH_NewKeyFileDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_special_button")==0) return AH_NewKeyFileDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_iniletter_button")==0) return AH_NewKeyFileDialog_HandleActivatedIniLetter(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int AH_NewKeyFileDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_edit")==0 || strcasecmp(sender, "wiz_bankcode_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_customerid_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_FILE) { rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AH_NewKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AH_NewKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AH_NewKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AH_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AH_NewKeyFileDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AH_NewKeyFileDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AH_NewKeyFileDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AH_NewKeyFileDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_l.h0000644000175000017500000000437212364015477024367 00000000000000/*************************************************************************** begin : Tue Apr 20 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_DDVCARD_H #define AQHBCI_DLG_DDVCARD_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AH_DdvCardDialog_new(AB_BANKING *ab, GWEN_CRYPT_TOKEN *ct); GWEN_CRYPT_TOKEN *AH_DdvCardDialog_GetCryptToken(const GWEN_DIALOG *dlg); const char *AH_DdvCardDialog_GetPeerId(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetPeerId(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetBankCode(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetBankName(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetBankName(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetUserName(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetUserId(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetCustomerId(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s); const char *AH_DdvCardDialog_GetUrl(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); int AH_DdvCardDialog_GetHbciVersion(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetHbciVersion(GWEN_DIALOG *dlg, int i); uint32_t AH_DdvCardDialog_GetFlags(const GWEN_DIALOG *dlg); void AH_DdvCardDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_DdvCardDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AH_DdvCardDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); AB_USER *AH_DdvCardDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan_p.h0000644000175000017500000000214712364015477026020 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQHBCI_DLG_EDITUSER_PINTAN_P_H #define AQHBCI_DLG_EDITUSER_PINTAN_P_H #include "dlg_edituserpintan_l.h" #include typedef struct AH_EDIT_USER_PINTAN_DIALOG AH_EDIT_USER_PINTAN_DIALOG; struct AH_EDIT_USER_PINTAN_DIALOG { AB_BANKING *banking; AB_USER *user; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; AH_TAN_METHOD_LIST *tanMethodList; }; static void GWENHYWFAR_CB AH_EditUserPinTanDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AH_EditUserPinTanDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/plugin/README0000644000175000017500000000005212364015477020673 00000000000000 This folder contains all sub-libraries. aqbanking-5.6.4beta/src/plugins/backends/aqhbci/Makefile.am0000644000175000017500000000032212364015477020551 00000000000000SUBDIRS=plugin tools CLEANFILES = $(BUILT_SOURCES) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/plugins/backends/aqhbci/ChangeLog0000644000175000017500000013261012364015477020275 00000000000000 ============================================================================ AqHBCI is now part of AqBanking, please see ChangeLog of that project now. ============================================================================ 2005/08/05: Martin Preuss ------------------------------------------------- - changed prototype of AH_Outbox_Execute() 2005/08/04: Martin Preuss ------------------------------------------------- - more fixes to new medium code 2005/08/01: Martin Preuss ------------------------------------------------- - hbci: - added connect timeout - use GWEN_NetConnection_Connect_Wait() instead of asynchronous GWEN_NetConnection_StartConnect(). This will allow the application to determine whether the server is reachable. - removed plugin loading stuff for media (security media are now fully based on GWEN_CRYPTTOKEN, so we use its plugin mechanisms) - medium: - removed AH_MEDIUM_PROVIDER (no use for it, since GWEN_CRYPTTOKENs are now used which provide their own plugin mechanisms) - completed transition from medium plugins to crypttoken (tested with OpenHBCI key files and DDV cards) - removed ohbci plugin (is now provided by gwen) - removed some other unused media plugins 2005/07/30: Martin Preuss ------------------------------------------------- - started moving medium management from AH_MEDIUM_PROVIDER to Gwens generic plugin API - started on crypt token plugins (ctddv and ctrdh), they will replace the current security media (except the pintan medium) 2005/07/29: Martin Preuss ------------------------------------------------- - adapted to latest changes in Gwen and AqBanking - removed old server code, thus simplifying the message handling significantly - added peerId to AH_User 2005/07/27: Martin Preuss ------------------------------------------------- - fixed a bug in jobgetstandingorders.c (was not reading nextExecutionDate properly) =========================================================================== MARK: released aqhbci-1.2.0 (2005/07/15) =========================================================================== 2005/07/14: Martin Preuss ------------------------------------------------- - AH_Job_UpdateBank_Process(): Only warn if no account list has been received, don't make it an error 2005/07/13: Martin Preuss ------------------------------------------------- - text keys are now sorted with multi jobs, too - added function AH_User_SetUserId() (use with care!) 2005/07/11: Martin Preuss ------------------------------------------------- - implemented dated transfers =========================================================================== MARK: released aqhbci-1.1.0 (2005/07/10) =========================================================================== 2005/07/09: Martin Preuss ------------------------------------------------- - job HKDAN (modify standing order) now sets all corresponding transaction limits - jobs CreateStandingOrder and ModifyStandingOrder now work (tested with Hamburger Sparkasse) 2005/07/08: Martin Preuss ------------------------------------------------- - fixed a bug in JobGetStandingOrders - fixed a security related bug: Now the local crypt key owner is used as expected crypter 2005/07/01: Martin Preuss ------------------------------------------------- - fixed a bug in OpenHBCI-Medium: Now we always start with a localSignSeq of 1 2005/06/30: Martin Preuss ------------------------------------------------- - extended JobSingleTransfer: It will from now on handle most transfer-like jobs, inclusing standing orders and dated transfers - started implementing standing orders 2005/06/29: Martin Preuss ------------------------------------------------- - added missing "code" attribute to jobs where they were missing (-> resulted in AqHBCI not asking for the TAN) - added command to "hbcixml" tool: "check" now checks for the sanity of jobs =========================================================================== MARK: released aqhbci-1.0.10beta (2005/06/14) =========================================================================== 2005/05/31: Martin Preuss ------------------------------------------------- - added a lot more commands to AqHBCI tool (mainly for Holger Kiskowski): - adduser - getaccounts - activate - deactivate 2005-05-23 Christian Stimming * src/media/ohbci/ohbci.c, src/media/rdhkeyfile/rdhkeyfile.c, src/libs/msglayer/dialog.c: Fix gcc4 warnings about different pointer signedness. 2005/05/20: Martin Preuss ------------------------------------------------- - fixed a bug in generic job code - fixed a bug in src/tools/aqhbci-tool/Makefile.am: Was not linking against local libaqhbci.so =========================================================================== MARK: released aqhbci-1.0.9beta (2005/05/20) =========================================================================== 2005/05/19: Martin Preuss ------------------------------------------------- - added customer property: preferSingleTransfer. This is now used to determine whether single or multi transfers are to be used (if multi transfers aren't available single transfers are used) - added configuration option "transferTimeout" to settings file: This allows to specify different timeouts 2005/05/13: Martin Preuss ------------------------------------------------- - added tool aqhbci-tool (for now only the command "mkpinlist" is implemented. This command creates a pin file) - started working on multi transfer jobs 2005-05-09 Andreas Degert * src/libs/applayer/accountjobs/jobgettransactions.xml: textkey and textkeyext must be sent with leading zeros (TransferBase, version 2; same change as in version 1 some time ago; tested with account on Deutsche Bank). 2005/05/01: Martin Preuss ------------------------------------------------- - README: Added a section about environment variables used by AqHBCI - jobgettransactions.c: Writing of the file "/tmp/booked.mt" is now only performed when the environment variable "AQHBCI_LOGBOOKED" exists - XML files: changed some names to make a standing order easier to import - improved logging: Now the separating ":" between pin and tan is also printed. This keeps logfiles parsable. - implemented JobGetStandingOrders (not tested yet) 2005/04/28: Martin Preuss ------------------------------------------------- - modified segment HNSHA for PIN/TAN (necessary to keep the log manager working) 2005-04-24 Christian Stimming * src/libs/msglayer/hbci.c: Change path lookup order to avoid warnings on win32. =========================================================================== MARK: released aqhbci-1.0.8 (2005/04/23) =========================================================================== 2005/04/22: Martin Preuss ------------------------------------------------- - fixed a bug in OHBCI medium =========================================================================== MARK: released aqhbci-1.0.7 (2005/04/21) =========================================================================== 2005/04/13: Martin Preuss ------------------------------------------------- - fixed a bug in AH_Job_TestVersion_Process(): Was not using the correct DB when searching for result codes 2005/04/08: Martin Preuss ------------------------------------------------- - added fake of HILASS and HKLAS version 3 (in the official specs there is no version 3 of this job, HBCI 2.1 uses 2 and HBCI 2.2 uses 4) =========================================================================== MARK: released aqhbci-1.0.6 (2005/04/08) Emergency release. Due to the bug shown below XML files are not created correctly with the last version. =========================================================================== 2005-04-08 Christian Stimming * src/libs/applayer/*/Makefile.am: Unfortunately, the gnu make 3.79.1 somehow only took one file of the prerequisite variable $< into account. This broke the xml file generation. Fixed this. * aqhbci.iss.in, src/libs/msglayer/hbci.c: Add path lookup of xml files via PluginManager to enable this on win32-systems. =========================================================================== MARK: released aqhbci-1.0.5 (2005/04/08) =========================================================================== 2005/04/07: Martin Preuss ------------------------------------------------- - increased trustlevel of encrypted data: Normally encrypted data within a HBCI message is of no use, because to decrypt it the bank's private keys are needed. However, in PIN/TAN mode this segment contains the unencrypted message, since in PIN/TAN mode no encryption is used (in addition to SSL, that is). - in transfers now empty lines for purpose and remote name are ignored 2005/04/05: Martin Preuss ------------------------------------------------- - fixed a bug in description for EU transfer (otherAccount is not needed if IBAN is given) - fixed a bug in description of JobGetTransactions in HBCI 2.2 2005-04-04 Christian Stimming * src/libs/msglayer/hbci.c: Path for plugins are looked up via PluginManager. For windows, this finally enables the run-time lookup of paths according to the installation location. 2005/03/29: Martin Preuss ------------------------------------------------- - removed WaitCallback definitions and registrations. This is now done centrally in AqBanking. 2005-03-29 Christian Stimming * aqhbci.iss.in: Complete the support for Setup file creation. =========================================================================== MARK: released aqhbci-1.0.4beta (2005/03/28) =========================================================================== 2005/03/28: Martin Preuss ------------------------------------------------- - fixed error detection code (especially for getting the server keys) - relaxed expectations when closing a dialog (when the servers' response is not received we now just ignore this error. In this case it is not a clean shutdown of the dialog, but that doesn't matter too much to the client, because he wanted to close the dialog anyway, so the dialog is no longer needed. Also, the specs make it clear that all previously answered jobs are still valid even when the dialog is aborted. - added I18N to pin medium plugin - use option "--header" of tool "xmlmerge" (adds some XML file headers to resulting file) - fixed some bug in openhbci medium 2005/03/27: Martin Preuss ------------------------------------------------- - fixed bugs in EuTransfers - fixed a bug in jobgetransactions.xml for HBCI 2.2 - now the PIN is no longer stored in log files, added user notification about this (only shown once when updating from a previous version) - jobgetkeys: Better checks for signature and encryption of server response, ignore error results (just reads all keys it can get). - message results which indicate an error no longer set the HASERROR flag of a job (only segment error results do) 2005/03/26: Martin Preuss ------------------------------------------------- - added functions: - AH_Customer_GetHttpVMajor() - AH_Customer_SetHttpVMajor() - AH_Customer_GetHttpVMinor() - AH_Customer_SetHttpVMinor() So from now on the HTTP version used in PIN/TAN mode can be defined on a per customer basis. The default is to use 1.0 (this was the default before). - worked on some internal SSL stuff This needs the latest Gwen CVS version. - PIN/TAN: changed header "connection" from "close" to "keep-alive" - added functions: - AH_Customer_SetHttpHost() - AH_Customer_GetHttpHost() - AH_Customer_GetHttpUserAgent() - AH_Customer_SetHttpUserAgent() - added HTTP header "host", this should allow connecting to virtual hosts - added HTTP header "User-Agent" - added chunked encoding handling 2005/03/23: Martin Preuss ------------------------------------------------- - implemented EU transfer (transfers within the EMU, not tested yet) 2005-03-22 Christian Stimming * aqhbci.iss.in: Add initial setup compiler configuration for aqhbci. Unfinished: Needs more work with aqhbci's plugins. 2005/03/15: Martin Preuss ------------------------------------------------- - special handling of signature counter 0 in bank messages (obviously my bank just stopped using it). Now if such a signature counter (0) is received the user will be asked whether he wants to accept it this time, always or not at all. Therefore the functions AH_Customer_SetBankUsesSignSeq() and AH_Customer_GetBankUsesSignSeq() were added. 2005-03-13 Christian Stimming * Makefile.am: Modify rules for i18n so that the catalogs are rebuilt only at install-time or explicitly, not during normal make. 2005-03-12 Christian Stimming * src/media/ohbci/ohbci.c: When entering a wrong PIN, ask the user whether to try again. 2005/03/08: Martin Preuss ------------------------------------------------- - added medium flags (to be used especially to influence the behaviour of RSA keys in regard to signing) 2005/02/20: Martin Preuss ------------------------------------------------- - convert BPD/UPD settings for accounts and banks to UTF8 before assigning them to accounts and banks =========================================================================== MARK: released aqhbci-1.0.3beta (2005/02/19) =========================================================================== 2005/02/19: Martin Preuss ------------------------------------------------- - fixed descriptions for SingleDebitNotes, moved them to the appropriate file 2005/02/15: Martin Preuss ------------------------------------------------- - add flag "O_BINARY" on win32 platforms to open() call - show newly introduced "HexFingerPrint" of a certificate. This is considered a security fix since now you can really check the certificate 2005/02/13: Martin Preuss ------------------------------------------------- - applied a patch submitted by Sasha Silbe (via gentoo) to treat hbcixml2s' mental problem with its own name ;-) 2005/02/11: Martin Preuss ------------------------------------------------- - this lib now uses $libdir instead of $prefix/lib) - fixed a problem in AH_Job_TestVersion_Process() (was stopping after encountering a code which indicated "OK". However, sometimes an error code follows such a code, and now this gets detected) 2005/02/06: Martin Preuss ------------------------------------------------- - now the highest BPD supported version of a job is used instead of the first one - fixed HKPRO (removed multiple definitions) 2005-01-31 Christian Stimming * src/test/Makefile.am, cbanking.c: Fix test file for mingw32 platform. 2005/01/31: Martin Preuss ------------------------------------------------- - implemented debit notes (Lastschriften) =========================================================================== MARK: released aqhbci-1.0.2beta (2005/01/30) =========================================================================== 2005/01/30: Martin Preuss ------------------------------------------------- - major changes in medium management: now working with context indices internally instead of full userId/bankId stuff. This will make it easier to support RSA cards without HBCI applications - fixed some bugs in file media - disabled plugin description files for security media pintanfile and rdhkeyfile so that the wizard will no longer show them as options. However, at least rdhkeyfile is still supported but deprecated (it is easier to maintain only the OpenHBCI-keyfile code) - added fix for the spurious message "could not decrypt" when the server sends an encrypted message key with less than 96 bytes in length. - improved handling of temporarily accepted SSL certificates 2005/01/29: Martin Preuss ------------------------------------------------- - fixed a bug in WaitCallback usage: Now JobGetTransaction uses its own WaitCallback when parsing data - don't expect the server to send a PIN with his signatures - started with a console frontend (CBanking). I needed this for testing purposes anyway, so I decided to go for the whole nine yards... =========================================================================== MARK: released aqhbci-1.0.1beta (2005/01/27) =========================================================================== 2005/01/27: Martin Preuss ------------------------------------------------- - added some fixes for SSL connections (dude, that's complicated stuff ;-) - added HTTP header "connection" from "keep-alive" to "close" since we close the connection anyway - added missing translations =========================================================================== MARK: released aqhbci-1.0.0beta (2005/01/26) =========================================================================== 2005/01/25: Martin Preuss ------------------------------------------------- - adapted to latest changes in gwen (mostly connection-related stuff) 2005/01/23: Martin Preuss ------------------------------------------------- - fixed a glitch in de.po: Don't use "ü", it is not supported by QTs parsers... UTF-8 umlauts work just fine (as for the rest of the library) =========================================================================== MARK: released aqhbci-0.9.19beta (2005/01/23) =========================================================================== 2005/01/22: Martin Preuss ------------------------------------------------- - implemented backend callback function resetQueue() - added file i18nsources to EXTRA_DIST (it seems that this file is not created on all systems) - fixed a bug in AH_Outbox__CBox_PerformQueue(): Was not clearing some queue flags - now the PIN status is set to bad if mode is PIN/TAN and the server reported segment error code 9340 (bad signature). 2005-01-22 Christian Stimming * po/de.po: Update German translation. * src/libs/banking/provider.c: Improve some message markup, and change I18S into I18N_NOOP. Make AH_Provider__FindMyJob less verbose. * src/libs/aqhbci_l.h: Instead of defining I18S, define I18N_NOOP as no-operation marker. * src/tools/Makefile.am: Oops, enable forgotten hbcixml2 tool again -- the outcommenting on mingw32 was accidentally checked into CVS. My fault. Sorry. =========================================================================== MARK: released aqhbci-0.9.18beta (2005/01/22) =========================================================================== 2005/01/22: Martin Preuss ------------------------------------------------- - adapted to latest changes in gwen 2005/01/19: Martin Preuss ------------------------------------------------- - added AH_Provider_AskAddCert(), now the GWEN-function to ask the user whether he wants to accept an SSL cert is implemented within AqHBCI. It now also stores the users' answer to such a request and use it later to automatically answer this question on behalf of the user (but only if the user accepted the certificate permanently). This needs the lates GWEN CVS. 2005-01-15 Christian Stimming * src/media/*/Makefile.am, src/libs/Makefile.am: Reorder library flags so that the currently compiled libaqhbci is linked in first. This is necessary so that the other shared objects do not accidentally link against a previously installed libaqhbci. =========================================================================== MARK: released aqhbci-0.9.17beta (2005/01/14) =========================================================================== 2005/01/13: Martin Preuss ------------------------------------------------- - improved function AH_ConnectionHBCI_Work() (now only calls WorkIO if nothing could be done. It also tries to do as much as it can before returning). - added a debug call to AH_Outbox__CBox_RecvQueue() in case there is no active connection. 2005/01/12: Martin Preuss ------------------------------------------------- - some fixes in doc files - future version numbers always use a level of 3 (even if the patchlevel is 0) =========================================================================== MARK: released aqhbci-0.9.16beta (2005/01/12) =========================================================================== 2005/01/12: Martin Preuss ------------------------------------------------- - fixed a stupid bug (HBCIXML2 was relying on installed OpenHBCI2) =========================================================================== MARK: released aqhbci-0.9.15beta (2005/01/12) =========================================================================== 2005/01/12: Martin Preuss ------------------------------------------------- - ported tool HBCIXML from OpenHBCI2 to AqHBCI (here now called hbcixml2) - added workaround for bug in old OpenHBCI versions: Here the escape character "?" was falsely included in the key owner name 2005-01-11 Christian Stimming * aqhbci.spec.in: Add BuildRequires to ensure a sane rpm building environment. 2005/01/05: Martin Preuss ------------------------------------------------- - added debugging messages for the case of unexpected signers - AqHBCI now looks for the environment variable "AQHBCI_LOGLEVEL". The value of this variable (if it exists) will be translated to a loglevel for the AQHBCI-logdomain and thus overwrites any settings of the calling application 2005/01/04: Martin Preuss ------------------------------------------------- - JOBGetStatus is now attachable 2004/12/05: Martin Preuss ------------------------------------------------- - adapted to latest changes in AqBanking: Additional _factory function for GWEN_PLUGIN. Needs the latest CVS version of GWEN and AqBanking. 2004/11/20: Martin Preuss ------------------------------------------------- - introduced job plugins: now support for AqBanking jobs can be added via job plugins. 2004/11/19: Martin Preuss ------------------------------------------------- - log file handling: now contains the Gwenhywfar runtime version number instead of the gwen version from the headers. - configure.ac: improved readability 2004/11/18: Martin Preuss ------------------------------------------------- - now the server address is stored within AH_USER. This allows for one bank to use multiple address (which in turn allows to use PIN/TAN and DDV/RDH in parallel with one bank). The config file loader code takes care of this changes, so you should update. 2004/11/14: Martin Preuss ------------------------------------------------- - started moving server address information from bank to customer/user. First step: Catching HIKOM segments, storing info in AH_BPD - added type AH_BPD_ADDR (subtype of AH_BPD, this one contains data read from segment "HIKOM". This contains communication parameters (such as server address etc). - AH_Medium_FromDb/ToDb: keyspecs are no longer stored/retrieved (since they are always created upon AH_Medium_SelectUser) 2004/11/07: Martin Preuss ------------------------------------------------- - fixed a bug in AH_JobGetTransactions (was using a false value for month of toTime) 2004/11/05: Martin Preuss ------------------------------------------------- - introduced new device type "pseudo" (no real device, used for on-the-fly created media, such as the new PIN/TAN medium) - added an easier PIN/TAN medium. This doesn't use a file. - lightened up some message code 2004/11/04: Martin Preuss ------------------------------------------------- - fixed a bug in job GetKeys (was not selecting the user) - some mor minor fixes - now a generic waitcallback is entered upon provider init. This way we can make sure that we always have an active WaitCallback - added an outbox execution function which does not close the progress window (this allows to continue using the progress window after the queue has been executed). This function also doesn't automatically unmount the latest mounted medium. This very much improves the KDE-Wizard for AqHBCI because it reduces the number of pin entries. =========================================================================== MARK: released aqhbci-0.9.14beta (2004/11/02) =========================================================================== 2004-10-30 Christian Stimming * src/libs/joblayer/job.c: Fix segfault on "accept unsigned response always". Also note: The non-HTML parts of user messages are not allowed to contain quotation marks `"' !! Gwen's extraction code will not work with them. * src/libs/joblayer/job.c: Fix errornous html message. Improve verbosity of the signature error message. * aqhbci.spec.in (Requires): Add spec file for rpm creation. 2004/10/24: Martin Preuss ------------------------------------------------- - added a field to AH_CUSTOMER which tells AqHBCI whether the bank signs it's messages or not. This is needed in case the bank once signed its messages (so we have a sign key) but now stopped to do so. If a response from the bank is not signed as expected a message box will pop up asking the user whether he wants to accept this response (or all further unsigned responses). 2004/10/09: Martin Preuss ------------------------------------------------- - changed prototypes of some RDH medium functions 2004/10/08: Martin Preuss ------------------------------------------------- - the functions AH_Medium_FromDB and _ToDB are now used. This allows the media to store/restore data from the user's settings (e.g. for chipcards we can now store the context data in the DB instead of the medium. This is needed because some chipcard media can't be written to). 2004-10-02 Christian Stimming * src/libs/msglayer/medium.c: Add support for descriptiveName in medium's fromdb and todb functions. =========================================================================== MARK: released aqhbci-0.9.13beta (2004/09/26) =========================================================================== 2004-09-25 Christian Stimming * src/media/pintanfile/pintanfile.c: Sorry, obviously NUMERIC is ok for PinTan input, but nevertheless it has to be active at all times. * src/libs/msglayer/medium.c: Add an extra warning if AB_BANKING_INPUT_FLAGS_NUMERIC had been specified because this is *very* unexpected otherwise. * src/media/pintanfile/pintanfile.c: Don't use AB_BANKING_INPUT_FLAGS_NUMERIC when entering a password for the file, because this hasn't been asked for during file creation. 2004/09/24: Martin Preuss ------------------------------------------------- - media/ohbci: added missing lseek() - media/rdhkeyfile: added missing ftruncate - accountjobs: added property "single=1" to all account jobs. This slows down the communication with the server (especially with chip cards) but this also ensures that AqHBCI works with banks which do not accept multiple jobs within a single message. 2004-09-24 Christian Stimming * src/media/*: Add rules for Windows DLL creation. * src/media/pintanfile/pintanfile.c: Add cache/restore mechanism for the file access permissions. * configure.ac: Introduce new AC_SUBST variable aqhbci_internal_libs that has the linker command without the lib directory. 2004-09-23 Christian Stimming * src/media/ohbci/ohbci.c: Add cache/restore mechanism for the file access permissions. This should be done in all medium files. Especially group permissions are usually intended by the user and should not be discarded silently. 2004/09/23: Martin Preuss ------------------------------------------------- - added sharedRuntimeData to AH_HBCI. This is needed for the DDV card and RSA card plugin to share a pointer to LC_CLIENT without AqHBCI having to know about libchipcard. With this mechanism multiple plugins may share data while in session. This data is created upon AH_HBCI_Init and destroyed upon AH_HBCI_Fini. Since the plugins get removed prior to the destruction of the data they get the opportunity to remove the data themselves. 2004/09/22: Martin Preuss ------------------------------------------------- - AH_Outbox_Execute now enters and leaves a waitcallback context - provider.c: now the waitcallback only directly catches the callback enter for the outbox, all other are not handled directly. However, the fallback mechanism in Gwen is to instantiated from the template of the currently active callback. The fact that the new callback is not directly derived from the type the caller wanted is flagged by level!=0. This now fixes the bug with the progress bar showing an inaccurate percentage when executing the outbox. - when receiving new BPD the old BPD jobs are completely deleted. So we always have the BPD the bank sent to us (no more funny merging) - now always tries to read the BPD description for a given job (not only if marked with "needBPD"). 2004-09-21 Christian Stimming * src/libs/Makefile.am, src/libs/aqhbci-plugin.c: Fix creation of aqhbci plugin DLL for Windows by adding the symbol aqhbci_factory into the aqhbci.so library. This is necessary to enable DLL loading. As confirmation of this approach, it is now possible to start the Win/MSVC kde_wizard! Yeah. 2004/09/21: Martin Preuss ------------------------------------------------- - job.c: add SINGLE flag to every jobs when in PIN/TAN mode 2004-09-20 Christian Stimming * po/de.po: Improved some of the German translation even further (heh, couldn't resist...) 2004/09/20: Martin Preuss ------------------------------------------------- - fixed a bug: Was not committing system data (->UPD version/BPD version was not updating and so requested every time a dialog was opened) =========================================================================== MARK: released aqhbci-0.9.12beta (2004/09/19) =========================================================================== 2004/09/17: Martin Preuss ------------------------------------------------- - added job JobGetStatus (retrieves status reports "HKPRO") - more information is now stored in AqBanking jobs (for JobGetStatus to work) - fixed a bug in JobGetTransactions (was not taking date arguments into account) - JobGetBalance and JobGetTransactions no longer insist on being alone in a queue (makes interaction with the bank much faster) - server messages are now transformed to Utf8 before logging them with AqBanking - when updating AqHBCI from a newer version all UPD- and BPD-versions are reset to 0 to enforce update of the BPD/UPD (this is to catch some BPD jobs for which new definitions become available) - fixed a bug in AH_Job_CheckEncryption() 2004/09/15: Martin Preuss ------------------------------------------------- - added UTF8-DTA conversions - AqHBCI now detects it when the server closes the dialog - added more I18N =========================================================================== MARK: released aqhbci-0.9.11beta (2004/09/15) =========================================================================== 2004/09/15: Martin Preuss ------------------------------------------------- - added I18N code 2004/09/13: Martin Preuss ------------------------------------------------- - fixed a bug in Makefile.am of OpenHBCI-Plugin - fixed JobTransfer: - Transactions are now validated before passed to the message engine (adding missing fields, truncating others etc) - values are now stored in the correct format for the message engine - hbci.c: AH_HBCI_BeginDialog() now first tries the given bank server address as an IP address and falls back to DNS resolving (as planned). - AH_Job: now updates the bank name as well 2004-09-12 Christian Stimming * src/libs/applayer/outbox.c, src/libs/banking/provider.c: When adding a signer, always use the userId instead of the customerId. 2004-09-10 Christian Stimming * configure.in: Add ACX_WINDOWS_PATHS. * src/libs/Makefile.am: Add rules to build the two different needed DLLs. =========================================================================== MARK: released aqhbci-0.9.10beta (2004/09/10) =========================================================================== 2004/09/09: Martin Preuss ------------------------------------------------- - added OpenHBCI plugin (was a stand-alone package before) - fixed some bugs in the new message code - some work on PIN/TAN: transfer job (which needs a TAN) now works !!! ;-) - now the application is informed about whether a TAN has been used - on WIN32: "#define ftruncate chsize" - more work on PIN/TAN - OpenHBCI plugin: if a bad pin has been entered the user will now simply be asked for the correct one (before this change the current operation was aborted). 2004/09/08: Martin Preuss ------------------------------------------------- - redesigned outbox handling: Since I dropped the server stuff I can now completely concentrate on synchronous clients. This makes the outbox code very much easier to debug. - started hardening AqHBCI: Now the jobs check the security status of a response before handling it (signature, ecnryption) 2004/09/07: Martin Preuss ------------------------------------------------- - added sanity checks for some string arguments - fixed a bug - removed im/exporter plugins (they are now part of AqBanking) 2004/08/30: Martin Preuss ------------------------------------------------- - valgrind session: fixed some memory leaks - message.c: removed one WriteLine in log function to be compatible with OpenHBCI's tool hbcixml 2004/08/27: Martin Preuss ------------------------------------------------- - messages are now logged to logfiles (similiar to how I did it in OpenHBCI2). This makes it much easier to debug the code. 2004/08/24: Martin Preuss ------------------------------------------------- - removed DTAUS importer plugin - added generic DBIO plugin (includes profiles for DTAUS and SWIFT) - fixed DBIO plugin (now it works !! ;-) 2004/08/22: Martin Preuss ------------------------------------------------- - added AqBanking importer/exporter for DTAUS 2004/08/22: Martin Preuss ------------------------------------------------- - adapted to latest changes in AqBanking 2004/08/20: Martin Preuss ------------------------------------------------- - created log domain for AqHBCI (needs current Gwen CVS) 2004/08/19: Martin Preuss ------------------------------------------------- - added adminjob "AH_Job_TestVersion" which allows to check whether the currently used HBCI protocol version is supported by the server. - fixed some bugs concerning malloc() and free() - started working on JOBSingleTransfer 2004/08/18: Martin Preuss ------------------------------------------------- - adapted to latest changes in AqBanking - changed behaviour of AH_Provider_UpdateJob and _AddJob (AH_JOBs are now only created upon AH_Provider_AddJob) 2004/08/17: Martin Preuss ------------------------------------------------- - fixed SWIFT parser, finished JobGetTransactions (well, there are some things missing, but it now basically works) 2004/08/16: Martin Preuss ------------------------------------------------- - adapted parser plugins so that they now produce/expect the transaction format of AqBanking (makes many things easier) - added job GetTransactions =========================================================================== MARK: released aqhbci-0.9.7alpha (2004/08/13) =========================================================================== 2004/08/13: Martin Preuss ------------------------------------------------- - added some setters to AH_Account - added missing prototype for AH_Bank_AddAccount() - removed double prototypes :-} 2004/08/12: Martin Preuss ------------------------------------------------- - fixed a memory leak in rdhkeyfile medium - fixed a potential problem with security ids - use customer's system id for HNSHK and HNVSK as well - fixed a bug in jobqueue: was not adjusting the job status after processing a job - improved AH_Job_UpdateBank, it now monitors the accounts received (needed for the setup wizard) - account: added AH_Account_List2_freeAll function - added aqhbci.h: This defines the macro AQHBCI_API - hbci: added functions to retrieve a list of installed users - removed server code - configuration is now loaded from a single file 2004-08-11 Christian Stimming * src/libs/Makefile.am: Add DLL build rules on windows. * src/libs/msglayer/account.h, bank.h, customer.h, hbci.h, medium.h, user.h: Add AQHBCI_API to function declarations. This is not yet completed, but good enough for testing. * src/libs/msglayer/objectref.h: Add declaration of __declspec(dllimport/export) macro AQHBCI_API, depending on BUILDING_AQHBCI_DLL. =========================================================================== MARK: released aqhbci-0.9.6alpha (2004/08/11) =========================================================================== 2004/08/11: Martin Preuss ------------------------------------------------- - improved logging (now *every* HBCI result is logged) 2004/08/10: Martin Preuss ------------------------------------------------- - mediumrdh: added functions to retrieve the temporary keys - fixed many bugs 2004/08/09: Martin Preuss ------------------------------------------------- - added AH_HBCI_CheckMedium() (looks for a plugin which supports a given medium) - added admin job: GetSysId 2004/08/08: Martin Preuss ------------------------------------------------- - added AH_HBCI_AddMedium() - medium: - added functions - AH_Medium_RemoveUser() - AH_Medium_GetContext() - AH_Medium_ChgContext() - MediumPinTan, MediumRDHFile: Implemented check-function 2004/08/07: Martin Preuss ------------------------------------------------- - hbci, bank: added functions which allow to remove objects once enlisted. This is needed for setup wizards for a clean undo. 2004/08/06: Martin Preuss ------------------------------------------------- - medium: added error code to flag generic errors when checking for a medium which supports a given file/card. - HBCI: added a function to retrieve a list of plugin descriptions for security media 2004-08-06 Christian Stimming * src/libs/banking/provider.c, src/libs/applayer/outbox.c, src/libs/msglayer/message.c, src/libs/media/pintanfile, src/libs/media/rdhfile: Fix warnings about uninitialized variables which could in fact be real problems. 2004/08/06: Martin Preuss ------------------------------------------------- - added XML descriptions for all plugins (to be used by the wizard I'm about to create) 2004/08/05: Martin Preuss ------------------------------------------------- - fixed some important bugs in banking/provider 2004-08-02 Christian Stimming * src/media/rdhkeyfile/rdhkeyfile.c, serverrdhfile.c, pintanfile.c: Deactivate file locking on windows for now because the fcntl calls seem to work differently, or at least the constants from windows don't exist on mingw32. 2004/08/02: Martin Preuss ------------------------------------------------- - very much improved generation of API doc. In combination with the changes in my other projects the new target "install-srcdoc" now creates combined API docs (e.g. API doc for AqBanking now links to that of Gwenhywfar etc) 2004/08/01: Martin Preuss ------------------------------------------------- - fixed some bugs - adapted to latest changes in gwen - banking/provider.c: added a generic WaitCallback. This one catches *every* callback entered and forwards the calls to the corresponding functions of AB_BANKING. Executing a job from within KBanking now works, so the interface seems to be usable ;-) 2004-07-31 Christian Stimming * src/libs/msglayer/hbciserver.h, src/media/rdhkeyfile/rdhkeyfile_p.h, src/media/serverrdhfile/serverrdhfile_p.h: Add include for mingw32 platform. 2004/07/30: Martin Preuss ------------------------------------------------- - AqHBCI is now longer a library of its own. It is now just a plugin to my new Banking Interface. 2004/07/28: Martin Preuss ------------------------------------------------- - added first AccountJob: JobGetBalance - msglayer/hbci: - cleaned up headers (moved many private functions to "*_l.h" files) - added action code AH_CryptoActionUnmount - src/*: major cleanup of some header files (moved more internal stuff to "*_l.h" files - job counts are now more acurate - retrieving the account balance now works !!! ;-) - fixed some bugs - made headers includeable from C++ 2004/07/27: Martin Preuss ------------------------------------------------- - more work on PIN/TAN code - started reorganizing XML data 2004-07-26 Christian Stimming * src/*/Makefile.am: Add inclusion of Gwen header directories * Makefile.am: Add code for automatic lookup of gwen's aclocal macros. 2004-07-24 Christian Stimming * src/libs/msglayer/bank.h, bank.c: GnuCash would need functions to access the full list of users/accounts, too. However, there is a problem with the circular inclusion of account.h and bank.h to get the declarations of the AH_ACCOUNT_LIST, so for now my my proposed extra functions are commented out in the header. * configure.ac, Doxyfile.in: Add check for DOT tool. 2004/07/23: Martin Preuss ------------------------------------------------- - started working on PIN/TAN mode - added security medium: PinTanFile (might later be used to optionally store TANs) - added some missing files 2004/07/20: Christian Stimming ------------------------------------------------- - Makefile.cvs: Make initial makefile generation much more verbose. BTW the file account_l.h is missing in CVS. 2004/07/04: Martin Preuss ------------------------------------------------- - fixed yet more bugs, added support for BPD jobs - added some types used for banking (balance, account status) - started adding account jobs - fixed a poblem which occurred when the bank did not send reasonable customer ids in segment HIUPD 2004/07/03: Martin Preuss ------------------------------------------------- - fixed some bugs in signature header, fixed some bugs concerning DDV mode It now works !!! I just made my first contact with my real bank (since the PPI server was shutdown without prior notice I have no testing platform, so I'm now using AqHBCI with my real DDV account). 2004/06/13: Martin Preuss ------------------------------------------------- - merged AqHBCI and AqHBCI-Banking packages 2004/05/05: Martin Preuss ------------------------------------------------- - started to modify tools so that they now use GWEN_ARGS - src/tools/hbcicadmin: added command "getkeys" - many internal fixes 2004/04/23: Martin Preuss ------------------------------------------------- - added log function (not used internally for now, but might be used by inheriting classes/applications) - added some READMEs - changed prototype for medium function AH_MediumProvider_Check, added documentation for this function ----------------------------------------------------------------------------- Below are some templates to be copied to the top of this file when needed. - API version modifications -------------- REMINDER PLEASE KEEP ON TOP UNTIL RELEASE---------------- ! remember to do SO_CURRENT++ and SO_AGE++ before next release ! ------------------------------------------------------------------------ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/0000755000175000017500000000000012643540657017743 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/0000755000175000017500000000000012643540660022137 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/mkpinlist.c0000644000175000017500000001240412364015477024241 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int mkPinList(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; GWEN_SYNCIO *sio; AB_USER_LIST2 *ul; int rv; const char *outFile; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the name of the output file", /* short description */ "Specify the name of the output file" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } outFile=GWEN_DB_GetCharValue(db, "outfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); if (outFile==0) { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } else { sio=GWEN_SyncIo_File_new(outFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error opening output file: %s", strerror(errno)); return 4; } } GWEN_SyncIo_WriteLine(sio, "# This is a PIN file to be used " "with AqBanking"); GWEN_SyncIo_WriteLine(sio, "# Please insert the PINs/passwords " "for the users below"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "*", "*", "*", "*"); if (ul) { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); if (uit) { AB_USER *u; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { const char *s; GWEN_BUFFER *nbuf; int rv; GWEN_SyncIo_WriteLine(sio, ""); GWEN_SyncIo_WriteString(sio, "# User \""); s=AB_User_GetUserId(u); assert(s); GWEN_SyncIo_WriteString(sio, s); GWEN_SyncIo_WriteString(sio, "\" at \""); s=AB_User_GetBankCode(u); GWEN_SyncIo_WriteString(sio, s); GWEN_SyncIo_WriteLine(sio, "\""); nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); if (AH_User_GetCryptMode(u)==AH_CryptMode_Pintan) rv=AH_User_MkPinName(u, nbuf); else rv=AH_User_MkPasswdName(u, nbuf); if (rv==0) { GWEN_BUFFER *obuf; obuf=GWEN_Buffer_new(0, 256 ,0 ,1); if (GWEN_Text_EscapeToBufferTolerant(GWEN_Buffer_GetStart(nbuf), obuf)) { DBG_ERROR(0, "Error escaping name to buffer"); return 3; } GWEN_SyncIo_WriteString(sio, GWEN_Buffer_GetStart(obuf)); GWEN_SyncIo_WriteLine(sio, " = \"\""); GWEN_Buffer_free(obuf); } GWEN_Buffer_free(nbuf); u=AB_User_List2Iterator_Next(uit); } AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_ERROR_ERR(0, rv); GWEN_SyncIo_free(sio); return 4; } GWEN_SyncIo_free(sio); rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/createkeys.c0000644000175000017500000001167112364015477024373 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int createKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { rv=AH_Provider_CreateKeys(pro, u, 0); if (rv) { DBG_ERROR(0, "Error creating keys (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/listusers.c0000644000175000017500000001112312364015477024261 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int listUsers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; int xml=0; AB_USER_LIST2 *ul; const GWEN_ARGS args[]={ { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "xml", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "xml", /* long option */ "Export as xml", /* short description */ 0 }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } xml=GWEN_DB_VariableExists(db, "xml"); if( xml ) { fprintf( stdout, "\n" ); fprintf( stdout, "\n" ); } ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "*", "*", "*", "*"); if (ul) { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); if (uit) { AB_USER *u; int i=0; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { if( !xml ) { fprintf(stdout, "User %d: Bank: %s/%s User Id: %s Customer Id: %s\n", i++, AB_User_GetCountry(u), AB_User_GetBankCode(u), AB_User_GetUserId(u), AB_User_GetCustomerId(u)); } else { const char *name = AB_User_GetUserName(u); fprintf( stdout, " \n" ); fprintf( stdout, " %d\n", AB_User_GetUniqueId(u) ); if( !name ) fprintf( stdout, " \n" ); else fprintf( stdout, " \n", name ); fprintf( stdout, " %s\n", AB_User_GetUserId(u) ); fprintf( stdout, " %s\n", AB_User_GetCustomerId(u) ); fprintf( stdout, " %s\n", AB_User_GetBankCode(u) ); fprintf( stdout, " %s\n", AB_User_GetCountry(u) ); fprintf( stdout, " %d\n", AB_User_GetLastSessionId(u) ); fprintf( stdout, " \n\n" ); } u=AB_User_List2Iterator_Next(uit); } AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } else { fprintf(stderr, "No users found.\n"); } if( xml ) { fprintf( stdout, "\n" ); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/setitanmode.c0000644000175000017500000001432112364015477024543 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int setItanMode(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int itanMethod; // int itanMethodJobVersion; int itanMethodFunction; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "itanMethod", 1, 1, "m", "method", "Specify the iTAN method to use", "Specify the iTAN method to use" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); itanMethod=GWEN_DB_GetIntValue(db, "itanMethod", 0, -1); // itanMethodJobVersion=itanMethod / 1000; itanMethodFunction=itanMethod % 1000; if (itanMethodFunction<900 || itanMethodFunction>999) { fprintf(stderr, "Only methods between x900 and x999 allowed\n"); return 1; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ if (!AH_User_HasTanMethod(u, itanMethodFunction)) { fprintf(stderr, "ERROR: iTAN method not allowed for this user (try \"getitanmodes\" first)\n"); AB_Banking_EndExclUseUser(ab, u, 1); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } AH_User_SetSelectedTanMethod(u, itanMethod); /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getaccounts.c0000644000175000017500000001176212364015477024554 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccounts(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error getting accounts (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/subuserflags.c0000644000175000017500000001357112364015477024742 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int subUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "flags", /* name */ 1, /* minnum */ 99, /* maxnum */ "f", /* short option */ "flags", /* long option */ "Specify the user flags", /* short description */ "Specify the user flags" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { uint32_t flags; /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ flags=AH_User_Flags_fromDb(db, "flags"); fprintf(stderr, "Removing flags: %08x\n", flags); AH_User_SubFlags(u, flags); /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/listaccounts.c0000644000175000017500000000766512416502277024754 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int listAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv, verbose; AB_ACCOUNT_LIST2 *al; const GWEN_ARGS args[]={ { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "verbose", /* name */ 0, /* minnum */ 1, /* maxnum */ "v", /* short option */ "verbose", /* long option */ "Show list in verbose form (with more columns)", /* short description */ 0 }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } verbose = GWEN_DB_VariableExists(db, "verbose"); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } al=AB_Banking_FindAccounts(ab, AH_PROVIDER_NAME, "de", "*", "*", "*"); if (al) { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; int i=0; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { fprintf(stdout, "Account %d: Bank: %s Account Number: %s", i++, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); if (verbose) { const char* subAccountId = AB_Account_GetSubAccountId(a); fprintf(stdout, " SubAccountId: %s LocalUniqueId: %d", subAccountId ? subAccountId : "(none)", AB_Account_GetUniqueId(a)); } fprintf(stdout, "\n"); a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/main.c0000644000175000017500000003316212364015477023157 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include "globals.h" static void showVersions() { int vmajor, vminor, vpatchLevel, vbuild; fprintf(stdout, "Versions:\n"); GWEN_Version(&vmajor, &vminor, &vpatchLevel, &vbuild); fprintf(stdout, " Gwenhywfar : %d.%d.%d.%d\n", vmajor, vminor, vpatchLevel, vbuild); AB_Banking_GetVersion(&vmajor, &vminor, &vpatchLevel, &vbuild); fprintf(stdout, " AqBanking : %d.%d.%d.%d\n", vmajor, vminor, vpatchLevel, vbuild); } int main(int argc, char **argv) { GWEN_DB_NODE *db; const char *s; const char *cmd; const char *pinFile; int nonInteractive=0; int acceptValidCerts=0; int rv; AB_BANKING *ab; GWEN_GUI *gui; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "cfgfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "C", /* short option */ "cfgfile", /* long option */ "Specify the configuration file", /* short description */ "Specify the configuration file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "pinfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "P", /* short option */ "pinfile", /* long option */ "Specify the PIN file", /* short description */ "Specify the PIN file" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "nonInteractive", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "noninteractive", /* long option */ "Select non-interactive mode",/* short description */ "Select non-interactive mode.\n" /* long description */ "This automatically returns a confirmative answer to any non-critical\n" "message." }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "acceptValidCerts", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "acceptvalidcerts", /* long option */ "Automatically accept all valid TLS certificate", "Automatically accept all valid TLS certificate" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "charset", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "charset", /* long option */ "Specify the output character set", /* short description */ "Specify the output character set" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen. For help on commands, run aqhbci-tool --help.", /* short description */ "Show this help screen. For help on commands, run aqhbci-tool --help." /* long description */ } }; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } GWEN_Logger_Open("aqhbci-tool", "aqhbci-tool", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); GWEN_Logger_SetLevel("aqhbci-tool", GWEN_LoggerLevel_Warning); GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning); db=GWEN_DB_Group_new("arguments"); rv=GWEN_Args_Check(argc, argv, 1, GWEN_ARGS_MODE_ALLOW_FREEPARAM | GWEN_ARGS_MODE_STOP_AT_FREEPARAM, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments main\n"); GWEN_DB_Group_free(db); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AppendString(ubuf, I18N("Usage: ")); GWEN_Buffer_AppendString(ubuf, argv[0]); GWEN_Buffer_AppendString(ubuf, I18N(" [GLOBAL OPTIONS] COMMAND " "[LOCAL OPTIONS]\n")); GWEN_Buffer_AppendString(ubuf, I18N("\nGlobal Options:\n")); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } GWEN_Buffer_AppendString(ubuf, I18N("\nCommands:\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" mkpinlist:\n" " This command creates an empty PIN " "file\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" adduser:\n" " Adds a user " "(-> setup HBCI for a bank)\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" deluser:\n" " Deletes a user.\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getkeys:\n" " Requests the server's key\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getcert:\n" " Requests the server's SSL certificate\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" createkeys:\n" " Create user keys.\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" sendkeys:\n" " Send the user keys to the bank.\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getaccounts:\n" " Requests account list for a " "user\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getaccsepa:\n" " Requests SEPA account list for a " "user\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getsysid:\n" " Requests a system id for the given " "user\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getitanmodes:\n" " Requests supported iTAN modes for the given " "user\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" listusers:\n" " List the users\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" listaccounts:\n" " List the accounts\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" changepin:\n" " Change the PIN of a key file\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" iniletter:\n" " Print the INI letter for a given " "user\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" addaccount:\n" " Manually add account \n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" delaccount:\n" " Deletes account \n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" setMaxTransfers:\n" " Set the maximum number of transfers/debit notes per job \n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" setsepaprofile:\n" " Set the SEPA profile for transfers/debit notes\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" setTanMediumId:\n" " Set the medium id for some PIN/TAN methods (like mTAN) \n\n")); fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); GWEN_DB_Group_free(db); return 0; } if (rv) { argc-=rv-1; argv+=rv-1; } /*GWEN_Logger_SetLevel(AQHBCI_LOGDOMAIN, GWEN_LoggerLevelInfo); */ cmd=GWEN_DB_GetCharValue(db, "params", 0, 0); if (!cmd) { fprintf(stderr, "ERROR: Command needed.\n"); GWEN_DB_Group_free(db); return 1; } gui=GWEN_Gui_CGui_new(); s=GWEN_DB_GetCharValue(db, "charset", 0, NULL); if (s && *s) GWEN_Gui_SetCharSet(gui, s); nonInteractive=GWEN_DB_GetIntValue(db, "nonInteractive", 0, 0); acceptValidCerts=GWEN_DB_GetIntValue(db, "acceptValidCerts", 0, 0); if (nonInteractive) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); if (acceptValidCerts) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); pinFile=GWEN_DB_GetCharValue(db, "pinFile", 0, NULL); if (pinFile) { GWEN_DB_NODE *dbPins; dbPins=GWEN_DB_Group_new("pins"); if (GWEN_DB_ReadFile(dbPins, pinFile, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { fprintf(stderr, "Error reading pinfile \"%s\"\n", pinFile); GWEN_DB_Group_free(dbPins); GWEN_DB_Group_free(db); return 2; } GWEN_Gui_SetPasswordDb(gui, dbPins, 1); } GWEN_Gui_SetGui(gui); ab=AB_Banking_new("aqhbci-tool", GWEN_DB_GetCharValue(db, "cfgfile", 0, 0), 0); AB_Gui_Extend(gui, ab); if (strcasecmp(cmd, "mkpinlist")==0) { rv=mkPinList(ab, db, argc, argv); } else if (strcasecmp(cmd, "adduser")==0) { rv=addUser(ab, db, argc, argv); } else if (strcasecmp(cmd, "deluser")==0) { rv=delUser(ab, db, argc, argv); } else if (strcasecmp(cmd, "getaccounts")==0) { rv=getAccounts(ab, db, argc, argv); } else if (strcasecmp(cmd, "addaccount")==0) { rv=addAccount(ab, db, argc, argv); } else if (strcasecmp(cmd, "delaccount")==0) { rv=delAccount(ab, db, argc, argv); } else if (strcasecmp(cmd, "getsysid")==0) { rv=getSysId(ab, db, argc, argv); } else if (strcasecmp(cmd, "getcert")==0) { rv=getCert(ab, db, argc, argv); } else if (strcasecmp(cmd, "getkeys")==0) { rv=getKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "createkeys")==0) { rv=createKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "sendkeys")==0) { rv=sendKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "listusers")==0) { rv=listUsers(ab, db, argc, argv); } else if (strcasecmp(cmd, "listaccounts")==0) { rv=listAccounts(ab, db, argc, argv); } else if (strcasecmp(cmd, "iniletter")==0) { rv=iniLetter(ab, db, argc, argv); } else if (strcasecmp(cmd, "getitanmodes")==0) { rv=getItanModes(ab, db, argc, argv); } else if (strcasecmp(cmd, "listitanmodes")==0) { rv=listItanModes(ab, db, argc, argv); } else if (strcasecmp(cmd, "setitanmode")==0) { rv=setItanMode(ab, db, argc, argv); } else if (strcasecmp(cmd, "changepin")==0) { rv=changePin(ab, db, argc, argv); } else if (strcasecmp(cmd, "sethbciversion")==0) { rv=setHbciVersion(ab, db, argc, argv); } else if (strcasecmp(cmd, "adduserflags")==0) { rv=addUserFlags(ab, db, argc, argv); } else if (strcasecmp(cmd, "subuserflags")==0) { rv=subUserFlags(ab, db, argc, argv); } else if (strcasecmp(cmd, "addaccountflags")==0) { rv=addsubAccountFlags(ab, db, argc, argv, 1); } else if (strcasecmp(cmd, "subaccountflags")==0) { rv=addsubAccountFlags(ab, db, argc, argv, 0); } else if (strcasecmp(cmd, "setmaxtransfers")==0) { rv=setMaxTransfers(ab, db, argc, argv); } else if (strcasecmp(cmd, "setTanMediumId")==0) { rv=setTanMediumId(ab, db, argc, argv); } else if (strcasecmp(cmd, "logfile")==0) { rv=logFile(ab, db, argc, argv); } else if (strcasecmp(cmd, "getaccsepa")==0) { rv=getAccSepa(ab, db, argc, argv); } else if (strcasecmp(cmd, "setsepaprofile")==0) { rv=setSepaProfile(ab, db, argc, argv); } else if (strcasecmp(cmd, "versions")==0) { showVersions(); rv=0; } else if (strcasecmp(cmd, "test1")==0) { rv=test1(ab, db, argc, argv); } else { fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd); rv=1; } GWEN_DB_Group_free(db); return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/test.c0000644000175000017500000000154512364015477023212 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: iniletter.c 964 2006-03-17 10:35:21Z cstim $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int test1(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getsysid.c0000644000175000017500000001173212364015477024065 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getSysId(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetSysId(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error getting system id (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/logfile.c0000644000175000017500000003455112364015477023657 00000000000000/*************************************************************************** begin : Mon May 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include static int _readLogFile(const char *fname, GWEN_DB_NODE *db) { GWEN_SYNCIO *sio; GWEN_FAST_BUFFER *fb; int rv; GWEN_BUFFER *tbuf = NULL; sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error opening file [%s] (%d)", fname, rv); return rv; } /* create fast buffer around io layer */ fb=GWEN_FastBuffer_new(1024, sio); for (;;) { GWEN_DB_NODE *dbMsg; GWEN_DB_NODE *dbHeader; unsigned int size; /* read header */ dbMsg=GWEN_DB_Group_new("Message"); dbHeader=GWEN_DB_GetGroup(dbMsg, GWEN_DB_FLAGS_DEFAULT, "header"); rv=GWEN_DB_ReadFromFastBuffer(dbHeader, fb, GWEN_DB_FLAGS_HTTP | GWEN_DB_FLAGS_UNTIL_EMPTY_LINE); if (rv<0) { if (rv==GWEN_ERROR_EOF) break; else { GWEN_DB_Group_free(dbMsg); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); DBG_ERROR(0, "Error reading header from file [%s] (%d)", fname, rv); GWEN_DB_Dump(db, 2); return rv; } } /* read body */ size=GWEN_DB_GetIntValue(dbHeader, "size", 0, 0); tbuf=GWEN_Buffer_new(0, 2048, 0, 1); while(size) { unsigned int lsize; uint8_t buffer[1024]; lsize=size; if (lsize>sizeof(buffer)) lsize=sizeof(buffer); GWEN_FASTBUFFER_READFORCED(fb, rv, buffer, lsize); if (rv<0) { GWEN_DB_Group_free(dbMsg); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); DBG_ERROR(0, "Error reading body from file [%s] (%d)", fname, rv); return rv; } GWEN_Buffer_AppendBytes(tbuf, (const char*)buffer, lsize); size-=lsize; } // while GWEN_DB_SetBinValue(dbMsg, GWEN_DB_FLAGS_OVERWRITE_VARS, "body", GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf)); GWEN_Buffer_Reset(tbuf); GWEN_DB_AddGroup(db, dbMsg); } GWEN_Buffer_free(tbuf); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } static int dumpMsg(GWEN_SYNCIO *sio, GWEN_DB_NODE *hd, const uint8_t *p, uint32_t len) { int rv; rv=GWEN_DB_WriteToIo(hd, sio, GWEN_DB_FLAGS_WRITE_SUBGROUPS | GWEN_DB_FLAGS_DETAILED_GROUPS | GWEN_DB_FLAGS_USE_COLON| GWEN_DB_FLAGS_OMIT_TYPES); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } /* append empty line to separate header from data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } /* write data */ if (p && len) { rv=GWEN_SyncIo_WriteForced(sio, p, len); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } } /* append CR for better readability */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } return 0; } int logFile(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { int rv; GWEN_DB_NODE *db; GWEN_DB_NODE *dbMessages; const char *s; GWEN_MSGENGINE *e; GWEN_SYNCIO *sioOut=NULL; GWEN_SYNCIO *sioDb=NULL; const char *inFile; const char *outFile; const char *dbOutFile; int i; GWEN_DB_NODE *dbT; int trustLevel; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "xmlfile", /* name */ 0, /* minnum */ 99, /* maxnum */ "x", /* short option */ "xmlfile", /* long option */ "Specify XML files to load", /* short description */ "Specify XML files to load" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "infile", /* name */ 1, /* minnum */ 1, /* maxnum */ "i", /* short option */ "infile", /* long option */ "Specify input file", /* short description */ "Specify input file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify output file", /* short description */ "Specify output file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "dboutfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "d", /* short option */ "dbfile", /* long option */ "Specify DB output file", /* short description */ "Specify DB output file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "trustLevel", /* name */ 0, /* minnum */ 1, /* maxnum */ "L", /* short option */ "trustlevel", /* long option */ "Specify the trust level", /* short description */ "Specify the trust level" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } trustLevel=GWEN_DB_GetIntValue(db, "trustLevel", 0, 0); outFile=GWEN_DB_GetCharValue(db, "outFile", 0, NULL); dbOutFile=GWEN_DB_GetCharValue(db, "dbOutFile", 0, NULL); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, NULL); assert(inFile); /* do it */ dbMessages=GWEN_DB_Group_new("Messages"); rv=_readLogFile(inFile, dbMessages); if (rv<0) { DBG_ERROR(0, "Error reading message (%d)", rv); return 2; } /* create message engine, read XML definitions */ e=AH_MsgEngine_new(); for (i=0; i<99; i++) { s=GWEN_DB_GetCharValue(dbArgs, "xmlfile", i, NULL); if (s && *s) { GWEN_XMLNODE *defs; defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "defs"); if (GWEN_XML_ReadFile(defs, s, GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr, "Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } else { if (i==0) { GWEN_XMLNODE *defs; defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "defs"); if (GWEN_XML_ReadFile(defs, XMLDATA_DIR "/hbci.xml", GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr, "Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } break; } } if (outFile) { sioOut=GWEN_SyncIo_File_new(outFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sioOut, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_APPEND); rv=GWEN_SyncIo_Connect(sioOut); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sioOut); return 2; } } if (dbOutFile) { sioDb=GWEN_SyncIo_File_new(dbOutFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sioDb, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_APPEND); rv=GWEN_SyncIo_Connect(sioDb); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sioDb); return 2; } } dbT=GWEN_DB_GetFirstGroup(dbMessages); while(dbT) { const uint8_t *p; uint32_t len; GWEN_DB_NODE *dbHeader; dbHeader=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "header"); assert(dbHeader); s=GWEN_DB_GetCharValue(dbHeader, "mode", 0, "PINTAN"); GWEN_MsgEngine_SetMode(e, s); i=GWEN_DB_GetIntValue(dbHeader, "hbciVersion", 0, 220); GWEN_MsgEngine_SetProtocolVersion(e, i); p=GWEN_DB_GetBinValue(dbT, "body", 0, NULL, 0, &len); if (p && len) { GWEN_BUFFER *tbuf; GWEN_DB_NODE *gr; GWEN_MSGENGINE_TRUSTEDDATA *trustedData; GWEN_MSGENGINE_TRUSTEDDATA *ntd; GWEN_DB_NODE *repl; gr=GWEN_DB_Group_new("message"); tbuf=GWEN_Buffer_new((char*) p, len, len, 0); rv=GWEN_MsgEngine_ReadMessage(e, "SEG", tbuf, gr, GWEN_MSGENGINE_READ_FLAGS_TRUSTINFO); if (rv) { fprintf(stderr, "ERROR.\n"); GWEN_Buffer_Dump(tbuf, 2); return 2; } /* work on trust data */ trustedData=GWEN_MsgEngine_TakeTrustInfo(e); if (trustedData) { if (GWEN_MsgEngine_TrustedData_CreateReplacements(trustedData)) { fprintf(stderr, "Could not anonymize log (createReplacements)\n"); GWEN_MsgEngine_TrustedData_free(trustedData); GWEN_MsgEngine_free(e); return 2; } } /* anonymize file */ ntd=trustedData; repl=GWEN_DB_GetGroup(dbHeader, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "replacements"); assert(repl); while(ntd) { if (GWEN_MsgEngine_TrustedData_GetTrustLevel(ntd)>trustLevel) { int pos; unsigned int size; char rbuffer[3]; const char *rpstr; rpstr=GWEN_MsgEngine_TrustedData_GetReplacement(ntd); assert(rpstr); assert(*rpstr); size=strlen(rpstr); if (size==1) { rbuffer[0]=rpstr[0]; rbuffer[1]=0; } else { rbuffer[0]=rpstr[0]; rbuffer[1]=rpstr[1]; rbuffer[2]=0; } GWEN_DB_SetCharValue(repl, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_VAR, rbuffer, GWEN_MsgEngine_TrustedData_GetDescription(ntd)); size=GWEN_MsgEngine_TrustedData_GetSize(ntd); pos=GWEN_MsgEngine_TrustedData_GetFirstPos(ntd); while(pos>=0) { DBG_INFO(0, "Replacing %d bytes at %d", size, pos); GWEN_Buffer_SetPos(tbuf, pos); GWEN_Buffer_ReplaceBytes(tbuf, size, GWEN_MsgEngine_TrustedData_GetReplacement(ntd), size); pos=GWEN_MsgEngine_TrustedData_GetNextPos(ntd); } // while pos } ntd=GWEN_MsgEngine_TrustedData_GetNext(ntd); } // while ntd GWEN_DB_SetIntValue(dbHeader, GWEN_DB_FLAGS_OVERWRITE_VARS, "size", GWEN_Buffer_GetUsedBytes(tbuf)); if (outFile) { rv=dumpMsg(sioOut, dbHeader, (const uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf)); if (rv<0) { fprintf(stderr, "Could not anonymize log (dumpMsg)\n"); GWEN_MsgEngine_TrustedData_free(trustedData); GWEN_MsgEngine_free(e); return 2; } } if (dbOutFile) { GWEN_BUFFER *xbuf; GWEN_DB_NODE *dbOut; xbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(xbuf, "# ========== Message ( "); s=GWEN_DB_GetCharValue(dbHeader, "sender", 0, "UNK"); if (s && *s) { GWEN_Buffer_AppendString(xbuf, "sender="); GWEN_Buffer_AppendString(xbuf, s); GWEN_Buffer_AppendString(xbuf, " "); } s=GWEN_DB_GetCharValue(dbHeader, "crypt", 0, "UNK"); if (s && *s) { GWEN_Buffer_AppendString(xbuf, "crypt="); GWEN_Buffer_AppendString(xbuf, s); GWEN_Buffer_AppendString(xbuf, " "); } GWEN_Buffer_AppendString(xbuf, ") ==========\n"); dbOut=GWEN_DB_Group_new("Message"); GWEN_Buffer_Rewind(tbuf); rv=GWEN_MsgEngine_ReadMessage(e, "SEG", tbuf, dbOut, 0); if (rv) { fprintf(stderr, "ERROR.\n"); GWEN_Buffer_Dump(tbuf, 2); return 2; } rv=GWEN_SyncIo_WriteForced(sioDb, (const uint8_t*) GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf)); GWEN_Buffer_free(xbuf); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } rv=GWEN_DB_WriteToIo(dbOut, sioDb, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return 2; } /* append empty line to separate header from data */ rv=GWEN_SyncIo_WriteForced(sioDb, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); return rv; } } GWEN_Buffer_free(tbuf); } dbT=GWEN_DB_GetNextGroup(dbT); } /* close output layer */ if (outFile) { rv=GWEN_SyncIo_Disconnect(sioOut); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sioOut); return 2; } GWEN_SyncIo_free(sioOut); } if (dbOutFile) { rv=GWEN_SyncIo_Disconnect(sioDb); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sioDb); return 2; } GWEN_SyncIo_free(sioDb); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getcert.c0000644000175000017500000001160212364015477023663 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getCert(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { rv=AH_Provider_GetCert(pro, u, 1, 0, 1); if (rv) { DBG_ERROR(0, "Error getting certificate (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/addaccount.c0000644000175000017500000001751212364015477024341 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getaccounts.c 964 2006-03-17 10:35:21Z cstim $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int addAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *accountName; const char *accountId; const char *customerId; const char *ownerName; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 1, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 1, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ownerName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N" /* short option */ "owner", /* long option */ "Specify the owner name", /* short description */ "Specify the owner name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "name", /* long option */ "Specify the account name (Konto-Name)", /* short description */ "Specify the account name (Konto-Name)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 1, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account id (Kontonummer)", /* short description */ "Specify the account id (Kontonummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, "*"); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, "Account"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ownerName=GWEN_DB_GetCharValue(db, "ownerName", 0, NULL); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching user"); AB_Banking_Fini(ab); return 3; } else { AB_ACCOUNT *account; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; AB_BANKINFO *bi; int rv; bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); AB_BankInfo_SetBankId( tbi, bankId ); rv=AB_Banking_GetBankInfoByTemplate(ab, "de", tbi, bl); if (rv) { fprintf(stderr, "Error looking for bank info: %d\n", rv); return 3; } bit=AB_BankInfo_List2_First(bl); if (bit) { bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); AB_BankInfo_List2Iterator_free(bit); } else { bi=NULL; fprintf(stderr, "Could not find bank with id %s\n", bankId); } AB_BankInfo_List2_free(bl); account=AB_Banking_CreateAccount(ab, "aqhbci"); assert(account); if (!ownerName) AB_Account_SetOwnerName(account, AB_User_GetUserName(u)); else AB_Account_SetOwnerName(account, ownerName); AB_Account_SetAccountNumber(account, accountId); if (accountName) AB_Account_SetAccountName(account, accountName); AB_Account_SetBankCode(account, bankId); if (bi) AB_Account_SetBankName(account, AB_BankInfo_GetBankName(bi)); AB_Account_SetUser(account, u); AB_Account_SetSelectedUser(account, u); rv=AB_Banking_AddAccount(ab, account); if (rv) { DBG_ERROR(0, "Error adding account (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/sendkeys.c0000644000175000017500000001322312364015477024054 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int sendKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int withAuthKey=0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "authkey", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "authkey", /* long option */ "Also send the authentication key", /* short description */ "Also send the authentication key" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); withAuthKey=GWEN_DB_GetIntValue(db, "authKey", 0, 0); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_SendUserKeys2(pro, u, ctx, withAuthKey, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error sending user keys (%d)", rv); AB_Banking_Fini(ab); return 3; } fprintf(stderr, "Key(s) sent.\n"); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/iniletter.c0000644000175000017500000001560012364015477024227 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int iniLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int bankKey; int html; int variant; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "bankKey", /* name */ 0, /* minnum */ 1, /* maxnum */ "B", /* short option */ "bankkey", /* long option */ "Show iniletter of bank keys",/* short description */ "Show iniletter of bank keys" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "html", /* name */ 0, /* minnum */ 1, /* maxnum */ NULL, /* short option */ "html", /* long option */ "HTML output",/* short description */ "HTML output" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "variant", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "variant", /* long option */ "Choose the variant of the iniletter (0, 1, 2)",/* short description */ "Choose the variant of the iniletter (0 for auto, 1 for RDH1, 2 for RDH2 and above)" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); bankKey=GWEN_DB_VariableExists(db, "bankKey"); html=GWEN_DB_VariableExists(db, "html"); variant=GWEN_DB_GetIntValue(db, "variant", 0, 0); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { GWEN_BUFFER *lbuf; lbuf=GWEN_Buffer_new(0, 1024, 0, 1); if (html) rv=AH_Provider_GetIniLetterHtml(pro, u, bankKey, variant, lbuf, 0); else rv=AH_Provider_GetIniLetterTxt(pro, u, bankKey, variant, lbuf, 0); if (rv) { DBG_ERROR(0, "Could not create ini letter (%d)", rv); return 3; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getaccsepa.c0000644000175000017500000001545712364015477024341 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getAccSepa(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; int rv; const char *bankId; const char *account; const char *subAccountId; uint32_t uniqueAccountId = 0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT_LIST2 *matches; AB_ACCOUNT_LIST2_ITERATOR *ait; int match_count = 0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "account", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountUniqueId", /* name */ 0, /* minnum */ 1, /* maxnum */ "i", /* short option */ "unique", /* long option */ "Specify the account unique id", /* short description */ "Specify the account unique id" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); account=GWEN_DB_GetCharValue(db, "account", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); uniqueAccountId=GWEN_DB_GetIntValue(db, "accountUniqueId", 0, 0); matches = AB_Account_List2_new(); al=AB_Banking_FindAccounts(ab, AH_PROVIDER_NAME, "*", "*", "*", "*"); if (al) { ait=AB_Account_List2_First(al); if (ait) { const char *s; AB_ACCOUNT *a; int i=0; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { int match = 1; if (match && bankId) { s=AB_Account_GetBankCode(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) match=0; } if (match && account) { s=AB_Account_GetAccountNumber(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, account, 0)) match=0; } if (match && subAccountId) { s=AB_Account_GetSubAccountId(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, subAccountId, 0)) match=0; } if (match && uniqueAccountId) { uint32_t id = AB_Account_GetUniqueId(a); if ( uniqueAccountId != id ) match=0; } if( match ) { match_count++; DBG_DEBUG(AQHBCI_LOGDOMAIN, "Account %d:\tUniqueId: %d\t\tAccount Number: %s\tBank: %s/%s", i++, AB_Account_GetUniqueId(a), AB_Account_GetAccountNumber(a), AB_Account_GetCountry(a), AB_Account_GetBankCode(a) ); AB_Account_List2_PushBack( matches, a); } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); } if( !match_count ) { fprintf( stderr, "ERROR: No matching accounts\n" ); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetAccountSepaInfo(pro, matches, ctx, 1, 0, 1); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not execute outbox.\n"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } AB_ImExporterContext_free(ctx); } AB_Account_List2_free(matches); rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/changepin.c0000644000175000017500000001202212364015477024157 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 964 2006-03-17 10:35:21Z cstim $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int changePin(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_ChangePin(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error while changing the PIN (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getitanmodes.c0000644000175000017500000001206012364015477024710 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 964 2006-03-17 10:35:21Z cstim $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getItanModes(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetItanModes(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error getting list of supported iTAN modes (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile.in0000644000175000017500000007553412643540060024134 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = aqhbci-tool4$(EXEEXT) subdir = src/plugins/backends/aqhbci/tools/aqhbci-tool DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(idatadir)" PROGRAMS = $(bin_PROGRAMS) am_aqhbci_tool4_OBJECTS = main.$(OBJEXT) mkpinlist.$(OBJEXT) \ adduser.$(OBJEXT) deluser.$(OBJEXT) \ addsubaccountflags.$(OBJEXT) getsysid.$(OBJEXT) \ getkeys.$(OBJEXT) createkeys.$(OBJEXT) sendkeys.$(OBJEXT) \ getaccounts.$(OBJEXT) listusers.$(OBJEXT) \ listaccounts.$(OBJEXT) iniletter.$(OBJEXT) \ getitanmodes.$(OBJEXT) changepin.$(OBJEXT) test.$(OBJEXT) \ addaccount.$(OBJEXT) delaccount.$(OBJEXT) getcert.$(OBJEXT) \ sethbciversion.$(OBJEXT) adduserflags.$(OBJEXT) \ subuserflags.$(OBJEXT) listitanmodes.$(OBJEXT) \ setitanmode.$(OBJEXT) setmaxtransfers.$(OBJEXT) \ setsepaprofile.$(OBJEXT) settanmediumid.$(OBJEXT) \ logfile.$(OBJEXT) getaccsepa.$(OBJEXT) aqhbci_tool4_OBJECTS = $(am_aqhbci_tool4_OBJECTS) am__DEPENDENCIES_1 = aqhbci_tool4_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqhbci_tool4_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(aqhbci_tool4_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqhbci_tool4_SOURCES) DIST_SOURCES = $(aqhbci_tool4_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(idata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DXMLDATA_DIR=\"$(aqbanking_pkgdatadir)/backends/aqhbci\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = README INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) idatadir = $(datadir)/doc/aqhbci/aqhbci-tool idata_DATA = README noinst_HEADERS = globals.h aqhbci_tool4_SOURCES = main.c \ mkpinlist.c \ adduser.c \ deluser.c \ addsubaccountflags.c \ getsysid.c \ getkeys.c \ createkeys.c \ sendkeys.c \ getaccounts.c \ listusers.c \ listaccounts.c \ iniletter.c \ getitanmodes.c \ changepin.c \ test.c \ addaccount.c \ delaccount.c \ getcert.c \ sethbciversion.c \ adduserflags.c \ subuserflags.c \ listitanmodes.c \ setitanmode.c \ setmaxtransfers.c \ setsepaprofile.c \ settanmediumid.c \ logfile.c \ getaccsepa.c aqhbci_tool4_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ @IS_WINDOWS_TRUE@aqhbci_tool4_LDFLAGS = -mconsole all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list aqhbci-tool4$(EXEEXT): $(aqhbci_tool4_OBJECTS) $(aqhbci_tool4_DEPENDENCIES) $(EXTRA_aqhbci_tool4_DEPENDENCIES) @rm -f aqhbci-tool4$(EXEEXT) $(AM_V_CCLD)$(aqhbci_tool4_LINK) $(aqhbci_tool4_OBJECTS) $(aqhbci_tool4_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addaccount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addsubaccountflags.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adduser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adduserflags.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/changepin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/createkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delaccount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deluser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaccounts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaccsepa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getitanmodes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getsysid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iniletter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listaccounts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listitanmodes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listusers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkpinlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sethbciversion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setitanmode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setmaxtransfers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setsepaprofile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settanmediumid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subuserflags.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-idataDATA: $(idata_DATA) @$(NORMAL_INSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(idatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(idatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(idatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(idatadir)" || exit $$?; \ done uninstall-idataDATA: @$(NORMAL_UNINSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(idatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(idatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-idataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-idataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-idataDATA install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-idataDATA sources: # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/settanmediumid.c0000644000175000017500000001357312364015477025253 00000000000000/*************************************************************************** begin : Thu May 06 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int setTanMediumId(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *tanMediumId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "tanMediumId", /* name */ 1, /* minnum */ 1, /* maxnum */ "m", /* short option */ "tanmediumid", /* long option */ "Specify the TAN medium id", /* short description */ "Specify the TAN medium id" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); tanMediumId=GWEN_DB_GetCharValue(db, "tanMediumId", 0, "none"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ if (strcasecmp(tanMediumId, "none")==0) AH_User_SetTanMediumId(u, NULL); else AH_User_SetTanMediumId(u, tanMediumId); /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/setmaxtransfers.c0000644000175000017500000001550312364015477025463 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int setMaxTransfers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int maxTransfers; int maxDebitNotes; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "maxTransfers", /* name */ 0, /* minnum */ 1, /* maxnum */ "t", /* short option */ "transfers", /* long option */ "Specify the maximum number of transfers per job", /* short description */ "Specify the maximum number of transfers per job" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "maxDebitNotes", /* name */ 0, /* minnum */ 1, /* maxnum */ "d", /* short option */ "debitnotes", /* long option */ "Specify the maximum number of debit notes per job", /* short description */ "Specify the maximum number of debit notes per job" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); maxTransfers=GWEN_DB_GetIntValue(db, "maxTransfers", 0, -1); maxDebitNotes=GWEN_DB_GetIntValue(db, "maxDebitNotes", 0, -1); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ if (maxTransfers>0) { fprintf(stderr, "Setting maximum number of transfers per job to %d\n", maxTransfers); AH_User_SetMaxTransfersPerJob(u, maxTransfers); } if (maxDebitNotes>0) { fprintf(stderr, "Setting maximum number of debit notes per job to %d\n", maxDebitNotes); AH_User_SetMaxDebitNotesPerJob(u, maxDebitNotes); } /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/adduserflags.c0000644000175000017500000001435612364015477024703 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int addUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "flags", /* name */ 1, /* minnum */ 99, /* maxnum */ "f", /* short option */ "flags", /* long option */ "Specify the user flags", /* short description */ "Specify the user flags" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_User_List2_free(ul); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { GWEN_DB_NODE *vn; uint32_t flags, bf, c=0; /* parse flags */ flags=AH_User_Flags_fromDb(db, "flags"); for (bf=flags; bf; bf>>=1) { if (bf&1) c++; } vn=GWEN_DB_FindFirstVar(db, "flags"); if (GWEN_DB_Values_Count(vn)!=c) { fprintf(stderr, "ERROR: Specified flag(s) unknown\n"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ fprintf(stderr, "Adding flags: %08x\n", flags); AH_User_AddFlags(u, flags); /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/deluser.c0000644000175000017500000002730012364015477023673 00000000000000/*************************************************************************** begin : Tue Sep 20 2008 copyright : (C) 2008 by Patrick Prasse email : patrick-oss@prasse.info *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include int delUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; int rv; const char *bankId; const char *userId; const char *customerId; const char *userName; int uninitialized = -1; uint32_t delAll = 0; uint32_t delAccounts = 0; uint32_t pretend = 0; uint32_t userUniqueId = 0; AB_USER_LIST2 *ul; AB_USER_LIST2 *matches; AB_USER_LIST2_ITERATOR *uit; int match_count = 0; int haveaccounts_count = 0; int error_count = 0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "username", /* long option */ "Specify the user name", /* short description */ "Specify the user name (not the userid!)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userUniqueId", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "user-unique", /* long option */ "Specify the user unique id", /* short description */ "Specify the user unique id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "uninitialized", /* name */ 0, /* minnum */ 1, /* maxnum */ NULL, /* short option */ "uninitialized", /* long option */ "Match uninitialized users (PARAM=1) or initialized users (PARAM=0)", /* short description */ "Match uninitialized users (PARAM=1) or initialized users (PARAM=0)" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "all", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "all", /* long option */ "Delete all matching users, do not abort if more than one user matches", /* short description */ "Delete all matching users, do not abort if more than one user matches" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "withAccounts", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "with-accounts", /* long option */ "Delete all accounts of user", /* short description */ "Delete all accounts of user" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "pretend", /* name */ 0, /* minnum */ 1, /* maxnum */ "p", /* short option */ "pretend", /* long option */ "Only print matching users, don't delete", /* short description */ "Only print matching users, don't delete" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); userId=GWEN_DB_GetCharValue(db, "userId", 0, 0); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, 0); userName=GWEN_DB_GetCharValue(db, "userName", 0, 0); uninitialized=GWEN_DB_GetIntValue(db, "uninitialized", 0, -1); delAll=GWEN_DB_GetIntValue(db, "all", 0, 0); delAccounts=GWEN_DB_GetIntValue(db, "withAccounts", 0, 0); pretend=GWEN_DB_GetIntValue(db, "pretend", 0, 0); userUniqueId=GWEN_DB_GetIntValue(db, "userUniqueId", 0, 0); if( uninitialized != 0 && uninitialized != 1 && uninitialized != -1 ) { fprintf( stderr, "Please specify either 0 or 1 for --uninitialized\n" ); return 1; } matches = AB_User_List2_new(); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "*", "*", "*", "*"); if (ul) { uit=AB_User_List2_First(ul); if (uit) { const char *s; AB_USER *u; int i=0; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { int match = 1; if (match && bankId) { s=AB_User_GetBankCode(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) match=0; } if (match && userId) { s=AB_User_GetUserId(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, userId, 0)) match=0; } if (match && customerId) { s=AB_User_GetCustomerId(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, customerId, 0)) match=0; } if (match && userName) { s=AB_User_GetUserName(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, userName, 0)) match=0; } if (match && userUniqueId) { uint32_t id = AB_User_GetUniqueId(u); if ( userUniqueId != id ) match=0; } if (match && uninitialized != -1) { s=AH_User_GetSystemId(u); if( (uninitialized == 1 && s != NULL) || (uninitialized == 0 && s == NULL) ) match = 0; } if( match ) { match_count++; fprintf(stdout, "User %d: Bank: %s/%s User Id: %s Customer Id: %s\n", i++, AB_User_GetCountry(u), AB_User_GetBankCode(u), AB_User_GetUserId(u), AB_User_GetCustomerId(u)); AB_User_List2_PushBack( matches, u ); haveaccounts_count += (AB_Banking_FindFirstAccountOfUser(ab, u) != NULL ? 1 : 0 ); } u=AB_User_List2Iterator_Next(uit); } AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if( !match_count ) { fprintf( stderr, "ERROR: No matching users\n" ); return 3; } if( match_count > 1 && !delAll ) { fprintf( stderr, "ERROR: %d users match. Refusing to delete more than one user. Please specify --all to delete all matching users.\n", match_count ); return 3; } if( haveaccounts_count && !delAccounts ) { fprintf( stderr, "ERROR: %d users still have accounts. Refusing to delete those users. Please specify --with-accounts to delete all accounts of matching users.\n", haveaccounts_count ); return 3; } if( !pretend ) { uit=AB_User_List2_First(matches); if (uit) { AB_USER *u; int i=0; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { int error = 0; if( delAccounts ) { AB_ACCOUNT *a; a = AB_Banking_FindFirstAccountOfUser( ab, u ); while( a ) { rv = AB_Banking_DeleteAccount( ab, a ); if( rv ) { fprintf( stderr, "ERROR: Error deleting account %d for user %d (%d), aborting this user.\n", AB_Account_GetUniqueId(a), i, rv ); error++; error_count++; } else fprintf( stdout, "Account %d deleted.\n", AB_Account_GetUniqueId(a) ); a = AB_Banking_FindFirstAccountOfUser( ab, u ); } } if( !error ) { rv = AB_Banking_DeleteUser( ab, u ); if( rv ) { fprintf( stderr, "ERROR: Error deleting user %d (%d).\n", i, rv ); error++; error_count++; } else fprintf( stdout, "User %d deleted.\n", i ); } u=AB_User_List2Iterator_Next(uit); i++; } AB_User_List2Iterator_free(uit); } AB_User_List2_free(matches); } // !pretend else { fprintf( stdout, "Nothing deleted.\n" ); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return error_count > 0 ? 3 : 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile.am0000644000175000017500000000172312364015477024121 00000000000000EXTRA_DIST=README INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) bin_PROGRAMS=aqhbci-tool4 idatadir=$(datadir)/doc/aqhbci/aqhbci-tool idata_DATA=README localedir = $(datadir)/locale DEFS += -DLOCALEDIR=\"$(localedir)\" -DXMLDATA_DIR=\"$(aqbanking_pkgdatadir)/backends/aqhbci\" noinst_HEADERS=globals.h aqhbci_tool4_SOURCES=main.c \ mkpinlist.c \ adduser.c \ deluser.c \ addsubaccountflags.c \ getsysid.c \ getkeys.c \ createkeys.c \ sendkeys.c \ getaccounts.c \ listusers.c \ listaccounts.c \ iniletter.c \ getitanmodes.c \ changepin.c \ test.c \ addaccount.c \ delaccount.c \ getcert.c \ sethbciversion.c \ adduserflags.c \ subuserflags.c \ listitanmodes.c \ setitanmode.c \ setmaxtransfers.c \ setsepaprofile.c \ settanmediumid.c \ logfile.c \ getaccsepa.c aqhbci_tool4_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ if IS_WINDOWS aqhbci_tool4_LDFLAGS=-mconsole endif sources: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/listitanmodes.c0000644000175000017500000001373712364015477025120 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int listItanModes(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { const AH_TAN_METHOD_LIST *tl; tl=AH_User_GetTanMethodDescriptions(u); if (tl) { const AH_TAN_METHOD *tm; tm=AH_TanMethod_List_First(tl); fprintf(stdout, "TAN Methods\n"); while(tm) { const char *mid; const char *mname; int combinedVersion; combinedVersion=AH_TanMethod_GetFunction(tm)+(AH_TanMethod_GetGvVersion(tm)*1000); fprintf(stdout, "- %4d (F%3d/V%1d/P%1d)", combinedVersion, AH_TanMethod_GetFunction(tm), AH_TanMethod_GetGvVersion(tm), AH_TanMethod_GetProcess(tm)); mid=AH_TanMethod_GetMethodId(tm); mname=AH_TanMethod_GetMethodName(tm); if (mid && mname) { fprintf(stdout, ": %s (%s)", mid, mname); } else if (mid && !mname) { fprintf(stdout, ": %s", mid); } else if (!mid && mname) { fprintf(stdout, ": %s", mname); } if (AH_User_HasTanMethod(u, AH_TanMethod_GetFunction(tm))) { if (AH_User_GetSelectedTanMethod(u)==combinedVersion) fprintf(stdout, " [available and selected]"); else fprintf(stdout, " [available]"); } else fprintf(stdout, " [not available]"); fprintf(stdout, "\n"); tm=AH_TanMethod_List_Next(tm); } } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/adduser.c0000644000175000017500000003770412530646060023661 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include int getBankUrl(AB_BANKING *ab, AH_CRYPT_MODE cm, const char *bankId, GWEN_BUFFER *bufServer) { AB_BANKINFO *bi; bi=AB_Banking_GetBankInfo(ab, "de", 0, bankId); if (bi) { AB_BANKINFO_SERVICE_LIST *l; AB_BANKINFO_SERVICE *sv; l=AB_BankInfo_GetServices(bi); assert(l); sv=AB_BankInfoService_List_First(l); while(sv) { const char *st; st=AB_BankInfoService_GetType(sv); if (st && *st && strcasecmp(st, "hbci")==0) { const char *svm; svm=AB_BankInfoService_GetMode(sv); if (svm && *svm) { if (! ((strcasecmp(svm, "pintan")==0) ^ (cm==AH_CryptMode_Pintan))){ const char *addr; addr=AB_BankInfoService_GetAddress(sv); if (addr && *addr) { GWEN_Buffer_Reset(bufServer); GWEN_Buffer_AppendString(bufServer, addr); return 0; } } } } sv=AB_BankInfoService_List_Next(sv); } AB_BankInfo_free(bi); } /* if bank info */ return -1; } int addUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; int rv; GWEN_BUFFER *nameBuffer=NULL; const char *tokenName; const char *tokenType; const char *bankId; const char *userId; const char *customerId; const char *server; const char *userName; int hbciVersion; int rdhType; uint32_t cid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userName", /* name */ 1, /* minnum */ 1, /* maxnum */ "N", /* short option */ "username", /* long option */ "Specify the user name", /* short description */ "Specify the user name (not the userid!)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "tokenType", /* name */ 1, /* minnum */ 1, /* maxnum */ "t", /* short option */ "tokentype", /* long option */ "Specify the crypt token type", /* short description */ "Specify the crypt token type" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "tokenName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "tokenname", /* long option */ "Specify the crypt token name", /* short description */ "Specify the crypt token name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "serverAddr", /* name */ 0, /* minnum */ 1, /* maxnum */ "s", /* short option */ "server", /* long option */ "Specify the server URL", /* short description */ "Specify the server URL" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "context", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "context", /* long option */ "Select a context on the medium", /* short description */ "Select a context on the medium" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "hbciversion", 0, 1, 0, "hbciversion", "Select the HBCI version", "Select the HBCI protocol version" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "rdhType", 0, 1, 0, "rdhtype", "Select the RDH profile type (1, 2, 3, 5, 10)", "Select the RDH profile type (1, 2, 3, 5, 10)" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); tokenType=GWEN_DB_GetCharValue(db, "tokenType", 0, 0); tokenName=GWEN_DB_GetCharValue(db, "tokenName", 0, 0); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); userId=GWEN_DB_GetCharValue(db, "userId", 0, 0); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, 0); server=GWEN_DB_GetCharValue(db, "serverAddr", 0, 0); cid=GWEN_DB_GetIntValue(db, "context", 0, 1); hbciVersion=GWEN_DB_GetIntValue(db, "hbciVersion", 0, 0); rdhType=GWEN_DB_GetIntValue(db, "rdhType", 0, 1); userName=GWEN_DB_GetCharValue(db, "userName", 0, 0); assert(userName); /* generic check for some arguments */ if (hbciVersion>0 && rdhType>1) { if (hbciVersion<300 && rdhType>1) { DBG_ERROR(0, "RDH Types 2 and above only work with HBCI version 300 or later"); return 1; } } if (hbciVersion>0) { switch(hbciVersion) { case 201: case 210: case 220: case 300: /* supported */ break; default: DBG_ERROR(0, "HBCI/FinTS version %d not supported", hbciVersion); return 1; } } if (rdhType>0) { switch(rdhType) { case 1: case 2: case 10: /* supported */ break; case 3: case 4: case 5: case 6: case 7: case 8: case 9: default: DBG_ERROR(0, "RDH type %d not supported", rdhType); return 1; } } if (1) { const char *lbankId; const char *luserId; const char *lcustomerId; const char *lserverAddr; AH_CRYPT_MODE cm; GWEN_URL *url; GWEN_CRYPT_TOKEN_CONTEXT *ctx=NULL; AB_USER *user; if (strcasecmp(tokenType, "pintan")==0) { lbankId=bankId; luserId=userId; lcustomerId=customerId?customerId:luserId; lserverAddr=server; cm=AH_CryptMode_Pintan; } else { GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_CRYPT_CRYPTALGOID algo; if (cid==0) { DBG_ERROR(0, "No context given."); return 1; } /* get crypt token */ pm=GWEN_PluginManager_FindPluginManager("ct"); if (pm==0) { DBG_ERROR(0, "Plugin manager not found"); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, tokenType); if (pl==0) { DBG_ERROR(0, "Plugin not found"); return 3; } DBG_INFO(0, "Plugin found"); ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, tokenName); if (ct==0) { DBG_ERROR(0, "Could not create crypt token"); return 3; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 0, 0); if (rv) { DBG_ERROR(0, "Could not open token (%d)", rv); GWEN_Crypt_Token_free(ct); return 3; } /* get real token name */ nameBuffer=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Buffer_AppendString(nameBuffer, GWEN_Crypt_Token_GetTokenName(ct)); tokenName=GWEN_Buffer_GetStart(nameBuffer); cctx=GWEN_Crypt_Token_GetContext(ct, cid, 0); if (cctx==NULL) { DBG_ERROR(0, "Context %02x not found", cid); GWEN_Buffer_free(nameBuffer); GWEN_Crypt_Token_Close(ct, 1, 0); GWEN_Crypt_Token_free(ct); return 3; } ctx=GWEN_Crypt_Token_Context_dup(cctx); lbankId=bankId?bankId:GWEN_Crypt_Token_Context_GetServiceId(ctx); luserId=userId?userId:GWEN_Crypt_Token_Context_GetUserId(ctx); lcustomerId=customerId?customerId:luserId; lserverAddr=server?server:GWEN_Crypt_Token_Context_GetAddress(ctx); /* determine crypt mode */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (keyId==0) keyId=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (keyId==0) keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); if (keyId==0) keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (keyId==0) { DBG_ERROR(0, "No keys, unable to determine crypt mode"); GWEN_Buffer_free(nameBuffer); GWEN_Crypt_Token_Close(ct, 1, 0); GWEN_Crypt_Token_free(ct); return 3; } ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_ERROR(0, "Could not get keyinfo for key %d, " "unable to determine crypt mode", keyId); GWEN_Crypt_Token_Context_free(ctx); GWEN_Buffer_free(nameBuffer); GWEN_Crypt_Token_Close(ct, 1, 0); GWEN_Crypt_Token_free(ct); return 3; } algo=GWEN_Crypt_Token_KeyInfo_GetCryptAlgoId(ki); if (algo==GWEN_Crypt_CryptAlgoId_Des3K) cm=AH_CryptMode_Ddv; else if (algo==GWEN_Crypt_CryptAlgoId_Rsa) cm=AH_CryptMode_Rdh; else { DBG_ERROR(0, "Unexpected crypt algorithm \"%s\", " "unable to determine crypt mode", GWEN_Crypt_CryptAlgoId_toString(algo)); GWEN_Crypt_Token_Context_free(ctx); GWEN_Buffer_free(nameBuffer); GWEN_Crypt_Token_Close(ct, 1, 0); GWEN_Crypt_Token_free(ct); return 3; } rv=GWEN_Crypt_Token_Close(ct, 0, 0); GWEN_Crypt_Token_free(ct); if (rv) { DBG_ERROR(0, "Could not close token (%d)", rv); GWEN_Crypt_Token_Context_free(ctx); GWEN_Buffer_free(nameBuffer); return 3; } } if (!lbankId || !*lbankId) { DBG_ERROR(0, "No bank id stored and none given"); GWEN_Crypt_Token_Context_free(ctx); GWEN_Buffer_free(nameBuffer); return 3; } if (!luserId || !*luserId) { DBG_ERROR(0, "No user id (Benutzerkennung) stored and none given"); GWEN_Crypt_Token_Context_free(ctx); GWEN_Buffer_free(nameBuffer); return 3; } user=AB_Banking_FindUser(ab, AH_PROVIDER_NAME, "de", lbankId, luserId, lcustomerId); if (user) { DBG_ERROR(0, "User %s already exists", luserId); GWEN_Crypt_Token_Context_free(ctx); return 3; } user=AB_Banking_CreateUser(ab, AH_PROVIDER_NAME); assert(user); AB_User_SetUserName(user, userName); AB_User_SetCountry(user, "de"); AB_User_SetBankCode(user, lbankId); AB_User_SetUserId(user, luserId); AB_User_SetCustomerId(user, lcustomerId); AH_User_SetTokenType(user, tokenType); AH_User_SetTokenName(user, tokenName); AH_User_SetTokenContextId(user, cid); AH_User_SetCryptMode(user, cm); if (rdhType>0) AH_User_SetRdhType(user, rdhType); GWEN_Buffer_free(nameBuffer); if (hbciVersion==0) { if (cm==AH_CryptMode_Pintan) AH_User_SetHbciVersion(user, 220); else { if (rdhType>1) AH_User_SetHbciVersion(user, 300); else AH_User_SetHbciVersion(user, 210); } } else { AH_User_SetHbciVersion(user, hbciVersion); } /* try to get server address from database if still unknown */ if (!lserverAddr || *lserverAddr==0) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); if (getBankUrl(ab, cm, lbankId, tbuf)) { DBG_INFO(0, "Could not find server address for \"%s\"", lbankId); } if (GWEN_Buffer_GetUsedBytes(tbuf)==0) { DBG_ERROR(0, "No address given and none available in internal db"); GWEN_Crypt_Token_Context_free(ctx); return 3; } url=GWEN_Url_fromString(GWEN_Buffer_GetStart(tbuf)); if (url==NULL) { DBG_ERROR(0, "Bad URL \"%s\" in internal db", GWEN_Buffer_GetStart(tbuf)); GWEN_Crypt_Token_Context_free(ctx); return 3; } GWEN_Buffer_free(tbuf); } else { /* set address */ url=GWEN_Url_fromString(lserverAddr); if (url==NULL) { DBG_ERROR(0, "Bad URL \"%s\"", lserverAddr); GWEN_Crypt_Token_Context_free(ctx); return 3; } } if (cm==AH_CryptMode_Pintan) { GWEN_Url_SetProtocol(url, "https"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 443); } else { GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); } AH_User_SetServerUrl(user, url); GWEN_Url_free(url); if (cm==AH_CryptMode_Ddv) AH_User_SetStatus(user, AH_UserStatusEnabled); AB_Banking_AddUser(ab, user); /* context no longer needed */ GWEN_Crypt_Token_Context_free(ctx); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/getkeys.c0000644000175000017500000001202112364015477023675 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetServerKeys(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error getting server keys (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/addsubaccountflags.c0000644000175000017500000001465012364015477026070 00000000000000/*************************************************************************** begin : Tue Sep 20 2008 copyright : (C) 2008 by Patrick Prasse email : patrick-oss@prasse.info *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int addsubAccountFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv, int is_add ) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a=0; int rv; const char *bankId; const char *accountId; const char *subAccountId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account id (Kontonummer)", /* short description */ "Specify the account id (Kontonummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "flags", /* name */ 1, /* minnum */ 99, /* maxnum */ "f", /* short option */ "flags", /* long option */ "Specify the user flags", /* short description */ "Specify the user flags" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, "*"); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, "*"); al=AB_Banking_FindAccounts(ab, AH_PROVIDER_NAME, "de", bankId, accountId, subAccountId); if (al) { if (AB_Account_List2_GetSize(al)!=1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 3; } else { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); assert(ait); a=AB_Account_List2Iterator_Data(ait); AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); } if (!a) { DBG_ERROR(0, "No matching customer"); return 3; } else { GWEN_DB_NODE *vn; uint32_t flags, bf, c=0; /* parse flags */ flags=AH_Account_Flags_fromDb(db, "flags"); for (bf=flags; bf; bf>>=1) { if (bf&1) c++; } vn=GWEN_DB_FindFirstVar(db, "flags"); if (GWEN_DB_Values_Count(vn)!=c) { fprintf(stderr, "ERROR: Specified flag(s) unknown\n"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* lock account */ rv=AB_Banking_BeginExclUseAccount(ab, a); if (rv<0) { fprintf(stderr, "ERROR: Could not lock account, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify account */ if( is_add ) { fprintf(stderr, "Adding flags: %08x\n", flags); AH_Account_AddFlags(a, flags); } else { fprintf(stderr, "Removing flags: %08x\n", flags); AH_Account_SubFlags(a, flags); } /* unlock account */ rv=AB_Banking_EndExclUseAccount(ab, a, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock account (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/sethbciversion.c0000644000175000017500000001405712364015477025264 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int setHbciVersion(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *hbciVersion; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "hbciVersion", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "hbciversion", /* long option */ "Specify the HBCI version (201, 210, 220, 300)", /* short description */ "Specify the HBCI version (201, 210, 220, 300)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); hbciVersion=GWEN_DB_GetCharValue(db, "hbciVersion", 0, "220"); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { int v; v=atoi(hbciVersion); if (v<200 || v>399) { DBG_ERROR(0, "Invalid HBCI version \"%s\"", hbciVersion); return 1; } /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ AH_User_SetHbciVersion(u, v); /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/setsepaprofile.c0000644000175000017500000002000612364015477025251 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int setSepaProfile(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *tProfile, *dProfile; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "transferProfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "t", /* short option */ "transfers", /* long option */ "Specify the SEPA profile for transfers", /* short description */ "Specify the SEPA profile for transfers (\"\" for default)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "debitNoteProfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "d", /* short option */ "debitnotes", /* long option */ "Specify the SEPA profile for debit notes", /* short description */ "Specify the SEPA profile for debit notes (\"\" for default)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); tProfile=GWEN_DB_GetCharValue(db, "transferProfile", 0, NULL); dProfile=GWEN_DB_GetCharValue(db, "debitNoteProfile", 0, NULL); ul=AB_Banking_FindUsers(ab, AH_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { GWEN_DB_NODE *profile; const char *s; if (!tProfile && !dProfile) { DBG_ERROR(0, "No action specified"); return 1; } if (tProfile && *tProfile) { profile=AB_Banking_GetImExporterProfile(ab, "sepa", tProfile); if (!profile) { DBG_ERROR(0, "Profile \"%s\" not found", tProfile); return 1; } s=GWEN_DB_GetCharValue(profile, "type", 0, ""); if (GWEN_Text_ComparePattern(s, "001.*", 1)==-1) { DBG_ERROR(0, "Profile \"%s\" is of type \"%s\" but should match \"001.*\"", tProfile, s); return 1; } } if (dProfile && *dProfile) { profile=AB_Banking_GetImExporterProfile(ab, "sepa", dProfile); if (!profile) { DBG_ERROR(0, "Profile \"%s\" not found", dProfile); return 1; } s=GWEN_DB_GetCharValue(profile, "type", 0, ""); if (GWEN_Text_ComparePattern(s, "008.*", 1)==-1) { DBG_ERROR(0, "Profile \"%s\" is of type \"%s\" but should match \"008.*\"", dProfile, s); return 1; } } /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ if (tProfile) { if (*tProfile) { fprintf(stderr, "Setting SEPA profile for transfers to \"%s\"\n", tProfile); } else { fprintf(stderr, "Resetting default SEPA profile for transfers\n"); tProfile=NULL; } AH_User_SetSepaTransferProfile(u, tProfile); } if (dProfile) { if (*dProfile) { fprintf(stderr, "Setting SEPA profile for debit notes to \"%s\"\n", dProfile); } else { fprintf(stderr, "Resetting default SEPA profile for debit notes\n"); dProfile=NULL; } AH_User_SetSepaDebitNoteProfile(u, dProfile); } /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/delaccount.c0000644000175000017500000002511612364015477024354 00000000000000/*************************************************************************** begin : Thu Nov 06 2008 copyright : (C) 2008 by Patrick Prasse email : patrick-oss@prasse.info *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include int delAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; int rv; const char *bankId; const char *userId; const char *customerId; const char *account; const char *subAccountId; uint32_t delAll = 0; uint32_t pretend = 0; uint32_t uniqueId = 0; uint32_t userUniqueId = 0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT_LIST2 *matches; AB_ACCOUNT_LIST2_ITERATOR *ait; int match_count = 0; int error_count = 0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "account", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountUniqueId", /* name */ 0, /* minnum */ 1, /* maxnum */ "i", /* short option */ "unique", /* long option */ "Specify the account unique id", /* short description */ "Specify the account unique id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userUniqueId", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "user-unique", /* long option */ "Specify the user unique id", /* short description */ "Specify the user unique id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "all", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "all", /* long option */ "Delete all matching accounts, do not abort if more than one account matches", /* short description */ "Delete all matching accounts, do not abort if more than one account matches" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "pretend", /* name */ 0, /* minnum */ 1, /* maxnum */ "p", /* short option */ "pretend", /* long option */ "Only print matching accounts, don't delete", /* short description */ "Only print matching accounts, don't delete" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqhbci"); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); userId=GWEN_DB_GetCharValue(db, "userId", 0, 0); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, 0); account=GWEN_DB_GetCharValue(db, "account", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); delAll=GWEN_DB_GetIntValue(db, "all", 0, 0); pretend=GWEN_DB_GetIntValue(db, "pretend", 0, 0); uniqueId=GWEN_DB_GetIntValue(db, "accountUniqueId", 0, 0); userUniqueId=GWEN_DB_GetIntValue(db, "userUniqueId", 0, 0); matches = AB_Account_List2_new(); al=AB_Banking_FindAccounts(ab, AH_PROVIDER_NAME, "*", "*", "*", "*"); if (al) { ait=AB_Account_List2_First(al); if (ait) { const char *s; AB_ACCOUNT *a; int i=0; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { int match = 1; if (match && bankId) { s=AB_Account_GetBankCode(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) match=0; } if (match && account) { s=AB_Account_GetAccountNumber(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, account, 0)) match=0; } if (match && subAccountId) { s=AB_Account_GetSubAccountId(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, subAccountId, 0)) match=0; } if (match && uniqueId) { uint32_t id = AB_Account_GetUniqueId(a); if ( uniqueId != id ) match=0; } if (match && (userId || customerId || userUniqueId)) { AB_USER *u; u = AB_Account_GetFirstUser( a ); if( !u ) match = 0; if (match && userUniqueId) { uint32_t id = AB_User_GetUniqueId(u); if ( userUniqueId != id ) match=0; } if (match && userId) { s = AB_User_GetUserId(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, userId, 0)) match=0; } if (match && customerId) { s=AB_User_GetCustomerId(u); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, customerId, 0)) match=0; } } if( match ) { match_count++; fprintf(stdout, "Account %d:\tUniqueId: %d\t\tAccount Number: %s\tBank: %s/%s\n", i++, AB_Account_GetUniqueId(a), AB_Account_GetAccountNumber(a), AB_Account_GetCountry(a), AB_Account_GetBankCode(a) ); AB_Account_List2_PushBack( matches, a ); } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); } if( !match_count ) { fprintf( stderr, "ERROR: No matching accounts\n" ); return 3; } if( match_count > 1 && !delAll ) { fprintf( stderr, "ERROR: %d accounts match. Refusing to delete more than one account. " "Please specify --all to delete all matching accounts.\n", match_count ); return 3; } if( !pretend ) { ait=AB_Account_List2_First(matches); if (ait) { AB_ACCOUNT *a; int i=0; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { rv = AB_Banking_DeleteAccount( ab, a ); if( rv ) { fprintf( stderr, "ERROR: Error deleting account %d (%d).\n", i, rv ); error_count++; } else fprintf( stdout, "Account %d deleted.\n", i ); a=AB_Account_List2Iterator_Next(ait); i++; } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(matches); } /* !pretend */ else { fprintf( stdout, "Nothing deleted.\n" ); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return error_count > 0 ? 3 : 0; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/README0000644000175000017500000000065412364015477022747 00000000000000 This folder contains the tool "aqhbci-tool". It can be used to setup and manage HBCI users/customers/accounts. The documentation for this tool can be found in the "Handbuch fuer AqBanking4" (see http://www2.aquamaniac.de/). One important command is: aqhbci-tool4 logfile -i LOGFILE -d OUTFILE -L 100 This parses messages from the given logfile, anonymizes them (-L is the trust level, default is 0, meaning "no trust"). aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/aqhbci-tool/globals.h0000644000175000017500000000776512364015477023675 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef CBANKING_GLOBALS_H #define CBANKING_GLOBALS_H #ifdef HAVE_I18N # ifdef HAVE_LOCALE_H # include # endif # ifdef HAVE_LIBINTL_H # include # endif # define I18N(msg) dgettext(PACKAGE, msg) #else # define I18N(msg) msg #endif #define I18N_NOOP(msg) msg #include #include #include #include #include #include #include int mkPinList(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int delUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int delAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getSysId(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int createKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int sendKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int listUsers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int listAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int iniLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getItanModes(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int listItanModes(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int setItanMode(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int changePin(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getCert(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int setHbciVersion(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int subUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addsubAccountFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv, int is_add ); int setMaxTransfers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int setSepaProfile(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int setTanMediumId(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getAccSepa(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int logFile(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int test1(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/Makefile.in0000644000175000017500000006000512643540057021723 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqhbci/tools DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = hbcixml aqhbci-tool # aqhbci hbcisadmin all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: built_sources: # 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: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/0000755000175000017500000000000012643540657021371 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/loganalyzer.cpp0000644000175000017500000002626612364015477024355 00000000000000/*************************************************************************** begin : Sat Oct 25 2003 copyright : (C) 2003-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "loganalyzer.h" #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define mkdir(a,b) mkdir(a) #endif using namespace std; LogAnalyzer::LogFile::LogMessage::LogMessage(GWEN_DB_NODE *header, const string &body) :_header(header) ,_message(body) { } LogAnalyzer::LogFile::LogMessage::~LogMessage(){ GWEN_DB_Group_free(_header); } int LogAnalyzer::LogFile::LogMessage::toFile(const string &fname) { int rv; GWEN_SYNCIO *sio; sio=GWEN_SyncIo_File_new(fname.c_str(), GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_APPEND); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } rv=GWEN_DB_WriteToIo(_header, sio, GWEN_DB_FLAGS_WRITE_SUBGROUPS | GWEN_DB_FLAGS_DETAILED_GROUPS | GWEN_DB_FLAGS_USE_COLON| GWEN_DB_FLAGS_OMIT_TYPES); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } /* append empty line to separate header from data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } /* write data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) _message.data(), _message.length()); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } /* append CR for better readability */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } /* close layer */ rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_free(sio); return 0; } LogAnalyzer::LogFile::LogFile(const string &fname) :_fileName(fname){ GWEN_SYNCIO *sio; GWEN_FAST_BUFFER *fb; int rv; uint8_t buffer[1024]; sio=GWEN_SyncIo_File_new(fname.c_str(), GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); throw Error("LogAnalyzer::Logfile::LogFile", ERROR_LEVEL_NORMAL, HBCI_ERROR_CODE_UNKNOWN, ERROR_ADVISE_DONTKNOW, "Error opening file", fname); } /* create fast buffer around io layer */ fb=GWEN_FastBuffer_new(1024, sio); for (;;) { Pointer msg; GWEN_DB_NODE *hd; unsigned int size; string body; // read header hd=GWEN_DB_Group_new("Header"); rv=GWEN_DB_ReadFromFastBuffer(hd, fb, GWEN_DB_FLAGS_HTTP | GWEN_DB_FLAGS_UNTIL_EMPTY_LINE); if (rv<0) { if (rv==GWEN_ERROR_EOF) break; else { DBG_ERROR(0, "here (%d)", rv); GWEN_DB_Group_free(hd); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); throw Error("LogAnalyzer::Logfile::LogFile", ERROR_LEVEL_NORMAL, HBCI_ERROR_CODE_UNKNOWN, ERROR_ADVISE_DONTKNOW, "Error reading header", fname); } } // read body size=GWEN_DB_GetIntValue(hd, "size", 0, 0); while(size) { string tmp; unsigned int lsize; lsize=size; if (lsize>sizeof(buffer)) lsize=sizeof(buffer); GWEN_FASTBUFFER_READFORCED(fb, rv, buffer, lsize); if (rv<0) { DBG_ERROR(0, "here (%d)", rv); GWEN_DB_Group_free(hd); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); throw Error("LogAnalyzer::Logfile::LogFile", ERROR_LEVEL_NORMAL, HBCI_ERROR_CODE_UNKNOWN, ERROR_ADVISE_DONTKNOW, "Error reading body", fname); } body+=string((const char*)buffer, lsize); size-=lsize; } // while #if 0 /* read closing LF */ GWEN_FASTBUFFER_READFORCED(fb, rv, buffer, 1); if (rv<0) { if (rv==GWEN_ERROR_EOF) { DBG_INFO(0, "EOF met"); break; } else { DBG_ERROR(0, "here (%d)", rv); GWEN_DB_Group_free(hd); GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); throw Error("LogAnalyzer::Logfile::LogFile", ERROR_LEVEL_NORMAL, HBCI_ERROR_CODE_UNKNOWN, ERROR_ADVISE_DONTKNOW, "Error reading body", fname); } } else { msg=new LogMessage(hd, body); DBG_INFO(0, "Adding message"); _logMessages.push_back(msg); } #else msg=new LogMessage(hd, body); DBG_INFO(0, "Adding message"); _logMessages.push_back(msg); #endif } GWEN_FastBuffer_free(fb); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); } LogAnalyzer::LogFile::~LogFile(){ } string LogAnalyzer::_getPath() { string dname; char buffer[256]; void *p; char numbuf[16]; dname=_baseDir; dname+="/backends/aqhbci/data/banks/"; snprintf(numbuf, sizeof(numbuf), "%d", _country); dname+=numbuf; dname+="/"; dname+=_bankCode; dname+="/logs/"; DBG_INFO(0, "Searching in \"%s\"", dname.c_str()); if (dname.length()>=sizeof(buffer)) { DBG_ERROR(0, "Path too long"); return ""; } buffer[0]=0; p=buffer; p=GWEN_Path_Handle(dname.c_str(), p, GWEN_PATH_FLAGS_NAMEMUSTEXIST, _handlePathElement); if (p==0) return ""; return (const char*)p; } void *LogAnalyzer::_handlePathElement(const char *entry, void *data, unsigned int flags){ char *p; struct stat st; bool exists; p=(char*)data; if ((strlen(p)+strlen(entry)+2)>=256) { DBG_ERROR(0, "Buffer too small"); return 0; } strcat(p, "/"); strcat(p, entry); // check for existence of the file/folder DBG_DEBUG(0, "Checking entry \"%s\"", p); if (stat(p, &st)) { exists=false; DBG_DEBUG(0, "stat: %s (%s)", strerror(errno), p); if ((flags & GWEN_PATH_FLAGS_PATHMUSTEXIST) || ((flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_NAMEMUSTEXIST))) { DBG_ERROR(0, "Path \"%s\" does not exist (it should)", p); return 0; } } else { DBG_DEBUG(0, "Checking for type"); exists=true; if (flags & GWEN_PATH_FLAGS_VARIABLE) { if (!S_ISREG(st.st_mode)) { DBG_ERROR(0, "%s not a regular file", p); return 0; } } else { if (!S_ISDIR(st.st_mode)) { DBG_ERROR(0, "%s not a direcory", p); return 0; } } if ((flags & GWEN_PATH_FLAGS_PATHMUSTNOTEXIST) || ((flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST))) { DBG_ERROR(0, "Path \"%s\" does not exist (it should)", p); return 0; } } // if stat is ok if (!exists) { DBG_DEBUG(0, "Entry \"%s\" does not exist", p); if (flags & GWEN_PATH_FLAGS_VARIABLE) { // create file int fd; DBG_DEBUG(0, "Creating file \"%s\"", p); fd=open(p, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd==-1) { DBG_ERROR(0, "open: %s (%s)", strerror(errno), p); return 0; } close(fd); DBG_DEBUG(0, "Sucessfully created"); } else { // create dir DBG_DEBUG(0, "Creating folder \"%s\"", p); if (mkdir(p, S_IRWXU)) { DBG_ERROR(0, "mkdir: %s (%s)", strerror(errno), p); return 0; } } } // if exists else { DBG_DEBUG(0, "Entry \"%s\" exists", p); } DBG_DEBUG(0, "Returning this: %s", p); return p; } LogAnalyzer::LogAnalyzer(const string &baseDir, unsigned int country, const string &bank) :_baseDir(baseDir) ,_country(country) ,_bankCode(bank) { GWEN_DIRECTORY *dlogs; string dname; dname=_getPath(); if (!dname.empty()) { dlogs=GWEN_Directory_new(); if (!GWEN_Directory_Open(dlogs, dname.c_str())) { char nbuffer[256]; while(!GWEN_Directory_Read(dlogs, nbuffer, sizeof(nbuffer))) { int i; i=strlen(nbuffer); if (i>4) { if (strcmp(nbuffer+i-4, ".log")==0) { string fname; fname=dname+"/"+nbuffer; DBG_NOTICE(0, "Added file \"%s\"", fname.c_str()); _logFiles.push_back(fname); } } } // while read if (GWEN_Directory_Close(dlogs)) { GWEN_Directory_free(dlogs); throw Error("LogAnalyzer::LogAnalyzer", ERROR_LEVEL_NORMAL, HBCI_ERROR_CODE_UNKNOWN, ERROR_ADVISE_DONTKNOW, "Error closing dir", dname); } } // if open succeeds GWEN_Directory_free(dlogs); } // if !empty } LogAnalyzer::~LogAnalyzer(){ } Pointer LogAnalyzer::getFirstLogFile(){ Pointer lf; _lfit=_logFiles.begin(); if (_lfit!=_logFiles.end()) { lf=new LogFile(*_lfit); _lfit++; } return lf; } Pointer LogAnalyzer::getNextLogFile(){ Pointer lf; if (_lfit!=_logFiles.end()) { lf=new LogFile(*_lfit); _lfit++; } return lf; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/loganalyzer.h0000644000175000017500000000574012364015477024014 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Sat Oct 25 2003 copyright : (C) 2003 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifndef AQMONEY_LOGANALYZER_H #define AQMONEY_LOGANALYZER_H #include "pointer.h" #include #include #include using namespace std; using namespace HBCI; /** * */ class LogAnalyzer { public: class LogFile { public: class LogMessage { public: private: GWEN_DB_NODE *_header; string _message; public: LogMessage(GWEN_DB_NODE *header, const string &body); ~LogMessage(); GWEN_DB_NODE *header() { return _header;}; const string &message() const { return _message;}; int toFile(const string &fname); }; private: list > _logMessages; string _fileName; public: LogFile(const string &file); ~LogFile(); list > logMessages() { return _logMessages;}; const string &fileName() const { return _fileName; }; }; private: string _baseDir; unsigned int _country; string _bankCode; list _logFiles; list::iterator _lfit; string _getPath(); static void *_handlePathElement(const char *entry, void *data, unsigned int flags); public: LogAnalyzer(const string &baseDir, unsigned int country, const string &bank); ~LogAnalyzer(); Pointer getFirstLogFile(); Pointer getNextLogFile(); }; #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/pointer.h0000644000175000017500000005544512364015477023154 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Tue Dec 13 2001 copyright : (C) 2001 by Martin Preuss email : openhbci@aquamaniac.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifndef HBCIPOINTER_H #define HBCIPOINTER_H /** @file pointer.h * * @short Smart pointer HBCI::Pointer with helper classes. No C wrappers.*/ #include #include #ifdef __cplusplus #include /* DEBUG */ #include #include "error.h" /** * Undefine this if you want exceptions instead of assert on error * Using "assert" is much better while debugging, since assert creates * a core dump which you may inspect with gdb. */ #define ASSERT_ON_ERROR namespace HBCI { class PointerBase; /* template class Pointer; */ class PointerObject; template class PointerCastBase; template class PointerCast; } namespace HBCI { #ifndef DOXYGEN_HIDE /** * This internal class is created by Pointer. It holds the real pointer * and an usage counter. You can neither create nor detroy such an object. * @author Martin Preuss */ class PointerObject { friend class PointerBase; private: void *_object; int _counter; bool _delete; string _descr; PointerObject(void *obj, string descr=""): _object(obj),_counter(0) ,_delete(true) ,_descr(descr){ }; ~PointerObject(){ }; void setDescription(string descr) { /* if (_descr.empty()) */ _descr=descr; }; const string &description() const { return _descr; }; public: }; #endif /* DOXYGEN_HIDE */ /** * @short Base class for the smart pointer template class. * * This is the base class to be inherited by a template class. This * cannot be used directly. * * @author Martin Preuss */ class PointerBase { #ifndef DOXYGEN_HIDE private: PointerObject *_ptr; string _descr; protected: void _attach(PointerObject &p) { _ptr=&p; if (_ptr) { _ptr->_counter++; if (_descr.empty()) _descr=_ptr->_descr; } else { #ifdef ASSERT_ON_ERROR assert(_ptr); #endif throw HBCI::Error ("Pointer::_attach(&)", ERROR_LEVEL_NORMAL, 0, ERROR_ADVISE_DONTKNOW, "No object for ."+_descr, objectDescription()); } }; void _attach(PointerObject *p) { _ptr=p; if (_ptr) { _ptr->_counter++; if (_descr.empty()) _descr=_ptr->_descr; } else { #ifdef ASSERT_ON_ERROR assert(_ptr); #endif throw HBCI::Error ("Pointer::_attach(pt*)", ERROR_LEVEL_NORMAL, 0, ERROR_ADVISE_DONTKNOW, "No object for "+_descr); } }; void _detach() { if (_ptr) { if (_ptr->_counter>0) { _ptr->_counter--; if (_ptr->_counter<1) { if (_ptr->_delete) if (_ptr->_object) _deleteObject(_ptr->_object); delete _ptr; } } } _ptr=0; }; /** * This frees the object pointed to by this pointer, regardless of * the state of the autoDelete flag. You should use this instead of * setting the autodelete flag and deleting the object yourself, because * in that case the program might simply crash, if any other pointer tries * to use the object. By using this method here you would get an exception * which could tell you more about the cause of the crash. */ void _release() { if (_ptr) { if (_ptr->_delete) { if (_ptr->_object) _deleteObject(_ptr->_object); } _ptr->_object=0; } }; /** * This method actually deletes the object. Since the base class * does not know the type of this object, we have to make this method * virtual. The template class MUST override this. */ virtual void _deleteObject(void *p) { }; PointerBase(PointerBase &p): _ptr(0) { _descr=p._descr; if (p._ptr) _attach(p._ptr); }; PointerBase(const PointerBase &p) : _ptr(0) { _descr=p._descr; if (p._ptr) _attach(p._ptr); }; /** * This operator handles the case where you give another pointer as argument. * (like pointer1=pointer2). * @author Martin Preuss */ void operator=(PointerBase &p) { _detach(); if (_descr.empty()) _descr=p._descr; if (p._ptr) _attach(p._ptr); }; void operator=(const PointerBase &p) { _detach(); if (_descr.empty()) _descr=p._descr; if (p._ptr) _attach(p._ptr); }; /** * This operator handles the case where you do something like this:
* pointer=new structXYZ;
* @author Martin Preuss */ void operator=(void* obj) { PointerObject *p; if (_ptr) _detach(); _ptr=0; if (obj==0) return; p=new PointerObject(obj,_descr); _attach(p); }; /** * Constructor. */ PointerBase(): _ptr(0) {}; PointerBase(void *obj): _ptr(0) { PointerObject *p; p=new PointerObject(obj,_descr); _attach(p); }; #endif /* DOXYGEN_HIDE */ public: /** * Destructor. * If this one gets called, it automagically decrements the usage * counter of the object pointed to. If it reaches zero, then no other * pointer points to the object and the object faces deletion. * @author Martin Preuss */ virtual ~PointerBase() { }; /** * Set the description of this pointer. * * Useful for debugging purposes. * @author Martin Preuss */ void setDescription(string descr) { _descr=descr; }; /** * Get the description of this pointer. * * Useful for debugging purposes. * @author Martin Preuss */ const string &description() const { return _descr; }; /** * Set the description of the object this pointer points to. * * Useful for debugging purposes. * @author Martin Preuss */ void setObjectDescription(string descr) { if (!descr.empty()) if (_ptr) _ptr->setDescription(descr); }; /** * Returns the description of the object. * * Useful for debugging purposes. * @author Martin Preuss */ string objectDescription() const { if (_ptr) return _ptr->description(); else return ""; }; virtual int refCount() const { if (_ptr) return _ptr->_counter; else return -1; }; /** * Equality operator for the object pointed to. * * This operator checks whether another pointer and this one are * pointing to the same data. * * @author Martin Preuss */ bool operator==(const PointerBase &p) const { if (_ptr && p._ptr) return _ptr->_object==p._ptr->_object; else return false; }; /** * Checks whether both pointers share their data object. * * @author Martin Preuss */ bool sharingData(const PointerBase &p) const { return (_ptr==p._ptr); }; /** * Inequality operator for the object pointed to. * * This operator checks whether another pointer and this one are * not pointing to the same data. * * @author Martin Preuss */ bool operator!=(const PointerBase &p) const { if (_ptr && p._ptr) return _ptr->_object!=p._ptr->_object; else return true; }; /** * Returns a raw pointer to the stored data. * * You should not really use this, but if you do so please NEVER * delete the object the pointer points to ! AND you should make * sure that as long as you are using the pointer returned there * is still a Pointer pointing to it (because if the last Pointer * stops pointing to an object that object gets deleted) !! * * @author Martin Preuss */ virtual void* voidptr() const { if (!_ptr) return 0; if (!(_ptr->_object)) return 0; return _ptr->_object; }; /** * Set the auto-deletion behaviour. * * Set the auto-deletion behaviour of the PointerObject (the * wrapper object around the "real" object pointed to) that is * pointed to by this Pointer. * * By default, this is set to setAutoDeletion(true), i.e. the * object will automatically be deleted when its last * HBCI::Pointer gets deleted. On the other hand, when you call * this with b=false, then the object this pointer points to will * not be deleted by the last HBCI::Pointer. * * This might be useful if you are pointing to constant objects, * or if you need to continue using this object through raw * pointers elsewhere. * * This flag is a property of the PointerObject, i.e. even for * multiple HBCI::Pointer's pointing to the same object there is * only *one* autoDelete flag per object. Changes to this flag * affect all of the HBCI::Pointer's at the same time. * * This HBCI::Pointer MUST already point to an object (a NULL * pointer is not allowed at this point) since the autodelete flag * is a property of the class PointerObject. If called on an * invalid HBCI::Pointer, this method will throw an HBCI::Error. * * @param b True to set automatic deletion to be enabled, * false to disable it. * @author Martin Preuss */ void setAutoDelete(bool b) { if (_ptr) { if (_ptr->_object) _ptr->_delete=b; } else { #ifdef ASSERT_ON_ERROR assert(_ptr); #endif throw HBCI::Error ("PointerBase::setAutoDelete()", ERROR_LEVEL_NORMAL, 0, ERROR_ADVISE_DONTKNOW, "No object in pointer", description()); } }; /** * Returns true if this Pointer is valid. * * This tells you if this pointer is pointing to accessible data. * @author Martin Preuss * @return true if data is accessible, false if no data */ bool isValid() const { if (_ptr) if (_ptr->_object) return true; return false; }; }; /** * @short A smart pointer template class. * * This class serves as a smart pointer class that is used in OpenHBCI * to avoid memory leaks. It does automatic reference counting for the * objects pointed to, like so: Each time a new Pointer to the same * object is created, the reference counter is incremented. Each time * a Pointer to an object is deleted, the reference counter is * decremented. When the reference counter reaches zero, the object is * deleted. * * Use it instead of normal pointers, for example: * instead of * * structXYZ *pointer;
* pointer = new structXYZ;
* * use this one: * * Pointer pointer;
* pointer = new structXYZ;
* * You can access the data easily by using the "*" operator, e.g: * * structXYZ xyz = *pointer; * * To access members of the object, either use the "*" operator or the * ref() method: * * a = (*pointer).a; or
* b = pointer.ref().a; * * @author Martin Preuss */ template class Pointer: public PointerBase { friend class PointerCastBase; private: protected: /** * This method actually deletes the object. Since the base class * does not know the type of this object, we have to make this method * virtual. The template class MUST override this. */ virtual void _deleteObject(void *p) { delete (T*) p; }; Pointer(const PointerBase &p): PointerBase(p) { }; public: /** * Empty Constructor. */ Pointer(): PointerBase(){}; /** * Constructor with object to be pointing to. */ Pointer(T *obj): PointerBase(obj) { }; /** Copy constructor */ Pointer(const Pointer &p) : PointerBase(p) { }; /** * Destructor. * * If this one gets called, it automagically decrements the usage * counter of the object pointed to. If it reaches zero, then no other * pointer points to the object and the object will be deleted. * @author Martin Preuss */ virtual ~Pointer() { _detach(); }; /** @name Copy Operators */ /*@{*/ /** * Copy operator with object pointed to. * * This operator handles the case where you do something like this:
* pointer=new structXYZ;
* @author Martin Preuss */ void operator=(T* obj) { PointerBase::operator=(obj); }; /** * Copy operator with another Pointer. * * This operator handles the case where you give another pointer * as argument. (like pointer1=pointer2). * * @author Martin Preuss */ void operator=(Pointer &p) { PointerBase::operator=(p); }; /** * Copy operator with another const Pointer. * * This operator handles the case where you give another pointer * as argument. (like pointer1=pointer2). * * @author Martin Preuss */ void operator=(const Pointer &p) { PointerBase::operator=(p); }; /*@}*/ /** @name Object Access */ /*@{*/ /** * Returns a reference to the object pointed to. * * If the Pointer is invalid, this throws a HBCI::Error. */ T& ref() const { T* p; p=ptr(); assert(p); if (!p) { #ifdef ASSERT_ON_ERROR assert(p); #endif throw HBCI::Error ("Pointer::ref()", ERROR_LEVEL_NORMAL, 0, ERROR_ADVISE_DONTKNOW, "No object in pointer", description()); } return *p; }; /** * Returns a reference to the object pointed to. * * If the Pointer is invalid, this throws a HBCI::Error. */ T& operator*() const { return ref(); }; /** Returns a raw pointer to the stored data. * * If you can continue using only Pointer's, you should not * really need to use this. This method is necessary if and only * if you need to use a "raw C pointer" of the object pointed to. * * So if you need to use this method while there is still a * Pointer pointing to it, please never delete the object * returned. The last remaining Pointer's will take care of * deletion. * * On the other hand, if you need to use this pointer longer than * the last Pointer would exist, then either try to keep a Pointer * around long enough, or you need to consider setting * PointerBase::setAutoDelete appropriately. (Because if the last * Pointer stops pointing to an object, then that object will get * deleted unless PointerBase::setAutoDelete was changed.) * * @author Martin Preuss */ virtual T* ptr() const { return (T*)PointerBase::voidptr(); }; virtual int refCount() const { return PointerBase::refCount(); } /** * This frees the object pointed to by this pointer, regardless of * the state of the autoDelete flag. You should use this instead of * setting the autodelete flag and deleting the object yourself, because * in that case the program might simply crash, if any other pointer tries * to use the object. By using this method here you would get an exception * which could tell you more about the cause of the crash. */ void release() { PointerBase::_release(); }; /*@}*/ /** @name Type cast */ /*@{*/ /** * @short Returns a type-safe casted Pointer of the given type. * * This method returns a type-safe casted Pointer of the given * type. This obeys the same rules as a * dynamic_cast, and in fact internally * a dynamic_cast is used. * * Use it like this: *
     * class type_X;
     * class type_Y : public type_X;
     *
     * Pointer pX;
     * Pointer pY = new type_Y;
     * pX = pY.cast();
     * 
* * The casting fails if it is impossibe to safely cast the * "type_Y" to "type_X". In that case, an HBCI::Error is * thrown. Also, if you call this method on an invalid * Pointer, a HBCI::Error is thrown. * * @author Martin Preuss */ template Pointer cast() const { return PointerCast::cast(*this); /* return Pointer(*this); */ }; /*@}*/ /** @name Equality */ /*@{*/ /** * Equality operator for the object pointed to. * * This operator checks whether another pointer and this one are * pointing to the same data. * * @author Martin Preuss */ bool operator==(const Pointer &p) const { return PointerBase::operator==(p); }; /** * Inequality operator for the object pointed to. * * This operator checks whether another pointer and this one are * not pointing to the same data. * * @author Martin Preuss */ bool operator!=(const Pointer &p) const { return PointerBase::operator!=(p); }; /** * Checks whether both pointers share their data object. * * This method checks whether another pointer and this one share * the same internal data object and thus also the same data * pointed to. This is a stronger condition than * operator==. This method returns true only if one * Pointer has been copied to other Pointer's. But as soon as some * "raw C pointers" have been assigned to different Pointer, this * method would return false. In that latter case, the * operator== would still return true, so that is why * the operator== is more likely to be useful. * * @author Martin Preuss */ bool sharingData(const Pointer &p) const { return PointerBase::sharingData(p); }; /*@}*/ }; #ifndef DOXYGEN_HIDE /** * */ template class PointerCastBase { protected: PointerCastBase(); ~PointerCastBase(); static Pointer makePointer(const PointerBase &p) { return Pointer(p); }; }; /** * This class lets you safely cast one Pointer to another one. * It will automatically perform type checking. If this class is unable to * cast then it throws an HBCI::Error. * You can use this if you have a Pointer for an object but * you need a pointer for a base object. For example: *
 * class BaseClass {
 *   BaseClass();
 *   ~BaseClass();
 * };
 *
 * class InheritingClass: public BaseClass {
 *   InheritingClass();
 *   ~InheritingClass();
 * };
 *
 * Pointer pInheriting;
 * Pointer pBase;
 *
 * pInheriting=new InheritingClass();
 * pBase==PointerCast::cast(pInheriting);
 * 
* @author Martin Preuss */ template class PointerCast :public PointerCastBase { public: /** * If the first template parameter is the base class to the second * template parameter then this method will cast a pointer to an * inheriting class into a pointer to the base class (downcast). * If you want just the opposite then you only need to exchange the order * of the template parameters (upcast). * @author Martin Preuss */ static Pointer cast(const Pointer &u) { U *uo; T *t; Pointer np; /* check if given pointer is valid */ if (!u.isValid()) { DBG_WARN(0, "Casting an invalid pointer (%s)", u.description().c_str()); return 0; } /* then try to cast the pointer */ uo=u.ptr(); t=dynamic_cast(uo); /* could we cast it ? */ assert(t!=0); if (t==0) { /* no, throw */ #ifdef ASSERT_ON_ERROR assert(t); #endif throw HBCI::Error ("PointerCast::cast", ERROR_LEVEL_NORMAL, 0, ERROR_ADVISE_DONTKNOW, "Bad cast", u.description()); } /* otherwise create a new pointer */ np=makePointer(u); np.setDescription("Casted from "+u.description()); return np; }; }; #endif /* DOXYGEN_HIDE */ } /* namespace HBCI */ #endif /* __cplusplus */ #endif /* HBCIPOINTER_H */ aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/hbcixml.cpp0000644000175000017500000010264312364015477023446 00000000000000/*************************************************************************** begin : Thu Jul 03 2003 copyright : (C) 2003-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include // #include #include #include "loganalyzer.h" #include #include #include #include #ifdef HAVE_STRINGS_H # include #endif #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if OS_WIN32 # include //# define strcasecmp _stricmp #endif #include #include using namespace std; #define MYNAME "hbcixml2" #define PRG_VERSION_INFO \ MYNAME " v1.99 (part of AqHBCI v"AQHBCI_VERSION_STRING")\n"\ "(c) 2005 Martin Preuss\n" \ "This program is free software licensed under GPL.\n"\ "See COPYING for details.\n" void usage(const char *prg) { fprintf(stderr, MYNAME " - A tool to work on data in a HBCI XML file.\n" "(c) 2003 Martin Preuss\n" "This library is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU Lesser General Public\n" "License as published by the Free Software Foundation; either\n" "version 2.1 of the License, or (at your option) any later version.\n" "\n" "Usage:\n" "%s COMMAND [OPTIONS]\n" " COMMAND may be one of these:\n" " show : shows the variables used by a given Job\n" " (the job name must be given by \"-j\")\n" " list : lists all available jobs\n" " analyze: analyze a log file. You can use this to anonymize\n" " the log file before sendign it as a bug report\n" "\n" " General Options:\n" " -f FILE - the HBCI description file to load (xml-file)\n" " repeat this option for each file to load\n" " If this option is omitted the default XML files\n" " are loaded\n" " -t TYPE - the type of node inside the XML file\n" " use \"job\" to inspect jobs,\n" " \"seg\" to inspect segments\n" " -hv VER - HBCI version to use (defaults to 210)\n" " This effects which XML files will be loaded\n" " upons startup (only if no -f option is given)\n" " -m MODE - security mode to use with \"show\":\n" " DDV (chipcard mode with DDV cards)\n" " RDH (keyfile mode) \n" "\n" " Special Options for \"show\":\n" " -j JOB - name of the job/segment you are interested in\n" " -p - shows even those variables which are automatically\n" " preset by the message engine.\n" " -P - shows even those variables which are marked as\n" " being hidden\n" " -mv VER - message/job/segment version to show \n" " (0 uses the first available)\n" "\n" " Special Options for \"analyze\":\n" " --trustlevel L - the higher this level the more you trust the\n" " recipient of the output logfile.\n" " --analyze F - name of the file to analyze\n" " -ol F - name of anonymized output logfile\n" " -od F - name of anonymized parsed logfile\n" " -os F - name of SWIFT MT940/942 file to export\n" "\n" " --logfile FILE - use given FILE as log file\n" " --logtype TYPE - use given TYPE as log type\n" " These are the valid types:\n" " stderr (log to standard error channel)\n" " file (log to the file given by --logfile)\n" #ifdef HAVE_SYSLOG_H " syslog (log via syslog)\n" #endif " Default is stderr\n" " --loglevel LEVEL - set the loglevel\n" " Valid levels are:\n" " emergency, alert, critical, error,\n" " warning, notice, info and debug\n" " Default is \"warning\".\n" "\n" "The simplest usage of this program is:\n" " " MYNAME " show -j JobDialogInit\n" "This shows the properties used by the job \"JobInit\". Other example:\n" " " MYNAME " show -t seg -j Balance\n" "shows the response segment of a JobGetBalance.\n", prg); } struct s_args { list xmlfiles; // -f string mode; // -m string group; // -j string typ; // -t bool showPresets; // -p bool showHidden; // -P int version; // -mv int hversion; // -hv string analyzeFile; // --analyze string outFile; // -ol string parseFile; // -od string swiftFile; // -os int trustLevel; // --trustlevel string logFile; // --logfile GWEN_LOGGER_LOGTYPE logType; // --logtype GWEN_LOGGER_LEVEL logLevel; // --loglevel list params; }; int checkArgs(s_args &args, int argc, char **argv) { int i; string tmp; i=2; args.showPresets=false; args.showHidden=false; args.mode="DDV"; args.typ="job"; args.version=0; args.hversion=210; args.logFile=MYNAME ".log"; args.logType=GWEN_LoggerType_Console; args.logLevel=GWEN_LoggerLevel_Warning; args.trustLevel=0; if (argc<2) { usage(argv[0]); return 1; } args.params.push_back(argv[1]); while (i=argc) return 1; args.xmlfiles.push_back(argv[i]); } else if (tmp=="-j") { i++; if (i>=argc) return 1; args.group=argv[i]; } else if (tmp=="-t") { i++; if (i>=argc) return 1; args.typ=argv[i]; } else if (tmp=="-m") { i++; if (i>=argc) return 1; args.mode=argv[i]; } else if (tmp=="-p") { args.showPresets=true; } else if (tmp=="-P") { args.showHidden=true; } else if (tmp=="-mv") { i++; if (i>=argc) return 1; args.version=atoi(argv[i]); } else if (tmp=="-hv") { i++; if (i>=argc) return 1; args.hversion=atoi(argv[i]); } else if (tmp=="--analyze") { i++; if (i>=argc) return 1; args.analyzeFile=argv[i]; } else if (tmp=="-ol") { i++; if (i>=argc) return 1; args.outFile=argv[i]; } else if (tmp=="-od") { i++; if (i>=argc) return 1; args.parseFile=argv[i]; } else if (tmp=="-os") { i++; if (i>=argc) return 1; args.swiftFile=argv[i]; } else if (tmp=="--trustlevel") { i++; if (i>=argc) return 1; args.trustLevel=atoi(argv[i]); } else if (tmp=="--logtype") { i++; if (i>=argc) return -1; if (strcmp(argv[i],"stderr")==0) args.logType=GWEN_LoggerType_Console; else if (strcmp(argv[i],"file")==0) args.logType=GWEN_LoggerType_File; #ifdef HAVE_SYSLOG_H else if (strcmp(argv[i],"syslog")==0) args.logType=GWEN_LoggerType_Syslog; #endif else { fprintf(stderr,"Unknown log type \"%s\"\n", argv[i]); return -1; } } else if (tmp=="--loglevel") { i++; if (i>=argc) return -1; if (strcmp(argv[i], "emergency")==0) args.logLevel=GWEN_LoggerLevel_Emergency; else if (strcmp(argv[i], "alert")==0) args.logLevel=GWEN_LoggerLevel_Alert; else if (strcmp(argv[i], "critical")==0) args.logLevel=GWEN_LoggerLevel_Critical; else if (strcmp(argv[i], "error")==0) args.logLevel=GWEN_LoggerLevel_Error; else if (strcmp(argv[i], "warning")==0) args.logLevel=GWEN_LoggerLevel_Warning; else if (strcmp(argv[i], "notice")==0) args.logLevel=GWEN_LoggerLevel_Notice; else if (strcmp(argv[i], "info")==0) args.logLevel=GWEN_LoggerLevel_Info; else if (strcmp(argv[i], "debug")==0) args.logLevel=GWEN_LoggerLevel_Debug; else { fprintf(stderr, "Unknown log level \"%s\"\n", argv[i]); return -1; } } else if (tmp=="-h" || tmp=="--help") { usage(argv[0]); return -1; } else if (tmp=="-V" || tmp=="--version") { fprintf(stdout, PRG_VERSION_INFO); return -1; } else { fprintf(stderr,"unknown argument: %s\n",tmp.c_str()); return -1; } i++; } // while // that's it if (args.params.empty()) { usage(argv[0]); return 1; } return 0; } int dumpNode(GWEN_XMLNODE *n, const s_args &args, unsigned int flags, unsigned int ind, int groupsOnly) { if (GWEN_XMLNode_GetType(n)==GWEN_XMLNodeTypeTag) { const char *name; unsigned int i; name=GWEN_XMLNode_GetData(n); if (strcasecmp(name, "ELEM")==0) { if (!groupsOnly) { // found an element const char *path; path=GWEN_XMLNode_GetProperty(n, "GWEN_path", ""); if (*path) { unsigned int minnum; unsigned int maxnum; unsigned int minsize; unsigned int maxsize; bool hide; const char *type, *bintype, *binsubtype; minnum=atoi(GWEN_XMLNode_GetProperty(n, "minnum", "1")); maxnum=atoi(GWEN_XMLNode_GetProperty(n, "maxnum", "1")); minsize=atoi(GWEN_XMLNode_GetProperty(n, "minsize", "1")); maxsize=atoi(GWEN_XMLNode_GetProperty(n, "maxsize", "0")); hide=atoi(GWEN_XMLNode_GetProperty(n, "hide", "0")); type=GWEN_XMLNode_GetProperty(n, "type", "1"); bintype=GWEN_XMLNode_GetProperty(n, "bintype", 0); binsubtype=GWEN_XMLNode_GetProperty(n, "binsubtype", 0); if (!hide || args.showHidden) { // indent for (i=0; i::const_iterator it; GWEN_XMLNODE *listNode; GWEN_XMLNODE *n; int version; flags=0; flags|=GWEN_MSGENGINE_SHOW_FLAGS_NOSET; if (args.showPresets) flags&=~GWEN_MSGENGINE_SHOW_FLAGS_NOSET; e=AH_MsgEngine_new(); GWEN_MsgEngine_SetMode(e, args.mode.c_str()); /* read defs */ for (it=args.xmlfiles.begin(); it!=args.xmlfiles.end(); it++) { defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"defs"); DBG_DEBUG(0, "Reading file %s", (*it).c_str()); if (GWEN_XML_ReadFile(defs, (*it).c_str(), GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr,"Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } // for if (args.logLevel>=GWEN_LoggerLevel_Debug) GWEN_XMLNode_Dump(GWEN_MsgEngine_GetDefinitions(e), 1); listNode=GWEN_MsgEngine_ListMessage(e, args.typ.c_str(), args.group.c_str(), args.version, flags); if (!listNode) { fprintf(stderr, "Error listing message.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_free(e); DBG_INFO(0, "Listnode:"); if (args.logLevel>=GWEN_LoggerLevel_Info) GWEN_XMLNode_Dump(listNode, 1); version=atoi(GWEN_XMLNode_GetProperty(listNode, "version", "-1")); if (version==-1) version=args.version; printf("Description of %s \"%s\" (version %d)\n", args.typ.c_str(), args.group.c_str(), version); printf("------------------------------------------------------------\n"); if (strcasecmp(args.typ.c_str(),"job")==0) { const char *response; const char *bpdjob; response=GWEN_XMLNode_GetProperty(listNode, "response", 0); bpdjob=GWEN_XMLNode_GetProperty(listNode, "params", 0); if (response) printf("Job response segment : \"%s\"\n", response); if (bpdjob) printf("Job parameter segment : \"%s\"\n", bpdjob); } printf("Variables:\n"); n=GWEN_XMLNode_GetChild(listNode); while(n) { dumpNode(n, args, flags, 2, 0); n=GWEN_XMLNode_Next(n); } // while n=GWEN_XMLNode_GetChild(listNode); while(n) { dumpNode(n, args, flags, 2, 1); n=GWEN_XMLNode_Next(n); } // while GWEN_XMLNode_free(listNode); return 0; } int listAll(const s_args &args) { GWEN_XMLNODE *defs; GWEN_MSGENGINE *e; list::const_iterator it; GWEN_XMLNODE *n; GWEN_XMLNODE *cn; char tgbuffer[128]; char tdbuffer[128]; e=AH_MsgEngine_new(); GWEN_MsgEngine_SetMode(e, args.mode.c_str()); /* read defs */ for (it=args.xmlfiles.begin(); it!=args.xmlfiles.end(); it++) { defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"defs"); if (GWEN_XML_ReadFile(defs, (*it).c_str(), GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr,"Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } // for if (args.logLevel>=GWEN_LoggerLevel_Info) GWEN_XMLNode_Dump(GWEN_MsgEngine_GetDefinitions(e), 1); n=GWEN_MsgEngine_GetDefinitions(e); if (!n) { fprintf(stderr, "No definitions found.\n"); GWEN_MsgEngine_free(e); return 3; } if (args.typ.length()+1>=sizeof(tgbuffer) || args.typ.length()+3>=sizeof(tdbuffer)) { fprintf(stderr, "Typename too long !\n"); return 1; } sprintf(tgbuffer, "%ss", args.typ.c_str()); sprintf(tdbuffer, "%sdef", args.typ.c_str()); n=GWEN_XMLNode_GetChild(n); while(n) { const char *name; if (GWEN_XMLNode_GetType(n)==GWEN_XMLNodeTypeTag) { name=GWEN_XMLNode_GetData(n); if (strcasecmp(name, tgbuffer)==0) { // we have a matching group of definitions cn=GWEN_XMLNode_GetChild(n); while(cn) { const char *cname; if (GWEN_XMLNode_GetType(cn)==GWEN_XMLNodeTypeTag) { cname=GWEN_XMLNode_GetData(cn); if (strcasecmp(cname, tdbuffer)==0) { // we have a matching definition const char *cid; const char *bywhat; int version; int crypt; int sign; const char *mode; int internal; version=atoi(GWEN_XMLNode_GetProperty(cn, "version", "0")); crypt=atoi(GWEN_XMLNode_GetProperty(cn, "crypt", "1")); sign=atoi(GWEN_XMLNode_GetProperty(cn, "sign", "1")); mode=GWEN_XMLNode_GetProperty(cn, "mode", 0); internal=atoi(GWEN_XMLNode_GetProperty(cn, "internal", "0")); bywhat="id"; cid=GWEN_XMLNode_GetProperty(cn, bywhat, 0); if (!cid) { bywhat="name"; cid=GWEN_XMLNode_GetProperty(cn, bywhat, 0); } if (!cid) { bywhat="code"; cid=GWEN_XMLNode_GetProperty(cn, bywhat, 0); } printf("\"%s\"", cid); if (version) printf(", version %d", version); if (strcasecmp(bywhat, "id")!=0) printf(", selected by %s", bywhat); if (!sign) printf(", nosign"); if (!crypt) printf(", nocrypt"); if (mode) printf(", %s mode", mode); if (internal) printf(", internal"); printf("\n"); } } cn=GWEN_XMLNode_Next(cn); } } } n=GWEN_XMLNode_Next(n); } GWEN_MsgEngine_free(e); return 0; } int checkAll(const s_args &args) { GWEN_XMLNODE *defs; GWEN_MSGENGINE *e; list::const_iterator it; GWEN_XMLNODE *n; GWEN_XMLNODE *cn; char tgbuffer[128]; char tdbuffer[128]; int errors=0; e=AH_MsgEngine_new(); GWEN_MsgEngine_SetMode(e, args.mode.c_str()); /* read defs */ for (it=args.xmlfiles.begin(); it!=args.xmlfiles.end(); it++) { defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"defs"); if (GWEN_XML_ReadFile(defs, (*it).c_str(), GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr,"Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } // for if (args.logLevel>=GWEN_LoggerLevel_Info) GWEN_XMLNode_Dump(GWEN_MsgEngine_GetDefinitions(e), 1); n=GWEN_MsgEngine_GetDefinitions(e); if (!n) { fprintf(stderr, "No definitions found.\n"); GWEN_MsgEngine_free(e); return 3; } if (args.typ.length()+1>=sizeof(tgbuffer) || args.typ.length()+3>=sizeof(tdbuffer)) { fprintf(stderr, "Typename too long !\n"); return 1; } sprintf(tgbuffer, "%ss", args.typ.c_str()); sprintf(tdbuffer, "%sdef", args.typ.c_str()); n=GWEN_XMLNode_GetChild(n); while(n) { const char *name; if (GWEN_XMLNode_GetType(n)==GWEN_XMLNodeTypeTag) { name=GWEN_XMLNode_GetData(n); if (strcasecmp(name, tgbuffer)==0) { // we have a matching group of definitions cn=GWEN_XMLNode_GetChild(n); while(cn) { const char *cname; if (GWEN_XMLNode_GetType(cn)==GWEN_XMLNodeTypeTag) { cname=GWEN_XMLNode_GetData(cn); if (strcasecmp(cname, tdbuffer)==0) { // we have a matching definition bool isError=false; bool isInternal=false; isInternal=(atoi(GWEN_XMLNode_GetProperty(cn, "internal", "0"))!=0); if (GWEN_XMLNode_FindFirstTag(cn, "MESSAGE", 0, 0)) { /* multi-message job, check further */ } else { /* single-message job, check further */ if (GWEN_XMLNode_GetProperty(cn, "code", 0)==0 && !isInternal) { fprintf(stderr, "This element has no \"code\" attribute\n"); isError=true; } } if (isError) { GWEN_XMLNode_Dump(cn, 2); errors++; } } } cn=GWEN_XMLNode_Next(cn); } } } n=GWEN_XMLNode_Next(n); } GWEN_MsgEngine_free(e); if (errors) { fprintf(stderr, "Found %d error(s)\n", errors); return 2; } fprintf(stderr, "No errors found\n"); return 0; } void _logMessage(const string &fname, const string &msg, GWEN_DB_NODE *hd) { int rv; GWEN_SYNCIO *sio; sio=GWEN_SyncIo_File_new(fname.c_str(), GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_APPEND); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return; } rv=GWEN_DB_WriteToIo(hd, sio, GWEN_DB_FLAGS_WRITE_SUBGROUPS | GWEN_DB_FLAGS_DETAILED_GROUPS | GWEN_DB_FLAGS_USE_COLON| GWEN_DB_FLAGS_OMIT_TYPES); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return; } /* append empty line to separate header from data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return; } /* write data */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) msg.data(), msg.length()); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return; } /* append CR for better readability */ rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t*) "\n", 1); if (rv<0) { DBG_INFO(0, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return; } /* close layer */ rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return; } GWEN_SyncIo_free(sio); } int analyzeLog(const s_args &args) { GWEN_XMLNODE *defs; GWEN_MSGENGINE *e; list::const_iterator it; Pointer logfile; list > lmsgs; list >::iterator lmit; GWEN_MSGENGINE_TRUSTEDDATA *trustedData; GWEN_MSGENGINE_TRUSTEDDATA *ntd; GWEN_DB_NODE *allgr; e=AH_MsgEngine_new(); GWEN_MsgEngine_SetMode(e, args.mode.c_str()); /* read defs */ for (it=args.xmlfiles.begin(); it!=args.xmlfiles.end(); it++) { defs=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag,"defs"); DBG_DEBUG(0, "Reading file %s", (*it).c_str()); if (GWEN_XML_ReadFile(defs, (*it).c_str(), GWEN_XML_FLAGS_DEFAULT)){ fprintf(stderr,"Error parsing.\n"); GWEN_MsgEngine_free(e); return 2; } GWEN_MsgEngine_AddDefinitions(e, defs); GWEN_XMLNode_free(defs); } // for try { logfile=new LogAnalyzer::LogFile(args.analyzeFile); } catch (Error xerr) { fprintf(stderr, "Error: %s\n", xerr.errorString().c_str()); GWEN_MsgEngine_free(e); return 2; } allgr=GWEN_DB_Group_new("messages"); lmsgs=logfile.ref().logMessages(); for (lmit=lmsgs.begin(); lmit!=lmsgs.end(); lmit++) { GWEN_DB_NODE *gr; GWEN_DB_NODE *hd; GWEN_DB_NODE *repl; GWEN_BUFFER *mbuf; int rv; string lstr; string mode; gr=GWEN_DB_Group_new("message"); lstr=(*lmit).ref().message(); hd=(*lmit).ref().header(); mode=GWEN_DB_GetCharValue(hd, "mode",0, args.mode.c_str()); GWEN_MsgEngine_SetMode(e, mode.c_str()); mbuf=GWEN_Buffer_new((char*)((*lmit).ref().message().data()), (*lmit).ref().message().length(), (*lmit).ref().message().length(), 0); DBG_INFO(0, "Reading message"); rv=GWEN_MsgEngine_ReadMessage(e, "SEG", mbuf, gr, GWEN_MSGENGINE_READ_FLAGS_TRUSTINFO); if (rv) { fprintf(stderr, "ERROR.\n"); return 2; } GWEN_Buffer_free(mbuf); // work on trust data trustedData=GWEN_MsgEngine_TakeTrustInfo(e); if (trustedData) { if (GWEN_MsgEngine_TrustedData_CreateReplacements(trustedData)) { fprintf(stderr, "Could not anonymize log (createReplacements)\n"); GWEN_MsgEngine_TrustedData_free(trustedData); GWEN_MsgEngine_free(e); return 0; } } if (!args.swiftFile.empty()) { int bnum=0; int nnum=0; if ((strcasecmp(GWEN_DB_GetCharValue(gr, "logHeader/sender", 0, "bank"), "bank")==0) && (strcasecmp(GWEN_DB_GetCharValue(gr, "logHeader/crypt", 0, "no"), "no")==0) ) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(gr, "transactions"); while(dbT) { const void *p; unsigned int len; p=GWEN_DB_GetBinValue(dbT, "booked", 0, 0, 0, &len); if (p && len) { GWEN_BUFFER *fbuf; FILE *f; fbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(fbuf, args.swiftFile.c_str()); GWEN_Buffer_AppendString(fbuf, ".booked"); if (bnum!=0) { char numbuf[32]; snprintf(numbuf, sizeof(numbuf), "%d", bnum); GWEN_Buffer_AppendString(fbuf, "."); GWEN_Buffer_AppendString(fbuf, numbuf); } f=fopen(GWEN_Buffer_GetStart(fbuf), "w+"); if (!f) { DBG_ERROR(0, "fopen(%s): %s", GWEN_Buffer_GetStart(fbuf), strerror(errno)); return 2; } if (1!=fwrite(p, len, 1, f)) { DBG_ERROR(0, "fwrite(%s, %d bytes): %s", GWEN_Buffer_GetStart(fbuf), len, strerror(errno)); return 2; } if (fclose(f)) { DBG_ERROR(0, "fclose(%s): %s", GWEN_Buffer_GetStart(fbuf), strerror(errno)); return 2; } GWEN_Buffer_free(fbuf); bnum++; } p=GWEN_DB_GetBinValue(dbT, "noted", 0, 0, 0, &len); if (p && len) { GWEN_BUFFER *fbuf; FILE *f; fbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(fbuf, args.swiftFile.c_str()); GWEN_Buffer_AppendString(fbuf, ".noted"); if (nnum!=0) { char numbuf[32]; snprintf(numbuf, sizeof(numbuf), "%d", nnum); GWEN_Buffer_AppendString(fbuf, "."); GWEN_Buffer_AppendString(fbuf, numbuf); } f=fopen(GWEN_Buffer_GetStart(fbuf), "w+"); if (!f) { DBG_ERROR(0, "fopen(%s): %s", GWEN_Buffer_GetStart(fbuf), strerror(errno)); return 2; } if (1!=fwrite(p, len, 1, f)) { DBG_ERROR(0, "fwrite(%s, %d bytes): %s", GWEN_Buffer_GetStart(fbuf), len, strerror(errno)); return 2; } if (fclose(f)) { DBG_ERROR(0, "fclose(%s): %s", GWEN_Buffer_GetStart(fbuf), strerror(errno)); return 2; } GWEN_Buffer_free(fbuf); nnum++; } dbT=GWEN_DB_FindNextGroup(dbT, "transactions"); } } } // if swiftFile // anonymize ntd=trustedData; repl=GWEN_DB_GetGroup(hd, GWEN_DB_FLAGS_DEFAULT, "replacements"); assert(repl); while(ntd) { if (GWEN_MsgEngine_TrustedData_GetTrustLevel(ntd)>args.trustLevel) { int pos; unsigned int size; char rbuffer[3]; const char *rpstr; rpstr=GWEN_MsgEngine_TrustedData_GetReplacement(ntd); assert(rpstr); assert(*rpstr); size=strlen(rpstr); if (size==1) { rbuffer[0]=rpstr[0]; rbuffer[1]=0; } else { rbuffer[0]=rpstr[0]; rbuffer[1]=rpstr[1]; rbuffer[2]=0; } GWEN_DB_SetCharValue(repl, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_VAR, rbuffer, GWEN_MsgEngine_TrustedData_GetDescription(ntd)); size=GWEN_MsgEngine_TrustedData_GetSize(ntd); pos=GWEN_MsgEngine_TrustedData_GetFirstPos(ntd); while(pos>=0) { DBG_INFO(0, "Replacing %d bytes at %d", size, pos); lstr.replace(pos, size, GWEN_MsgEngine_TrustedData_GetReplacement(ntd)); pos=GWEN_MsgEngine_TrustedData_GetNextPos(ntd); } // while pos } ntd=GWEN_MsgEngine_TrustedData_GetNext(ntd); } // while ntd // log anonymized message if (!args.outFile.empty()) _logMessage(args.outFile, lstr, hd); // parse anonymized message and store it if (!args.parseFile.empty()) { GWEN_BUFFER *nmbuf; GWEN_DB_NODE *ngr; GWEN_DB_NODE *hdgr; ngr=GWEN_DB_GetGroup(allgr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP, "message"); assert(ngr); hdgr=GWEN_DB_GetGroup(ngr, GWEN_DB_FLAGS_DEFAULT, "logheader"); GWEN_DB_AddGroupChildren(hdgr, hd); nmbuf=GWEN_Buffer_new((char*)lstr.data(), lstr.length(), lstr.length(), 0); DBG_INFO(0, "Rereading message"); rv=GWEN_MsgEngine_ReadMessage(e, "SEG", nmbuf, ngr, GWEN_MSGENGINE_READ_FLAGS_DEFAULT); if (rv) { fprintf(stderr, "ERROR parsing message.\n"); GWEN_Buffer_free(nmbuf); GWEN_DB_Group_free(allgr); GWEN_MsgEngine_free(e); return 2; } GWEN_Buffer_free(nmbuf); } // if parseFile // free trust info ntd=trustedData; while(ntd) { GWEN_MSGENGINE_TRUSTEDDATA *nnn; nnn=GWEN_MsgEngine_TrustedData_GetNext(ntd); GWEN_MsgEngine_TrustedData_free(ntd); ntd=nnn; } // while } // for if (!args.parseFile.empty()) { if (GWEN_DB_WriteFile(allgr, args.parseFile.c_str(), GWEN_DB_FLAGS_DEFAULT)) { fprintf(stderr, "ERROR saving message.\n"); GWEN_DB_Group_free(allgr); GWEN_MsgEngine_free(e); return 2; } } GWEN_MsgEngine_free(e); return 0; } int main(int argc, char **argv) { s_args args; int rv; string cmd; rv=checkArgs(args,argc,argv); if (rv==-1) return 0; else if (rv) return rv; if (args.xmlfiles.empty()) { string fname; // fill with default files fname=XMLDATA_DIR; fname+="/hbci.xml"; args.xmlfiles.push_back(fname); } if (GWEN_Logger_Open(0, MYNAME, args.logFile.c_str(), args.logType, GWEN_LoggerFacility_User)) { fprintf(stderr, "Could not start logging, aborting.\n"); return 2; } GWEN_Logger_SetLevel(0, args.logLevel); cmd=args.params.front(); if (cmd=="show") { rv=show(args); } else if (cmd=="list") { rv=listAll(args); } else if (cmd=="analyze") { rv=analyzeLog(args); } else if (cmd=="check") { rv=checkAll(args); } else { usage(argv[0]); return 1; } return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/error.h0000644000175000017500000002574212364015477022622 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Sun Nov 18 2001 copyright : (C) 2001 by Martin Preuss email : openhbci@aquamaniac.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifndef HBCIERROR_H #define HBCIERROR_H /** @file error.h * * @short Definitions of HBCI::Error and its C wrapper @ref HBCI_Error. */ /** Severity Level of this error */ typedef enum ErrorLevel { /** no error */ ERROR_LEVEL_NONE = 0, /** unimportant error, warning */ ERROR_LEVEL_EASY, /** normal error */ ERROR_LEVEL_NORMAL, /** critical error */ ERROR_LEVEL_CRITICAL, /** very, very critical error */ ERROR_LEVEL_PANIC, /** internal error */ ERROR_LEVEL_INTERNAL } ErrorLevel; /** Proposed reaction on this error */ typedef enum ErrorAdvise { /** Unknown, unspecified */ ERROR_ADVISE_DONTKNOW = 0, /** Ignore this error */ ERROR_ADVISE_IGNORE = 1, /** Retry the last operation */ ERROR_ADVISE_RETRY = 2, /** It does not make sense to continue or retry */ ERROR_ADVISE_ABORT = 100, /** Stop the program */ ERROR_ADVISE_SHUTDOWN = 101 } ErrorAdvise; /** Some error codes for very specific errors */ enum ErrorCodes { /** Unknown, unspecified */ HBCI_ERROR_CODE_UNKNOWN = 0, /** PIN was wrong (no info about retry count) */ HBCI_ERROR_CODE_PIN_WRONG = 100, /** PIN wrong, no errorneous pin input left */ HBCI_ERROR_CODE_PIN_WRONG_0, /** PIN wrong, one errorneous pin input left */ HBCI_ERROR_CODE_PIN_WRONG_1, /** PIN wrong, two errorneous pin input left */ HBCI_ERROR_CODE_PIN_WRONG_2, /** PIN dialog was aborted by user */ HBCI_ERROR_CODE_PIN_ABORTED, /** The PIN entered was too short */ HBCI_ERROR_CODE_PIN_TOO_SHORT, /** Wrong pin entered too often, card is unusable */ HBCI_ERROR_CODE_CARD_DESTROYED, /** Medium file (keyfile) was not found */ HBCI_ERROR_CODE_FILE_NOT_FOUND, /** No chip card inserted */ HBCI_ERROR_CODE_NO_CARD, /** A specific HBCI job is not supported by the institute, * i.e. they won't do this kind of job. Either the BPD said that * they don't support this job, or they signalled an error when * the textkey was sent to them. */ HBCI_ERROR_CODE_JOB_NOT_SUPPORTED, /** The socket connection failed -- this probably means that the * bank server currently refuses connections. */ HBCI_ERROR_CODE_SOCKET_NO_CONNECT, /** Timeout during socket connect */ HBCI_ERROR_CODE_SOCKET_ERROR_TIMEOUT, /** System call interrupted -- please try again */ HBCI_ERROR_CODE_SOCKET_ERROR_INTERRUPT, /** general socket error */ HBCI_ERROR_CODE_SOCKET_ERROR_UNKNOWN, /** wrong medium inserted */ HBCI_ERROR_CODE_WRONG_MEDIUM, /** error with library loader */ HBCI_ERROR_CODE_LIBRARY, /** whenever there is a double entry in any kind of list */ HBCI_ERROR_CODE_EXISTS, /** whenever something does not exist */ HBCI_ERROR_CODE_INEXISTENT, /** invalid argument */ HBCI_ERROR_CODE_INVALID, /** general medium error */ HBCI_ERROR_CODE_MEDIUM, /** method/function not supported */ HBCI_ERROR_CODE_UNSUPPORTED, /** * this is used when MediumPlugin::mediumCheck finds an unsupported * medium */ HBCI_ERROR_CODE_BAD_MEDIUM, /** user aborted an operation */ HBCI_ERROR_CODE_USER_ABORT, /** a given property is not supported by the medium */ HBCI_ERROR_CODE_UNKNOWN_PROPERTY, /** Medium::setProperty called with an illegal value */ HBCI_ERROR_CODE_INVALID_VALUE, /** Medium::setProperty called for a readonly property */ HBCI_ERROR_CODE_PROPERTY_READONLY, HBCI_ERROR_CODE_JOB_NOT_SUPPORTED_BY_LIB, HBCI_ERROR_CODE_JOB_NOT_SUPPORTED_BY_BANK, HBCI_ERROR_CODE_JOB_NOT_SUPPORTED_FOR_CUSTOMER, HBCI_ERROR_CODE_BAD_MESSAGE }; #include namespace HBCI { using namespace std; class Error; /** * @short This class is thrown when an error occurs. * * An object of this class is thrown as an exception if an error * occurs in OpenHBCI. * * @author Martin Preuss */ class Error { private: string _where; ErrorLevel _level; int _code; ErrorAdvise _advise; string _message; string _info; string _reportedFrom; public: /** * Empty constructor, representing "no error". * * Use this to return an error code that says "All Ok." * You can check if there was an error by calling @ref isOk(). * @author Martin Preuss */ Error(); /** DEPRECATED. This is the old, deprecated constructor. Please * use the new, more precise constructor. This one here might * be removed soon. * * @author Martin Preuss */ Error(string where, string message, int code); /** * New constructor, taken from my other projects as they proofed to be * valuable. * @author Martin Preuss * * @param where String that describes the location of the error * (like "MyClass::myMethod()") * * @param level Severity level, can be one of *
    *
  • @ref ERROR_LEVEL_NONE: no error
  • *
  • ERROR_LEVEL_EASY: unimportant error, warning
  • *
  • ERROR_LEVEL_NORMAL: normal error
  • *
  • ERROR_LEVEL_CRITICAL: critical error
  • *
  • ERROR_LEVEL_PANIC: very, very critical error
  • *
  • ERROR_LEVEL_INTERNAL: internal error
  • *
* * @param code any integer code you want to assign. Some of these * codes (starting from integer number 100) have been specified * for very specific conditions in OpenHBCI now -- see @ref * ErrorCodes . * * @param advise Proposed reaction to this error, can be one of *
    *
  • @ref ERROR_ADVISE_DONTKNOW: unknown, unspecified
  • *
  • ERROR_ADVISE_IGNORE: ignore this error
  • *
  • ERROR_ADVISE_RETRY: retry the last operation
  • *
  • ERROR_ADVISE_ABORT: it does not make sense to continue or retry
  • *
  • ERROR_ADVISE_SHUTDOWN: stop the program
  • *
* @param message A short string describing the error. * @param info Additional information, for debugging purposes. */ Error(string where, ErrorLevel level, int code, ErrorAdvise advise, string message, string info=""); /** * This constructor can be used to return an error which occurred * in a called method. If this one is used, the given string will * added to the reporter list of the error. * Example: *
    *
  • Method A calls method B
  • *
  • Method B is maybe called by multiple other Methods
  • *
  • Method B returns an error *
* You now would have two possibilities: *
    *
  • return the error returned by Method B
  • *
  • return a new error, telling the caller of Method A that there was * an error in Method B
  • *
* With this constructor Method A is able to return an error telling that *
    *
  • an error occurred
  • *
  • the error occurred in Method B (returning all information Method * B provided)
  • *
  • this error occurred Method B was called by Method A
  • *
* So this constructor allows to build up an error chain, so that the * debugging person is able to follow the steps that lead to this error * by inspecting the "reporter" list. * If the error referred to is already an error, that has been reported * using this constructor then the new reporter is simply added to the * list of reporters (to form the chain). * @author Martin Preuss * @param where the location which encountered the error reported * @param err the error that occurred first place */ Error(const string &where, const Error &err); ~Error(); /** * Tells you if this object shows an error or if all was ok. * @author Martin Preuss * @return true if there was no error, false otherwise */ bool isOk() const { return _level==ERROR_LEVEL_NONE; }; /** * Return the location of the error, e.g. "c_error::c_error()". * @author Martin Preuss */ const string& where() const {return _where; }; /** * Returns the error code. Some of these codes (starting from * integer number 100) have been specified for very specific * conditions in OpenHBCI now -- see @ref ErrorCodes. * * @see @ref ErrorCodes */ int code() const { return _code; }; /** * Returns the error message itself (e.g. "Bad filename"). * @author Martin Preuss */ const string& message() const { return _message;}; /** * Returns the severity of the error. * @author Martin Preuss */ ErrorLevel level() const { return _level; }; /** * Returns an advise upon this error (0 if no advise) * @author Martin Preuss */ ErrorAdvise advise() const { return _advise; }; /** * Returns additional info about the error. * @author Martin Preuss */ const string& info() const { return _info; }; /** * Returns a short error string containing all important information. * @author Martin Preuss */ string errorString() const; }; } /* namespace HBCI */ typedef class HBCI::Error HBCI_Error; /* Now the typedefs and function prototypes for C. */ #endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/Makefile.in0000644000175000017500000006344512643540060023356 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = hbcixml3$(EXEEXT) subdir = src/plugins/backends/aqhbci/tools/hbcixml DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_hbcixml3_OBJECTS = hbcixml.$(OBJEXT) loganalyzer.$(OBJEXT) \ error.$(OBJEXT) hbcixml3_OBJECTS = $(am_hbcixml3_OBJECTS) am__DEPENDENCIES_1 = hbcixml3_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = hbcixml3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(hbcixml3_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(hbcixml3_SOURCES) DIST_SOURCES = $(hbcixml3_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ \ -DXMLDATA_DIR=\"$(aqbanking_pkgdatadir)/backends/aqhbci\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) noinst_HEADERS = loganalyzer.h error.h pointer.h hbcixml3_SOURCES = hbcixml.cpp loganalyzer.cpp error.cpp hbcixml3_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ @IS_WINDOWS_TRUE@hbcixml3_LDFLAGS = -mconsole all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/hbcixml/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqhbci/tools/hbcixml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list hbcixml3$(EXEEXT): $(hbcixml3_OBJECTS) $(hbcixml3_DEPENDENCIES) $(EXTRA_hbcixml3_DEPENDENCIES) @rm -f hbcixml3$(EXEEXT) $(AM_V_CXXLD)$(hbcixml3_LINK) $(hbcixml3_OBJECTS) $(hbcixml3_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hbcixml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loganalyzer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/Makefile.am0000644000175000017500000000062612364015477023346 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) DEFS += -DXMLDATA_DIR=\"$(aqbanking_pkgdatadir)/backends/aqhbci\" bin_PROGRAMS=hbcixml3 noinst_HEADERS=loganalyzer.h error.h pointer.h hbcixml3_SOURCES=hbcixml.cpp loganalyzer.cpp error.cpp hbcixml3_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ if IS_WINDOWS hbcixml3_LDFLAGS = -mconsole endif aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/hbcixml/error.cpp0000644000175000017500000000575112364015477023153 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Sun Nov 18 2001 copyright : (C) 2001 by Martin Preuss email : openhbci@aquamaniac.de *************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * * MA 02111-1307 USA * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "error.h" using namespace std; namespace HBCI { Error::Error(string where, string message, int code) :_where(where) ,_level(ERROR_LEVEL_NORMAL) ,_code(code) ,_advise(ERROR_ADVISE_DONTKNOW) ,_message(message) { } Error::Error() :_level(ERROR_LEVEL_NONE) ,_code(0) ,_advise(ERROR_ADVISE_DONTKNOW) { } Error::Error(string where, ErrorLevel level, int code, ErrorAdvise advise, string message, string info) :_where(where) ,_level(level) ,_code(code) ,_advise(advise) ,_message(message) ,_info(info) { } Error::Error(const string &where, const Error &err){ *this=err; if (_reportedFrom.empty()) _reportedFrom=where; else _reportedFrom=where+"/"+_reportedFrom; } Error::~Error(){ } string Error::errorString() const { string result; if (_level==ERROR_LEVEL_NONE) result="NONE"; else { char numbuf[16]; result+=_message; result+=" ("; snprintf(numbuf, sizeof(numbuf), "%d", _code); result+=numbuf; result+=") at "; result+=_where; if (!_info.empty()) { result+=" Info: "; result+=_info; } if (!_reportedFrom.empty()) { result+=" reported from "; result+=_reportedFrom; } } return result; } } // namespace HBCI aqbanking-5.6.4beta/src/plugins/backends/aqhbci/tools/Makefile.am0000644000175000017500000000011412364015477021710 00000000000000SUBDIRS = hbcixml aqhbci-tool # aqhbci hbcisadmin sources: built_sources: aqbanking-5.6.4beta/src/plugins/backends/dummy.c0000644000175000017500000000000012364015477016556 00000000000000aqbanking-5.6.4beta/src/plugins/backends/aqnone/0000755000175000017500000000000012643540660016627 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqnone/dummy.c0000644000175000017500000000000012364015477020037 00000000000000aqbanking-5.6.4beta/src/plugins/backends/aqnone/provider_l.h0000644000175000017500000000274512364015477021100 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AN_PROVIDER_L_H #define AN_PROVIDER_L_H #include #include #ifdef BUILDING_AQNONE # /* building AqNONE */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQNONE_API __declspec (dllexport) # else /* if __declspec */ # define AQNONE_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQNONE_API __attribute__((visibility("default"))) # else # define AQNONE_API # endif # endif #else # /* not building AqNONE */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQNONE_API __declspec (dllimport) # else /* if __declspec */ # define AQNONE_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # define AQNONE_API # endif #endif #define AQNONE_BACKENDNAME "aqnone" #define AQNONE_LOGDOMAIN "aqnone" #ifdef __cplusplus extern "C" { #endif AQNONE_API AB_PROVIDER *AN_Provider_new(AB_BANKING *ab); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqnone/Makefile.in0000644000175000017500000007665012643540060020624 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqnone DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/aqnone.xml.in $(top_srcdir)/depcomp \ $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = aqnone.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" \ "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) \ $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = aqnone_la_DEPENDENCIES = libaqnoneplugin.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_aqnone_la_OBJECTS = dummy.lo aqnone_la_OBJECTS = $(am_aqnone_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqnone_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(aqnone_la_LDFLAGS) $(LDFLAGS) -o $@ libaqnone_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libaqnone_la_OBJECTS = provider.lo libaqnone_la_OBJECTS = $(am_libaqnone_la_OBJECTS) libaqnone_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libaqnone_la_LDFLAGS) $(LDFLAGS) -o $@ libaqnoneplugin_la_DEPENDENCIES = libaqnone.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libaqnoneplugin_la_OBJECTS = aqnone-plugin.lo libaqnoneplugin_la_OBJECTS = $(am_libaqnoneplugin_la_OBJECTS) libaqnoneplugin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libaqnoneplugin_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqnone_la_SOURCES) $(libaqnone_la_SOURCES) \ $(libaqnoneplugin_la_SOURCES) DIST_SOURCES = $(aqnone_la_SOURCES) $(libaqnone_la_SOURCES) \ $(libaqnoneplugin_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(plugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DBUILDING_AQNONE DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = \ -I$(top_srcdir) \ -I$(aqbanking_symlinkdir) \ $(all_includes) AM_CFLAGS = @visibility_cflags@ EXTRA_DIST = aqnone.xml.in plugindir = @aqbanking_plugindir@/providers plugin_DATA = aqnone.xml noinst_HEADERS = provider_l.h provider_p.h # library lib_LTLIBRARIES = libaqnone.la libaqnone_la_SOURCES = provider.c libaqnone_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) libaqnone_la_LDFLAGS = -no-undefined -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ # static plugin library noinst_LTLIBRARIES = libaqnoneplugin.la libaqnoneplugin_la_SOURCES = aqnone-plugin.c libaqnoneplugin_la_LIBADD = libaqnone.la $(aqbanking_internal_libs) $(gwenhywfar_libs) libaqnoneplugin_la_LDFLAGS = -no-undefined -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ # dynamic plugin plugin_LTLIBRARIES = aqnone.la aqnone_la_SOURCES = dummy.c aqnone_la_LIBADD = libaqnoneplugin.la $(aqbanking_internal_libs) $(gwenhywfar_libs) aqnone_la_LDFLAGS = -no-undefined -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqnone/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqnone/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): aqnone.xml: $(top_builddir)/config.status $(srcdir)/aqnone.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } aqnone.la: $(aqnone_la_OBJECTS) $(aqnone_la_DEPENDENCIES) $(EXTRA_aqnone_la_DEPENDENCIES) $(AM_V_CCLD)$(aqnone_la_LINK) -rpath $(plugindir) $(aqnone_la_OBJECTS) $(aqnone_la_LIBADD) $(LIBS) libaqnone.la: $(libaqnone_la_OBJECTS) $(libaqnone_la_DEPENDENCIES) $(EXTRA_libaqnone_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqnone_la_LINK) -rpath $(libdir) $(libaqnone_la_OBJECTS) $(libaqnone_la_LIBADD) $(LIBS) libaqnoneplugin.la: $(libaqnoneplugin_la_OBJECTS) $(libaqnoneplugin_la_DEPENDENCIES) $(EXTRA_libaqnoneplugin_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqnoneplugin_la_LINK) $(libaqnoneplugin_la_OBJECTS) $(libaqnoneplugin_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aqnone-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/provider.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pluginDATA: $(plugin_DATA) @$(NORMAL_INSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(plugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(plugindir)" || exit $$?; \ done uninstall-pluginDATA: @$(NORMAL_UNINSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(plugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginDATA install-pluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-pluginDATA \ uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ clean-pluginLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pluginDATA install-pluginLTLIBRARIES install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-libLTLIBRARIES uninstall-pluginDATA \ uninstall-pluginLTLIBRARIES sources: for f in $(libaqnone_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: # 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: aqbanking-5.6.4beta/src/plugins/backends/aqnone/aqnone-plugin.c0000644000175000017500000000215112364015477021472 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #undef BUILDING_AQNONE_DLL #undef BUILDING_DLL #include "provider_l.h" #include static AB_PROVIDER *AB_Plugin_ProviderNone_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ return AN_Provider_new(ab); } /* interface to gwens plugin loader */ AQBANKING_EXPORT GWEN_PLUGIN *provider_aqnone_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_Provider_new(pm, name, fileName); AB_Plugin_Provider_SetFactoryFn(pl, AB_Plugin_ProviderNone_Factory); return pl; } aqbanking-5.6.4beta/src/plugins/backends/aqnone/provider.c0000644000175000017500000000356312364015477020557 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "provider_p.h" AB_PROVIDER *AN_Provider_new(AB_BANKING *ab){ AB_PROVIDER *pro; pro=AB_Provider_new(ab, "none"); AB_Provider_SetInitFn(pro, AN_Provider_Init); AB_Provider_SetFiniFn(pro, AN_Provider_Fini); AB_Provider_SetUpdateJobFn(pro, AN_Provider_UpdateJob); AB_Provider_SetAddJobFn(pro, AN_Provider_AddJob); AB_Provider_SetExecuteFn(pro, AN_Provider_Execute); AB_Provider_SetResetQueueFn(pro, AN_Provider_ResetQueue); AB_Provider_SetExtendUserFn(pro, AN_Provider_ExtendUser); AB_Provider_SetExtendAccountFn(pro, AN_Provider_ExtendAccount); return pro; } int AN_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { return 0; } int AN_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData){ return 0; } int AN_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j){ return GWEN_ERROR_NOT_SUPPORTED; } int AN_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j){ return GWEN_ERROR_NOT_SUPPORTED; } int AN_Provider_ResetQueue(AB_PROVIDER *pro){ return 0; } int AN_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx){ return 0; } int AN_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend) { return 0; } int AN_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend){ return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqnone/provider_p.h0000644000175000017500000000215012364015477021072 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AN_PROVIDER_P_H #define AN_PROVIDER_P_H #include "provider_l.h" int AN_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); int AN_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); int AN_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j); int AN_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j); int AN_Provider_ResetQueue(AB_PROVIDER *pro); int AN_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); int AN_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); int AN_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); #endif aqbanking-5.6.4beta/src/plugins/backends/aqnone/Makefile.am0000644000175000017500000000247512364015477020616 00000000000000INCLUDES = \ -I$(top_srcdir) \ -I$(aqbanking_symlinkdir) \ $(all_includes) DEFS += -DBUILDING_AQNONE AM_CFLAGS=@visibility_cflags@ EXTRA_DIST=aqnone.xml.in plugindir=@aqbanking_plugindir@/providers plugin_DATA=aqnone.xml noinst_HEADERS=provider_l.h provider_p.h # library lib_LTLIBRARIES=libaqnone.la libaqnone_la_SOURCES=provider.c libaqnone_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) libaqnone_la_LDFLAGS = -no-undefined -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ # static plugin library noinst_LTLIBRARIES=libaqnoneplugin.la libaqnoneplugin_la_SOURCES=aqnone-plugin.c libaqnoneplugin_la_LIBADD = libaqnone.la $(aqbanking_internal_libs) $(gwenhywfar_libs) libaqnoneplugin_la_LDFLAGS = -no-undefined -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ # dynamic plugin plugin_LTLIBRARIES=aqnone.la aqnone_la_SOURCES=dummy.c aqnone_la_LIBADD = libaqnoneplugin.la $(aqbanking_internal_libs) $(gwenhywfar_libs) aqnone_la_LDFLAGS = -no-undefined -module -avoid-version sources: for f in $(libaqnone_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: aqbanking-5.6.4beta/src/plugins/backends/aqnone/aqnone.xml.in0000644000175000017500000000042312364015477021161 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Offline backend This backend allows using offline accounts. aqbanking-5.6.4beta/src/plugins/backends/Makefile.in0000644000175000017500000006712112643540056017341 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbackends_la_DEPENDENCIES = am_libbackends_la_OBJECTS = dummy.lo libbackends_la_OBJECTS = $(am_libbackends_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbackends_la_SOURCES) DIST_SOURCES = $(libbackends_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = $(aqbanking_plugins_backends_dirs) DIST_SUBDIRS = aqhbci aqofxconnect aqnone aqebics noinst_LTLIBRARIES = libbackends.la libbackends_la_SOURCES = dummy.c libbackends_la_LIBADD = $(aqbanking_plugins_backends_libs) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbackends.la: $(libbackends_la_OBJECTS) $(libbackends_la_DEPENDENCIES) $(EXTRA_libbackends_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbackends_la_OBJECTS) $(libbackends_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am sources: for d in $(DIST_SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(DIST_SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/0000755000175000017500000000000012643540661016756 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/Makefile.in0000644000175000017500000006025612643540056020752 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqebics DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = plugin tools CLEANFILES = $(BUILT_SOURCES) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/0000755000175000017500000000000012643540661020254 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/0000755000175000017500000000000012643540660021041 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/eu_p.h0000644000175000017500000000147612364015477022075 00000000000000/*************************************************************************** begin : Sat Mar 08 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_EU_P_H #define AQEBICS_MSG_EU_P_H #include "eu.h" struct EB_EU { GWEN_LIST_ELEMENT(EB_EU) char *version; int modLen; char *jobType; uint8_t *signaturePtr; uint32_t signatureLen; char *userId; char *originalFileName; GWEN_TIME *creationTime; GWEN_TIME *signatureTime; }; static void copyTrimmedString(const uint8_t *p, uint32_t l, char **pDst); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/msg.c0000644000175000017500000003161112364015477021720 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "msg_p.h" #include "xml.h" #include #include #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(EB_MSG) void EB_Msg__initWithDoc(EB_MSG *m) { xmlNodePtr rootNode; const char *s; assert(m); m->xpathCtx=xmlXPathNewContext(m->doc); if (xmlXPathRegisterNs(m->xpathCtx, BAD_CAST "ds", BAD_CAST "http://www.w3.org/2000/09/xmldsig#")!= 0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to register NS"); abort(); } if (xmlXPathRegisterNs(m->xpathCtx, BAD_CAST "xsi", BAD_CAST "http://www.w3.org/2001/XMLSchema-instance")!= 0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to register NS"); abort(); } if (m->hVersion==NULL) { rootNode=xmlDocGetRootElement(m->doc); s=(const char*)xmlGetProp(rootNode, BAD_CAST "Version"); if (!(s && *s)) s="H000"; free(m->hVersion); m->hVersion=strdup(s); } } EB_MSG *EB_Msg_new() { EB_MSG *m; GWEN_NEW_OBJECT(EB_MSG, m); GWEN_INHERIT_INIT(EB_MSG, m); m->usage=1; m->doc=xmlNewDoc(BAD_CAST "1.0"); m->doc->encoding=xmlCharStrdup("UTF-8"); EB_Msg__initWithDoc(m); return m; } EB_MSG *EB_Msg_fromBuffer(const char *buffer, int size) { EB_MSG *m; GWEN_NEW_OBJECT(EB_MSG, m); GWEN_INHERIT_INIT(EB_MSG, m); m->usage=1; m->doc=xmlParseMemory(buffer, size); if (m->doc==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to parser buffer as XML doc"); EB_Msg_free(m); return 0; } EB_Msg__initWithDoc(m); return m; } EB_MSG *EB_Msg_fromFile(const char *fname) { EB_MSG *m; GWEN_NEW_OBJECT(EB_MSG, m); GWEN_INHERIT_INIT(EB_MSG, m); m->usage=1; m->doc=xmlParseFile(fname); if (m->doc==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to parser file \"%s\" as XML doc", fname); EB_Msg_free(m); return 0; } EB_Msg__initWithDoc(m); return m; } EB_MSG *EB_Msg_newResponse(int willSign, const char *rName, const char *hVersion) { EB_MSG *m; GWEN_NEW_OBJECT(EB_MSG, m); GWEN_INHERIT_INIT(EB_MSG, m); m->usage=1; m->doc=EB_Msg__generateResponse(willSign, rName, hVersion); assert(m->doc); EB_Msg__initWithDoc(m); return m; } EB_MSG *EB_Msg_newRequest(int willSign, const char *hVersion) { EB_MSG *m; GWEN_NEW_OBJECT(EB_MSG, m); GWEN_INHERIT_INIT(EB_MSG, m); m->usage=1; m->doc=EB_Msg__generateRequest(willSign, hVersion); assert(m->doc); EB_Msg__initWithDoc(m); return m; } void EB_Msg_toBuffer(EB_MSG *m, GWEN_BUFFER *buf) { xmlChar *xmlbuff; int buffersize; assert(m); assert(m->usage); xmlDocDumpFormatMemory(m->doc, &xmlbuff, &buffersize, 0); GWEN_Buffer_AppendBytes(buf, (const char*)xmlbuff, (uint32_t)buffersize); xmlFree(xmlbuff); } void EB_Msg_free(EB_MSG *m) { if (m) { assert(m->usage); if (m->usage==1) { GWEN_INHERIT_FINI(EB_MSG, m); m->usage=0; free(m->hVersion); xmlFreeDoc(m->doc); GWEN_FREE_OBJECT(m); } else m->usage--; } } #if 0 xmlNodeSetPtr EB_Xml_GetNodes(EB_MSG *m, const char *xpathExpr) { xmlNodeSetPtr nodes; xmlXPathObjectPtr xpathObj; assert(m); assert(m->usage); xpathObj=xmlXPathEvalExpression(BAD_CAST xpathExpr, m->xpathCtx); if(xpathObj == NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to evaluate xpath expression \"%s\"", xpathExpr); return 0; } nodes=xpathObj->nodesetval; if (!nodes) { DBG_INFO(AQEBICS_LOGDOMAIN, "No matching nodes"); xmlXPathFreeObject(xpathObj); return 0; } xpathObj->nodesetval=NULL; xmlXPathFreeObject(xpathObj); return nodes; } #endif xmlDocPtr EB_Msg_GetDoc(const EB_MSG *m) { assert(m); assert(m->usage); return m->doc; } xmlNodePtr EB_Msg_GetRootNode(EB_MSG *m) { assert(m); assert(m->usage); assert(m->doc); return xmlDocGetRootElement(m->doc); } const char *EB_Msg_GetHVersion(const EB_MSG *m) { assert(m); assert(m->usage); return m->hVersion; } void EB_Msg_SetHVersion(EB_MSG *m, const char *s) { assert(m); assert(m->usage); free(m->hVersion); if (s) m->hVersion=strdup(s); else m->hVersion=NULL; } int EB_Msg_BuildHashData(EB_MSG *m, GWEN_BUFFER *hbuf) { int rv; assert(m); assert(m->usage); rv=EB_Xml_BuildHashData(xmlDocGetRootElement(m->doc), BAD_CAST "#xpointer(//*[@authenticate='true'])", hbuf); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int EB_Msg_BuildHashSha1(EB_MSG *m, GWEN_BUFFER *hbuf) { return EB_Xml_BuildNodeHashSha1(xmlDocGetRootElement(m->doc), "#xpointer(//*[@authenticate='true'])", hbuf); } int EB_Msg_BuildHashSha256(EB_MSG *m, GWEN_BUFFER *hbuf) { return EB_Xml_BuildNodeHashSha256(xmlDocGetRootElement(m->doc), "#xpointer(//*[@authenticate='true'])", hbuf); } int EB_Msg_BuildHashSha256Sha256(EB_MSG *m, GWEN_BUFFER *hbuf) { return EB_Xml_BuildNodeHashSha256Sha256(xmlDocGetRootElement(m->doc), "#xpointer(//*[@authenticate='true'])", hbuf); } int EB_Msg_ReadHash(EB_MSG *m, GWEN_BUFFER *hbuf) { const char *s; int rv; assert(m); assert(m->usage); s=EB_Xml_GetCharValue(xmlDocGetRootElement(m->doc), "AuthSignature/" "ds:SignedInfo/ds:Reference/ds:DigestValue", 0); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No hash"); return -1; } rv=GWEN_Base64_Decode((const unsigned char*)s, 0, hbuf); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode hash"); return -1; } return 0; } int EB_Msg_WriteHash(EB_MSG *m, const unsigned char *hash, int hsize) { int rv; GWEN_BUFFER *hbuf; assert(m); assert(m->usage); if (hsize!=20) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad hash size (expected 20, was %d)", hsize); return -1; } hbuf=GWEN_Buffer_new(0, 40, 0, 1); rv=GWEN_Base64_Encode(hash, (uint32_t) hsize, hbuf, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not base64-encode hash (%d)", rv); GWEN_Buffer_free(hbuf); return -1; } EB_Xml_SetCharValue(xmlDocGetRootElement(m->doc), "AuthSignature/" "ds:SignedInfo/ds:Reference/ds:DigestValue", GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); return 0; } int EB_Msg_ReadSignature(EB_MSG *m, GWEN_BUFFER *hbuf) { const char *s; int rv; assert(m); assert(m->usage); s=EB_Xml_GetCharValue(xmlDocGetRootElement(m->doc), "AuthSignature/" "ds:SignatureValue", 0); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No hash"); return -1; } rv=GWEN_Base64_Decode((const unsigned char*)s, 0, hbuf); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode signature"); return -1; } return 0; } int EB_Msg_WriteSignature(EB_MSG *m, const unsigned char *hash, int hsize) { int rv; GWEN_BUFFER *hbuf; assert(m); assert(m->usage); if (hsize!=128) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad signature size (expected 128, was %d)", hsize); return -1; } hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Base64_Encode(hash, (uint32_t) hsize, hbuf, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not base64-encode signature (%d)", rv); GWEN_Buffer_free(hbuf); return -1; } EB_Xml_SetCharValue(xmlDocGetRootElement(m->doc), "AuthSignature/" "ds:SignatureValue", GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); return 0; } int EB_Msg_SetCharValue(EB_MSG *m, const char *path, const char *value) { assert(m); assert(m->usage); return EB_Xml_SetCharValue(xmlDocGetRootElement(m->doc), path, value); } const char *EB_Msg_GetCharValue(const EB_MSG *m, const char *path, const char *defValue) { assert(m); assert(m->usage); return EB_Xml_GetCharValue(xmlDocGetRootElement(m->doc), path, defValue); } int EB_Msg_SetIntValue(EB_MSG *m, const char *path, int value) { assert(m); assert(m->usage); return EB_Xml_SetIntValue(xmlDocGetRootElement(m->doc), path, value); } int EB_Msg_GetIntValue(const EB_MSG *m, const char *path, int defValue) { assert(m); assert(m->usage); return EB_Xml_GetIntValue(xmlDocGetRootElement(m->doc), path, defValue); } EB_RC EB_Msg_GetResultCode(const EB_MSG *m) { const char *s; s=EB_Msg_GetCharValue(m, "header/mutable/ReturnCode", 0); if (s) { long unsigned int i; sscanf(s, "%lx", &i); return (EB_RC) i; } return EB_RC_INTERNAL_ERROR; } EB_RC EB_Msg_GetBodyResultCode(const EB_MSG *m) { const char *s; s=EB_Msg_GetCharValue(m, "body/ReturnCode", 0); if (s) { long unsigned int i; sscanf(s, "%lx", &i); return (EB_RC) i; } return EB_RC_INTERNAL_ERROR; } xmlDocPtr EB_Msg__generateRequest(int willSign, const char *hVersion) { xmlDocPtr doc=NULL; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; /* * Creates a new document, a node and set it as a root node */ doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "ebics"); xmlDocSetRootElement(doc, root_node); EB_Xml_Ebicsify(root_node, hVersion); node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(nodeX, NULL, BAD_CAST "PartnerID", NULL); xmlNewChild(nodeX, NULL, BAD_CAST "UserID", NULL); nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderDetails", NULL); xmlNewChild(nodeXX, NULL, BAD_CAST "OrderType", NULL); xmlNewChild(nodeXX, NULL, BAD_CAST "OrderID", NULL); xmlNewChild(nodeXX, NULL, BAD_CAST "OrderAttribute", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewChild(nodeX, NULL, BAD_CAST "TransactionPhase", NULL); if (willSign) EB_Msg__prepareSignature(doc); node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); return doc; } xmlDocPtr EB_Msg__generateResponse(int willSign, const char *rName, const char *hVersion) { xmlDocPtr doc=NULL; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; /* * Creates a new document, a node and set it as a root node */ doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST rName); xmlDocSetRootElement(doc, root_node); EB_Xml_Ebicsify(root_node, hVersion); node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); //if (!isKeyMgt) xmlNewChild(nodeX, NULL, BAD_CAST "TransactionPhase", NULL); xmlNewChild(nodeX, NULL, BAD_CAST "ReturnCode", NULL); xmlNewChild(nodeX, NULL, BAD_CAST "ReportText", NULL); if (willSign) EB_Msg__prepareSignature(doc); node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); return doc; } int EB_Msg__prepareSignature(xmlDocPtr doc) { xmlNodePtr node; xmlNsPtr ns; xmlNodePtr n; xmlNodePtr nn; xmlNodePtr nnn; xmlNodePtr nnnn; node=xmlNewChild(xmlDocGetRootElement(doc), NULL, BAD_CAST "AuthSignature", NULL); ns=xmlSearchNs(doc, node, BAD_CAST "ds"); assert(ns); n=xmlNewChild(node, ns, BAD_CAST "SignedInfo", NULL); nn=xmlNewChild(n, ns, BAD_CAST "CanonicalizationMethod", NULL); xmlNewProp(nn, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"); nn=xmlNewChild(n, ns, BAD_CAST "SignatureMethod", NULL); xmlNewProp(nn, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2000/09/xmldsig#rsa-sha1"); nn=xmlNewChild(n, ns, BAD_CAST "Reference", NULL); xmlNewProp(nn, BAD_CAST "URI", BAD_CAST "#xpointer(//*[@authenticate='true'])"); nnn=xmlNewChild(nn, ns, BAD_CAST "Transforms", NULL); nnnn=xmlNewChild(nnn, ns, BAD_CAST "Transform", NULL); xmlNewProp(nnnn, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"); nn=xmlNewChild(n, ns, BAD_CAST "DigestMethod", NULL); xmlNewProp(nn, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2000/09/xmldsig#sha1"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/zip.c0000644000175000017500000000553112364015477021736 00000000000000/*************************************************************************** $RCSfile: adminjobs.h,v $ ------------------- cvs : $Id: adminjobs.h,v 1.3 2006/01/13 13:59:58 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "zip.h" #include #include int EB_Zip_Deflate(const char *ptr, unsigned int size, GWEN_BUFFER *buf) { z_stream z; char outbuf[512]; int rv; int mode; z.next_in=(unsigned char*)ptr; z.avail_in=size; z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); z.zalloc=Z_NULL; z.zfree=Z_NULL; rv=deflateInit(&z, (unsigned int) 5); if (rv!=Z_OK) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error on deflateInit (%d)", rv); return -1; } mode=Z_NO_FLUSH; for(;;) { rv=deflate(&z, mode); if (rv==Z_STREAM_END) break; if (rv!=Z_OK) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error on deflate (%d)", rv); deflateEnd(&z); return -1; } if (z.avail_in==0) mode=Z_FINISH; if (z.avail_out==0) { GWEN_Buffer_AppendBytes(buf, outbuf, (uint32_t) sizeof(outbuf)); z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); } } if (z.avail_out!=sizeof(outbuf)) { GWEN_Buffer_AppendBytes(buf, outbuf, (uint32_t)(sizeof(outbuf)-z.avail_out)); z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); } deflateEnd(&z); return 0; } int EB_Zip_Inflate(const char *ptr, unsigned int size, GWEN_BUFFER *buf) { z_stream z; char outbuf[512]; int rv; int mode; z.next_in=(unsigned char*)ptr; z.avail_in=size; z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); z.zalloc=Z_NULL; z.zfree=Z_NULL; rv=inflateInit(&z); if (rv!=Z_OK) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error on deflateInit (%d)", rv); return -1; } mode=Z_NO_FLUSH; for(;;) { rv=inflate(&z, mode); if (rv==Z_STREAM_END) break; if (rv!=Z_OK) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error on inflate (%d)", rv); deflateEnd(&z); return -1; } if (z.avail_in==0) mode=Z_FINISH; if (z.avail_out==0) { GWEN_Buffer_AppendBytes(buf, outbuf, sizeof(outbuf)); z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); } } if (z.avail_out!=sizeof(outbuf)) { GWEN_Buffer_AppendBytes(buf, outbuf, (uint32_t) (sizeof(outbuf)-z.avail_out)); z.next_out=(unsigned char*)outbuf; z.avail_out=sizeof(outbuf); } inflateEnd(&z); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/xml_p.h0000644000175000017500000000152212364015477022254 00000000000000/*************************************************************************** $RCSfile: adminjobs.h,v $ ------------------- cvs : $Id: adminjobs.h,v 1.3 2006/01/13 13:59:58 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_XML_P_H #define AQEBICS_MSG_XML_P_H #include "xml.h" static void* EB_Xml__HandlePath(const char *entry, void *data, int idx, uint32_t flags); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/msg.h0000644000175000017500000000452712364015477021733 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_MSG_H #define AQEBICS_MSG_MSG_H #include #include #include #include #include #include #include #include typedef struct EB_MSG EB_MSG; GWEN_INHERIT_FUNCTION_DEFS(EB_MSG) EB_MSG *EB_Msg_new(); void EB_Msg_free(EB_MSG *m); EB_MSG *EB_Msg_newRequest(int willSign, const char *hVersion); EB_MSG *EB_Msg_newResponse(int willSign, const char *rName, const char *hVersion); EB_MSG *EB_Msg_fromBuffer(const char *buffer, int size); void EB_Msg_toBuffer(EB_MSG *m, GWEN_BUFFER *buf); EB_MSG *EB_Msg_fromFile(const char *fname); xmlDocPtr EB_Msg_GetDoc(const EB_MSG *m); xmlNodePtr EB_Msg_GetRootNode(EB_MSG *m); xmlNodeSetPtr EB_Msg_GetNodes(EB_MSG *m, const char *xpathExpr); DEPRECATED int EB_Msg_BuildHash(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashSha1(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashSha256(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashSha256Sha256(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashData(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_ReadHash(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_WriteHash(EB_MSG *m, const unsigned char *hash, int hsize); int EB_Msg_ReadSignature(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_WriteSignature(EB_MSG *m, const unsigned char *hash, int hsize); int EB_Msg_SetCharValue(EB_MSG *m, const char *path, const char *value); const char *EB_Msg_GetCharValue(const EB_MSG *m, const char *path, const char *defValue); int EB_Msg_SetIntValue(EB_MSG *m, const char *path, int value); int EB_Msg_GetIntValue(const EB_MSG *m, const char *path, int defValue); EB_RC EB_Msg_GetResultCode(const EB_MSG *m); EB_RC EB_Msg_GetBodyResultCode(const EB_MSG *m); const char *EB_Msg_GetHVersion(const EB_MSG *m); void EB_Msg_SetHVersion(EB_MSG *m, const char *s); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/eu.c0000644000175000017500000002073412364015477021547 00000000000000/*************************************************************************** begin : Sat Mar 08 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "eu_p.h" #include #include #include GWEN_LIST_FUNCTIONS(EB_EU, EB_Eu) #define SETSTRING(xName) \ assert(eu); \ free(eu->xName); \ if (s) eu->xName=strdup(s); \ else eu->xName=NULL; EB_EU *EB_Eu_new() { EB_EU *eu; GWEN_NEW_OBJECT(EB_EU, eu); GWEN_LIST_INIT(EB_EU, eu); return eu; } void EB_Eu_free(EB_EU *eu) { if (eu) { free(eu->version); free(eu->jobType); free(eu->signaturePtr); free(eu->userId); free(eu->originalFileName); GWEN_Time_free(eu->creationTime); GWEN_Time_free(eu->signatureTime); GWEN_FREE_OBJECT(eu); } } EB_EU *EB_Eu_dup(const EB_EU *oldEu) { GWEN_BUFFER *buf; EB_EU *eu; buf=GWEN_Buffer_new(0, 512, 0, 1); EB_Eu_toBuffer(oldEu, buf); eu=EB_Eu_fromBuffer((const uint8_t*)GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf)); GWEN_Buffer_free(buf); return eu; } void copyTrimmedString(const uint8_t *p, uint32_t l, char **pDst) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 128, 0, 1); GWEN_Buffer_AppendBytes(buf, (const char*)p, l); GWEN_Text_CondenseBuffer(buf); *pDst=strdup(GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); } EB_EU *EB_Eu_fromBuffer(const uint8_t *p, uint32_t l) { if (l<512) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Too few bytes, not a complete EU (%d)", l); return NULL; } else { EB_EU *eu; const uint8_t *s; char *t; eu=EB_Eu_new(); s=p; copyTrimmedString(s, 4, &(eu->version)); s+=4; copyTrimmedString(s, 4, &t); if (t) { sscanf(t, "%d", &(eu->modLen)); free(t); } s+=4; copyTrimmedString(s, 3, &(eu->jobType)); s+=3; EB_Eu_SetSignature(eu, s, 128); s+=128; copyTrimmedString(s, 8, &(eu->userId)); s+=8; copyTrimmedString(s, 128, &(eu->originalFileName)); s+=128; copyTrimmedString(s, 16, &t); if (t) { eu->creationTime=GWEN_Time_fromString(t, "YYYYMMDD hhmmss"); free(t); } s+=16; copyTrimmedString(s, 16, &t); if (t) { eu->signatureTime=GWEN_Time_fromString(t, "YYYYMMDD hhmmss"); free(t); } s+=16; return eu; } } void EB_Eu_toBuffer(const EB_EU *eu, GWEN_BUFFER *buf) { int l; char numbuf[16]; /* version */ if (eu->version) { l=strlen(eu->version); if (l) GWEN_Buffer_AppendString(buf, eu->version); } else l=0; if (l<4) GWEN_Buffer_FillWithBytes(buf, 32, 4-l); /* length of modulus */ snprintf(numbuf, sizeof(numbuf)-1, "%d", eu->modLen); numbuf[sizeof(numbuf)-1]=0; l=strlen(numbuf); if (l) GWEN_Buffer_AppendString(buf, numbuf); if (l<4) GWEN_Buffer_FillWithBytes(buf, 32, 4-l); /* job type */ if (eu->jobType) { l=strlen(eu->jobType); if (l) GWEN_Buffer_AppendString(buf, eu->jobType); } else l=0; if (l<3) GWEN_Buffer_FillWithBytes(buf, 32, 3-l); /* signature */ if (eu->signatureLen<128) GWEN_Buffer_FillWithBytes(buf, 0, 128-eu->signatureLen); if (eu->signaturePtr) GWEN_Buffer_AppendBytes(buf, (const char*)eu->signaturePtr, eu->signatureLen); /* user id */ if (eu->userId) { l=strlen(eu->userId); if (l) GWEN_Buffer_AppendString(buf, eu->userId); } else l=0; if (l<8) GWEN_Buffer_FillWithBytes(buf, 32, 8-l); /* original file */ if (eu->originalFileName) { l=strlen(eu->originalFileName); if (l) GWEN_Buffer_AppendString(buf, eu->originalFileName); } else l=0; if (l<128) GWEN_Buffer_FillWithBytes(buf, 32, 128-l); /* creation time */ if (eu->creationTime) GWEN_Time_toString(eu->creationTime, "YYYYMMDD hhmmss ", buf); else GWEN_Buffer_FillWithBytes(buf, 32, 16); /* signature time */ if (eu->signatureTime) GWEN_Time_toString(eu->signatureTime, "YYYYMMDD hhmmss ", buf); else GWEN_Buffer_FillWithBytes(buf, 32, 16); /* free use field */ GWEN_Buffer_FillWithBytes(buf, 0, 8); /* RFU */ GWEN_Buffer_FillWithBytes(buf, 0, 197); } int EB_Eu_toDb(const EB_EU *eu, GWEN_DB_NODE *db) { assert(eu); if (eu->version) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "version", eu->version); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "modLen", eu->modLen); if (eu->jobType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "jobType", eu->jobType); if (eu->signaturePtr && eu->signatureLen) GWEN_DB_SetBinValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "signature", eu->signaturePtr, eu->signatureLen); if (eu->userId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "userId", eu->userId); if (eu->originalFileName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "originalFileName", eu->originalFileName); if (eu->creationTime) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "creationTime"); GWEN_Time_toDb(eu->creationTime, dbT); } if (eu->signatureTime) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "signatureTime"); GWEN_Time_toDb(eu->signatureTime, dbT); } return 0; } EB_EU *EB_Eu_fromDb(GWEN_DB_NODE *db) { EB_EU *eu; const char *s; const void *p; unsigned int l; GWEN_DB_NODE *dbT; eu=EB_Eu_new(); s=GWEN_DB_GetCharValue(db, "version", 0, NULL); if (s) eu->version=strdup(s); s=GWEN_DB_GetCharValue(db, "jobType", 0, NULL); if (s) eu->jobType=strdup(s); eu->modLen=GWEN_DB_GetIntValue(db, "modLen", 0, 1024); p=GWEN_DB_GetBinValue(db, "signature", 0, NULL, 0, &l); if (p && l) EB_Eu_SetSignature(eu, p, l); s=GWEN_DB_GetCharValue(db, "userId", 0, NULL); if (s) eu->userId=strdup(s); s=GWEN_DB_GetCharValue(db, "originalFileName", 0, NULL); if (s) eu->originalFileName=strdup(s); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "creationTime"); if (dbT) eu->creationTime=GWEN_Time_fromDb(dbT); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "signatureTime"); if (dbT) eu->signatureTime=GWEN_Time_fromDb(dbT); return eu; } const char *EB_Eu_GetVersion(const EB_EU *eu) { assert(eu); return eu->version; } void EB_Eu_SetVersion(EB_EU *eu, const char *s) { SETSTRING(version); } int EB_Eu_GetModLen(const EB_EU *eu) { assert(eu); return eu->modLen; } void EB_Eu_SetModLen(EB_EU *eu, int i) { assert(eu); eu->modLen=i; } const char *EB_Eu_GetJobType(const EB_EU *eu) { assert(eu); return eu->jobType; } void EB_Eu_SetJobType(EB_EU *eu, const char *s) { SETSTRING(jobType); } const uint8_t *EB_Eu_GetSignaturePtr(const EB_EU *eu) { assert(eu); return eu->signaturePtr; } uint32_t EB_Eu_GetSignatureLen(const EB_EU *eu) { assert(eu); return eu->signatureLen; } void EB_Eu_SetSignature(EB_EU *eu, const uint8_t *p, uint32_t l) { assert(eu); if (eu->signaturePtr && eu->signatureLen) free(eu->signaturePtr); if (p && l) { eu->signaturePtr=(uint8_t*)malloc(l); assert(eu->signaturePtr); memmove(eu->signaturePtr, p, l); eu->signatureLen=l; } else { eu->signaturePtr=NULL; eu->signatureLen=0; } } const char *EB_Eu_GetUserId(const EB_EU *eu) { assert(eu); return eu->userId; } void EB_Eu_SetUserId(EB_EU *eu, const char *s) { SETSTRING(userId); } const char *EB_Eu_GetOriginalFileName(const EB_EU *eu) { assert(eu); return eu->originalFileName; } void EB_Eu_SetOriginalFileName(EB_EU *eu, const char *s) { SETSTRING(originalFileName); } const GWEN_TIME *EB_Eu_GetCreationTime(const EB_EU *eu) { assert(eu); return eu->creationTime; } void EB_Eu_SetCreationTime(EB_EU *eu, const GWEN_TIME *ti) { assert(eu); GWEN_Time_free(eu->creationTime); if (ti) eu->creationTime=GWEN_Time_dup(ti); else eu->creationTime=NULL; } const GWEN_TIME *EB_Eu_GetSignatureTime(const EB_EU *eu) { assert(eu); return eu->signatureTime; } void EB_Eu_SetSignatureTime(EB_EU *eu, const GWEN_TIME *ti) { assert(eu); GWEN_Time_free(eu->signatureTime); if (ti) eu->signatureTime=GWEN_Time_dup(ti); else eu->signatureTime=NULL; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/eu.h0000644000175000017500000000345612364015477021556 00000000000000/*************************************************************************** begin : Sat Mar 08 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_EU_H #define AQEBICS_MSG_EU_H typedef struct EB_EU EB_EU; #include #include #include GWEN_LIST_FUNCTION_DEFS(EB_EU, EB_Eu) EB_EU *EB_Eu_new(); void EB_Eu_free(EB_EU *eu); EB_EU *EB_Eu_dup(const EB_EU *oldEu); EB_EU *EB_Eu_fromBuffer(const uint8_t *p, uint32_t l); void EB_Eu_toBuffer(const EB_EU *eu, GWEN_BUFFER *buf); int EB_Eu_toDb(const EB_EU *eu, GWEN_DB_NODE *db); EB_EU *EB_Eu_fromDb(GWEN_DB_NODE *db); const char *EB_Eu_GetVersion(const EB_EU *eu); void EB_Eu_SetVersion(EB_EU *eu, const char *s); int EB_Eu_GetModLen(const EB_EU *eu); void EB_Eu_SetModLen(EB_EU *eu, int i); const char *EB_Eu_GetJobType(const EB_EU *eu); void EB_Eu_SetJobType(EB_EU *eu, const char *s); const uint8_t *EB_Eu_GetSignaturePtr(const EB_EU *eu); uint32_t EB_Eu_GetSignatureLen(const EB_EU *eu); void EB_Eu_SetSignature(EB_EU *eu, const uint8_t *p, uint32_t l); const char *EB_Eu_GetUserId(const EB_EU *eu); void EB_Eu_SetUserId(EB_EU *eu, const char *s); const char *EB_Eu_GetOriginalFileName(const EB_EU *eu); void EB_Eu_SetOriginalFileName(EB_EU *eu, const char *s); const GWEN_TIME *EB_Eu_GetCreationTime(const EB_EU *eu); void EB_Eu_SetCreationTime(EB_EU *eu, const GWEN_TIME *ti); const GWEN_TIME *EB_Eu_GetSignatureTime(const EB_EU *eu); void EB_Eu_SetSignatureTime(EB_EU *eu, const GWEN_TIME *ti); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/Makefile.in0000644000175000017500000006165412643540056023041 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testlib$(EXEEXT) subdir = src/plugins/backends/aqebics/plugin/msg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmsg_la_LIBADD = am_libmsg_la_OBJECTS = keys.lo msg.lo xml.lo zip.lo eu.lo libmsg_la_OBJECTS = $(am_libmsg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = PROGRAMS = $(noinst_PROGRAMS) am_testlib_OBJECTS = testlib.$(OBJEXT) testlib_OBJECTS = $(am_testlib_OBJECTS) am__DEPENDENCIES_1 = testlib_DEPENDENCIES = libmsg.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmsg_la_SOURCES) $(testlib_SOURCES) DIST_SOURCES = $(libmsg_la_SOURCES) $(testlib_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I.. -I$(top_builddir) \ $(AQEBICS_CFLAGS) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) AM_CFLAGS = -DBUILDING_AQEBICS @visibility_cflags@ noinst_LTLIBRARIES = libmsg.la libmsg_la_SOURCES = \ keys.c \ msg.c \ xml.c \ zip.c \ eu.c noinst_HEADERS = \ eu.h \ eu_p.h \ keys.h \ msg.h \ msg_p.h \ xml.h \ xml_p.h \ zip.h testlib_SOURCES = testlib.c testlib_LDADD = libmsg.la $(AQEBICS_LIBS) $(gwenhywfar_libs) -lz all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/msg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/msg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmsg.la: $(libmsg_la_OBJECTS) $(libmsg_la_DEPENDENCIES) $(EXTRA_libmsg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmsg_la_OBJECTS) $(libmsg_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testlib$(EXEEXT): $(testlib_OBJECTS) $(testlib_DEPENDENCIES) $(EXTRA_testlib_DEPENDENCIES) @rm -f testlib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testlib_OBJECTS) $(testlib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am check-local: testlib$(EXEEXT) ./testlib check1 ./testlib check2 ./testlib check3 sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libmsg_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/xml.c0000644000175000017500000004173512364015477021742 00000000000000/*************************************************************************** $RCSfile: adminjobs.h,v $ ------------------- cvs : $Id: adminjobs.h,v 1.3 2006/01/13 13:59:58 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "xml_p.h" #include "zip.h" #include #include #include #include #include void* EB_Xml__HandlePath(const char *entry, void *data, int idx, uint32_t flags) { xmlNodePtr n; xmlNodePtr nn; int i; xmlNsPtr nameSpace=NULL; const char *p; const char *name; n=(xmlNodePtr)data; name=entry; p=strchr(entry, ':'); if (p) { char prefix[32]; int plen; plen=p-entry; if (plen) { if (plen>=sizeof(prefix)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Prefix too long (%d>%d)", (int)plen, (int)sizeof(prefix)); return 0; } strncpy(prefix, entry, plen); prefix[plen]=0; nameSpace=xmlSearchNs(n->doc, n, BAD_CAST prefix); if (!nameSpace) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Namespace \"%s\" not found", prefix); return 0; } } name=p+1; } /* check whether we are allowed to simply create the node */ if ( ((flags & GWEN_PATH_FLAGS_LAST) && (((flags & GWEN_PATH_FLAGS_VARIABLE) && (flags & GWEN_PATH_FLAGS_CREATE_VAR)) || (!(flags & GWEN_PATH_FLAGS_VARIABLE) && (flags & GWEN_PATH_FLAGS_CREATE_GROUP))) ) || ( !(flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_PATHCREATE)) ) { /* simply create the new variable/group */ if (idx!=0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Index is not 0, not creating %s[%d]", entry, idx); return 0; } DBG_VERBOUS(AQEBICS_LOGDOMAIN, "Unconditionally creating entry \"%s\"", entry); nn=xmlNewChild(n, nameSpace, BAD_CAST name, NULL); return nn; } /* find the node */ nn=n->children; i=idx; while(nn) { if (nn->type==XML_ELEMENT_NODE) { if (nn->name && strcmp((const char*)nn->name, name)==0) { if (i--==0) break; } } nn=nn->next; } /* while */ if (!nn) { /* node not found, check, if we are allowed to create it */ if ( (!(flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_PATHMUSTEXIST)) || (flags & GWEN_PATH_FLAGS_NAMEMUSTEXIST) ) { DBG_VERBOUS(AQEBICS_LOGDOMAIN, "Entry \"%s\" does not exist", entry); return 0; } /* create the new variable/group */ if (idx!=0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Index is not 0, not creating %s[%d]", entry, idx); return 0; } DBG_VERBOUS(AQEBICS_LOGDOMAIN, "Entry \"%s\" not found, creating", entry); nn=xmlNewChild(n, nameSpace, BAD_CAST name, NULL); } /* if node not found */ else { /* node does exist, check whether this is ok */ if ( ((flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST)) || (!(flags & GWEN_PATH_FLAGS_LAST) && (flags & GWEN_PATH_FLAGS_PATHMUSTNOTEXIST)) ) { DBG_VERBOUS(AQEBICS_LOGDOMAIN, "Entry \"%s\" already exists", entry); return 0; } } return nn; } xmlNodePtr EB_Xml_GetNode(xmlNodePtr n, const char *path, uint32_t flags) { return (xmlNodePtr)GWEN_Path_HandleWithIdx(path, n, flags, EB_Xml__HandlePath); } int EB_Xml_SetCharValue(xmlNodePtr n, const char *path, const char *value) { xmlNodePtr node; node=EB_Xml_GetNode(n, path, 0); if (!node) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); return -1; } xmlNodeSetContent(node, BAD_CAST value); return 0; } const char *EB_Xml_GetCharValue(xmlNodePtr n, const char *path, const char *defValue) { xmlNodePtr node; node=EB_Xml_GetNode(n, path, GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (!node) { DBG_INFO(AQEBICS_LOGDOMAIN, "path [%s] not found", path); return defValue; } node=node->children; if (node==0) return defValue; while(node) { if (node->type==XML_TEXT_NODE) { return (const char*)node->content; } node=node->next; } return defValue; } int EB_Xml_SetIntValue(xmlNodePtr n, const char *path, int value) { char numbuf[32]; snprintf(numbuf, sizeof(numbuf)-1, "%d", value); numbuf[sizeof(numbuf)-1]=0; return EB_Xml_SetCharValue(n, path, numbuf); } int EB_Xml_GetIntValue(xmlNodePtr n, const char *path, int defValue) { const char *s; int i; s=EB_Xml_GetCharValue(n, path, NULL); if (s==NULL) return defValue; if (1!=sscanf(s, "%i", &i)) return defValue; return i; } int EB_Xml_CompressDoc(xmlDocPtr doc, GWEN_BUFFER *buf) { xmlChar *xmlbuff; int buffersize; int rv; xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); if (buffersize==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Empty doc"); return -1; } #if 0 if (1) { FILE *f; f=fopen("/tmp/compress.txt", "w+"); if (f) { fwrite((const char*)xmlbuff, buffersize, 1, f); fclose(f); } else { DBG_ERROR(0, "Could not create file"); assert(0); } } #endif rv=EB_Zip_Deflate((const char*)xmlbuff, buffersize, buf); xmlFree(xmlbuff); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not zip doc (%d)", rv); return -1; } return 0; } int EB_Xml_Compress64Doc(xmlDocPtr doc, GWEN_BUFFER *buf) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=EB_Xml_CompressDoc(doc, tbuf); if (rv) { GWEN_Buffer_free(tbuf); return rv; } rv=GWEN_Base64_Encode((const unsigned char*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), buf, 0); GWEN_Buffer_free(tbuf); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not base64-encode order"); return -1; } return 0; } int EB_Xml_UncompressDoc(const char *ptr, int size, xmlDocPtr *pdoc) { xmlDocPtr doc; int rv; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, (size*3)/4, 0, 1); rv=EB_Zip_Inflate(ptr, size, tbuf); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unzip doc (%d)", rv); GWEN_Buffer_free(tbuf); return -1; } doc=xmlParseMemory(GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf)); if (doc==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Not an XML doc"); GWEN_Buffer_Dump(tbuf, 2); GWEN_Buffer_free(tbuf); return -1; } GWEN_Buffer_free(tbuf); *pdoc=doc; return 0; } int EB_Xml_Uncompress64Doc(const char *ptr, int size, xmlDocPtr *pdoc) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=GWEN_Base64_Decode((const unsigned char*)ptr, size, tbuf); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not base64-decode doc"); GWEN_Buffer_free(tbuf); return -1; } rv=EB_Xml_UncompressDoc(GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), pdoc); GWEN_Buffer_free(tbuf); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int EB_Xml_Ebicsify(xmlNodePtr node, const char *hVersion) { if (strcasecmp(hVersion, "H002")==0) { xmlNsPtr ns; ns=xmlNewNs(node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(node, BAD_CAST "Revision", BAD_CAST "1"); } else if (strcasecmp(hVersion, "H003")==0) { xmlNsPtr ns; ns=xmlNewNs(node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(node, BAD_CAST "Revision", BAD_CAST "1"); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unknown EBICS version [%s]", hVersion); return -1; } return 0; } int EB_Xml_InsertChild(xmlNodePtr node, xmlNodePtr n) { if (node->children) xmlAddPrevSibling(node->children, n); else xmlAddChild(node, n); return 0; } int EB_Xml_GetXpathData(xmlNodePtr signedInfoNode, const xmlChar *uri, GWEN_BUFFER *rbuf) { xmlSecTransformPtr tptr; int rv; xmlSecTransformDataType firstType; xmlSecByte *result; xmlSecSize rlen; xmlSecTransformCtxPtr ctx; ctx=xmlSecTransformCtxCreate(); assert(ctx); /* xpath (see xmlsec/transforms.h) */ rv=xmlSecTransformCtxSetUri(ctx, uri, signedInfoNode); if (rv) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxAppend", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return (-1); } /* canonicalisation (see xmlsec/transforms.h) */ tptr=xmlSecTransformCtxCreateAndAppend(ctx, xmlSecTransformInclC14NId); if(tptr == NULL) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxAppend", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return(-1); } firstType=xmlSecTransformGetDataType(ctx->first, xmlSecTransformModePush, ctx); if((firstType & xmlSecTransformDataTypeXml) != 0) { xmlSecNodeSetPtr nodeset = NULL; nodeset=xmlSecNodeSetGetChildren(signedInfoNode->doc, signedInfoNode, 1, 0); /* calculate the signature */ rv=xmlSecTransformCtxXmlExecute(ctx, nodeset); if(rv<0) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxXmlExecute", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecNodeSetDestroy(nodeset); xmlSecTransformCtxDestroy(ctx); return(-1); } xmlSecNodeSetDestroy(nodeset); } else { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "the binary c14n transforms are not supported yet", XMLSEC_ERRORS_R_NOT_IMPLEMENTED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return(-1); } /* ctx->result now contains the resulting data */ result=xmlSecBufferGetData(ctx->result); rlen=xmlSecBufferGetSize(ctx->result); if (result && rlen) { DBG_DEBUG(AQEBICS_LOGDOMAIN, "Have data: %d bytes", rlen); GWEN_Buffer_AppendBytes(rbuf, (char*)result, rlen); } xmlSecTransformCtxDestroy(ctx); return(0); } int EB_Xml_DocFromBuffer(const char *ptr, int size, xmlDocPtr *pdoc) { xmlDocPtr doc; doc=xmlParseMemory(ptr, size); if (doc==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Not an XML doc"); GWEN_Text_DumpString(ptr, (uint32_t) size, 2); return GWEN_ERROR_BAD_DATA; } *pdoc=doc; return 0; } int EB_Xml_BuildHashData(xmlNodePtr signedInfoNode, const xmlChar *uri, GWEN_BUFFER *rbuf) { xmlSecTransformPtr tptr; int rv; xmlSecTransformDataType firstType; xmlSecByte *result; xmlSecSize rlen; xmlSecTransformCtxPtr ctx; ctx=xmlSecTransformCtxCreate(); assert(ctx); /* xpath (see xmlsec/transforms.h) */ rv=xmlSecTransformCtxSetUri(ctx, uri, signedInfoNode); if (rv) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxAppend", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return (-1); } /* canonicalisation (see xmlsec/transforms.h) */ tptr=xmlSecTransformCtxCreateAndAppend(ctx, xmlSecTransformInclC14NId); if(tptr == NULL) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxAppend", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return(-1); } #if 0 /* hashing (see xmlsec/app.h) */ tptr=xmlSecTransformCtxCreateAndAppend(ctx, xmlSecTransformHmacSha1Id); if(tptr == NULL) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxAppend", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return(-1); } #endif firstType=xmlSecTransformGetDataType(ctx->first, xmlSecTransformModePush, ctx); if((firstType & xmlSecTransformDataTypeXml) != 0) { xmlSecNodeSetPtr nodeset = NULL; nodeset=xmlSecNodeSetGetChildren(signedInfoNode->doc, signedInfoNode, 1, 0); /* calculate the signature */ rv=xmlSecTransformCtxXmlExecute(ctx, nodeset); if(rv<0) { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "xmlSecTransformCtxXmlExecute", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecNodeSetDestroy(nodeset); xmlSecTransformCtxDestroy(ctx); return(-1); } xmlSecNodeSetDestroy(nodeset); } else { xmlSecError(XMLSEC_ERRORS_HERE, NULL, "the binary c14n transforms are not supported yet", XMLSEC_ERRORS_R_NOT_IMPLEMENTED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecTransformCtxDestroy(ctx); return(-1); } /* ctx->result now contains the resulting data */ result=xmlSecBufferGetData(ctx->result); rlen=xmlSecBufferGetSize(ctx->result); if (result && rlen) { GWEN_Buffer_AppendBytes(rbuf, (char*)result, rlen); } xmlSecTransformCtxDestroy(ctx); return(0); } int EB_Xml_BuildNodeHash(xmlNodePtr node, const char *uri, GWEN_MDIGEST *md, GWEN_BUFFER *hbuf) { GWEN_BUFFER *dbuf; int rv; dbuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EB_Xml_BuildHashData(node, BAD_CAST uri, dbuf); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); return rv; } /* begin hash */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(dbuf), GWEN_Buffer_GetUsedBytes(dbuf)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); return EB_RC_INTERNAL_ERROR; } GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); /* cleanup */ GWEN_Buffer_free(dbuf); return 0; } int EB_Xml_BuildNodeHashSha1(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf) { GWEN_MDIGEST *md; int rv; md=GWEN_MDigest_Sha1_new(); rv=EB_Xml_BuildNodeHash(node, uri, md, hbuf); GWEN_MDigest_free(md); return rv; } int EB_Xml_BuildNodeHashSha256(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf) { GWEN_MDIGEST *md; int rv; md=GWEN_MDigest_Sha256_new(); rv=EB_Xml_BuildNodeHash(node, uri, md, hbuf); GWEN_MDigest_free(md); return rv; } int EB_Xml_BuildNodeHashSha256Sha256(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf) { GWEN_MDIGEST *md; int rv; GWEN_BUFFER *xbuf; xbuf=GWEN_Buffer_new(0, 64, 0, 1); md=GWEN_MDigest_Sha256_new(); rv=EB_Xml_BuildNodeHash(node, uri, md, xbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); GWEN_MDigest_free(md); return rv; } /* begin hash */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); return EB_RC_INTERNAL_ERROR; } GWEN_Buffer_free(xbuf); GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/testlib.c0000644000175000017500000004211512364015477022601 00000000000000 #include "keys.h" #include "msg.h" #include "xml.h" #include "zip.h" #include #include #include #include #include #include #include #include #include int test1(int argc, char **argv) { const char *fname; GWEN_BUFFER *rbuf; EB_MSG *m; /*int rv;*/ if (argc<3) { fprintf(stderr, "File name missing.\n"); return 1; } fname=argv[2]; /* Init libxml and libxslt libraries */ xmlInitParser(); LIBXML_TEST_VERSION /* Init xmlsec library */ if(xmlSecInit() < 0) { fprintf(stderr, "Error: xmlsec initialization failed.\n"); return(-1); } /* Check loaded library version */ if(xmlSecCheckVersion() != 1) { fprintf(stderr, "Error: loaded xmlsec library version is not compatible.\n"); return(-1); } /* Load default crypto engine if we are supporting dynamic * loading for xmlsec-crypto libraries. Use the crypto library * name ("openssl", "nss", etc.) to load corresponding * xmlsec-crypto library. */ #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if(xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { fprintf(stderr, "Error: unable to load default xmlsec-crypto library. Make sure\n" "that you have it installed and check shared libraries path\n" "(LD_LIBRARY_PATH) envornment variable.\n"); return(-1); } #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */ /* Init crypto library */ if(xmlSecCryptoAppInit(NULL) < 0) { fprintf(stderr, "Error: crypto initialization failed.\n"); return(-1); } /* Init xmlsec-crypto library */ if(xmlSecCryptoInit() < 0) { fprintf(stderr, "Error: xmlsec-crypto initialization failed.\n"); return(-1); } m=EB_Msg_fromFile(fname); if (!m) { fprintf(stderr, "Bad file.\n"); return 3; } rbuf=GWEN_Buffer_new(0, 256, 0, 1); EB_Msg_BuildHashSha1(m, rbuf); GWEN_Buffer_Dump(rbuf, 2); return 0; } int test2(int argc, char **argv) { const char *fname; GWEN_BUFFER *rbuf; EB_MSG *m; int rv; if (argc<3) { fprintf(stderr, "File name missing.\n"); return 1; } fname=argv[2]; /* Init libxml and libxslt libraries */ xmlInitParser(); LIBXML_TEST_VERSION /* Init xmlsec library */ if(xmlSecInit() < 0) { fprintf(stderr, "Error: xmlsec initialization failed.\n"); return(-1); } /* Check loaded library version */ if(xmlSecCheckVersion() != 1) { fprintf(stderr, "Error: loaded xmlsec library version is not compatible.\n"); return(-1); } /* Load default crypto engine if we are supporting dynamic * loading for xmlsec-crypto libraries. Use the crypto library * name ("openssl", "nss", etc.) to load corresponding * xmlsec-crypto library. */ #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if(xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { fprintf(stderr, "Error: unable to load default xmlsec-crypto library. Make sure\n" "that you have it installed and check shared libraries path\n" "(LD_LIBRARY_PATH) envornment variable.\n"); return(-1); } #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */ /* Init crypto library */ if(xmlSecCryptoAppInit(NULL) < 0) { fprintf(stderr, "Error: crypto initialization failed.\n"); return(-1); } /* Init xmlsec-crypto library */ if(xmlSecCryptoInit() < 0) { fprintf(stderr, "Error: xmlsec-crypto initialization failed.\n"); return(-1); } m=EB_Msg_fromFile(fname); if (!m) { fprintf(stderr, "Bad file.\n"); return 3; } rbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EB_Msg_ReadHash(m, rbuf); if (rv) { fprintf(stderr, "No hash...\n"); } GWEN_Buffer_Dump(rbuf, 2); return 0; } void dumpNode(xmlNodePtr node, int level) { xmlNode *cur_node = NULL; for (cur_node = node; cur_node; cur_node = cur_node->next) { int i; printf("%02d:", level); for (i=0; itype, cur_node->name); #if 0 if (cur_node->type == XML_ELEMENT_NODE) { int i; for (i=0; itype, cur_node->name); } #endif dumpNode(cur_node->children, level+1); } } int test3(int argc, char **argv) { const char *fname; EB_MSG *m; xmlNodePtr node; if (argc<3) { fprintf(stderr, "File name missing.\n"); return 1; } fname=argv[2]; /* Init libxml and libxslt libraries */ xmlInitParser(); LIBXML_TEST_VERSION /* Init xmlsec library */ if(xmlSecInit() < 0) { fprintf(stderr, "Error: xmlsec initialization failed.\n"); return(-1); } /* Check loaded library version */ if(xmlSecCheckVersion() != 1) { fprintf(stderr, "Error: loaded xmlsec library version is not compatible.\n"); return(-1); } /* Load default crypto engine if we are supporting dynamic * loading for xmlsec-crypto libraries. Use the crypto library * name ("openssl", "nss", etc.) to load corresponding * xmlsec-crypto library. */ #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING if(xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) { fprintf(stderr, "Error: unable to load default xmlsec-crypto library. Make sure\n" "that you have it installed and check shared libraries path\n" "(LD_LIBRARY_PATH) envornment variable.\n"); return(-1); } #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */ /* Init crypto library */ if(xmlSecCryptoAppInit(NULL) < 0) { fprintf(stderr, "Error: crypto initialization failed.\n"); return(-1); } /* Init xmlsec-crypto library */ if(xmlSecCryptoInit() < 0) { fprintf(stderr, "Error: xmlsec-crypto initialization failed.\n"); return(-1); } m=EB_Msg_fromFile(fname); if (!m) { fprintf(stderr, "Bad file.\n"); return 3; } node=EB_Msg_GetRootNode(m); assert(node); dumpNode(node, 0); return 0; } int test5(int argc, char **argv) { /*const char *fname;*/ xmlDocPtr doc; xmlNsPtr ns; xmlNodePtr root_node = NULL; xmlNodePtr nodeX = NULL; /*xmlNodePtr nodeXX = NULL;*/ xmlInitParser(); LIBXML_TEST_VERSION doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "ebics"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H001", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", BAD_CAST "http://www.ebics.org/H001 " "http://www.ebics.org/H001/ebics_request.xsd"); nodeX=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); ns=xmlSearchNs(doc, nodeX, BAD_CAST "ds"); if (!ns) { fprintf(stderr, "Namespace not found.\n"); return 2; } xmlNewChild(nodeX, ns, BAD_CAST "withns", NULL); xmlDocDump(stderr, doc); xmlFreeDoc(doc); return 0; } int test6(int argc, char **argv) { xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlInitParser(); LIBXML_TEST_VERSION doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "ebics"); xmlDocSetRootElement(doc, root_node); EB_Xml_Ebicsify(root_node, "H002"); EB_Xml_SetCharValue(root_node, "header/ds:AuthStuff/ds:Signature", "Test"); xmlDocDump(stderr, doc); xmlFreeDoc(doc); return 0; } int test7(int argc, char **argv) { xmlDocPtr doc=NULL; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; GWEN_Logger_Open(AQEBICS_LOGDOMAIN, "aqebics", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); GWEN_Logger_SetLevel(AQEBICS_LOGDOMAIN, GWEN_LoggerLevel_Info); doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "ebics"); xmlDocSetRootElement(doc, root_node); node=xmlNewChild(root_node, NULL, BAD_CAST "test1", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "test2", BAD_CAST "valueOf2"); nodeX=xmlNewChild(node, NULL, BAD_CAST "test3", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "test4", NULL); nodeX=xmlNewNode(NULL, BAD_CAST "before2"); EB_Xml_InsertChild(node, nodeX); dumpNode(root_node, 0); return 0; } int check1(int argc, char **argv) { GWEN_CRYPT_KEY *key1p; GWEN_CRYPT_KEY *key1s; GWEN_CRYPT_KEY *key2; GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; const char *p1, *p2; char userIdBuf[16]; int i; int rv; fprintf(stderr, "Generating key...\n"); rv=GWEN_Crypt_KeyRsa_GeneratePair(96, 1, &key1p, &key1s); if (rv<0) { fprintf(stderr, "Could not create key (%d)\n", rv); return 2; } fprintf(stderr, "Generating key done\n"); buf1=GWEN_Buffer_new(0, 512, 0, 1); rv=EB_Key_toBin(key1p, "martin", "A004", 768, buf1); if (rv) { fprintf(stderr, "EB_Key_toBin: %d\n", rv); return 3; } userIdBuf[0]=0; rv=EB_Key_fromBin(&key2, "A004", userIdBuf, sizeof(userIdBuf), GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetUsedBytes(buf1)); if (rv) { fprintf(stderr, "EB_Key_fromBin: %d\n", rv); return 3; } if (strcmp(userIdBuf, "martin")!=0) { fprintf(stderr, "Non-matching user id (expected \"martin\", got \"%s\")\n", userIdBuf); return 3; } buf2=GWEN_Buffer_new(0, 512, 0, 1); rv=EB_Key_toBin(key2, "martin", "A004", 768, buf2); if (rv) { fprintf(stderr, "EB_Key_toBin: %d\n", rv); return 3; } if (GWEN_Buffer_GetUsedBytes(buf1)!=GWEN_Buffer_GetUsedBytes(buf2)) { fprintf(stderr, "Buffer1:\n"); GWEN_Buffer_Dump(buf1, 2); fprintf(stderr, "Buffer2:\n"); GWEN_Buffer_Dump(buf2, 2); fprintf(stderr, "Key data differs in length\n"); return 3; } p1=GWEN_Buffer_GetStart(buf1); p2=GWEN_Buffer_GetStart(buf2); rv=0; for (i=0; i struct EB_MSG { GWEN_INHERIT_ELEMENT(EB_MSG) xmlDocPtr doc; xmlXPathContextPtr xpathCtx; char *hVersion; uint32_t usage; }; static void EB_Msg__initWithDoc(EB_MSG *m); static xmlDocPtr EB_Msg__generateRequest(int willSign, const char *hVersion); static xmlDocPtr EB_Msg__generateResponse(int willSign, const char *rName, const char *hVersion); static int EB_Msg__prepareSignature(xmlDocPtr doc); /*static xmlNodeSetPtr EB_Xml_GetNodes(EB_MSG *m, const char *xpathExpr);*/ #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/Makefile.am0000644000175000017500000000130612364015477023020 00000000000000 INCLUDES=-I.. -I$(top_builddir) \ $(AQEBICS_CFLAGS) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) AM_CFLAGS=-DBUILDING_AQEBICS @visibility_cflags@ noinst_LTLIBRARIES=libmsg.la noinst_PROGRAMS=testlib libmsg_la_SOURCES=\ keys.c \ msg.c \ xml.c \ zip.c \ eu.c noinst_HEADERS=\ eu.h \ eu_p.h \ keys.h \ msg.h \ msg_p.h \ xml.h \ xml_p.h \ zip.h testlib_SOURCES=testlib.c testlib_LDADD=libmsg.la $(AQEBICS_LIBS) $(gwenhywfar_libs) -lz check-local: testlib$(EXEEXT) ./testlib check1 ./testlib check2 ./testlib check3 sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libmsg_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/xml.h0000644000175000017500000000430012364015477021732 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_XML_H #define AQEBICS_MSG_XML_H #include #include #include #include #include #include #include xmlNodePtr EB_Xml_GetNode(xmlNodePtr n, const char *path, uint32_t flags); int EB_Xml_SetCharValue(xmlNodePtr n, const char *path, const char *value); const char *EB_Xml_GetCharValue(xmlNodePtr n, const char *path, const char *defValue); int EB_Xml_SetIntValue(xmlNodePtr n, const char *path, int value); int EB_Xml_GetIntValue(xmlNodePtr n, const char *path, int defValue); int EB_Xml_Ebicsify(xmlNodePtr node, const char *hVersion); int EB_Xml_CompressDoc(xmlDocPtr doc, GWEN_BUFFER *buf); int EB_Xml_Compress64Doc(xmlDocPtr doc, GWEN_BUFFER *buf); int EB_Xml_UncompressDoc(const char *ptr, int size, xmlDocPtr *pdoc); int EB_Xml_Uncompress64Doc(const char *ptr, int size, xmlDocPtr *pdoc); int EB_Xml_InsertChild(xmlNodePtr node, xmlNodePtr n); int EB_Xml_GetXpathData(xmlNodePtr signedInfoNode, const xmlChar *uri, GWEN_BUFFER *rbuf); int EB_Xml_DocFromBuffer(const char *ptr, int size, xmlDocPtr *pdoc); int EB_Xml_BuildHashData(xmlNodePtr signedInfoNode, const xmlChar *uri, GWEN_BUFFER *rbuf); int EB_Xml_BuildNodeHash(xmlNodePtr node, const char *uri, GWEN_MDIGEST *md, GWEN_BUFFER *hbuf); int EB_Xml_BuildNodeHashSha1(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf); int EB_Xml_BuildNodeHashSha256(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf); int EB_Xml_BuildNodeHashSha256Sha256(xmlNodePtr node, const char *uri, GWEN_BUFFER *hbuf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/keys.c0000644000175000017500000007300012364015477022103 00000000000000/*************************************************************************** $RCSfile: adminjobs.h,v $ ------------------- cvs : $Id: adminjobs.h,v 1.3 2006/01/13 13:59:58 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "keys.h" #include "xml.h" #include #include #include #include #include #include EB_RC EB_Key_toBin(const GWEN_CRYPT_KEY *k, const char *userId, const char *version, int keySize, GWEN_BUFFER *buf) { int i; char numbuf[32]; int rv; uint8_t kbuf[300]; uint32_t klen; if (strlen(version)!=4) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid version \"%s\"", version); return EB_RC_KEYMGMT_UNSUPPORTED_VERSION_SIGNATURE; } if (!userId || !*userId) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Missing key owner"); return EB_RC_INVALID_REQUEST; } GWEN_Buffer_AppendString(buf, version); i=(int)strlen(userId); if (i>8) { DBG_ERROR(AQEBICS_LOGDOMAIN, "User id too long"); return EB_RC_INVALID_REQUEST; } GWEN_Buffer_AppendString(buf, userId); if (i<8) GWEN_Buffer_FillWithBytes(buf, ' ', (uint32_t)(8-i)); /* get exponent */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetExponent(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return EB_RC_INVALID_REQUEST; } snprintf(numbuf, sizeof(numbuf), "%04d", keySize); GWEN_Buffer_AppendString(buf, numbuf); if (klen<128) GWEN_Buffer_FillWithBytes(buf, 0, 128-klen); GWEN_Buffer_AppendBytes(buf, (const char*)kbuf, klen); /* get modulus */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetModulus(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return EB_RC_INVALID_REQUEST; } snprintf(numbuf, sizeof(numbuf), "%04d", keySize); GWEN_Buffer_AppendString(buf, numbuf); if (klen<128) GWEN_Buffer_FillWithBytes(buf, 0, 128-klen); GWEN_Buffer_AppendBytes(buf, (const char*)kbuf, klen); GWEN_Buffer_FillWithBytes(buf, ' ', 236); return 0; } EB_RC EB_Key_fromBin(GWEN_CRYPT_KEY **k, const char *version, char *bufUserId, unsigned int lenUserId, const char *p, unsigned int bsize) { GWEN_CRYPT_KEY *key; char tmpbuf[32]; const char *t; char *d; uint32_t nsize; int i; const uint8_t *mPtr; uint32_t mLen; const uint8_t *ePtr; uint32_t eLen; uint32_t keySize; if (bsize<512) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Too few bytes (%d)", bsize); return EB_RC_INVALID_REQUEST; } if (strlen(version)!=4) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid version \"%s\"", version); return EB_RC_INVALID_REQUEST; } /* compare version */ if (strncasecmp(p, version, 4)!=0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unexpected version [%s]", p); return EB_RC_KEYMGMT_UNSUPPORTED_VERSION_SIGNATURE; } t=p+4; /* copy user id */ d=bufUserId; i=0; while(t[i] && t[i]!=' ' && (unsigned int)i<(lenUserId-1) && i<8) *(d++)=t[i++]; *d=0; t+=8; /* get LExponent */ d=tmpbuf; i=0; while(isdigit(t[i]) && i<4) *(d++)=t[i++]; *d=0; i=0; sscanf(tmpbuf, "%d", &i); t+=4; nsize=(i+7)/8; /* get Exponent */ ePtr=(const uint8_t*)(t+(128-nsize)); eLen=nsize; t+=128; /* get LModulus */ d=tmpbuf; i=0; while(t[i] && t[i]!=' ' && i<4) *(d++)=t[i++]; *d=0; i=0; sscanf(tmpbuf, "%d", &i); t+=4; /* calculate number of bits/bytes */ nsize=i; if (nsize>2048) nsize=4096; else if (nsize>1024) nsize=2048; else if (nsize>768) nsize=1024; else nsize=768; keySize=(nsize+7)/8; /* calculate real size of modulus */ nsize=(i+7)/8; /* get Modulus */ mPtr=(const uint8_t*)(t+(128-nsize)); mLen=nsize; t+=128; /* create key */ key=GWEN_Crypt_KeyRsa_fromModExp(keySize, mPtr, mLen, ePtr, eLen); if (!key) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create RSA key"); return EB_RC_INTERNAL_ERROR; } *k=key; return 0; } EB_RC EB_Key_toXml(GWEN_CRYPT_KEY *k, xmlNodePtr node) { int rv; uint8_t kbuf[300]; uint32_t klen; /* get modulus */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetModulus(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return EB_RC_INVALID_REQUEST; } else { GWEN_BUFFER *b64buf; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Encode(kbuf, klen, b64buf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_Buffer_free(b64buf); return EB_RC_INTERNAL_ERROR; } EB_Xml_SetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Modulus", GWEN_Buffer_GetStart(b64buf)); GWEN_Buffer_free(b64buf); } /* get exponent */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetExponent(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return EB_RC_INVALID_REQUEST; } else { GWEN_BUFFER *b64buf; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Encode(kbuf, klen, b64buf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } EB_Xml_SetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Exponent", GWEN_Buffer_GetStart(b64buf)); GWEN_Buffer_free(b64buf); } return 0; } EB_RC EB_Key_fromXml(GWEN_CRYPT_KEY **k, xmlNodePtr node) { const char *s; GWEN_CRYPT_KEY *key; uint8_t eBuf[512]; uint32_t eLen; uint8_t mBuf[512]; uint32_t mLen; s=EB_Xml_GetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Modulus", 0); if (s) { GWEN_BUFFER *b64buf; const uint8_t *p; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Decode((const unsigned char*) s, 0, b64buf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode data"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } if (GWEN_Buffer_GetUsedBytes(b64buf)>sizeof(mBuf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Modulus too long"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } /* correctly calculate key length */ mLen=GWEN_Buffer_GetUsedBytes(b64buf); p=(const uint8_t*)GWEN_Buffer_GetStart(b64buf); while(mLen && *p==0) { mLen--; p++; } DBG_ERROR(0, "Real key size is: %d (from %d)", mLen, GWEN_Buffer_GetUsedBytes(b64buf)); memmove(mBuf, p, mLen); GWEN_Buffer_free(b64buf); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key data (%s)", node->name); return EB_RC_INVALID_REQUEST; } s=EB_Xml_GetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Exponent", 0); if (s) { GWEN_BUFFER *b64buf; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Decode((const unsigned char*) s, 0, b64buf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode data"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } if (GWEN_Buffer_GetUsedBytes(b64buf)>sizeof(eBuf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Exponent too long"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } memmove(eBuf, GWEN_Buffer_GetStart(b64buf), GWEN_Buffer_GetUsedBytes(b64buf)); eLen=GWEN_Buffer_GetUsedBytes(b64buf); GWEN_Buffer_free(b64buf); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "No exponent in key data"); return EB_RC_INVALID_REQUEST; } /* create key */ key=GWEN_Crypt_KeyRsa_fromModExp(mLen, mBuf, mLen, eBuf, eLen); if (!key) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create RSA key"); return EB_RC_INTERNAL_ERROR; } *k=key; return 0; } int EB_Key_BuildHashSha1(const GWEN_CRYPT_KEY *k, GWEN_BUFFER *hbuf, int encode64) { GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; char *s; int rv; uint8_t kbuf[300]; uint32_t klen; GWEN_MDIGEST *md; buf1=GWEN_Buffer_new(0, 256, 0, 1); buf2=GWEN_Buffer_new(0, 520, 0, 1); /* get exponent */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetExponent(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)kbuf, klen, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_AppendString(buf2, " "); GWEN_Buffer_Reset(buf1); /* get modulus */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetModulus(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)kbuf, klen, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_free(buf1); /* convert to lower case */ s=GWEN_Buffer_GetStart(buf2); while(*s) { *s=(char)tolower(*s); s++; } /* hash it */ md=GWEN_MDigest_Sha1_new(); /* begin */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } if (encode64) { if (GWEN_Base64_Encode(GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), hbuf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } } else GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* cleanup */ GWEN_Buffer_free(buf2); return 0; } int EB_Key_BuildHashSha256(const GWEN_CRYPT_KEY *k, GWEN_BUFFER *hbuf, int encode64) { GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; char *s; int rv; uint8_t kbuf[300]; uint32_t klen; GWEN_MDIGEST *md; buf1=GWEN_Buffer_new(0, 256, 0, 1); buf2=GWEN_Buffer_new(0, 520, 0, 1); /* get exponent */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetExponent(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)kbuf, klen, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_AppendString(buf2, " "); GWEN_Buffer_Reset(buf1); /* get modulus */ klen=sizeof(kbuf); rv=GWEN_Crypt_KeyRsa_GetModulus(k, kbuf, &klen); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)kbuf, klen, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_free(buf1); /* convert to lower case */ s=GWEN_Buffer_GetStart(buf2); while(*s) { *s=(char)tolower(*s); s++; } /* hash it */ md=GWEN_MDigest_Sha256_new(); /* begin */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } if (encode64) { if (GWEN_Base64_Encode(GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), hbuf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } } else GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* cleanup */ GWEN_Buffer_free(buf2); return 0; } int EB_Key_Info_BuildHashSha1(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf, int encode64) { GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; char *s; int rv; GWEN_MDIGEST *md; const uint8_t *p; uint32_t len; buf1=GWEN_Buffer_new(0, 256, 0, 1); buf2=GWEN_Buffer_new(0, 520, 0, 1); /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return GWEN_ERROR_NO_DATA; } rv=GWEN_Text_ToHexBuffer((const char*)p, len, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_AppendString(buf2, " "); GWEN_Buffer_Reset(buf1); /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)p, len, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_free(buf1); /* convert to lower case */ s=GWEN_Buffer_GetStart(buf2); while(*s) { *s=(char)tolower(*s); s++; } /* hash it */ md=GWEN_MDigest_Sha1_new(); /* begin */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } if (encode64) { if (GWEN_Base64_Encode(GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), hbuf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } } else GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* cleanup */ GWEN_Buffer_free(buf2); return 0; } int EB_Key_Info_BuildHashSha256(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf, int encode64) { GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; char *s; int rv; GWEN_MDIGEST *md; const uint8_t *p; uint32_t len; buf1=GWEN_Buffer_new(0, 256, 0, 1); buf2=GWEN_Buffer_new(0, 520, 0, 1); /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return GWEN_ERROR_NO_DATA; } rv=GWEN_Text_ToHexBuffer((const char*)p, len, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_AppendString(buf2, " "); GWEN_Buffer_Reset(buf1); /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INVALID_REQUEST; } rv=GWEN_Text_ToHexBuffer((const char*)p, len, buf1, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key"); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return EB_RC_INTERNAL_ERROR; } s=GWEN_Buffer_GetStart(buf1); while(*s=='0') s++; GWEN_Buffer_AppendString(buf2, s); GWEN_Buffer_free(buf1); /* convert to lower case */ s=GWEN_Buffer_GetStart(buf2); while(*s) { *s=(char)tolower(*s); s++; } /* hash it */ md=GWEN_MDigest_Sha256_new(); /* begin */ rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* update */ rv=GWEN_MDigest_Update(md, (const uint8_t*) GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } /* end */ rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } if (encode64) { if (GWEN_Base64_Encode(GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), hbuf, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data"); GWEN_MDigest_free(md); GWEN_Buffer_free(buf2); return EB_RC_INTERNAL_ERROR; } } else GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* cleanup */ GWEN_Buffer_free(buf2); return 0; } int EB_Key_Info_BuildSigHash_Rmd160(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf) { const uint8_t *p; uint32_t len; GWEN_BUFFER *bbuf; GWEN_MDIGEST *md; int rv; bbuf=GWEN_Buffer_new(0, 256, 0, 1); /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } if (len<128) GWEN_Buffer_FillWithBytes(bbuf, 0, 128-len); GWEN_Buffer_AppendBytes(bbuf, (const char*)p, len); /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } if (len<128) GWEN_Buffer_FillWithBytes(bbuf, 0, 128-len); GWEN_Buffer_AppendBytes(bbuf, (const char*)p, len); /* hash */ md=GWEN_MDigest_Rmd160_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(bbuf); return rv; } rv=GWEN_MDigest_Update(md, (const uint8_t*)GWEN_Buffer_GetStart(bbuf), GWEN_Buffer_GetUsedBytes(bbuf)); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(bbuf); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(bbuf); return rv; } GWEN_Buffer_free(bbuf); /* add hash to buffer */ GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); return 0; } int EB_Key_Info_BuildSigHash_Sha256(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf) { const uint8_t *p; char *t; uint32_t len; GWEN_BUFFER *bbuf; GWEN_BUFFER *xbuf; GWEN_MDIGEST *md; int rv; bbuf=GWEN_Buffer_new(0, 256, 0, 1); xbuf=GWEN_Buffer_new(0, 256, 0, 1); /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } rv=GWEN_Text_ToHexBuffer((const char*)p, len, bbuf, 0, 0, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } p=(const uint8_t*)GWEN_Buffer_GetStart(bbuf); while(*p=='0') p++; GWEN_Buffer_AppendString(xbuf, (const char*)p); GWEN_Buffer_AppendByte(xbuf, ' '); GWEN_Buffer_Reset(bbuf); /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } rv=GWEN_Text_ToHexBuffer((const char*) p, len, bbuf, 0, 0, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); GWEN_Buffer_free(xbuf); GWEN_Buffer_free(bbuf); return GWEN_ERROR_NO_DATA; } p=(const uint8_t*)GWEN_Buffer_GetStart(bbuf); while(*p=='0') p++; GWEN_Buffer_AppendString(xbuf, (const char*) p); GWEN_Buffer_free(bbuf); /* lowercase */ t=GWEN_Buffer_GetStart(xbuf); while(*t) { *t=tolower(*t); t++; } /* hash */ md=GWEN_MDigest_Sha256_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(xbuf); return rv; } rv=GWEN_MDigest_Update(md, (const uint8_t*)GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf)); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(xbuf); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { GWEN_MDigest_free(md); GWEN_Buffer_free(xbuf); return rv; } GWEN_Buffer_free(xbuf); /* add hash to buffer */ GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); return 0; } EB_RC EB_Key_Info_ReadXml(GWEN_CRYPT_TOKEN_KEYINFO *ki, xmlNodePtr node) { const char *s; uint8_t eBuf[512]; uint32_t eLen; uint8_t mBuf[512]; uint32_t mLen; uint32_t keySize; s=EB_Xml_GetCharValue(node, "PubKeyValue/RSAKeyValue/Modulus", 0); if (s) { GWEN_BUFFER *b64buf; unsigned int nsize; const uint8_t *p; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Decode((const unsigned char*) s, 0, b64buf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode data"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } if (GWEN_Buffer_GetUsedBytes(b64buf)>sizeof(mBuf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Modulus too long"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } /* correctly calculate key length */ nsize=GWEN_Buffer_GetUsedBytes(b64buf); p=(const uint8_t*)GWEN_Buffer_GetStart(b64buf); while(nsize && *p==0) { nsize--; p++; } DBG_INFO(AQEBICS_LOGDOMAIN, "Real key size is: %d/%d (from %d)", nsize, nsize*8, GWEN_Buffer_GetUsedBytes(b64buf)); nsize*=8; if (nsize>2048) nsize=4096; else if (nsize>1024) nsize=2048; else if (nsize>768) nsize=1024; else nsize=768; keySize=(nsize+7)/8; DBG_INFO(AQEBICS_LOGDOMAIN, "Adjusted key size is: %d", keySize); memmove(mBuf, p, keySize); mLen=keySize; GWEN_Buffer_free(b64buf); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "No modulus in key data (%s)", node->name); return EB_RC_INVALID_REQUEST; } s=EB_Xml_GetCharValue(node, "PubKeyValue/RSAKeyValue/Exponent", 0); if (s) { GWEN_BUFFER *b64buf; b64buf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Base64_Decode((const unsigned char*) s, 0, b64buf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not decode data"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } if (GWEN_Buffer_GetUsedBytes(b64buf)>sizeof(eBuf)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Exponent too long"); GWEN_Buffer_free(b64buf); return EB_RC_INVALID_REQUEST; } memmove(eBuf, GWEN_Buffer_GetStart(b64buf), GWEN_Buffer_GetUsedBytes(b64buf)); eLen=GWEN_Buffer_GetUsedBytes(b64buf); GWEN_Buffer_free(b64buf); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "No exponent in key data"); return EB_RC_INVALID_REQUEST; } /* store info */ GWEN_Crypt_Token_KeyInfo_SetKeySize(ki, keySize); GWEN_Crypt_Token_KeyInfo_SetModulus(ki, mBuf, mLen); GWEN_Crypt_Token_KeyInfo_SetExponent(ki, eBuf, eLen); GWEN_Crypt_Token_KeyInfo_AddFlags(ki, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT); return 0; } int EB_Key_Info_toXml(const GWEN_CRYPT_TOKEN_KEYINFO *ki, xmlNodePtr node) { int rv; const uint8_t *p; uint32_t len; /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); return GWEN_ERROR_NO_DATA; } else { GWEN_BUFFER *b64buf; GWEN_BUFFER *tmpbuf=NULL; #if 0 if (*p!=0) { tmpbuf=GWEN_Buffer_new(0, len+1, 0, 1); GWEN_Buffer_AppendByte(tmpbuf, 0); GWEN_Buffer_AppendBytes(tmpbuf, (const char*)p, len); p=(const uint8_t*)GWEN_Buffer_GetStart(tmpbuf); len++; } #endif b64buf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Base64_Encode(p, len, b64buf, 0); GWEN_Buffer_free(tmpbuf); tmpbuf=NULL; if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data (%d)", rv); GWEN_Buffer_free(b64buf); return EB_RC_INTERNAL_ERROR; } EB_Xml_SetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Modulus", GWEN_Buffer_GetStart(b64buf)); GWEN_Buffer_free(b64buf); } /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return GWEN_ERROR_NO_DATA; } else { GWEN_BUFFER *b64buf; b64buf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Base64_Encode(p, len, b64buf, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not encode data (%d)", rv); GWEN_Buffer_free(b64buf); return EB_RC_INTERNAL_ERROR; } EB_Xml_SetCharValue(node, "PubKeyValue/ds:RSAKeyValue/Exponent", GWEN_Buffer_GetStart(b64buf)); GWEN_Buffer_free(b64buf); } return 0; } EB_RC EB_Key_Info_toBin(const GWEN_CRYPT_TOKEN_KEYINFO *ki, const char *userId, const char *version, int keySize, GWEN_BUFFER *buf) { int i; char numbuf[32]; const uint8_t *p; uint32_t len; if (strlen(version)!=4) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid version \"%s\"", version); return EB_RC_KEYMGMT_UNSUPPORTED_VERSION_SIGNATURE; } if (!userId || !*userId) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Missing key owner"); return EB_RC_INVALID_REQUEST; } GWEN_Buffer_AppendString(buf, version); i=(int)strlen(userId); if (i>8) { DBG_ERROR(AQEBICS_LOGDOMAIN, "User id too long"); return EB_RC_INVALID_REQUEST; } GWEN_Buffer_AppendString(buf, userId); if (i<8) GWEN_Buffer_FillWithBytes(buf, ' ', 8-i); /* get exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); len=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); return EB_RC_INVALID_REQUEST; } snprintf(numbuf, sizeof(numbuf), "%04d", keySize); GWEN_Buffer_AppendString(buf, numbuf); if (len<128) GWEN_Buffer_FillWithBytes(buf, 0, 128-len); GWEN_Buffer_AppendBytes(buf, (const char*)p, len); /* get modulus */ p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); len=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (p==NULL || len==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here"); return EB_RC_INVALID_REQUEST; } snprintf(numbuf, sizeof(numbuf), "%04d", keySize); GWEN_Buffer_AppendString(buf, numbuf); if (len<128) GWEN_Buffer_FillWithBytes(buf, 0, 128-len); GWEN_Buffer_AppendBytes(buf, (const char*)p, len); GWEN_Buffer_FillWithBytes(buf, ' ', 236); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/keys.h0000644000175000017500000000373412364015477022117 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_KEYS_H #define AQEBICS_MSG_KEYS_H #include #include #include #include #include EB_RC EB_Key_toBin(const GWEN_CRYPT_KEY *k, const char *userId, const char *version, int keySize, GWEN_BUFFER *buf); EB_RC EB_Key_fromBin(GWEN_CRYPT_KEY **k, const char *version, char *bufUserId, unsigned int lenUserId, const char *p, unsigned int bsize); EB_RC EB_Key_toXml(GWEN_CRYPT_KEY *k, xmlNodePtr node); EB_RC EB_Key_fromXml(GWEN_CRYPT_KEY **k, xmlNodePtr node); int EB_Key_Info_toXml(const GWEN_CRYPT_TOKEN_KEYINFO *ki, xmlNodePtr node); EB_RC EB_Key_Info_ReadXml(GWEN_CRYPT_TOKEN_KEYINFO *ki, xmlNodePtr node); EB_RC EB_Key_Info_toBin(const GWEN_CRYPT_TOKEN_KEYINFO *ki, const char *userId, const char *version, int keySize, GWEN_BUFFER *buf); int EB_Key_BuildHashSha1(const GWEN_CRYPT_KEY *k, GWEN_BUFFER *hbuf, int encode64); int EB_Key_BuildHashSha256(const GWEN_CRYPT_KEY *k, GWEN_BUFFER *hbuf, int encode64); int EB_Key_Info_BuildHashSha1(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf, int encode64); int EB_Key_Info_BuildHashSha256(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf, int encode64); int EB_Key_Info_BuildSigHash_Rmd160(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf); int EB_Key_Info_BuildSigHash_Sha256(const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *hbuf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/msg/zip.h0000644000175000017500000000152712364015477021744 00000000000000/*************************************************************************** $RCSfile: adminjobs.h,v $ ------------------- cvs : $Id: adminjobs.h,v 1.3 2006/01/13 13:59:58 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_MSG_ZIP_H #define AQEBICS_MSG_ZIP_H #include #include int EB_Zip_Deflate(const char *ptr, unsigned int size, GWEN_BUFFER *buf); int EB_Zip_Inflate(const char *ptr, unsigned int size, GWEN_BUFFER *buf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dummy.c0000644000175000017500000000000012364015477021463 00000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/aqebics_l.h0000644000175000017500000000114112364015477022266 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_AQEBICS_L_H #define AQEBICS_AQEBICS_L_H #include #include #define I18N(s) GWEN_I18N_Translate("aqebics", s) #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/0000755000175000017500000000000012643540661021532 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/user.h0000644000175000017500000001106212364015477022603 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_USER_H #define EBC_CLIENT_USER_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define EBC_USER_FLAGS_BANK_DOESNT_SIGN 0x00000001 #define EBC_USER_FLAGS_FORCE_SSLV3 0x00000002 #define EBC_USER_FLAGS_INI 0x00000004 #define EBC_USER_FLAGS_HIA 0x00000008 #define EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP 0x00000010 #define EBC_USER_FLAGS_PREVALIDATION_SPP 0x00000020 #define EBC_USER_FLAGS_RECOVERY_SPP 0x00000040 #define EBC_USER_FLAGS_STA_SPP 0x00000080 #define EBC_USER_FLAGS_IZV_SPP 0x00000100 #define EBC_USER_FLAGS_USE_IZL 0x00010000 #define EBC_USER_FLAGS_TIMESTAMP_FIX1 0x00020000 #define EBC_USER_FLAGS_NO_EU 0x00040000 AQEBICS_API void EBC_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags); AQEBICS_API uint32_t EBC_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name); typedef enum { EBC_UserStatus_New=0, EBC_UserStatus_Init1, EBC_UserStatus_Init2, EBC_UserStatus_Enabled, EBC_UserStatus_Disabled, EBC_UserStatus_Unknown=999 } EBC_USER_STATUS; AQEBICS_API const char *EBC_User_Status_toString(EBC_USER_STATUS st); AQEBICS_API EBC_USER_STATUS EBC_User_Status_fromString(const char *s); AQEBICS_API EBC_USER_STATUS EBC_User_GetStatus(const AB_USER *u); AQEBICS_API void EBC_User_SetStatus(AB_USER *u, EBC_USER_STATUS i); AQEBICS_API const char *EBC_User_GetServerUrl(const AB_USER *u); AQEBICS_API void EBC_User_SetServerUrl(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetPeerId(const AB_USER *u); AQEBICS_API void EBC_User_SetPeerId(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetSystemId(const AB_USER *u); AQEBICS_API void EBC_User_SetSystemId(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetProtoVersion(const AB_USER *u); AQEBICS_API void EBC_User_SetProtoVersion(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetSignVersion(const AB_USER *u); AQEBICS_API void EBC_User_SetSignVersion(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetCryptVersion(const AB_USER *u); AQEBICS_API void EBC_User_SetCryptVersion(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetAuthVersion(const AB_USER *u); AQEBICS_API void EBC_User_SetAuthVersion(AB_USER *u, const char *s); /** * Returns 0 if the bank doesn't sign messages, 1 otherwise. * This can be used in case the bank sends a sign key upon request but * never signs it's messages. */ AQEBICS_API uint32_t EBC_User_GetFlags(const AB_USER *u); AQEBICS_API void EBC_User_SetFlags(AB_USER *u, uint32_t flags); AQEBICS_API void EBC_User_AddFlags(AB_USER *u, uint32_t flags); AQEBICS_API void EBC_User_SubFlags(AB_USER *u, uint32_t flags); /** * Returns the major HTTP version to be used in PIN/TAN mode (defaults to 1). */ AQEBICS_API int EBC_User_GetHttpVMajor(const AB_USER *u); AQEBICS_API void EBC_User_SetHttpVMajor(AB_USER *u, int i); /** * Returns the minor HTTP version to be used in PIN/TAN mode (defaults to 1). */ AQEBICS_API int EBC_User_GetHttpVMinor(const AB_USER *u); AQEBICS_API void EBC_User_SetHttpVMinor(AB_USER *u, int i); AQEBICS_API const char *EBC_User_GetHttpUserAgent(const AB_USER *u); AQEBICS_API void EBC_User_SetHttpUserAgent(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetHttpContentType(const AB_USER *u); AQEBICS_API void EBC_User_SetHttpContentType(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetTokenType(const AB_USER *u); AQEBICS_API void EBC_User_SetTokenType(AB_USER *u, const char *s); AQEBICS_API const char *EBC_User_GetTokenName(const AB_USER *u); AQEBICS_API void EBC_User_SetTokenName(AB_USER *u, const char *s); AQEBICS_API uint32_t EBC_User_GetTokenContextId(const AB_USER *u); AQEBICS_API void EBC_User_SetTokenContextId(AB_USER *u, uint32_t id); AQEBICS_API int EBC_User_MkPasswdName(const AB_USER *u, GWEN_BUFFER *buf); #ifdef __cplusplus } #endif #endif /* EBC_USER_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hia_h003.c0000644000175000017500000001731612364015477023444 00000000000000 #include "aqebics_l.h" #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include #include int EBC_Provider_XchgHiaRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo=NULL; const GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo=NULL; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; /*xmlNodePtr nodeX = NULL;*/ GWEN_BUFFER *mbuf; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (kid) { cryptKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (cryptKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Crypt key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Crypt key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } /* get auth sign key info */ kid=GWEN_Crypt_Token_Context_GetAuthSignKeyId(ctx); if (kid) { authKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (authKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Auth key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Auth key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } /* create HIARequestOrderData */ doc=xmlNewDoc(BAD_CAST "1.0"); doc->encoding=xmlCharStrdup("UTF-8"); root_node=xmlNewNode(NULL, BAD_CAST "HIARequestOrderData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_orders.xsd"); /* create auth key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "AuthenticationPubKeyInfo", NULL); rv=EB_Key_Info_toXml(authKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return GWEN_ERROR_INVALID; } xmlNewChild(node, NULL, BAD_CAST "AuthenticationVersion", BAD_CAST "X002"); /* create crypt key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "EncryptionPubKeyInfo", NULL); rv=EB_Key_Info_toXml(cryptKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return rv; } xmlNewChild(node, NULL, BAD_CAST "EncryptionVersion", BAD_CAST "E002"); /* store partner id and user id */ node=xmlNewChild(root_node, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); node=xmlNewChild(root_node, NULL, BAD_CAST "UserID", BAD_CAST userId); /* compress and base64 doc */ mbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=EB_Xml_Compress64Doc(doc, mbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error compressing/encoding doc (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsUnsecuredRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "HIA"); tbuf=GWEN_Buffer_new(0, 16, 0, 1); rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_Buffer_free(mbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderID", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZNNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0200"); EB_Msg_SetCharValue(msg, "body/DataTransfer/OrderData", GWEN_Buffer_GetStart(mbuf)); GWEN_Buffer_free(mbuf); /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); EBC_User_AddFlags(u, EBC_USER_FLAGS_HIA); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Init2); else EBC_User_SetStatus(u, EBC_UserStatus_Init1); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hpb.c0000644000175000017500000000123012364015477022706 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgHpbRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { const char *s; s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgHpbRequest_H002(pro, sess, u); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgHpbRequest_H003(pro, sess, u); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Proto version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/context.c0000644000175000017500000000624312364015477023311 00000000000000/* This file is auto-generated from "context.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "context_p.h" #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(EBC_CONTEXT, EBC_Context) GWEN_LIST2_FUNCTIONS(EBC_CONTEXT, EBC_Context) EBC_CONTEXT *EBC_Context_new() { EBC_CONTEXT *st; GWEN_NEW_OBJECT(EBC_CONTEXT, st) st->_usage=1; GWEN_LIST_INIT(EBC_CONTEXT, st) st->jobs=AB_Job_List2_new(); return st; } void EBC_Context_free(EBC_CONTEXT *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->jobs) AB_Job_List2_free(st->jobs); GWEN_LIST_FINI(EBC_CONTEXT, st) GWEN_FREE_OBJECT(st); } } } EBC_CONTEXT *EBC_Context_dup(const EBC_CONTEXT *d) { EBC_CONTEXT *st; assert(d); st=EBC_Context_new(); if (d->jobs) st->jobs=AB_Job_List2_dup(d->jobs); st->jobType=d->jobType; return st; } int EBC_Context_toDb(const EBC_CONTEXT *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "jobType", st->jobType)) return -1; return 0; } int EBC_Context_ReadDb(EBC_CONTEXT *st, GWEN_DB_NODE *db) { assert(st); assert(db); EBC_Context_SetJobType(st, GWEN_DB_GetIntValue(db, "jobType", 0, 0)); return 0; } EBC_CONTEXT *EBC_Context_fromDb(GWEN_DB_NODE *db) { EBC_CONTEXT *st; assert(db); st=EBC_Context_new(); EBC_Context_ReadDb(st, db); st->_modified=0; return st; } AB_JOB_LIST2 *EBC_Context_GetJobs(const EBC_CONTEXT *st) { assert(st); return st->jobs; } void EBC_Context_SetJobs(EBC_CONTEXT *st, AB_JOB_LIST2 *d) { assert(st); if (st->jobs) AB_Job_List2_free(st->jobs); if (d) st->jobs=AB_Job_List2_dup(d); else st->jobs=0; st->_modified=1; } AB_JOB_TYPE EBC_Context_GetJobType(const EBC_CONTEXT *st) { assert(st); return st->jobType; } void EBC_Context_SetJobType(EBC_CONTEXT *st, AB_JOB_TYPE d) { assert(st); st->jobType=d; st->_modified=1; } int EBC_Context_IsModified(const EBC_CONTEXT *st) { assert(st); return st->_modified; } void EBC_Context_SetModified(EBC_CONTEXT *st, int i) { assert(st); st->_modified=i; } void EBC_Context_Attach(EBC_CONTEXT *st) { assert(st); st->_usage++; } EBC_CONTEXT *EBC_Context_List2__freeAll_cb(EBC_CONTEXT *st, GWEN_UNUSED void *user_data) { EBC_Context_free(st); return 0; } void EBC_Context_List2_freeAll(EBC_CONTEXT_LIST2 *stl) { if (stl) { EBC_Context_List2_ForEach(stl, EBC_Context_List2__freeAll_cb, 0); EBC_Context_List2_free(stl); } } EBC_CONTEXT_LIST *EBC_Context_List_dup(const EBC_CONTEXT_LIST *stl) { if (stl) { EBC_CONTEXT_LIST *nl; EBC_CONTEXT *e; nl=EBC_Context_List_new(); e=EBC_Context_List_First(stl); while(e) { EBC_CONTEXT *ne; ne=EBC_Context_dup(e); assert(ne); EBC_Context_List_Add(ne, nl); e=EBC_Context_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/queues.c0000644000175000017500000001215712364015477023135 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "queues_p.h" #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(EBC_USERQUEUE, EBC_UserQueue) GWEN_LIST_FUNCTIONS(EBC_ACCOUNTQUEUE, EBC_AccountQueue) EBC_ACCOUNTQUEUE *EBC_AccountQueue_new(AB_ACCOUNT *a) { EBC_ACCOUNTQUEUE *aq; assert(a); GWEN_NEW_OBJECT(EBC_ACCOUNTQUEUE, aq); GWEN_LIST_INIT(EBC_ACCOUNTQUEUE, aq); aq->account=a; aq->contexts=EBC_Context_List_new(); return aq; } void EBC_AccountQueue_free(EBC_ACCOUNTQUEUE *aq) { if (aq) { GWEN_LIST_FINI(EBC_ACCOUNTQUEUE, aq); EBC_Context_List_free(aq->contexts); GWEN_FREE_OBJECT(aq); } } AB_ACCOUNT *EBC_AccountQueue_GetAccount(const EBC_ACCOUNTQUEUE *aq) { assert(aq); return aq->account; } void EBC_AccountQueue_AddJob(EBC_ACCOUNTQUEUE *aq, AB_JOB *bj) { AB_JOB_TYPE jt; EBC_CONTEXT *ctx; assert(aq); assert(bj); jt=AB_Job_GetType(bj); ctx=EBC_AccountQueue_FindContext(aq, jt); if (!ctx) { ctx=EBC_Context_new(); EBC_Context_SetJobType(ctx, jt); EBC_Context_List_Add(ctx, aq->contexts); } AB_Job_List2_PushBack(EBC_Context_GetJobs(ctx), bj); } EBC_CONTEXT *EBC_AccountQueue_FindContext(const EBC_ACCOUNTQUEUE *aq, AB_JOB_TYPE jt) { EBC_CONTEXT *ctx; assert(aq); ctx=EBC_Context_List_First(aq->contexts); while(ctx) { if (EBC_Context_GetJobType(ctx)==jt) return ctx; ctx=EBC_Context_List_Next(ctx); } return NULL; } EBC_CONTEXT_LIST *EBC_AccountQueue_GetContextList(const EBC_ACCOUNTQUEUE *aq) { assert(aq); return aq->contexts; } EBC_USERQUEUE *EBC_UserQueue_new(AB_USER *u) { EBC_USERQUEUE *uq; assert(u); GWEN_NEW_OBJECT(EBC_USERQUEUE, uq); GWEN_LIST_INIT(EBC_USERQUEUE, uq); uq->user=u; uq->accountQueues=EBC_AccountQueue_List_new(); return uq; } void EBC_UserQueue_free(EBC_USERQUEUE *uq) { if (uq) { GWEN_LIST_FINI(EBC_USERQUEUE, uq); GWEN_FREE_OBJECT(uq); } } AB_USER *EBC_UserQueue_GetUser(const EBC_USERQUEUE *uq){ assert(uq); return uq->user; } void EBC_UserQueue_AddJob(EBC_USERQUEUE *uq, AB_JOB *bj){ AB_ACCOUNT *acc; EBC_ACCOUNTQUEUE *aq; assert(uq); assert(bj); acc=AB_Job_GetAccount(bj); aq=EBC_AccountQueue_List_First(uq->accountQueues); while(aq) { if (EBC_AccountQueue_GetAccount(aq)==acc) break; aq=EBC_AccountQueue_List_Next(aq); } if (!aq) { aq=EBC_AccountQueue_new(acc); EBC_AccountQueue_List_Add(aq, uq->accountQueues); } EBC_AccountQueue_AddJob(aq, bj); } EBC_ACCOUNTQUEUE *EBC_UserQueue_FindAccountQueue(const EBC_USERQUEUE *uq, const AB_ACCOUNT *a) { EBC_ACCOUNTQUEUE *aq; assert(uq); assert(a); aq=EBC_AccountQueue_List_First(uq->accountQueues); while(aq) { if (EBC_AccountQueue_GetAccount(aq)==a) return aq; aq=EBC_AccountQueue_List_Next(aq); } return NULL; } EBC_ACCOUNTQUEUE_LIST *EBC_UserQueue_GetAccountQueues(const EBC_USERQUEUE *uq) { assert(uq); return uq->accountQueues; } EBC_QUEUE *EBC_Queue_new() { EBC_QUEUE *q; GWEN_NEW_OBJECT(EBC_QUEUE, q); q->userQueues=EBC_UserQueue_List_new(); return q; } void EBC_Queue_free(EBC_QUEUE *q) { if (q) { EBC_UserQueue_List_free(q->userQueues); GWEN_FREE_OBJECT(q); } } EBC_USERQUEUE *EBC_Queue_FindUserQueue(EBC_QUEUE *q, const AB_USER *u) { EBC_USERQUEUE *uq; uq=EBC_UserQueue_List_First(q->userQueues); while(uq) { if (EBC_UserQueue_GetUser(uq)==u) break; uq=EBC_UserQueue_List_Next(uq); } return uq; } EBC_USERQUEUE *EBC_Queue_GetUserQueue(EBC_QUEUE *q, AB_USER *u) { EBC_USERQUEUE *uq; assert(q); assert(u); uq=EBC_Queue_FindUserQueue(q, u); if (!uq) { uq=EBC_UserQueue_new(u); EBC_UserQueue_List_Add(uq, q->userQueues); } return uq; } EBC_USERQUEUE_LIST *EBC_Queue_GetUserQueues(const EBC_QUEUE *q) { assert(q); return q->userQueues; } void EBC_Queue_AddJob(EBC_QUEUE *q, AB_USER *u, AB_JOB *bj) { EBC_USERQUEUE *uq; assert(q); assert(u); assert(bj); uq=EBC_Queue_GetUserQueue(q, u); assert(uq); EBC_UserQueue_AddJob(uq, bj); } void EBC_Queue_Clear(EBC_QUEUE *q) { assert(q); EBC_UserQueue_List_Clear(q->userQueues); } AB_JOB *EBC_Queue_FindFirstJobLikeThis(EBC_QUEUE *q, AB_USER *u, AB_JOB *bj) { EBC_USERQUEUE *uq=EBC_Queue_FindUserQueue(q, u); if (uq) { EBC_ACCOUNTQUEUE *aq=EBC_UserQueue_FindAccountQueue(uq, AB_Job_GetAccount(bj)); if (aq) { EBC_CONTEXT *ctx=EBC_AccountQueue_FindContext(aq, AB_Job_GetType(bj)); if (ctx) return AB_Job_List2_GetFront(EBC_Context_GetJobs(ctx)); } } return NULL; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/user_l.h0000644000175000017500000000151612364015477023121 00000000000000/*************************************************************************** $RCSfile: user_l.h,v $ ------------------- cvs : $Id: user_l.h,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_USER_L_H #define EBC_CLIENT_USER_L_H #include #include void EBC_User_Extend(AB_USER *u, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); #endif /* EBC_CLIENT_USER_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_sign.c0000644000175000017500000000170012364015477023075 00000000000000/*************************************************************************** begin : Tue Mar 04 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int EBC_Provider_SignMessage(AB_PROVIDER *pro, EB_MSG *msg, AB_USER *u, xmlNodePtr node) { const char *s; s=EBC_User_GetAuthVersion(u); if (!(s && *s)) s="X001"; if (strcasecmp(s, "X001")==0) return EBC_Provider_SignMessage_X001(pro, msg, u, node); else if (strcasecmp(s, "X002")==0) return EBC_Provider_SignMessage_X002(pro, msg, u, node); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Version [%s] not supported", s); return GWEN_ERROR_BAD_DATA; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_ini_h002.c0000644000175000017500000001456212364015477023461 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "user_l.h" #include static int EBC_Provider_XchgIniRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo=NULL; xmlNsPtr ns; EB_MSG *msg; const char *userId; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; GWEN_BUFFER *tbuf; const char *signVersion; const char *s; GWEN_BUFFER *bufKey; GWEN_BUFFER *bufZip; GWEN_BUFFER *bufB64; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (kid) { signKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (signKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Sign key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Sign key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } signVersion=EBC_User_GetSignVersion(u); if (! (signVersion && *signVersion)) signVersion="A004"; if (strcasecmp(signVersion, "A004")==0) { /* encode according to "DFUE-Abkommen" */ bufKey=GWEN_Buffer_new(0, 512, 0, 1); rc=EB_Key_Info_toBin(signKeyInfo, userId, "A004", 1024, bufKey); if (rc) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error writing key (rc=%06x)", rc); GWEN_Buffer_free(bufKey); return GWEN_ERROR_GENERIC; } /* zip order */ bufZip=GWEN_Buffer_new(0, 512, 0, 1); if (EB_Zip_Deflate(GWEN_Buffer_GetStart(bufKey), GWEN_Buffer_GetUsedBytes(bufKey), bufZip)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to zip key data"); GWEN_Buffer_free(bufZip); GWEN_Buffer_free(bufKey); return GWEN_ERROR_GENERIC; } GWEN_Buffer_free(bufKey); /* base64 encode for order */ bufB64=GWEN_Buffer_new(0, 800, 0, 1); if (GWEN_Base64_Encode((const unsigned char*)GWEN_Buffer_GetStart(bufZip), GWEN_Buffer_GetUsedBytes(bufZip), bufB64, 0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error encoding key"); GWEN_Buffer_free(bufB64); GWEN_Buffer_free(bufZip); return GWEN_ERROR_GENERIC; } GWEN_Buffer_free(bufZip); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unsupported sign version [%s]", signVersion); return GWEN_ERROR_INTERNAL; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsUnsecuredRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "INI"); tbuf=GWEN_Buffer_new(0, 16, 0, 1); rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error creating order id (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_Buffer_free(bufB64); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderID", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZNNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0000"); EB_Msg_SetCharValue(msg, "body/DataTransfer/OrderData", GWEN_Buffer_GetStart(bufB64)); GWEN_Buffer_free(bufB64); /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); EBC_User_AddFlags(u, EBC_USER_FLAGS_INI); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Init2); else EBC_User_SetStatus(u, EBC_UserStatus_Init1); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/context.xml0000644000175000017500000000137412364015477023667 00000000000000
aqebics/aqebics.h
aqbanking/job_be.h
aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_upload_h003.c0000644000175000017500000003732412364015477024170 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" static int EBC_Provider_MkUploadInitRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_CRYPT_KEY *skey, const char *pEu, uint32_t dlen, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; /*xmlNodePtr nodeXXX = NULL;*/ xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; char numbuf[32]; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Nonce", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Timestamp", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "UserID", BAD_CAST userId); /* order details */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderDetails", NULL); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderType", BAD_CAST requestType); /* generate order id */ rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderID", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU) xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "DZHNN"); else xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "OZHNN"); xmlNewChild(nodeXX, NULL, BAD_CAST "StandardOrderParams", NULL); /* bank pubkey digests */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "BankPubKeyDigests", NULL); rv=EBC_Provider_AddBankPubKeyDigests(pro, u, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* security medium */ xmlNewTextChild(nodeX, NULL, BAD_CAST "SecurityMedium", BAD_CAST "0000"); snprintf(numbuf, sizeof(numbuf)-1, "%i", (dlen+(1024*1024)-1)/(1024*1024)); numbuf[sizeof(numbuf)-1]=0; xmlNewTextChild(nodeX, NULL, BAD_CAST "NumSegments", BAD_CAST numbuf); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Initialisation"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* data transfer */ nodeX=xmlNewChild(node, NULL, BAD_CAST "DataTransfer", NULL); /* add session key and info */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "DataEncryptionInfo", NULL); xmlNewProp(nodeXX, BAD_CAST "authenticate", BAD_CAST "true"); rv=EBC_Provider_FillDataEncryptionInfoNode(pro, u, skey, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU)) { /* add EU */ nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "SignatureData", BAD_CAST pEu); xmlNewProp(nodeXX, BAD_CAST "authenticate", BAD_CAST "true"); } /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkUploadTransferRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, const char *pData, uint32_t lData, int segmentNumber, int isLast, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; char numbuf[32]; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Transfer"); snprintf(numbuf, sizeof(numbuf)-1, "%d", segmentNumber); numbuf[sizeof(numbuf)-1]=0; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "SegmentNumber", BAD_CAST numbuf); xmlNewProp(nodeXX, BAD_CAST "lastSegment", BAD_CAST (isLast?"true":"false")); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* data transfer */ nodeX=xmlNewChild(node, NULL, BAD_CAST "DataTransfer", NULL); tbuf=GWEN_Buffer_new(0, lData, 0, 1); GWEN_Buffer_AppendBytes(tbuf, pData, lData); nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderData", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } int EBC_Provider_XchgUploadRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const uint8_t *pData, uint32_t lData) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_KEY *skey; GWEN_BUFFER *euBuf=NULL; GWEN_BUFFER *dbuf; EB_MSG *msg=NULL; EB_MSG *mRsp; uint32_t numSegs; uint32_t i; EB_RC rc; GWEN_BUFFER *logbuf; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); logbuf=GWEN_Buffer_new(0, 128, 0, 1); /* generate session key (for now only E002 is possible) */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating session key"); skey=GWEN_Crypt_KeyAes128_Generate(GWEN_Crypt_CryptMode_Cbc, 16, 2); if (skey==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to generate AES-128 key"); return GWEN_ERROR_GENERIC; } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU)) { /* generate electronic signature */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating electronic signature for user [%s]", AB_User_GetUserId(u)); euBuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EBC_Provider_MkEuCryptZipDoc(pro, u, requestType, pData, lData, skey, euBuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); GWEN_Buffer_AppendString(logbuf, I18N("\tError signing upload document")); GWEN_Buffer_AppendString(logbuf, " ("); GWEN_Buffer_AppendString(logbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(logbuf, ")\n"); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, I18N("\tUpload document signed")); GWEN_Buffer_AppendString(logbuf, " ("); GWEN_Buffer_AppendString(logbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(logbuf, ")\n"); } /* encrypt and encode data */ DBG_INFO(AQEBICS_LOGDOMAIN, "Encrypting, zipping and encoding upload data"); dbuf=GWEN_Buffer_new(0, (lData*4)/3, 0, 1); rv=EBC_Provider_EncryptData(pro, u, skey, pData, lData, dbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); GWEN_Buffer_AppendString(logbuf, I18N("\tError encrypting upload document\n")); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, I18N("\tUpload document encrypted\n")); numSegs=(GWEN_Buffer_GetUsedBytes(dbuf)+(1024*1024)-1)/(1024*1024); /* create upload init request */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating upload init request"); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU) rv=EBC_Provider_MkUploadInitRequest_H003(pro, sess, u, requestType, skey, NULL, /* no EU */ GWEN_Buffer_GetUsedBytes(dbuf), &msg); else rv=EBC_Provider_MkUploadInitRequest_H003(pro, sess, u, requestType, skey, GWEN_Buffer_GetStart(euBuf), GWEN_Buffer_GetUsedBytes(dbuf), &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } /* exchange requests */ DBG_INFO(AQEBICS_LOGDOMAIN, "Exchanging upload init request"); GWEN_Buffer_AppendString(logbuf, I18N("\tExchanging upload init request")); rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } EB_Msg_free(msg); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, logbuf); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } if (1) { const char *s; char transactionId[36]; const char *p; uint32_t bytesLeft; /* extract transaction id */ s=EB_Msg_GetCharValue(mRsp, "header/static/TransactionID", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } strncpy(transactionId, s, sizeof(transactionId)-1); EB_Msg_free(mRsp); /* write data */ p=GWEN_Buffer_GetStart(dbuf); bytesLeft=GWEN_Buffer_GetUsedBytes(dbuf); for (i=0; ibytesLeft) n=bytesLeft; assert(n); DBG_INFO(AQEBICS_LOGDOMAIN, "Generating upload transfer request"); rv=EBC_Provider_MkUploadTransferRequest_H003(pro, sess, u, transactionId, p, n, i+1, (i==numSegs-1)?1:0, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } /* exchange requests */ DBG_INFO(AQEBICS_LOGDOMAIN, "Exchanging upload transfer request"); GWEN_Buffer_AppendString(logbuf, I18N("\tExchanging upload transfer request")); rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, logbuf); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return AB_ERROR_SECURITY; } /* prepare next round */ EB_Msg_free(mRsp); p+=n; bytesLeft-=n; } /* for */ } GWEN_Buffer_free(dbuf); DBG_INFO(AQEBICS_LOGDOMAIN, "Upload finished"); GWEN_Buffer_AppendString(logbuf, I18N("\tUpload finished")); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_upload.c0000644000175000017500000000160012364015477023422 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" int EBC_Provider_XchgUploadRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const uint8_t *pData, uint32_t lData) { EBC_PROVIDER *dp; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* exchange upload request */ s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgUploadRequest_H002(pro, sess, u, requestType, pData, lData); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgUploadRequest_H003(pro, sess, u, requestType, pData, lData); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Crypt version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_pub_h003.c0000644000175000017500000000754712364015477023476 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "user_l.h" #include int EBC_Provider_XchgPubRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *signVersion) { EBC_PROVIDER *dp; int rv; const char *userId; const char *partnerId; GWEN_BUFFER *bufKey; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo=NULL; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetTempSignKeyId(ctx); if (kid) { signKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (signKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Sign key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Sign key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } if (strcasecmp(signVersion, "A004")==0) { EB_RC rc; /* encode according to "DFUE-Abkommen" */ bufKey=GWEN_Buffer_new(0, 512, 0, 1); rc=EB_Key_Info_toBin(signKeyInfo, userId, "A004", 1024, bufKey); if (rc) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error writing key (rc=%06x)", rc); GWEN_Buffer_free(bufKey); return GWEN_ERROR_GENERIC; } } else { xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNsPtr ns; /* create INIRequestOrderData */ doc=xmlNewDoc(BAD_CAST "1.0"); doc->encoding=xmlCharStrdup("UTF-8"); root_node=xmlNewNode(NULL, BAD_CAST "SignaturePubKeyOrderData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/S001", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/S001 " "http://www.ebics.org/S001/ebics_signature.xsd"); /* create sign key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "SignaturePubKeyInfo", NULL); rv=EB_Key_Info_toXml(signKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return GWEN_ERROR_INVALID; } xmlNewChild(node, NULL, BAD_CAST "SignatureVersion", BAD_CAST signVersion); /* store partner id and user id */ node=xmlNewChild(root_node, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); node=xmlNewChild(root_node, NULL, BAD_CAST "UserID", BAD_CAST userId); DBG_ERROR(0, "Will send this order:"); xmlDocDump(stderr, doc); /* compress and base64 doc */ bufKey=GWEN_Buffer_new(0, 4096, 0, 1); rv=EB_Xml_Compress64Doc(doc, bufKey); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error compressing/encoding doc (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); } rv=EBC_Provider_XchgUploadRequest(pro, sess, u, "PUB", (const uint8_t*)GWEN_Buffer_GetStart(bufKey), GWEN_Buffer_GetUsedBytes(bufKey)); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bufKey); return rv; } GWEN_Buffer_free(bufKey); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/account_l.h0000644000175000017500000000131112364015477023570 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_ACCOUNT_L_H #define EBC_CLIENT_ACCOUNT_L_H #include #include void EBC_Account_Extend(AB_ACCOUNT *a, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); #endif /* EBC_CLIENT_ACCOUNT_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_download.c0000644000175000017500000000206712364015477023755 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgDownloadRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime) { EBC_PROVIDER *dp; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgDownloadRequest_H002(pro, sess, u, requestType, targetBuffer, withReceipt, fromTime, toTime); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgDownloadRequest_H003(pro, sess, u, requestType, targetBuffer, withReceipt, fromTime, toTime); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Proto version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_sta.c0000644000175000017500000000227512364015477022736 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgStaRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, AB_IMEXPORTER_CONTEXT *ctx) { AB_BANKING *ab; int rv; GWEN_BUFFER *buf; AB_USER *u; ab=AB_Provider_GetBanking(pro); assert(ab); u=AB_HttpSession_GetUser(sess); assert(u); buf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_SetHardLimit(buf, EBICS_BUFFER_MAX_HARD_LIMIT); /* TODO: get RECEIPT flag from account settings */ rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, "STA", buf, 1, fromTime, toTime); if (rv<0 || rv>=300) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } else { DBG_INFO(AQEBICS_LOGDOMAIN, "Importing transactions"); GWEN_Buffer_Rewind(buf); rv=AB_Banking_ImportBuffer(ab, ctx, "swift", "SWIFT-MT940", buf); GWEN_Buffer_free(buf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } DBG_INFO(AQEBICS_LOGDOMAIN, "Importing transactions: done"); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_pub_h002.c0000644000175000017500000000743212364015477023466 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "user_l.h" #include int EBC_Provider_XchgPubRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *signVersion) { EBC_PROVIDER *dp; int rv; const char *userId; const char *partnerId; GWEN_BUFFER *bufKey; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo=NULL; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetTempSignKeyId(ctx); if (kid) { signKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (signKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Sign key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Sign key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } if (strcasecmp(signVersion, "A004")==0) { EB_RC rc; /* encode according to "DFUE-Abkommen" */ bufKey=GWEN_Buffer_new(0, 512, 0, 1); rc=EB_Key_Info_toBin(signKeyInfo, userId, "A004", 1024, bufKey); if (rc) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error writing key (rc=%06x)", rc); GWEN_Buffer_free(bufKey); return GWEN_ERROR_GENERIC; } } else { xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNsPtr ns; /* create INIRequestOrderData */ doc=xmlNewDoc(BAD_CAST "1.0"); doc->encoding=xmlCharStrdup("UTF-8"); root_node=xmlNewNode(NULL, BAD_CAST "PUBRequestOrderData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_orders.xsd"); /* create sign key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "SignaturePubKeyInfo", NULL); rv=EB_Key_Info_toXml(signKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return GWEN_ERROR_INVALID; } xmlNewChild(node, NULL, BAD_CAST "SignatureVersion", BAD_CAST signVersion); /* store partner id and user id */ node=xmlNewChild(root_node, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); node=xmlNewChild(root_node, NULL, BAD_CAST "UserID", BAD_CAST userId); /* compress and base64 doc */ bufKey=GWEN_Buffer_new(0, 4096, 0, 1); rv=EB_Xml_Compress64Doc(doc, bufKey); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error compressing/encoding doc (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); } rv=EBC_Provider_XchgUploadRequest(pro, sess, u, "PUB", (const uint8_t*)GWEN_Buffer_GetStart(bufKey), GWEN_Buffer_GetUsedBytes(bufKey)); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bufKey); return rv; } GWEN_Buffer_free(bufKey); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/user.c0000644000175000017500000004175512364015477022612 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "user_p.h" #include "provider_l.h" #include #include #include #include GWEN_INHERIT(AB_USER, EBC_USER) const char *EBC_User_Status_toString(EBC_USER_STATUS st){ switch(st) { case EBC_UserStatus_New: return "new"; case EBC_UserStatus_Enabled: return "enabled"; case EBC_UserStatus_Init1: return "init1"; case EBC_UserStatus_Init2: return "init2"; case EBC_UserStatus_Disabled: return "disabled"; default: return "unknown"; } /* switch */ } EBC_USER_STATUS EBC_User_Status_fromString(const char *s){ assert(s); if (strcasecmp(s, "new")==0) return EBC_UserStatus_New; else if (strcasecmp(s, "enabled")==0) return EBC_UserStatus_Enabled; else if (strcasecmp(s, "init1")==0) return EBC_UserStatus_Init1; else if (strcasecmp(s, "init2")==0) return EBC_UserStatus_Init2; else if (strcasecmp(s, "disabled")==0) return EBC_UserStatus_Disabled; else return EBC_UserStatus_Unknown; } void EBC_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags) { GWEN_DB_DeleteVar(db, name); if (flags & EBC_USER_FLAGS_BANK_DOESNT_SIGN) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "bankDoesntSign"); if (flags & EBC_USER_FLAGS_FORCE_SSLV3) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "forceSslv3"); if (flags & EBC_USER_FLAGS_INI) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "INI"); if (flags & EBC_USER_FLAGS_HIA) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "HIA"); if (flags & EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "clientDataDownloadSpp"); if (flags & EBC_USER_FLAGS_PREVALIDATION_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "prevalidationSpp"); if (flags & EBC_USER_FLAGS_RECOVERY_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "recoverySpp"); if (flags & EBC_USER_FLAGS_STA_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "staSpp"); if (flags & EBC_USER_FLAGS_IZV_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "izvSpp"); if (flags & EBC_USER_FLAGS_USE_IZL) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "useIZL"); if (flags & EBC_USER_FLAGS_TIMESTAMP_FIX1) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "timestampFix1"); if (flags & EBC_USER_FLAGS_NO_EU) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "noEu"); } uint32_t EBC_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name) { uint32_t fl=0; int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, name, i, 0); if (!s) break; if (strcasecmp(s, "bankDoesntSign")==0) fl|=EBC_USER_FLAGS_BANK_DOESNT_SIGN; else if (strcasecmp(s, "forceSslv3")==0) fl|=EBC_USER_FLAGS_FORCE_SSLV3; else if (strcasecmp(s, "ini")==0) fl|=EBC_USER_FLAGS_INI; else if (strcasecmp(s, "hia")==0) fl|=EBC_USER_FLAGS_HIA; else if (strcasecmp(s, "clientDataDownloadSpp")==0) fl|=EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP; else if (strcasecmp(s, "prevalidationSpp")==0) fl|=EBC_USER_FLAGS_PREVALIDATION_SPP; else if (strcasecmp(s, "recoverySpp")==0) fl|=EBC_USER_FLAGS_RECOVERY_SPP; else if (strcasecmp(s, "staSpp")==0) fl|=EBC_USER_FLAGS_STA_SPP; else if (strcasecmp(s, "izvSpp")==0) fl|=EBC_USER_FLAGS_IZV_SPP; else if (strcasecmp(s, "useIZL")==0) fl|=EBC_USER_FLAGS_USE_IZL; else if (strcasecmp(s, "timestampFix1")==0) fl|=EBC_USER_FLAGS_TIMESTAMP_FIX1; else if (strcasecmp(s, "noEu")==0) fl|=EBC_USER_FLAGS_NO_EU; else { DBG_WARN(AQEBICS_LOGDOMAIN, "Unknown user flag \"%s\"", s); } } return fl; } void EBC_User_Extend(AB_USER *u, GWEN_UNUSED AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { DBG_INFO(AQEBICS_LOGDOMAIN, "Extending user with mode %d", em); if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { EBC_USER *ue; const char *s; GWEN_NEW_OBJECT(EBC_USER, ue); GWEN_INHERIT_SETDATA(AB_USER, EBC_USER, u, ue, EBC_User_freeData); if (em==AB_ProviderExtendMode_Create) { s=AB_User_GetCountry(u); if (!s || !*s) AB_User_SetCountry(u, "de"); /* some reasonable presets */ ue->protoVersion=strdup("H003"); ue->signVersion=strdup("A005"); ue->cryptVersion=strdup("E002"); ue->authVersion=strdup("X002"); } else { EBC_User_ReadDb(u, db); } } else { if (em==AB_ProviderExtendMode_Add) { } else if (em==AB_ProviderExtendMode_Save) EBC_User_toDb(u, db); } } void GWENHYWFAR_CB EBC_User_freeData(GWEN_UNUSED void *bp, void *p) { EBC_USER *ue; ue=(EBC_USER*)p; free(ue->peerId); free(ue->tokenType); free(ue->tokenName); free(ue->protoVersion); free(ue->signVersion); free(ue->cryptVersion); free(ue->authVersion); free(ue->systemId); free(ue->httpUserAgent); free(ue->httpContentType); free(ue->serverUrl); GWEN_FREE_OBJECT(ue); } void EBC_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db) { EBC_USER *ue; const char *s; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->flags=EBC_User_Flags_fromDb(db, "userFlags"); s=GWEN_DB_GetCharValue(db, "status", 0, "new"); ue->status=EBC_User_Status_fromString(s); /* load server address */ free(ue->serverUrl); s=GWEN_DB_GetCharValue(db, "server", 0, 0); if (s) ue->serverUrl=strdup(s); else ue->serverUrl=NULL; /* get peer id */ free(ue->peerId); s=GWEN_DB_GetCharValue(db, "peerId", 0, 0); if (s) ue->peerId=strdup(s); else ue->peerId=NULL; free(ue->systemId); s=GWEN_DB_GetCharValue(db, "systemId", 0, 0); if (s) ue->systemId=strdup(s); else ue->systemId=NULL; /* setup HTTP version */ ue->httpVMajor=GWEN_DB_GetIntValue(db, "httpVMajor", 0, -1); ue->httpVMinor=GWEN_DB_GetIntValue(db, "httpVMinor", 0, -1); if (ue->httpVMajor==-1 || ue->httpVMinor==-1) { ue->httpVMajor=1; ue->httpVMinor=1; } free(ue->httpUserAgent); s=GWEN_DB_GetCharValue(db, "httpUserAgent", 0, 0); if (s) ue->httpUserAgent=strdup(s); else ue->httpUserAgent=NULL; free(ue->httpContentType); s=GWEN_DB_GetCharValue(db, "httpContentType", 0, "text/xml; charset=UTF-8"); if (s) ue->httpContentType=strdup(s); else ue->httpContentType=NULL; /* setup medium stuff */ free(ue->tokenType); s=GWEN_DB_GetCharValue(db, "tokenType", 0, 0); if (s) ue->tokenType=strdup(s); else ue->tokenType=NULL; free(ue->tokenName); s=GWEN_DB_GetCharValue(db, "tokenName", 0, 0); if (s) ue->tokenName=strdup(s); else ue->tokenName=NULL; free(ue->protoVersion); s=GWEN_DB_GetCharValue(db, "protoVersion", 0, "H002"); if (s) ue->protoVersion=strdup(s); else ue->protoVersion=NULL; free(ue->signVersion); s=GWEN_DB_GetCharValue(db, "signVersion", 0, "A004"); if (s) ue->signVersion=strdup(s); else ue->signVersion=NULL; free(ue->cryptVersion); s=GWEN_DB_GetCharValue(db, "cryptVersion", 0, "E001"); if (s) ue->cryptVersion=strdup(s); else ue->cryptVersion=NULL; free(ue->authVersion); s=GWEN_DB_GetCharValue(db, "authVersion", 0, "X001"); if (s) ue->authVersion=strdup(s); else ue->authVersion=NULL; ue->tokenContextId=GWEN_DB_GetIntValue(db, "tokenContextId", 0, 1); } void EBC_User_toDb(AB_USER *u, GWEN_DB_NODE *db) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); EBC_User_Flags_toDb(db, "userFlags", ue->flags); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "status", EBC_User_Status_toString(ue->status)); if (ue->peerId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "peerId", ue->peerId); if (ue->systemId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "systemId", ue->systemId); /* save crypt token settings */ if (ue->tokenType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenType", ue->tokenType); if (ue->tokenName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenName", ue->tokenName); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tokenContextId", ue->tokenContextId); if (ue->protoVersion) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protoVersion", ue->protoVersion); if (ue->signVersion) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "signVersion", ue->signVersion); if (ue->cryptVersion) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "cryptVersion", ue->cryptVersion); if (ue->authVersion) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "authVersion", ue->authVersion); /* save http settings */ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMajor", ue->httpVMajor); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMinor", ue->httpVMinor); if (ue->httpUserAgent) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpUserAgent", ue->httpUserAgent); if (ue->httpContentType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpContentType", ue->httpContentType); /* save URL */ if (ue->serverUrl) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "server", ue->serverUrl); } const char *EBC_User_GetPeerId(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->peerId; } void EBC_User_SetPeerId(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->peerId); if (s) ue->peerId=strdup(s); else ue->peerId=NULL; } uint32_t EBC_User_GetTokenContextId(const AB_USER *u){ EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->tokenContextId; } void EBC_User_SetTokenContextId(AB_USER *u, uint32_t id){ EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->tokenContextId=id; } const char *EBC_User_GetTokenType(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->tokenType; } void EBC_User_SetTokenType(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->tokenType); if (s) ue->tokenType=strdup(s); else ue->tokenType=NULL; } const char *EBC_User_GetTokenName(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->tokenName; } void EBC_User_SetTokenName(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->tokenName); if (s) ue->tokenName=strdup(s); else ue->tokenName=NULL; } EBC_USER_STATUS EBC_User_GetStatus(const AB_USER *u){ EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->status; } void EBC_User_SetStatus(AB_USER *u, EBC_USER_STATUS i){ EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->status=i; } const char *EBC_User_GetServerUrl(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->serverUrl; } void EBC_User_SetServerUrl(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->serverUrl); if (s) ue->serverUrl=strdup(s); else ue->serverUrl=NULL; } const char *EBC_User_GetSystemId(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->systemId; } void EBC_User_SetSystemId(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->systemId); if (s) ue->systemId=strdup(s); else ue->systemId=NULL; } uint32_t EBC_User_GetFlags(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->flags; } void EBC_User_SetFlags(AB_USER *u, uint32_t flags) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->flags=flags; } void EBC_User_AddFlags(AB_USER *u, uint32_t flags) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->flags|=flags; } void EBC_User_SubFlags(AB_USER *u, uint32_t flags) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->flags&=~flags; } const char *EBC_User_GetHttpUserAgent(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->httpUserAgent; } void EBC_User_SetHttpUserAgent(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->httpUserAgent); if (s) ue->httpUserAgent=strdup(s); else ue->httpUserAgent=NULL; } const char *EBC_User_GetHttpContentType(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->httpContentType; } void EBC_User_SetHttpContentType(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->httpContentType); if (s) ue->httpContentType=strdup(s); else ue->httpContentType=NULL; } int EBC_User_GetHttpVMajor(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->httpVMajor; } void EBC_User_SetHttpVMajor(AB_USER *u, int i) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->httpVMajor=i; } int EBC_User_GetHttpVMinor(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->httpVMinor; } void EBC_User_SetHttpVMinor(AB_USER *u, int i) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); ue->httpVMinor=i; } const char *EBC_User_GetProtoVersion(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->protoVersion; } void EBC_User_SetProtoVersion(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->protoVersion); if (s) ue->protoVersion=strdup(s); else ue->protoVersion=NULL; } const char *EBC_User_GetSignVersion(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->signVersion; } void EBC_User_SetSignVersion(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->signVersion); if (s) ue->signVersion=strdup(s); else ue->signVersion=NULL; } const char *EBC_User_GetCryptVersion(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->cryptVersion; } void EBC_User_SetCryptVersion(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->cryptVersion); if (s) ue->cryptVersion=strdup(s); else ue->cryptVersion=NULL; } const char *EBC_User_GetAuthVersion(const AB_USER *u) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); return ue->authVersion; } void EBC_User_SetAuthVersion(AB_USER *u, const char *s) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); free(ue->authVersion); if (s) ue->authVersion=strdup(s); else ue->authVersion=NULL; } int EBC_User_MkPasswdName(const AB_USER *u, GWEN_BUFFER *buf) { EBC_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, EBC_USER, u); assert(ue); if (ue->tokenType==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Missing tokenType or tokenName"); return GWEN_ERROR_NO_DATA; } if (ue->tokenName) { GWEN_Buffer_AppendString(buf, "PASSWORD_"); GWEN_Buffer_AppendString(buf, ue->tokenType); GWEN_Buffer_AppendString(buf, "_"); GWEN_Buffer_AppendString(buf, ue->tokenName); return 0; } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Missing tokenName"); return GWEN_ERROR_NO_DATA; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/user_p.h0000644000175000017500000000214312364015477023122 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_USER_P_H #define EBC_CLIENT_USER_P_H #include "user_l.h" typedef struct EBC_USER EBC_USER; struct EBC_USER { char *serverUrl; char *peerId; char *tokenType; char *tokenName; uint32_t tokenContextId; char *protoVersion; char *signVersion; char *cryptVersion; char *authVersion; char *systemId; EBC_USER_STATUS status; int httpVMajor; int httpVMinor; char *httpUserAgent; char *httpContentType; uint32_t flags; }; static void GWENHYWFAR_CB EBC_User_freeData(void *bp, void *p); static void EBC_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db); static void EBC_User_toDb(AB_USER *u, GWEN_DB_NODE *db); #endif /* EBC_CLIENT_USER_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/provider_l.h0000644000175000017500000001157212364015477024000 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_CLIENT_PROVIDER_L_H #define AQEBICS_CLIENT_PROVIDER_L_H #include "provider.h" #include "dialog_l.h" #include int EBC_Provider_XchgIniRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgHiaRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgPubRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *signVersion); int EBC_Provider_XchgHpbRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgHpdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgHkdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgHtdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u); int EBC_Provider_XchgStaRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, AB_IMEXPORTER_CONTEXT *ctx); int EBC_Provider_SignMessage(AB_PROVIDER *pro, EB_MSG *msg, AB_USER *u, xmlNodePtr node); int EBC_Provider_ExtractSessionKey(AB_PROVIDER *pro, AB_USER *u, xmlNodePtr node, GWEN_CRYPT_KEY **pKey); int EBC_Provider_DecryptData(AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_KEY *skey, const uint8_t *p, uint32_t len, GWEN_BUFFER *msgBuffer); int EBC_Provider_EncryptData(AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_KEY *skey, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *sbuf); int EBC_Provider_EncryptKey(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf); int EBC_Provider_GenerateNonce(AB_PROVIDER *pro, GWEN_BUFFER *buf); int EBC_Provider_GenerateTimeStamp(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf); int EBC_Provider_Generate_OrderId(AB_PROVIDER *pro, GWEN_BUFFER *buf); int EBC_Provider_MountToken(AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_TOKEN **pCt, const GWEN_CRYPT_TOKEN_CONTEXT **pCtx); GWEN_LOGGER_LEVEL EBC_Provider_ResultCodeToLogLevel(AB_PROVIDER *pro, const char *s); void EBC_Provider_LogRequestResults(AB_PROVIDER *pro, EB_MSG *mRsp, GWEN_BUFFER *logbuf); int EBC_Provider_MkDownloadInitRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, EB_MSG **pMsg); int EBC_Provider_MkDownloadTransferRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int segmentNumber, EB_MSG **pMsg); int EBC_Provider_MkDownloadReceiptRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int receiptCode, EB_MSG **pMsg); int EBC_Provider_XchgDownloadRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime); int EBC_Provider_MkUploadInitRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_CRYPT_KEY *skey, const char *pEu, uint32_t dlen, EB_MSG **pMsg); int EBC_Provider_MkUploadTransferRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, const char *pData, uint32_t lData, int segmentNumber, int isLast, EB_MSG **pMsg); int EBC_Provider_XchgUploadRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const uint8_t *pData, uint32_t lData); int EBC_Provider_MkEuCryptZipDoc(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf); int EBC_Provider_FillDataEncryptionInfoNode(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, xmlNodePtr node); int EBC_Provider_Sha256(const uint8_t *pData, uint32_t lData, GWEN_BUFFER *hbuf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/account.c0000644000175000017500000001004512364015477023254 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "account_p.h" #include "provider_l.h" #include #include #include #include GWEN_INHERIT(AB_ACCOUNT, EBC_ACCOUNT) void EBC_Account_Extend(AB_ACCOUNT *a, GWEN_UNUSED AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { EBC_ACCOUNT *ae; GWEN_NEW_OBJECT(EBC_ACCOUNT, ae); GWEN_INHERIT_SETDATA(AB_ACCOUNT, EBC_ACCOUNT, a, ae, EBC_Account_freeData); if (em==AB_ProviderExtendMode_Create) { } else { EBC_Account_ReadDb(a, db); } } else { if (em==AB_ProviderExtendMode_Add) { } else if (em==AB_ProviderExtendMode_Save) { EBC_Account_toDb(a, db); } /* if save */ } } void GWENHYWFAR_CB EBC_Account_freeData(GWEN_UNUSED void *bp, void *p) { EBC_ACCOUNT *ae; ae=(EBC_ACCOUNT*)p; free(ae->ebicsId); GWEN_FREE_OBJECT(ae); } void EBC_Account_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags) { GWEN_DB_DeleteVar(db, name); if (flags & EBC_ACCOUNT_FLAGS_STA_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "staSpp"); if (flags & EBC_ACCOUNT_FLAGS_IZV_SPP) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "izvSpp"); } uint32_t EBC_Account_Flags_fromDb(GWEN_DB_NODE *db, const char *name){ uint32_t fl=0; int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, name, i, 0); if (!s) break; if (strcasecmp(s, "staSpp")==0) fl|=EBC_ACCOUNT_FLAGS_STA_SPP; else if (strcasecmp(s, "izvSpp")==0) fl|=EBC_ACCOUNT_FLAGS_IZV_SPP; else { DBG_WARN(AQEBICS_LOGDOMAIN, "Unknown user flag \"%s\"", s); } } return fl; } void EBC_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db) { EBC_ACCOUNT *ae; const char *s; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); ae->flags=EBC_Account_Flags_fromDb(db, "accountFlags"); free(ae->ebicsId); s=GWEN_DB_GetCharValue(db, "ebicsId", 0, 0); if (s) ae->ebicsId=strdup(s); else ae->ebicsId=NULL; } void EBC_Account_toDb(AB_ACCOUNT *a, GWEN_DB_NODE *db) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); EBC_Account_Flags_toDb(db, "accountFlags", ae->flags); if (ae->ebicsId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "ebicsId", ae->ebicsId); } const char *EBC_Account_GetEbicsId(const AB_ACCOUNT *a) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); return ae->ebicsId; } void EBC_Account_SetEbicsId(AB_ACCOUNT *a, const char *s) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); free(ae->ebicsId); if (s) ae->ebicsId=strdup(s); else ae->ebicsId=NULL; } uint32_t EBC_Account_GetFlags(const AB_ACCOUNT *a) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); return ae->flags; } void EBC_Account_SetFlags(AB_ACCOUNT *a, uint32_t flags) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); ae->flags=flags; } void EBC_Account_AddFlags(AB_ACCOUNT *a, uint32_t flags) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); ae->flags|=flags; } void EBC_Account_SubFlags(AB_ACCOUNT *a, uint32_t flags) { EBC_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, EBC_ACCOUNT, a); assert(ae); ae->flags&=~flags; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hpd.c0000644000175000017500000000442612364015477022722 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgHpdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { int rv; GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, "HPD", buf, 0, NULL, NULL); if (rv<0 || rv>=300) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } else { xmlDocPtr orderDoc=NULL; xmlNodePtr root_node=NULL; xmlNodePtr node=NULL; xmlNodePtr nodeX=NULL; const char *s; uint32_t uflags=0; /* parse XML document */ rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf), &orderDoc); GWEN_Buffer_free(buf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get keys */ root_node=xmlDocGetRootElement(orderDoc); /* get auth key */ node=EB_Xml_GetNode(root_node, "ProtocolParams", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No ProtocolParams found"); xmlFreeDoc(orderDoc); return GWEN_ERROR_BAD_DATA; } nodeX=EB_Xml_GetNode(node, "ClientDataDownload", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nodeX) { s=(const char*)xmlGetProp(nodeX, BAD_CAST "supported"); if (s && strcasecmp(s, "true")==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Client data download supported"); uflags|=EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP; } } nodeX=EB_Xml_GetNode(node, "PreValidation", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nodeX) { s=(const char*)xmlGetProp(nodeX, BAD_CAST "supported"); if (s && strcasecmp(s, "true")==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Prevalidation supported"); uflags|=EBC_USER_FLAGS_PREVALIDATION_SPP; } } nodeX=EB_Xml_GetNode(node, "Recovery", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nodeX) { s=(const char*)xmlGetProp(nodeX, BAD_CAST "supported"); if (s && strcasecmp(s, "true")==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Recovery supported"); uflags|=EBC_USER_FLAGS_RECOVERY_SPP; } } EBC_User_AddFlags(u, uflags); xmlFreeDoc(orderDoc); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_download_h003.c0000644000175000017500000004354712364015477024517 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include static int EBC_Provider_MkDownloadInitRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; xmlNodePtr nodeXXX = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Nonce", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Timestamp", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "UserID", BAD_CAST userId); /* order details */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderDetails", NULL); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderType", BAD_CAST requestType); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "DZHNN"); nodeXXX=xmlNewChild(nodeXX, NULL, BAD_CAST "StandardOrderParams", NULL); if (fromTime || toTime) { xmlNodePtr nodeXXXX; GWEN_TIME *tempTime=NULL; const GWEN_TIME *t1; const GWEN_TIME *t2; t1=fromTime; t2=toTime; if (t1==NULL) /* no fromDate, use toDate for both */ t1=t2; if (t2==NULL) { /* no toDate, use current date */ tempTime=GWEN_CurrentTime(); t2=tempTime; } nodeXXXX=xmlNewChild(nodeXXX, NULL, BAD_CAST "DateRange", NULL); if (t1) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Time_toString(t1, "YYYY-MM-DD", tbuf); xmlNewTextChild(nodeXXXX, NULL, BAD_CAST "Start", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } if (t2) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Time_toString(t2, "YYYY-MM-DD", tbuf); xmlNewTextChild(nodeXXXX, NULL, BAD_CAST "End", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } if (tempTime) GWEN_Time_free(tempTime); } /* bank pubkey digests */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "BankPubKeyDigests", NULL); rv=EBC_Provider_AddBankPubKeyDigests(pro, u, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* security medium */ xmlNewTextChild(nodeX, NULL, BAD_CAST "SecurityMedium", BAD_CAST "0000"); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Initialisation"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkDownloadTransferRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int segmentNumber, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr sigNode = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Transfer"); EB_Msg_SetIntValue(msg, "header/mutable/SegmentNumber", segmentNumber); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkDownloadReceiptRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int receiptCode, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr sigNode = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Receipt"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "TransferReceipt", NULL); xmlNewProp(nodeX, BAD_CAST "authenticate", BAD_CAST "true"); EB_Msg_SetIntValue(msg, "body/TransferReceipt/ReceiptCode", receiptCode); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } int EBC_Provider_XchgDownloadRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; EB_MSG *msg=NULL; EB_MSG *mRsp; EB_RC rc; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create initialisation request */ rv=EBC_Provider_MkDownloadInitRequest_H003(pro, sess, u, requestType, fromTime, toTime, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { EB_Msg_free(mRsp); if (rc==0x090005) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No download data"); return GWEN_ERROR_NO_DATA; } else if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Security error (%06x)", rc); return AB_ERROR_SECURITY; } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Generic error (%06x)", rc); return GWEN_ERROR_GENERIC; } } else { DBG_NOTICE(AQEBICS_LOGDOMAIN, "Response: (%06x)", rc); } } if (1) { xmlNodePtr node=NULL; GWEN_CRYPT_KEY *skey=NULL; GWEN_BUFFER *buf1; GWEN_BUFFER *dbuffer; int segmentNumber; int segmentCount; const char *s; char transactionId[36]; /* extract keys and store them */ node=EB_Xml_GetNode(EB_Msg_GetRootNode(mRsp), "body/DataTransfer/DataEncryptionInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing session key"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=EBC_Provider_ExtractSessionKey(pro, u, node, &skey); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } DBG_INFO(AQEBICS_LOGDOMAIN, "Got session key"); s=EB_Msg_GetCharValue(mRsp, "header/static/TransactionID", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return rv; } strncpy(transactionId, s, sizeof(transactionId)-1); segmentCount=EB_Msg_GetIntValue(mRsp, "header/static/NumSegments", 0); if (segmentCount==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return rv; } dbuffer=GWEN_Buffer_new(0, 1024, 0, 1); segmentNumber=1; for (;;) { int i; i=EB_Msg_GetIntValue(mRsp, "header/mutable/SegmentNumber", 0); if (i!=segmentNumber) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unexpected segment number (%d, expected %d)", i, segmentNumber); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } /* read next chunk of data */ s=EB_Msg_GetCharValue(mRsp, "body/DataTransfer/OrderData", NULL); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(dbuffer, s); if (segmentNumber>=segmentCount) { DBG_INFO(AQEBICS_LOGDOMAIN, "Transfer finished"); break; } /* exchange next message */ segmentNumber++; rv=EBC_Provider_MkDownloadTransferRequest_H003(pro, sess, u, transactionId, segmentNumber, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return AB_ERROR_SECURITY; } } EB_Msg_free(mRsp); /* BASE64-decode receiced data */ s=GWEN_Buffer_GetStart(dbuffer); if (*s==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return GWEN_ERROR_BAD_DATA; } buf1=GWEN_Buffer_new(0, strlen(s), 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode OrderData (%d)", rv); GWEN_Buffer_free(buf1); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } GWEN_Buffer_free(dbuffer); /* decrypt/unzip data */ rv=EBC_Provider_DecryptData(pro, u, skey, (const uint8_t*)GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetUsedBytes(buf1), targetBuffer); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decrypt OrderData (%d)", rv); GWEN_Buffer_free(buf1); GWEN_Crypt_Key_free(skey); return rv; } GWEN_Crypt_Key_free(skey); /*DBG_ERROR(0, "Got this data:"); GWEN_Buffer_Dump(targetBuffer, stderr, 2);*/ /* send receipt message */ rv=EBC_Provider_MkDownloadReceiptRequest_H003(pro, sess, u, transactionId, withReceipt?0:1, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } EB_Msg_free(mRsp); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/Makefile.in0000644000175000017500000006770512643540056023534 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testlib$(EXEEXT) subdir = src/plugins/backends/aqebics/plugin/client DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libclient_la_LIBADD = am_libclient_la_OBJECTS = account.lo user.lo context.lo dialog.lo \ provider.lo queues.lo libclient_la_OBJECTS = $(am_libclient_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = PROGRAMS = $(noinst_PROGRAMS) testlib_SOURCES = testlib.c testlib_OBJECTS = testlib.$(OBJEXT) testlib_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libclient_la_SOURCES) testlib.c DIST_SOURCES = $(libclient_la_SOURCES) testlib.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(srcdir)/.. -I$(top_builddir) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) AM_CFLAGS = -DBUILDING_AQEBICS @visibility_cflags@ typefiles = context.xml noinst_LTLIBRARIES = libclient.la extra_sources = \ p_encipher.c \ p_encipher_e001.c \ p_encipher_e002.c \ p_decipher.c \ p_eu.c \ p_eu_a004.c \ p_eu_a005.c \ p_sign.c \ p_sign_x001.c \ p_sign_x002.c \ p_tools.c \ r_hia.c \ r_hia_h002.c \ r_hia_h003.c \ r_hpb.c \ r_hpb_h002.c \ r_hpb_h003.c \ r_hpd.c \ r_hkd.c \ r_htd.c \ r_ini.c \ r_ini_h002.c \ r_ini_h003.c \ r_download.c \ r_download_h002.c \ r_download_h003.c \ r_sta.c \ r_upload.c \ r_upload_h002.c \ r_upload_h003.c \ r_pub.c \ r_pub_h002.c \ r_pub_h003.c EXTRA_DIST = $(typefiles) $(extra_sources) noinst_HEADERS = \ account_l.h \ account_p.h \ context_l.h \ context_p.h \ dialog_l.h \ dialog_p.h \ provider_l.h \ provider_p.h \ queues_l.h \ queues_p.h \ user_l.h \ user_p.h iheaderdir = ${includedir}/aqebics/client iheader_HEADERS = \ account.h \ provider.h \ user.h libclient_la_SOURCES = \ account.c \ user.c \ context.c \ dialog.c \ provider.c \ queues.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/client/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/client/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libclient.la: $(libclient_la_OBJECTS) $(libclient_la_DEPENDENCIES) $(EXTRA_libclient_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libclient_la_OBJECTS) $(libclient_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testlib$(EXEEXT): $(testlib_OBJECTS) $(testlib_DEPENDENCIES) $(EXTRA_testlib_DEPENDENCIES) @rm -f testlib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testlib_OBJECTS) $(testlib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/account.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS #types: $(typefiles) # typemaker -d static $(typefiles) types: $(typefiles) typemaker $(typefiles) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libclient_la_SOURCES) $(EXTRA_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_encipher.c0000644000175000017500000000301312364015477023731 00000000000000/*************************************************************************** begin : Thu May 15 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int EBC_Provider_EncryptData(AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_KEY *skey, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *sbuf) { const char *s; s=EBC_User_GetCryptVersion(u); if (!(s && *s)) s="E001"; if (strcasecmp(s, "E001")==0) return EBC_Provider_EncryptData_E001(pro, skey, pData, lData, sbuf); else if (strcasecmp(s, "E002")==0) return EBC_Provider_EncryptData_E002(pro, skey, pData, lData, sbuf); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Version [%s] not supported", s); return GWEN_ERROR_BAD_DATA; } } int EBC_Provider_EncryptKey(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { const char *s; s=EBC_User_GetCryptVersion(u); if (!(s && *s)) s="E001"; if (strcasecmp(s, "E001")==0) return EBC_Provider_EncryptKey_E001(pro, u, skey, sbuf); else if (strcasecmp(s, "E002")==0) return EBC_Provider_EncryptKey_E002(pro, u, skey, sbuf); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Version [%s] not supported", s); return GWEN_ERROR_BAD_DATA; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/queues_p.h0000644000175000017500000000147612364015477023463 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_QUEUES_P_H #define AO_QUEUES_P_H #include "queues_l.h" #include "context_l.h" struct EBC_QUEUE { EBC_USERQUEUE_LIST *userQueues; }; struct EBC_USERQUEUE { GWEN_LIST_ELEMENT(EBC_USERQUEUE) AB_USER *user; EBC_ACCOUNTQUEUE_LIST *accountQueues; }; struct EBC_ACCOUNTQUEUE { GWEN_LIST_ELEMENT(EBC_ACCOUNTQUEUE) AB_ACCOUNT *account; EBC_CONTEXT_LIST *contexts; }; #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_decipher.c0000644000175000017500000002611112364015477023723 00000000000000/*************************************************************************** begin : Fri Feb 29 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #include "msg/zip.h" #include "msg/keys.h" #include #include int EBC_Provider_ExtractSessionKey(AB_PROVIDER *pro, AB_USER *u, xmlNodePtr node, GWEN_CRYPT_KEY **pKey) { const char *s; GWEN_BUFFER *d64buf; int rv; GWEN_CRYPT_KEY *key; xmlNodePtr nodeX; xmlChar *prop; GWEN_BUFFER *keyBuffer; GWEN_BUFFER *dkbuf; uint32_t l; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; uint32_t kid; GWEN_CRYPT_PADDALGO *algo; int ksize; int kversion=0; /* get pubkey digest node */ nodeX=EB_Xml_GetNode(node, "EncryptionPubKeyDigest", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nodeX==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No pubkey digest"); return GWEN_ERROR_BAD_DATA; } /* check version */ s=EBC_User_GetCryptVersion(u); if (!(s && *s)) s="E001"; prop=xmlGetProp(nodeX, BAD_CAST "Version"); if (prop==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No \"Version\" in pubkey digest"); return GWEN_ERROR_BAD_DATA; } if (strcasecmp(s, (const char*)prop)!=0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unexpected crypt version in pubkey digest"); xmlFree(prop); return GWEN_ERROR_BAD_DATA; } if (strcasecmp((const char*)prop, "E001")==0) { xmlFree(prop); /* check digest algo */ prop=xmlGetProp(nodeX, BAD_CAST "Algorithm"); if (prop==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No \"Algorithm\" in pubkey digest"); return GWEN_ERROR_BAD_DATA; } if (strcasecmp((const char*)prop, "http://www.w3.org/2000/09/xmldsig#sha1")!=0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Unexpected digest algo [%s]", prop); xmlFree(prop); return GWEN_ERROR_BAD_DATA; } xmlFree(prop); kversion=1; } else if (strcasecmp((const char*)prop, "E002")==0) { xmlFree(prop); /* check digest algo */ prop=xmlGetProp(nodeX, BAD_CAST "Algorithm"); if (prop==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No \"Algorithm\" in pubkey digest"); return GWEN_ERROR_BAD_DATA; } if (strcasecmp((const char*)prop, "http://www.w3.org/2001/04/xmlenc#sha256")!=0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Unexpected digest algo [%s]", prop); xmlFree(prop); return GWEN_ERROR_BAD_DATA; } xmlFree(prop); kversion=2; } else { DBG_INFO(AQEBICS_LOGDOMAIN, "Unexpected crypt version [%s]", prop); xmlFree(prop); return GWEN_ERROR_BAD_DATA; } /* get pubkey digest */ s=EB_Xml_GetCharValue(node, "EncryptionPubKeyDigest", NULL); assert(s); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No pubkey digest"); return GWEN_ERROR_BAD_DATA; } /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key */ kid=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (kid) ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT, 0); if (ki==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Crypt key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Crypt key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); /* create hash for our own pub crypt key */ d64buf=GWEN_Buffer_new(0, 256, 0, 1); if (kversion==1) { EB_Key_Info_BuildHashSha1(ki, d64buf, 1); /* compare hashes */ if (strcasecmp(s, GWEN_Buffer_GetStart(d64buf))!=0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Pubkey digest does not match"); GWEN_Buffer_free(d64buf); return GWEN_ERROR_NO_KEY; } GWEN_Buffer_free(d64buf); /* get transaction key */ s=EB_Xml_GetCharValue(node, "TransactionKey", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No transaction key"); return GWEN_ERROR_BAD_DATA; } /* decode transaction key */ keyBuffer=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, keyBuffer); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode transaction key (%d)", rv); GWEN_Buffer_free(keyBuffer); return rv; } /* decrypt session key */ dkbuf=GWEN_Buffer_new(0, ksize+16, 0, 1); /* select padd algo */ ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); l=GWEN_Buffer_GetMaxUnsegmentedWrite(dkbuf); rv=GWEN_Crypt_Token_Decipher(ct, kid, algo, (const uint8_t*)GWEN_Buffer_GetStart(keyBuffer), GWEN_Buffer_GetUsedBytes(keyBuffer), (uint8_t*)GWEN_Buffer_GetStart(dkbuf), &l, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dkbuf); GWEN_Buffer_free(keyBuffer); return rv; } GWEN_Buffer_IncrementPos(dkbuf, l); GWEN_Buffer_AdjustUsedBytes(dkbuf); GWEN_Buffer_free(keyBuffer); /* check size of session key */ if (l!=16) { DBG_INFO(AQEBICS_LOGDOMAIN, "keysize!=16 (%d)", (int)l); GWEN_Buffer_free(dkbuf); return GWEN_ERROR_INTERNAL; } if (GWEN_Logger_GetLevel(AQEBICS_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) { DBG_DEBUG(AQEBICS_LOGDOMAIN, "Decrypted session key:"); GWEN_Buffer_Dump(dkbuf, 2); } /* create DES key */ key=GWEN_Crypt_KeyDes3K_fromData(GWEN_Crypt_CryptMode_Cbc, 16, (const uint8_t*)GWEN_Buffer_GetStart(dkbuf), GWEN_Buffer_GetUsedBytes(dkbuf)); if (key==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not create DES key from data"); GWEN_Buffer_free(dkbuf); return GWEN_ERROR_INTERNAL; } GWEN_Buffer_free(dkbuf); *pKey=key; } else if (kversion==2) { EB_Key_Info_BuildHashSha256(ki, d64buf, 1); /* compare hashes */ if (strcasecmp(s, GWEN_Buffer_GetStart(d64buf))!=0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Pubkey digest does not match"); GWEN_Buffer_free(d64buf); return GWEN_ERROR_NO_KEY; } GWEN_Buffer_free(d64buf); /* get transaction key */ s=EB_Xml_GetCharValue(node, "TransactionKey", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "No transaction key"); return GWEN_ERROR_BAD_DATA; } /* decode transaction key */ keyBuffer=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, keyBuffer); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode transaction key (%d)", rv); GWEN_Buffer_free(keyBuffer); return rv; } /* decrypt session key */ dkbuf=GWEN_Buffer_new(0, ksize+16, 0, 1); /* select padd algo */ ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); l=GWEN_Buffer_GetMaxUnsegmentedWrite(dkbuf); rv=GWEN_Crypt_Token_Decipher(ct, kid, algo, (const uint8_t*)GWEN_Buffer_GetStart(keyBuffer), GWEN_Buffer_GetUsedBytes(keyBuffer), (uint8_t*)GWEN_Buffer_GetStart(dkbuf), &l, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dkbuf); GWEN_Buffer_free(keyBuffer); return rv; } GWEN_Buffer_IncrementPos(dkbuf, l); GWEN_Buffer_AdjustUsedBytes(dkbuf); GWEN_Buffer_free(keyBuffer); /* check size of session key */ if (l!=16) { DBG_INFO(AQEBICS_LOGDOMAIN, "keysize!=16 (%d)", (int)l); GWEN_Buffer_free(dkbuf); return GWEN_ERROR_INTERNAL; } if (GWEN_Logger_GetLevel(AQEBICS_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) { DBG_DEBUG(AQEBICS_LOGDOMAIN, "Decrypted session key:"); GWEN_Buffer_Dump(dkbuf, 2); } /* create DES key */ key=GWEN_Crypt_KeyAes128_fromData(GWEN_Crypt_CryptMode_Cbc, 16, (const uint8_t*)GWEN_Buffer_GetStart(dkbuf), GWEN_Buffer_GetUsedBytes(dkbuf)); if (key==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not create AES-128 key from data"); GWEN_Buffer_free(dkbuf); return GWEN_ERROR_INTERNAL; } GWEN_Buffer_free(dkbuf); *pKey=key; } return 0; } int EBC_Provider_DecryptData(GWEN_UNUSED AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_KEY *skey, const uint8_t *p, uint32_t len, GWEN_BUFFER *msgBuffer) { GWEN_BUFFER *tbuf; uint32_t l; int rv; const char *s; DBG_DEBUG(AQEBICS_LOGDOMAIN, "Deciphering %d bytes of data", len); s=EBC_User_GetCryptVersion(u); if (!(s && *s)) s="E001"; if (strcasecmp(s, "E001")==0) { /* decrypt message with session key */ tbuf=GWEN_Buffer_new(0, len+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(tbuf); /* reset IV */ GWEN_Crypt_KeyDes3K_SetIV(skey, NULL, 0); /* now decrypt */ rv=GWEN_Crypt_Key_Decipher(skey, p, len, (uint8_t*)GWEN_Buffer_GetPosPointer(tbuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Error deciphering %d bytes of data here (%d)", (int)len, rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_IncrementPos(tbuf, l); GWEN_Buffer_AdjustUsedBytes(tbuf); /* unpadd message */ rv=GWEN_Padd_UnpaddWithAnsiX9_23(tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* unzip */ rv=EB_Zip_Inflate(GWEN_Buffer_GetStart(tbuf), l, msgBuffer); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unzip doc (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); } else if (strcasecmp(s, "E002")==0) { /* decrypt message with session key */ tbuf=GWEN_Buffer_new(0, len+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(tbuf); /* reset IV */ GWEN_Crypt_KeyAes128_SetIV(skey, NULL, 0); /* now decrypt */ rv=GWEN_Crypt_Key_Decipher(skey, p, len, (uint8_t*)GWEN_Buffer_GetPosPointer(tbuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Error deciphering %d bytes of data here (%d)", (int)len, rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_IncrementPos(tbuf, l); GWEN_Buffer_AdjustUsedBytes(tbuf); /* unpadd message */ rv=GWEN_Padd_UnpaddWithAnsiX9_23FromMultipleOf(tbuf, 16); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* unzip */ rv=EB_Zip_Inflate(GWEN_Buffer_GetStart(tbuf), l, msgBuffer); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unzip doc (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hia.c0000644000175000017500000000125612364015477022706 00000000000000 #include "aqebics_l.h" #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include #include int EBC_Provider_XchgHiaRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { const char *s; s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgHiaRequest_H002(pro, sess, u); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgHiaRequest_H003(pro, sess, u); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Proto version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hkd.c0000644000175000017500000001651412364015477022716 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgHkdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { int rv; GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, "HKD", buf, 0, NULL, NULL); if (rv<0 || rv>=300) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } else { xmlDocPtr orderDoc=NULL; xmlNodePtr root_node=NULL; xmlNodePtr node=NULL; xmlNodePtr nodeX=NULL; GWEN_DB_NODE *dbAll; GWEN_DB_NODE *db; /* parse XML document */ rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf), &orderDoc); GWEN_Buffer_free(buf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get keys */ root_node=xmlDocGetRootElement(orderDoc); /* get auth key */ node=EB_Xml_GetNode(root_node, "PartnerInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No PartnerInfo found"); xmlFreeDoc(orderDoc); return GWEN_ERROR_BAD_DATA; } dbAll=GWEN_DB_Group_new("HKDResponse"); /* sample accounts */ nodeX=node->children; while(nodeX) { if (nodeX->type==XML_ELEMENT_NODE) { if (nodeX->name && strcmp((const char*)nodeX->name, "AccountInfo")==0) { xmlChar *xs; xmlNodePtr nodeXX; DBG_DEBUG(AQEBICS_LOGDOMAIN, "Reading AccountInfo node"); db=GWEN_DB_GetGroup(dbAll, GWEN_PATH_FLAGS_CREATE_GROUP, "Account"); xs=xmlGetProp(nodeX, BAD_CAST "ID"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "EbicsId", (const char*)xs); xmlFree(xs); } xs=xmlGetProp(nodeX, BAD_CAST "Currency"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Currency", (const char*)xs); xmlFree(xs); } xs=xmlGetProp(nodeX, BAD_CAST "Description"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "AccountName", (const char*)xs); xmlFree(xs); } nodeXX=nodeX->children; while (nodeXX) { if (nodeXX->type==XML_ELEMENT_NODE && nodeXX->name) { if (strcmp((const char*)nodeXX->name, "AccountNumber")==0) { xs=xmlGetProp(nodeXX, BAD_CAST "international"); if (xs) { xmlNodePtr nodeXXX=NULL; if (strcasecmp((const char*)xs, "false")==0) { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "AccountNumber", (const char*)nodeXXX->content); } } else { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "IBAN", (const char*)nodeXXX->content); } } xmlFree(xs); } } else if (strcmp((const char*)nodeXX->name, "NationalAccountNumber")==0) { xmlNodePtr nodeXXX=NULL; nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "AccountNumber", (const char*)nodeXXX->content); } } else if (strcmp((const char*)nodeXX->name, "BankCode")==0) { xs=xmlGetProp(nodeXX, BAD_CAST "international"); if (xs) { xmlNodePtr nodeXXX=NULL; if (strcasecmp((const char*)xs, "false")==0) { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "BankCode", (const char*)nodeXXX->content); } } else { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "BIC", (const char*)nodeXXX->content); } } xmlFree(xs); } } else if (strcmp((const char*)nodeXX->name, "NationalBankCode")==0) { xmlNodePtr nodeXXX=NULL; nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "BankCode", (const char*)nodeXXX->content); } } else if (strcmp((const char*)nodeXX->name, "AccountHolder")==0) { xmlNodePtr nodeXXX=NULL; nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "owner", (const char*)nodeXXX->content); } } } nodeXX=nodeXX->next; } } } nodeX=nodeX->next; } /* add all accounts which are complete */ db=GWEN_DB_FindFirstGroup(dbAll, "Account"); while(db) { const char *ebicsId; const char *bankCode; const char *accountNumber; const char *owner; const char *descr; const char *currency; const char *bic; const char *iban; AB_ACCOUNT *a=NULL; ebicsId=GWEN_DB_GetCharValue(db, "ebicsId", 0, NULL); bankCode=GWEN_DB_GetCharValue(db, "bankCode", 0, NULL); accountNumber=GWEN_DB_GetCharValue(db, "accountNumber", 0, NULL); owner=GWEN_DB_GetCharValue(db, "owner", 0, NULL); if (owner==NULL) owner=AB_User_GetUserName(u); descr=GWEN_DB_GetCharValue(db, "accountName", 0, NULL); currency=GWEN_DB_GetCharValue(db, "currency", 0, NULL); if (currency==NULL) currency="EUR"; iban=GWEN_DB_GetCharValue(db, "IBAN", 0, NULL); bic=GWEN_DB_GetCharValue(db, "BIC", 0, NULL); if (bankCode && accountNumber) a=AB_Banking_FindAccount(AB_Provider_GetBanking(pro), "aqebics", "de", bankCode, accountNumber, "*"); else if (iban) a=AB_Banking_GetAccountByIban(AB_Provider_GetBanking(pro), iban); if (!a) { char lbuf[256]; DBG_INFO(AQEBICS_LOGDOMAIN, "Adding account %s / %s", bankCode, accountNumber); snprintf(lbuf, sizeof(lbuf)-1, I18N("Adding account %s /%s"), bankCode, accountNumber); lbuf[sizeof(lbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, lbuf); a=AB_Banking_CreateAccount(AB_Provider_GetBanking(pro), "aqebics"); assert(a); AB_Account_SetAccountType(a, AB_AccountType_Bank); AB_Account_SetBankCode(a, bankCode); AB_Account_SetAccountNumber(a, accountNumber); if (descr) AB_Account_SetAccountName(a, descr); if (owner) AB_Account_SetOwnerName(a, owner); if (currency) AB_Account_SetCurrency(a, currency); AB_Account_SetCountry(a, "de"); if (iban) AB_Account_SetIBAN(a, iban); if (bic) AB_Account_SetBIC(a, bic); if (ebicsId) EBC_Account_SetEbicsId(a, ebicsId); AB_Account_SetUser(a, u); AB_Account_SetSelectedUser(a, u); rv=AB_Banking_AddAccount(AB_Provider_GetBanking(pro), a); if (rv<0) { DBG_WARN(AQEBICS_LOGDOMAIN, "Could not add account %s / %s (%d)", bankCode, accountNumber, rv); } } else { char lbuf[256]; DBG_INFO(AQEBICS_LOGDOMAIN, "Account %s / %s already exists", bankCode, accountNumber); snprintf(lbuf, sizeof(lbuf)-1, I18N("Account %s / %s already exists"), bankCode, accountNumber); lbuf[sizeof(lbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, lbuf); } db=GWEN_DB_FindNextGroup(db, "Account"); } xmlFreeDoc(orderDoc); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hia_h002.c0000644000175000017500000001725712364015477023447 00000000000000 #include "aqebics_l.h" #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include #include int EBC_Provider_XchgHiaRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *cryptKeyInfo=NULL; const GWEN_CRYPT_TOKEN_KEYINFO *authKeyInfo=NULL; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; GWEN_BUFFER *mbuf; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (kid) { cryptKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (cryptKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Crypt key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Crypt key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } /* get auth sign key info */ kid=GWEN_Crypt_Token_Context_GetAuthSignKeyId(ctx); if (kid) { authKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (authKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Auth key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Auth key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } /* create HIARequestOrderData */ doc=xmlNewDoc(BAD_CAST "1.0"); doc->encoding=xmlCharStrdup("UTF-8"); root_node=xmlNewNode(NULL, BAD_CAST "HIARequestOrderData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_orders.xsd"); /* create auth key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "AuthenticationPubKeyInfo", NULL); rv=EB_Key_Info_toXml(authKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return GWEN_ERROR_INVALID; } xmlNewChild(node, NULL, BAD_CAST "AuthenticationVersion", BAD_CAST "X001"); /* create crypt key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "EncryptionPubKeyInfo", NULL); rv=EB_Key_Info_toXml(cryptKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return rv; } xmlNewChild(node, NULL, BAD_CAST "EncryptionVersion", BAD_CAST "E001"); /* store partner id and user id */ node=xmlNewChild(root_node, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); node=xmlNewChild(root_node, NULL, BAD_CAST "UserID", BAD_CAST userId); /* compress and base64 doc */ mbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=EB_Xml_Compress64Doc(doc, mbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error compressing/encoding doc (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsUnsecuredRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "HIA"); tbuf=GWEN_Buffer_new(0, 16, 0, 1); rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_Buffer_free(mbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderID", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZNNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0200"); EB_Msg_SetCharValue(msg, "body/DataTransfer/OrderData", GWEN_Buffer_GetStart(mbuf)); GWEN_Buffer_free(mbuf); /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); EBC_User_AddFlags(u, EBC_USER_FLAGS_HIA); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Init2); else EBC_User_SetStatus(u, EBC_UserStatus_Init1); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/provider.c0000644000175000017500000013412412364015477023457 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "provider_p.h" #include "aqebics_l.h" #include "user_l.h" #include "account_l.h" #include "msg/xml.h" #include "msg/keys.h" #include "dialogs/dlg_edituser_l.h" #include "dialogs/dlg_newkeyfile_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_PROVIDER, EBC_PROVIDER) AB_PROVIDER *EBC_Provider_new(AB_BANKING *ab){ AB_PROVIDER *pro; EBC_PROVIDER *dp; pro=AB_Provider_new(ab, "aqebics"); GWEN_NEW_OBJECT(EBC_PROVIDER, dp); GWEN_INHERIT_SETDATA(AB_PROVIDER, EBC_PROVIDER, pro, dp, EBC_Provider_FreeData); dp->bankingJobs=AB_Job_List2_new(); dp->queue=EBC_Queue_new(); AB_Provider_SetInitFn(pro, EBC_Provider_Init); AB_Provider_SetFiniFn(pro, EBC_Provider_Fini); AB_Provider_SetUpdateJobFn(pro, EBC_Provider_UpdateJob); AB_Provider_SetAddJobFn(pro, EBC_Provider_AddJob); AB_Provider_SetExecuteFn(pro, EBC_Provider_Execute); AB_Provider_SetResetQueueFn(pro, EBC_Provider_ResetQueue); AB_Provider_SetExtendUserFn(pro, EBC_Provider_ExtendUser); AB_Provider_SetExtendAccountFn(pro, EBC_Provider_ExtendAccount); AB_Provider_SetGetEditUserDialogFn(pro, EBC_Provider_GetEditUserDialog); AB_Provider_AddFlags(pro, AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG); AB_Provider_SetGetNewUserDialogFn(pro, EBC_Provider_GetNewUserDialog); AB_Provider_AddFlags(pro, AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG); return pro; } void GWENHYWFAR_CB EBC_Provider_FreeData(GWEN_UNUSED void *bp, void *p) { EBC_PROVIDER *dp; dp=(EBC_PROVIDER*)p; assert(dp); EBC_Queue_free(dp->queue); AB_Job_List2_free(dp->bankingJobs); GWEN_FREE_OBJECT(dp); } int EBC_Provider_GetConnectTimeout(const AB_PROVIDER *pro) { EBC_PROVIDER *dp; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); return dp->connectTimeout; } int EBC_Provider_GetTransferTimeout(const AB_PROVIDER *pro) { EBC_PROVIDER *dp; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); return dp->transferTimeout; } int EBC_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { EBC_PROVIDER *dp; const char *logLevelName; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); if (!GWEN_Logger_IsOpen(AQEBICS_LOGDOMAIN)) { GWEN_Logger_Open(AQEBICS_LOGDOMAIN, "aqebics", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); } logLevelName=getenv("AQEBICS_LOGLEVEL"); if (logLevelName) { GWEN_LOGGER_LEVEL ll; ll=GWEN_Logger_Name2Level(logLevelName); if (ll!=GWEN_LoggerLevel_Unknown) { GWEN_Logger_SetLevel(AQEBICS_LOGDOMAIN, ll); DBG_WARN(AQEBICS_LOGDOMAIN, "Overriding loglevel for AqEBICS with \"%s\"", logLevelName); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unknown loglevel \"%s\"", logLevelName); } } DBG_INFO(AQEBICS_LOGDOMAIN, "Please remember to purchase a license if you want to use the EBICS backend."); if (1) { GWEN_STRINGLIST *sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_LOCALEDIR); const char *localedir=GWEN_StringList_FirstString(sl); int rv; rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, localedir); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not bind textdomain (%d)", rv); } else { rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8"); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not set codeset (%d)", rv); } } GWEN_StringList_free(sl); } DBG_NOTICE(AQEBICS_LOGDOMAIN, "Initializing AqEBICS backend"); dp->connectTimeout=GWEN_DB_GetIntValue(dbData, "connectTimeout", 0, EBC_DEFAULT_CONNECT_TIMEOUT); dp->transferTimeout=GWEN_DB_GetIntValue(dbData, "transferTimeout", 0, EBC_DEFAULT_TRANSFER_TIMEOUT); return 0; } int EBC_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { EBC_PROVIDER *dp; uint32_t currentVersion; DBG_NOTICE(AQEBICS_LOGDOMAIN, "Deinitializing AqEBICS backend"); assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); currentVersion= (AQEBICS_VERSION_MAJOR<<24) | (AQEBICS_VERSION_MINOR<<16) | (AQEBICS_VERSION_PATCHLEVEL<<8) | AQEBICS_VERSION_BUILD; /* save configuration */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Setting version %08x", currentVersion); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", currentVersion); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "connectTimeout", dp->connectTimeout); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "transferTimeout", dp->transferTimeout); return 0; } int EBC_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j) { EBC_PROVIDER *dp; AB_ACCOUNT *a; AB_USER *u; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); if (u==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No user assigned to this account."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("No user assigned to this account.")); GWEN_Gui_ShowError(I18N("Setup Error"), I18N("No user assigned to this account. Please assign one in the online banking setup dialog " "for this account.\n")); return GWEN_ERROR_INTERNAL; } switch(AB_Job_GetType(j)) { case AB_Job_TypeTransfer: { AB_TRANSACTION_LIMITS *lim; lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 27); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetMaxLinesPurpose(lim, 2); AB_TransactionLimits_AddValuesTextKey(lim, "51", 0); AB_Job_SetFieldLimits(j, lim); AB_TransactionLimits_free(lim); break; } case AB_Job_TypeDebitNote: { AB_TRANSACTION_LIMITS *lim; lim=AB_TransactionLimits_new(); AB_TransactionLimits_SetMaxLenPurpose(lim, 27); AB_TransactionLimits_SetMaxLenRemoteName(lim, 27); AB_TransactionLimits_SetMaxLinesRemoteName(lim, 1); AB_TransactionLimits_SetMaxLinesPurpose(lim, 2); AB_TransactionLimits_AddValuesTextKey(lim, "05", 0); AB_Job_SetFieldLimits(j, lim); AB_TransactionLimits_free(lim); break; } case AB_Job_TypeGetTransactions: break; case AB_Job_TypeGetBalance: default: DBG_INFO(AQEBICS_LOGDOMAIN, "Job not yet supported (%d)", AB_Job_GetType(j)); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ return 0; } int EBC_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j) { EBC_PROVIDER *dp; AB_ACCOUNT *a; AB_USER *u; EBC_USERQUEUE *uq; int doAdd=1; GWEN_DB_NODE *dbJob; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); if (u==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No user assigned to account."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("No user assigned to account.")); GWEN_Gui_ShowError(I18N("Setup Error"), I18N("No user assigned to this account. Please assign one in the online banking setup dialog " "for this account.\n")); return GWEN_ERROR_INTERNAL; } dbJob=AB_Job_GetProviderData(j, pro); assert(dbJob); switch(AB_Job_GetType(j)) { case AB_Job_TypeGetTransactions: case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: break; case AB_Job_TypeGetBalance: default: DBG_INFO(AQEBICS_LOGDOMAIN, "Job not yet supported (%d)", AB_Job_GetType(j)); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ uq=EBC_Queue_GetUserQueue(dp->queue, u); assert(uq); if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { AB_JOB *firstJob; firstJob=EBC_Queue_FindFirstJobLikeThis(dp->queue, u, j); if (firstJob) { GWEN_DB_NODE *dbCurrJob; /* this job is just a copy of the firstJob, reference it */ dbCurrJob=AB_Job_GetProviderData(j, pro); assert(dbCurrJob); GWEN_DB_SetIntValue(dbCurrJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "refJob", AB_Job_GetJobId(firstJob)); /* don't add to queues */ doAdd=0; } } if (doAdd) { /* only add to queue if needed */ EBC_UserQueue_AddJob(uq, j); } /* always add to linear list */ AB_Job_List2_PushBack(dp->bankingJobs, j); return 0; } GWEN_DIALOG *EBC_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u) { EBC_PROVIDER *xp; GWEN_DIALOG *dlg; assert(pro); xp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(xp); dlg=EBC_EditUserDialog_new(AB_Provider_GetBanking(pro), u, 1); if (dlg==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } GWEN_DIALOG *EBC_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i) { EBC_PROVIDER *xp; GWEN_DIALOG *dlg; assert(pro); xp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(xp); dlg=EBC_NewKeyFileDialog_new(AB_Provider_GetBanking(pro)); if (dlg==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } int EBC_Provider_CountDoneJobs(AB_JOB_LIST2 *jl){ AB_JOB_LIST2_ITERATOR *jit; int cnt=0; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_JOB_STATUS js; js=AB_Job_GetStatus(uj); if (js==AB_Job_StatusFinished || js==AB_Job_StatusError) cnt++; uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return cnt; } int EBC_Provider_ExecContext_STA(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, GWEN_UNUSED AB_USER *u, GWEN_UNUSED AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx){ EBC_PROVIDER *dp; int errors=0; int oks=0; AB_JOB_LIST2_ITERATOR *jit; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); jit=AB_Job_List2_First(EBC_Context_GetJobs(ectx)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { int rv; /* exchange STA request */ rv=EBC_Provider_XchgStaRequest(pro, sess, AB_JobGetTransactions_GetFromTime(uj), AB_JobGetTransactions_GetToTime(uj), ctx); if (!rv) { oks++; AB_Job_SetStatus(uj, AB_Job_StatusFinished); } else { if (rv==GWEN_ERROR_NO_DATA) AB_Job_SetStatus(uj, AB_Job_StatusFinished); else { AB_Job_SetStatus(uj, AB_Job_StatusError); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); AB_Job_List2Iterator_free(jit); return rv; } errors++; } } rv=GWEN_Gui_ProgressAdvance(0, EBC_Provider_CountDoneJobs(dp->bankingJobs)); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); AB_Job_List2Iterator_free(jit); return rv; } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return 0; } void EBC_Provider_SetJobListStatus(AB_JOB_LIST2 *jl, AB_JOB_STATUS js) { AB_JOB_LIST2_ITERATOR *jit; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_Job_SetStatus(uj, js); uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } } int EBC_Provider_ExecContext__IZV(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx){ EBC_PROVIDER *dp; AB_JOB_LIST2_ITERATOR *jit; AB_JOB_STATUS js; AB_IMEXPORTER_CONTEXT *exCtx; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_BUFFER *bufDtaus; GWEN_TIME *currentTime; GWEN_BUFFER *logbuf; int rv; const char *profileName=NULL; const char *s; const char *rqType; uint32_t groupId=0; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* prepare CTX log */ logbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(logbuf, "BEGIN"); currentTime=GWEN_CurrentTime(); GWEN_Time_toString(currentTime, I18N("YYYY/MM/DD-hh:mm:ss"), logbuf); GWEN_Time_free(currentTime); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("National Mass Transfer")); GWEN_Buffer_AppendString(logbuf, "\n"); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Transfer type: ")); GWEN_Buffer_AppendString(logbuf, "\t"); switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeTransfer: if (!profileName) profileName="transfer"; GWEN_Buffer_AppendString(logbuf, I18N("Transfer")); break; case AB_Job_TypeDebitNote: if (!profileName) profileName="debitnote"; GWEN_Buffer_AppendString(logbuf, I18N("Debit Note")); break; default: GWEN_Buffer_AppendString(logbuf, I18N("unknown")); break; } GWEN_Buffer_AppendString(logbuf, "\n"); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Account: ")); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, AB_Account_GetBankCode(a)); GWEN_Buffer_AppendString(logbuf, " / "); GWEN_Buffer_AppendString(logbuf, AB_Account_GetAccountNumber(a)); GWEN_Buffer_AppendString(logbuf, "\n"); /* add a tab-less line to start a new table */ GWEN_Buffer_AppendString(logbuf, "Transactions\n"); DBG_INFO(AQEBICS_LOGDOMAIN, "Sampling transactions from jobs"); exCtx=AB_ImExporterContext_new(); ai=AB_ImExporterAccountInfo_new(); AB_ImExporterAccountInfo_FillFromAccount(ai, a); jit=AB_Job_List2_First(EBC_Context_GetJobs(ectx)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_TRANSACTION *t; const GWEN_STRINGLIST *sl; const char *s; const AB_VALUE *v; switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: t=AB_Job_GetTransaction(uj); break; default: t=NULL; } assert(t); if (groupId==0) /* take id from first job of the created DTAUS doc */ groupId=AB_Job_GetJobId(uj); AB_Transaction_SetGroupId(t, groupId); AB_ImExporterAccountInfo_AddTransaction(ai, AB_Transaction_dup(t)); sl=AB_Transaction_GetRemoteName(t); s=NULL; if (sl) s=GWEN_StringList_FirstString(sl); if (!s) s=I18N("unknown"); GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); s=AB_Transaction_GetRemoteBankCode(t); if (!s) s="????????"; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); s=AB_Transaction_GetRemoteAccountNumber(t); if (!s) s="??????????"; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); sl=AB_Transaction_GetPurpose(t); s=NULL; if (sl) s=GWEN_StringList_FirstString(sl); if (!s) s=""; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); v=AB_Transaction_GetValue(t); if (v) AB_Value_toHumanReadableString(v, logbuf, 2); else GWEN_Buffer_AppendString(logbuf, "0,00 EUR"); GWEN_Buffer_AppendString(logbuf, "\n"); uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } AB_ImExporterContext_AddAccountInfo(exCtx, ai); GWEN_Buffer_AppendString(logbuf, I18N("Results:\n")); /* export as DTAUS to bufDtaus */ bufDtaus=GWEN_Buffer_new(0, 1024, 0, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "Exporting transactions to DTAUS[default]"); rv=AB_Banking_ExportToBuffer(AB_Provider_GetBanking(pro), exCtx, "dtaus", profileName, bufDtaus); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bufDtaus); EBC_Provider_SetJobListStatus(EBC_Context_GetJobs(ectx), AB_Job_StatusError); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Error while exporting to DTAUS\n")); GWEN_Buffer_AppendString(logbuf, "END\n"); AB_ImExporterContext_AddLog(ctx, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Exporting to DTAUS: ok\n")); /* exchange upload request */ DBG_INFO(AQEBICS_LOGDOMAIN, "Uploading."); AB_HttpSession_ClearLog(sess); if (EBC_Context_GetJobType(ectx)==AB_Job_TypeDebitNote) { if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_USE_IZL) rqType="IZL"; else rqType="IZV"; } else rqType="IZV"; rv=EBC_Provider_XchgUploadRequest(pro, sess, u, rqType, (const uint8_t*)GWEN_Buffer_GetStart(bufDtaus), GWEN_Buffer_GetUsedBytes(bufDtaus)); if (rv<0 || rv>=300) js=AB_Job_StatusError; else js=AB_Job_StatusFinished; s=AB_HttpSession_GetLog(sess); if (s) GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "END\n"); AB_ImExporterContext_AddLog(ctx, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); EBC_Provider_SetJobListStatus(EBC_Context_GetJobs(ectx), js); DBG_INFO(AQEBICS_LOGDOMAIN, "Done"); return 0; } int EBC_Provider_ExecContext_IZV(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx){ EBC_PROVIDER *dp; AB_JOB_LIST2_ITERATOR *jit; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); DBG_INFO(AQEBICS_LOGDOMAIN, "Executing IZV request"); rv=EBC_Provider_ExecContext__IZV(pro, ctx, u, a, sess, ectx); jit=AB_Job_List2_First(EBC_Context_GetJobs(ectx)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { const AB_TRANSACTION *ot; switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: ot=AB_Job_GetTransaction(uj); break; default: ot=NULL; } assert(ot); if (ot) { AB_TRANSACTION *t; AB_TRANSACTION_STATUS tStatus; switch(AB_Job_GetStatus(uj)) { case AB_Job_StatusFinished: tStatus=AB_Transaction_StatusAccepted; break; case AB_Job_StatusPending: tStatus=AB_Transaction_StatusPending; break; default: tStatus=AB_Transaction_StatusRejected; break; } t=AB_Transaction_dup(ot); AB_Transaction_SetStatus(t, tStatus); AB_ImExporterContext_AddTransfer(ctx, t); } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return rv; } int EBC_Provider_ExecContext(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx){ EBC_PROVIDER *dp; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeGetTransactions: rv=EBC_Provider_ExecContext_STA(pro, ctx, u, a, sess, ectx); break; case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: rv=EBC_Provider_ExecContext_IZV(pro, ctx, u, a, sess, ectx); break; case AB_Job_TypeEuTransfer: case AB_Job_TypeInternalTransfer: default: rv=GWEN_ERROR_NOT_IMPLEMENTED; break; } return rv; } int EBC_Provider_ExecAccountQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, GWEN_HTTP_SESSION *sess, EBC_ACCOUNTQUEUE *aq){ EBC_PROVIDER *dp; int errors=0; int oks=0; AB_ACCOUNT *a; EBC_CONTEXT_LIST *cl; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); a=EBC_AccountQueue_GetAccount(aq); cl=EBC_AccountQueue_GetContextList(aq); if (cl) { EBC_CONTEXT *ectx; ectx=EBC_Context_List_First(cl); while(ectx) { int rv; rv=EBC_Provider_ExecContext(pro, ctx, u, a, sess, ectx); if (!rv) oks++; else errors++; if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User aborted")); return rv; } ectx=EBC_Context_List_Next(ectx); } } return 0; } int EBC_Provider_ExecUserQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, EBC_USERQUEUE *uq){ EBC_PROVIDER *dp; int errors=0; int oks=0; GWEN_HTTP_SESSION *sess; int rv; EBC_ACCOUNTQUEUE_LIST *al; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); assert(ab); /* create and open session */ sess=EBC_Dialog_new(pro, EBC_UserQueue_GetUser(uq)); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } al=EBC_UserQueue_GetAccountQueues(uq); if (al) { EBC_ACCOUNTQUEUE *aq; aq=EBC_AccountQueue_List_First(al); while(aq) { AB_ACCOUNT *a; a=EBC_AccountQueue_GetAccount(aq); assert(a); /* lock account */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Locking account")); rv=AB_Banking_BeginExclUseAccount(ab, a); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not lock account")); } else { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Executing account queue")); rv=EBC_Provider_ExecAccountQueue(pro, ctx, EBC_UserQueue_GetUser(uq), sess, aq); if (!rv) oks++; else { errors++; if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); AB_Banking_EndExclUseAccount(ab, a, 1); /* abandon */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } else { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); } } /* unlock account */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Unlocking account")); rv=AB_Banking_EndExclUseAccount(ab, a, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Could not unlock account")); } } aq=EBC_AccountQueue_List_Next(aq); } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return 0; } AB_JOB *EBC_Provider_FindJobById(AB_JOB_LIST2 *jl, uint32_t jid) { AB_JOB_LIST2_ITERATOR *jit; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); assert(j); while(j) { if (AB_Job_GetJobId(j)==jid) { AB_Job_List2Iterator_free(jit); return j; } j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return 0; } int EBC_Provider_ExecQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx) { EBC_PROVIDER *dp; EBC_USERQUEUE_LIST *uql; int errors=0; int oks=0; int rv; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); assert(ab); uql=EBC_Queue_GetUserQueues(dp->queue); if (uql) { EBC_USERQUEUE *uq; uq=EBC_UserQueue_List_First(uql); while(uq) { AB_USER *u; u=EBC_UserQueue_GetUser(uq); assert(u); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Locking user")); rv=AB_Banking_BeginExclUseUser(ab, u); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); errors++; } else { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Executing user queue")); rv=EBC_Provider_ExecUserQueue(pro, ctx, uq); if (rv) errors++; else oks++; if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Unlocking user")); AB_Banking_EndExclUseUser(ab, u, 1); return rv; } rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); } } uq=EBC_UserQueue_List_Next(uq); } /* while */ } return 0; } int EBC_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx) { EBC_PROVIDER *dp; int oks=0; int errors=0; AB_JOB_LIST2_ITERATOR *jit; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); rv=EBC_Provider_ExecQueue(pro, ctx); if (!rv) oks++; else { errors++; if (rv==GWEN_ERROR_USER_ABORTED) { EBC_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); return rv; } } /* set results in referencing jobs, too */ jit=AB_Job_List2_First(dp->bankingJobs); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { if (AB_Job_GetStatus(uj)==AB_Job_StatusSent) { AB_JOB *rj; uint32_t rjid; rj=uj; /* find referenced job (if any) */ do { GWEN_DB_NODE *dbT; dbT=AB_Job_GetProviderData(rj, pro); assert(dbT); rjid=GWEN_DB_GetIntValue(dbT, "refJob", 0, 0); if (rjid) { rj=EBC_Provider_FindJobById(dp->bankingJobs, rjid); } } while(rjid && rj); if (rj && rj!=uj) { /* found referenced job, copy status and result text */ DBG_INFO(AQEBICS_LOGDOMAIN, "Copying status from referenced job"); AB_Job_SetStatus(uj, AB_Job_GetStatus(rj)); AB_Job_SetResultText(uj, AB_Job_GetResultText(rj)); } if (AB_Job_GetStatus(uj)==AB_Job_StatusSent) AB_Job_SetStatus(uj, AB_Job_StatusFinished); } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } rv=AB_Banking_ExecutionProgress(AB_Provider_GetBanking(pro)); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQEBICS_LOGDOMAIN, "User aborted"); return rv; } EBC_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); if (!oks && errors) { DBG_INFO(AQEBICS_LOGDOMAIN, "Not a single job succeeded"); return GWEN_ERROR_GENERIC; } return 0; } int EBC_Provider_ResetQueue(AB_PROVIDER *pro) { EBC_PROVIDER *dp; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); AB_Job_List2_Clear(dp->bankingJobs); return 0; } int EBC_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { EBC_User_Extend(u, pro, em, db); return 0; } int EBC_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { EBC_Account_Extend(a, pro, em, db); return 0; } int EBC_Provider_MountToken(AB_PROVIDER *pro, AB_USER *u, GWEN_CRYPT_TOKEN **pCt, const GWEN_CRYPT_TOKEN_CONTEXT **pCtx) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token of signer */ rv=AB_Banking_GetCryptToken(AB_Provider_GetBanking(pro), EBC_User_GetTokenType(u), EBC_User_GetTokenName(u), &ct); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not get crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } /* make sure the right flags are set */ DBG_INFO(AQEBICS_LOGDOMAIN, "Adding mode \"direct sign\" to CryptToken"); GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN); /* open CryptToken if necessary */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 0, 0); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not open crypt token for user \"%s\" (%d)", AB_User_GetUserId(u), rv); return rv; } } /* get context and key info */ ctx=GWEN_Crypt_Token_GetContext(ct, EBC_User_GetTokenContextId(u), 0); if (ctx==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Context %d not found on crypt token [%s:%s]", EBC_User_GetTokenContextId(u), GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); return GWEN_ERROR_NOT_FOUND; } *pCt=ct; *pCtx=ctx; return 0; } int EBC_Provider_GenerateNonce(GWEN_UNUSED AB_PROVIDER *pro, GWEN_BUFFER *buf) { int rv; uint8_t rbuf[16]; GWEN_Crypt_Random(2, rbuf, sizeof(rbuf)); rv=GWEN_Text_ToHexBuffer((const char*)rbuf, sizeof(rbuf), buf, 0, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not convert NONCE to hex (%d)", rv); return rv; } DBG_DEBUG(AQEBICS_LOGDOMAIN, "Generated NONCE [%s]", GWEN_Buffer_GetStart(buf)); return 0; } int EBC_Provider_GenerateTimeStamp(GWEN_UNUSED AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { char timestamp[40]; time_t ti; struct tm *t; ti=time(0); /* if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_TIMESTAMP_FIX1) { */ t=gmtime(&ti); snprintf(timestamp, sizeof(timestamp)-1, "%04d-%02d-%02dT%02d:%02d:%02d.000Z", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); timestamp[sizeof(timestamp)-1]=0; DBG_DEBUG(AQEBICS_LOGDOMAIN, "Generated timestamp [%s]", timestamp); GWEN_Buffer_AppendString(buf, timestamp); /* } else { int thzone; t=localtime(&ti); thzone=-timezone/60; if (t->tm_isdst>0) thzone+=60; snprintf(timestamp, sizeof(timestamp)-1, "%04d-%02d-%02dT%02d:%02d:%02d.000%+03d:%02d", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, (int)(thzone/60), abs(thzone%60)); timestamp[sizeof(timestamp)-1]=0; DBG_DEBUG(AQEBICS_LOGDOMAIN, "Generated timestamp [%s] (tz=%d, daylight=%d)", timestamp, (int)timezone, t->tm_isdst); GWEN_Buffer_AppendString(buf, timestamp); } */ return 0; } int EBC_Provider_Generate_OrderId(AB_PROVIDER *pro, GWEN_BUFFER *buf) { uint32_t id; char rbuf[4]; char c; uint32_t j; GWEN_Buffer_AllocRoom(buf, 4); id=AB_Banking_GetUniqueId(AB_Provider_GetBanking(pro)); if (id==0) return GWEN_ERROR_IO; rbuf[3]=id%36; j=id/36; rbuf[2]=j%36; j/=36; rbuf[1]=j%36; j/=36; rbuf[0]=j%26; c=rbuf[0]; c+='A'; GWEN_Buffer_AppendByte(buf, c); c=rbuf[1]; if (c<10) c+='0'; else c+='A'-10; GWEN_Buffer_AppendByte(buf, c); c=rbuf[2]; if (c<10) c+='0'; else c+='A'-10; GWEN_Buffer_AppendByte(buf, c); c=rbuf[3]; if (c<10) c+='0'; else c+='A'-10; GWEN_Buffer_AppendByte(buf, c); return 0; } GWEN_LOGGER_LEVEL EBC_Provider_ResultCodeToLogLevel(GWEN_UNUSED AB_PROVIDER *pro, const char *s) { if (strlen(s)!=6) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid error code [%s]", s); return GWEN_LoggerLevel_Error; } else { uint8_t c; GWEN_LOGGER_LEVEL lev; c=s[1]-'0'; switch(c) { case 0: lev=GWEN_LoggerLevel_Info; break; case 1: lev=GWEN_LoggerLevel_Notice; break; case 3: lev=GWEN_LoggerLevel_Warning; break; case 6: case 9: default: lev=GWEN_LoggerLevel_Error; break; } return lev; } } const char *EBC_Provider_TechnicalCodeToString(const char *s) { unsigned int code; if (sscanf(s, "%u", &code)!=1) return NULL; switch(code) { case 0 : return I18N("Ok"); case 11000: return I18N("Download postproces done"); case 11001: return I18N("Download postproces skipped"); case 11101: return I18N("TX segment number underrun"); case 31001: return I18N("Order params ignored"); case 61001: return I18N("Authentication failed"); case 61002: return I18N("Invalid request"); case 61099: return I18N("Internal error"); case 61101: return I18N("TX recovery sync"); case 91002: return I18N("Invalid user or invalid user state"); case 91003: return I18N("User unknown"); case 91004: return I18N("Invalid user state"); case 91005: return I18N("Invalid order type"); case 91006: return I18N("Unsupported order type"); case 91007: return I18N("Distributed signature authorisation failed"); case 91008: return I18N("Bank pubkey update required"); case 91009: return I18N("Segment size exceeded"); case 91010: return I18N("Invalid XML"); case 91101: return I18N("TX unknown transaction id"); case 91102: return I18N("TX abort"); case 91103: return I18N("TX message replay"); case 91104: return I18N("TX segment number exceeded"); case 91112: return I18N("Invalid order params"); case 91113: return I18N("Invalid request content"); case 91117: return I18N("Max order data size exceeded"); case 91118: return I18N("Max segments exceeded"); case 91119: return I18N("Max transactions exceeded"); case 91120: return I18N("Partner id mismatch"); case 91121: return I18N("Incompatible order attribute"); default: return NULL; } } const char *EBC_Provider_BankCodeToString(const char *s) { unsigned int code; if (sscanf(s, "%u", &code)!=1) return NULL; switch(code) { case 0 : return I18N("Ok"); case 11301: return I18N("No online checks"); case 91001: return I18N("Download signed only"); case 91002: return I18N("Download unsigned only"); case 90003: return I18N("Authorisation failed"); case 90004: return I18N("Invalid order data format"); case 90005: return I18N("No download data available"); case 90006: return I18N("Unsupported request for order instance"); case 91105: return I18N("Recovery not supported"); case 91111: return I18N("Invalid signature file format"); case 91114: return I18N("Order id unknown"); case 91115: return I18N("Order id already exists"); case 91116: return I18N("Processing error"); case 91201: return I18N("Keymgmt unsupported version of signature"); case 91202: return I18N("Keymgmt unsupported version of authentication"); case 91203: return I18N("Keymgmt unsupported version of encryption"); case 91204: return I18N("Keymgmt keylength error in signature"); case 91205: return I18N("Keymgmt keylength error in authentication"); case 91206: return I18N("Keymgmt keylength error in encryption"); case 91207: return I18N("Keymgmt no X509 support"); case 91301: return I18N("Signature verification failed"); case 91302: return I18N("Account authorisation failed"); case 91303: return I18N("Amount check failed"); case 91304: return I18N("Signer unknown"); case 91305: return I18N("Invalid signer state"); case 91306: return I18N("Duplicate signature"); default: return NULL; } } void EBC_Provider_LogRequestResults(AB_PROVIDER *pro, EB_MSG *mRsp, GWEN_BUFFER *logbuf) { const char *tcode; const char *bcode; const char *s; GWEN_BUFFER *tbuf; tcode=EB_Msg_GetCharValue(mRsp, "header/mutable/ReturnCode", NULL); bcode=EB_Msg_GetCharValue(mRsp, "body/ReturnCode", NULL); tbuf=GWEN_Buffer_new(0, 256, 0, 1); if (tcode) { GWEN_Buffer_AppendString(tbuf, I18N("EBICS (Technical Code):")); GWEN_Buffer_AppendString(tbuf, " "); GWEN_Buffer_AppendString(tbuf, tcode); s=EBC_Provider_TechnicalCodeToString(tcode); if (s) { GWEN_Buffer_AppendString(tbuf, " ["); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "]"); } if (logbuf) { GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendBuffer(logbuf, tbuf); } GWEN_Gui_ProgressLog(0, EBC_Provider_ResultCodeToLogLevel(pro, tcode), GWEN_Buffer_GetStart(tbuf)); DBG_INFO(AQEBICS_LOGDOMAIN, "%s", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } s=EB_Msg_GetCharValue(mRsp, "header/mutable/ReportText", NULL); if (s) { GWEN_Buffer_AppendString(tbuf, I18N("EBICS (Technical Report):")); GWEN_Buffer_AppendString(tbuf, " "); GWEN_Buffer_AppendString(tbuf, s); if (logbuf) { GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendBuffer(logbuf, tbuf); } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, GWEN_Buffer_GetStart(tbuf)); DBG_INFO(AQEBICS_LOGDOMAIN, "%s", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } s=EB_Msg_GetCharValue(mRsp, "body/ReturnCode", NULL); if (bcode) { GWEN_Buffer_AppendString(tbuf, I18N("EBICS (Bank Code):")); GWEN_Buffer_AppendString(tbuf, " "); GWEN_Buffer_AppendString(tbuf, bcode); s=EBC_Provider_BankCodeToString(bcode); if (s) { GWEN_Buffer_AppendString(tbuf, " ["); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "]"); } if (logbuf) { GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendBuffer(logbuf, tbuf); } GWEN_Gui_ProgressLog(0, EBC_Provider_ResultCodeToLogLevel(pro, bcode), GWEN_Buffer_GetStart(tbuf)); DBG_INFO(AQEBICS_LOGDOMAIN, "%s", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); } GWEN_Buffer_free(tbuf); } int EBC_Provider_AddBankPubKeyDigests(AB_PROVIDER *pro, AB_USER *u, xmlNodePtr node) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_BUFFER *hbuf; xmlNodePtr nodeX = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id for server auth key */ keyId=GWEN_Crypt_Token_Context_GetAuthVerifyKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } s=EBC_User_GetAuthVersion(u); DBG_ERROR(0, "Auth Version: %s\n", s); if (! (s && *s)) s="X001"; if (strcasecmp(s, "X001")==0) { hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EB_Key_Info_BuildHashSha1(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "Authentication", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "X001"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2000/09/xmldsig#sha1"); } else if (strcasecmp(s, "X002")==0) { hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EB_Key_Info_BuildHashSha256(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "Authentication", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "X002"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2001/04/xmlenc#sha256"); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unsupported auth version [%s]", s); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_INTERNAL; } /* get key id for server crypt key */ keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } s=EBC_User_GetCryptVersion(u); if (! (s && *s)) s="E001"; if (strcasecmp(s, "E001")==0) { hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EB_Key_Info_BuildHashSha1(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "Encryption", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "E001"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2000/09/xmldsig#sha1"); } else if (strcasecmp(s, "E002")==0) { hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EB_Key_Info_BuildHashSha256(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "Encryption", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "E002"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2001/04/xmlenc#sha256"); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unsupported crypt version [%s]", s); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_INTERNAL; } return 0; } int EBC_Provider_FillDataEncryptionInfoNode(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, xmlNodePtr node) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; GWEN_BUFFER *hbuf; xmlNodePtr nodeX = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id for server crypt key */ keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } hbuf=GWEN_Buffer_new(0, 256, 0, 1); s=EBC_User_GetCryptVersion(u); if (!(s && *s)) s="E001"; if (strcasecmp(s, "E001")==0) { rv=EB_Key_Info_BuildHashSha1(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "EncryptionPubKeyDigest", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "E001"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2000/09/xmldsig#sha1"); } else if (strcasecmp(s, "E002")==0) { rv=EB_Key_Info_BuildHashSha256(ki, hbuf, 1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "EncryptionPubKeyDigest", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); xmlNewProp(nodeX, BAD_CAST "Version", BAD_CAST "E002"); xmlNewProp(nodeX, BAD_CAST "Algorithm", BAD_CAST "http://www.w3.org/2001/04/xmlenc#sha256"); } /* add encrypted transactio key */ hbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EBC_Provider_EncryptKey(pro, u, skey, hbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); GWEN_Crypt_Token_Close(ct, 0, 0); return rv; } nodeX=xmlNewTextChild(node, NULL, BAD_CAST "TransactionKey", BAD_CAST GWEN_Buffer_GetStart(hbuf)); GWEN_Buffer_free(hbuf); assert(nodeX); return 0; } int EBC_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u) { GWEN_HTTP_SESSION *sess; int rv; AB_BANKING *ab; sess=EBC_Dialog_new(pro, u); ab=AB_Provider_GetBanking(pro); assert(ab); /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* try to connect */ rv=GWEN_HttpSession_ConnectionTest(sess); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not connect to server"); GWEN_HttpSession_free(sess); return rv; } GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return 0; } #include "p_sign_x001.c" #include "p_sign_x002.c" #include "p_sign.c" #include "p_decipher.c" #include "p_encipher_e001.c" #include "p_encipher_e002.c" #include "p_encipher.c" #include "p_eu_a004.c" #include "p_eu_a005.c" #include "p_eu.c" #include "p_tools.c" #include "r_ini_h002.c" #include "r_ini_h003.c" #include "r_ini.c" #include "r_hia_h002.c" #include "r_hia_h003.c" #include "r_hia.c" #include "r_hpb_h002.c" #include "r_hpb_h003.c" #include "r_hpb.c" #include "r_download_h002.c" #include "r_download_h003.c" #include "r_download.c" #include "r_hpd.c" #include "r_hkd.c" #include "r_htd.c" #include "r_sta.c" #include "r_upload_h002.c" #include "r_upload_h003.c" #include "r_upload.c" #include "r_pub_h002.c" #include "r_pub_h003.c" #include "r_pub.c" aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_encipher_e002.c0000644000175000017500000001044012364015477024461 00000000000000/*************************************************************************** begin : Thu May 15 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ static int EBC_Provider_EncryptData_E002(GWEN_UNUSED AB_PROVIDER *pro, GWEN_CRYPT_KEY *skey, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *sbuf) { GWEN_BUFFER *tbuf; GWEN_BUFFER *ebuf; int rv; uint32_t l; /* zip */ tbuf=GWEN_Buffer_new(0, lData, 0, 1); rv=EB_Zip_Deflate((const char*)pData, lData, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* padd */ rv=GWEN_Padd_PaddWithAnsiX9_23ToMultipleOf(tbuf, 16); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* encrypt */ ebuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(tbuf)+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); /* reset IV !! */ GWEN_Crypt_KeyAes128_SetIV(skey, NULL, 0); rv=GWEN_Crypt_Key_Encipher(skey, (uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(tbuf); /* base64 encode encrypted data into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } static int EBC_Provider_EncryptKey_E002(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { EBC_PROVIDER *dp; GWEN_BUFFER *kbuf; GWEN_BUFFER *ebuf; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; uint32_t l; GWEN_CRYPT_PADDALGO *algo; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id */ keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); /* get key data */ kbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendBytes(kbuf, (const char*)GWEN_Crypt_KeyAes128_GetKeyDataPtr(skey), 16); /* select padd algo */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); /* encipher key data */ ebuf=GWEN_Buffer_new(0, ksize+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, (const uint8_t*)GWEN_Buffer_GetStart(kbuf), GWEN_Buffer_GetUsedBytes(kbuf), (uint8_t*)GWEN_Buffer_GetStart(ebuf), &l, 0); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(kbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(kbuf); /* base64 encode encrypted data into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/context_l.h0000644000175000017500000000344112364015477023626 00000000000000/* This file is auto-generated from "context.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef CONTEXT_L_H #define CONTEXT_L_H /** @page P_EBC_CONTEXT_LIB EBC_Context (lib) This page describes the properties of EBC_CONTEXT */ #ifdef __cplusplus extern "C" { #endif typedef struct EBC_CONTEXT EBC_CONTEXT; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_DEFS(EBC_CONTEXT, EBC_Context) EBC_CONTEXT_LIST *EBC_Context_List_dup(const EBC_CONTEXT_LIST *stl); GWEN_LIST2_FUNCTION_DEFS(EBC_CONTEXT, EBC_Context) void EBC_Context_List2_freeAll(EBC_CONTEXT_LIST2 *stl); EBC_CONTEXT *EBC_Context_new(); EBC_CONTEXT *EBC_Context_fromDb(GWEN_DB_NODE *db); EBC_CONTEXT *EBC_Context_dup(const EBC_CONTEXT*st); void EBC_Context_free(EBC_CONTEXT *st); void EBC_Context_Attach(EBC_CONTEXT *st); int EBC_Context_ReadDb(EBC_CONTEXT *st, GWEN_DB_NODE *db); int EBC_Context_toDb(const EBC_CONTEXT*st, GWEN_DB_NODE *db); int EBC_Context_IsModified(const EBC_CONTEXT *st); void EBC_Context_SetModified(EBC_CONTEXT *st, int i); /** * Returns the property @ref EBC_CONTEXT_Jobs */ AB_JOB_LIST2 *EBC_Context_GetJobs(const EBC_CONTEXT *el); /** * Set the property @ref EBC_CONTEXT_Jobs */ void EBC_Context_SetJobs(EBC_CONTEXT *el, AB_JOB_LIST2 *d); /** * Returns the property @ref EBC_CONTEXT_JobType */ AB_JOB_TYPE EBC_Context_GetJobType(const EBC_CONTEXT *el); /** * Set the property @ref EBC_CONTEXT_JobType */ void EBC_Context_SetJobType(EBC_CONTEXT *el, AB_JOB_TYPE d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* CONTEXT_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/dialog_p.h0000644000175000017500000000146612364015477023412 00000000000000/*************************************************************************** $RCSfile: medium_p.h,v $ ------------------- cvs : $Id: medium_p.h,v 1.3 2006/01/23 05:16:27 aquamaniac Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_DIALOG_P_H #define EBC_CLIENT_DIALOG_P_H #include "dialog_l.h" typedef struct EBC_DIALOG EBC_DIALOG; struct EBC_DIALOG { int dummy; }; static GWENHYWFAR_CB void EBC_Dialog_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_htd.c0000644000175000017500000001521112364015477022720 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include int EBC_Provider_XchgHtdRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { int rv; GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, "HTD", buf, 0, NULL, NULL); if (rv<0 || rv>=300) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } else { xmlDocPtr orderDoc=NULL; xmlNodePtr root_node=NULL; xmlNodePtr node=NULL; xmlNodePtr nodeX=NULL; GWEN_DB_NODE *dbAll; GWEN_DB_NODE *db; /* parse XML document */ rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetUsedBytes(buf), &orderDoc); GWEN_Buffer_free(buf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get keys */ root_node=xmlDocGetRootElement(orderDoc); /* get auth key */ node=EB_Xml_GetNode(root_node, "PartnerInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No PartnerInfo found"); xmlFreeDoc(orderDoc); return GWEN_ERROR_BAD_DATA; } dbAll=GWEN_DB_Group_new("HTDResponse"); /* sample accounts */ nodeX=node->children; while(nodeX) { if (nodeX->type==XML_ELEMENT_NODE) { if (nodeX->name && strcmp((const char*)nodeX->name, "AccountInfo")==0) { xmlChar *xs; const char *s; xmlNodePtr nodeXX; DBG_ERROR(0, "Reading AccountInfo node"); db=GWEN_DB_GetGroup(dbAll, GWEN_PATH_FLAGS_CREATE_GROUP, "Account"); xs=xmlGetProp(nodeX, BAD_CAST "ID"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "EbicsId", (const char*)xs); xmlFree(xs); } xs=xmlGetProp(nodeX, BAD_CAST "Currency"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Currency", (const char*)xs); xmlFree(xs); } xs=xmlGetProp(nodeX, BAD_CAST "Description"); if (xs) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "AccountName", (const char*)xs); xmlFree(xs); } nodeXX=nodeX->children; while (nodeXX) { if (nodeXX->type==XML_ELEMENT_NODE && nodeXX->name && strcmp((const char*)nodeXX->name, "BankCode")==0) { xs=xmlGetProp(nodeXX, BAD_CAST "international"); if (xs) { xmlNodePtr nodeXXX=NULL; if (strcasecmp((const char*)xs, "false")==0) { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "BankCode", (const char*)nodeXXX->content); } } else { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "BIC", (const char*)nodeXXX->content); } } xmlFree(xs); } } nodeXX=nodeXX->next; } nodeXX=nodeX->children; while (nodeXX) { if (nodeXX->type==XML_ELEMENT_NODE && nodeXX->name && strcmp((const char*)nodeXX->name, "AccountNumber")==0) { xs=xmlGetProp(nodeXX, BAD_CAST "international"); if (xs) { xmlNodePtr nodeXXX=NULL; if (strcasecmp((const char*)xs, "false")==0) { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "AccountNumber", (const char*)nodeXXX->content); } } else { nodeXXX=nodeXX->children; if (nodeXXX->type==XML_TEXT_NODE && nodeXXX->content) { GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "IBAN", (const char*)nodeXXX->content); } } xmlFree(xs); } } nodeXX=nodeXX->next; } s=EB_Xml_GetCharValue(nodeX, "AccountHolder", NULL); if (s) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "owner", s); } } nodeX=nodeX->next; } /* add all accounts which are complete */ db=GWEN_DB_FindFirstGroup(dbAll, "Account"); while(db) { const char *ebicsId; const char *bankCode; const char *accountNumber; const char *owner; const char *descr; const char *currency; const char *bic; const char *iban; ebicsId=GWEN_DB_GetCharValue(db, "ebicsId", 0, NULL); bankCode=GWEN_DB_GetCharValue(db, "bankCode", 0, NULL); accountNumber=GWEN_DB_GetCharValue(db, "accountNumber", 0, NULL); owner=GWEN_DB_GetCharValue(db, "owner", 0, NULL); if (owner==NULL) owner=AB_User_GetUserName(u); descr=GWEN_DB_GetCharValue(db, "accountName", 0, NULL); currency=GWEN_DB_GetCharValue(db, "currency", 0, NULL); if (currency==NULL) currency="EUR"; iban=GWEN_DB_GetCharValue(db, "IBAN", 0, NULL); bic=GWEN_DB_GetCharValue(db, "BIC", 0, NULL); if (bankCode && accountNumber) { AB_ACCOUNT *a; a=AB_Banking_FindAccount(AB_Provider_GetBanking(pro), "aqebics", "de", bankCode, accountNumber, "*"); if (!a) { char lbuf[256]; DBG_INFO(AQEBICS_LOGDOMAIN, "Adding account %s / %s", bankCode, accountNumber); snprintf(lbuf, sizeof(lbuf)-1, I18N("Adding account %s /%s"), bankCode, accountNumber); lbuf[sizeof(lbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, lbuf); a=AB_Banking_CreateAccount(AB_Provider_GetBanking(pro), "aqebics"); assert(a); AB_Account_SetAccountType(a, AB_AccountType_Bank); AB_Account_SetBankCode(a, bankCode); AB_Account_SetAccountNumber(a, accountNumber); if (descr) AB_Account_SetAccountName(a, descr); if (owner) AB_Account_SetOwnerName(a, owner); if (currency) AB_Account_SetCurrency(a, currency); AB_Account_SetCountry(a, "de"); if (iban) AB_Account_SetIBAN(a, iban); if (bic) AB_Account_SetBIC(a, bic); if (ebicsId) EBC_Account_SetEbicsId(a, ebicsId); AB_Account_SetUser(a, u); AB_Account_SetSelectedUser(a, u); rv=AB_Banking_AddAccount(AB_Provider_GetBanking(pro), a); if (rv<0) { DBG_WARN(AQEBICS_LOGDOMAIN, "Could not add account %s / %s (%d)", bankCode, accountNumber, rv); } } else { char lbuf[256]; DBG_INFO(AQEBICS_LOGDOMAIN, "Account %s / %s already exists", bankCode, accountNumber); snprintf(lbuf, sizeof(lbuf)-1, I18N("Account %s / %s already exists"), bankCode, accountNumber); lbuf[sizeof(lbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, lbuf); } } db=GWEN_DB_FindNextGroup(db, "Account"); } xmlFreeDoc(orderDoc); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_ini_h003.c0000644000175000017500000001577312364015477023467 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "user_l.h" #include static int EBC_Provider_XchgIniRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *signKeyInfo=NULL; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; GWEN_BUFFER *tbuf; const char *signVersion; const char *s; GWEN_BUFFER *bufB64; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get crypt key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (kid) { signKeyInfo=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); if (signKeyInfo==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Sign key info not found on crypt token"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Sign key info not found on crypt token")); return GWEN_ERROR_NOT_FOUND; } } signVersion=EBC_User_GetSignVersion(u); if (! (signVersion && *signVersion)) signVersion="A005"; if (strcasecmp(signVersion, "A005")==0) { /* create INIRequestOrderData */ doc=xmlNewDoc(BAD_CAST "1.0"); doc->encoding=xmlCharStrdup("UTF-8"); root_node=xmlNewNode(NULL, BAD_CAST "SignaturePubKeyOrderData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/S001", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/S001 " "http://www.ebics.org/S001/ebics_signature.xsd"); /* create auth key tree */ node=xmlNewChild(root_node, NULL, BAD_CAST "SignaturePubKeyInfo", NULL); rv=EB_Key_Info_toXml(signKeyInfo, node); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%d)", rv); xmlFreeDoc(doc); return GWEN_ERROR_INVALID; } xmlNewChild(node, NULL, BAD_CAST "SignatureVersion", BAD_CAST signVersion); /* store partner id and user id */ node=xmlNewChild(root_node, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); node=xmlNewChild(root_node, NULL, BAD_CAST "UserID", BAD_CAST userId); #if 0 DBG_ERROR(0, "Sending this key data:"); xmlDocDump(stderr, doc); #endif /* compress and base64 doc */ bufB64=GWEN_Buffer_new(0, 4096, 0, 1); rv=EB_Xml_Compress64Doc(doc, bufB64); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error compressing/encoding doc (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unsupported sign version [%s]", signVersion); return GWEN_ERROR_INTERNAL; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsUnsecuredRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "INI"); tbuf=GWEN_Buffer_new(0, 16, 0, 1); rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error creating order id (%d)", rv); GWEN_Buffer_free(tbuf); GWEN_Buffer_free(bufB64); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderID", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZNNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0000"); EB_Msg_SetCharValue(msg, "body/DataTransfer/OrderData", GWEN_Buffer_GetStart(bufB64)); GWEN_Buffer_free(bufB64); /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); EBC_User_AddFlags(u, EBC_USER_FLAGS_INI); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Init2); else EBC_User_SetStatus(u, EBC_UserStatus_Init1); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/provider.h0000644000175000017500000000503412364015477023461 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_CLIENT_PROVIDER_H #define AQEBICS_CLIENT_PROVIDER_H #include #include #include #define EBC_DEFAULT_CONNECT_TIMEOUT 30 #define EBC_DEFAULT_TRANSFER_TIMEOUT 60 AQEBICS_API AB_PROVIDER *EBC_Provider_new(AB_BANKING *ab); AQEBICS_API int EBC_Provider_CreateKeys(AB_PROVIDER *pro, AB_USER *u, int cryptAndAuthKeySizeInBytes, int signKeySizeInBytes, int nounmount); AQEBICS_API int EBC_Provider_CreateTempKey(AB_PROVIDER *pro, AB_USER *u, int signKeySizeInBytes, int nounmount); AQEBICS_API int EBC_Provider_GetIniLetterTxt(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); AQEBICS_API int EBC_Provider_GetHiaLetterTxt(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount); AQEBICS_API int EBC_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u); AQEBICS_API int EBC_Provider_Send_HIA(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Send_INI(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Send_PUB(AB_PROVIDER *pro, AB_USER *u, const char *signVersion, int doLock); AQEBICS_API int EBC_Provider_Send_HPB(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Send_HPD(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Send_HKD(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Send_HTD(AB_PROVIDER *pro, AB_USER *u, int doLock); AQEBICS_API int EBC_Provider_Download(AB_PROVIDER *pro, AB_USER *u, const char *rtype, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, int doLock); AQEBICS_API int EBC_Provider_Upload(AB_PROVIDER *pro, AB_USER *u, const char *rtype, const uint8_t *pData, uint32_t lData, int doLock); int EBC_Provider_GetConnectTimeout(const AB_PROVIDER *pro); int EBC_Provider_GetTransferTimeout(const AB_PROVIDER *pro); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_eu_a005.c0000644000175000017500000001501512364015477023277 00000000000000/*************************************************************************** begin : Tue Jun 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int EBC_Provider_EuSign_A005(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf) { EBC_PROVIDER *dp; GWEN_BUFFER *xbuf; GWEN_BUFFER *hbuf; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; uint32_t l; GWEN_CRYPT_PADDALGO *algo; int rv; const uint8_t prefix[]={ 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20}; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } xbuf=GWEN_Buffer_new(0, 40, 0, 1); EBC_Provider_Sha256(pMsg, lMsg, xbuf); /* add prefix to hash of SignedInfo */ hbuf=GWEN_Buffer_new(0, 256, 0, 1); ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); GWEN_Buffer_AppendBytes(hbuf, (const char*)prefix, sizeof(prefix)); GWEN_Buffer_AppendBytes(hbuf, GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf)); GWEN_Buffer_free(xbuf); /* select padd algo */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); /* actually sign */ GWEN_Buffer_AllocRoom(sbuf, ksize+16); l=GWEN_Buffer_GetMaxUnsegmentedWrite(sbuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, (const uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(sbuf), &l, NULL, /* ignore seq counter */ 0); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(sbuf, l); GWEN_Buffer_AdjustUsedBytes(sbuf); GWEN_Buffer_free(hbuf); return 0; } int EBC_Provider_MkEuZipDoc_A005(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf) { int rv; xmlDocPtr doc; xmlNodePtr root_node; xmlNodePtr node; xmlNsPtr ns; GWEN_BUFFER *tbuf; GWEN_BUFFER *bbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EBC_Provider_EuSign_A005(pro, u, requestType, pMsg, lMsg, tbuf); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } bbuf=GWEN_Buffer_new(0, (GWEN_Buffer_GetUsedBytes(tbuf)*3)/2, 0, 1); rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), bbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bbuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "UserSignatureData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/S001", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/S001 " "http://www.ebics.org/S001/ebics_signature.xsd"); node=xmlNewChild(root_node, NULL, BAD_CAST "OrderSignatureData", NULL); xmlNewTextChild(node, NULL, BAD_CAST "SignatureVersion", BAD_CAST "A005"); xmlNewTextChild(node, NULL, BAD_CAST "SignatureValue", BAD_CAST GWEN_Buffer_GetStart(bbuf)); GWEN_Buffer_free(bbuf); xmlNewTextChild(node, NULL, BAD_CAST "PartnerID", BAD_CAST AB_User_GetCustomerId(u)); xmlNewTextChild(node, NULL, BAD_CAST "UserID", BAD_CAST AB_User_GetUserId(u)); rv=EB_Xml_CompressDoc(doc, sbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); return 0; } int EBC_Provider_MkEuCryptZipDoc_A005(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { GWEN_BUFFER *tbuf; GWEN_BUFFER *ebuf; int rv; uint32_t l; DBG_INFO(AQEBICS_LOGDOMAIN, "Generating EU A005"); tbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=EBC_Provider_MkEuZipDoc_A005(pro, u, requestType, pMsg, lMsg, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* padd EU */ rv=GWEN_Padd_PaddWithAnsiX9_23ToMultipleOf(tbuf, 16); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* encrypt EU with the DES session key */ ebuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(tbuf)+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); /* reset IV !! */ GWEN_Crypt_KeyAes128_SetIV(skey, NULL, 0); rv=GWEN_Crypt_Key_Encipher(skey, (uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); /* base64 encode encrypted EU into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/provider_p.h0000644000175000017500000001037112364015477024000 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_CLIENT_PROVIDER_P_H #define AQEBICS_CLIENT_PROVIDER_P_H #include "provider_l.h" #include "context_l.h" #include "queues_l.h" #include #include typedef struct EBC_PROVIDER EBC_PROVIDER; struct EBC_PROVIDER { AB_JOB_LIST2 *bankingJobs; EBC_QUEUE *queue; GWEN_DB_NODE *dbConfig; uint32_t lastJobId; uint32_t lastMediumId; EBC_CONTEXT_LIST *contextList; int connectTimeout; int transferTimeout; }; static void GWENHYWFAR_CB EBC_Provider_FreeData(void *bp, void *p); static int EBC_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int EBC_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int EBC_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j); static int EBC_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j); static int EBC_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); static int EBC_Provider_ResetQueue(AB_PROVIDER *pro); static int EBC_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); static int EBC_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); static GWEN_DIALOG *EBC_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u); static GWEN_DIALOG *EBC_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i); int EBC_Provider__signMessage(AB_PROVIDER *pro, EB_MSG *msg, AB_USER *u); int EBC_Provider__generateNonce(GWEN_BUFFER *buf); /* p_tools.inc */ static int EBC_Provider__addKiTxt(AB_PROVIDER *pro, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *lbuf, int version); static const char *EBC_Provider_TechnicalCodeToString(const char *s); static const char *EBC_Provider_BankCodeToString(const char *s); static int EBC_Provider_EuSign_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf); static int EBC_Provider_MkEuZipDoc_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf); static int EBC_Provider_EuSign_A005(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf); static int EBC_Provider_MkEuZipDoc_A005(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf); static int EBC_Provider_ExecContext_STA(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx); static int EBC_Provider_ExecContext__IZV(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx); static int EBC_Provider_ExecContext_IZV(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx); static int EBC_Provider_ExecContext(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx); static int EBC_Provider_ExecAccountQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, GWEN_HTTP_SESSION *sess, EBC_ACCOUNTQUEUE *aq); static int EBC_Provider_ExecUserQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, EBC_USERQUEUE *uq); int EBC_Provider_ExecQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); AB_JOB *EBC_Provider_FindJobById(AB_JOB_LIST2 *jl, uint32_t jid); int EBC_Provider_CountDoneJobs(AB_JOB_LIST2 *jl); void EBC_Provider_SetJobListStatus(AB_JOB_LIST2 *jl, AB_JOB_STATUS js); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/testlib.c0000644000175000017500000000006512364015477023267 00000000000000 int main(int argc, char **argv) { return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/Makefile.am0000644000175000017500000000300212364015477023503 00000000000000 INCLUDES=-I$(srcdir)/.. -I$(top_builddir) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) DEFS += -DLOCALEDIR=\"$(localedir)\" AM_CFLAGS=-DBUILDING_AQEBICS @visibility_cflags@ typefiles=context.xml noinst_LTLIBRARIES=libclient.la noinst_PROGRAMS=testlib extra_sources=\ p_encipher.c \ p_encipher_e001.c \ p_encipher_e002.c \ p_decipher.c \ p_eu.c \ p_eu_a004.c \ p_eu_a005.c \ p_sign.c \ p_sign_x001.c \ p_sign_x002.c \ p_tools.c \ r_hia.c \ r_hia_h002.c \ r_hia_h003.c \ r_hpb.c \ r_hpb_h002.c \ r_hpb_h003.c \ r_hpd.c \ r_hkd.c \ r_htd.c \ r_ini.c \ r_ini_h002.c \ r_ini_h003.c \ r_download.c \ r_download_h002.c \ r_download_h003.c \ r_sta.c \ r_upload.c \ r_upload_h002.c \ r_upload_h003.c \ r_pub.c \ r_pub_h002.c \ r_pub_h003.c EXTRA_DIST=$(typefiles) $(extra_sources) noinst_HEADERS=\ account_l.h \ account_p.h \ context_l.h \ context_p.h \ dialog_l.h \ dialog_p.h \ provider_l.h \ provider_p.h \ queues_l.h \ queues_p.h \ user_l.h \ user_p.h iheaderdir=${includedir}/aqebics/client iheader_HEADERS=\ account.h \ provider.h \ user.h libclient_la_SOURCES=\ account.c \ user.c \ context.c \ dialog.c \ provider.c \ queues.c #types: $(typefiles) # typemaker -d static $(typefiles) types: $(typefiles) typemaker $(typefiles) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libclient_la_SOURCES) $(EXTRA_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_encipher_e001.c0000644000175000017500000001044312364015477024463 00000000000000/*************************************************************************** begin : Thu May 15 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ static int EBC_Provider_EncryptData_E001(GWEN_UNUSED AB_PROVIDER *pro, GWEN_CRYPT_KEY *skey, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *sbuf) { GWEN_BUFFER *tbuf; GWEN_BUFFER *ebuf; int rv; uint32_t l; /* zip */ tbuf=GWEN_Buffer_new(0, lData, 0, 1); rv=EB_Zip_Deflate((const char*)pData, lData, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* padd */ rv=GWEN_Padd_PaddWithAnsiX9_23(tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* encrypt */ ebuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(tbuf)+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); /* reset IV !! */ GWEN_Crypt_KeyDes3K_SetIV(skey, NULL, 0); rv=GWEN_Crypt_Key_Encipher(skey, (uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(tbuf); /* base64 encode encrypted data into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } static int EBC_Provider_EncryptKey_E001(AB_PROVIDER *pro, AB_USER *u, const GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { EBC_PROVIDER *dp; GWEN_BUFFER *kbuf; GWEN_BUFFER *ebuf; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; uint32_t l; GWEN_CRYPT_PADDALGO *algo; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id */ keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); return GWEN_ERROR_NOT_FOUND; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); /* get key data */ kbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendBytes(kbuf, (const char*)GWEN_Crypt_KeyDes3K_GetKeyDataPtr(skey), 16); /* select padd algo */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Pkcs1_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); /* encipher key data */ ebuf=GWEN_Buffer_new(0, ksize+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); rv=GWEN_Crypt_Token_Encipher(ct, keyId, algo, (const uint8_t*)GWEN_Buffer_GetStart(kbuf), GWEN_Buffer_GetUsedBytes(kbuf), (uint8_t*)GWEN_Buffer_GetStart(ebuf), &l, 0); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(kbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(kbuf); /* base64 encode encrypted data into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/account.h0000644000175000017500000000315112364015477023261 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_ACCOUNT_H #define EBC_CLIENT_ACCOUNT_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define EBC_ACCOUNT_FLAGS_STA_SPP 0x00000001 #define EBC_ACCOUNT_FLAGS_IZV_SPP 0x00000002 AQEBICS_API void EBC_Account_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t flags); AQEBICS_API uint32_t EBC_Account_Flags_fromDb(GWEN_DB_NODE *db, const char *name); AQEBICS_API const char *EBC_Account_GetEbicsId(const AB_ACCOUNT *a); AQEBICS_API void EBC_Account_SetEbicsId(AB_ACCOUNT *a, const char *s); /** * Returns 0 if the bank doesn't sign messages, 1 otherwise. * This can be used in case the bank sends a sign key upon request but * never signs it's messages. */ AQEBICS_API uint32_t EBC_Account_GetFlags(const AB_ACCOUNT *a); AQEBICS_API void EBC_Account_SetFlags(AB_ACCOUNT *a, uint32_t flags); AQEBICS_API void EBC_Account_AddFlags(AB_ACCOUNT *a, uint32_t flags); AQEBICS_API void EBC_Account_SubFlags(AB_ACCOUNT *a, uint32_t flags); #ifdef __cplusplus } #endif #endif /* EBC_USER_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_download_h002.c0000644000175000017500000004354712364015477024516 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include static int EBC_Provider_MkDownloadInitRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; xmlNodePtr nodeXXX = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Nonce", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Timestamp", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "UserID", BAD_CAST userId); /* order details */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderDetails", NULL); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderType", BAD_CAST requestType); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "DZHNN"); nodeXXX=xmlNewChild(nodeXX, NULL, BAD_CAST "StandardOrderParams", NULL); if (fromTime || toTime) { xmlNodePtr nodeXXXX; GWEN_TIME *tempTime=NULL; const GWEN_TIME *t1; const GWEN_TIME *t2; t1=fromTime; t2=toTime; if (t1==NULL) /* no fromDate, use toDate for both */ t1=t2; if (t2==NULL) { /* no toDate, use current date */ tempTime=GWEN_CurrentTime(); t2=tempTime; } nodeXXXX=xmlNewChild(nodeXXX, NULL, BAD_CAST "DateRange", NULL); if (t1) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Time_toString(t1, "YYYY-MM-DD", tbuf); xmlNewTextChild(nodeXXXX, NULL, BAD_CAST "Start", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } if (t2) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Time_toString(t2, "YYYY-MM-DD", tbuf); xmlNewTextChild(nodeXXXX, NULL, BAD_CAST "End", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } if (tempTime) GWEN_Time_free(tempTime); } /* bank pubkey digests */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "BankPubKeyDigests", NULL); rv=EBC_Provider_AddBankPubKeyDigests(pro, u, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* security medium */ xmlNewTextChild(nodeX, NULL, BAD_CAST "SecurityMedium", BAD_CAST "0000"); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Initialisation"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkDownloadTransferRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int segmentNumber, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr sigNode = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Transfer"); EB_Msg_SetIntValue(msg, "header/mutable/SegmentNumber", segmentNumber); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkDownloadReceiptRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, int receiptCode, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; xmlNsPtr ns; EB_MSG *msg; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr sigNode = NULL; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Receipt"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); nodeX=xmlNewChild(node, NULL, BAD_CAST "TransferReceipt", NULL); xmlNewProp(nodeX, BAD_CAST "authenticate", BAD_CAST "true"); EB_Msg_SetIntValue(msg, "body/TransferReceipt/ReceiptCode", receiptCode); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } int EBC_Provider_XchgDownloadRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; EB_MSG *msg=NULL; EB_MSG *mRsp; EB_RC rc; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create initialisation request */ rv=EBC_Provider_MkDownloadInitRequest_H002(pro, sess, u, requestType, fromTime, toTime, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { EB_Msg_free(mRsp); if (rc==0x090005) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No download data"); return GWEN_ERROR_NO_DATA; } else if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Security error (%06x)", rc); return AB_ERROR_SECURITY; } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Generic error (%06x)", rc); return GWEN_ERROR_GENERIC; } } else { DBG_NOTICE(AQEBICS_LOGDOMAIN, "Response: (%06x)", rc); } } if (1) { xmlNodePtr node=NULL; GWEN_CRYPT_KEY *skey=NULL; GWEN_BUFFER *buf1; GWEN_BUFFER *dbuffer; int segmentNumber; int segmentCount; const char *s; char transactionId[36]; /* extract keys and store them */ node=EB_Xml_GetNode(EB_Msg_GetRootNode(mRsp), "body/DataTransfer/DataEncryptionInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing session key"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=EBC_Provider_ExtractSessionKey(pro, u, node, &skey); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } DBG_INFO(AQEBICS_LOGDOMAIN, "Got session key"); s=EB_Msg_GetCharValue(mRsp, "header/static/TransactionID", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return rv; } strncpy(transactionId, s, sizeof(transactionId)-1); segmentCount=EB_Msg_GetIntValue(mRsp, "header/static/NumSegments", 0); if (segmentCount==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return rv; } dbuffer=GWEN_Buffer_new(0, 1024, 0, 1); segmentNumber=1; for (;;) { int i; i=EB_Msg_GetIntValue(mRsp, "header/mutable/SegmentNumber", 0); if (i!=segmentNumber) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unexpected segment number (%d, expected %d)", i, segmentNumber); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } /* read next chunk of data */ s=EB_Msg_GetCharValue(mRsp, "body/DataTransfer/OrderData", NULL); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_AppendString(dbuffer, s); if (segmentNumber>=segmentCount) { DBG_INFO(AQEBICS_LOGDOMAIN, "Transfer finished"); break; } /* exchange next message */ segmentNumber++; rv=EBC_Provider_MkDownloadTransferRequest_H002(pro, sess, u, transactionId, segmentNumber, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return AB_ERROR_SECURITY; } } EB_Msg_free(mRsp); /* BASE64-decode receiced data */ s=GWEN_Buffer_GetStart(dbuffer); if (*s==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return GWEN_ERROR_BAD_DATA; } buf1=GWEN_Buffer_new(0, strlen(s), 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode OrderData (%d)", rv); GWEN_Buffer_free(buf1); GWEN_Buffer_free(dbuffer); GWEN_Crypt_Key_free(skey); return rv; } GWEN_Buffer_free(dbuffer); /* decrypt/unzip data */ rv=EBC_Provider_DecryptData(pro, u, skey, (const uint8_t*)GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetUsedBytes(buf1), targetBuffer); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decrypt OrderData (%d)", rv); GWEN_Buffer_free(buf1); GWEN_Crypt_Key_free(skey); return rv; } GWEN_Crypt_Key_free(skey); /*DBG_ERROR(0, "Got this data:"); GWEN_Buffer_Dump(targetBuffer, stderr, 2);*/ /* send receipt message */ rv=EBC_Provider_MkDownloadReceiptRequest_H002(pro, sess, u, transactionId, withReceipt?0:1, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } EB_Msg_free(mRsp); return 0; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_pub.c0000644000175000017500000000121112364015477022722 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "user_l.h" #include int EBC_Provider_XchgPubRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *signVersion) { const char *s; s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgPubRequest_H002(pro, sess, u, signVersion); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgPubRequest_H003(pro, sess, u, signVersion); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Proto version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_tools.c0000644000175000017500000011724712364015477023313 00000000000000 #include #include "user_l.h" #include "msg/keys.h" int EBC_Provider_Send_INI(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_INI) { DBG_ERROR(AQEBICS_LOGDOMAIN, "INI already sent to the server"); return GWEN_ERROR_INVALID; } ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_New && ust!=EBC_UserStatus_Init1 && ust!=EBC_UserStatus_Disabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgIniRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging INI request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_HIA(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_HIA) { DBG_ERROR(AQEBICS_LOGDOMAIN, "HIA already sent to the server"); return GWEN_ERROR_INVALID; } ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_New && ust!=EBC_UserStatus_Init1 && ust!=EBC_UserStatus_Disabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgHiaRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging HIA request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_HPB(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Init2 && ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgHpbRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging HPB request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_HPD(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgHpdRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging HPD request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_HKD(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgHkdRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging HKD request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_HTD(AB_PROVIDER *pro, AB_USER *u, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgHtdRequest(pro, sess, u); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging HTD request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Send_PUB(AB_PROVIDER *pro, AB_USER *u, const char *signVersion, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgPubRequest(pro, sess, u, signVersion); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging PUB request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Download(AB_PROVIDER *pro, AB_USER *u, const char *rtype, GWEN_BUFFER *targetBuffer, int withReceipt, const GWEN_TIME *fromTime, const GWEN_TIME *toTime, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, rtype, targetBuffer, withReceipt, fromTime, toTime); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging download request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_Upload(AB_PROVIDER *pro, AB_USER *u, const char *rtype, const uint8_t *pData, uint32_t lData, int doLock) { EBC_PROVIDER *dp; GWEN_HTTP_SESSION *sess; int rv; EBC_USER_STATUS ust; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); ust=EBC_User_GetStatus(u); if (ust!=EBC_UserStatus_Enabled) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid status \"%s\" of user \"%s\"", EBC_User_Status_toString(ust), AB_User_GetUserId(u)); return GWEN_ERROR_INVALID; } /* create and open session */ sess=EBC_Dialog_new(pro, u); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not open session"); GWEN_HttpSession_free(sess); return rv; } /* lock user */ if (doLock) { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock customer"); GWEN_HttpSession_free(sess); return rv; } } /* exchange request and response */ rv=EBC_Provider_XchgUploadRequest(pro, sess, u, rtype, pData, lData); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging upload request (%d)", rv); if (doLock) AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } /* unlock user */ if (doLock) { rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not unlock customer"); AB_Banking_EndExclUseUser(ab, u, 1); GWEN_HttpSession_free(sess); return rv; } } /* close and destroy session */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } int EBC_Provider_CreateKeys(AB_PROVIDER *pro, AB_USER *u, int cryptAndAuthKeySizeInBytes, int signKeySizeInBytes, int nounmount) { EBC_PROVIDER *dp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t keyId; GWEN_CRYPT_CRYPTALGO *algo; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get token */ rv=AB_Banking_GetCryptToken(AB_Provider_GetBanking(pro), EBC_User_GetTokenType(u), EBC_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error getting the user's crypt token (%d)", rv); return rv; } GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_EXP_65537); /* create algo */ algo=GWEN_Crypt_CryptAlgo_new(GWEN_Crypt_CryptAlgoId_Rsa, GWEN_Crypt_CryptMode_None); GWEN_Crypt_CryptAlgo_SetChunkSize(algo, cryptAndAuthKeySizeInBytes); /* open token for admin */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error opening crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } /* get context */ ctx=GWEN_Crypt_Token_GetContext(ct, EBC_User_GetTokenContextId(u), 0); if (ctx==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not get context %d", EBC_User_GetTokenContextId(u)); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } DBG_INFO(AQEBICS_LOGDOMAIN, "Creating keys, please wait..."); /* get cipher key id */ keyId=GWEN_Crypt_Token_Context_GetDecipherKeyId(ctx); if (keyId==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No decipher key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } /* generate cipher key */ rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } /* get auth sign key id */ keyId=GWEN_Crypt_Token_Context_GetAuthSignKeyId(ctx); if (keyId) { /* generate auth sign key */ rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } /* get sign key id */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (keyId==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No sign key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } /* generate sign key */ GWEN_Crypt_CryptAlgo_SetChunkSize(algo, signKeySizeInBytes); rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } if (!nounmount) { /* close token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error closing crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } GWEN_Crypt_CryptAlgo_free(algo); return 0; } int EBC_Provider_CreateTempKey(AB_PROVIDER *pro, AB_USER *u, int signKeySizeInBytes, int nounmount) { EBC_PROVIDER *dp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t keyId; GWEN_CRYPT_CRYPTALGO *algo; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get token */ rv=AB_Banking_GetCryptToken(AB_Provider_GetBanking(pro), EBC_User_GetTokenType(u), EBC_User_GetTokenName(u), &ct); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error getting the user's crypt token (%d)", rv); return rv; } GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_EXP_65537); /* create algo */ algo=GWEN_Crypt_CryptAlgo_new(GWEN_Crypt_CryptAlgoId_Rsa, GWEN_Crypt_CryptMode_None); /* open token for admin */ if (!GWEN_Crypt_Token_IsOpen(ct)) { rv=GWEN_Crypt_Token_Open(ct, 1, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error opening crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } /* get context */ ctx=GWEN_Crypt_Token_GetContext(ct, EBC_User_GetTokenContextId(u), 0); if (ctx==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not get context %d", EBC_User_GetTokenContextId(u)); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } DBG_INFO(AQEBICS_LOGDOMAIN, "Creating keys, please wait..."); /* get temp sign key id */ keyId=GWEN_Crypt_Token_Context_GetTempSignKeyId(ctx); if (keyId==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No sign key id specified (internal error)"); GWEN_Crypt_CryptAlgo_free(algo); return GWEN_ERROR_INVALID; } /* generate sign key */ GWEN_Crypt_CryptAlgo_SetChunkSize(algo, signKeySizeInBytes); rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error generating key (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } if (!nounmount) { /* close token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error closing crypt token (%d)", rv); GWEN_Crypt_CryptAlgo_free(algo); return rv; } } GWEN_Crypt_CryptAlgo_free(algo); return 0; } int EBC_Provider_GetIniLetterTxt(AB_PROVIDER *pro, AB_USER *u, int useBankKey, GWEN_BUFFER *lbuf, int nounmount) { AB_BANKING *ab; const void *p; unsigned int l; GWEN_BUFFER *bbuf; int i; GWEN_TIME *ti; int rv; EBC_PROVIDER *dp; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t kid; const GWEN_CRYPT_TOKEN_KEYINFO *ki=NULL; const char *signVersion; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); assert(u); ab=AB_Provider_GetBanking(pro); assert(ab); signVersion=EBC_User_GetSignVersion(u); if (!(signVersion && *signVersion)) signVersion="A005"; /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } if (useBankKey) { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetVerifyKeyId(ctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { kid=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(ab); DBG_ERROR(0, "Server keys missing, please get them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Server keys missing, " "please get them first")); return GWEN_ERROR_NOT_FOUND; } } else { /* get sign key info */ kid=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); if (kid) { ki=GWEN_Crypt_Token_GetKeyInfo(ct, kid, GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS | GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION | GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER, 0); } if (!ki || !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) | !(GWEN_Crypt_Token_KeyInfo_GetFlags(ki) & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT)) { if (!nounmount) AB_Banking_ClearCryptTokenList(ab); DBG_ERROR(0, "User keys missing, please generate them first"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("User keys missing, " "please generate them first")); return GWEN_ERROR_NOT_FOUND; } } /* prelude */ GWEN_Buffer_AppendString(lbuf, I18N("\n\n\nINI-Letter DFUE (")); GWEN_Buffer_AppendString(lbuf, signVersion); GWEN_Buffer_AppendString(lbuf, ")\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("Date : ")); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, I18N("YYYY/MM/DD"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Time : ")); GWEN_Time_toString(ti, I18N("hh:mm:ss"), lbuf); GWEN_Buffer_AppendString(lbuf, "\n"); if (useBankKey) { GWEN_Buffer_AppendString(lbuf, I18N("Bank Code : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetBankCode(u)); } else { GWEN_Buffer_AppendString(lbuf, I18N("User : ")); GWEN_Buffer_AppendString(lbuf, AB_User_GetUserId(u)); } GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, I18N("Public key for electronic signature")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "\n\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, 129, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<128) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 128-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<8; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(0, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_free(bbuf); /* modulus */ GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Modulus")); GWEN_Buffer_AppendString(lbuf, "\n\n"); p=GWEN_Crypt_Token_KeyInfo_GetModulusData(ki); l=GWEN_Crypt_Token_KeyInfo_GetModulusLen(ki); if (!p || !l) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } bbuf=GWEN_Buffer_new(0, 129, 0, 1); GWEN_Buffer_AppendBytes(bbuf, p, l); GWEN_Buffer_Rewind(bbuf); if (l<128) GWEN_Buffer_FillLeftWithBytes(bbuf, 0, 128-l); p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<8; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(0, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "\n"); } GWEN_Buffer_free(bbuf); GWEN_Buffer_AppendString(lbuf, "\n"); GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Hash")); GWEN_Buffer_AppendString(lbuf, "\n\n"); bbuf=GWEN_Buffer_new(0, 21, 0, 1); if (strcasecmp(signVersion, "A004")==0) { rv=EB_Key_Info_BuildSigHash_Rmd160(ki, bbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<2; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 10, lbuf, 2, ' ', 0)) { DBG_ERROR(0, "Error converting to hex??"); abort(); } p+=10; GWEN_Buffer_AppendString(lbuf, "\n"); } } else { rv=EB_Key_Info_BuildSigHash_Sha256(ki, bbuf); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error hashing (%d)", rv); abort(); } p=GWEN_Buffer_GetStart(bbuf); l=GWEN_Buffer_GetUsedBytes(bbuf); for (i=0; i<2; i++) { GWEN_Buffer_AppendString(lbuf, " "); if (GWEN_Text_ToHexBuffer(p, 16, lbuf, 2, ' ', 0)) { DBG_ERROR(0, "Error converting to hex??"); abort(); } p+=16; GWEN_Buffer_AppendString(lbuf, "\n"); } } GWEN_Buffer_free(bbuf); if (!useBankKey) { GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("I confirm that I created the above key " "for my electronic signature.\n")); GWEN_Buffer_AppendString(lbuf, "\n\n"); GWEN_Buffer_AppendString(lbuf, I18N("____________________________ " "____________________________\n" "Place, date " "Signature\n")); } return 0; } int EBC_Provider__addKiTxt(GWEN_UNUSED AB_PROVIDER *pro, const GWEN_CRYPT_TOKEN_KEYINFO *ki, GWEN_BUFFER *lbuf, int version) { const uint8_t *p; unsigned int l; unsigned int nl; GWEN_BUFFER *bbuf; int i; int rv; GWEN_Buffer_AppendString(lbuf, " "); GWEN_Buffer_AppendString(lbuf, I18N("Exponent")); GWEN_Buffer_AppendString(lbuf, "\n\n"); /* exponent */ p=GWEN_Crypt_Token_KeyInfo_GetExponentData(ki); l=GWEN_Crypt_Token_KeyInfo_GetExponentLen(ki); if (!p || !l) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad key."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Bad key")); return GWEN_ERROR_BAD_DATA; } /* skip null bytes */ while(*p==0 && l>1) { p++; l--; } /* fill to next multiple of 16 */ nl=((l+15)/16)*16; bbuf=GWEN_Buffer_new(0, nl+1, 0, 1); if (l static int EBC_Provider_XchgHpbRequest_H003(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t keyId; xmlNsPtr ns; EB_MSG *msg; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsNoPubKeyDigestsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H003", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H003 " "http://www.ebics.org/H003/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H003"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/Nonce", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/Timestamp", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "HPB"); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZHNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0000"); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } if (1) { xmlDocPtr orderDoc=NULL; xmlNodePtr root_node=NULL; xmlNodePtr node=NULL; GWEN_CRYPT_KEY *skey=NULL; GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; const char *s; /* extract keys and store them */ node=EB_Xml_GetNode(EB_Msg_GetRootNode(mRsp), "body/DataTransfer/DataEncryptionInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing session key"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=EBC_Provider_ExtractSessionKey(pro, u, node, &skey); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } s=EB_Msg_GetCharValue(mRsp, "body/DataTransfer/OrderData", NULL); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } buf1=GWEN_Buffer_new(0, strlen(s), 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode OrderData (%d)", rv); GWEN_Buffer_free(buf1); EB_Msg_free(mRsp); return rv; } /* decode data */ buf2=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(buf1), 0, 1); rv=EBC_Provider_DecryptData(pro, u, skey, (const uint8_t*)GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetUsedBytes(buf1), buf2); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decrypt OrderData (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return rv; } /* parse XML document */ rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2), &orderDoc); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } /* get keys */ root_node=xmlDocGetRootElement(orderDoc); /* get auth key */ node=EB_Xml_GetNode(root_node, "AuthenticationPubKeyInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No authentication key found"); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } else { const GWEN_CRYPT_TOKEN_KEYINFO *cki; GWEN_CRYPT_TOKEN_KEYINFO *ki; keyId=GWEN_Crypt_Token_Context_GetAuthVerifyKeyId(ctx); cki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0, 0); if (cki) ki=GWEN_Crypt_Token_KeyInfo_dup(cki); else ki=GWEN_Crypt_Token_KeyInfo_new(keyId, GWEN_Crypt_CryptAlgoId_Rsa, 128); GWEN_Crypt_Token_KeyInfo_SetFlags(ki, 0); rc=EB_Key_Info_ReadXml(ki, node); if (rc) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%06x)", rc); GWEN_Crypt_Token_KeyInfo_free(ki); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return rv; } DBG_NOTICE(AQEBICS_LOGDOMAIN, "Auth key stored"); } /* get crypt key */ node=EB_Xml_GetNode(root_node, "EncryptionPubKeyInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No encryption key found"); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } else { const GWEN_CRYPT_TOKEN_KEYINFO *cki; GWEN_CRYPT_TOKEN_KEYINFO *ki; keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); cki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0, 0); if (cki) ki=GWEN_Crypt_Token_KeyInfo_dup(cki); else ki=GWEN_Crypt_Token_KeyInfo_new(keyId, GWEN_Crypt_CryptAlgoId_Rsa, 128); GWEN_Crypt_Token_KeyInfo_SetFlags(ki, 0); rc=EB_Key_Info_ReadXml(ki, node); if (rc) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%06x)", rc); GWEN_Crypt_Token_KeyInfo_free(ki); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return rv; } DBG_NOTICE(AQEBICS_LOGDOMAIN, "Crypt key stored"); } xmlFreeDoc(orderDoc); } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Enabled); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/queues_l.h0000644000175000017500000000421212364015477023446 00000000000000/*************************************************************************** begin : Wed May 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_QUEUES_H #define AO_QUEUES_H #include #include #include "context_l.h" typedef struct EBC_QUEUE EBC_QUEUE; typedef struct EBC_USERQUEUE EBC_USERQUEUE; typedef struct EBC_ACCOUNTQUEUE EBC_ACCOUNTQUEUE; GWEN_LIST_FUNCTION_DEFS(EBC_USERQUEUE, EBC_UserQueue) GWEN_LIST_FUNCTION_DEFS(EBC_ACCOUNTQUEUE, EBC_AccountQueue) EBC_ACCOUNTQUEUE *EBC_AccountQueue_new(AB_ACCOUNT *a); void EBC_AccountQueue_free(EBC_ACCOUNTQUEUE *aq); AB_ACCOUNT *EBC_AccountQueue_GetAccount(const EBC_ACCOUNTQUEUE *aq); EBC_CONTEXT *EBC_AccountQueue_FindContext(const EBC_ACCOUNTQUEUE *aq, AB_JOB_TYPE jt); void EBC_AccountQueue_AddJob(EBC_ACCOUNTQUEUE *aq, AB_JOB *bj); EBC_CONTEXT_LIST *EBC_AccountQueue_GetContextList(const EBC_ACCOUNTQUEUE *aq); EBC_USERQUEUE *EBC_UserQueue_new(AB_USER *u); void EBC_UserQueue_free(EBC_USERQUEUE *uq); AB_USER *EBC_UserQueue_GetUser(const EBC_USERQUEUE *uq); EBC_ACCOUNTQUEUE *EBC_UserQueue_FindAccountQueue(const EBC_USERQUEUE *uq, const AB_ACCOUNT *a); EBC_ACCOUNTQUEUE_LIST *EBC_UserQueue_GetAccountQueues(const EBC_USERQUEUE *uq); void EBC_UserQueue_AddJob(EBC_USERQUEUE *uq, AB_JOB *bj); int EBC_UserQueue_IsLocked(const EBC_USERQUEUE *uq); void EBC_UserQueue_SetIsLocked(EBC_USERQUEUE *uq, int i); EBC_QUEUE *EBC_Queue_new(); void EBC_Queue_free(EBC_QUEUE *q); EBC_USERQUEUE *EBC_Queue_FindUserQueue(EBC_QUEUE *q, const AB_USER *u); EBC_USERQUEUE *EBC_Queue_GetUserQueue(EBC_QUEUE *q, AB_USER *u); EBC_USERQUEUE_LIST *EBC_Queue_GetUserQueues(const EBC_QUEUE *q); void EBC_Queue_AddJob(EBC_QUEUE *q, AB_USER *u, AB_JOB *bj); void EBC_Queue_Clear(EBC_QUEUE *q); AB_JOB *EBC_Queue_FindFirstJobLikeThis(EBC_QUEUE *q, AB_USER *u, AB_JOB *bj); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_ini.c0000644000175000017500000000114712364015477022723 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "user_l.h" #include int EBC_Provider_XchgIniRequest(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { const char *s; s=EBC_User_GetProtoVersion(u); if (!(s && *s)) s="H002"; if (strcasecmp(s, "H002")==0) return EBC_Provider_XchgIniRequest_H002(pro, sess, u); else if (strcasecmp(s, "H003")==0) return EBC_Provider_XchgIniRequest_H003(pro, sess, u); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Proto version [%s] not supported", s); return GWEN_ERROR_INTERNAL; } } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_eu.c0000644000175000017500000000227612364015477022557 00000000000000/*************************************************************************** begin : Wed May 14 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #include int EBC_Provider_MkEuCryptZipDoc(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { const char *s; int rv; s=EBC_User_GetSignVersion(u); if (!(s && *s)) s="A004"; if (strcasecmp(s, "A004")==0) rv=EBC_Provider_MkEuCryptZipDoc_A004(pro, u, requestType, pMsg, lMsg, skey, sbuf); else if (strcasecmp(s, "A005")==0) rv=EBC_Provider_MkEuCryptZipDoc_A005(pro, u, requestType, pMsg, lMsg, skey, sbuf); else { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid sign version: [%s]", s); return GWEN_ERROR_INVALID; } if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/dialog.c0000644000175000017500000001000412364015477023052 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dialog_p.h" #include "user_l.h" #include #include #include GWEN_INHERIT(GWEN_HTTP_SESSION, EBC_DIALOG) GWEN_HTTP_SESSION *EBC_Dialog_new(AB_PROVIDER *pro, AB_USER *u) { GWEN_HTTP_SESSION *sess; EBC_DIALOG *xsess; const char *url; uint32_t flags; const char *s; url=EBC_User_GetServerUrl(u); if (url==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No URL for user [%s]", AB_User_GetUserId(u)); return NULL; } /* create session */ sess=AB_HttpSession_new(pro, u, url, "https", 443); assert(sess); /* extend session */ GWEN_NEW_OBJECT(EBC_DIALOG, xsess); GWEN_INHERIT_SETDATA(GWEN_HTTP_SESSION, EBC_DIALOG, sess, xsess, EBC_Dialog_FreeData); /* set flags according to user settings */ flags=EBC_User_GetFlags(u); if (flags & EBC_USER_FLAGS_FORCE_SSLV3) GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_FORCE_SSL3); /* set HTTP config according to user settings */ GWEN_HttpSession_SetHttpUserAgent(sess, EBC_User_GetHttpUserAgent(u)); s=EBC_User_GetHttpContentType(u); if (s==NULL || *s==0) s="text/xml; charset=UTF-8"; GWEN_HttpSession_SetHttpContentType(sess, s); GWEN_HttpSession_SetHttpVMajor(sess, EBC_User_GetHttpVMajor(u)); GWEN_HttpSession_SetHttpVMinor(sess, EBC_User_GetHttpVMinor(u)); return sess; } void GWENHYWFAR_CB EBC_Dialog_FreeData(GWEN_UNUSED void *bp, void *p) { EBC_DIALOG *dsess; dsess=(EBC_DIALOG*) p; GWEN_FREE_OBJECT(dsess); } int EBC_Dialog_ExchangeMessages(GWEN_HTTP_SESSION *sess, EB_MSG *msg, EB_MSG **pResponse) { AB_USER *u; int rv; GWEN_BUFFER *sendBuf; GWEN_BUFFER *recvBuf; EB_MSG *mResponse; /* preparations */ u=AB_HttpSession_GetUser(sess); assert(u); sendBuf=GWEN_Buffer_new(0, 1024, 0, 1); recvBuf=GWEN_Buffer_new(0, 1024, 0, 1); /* convert message to buffer for sending */ EB_Msg_toBuffer(msg, sendBuf); #if 0 if (GWEN_Logger_GetLevel(AQEBICS_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Sending this:"); fprintf(stderr, "====================================\n"); fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(sendBuf)); fprintf(stderr, "====================================\n"); } #endif /* send request */ rv=GWEN_HttpSession_SendPacket(sess, "POST", (const uint8_t*)GWEN_Buffer_GetStart(sendBuf), GWEN_Buffer_GetUsedBytes(sendBuf)); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error sending request (%d)", rv); GWEN_Buffer_free(recvBuf); GWEN_Buffer_free(sendBuf); return rv; } GWEN_Buffer_free(sendBuf); /* receive response */ rv=GWEN_HttpSession_RecvPacket(sess, recvBuf); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error sending request (%d)", rv); GWEN_Buffer_free(recvBuf); return rv; } #if 0 if (GWEN_Logger_GetLevel(AQEBICS_LOGDOMAIN)>=GWEN_LoggerLevel_Debug) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Received this:"); fprintf(stderr, "====================================\n"); fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(recvBuf)); fprintf(stderr, "====================================\n"); } #endif /* convert buffer to EBICS message */ mResponse=EB_Msg_fromBuffer(GWEN_Buffer_GetStart(recvBuf), GWEN_Buffer_GetUsedBytes(recvBuf)); GWEN_Buffer_free(recvBuf); if (!mResponse) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Invalid response (no EBICS message)"); return GWEN_ERROR_BAD_DATA; } *pResponse=mResponse; return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_upload_h002.c0000644000175000017500000003721612364015477024167 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" static int EBC_Provider_MkUploadInitRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, GWEN_CRYPT_KEY *skey, const char *pEu, uint32_t dlen, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; char numbuf[32]; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Nonce", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "Timestamp", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "PartnerID", BAD_CAST partnerId); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "UserID", BAD_CAST userId); /* order details */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderDetails", NULL); xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderType", BAD_CAST requestType); /* generate order id */ rv=EBC_Provider_Generate_OrderId(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderID", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU) xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "DZHNN"); else xmlNewTextChild(nodeXX, NULL, BAD_CAST "OrderAttribute", BAD_CAST "OZHNN"); xmlNewChild(nodeXX, NULL, BAD_CAST "StandardOrderParams", NULL); /* bank pubkey digests */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "BankPubKeyDigests", NULL); rv=EBC_Provider_AddBankPubKeyDigests(pro, u, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* security medium */ xmlNewTextChild(nodeX, NULL, BAD_CAST "SecurityMedium", BAD_CAST "0000"); snprintf(numbuf, sizeof(numbuf)-1, "%i", (dlen+(1024*1024)-1)/(1024*1024)); numbuf[sizeof(numbuf)-1]=0; xmlNewTextChild(nodeX, NULL, BAD_CAST "NumSegments", BAD_CAST numbuf); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Initialisation"); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* data transfer */ nodeX=xmlNewChild(node, NULL, BAD_CAST "DataTransfer", NULL); /* add session key and info */ nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "DataEncryptionInfo", NULL); xmlNewProp(nodeXX, BAD_CAST "authenticate", BAD_CAST "true"); rv=EBC_Provider_FillDataEncryptionInfoNode(pro, u, skey, nodeXX); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU)) { /* add EU */ nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "SignatureData", BAD_CAST pEu); xmlNewProp(nodeXX, BAD_CAST "authenticate", BAD_CAST "true"); } /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } static int EBC_Provider_MkUploadTransferRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *transactionId, const char *pData, uint32_t lData, int segmentNumber, int isLast, EB_MSG **pMsg) { EBC_PROVIDER *dp; int rv; xmlNsPtr ns; EB_MSG *msg; const char *userId; const char *partnerId; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr nodeX = NULL; xmlNodePtr nodeXX = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; char numbuf[32]; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); partnerId=AB_User_GetCustomerId(u); if (partnerId==NULL) partnerId=userId; /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); nodeX=xmlNewChild(node, NULL, BAD_CAST "static", NULL); s=EBC_User_GetPeerId(u); if (!s) s="EBICS"; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "HostID", BAD_CAST s); nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionID", BAD_CAST transactionId); /* mutable */ nodeX=xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); xmlNewTextChild(nodeX, NULL, BAD_CAST "TransactionPhase", BAD_CAST "Transfer"); snprintf(numbuf, sizeof(numbuf)-1, "%d", segmentNumber); numbuf[sizeof(numbuf)-1]=0; nodeXX=xmlNewTextChild(nodeX, NULL, BAD_CAST "SegmentNumber", BAD_CAST numbuf); xmlNewProp(nodeXX, BAD_CAST "lastSegment", BAD_CAST (isLast?"true":"false")); /* prepare signature node */ sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* data transfer */ nodeX=xmlNewChild(node, NULL, BAD_CAST "DataTransfer", NULL); tbuf=GWEN_Buffer_new(0, lData, 0, 1); GWEN_Buffer_AppendBytes(tbuf, pData, lData); nodeXX=xmlNewChild(nodeX, NULL, BAD_CAST "OrderData", BAD_CAST GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } *pMsg=msg; return 0; } int EBC_Provider_XchgUploadRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u, const char *requestType, const uint8_t *pData, uint32_t lData) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_KEY *skey; GWEN_BUFFER *euBuf=NULL; GWEN_BUFFER *dbuf; EB_MSG *msg=NULL; EB_MSG *mRsp; uint32_t numSegs; uint32_t i; EB_RC rc; GWEN_BUFFER *logbuf; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); logbuf=GWEN_Buffer_new(0, 128, 0, 1); /* generate session key */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating session key"); skey=GWEN_Crypt_KeyDes3K_Generate(GWEN_Crypt_CryptMode_Cbc, 24, 2); if (skey==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Unable to generate DES key"); return GWEN_ERROR_GENERIC; } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU)) { /* generate electronic signature */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating electronic signature for user [%s]", AB_User_GetUserId(u)); euBuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=EBC_Provider_MkEuCryptZipDoc(pro, u, requestType, pData, lData, skey, euBuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); GWEN_Buffer_AppendString(logbuf, I18N("\tError signing upload document")); GWEN_Buffer_AppendString(logbuf, " ("); GWEN_Buffer_AppendString(logbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(logbuf, ")\n"); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, I18N("\tUpload document signed")); GWEN_Buffer_AppendString(logbuf, " ("); GWEN_Buffer_AppendString(logbuf, AB_User_GetUserId(u)); GWEN_Buffer_AppendString(logbuf, ")\n"); } /* encrypt and encode data */ DBG_INFO(AQEBICS_LOGDOMAIN, "Encrypting, zipping and encoding upload data"); dbuf=GWEN_Buffer_new(0, (lData*4)/3, 0, 1); rv=EBC_Provider_EncryptData(pro, u, skey, pData, lData, dbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); GWEN_Buffer_AppendString(logbuf, I18N("\tError encrypting upload document\n")); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, I18N("\tUpload document encrypted\n")); numSegs=(GWEN_Buffer_GetUsedBytes(dbuf)+(1024*1024)-1)/(1024*1024); /* create upload init request */ DBG_INFO(AQEBICS_LOGDOMAIN, "Generating upload init request"); if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_NO_EU) rv=EBC_Provider_MkUploadInitRequest_H002(pro, sess, u, requestType, skey, NULL, /* no EU */ GWEN_Buffer_GetUsedBytes(dbuf), &msg); else rv=EBC_Provider_MkUploadInitRequest_H002(pro, sess, u, requestType, skey, GWEN_Buffer_GetStart(euBuf), GWEN_Buffer_GetUsedBytes(dbuf), &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } /* exchange requests */ DBG_INFO(AQEBICS_LOGDOMAIN, "Exchanging upload init request"); GWEN_Buffer_AppendString(logbuf, I18N("\tExchanging upload init request")); rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuf); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } EB_Msg_free(msg); GWEN_Buffer_free(euBuf); GWEN_Crypt_Key_free(skey); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, logbuf); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } if (1) { const char *s; char transactionId[36]; const char *p; uint32_t bytesLeft; /* extract transaction id */ s=EB_Msg_GetCharValue(mRsp, "header/static/TransactionID", NULL); if (s==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } strncpy(transactionId, s, sizeof(transactionId)-1); EB_Msg_free(mRsp); /* write data */ p=GWEN_Buffer_GetStart(dbuf); bytesLeft=GWEN_Buffer_GetUsedBytes(dbuf); for (i=0; ibytesLeft) n=bytesLeft; assert(n); DBG_INFO(AQEBICS_LOGDOMAIN, "Generating upload transfer request"); rv=EBC_Provider_MkUploadTransferRequest_H002(pro, sess, u, transactionId, p, n, i+1, (i==numSegs-1)?1:0, &msg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } /* exchange requests */ DBG_INFO(AQEBICS_LOGDOMAIN, "Exchanging upload transfer request"); GWEN_Buffer_AppendString(logbuf, I18N("\tExchanging upload transfer request")); rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, logbuf); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); GWEN_Buffer_free(dbuf); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return AB_ERROR_SECURITY; } /* prepare next round */ EB_Msg_free(mRsp); p+=n; bytesLeft-=n; } /* for */ } GWEN_Buffer_free(dbuf); DBG_INFO(AQEBICS_LOGDOMAIN, "Upload finished"); GWEN_Buffer_AppendString(logbuf, I18N("\tUpload finished")); Ab_HttpSession_AddLog(sess, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/r_hpb_h002.c0000644000175000017500000002203612364015477023446 00000000000000 #include "msg/msg.h" #include "msg/keys.h" #include "msg/zip.h" #include "msg/xml.h" #include "user_l.h" #include static int EBC_Provider_XchgHpbRequest_H002(AB_PROVIDER *pro, GWEN_HTTP_SESSION *sess, AB_USER *u) { EBC_PROVIDER *dp; int rv; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; uint32_t keyId; xmlNsPtr ns; EB_MSG *msg; EB_MSG *mRsp; EB_RC rc; xmlDocPtr doc; xmlNodePtr root_node = NULL; xmlNodePtr node = NULL; xmlNodePtr sigNode = NULL; GWEN_BUFFER *tbuf; const char *s; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* create request */ msg=EB_Msg_new(); doc=EB_Msg_GetDoc(msg); root_node=xmlNewNode(NULL, BAD_CAST "ebicsNoPubKeyDigestsRequest"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2000/09/xmldsig#", BAD_CAST "ds"); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_keymgmt_request.xsd"); xmlNewProp(root_node, BAD_CAST "Version", BAD_CAST "H002"); xmlNewProp(root_node, BAD_CAST "Revision", BAD_CAST "1"); /* header */ node=xmlNewChild(root_node, NULL, BAD_CAST "header", NULL); xmlNewProp(node, BAD_CAST "authenticate", BAD_CAST "true"); xmlNewChild(node, NULL, BAD_CAST "static", NULL); xmlNewChild(node, NULL, BAD_CAST "mutable", NULL); sigNode=xmlNewChild(root_node, NULL, BAD_CAST "AuthSignature", NULL); /* body */ node=xmlNewChild(root_node, NULL, BAD_CAST "body", NULL); /* fill */ s=EBC_User_GetPeerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/HostID", s); /* generate Nonce */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); rv=EBC_Provider_GenerateNonce(pro, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/Nonce", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate timestamp */ rv=EBC_Provider_GenerateTimeStamp(pro, u, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); EB_Msg_free(msg); return rv; } EB_Msg_SetCharValue(msg, "header/static/Timestamp", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); s=AB_User_GetCustomerId(u); if (s) EB_Msg_SetCharValue(msg, "header/static/PartnerID", s); EB_Msg_SetCharValue(msg, "header/static/UserID", AB_User_GetUserId(u)); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderType", "HPB"); EB_Msg_SetCharValue(msg, "header/static/OrderDetails/OrderAttribute", "DZHNN"); EB_Msg_SetCharValue(msg, "header/static/SecurityMedium", "0000"); /* sign */ rv=EBC_Provider_SignMessage(pro, msg, u, sigNode); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(msg); return rv; } /* exchange requests */ rv=EBC_Dialog_ExchangeMessages(sess, msg, &mRsp); if (rv<0 || rv>=300) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error exchanging messages (%d)", rv); EB_Msg_free(msg); return rv; } EB_Msg_free(msg); /* check response */ assert(mRsp); /* log results */ EBC_Provider_LogRequestResults(pro, mRsp, NULL); rc=EB_Msg_GetResultCode(mRsp); if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); return AB_ERROR_SECURITY; } rc=EB_Msg_GetBodyResultCode(mRsp); if (rc) { if ((rc & 0xff0000)==0x090000 || (rc & 0xff0000)==0x060000) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error response: (%06x)", rc); EB_Msg_free(mRsp); if ((rc & 0xfff00)==0x091300 || (rc & 0xfff00)==0x091200) return AB_ERROR_SECURITY; else return GWEN_ERROR_GENERIC; } } if (1) { xmlDocPtr orderDoc=NULL; xmlNodePtr root_node=NULL; xmlNodePtr node=NULL; GWEN_CRYPT_KEY *skey=NULL; GWEN_BUFFER *buf1; GWEN_BUFFER *buf2; const char *s; /* extract keys and store them */ node=EB_Xml_GetNode(EB_Msg_GetRootNode(mRsp), "body/DataTransfer/DataEncryptionInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing session key"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=EBC_Provider_ExtractSessionKey(pro, u, node, &skey); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } s=EB_Msg_GetCharValue(mRsp, "body/DataTransfer/OrderData", NULL); if (!s) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Bad message from server: Missing OrderData"); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } buf1=GWEN_Buffer_new(0, strlen(s), 0, 1); rv=GWEN_Base64_Decode((const uint8_t*)s, 0, buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decode OrderData (%d)", rv); GWEN_Buffer_free(buf1); EB_Msg_free(mRsp); return rv; } /* decode data */ buf2=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(buf1), 0, 1); rv=EBC_Provider_DecryptData(pro, u, skey, (const uint8_t*)GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetUsedBytes(buf1), buf2); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not decrypt OrderData (%d)", rv); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); return rv; } /* parse XML document */ rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf2), GWEN_Buffer_GetUsedBytes(buf2), &orderDoc); GWEN_Buffer_free(buf2); GWEN_Buffer_free(buf1); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); EB_Msg_free(mRsp); return rv; } /* get keys */ root_node=xmlDocGetRootElement(orderDoc); #if 0 DBG_ERROR(0, "Got this key document:"); xmlDocDump(stderr, orderDoc); #endif /* get auth key */ node=EB_Xml_GetNode(root_node, "AuthenticationPubKeyInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No authentication key found"); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } else { const GWEN_CRYPT_TOKEN_KEYINFO *cki; GWEN_CRYPT_TOKEN_KEYINFO *ki; keyId=GWEN_Crypt_Token_Context_GetAuthVerifyKeyId(ctx); cki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0, 0); if (cki) ki=GWEN_Crypt_Token_KeyInfo_dup(cki); else ki=GWEN_Crypt_Token_KeyInfo_new(keyId, GWEN_Crypt_CryptAlgoId_Rsa, 128); GWEN_Crypt_Token_KeyInfo_SetFlags(ki, 0); rc=EB_Key_Info_ReadXml(ki, node); if (rc) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%06x)", rc); GWEN_Crypt_Token_KeyInfo_free(ki); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return rv; } DBG_NOTICE(AQEBICS_LOGDOMAIN, "Auth key stored"); } /* get crypt key */ node=EB_Xml_GetNode(root_node, "EncryptionPubKeyInfo", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (node==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No encryption key found"); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } else { const GWEN_CRYPT_TOKEN_KEYINFO *cki; GWEN_CRYPT_TOKEN_KEYINFO *ki; keyId=GWEN_Crypt_Token_Context_GetEncipherKeyId(ctx); cki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0, 0); if (cki) ki=GWEN_Crypt_Token_KeyInfo_dup(cki); else ki=GWEN_Crypt_Token_KeyInfo_new(keyId, GWEN_Crypt_CryptAlgoId_Rsa, 128); GWEN_Crypt_Token_KeyInfo_SetFlags(ki, 0); rc=EB_Key_Info_ReadXml(ki, node); if (rc) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%06x)", rc); GWEN_Crypt_Token_KeyInfo_free(ki); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return GWEN_ERROR_BAD_DATA; } rv=GWEN_Crypt_Token_SetKeyInfo(ct, keyId, ki, 0); GWEN_Crypt_Token_KeyInfo_free(ki); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(orderDoc); EB_Msg_free(mRsp); return rv; } DBG_NOTICE(AQEBICS_LOGDOMAIN, "Crypt key stored"); } xmlFreeDoc(orderDoc); } EB_Msg_free(mRsp); /* adjust user status and flags */ DBG_NOTICE(AQEBICS_LOGDOMAIN, "Adjusting user flags"); if ((EBC_User_GetFlags(u) & (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) == (EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA)) EBC_User_SetStatus(u, EBC_UserStatus_Enabled); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/dialog_l.h0000644000175000017500000000200712364015477023376 00000000000000/*************************************************************************** $RCSfile: medium_p.h,v $ ------------------- cvs : $Id: medium_p.h,v 1.3 2006/01/23 05:16:27 aquamaniac Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_DIALOG_L_H #define EBC_CLIENT_DIALOG_L_H #include "msg/msg.h" #include #include #include #include #include GWEN_HTTP_SESSION *EBC_Dialog_new(AB_PROVIDER *pro, AB_USER *u); int EBC_Dialog_ExchangeMessages(GWEN_HTTP_SESSION *sess, EB_MSG *msg, EB_MSG **pResponse); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/account_p.h0000644000175000017500000000174312364015477023605 00000000000000/*************************************************************************** $RCSfile: user_p.h,v $ ------------------- cvs : $Id: user_p.h,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef EBC_CLIENT_ACCOUNT_P_H #define EBC_CLIENT_ACCOUNT_P_H #include "account_l.h" typedef struct EBC_ACCOUNT EBC_ACCOUNT; struct EBC_ACCOUNT { uint32_t flags; char *ebicsId; }; static void GWENHYWFAR_CB EBC_Account_freeData(void *bp, void *p); static void EBC_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); static void EBC_Account_toDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); #endif /* EBC_CLIENT_ACCOUNT_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/context_p.h0000644000175000017500000000057212364015477023634 00000000000000/* This file is auto-generated from "context.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef CONTEXT_P_H #define CONTEXT_P_H #include "context_l.h" struct EBC_CONTEXT { GWEN_LIST_ELEMENT(EBC_CONTEXT) int _usage; int _modified; AB_JOB_LIST2 *jobs; AB_JOB_TYPE jobType; }; #endif /* CONTEXT_P_H */ aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/client/p_eu_a004.c0000644000175000017500000001621112364015477023275 00000000000000/*************************************************************************** begin : Wed May 14 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #include #include "msg/eu.h" int EBC_Provider_EuSign_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf) { EBC_PROVIDER *dp; GWEN_MDIGEST *md; GWEN_BUFFER *hbuf; GWEN_BUFFER *ebuf; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; uint32_t l; GWEN_CRYPT_PADDALGO *algo; EB_EU *eu; GWEN_TIME *ti; int rv; const char *userId; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); md=GWEN_MDigest_Rmd160_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_Update(md, pMsg, lMsg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } hbuf=GWEN_Buffer_new(0, GWEN_MDigest_GetDigestSize(md), 0, 1); GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); GWEN_Buffer_free(hbuf); return GWEN_ERROR_NOT_FOUND; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); /* select padd algo */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); /* actually sign */ ebuf=GWEN_Buffer_new(0, ksize+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, (const uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l, NULL, /* ignore seq counter */ 0); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(hbuf); /* assemble EU */ eu=EB_Eu_new(); EB_Eu_SetVersion(eu, "A004"); EB_Eu_SetModLen(eu, ksize*8); EB_Eu_SetJobType(eu, requestType); EB_Eu_SetSignature(eu, (const uint8_t*) GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf)); GWEN_Buffer_free(ebuf); ti=GWEN_CurrentTime(); EB_Eu_SetCreationTime(eu, ti); EB_Eu_SetSignatureTime(eu, ti); GWEN_Time_free(ti); EB_Eu_SetUserId(eu, userId); /* store EU in given buffer */ EB_Eu_toBuffer(eu, sbuf); EB_Eu_free(eu); return 0; } int EBC_Provider_MkEuZipDoc_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf) { int rv; xmlDocPtr doc; xmlNodePtr root_node; xmlNodePtr node; xmlNsPtr ns; GWEN_BUFFER *tbuf; GWEN_BUFFER *bbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=EBC_Provider_EuSign_A004(pro, u, requestType, pMsg, lMsg, tbuf); if (rv) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } bbuf=GWEN_Buffer_new(0, (GWEN_Buffer_GetUsedBytes(tbuf)*3)/2, 0, 1); rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), bbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bbuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); doc=xmlNewDoc(BAD_CAST "1.0"); root_node=xmlNewNode(NULL, BAD_CAST "UserSignatureData"); xmlDocSetRootElement(doc, root_node); ns=xmlNewNs(root_node, BAD_CAST "http://www.ebics.org/H002", NULL); assert(ns); ns=xmlNewNs(root_node, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlNewNsProp(root_node, ns, BAD_CAST "schemaLocation", /* xsi:schemaLocation */ BAD_CAST "http://www.ebics.org/H002 " "http://www.ebics.org/H002/ebics_orders.xsd"); node=xmlNewTextChild(root_node, NULL, BAD_CAST "OrderSignature", BAD_CAST GWEN_Buffer_GetStart(bbuf)); GWEN_Buffer_free(bbuf); xmlNewProp(node, BAD_CAST "PartnerID", BAD_CAST AB_User_GetCustomerId(u)); rv=EB_Xml_CompressDoc(doc, sbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); xmlFreeDoc(doc); return rv; } xmlFreeDoc(doc); return 0; } int EBC_Provider_MkEuCryptZipDoc_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_CRYPT_KEY *skey, GWEN_BUFFER *sbuf) { GWEN_BUFFER *tbuf; GWEN_BUFFER *ebuf; int rv; uint32_t l; DBG_INFO(AQEBICS_LOGDOMAIN, "Generating EU A005"); tbuf=GWEN_Buffer_new(0, 512, 0, 1); rv=EBC_Provider_MkEuZipDoc_A004(pro, u, requestType, pMsg, lMsg, tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* padd EU */ rv=GWEN_Padd_PaddWithAnsiX9_23(tbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* encrypt EU with the DES session key */ ebuf=GWEN_Buffer_new(0, GWEN_Buffer_GetUsedBytes(tbuf)+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); /* reset IV !! */ GWEN_Crypt_KeyDes3K_SetIV(skey, NULL, 0); rv=GWEN_Crypt_Key_Encipher(skey, (uint8_t*)GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); /* base64 encode encrypted EU into given buffer */ rv=GWEN_Base64_Encode((const uint8_t*)GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf), sbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); return rv; } GWEN_Buffer_free(ebuf); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/aqebics.h0000644000175000017500000000775612364015477021775 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQEBICS_AQEBICS_H #define AQEBICS_AQEBICS_H #include #include #ifdef BUILDING_AQEBICS # /* building AqEBICS */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQEBICS_API __declspec (dllexport) # else /* if __declspec */ # define AQEBICS_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQEBICS_API __attribute__((visibility("default"))) # else # define AQEBICS_API # endif # endif #else # /* not building AqEBICS */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQEBICS_API __declspec (dllimport) # else /* if __declspec */ # define AQEBICS_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # define AQEBICS_API # endif #endif #define EBC_PROVIDER_NAME "AQEBICS" #define AQEBICS_LOGDOMAIN "aqebics" #define EBICS_BUFFER_MAX_HARD_LIMIT (256*1024*1024) typedef uint32_t EB_RC; #define AQEBIC_RC_GET_CLASS(x) ((x>>4) & 0xff) #define AQEBIC_RC_GET_GRP(x) ((x>>2) & 0xf) #define AQEBIC_RC_GET_CODE(x) (x & 0xff) #define AQEBIC_RC_CLASS_INFO 0 #define AQEBIC_RC_CLASS_NOTICE 1 #define AQEBIC_RC_CLASS_WARNING 3 #define AQEBIC_RC_CLASS_ERROR 6 #define AQEBIC_RC_CLASS_FATAL 9 #define AQEBICS_RC_IS_INFO(x) (AQEBIC_RC_GET_CLASS(x)==AQEBIC_RC_CLASS_INFO) #define AQEBICS_RC_IS_NOTICE(x) (AQEBIC_RC_GET_CLASS(x)==AQEBIC_RC_CLASS_NOTICE) #define AQEBICS_RC_IS_WARNING(x) (AQEBIC_RC_GET_CLASS(x)==AQEBIC_RC_CLASS_WARNING) #define AQEBICS_RC_IS_ERROR(x) (AQEBIC_RC_GET_CLASS(x)==AQEBIC_RC_CLASS_ERROR) #define AQEBICS_RC_IS_FATAL(x) (AQEBIC_RC_GET_CLASS(x)==AQEBIC_RC_CLASS_FATAL) #define AQEBICS_RC_GRP_NONE 0 #define AQEBICS_RC_GRP_TRANS 1 #define AQEBICS_RC_GRP_KEY 2 #define AQEBICS_RC_GRP_PRE 3 #define AQEBICS_RC_NEW(class, grp, code) \ (((class & 0xff)<<4) |\ 0x1000 | \ ((grp & 0xf)<<2) |\ (code & 0xff)) #define EB_RC_OK 0x000000 #define EB_RC_DOWNLOAD_POSTPROCESS_DONE 0x011000 #define EB_RC_DOWNLOAD_POSTPROCESS_SKIPPED 0x011001 #define EB_RC_TX_SEGMENT_NUMBER_UNDERRUN 0x011101 #define EB_RC_AUTHENTICATION_FAILED 0x061001 #define EB_RC_INVALID_REQUEST 0x061002 #define EB_RC_INTERNAL_ERROR 0x061099 #define EB_RC_TX_RECOVERY_SYNC 0x061101 #define EB_RC_INVALID_USER_OR_STATE 0x091002 #define EB_RC_USER_UNKNOWN 0x091003 #define EB_RC_INVALID_USER_STATE 0x091004 #define EB_RC_INVALID_ORDER_TYPE 0x091005 #define EB_RC_UNSUPPORTED_ORDER_TYPE 0x091006 #define EB_RC_USER_AUTHENTICATION_REQUIRED 0x091007 #define EB_RC_BANK_PUBKEY_UPDATE_REQUIRED 0x091008 #define EB_RC_SEGMENT_SIZE_EXCEEDED 0x091009 #define EB_RC_TX_UNKNOWN_TXID 0x091101 #define EB_RC_TX_ABORT 0x091102 #define EB_RC_TX_MESSAGE_REPLAY 0x091103 #define EB_RC_TX_SEGMENT_NUMBER_EXCEEDED 0x091104 #define EB_RC_AUTHORISATION_FAILED 0x090003 #define EB_RC_NO_DOWNLOAD_DATA_AVAILABLE 0x090005 /* fachliche codes (key management) */ #define EB_RC_KEYMGMT_UNSUPPORTED_VERSION_SIGNATURE 0x091201 #define EB_RC_KEYMGMT_UNSUPPORTED_VERSION_AUTHENTICATION 0x091202 #define EB_RC_KEYMGMT_UNSUPPORTED_VERSION_ENCRYPTION 0x091203 #define EB_RC_KEYMGMT_KEYLENGTH_ERROR_SIGNATURE 0x091204 #define EB_RC_KEYMGMT_KEYLENGTH_ERROR_AUTHENTICATION 0x091205 #define EB_RC_KEYMGMT_KEYLENGTH_ERROR_ENCRYPTION 0x091206 #define EB_RC_KEYMGMT_NO_X509_SUPPORT 0x091207 #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/aqebics.xml.in0000644000175000017500000000102612364015477022733 00000000000000 @AQEBICS_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) EBICS This backend provides support for EBICS. @AQEBICS_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) EBICS Homebanking Erweiterung Diese Erweiterung erlaubt Homebanking mittels EBICS. aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/Makefile.in0000644000175000017500000010624612643540056022250 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqebics/plugin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/aqebics.xml.in $(top_srcdir)/depcomp \ $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = aqebics.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" \ "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(iheaderdir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = aqebics_la_DEPENDENCIES = libaqebics.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_aqebics_la_OBJECTS = aqebics-plugin.lo aqebics_la_OBJECTS = $(am_aqebics_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqebics_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(aqebics_la_LDFLAGS) $(LDFLAGS) -o $@ libaqebics_la_DEPENDENCIES = msg/libmsg.la dialogs/libdialogs.la \ client/libclient.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libaqebics_la_OBJECTS = dummy.lo libaqebics_la_OBJECTS = $(am_libaqebics_la_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqebics_la_SOURCES) $(libaqebics_la_SOURCES) DIST_SOURCES = $(aqebics_la_SOURCES) $(libaqebics_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(plugin_DATA) HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = msg client dialogs INCLUDES = -I.. -I$(top_builddir) -I$(srcdir)/client -I$(builddir)/client \ $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) AM_CFLAGS = -DBUILDING_AQEBICS @visibility_cflags@ EXTRA_DIST = aqebics.xml.in iheaderdir = ${includedir}/aqebics iheader_HEADERS = \ aqebics.h plugindir = $(aqbanking_plugindir)/providers plugin_DATA = aqebics.xml noinst_HEADERS = \ aqebics_l.h # library lib_LTLIBRARIES = libaqebics.la libaqebics_la_SOURCES = dummy.c libaqebics_la_LIBADD = \ msg/libmsg.la \ dialogs/libdialogs.la \ client/libclient.la $(AQEBICS_LIBS) $(gwenhywfar_libs) $(aqbanking_internal_libs) -lz # dynamic plugin plugin_LTLIBRARIES = aqebics.la aqebics_la_SOURCES = aqebics-plugin.c aqebics_la_LDFLAGS = -module -avoid-version aqebics_la_LIBADD = libaqebics.la $(AQEBICS_LIBS) $(gwenhywfar_libs) $(aqbanking_internal_libs) -lz all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): aqebics.xml: $(top_builddir)/config.status $(srcdir)/aqebics.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } aqebics.la: $(aqebics_la_OBJECTS) $(aqebics_la_DEPENDENCIES) $(EXTRA_aqebics_la_DEPENDENCIES) $(AM_V_CCLD)$(aqebics_la_LINK) -rpath $(plugindir) $(aqebics_la_OBJECTS) $(aqebics_la_LIBADD) $(LIBS) libaqebics.la: $(libaqebics_la_OBJECTS) $(libaqebics_la_DEPENDENCIES) $(EXTRA_libaqebics_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libaqebics_la_OBJECTS) $(libaqebics_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aqebics-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pluginDATA: $(plugin_DATA) @$(NORMAL_INSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(plugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(plugindir)" || exit $$?; \ done uninstall-pluginDATA: @$(NORMAL_UNINSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(plugindir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-iheaderHEADERS install-pluginDATA \ install-pluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-iheaderHEADERS uninstall-libLTLIBRARIES \ uninstall-pluginDATA uninstall-pluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pluginDATA install-pluginLTLIBRARIES install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-iheaderHEADERS \ uninstall-libLTLIBRARIES uninstall-pluginDATA \ uninstall-pluginLTLIBRARIES sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libaqebics_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/Makefile.am0000644000175000017500000000201412364015477022227 00000000000000SUBDIRS=msg client dialogs INCLUDES=-I.. -I$(top_builddir) -I$(srcdir)/client -I$(builddir)/client \ $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) AM_CFLAGS=-DBUILDING_AQEBICS @visibility_cflags@ EXTRA_DIST=aqebics.xml.in iheaderdir=${includedir}/aqebics iheader_HEADERS=\ aqebics.h plugindir= $(aqbanking_plugindir)/providers plugin_DATA=aqebics.xml noinst_HEADERS=\ aqebics_l.h # library lib_LTLIBRARIES=libaqebics.la libaqebics_la_SOURCES=dummy.c libaqebics_la_LIBADD=\ msg/libmsg.la \ dialogs/libdialogs.la \ client/libclient.la $(AQEBICS_LIBS) $(gwenhywfar_libs) $(aqbanking_internal_libs) -lz # dynamic plugin plugin_LTLIBRARIES=aqebics.la aqebics_la_SOURCES=aqebics-plugin.c aqebics_la_LDFLAGS=-module -avoid-version aqebics_la_LIBADD=libaqebics.la $(AQEBICS_LIBS) $(gwenhywfar_libs) $(aqbanking_internal_libs) -lz sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(libaqebics_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/0000755000175000017500000000000012643540661021676 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_newkeyfile_p.h0000644000175000017500000000306612364015477025305 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_NEWKEYFILE_P_H #define AQEBICS_DLG_NEWKEYFILE_P_H #include "dlg_newkeyfile_l.h" typedef struct EBC_NEWKEYFILE_DIALOG EBC_NEWKEYFILE_DIALOG; struct EBC_NEWKEYFILE_DIALOG { AB_BANKING *banking; char *fileName; char *bankCode; char *bankName; char *url; char *hostId; char *userName; char *userId; char *customerId; char *ebicsVersion; char *signVersion; char *cryptVersion; char *authVersion; int httpVMajor; int httpVMinor; int signKeySize; int cryptAndAuthKeySize; uint32_t flags; AB_USER *user; }; static void GWENHYWFAR_CB EBC_NewKeyFileDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB EBC_NewKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static int EBC_NewKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetBankPageData(GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetUserPageData(GWEN_DIALOG *dlg); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_user_special_p.h0000644000175000017500000000235712364015477025623 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_PINTAN_SPECIAL_P_H #define AQEBICS_DLG_PINTAN_SPECIAL_P_H #include "dlg_user_special_l.h" typedef struct EBC_USER_SPECIAL_DIALOG EBC_USER_SPECIAL_DIALOG; struct EBC_USER_SPECIAL_DIALOG { AB_BANKING *banking; int httpVMajor; int httpVMinor; char *ebicsVersion; char *signVersion; char *cryptVersion; char *authVersion; int signKeySize; int cryptAndAuthKeySize; uint32_t flags; }; static void GWENHYWFAR_CB EBC_UserSpecialDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB EBC_UserSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_user_special.c0000644000175000017500000004270212364015477025275 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_user_special_p.h" #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg GWEN_INHERIT(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG) GWEN_DIALOG *EBC_UserSpecialDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; EBC_USER_SPECIAL_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ah_setup_pintan_special"); GWEN_NEW_OBJECT(EBC_USER_SPECIAL_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg, xdlg, EBC_UserSpecialDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, EBC_UserSpecialDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/backends/aqebics/dialogs/dlg_user_special.dlg", fbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB EBC_UserSpecialDialog_FreeData(void *bp, void *p) { EBC_USER_SPECIAL_DIALOG *xdlg; xdlg=(EBC_USER_SPECIAL_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } int EBC_UserSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int EBC_UserSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void EBC_UserSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } uint32_t EBC_UserSpecialDialog_GetFlags(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void EBC_UserSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void EBC_UserSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void EBC_UserSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } const char *EBC_UserSpecialDialog_GetEbicsVersion(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->ebicsVersion; } void EBC_UserSpecialDialog_SetEbicsVersion(GWEN_DIALOG *dlg, const char *s) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->ebicsVersion); if (s) xdlg->ebicsVersion=strdup(s); else xdlg->ebicsVersion=NULL; } const char *EBC_UserSpecialDialog_GetSignVersion(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->signVersion; } void EBC_UserSpecialDialog_SetSignVersion(GWEN_DIALOG *dlg, const char *s) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->signVersion); if (s) xdlg->signVersion=strdup(s); else xdlg->signVersion=NULL; } const char *EBC_UserSpecialDialog_GetCryptVersion(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->cryptVersion; } void EBC_UserSpecialDialog_SetCryptVersion(GWEN_DIALOG *dlg, const char *s) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->cryptVersion); if (s) xdlg->cryptVersion=strdup(s); else xdlg->cryptVersion=NULL; } const char *EBC_UserSpecialDialog_GetAuthVersion(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->authVersion; } void EBC_UserSpecialDialog_SetAuthVersion(GWEN_DIALOG *dlg, const char *s) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->authVersion); if (s) xdlg->authVersion=strdup(s); else xdlg->authVersion=NULL; } int EBC_UserSpecialDialog_GetSignKeySize(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->signKeySize; } void EBC_UserSpecialDialog_SetSignKeySize(GWEN_DIALOG *dlg, int i) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->signKeySize=i; } int EBC_UserSpecialDialog_GetCryptAndAuthKeySize(const GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->cryptAndAuthKeySize; } void EBC_UserSpecialDialog_SetCryptAndAuthKeySize(GWEN_DIALOG *dlg, int i) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->cryptAndAuthKeySize=i; } void EBC_UserSpecialDialog_Init(GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("EBICS Special Settings"), 0); GWEN_Dialog_SetCharProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.3 (H002)", 0); GWEN_Dialog_SetCharProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.4 (H003)", 0); GWEN_Dialog_SetCharProperty(dlg, "signVersionCombo", GWEN_DialogProperty_AddValue, 0, "A004", 0); GWEN_Dialog_SetCharProperty(dlg, "signVersionCombo", GWEN_DialogProperty_AddValue, 0, "A005", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_AddValue, 0, "E001", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_AddValue, 0, "E002", 0); GWEN_Dialog_SetCharProperty(dlg, "authVersionCombo", GWEN_DialogProperty_AddValue, 0, "X001", 0); GWEN_Dialog_SetCharProperty(dlg, "authVersionCombo", GWEN_DialogProperty_AddValue, 0, "X002", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); GWEN_Dialog_SetCharProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "1024", 0); GWEN_Dialog_SetCharProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "2048", 0); GWEN_Dialog_SetCharProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "4096", 0); GWEN_Dialog_SetCharProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "8192", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "1024", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "2048", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "4096", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_AddValue, 0, "8192", 0); /* toGui */ /* protocol version */ s=xdlg->ebicsVersion; if (! (s && *s)) s="H003"; if (strcasecmp(s, "H002")==0) GWEN_Dialog_SetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "H003")==0) GWEN_Dialog_SetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* signature version */ s=xdlg->signVersion; if (! (s && *s)) s="A005"; if (strcasecmp(s, "A004")==0) GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "A005")==0) GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* crypt version */ s=xdlg->cryptVersion; if (! (s && *s)) s="E002"; if (strcasecmp(s, "E001")==0) GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "E002")==0) GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* auth version */ s=xdlg->authVersion; if (! (s && *s)) s="X002"; if (strcasecmp(s, "X001")==0) GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "X002")==0) GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* http version */ switch(((xdlg->httpVMajor)<<8)+xdlg->httpVMinor) { case 0x0100: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 0x0101: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } switch(xdlg->signKeySize) { case 128: GWEN_Dialog_SetIntProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 256: default: GWEN_Dialog_SetIntProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 512: GWEN_Dialog_SetIntProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 1024: GWEN_Dialog_SetIntProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; } switch(xdlg->cryptAndAuthKeySize) { case 128: GWEN_Dialog_SetIntProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 256: default: GWEN_Dialog_SetIntProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case 512: GWEN_Dialog_SetIntProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case 1024: GWEN_Dialog_SetIntProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; } GWEN_Dialog_SetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, (xdlg->flags & EBC_USER_FLAGS_FORCE_SSLV3)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "useIzlCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & EBC_USER_FLAGS_USE_IZL)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "noEuCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & EBC_USER_FLAGS_NO_EU)?1:0, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void EBC_UserSpecialDialog_Fini(GWEN_DIALOG *dlg) { EBC_USER_SPECIAL_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* fromGui */ i=GWEN_Dialog_GetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_UserSpecialDialog_SetEbicsVersion(dlg, "H002"); break; default: case 1: EBC_UserSpecialDialog_SetEbicsVersion(dlg, "H003"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_UserSpecialDialog_SetSignVersion(dlg, "A004"); break; default: case 1: EBC_UserSpecialDialog_SetSignVersion(dlg, "A005"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_UserSpecialDialog_SetCryptVersion(dlg, "E001"); break; default: case 1: EBC_UserSpecialDialog_SetCryptVersion(dlg, "E002"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_UserSpecialDialog_SetAuthVersion(dlg, "X001"); break; default: case 1: EBC_UserSpecialDialog_SetAuthVersion(dlg, "X002"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->httpVMajor=1; xdlg->httpVMinor=0; break; default: case 1: xdlg->httpVMajor=1; xdlg->httpVMinor=1; break; } i=GWEN_Dialog_GetIntProperty(dlg, "signKeySizeCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->signKeySize=128; break; default: case 1: xdlg->signKeySize=256; break; case 2: xdlg->signKeySize=512; break; case 3: xdlg->signKeySize=1024; break; } i=GWEN_Dialog_GetIntProperty(dlg, "cryptAndAuthKeySizeCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->cryptAndAuthKeySize=128; break; default: case 1: xdlg->cryptAndAuthKeySize=256; break; case 2: xdlg->cryptAndAuthKeySize=512; break; case 3: xdlg->cryptAndAuthKeySize=1024; break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_FORCE_SSLV3; if (GWEN_Dialog_GetIntProperty(dlg, "useIzlCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_USE_IZL; if (GWEN_Dialog_GetIntProperty(dlg, "noEuCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_NO_EU; xdlg->flags=flags; /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int EBC_UserSpecialDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_ERROR(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB EBC_UserSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { EBC_USER_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_USER_SPECIAL_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: EBC_UserSpecialDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: EBC_UserSpecialDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return EBC_UserSpecialDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_edituser.c0000644000175000017500000007004012364015477024437 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituser_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg GWEN_INHERIT(GWEN_DIALOG, EBC_EDIT_USER_DIALOG) GWEN_DIALOG *EBC_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; EBC_EDIT_USER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ebc_edit_user"); GWEN_NEW_OBJECT(EBC_EDIT_USER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg, xdlg, EBC_EditUserDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, EBC_EditUserDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/backends/aqebics/dialogs/dlg_edituser.dlg", fbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* preset */ xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB EBC_EditUserDialog_FreeData(void *bp, void *p) { EBC_EDIT_USER_DIALOG *xdlg; xdlg=(EBC_EDIT_USER_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQEBICS_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } const AB_COUNTRY *EBC_EditUserDialog_GetCurrentCountry(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void EBC_EditUserDialog_Init(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit User"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_User_GetCountry(xdlg->user); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_User_GetUserName(xdlg->user); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetBankCode(xdlg->user); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetUserId(xdlg->user); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetCustomerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=EBC_User_GetServerUrl(xdlg->user); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "urlEdit", GWEN_DialogProperty_Value, 0, s, 0); s=EBC_User_GetPeerId(xdlg->user); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "hostIdEdit", GWEN_DialogProperty_Value, 0, s, 0); GWEN_Dialog_SetCharProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.3 (H002)", 0); GWEN_Dialog_SetCharProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_AddValue, 0, "2.4 (H003)", 0); GWEN_Dialog_SetCharProperty(dlg, "signVersionCombo", GWEN_DialogProperty_AddValue, 0, "A004", 0); GWEN_Dialog_SetCharProperty(dlg, "signVersionCombo", GWEN_DialogProperty_AddValue, 0, "A005", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_AddValue, 0, "E001", 0); GWEN_Dialog_SetCharProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_AddValue, 0, "E002", 0); GWEN_Dialog_SetCharProperty(dlg, "authVersionCombo", GWEN_DialogProperty_AddValue, 0, "X001", 0); GWEN_Dialog_SetCharProperty(dlg, "authVersionCombo", GWEN_DialogProperty_AddValue, 0, "X002", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("EBICSUserStatus|new"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("EBICSUserStatus|init1"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("EBICSUserStatus|init2"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("EBICSUserStatus|enabled"), 0); GWEN_Dialog_SetCharProperty(dlg, "statusCombo", GWEN_DialogProperty_AddValue, 0, I18N("EBICSUserStatus|disabled"), 0); /* toGui */ EBC_EditUserDialog_toGui(dlg); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } void EBC_EditUserDialog_toGui(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; uint32_t flags; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); /* protocol version */ s=EBC_User_GetProtoVersion(xdlg->user); if (! (s && *s)) s="H003"; if (strcasecmp(s, "H002")==0) GWEN_Dialog_SetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "H003")==0) GWEN_Dialog_SetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* signature version */ s=EBC_User_GetSignVersion(xdlg->user); if (! (s && *s)) s="A005"; if (strcasecmp(s, "A004")==0) GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "A005")==0) GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* crypt version */ s=EBC_User_GetCryptVersion(xdlg->user); if (! (s && *s)) s="E002"; if (strcasecmp(s, "E001")==0) GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "E002")==0) GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* auth version */ s=EBC_User_GetAuthVersion(xdlg->user); if (! (s && *s)) s="X002"; if (strcasecmp(s, "X001")==0) GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); else if (strcasecmp(s, "X002")==0) GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); /* status */ switch(EBC_User_GetStatus(xdlg->user)) { case EBC_UserStatus_New: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case EBC_UserStatus_Init1: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; case EBC_UserStatus_Init2: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 2, 0); break; case EBC_UserStatus_Enabled: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 3, 0); break; case EBC_UserStatus_Disabled: GWEN_Dialog_SetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, 4, 0); break; default: break; } /* http version */ switch(((EBC_User_GetHttpVMajor(xdlg->user))<<8)+EBC_User_GetHttpVMinor(xdlg->user)) { case 0x0100: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 0x0101: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } /* flags */ flags=EBC_User_GetFlags(xdlg->user); GWEN_Dialog_SetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, (flags & EBC_USER_FLAGS_FORCE_SSLV3)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "useIzlCheck", GWEN_DialogProperty_Value, 0, (flags & EBC_USER_FLAGS_USE_IZL)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "noEuCheck", GWEN_DialogProperty_Value, 0, (flags & EBC_USER_FLAGS_NO_EU)?1:0, 0); } int EBC_EditUserDialog_fromGui(GWEN_DIALOG *dlg, AB_USER *u, int quiet) { EBC_EDIT_USER_DIALOG *xdlg; const char *s; const AB_COUNTRY *c; int i; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserName(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (u) AB_User_SetBankCode(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetCustomerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "urlEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) EBC_User_SetServerUrl(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "hostIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) EBC_User_SetPeerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get country */ c=EBC_EditUserDialog_GetCurrentCountry(dlg); if (c) { if (u) AB_User_SetCountry(u, AB_Country_GetCode(c)); } i=GWEN_Dialog_GetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetProtoVersion(xdlg->user, "H002"); break; default: case 1: EBC_User_SetProtoVersion(xdlg->user, "H003"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetSignVersion(xdlg->user, "A004"); break; default: case 1: EBC_User_SetSignVersion(xdlg->user, "A005"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetCryptVersion(xdlg->user, "E001"); break; default: case 1: EBC_User_SetCryptVersion(xdlg->user, "E002"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetAuthVersion(xdlg->user, "X001"); break; default: case 1: EBC_User_SetAuthVersion(xdlg->user, "X002"); break; } i=GWEN_Dialog_GetIntProperty(dlg, "statusCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetStatus(xdlg->user, EBC_UserStatus_New); break; case 1: EBC_User_SetStatus(xdlg->user, EBC_UserStatus_Init1); break; case 2: EBC_User_SetStatus(xdlg->user, EBC_UserStatus_Init2); break; case 3: EBC_User_SetStatus(xdlg->user, EBC_UserStatus_Enabled); break; case 4: EBC_User_SetStatus(xdlg->user, EBC_UserStatus_Disabled); break; default: break; } i=GWEN_Dialog_GetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: EBC_User_SetHttpVMajor(xdlg->user, 1); EBC_User_SetHttpVMinor(xdlg->user, 0); break; default: case 1: EBC_User_SetHttpVMajor(xdlg->user, 1); EBC_User_SetHttpVMinor(xdlg->user, 1); break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_FORCE_SSLV3; if (GWEN_Dialog_GetIntProperty(dlg, "useIzlCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_USE_IZL; if (GWEN_Dialog_GetIntProperty(dlg, "noEuCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=EBC_USER_FLAGS_NO_EU; EBC_User_SetFlags(xdlg->user, flags); return 0; } void EBC_EditUserDialog_Fini(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int EBC_EditUserDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could create dialog, maybe incomplete installation?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int EBC_EditUserDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); rv=EBC_EditUserDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock user. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } EBC_EditUserDialog_fromGui(dlg, xdlg->user, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock user."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } static int EBC_EditUserDialog_HandleActivatedGetBankKeys(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int rv; uint32_t guiid; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Send_HPB(AB_User_GetProvider(xdlg->user), xdlg->user, 1); EBC_EditUserDialog_toGui(dlg); GWEN_Gui_ProgressEnd(guiid); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Error sending key request (%d)", rv); return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } static int EBC_EditUserDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); if ((EBC_User_GetStatus(xdlg->user)==EBC_UserStatus_Enabled) && (EBC_User_GetFlags(xdlg->user) & EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP)) { uint32_t guiid; int rv1; int rv2; guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv1=EBC_Provider_Send_HKD(AB_User_GetProvider(xdlg->user), xdlg->user, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "Retrieving user information"); rv2=EBC_Provider_Send_HTD(AB_User_GetProvider(xdlg->user), xdlg->user, 1); GWEN_Gui_ProgressEnd(guiid); if ((rv1<0) && (rv2<0)) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Couldn't send HKD or HTD request (%d, %d)", rv1, rv2); } } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "The bank does not support download of account information"); } return GWEN_DialogEvent_ResultHandled; } static int EBC_EditUserDialog_HandleActivatedIniLetter(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ //GWEN_Buffer_AppendString(tbuf, ""); rv=EBC_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } //GWEN_Buffer_AppendString(tbuf, ""); #if 0 /* add ASCII version of the INI letter for frontends which don't support HTML */ rv=EBC_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } #endif rv=GWEN_Gui_Print(I18N("INI Letter"), "EBICS-INILETTER", I18N("INI Letter for EBICS"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } static int EBC_EditUserDialog_HandleActivatedHiaLetter(GWEN_DIALOG *dlg) { EBC_EDIT_USER_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ //GWEN_Buffer_AppendString(tbuf, ""); rv=EBC_Provider_GetHiaLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } //GWEN_Buffer_AppendString(tbuf, ""); #if 0 /* add ASCII version of the HIA letter for frontends which don't support HTML */ rv=EBC_Provider_GetHIALetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } #endif rv=GWEN_Gui_Print(I18N("HIA Letter"), "EBICS-HIALETTER", I18N("HIA Letter for EBICS"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } int EBC_EditUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return EBC_EditUserDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "getBankKeysButton")==0) return EBC_EditUserDialog_HandleActivatedGetBankKeys(dlg); else if (strcasecmp(sender, "getAccountsButton")==0) return EBC_EditUserDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "iniLetterButton")==0) return EBC_EditUserDialog_HandleActivatedIniLetter(dlg); else if (strcasecmp(sender, "hiaLetterButton")==0) return EBC_EditUserDialog_HandleActivatedHiaLetter(dlg); else if (strcasecmp(sender, "ebicsVersionCombo")==0) { int i; i=GWEN_Dialog_GetIntProperty(dlg, "ebicsVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: /* H002 */ GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; default: case 1: /* H003 */ GWEN_Dialog_SetIntProperty(dlg, "signVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "cryptVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "authVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; } return GWEN_DialogEvent_ResultHandled; } else if (strcasecmp(sender, "okButton")==0) return EBC_EditUserDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB EBC_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { EBC_EDIT_USER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_EDIT_USER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: EBC_EditUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: EBC_EditUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultNotHandled; case GWEN_DialogEvent_TypeActivated: return EBC_EditUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/Makefile.in0000644000175000017500000006463312643540056023675 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqebics/plugin/dialogs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libdialogs_la_LIBADD = am_libdialogs_la_OBJECTS = dlg_edituser.lo dlg_newkeyfile.lo \ dlg_user_special.lo libdialogs_la_OBJECTS = $(am_libdialogs_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libdialogs_la_SOURCES) DIST_SOURCES = $(libdialogs_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dlgdatadir)" DATA = $(dlgdata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I.. -I$(top_builddir) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) AM_CFLAGS = -DBUILDING_AQEBICS @visibility_cflags@ #typefiles= noinst_LTLIBRARIES = libdialogs.la noinst_HEADERS = \ dlg_edituser_l.h dlg_edituser_p.h \ dlg_newkeyfile_l.h dlg_newkeyfile_p.h \ dlg_user_special_l.h dlg_user_special_p.h libdialogs_la_SOURCES = \ dlg_edituser.c \ dlg_newkeyfile.c \ dlg_user_special.c dlgdatadir = $(datadir)/aqbanking/backends/aqebics/dialogs dlgdata_DATA = \ dlg_edituser.dlg \ dlg_newkeyfile.dlg \ dlg_user_special.dlg EXTRA_DIST = $(typefiles) $(dlgdata_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/dialogs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/plugin/dialogs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libdialogs.la: $(libdialogs_la_OBJECTS) $(libdialogs_la_DEPENDENCIES) $(EXTRA_libdialogs_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libdialogs_la_OBJECTS) $(libdialogs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newkeyfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_user_special.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dlgdataDATA: $(dlgdata_DATA) @$(NORMAL_INSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgdatadir)" || exit $$?; \ done uninstall-dlgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dlgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dlgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dlgdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dlgdataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dlgdataDATA types: $(typefiles) typemaker $(typefiles) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(libdialogs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_edituser.dlg0000644000175000017500000001121612364015477024763 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_user_special_l.h0000644000175000017500000000457212364015477025620 00000000000000/*************************************************************************** begin : Mon Apr 12 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_PINTAN_SPECIAL_H #define AQEBICS_DLG_PINTAN_SPECIAL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *EBC_UserSpecialDialog_new(AB_BANKING *ab); int EBC_UserSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int EBC_UserSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); uint32_t EBC_UserSpecialDialog_GetFlags(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void EBC_UserSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void EBC_UserSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); const char *EBC_UserSpecialDialog_GetEbicsVersion(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetEbicsVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_UserSpecialDialog_GetSignVersion(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetSignVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_UserSpecialDialog_GetCryptVersion(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetCryptVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_UserSpecialDialog_GetAuthVersion(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetAuthVersion(GWEN_DIALOG *dlg, const char *s); int EBC_UserSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int EBC_UserSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); int EBC_UserSpecialDialog_GetSignKeySize(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetSignKeySize(GWEN_DIALOG *dlg, int i); int EBC_UserSpecialDialog_GetCryptAndAuthKeySize(const GWEN_DIALOG *dlg); void EBC_UserSpecialDialog_SetCryptAndAuthKeySize(GWEN_DIALOG *dlg, int i); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/Makefile.am0000644000175000017500000000164212364015477023657 00000000000000 INCLUDES=-I.. -I$(top_builddir) $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) DEFS += -DLOCALEDIR=\"$(localedir)\" AM_CFLAGS=-DBUILDING_AQEBICS @visibility_cflags@ #typefiles= noinst_LTLIBRARIES=libdialogs.la noinst_HEADERS=\ dlg_edituser_l.h dlg_edituser_p.h \ dlg_newkeyfile_l.h dlg_newkeyfile_p.h \ dlg_user_special_l.h dlg_user_special_p.h libdialogs_la_SOURCES=\ dlg_edituser.c \ dlg_newkeyfile.c \ dlg_user_special.c dlgdatadir=$(datadir)/aqbanking/backends/aqebics/dialogs dlgdata_DATA=\ dlg_edituser.dlg \ dlg_newkeyfile.dlg \ dlg_user_special.dlg EXTRA_DIST=$(typefiles) $(dlgdata_DATA) types: $(typefiles) typemaker $(typefiles) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(libdialogs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_newkeyfile.dlg0000644000175000017500000001125312364015477025302 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_user_special.dlg0000644000175000017500000000461712364015477025624 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_edituser_p.h0000644000175000017500000000224512364015477024765 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_EDITUSER_P_H #define AQEBICS_DLG_EDITUSER_P_H #include "dlg_edituser_l.h" #include typedef struct EBC_EDIT_USER_DIALOG EBC_EDIT_USER_DIALOG; struct EBC_EDIT_USER_DIALOG { AB_BANKING *banking; AB_USER *user; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB EBC_EditUserDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB EBC_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static void EBC_EditUserDialog_toGui(GWEN_DIALOG *dlg); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_newkeyfile_l.h0000644000175000017500000000550312364015477025277 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_NEWKEYFILE_H #define AQEBICS_DLG_NEWKEYFILE_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *EBC_NewKeyFileDialog_new(AB_BANKING *ab); const char *EBC_NewKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetEbicsVersion(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetEbicsVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetSignVersion(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetSignVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetCryptVersion(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetCryptVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetAuthVersion(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetAuthVersion(GWEN_DIALOG *dlg, const char *s); const char *EBC_NewKeyFileDialog_GetHostId(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetHostId(GWEN_DIALOG *dlg, const char *s); uint32_t EBC_NewKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg); void EBC_NewKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void EBC_NewKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void EBC_NewKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); AB_USER *EBC_NewKeyFileDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_edituser_l.h0000644000175000017500000000151312364015477024756 00000000000000/*************************************************************************** begin : Thu Jul 08 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQEBICS_DLG_EDITUSER_H #define AQEBICS_DLG_EDITUSER_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *EBC_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/dialogs/dlg_newkeyfile.c0000644000175000017500000013324712364015477024766 00000000000000/*************************************************************************** begin : Sat Jun 26 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newkeyfile_p.h" #include #include #include #include #include #include "dlg_user_special_l.h" #include #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_FILE 1 #define PAGE_BANK 2 #define PAGE_USER 3 #define PAGE_CREATE 4 #define PAGE_END 5 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg GWEN_INHERIT(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG) GWEN_DIALOG *EBC_NewKeyFileDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; EBC_NEWKEYFILE_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ebc_setup_newkeyfile"); GWEN_NEW_OBJECT(EBC_NEWKEYFILE_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg, xdlg, EBC_NewKeyFileDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, EBC_NewKeyFileDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/backends/aqebics/dialogs/dlg_newkeyfile.dlg", fbuf); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d).", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not read dialog description file [%s], maybe an installation error (%d)?"), GWEN_Buffer_GetStart(fbuf), rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->ebicsVersion=strdup("H003"); xdlg->signVersion=strdup("A005"); xdlg->cryptVersion=strdup("E002"); xdlg->authVersion=strdup("X002"); xdlg->signKeySize=256; xdlg->cryptAndAuthKeySize=256; xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB EBC_NewKeyFileDialog_FreeData(void *bp, void *p) { EBC_NEWKEYFILE_DIALOG *xdlg; xdlg=(EBC_NEWKEYFILE_DIALOG*) p; free(xdlg->fileName); free(xdlg->bankCode); free(xdlg->bankName); free(xdlg->userName); free(xdlg->userId); free(xdlg->customerId); free(xdlg->ebicsVersion); free(xdlg->signVersion); free(xdlg->cryptVersion); free(xdlg->authVersion); GWEN_FREE_OBJECT(xdlg); } AB_USER *EBC_NewKeyFileDialog_GetUser(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *EBC_NewKeyFileDialog_GetFileName(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->fileName; } void EBC_NewKeyFileDialog_SetFileName(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->fileName); if (s) xdlg->fileName=strdup(s); else xdlg->fileName=NULL; } const char *EBC_NewKeyFileDialog_GetBankCode(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankCode; } void EBC_NewKeyFileDialog_SetBankCode(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankCode); if (s) xdlg->bankCode=strdup(s); else xdlg->bankCode=NULL; } const char *EBC_NewKeyFileDialog_GetBankName(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void EBC_NewKeyFileDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *EBC_NewKeyFileDialog_GetUserName(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void EBC_NewKeyFileDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *EBC_NewKeyFileDialog_GetUserId(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void EBC_NewKeyFileDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *EBC_NewKeyFileDialog_GetCustomerId(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->customerId; } void EBC_NewKeyFileDialog_SetCustomerId(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->customerId); if (s) xdlg->customerId=strdup(s); else xdlg->customerId=NULL; } const char *EBC_NewKeyFileDialog_GetUrl(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->url; } void EBC_NewKeyFileDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } const char *EBC_NewKeyFileDialog_GetEbicsVersion(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->ebicsVersion; } void EBC_NewKeyFileDialog_SetEbicsVersion(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->ebicsVersion); if (s) xdlg->ebicsVersion=strdup(s); else xdlg->ebicsVersion=NULL; } const char *EBC_NewKeyFileDialog_GetSignVersion(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->signVersion; } void EBC_NewKeyFileDialog_SetSignVersion(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->signVersion); if (s) xdlg->signVersion=strdup(s); else xdlg->signVersion=NULL; } const char *EBC_NewKeyFileDialog_GetCryptVersion(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->cryptVersion; } void EBC_NewKeyFileDialog_SetCryptVersion(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->cryptVersion); if (s) xdlg->cryptVersion=strdup(s); else xdlg->cryptVersion=NULL; } const char *EBC_NewKeyFileDialog_GetAuthVersion(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->authVersion; } void EBC_NewKeyFileDialog_SetAuthVersion(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->authVersion); if (s) xdlg->authVersion=strdup(s); else xdlg->authVersion=NULL; } const char *EBC_NewKeyFileDialog_GetHostId(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->hostId; } void EBC_NewKeyFileDialog_SetHostId(GWEN_DIALOG *dlg, const char *s) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); free(xdlg->hostId); if (s) xdlg->hostId=strdup(s); else xdlg->hostId=NULL; } uint32_t EBC_NewKeyFileDialog_GetFlags(const GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void EBC_NewKeyFileDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void EBC_NewKeyFileDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void EBC_NewKeyFileDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void EBC_NewKeyFileDialog_Init(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("EBICS Keyfile Setup Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("This dialog assists you in setting up a Keyfile User.\n"), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please select the bank.

" "

AqBanking has an internal database which " "contains EBICS information about a few banks.

" "

If there is an entry for your bank this dialog will use the " "information from the database.

" "" "Please select the bank.\n" "AqBanking has an internal database which contains EBICS information\n" "about a few banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database." ), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please enter the necessary information below. You can " "probably find this information in the letter you received from " "your bank in response to the application for an EBICS account." "

" "" "Please enter the necessary information below. You can probably find\n" "this information in the letter you received from your bank in response\n" "to the application for an EBICS account."), 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user and exchange keys with the server.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user and exchange keys with the server.\n" "Click the \"next\" button to proceed or \"abort\" to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("" "

The user has been successfully created.

" "

You must now print the INI and HIA letter (click the button below) " "and send it to the bank.

" "

The activation of your account by the bank can take a few days.

" "" "The user has been successfully created.\n" "You must now \"print\" the INI and HIA letter (click the button below)\n" "and \"send\" it to the bank.\n" "The activation of your account by the bank can take a few days."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void EBC_NewKeyFileDialog_Fini(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int EBC_NewKeyFileDialog_GetFilePageData(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetFileName(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing file name"); return GWEN_ERROR_NO_DATA; } return 0; } int EBC_NewKeyFileDialog_GetBankPageData(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetBankCode(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing bank code"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetBankName(dlg, s); else EBC_NewKeyFileDialog_SetBankName(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetUrl(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_hostid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetHostId(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing host id"); return GWEN_ERROR_NO_DATA; } return 0; } void EBC_NewKeyFileDialog_SetBankPageData(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=xdlg->bankCode; GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=xdlg->bankName; GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=xdlg->url; GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=xdlg->hostId; GWEN_Dialog_SetCharProperty(dlg, "wiz_hostid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } int EBC_NewKeyFileDialog_GetUserPageData(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetUserName(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetUserId(dlg, s); else { DBG_INFO(AQEBICS_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) EBC_NewKeyFileDialog_SetCustomerId(dlg, s); else EBC_NewKeyFileDialog_SetCustomerId(dlg, NULL); return 0; } void EBC_NewKeyFileDialog_SetUserPageData(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); s=xdlg->userName; GWEN_Dialog_SetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=xdlg->userId; GWEN_Dialog_SetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=xdlg->customerId; GWEN_Dialog_SetCharProperty(dlg, "wiz_customerid_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } int EBC_NewKeyFileDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { EBC_NEWKEYFILE_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_FILE: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=EBC_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=EBC_NewKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=EBC_NewKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_DoIt(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; AB_USER *u; int rv; uint32_t pid; AB_PROVIDER *pro; GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); rv=EBC_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "No file?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } pro=AB_Banking_GetProvider(xdlg->banking, "aqebics"); if (pro==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } u=AB_Banking_CreateUser(xdlg->banking, "aqebics"); if (u==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* EBICS setup */ EBC_User_SetTokenType(u, "ohbci"); EBC_User_SetTokenName(u, EBC_NewKeyFileDialog_GetFileName(dlg)); EBC_User_SetTokenContextId(u, 1); EBC_User_SetStatus(u, EBC_UserStatus_New); EBC_User_SetProtoVersion(u, xdlg->ebicsVersion); EBC_User_SetSignVersion(u, xdlg->signVersion); EBC_User_SetCryptVersion(u, xdlg->cryptVersion); EBC_User_SetAuthVersion(u, xdlg->authVersion); EBC_User_SetHttpVMajor(u, xdlg->httpVMajor); EBC_User_SetHttpVMinor(u, xdlg->httpVMinor); EBC_User_SetFlags(u, xdlg->flags); /* create CryptToken */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Plugin manager not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, EBC_User_GetTokenType(u)); if (pl==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Plugin not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), EBC_User_GetTokenType(u)); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, EBC_User_GetTokenName(u)); if (ct==0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create crypt token"); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* create crypt token */ rv=GWEN_Crypt_Token_Create(ct, 0); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be created. Maybe there already is a file of that name (%d)."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* close crypt token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not close token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be closed. Please check disc space."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); unlink(EBC_User_GetTokenName(u)); return GWEN_DialogEvent_ResultHandled; } EBC_User_SetServerUrl(u, xdlg->url); EBC_User_SetPeerId(u, xdlg->hostId); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not add user (%d)", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add HBCI user, maybe there already is a user of that id (%d)"), rv); AB_User_free(u); DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not add user, maybe there already is a user of the same id (%d)?", rv); return GWEN_DialogEvent_ResultHandled; } i=1; if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_INI)) i++; if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_HIA)) i++; pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Keyfile User"), I18N("The keys will now be created and sent to the bank."), i, /* mkKeys, sendKeys */ 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* generate keys */ rv=EBC_Provider_CreateKeys(pro, u, xdlg->cryptAndAuthKeySize, xdlg->signKeySize, 1); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Error generating keys: %d"), rv); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* send user keys */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Sending user keys")); if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_INI)) { rv=EBC_Provider_Send_INI(pro, u, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_HIA)) { rv=EBC_Provider_Send_HIA(pro, u, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(EBC_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); EBC_NewKeyFileDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_Next(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return EBC_NewKeyFileDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return EBC_NewKeyFileDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; AB_BANKINFO_SERVICE *sv; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankcode_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s && strcasecmp(s, "EBICS")==0) break; sv=AB_BankInfoService_List_Next(sv); } if (sv) { /* EBICS service found */ s=AB_BankInfoService_GetAddress(sv); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); free(xdlg->ebicsVersion); xdlg->ebicsVersion=NULL; free(xdlg->signVersion); xdlg->signVersion=NULL; free(xdlg->cryptVersion); xdlg->cryptVersion=NULL; free(xdlg->authVersion); xdlg->authVersion=NULL; s=AB_BankInfoService_GetPversion(sv); if (s && *s) { if (strcasecmp(s, "H002")==0) { xdlg->ebicsVersion=strdup("H002"); xdlg->signVersion=strdup("A004"); xdlg->cryptVersion=strdup("E001"); xdlg->authVersion=strdup("X001"); } else if (strcasecmp(s, "H003")==0) { xdlg->ebicsVersion=strdup("H003"); xdlg->signVersion=strdup("A005"); xdlg->cryptVersion=strdup("E002"); xdlg->authVersion=strdup("X002"); } } if (xdlg->ebicsVersion==NULL) { xdlg->ebicsVersion=strdup("H003"); xdlg->signVersion=strdup("A005"); xdlg->cryptVersion=strdup("E002"); xdlg->authVersion=strdup("X002"); } } } } GWEN_Dialog_free(dlg2); if (EBC_NewKeyFileDialog_GetBankPageData(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); dlg2=EBC_UserSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQEBICS_LOGDOMAIN, "Could not create dialog"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not create dialog, maybe an installation error?")); return GWEN_DialogEvent_ResultHandled; } EBC_UserSpecialDialog_SetEbicsVersion(dlg2, xdlg->ebicsVersion); EBC_UserSpecialDialog_SetSignVersion(dlg2, xdlg->signVersion); EBC_UserSpecialDialog_SetCryptVersion(dlg2, xdlg->cryptVersion); EBC_UserSpecialDialog_SetAuthVersion(dlg2, xdlg->authVersion); EBC_UserSpecialDialog_SetSignKeySize(dlg2, xdlg->signKeySize); EBC_UserSpecialDialog_SetCryptAndAuthKeySize(dlg2, xdlg->cryptAndAuthKeySize); EBC_UserSpecialDialog_SetHttpVersion(dlg2, xdlg->httpVMajor, xdlg->httpVMinor); EBC_UserSpecialDialog_SetFlags(dlg2, xdlg->flags); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { s=EBC_UserSpecialDialog_GetEbicsVersion(dlg2); EBC_NewKeyFileDialog_SetEbicsVersion(dlg, s); s=EBC_UserSpecialDialog_GetSignVersion(dlg2); EBC_NewKeyFileDialog_SetSignVersion(dlg, s); s=EBC_UserSpecialDialog_GetCryptVersion(dlg2); EBC_NewKeyFileDialog_SetCryptVersion(dlg, s); s=EBC_UserSpecialDialog_GetAuthVersion(dlg2); EBC_NewKeyFileDialog_SetAuthVersion(dlg, s); xdlg->signKeySize=EBC_UserSpecialDialog_GetSignKeySize(dlg2); xdlg->cryptAndAuthKeySize=EBC_UserSpecialDialog_GetCryptAndAuthKeySize(dlg2); xdlg->httpVMajor=EBC_UserSpecialDialog_GetHttpVMajor(dlg2); xdlg->httpVMinor=EBC_UserSpecialDialog_GetHttpVMinor(dlg2); xdlg->flags=EBC_UserSpecialDialog_GetFlags(dlg2); } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_HandleActivatedFileButton(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; int rv; const char *s; GWEN_BUFFER *pathBuffer; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); pathBuffer=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) GWEN_Buffer_AppendString(pathBuffer, s); rv=GWEN_Gui_GetFileName(I18N("Create Keyfile"), GWEN_Gui_FileNameType_SaveFileName, 0, I18N("All Files (*)\tOHBCI Files (*ohbci;*.medium)"), pathBuffer, GWEN_Dialog_GetGuiId(dlg)); if (rv==0) { GWEN_Dialog_SetCharProperty(dlg, "wiz_filename_edit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(pathBuffer), 0); rv=EBC_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else { DBG_ERROR(AQEBICS_LOGDOMAIN, "here (%d)", rv); } GWEN_Buffer_free(pathBuffer); return GWEN_DialogEvent_ResultHandled; } static int EBC_NewKeyFileDialog_HandleActivatedIniLetter(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ //GWEN_Buffer_AppendString(tbuf, ""); rv=EBC_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } //GWEN_Buffer_AppendString(tbuf, ""); #if 0 /* add ASCII version of the INI letter for frontends which don't support HTML */ rv=EBC_Provider_GetIniLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } #endif rv=GWEN_Gui_Print(I18N("INI Letter"), "EBICS-INILETTER", I18N("INI Letter for EBICS"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } static int EBC_NewKeyFileDialog_HandleActivatedHiaLetter(GWEN_DIALOG *dlg) { EBC_NEWKEYFILE_DIALOG *xdlg; int rv; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add HTML version of the INI letter */ //GWEN_Buffer_AppendString(tbuf, ""); rv=EBC_Provider_GetHiaLetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } //GWEN_Buffer_AppendString(tbuf, ""); #if 0 /* add ASCII version of the HIA letter for frontends which don't support HTML */ rv=EBC_Provider_GetHIALetterTxt(AB_User_GetProvider(xdlg->user), xdlg->user, 0, tbuf, 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message AB_Banking_ClearCryptTokenList(xdlg->banking); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } #endif rv=GWEN_Gui_Print(I18N("HIA Letter"), "EBICS-HIALETTER", I18N("HIA Letter for EBICS"), GWEN_Buffer_GetStart(tbuf), 0); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); // TODO: show error message GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } int EBC_NewKeyFileDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_button")==0) return EBC_NewKeyFileDialog_HandleActivatedFileButton(dlg); else if (strcasecmp(sender, "wiz_bankcode_button")==0) return EBC_NewKeyFileDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "wiz_prev_button")==0) return EBC_NewKeyFileDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return EBC_NewKeyFileDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_special_button")==0) return EBC_NewKeyFileDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_iniletter_button")==0) return EBC_NewKeyFileDialog_HandleActivatedIniLetter(dlg); else if (strcasecmp(sender, "wiz_hialetter_button")==0) return EBC_NewKeyFileDialog_HandleActivatedHiaLetter(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int EBC_NewKeyFileDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_filename_edit")==0 || strcasecmp(sender, "wiz_bankcode_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_customerid_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_FILE) { rv=EBC_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=EBC_NewKeyFileDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=EBC_NewKeyFileDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB EBC_NewKeyFileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { EBC_NEWKEYFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, EBC_NEWKEYFILE_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: EBC_NewKeyFileDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: EBC_NewKeyFileDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return EBC_NewKeyFileDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return EBC_NewKeyFileDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/plugin/aqebics-plugin.c0000644000175000017500000000303112364015477023242 00000000000000/*************************************************************************** $RCSfile: user.c,v $ ------------------- cvs : $Id: user.c,v 1.4 2006/01/17 22:58:29 aquamaniac Exp $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "provider_l.h" #include "aqebics.h" #include #include #include AB_PROVIDER *AB_Plugin_ProviderEBICS_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ return EBC_Provider_new(ab); } /* interface to gwens plugin loader */ AQBANKING_EXPORT GWEN_PLUGIN *provider_aqebics_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_Provider_new(pm, name, fileName); AB_Plugin_Provider_SetFactoryFn(pl, AB_Plugin_ProviderEBICS_Factory); return pl; } int EBC_Plugins_Init() { GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *p; /* providers */ pm=GWEN_PluginManager_FindPluginManager("provider"); if (pm) { p=provider_aqebics_factory(pm, "aqebics", NULL); if (p) GWEN_PluginManager_AddPlugin(pm, p); } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/Makefile.am0000644000175000017500000000032312364015477020732 00000000000000SUBDIRS=plugin tools CLEANFILES = $(BUILT_SOURCES) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/0000755000175000017500000000000012643540661020116 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/0000755000175000017500000000000012643540661022500 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/mkpinlist.c0000644000175000017500000001223712364015477024605 00000000000000/*************************************************************************** begin : Thu Jul 03 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int mkPinList(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; GWEN_SYNCIO *sio; AB_USER_LIST2 *ul; int rv; const char *outFile; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the name of the output file", /* short description */ "Specify the name of the output file" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } outFile=GWEN_DB_GetCharValue(db, "outfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, "aqebics"); assert(pro); if (outFile==0) { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } else { sio=GWEN_SyncIo_File_new(outFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error opening output file: %s", strerror(errno)); return 4; } } GWEN_SyncIo_WriteLine(sio, "# This is a PIN file to be used " "with AqBanking"); GWEN_SyncIo_WriteLine(sio, "# Please insert the PINs/passwords " "for the users below"); ul=AB_Banking_FindUsers(ab, "aqebics", "*", "*", "*", "*"); if (ul) { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); if (uit) { AB_USER *u; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { const char *s; GWEN_BUFFER *nbuf; int rv; GWEN_SyncIo_WriteLine(sio, ""); GWEN_SyncIo_WriteString(sio, "# User \""); s=AB_User_GetUserId(u); assert(s); GWEN_SyncIo_WriteString(sio, s); GWEN_SyncIo_WriteString(sio, "\" at \""); s=AB_User_GetBankCode(u); GWEN_SyncIo_WriteString(sio, s); GWEN_SyncIo_WriteLine(sio, "\""); nbuf=GWEN_Buffer_new(0, 256 ,0 ,1); rv=EBC_User_MkPasswdName(u, nbuf); if (rv==0) { GWEN_BUFFER *obuf; obuf=GWEN_Buffer_new(0, 256 ,0 ,1); if (GWEN_Text_EscapeToBufferTolerant(GWEN_Buffer_GetStart(nbuf), obuf)) { DBG_ERROR(0, "Error escaping name to buffer"); return 3; } GWEN_SyncIo_WriteString(sio, GWEN_Buffer_GetStart(obuf)); GWEN_SyncIo_WriteLine(sio, " = \"\""); GWEN_Buffer_free(obuf); } GWEN_Buffer_free(nbuf); u=AB_User_List2Iterator_Next(uit); } AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_ERROR_ERR(0, rv); GWEN_SyncIo_free(sio); return 4; } GWEN_SyncIo_free(sio); rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/createkeys.c0000644000175000017500000001363312364015477024733 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int createKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int cryptAndAuthKeySize; int signKeySize; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "cryptAndAuthKeySize", 0, 1, "s", "keysize", "Specify the keysize in bytes", "Specify the keysize in bytes" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "signKeySize", 0, 1, "S", "signkeysize", "Specify the keysize in bytes", "Specify the keysize in bytes" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); cryptAndAuthKeySize=GWEN_DB_GetIntValue(db, "cryptAndAuthKeySize", 0, 256); signKeySize=GWEN_DB_GetIntValue(db, "signKeySize", 0, 256); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Creating keys"), I18N("Now the keys are created."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_CreateKeys(pro, u, cryptAndAuthKeySize, signKeySize, 0); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error creating keys (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/listusers.c0000644000175000017500000001113412364015477024623 00000000000000/*************************************************************************** begin : Fri Sep 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int listUsers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; int xml=0; AB_USER_LIST2 *ul; const GWEN_ARGS args[]={ { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "xml", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "xml", /* long option */ "Export as xml", /* short description */ 0 }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } xml=GWEN_DB_VariableExists(db, "xml"); if( xml ) { fprintf( stdout, "\n" ); fprintf( stdout, "\n" ); } ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "*", "*", "*", "*"); if (ul) { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); if (uit) { AB_USER *u; int i=0; u=AB_User_List2Iterator_Data(uit); assert(u); while(u) { if( !xml ) { fprintf(stdout, "User %d: Bank: %s/%s User Id: %s Customer Id: %s\n", i++, AB_User_GetCountry(u), AB_User_GetBankCode(u), AB_User_GetUserId(u), AB_User_GetCustomerId(u)); } else { const char *name = AB_User_GetUserName(u); fprintf( stdout, " \n" ); fprintf( stdout, " %d\n", AB_User_GetUniqueId(u) ); if( !name ) fprintf( stdout, " \n" ); else fprintf( stdout, " \n", name ); fprintf( stdout, " %s\n", AB_User_GetUserId(u) ); fprintf( stdout, " %s\n", AB_User_GetCustomerId(u) ); fprintf( stdout, " %s\n", AB_User_GetBankCode(u) ); fprintf( stdout, " %s\n", AB_User_GetCountry(u) ); fprintf( stdout, " %d\n", AB_User_GetLastSessionId(u) ); fprintf( stdout, " \n\n" ); } u=AB_User_List2Iterator_Next(uit); } AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } else { fprintf(stderr, "No users found.\n"); } if( xml ) { fprintf( stdout, "\n" ); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/getaccounts.c0000644000175000017500000001456012364015477025113 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); fprintf(stderr, "Retrieving bank parameter data\n"); rv=EBC_Provider_Send_HPD(pro, u, 1); if (rv<0) { DBG_ERROR(0, "Error retrieving bank parameter data (%d)", rv); GWEN_Gui_ProgressEnd(guiid); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } if ((EBC_User_GetStatus(u)==EBC_UserStatus_Enabled) && (EBC_User_GetFlags(u) & EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP)) { int rv1; int rv2; fprintf(stderr, "Retrieving customer information\n"); rv1=EBC_Provider_Send_HKD(pro, u, 1); fprintf(stderr, "Retrieving user information\n"); rv2=EBC_Provider_Send_HTD(pro, u, 1); if ((rv1<0) && (rv2<0)) { DBG_ERROR(0, "Could neither send HKD not HTD request (%d, %d)", rv1, rv2); GWEN_Gui_ProgressEnd(guiid); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "Done.\n"); } } else { fprintf(stderr, "The bank does not support download of account information\n"); } GWEN_Gui_ProgressEnd(guiid); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "HPD request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/upload.c0000644000175000017500000001560712364015477024063 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int upload(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *requestType; const char *inFile; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "requestType", /* name */ 1, /* minnum */ 1, /* maxnum */ "r", /* short option */ "request", /* long option */ "Specify the request type", /* short description */ "Specify the request type" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "inFile", 1, 1, "f", "infile", "Specify the file to upload", "Specify the file to upload" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); requestType=GWEN_DB_GetCharValue(db, "requestType", 0, NULL); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, NULL); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { GWEN_BUFFER *inBuffer; inBuffer=GWEN_Buffer_new(0, 1024, 0, 1); rv=readFile(inFile, inBuffer); if (rv<0) { DBG_ERROR(0, "Error reading data file (%d)", rv); GWEN_Buffer_free(inBuffer); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Upload(pro, u, requestType, (const uint8_t*)GWEN_Buffer_GetStart(inBuffer), GWEN_Buffer_GetUsedBytes(inBuffer), 1); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error sending upload request (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "Upload request sent.\n"); } GWEN_Buffer_free(inBuffer); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "Upload request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/hialetter.c0000644000175000017500000001151712364015477024554 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int hiaLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int showBankKey; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { 0, GWEN_ArgsType_Int, "bankKey", 0, 1, 0, "bankkey", "Show letter for the bank key", "Show letter for the bank key" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); showBankKey=GWEN_DB_GetIntValue(db, "bankkey", 0, 0); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 2048, 0, 1); rv=EBC_Provider_GetHiaLetterTxt(pro, u, showBankKey, tbuf, 0); if (rv) { DBG_ERROR(0, "Error creating ini letter (%d)", rv); AB_Banking_Fini(ab); return 3; } fprintf(stdout, "%s", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/listaccounts.c0000644000175000017500000000577512364015477025317 00000000000000/*************************************************************************** begin : Fri Sep 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int listAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; AB_ACCOUNT_LIST2 *al; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } al=AB_Banking_FindAccounts(ab, EBC_PROVIDER_NAME, "*", "*", "*", "*"); if (al) { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; int i=0; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { fprintf(stdout, "Account %d: Bank: %s Account Number: %s\n", i++, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } AB_Account_List2_free(al); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/download.c0000644000175000017500000002113412364015477024376 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int download(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *requestType; const char *fromTime; const char *toTime; int receipt; int verbosity; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "requestType", /* name */ 1, /* minnum */ 1, /* maxnum */ "r", /* short option */ "request", /* long option */ "Specify the request type", /* short description */ "Specify the request type" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "fromTime", 0, 1, 0, "fromtime", "Specify the start date", "Specify the start date" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "toTime", 0, 1, 0, "totime", "Specify the end date", "Specify the end date" }, { 0, GWEN_ArgsType_Int, "receipt", 0, 1, 0, "receipt", "Acknowledge receiption", "Acknowledge receiption" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } verbosity=GWEN_DB_GetIntValue(dbArgs, "verbosity", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); requestType=GWEN_DB_GetCharValue(db, "requestType", 0, NULL); fromTime=GWEN_DB_GetCharValue(db, "fromTime", 0, NULL); toTime=GWEN_DB_GetCharValue(db, "toTime", 0, NULL); receipt=GWEN_DB_GetIntValue(db, "receipt", 0, 0); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { GWEN_TIME *tiFrom=NULL; GWEN_TIME *tiTo=NULL; GWEN_BUFFER *destBuffer; if (fromTime) { tiFrom=GWEN_Time_fromString(fromTime, "YYYYMMDD-hh:mm"); if (tiFrom==NULL) { fprintf(stderr, "ERROR: Invalid fromDate (use \"YYYYMMDD-hh:mm\")\n"); return 1; } } if (toTime) { tiTo=GWEN_Time_fromString(toTime, "YYYYMMDD-hh:mm"); if (tiTo==NULL) { fprintf(stderr, "ERROR: Invalid toDate (use \"YYYYMMDD-hh:mm\")\n"); return 1; } } guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); destBuffer=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_SetHardLimit(destBuffer, EBICS_BUFFER_MAX_HARD_LIMIT); rv=EBC_Provider_Download(pro, u, requestType, destBuffer, receipt, tiFrom, tiTo, 1); if (rv==GWEN_ERROR_NO_DATA) { GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Warning, I18N("No download data")); } GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error sending download request (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "Download request sent.\n"); } if (GWEN_Buffer_GetUsedBytes(destBuffer)) { rv=writeFile(stdout, GWEN_Buffer_GetStart(destBuffer), GWEN_Buffer_GetUsedBytes(destBuffer)); if (rv<0) { fprintf(stderr, "ERROR: Unable to write result to stdout (%s)\n", strerror(errno)); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 6; } else { if (verbosity>0) fprintf(stderr, "INFO: Wrote %d bytes\n", GWEN_Buffer_GetUsedBytes(destBuffer)); } } else { fprintf(stderr, "WARNING: Empty download data\n"); } GWEN_Buffer_free(destBuffer); GWEN_Time_free(tiTo); GWEN_Time_free(tiFrom); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "Download request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/createtempkey.c0000644000175000017500000001217112364015477025432 00000000000000/*************************************************************************** begin : Thu Jun 24 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int createTempKey(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int signKeySize; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "signKeySize", 0, 1, "S", "signkeysize", "Specify the keysize in bytes", "Specify the keysize in bytes" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); signKeySize=GWEN_DB_GetIntValue(db, "signKeySize", 0, 256); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Creating key"), I18N("Now the temporary sign key is created."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_CreateTempKey(pro, u, signKeySize, 0); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error creating keys (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/main.c0000644000175000017500000002603612364015477023521 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include "globals.h" #ifdef WITH_STATIC_PLUGINS int GWEN_Plugins_Init(); int AB_Plugins_Init(); int LC_Plugins_Init(); int EBC_Plugins_Init(); #endif int main(int argc, char **argv) { GWEN_DB_NODE *db; const char *cmd; const char *pinFile; int nonInteractive=0; int acceptValidCerts=0; const char *s; int rv; AB_BANKING *ab; GWEN_GUI *gui; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "cfgfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "C", /* short option */ "cfgfile", /* long option */ "Specify the configuration file", /* short description */ "Specify the configuration file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "pinfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "P", /* short option */ "pinfile", /* long option */ "Specify the PIN file", /* short description */ "Specify the PIN file" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "nonInteractive", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "noninteractive", /* long option */ "Select non-interactive mode",/* short description */ "Select non-interactive mode.\n" /* long description */ "This automatically returns a confirmative answer to any non-critical\n" "message." }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "acceptValidCerts", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "acceptvalidcerts", /* long option */ "Automatically accept all valid TLS certificate", "Automatically accept all valid TLS certificate" }, { 0, GWEN_ArgsType_Int, "verbosity", 0, 10, "v", 0, "Increase the verbosity level", "Increase the verbosity level" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "charset", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "charset", /* long option */ "Specify the output character set", /* short description */ "Specify the output character set" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; rv=GWEN_Init(); if (rv<0) { fprintf(stderr, "ERROR: Unable to init GWEN (%d).\n", rv); return 2; } GWEN_Logger_Open("aqhbci-tool", "aqhbci-tool", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); GWEN_Logger_SetLevel("aqhbci-tool", GWEN_LoggerLevel_Warning); GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning); rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, LOCALEDIR); if (rv) { DBG_ERROR(0, "Could not bind textdomain (%d)", rv); } else { rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8"); if (rv) { DBG_ERROR(0, "Could not set codeset (%d)", rv); } } db=GWEN_DB_Group_new("arguments"); rv=GWEN_Args_Check(argc, argv, 1, GWEN_ARGS_MODE_ALLOW_FREEPARAM | GWEN_ARGS_MODE_STOP_AT_FREEPARAM, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments main\n"); return -1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AppendString(ubuf, I18N("Usage: ")); GWEN_Buffer_AppendString(ubuf, argv[0]); GWEN_Buffer_AppendString(ubuf, I18N(" [GLOBAL OPTIONS] COMMAND " "[LOCAL OPTIONS]\n")); GWEN_Buffer_AppendString(ubuf, I18N("\nGlobal Options:\n")); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } GWEN_Buffer_AppendString(ubuf, I18N("\nCommands:\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" mkpinlist:\n" " This command creates an empty PIN " "file\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" adduser:\n" " Adds a user " "(-> setup EBICS for a bank)\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getkeys:\n" " Requests the server's key\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" createkeys:\n" " Create user keys.\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" resetkeys:\n" " Destroy keys (use with care!!)\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" sendkeys:\n" " Send the user keys to the bank.\n\n")); GWEN_Buffer_AppendString(ubuf, I18N(" getaccounts:\n" " Requests account list for a " "user\n\n")); fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } if (rv) { argc-=rv-1; argv+=rv-1; } #ifdef WITH_STATIC_PLUGINS rv=GWEN_Plugins_Init(); if (rv<0) { fprintf(stderr, "ERROR: Unable to init GWEN plugins (%d).\n", rv); return 1; } rv=LC_Plugins_Init(); if (rv<0) { fprintf(stderr, "ERROR: Unable to init Libchipcard plugins (%d).\n", rv); return 1; } rv=AB_Plugins_Init(); if (rv<0) { fprintf(stderr, "ERROR: Unable to init AqBanking plugins (%d).\n", rv); return 1; } rv=EBC_Plugins_Init(); if (rv<0) { fprintf(stderr, "ERROR: Unable to init AqEBICS plugins (%d).\n", rv); return 1; } #endif cmd=GWEN_DB_GetCharValue(db, "params", 0, 0); if (!cmd) { fprintf(stderr, "ERROR: Command needed.\n"); return 1; } gui=GWEN_Gui_CGui_new(); s=GWEN_DB_GetCharValue(db, "charset", 0, NULL); if (s && *s) GWEN_Gui_SetCharSet(gui, s); nonInteractive=GWEN_DB_GetIntValue(db, "nonInteractive", 0, 0); if (nonInteractive) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); acceptValidCerts=GWEN_DB_GetIntValue(db, "acceptValidCerts", 0, 0); if (acceptValidCerts) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); pinFile=GWEN_DB_GetCharValue(db, "pinFile", 0, NULL); if (pinFile) { GWEN_DB_NODE *dbPins; dbPins=GWEN_DB_Group_new("pins"); if (GWEN_DB_ReadFile(dbPins, pinFile, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { fprintf(stderr, "Error reading pinfile \"%s\"\n", pinFile); return 2; } /* set argument "persistent" to one in non-interactive mode */ GWEN_Gui_SetPasswordDb(gui, dbPins, nonInteractive); } GWEN_Gui_SetGui(gui); ab=AB_Banking_new("aqebics-tool", GWEN_DB_GetCharValue(db, "cfgfile", 0, 0), 0); AB_Gui_Extend(gui, ab); if (strcasecmp(cmd, "adduser")==0) { rv=addUser(ab, db, argc, argv); } else if (strcasecmp(cmd, "addaccount")==0) { rv=addAccount(ab, db, argc, argv); } else if (strcasecmp(cmd, "createkeys")==0) { rv=createKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "createtempkey")==0) { rv=createTempKey(ab, db, argc, argv); } else if (strcasecmp(cmd, "sendkeys")==0) { rv=sendKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "sendsignkey")==0) { rv=sendSignKey(ab, db, argc, argv); } else if (strcasecmp(cmd, "getkeys")==0) { rv=getKeys(ab, db, argc, argv); } else if (strcasecmp(cmd, "getaccounts")==0) { rv=getAccounts(ab, db, argc, argv); } else if (strcasecmp(cmd, "iniletter")==0) { rv=iniLetter(ab, db, argc, argv); } else if (strcasecmp(cmd, "hialetter")==0) { rv=hiaLetter(ab, db, argc, argv); } else if (strcasecmp(cmd, "hpd")==0) { rv=sendHPD(ab, db, argc, argv); } else if (strcasecmp(cmd, "hkd")==0) { rv=sendHKD(ab, db, argc, argv); } else if (strcasecmp(cmd, "download")==0) { rv=download(ab, db, argc, argv); } else if (strcasecmp(cmd, "upload")==0) { rv=upload(ab, db, argc, argv); } else if (strcasecmp(cmd, "mkpinlist")==0) { rv=mkPinList(ab, db, argc, argv); } else if (strcasecmp(cmd, "resetuser")==0) { rv=resetUser(ab, db, argc, argv); } else if (strcasecmp(cmd, "adduserflags")==0) { rv=addUserFlags(ab, db, argc, argv); } else if (strcasecmp(cmd, "subuserflags")==0) { rv=subUserFlags(ab, db, argc, argv); } else if (strcasecmp(cmd, "getcert")==0) { rv=getCert(ab, db, argc, argv); } else if (strcasecmp(cmd, "listusers")==0) { rv=listUsers(ab, db, argc, argv); } else if (strcasecmp(cmd, "listaccounts")==0) { rv=listAccounts(ab, db, argc, argv); } else if (strcasecmp(cmd, "setEbicsVersion")==0) { rv=setEbicsVersion(ab, db, argc, argv); } else { fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd); rv=1; } return rv; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/getcert.c0000644000175000017500000001267112364015477024232 00000000000000/*************************************************************************** begin : Fri Sep 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getCert(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_GetCert(pro, u); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error connecting to the server (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "Certificate request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/addaccount.c0000644000175000017500000002047412364015477024702 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int addAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *accountName; const char *accountId; const char *ownerName; int forceAdd; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ownerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "owner", /* long option */ "Specify the owner name", /* short description */ "Specify the owner name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "name", /* long option */ "Specify the account name (Konto-Name)", /* short description */ "Specify the account name (Konto-Name)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 1, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account id (Kontonummer)", /* short description */ "Specify the account id (Kontonummer)" /* long description */ }, { 0, GWEN_ArgsType_Int, /* type */ "force", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "force", /* long option */ "Force adding the account even if there is no bank info", "Force adding the account even if there is no bank info" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, "*"); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, "Account"); ownerName=GWEN_DB_GetCharValue(db, "ownerName", 0, NULL); forceAdd=GWEN_DB_GetIntValue(db, "force", 0, 0); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { AB_ACCOUNT *account; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; AB_BANKINFO *bi; int rv; bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); AB_BankInfo_SetBankId(tbi, bankId); AB_Banking_GetBankInfoByTemplate(ab, "de", tbi, bl); bit=AB_BankInfo_List2_First(bl); if (bit) { bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); AB_BankInfo_List2Iterator_free(bit); } else { if (!forceAdd) { fprintf(stderr, "ERROR: Could not find bank with id %s\n", bankId); AB_Banking_Fini(ab); return 3; } bi=NULL; fprintf(stderr, "Warning: Could not find bank with id %s\n", bankId); } AB_BankInfo_List2_free(bl); account=AB_Banking_CreateAccount(ab, "aqebics"); assert(account); if (!ownerName) AB_Account_SetOwnerName(account, AB_User_GetUserName(u)); else AB_Account_SetOwnerName(account, ownerName); AB_Account_SetAccountNumber(account, accountId); if (accountName) AB_Account_SetAccountName(account, accountName); AB_Account_SetBankCode(account, bankId); if (bi) AB_Account_SetBankName(account, AB_BankInfo_GetBankName(bi)); AB_Account_SetUser(account, u); AB_Account_SetSelectedUser(account, u); rv=AB_Banking_AddAccount(ab, account); if (rv) { DBG_ERROR(0, "Error adding account (%d)", rv); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/sendhpd.c0000644000175000017500000001327712364015477024225 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int sendHPD(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { if ((EBC_User_GetStatus(u)==EBC_UserStatus_Enabled)) { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Send_HPD(pro, u, 1); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error sending HPD request (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "HPD request sent.\n"); } } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "HPD request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/sendkeys.c0000644000175000017500000001411212364015477024412 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int sendKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_INI)) { rv=EBC_Provider_Send_INI(pro, u, 1); if (rv) { DBG_ERROR(0, "Error sending INI request (%d)", rv); GWEN_Gui_ProgressEnd(guiid); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "INI request sent.\n"); } } if (!(EBC_User_GetFlags(u) & EBC_USER_FLAGS_HIA)) { rv=EBC_Provider_Send_HIA(pro, u, 1); if (rv) { DBG_ERROR(0, "Error sending HIA request (%d)", rv); GWEN_Gui_ProgressEnd(guiid); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "HIA request sent.\n"); } } GWEN_Gui_ProgressEnd(guiid); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "INI/HIA request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/sendhkd.c0000644000175000017500000001335712364015477024217 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int sendHKD(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { if ((EBC_User_GetStatus(u)==EBC_UserStatus_Enabled) && (EBC_User_GetFlags(u) & EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP)) { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Send_HKD(pro, u, 1); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error sending HKD request (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "HKD request sent.\n"); } } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "HPD request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/iniletter.c0000644000175000017500000001151712364015477024572 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int iniLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; int showBankKey; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { 0, GWEN_ArgsType_Int, "bankKey", 0, 1, 0, "bankkey", "Show letter for the bank key", "Show letter for the bank key" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); showBankKey=GWEN_DB_GetIntValue(db, "bankkey", 0, 0); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_Fini(ab); return 3; } else { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 2048, 0, 1); rv=EBC_Provider_GetIniLetterTxt(pro, u, showBankKey, tbuf, 0); if (rv) { DBG_ERROR(0, "Error creating ini letter (%d)", rv); AB_Banking_Fini(ab); return 3; } fprintf(stdout, "%s", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/sendsignkey.c0000644000175000017500000001413512364015477025115 00000000000000/*************************************************************************** begin : Thu Jun 24 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int sendSignKey(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *signVersion; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "signVersion", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "signversion", /* long option */ "Specify the signature version (e.g. A005)", /* short description */ "Specify the signature version (e.g. A005)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); signVersion=GWEN_DB_GetCharValue(db, "signVersion", 0, "A005"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Send_PUB(pro, u, signVersion, 1); if (rv) { DBG_ERROR(0, "Error sending INI request (%d)", rv); GWEN_Gui_ProgressEnd(guiid); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } else { fprintf(stderr, "PUB request sent.\n"); } GWEN_Gui_ProgressEnd(guiid); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "INI/HIA request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/Makefile.in0000644000175000017500000007415312643540056024475 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = aqebics-tool$(EXEEXT) subdir = src/plugins/backends/aqebics/tools/aqebics-tool DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(idatadir)" PROGRAMS = $(bin_PROGRAMS) am_aqebics_tool_OBJECTS = main.$(OBJEXT) addaccount.$(OBJEXT) \ addsubuserflags.$(OBJEXT) adduser.$(OBJEXT) \ createkeys.$(OBJEXT) createtempkey.$(OBJEXT) \ download.$(OBJEXT) sendkeys.$(OBJEXT) sendsignkey.$(OBJEXT) \ getaccounts.$(OBJEXT) getkeys.$(OBJEXT) iniletter.$(OBJEXT) \ hialetter.$(OBJEXT) sendhpd.$(OBJEXT) sendhkd.$(OBJEXT) \ upload.$(OBJEXT) utils.$(OBJEXT) mkpinlist.$(OBJEXT) \ resetuser.$(OBJEXT) getcert.$(OBJEXT) listusers.$(OBJEXT) \ listaccounts.$(OBJEXT) setebicsversion.$(OBJEXT) aqebics_tool_OBJECTS = $(am_aqebics_tool_OBJECTS) am__DEPENDENCIES_1 = aqebics_tool_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqebics_tool_SOURCES) DIST_SOURCES = $(aqebics_tool_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(idata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = README INCLUDES = -I.. -I$(top_builddir) -Iclient -I$(builddir)/client \ $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) idatadir = $(datadir)/doc/aqebics/aqebics-tool idata_DATA = README noinst_HEADERS = globals.h aqebics_tool_SOURCES = main.c \ addaccount.c \ addsubuserflags.c \ adduser.c \ createkeys.c \ createtempkey.c \ download.c \ sendkeys.c \ sendsignkey.c \ getaccounts.c \ getkeys.c \ iniletter.c \ hialetter.c \ sendhpd.c \ sendhkd.c \ upload.c \ utils.c \ mkpinlist.c \ resetuser.c \ getcert.c \ listusers.c \ listaccounts.c \ setebicsversion.c aqebics_tool_LDADD = \ $(aqebics_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) \ $(aqebics_static_plugins) \ $(aqebics_extra_libs) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/tools/aqebics-tool/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/tools/aqebics-tool/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list aqebics-tool$(EXEEXT): $(aqebics_tool_OBJECTS) $(aqebics_tool_DEPENDENCIES) $(EXTRA_aqebics_tool_DEPENDENCIES) @rm -f aqebics-tool$(EXEEXT) $(AM_V_CCLD)$(LINK) $(aqebics_tool_OBJECTS) $(aqebics_tool_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addaccount.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addsubuserflags.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adduser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/createkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/createtempkey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/download.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaccounts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hialetter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iniletter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listaccounts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listusers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkpinlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resetuser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendhkd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendhpd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendkeys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendsignkey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setebicsversion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-idataDATA: $(idata_DATA) @$(NORMAL_INSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(idatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(idatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(idatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(idatadir)" || exit $$?; \ done uninstall-idataDATA: @$(NORMAL_UNINSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(idatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(idatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-idataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-idataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-idataDATA install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-idataDATA sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(aqebics_tool_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/utils.c0000644000175000017500000000336412364015477023734 00000000000000/*************************************************************************** $RCSfile: main.c,v $ ------------------- cvs : $Id: main.c,v 1.5 2005/08/24 14:05:32 aquamaniac Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include int readFile(const char *fname, GWEN_BUFFER *dbuf) { FILE *f; f=fopen(fname, "rb"); if (f) { while(!feof(f)) { uint32_t l; ssize_t s; char *p; GWEN_Buffer_AllocRoom(dbuf, 1024); l=GWEN_Buffer_GetMaxUnsegmentedWrite(dbuf); p=GWEN_Buffer_GetPosPointer(dbuf); s=fread(p, 1, l, f); if (s==0) break; if (s==(ssize_t)-1) { DBG_INFO(AQEBICS_LOGDOMAIN, "fread(%s): %s", fname, strerror(errno)); fclose(f); return GWEN_ERROR_IO; } GWEN_Buffer_IncrementPos(dbuf, s); GWEN_Buffer_AdjustUsedBytes(dbuf); } fclose(f); return 0; } else { DBG_INFO(AQEBICS_LOGDOMAIN, "fopen(%s): %s", fname, strerror(errno)); return GWEN_ERROR_IO; } } int writeFile(FILE *f, const char *p, int len) { while(len>0) { ssize_t l; ssize_t s; l=1024; if (l>len) l=len; s=fwrite(p, 1, l, f); if (s==(ssize_t)-1 || s==0) { DBG_INFO(AQEBICS_LOGDOMAIN, "fwrite: %s", strerror(errno)); return GWEN_ERROR_IO; } p+=s; len-=s; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/Makefile.am0000644000175000017500000000201512364015477024454 00000000000000EXTRA_DIST=README INCLUDES=-I.. -I$(top_builddir) -Iclient -I$(builddir)/client \ $(gwenhywfar_includes) -I$(aqbanking_symlinkdir) $(AQEBICS_CFLAGS) bin_PROGRAMS=aqebics-tool idatadir=$(datadir)/doc/aqebics/aqebics-tool idata_DATA=README localedir = $(datadir)/locale DEFS += -DLOCALEDIR=\"$(localedir)\" noinst_HEADERS=globals.h aqebics_tool_SOURCES=main.c \ addaccount.c \ addsubuserflags.c \ adduser.c \ createkeys.c \ createtempkey.c \ download.c \ sendkeys.c \ sendsignkey.c \ getaccounts.c \ getkeys.c \ iniletter.c \ hialetter.c \ sendhpd.c \ sendhkd.c \ upload.c \ utils.c \ mkpinlist.c \ resetuser.c \ getcert.c \ listusers.c \ listaccounts.c \ setebicsversion.c aqebics_tool_LDADD = \ $(aqebics_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) \ $(aqebics_static_plugins) \ $(aqebics_extra_libs) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(aqebics_tool_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/setebicsversion.c0000644000175000017500000001461412364015477026003 00000000000000/*************************************************************************** begin : Mon Oct 13 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int setEbicsVersion(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const char *ebicsVersion; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ebicsVersion", /* name */ 0, /* minnum */ 1, /* maxnum */ "E", /* short option */ "ebicsversion", /* long option */ "Specify the EBICS version to use (e.g. H002)", /* short description */ "Specify the EBICS version to use (e.g. H002)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ebicsVersion=GWEN_DB_GetCharValue(db, "ebicsVersion", 0, "H003"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(0, "Could not lock customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } if (ebicsVersion) { if (strcasecmp(ebicsVersion, "H002")==0) { EBC_User_SetProtoVersion(u, "H002"); EBC_User_SetSignVersion(u, "A004"); EBC_User_SetAuthVersion(u, "X001"); EBC_User_SetCryptVersion(u, "E001"); } else if (strcasecmp(ebicsVersion, "H003")==0) { EBC_User_SetProtoVersion(u, "H003"); EBC_User_SetSignVersion(u, "A005"); EBC_User_SetAuthVersion(u, "X002"); EBC_User_SetCryptVersion(u, "E002"); } else { fprintf(stderr, "%s", I18N("Invalid protocol version.\n" "Possible versions are H002 and H003.\n")); return 3; } } rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(0, "Could not lock customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "EBICS version set to %s.\n", ebicsVersion); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/adduser.c0000644000175000017500000003420312364015477024217 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include static int getBankUrl(AB_BANKING *ab, const char *bankId, GWEN_BUFFER *bufServer) { AB_BANKINFO *bi; bi=AB_Banking_GetBankInfo(ab, "de", 0, bankId); if (bi) { AB_BANKINFO_SERVICE_LIST *l; AB_BANKINFO_SERVICE *sv; l=AB_BankInfo_GetServices(bi); assert(l); sv=AB_BankInfoService_List_First(l); while(sv) { const char *st; st=AB_BankInfoService_GetType(sv); if (st && *st && strcasecmp(st, "ebics")==0) { const char *addr; addr=AB_BankInfoService_GetAddress(sv); if (addr && *addr) { GWEN_Buffer_Reset(bufServer); GWEN_Buffer_AppendString(bufServer, addr); return 0; } } sv=AB_BankInfoService_List_Next(sv); } AB_BankInfo_free(bi); } /* if bank info */ return -1; } int addUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; int rv; GWEN_BUFFER *nameBuffer=NULL; const char *tokenName; const char *tokenType; const char *bankId; const char *userId; const char *customerId; const char *userName; const char *hostName; const char *server; const char *ebicsVersion; int importing; uint32_t cid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "tokenType", /* name */ 1, /* minnum */ 1, /* maxnum */ "t", /* short option */ "tokentype", /* long option */ "Specify the crypt token type", /* short description */ "Specify the crypt token type" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "tokenName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "tokenname", /* long option */ "Specify the crypt token name", /* short description */ "Specify the crypt token name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "serverAddr", /* name */ 0, /* minnum */ 1, /* maxnum */ "s", /* short option */ "server", /* long option */ "Specify the server URL", /* short description */ "Specify the server URL" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "hostName", /* name */ 1, /* minnum */ 1, /* maxnum */ "H", /* short option */ "hostname", /* long option */ "Specify the EBICS hostname", /* short description */ "Specify the EBICS hostname" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userName", /* name */ 1, /* minnum */ 1, /* maxnum */ "N", /* short option */ "username", /* long option */ "Specify the realname of the user", /* short description */ "Specify the realname of the user" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ebicsVersion", /* name */ 0, /* minnum */ 1, /* maxnum */ "E", /* short option */ "ebicsversion", /* long option */ "Specify the EBICS version to use (e.g. H002)", /* short description */ "Specify the EBICS version to use (e.g. H002)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "context", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "context", /* long option */ "Select a context on the medium", /* short description */ "Select a context on the medium" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "import", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "import", /* long option */ "Import a user which has already been in use (e.g. with previous versions)", "Import a user which has already been in use (e.g. with previous versions)" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); tokenType=GWEN_DB_GetCharValue(db, "tokenType", 0, 0); tokenName=GWEN_DB_GetCharValue(db, "tokenName", 0, 0); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); userId=GWEN_DB_GetCharValue(db, "userId", 0, 0); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, 0); hostName=GWEN_DB_GetCharValue(db, "hostName", 0, 0); userName=GWEN_DB_GetCharValue(db, "userName", 0, 0); server=GWEN_DB_GetCharValue(db, "serverAddr", 0, 0); cid=GWEN_DB_GetIntValue(db, "context", 0, 0); importing=GWEN_DB_GetIntValue(db, "import", 0, 0); ebicsVersion=GWEN_DB_GetCharValue(db, "ebicsVersion", 0, "H003"); if (1) { const char *lbankId; const char *luserId; const char *lcustomerId; const char *lserverAddr; GWEN_URL *url; GWEN_CRYPT_TOKEN_CONTEXT *ctx=NULL; AB_USER *user; if (1) { GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *cctx; if (cid==0) { DBG_ERROR(0, "No context given."); return 1; } /* get crypt token */ pm=GWEN_PluginManager_FindPluginManager("ct"); if (pm==0) { DBG_ERROR(0, "Plugin manager not found"); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, tokenType); if (pl==0) { DBG_ERROR(0, "Plugin not found"); return 3; } DBG_INFO(0, "Plugin found"); ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, tokenName); if (ct==0) { DBG_ERROR(0, "Could not create crypt token"); return 3; } /* open crypt token */ rv=GWEN_Crypt_Token_Open(ct, 0, 0); if (rv) { DBG_ERROR(0, "Could not open token (%d)", rv); return 3; } /* get real token name */ nameBuffer=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Buffer_AppendString(nameBuffer, GWEN_Crypt_Token_GetTokenName(ct)); tokenName=GWEN_Buffer_GetStart(nameBuffer); cctx=GWEN_Crypt_Token_GetContext(ct, cid, 0); if (cctx==NULL) { DBG_ERROR(0, "Context %02x not found", cid); return 3; } ctx=GWEN_Crypt_Token_Context_dup(cctx); lbankId=bankId?bankId:GWEN_Crypt_Token_Context_GetServiceId(ctx); luserId=userId?userId:GWEN_Crypt_Token_Context_GetUserId(ctx); lcustomerId=customerId?customerId:luserId; lserverAddr=server?server:GWEN_Crypt_Token_Context_GetAddress(ctx); rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(0, "Could not close token (%d)", rv); return 3; } GWEN_Crypt_Token_free(ct); } if (!lbankId || !*lbankId) { DBG_ERROR(0, "No bank id stored and none given"); return 3; } if (!luserId || !*luserId) { DBG_ERROR(0, "No user id (Benutzerkennung) stored and none given"); return 3; } user=AB_Banking_FindUser(ab, EBC_PROVIDER_NAME, "de", lbankId, luserId, lcustomerId); if (user) { DBG_ERROR(0, "User %s already exists", luserId); return 3; } user=AB_Banking_CreateUser(ab, EBC_PROVIDER_NAME); assert(user); AB_User_SetCountry(user, "de"); AB_User_SetBankCode(user, lbankId); AB_User_SetUserId(user, luserId); AB_User_SetCustomerId(user, lcustomerId); EBC_User_SetPeerId(user, hostName); AB_User_SetUserName(user, userName); EBC_User_SetTokenType(user, tokenType); EBC_User_SetTokenName(user, tokenName); EBC_User_SetTokenContextId(user, cid); if (ebicsVersion) { if (strcasecmp(ebicsVersion, "H002")==0) { EBC_User_SetProtoVersion(user, "H002"); EBC_User_SetSignVersion(user, "A004"); EBC_User_SetAuthVersion(user, "X001"); EBC_User_SetCryptVersion(user, "E001"); } else if (strcasecmp(ebicsVersion, "H003")==0) { EBC_User_SetProtoVersion(user, "H003"); EBC_User_SetSignVersion(user, "A005"); EBC_User_SetAuthVersion(user, "X002"); EBC_User_SetCryptVersion(user, "E002"); } else { fprintf(stderr, "%s", I18N("Invalid protocol version.\n" "Possible versions are H002 and H003.\n")); return 3; } } /* try to get server address from database if still unknown */ if (!lserverAddr || *lserverAddr==0) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); if (getBankUrl(ab, lbankId, tbuf)) { DBG_INFO(0, "Could not find server address for \"%s\"", lbankId); } if (GWEN_Buffer_GetUsedBytes(tbuf)==0) { DBG_ERROR(0, "No address given and none available in internal db"); return 3; } url=GWEN_Url_fromString(GWEN_Buffer_GetStart(tbuf)); if (url==NULL) { DBG_ERROR(0, "Bad URL \"%s\" in internal db", GWEN_Buffer_GetStart(tbuf)); return 3; } GWEN_Buffer_free(tbuf); } else { /* set address */ url=GWEN_Url_fromString(lserverAddr); if (url==NULL) { DBG_ERROR(0, "Bad URL \"%s\"", lserverAddr); return 3; } } GWEN_Url_SetProtocol(url, "https"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 443); /* set url */ if (1) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Url_toString(url, tbuf); if (rv<0) { DBG_ERROR(0, "Internal error storing URL"); return 3; } EBC_User_SetServerUrl(user, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } GWEN_Url_free(url); if (importing) { EBC_User_AddFlags(user, EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA); EBC_User_SetStatus(user, EBC_UserStatus_Enabled); } AB_Banking_AddUser(ab, user); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/resetuser.c0000644000175000017500000001245012364015477024611 00000000000000/*************************************************************************** begin : Mon Oct 13 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int resetUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_ERROR(0, "Could not lock customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } EBC_User_SubFlags(u, EBC_USER_FLAGS_INI | EBC_USER_FLAGS_HIA); EBC_User_SetStatus(u, EBC_UserStatus_New); rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { DBG_ERROR(0, "Could not lock customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "Reset ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/getkeys.c0000644000175000017500000001307512364015477024247 00000000000000/*************************************************************************** $RCSfile: createkeys.c,v $ ------------------- cvs : $Id: createkeys.c,v 1.2 2006/01/13 13:59:59 cstim Exp $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include int getKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; uint32_t guiid; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id", /* short description */ "Specify the user id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { AB_USER_LIST2_ITERATOR *cit; cit=AB_User_List2_First(ul); assert(cit); u=AB_User_List2Iterator_Data(cit); AB_User_List2Iterator_free(cit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } else { guiid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Request"), I18N("Now the request is send " "to the credit institute."), GWEN_GUI_PROGRESS_NONE, 0); rv=EBC_Provider_Send_HPB(pro, u, 1); GWEN_Gui_ProgressEnd(guiid); if (rv) { DBG_ERROR(0, "Error sending key request (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } fprintf(stderr, "Key request ok.\n"); return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/README0000644000175000017500000000000212364015477023272 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/addsubuserflags.c0000644000175000017500000001432712364015477025753 00000000000000/*************************************************************************** begin : Sat Oct 18 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include int addSubUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv, int doAdd) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_USER_LIST2 *ul; AB_USER *u=0; int rv; const char *bankId; const char *userId; const char *customerId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the user id (Benutzerkennung)", /* short description */ "Specify the user id (Benutzerkennung)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "customerId", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "customer", /* long option */ "Specify the customer id (Kundennummer)", /* short description */ "Specify the customer id (Kundennummer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "flags", /* name */ 1, /* minnum */ 99, /* maxnum */ "f", /* short option */ "flags", /* long option */ "Specify the user flags", /* short description */ "Specify the user flags" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } pro=AB_Banking_GetProvider(ab, EBC_PROVIDER_NAME); assert(pro); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); userId=GWEN_DB_GetCharValue(db, "userId", 0, "*"); customerId=GWEN_DB_GetCharValue(db, "customerId", 0, "*"); ul=AB_Banking_FindUsers(ab, EBC_PROVIDER_NAME, "de", bankId, userId, customerId); if (ul) { if (AB_User_List2_GetSize(ul)!=1) { DBG_ERROR(0, "Ambiguous customer specification"); return 3; } else { AB_USER_LIST2_ITERATOR *uit; uit=AB_User_List2_First(ul); assert(uit); u=AB_User_List2Iterator_Data(uit); AB_User_List2Iterator_free(uit); } AB_User_List2_free(ul); } if (!u) { DBG_ERROR(0, "No matching customer"); return 3; } else { uint32_t flags; /* lock user */ rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { fprintf(stderr, "ERROR: Could not lock user, maybe it is used in another application? (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* modify user */ flags=EBC_User_Flags_fromDb(db, "flags"); if (doAdd) { fprintf(stderr, "Adding flags: %08x\n", flags); EBC_User_AddFlags(u, flags); } else { fprintf(stderr, "Removingg flags: %08x\n", flags); EBC_User_SubFlags(u, flags); } /* unlock user */ rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { fprintf(stderr, "ERROR: Could not unlock user (%d)\n", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } int addUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { return addSubUserFlags(ab, dbArgs, argc, argv, 1); } int subUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { return addSubUserFlags(ab, dbArgs, argc, argv, 0); } aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/aqebics-tool/globals.h0000644000175000017500000000606012364015477024220 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef CBANKING_GLOBALS_H #define CBANKING_GLOBALS_H #include #include #include #include #include #include #include #include #include #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18S(msg) msg int readFile(const char *fname, GWEN_BUFFER *dbuf); int writeFile(FILE *f, const char *p, int len); int addUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int createKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int createTempKey(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int sendKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int sendSignKey(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getKeys(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int iniLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int hiaLetter(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int sendHPD(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int sendHKD(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int download(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int upload(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addAccount(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int mkPinList(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int resetUser(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int addUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int subUserFlags(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int getCert(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int listUsers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int listAccounts(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); int setEbicsVersion(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv); #endif aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/Makefile.in0000644000175000017500000005775512643540056022124 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqebics/tools DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = aqebics-tool all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqebics/tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqebics/tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: built_sources: # 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: aqbanking-5.6.4beta/src/plugins/backends/aqebics/tools/Makefile.am0000644000175000017500000000006212364015477022072 00000000000000SUBDIRS = aqebics-tool sources: built_sources: aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/0000755000175000017500000000000012643540660020036 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/Makefile.in0000644000175000017500000006573212643540060022032 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqofxconnect DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/version.h.in $(iheader_HEADERS) ChangeLog README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.h CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = plugin EXTRA_DIST = ChangeLog README version.h.in iheaderdir = @aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS = \ version.h BUILT_SOURCES = version.h CLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version.h: $(top_builddir)/config.status $(srcdir)/version.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: $(am__recursive_targets) all check install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: $(BUILT_SOURCES) for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/version.h.in0000644000175000017500000000203312364015477022222 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQOFXCONNECT_VERSION_H #define AQOFXCONNECT_VERSION_H #define AQOFXCONNECT_VERSION_MAJOR @AQOFXCONNECT_VERSION_MAJOR@ #define AQOFXCONNECT_VERSION_MINOR @AQOFXCONNECT_VERSION_MINOR@ #define AQOFXCONNECT_VERSION_PATCHLEVEL @AQOFXCONNECT_VERSION_PATCHLEVEL@ #define AQOFXCONNECT_VERSION_BUILD @AQOFXCONNECT_VERSION_BUILD@ #define AQOFXCONNECT_VERSION_TAG "@AQOFXCONNECT_VERSION_TAG@" #define AQOFXCONNECT_VERSION_FULL_STRING "@AQOFXCONNECT_VERSION_FULL_STRING@" #define AQOFXCONNECT_VERSION_STRING "@AQOFXCONNECT_VERSION_STRING@" #endif /* AQOFXCONNECT_VERSION_H */ aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/0000755000175000017500000000000012643540660021334 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/user.h0000644000175000017500000000662212364015477022414 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_USER_H #define AO_USER_H #include #include #include #include #define AO_USER_FLAGS_ACCOUNT_LIST 0x00000001 #define AO_USER_FLAGS_STATEMENTS 0x00000002 #define AO_USER_FLAGS_INVESTMENT 0x00000004 #define AO_USER_FLAGS_BILLPAY 0x00000008 #define AO_USER_FLAGS_EMPTY_BANKID 0x00000010 #define AO_USER_FLAGS_EMPTY_FID 0x00000020 #define AO_USER_FLAGS_FORCE_SSL3 0x00000040 #define AO_USER_FLAGS_SEND_SHORT_DATE 0x00000080 #ifdef __cplusplus extern "C" { #endif AQOFXCONNECT_API uint32_t AO_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name); AQOFXCONNECT_API void AO_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t fl); AQOFXCONNECT_API void AO_User_Extend(AB_USER *u, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); AQOFXCONNECT_API const char *AO_User_GetBankName(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetBankName(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetBrokerId(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetBrokerId(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetOrg(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetOrg(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetFid(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetFid(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetServerAddr(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetServerAddr(AB_USER *u, const char *s); AQOFXCONNECT_API uint32_t AO_User_GetFlags(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetFlags(AB_USER *u, uint32_t f); AQOFXCONNECT_API void AO_User_AddFlags(AB_USER *u, uint32_t f); AQOFXCONNECT_API void AO_User_SubFlags(AB_USER *u, uint32_t f); AQOFXCONNECT_API const char *AO_User_GetAppId(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetAppId(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetAppVer(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetAppVer(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetHeaderVer(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetHeaderVer(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetClientUid(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetClientUid(AB_USER *u, const char *s); AQOFXCONNECT_API const char *AO_User_GetSecurityType(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetSecurityType(AB_USER *u, const char *s); AQOFXCONNECT_API int AO_User_GetHttpVMajor(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetHttpVMajor(AB_USER *u, int i); AQOFXCONNECT_API int AO_User_GetHttpVMinor(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetHttpVMinor(AB_USER *u, int i); AQOFXCONNECT_API const char *AO_User_GetHttpUserAgent(const AB_USER *u); AQOFXCONNECT_API void AO_User_SetHttpUserAgent(AB_USER *u, const char *s); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.c0000644000175000017500000002514612364015477024555 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_ofx_special_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 GWEN_INHERIT(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG) GWEN_DIALOG *AO_OfxSpecialDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AO_OFX_SPECIAL_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ao_ofx_special"); GWEN_NEW_OBJECT(AO_OFX_SPECIAL_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg, xdlg, AO_OfxSpecialDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AO_OfxSpecialDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqofxconnect/dialogs/dlg_ofx_special.dlg", fbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB AO_OfxSpecialDialog_FreeData(void *bp, void *p) { AO_OFX_SPECIAL_DIALOG *xdlg; xdlg=(AO_OFX_SPECIAL_DIALOG*) p; free(xdlg->clientUid); free(xdlg->securityType); GWEN_FREE_OBJECT(xdlg); } int AO_OfxSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int AO_OfxSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void AO_OfxSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } uint32_t AO_OfxSpecialDialog_GetFlags(const GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AO_OfxSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AO_OfxSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_OfxSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_OfxSpecialDialog_SetSecurityType(GWEN_DIALOG *dlg, const char *s) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->securityType); if (s) xdlg->securityType=strdup(s); else xdlg->securityType=NULL; } const char *AO_OfxSpecialDialog_GetSecurityType(const GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->securityType; } void AO_OfxSpecialDialog_SetClientUid(GWEN_DIALOG *dlg, const char *s) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); free(xdlg->clientUid); if (s) xdlg->clientUid=strdup(s); else xdlg->clientUid=NULL; } const char *AO_OfxSpecialDialog_GetClientUid(const GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); return xdlg->clientUid; } void AO_OfxSpecialDialog_Init(GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("OFX DirectConnect Special Settings"), 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.0", 0); GWEN_Dialog_SetCharProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_AddValue, 0, "1.1", 0); /* toGui */ switch(((xdlg->httpVMajor)<<8)+xdlg->httpVMinor) { case 0x0100: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 0, 0); break; case 0x0101: GWEN_Dialog_SetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, 1, 0); break; default: break; } GWEN_Dialog_SetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, (xdlg->flags & AO_USER_FLAGS_FORCE_SSL3)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "emptyBankIdCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AO_USER_FLAGS_EMPTY_BANKID)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "emptyFidCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AO_USER_FLAGS_EMPTY_FID)?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "shortDateCheck", GWEN_DialogProperty_Value, 0, (xdlg->flags & AO_USER_FLAGS_SEND_SHORT_DATE)?1:0, 0); if (xdlg->clientUid) GWEN_Dialog_SetCharProperty(dlg, "clientUidEdit", GWEN_DialogProperty_Value, 0, xdlg->clientUid, 0); if (xdlg->securityType) GWEN_Dialog_SetCharProperty(dlg, "securityTypeEdit", GWEN_DialogProperty_Value, 0, xdlg->securityType, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AO_OfxSpecialDialog_Fini(GWEN_DIALOG *dlg) { AO_OFX_SPECIAL_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; uint32_t flags; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* fromGui */ i=GWEN_Dialog_GetIntProperty(dlg, "httpVersionCombo", GWEN_DialogProperty_Value, 0, -1); switch(i) { case 0: xdlg->httpVMajor=1; xdlg->httpVMinor=0; break; default: case 1: xdlg->httpVMajor=1; xdlg->httpVMinor=1; break; } flags=0; if (GWEN_Dialog_GetIntProperty(dlg, "forceSslv3Check", GWEN_DialogProperty_Value, 0, 0)) flags|=AO_USER_FLAGS_FORCE_SSL3; if (GWEN_Dialog_GetIntProperty(dlg, "emptyBankIdCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AO_USER_FLAGS_EMPTY_BANKID; if (GWEN_Dialog_GetIntProperty(dlg, "emptyFidCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AO_USER_FLAGS_EMPTY_FID; if (GWEN_Dialog_GetIntProperty(dlg, "shortDateCheck", GWEN_DialogProperty_Value, 0, 0)) flags|=AO_USER_FLAGS_SEND_SHORT_DATE; xdlg->flags=flags; s=GWEN_Dialog_GetCharProperty(dlg, "clientUidEdit", GWEN_DialogProperty_Value, 0, NULL); AO_OfxSpecialDialog_SetClientUid(dlg, s); s=GWEN_Dialog_GetCharProperty(dlg, "securityTypeEdit", GWEN_DialogProperty_Value, 0, NULL); AO_OfxSpecialDialog_SetSecurityType(dlg, s); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AO_OfxSpecialDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_ERROR(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AO_OfxSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AO_OFX_SPECIAL_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_OFX_SPECIAL_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AO_OfxSpecialDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AO_OfxSpecialDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AO_OfxSpecialDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/queues.c0000644000175000017500000000516212364015477022736 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "queues_p.h" #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AO_USERQUEUE, AO_UserQueue) AO_USERQUEUE *AO_UserQueue_new(AB_USER *u) { AO_USERQUEUE *uq; assert(u); GWEN_NEW_OBJECT(AO_USERQUEUE, uq); GWEN_LIST_INIT(AO_USERQUEUE, uq); uq->user=u; uq->jobs=AB_Job_List2_new(); return uq; } void AO_UserQueue_free(AO_USERQUEUE *uq) { if (uq) { GWEN_LIST_FINI(AO_USERQUEUE, uq); AB_Job_List2_free(uq->jobs); GWEN_FREE_OBJECT(uq); } } AB_USER *AO_UserQueue_GetUser(const AO_USERQUEUE *uq){ assert(uq); return uq->user; } AB_JOB_LIST2 *AO_UserQueue_GetJobs(const AO_USERQUEUE *uq){ assert(uq); return uq->jobs; } void AO_UserQueue_AddJob(AO_USERQUEUE *uq, AB_JOB *bj){ assert(uq); assert(bj); AB_Job_List2_PushBack(uq->jobs, bj); } AO_QUEUE *AO_Queue_new() { AO_QUEUE *q; GWEN_NEW_OBJECT(AO_QUEUE, q); q->userQueues=AO_UserQueue_List_new(); return q; } void AO_Queue_free(AO_QUEUE *q) { if (q) { AO_UserQueue_List_free(q->userQueues); GWEN_FREE_OBJECT(q); } } AO_USERQUEUE *AO_Queue_FindUserQueue(AO_QUEUE *q, const AB_USER *u) { AO_USERQUEUE *uq; uq=AO_UserQueue_List_First(q->userQueues); while(uq) { if (AO_UserQueue_GetUser(uq)==u) break; uq=AO_UserQueue_List_Next(uq); } return uq; } AO_USERQUEUE *AO_Queue_GetUserQueue(AO_QUEUE *q, AB_USER *u) { AO_USERQUEUE *uq; assert(q); assert(u); uq=AO_Queue_FindUserQueue(q, u); if (!uq) { uq=AO_UserQueue_new(u); AO_UserQueue_List_Add(uq, q->userQueues); } return uq; } AO_USERQUEUE *AO_Queue_FirstUserQueue(AO_QUEUE *q) { assert(q); return AO_UserQueue_List_First(q->userQueues); } void AO_Queue_AddJob(AO_QUEUE *q, AB_USER *u, AB_JOB *bj) { AO_USERQUEUE *uq; assert(q); assert(u); assert(bj); uq=AO_Queue_GetUserQueue(q, u); assert(uq); AO_UserQueue_AddJob(uq, bj); } void AO_Queue_Clear(AO_QUEUE *q) { assert(q); AO_UserQueue_List_Clear(q->userQueues); } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_newuser_p.h0000644000175000017500000000432212364015477024266 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_NEWUSER_P_H #define AQOFXCONNECT_DLG_NEWUSER_P_H #include "dlg_newuser_l.h" typedef struct AO_NEWUSER_DIALOG AO_NEWUSER_DIALOG; struct AO_NEWUSER_DIALOG { AB_BANKING *banking; char *userName; char *userId; char *url; char *bankName; char *brokerId; char *org; char *fid; char *appId; char *appVer; char *headerVer; char *clientUid; char *securityType; int httpVMajor; int httpVMinor; uint32_t flags; AB_USER *user; }; static void GWENHYWFAR_CB AO_NewUserDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AO_NewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static void AO_NewUserDialog_Init(GWEN_DIALOG *dlg); static void AO_NewUserDialog_Fini(GWEN_DIALOG *dlg); static int AO_NewUserDialog_GetBankPageData(GWEN_DIALOG *dlg); static int AO_NewUserDialog_GetUserPageData(GWEN_DIALOG *dlg); static int AO_NewUserDialog_GetAppPageData(GWEN_DIALOG *dlg); static int AO_NewUserDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards); static int AO_NewUserDialog_DoIt(GWEN_DIALOG *dlg); static int AO_NewUserDialog_UndoIt(GWEN_DIALOG *dlg); static int AO_NewUserDialog_Next(GWEN_DIALOG *dlg); static int AO_NewUserDialog_Previous(GWEN_DIALOG *dlg); static int AO_NewUserDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg); static int AO_NewUserDialog_HandleActivatedBankSelect(GWEN_DIALOG *dlg); static int AO_NewUserDialog_HandleActivatedApp(GWEN_DIALOG *dlg); static int AO_NewUserDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg); static int AO_NewUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender); static int AO_NewUserDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/r_statements.c0000644000175000017500000001606612364015477024144 00000000000000/*************************************************************************** begin : Wed Jan 09 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AO_Provider__AddBankStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf) { const char *s; AB_ACCOUNT *a; AB_USER *u; int rv; a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); assert(u); GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); if (!(AO_User_GetFlags(u) & AO_USER_FLAGS_EMPTY_BANKID)) { /* only copy bank code if not forbidden by user */ s=AB_Account_GetBankCode(a); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } } s=AB_Account_GetAccountNumber(a); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } /* add account type */ GWEN_Buffer_AppendString(buf, ""); switch(AB_Account_GetAccountType(a)) { case AB_AccountType_Checking: GWEN_Buffer_AppendString(buf, "CHECKING"); break; case AB_AccountType_Savings: GWEN_Buffer_AppendString(buf, "SAVINGS"); break; case AB_AccountType_Bank: GWEN_Buffer_AppendString(buf, "CREDITLINE"); break; case AB_AccountType_MoneyMarket: GWEN_Buffer_AppendString(buf, "MONEYMRKT"); break; case AB_AccountType_CreditCard: case AB_AccountType_Investment: case AB_AccountType_Cash: case AB_AccountType_Unknown: default: GWEN_Buffer_AppendString(buf, "CHECKING"); break; } GWEN_Buffer_AppendString(buf, ""); /* add INCTRAN element */ GWEN_Buffer_AppendString(buf, ""); if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { const GWEN_TIME *ti; ti=AB_JobGetTransactions_GetFromTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); } ti=AB_JobGetTransactions_GetToTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); } GWEN_Buffer_AppendString(buf, "Y"); } else { GWEN_Buffer_AppendString(buf, "N"); } GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); /* wrap into request */ rv=AO_Provider__WrapRequest(pro, u, "BANK", "STMT", buf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AO_Provider__AddCreditCardStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf) { const char *s; AB_ACCOUNT *a; AB_USER *u; int rv; a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); assert(u); GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); s=AB_Account_GetAccountNumber(a); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } GWEN_Buffer_AppendString(buf, ""); /* add INCTRAN element */ GWEN_Buffer_AppendString(buf, ""); if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { const GWEN_TIME *ti; ti=AB_JobGetTransactions_GetFromTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); } ti=AB_JobGetTransactions_GetToTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); } GWEN_Buffer_AppendString(buf, "Y"); } else { GWEN_Buffer_AppendString(buf, "N"); } GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); /* wrap into request */ rv=AO_Provider__WrapRequest(pro, u, "CREDITCARD", "CCSTMT", buf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AO_Provider__AddInvStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf) { const char *s; AB_ACCOUNT *a; AB_USER *u; int rv; a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); assert(u); GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); s=AO_User_GetBrokerId(u); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } s=AB_Account_GetAccountNumber(a); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } GWEN_Buffer_AppendString(buf, ""); /* add INCTRAN element */ GWEN_Buffer_AppendString(buf, ""); if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { const GWEN_TIME *ti; ti=AB_JobGetTransactions_GetFromTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); GWEN_Time_toString(ti, "YYYYMMDD", buf); } ti=AB_JobGetTransactions_GetToTime(j); if (ti) { GWEN_Buffer_AppendString(buf, ""); GWEN_Time_toString(ti, "YYYYMMDD", buf); } GWEN_Buffer_AppendString(buf, "Y"); } else { GWEN_Buffer_AppendString(buf, "N"); } GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, "Y"); GWEN_Buffer_AppendString(buf, ""); if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { GWEN_TIME *ti; ti=GWEN_CurrentTime(); if (ti) { GWEN_Buffer_AppendString(buf, ""); GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); } GWEN_Time_free(ti); GWEN_Buffer_AppendString(buf, "Y"); } GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, "Y"); GWEN_Buffer_AppendString(buf, ""); /* wrap into request */ rv=AO_Provider__WrapRequest(pro, u, "INVSTMT", "INVSTMT", buf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AO_Provider__AddStatementRequest(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf) { AB_ACCOUNT *a; int rv; a=AB_Job_GetAccount(j); assert(a); switch(AB_Account_GetAccountType(a)) { case AB_AccountType_CreditCard: rv=AO_Provider__AddCreditCardStatementReq(pro, j, buf); break; case AB_AccountType_Investment: rv=AO_Provider__AddInvStatementReq(pro, j, buf); break; case AB_AccountType_Checking: case AB_AccountType_Savings: case AB_AccountType_Bank: case AB_AccountType_Cash: case AB_AccountType_Unknown: default: rv=AO_Provider__AddBankStatementReq(pro, j, buf); break; } if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dummy.c0000644000175000017500000000000012364015477022544 00000000000000aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/0000755000175000017500000000000012643540660023470 500000000000000aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/ofxhome.h0000644000175000017500000000407012364015477025232 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef OFXHOME_H #define OFXHOME_H #include #include #include #include typedef struct OFXHOME OFXHOME; /** * Creates an OFX data cache for www.ofxhome.com. * @param datafolder cache folder */ AQOFXCONNECT_API OFXHOME *OfxHome_new(const char *dataFolder); /** * Release the OFX data cache (this doesn't remove the files from the data folder) * * @param ofh pointer to the OFX data cache object to release */ AQOFXCONNECT_API void OfxHome_free(OFXHOME *ofh); /** * Returns a list of server specs (containing name and id). If there already is a list * in the data folder and it is reasonably new it will be loaded. Otherwise the list * is downloaded from "www.ofxhome.com" and saved for later reference. * * @param ofh pointer to the OFX data cache object * * @return pointer to the list of server specs (or NULL on error) */ AQOFXCONNECT_API const OH_INSTITUTE_SPEC_LIST *OfxHome_GetSpecs(OFXHOME *ofh); /** * Returns information about the server of the given id. * If this data is already in the data folder and is reasonably new * it will be loaded. Otherwise it will be downloaded from "www.ofxhome.com" * and saved for later reference. * * @param ofh pointer to the OFX data cache object * * @param fid id of the server for which information is to be retrieved (this id can * only be taken from a server spec retrieved via @ref OfxHome_GetSpecs). * * @return pointer to the list of server specs (or NULL on error) */ AQOFXCONNECT_API const OH_INSTITUTE_DATA *OfxHome_GetData(OFXHOME *ofh, int fid); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec_fns.c0000644000175000017500000000274112364015477030161 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif int OH_InstituteSpec_ReadXml(OH_INSTITUTE_SPEC *os, GWEN_XMLNODE *node) { const char *s; int i; s=GWEN_XMLNode_GetProperty(node, "id", NULL); if (s && *s) { if (sscanf(s, "%d", &i)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Bad value for property \"id\": [%s]", s); return GWEN_ERROR_BAD_DATA; } OH_InstituteSpec_SetId(os, i); } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Missing property \"id\""); return GWEN_ERROR_BAD_DATA; } s=GWEN_XMLNode_GetProperty(node, "name", NULL); if (s && *s) OH_InstituteSpec_SetName(os, s); else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Missing property \"name\""); return GWEN_ERROR_BAD_DATA; } return 0; } OH_INSTITUTE_SPEC *OH_InstituteSpec_fromXml(GWEN_XMLNODE *node) { OH_INSTITUTE_SPEC *os; int rv; os=OH_InstituteSpec_new(); rv=OH_InstituteSpec_ReadXml(os, node); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteSpec_free(os); return NULL; } return os; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/libtest.c0000644000175000017500000000652512364015477025235 00000000000000 #ifdef HAVE_CONFIG_H # include #endif #include "ofxhome.h" #include #include #include #include #ifdef USE_GWENGUI_GTK2 # include # include "dlg_getinst.h" # include #endif int test1(int argc, char **argv) { OFXHOME *oh; const OH_INSTITUTE_SPEC_LIST *sl; GWEN_GUI *gui; int rv; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(AQOFXCONNECT_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Debug); gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); oh=OfxHome_new("/tmp/ofx"); sl=OfxHome_GetSpecs(oh); if (sl==NULL) { fprintf(stderr, "No specs...\n"); return 2; } OfxHome_free(oh); return 0; } int test2(int argc, char **argv) { OFXHOME *oh; const OH_INSTITUTE_DATA *d; GWEN_GUI *gui; int rv; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(AQOFXCONNECT_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Debug); gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); oh=OfxHome_new("/tmp/ofx"); d=OfxHome_GetData(oh, 542); if (d==NULL) { fprintf(stderr, "No data...\n"); return 2; } OfxHome_free(oh); return 0; } int test3(int argc, char **argv) { #ifdef USE_GWENGUI_GTK2 GWEN_GUI *gui; GWEN_DIALOG *dlg; int rv; AB_BANKING *ab; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(AQOFXCONNECT_LOGDOMAIN, GWEN_LoggerLevel_Info); GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Debug); gtk_init(&argc, &argv); gui=Gtk2_Gui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("test-ofxhome", NULL, 0); rv=AB_Banking_Init(ab); if (rv<0){ fprintf(stderr, "Error on banking init: %d\n", rv); exit(2); } AB_Gui_Extend(gui, ab); dlg=OH_GetInstituteDialog_new("/tmp/ofx", NULL); if (dlg==NULL) { fprintf(stderr, "Could not create dialog\n"); exit(2); } rv=GWEN_Gui_ExecDialog(dlg, 0); if (rv<=0){ fprintf(stderr, "Dialog was aborted/rejected\n"); } else { const OH_INSTITUTE_DATA *od; fprintf(stderr, "Dialog accepted, all fine\n"); od=OH_GetInstituteDialog_GetSelectedInstitute(dlg); if (od) { fprintf(stderr, "- Id : %d\n", OH_InstituteData_GetId(od)); fprintf(stderr, "- Name: %s\n", OH_InstituteData_GetName(od)); fprintf(stderr, "- FID : %s\n", OH_InstituteData_GetFid(od)); fprintf(stderr, "- ORG : %s\n", OH_InstituteData_GetOrg(od)); fprintf(stderr, "- URL : %s\n", OH_InstituteData_GetUrl(od)); } } GWEN_Dialog_free(dlg); AB_Gui_Unextend(gui); rv=AB_Banking_Fini(ab); if (rv<0){ fprintf(stderr, "Error on banking fini: %d\n", rv); exit(2); } AB_Banking_free(ab); GWEN_Gui_free(gui); #endif return 0; } int main(int argc, char **argv) { //return test1(argc, argv); //return test2(argc, argv); return test3(argc, argv); } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec_fns.h0000644000175000017500000000136112364015477030163 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef OH_INSTITUTE_DATA_SPEC_H #define OH_INSTITUTE_DATA_SPEC_H #include #include AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_fromXml(GWEN_XMLNODE *node); AQOFXCONNECT_API int OH_InstituteSpec_ReadXml(OH_INSTITUTE_SPEC *os, GWEN_XMLNODE *node); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/ofxhome.c0000644000175000017500000003512612364015477025233 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ofxhome_p.h" #include #include #include #include #include #include #define OFX_CACHE_TIME_HR 2 OFXHOME *OfxHome_new(const char *dataFolder) { OFXHOME *ofh; GWEN_NEW_OBJECT(OFXHOME, ofh); if (dataFolder) ofh->dataFolder=strdup(dataFolder); ofh->dataList=OH_InstituteData_List_new(); return ofh; } void OfxHome_free(OFXHOME *ofh) { if (ofh) { free(ofh->dataFolder); OH_InstituteSpec_List_free(ofh->specList); OH_InstituteData_List_free(ofh->dataList); GWEN_FREE_OBJECT(ofh); } } int OfxHome_SetupHttpSession(OFXHOME *ofh, GWEN_HTTP_SESSION *sess) { GWEN_HttpSession_SetHttpVMajor(sess, 1); GWEN_HttpSession_SetHttpVMinor(sess, 1); GWEN_HttpSession_SetHttpUserAgent(sess, "AqBanking/" AQBANKING_VERSION_STRING); return 0; } int OfxHome_DownloadSpecs(OFXHOME *ofh, OH_INSTITUTE_SPEC_LIST *sl) { GWEN_HTTP_SESSION *sess; int rv; GWEN_BUFFER *xbuf; GWEN_XMLNODE *nroot; GWEN_XMLNODE *n; /* prepare session */ sess=GWEN_HttpSession_new("http://www.ofxhome.com/api.php?all=yes", "http", 80); rv=OfxHome_SetupHttpSession(ofh, sess); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } /* send request (no body) */ rv=GWEN_HttpSession_SendPacket(sess, "GET", NULL, 0); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } /* get response */ xbuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=GWEN_HttpSession_RecvPacket(sess, xbuf); if (rv<0 || rv<200 || rv>=300) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); GWEN_HttpSession_free(sess); return rv; } /* fini */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); /* parse list */ nroot=GWEN_XMLNode_fromString(GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf), GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS | GWEN_XML_FLAGS_TOLERANT_ENDTAGS | GWEN_XML_FLAGS_HANDLE_NAMESPACES); if (nroot==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_Dump(xbuf, 2); GWEN_Buffer_free(xbuf); return GWEN_ERROR_BAD_DATA; } GWEN_Buffer_free(xbuf); n=GWEN_XMLNode_FindFirstTag(nroot, "institutionlist", NULL, NULL); if (n==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "XML tree does not contain an \"institutionlist\" element"); GWEN_XMLNode_Dump(nroot, 2); GWEN_XMLNode_free(nroot); return GWEN_ERROR_NO_DATA; } n=GWEN_XMLNode_FindFirstTag(n, "institutionid", NULL, NULL); if (n==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "XML tree does not contain an \"institutionid\" element"); GWEN_XMLNode_Dump(nroot, 2); GWEN_XMLNode_free(nroot); return GWEN_ERROR_NO_DATA; } else { while(n) { OH_INSTITUTE_SPEC *os; os=OH_InstituteSpec_fromXml(n); if (os==NULL) { DBG_WARN(AQOFXCONNECT_LOGDOMAIN, "element does not contain a valid institute spec"); GWEN_XMLNode_Dump(n, 2); } else OH_InstituteSpec_List_Add(os, sl); /* previously we needed to use "FindFirstTag" because of the malformed response */ n=GWEN_XMLNode_FindNextTag(n, "institutionid", NULL, NULL); } } GWEN_XMLNode_free(nroot); return 0; } int OfxHome_SaveSpecs(OFXHOME *ofh, const OH_INSTITUTE_SPEC_LIST *sl) { GWEN_DB_NODE *db; OH_INSTITUTE_SPEC *os; GWEN_BUFFER *nbuf; int rv; /* store institutes in db */ db=GWEN_DB_Group_new("institutes"); os=OH_InstituteSpec_List_First(sl); while(os) { GWEN_DB_NODE *dbT; int rv; dbT=GWEN_DB_Group_new("institute"); rv=OH_InstituteSpec_toDb(os, dbT); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbT); GWEN_DB_Group_free(db); return rv; } GWEN_DB_AddGroup(db, dbT); os=OH_InstituteSpec_List_Next(os); } /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } GWEN_Buffer_AppendString(nbuf, "institutes.conf"); /* write file */ rv=GWEN_DB_WriteFile(db, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_LOCKFILE); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return rv; } /* cleanup, done */ GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return 0; } int OfxHome_LoadSpecs(OFXHOME *ofh, OH_INSTITUTE_SPEC_LIST *sl) { GWEN_DB_NODE *db; GWEN_DB_NODE *dbT; GWEN_BUFFER *nbuf; int rv; /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } GWEN_Buffer_AppendString(nbuf, "institutes.conf"); /* read file */ db=GWEN_DB_Group_new("institutes"); rv=GWEN_DB_ReadFile(db, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_LOCKFILE | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return rv; } GWEN_Buffer_free(nbuf); dbT=GWEN_DB_GetFirstGroup(db); while(dbT) { OH_INSTITUTE_SPEC *os; os=OH_InstituteSpec_fromDb(dbT); if (os) OH_InstituteSpec_List_Add(os, sl); else { DBG_WARN(AQOFXCONNECT_LOGDOMAIN, "Group does not contain a valid institute spec"); GWEN_DB_Dump(dbT, 2); } dbT=GWEN_DB_GetNextGroup(dbT); } /* cleanup, done */ GWEN_DB_Group_free(db); return 0; } int OfxHome_CheckSpecsCache(OFXHOME *ofh, int hours) { GWEN_BUFFER *nbuf; int rv; struct stat st; /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } GWEN_Buffer_AppendString(nbuf, "institutes.conf"); rv=stat(GWEN_Buffer_GetStart(nbuf), &st); GWEN_Buffer_free(nbuf); if (rv) { /* not in cache */ return -1; } else { time_t t0; double diff; t0=time(NULL); diff=difftime(t0, st.st_mtime)/(60.0*60.0); if (diffspecList==NULL) { OH_INSTITUTE_SPEC_LIST *sl; int rv; sl=OH_InstituteSpec_List_new(); rv=OfxHome_CheckSpecsCache(ofh, OFX_CACHE_TIME_HR); if (rv<1) { /* no valid data in cache, download */ rv=OfxHome_DownloadSpecs(ofh, sl); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteSpec_List_free(sl); return NULL; } /* save data */ rv=OfxHome_SaveSpecs(ofh, sl); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteSpec_List_free(sl); return NULL; } } else { /* valid data in cache, load it */ rv=OfxHome_LoadSpecs(ofh, sl); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteSpec_List_free(sl); return NULL; } } ofh->specList=sl; } return ofh->specList; } int OfxHome_DownloadData(OFXHOME *ofh, int fid, OH_INSTITUTE_DATA **pData) { GWEN_HTTP_SESSION *sess; int rv; GWEN_BUFFER *xbuf; GWEN_XMLNODE *nroot; GWEN_XMLNODE *n; char urlbuf[256]; OH_INSTITUTE_DATA *od; /* prepare session */ snprintf(urlbuf, sizeof(urlbuf)-1, "http://www.ofxhome.com/api.php?lookup=%d", fid); urlbuf[sizeof(urlbuf)-1]=0; sess=GWEN_HttpSession_new(urlbuf, "http", 80); rv=OfxHome_SetupHttpSession(ofh, sess); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } /* send request (no body) */ rv=GWEN_HttpSession_SendPacket(sess, "GET", NULL, 0); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } /* get response */ xbuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=GWEN_HttpSession_RecvPacket(sess, xbuf); if (rv<0 || rv<200 || rv>=300) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(xbuf); GWEN_HttpSession_free(sess); return rv; } /* fini */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); /* parse list */ nroot=GWEN_XMLNode_fromString(GWEN_Buffer_GetStart(xbuf), GWEN_Buffer_GetUsedBytes(xbuf), GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS | GWEN_XML_FLAGS_HANDLE_NAMESPACES); if (nroot==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_Dump(xbuf, 2); GWEN_Buffer_free(xbuf); return rv; } GWEN_Buffer_free(xbuf); n=GWEN_XMLNode_FindFirstTag(nroot, "institution", NULL, NULL); if (n==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "XML tree does not contain an \"institution\" element"); GWEN_XMLNode_Dump(n, 2); GWEN_XMLNode_free(nroot); return GWEN_ERROR_BAD_DATA; } od=OH_InstituteData_fromXml(n); if (od==NULL) { DBG_WARN(AQOFXCONNECT_LOGDOMAIN, "element does not contain valid institute data"); GWEN_XMLNode_Dump(n, 2); GWEN_XMLNode_free(nroot); return GWEN_ERROR_BAD_DATA; } else *pData=od; GWEN_XMLNode_free(nroot); return 0; } int OfxHome_SaveData(OFXHOME *ofh, const OH_INSTITUTE_DATA *od) { GWEN_DB_NODE *db; GWEN_BUFFER *nbuf; int rv; char numbuf[32]; /* store institutes in db */ db=GWEN_DB_Group_new("institute"); rv=OH_InstituteData_toDb(od, db); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } snprintf(numbuf, sizeof(numbuf)-1, "%d", OH_InstituteData_GetId(od)); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(nbuf, numbuf); GWEN_Buffer_AppendString(nbuf, ".conf"); /* write file */ rv=GWEN_DB_WriteFile(db, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_LOCKFILE); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return rv; } /* cleanup, done */ GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return 0; } int OfxHome_LoadData(OFXHOME *ofh, int fid, OH_INSTITUTE_DATA **pData) { GWEN_DB_NODE *db; GWEN_BUFFER *nbuf; int rv; char numbuf[32]; OH_INSTITUTE_DATA *od; /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } snprintf(numbuf, sizeof(numbuf)-1, "%d", fid); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(nbuf, numbuf); GWEN_Buffer_AppendString(nbuf, ".conf"); /* read file */ db=GWEN_DB_Group_new("institute"); rv=GWEN_DB_ReadFile(db, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_LOCKFILE | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); GWEN_DB_Group_free(db); return rv; } GWEN_Buffer_free(nbuf); /* store institutes in db */ od=OH_InstituteData_fromDb(db); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } /* cleanup, done */ GWEN_DB_Group_free(db); *pData=od; return 0; } int OfxHome_CheckDataCache(OFXHOME *ofh, int fid, int hours) { GWEN_BUFFER *nbuf; int rv; char numbuf[32]; struct stat st; /* create filename */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (ofh->dataFolder) { GWEN_Buffer_AppendString(nbuf, ofh->dataFolder); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); } snprintf(numbuf, sizeof(numbuf)-1, "%d", fid); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(nbuf, numbuf); GWEN_Buffer_AppendString(nbuf, ".conf"); rv=stat(GWEN_Buffer_GetStart(nbuf), &st); GWEN_Buffer_free(nbuf); if (rv) { /* not in cache */ return -1; } else { time_t t0; double diff; t0=time(NULL); diff=difftime(t0, st.st_mtime)/(60.0*60.0); if (diffdataList, fid); if (d==NULL) { int rv; rv=OfxHome_CheckDataCache(ofh, fid, OFX_CACHE_TIME_HR); if (rv<1) { /* no valid data in cache, download */ rv=OfxHome_DownloadData(ofh, fid, &d); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return NULL; } /* save data */ rv=OfxHome_SaveData(ofh, d); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteData_free(d); return NULL; } } else { /* valid data in cache, load it */ rv=OfxHome_LoadData(ofh, fid, &d); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return NULL; } } OH_InstituteData_List_Add(d, ofh->dataList); } return d; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.xml0000644000175000017500000000712412364015477027650 00000000000000 OH_INSTITUTE_DATA OH_InstituteData with_db with_list1 with_list2 with_refcount
aqofxconnect/aqofxconnect.h
gwenhywfar/gwentime.h
aqofxconnect/oh_institute_data_fns.h
oh_institute_data_fns.c
0 0 with_getbymember public 0 0 with_flags public NULL NULL public own const dup const NULL NULL public own const dup const NULL NULL public own const dup const NULL NULL public own const dup const NULL NULL public own const dup const AEDB_DataType_String public own with_hash const dup const NULL NULL AEDB_DataType_String public own with_hash const dup const NULL NULL NULL NULL public own volatile const dup const
aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data_fns.c0000644000175000017500000000477312364015477030147 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif int OH_InstituteData_ReadXml(OH_INSTITUTE_DATA *oh, GWEN_XMLNODE *node) { const char *s; int i; s=GWEN_XMLNode_GetProperty(node, "id", NULL); if (s && *s) { if (sscanf(s, "%d", &i)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Bad value for property \"id\": [%s]", s); return GWEN_ERROR_BAD_DATA; } OH_InstituteData_SetId(oh, i); } s=GWEN_XMLNode_GetCharValue(node, "name", NULL); OH_InstituteData_SetName(oh, s); s=GWEN_XMLNode_GetCharValue(node, "fid", NULL); OH_InstituteData_SetFid(oh, s); s=GWEN_XMLNode_GetCharValue(node, "org", NULL); OH_InstituteData_SetOrg(oh, s); s=GWEN_XMLNode_GetCharValue(node, "brokerId", NULL); OH_InstituteData_SetBrokerId(oh, s); s=GWEN_XMLNode_GetCharValue(node, "url", NULL); OH_InstituteData_SetUrl(oh, s); i=GWEN_XMLNode_GetIntValue(node, "ofxfail", 0); if (i!=0) OH_InstituteData_AddFlags(oh, OH_INSTITUTE_DATA_FLAGS_OFXFAIL); else OH_InstituteData_SubFlags(oh, OH_INSTITUTE_DATA_FLAGS_OFXFAIL); i=GWEN_XMLNode_GetIntValue(node, "sslfail", 0); if (i!=0) OH_InstituteData_AddFlags(oh, OH_INSTITUTE_DATA_FLAGS_SSLFAIL); else OH_InstituteData_SubFlags(oh, OH_INSTITUTE_DATA_FLAGS_SSLFAIL); s=GWEN_XMLNode_GetCharValue(node, "lastofxvalidation", NULL); if (s && *s) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYY-MM-DD hh:mm:ss"); if (ti) { OH_InstituteData_SetLastOfxValidationTime(oh, ti); GWEN_Time_free(ti); } } s=GWEN_XMLNode_GetCharValue(node, "lastsslvalidation", NULL); if (s && *s) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYY-MM-DD hh:mm:ss"); if (ti) { OH_InstituteData_SetLastSslValidationTime(oh, ti); GWEN_Time_free(ti); } } return 0; } OH_INSTITUTE_DATA *OH_InstituteData_fromXml(GWEN_XMLNODE *node) { OH_INSTITUTE_DATA *oh; int rv; oh=OH_InstituteData_new(); rv=OH_InstituteData_ReadXml(oh, node); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); OH_InstituteData_free(oh); return NULL; } return oh; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.c0000644000175000017500000001204212364015551027277 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_spec.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "oh_institute_spec_p.h" #include #include /* code headers */ /* macro functions */ GWEN_LIST_FUNCTIONS(OH_INSTITUTE_SPEC, OH_InstituteSpec) GWEN_LIST2_FUNCTIONS(OH_INSTITUTE_SPEC, OH_InstituteSpec) OH_INSTITUTE_SPEC *OH_InstituteSpec_new(void) { OH_INSTITUTE_SPEC *p_struct; GWEN_NEW_OBJECT(OH_INSTITUTE_SPEC, p_struct) p_struct->_refCount=1; GWEN_LIST_INIT(OH_INSTITUTE_SPEC, p_struct) /* members */ p_struct->id=0; p_struct->name=NULL; /* virtual functions */ return p_struct; } void OH_InstituteSpec_free(OH_INSTITUTE_SPEC *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_LIST_FINI(OH_INSTITUTE_SPEC, p_struct) /* members */ free(p_struct->name); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void OH_InstituteSpec_Attach(OH_INSTITUTE_SPEC *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } OH_INSTITUTE_SPEC *OH_InstituteSpec_dup(const OH_INSTITUTE_SPEC *p_src) { OH_INSTITUTE_SPEC *p_struct; assert(p_src); p_struct=OH_InstituteSpec_new(); /* member "id" */ p_struct->id=p_src->id; /* member "name" */ if (p_struct->name) { free(p_struct->name); p_struct->name=NULL; } if (p_src->name) { p_struct->name=strdup(p_src->name); } return p_struct; } OH_INSTITUTE_SPEC *OH_InstituteSpec_copy(OH_INSTITUTE_SPEC *p_struct, const OH_INSTITUTE_SPEC *p_src) { assert(p_struct); assert(p_src); /* member "id" */ p_struct->id=p_src->id; /* member "name" */ if (p_struct->name) { free(p_struct->name); } if (p_struct->name) { free(p_struct->name); p_struct->name=NULL; } if (p_src->name) { p_struct->name=strdup(p_src->name); } return p_struct; } int OH_InstituteSpec_GetId(const OH_INSTITUTE_SPEC *p_struct) { assert(p_struct); return p_struct->id; } const char *OH_InstituteSpec_GetName(const OH_INSTITUTE_SPEC *p_struct) { assert(p_struct); return p_struct->name; } void OH_InstituteSpec_SetId(OH_INSTITUTE_SPEC *p_struct, int p_src) { assert(p_struct); p_struct->id=p_src; } void OH_InstituteSpec_SetName(OH_INSTITUTE_SPEC *p_struct, const char *p_src) { assert(p_struct); if (p_struct->name) { free(p_struct->name); } if (p_src) { p_struct->name=strdup(p_src); } else { p_struct->name=NULL; } } /* list1 functions */ OH_INSTITUTE_SPEC_LIST *OH_InstituteSpec_List_dup(const OH_INSTITUTE_SPEC_LIST *p_src) { OH_INSTITUTE_SPEC_LIST *p_dest; OH_INSTITUTE_SPEC *p_elem; assert(p_src); p_dest=OH_InstituteSpec_List_new(); p_elem=OH_InstituteSpec_List_First(p_src); while(p_elem) { OH_INSTITUTE_SPEC *p_cpy; p_cpy=OH_InstituteSpec_dup(p_elem); OH_InstituteSpec_List_Add(p_cpy, p_dest); p_elem=OH_InstituteSpec_List_Next(p_elem); } return p_dest; } void OH_InstituteSpec_ReadDb(OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db) { assert(p_struct); /* member "id" */ p_struct->id=GWEN_DB_GetIntValue(p_db, "id", 0, 0); /* member "name" */ if (p_struct->name) { free(p_struct->name); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "name", 0, NULL); if (s) p_struct->name=strdup(s); } if (p_struct->name==NULL) { p_struct->name=NULL; } } int OH_InstituteSpec_WriteDb(const OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db) { int p_rv; assert(p_struct); /* member "id" */ p_rv=GWEN_DB_SetIntValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "id", p_struct->id); if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "name" */ if (p_struct->name) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", p_struct->name); else { GWEN_DB_DeleteVar(p_db, "name"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } return 0; } OH_INSTITUTE_SPEC *OH_InstituteSpec_fromDb(GWEN_DB_NODE *p_db) { OH_INSTITUTE_SPEC *p_struct; p_struct=OH_InstituteSpec_new(); OH_InstituteSpec_ReadDb(p_struct, p_db); return p_struct; } int OH_InstituteSpec_toDb(const OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db) { return OH_InstituteSpec_WriteDb(p_struct, p_db); } OH_INSTITUTE_SPEC *OH_InstituteSpec_List_GetById(const OH_INSTITUTE_SPEC_LIST *p_list, int p_cmp) { OH_INSTITUTE_SPEC *p_struct; assert(p_list); p_struct = OH_InstituteSpec_List_First(p_list); while(p_struct) { int p_rv; if (p_struct->id==p_cmp) p_rv=0; else if (p_cmpid) p_rv=-1; else p_rv=1; if (p_rv == 0) return p_struct; p_struct = OH_InstituteSpec_List_Next(p_struct); } return NULL; } /* code headers */ #include "oh_institute_spec_fns.c" aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.h0000644000175000017500000000514012364015551027305 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_spec.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef OH_INSTITUTE_SPEC_H #define OH_INSTITUTE_SPEC_H #ifdef __cplusplus extern "C" { #endif /* needed system headers */ #include #include #include #include /* pre-headers */ #include typedef struct OH_INSTITUTE_SPEC OH_INSTITUTE_SPEC; GWEN_LIST_FUNCTION_LIB_DEFS(OH_INSTITUTE_SPEC, OH_InstituteSpec, AQOFXCONNECT_API) GWEN_LIST2_FUNCTION_LIB_DEFS(OH_INSTITUTE_SPEC, OH_InstituteSpec, AQOFXCONNECT_API) /* post-headers */ #include /** Constructor. */ AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_new(void); /** Destructor. */ AQOFXCONNECT_API void OH_InstituteSpec_free(OH_INSTITUTE_SPEC *p_struct); AQOFXCONNECT_API void OH_InstituteSpec_Attach(OH_INSTITUTE_SPEC *p_struct); AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_dup(const OH_INSTITUTE_SPEC *p_struct); AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_copy(OH_INSTITUTE_SPEC *p_struct, const OH_INSTITUTE_SPEC *p_src); /** Getter. * Use this function to get the member "id" */ AQOFXCONNECT_API int OH_InstituteSpec_GetId(const OH_INSTITUTE_SPEC *p_struct); /** Getter. * Use this function to get the member "name" */ AQOFXCONNECT_API const char *OH_InstituteSpec_GetName(const OH_INSTITUTE_SPEC *p_struct); /** Setter. * Use this function to set the member "id" */ AQOFXCONNECT_API void OH_InstituteSpec_SetId(OH_INSTITUTE_SPEC *p_struct, int p_src); /** Setter. * Use this function to set the member "name" */ AQOFXCONNECT_API void OH_InstituteSpec_SetName(OH_INSTITUTE_SPEC *p_struct, const char *p_src); /* list1 functions */ AQOFXCONNECT_API OH_INSTITUTE_SPEC_LIST *OH_InstituteSpec_List_dup(const OH_INSTITUTE_SPEC_LIST *p_src); AQOFXCONNECT_API void OH_InstituteSpec_ReadDb(OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API int OH_InstituteSpec_WriteDb(const OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_fromDb(GWEN_DB_NODE *p_db); AQOFXCONNECT_API int OH_InstituteSpec_toDb(const OH_INSTITUTE_SPEC *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API OH_INSTITUTE_SPEC *OH_InstituteSpec_List_GetById(const OH_INSTITUTE_SPEC_LIST *p_list, int p_cmp); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst_p.h0000644000175000017500000000252412364015477026411 00000000000000/*************************************************************************** begin : Wed Aug 18 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef OFXHOME_DLG_GETINST_P_H #define OFXHOME_DLG_GETINST_P_H #include "dlg_getinst.h" #include #include typedef struct OH_GETINST_DIALOG OH_GETINST_DIALOG; struct OH_GETINST_DIALOG { OFXHOME *ofxHome; OH_INSTITUTE_SPEC_LIST *matchingSpecList; OH_INSTITUTE_DATA *selectedData; char *name; }; static GWENHYWFAR_CB void OH_GetInstituteDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB OH_GetInstituteDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static OH_INSTITUTE_SPEC *OH_GetInstituteDialog_DetermineSelectedBankInfo(GWEN_DIALOG *dlg); static void OH_GetInstituteDialog_UpdateList(GWEN_DIALOG *dlg); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.c0000644000175000017500000003203712364015477026067 00000000000000/*************************************************************************** begin : Wed Aug 18 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_getinst_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 #define LIST_MINCOLWIDTH 50 GWEN_INHERIT(GWEN_DIALOG, OH_GETINST_DIALOG) GWEN_DIALOG *OH_GetInstituteDialog_new(const char *dataFolder, const char *name) { GWEN_DIALOG *dlg; OH_GETINST_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("oh_getinst"); GWEN_NEW_OBJECT(OH_GETINST_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg, xdlg, OH_GetInstituteDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, OH_GetInstituteDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqofxconnect/dialogs/dlg_getinst.dlg", fbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->ofxHome=OfxHome_new(dataFolder); xdlg->matchingSpecList=OH_InstituteSpec_List_new(); if (name) xdlg->name=strdup(name); /* done */ return dlg; } void GWENHYWFAR_CB OH_GetInstituteDialog_FreeData(void *bp, void *p) { OH_GETINST_DIALOG *xdlg; xdlg=(OH_GETINST_DIALOG*) p; OH_InstituteSpec_List_free(xdlg->matchingSpecList); OH_InstituteData_free(xdlg->selectedData); free(xdlg->name); OfxHome_free(xdlg->ofxHome); GWEN_FREE_OBJECT(xdlg); } static void createListBoxString(const OH_INSTITUTE_SPEC *os, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; s=OH_InstituteSpec_GetName(os); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); snprintf(numbuf, sizeof(numbuf)-1, " (%d)", OH_InstituteSpec_GetId(os)); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); } else { snprintf(numbuf, sizeof(numbuf)-1, "%d", OH_InstituteSpec_GetId(os)); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); } } const OH_INSTITUTE_DATA *OH_GetInstituteDialog_GetSelectedInstitute(GWEN_DIALOG *dlg) { OH_GETINST_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); return xdlg->selectedData; } OH_INSTITUTE_SPEC *OH_GetInstituteDialog_DetermineSelectedBankInfo(GWEN_DIALOG *dlg) { OH_GETINST_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); if (xdlg->matchingSpecList) { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "listBox", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { OH_INSTITUTE_SPEC *os; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); os=OH_InstituteSpec_List_First(xdlg->matchingSpecList); while(os) { createListBoxString(os, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); return os; } GWEN_Buffer_Reset(tbuf); os=OH_InstituteSpec_List_Next(os); } GWEN_Buffer_free(tbuf); } } } return NULL; } void OH_GetInstituteDialog_UpdateList(GWEN_DIALOG *dlg) { OH_GETINST_DIALOG *xdlg; const OH_INSTITUTE_SPEC_LIST *sl; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); /* clear bank info list */ GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_ClearValues, 0, 0, 0); OH_InstituteSpec_List_Clear(xdlg->matchingSpecList); OH_InstituteData_free(xdlg->selectedData); xdlg->selectedData=NULL; sl=OfxHome_GetSpecs(xdlg->ofxHome); if (sl) { GWEN_BUFFER *tbuf; const OH_INSTITUTE_SPEC *os; const char *s; s=GWEN_Dialog_GetCharProperty(dlg, "nameEdit", GWEN_DialogProperty_Value, 0, NULL); tbuf=GWEN_Buffer_new(0, 256, 0, 1); os=OH_InstituteSpec_List_First(sl); while(os) { const char *bname; bname=OH_InstituteSpec_GetName(os); /* only add matching entries */ if ( (s && bname && GWEN_Text_StrCaseStr(bname, s)!=NULL) || !(s && *s)) { OH_InstituteSpec_List_Add(OH_InstituteSpec_dup(os), xdlg->matchingSpecList); createListBoxString(os, tbuf); GWEN_Dialog_SetCharProperty(dlg, "listBox", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); } os=OH_InstituteSpec_List_Next(os); } GWEN_Buffer_free(tbuf); } if (GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_Value, 0, -1)>=0) GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 1, 0); else GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0); } void OH_GetInstituteDialog_Init(GWEN_DIALOG *dlg) { OH_GETINST_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; int j; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Select a Bank"), 0); GWEN_Dialog_SetCharProperty(dlg, "listBox", GWEN_DialogProperty_Title, 0, I18N("Bank Name"), 0); GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); GWEN_Dialog_SetCharProperty(dlg, "infoLabel", GWEN_DialogProperty_Title, 0, I18N("" "

Please start typing in the name of your bank. The list " "below will be updated to show matching banks.

" "

Choose the bank from list below and click ok.

" "" "Please start typing in the name of your bank. The list\n" "below will be updated to show matching banks.\n" "Choose the bank from list below and click OK."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* read bank column widths */ for (i=0; i<1; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "bank_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_SortDirection, i, j, 0); /* disable ok button */ GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0); } void OH_GetInstituteDialog_Fini(GWEN_DIALOG *dlg) { OH_GETINST_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); /* store column widths of importer list */ GWEN_DB_DeleteVar(dbPrefs, "bank_list_columns"); for (i=0; i<1; i++) { int j; j=GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_ColumnWidth, i, -1); if (jofxHome, OH_InstituteSpec_GetId(os)); if (od) { OH_InstituteData_free(xdlg->selectedData); xdlg->selectedData=OH_InstituteData_dup(od); return GWEN_DialogEvent_ResultAccept; } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "No institute data for id=%d", OH_InstituteSpec_GetId(os)); } } return GWEN_DialogEvent_ResultHandled; } else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int OH_GetInstituteDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { DBG_ERROR(0, "Changed %s", sender); if (strcasecmp(sender, "nameEdit")==0) { OH_GetInstituteDialog_UpdateList(dlg); return GWEN_DialogEvent_ResultHandled; } else if (strcasecmp(sender, "listBox")==0) { return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB OH_GetInstituteDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { OH_GETINST_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, OH_GETINST_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: OH_GetInstituteDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: OH_GetInstituteDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return OH_GetInstituteDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return OH_GetInstituteDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data_p.h0000644000175000017500000000143312364015551027604 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_data.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef OH_INSTITUTE_DATA_P_H #define OH_INSTITUTE_DATA_P_H #include "oh_institute_data.h" #ifdef __cplusplus extern "C" { #endif struct OH_INSTITUTE_DATA { GWEN_LIST_ELEMENT(OH_INSTITUTE_DATA) int _refCount; int id; uint32_t flags; char *name; char *fid; char *org; char *brokerId; char *url; GWEN_TIME *lastOfxValidationTime; GWEN_TIME *lastSslValidationTime; char *fileName; /* volatile */ }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/ofxhome_p.h0000644000175000017500000000271112364015477025551 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef OFXHOME_P_H #define OFXHOME_P_H #include "ofxhome.h" #include struct OFXHOME { OH_INSTITUTE_SPEC_LIST *specList; OH_INSTITUTE_DATA_LIST *dataList; char *dataFolder; }; int OfxHome_SetupHttpSession(OFXHOME *ofh, GWEN_HTTP_SESSION *sess); int OfxHome_DownloadSpecs(OFXHOME *ofh, OH_INSTITUTE_SPEC_LIST *sl); int OfxHome_LoadSpecs(OFXHOME *ofh, OH_INSTITUTE_SPEC_LIST *sl); int OfxHome_SaveSpecs(OFXHOME *ofh, const OH_INSTITUTE_SPEC_LIST *sl); /** * @param ofh pointer to OFXHOME object * @param hours cache validity time in hours * @return -1 if data is not in cache * 0 if data in cache but outdated, * 1 if valid data in cache */ int OfxHome_CheckSpecsCache(OFXHOME *ofh, int hours); int OfxHome_DownloadData(OFXHOME *ofh, int fid, OH_INSTITUTE_DATA **pData); int OfxHome_LoadData(OFXHOME *ofh, int fid, OH_INSTITUTE_DATA **pData); int OfxHome_SaveData(OFXHOME *ofh, const OH_INSTITUTE_DATA *od); int OfxHome_CheckDataCache(OFXHOME *ofh, int fid, int hours); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec_p.h0000644000175000017500000000114712364015551027627 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_spec.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef OH_INSTITUTE_SPEC_P_H #define OH_INSTITUTE_SPEC_P_H #include "oh_institute_spec.h" #ifdef __cplusplus extern "C" { #endif struct OH_INSTITUTE_SPEC { GWEN_LIST_ELEMENT(OH_INSTITUTE_SPEC) int _refCount; int id; char *name; }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile.in0000644000175000017500000007310212643540060025452 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = libtest$(EXEEXT) subdir = src/plugins/backends/aqofxconnect/plugin/libofxhome DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libofxhome_la_LIBADD = am__objects_1 = oh_institute_data.lo oh_institute_spec.lo am_libofxhome_la_OBJECTS = $(am__objects_1) ofxhome.lo dlg_getinst.lo libofxhome_la_OBJECTS = $(am_libofxhome_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = PROGRAMS = $(noinst_PROGRAMS) am_libtest_OBJECTS = libtest.$(OBJEXT) libtest_OBJECTS = $(am_libtest_OBJECTS) am__DEPENDENCIES_1 = libtest_DEPENDENCIES = libofxhome.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libofxhome_la_SOURCES) $(libtest_SOURCES) DIST_SOURCES = $(libofxhome_la_SOURCES) $(libtest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(iheaderdir)" DATA = $(dlgdata_DATA) HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DBUILDING_AQOFXCONNECT DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking $(GWENGUI_GTK2_CFLAGS) $(GTK2_CFLAGS) typefiles = \ oh_institute_data.xml \ oh_institute_spec.xml #typedatadir=$(datadir)/aqbanking/aqofxconnect/typemaker2/c #nodist_typedata_DATA=\ # oh_institute_data.tm2 oh_institute_data_list.tm2 oh_institute_data_list2.tm2 \ # oh_institute_spec.tm2 oh_institute_spec_list.tm2 oh_institute_spec_list2.tm2 dlgdatadir = $(aqbanking_pkgdatadir)/backends/aqofxconnect/dialogs dlgdata_DATA = \ dlg_getinst.dlg build_sources = \ oh_institute_data.c \ oh_institute_spec.c build_headers_priv = \ oh_institute_data_p.h \ oh_institute_spec_p.h build_headers_pub = \ oh_institute_data.h \ oh_institute_spec.h build_headers = $(build_headers_priv) $(build_headers_pub) noinst_HEADERS = $(build_headers_priv) \ ofxhome_p.h \ dlg_getinst_p.h iheaderdir = @aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS = $(build_headers_pub) \ oh_institute_data_fns.h \ oh_institute_spec_fns.h \ ofxhome.h \ dlg_getinst.h noinst_LTLIBRARIES = libofxhome.la libofxhome_la_SOURCES = $(build_sources) \ ofxhome.c \ dlg_getinst.c libtest_SOURCES = libtest.c libtest_LDADD = libofxhome.la $(aqbanking_internal_libs) $(gwenhywfar_libs) $(GWENGUI_GTK2_LIBS) $(GTK2_LIBS) EXTRA_DIST = \ oh_institute_data_fns.c \ oh_institute_spec_fns.c \ $(typefiles) $(dlgdata_DATA) $(dlgimage_DATA) $(build_sources) $(build_headers) SUFFIXES = .xml .c all: all-am .SUFFIXES: .SUFFIXES: .xml .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libofxhome.la: $(libofxhome_la_OBJECTS) $(libofxhome_la_DEPENDENCIES) $(EXTRA_libofxhome_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libofxhome_la_OBJECTS) $(libofxhome_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list libtest$(EXEEXT): $(libtest_OBJECTS) $(libtest_DEPENDENCIES) $(EXTRA_libtest_DEPENDENCIES) @rm -f libtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(libtest_OBJECTS) $(libtest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_getinst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ofxhome.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oh_institute_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oh_institute_spec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dlgdataDATA: $(dlgdata_DATA) @$(NORMAL_INSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgdatadir)" || exit $$?; \ done uninstall-dlgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgdatadir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dlgdataDATA install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dlgdataDATA uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dlgdataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dlgdataDATA \ uninstall-iheaderHEADERS built_sources: $(build_sources) sources: for f in $(libofxhome_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done %.c: %.xml $(gwenhywfar_bindir)/typemaker2 -I $(top_srcdir)/src/lib/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQOFXCONNECT_API $< %.h: %.xml $(gwenhywfar_bindir)/typemaker2 -I $(top_srcdir)/src/lib/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQOFXCONNECT_API $< # 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: aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile.am0000644000175000017500000000410712364015477025451 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking $(GWENGUI_GTK2_CFLAGS) $(GTK2_CFLAGS) DEFS += -DBUILDING_AQOFXCONNECT typefiles=\ oh_institute_data.xml \ oh_institute_spec.xml #typedatadir=$(datadir)/aqbanking/aqofxconnect/typemaker2/c #nodist_typedata_DATA=\ # oh_institute_data.tm2 oh_institute_data_list.tm2 oh_institute_data_list2.tm2 \ # oh_institute_spec.tm2 oh_institute_spec_list.tm2 oh_institute_spec_list2.tm2 dlgdatadir=$(aqbanking_pkgdatadir)/backends/aqofxconnect/dialogs dlgdata_DATA=\ dlg_getinst.dlg build_sources= \ oh_institute_data.c \ oh_institute_spec.c build_headers_priv= \ oh_institute_data_p.h \ oh_institute_spec_p.h build_headers_pub= \ oh_institute_data.h \ oh_institute_spec.h build_headers=$(build_headers_priv) $(build_headers_pub) noinst_HEADERS=$(build_headers_priv) \ ofxhome_p.h \ dlg_getinst_p.h iheaderdir=@aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS=$(build_headers_pub) \ oh_institute_data_fns.h \ oh_institute_spec_fns.h \ ofxhome.h \ dlg_getinst.h noinst_LTLIBRARIES=libofxhome.la libofxhome_la_SOURCES= $(build_sources) \ ofxhome.c \ dlg_getinst.c noinst_PROGRAMS=libtest libtest_SOURCES=libtest.c libtest_LDADD=libofxhome.la $(aqbanking_internal_libs) $(gwenhywfar_libs) $(GWENGUI_GTK2_LIBS) $(GTK2_LIBS) EXTRA_DIST=\ oh_institute_data_fns.c \ oh_institute_spec_fns.c \ $(typefiles) $(dlgdata_DATA) $(dlgimage_DATA) $(build_sources) $(build_headers) built_sources: $(build_sources) sources: for f in $(libofxhome_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done %.c: %.xml $(gwenhywfar_bindir)/typemaker2 -I $(top_srcdir)/src/lib/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQOFXCONNECT_API $< %.h: %.xml $(gwenhywfar_bindir)/typemaker2 -I $(top_srcdir)/src/lib/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQOFXCONNECT_API $< SUFFIXES = .xml .c aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.xml0000644000175000017500000000213612364015477027667 00000000000000 OH_INSTITUTE_SPEC OH_InstituteSpec with_db with_list1 with_list2 with_refcount
aqofxconnect/aqofxconnect.h
aqofxconnect/oh_institute_spec_fns.h
oh_institute_spec_fns.c
0 0 with_getbymember public NULL NULL public own const dup const
aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.c0000644000175000017500000004045612364015551027270 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_data.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "oh_institute_data_p.h" #include #include /* code headers */ /* macro functions */ GWEN_LIST_FUNCTIONS(OH_INSTITUTE_DATA, OH_InstituteData) GWEN_LIST2_FUNCTIONS(OH_INSTITUTE_DATA, OH_InstituteData) OH_INSTITUTE_DATA *OH_InstituteData_new(void) { OH_INSTITUTE_DATA *p_struct; GWEN_NEW_OBJECT(OH_INSTITUTE_DATA, p_struct) p_struct->_refCount=1; GWEN_LIST_INIT(OH_INSTITUTE_DATA, p_struct) /* members */ p_struct->id=0; p_struct->flags=0; p_struct->name=NULL; p_struct->fid=NULL; p_struct->org=NULL; p_struct->brokerId=NULL; p_struct->url=NULL; p_struct->lastOfxValidationTime=NULL; p_struct->lastSslValidationTime=NULL; p_struct->fileName=NULL; /* virtual functions */ return p_struct; } void OH_InstituteData_free(OH_INSTITUTE_DATA *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_LIST_FINI(OH_INSTITUTE_DATA, p_struct) /* members */ free(p_struct->name); free(p_struct->fid); free(p_struct->org); free(p_struct->brokerId); free(p_struct->url); GWEN_Time_free(p_struct->lastOfxValidationTime); GWEN_Time_free(p_struct->lastSslValidationTime); free(p_struct->fileName); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void OH_InstituteData_Attach(OH_INSTITUTE_DATA *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } OH_INSTITUTE_DATA *OH_InstituteData_dup(const OH_INSTITUTE_DATA *p_src) { OH_INSTITUTE_DATA *p_struct; assert(p_src); p_struct=OH_InstituteData_new(); /* member "id" */ p_struct->id=p_src->id; /* member "flags" */ p_struct->flags=p_src->flags; /* member "name" */ if (p_struct->name) { free(p_struct->name); p_struct->name=NULL; } if (p_src->name) { p_struct->name=strdup(p_src->name); } /* member "fid" */ if (p_struct->fid) { free(p_struct->fid); p_struct->fid=NULL; } if (p_src->fid) { p_struct->fid=strdup(p_src->fid); } /* member "org" */ if (p_struct->org) { free(p_struct->org); p_struct->org=NULL; } if (p_src->org) { p_struct->org=strdup(p_src->org); } /* member "brokerId" */ if (p_struct->brokerId) { free(p_struct->brokerId); p_struct->brokerId=NULL; } if (p_src->brokerId) { p_struct->brokerId=strdup(p_src->brokerId); } /* member "url" */ if (p_struct->url) { free(p_struct->url); p_struct->url=NULL; } if (p_src->url) { p_struct->url=strdup(p_src->url); } /* member "lastOfxValidationTime" */ if (p_struct->lastOfxValidationTime) { GWEN_Time_free(p_struct->lastOfxValidationTime); p_struct->lastOfxValidationTime=NULL; } if (p_src->lastOfxValidationTime) { p_struct->lastOfxValidationTime=GWEN_Time_dup(p_src->lastOfxValidationTime); } /* member "lastSslValidationTime" */ if (p_struct->lastSslValidationTime) { GWEN_Time_free(p_struct->lastSslValidationTime); p_struct->lastSslValidationTime=NULL; } if (p_src->lastSslValidationTime) { p_struct->lastSslValidationTime=GWEN_Time_dup(p_src->lastSslValidationTime); } /* member "fileName" */ if (p_struct->fileName) { free(p_struct->fileName); p_struct->fileName=NULL; } if (p_src->fileName) { p_struct->fileName=strdup(p_src->fileName); } return p_struct; } OH_INSTITUTE_DATA *OH_InstituteData_copy(OH_INSTITUTE_DATA *p_struct, const OH_INSTITUTE_DATA *p_src) { assert(p_struct); assert(p_src); /* member "id" */ p_struct->id=p_src->id; /* member "flags" */ p_struct->flags=p_src->flags; /* member "name" */ if (p_struct->name) { free(p_struct->name); } if (p_struct->name) { free(p_struct->name); p_struct->name=NULL; } if (p_src->name) { p_struct->name=strdup(p_src->name); } /* member "fid" */ if (p_struct->fid) { free(p_struct->fid); } if (p_struct->fid) { free(p_struct->fid); p_struct->fid=NULL; } if (p_src->fid) { p_struct->fid=strdup(p_src->fid); } /* member "org" */ if (p_struct->org) { free(p_struct->org); } if (p_struct->org) { free(p_struct->org); p_struct->org=NULL; } if (p_src->org) { p_struct->org=strdup(p_src->org); } /* member "brokerId" */ if (p_struct->brokerId) { free(p_struct->brokerId); } if (p_struct->brokerId) { free(p_struct->brokerId); p_struct->brokerId=NULL; } if (p_src->brokerId) { p_struct->brokerId=strdup(p_src->brokerId); } /* member "url" */ if (p_struct->url) { free(p_struct->url); } if (p_struct->url) { free(p_struct->url); p_struct->url=NULL; } if (p_src->url) { p_struct->url=strdup(p_src->url); } /* member "lastOfxValidationTime" */ if (p_struct->lastOfxValidationTime) { GWEN_Time_free(p_struct->lastOfxValidationTime); } if (p_struct->lastOfxValidationTime) { GWEN_Time_free(p_struct->lastOfxValidationTime); p_struct->lastOfxValidationTime=NULL; } if (p_src->lastOfxValidationTime) { p_struct->lastOfxValidationTime=GWEN_Time_dup(p_src->lastOfxValidationTime); } /* member "lastSslValidationTime" */ if (p_struct->lastSslValidationTime) { GWEN_Time_free(p_struct->lastSslValidationTime); } if (p_struct->lastSslValidationTime) { GWEN_Time_free(p_struct->lastSslValidationTime); p_struct->lastSslValidationTime=NULL; } if (p_src->lastSslValidationTime) { p_struct->lastSslValidationTime=GWEN_Time_dup(p_src->lastSslValidationTime); } /* member "fileName" */ if (p_struct->fileName) { free(p_struct->fileName); } if (p_struct->fileName) { free(p_struct->fileName); p_struct->fileName=NULL; } if (p_src->fileName) { p_struct->fileName=strdup(p_src->fileName); } return p_struct; } int OH_InstituteData_GetId(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->id; } uint32_t OH_InstituteData_GetFlags(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->flags; } const char *OH_InstituteData_GetName(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->name; } const char *OH_InstituteData_GetFid(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->fid; } const char *OH_InstituteData_GetOrg(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->org; } const char *OH_InstituteData_GetBrokerId(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->brokerId; } const char *OH_InstituteData_GetUrl(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->url; } const GWEN_TIME *OH_InstituteData_GetLastOfxValidationTime(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->lastOfxValidationTime; } const GWEN_TIME *OH_InstituteData_GetLastSslValidationTime(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->lastSslValidationTime; } const char *OH_InstituteData_GetFileName(const OH_INSTITUTE_DATA *p_struct) { assert(p_struct); return p_struct->fileName; } void OH_InstituteData_SetId(OH_INSTITUTE_DATA *p_struct, int p_src) { assert(p_struct); p_struct->id=p_src; } void OH_InstituteData_SetFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src) { assert(p_struct); p_struct->flags=p_src; } void OH_InstituteData_AddFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src) { assert(p_struct); p_struct->flags|=p_src; } void OH_InstituteData_SubFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src) { assert(p_struct); p_struct->flags&=~p_src; } void OH_InstituteData_SetName(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->name) { free(p_struct->name); } if (p_src) { p_struct->name=strdup(p_src); } else { p_struct->name=NULL; } } void OH_InstituteData_SetFid(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->fid) { free(p_struct->fid); } if (p_src) { p_struct->fid=strdup(p_src); } else { p_struct->fid=NULL; } } void OH_InstituteData_SetOrg(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->org) { free(p_struct->org); } if (p_src) { p_struct->org=strdup(p_src); } else { p_struct->org=NULL; } } void OH_InstituteData_SetBrokerId(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->brokerId) { free(p_struct->brokerId); } if (p_src) { p_struct->brokerId=strdup(p_src); } else { p_struct->brokerId=NULL; } } void OH_InstituteData_SetUrl(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->url) { free(p_struct->url); } if (p_src) { p_struct->url=strdup(p_src); } else { p_struct->url=NULL; } } void OH_InstituteData_SetLastOfxValidationTime(OH_INSTITUTE_DATA *p_struct, const GWEN_TIME *p_src) { assert(p_struct); if (p_struct->lastOfxValidationTime) { GWEN_Time_free(p_struct->lastOfxValidationTime); } if (p_src) { p_struct->lastOfxValidationTime=GWEN_Time_dup(p_src); } else { p_struct->lastOfxValidationTime=NULL; } } void OH_InstituteData_SetLastSslValidationTime(OH_INSTITUTE_DATA *p_struct, const GWEN_TIME *p_src) { assert(p_struct); if (p_struct->lastSslValidationTime) { GWEN_Time_free(p_struct->lastSslValidationTime); } if (p_src) { p_struct->lastSslValidationTime=GWEN_Time_dup(p_src); } else { p_struct->lastSslValidationTime=NULL; } } void OH_InstituteData_SetFileName(OH_INSTITUTE_DATA *p_struct, const char *p_src) { assert(p_struct); if (p_struct->fileName) { free(p_struct->fileName); } if (p_src) { p_struct->fileName=strdup(p_src); } else { p_struct->fileName=NULL; } } /* list1 functions */ OH_INSTITUTE_DATA_LIST *OH_InstituteData_List_dup(const OH_INSTITUTE_DATA_LIST *p_src) { OH_INSTITUTE_DATA_LIST *p_dest; OH_INSTITUTE_DATA *p_elem; assert(p_src); p_dest=OH_InstituteData_List_new(); p_elem=OH_InstituteData_List_First(p_src); while(p_elem) { OH_INSTITUTE_DATA *p_cpy; p_cpy=OH_InstituteData_dup(p_elem); OH_InstituteData_List_Add(p_cpy, p_dest); p_elem=OH_InstituteData_List_Next(p_elem); } return p_dest; } void OH_InstituteData_ReadDb(OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db) { assert(p_struct); /* member "id" */ p_struct->id=GWEN_DB_GetIntValue(p_db, "id", 0, 0); /* member "flags" */ p_struct->flags=GWEN_DB_GetIntValue(p_db, "flags", 0, 0); /* member "name" */ if (p_struct->name) { free(p_struct->name); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "name", 0, NULL); if (s) p_struct->name=strdup(s); } if (p_struct->name==NULL) { p_struct->name=NULL; } /* member "fid" */ if (p_struct->fid) { free(p_struct->fid); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "fid", 0, NULL); if (s) p_struct->fid=strdup(s); } if (p_struct->fid==NULL) { p_struct->fid=NULL; } /* member "org" */ if (p_struct->org) { free(p_struct->org); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "org", 0, NULL); if (s) p_struct->org=strdup(s); } if (p_struct->org==NULL) { p_struct->org=NULL; } /* member "brokerId" */ if (p_struct->brokerId) { free(p_struct->brokerId); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "brokerId", 0, NULL); if (s) p_struct->brokerId=strdup(s); } if (p_struct->brokerId==NULL) { p_struct->brokerId=NULL; } /* member "url" */ if (p_struct->url) { free(p_struct->url); } { const char *s; s=GWEN_DB_GetCharValue(p_db, "url", 0, NULL); if (s) p_struct->url=strdup(s); } if (p_struct->url==NULL) { p_struct->url=NULL; } /* member "lastOfxValidationTime" */ if (p_struct->lastOfxValidationTime) { GWEN_Time_free(p_struct->lastOfxValidationTime); } { GWEN_DB_NODE *dbDest; dbDest=GWEN_DB_GetGroup(p_db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "lastOfxValidationTime"); if (dbDest) p_struct->lastOfxValidationTime=GWEN_Time_fromDb(dbDest); } if (p_struct->lastOfxValidationTime==NULL) { p_struct->lastOfxValidationTime=NULL; } /* member "lastSslValidationTime" */ if (p_struct->lastSslValidationTime) { GWEN_Time_free(p_struct->lastSslValidationTime); } { GWEN_DB_NODE *dbDest; dbDest=GWEN_DB_GetGroup(p_db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "lastSslValidationTime"); if (dbDest) p_struct->lastSslValidationTime=GWEN_Time_fromDb(dbDest); } if (p_struct->lastSslValidationTime==NULL) { p_struct->lastSslValidationTime=NULL; } /* member "fileName" */ if (p_struct->fileName) { free(p_struct->fileName); } /* member "fileName" is volatile, just presetting */ p_struct->fileName=NULL; } int OH_InstituteData_WriteDb(const OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db) { int p_rv; assert(p_struct); /* member "id" */ p_rv=GWEN_DB_SetIntValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "id", p_struct->id); if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "flags" */ p_rv=GWEN_DB_SetIntValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "flags", p_struct->flags); if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "name" */ if (p_struct->name) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", p_struct->name); else { GWEN_DB_DeleteVar(p_db, "name"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "fid" */ if (p_struct->fid) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "fid", p_struct->fid); else { GWEN_DB_DeleteVar(p_db, "fid"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "org" */ if (p_struct->org) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "org", p_struct->org); else { GWEN_DB_DeleteVar(p_db, "org"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "brokerId" */ if (p_struct->brokerId) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "brokerId", p_struct->brokerId); else { GWEN_DB_DeleteVar(p_db, "brokerId"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "url" */ if (p_struct->url) p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "url", p_struct->url); else { GWEN_DB_DeleteVar(p_db, "url"); p_rv=0; } if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "lastOfxValidationTime" */ if (p_struct->lastOfxValidationTime){ GWEN_DB_NODE *dbDest; dbDest=GWEN_DB_GetGroup(p_db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "lastOfxValidationTime"); assert(dbDest); p_rv=GWEN_Time_toDb(p_struct->lastOfxValidationTime, dbDest); } else p_rv=0; if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "lastSslValidationTime" */ if (p_struct->lastSslValidationTime){ GWEN_DB_NODE *dbDest; dbDest=GWEN_DB_GetGroup(p_db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "lastSslValidationTime"); assert(dbDest); p_rv=GWEN_Time_toDb(p_struct->lastSslValidationTime, dbDest); } else p_rv=0; if (p_rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); return p_rv; } /* member "fileName" is volatile, not writing to db */ return 0; } OH_INSTITUTE_DATA *OH_InstituteData_fromDb(GWEN_DB_NODE *p_db) { OH_INSTITUTE_DATA *p_struct; p_struct=OH_InstituteData_new(); OH_InstituteData_ReadDb(p_struct, p_db); return p_struct; } int OH_InstituteData_toDb(const OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db) { return OH_InstituteData_WriteDb(p_struct, p_db); } OH_INSTITUTE_DATA *OH_InstituteData_List_GetById(const OH_INSTITUTE_DATA_LIST *p_list, int p_cmp) { OH_INSTITUTE_DATA *p_struct; assert(p_list); p_struct = OH_InstituteData_List_First(p_list); while(p_struct) { int p_rv; if (p_struct->id==p_cmp) p_rv=0; else if (p_cmpid) p_rv=-1; else p_rv=1; if (p_rv == 0) return p_struct; p_struct = OH_InstituteData_List_Next(p_struct); } return NULL; } /* code headers */ #include "oh_institute_data_fns.c" aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.h0000644000175000017500000001330012364015551027261 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "oh_institute_data.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef OH_INSTITUTE_DATA_H #define OH_INSTITUTE_DATA_H #ifdef __cplusplus extern "C" { #endif /* define OH_INSTITUTE_DATA_FLAGS */ #define OH_INSTITUTE_DATA_FLAGS_OFXFAIL 0x00000001 #define OH_INSTITUTE_DATA_FLAGS_SSLFAIL 0x00000002 /* needed system headers */ #include #include #include #include /* pre-headers */ #include #include typedef struct OH_INSTITUTE_DATA OH_INSTITUTE_DATA; GWEN_LIST_FUNCTION_LIB_DEFS(OH_INSTITUTE_DATA, OH_InstituteData, AQOFXCONNECT_API) GWEN_LIST2_FUNCTION_LIB_DEFS(OH_INSTITUTE_DATA, OH_InstituteData, AQOFXCONNECT_API) /* post-headers */ #include /** Constructor. */ AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_new(void); /** Destructor. */ AQOFXCONNECT_API void OH_InstituteData_free(OH_INSTITUTE_DATA *p_struct); AQOFXCONNECT_API void OH_InstituteData_Attach(OH_INSTITUTE_DATA *p_struct); AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_dup(const OH_INSTITUTE_DATA *p_struct); AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_copy(OH_INSTITUTE_DATA *p_struct, const OH_INSTITUTE_DATA *p_src); /** Getter. * Use this function to get the member "id" */ AQOFXCONNECT_API int OH_InstituteData_GetId(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "flags" */ AQOFXCONNECT_API uint32_t OH_InstituteData_GetFlags(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "name" */ AQOFXCONNECT_API const char *OH_InstituteData_GetName(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "fid" */ AQOFXCONNECT_API const char *OH_InstituteData_GetFid(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "org" */ AQOFXCONNECT_API const char *OH_InstituteData_GetOrg(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "brokerId" */ AQOFXCONNECT_API const char *OH_InstituteData_GetBrokerId(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "url" */ AQOFXCONNECT_API const char *OH_InstituteData_GetUrl(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "lastOfxValidationTime" */ AQOFXCONNECT_API const GWEN_TIME *OH_InstituteData_GetLastOfxValidationTime(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "lastSslValidationTime" */ AQOFXCONNECT_API const GWEN_TIME *OH_InstituteData_GetLastSslValidationTime(const OH_INSTITUTE_DATA *p_struct); /** Getter. * Use this function to get the member "fileName" */ AQOFXCONNECT_API const char *OH_InstituteData_GetFileName(const OH_INSTITUTE_DATA *p_struct); /** Setter. * Use this function to set the member "id" */ AQOFXCONNECT_API void OH_InstituteData_SetId(OH_INSTITUTE_DATA *p_struct, int p_src); /** Setter. * Use this function to set the member "flags" */ AQOFXCONNECT_API void OH_InstituteData_SetFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src); /** Add flags. * Use this function to add flags to the member "flags" */ AQOFXCONNECT_API void OH_InstituteData_AddFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src); /** Sub flags. * Use this function to sub flags from the member "flags" */ AQOFXCONNECT_API void OH_InstituteData_SubFlags(OH_INSTITUTE_DATA *p_struct, uint32_t p_src); /** Setter. * Use this function to set the member "name" */ AQOFXCONNECT_API void OH_InstituteData_SetName(OH_INSTITUTE_DATA *p_struct, const char *p_src); /** Setter. * Use this function to set the member "fid" */ AQOFXCONNECT_API void OH_InstituteData_SetFid(OH_INSTITUTE_DATA *p_struct, const char *p_src); /** Setter. * Use this function to set the member "org" */ AQOFXCONNECT_API void OH_InstituteData_SetOrg(OH_INSTITUTE_DATA *p_struct, const char *p_src); /** Setter. * Use this function to set the member "brokerId" */ AQOFXCONNECT_API void OH_InstituteData_SetBrokerId(OH_INSTITUTE_DATA *p_struct, const char *p_src); /** Setter. * Use this function to set the member "url" */ AQOFXCONNECT_API void OH_InstituteData_SetUrl(OH_INSTITUTE_DATA *p_struct, const char *p_src); /** Setter. * Use this function to set the member "lastOfxValidationTime" */ AQOFXCONNECT_API void OH_InstituteData_SetLastOfxValidationTime(OH_INSTITUTE_DATA *p_struct, const GWEN_TIME *p_src); /** Setter. * Use this function to set the member "lastSslValidationTime" */ AQOFXCONNECT_API void OH_InstituteData_SetLastSslValidationTime(OH_INSTITUTE_DATA *p_struct, const GWEN_TIME *p_src); /** Setter. * Use this function to set the member "fileName" */ AQOFXCONNECT_API void OH_InstituteData_SetFileName(OH_INSTITUTE_DATA *p_struct, const char *p_src); /* list1 functions */ AQOFXCONNECT_API OH_INSTITUTE_DATA_LIST *OH_InstituteData_List_dup(const OH_INSTITUTE_DATA_LIST *p_src); AQOFXCONNECT_API void OH_InstituteData_ReadDb(OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API int OH_InstituteData_WriteDb(const OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_fromDb(GWEN_DB_NODE *p_db); AQOFXCONNECT_API int OH_InstituteData_toDb(const OH_INSTITUTE_DATA *p_struct, GWEN_DB_NODE *p_db); AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_List_GetById(const OH_INSTITUTE_DATA_LIST *p_list, int p_cmp); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.dlg0000644000175000017500000000306012364015477026405 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data_fns.h0000644000175000017500000000135712364015477030147 00000000000000/*************************************************************************** begin : Tue Aug 17 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef OH_INSTITUTE_DATA_FNS_H #define OH_INSTITUTE_DATA_FNS_H #include #include AQOFXCONNECT_API OH_INSTITUTE_DATA *OH_InstituteData_fromXml(GWEN_XMLNODE *node); AQOFXCONNECT_API int OH_InstituteData_ReadXml(OH_INSTITUTE_DATA *oh, GWEN_XMLNODE *node); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.h0000644000175000017500000000175112364015477026073 00000000000000/*************************************************************************** begin : Wed Aug 18 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef OFXHOME_DLG_GETINST_H #define OFXHOME_DLG_GETINST_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif AQOFXCONNECT_API GWEN_DIALOG *OH_GetInstituteDialog_new(const char *dataFolder, const char *name); AQOFXCONNECT_API const OH_INSTITUTE_DATA *OH_GetInstituteDialog_GetSelectedInstitute(GWEN_DIALOG *dlg); /*@}*/ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_newuser.dlg0000644000175000017500000001143612364015477024272 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/aqofxconnect_l.h0000644000175000017500000000145012364015477024433 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQOFXCONNECT_AQOFXCONNECT_L_H #define AQOFXCONNECT_AQOFXCONNECT_L_H #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg #endif /* AQOFXCONNECT_AQOFXCONNECT_L_H */ aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/aqofxconnect-plugin.c0000644000175000017500000000221412364015477025406 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #undef BUILDING_AQOFXCONNECT_DLL #undef BUILDING_DLL #include "provider.h" #include "aqofxconnect_l.h" #include static AB_PROVIDER *AB_Plugin_ProviderOFX_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ return AO_Provider_new(ab); } /* interface to gwens plugin loader */ AQBANKING_EXPORT GWEN_PLUGIN *provider_aqofxconnect_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_Provider_new(pm, name, fileName); AB_Plugin_Provider_SetFactoryFn(pl, AB_Plugin_ProviderOFX_Factory); return pl; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/user.c0000644000175000017500000003146512364015477022412 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "user_p.h" #include #include #include #include #include GWEN_INHERIT(AB_USER, AO_USER); uint32_t AO_User_Flags_fromDb(GWEN_DB_NODE *db, const char *name) { int i; uint32_t f=0; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, name, i, 0); if (!s) break; if (strcasecmp(s, "account_list")==0) f|=AO_USER_FLAGS_ACCOUNT_LIST; else if (strcasecmp(s, "statements")==0) f|=AO_USER_FLAGS_STATEMENTS; else if (strcasecmp(s, "investment")==0) f|=AO_USER_FLAGS_INVESTMENT; else if (strcasecmp(s, "billpay")==0) f|=AO_USER_FLAGS_BILLPAY; else if (strcasecmp(s, "emptyBankId")==0) f|=AO_USER_FLAGS_EMPTY_BANKID; else if (strcasecmp(s, "emptyFid")==0) f|=AO_USER_FLAGS_EMPTY_FID; else if (strcasecmp(s, "forceSsl3")==0) f|=AO_USER_FLAGS_FORCE_SSL3; else if (strcasecmp(s, "sendShortDate")==0) f|=AO_USER_FLAGS_SEND_SHORT_DATE; else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Unknown user flag \"%s\"", s); } } return f; } void AO_User_Flags_toDb(GWEN_DB_NODE *db, const char *name, uint32_t f) { GWEN_DB_DeleteVar(db, name); if (f & AO_USER_FLAGS_ACCOUNT_LIST) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "account_list"); if (f & AO_USER_FLAGS_STATEMENTS) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "statements"); if (f & AO_USER_FLAGS_INVESTMENT) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "investment"); if (f & AO_USER_FLAGS_BILLPAY) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "billpay"); if (f & AO_USER_FLAGS_EMPTY_BANKID) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "emptyBankId"); if (f & AO_USER_FLAGS_EMPTY_FID) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "emptyFid"); if (f & AO_USER_FLAGS_FORCE_SSL3) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "forceSsl3"); if (f & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, name, "sendShortDate"); } void AO_User_Extend(AB_USER *u, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { AO_USER *ue; GWEN_NEW_OBJECT(AO_USER, ue); GWEN_INHERIT_SETDATA(AB_USER, AO_USER, u, ue, AO_User_FreeData); if (em==AB_ProviderExtendMode_Create) { ue->httpVMajor=1; ue->httpVMinor=0; } else { AO_User_ReadDb(u, db); } } else if (em==AB_ProviderExtendMode_Reload) { /* just reload user */ AO_User_ReadDb(u, db); } else { AO_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); if (em==AB_ProviderExtendMode_Save) { AO_User_Flags_toDb(db, "flags", ue->flags); if (ue->bankName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankName", ue->bankName); if (ue->brokerId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "brokerId", ue->brokerId); if (ue->org) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "org", ue->org); if (ue->fid) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "fid", ue->fid); if (ue->serverAddr) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "serverAddr", ue->serverAddr); if (ue->appId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "appId", ue->appId); if (ue->appVer) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "appVer", ue->appVer); if (ue->headerVer) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "headerVer", ue->headerVer); if (ue->clientUid) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "clientUid", ue->clientUid); if (ue->securityType) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "securityType", ue->securityType); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMajor", ue->httpVMajor); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpVMinor", ue->httpVMinor); if (ue->httpUserAgent) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "httpUserAgent", ue->httpUserAgent); } } } void GWENHYWFAR_CB AO_User_FreeData(void *bp, void *p) { AO_USER *ue; ue=(AO_USER*)p; free(ue->bankName); free(ue->brokerId); free(ue->org); free(ue->fid); free(ue->serverAddr); free(ue->appId); free(ue->appVer); free(ue->headerVer); free(ue->clientUid); free(ue->securityType); GWEN_FREE_OBJECT(ue); } void AO_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db) { AO_USER *ue; const char *s; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->flags=AO_User_Flags_fromDb(db, "flags"); free(ue->bankName); s=GWEN_DB_GetCharValue(db, "bankName", 0, NULL); if (s) ue->bankName=strdup(s); else ue->bankName=NULL; free(ue->brokerId); s=GWEN_DB_GetCharValue(db, "brokerId", 0, NULL); if (s) ue->brokerId=strdup(s); else ue->brokerId=NULL; free(ue->org); s=GWEN_DB_GetCharValue(db, "org", 0, NULL); if (s) ue->org=strdup(s); else ue->org=NULL; free(ue->fid); s=GWEN_DB_GetCharValue(db, "fid", 0, NULL); if (s) ue->fid=strdup(s); else ue->fid=NULL; free(ue->serverAddr); s=GWEN_DB_GetCharValue(db, "serverAddr", 0, NULL); if (s) ue->serverAddr=strdup(s); else ue->serverAddr=NULL; free(ue->appId); s=GWEN_DB_GetCharValue(db, "appId", 0, NULL); if (s) ue->appId=strdup(s); else ue->appId=NULL; free(ue->appVer); s=GWEN_DB_GetCharValue(db, "appVer", 0, NULL); if (s) ue->appVer=strdup(s); else ue->appVer=NULL; free(ue->headerVer); s=GWEN_DB_GetCharValue(db, "headerVer", 0, NULL); if (s) ue->headerVer=strdup(s); else ue->headerVer=NULL; free(ue->clientUid); s=GWEN_DB_GetCharValue(db, "clientUid", 0, NULL); if (s) ue->clientUid=strdup(s); else ue->clientUid=NULL; free(ue->securityType); s=GWEN_DB_GetCharValue(db, "securityType", 0, NULL); if (s) ue->securityType=strdup(s); else ue->securityType=NULL; ue->httpVMajor=GWEN_DB_GetIntValue(db, "httpVMajor", 0, -1); ue->httpVMinor=GWEN_DB_GetIntValue(db, "httpVMinor", 0, -1); if (ue->httpVMajor==-1 || ue->httpVMinor==-1) { ue->httpVMajor=1; ue->httpVMinor=0; } free(ue->httpUserAgent); s=GWEN_DB_GetCharValue(db, "httpUserAgent", 0, NULL); if (s) ue->httpUserAgent=strdup(s); else ue->httpUserAgent=NULL; } const char *AO_User_GetBankName(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->bankName; } void AO_User_SetBankName(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->bankName); if (s) ue->bankName=strdup(s); else ue->bankName=NULL; } const char *AO_User_GetBrokerId(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->brokerId; } void AO_User_SetBrokerId(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->brokerId); if (s) ue->brokerId=strdup(s); else ue->brokerId=NULL; } const char *AO_User_GetOrg(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->org; } void AO_User_SetOrg(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->org); if (s) ue->org=strdup(s); else ue->org=NULL; } const char *AO_User_GetFid(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->fid; } void AO_User_SetFid(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->fid); if (s) ue->fid=strdup(s); else ue->fid=NULL; } const char *AO_User_GetServerAddr(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->serverAddr; } void AO_User_SetServerAddr(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->serverAddr); if (s) ue->serverAddr=strdup(s); else ue->serverAddr=NULL; } uint32_t AO_User_GetFlags(const AB_USER *u) { AO_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->flags; } void AO_User_SetFlags(AB_USER *u, uint32_t f) { AO_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->flags=f; } void AO_User_AddFlags(AB_USER *u, uint32_t f) { AO_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->flags|=f; } void AO_User_SubFlags(AB_USER *u, uint32_t f) { AO_USER *ue; ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->flags&=~f; } const char *AO_User_GetAppId(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->appId; } void AO_User_SetAppId(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->appId); if (s) ue->appId=strdup(s); else ue->appId=NULL; } const char *AO_User_GetAppVer(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->appVer; } void AO_User_SetAppVer(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->appVer); if (s) ue->appVer=strdup(s); else ue->appVer=NULL; } const char *AO_User_GetHeaderVer(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->headerVer; } void AO_User_SetHeaderVer(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->headerVer); if (s) ue->headerVer=strdup(s); else ue->headerVer=NULL; } const char *AO_User_GetClientUid(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->clientUid; } void AO_User_SetClientUid(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->clientUid); if (s) ue->clientUid=strdup(s); else ue->clientUid=NULL; } const char *AO_User_GetSecurityType(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->securityType; } void AO_User_SetSecurityType(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->securityType); if (s) ue->securityType=strdup(s); else ue->securityType=NULL; } int AO_User_GetHttpVMajor(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->httpVMajor; } void AO_User_SetHttpVMajor(AB_USER *u, int i) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->httpVMajor=i; } int AO_User_GetHttpVMinor(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->httpVMinor; } void AO_User_SetHttpVMinor(AB_USER *u, int i) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); ue->httpVMinor=i; } const char *AO_User_GetHttpUserAgent(const AB_USER *u) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); return ue->httpUserAgent; } void AO_User_SetHttpUserAgent(AB_USER *u, const char *s) { AO_USER *ue; assert(u); ue=GWEN_INHERIT_GETDATA(AB_USER, AO_USER, u); assert(ue); free(ue->httpUserAgent); if (s) ue->httpUserAgent=strdup(s); else ue->httpUserAgent=NULL; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c0000644000175000017500000011710612364015477023747 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newuser_p.h" #include "dlg_ofx_special_l.h" #include "libofxhome/dlg_getinst.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_BANK 1 #define PAGE_USER 2 #define PAGE_APP 3 #define PAGE_CREATE 4 #define PAGE_END 5 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AO_NEWUSER_DIALOG) GWEN_DIALOG *AO_NewUserDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AO_NEWUSER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ao_newuser"); GWEN_NEW_OBJECT(AO_NEWUSER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg, xdlg, AO_NewUserDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AO_NewUserDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqofxconnect/dialogs/dlg_newuser.dlg", fbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->httpVMajor=1; xdlg->httpVMinor=1; /* done */ return dlg; } void GWENHYWFAR_CB AO_NewUserDialog_FreeData(void *bp, void *p) { AO_NEWUSER_DIALOG *xdlg; xdlg=(AO_NEWUSER_DIALOG*) p; free(xdlg->userName); free(xdlg->userId); free(xdlg->url); free(xdlg->brokerId); free(xdlg->org); free(xdlg->fid); free(xdlg->appId); free(xdlg->appVer); free(xdlg->headerVer); free(xdlg->clientUid); free(xdlg->securityType); GWEN_FREE_OBJECT(xdlg); } AB_USER *AO_NewUserDialog_GetUser(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *AO_NewUserDialog_GetBankName(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AO_NewUserDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AO_NewUserDialog_GetUserName(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AO_NewUserDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AO_NewUserDialog_GetUserId(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AO_NewUserDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AO_NewUserDialog_GetFid(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->fid; } void AO_NewUserDialog_SetFid(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->fid); if (s) xdlg->fid=strdup(s); else xdlg->fid=NULL; } const char *AO_NewUserDialog_GetOrg(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->org; } void AO_NewUserDialog_SetOrg(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->org); if (s) xdlg->org=strdup(s); else xdlg->org=NULL; } const char *AO_NewUserDialog_GetAppId(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->appId; } void AO_NewUserDialog_SetAppId(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->appId); if (s) xdlg->appId=strdup(s); else xdlg->appId=NULL; } const char *AO_NewUserDialog_GetAppVer(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->appVer; } void AO_NewUserDialog_SetAppVer(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->appVer); if (s) xdlg->appVer=strdup(s); else xdlg->appVer=NULL; } const char *AO_NewUserDialog_GetHeaderVer(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->headerVer; } void AO_NewUserDialog_SetHeaderVer(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->headerVer); if (s) xdlg->headerVer=strdup(s); else xdlg->headerVer=NULL; } const char *AO_NewUserDialog_GetBrokerId(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->brokerId; } void AO_NewUserDialog_SetBrokerId(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->brokerId); if (s) xdlg->brokerId=strdup(s); else xdlg->brokerId=NULL; } const char *AO_NewUserDialog_GetUrl(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AO_NewUserDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } const char *AO_NewUserDialog_GetClientUid(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->clientUid; } void AO_NewUserDialog_SetClientUid(GWEN_DIALOG *dlg, const char *s) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); free(xdlg->clientUid); if (s) xdlg->clientUid=strdup(s); else xdlg->clientUid=NULL; } int AO_NewUserDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int AO_NewUserDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void AO_NewUserDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } uint32_t AO_NewUserDialog_GetFlags(const GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AO_NewUserDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AO_NewUserDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_NewUserDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_NewUserDialog_Init(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_PROVIDER *pro; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); } dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("OFX DirectConnect Setup Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("" "

This dialog assists you in setting up an OFX DirectConnect User.

" "" "This dialog assists you in setting up an OFX DirectConnect User."), 0); /* setup bank page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_bank_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please enter your bank settings below.

" "

Click the Select button to choose from a list of " "known banks. That will connect to www.ofxhome.com and " "try to retrieve information about your bank.

" "

If you had to manually enter this information because your " "bank was unknown to www.ofxhome.com you are kindly " "asked to submit your bank server information there to help " "the next user.

" "" "Click the SELECT button to choose from a list of\n" "known banks. That will connect to \"www.ofxhome.com\" and\n" "try to retrieve information about your bank.\n" "If you had to manually enter this information because your\n" "bank was unknown to \"www.ofxhome.com\" you are kindly\n" "asked to submit your bank server information there to help\n" "the next user."), 0); /* setup user page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_user_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please enter your user settings below.

" "

User Name is your real name, User Id is " "assigned to you by the bank after applying for OFX DirectConnect " "and Client UID is used by some banks only. If you do not have such " "a value in your documents from the bank just leave it blank.

" "" "Please enter your user settings below.\n" "\"User Name\" is your real name, \"User Id\" is\n" "assigned to you by the bank after applying for OFX DirectConnect\n" "and \"Client UID\" is used by some banks. If you do not have such\n" "a value in your documents from the bank just leave it blank."), 0); /* setup application page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_app_label", GWEN_DialogProperty_Title, 0, I18N("" "

Please choose the application you want AqBanking to emulate. " "Not all banks support all applications and versions, you might have " "to try multiple settings.

" "" "Please choose the application you want AqBanking to emulate.\n" "Not all banks support all applications and versions, you might have\n" "to try multiple settings."), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_AddValue, 0, I18N("-- select --"), 0); if (pro) { const AO_APPINFO *ai; ai=AO_Provider_GetAppInfos(pro); if (ai) { const AO_APPINFO *first; first=ai; while(ai->appName) { GWEN_Dialog_SetCharProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_AddValue, 0, I18N(ai->appName), 0); ai++; } if (first->appName) { GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, 1, 0); if (first->appId) GWEN_Dialog_SetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, first->appId, 0); if (first->appVer) GWEN_Dialog_SetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, first->appVer, 0); } } } GWEN_Dialog_SetCharProperty(dlg, "wiz_headerver_edit", GWEN_DialogProperty_Value, 0, "102", 0); /* setup creation page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_create_label", GWEN_DialogProperty_Title, 0, I18N("" "

We are now ready to create the user.

" "

Click the next button to proceed or abort to abort.

" "" "We are now ready to create the user.\n" "Click the NEXT button to proceed or ABORT to abort."), 0); /* setup extro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("" "

The user has been successfully setup.

" "

You can now try to retrieve the list of accounts the " "bank allows you to manage via OFX DirectConnect.

" "

Please note that not every banks supports this. If your " "bank does not support account list download you will have to " "add the account manually.

" "" "The user has been successfully setup.\n" "You can now try to retrieve the list of accounts the\n" "bank allows you to manage via OFX DirectConnect.\n" "Please note that not every banks supports this. If your\n" "bank does not support account list download you will have to\n" "add the account manually." ), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AO_NewUserDialog_Fini(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AO_NewUserDialog_GetBankPageData(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetBankName(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing bank name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_brokerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetBrokerId(dlg, s); else AO_NewUserDialog_SetBrokerId(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetFid(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing FID"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetOrg(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing ORG"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetUrl(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing URL"); return GWEN_ERROR_NO_DATA; } return 0; } int AO_NewUserDialog_GetUserPageData(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetUserName(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing user name"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetUserId(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_clientuid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetClientUid(dlg, s); else AO_NewUserDialog_SetClientUid(dlg, NULL); return 0; } int AO_NewUserDialog_GetAppPageData(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetAppId(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application id"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetAppVer(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application version"); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_headerver_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_NewUserDialog_SetHeaderVer(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application version"); return GWEN_ERROR_NO_DATA; } return 0; } int AO_NewUserDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AO_NEWUSER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BANK: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AO_NewUserDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_USER: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AO_NewUserDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_APP: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AO_NewUserDialog_GetAppPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_CREATE: if (!forwards) { AO_NewUserDialog_UndoIt(dlg); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); } GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finish"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); #if 0 GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_abort_button", GWEN_DialogProperty_Enabled, 0, 0, 0); #endif return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_DoIt(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_USER *u; int rv; uint32_t pid; AB_PROVIDER *pro; DBG_ERROR(0, "Doit"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } DBG_ERROR(0, "Creating user"); u=AB_Banking_CreateUser(xdlg->banking, "aqofxconnect"); if (u==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not create user, maybe backend missing?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "us"); AO_User_SetBankName(u, xdlg->bankName); AB_User_SetBankCode(u, "0000000000"); AO_User_SetFlags(u, xdlg->flags); AO_User_SetBrokerId(u, xdlg->brokerId); AO_User_SetOrg(u, xdlg->org); AO_User_SetFid(u, xdlg->fid); AO_User_SetAppId(u, xdlg->appId); AO_User_SetAppVer(u, xdlg->appVer); AO_User_SetHeaderVer(u, xdlg->headerVer); AO_User_SetClientUid(u, xdlg->clientUid); AO_User_SetSecurityType(u, xdlg->securityType); AO_User_SetServerAddr(u, xdlg->url); AO_User_SetHttpVMajor(u, xdlg->httpVMajor); AO_User_SetHttpVMinor(u, xdlg->httpVMinor); DBG_ERROR(0, "Adding user"); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up OFX DirectConnect User"), I18N("The user will be created and the certificate retrieved."), 1, 0); /* lock new user */ DBG_ERROR(0, "Locking user"); rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users")); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving SSL certificate")); rv=AO_Provider_GetCert(pro, u); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ DBG_ERROR(0, "Unlocking user"); rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not unlock user [%s] (%d)", AB_User_GetUserId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AO_NewUserDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_UndoIt(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_USER *u; DBG_ERROR(0, "UndoIt"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); u=xdlg->user; if (u) { AB_ACCOUNT *a; /* delete all accounts created for this user */ while ( (a=AB_Banking_FindFirstAccountOfUser(xdlg->banking, u)) ) { AB_Banking_DeleteAccount(xdlg->banking, a); } /* delete the user itself */ AB_Banking_DeleteUser(xdlg->banking, u); xdlg->user=NULL; } return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_Next(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page==PAGE_CREATE) { return AO_NewUserDialog_DoIt(dlg); } else if (pagePAGE_BEGIN) { page--; return AO_NewUserDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); dlg2=AO_OfxSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } AO_OfxSpecialDialog_SetHttpVersion(dlg2, xdlg->httpVMajor, xdlg->httpVMinor); AO_OfxSpecialDialog_SetFlags(dlg2, xdlg->flags); AO_OfxSpecialDialog_SetClientUid(dlg2, xdlg->clientUid); AO_OfxSpecialDialog_SetSecurityType(dlg2, xdlg->securityType); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Rejected"); GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const char *s; DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Accepted"); xdlg->httpVMajor=AO_OfxSpecialDialog_GetHttpVMajor(dlg2); xdlg->httpVMinor=AO_OfxSpecialDialog_GetHttpVMinor(dlg2); xdlg->flags=AO_OfxSpecialDialog_GetFlags(dlg2); s=AO_OfxSpecialDialog_GetClientUid(dlg2); free(xdlg->clientUid); if (s) xdlg->clientUid=strdup(s); else xdlg->clientUid=NULL; s=AO_OfxSpecialDialog_GetSecurityType(dlg2); free(xdlg->securityType); if (s) xdlg->securityType=strdup(s); else xdlg->securityType=NULL; } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_HandleActivatedBankSelect(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; int rv; GWEN_DIALOG *dlg2; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); /* get data dir */ tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=AB_Banking_GetProviderUserDataDir(xdlg->banking, "aqofxconnect", tbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, GWEN_DIR_SEPARATOR_S "ofxhome"); /* possibly create data folder */ rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(tbuf), GWEN_PATH_FLAGS_CHECKROOT); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } dlg2=OH_GetInstituteDialog_new(GWEN_Buffer_GetStart(tbuf), NULL); GWEN_Buffer_free(tbuf); if (dlg2==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv<=0){ DBG_DEBUG(AQOFXCONNECT_LOGDOMAIN, "Dialog: rejected (%d)", rv); return GWEN_DialogEvent_ResultHandled; } else { const OH_INSTITUTE_DATA *od; DBG_DEBUG(AQOFXCONNECT_LOGDOMAIN, "Dialog: rejected (%d)", rv); od=OH_GetInstituteDialog_GetSelectedInstitute(dlg2); if (od) { const char *s; s=OH_InstituteData_GetName(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetFid(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetOrg(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetUrl(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, s, 0); rv=AO_NewUserDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_HandleActivatedApp(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_PROVIDER *pro; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); return GWEN_DialogEvent_ResultHandled; } else { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, -1); if (idx>0) { const AO_APPINFO *ai; ai=AO_Provider_GetAppInfos(pro); if (ai) { while(ai->appName && --idx) { ai++; } if (ai->appName) { if (ai->appId) GWEN_Dialog_SetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, ai->appId, 0); if (ai->appVer) GWEN_Dialog_SetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, ai->appVer, 0); } } } } return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_PROVIDER *pro; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); return GWEN_DialogEvent_ResultHandled; } else { int rv; rv=AO_Provider_RequestAccounts(pro, xdlg->user, 1); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here"); } } return GWEN_DialogEvent_ResultHandled; } int AO_NewUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_ERROR(0, "Activated: %s", sender); if (strcasecmp(sender, "wiz_prev_button")==0) return AO_NewUserDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AO_NewUserDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) { AO_NewUserDialog_UndoIt(dlg); return GWEN_DialogEvent_ResultReject; } else if (strcasecmp(sender, "wiz_bank_button")==0) return AO_NewUserDialog_HandleActivatedBankSelect(dlg); else if (strcasecmp(sender, "wiz_app_combo")==0) return AO_NewUserDialog_HandleActivatedApp(dlg); else if (strcasecmp(sender, "wiz_special_button")==0) return AO_NewUserDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_getaccounts_button")==0) return AO_NewUserDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int AO_NewUserDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_brokerid_edit")==0 || strcasecmp(sender, "wiz_fid_edit")==0 || strcasecmp(sender, "wiz_org_edit")==0 || strcasecmp(sender, "wiz_appid_edit")==0 || strcasecmp(sender, "wiz_appver_edit")==0 || strcasecmp(sender, "wiz_headerver_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AO_NewUserDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AO_NewUserDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_APP) { rv=AO_NewUserDialog_GetAppPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AO_NewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AO_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AO_NewUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AO_NewUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AO_NewUserDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AO_NewUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/user_p.h0000644000175000017500000000166112364015477022731 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_USER_P_H #define AO_USER_P_H #include typedef struct AO_USER AO_USER; struct AO_USER { uint32_t flags; char *bankName; char *brokerId; char *org; char *fid; char *serverAddr; char *appId; char *appVer; char *headerVer; char *clientUid; char *securityType; int httpVMajor; int httpVMinor; char *httpUserAgent; }; static void GWENHYWFAR_CB AO_User_FreeData(void *bp, void *p); static void AO_User_ReadDb(AB_USER *u, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/network.c0000644000175000017500000001203112364015477023111 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #include #include int AO_Provider_CreateConnection(AB_PROVIDER *pro, AB_USER *u, GWEN_HTTP_SESSION **pSess) { int rv; GWEN_HTTP_SESSION *sess; uint32_t flags; const char *addr; const char *s; /* take bank addr from user */ addr=AO_User_GetServerAddr(u); if (!(addr && *addr)) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "User has no valid address settings"); return GWEN_ERROR_INVALID; } sess=AB_HttpSession_new(pro, u, addr, "https", 443); /* setup session */ flags=AO_User_GetFlags(u); if (flags & AO_USER_FLAGS_FORCE_SSL3) GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_FORCE_SSL3); GWEN_HttpSession_AddFlags(sess, GWEN_HTTP_SESSION_FLAGS_NO_CACHE); GWEN_HttpSession_SetHttpContentType(sess, "application/x-ofx"); GWEN_HttpSession_SetHttpVMajor(sess, AO_User_GetHttpVMajor(u)); GWEN_HttpSession_SetHttpVMinor(sess, AO_User_GetHttpVMinor(u)); s=AO_User_GetHttpUserAgent(u); GWEN_HttpSession_SetHttpUserAgent(sess, (s && *s)?s:"AqBanking"); /* init session */ rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_free(sess); return rv; } *pSess=sess; return 0; } int AO_Provider_SendAndReceive(AB_PROVIDER *pro, AB_USER *u, const uint8_t *p, unsigned int plen, GWEN_BUFFER **pRbuf) { AO_PROVIDER *dp; GWEN_HTTP_SESSION *sess=NULL; GWEN_BUFFER *rbuf; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); if (getenv("AQOFX_LOG_COMM")) { FILE *f; DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Saving response in \"/tmp/ofx.log\" ..."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, I18N("Saving communication log to /tmp/ofx.log")); f=fopen("/tmp/ofx.log", "a+"); if (!f) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fopen: %s", strerror(errno)); } else { fprintf(f, "\n\nSending:\n"); fprintf(f, "-------------------------------------\n"); if (fwrite(p, plen, 1, f)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } /* setup connection */ rv=AO_Provider_CreateConnection(pro, u, &sess); if (rv) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not create connection"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not create connection (%d)"), rv); return rv; } /* send request */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Sending request...")); rv=GWEN_HttpSession_SendPacket(sess, "POST", p, plen); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } /* wait for response */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Waiting for response...")); rbuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=GWEN_HttpSession_RecvPacket(sess, rbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Error receiving packet (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Network error while waiting for response")); GWEN_Buffer_free(rbuf); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } else if (!(rv>=200 && rv<=299)) { /* not a HTTP: ok code */ DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(rbuf); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } /* disconnect (ignore result) */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); /* found a response, transform it */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Parsing response...")); *pRbuf=rbuf; if (getenv("AQOFX_LOG_COMM")) { FILE *f; DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Saving response in \"/tmp/ofx.log\" ..."); f=fopen("/tmp/ofx.log", "a+"); if (!f) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fopen: %s", strerror(errno)); } else { fprintf(f, "\n\nReceived:\n"); fprintf(f, "-------------------------------------\n"); if (fwrite(GWEN_Buffer_GetStart(rbuf), GWEN_Buffer_GetUsedBytes(rbuf), 1, f)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c0000644000175000017500000010076112364015477024102 00000000000000/*************************************************************************** begin : Tue Aug 24 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituser_p.h" #include "dlg_ofx_special_l.h" #include "libofxhome/dlg_getinst.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_BANK 1 #define PAGE_USER 2 #define PAGE_APP 3 #define PAGE_CREATE 4 #define PAGE_END 5 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AO_EDITUSER_DIALOG) GWEN_DIALOG *AO_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; AO_EDITUSER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ao_newuser"); GWEN_NEW_OBJECT(AO_EDITUSER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg, xdlg, AO_EditUserDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AO_EditUserDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/backends/aqofxconnect/dialogs/dlg_edituser.dlg", fbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* preset */ xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AO_EditUserDialog_FreeData(void *bp, void *p) { AO_EDITUSER_DIALOG *xdlg; xdlg=(AO_EDITUSER_DIALOG*) p; free(xdlg->userName); free(xdlg->userId); free(xdlg->url); free(xdlg->brokerId); free(xdlg->org); free(xdlg->fid); free(xdlg->appId); free(xdlg->appVer); free(xdlg->headerVer); free(xdlg->clientUid); free(xdlg->securityType); GWEN_FREE_OBJECT(xdlg); } AB_USER *AO_EditUserDialog_GetUser(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->user; } const char *AO_EditUserDialog_GetBankName(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->bankName; } void AO_EditUserDialog_SetBankName(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->bankName); if (s) xdlg->bankName=strdup(s); else xdlg->bankName=NULL; } const char *AO_EditUserDialog_GetUserName(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->userName; } void AO_EditUserDialog_SetUserName(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->userName); if (s) xdlg->userName=strdup(s); else xdlg->userName=NULL; } const char *AO_EditUserDialog_GetUserId(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->userId; } void AO_EditUserDialog_SetUserId(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->userId); if (s) xdlg->userId=strdup(s); else xdlg->userId=NULL; } const char *AO_EditUserDialog_GetFid(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->fid; } void AO_EditUserDialog_SetFid(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->fid); if (s) xdlg->fid=strdup(s); else xdlg->fid=NULL; } const char *AO_EditUserDialog_GetOrg(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->org; } void AO_EditUserDialog_SetOrg(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->org); if (s) xdlg->org=strdup(s); else xdlg->org=NULL; } const char *AO_EditUserDialog_GetAppId(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->appId; } void AO_EditUserDialog_SetAppId(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->appId); if (s) xdlg->appId=strdup(s); else xdlg->appId=NULL; } const char *AO_EditUserDialog_GetAppVer(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->appVer; } void AO_EditUserDialog_SetAppVer(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->appVer); if (s) xdlg->appVer=strdup(s); else xdlg->appVer=NULL; } const char *AO_EditUserDialog_GetHeaderVer(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->headerVer; } void AO_EditUserDialog_SetHeaderVer(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->headerVer); if (s) xdlg->headerVer=strdup(s); else xdlg->headerVer=NULL; } const char *AO_EditUserDialog_GetBrokerId(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->brokerId; } void AO_EditUserDialog_SetBrokerId(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->brokerId); if (s) xdlg->brokerId=strdup(s); else xdlg->brokerId=NULL; } const char *AO_EditUserDialog_GetUrl(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->url; } void AO_EditUserDialog_SetUrl(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->url); if (s) xdlg->url=strdup(s); else xdlg->url=NULL; } const char *AO_EditUserDialog_GetClientUid(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->clientUid; } void AO_EditUserDialog_SetClientUid(GWEN_DIALOG *dlg, const char *s) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); free(xdlg->clientUid); if (s) xdlg->clientUid=strdup(s); else xdlg->clientUid=NULL; } int AO_EditUserDialog_GetHttpVMajor(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->httpVMajor; } int AO_EditUserDialog_GetHttpVMinor(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->httpVMinor; } void AO_EditUserDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); xdlg->httpVMajor=vmajor; xdlg->httpVMinor=vminor; } uint32_t AO_EditUserDialog_GetFlags(const GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); return xdlg->flags; } void AO_EditUserDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); xdlg->flags=fl; } void AO_EditUserDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_EditUserDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); xdlg->flags&=~fl; } void AO_EditUserDialog_Init(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; AB_PROVIDER *pro; GWEN_DB_NODE *dbPrefs; const char *s; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); } dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("OFX DirectConnect User Setup"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_AddValue, 0, I18N("-- select --"), 0); if (pro) { const AO_APPINFO *ai; ai=AO_Provider_GetAppInfos(pro); if (ai) { const AO_APPINFO *first; first=ai; while(ai->appName) { GWEN_Dialog_SetCharProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_AddValue, 0, I18N(ai->appName), 0); ai++; } if (first->appName) { GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, 1, 0); if (first->appId) GWEN_Dialog_SetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, first->appId, 0); if (first->appVer) GWEN_Dialog_SetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, first->appVer, 0); } } } s=AB_User_GetUserName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetUserId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetClientUid(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_clientuid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetBankName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetBrokerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_brokerid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetFid(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetOrg(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetServerAddr(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, s, 0); s=AO_User_GetAppId(xdlg->user); if (s && *s) { GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, s, 0); } s=AO_User_GetAppVer(xdlg->user); if (s && *s) { GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, s, 0); } s=AO_User_GetHeaderVer(xdlg->user); if (!(s && *s)) s="102"; GWEN_Dialog_SetCharProperty(dlg, "wiz_headerver_edit", GWEN_DialogProperty_Value, 0, s, 0); xdlg->flags=AO_User_GetFlags(xdlg->user); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } void AO_EditUserDialog_Fini(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AO_EditUserDialog_GetBankPageData(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetBankName(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing bank name"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter the name of your bank.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_brokerid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetBrokerId(dlg, s); else AO_EditUserDialog_SetBrokerId(dlg, NULL); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetFid(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing FID"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter a valid FID code.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetOrg(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing ORG"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter a valid ORG code.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetUrl(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing URL"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 1, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter a server address.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } return 0; } int AO_EditUserDialog_GetUserPageData(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetUserName(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing user name"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter your name.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_username_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetUserId(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing user id"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 0, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter your User ID.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_userid_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_clientuid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetClientUid(dlg, s); else AO_EditUserDialog_SetClientUid(dlg, NULL); return 0; } int AO_EditUserDialog_GetAppPageData(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetAppId(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application id"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 2, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please select a valid application to emulate.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetAppVer(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application version"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 2, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please select a valid application to emulate.")); GWEN_Dialog_SetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } s=GWEN_Dialog_GetCharProperty(dlg, "wiz_headerver_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) AO_EditUserDialog_SetHeaderVer(dlg, s); else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Missing application version"); /* switch to correct page, show error message, set focus */ GWEN_Dialog_SetIntProperty(dlg, "wiz_tab_book", GWEN_DialogProperty_Value, 0, 2, 0); GWEN_Gui_ShowError(I18N("Missing Input"), I18N("Please enter a correct header version (default is 102).")); GWEN_Dialog_SetIntProperty(dlg, "wiz_headerver_edit", GWEN_DialogProperty_Focus, 0, 1, 0); return GWEN_ERROR_NO_DATA; } return 0; } int AO_EditUserDialog_FromGui(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); rv=AO_EditUserDialog_GetBankPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_ERROR_BAD_DATA; } rv=AO_EditUserDialog_GetUserPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_ERROR_BAD_DATA; } rv=AO_EditUserDialog_GetAppPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_ERROR_BAD_DATA; } /* lock new user */ if (xdlg->doLock) { DBG_ERROR(0, "Locking user"); rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not lock user (%d)", rv); return rv; } } /* generic setup */ AB_User_SetUserName(xdlg->user, xdlg->userName); AB_User_SetUserId(xdlg->user, xdlg->userId); AB_User_SetCustomerId(xdlg->user, xdlg->userId); AB_User_SetCountry(xdlg->user, "us"); AB_User_SetBankCode(xdlg->user, "0000000000"); AO_User_SetFlags(xdlg->user, xdlg->flags); AO_User_SetBankName(xdlg->user, xdlg->bankName); AO_User_SetBrokerId(xdlg->user, xdlg->brokerId); AO_User_SetOrg(xdlg->user, xdlg->org); AO_User_SetFid(xdlg->user, xdlg->fid); AO_User_SetAppId(xdlg->user, xdlg->appId); AO_User_SetAppVer(xdlg->user, xdlg->appVer); AO_User_SetHeaderVer(xdlg->user, xdlg->headerVer); AO_User_SetClientUid(xdlg->user, xdlg->clientUid); AO_User_SetSecurityType(xdlg->user, xdlg->securityType); AO_User_SetServerAddr(xdlg->user, xdlg->url); AO_User_SetHttpVMajor(xdlg->user, xdlg->httpVMajor); AO_User_SetHttpVMinor(xdlg->user, xdlg->httpVMinor); if (xdlg->doLock) { /* unlock user */ DBG_ERROR(0, "Unlocking user"); rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not unlock user [%s] (%d)", AB_User_GetUserId(xdlg->user), rv); AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 1); return rv; } } return 0; } int AO_EditUserDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); dlg2=AO_OfxSpecialDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } AO_OfxSpecialDialog_SetHttpVersion(dlg2, xdlg->httpVMajor, xdlg->httpVMinor); AO_OfxSpecialDialog_SetFlags(dlg2, xdlg->flags); AO_OfxSpecialDialog_SetClientUid(dlg2, xdlg->clientUid); AO_OfxSpecialDialog_SetSecurityType(dlg2, xdlg->securityType); rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Rejected"); GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const char *s; DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Accepted"); xdlg->httpVMajor=AO_OfxSpecialDialog_GetHttpVMajor(dlg2); xdlg->httpVMinor=AO_OfxSpecialDialog_GetHttpVMinor(dlg2); xdlg->flags=AO_OfxSpecialDialog_GetFlags(dlg2); s=AO_OfxSpecialDialog_GetClientUid(dlg2); free(xdlg->clientUid); if (s) xdlg->clientUid=strdup(s); else xdlg->clientUid=NULL; s=AO_OfxSpecialDialog_GetSecurityType(dlg2); free(xdlg->securityType); if (s) xdlg->securityType=strdup(s); else xdlg->securityType=NULL; } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AO_EditUserDialog_HandleActivatedBankSelect(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; int rv; GWEN_DIALOG *dlg2; GWEN_BUFFER *tbuf; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); /* get data dir */ tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=AB_Banking_GetProviderUserDataDir(xdlg->banking, "aqofxconnect", tbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } GWEN_Buffer_AppendString(tbuf, GWEN_DIR_SEPARATOR_S "ofxhome"); /* possibly create data folder */ rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(tbuf), GWEN_PATH_FLAGS_CHECKROOT); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return GWEN_DialogEvent_ResultHandled; } dlg2=OH_GetInstituteDialog_new(GWEN_Buffer_GetStart(tbuf), NULL); GWEN_Buffer_free(tbuf); if (dlg2==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv<=0){ DBG_DEBUG(AQOFXCONNECT_LOGDOMAIN, "Dialog: rejected (%d)", rv); return GWEN_DialogEvent_ResultHandled; } else { const OH_INSTITUTE_DATA *od; DBG_DEBUG(AQOFXCONNECT_LOGDOMAIN, "Dialog: rejected (%d)", rv); od=OH_GetInstituteDialog_GetSelectedInstitute(dlg2); if (od) { const char *s; s=OH_InstituteData_GetName(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_bankname_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetFid(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_fid_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetOrg(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_org_edit", GWEN_DialogProperty_Value, 0, s, 0); s=OH_InstituteData_GetUrl(od); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "wiz_url_edit", GWEN_DialogProperty_Value, 0, s, 0); rv=AO_EditUserDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AO_EditUserDialog_HandleActivatedApp(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; AB_PROVIDER *pro; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); return GWEN_DialogEvent_ResultHandled; } else { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "wiz_app_combo", GWEN_DialogProperty_Value, 0, -1); if (idx>0) { const AO_APPINFO *ai; ai=AO_Provider_GetAppInfos(pro); if (ai) { while(ai->appName && --idx) { ai++; } if (ai->appName) { if (ai->appId) GWEN_Dialog_SetCharProperty(dlg, "wiz_appid_edit", GWEN_DialogProperty_Value, 0, ai->appId, 0); if (ai->appVer) GWEN_Dialog_SetCharProperty(dlg, "wiz_appver_edit", GWEN_DialogProperty_Value, 0, ai->appVer, 0); } } } } return GWEN_DialogEvent_ResultHandled; } int AO_EditUserDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg) { AO_EDITUSER_DIALOG *xdlg; AB_PROVIDER *pro; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqofxconnect"); if (pro==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); return GWEN_DialogEvent_ResultHandled; } else { int rv; rv=AO_Provider_RequestAccounts(pro, xdlg->user, 1); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here"); } } return GWEN_DialogEvent_ResultHandled; } int AO_EditUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_ERROR(0, "Activated: %s", sender); if (strcasecmp(sender, "abortButton")==0) { return GWEN_DialogEvent_ResultReject; } else if (strcasecmp(sender, "okButton")==0) { int rv; rv=AO_EditUserDialog_GetBankPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } rv=AO_EditUserDialog_GetUserPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } rv=AO_EditUserDialog_GetAppPageData(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } rv=AO_EditUserDialog_FromGui(dlg); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultAccept; } else if (strcasecmp(sender, "wiz_bank_button")==0) return AO_EditUserDialog_HandleActivatedBankSelect(dlg); else if (strcasecmp(sender, "wiz_app_combo")==0) return AO_EditUserDialog_HandleActivatedApp(dlg); else if (strcasecmp(sender, "wiz_special_button")==0) return AO_EditUserDialog_HandleActivatedSpecial(dlg); else if (strcasecmp(sender, "wiz_getaccounts_button")==0) return AO_EditUserDialog_HandleActivatedGetAccounts(dlg); else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int AO_EditUserDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_username_edit")==0 || strcasecmp(sender, "wiz_userid_edit")==0 || strcasecmp(sender, "wiz_url_edit")==0 || strcasecmp(sender, "wiz_brokerid_edit")==0 || strcasecmp(sender, "wiz_fid_edit")==0 || strcasecmp(sender, "wiz_org_edit")==0 || strcasecmp(sender, "wiz_appid_edit")==0 || strcasecmp(sender, "wiz_appver_edit")==0 || strcasecmp(sender, "wiz_headerver_edit")==0) { int rv; if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_BANK) { rv=AO_EditUserDialog_GetBankPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_USER) { rv=AO_EditUserDialog_GetUserPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_APP) { rv=AO_EditUserDialog_GetAppPageData(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AO_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AO_EDITUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_EDITUSER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AO_EditUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AO_EditUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AO_EditUserDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AO_EditUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/account.c0000644000175000017500000000545212364015477023065 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "account_p.h" #include #include #include #include #include GWEN_INHERIT(AB_ACCOUNT, AO_ACCOUNT) void AO_Account_Extend(AB_ACCOUNT *a, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { AO_ACCOUNT *ae; assert(a); if (em==AB_ProviderExtendMode_Create || em==AB_ProviderExtendMode_Extend) { GWEN_NEW_OBJECT(AO_ACCOUNT, ae); GWEN_INHERIT_SETDATA(AB_ACCOUNT, AO_ACCOUNT, a, ae, AO_Account_freeData); if (em==AB_ProviderExtendMode_Create) { /* setup defaults */ ae->maxPurposeLines=1; ae->debitAllowed=0; } else { ae->maxPurposeLines=GWEN_DB_GetIntValue(db, "maxPurposeLines", 0, 1); ae->debitAllowed=GWEN_DB_GetIntValue(db, "debitAllowed", 0, 1); } } else if (em==AB_ProviderExtendMode_Reload) { ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); ae->maxPurposeLines=GWEN_DB_GetIntValue(db, "maxPurposeLines", 0, 1); ae->debitAllowed=GWEN_DB_GetIntValue(db, "debitAllowed", 0, 1); } else if (em==AB_ProviderExtendMode_Save) { ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxPurposeLines", ae->maxPurposeLines); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "debitAllowed", ae->debitAllowed); } } void GWENHYWFAR_CB AO_Account_freeData(void *bp, void *p) { AO_ACCOUNT *ae; ae=(AO_ACCOUNT*) p; GWEN_FREE_OBJECT(ae); } int AO_Account_GetMaxPurposeLines(const AB_ACCOUNT *a){ AO_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); return ae->maxPurposeLines; } void AO_Account_SetMaxPurposeLines(AB_ACCOUNT *a, int i){ AO_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); ae->maxPurposeLines=i; } int AO_Account_GetDebitAllowed(const AB_ACCOUNT *a){ AO_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); return ae->debitAllowed; } void AO_Account_SetDebitAllowed(AB_ACCOUNT *a, int i){ AO_ACCOUNT *ae; assert(a); ae=GWEN_INHERIT_GETDATA(AB_ACCOUNT, AO_ACCOUNT, a); assert(ae); ae->debitAllowed=i; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/Makefile.in0000644000175000017500000011671612643540060023327 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/backends/aqofxconnect/plugin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/aqofxconnect.xml.in $(top_srcdir)/depcomp \ $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = aqofxconnect.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" \ "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(plugindir)" \ "$(DESTDIR)$(iheaderdir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) \ $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = aqofxconnect_la_DEPENDENCIES = libaqofxconnectplugin.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_aqofxconnect_la_OBJECTS = dummy.lo aqofxconnect_la_OBJECTS = $(am_aqofxconnect_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqofxconnect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(aqofxconnect_la_LDFLAGS) $(LDFLAGS) \ -o $@ libaqofxconnect_la_DEPENDENCIES = libofxhome/libofxhome.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libaqofxconnect_la_OBJECTS = account.lo provider.lo queues.lo \ user.lo dlg_edituser.lo dlg_newuser.lo dlg_ofx_special.lo libaqofxconnect_la_OBJECTS = $(am_libaqofxconnect_la_OBJECTS) libaqofxconnect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libaqofxconnect_la_LDFLAGS) \ $(LDFLAGS) -o $@ libaqofxconnectplugin_la_DEPENDENCIES = libaqofxconnect.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libaqofxconnectplugin_la_OBJECTS = aqofxconnect-plugin.lo libaqofxconnectplugin_la_OBJECTS = \ $(am_libaqofxconnectplugin_la_OBJECTS) libaqofxconnectplugin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libaqofxconnectplugin_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqofxconnect_la_SOURCES) $(libaqofxconnect_la_SOURCES) \ $(libaqofxconnectplugin_la_SOURCES) DIST_SOURCES = $(aqofxconnect_la_SOURCES) \ $(libaqofxconnect_la_SOURCES) \ $(libaqofxconnectplugin_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dlgdata_DATA) $(plugin_DATA) HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" -DBUILDING_AQOFXCONNECT DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = libofxhome INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(gwenhywfar_includes) plugindir = $(aqbanking_plugindir)/providers plugin_DATA = aqofxconnect.xml dlgdatadir = $(aqbanking_pkgdatadir)/backends/aqofxconnect/dialogs dlgdata_DATA = \ dlg_edituser.dlg \ dlg_newuser.dlg \ dlg_ofx_special.dlg noinst_HEADERS = \ account_p.h \ aqofxconnect_l.h \ provider_p.h \ user_p.h \ queues_l.h \ queues_p.h \ dlg_edituser_p.h dlg_edituser_l.h \ dlg_newuser_p.h dlg_newuser_l.h \ dlg_ofx_special_p.h dlg_ofx_special_l.h iheaderdir = @aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS = \ account.h \ aqofxconnect.h \ provider.h \ user.h # library lib_LTLIBRARIES = libaqofxconnect.la libaqofxconnect_la_SOURCES = \ account.c \ provider.c \ queues.c \ user.c \ dlg_edituser.c \ dlg_newuser.c \ dlg_ofx_special.c libaqofxconnect_la_LIBADD = \ libofxhome/libofxhome.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqofxconnect_la_LDFLAGS = -no-undefined \ -version-info $(AQOFXCONNECT_SO_CURRENT):$(AQOFXCONNECT_SO_REVISION):$(AQOFXCONNECT_SO_AGE) # static plugin library noinst_LTLIBRARIES = libaqofxconnectplugin.la libaqofxconnectplugin_la_SOURCES = \ aqofxconnect-plugin.c libaqofxconnectplugin_la_LIBADD = \ libaqofxconnect.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqofxconnectplugin_la_LDFLAGS = -no-undefined # dynamic plugin plugin_LTLIBRARIES = aqofxconnect.la aqofxconnect_la_SOURCES = dummy.c aqofxconnect_la_LIBADD = \ libaqofxconnectplugin.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) aqofxconnect_la_LDFLAGS = -no-undefined -module -avoid-version EXTRA_DIST = $(dlgdata_DATA) $(dlgimage_DATA) \ aqofxconnect.xml.in \ network.c \ request.c \ r_statements.c \ r_accountinfo.c all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/plugin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/backends/aqofxconnect/plugin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): aqofxconnect.xml: $(top_builddir)/config.status $(srcdir)/aqofxconnect.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } aqofxconnect.la: $(aqofxconnect_la_OBJECTS) $(aqofxconnect_la_DEPENDENCIES) $(EXTRA_aqofxconnect_la_DEPENDENCIES) $(AM_V_CCLD)$(aqofxconnect_la_LINK) -rpath $(plugindir) $(aqofxconnect_la_OBJECTS) $(aqofxconnect_la_LIBADD) $(LIBS) libaqofxconnect.la: $(libaqofxconnect_la_OBJECTS) $(libaqofxconnect_la_DEPENDENCIES) $(EXTRA_libaqofxconnect_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqofxconnect_la_LINK) -rpath $(libdir) $(libaqofxconnect_la_OBJECTS) $(libaqofxconnect_la_LIBADD) $(LIBS) libaqofxconnectplugin.la: $(libaqofxconnectplugin_la_OBJECTS) $(libaqofxconnectplugin_la_DEPENDENCIES) $(EXTRA_libaqofxconnectplugin_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqofxconnectplugin_la_LINK) $(libaqofxconnectplugin_la_OBJECTS) $(libaqofxconnectplugin_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/account.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aqofxconnect-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newuser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_ofx_special.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dlgdataDATA: $(dlgdata_DATA) @$(NORMAL_INSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgdatadir)" || exit $$?; \ done uninstall-dlgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgdatadir)'; $(am__uninstall_files_from_dir) install-pluginDATA: $(plugin_DATA) @$(NORMAL_INSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(plugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(plugindir)" || exit $$?; \ done uninstall-pluginDATA: @$(NORMAL_UNINSTALL) @list='$(plugin_DATA)'; test -n "$(plugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(plugindir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dlgdataDATA install-iheaderHEADERS \ install-pluginDATA install-pluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dlgdataDATA uninstall-iheaderHEADERS \ uninstall-libLTLIBRARIES uninstall-pluginDATA \ uninstall-pluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstLTLIBRARIES clean-pluginLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dlgdataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-pluginDATA install-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dlgdataDATA \ uninstall-iheaderHEADERS uninstall-libLTLIBRARIES \ uninstall-pluginDATA uninstall-pluginLTLIBRARIES sources: for f in $(libaqofxconnect_la_SOURCES) $(aqofxconnect_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: list='$(SUBDIRS)'; for d in $$list; do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/queues_p.h0000644000175000017500000000135212364015477023257 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_QUEUES_P_H #define AO_QUEUES_P_H #include "queues_l.h" struct AO_QUEUE { AO_USERQUEUE_LIST *userQueues; }; struct AO_USERQUEUE { GWEN_LIST_ELEMENT(AO_USERQUEUE) AB_USER *user; AB_JOB_LIST2 *jobs; }; #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/r_accountinfo.c0000644000175000017500000000167112364015477024261 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Wed Jan 09 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AO_Provider__AddAccountInfoReq(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { int rv; GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, "19691231"); GWEN_Buffer_AppendString(buf, ""); /* wrap into request */ rv=AO_Provider__WrapRequest(pro, u, "SIGNUP", "ACCTINFO", buf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg0000644000175000017500000001130512364015477024421 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/provider.c0000644000175000017500000007270412364015477023267 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #define AO_PROVIDER_HEAVY_DEBUG #include "provider_p.h" #include "account.h" #include "queues_l.h" #include "user.h" #include "dlg_edituser_l.h" #include "dlg_newuser_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18S(msg) msg GWEN_INHERIT(AB_PROVIDER, AO_PROVIDER) static AO_APPINFO _appInfos[]={ /* got this list from https://microsoftmoneyoffline.wordpress.com/appid-appver/ */ { I18S("Intuit Quicken Windows 2013"), "QWIN", "2200"}, { I18S("Intuit Quicken Windows 2012"), "QWIN", "2100"}, { I18S("Intuit Quicken Windows 2011"), "QWIN", "2000"}, { I18S("Intuit Quicken Windows 2010"), "QWIN", "1900"}, { I18S("Intuit Quicken Windows 2009"), "QWIN", "1800"}, { I18S("Intuit Quicken Windows 2008"), "QWIN", "1700"}, { I18S("Intuit Quicken Windows 2007"), "QWIN", "1600"}, { I18S("Intuit Quicken Windows 2006"), "QWIN", "1500"}, { I18S("Intuit Quicken Windows 2005"), "QWIN", "1400"}, { I18S("Intuit Quicken Mac 2008"), "QMOFX", "1700"}, { I18S("Intuit Quicken Mac 2007"), "QMOFX", "1600"}, { I18S("Intuit Quicken Mac 2006"), "QMOFX", "1500"}, { I18S("Intuit Quicken Mac 2005"), "QMOFX", "1400"}, { I18S("Intuit QuickBooks Windows 2008"), "QBW", "1800"}, { I18S("Intuit QuickBooks Windows 2007"), "QBW", "1700"}, { I18S("Intuit QuickBooks Windows 2006"), "QBW", "1600"}, { I18S("Intuit QuickBooks Windows 2005"), "QBW", "1500"}, { I18S("Microsoft Money Plus"), "Money Plus", "1700"}, { I18S("Microsoft Money 2007"), "Money", "1600"}, { I18S("Microsoft Money 2006"), "Money", "1500"}, { I18S("Microsoft Money 2005"), "Money", "1400"}, { I18S("Microsoft Money 2004"), "Money", "1200"}, { I18S("Microsoft Money 2003"), "Money", "1100"}, { I18S("ProSaldo Money 2013"), "PROSALDO", "11005"}, { NULL, NULL, NULL} }; AB_PROVIDER *AO_Provider_new(AB_BANKING *ab){ AB_PROVIDER *pro; AO_PROVIDER *dp; pro=AB_Provider_new(ab, "aqofxconnect"); GWEN_NEW_OBJECT(AO_PROVIDER, dp); GWEN_INHERIT_SETDATA(AB_PROVIDER, AO_PROVIDER, pro, dp, AO_Provider_FreeData); dp->bankingJobs=AB_Job_List2_new(); dp->queue=AO_Queue_new(); AB_Provider_SetInitFn(pro, AO_Provider_Init); AB_Provider_SetFiniFn(pro, AO_Provider_Fini); AB_Provider_SetUpdateJobFn(pro, AO_Provider_UpdateJob); AB_Provider_SetAddJobFn(pro, AO_Provider_AddJob); AB_Provider_SetExecuteFn(pro, AO_Provider_Execute); AB_Provider_SetResetQueueFn(pro, AO_Provider_ResetQueue); AB_Provider_SetExtendUserFn(pro, AO_Provider_ExtendUser); AB_Provider_SetExtendAccountFn(pro, AO_Provider_ExtendAccount); AB_Provider_SetGetEditUserDialogFn(pro, AO_Provider_GetEditUserDialog); AB_Provider_AddFlags(pro, AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG); AB_Provider_SetGetNewUserDialogFn(pro, AO_Provider_GetNewUserDialog); AB_Provider_AddFlags(pro, AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG); return pro; } void GWENHYWFAR_CB AO_Provider_FreeData(void *bp, void *p) { AO_PROVIDER *dp; dp=(AO_PROVIDER*)p; assert(dp); AO_Queue_free(dp->queue); AB_Job_List2_free(dp->bankingJobs); GWEN_FREE_OBJECT(dp); } int AO_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData) { AO_PROVIDER *dp; const char *logLevelName; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); logLevelName=getenv("AQOFXCONNECT_LOGLEVEL"); if (logLevelName) { GWEN_LOGGER_LEVEL ll; ll=GWEN_Logger_Name2Level(logLevelName); if (ll!=GWEN_LoggerLevel_Unknown) { GWEN_Logger_SetLevel(AQOFXCONNECT_LOGDOMAIN, ll); DBG_WARN(AQOFXCONNECT_LOGDOMAIN, "Overriding loglevel for AqOFXConnect with \"%s\"", logLevelName); } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Unknown loglevel \"%s\"", logLevelName); } } dp->dbConfig=dbData; dp->lastJobId=GWEN_DB_GetIntValue(dp->dbConfig, "lastJobId", 0, 0); dp->connectTimeout=GWEN_DB_GetIntValue(dp->dbConfig, "connectTimeout", 0, AO_PROVIDER_CONNECT_TIMEOUT); dp->sendTimeout=GWEN_DB_GetIntValue(dp->dbConfig, "sendTimeout", 0, AO_PROVIDER_SEND_TIMEOUT); dp->recvTimeout=GWEN_DB_GetIntValue(dp->dbConfig, "recvTimeout", 0, AO_PROVIDER_RECV_TIMEOUT); return 0; } int AO_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData){ AO_PROVIDER *dp; int errors=0; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Deinitializing AqOFXDC backend"); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastJobId", dp->lastJobId); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "connectTimeout", dp->connectTimeout); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "sendTimeout", dp->sendTimeout); GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "recvTimeout", dp->recvTimeout); dp->dbConfig=0; AO_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Deinit done"); if (errors) return GWEN_ERROR_GENERIC; return 0; } int AO_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j){ AO_PROVIDER *dp; AB_ACCOUNT *a; AB_USER *u; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); /* configuration check */ a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); if (u==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "No user assigned to account, should not happen"); GWEN_Gui_ShowError(I18N("Setup Error"), I18N("No user assigned to this account. Please check your configuration.")); return GWEN_ERROR_INTERNAL; } switch(AB_Job_GetType(j)) { case AB_Job_TypeGetBalance: /* no parameters to exchange */ return 0; case AB_Job_TypeGetTransactions: /* no parameters to exchange */ return 0; case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: default: DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Job not supported (%d)", AB_Job_GetType(j)); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ } int AO_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j){ AO_PROVIDER *dp; AB_ACCOUNT *a; AB_USER *u; AO_USERQUEUE *uq; int doAdd=1; GWEN_DB_NODE *dbJob; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); if (u==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "No user assigned to account, should not happen"); GWEN_Gui_ShowError(I18N("Setup Error"), I18N("No user assigned to this account. Please check your configuration.")); return GWEN_ERROR_INTERNAL; } dbJob=AB_Job_GetProviderData(j, pro); assert(dbJob); switch(AB_Job_GetType(j)) { case AB_Job_TypeGetBalance: case AB_Job_TypeGetTransactions: break; case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: default: DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Job not supported (%d)", AB_Job_GetType(j)); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ uq=AO_Queue_GetUserQueue(dp->queue, u); assert(uq); if (AB_Job_GetType(j)==AB_Job_TypeGetBalance) { AB_JOB_LIST2_ITERATOR *jit; /* check whether a getBalance job already exists. If it does then * we don't have to send this job again, once is enough. */ jit=AB_Job_List2_First(AO_UserQueue_GetJobs(uq)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_JOB_TYPE jt; jt=AB_Job_GetType(uj); if (jt==AB_Job_TypeGetBalance || jt==AB_Job_TypeGetTransactions) { if (AB_Job_GetAccount(j)==AB_Job_GetAccount(uj)) { GWEN_DB_NODE *dbCurrJob; dbCurrJob=AB_Job_GetProviderData(uj, pro); assert(dbCurrJob); GWEN_DB_SetIntValue(dbJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "refJob", AB_Job_GetJobId(uj)); doAdd=0; break; } } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } } else if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { AB_JOB_LIST2_ITERATOR *jit; const GWEN_TIME *tnew; /* check whether a getTransactions job already exists. If it does then * we don't have to send this job again, once is enough. */ tnew=AB_JobGetTransactions_GetFromTime(j); jit=AB_Job_List2_First(AO_UserQueue_GetJobs(uq)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_JOB_TYPE jt; jt=AB_Job_GetType(uj); if (jt==AB_Job_TypeGetTransactions) { if (AB_Job_GetAccount(j)==AB_Job_GetAccount(uj)) { GWEN_DB_NODE *dbCurrJob; dbCurrJob=AB_Job_GetProviderData(uj, pro); assert(dbCurrJob); if (tnew) { const GWEN_TIME *tcurr; tcurr=AB_JobGetTransactions_GetFromTime(uj); if (tcurr) { /* current job has a time */ if (GWEN_Time_Diff(tcurr, tnew)>0.0) { /* new time is before that of current job, replace */ GWEN_DB_SetIntValue(dbCurrJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "refJob", AB_Job_GetJobId(j)); AB_Job_List2_Erase(AO_UserQueue_GetJobs(uq), jit); doAdd=1; break; } } else { /* current job has no time, so replace by job with time */ GWEN_DB_SetIntValue(dbCurrJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "refJob", AB_Job_GetJobId(j)); AB_Job_List2_Erase(AO_UserQueue_GetJobs(uq), jit); doAdd=1; break; } } else { /* new job has no time, so don't add it */ doAdd=0; GWEN_DB_SetIntValue(dbJob, GWEN_DB_FLAGS_OVERWRITE_VARS, "refJob", AB_Job_GetJobId(uj)); break; } } /* if same account */ } /* if GetTransactions */ uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } } if (doAdd) { /* only add to queue if needed */ AO_UserQueue_AddJob(uq, j); } /* always add to linear list */ AB_Job_List2_PushBack(dp->bankingJobs, j); return 0; } int AO_Provider_ResetQueue(AB_PROVIDER *pro){ AO_PROVIDER *dp; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); AO_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); return 0; } int AO_Provider_CountDoneJobs(AB_JOB_LIST2 *jl){ AB_JOB_LIST2_ITERATOR *jit; int cnt=0; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_JOB_STATUS js; js=AB_Job_GetStatus(uj); if (js==AB_Job_StatusFinished || js==AB_Job_StatusError) cnt++; uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return cnt; } AB_JOB *AO_Provider_FindJobById(AB_JOB_LIST2 *jl, uint32_t jid) { AB_JOB_LIST2_ITERATOR *jit; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); assert(j); while(j) { if (AB_Job_GetJobId(j)==jid) { AB_Job_List2Iterator_free(jit); return j; } j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return 0; } int AO_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx){ AO_PROVIDER *dp; int oks=0; int errors=0; AB_JOB_LIST2_ITERATOR *jit; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); rv=AO_Provider_ExecQueue(pro, ctx); if (!rv) oks++; else { errors++; if (rv==GWEN_ERROR_USER_ABORTED) { AO_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); return rv; } } /* set results in referencing jobs, too */ jit=AB_Job_List2_First(dp->bankingJobs); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { if (AB_Job_GetStatus(uj)==AB_Job_StatusSent) { AB_JOB *rj; uint32_t rjid; rj=uj; /* find referenced job (if any) */ do { GWEN_DB_NODE *dbT; dbT=AB_Job_GetProviderData(rj, pro); assert(dbT); rjid=GWEN_DB_GetIntValue(dbT, "refJob", 0, 0); if (rjid) { rj=AO_Provider_FindJobById(dp->bankingJobs, rjid); } } while(rjid && rj); if (rj && rj!=uj) { /* found referenced job, copy status and result text */ DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Copying status from referenced job"); AB_Job_SetStatus(uj, AB_Job_GetStatus(rj)); AB_Job_SetResultText(uj, AB_Job_GetResultText(rj)); } if (AB_Job_GetStatus(uj)==AB_Job_StatusSent) AB_Job_SetStatus(uj, AB_Job_StatusFinished); } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } rv=AB_Banking_ExecutionProgress(AB_Provider_GetBanking(pro)); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "User aborted"); return rv; } AO_Queue_Clear(dp->queue); AB_Job_List2_Clear(dp->bankingJobs); if (!oks && errors) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Not a single job succeeded"); return GWEN_ERROR_GENERIC; } return 0; } int AO_Provider__ProcessImporterContext(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ictx){ AB_IMEXPORTER_ACCOUNTINFO *ai; assert(pro); assert(ictx); ai=AB_ImExporterContext_GetFirstAccountInfo(ictx); if (!ai) { DBG_INFO(0, "No accounts"); } while(ai) { const char *country; const char *bankCode; const char *accountNumber; country=AB_User_GetCountry(u); if (!country) country="us"; bankCode=AB_ImExporterAccountInfo_GetBankCode(ai); if (!bankCode || !*bankCode) bankCode=AB_User_GetBankCode(u); accountNumber=AB_ImExporterAccountInfo_GetAccountNumber(ai); if (bankCode && accountNumber) { AB_ACCOUNT *a; const char *s; a=AB_Banking_FindAccount(AB_Provider_GetBanking(pro), AQOFXCONNECT_BACKENDNAME, country, bankCode, accountNumber, NULL); if (!a) { char msg[]=I18S("Adding account %s to bank %s"); char msgbuf[512]; DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Adding account %s to bank %s", accountNumber, bankCode); /* account does not exist, add it */ a=AB_Banking_CreateAccount(AB_Provider_GetBanking(pro), AQOFXCONNECT_BACKENDNAME); assert(a); AB_Account_SetCountry(a, country); AB_Account_SetBankCode(a, bankCode); AB_Account_SetAccountNumber(a, accountNumber); AB_Account_SetUser(a, u); s=AB_ImExporterAccountInfo_GetBankName(ai); if (!s) s=bankCode; AB_Account_SetBankName(a, s); AB_Account_SetAccountType(a, AB_ImExporterAccountInfo_GetType(ai)); snprintf(msgbuf, sizeof(msgbuf), I18N(msg), accountNumber, bankCode); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, msgbuf); AB_Banking_AddAccount(AB_Provider_GetBanking(pro),a ); } else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Account %s at bank %s already exists", accountNumber, bankCode); } /* update existing account */ s=AB_ImExporterAccountInfo_GetBankName(ai); if (s) { AB_Account_SetBankName(a, s); } s=AB_ImExporterAccountInfo_GetAccountName(ai); if (s) AB_Account_SetAccountName(a, s); } else { DBG_WARN(AQOFXCONNECT_LOGDOMAIN, "BankCode or AccountNumber missing (%s/%s)", bankCode, accountNumber); } ai=AB_ImExporterContext_GetNextAccountInfo(ictx); } /* while accounts */ return 0; } int AO_Provider_RequestAccounts(AB_PROVIDER *pro, AB_USER *u, int keepOpen) { AO_PROVIDER *dp; GWEN_BUFFER *reqbuf; GWEN_BUFFER *rbuf=NULL; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ictx; assert(u); assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | (keepOpen?GWEN_GUI_PROGRESS_KEEP_OPEN:0) | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Requesting account list"), I18N("We are now requesting a list of " "accounts\n" "which can be managed via OFX.\n" "" "We are now requesting a list of " "accounts " "which can be managed via OFX.\n" ""), 1, 0); ictx=AB_ImExporterContext_new(); reqbuf=GWEN_Buffer_new(0, 2048, 0, 1); GWEN_Buffer_ReserveBytes(reqbuf, 1024); /* add actual request */ rv=AO_Provider__AddAccountInfoReq(pro, u, reqbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding request element (%d)", rv); GWEN_Buffer_free(reqbuf); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } /* wrap message (adds headers etc) */ rv=AO_Provider__WrapMessage(pro, u, reqbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding request element (%d)", rv); GWEN_Buffer_free(reqbuf); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } /* exchange mesages (could also return HTTP code!) */ rv=AO_Provider_SendAndReceive(pro, u, (const uint8_t*)GWEN_Buffer_GetStart(reqbuf), GWEN_Buffer_GetUsedBytes(reqbuf), &rbuf); if (rv) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error exchanging getAccounts-request (%d)", rv); GWEN_Buffer_free(reqbuf); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } else { AB_IMEXPORTER *importer; GWEN_DB_NODE *dbProfile; /* parse response */ GWEN_Buffer_free(reqbuf); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Info, I18N("Parsing response")); /* prepare import */ importer=AB_Banking_GetImExporter(AB_Provider_GetBanking(pro), "ofx"); if (!importer) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "OFX import module not found"); GWEN_Buffer_free(rbuf); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return GWEN_ERROR_NOT_FOUND; } GWEN_Buffer_Rewind(rbuf); dbProfile=GWEN_DB_Group_new("profile"); /* actually import */ rv=AB_ImExporter_ImportBuffer(importer, ictx, rbuf, dbProfile); GWEN_DB_Group_free(dbProfile); GWEN_Buffer_free(rbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error importing server response (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Error parsing response")); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } /* create accounts */ rv=AO_Provider__ProcessImporterContext(pro, u, ictx); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error importing accounts (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Error importing accounts")); AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } } AB_ImExporterContext_free(ictx); GWEN_Gui_ProgressEnd(pid); return rv; } int AO_Provider_RequestStatements(AB_PROVIDER *pro, AB_JOB *j, AB_IMEXPORTER_CONTEXT *ictx) { AO_PROVIDER *dp; GWEN_BUFFER *reqbuf; GWEN_BUFFER *rbuf=0; int rv; AB_USER *u; AB_ACCOUNT *a; // time_t t=0; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); /* get all data for the context */ a=AB_Job_GetAccount(j); assert(a); u=AB_Account_GetFirstUser(a); assert(u); /* get from time */ if (AB_Job_GetType(j)==AB_Job_TypeGetTransactions) { // const GWEN_TIME *ti; // ti=AB_JobGetTransactions_GetFromTime(j); // if (ti) // t=GWEN_Time_toTime_t(ti); } reqbuf=GWEN_Buffer_new(0, 2048, 0, 1); GWEN_Buffer_ReserveBytes(reqbuf, 1024); /* add actual request */ rv=AO_Provider__AddStatementRequest(pro, j, reqbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding request element (%d)", rv); GWEN_Buffer_free(reqbuf); return rv; } /* wrap message (adds headers etc) */ rv=AO_Provider__WrapMessage(pro, u, reqbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding request element (%d)", rv); GWEN_Buffer_free(reqbuf); return rv; } /* exchange messages (might also return HTTP code!) */ rv=AO_Provider_SendAndReceive(pro, u, (const uint8_t*)GWEN_Buffer_GetStart(reqbuf), GWEN_Buffer_GetUsedBytes(reqbuf), &rbuf); if (rv) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error exchanging getStatements-request (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error parsing server response")); GWEN_Buffer_free(rbuf); GWEN_Buffer_free(reqbuf); return rv; } else { AB_IMEXPORTER *importer; GWEN_DB_NODE *dbProfile; /* parse response */ GWEN_Buffer_free(reqbuf); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Parsing response")); /* prepare import */ importer=AB_Banking_GetImExporter(AB_Provider_GetBanking(pro), "ofx"); if (!importer) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "OFX import module not found"); GWEN_Buffer_free(rbuf); return GWEN_ERROR_NOT_FOUND; } GWEN_Buffer_Rewind(rbuf); dbProfile=GWEN_DB_Group_new("profile"); /* actually import */ rv=AB_ImExporter_ImportBuffer(importer, ictx, rbuf, dbProfile); GWEN_DB_Group_free(dbProfile); GWEN_Buffer_free(rbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error importing server response (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error parsing response")); return rv; } /* TODO: Maybe create accounts we received here */ } return 0; } int AO_Provider_ExecUserQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AO_USERQUEUE *uq){ AB_JOB_LIST2_ITERATOR *jit; AO_PROVIDER *dp; int errors=0; int oks=0; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); jit=AB_Job_List2_First(AO_UserQueue_GetJobs(uq)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_JOB_TYPE jt; /* TODO: omit AB_Job_TypeGetBalance if there is * AB_Job_TypeGetTransactions for the same account */ jt=AB_Job_GetType(uj); if (jt==AB_Job_TypeGetBalance || jt==AB_Job_TypeGetTransactions) { int rv; /* start new context */ rv=AO_Provider_RequestStatements(pro, uj, ctx); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "User aborted"); AB_Job_List2Iterator_free(jit); return rv; } else if (rv==GWEN_ERROR_ABORTED) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Aborted"); break; } if (!rv) oks++; else errors++; rv=GWEN_Gui_ProgressAdvance(0, AO_Provider_CountDoneJobs(dp->bankingJobs)); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "User aborted"); AB_Job_List2Iterator_free(jit); return rv; } } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Unhandled job type \"%s\"", AB_Job_Type2Char(jt)); } uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return 0; } int AO_Provider_ExecQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx) { AO_USERQUEUE *uq; AO_PROVIDER *dp; int errors=0; int oks=0; int rv; AB_BANKING *ab; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); ab=AB_Provider_GetBanking(pro); assert(ab); uq=AO_Queue_FirstUserQueue(dp->queue); while(uq) { AB_USER *u; char tbuf[256]; u=AO_UserQueue_GetUser(uq); assert(u); snprintf(tbuf, sizeof(tbuf)-1, I18N("Locking user %s"), AB_User_GetUserId(u)); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, tbuf); rv=AB_Banking_BeginExclUseUser(ab, u); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not lock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not lock user %s (%d)"), AB_User_GetUserId(u), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); AB_Banking_EndExclUseUser(ab, u, 1); /* abandon */ errors++; if (rv==GWEN_ERROR_USER_ABORTED) return rv; } else { rv=AO_Provider_ExecUserQueue(pro, ctx, uq); if (rv) errors++; else oks++; if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "User aborted"); AB_Banking_EndExclUseUser(ab, u, 1); /* abandon */ return rv; } snprintf(tbuf, sizeof(tbuf)-1, I18N("Unlocking user %s"), AB_User_GetUserId(u)); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, tbuf); rv=AB_Banking_EndExclUseUser(ab, u, 0); if (rv<0) { snprintf(tbuf, sizeof(tbuf)-1, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); tbuf[sizeof(tbuf)-1]=0; GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, tbuf); errors++; if (rv==GWEN_ERROR_USER_ABORTED) return rv; } } uq=AO_UserQueue_List_Next(uq); } /* while */ if (!oks && errors) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Not a single job succeeded"); return GWEN_ERROR_GENERIC; } return 0; } int AO_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { AO_User_Extend(u, pro, em, db); return 0; } int AO_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db){ AO_Account_Extend(a, pro, em, db); return 0; } GWEN_DIALOG *AO_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u) { AO_PROVIDER *xp; GWEN_DIALOG *dlg; assert(pro); xp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(xp); dlg=AO_EditUserDialog_new(AB_Provider_GetBanking(pro), u, 1); if (dlg==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } GWEN_DIALOG *AO_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i) { AO_PROVIDER *xp; GWEN_DIALOG *dlg; assert(pro); xp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(xp); dlg=AO_NewUserDialog_new(AB_Provider_GetBanking(pro)); if (dlg==NULL) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (no dialog)"); return NULL; } return dlg; } const AO_APPINFO *AO_Provider_GetAppInfos(AB_PROVIDER *pro) { return _appInfos; } int AO_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u) { AO_PROVIDER *xp; int rv; const char *url; assert(pro); xp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(xp); url=AO_User_GetServerAddr(u); if (url && *url) { uint32_t uFlags; uint32_t hFlags=0; uint32_t pid; uFlags=AO_User_GetFlags(u); if (uFlags & AO_USER_FLAGS_FORCE_SSL3) hFlags|=GWEN_HTTP_SESSION_FLAGS_FORCE_SSL3; pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Getting Certificate"), I18N("We are now asking the server for its " "SSL certificate"), GWEN_GUI_PROGRESS_NONE, 0); rv=AB_Banking_GetCert(AB_Provider_GetBanking(pro), url, "https", 443, &hFlags, pid); if (rv<0) { GWEN_Gui_ProgressEnd(pid); return rv; } if (hFlags & GWEN_HTTP_SESSION_FLAGS_FORCE_SSL3) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Setting ForceSSLv3 flag"); uFlags|=AO_USER_FLAGS_FORCE_SSL3; } else { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Clearing ForceSSLv3 flag"); uFlags&=~AO_USER_FLAGS_FORCE_SSL3; } AO_User_SetFlags(u, uFlags); GWEN_Gui_ProgressEnd(pid); return 0; } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "No url"); return GWEN_ERROR_INVALID; } } #include "network.c" #include "request.c" aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.dlg0000644000175000017500000000362512364015477025077 00000000000000 aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/provider.h0000644000175000017500000000227112364015477023264 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_PROVIDER_H #define AO_PROVIDER_H #include #include #include #define AQOFXCONNECT_BACKENDNAME "aqofxconnect" #define AQOFXCONNECT_LOGDOMAIN "aqofxconnect" #ifdef __cplusplus extern "C" { #endif typedef struct AO_PROVIDER AO_PROVIDER; typedef struct { const char *appName; const char *appId; const char *appVer; } AO_APPINFO; AQOFXCONNECT_API AB_PROVIDER *AO_Provider_new(AB_BANKING *ab); AQOFXCONNECT_API const AO_APPINFO *AO_Provider_GetAppInfos(AB_PROVIDER *pro); AQOFXCONNECT_API int AO_Provider_GetCert(AB_PROVIDER *pro, AB_USER *u); AQOFXCONNECT_API int AO_Provider_RequestAccounts(AB_PROVIDER *pro, AB_USER *u, int keepOpen); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/aqofxconnect.h0000644000175000017500000000263312364015477024124 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQOFXCONNECT_AQOFXCONNECT_H #define AQOFXCONNECT_AQOFXCONNECT_H #include #ifdef BUILDING_AQOFXCONNECT # /* building AqOFXCONNECT */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQOFXCONNECT_API __declspec (dllexport) # else /* if __declspec */ # define AQOFXCONNECT_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQOFXCONNECT_API __attribute__((visibility("default"))) # else # define AQOFXCONNECT_API # endif # endif #else # /* not building AqOFXCONNECT */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQOFXCONNECT_API __declspec (dllimport) # else /* if __declspec */ # define AQOFXCONNECT_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # define AQOFXCONNECT_API # endif #endif #define AQOFXCONNECT_LOGDOMAIN "aqofxconnect" #endif /* AQOFXCONNECT_AQOFXCONNECT_H */ aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/provider_p.h0000644000175000017500000000743112364015477023606 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_PROVIDER_P_H #define AO_PROVIDER_P_H #define AO_PROVIDER_CONNECT_TIMEOUT 15 #define AO_PROVIDER_SEND_TIMEOUT 10 #define AO_PROVIDER_RECV_TIMEOUT 60 #include "queues_l.h" #include #include #include struct AO_PROVIDER { GWEN_DB_NODE *dbConfig; int connectTimeout; int sendTimeout; int recvTimeout; uint32_t lastJobId; AO_QUEUE *queue; AB_JOB_LIST2 *bankingJobs; }; static void GWENHYWFAR_CB AO_Provider_FreeData(void *bp, void *p); static int AO_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int AO_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); static int AO_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j); static int AO_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j); static int AO_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); static int AO_Provider_ResetQueue(AB_PROVIDER *pro); static int AO_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); static int AO_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); static GWEN_DIALOG *AO_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u); static GWEN_DIALOG *AO_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i); #if 0 static int AO_Provider_EncodeJob(AB_PROVIDER *pro, AO_CONTEXT *ctx, char **pData); #endif static int AO_Provider_SendAndReceive(AB_PROVIDER *pro, AB_USER *u, const uint8_t *p, unsigned int plen, GWEN_BUFFER **rbuf); static int AO_Provider_RequestStatements(AB_PROVIDER *pro, AB_JOB *j, AB_IMEXPORTER_CONTEXT *ictx); static int AO_Provider_ExecUserQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AO_USERQUEUE *uq); static int AO_Provider_ExecQueue(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); static int AO_Provider_CountDoneJobs(AB_JOB_LIST2 *jl); static AB_JOB *AO_Provider_FindJobById(AB_JOB_LIST2 *jl, uint32_t jid); int AO_Provider__ProcessImporterContext(AB_PROVIDER *pro, AB_USER *u, AB_IMEXPORTER_CONTEXT *ictx); static int AO_Provider__AddHeaders(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf); static int AO_Provider__AddSignOn(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf); static int AO_Provider__WrapRequest(AB_PROVIDER *pro, AB_USER *u, const char *mTypeName, const char *tTypeName, GWEN_BUFFER *buf); static int AO_Provider__WrapMessage(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf); static int AO_Provider__AddBankStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf); static int AO_Provider__AddCreditCardStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf); static int AO_Provider__AddInvStatementReq(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf); static int AO_Provider__AddStatementRequest(AB_PROVIDER *pro, AB_JOB *j, GWEN_BUFFER *buf); int AO_Provider__AddAccountInfoReq(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/Makefile.am0000644000175000017500000000453212364015477023317 00000000000000SUBDIRS=libofxhome INCLUDES=-I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(gwenhywfar_includes) localedir=$(datadir)/locale DEFS += -DLOCALEDIR=\"$(localedir)\" -DBUILDING_AQOFXCONNECT plugindir = $(aqbanking_plugindir)/providers plugin_DATA = aqofxconnect.xml dlgdatadir=$(aqbanking_pkgdatadir)/backends/aqofxconnect/dialogs dlgdata_DATA=\ dlg_edituser.dlg \ dlg_newuser.dlg \ dlg_ofx_special.dlg noinst_HEADERS=\ account_p.h \ aqofxconnect_l.h \ provider_p.h \ user_p.h \ queues_l.h \ queues_p.h \ dlg_edituser_p.h dlg_edituser_l.h \ dlg_newuser_p.h dlg_newuser_l.h \ dlg_ofx_special_p.h dlg_ofx_special_l.h iheaderdir=@aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS=\ account.h \ aqofxconnect.h \ provider.h \ user.h # library lib_LTLIBRARIES=libaqofxconnect.la libaqofxconnect_la_SOURCES= \ account.c \ provider.c \ queues.c \ user.c \ dlg_edituser.c \ dlg_newuser.c \ dlg_ofx_special.c libaqofxconnect_la_LIBADD= \ libofxhome/libofxhome.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqofxconnect_la_LDFLAGS = -no-undefined \ -version-info $(AQOFXCONNECT_SO_CURRENT):$(AQOFXCONNECT_SO_REVISION):$(AQOFXCONNECT_SO_AGE) # static plugin library noinst_LTLIBRARIES=libaqofxconnectplugin.la libaqofxconnectplugin_la_SOURCES= \ aqofxconnect-plugin.c libaqofxconnectplugin_la_LIBADD= \ libaqofxconnect.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) libaqofxconnectplugin_la_LDFLAGS = -no-undefined # dynamic plugin plugin_LTLIBRARIES = aqofxconnect.la aqofxconnect_la_SOURCES=dummy.c aqofxconnect_la_LIBADD = \ libaqofxconnectplugin.la \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) aqofxconnect_la_LDFLAGS = -no-undefined -module -avoid-version EXTRA_DIST= $(dlgdata_DATA) $(dlgimage_DATA) \ aqofxconnect.xml.in \ network.c \ request.c \ r_statements.c \ r_accountinfo.c sources: for f in $(libaqofxconnect_la_SOURCES) $(aqofxconnect_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(plugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: list='$(SUBDIRS)'; for d in $$list; do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/account.h0000644000175000017500000000203512364015477023064 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_ACCOUNT_H #define AO_ACCOUNT_H #include #include #ifdef __cplusplus extern "C" { #endif AQOFXCONNECT_API void AO_Account_Extend(AB_ACCOUNT *a, AB_PROVIDER *pro, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *dbBackend); AQOFXCONNECT_API int AO_Account_GetMaxPurposeLines(const AB_ACCOUNT *a); AQOFXCONNECT_API void AO_Account_SetMaxPurposeLines(AB_ACCOUNT *a, int i); AQOFXCONNECT_API int AO_Account_GetDebitAllowed(const AB_ACCOUNT *a); AQOFXCONNECT_API void AO_Account_SetDebitAllowed(AB_ACCOUNT *a, int i); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/queues_l.h0000644000175000017500000000250612364015477023255 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_QUEUES_H #define AO_QUEUES_H #include #include typedef struct AO_QUEUE AO_QUEUE; typedef struct AO_USERQUEUE AO_USERQUEUE; GWEN_LIST_FUNCTION_DEFS(AO_USERQUEUE, AO_UserQueue) AO_USERQUEUE *AO_UserQueue_new(AB_USER *u); void AO_UserQueue_free(AO_USERQUEUE *uq); AB_USER *AO_UserQueue_GetUser(const AO_USERQUEUE *uq); void AO_UserQueue_AddJob(AO_USERQUEUE *uq, AB_JOB *bj); AB_JOB_LIST2 *AO_UserQueue_GetJobs(const AO_USERQUEUE *uq); AO_QUEUE *AO_Queue_new(); void AO_Queue_free(AO_QUEUE *q); AO_USERQUEUE *AO_Queue_FindUserQueue(AO_QUEUE *q, const AB_USER *u); AO_USERQUEUE *AO_Queue_GetUserQueue(AO_QUEUE *q, AB_USER *u); AO_USERQUEUE *AO_Queue_FirstUserQueue(AO_QUEUE *q); void AO_Queue_AddJob(AO_QUEUE *q, AB_USER *u, AB_JOB *bj); void AO_Queue_Clear(AO_QUEUE *q); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special_p.h0000644000175000017500000000221012364015477025064 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_OFX_SPECIAL_P_H #define AQOFXCONNECT_DLG_OFX_SPECIAL_P_H #include "dlg_ofx_special_l.h" typedef struct AO_OFX_SPECIAL_DIALOG AO_OFX_SPECIAL_DIALOG; struct AO_OFX_SPECIAL_DIALOG { AB_BANKING *banking; int httpVMajor; int httpVMinor; uint32_t flags; char *clientUid; char *securityType; }; static void GWENHYWFAR_CB AO_OfxSpecialDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AO_OfxSpecialDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/request.c0000644000175000017500000001606612364015477023124 00000000000000/*************************************************************************** begin : Wed Jan 09 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ int AO_Provider__AddHeaders(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { GWEN_TIME *ti; const char *s; ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(buf, "OFXHEADER:100\r\n" "DATA:OFXSGML\r\n"); GWEN_Buffer_AppendString(buf, "VERSION:"); s=AO_User_GetHeaderVer(u); if (!s || !*s) s="102"; GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); s=AO_User_GetSecurityType(u); if (!s || !*s) s="NONE"; GWEN_Buffer_AppendString(buf, "SECURITY:"); GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); GWEN_Buffer_AppendString(buf, "ENCODING:USASCII\r\n" "CHARSET:1252\r\n" "COMPRESSION:NONE\r\n" "OLDFILEUID:NONE\r\n"); GWEN_Buffer_AppendString(buf, "NEWFILEUID:"); GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); GWEN_Buffer_AppendString(buf, "\r\n"); /* header finished */ GWEN_Buffer_AppendString(buf, "\r\n"); /* cleanup */ GWEN_Time_free(ti); /* done */ return 0; } int AO_Provider__AddSignOn(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { GWEN_TIME *ti; const char *s; char userpass[64]; ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); s=AB_User_GetUserId(u); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Missing user id, should not happen"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Missing user id, should not happen")); return GWEN_ERROR_INTERNAL; } /* get password */ userpass[0]=0; while (strlen(userpass)<4) { GWEN_BUFFER *nbuf; int rv; char msg[]=I18S("Please enter the password for user %s" "" "Please enter the password for user %s" ""); char msgbuf[512]; nbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Buffer_AppendString(nbuf, "OFX::userpass::"); GWEN_Buffer_AppendString(nbuf, s); snprintf(msgbuf, sizeof(msgbuf), I18N(msg), s, s); rv=GWEN_Gui_GetPassword(0, GWEN_Buffer_GetStart(nbuf), I18N("Enter Password"), msgbuf, userpass, 4, sizeof(userpass), 0); GWEN_Buffer_free(nbuf); if (rv<0) { memset(userpass, 0, sizeof(userpass)); GWEN_Time_free(ti); return rv; } } /* while */ GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, userpass); GWEN_Buffer_AppendString(buf, "\r\n"); memset(userpass, 0, sizeof(userpass)); GWEN_Buffer_AppendString(buf, "ENG"); /* possibly add FI */ if (!(AO_User_GetFlags(u) & AO_USER_FLAGS_EMPTY_FID)) { if (AO_User_GetFid(u)) { GWEN_Buffer_AppendString(buf, ""); s=AO_User_GetOrg(u); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } s=AO_User_GetFid(u); if (s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } GWEN_Buffer_AppendString(buf, ""); } } /* add APPID */ s=AO_User_GetAppId(u); if (s==NULL || *s==0) s="QWIN"; GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); /* add APPVER */ s=AO_User_GetAppVer(u); if (s==NULL || *s==0) s="1200"; GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); /* add CLIENTUID, if known */ s=AO_User_GetClientUid(u); if (s && *s) { GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, s); } /* close elements */ GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); GWEN_Time_free(ti); return 0; } int AO_Provider__WrapRequest(AB_PROVIDER *pro, AB_USER *u, const char *mTypeName, const char *tTypeName, GWEN_BUFFER *buf) { GWEN_BUFFER *tbuf; GWEN_TIME *ti; tbuf=GWEN_Buffer_new(0, 512, 0, 1); /* begin: msg wrapper */ GWEN_Buffer_AppendString(tbuf, "<"); GWEN_Buffer_AppendString(tbuf, mTypeName); GWEN_Buffer_AppendString(tbuf, "MSGSRQV1>"); /* begin: transaction wrapper */ GWEN_Buffer_AppendString(tbuf, "<"); GWEN_Buffer_AppendString(tbuf, tTypeName); GWEN_Buffer_AppendString(tbuf, "TRNRQ>"); ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(tbuf, ""); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", tbuf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", tbuf); GWEN_Buffer_AppendString(tbuf, "1"); /* append ends of elements to original buffer */ GWEN_Buffer_AppendString(buf, ""); GWEN_Buffer_AppendString(buf, ""); /* go to start of buffer and insert leading elements there */ GWEN_Buffer_SetPos(buf, 0); GWEN_Buffer_InsertBuffer(buf, tbuf); /* point to end of buffer */ GWEN_Buffer_SetPos(buf, GWEN_Buffer_GetUsedBytes(buf)); /* cleanup */ GWEN_Time_free(ti); GWEN_Buffer_free(tbuf); return 0; } int AO_Provider__WrapMessage(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* add headers and "" */ rv=AO_Provider__AddHeaders(pro, u, tbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding headers (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_AppendString(tbuf, ""); rv=AO_Provider__AddSignOn(pro, u, tbuf); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Error adding signon element (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } /* append end of OFX element to original buffer */ GWEN_Buffer_AppendString(buf, ""); /* go to start of buffer and insert leading elements there */ GWEN_Buffer_SetPos(buf, 0); GWEN_Buffer_InsertBuffer(buf, tbuf); /* point to end of buffer */ GWEN_Buffer_SetPos(buf, GWEN_Buffer_GetUsedBytes(buf)); /* cleanup */ GWEN_Buffer_free(tbuf); return 0; } #include "r_statements.c" #include "r_accountinfo.c" aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_newuser_l.h0000644000175000017500000000514112364015477024262 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_NEWUSER_L_H #define AQOFXCONNECT_DLG_NEWUSER_L_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AO_NewUserDialog_new(AB_BANKING *ab); const char *AO_NewUserDialog_GetUserName(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetUserName(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetUserId(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetUserId(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetClientUid(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetClientUid(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetFid(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetFid(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetOrg(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetOrg(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetAppId(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetAppId(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetAppVer(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetAppVer(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetHeaderVer(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetHeaderVer(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetBrokerId(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetBrokerId(GWEN_DIALOG *dlg, const char *s); const char *AO_NewUserDialog_GetUrl(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetUrl(GWEN_DIALOG *dlg, const char *s); int AO_NewUserDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int AO_NewUserDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); uint32_t AO_NewUserDialog_GetFlags(const GWEN_DIALOG *dlg); void AO_NewUserDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AO_NewUserDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AO_NewUserDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); AB_USER *AO_NewUserDialog_GetUser(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_edituser_p.h0000644000175000017500000000400512364015477024420 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_EDITUSER_P_H #define AQOFXCONNECT_DLG_EDITUSER_P_H #include "dlg_edituser_l.h" typedef struct AO_EDITUSER_DIALOG AO_EDITUSER_DIALOG; struct AO_EDITUSER_DIALOG { AB_BANKING *banking; int doLock; char *userName; char *userId; char *url; char *bankName; char *brokerId; char *org; char *fid; char *appId; char *appVer; char *headerVer; char *clientUid; char *securityType; int httpVMajor; int httpVMinor; uint32_t flags; AB_USER *user; }; static void GWENHYWFAR_CB AO_EditUserDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AO_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static void AO_EditUserDialog_Init(GWEN_DIALOG *dlg); static void AO_EditUserDialog_Fini(GWEN_DIALOG *dlg); static int AO_EditUserDialog_GetBankPageData(GWEN_DIALOG *dlg); static int AO_EditUserDialog_GetUserPageData(GWEN_DIALOG *dlg); static int AO_EditUserDialog_GetAppPageData(GWEN_DIALOG *dlg); static int AO_EditUserDialog_FromGui(GWEN_DIALOG *dlg); static int AO_EditUserDialog_HandleActivatedSpecial(GWEN_DIALOG *dlg); static int AO_EditUserDialog_HandleActivatedBankSelect(GWEN_DIALOG *dlg); static int AO_EditUserDialog_HandleActivatedApp(GWEN_DIALOG *dlg); static int AO_EditUserDialog_HandleActivatedGetAccounts(GWEN_DIALOG *dlg); static int AO_EditUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender); static int AO_EditUserDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special_l.h0000644000175000017500000000311412364015477025064 00000000000000/*************************************************************************** begin : Thu Aug 19 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_OFX_SPECIAL_L_H #define AQOFXCONNECT_DLG_OFX_SPECIAL_L_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AO_OfxSpecialDialog_new(AB_BANKING *ab); int AO_OfxSpecialDialog_GetHttpVMajor(const GWEN_DIALOG *dlg); int AO_OfxSpecialDialog_GetHttpVMinor(const GWEN_DIALOG *dlg); void AO_OfxSpecialDialog_SetHttpVersion(GWEN_DIALOG *dlg, int vmajor, int vminor); uint32_t AO_OfxSpecialDialog_GetFlags(const GWEN_DIALOG *dlg); void AO_OfxSpecialDialog_SetFlags(GWEN_DIALOG *dlg, uint32_t fl); void AO_OfxSpecialDialog_AddFlags(GWEN_DIALOG *dlg, uint32_t fl); void AO_OfxSpecialDialog_SubFlags(GWEN_DIALOG *dlg, uint32_t fl); void AO_OfxSpecialDialog_SetClientUid(GWEN_DIALOG *dlg, const char *s); const char *AO_OfxSpecialDialog_GetClientUid(const GWEN_DIALOG *dlg); void AO_OfxSpecialDialog_SetSecurityType(GWEN_DIALOG *dlg, const char *s); const char *AO_OfxSpecialDialog_GetSecurityType(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/account_p.h0000644000175000017500000000137112364015477023405 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AO_ACCOUNT_P_H #define AO_ACCOUNT_P_H #include "account.h" typedef struct AO_ACCOUNT AO_ACCOUNT; struct AO_ACCOUNT { int maxPurposeLines; int debitAllowed; }; static void GWENHYWFAR_CB AO_Account_freeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/dlg_edituser_l.h0000644000175000017500000000154012364015477024415 00000000000000/*************************************************************************** begin : Tue Aug 24 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQOFXCONNECT_DLG_EDITUSER_L_H #define AQOFXCONNECT_DLG_EDITUSER_L_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AO_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml.in0000644000175000017500000000045512364015477025102 00000000000000 @AQOFXCONNECT_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) OFX-DirectConnect backend This backend provides support for OFX-DirectConnect. aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/Makefile.am0000644000175000017500000000056212364015477022020 00000000000000SUBDIRS=plugin EXTRA_DIST=ChangeLog README version.h.in iheaderdir=@aqbanking_headerdir_am@/aqofxconnect iheader_HEADERS=\ version.h BUILT_SOURCES = version.h CLEANFILES = $(BUILT_SOURCES) sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: $(BUILT_SOURCES) for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/version.h0000644000175000017500000000154512643540104021612 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQOFXCONNECT_VERSION_H #define AQOFXCONNECT_VERSION_H #define AQOFXCONNECT_VERSION_MAJOR 5 #define AQOFXCONNECT_VERSION_MINOR 6 #define AQOFXCONNECT_VERSION_PATCHLEVEL 4 #define AQOFXCONNECT_VERSION_BUILD 0 #define AQOFXCONNECT_VERSION_TAG "beta" #define AQOFXCONNECT_VERSION_FULL_STRING "5.6.4.0beta" #define AQOFXCONNECT_VERSION_STRING "5.6.4" #endif /* AQOFXCONNECT_VERSION_H */ aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/ChangeLog0000644000175000017500000000240112364015477021530 00000000000000 2005/07/13: Martin Preuss ------------------------------------------------- - removed some debugging messages 2005/07/10: Martin Preuss ------------------------------------------------- - removed some debugging messages 2005/04/30: Martin Preuss ------------------------------------------------- - handled Christian's FIXMEs - fixed function AO_Provider_FindMyBank(): It now searches the account list of a bank for the requested bank id if the bank itself doesn't have any - fixed AO_Context_Update(): Now the bank id from the bank is only used if it represents a number. If the context contains a valid pointer to a job then the bank id is taken from the account instead 2005-04-29 Christian Stimming * src/plugin/provider.c: Mark potential bugs as FIXME that are shown by compiler warnings about uninitialized variables. * Makefile.am: Copy po catalog rules from aqbanking. 2005/04/22: Martin Preuss ------------------------------------------------- - fixed many bugs - added many functions which are needed by the setup wizard 2005/04/21: Martin Preuss ------------------------------------------------- - initial import aqbanking-5.6.4beta/src/plugins/backends/aqofxconnect/README0000644000175000017500000000000012364015477020627 00000000000000aqbanking-5.6.4beta/src/plugins/backends/Makefile.am0000644000175000017500000000060212364015477017323 00000000000000SUBDIRS = $(aqbanking_plugins_backends_dirs) DIST_SUBDIRS = aqhbci aqofxconnect aqnone aqebics noinst_LTLIBRARIES=libbackends.la libbackends_la_SOURCES=dummy.c libbackends_la_LIBADD=$(aqbanking_plugins_backends_libs) sources: for d in $(DIST_SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(DIST_SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/plugins/imexporters/0000755000175000017500000000000012643540655016161 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/eri2/0000755000175000017500000000000012643540654017021 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/eri2/eri2_p.h0000644000175000017500000000531712364015477020300 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Thu 21-07-2005 copyright : (C) 2005 by Peter de Vrijer email : pdevrijer@home.nl *************************************************************************** * Please see the file COPYING in this directory for license details * ***************************************************************************/ #ifndef AQBANKING_IMEX_ERI2_P_H #define AQBANKING_IMEX_ERI2_P_H #define AB_ERI2_XMLFILE "eriformat.xml" /* for debugging */ #define ERI2DEBUG #define AH_IMEXPORTER_ERI2_MAXLEVEL 16 #include #include #include typedef struct AB_IMEXPORTER_ERI2 AB_IMEXPORTER_ERI2; struct AB_IMEXPORTER_ERI2 { GWEN_MSGENGINE *msgEngine; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_eri2_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterERI2_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AB_ImExporterERI2_FreeData(void *bp, void *p); static int AB_ImExporterERI2_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AB_ImExporterERI2__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams); static int AB_ImExporterERI2__HandleRec1(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t); static int AB_ImExporterERI2__HandleRec2(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t); static int AB_ImExporterERI2__HandleRec3(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t); static int AB_ImExporterERI2__HandleRec4(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t); static void AB_ImExporterERI2__AddPurpose(AB_TRANSACTION *t, const char *s); static void AB_ImExporterERI2__AddTransaction(AB_IMEXPORTER_CONTEXT *ctx, AB_TRANSACTION *t, GWEN_DB_NODE *params); static int AB_ImExporterERI2_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AB_ImExporterERI2_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); #endif /* AQBANKING_IMEX_ERI2_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/eri2/profiles/0000755000175000017500000000000012643540654020644 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/eri2/profiles/Makefile.in0000644000175000017500000005032012643540062022622 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/eri2/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/eri/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/eri2/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/eri2/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/eri2/profiles/default.conf.in0000644000175000017500000000050412364015477023463 00000000000000 char name="default" char shortDescr="default Rabobank ERI (mut.asc)" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the ERI format used by Rabobank mut.asc files" int import="1" int export="0" # default bank name bankName="Rabobank" currency="EUR" dateFormat="hhmmssYYYYMMDD" params { } aqbanking-5.6.4beta/src/plugins/imexporters/eri2/profiles/Makefile.am0000644000175000017500000000017012364015477022616 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/eri/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/eri2/Makefile.in0000644000175000017500000010246112643540062021003 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/eri2 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/eri2.xml.in $(top_srcdir)/depcomp \ $(dist_imexporterdata_DATA) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = eri2.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterdatadir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = eri2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_eri2_la_OBJECTS = eri2.lo eri2_la_OBJECTS = $(am_eri2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = eri2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(eri2_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(eri2_la_SOURCES) DIST_SOURCES = $(eri2_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dist_imexporterdata_DATA) $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST = eriformat.xml noinst_HEADERS = eri2_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = eri2.la imexporterplugin_DATA = eri2.xml imexporterdatadir = $(aqbanking_pkgdatadir)/imexporters/eri2 dist_imexporterdata_DATA = eriformat.xml eri2_la_SOURCES = eri2.c eri2_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) eri2_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/eri2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/eri2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): eri2.xml: $(top_builddir)/config.status $(srcdir)/eri2.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } eri2.la: $(eri2_la_OBJECTS) $(eri2_la_DEPENDENCIES) $(EXTRA_eri2_la_DEPENDENCIES) $(AM_V_CCLD)$(eri2_la_LINK) -rpath $(imexporterplugindir) $(eri2_la_OBJECTS) $(eri2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eri2.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_imexporterdataDATA: $(dist_imexporterdata_DATA) @$(NORMAL_INSTALL) @list='$(dist_imexporterdata_DATA)'; test -n "$(imexporterdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterdatadir)" || exit $$?; \ done uninstall-dist_imexporterdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_imexporterdata_DATA)'; test -n "$(imexporterdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterdatadir)'; $(am__uninstall_files_from_dir) install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterdatadir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_imexporterdataDATA \ install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_imexporterdataDATA \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_imexporterdataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-dist_imexporterdataDATA \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(eri2_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/eri2/Makefile.am0000644000175000017500000000134012364015477020773 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST=eriformat.xml noinst_HEADERS=eri2_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=eri2.la imexporterplugin_DATA=eri2.xml imexporterdatadir=$(aqbanking_pkgdatadir)/imexporters/eri2 dist_imexporterdata_DATA=eriformat.xml eri2_la_SOURCES=eri2.c eri2_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) eri2_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(eri2_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/eri2/eriformat.xml0000644000175000017500000000724212364015477021460 00000000000000 %code 99999 99999 0 0 0000 99999 99 Lines 1-2 of description Number of RecordType3 records to follow %code 99999 99999 0 Lines 3-5 or 6 of description %code 99999 99999 0 aqbanking-5.6.4beta/src/plugins/imexporters/eri2/eri2.c0000644000175000017500000004034512364015477017754 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "eri2_p.h" #include #include #include #include #include #include #include #include #include #include #include "i18n_l.h" #include #include #include #include #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif #define AB_IMEXPORTER_ERI2_CHECKBUF_LENGTH 128 GWEN_INHERIT(AB_IMEXPORTER, AB_IMEXPORTER_ERI2) GWEN_PLUGIN *imexporter_eri2_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterERI2_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterERI2_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AB_IMEXPORTER_ERI2 *ieh; GWEN_STRINGLIST *paths; ie=AB_ImExporter_new(ab, "eri2"); GWEN_NEW_OBJECT(AB_IMEXPORTER_ERI2, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AB_IMEXPORTER_ERI2, ie, ieh, AB_ImExporterERI2_FreeData); paths=AB_Banking_GetGlobalDataDirs(); if (paths) { GWEN_BUFFER *fbuf; int rv; fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Directory_FindFileInPaths(paths, "aqbanking" DIRSEP "imexporters" DIRSEP "eri2" DIRSEP AB_ERI2_XMLFILE, fbuf); GWEN_StringList_free(paths); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "XML data file not found (%d)", rv); GWEN_Buffer_free(fbuf); return NULL; } else { GWEN_XMLNODE *xmlNode; xmlNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); rv=GWEN_XML_ReadFile(xmlNode, GWEN_Buffer_GetStart(fbuf), GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load XML file [%s]: %d.\n", GWEN_Buffer_GetStart(fbuf), rv); GWEN_XMLNode_free(xmlNode); GWEN_Buffer_free(fbuf); return NULL; } GWEN_Buffer_free(fbuf); ieh->msgEngine = AB_MsgEngine_new(); GWEN_MsgEngine_SetDefinitions(ieh->msgEngine, xmlNode, 1); AB_ImExporter_SetImportFn(ie, AB_ImExporterERI2_Import); AB_ImExporter_SetExportFn(ie, AB_ImExporterERI2_Export); AB_ImExporter_SetCheckFileFn(ie, AB_ImExporterERI2_CheckFile); return ie; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No data files found."); AB_ImExporter_free(ie); return NULL; } } void GWENHYWFAR_CB AB_ImExporterERI2_FreeData(void *bp, void *p){ AB_IMEXPORTER_ERI2 *ieh; ieh=(AB_IMEXPORTER_ERI2*)p; GWEN_FREE_OBJECT(ieh); } int AB_ImExporterERI2_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AB_IMEXPORTER_ERI2 *ieh; GWEN_DB_NODE *dbData; int rv; GWEN_BUFFER *mbuf; GWEN_FAST_BUFFER *fb; assert(ie); ieh = GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AB_IMEXPORTER_ERI2, ie); assert(ieh); mbuf = GWEN_Buffer_new(0, 1024, 0, 1); dbData = GWEN_DB_Group_new("transactions"); fb=GWEN_FastBuffer_new(512, sio); /* parse into db */ for (;;) { int rv; int c; GWEN_Buffer_Reset(mbuf); GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c==GWEN_ERROR_EOF) break; else if (c==26) { GWEN_FASTBUFFER_READBYTE(fb, c); break; } else if (c<0) { DBG_ERROR(0, "Error reading message"); GWEN_FastBuffer_free(fb); GWEN_Buffer_free(mbuf); GWEN_DB_Group_free(dbData); return c; } rv=GWEN_FastBuffer_ReadLineToBuffer(fb, mbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_FastBuffer_free(fb); GWEN_Buffer_free(mbuf); GWEN_DB_Group_free(dbData); return rv; } GWEN_Buffer_Rewind(mbuf); rv = GWEN_MsgEngine_ReadMessage(ieh->msgEngine, "SEG", mbuf, dbData, 0); if (rv) { GWEN_FastBuffer_free(fb); GWEN_Buffer_free(mbuf); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } } GWEN_FastBuffer_free(fb); GWEN_Buffer_free(mbuf); /* import from db */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Data imported, transforming to UTF-8")); rv=AB_ImExporter_DbFromIso8859_1ToUtf8(dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error converting data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Transforming data to transactions"); rv = AB_ImExporterERI2__ImportFromGroup(ctx, dbData, params); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } const char* AB_ImExporterERI2__StripPZero(const char *p) { while ((*p == '0') || (*p == 'P')) p++; return p; } int AB_ImExporterERI2__HandleRec1(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t) { const char *p; const char *dateFormat; int inUtc; dateFormat = GWEN_DB_GetCharValue(dbParams, "dateFormat", 0, "YYMMDD"); inUtc = GWEN_DB_GetIntValue(dbParams, "utc", 0, 0); /* strip leading zeroes from localaccountnumber can be removed when lfiller="48" does what I expect from i */ p = GWEN_DB_GetCharValue(dbT, "localAccountNumber", 0, 0); p = AB_ImExporterERI2__StripPZero(p); AB_Transaction_SetLocalAccountNumber(t, p); /* strip leading P and zeroes from remoteaccountnumber this CANNOT be done with lfiller="48" becaus of the P added to Postgiro accounts */ p = GWEN_DB_GetCharValue(dbT, "remoteAccountNumber", 0, 0); p = AB_ImExporterERI2__StripPZero(p); #ifdef ERI2DEBUG printf("Remote Account Number after StripPZero is %s\n", p); #endif AB_Transaction_SetRemoteAccountNumber(t, p); /* translate value */ p = GWEN_DB_GetCharValue(dbT, "Amount", 0, 0); if (p) { AB_VALUE *v; AB_VALUE *v2; /* divide by 100 */ v=AB_Value_fromString(p); v2=AB_Value_fromDouble(100.0); AB_Value_DivValue(v, v2); AB_Value_free(v2); AB_Value_SetCurrency(v, GWEN_DB_GetCharValue(dbT, "currency", 0, "EUR")); AB_Transaction_SetValue(t, v); AB_Value_free(v); } /* translate date */ p = GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) { GWEN_TIME *ti; ti = AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } /* translate valutaDate */ p = GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) { GWEN_TIME *ti; ti = AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); } /* possibly translate value */ p = GWEN_DB_GetCharValue(dbT, "Sign", 0, 0); if (p) { int determined=0; int j; /* get positive/negative mark */ /* try positive marks first */ for (j=0; ; j++) { const char *patt; patt = GWEN_DB_GetCharValue(dbParams, "positiveValues", j, 0); if (!patt) { if (j == 0) patt = "C"; else break; } if (-1 != GWEN_Text_ComparePattern(p, patt, 0)) { /* value already is positive, keep it that way */ determined = 1; break; } } /* for */ if (!determined) { for (j=0; ; j++) { const char *patt; patt = GWEN_DB_GetCharValue(dbParams, "negativeValues", j, 0); if (!patt) { if (j == 0) patt = "D"; else break; } if (-1 != GWEN_Text_ComparePattern(p, patt, 0)) { const AB_VALUE *pv; /* value must be negated */ pv = AB_Transaction_GetValue(t); if (pv) { AB_VALUE *v; v = AB_Value_dup(pv); AB_Value_Negate(v); AB_Transaction_SetValue(t, v); AB_Value_free(v); } determined = 1; break; } } /* for */ } } /* if sign mark */ return 0; } void AB_ImExporterERI2__AddPurpose(AB_TRANSACTION *t, const char *s) { if (strlen(s) > 0) AB_Transaction_AddPurpose(t, s, 0); } int AB_ImExporterERI2__HandleRec2(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t) { const char *p; p = GWEN_DB_GetCharValue(dbT, "purpose1", 0, 0); if (p) AB_ImExporterERI2__AddPurpose(t, p); p = GWEN_DB_GetCharValue(dbT, "purpose2", 0, 0); if (p) AB_ImExporterERI2__AddPurpose(t, p); return 0; } int AB_ImExporterERI2__HandleRec3(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t) { const char *p; p = GWEN_DB_GetCharValue(dbT, "purpose3", 0, 0); if (p) AB_ImExporterERI2__AddPurpose(t, p); p = GWEN_DB_GetCharValue(dbT, "purpose4", 0, 0); if (p) AB_ImExporterERI2__AddPurpose(t, p); p = GWEN_DB_GetCharValue(dbT, "purpose5", 0, 0); if (p) AB_ImExporterERI2__AddPurpose(t, p); return 0; } int AB_ImExporterERI2__HandleRec4(GWEN_DB_NODE *dbT, GWEN_DB_NODE *dbParams, AB_TRANSACTION *t) { const char *p1, *p2, *p3; GWEN_BUFFER *pbuf; char strbuf[97]; unsigned int strlen = 0, *ps = &strlen; pbuf = GWEN_Buffer_new(0, 96, 0, 1); p1 = GWEN_DB_GetCharValue(dbT, "purpose3", 0, 0); p2 = GWEN_DB_GetCharValue(dbT, "purpose4", 0, 0); p3 = GWEN_DB_GetCharValue(dbT, "purpose5", 0, 0); if (p1) GWEN_Buffer_AppendString(pbuf, p1); if (GWEN_Buffer_GetUsedBytes(pbuf) < 32) GWEN_Buffer_AppendString(pbuf, " "); if (p2) GWEN_Buffer_AppendString(pbuf, p2); if (GWEN_Buffer_GetUsedBytes(pbuf) < 64) GWEN_Buffer_AppendString(pbuf, " "); if (p3) GWEN_Buffer_AppendString(pbuf, p3); strlen = GWEN_Buffer_GetUsedBytes(pbuf); if (strlen) { GWEN_Buffer_Rewind(pbuf); GWEN_Buffer_ReadBytes(pbuf, strbuf, ps); strbuf[strlen] = 0; AB_ImExporterERI2__AddPurpose(t, strbuf); } GWEN_Buffer_free(pbuf); return 0; } void AB_ImExporterERI2__AddTransaction(AB_IMEXPORTER_CONTEXT *ctx, AB_TRANSACTION *t, GWEN_DB_NODE *params) { AB_IMEXPORTER_ACCOUNTINFO *iea = 0; const char *bankName; const char *la; bankName = GWEN_DB_GetCharValue(params, "bankName", 0, "Rabobank"); /* Search if account number is already in context If so add transaction there, else make new account number in context. */ iea = AB_ImExporterContext_GetFirstAccountInfo(ctx); la = AB_Transaction_GetLocalAccountNumber(t); assert(la); while(iea) { if (strcmp(AB_ImExporterAccountInfo_GetAccountNumber(iea), AB_Transaction_GetLocalAccountNumber(t))==0) break; iea = AB_ImExporterContext_GetNextAccountInfo(ctx); } if (!iea) { /* Not found, add it */ iea = AB_ImExporterAccountInfo_new(); AB_ImExporterContext_AddAccountInfo(ctx, iea); AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_Bank); AB_ImExporterAccountInfo_SetBankName(iea, bankName); AB_ImExporterAccountInfo_SetAccountNumber(iea, la); } /* Add it to the AccountInfo List */ AB_ImExporterAccountInfo_AddTransaction(iea, t); } int AB_ImExporterERI2__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams) { GWEN_DB_NODE *dbT; dbT = GWEN_DB_FindFirstGroup(db, "RecordType1"); while(dbT) { if (GWEN_DB_GetCharValue(dbT, "amount", 0, 0)) { AB_TRANSACTION *t; GWEN_DB_NODE *dbN; int rv; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Found a possible transaction"); t = AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in config file"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error in config file"); return GWEN_ERROR_GENERIC; } rv = AB_ImExporterERI2__HandleRec1(dbT, dbParams, t); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Transaction_free(t); return rv; } /* check whether the next group is of record type 2 */ dbN = GWEN_DB_GetNextGroup(dbT); if (dbN) { if (strcasecmp(GWEN_DB_GroupName(dbN), "RecordType2") == 0) { int num3; int i; rv = AB_ImExporterERI2__HandleRec2(dbN, dbParams, t); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Transaction_free(t); return rv; } num3 = GWEN_DB_GetIntValue(dbN, "NumberOfExtraRecords", 0, 0); for (i = 0; i < num3; i++) { dbN = GWEN_DB_GetNextGroup(dbN); if (!dbN) break; else { if (strcasecmp(GWEN_DB_GroupName(dbN), "RecordType1") == 0) break; if (strcasecmp(GWEN_DB_GroupName(dbN), "RecordType3") == 0) { if (!i) { rv = AB_ImExporterERI2__HandleRec3(dbN, dbParams, t); } else { rv = AB_ImExporterERI2__HandleRec4(dbN, dbParams, t); } if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Transaction_free(t); return rv; } } } } /* for */ if (i != num3) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing records (have %d of %d)", i, num3); AB_Transaction_free(t); return rv; } } /* if type 2 follows */ } /* if any group follows */ DBG_NOTICE(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_ImExporterERI2__AddTransaction(ctx, t, dbParams); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Empty group"); GWEN_DB_Dump(dbT, 2); } dbT=GWEN_DB_FindNextGroup(dbT, "RecordType1"); } // while return 0; } int AB_ImExporterERI2_CheckFile(AB_IMEXPORTER *ie, const char *fname){ GWEN_BUFFER *lbuffer; AB_IMEXPORTER_ERI2 *ieh; GWEN_SYNCIO *sio; GWEN_SYNCIO *baseIo; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AB_IMEXPORTER_ERI2, ie); assert(ieh); assert(fname); sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); baseIo=sio; sio=GWEN_SyncIo_Buffered_new(baseIo); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { /* error */ DBG_ERROR(AQBANKING_LOGDOMAIN, "open(%s): %s", fname, strerror(errno)); return GWEN_ERROR_IO; } lbuffer=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_SyncIo_Buffered_ReadLineToBuffer(sio, lbuffer); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "File \"%s\" is not supported by this plugin", fname); GWEN_Buffer_free(lbuffer); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } if ( -1 != GWEN_Text_ComparePattern(GWEN_Buffer_GetStart(lbuffer), "*EUR99999999992000*", 0)) { /* match */ DBG_INFO(AQBANKING_LOGDOMAIN, "File \"%s\" is supported by this plugin", fname); GWEN_Buffer_free(lbuffer); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } GWEN_Buffer_free(lbuffer); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } int AB_ImExporterERI2_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AB_IMEXPORTER_ERI2 *ieh; assert(ie); ieh = GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AB_IMEXPORTER_ERI2, ie); assert(ieh); return GWEN_ERROR_GENERIC; } aqbanking-5.6.4beta/src/plugins/imexporters/eri2/eri2.xml.in0000644000175000017500000000041512364015477020731 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss (martin@aquamaniac.de) ERI This plugin imports ERI data. aqbanking-5.6.4beta/src/plugins/imexporters/ofx/0000755000175000017500000000000012643540654016754 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/ofx/ofx-internal_p.h0000644000175000017500000000254512364015477022000 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: ofx_p.h 1396 2007-11-22 17:37:27Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_PLUGIN_OFX_P_H #define AQBANKING_PLUGIN_OFX_P_H #include typedef struct AH_IMEXPORTER_OFX AH_IMEXPORTER_OFX; struct AH_IMEXPORTER_OFX { GWEN_DB_NODE *dbData; AB_IMEXPORTER_CONTEXT *context; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_ofx_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterOFX_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterOFX_FreeData(void *bp, void *p); static int AH_ImExporterOFX_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterOFX_CheckFile(AB_IMEXPORTER *ie, const char *fname); #endif /* AQBANKING_PLUGIN_OFX_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/ofx/ofx.xml.in0000644000175000017500000000041412364015477020616 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) OFX This plugin imports OFX data. aqbanking-5.6.4beta/src/plugins/imexporters/ofx/profiles/0000755000175000017500000000000012643540654020577 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/ofx/profiles/iso8859.conf.in0000644000175000017500000000040612364015477023123 00000000000000 char name="iso8859" char shortDescr="Profile for ISO-8859-15 files" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for files encoded with ISO8859-15 (e.g. with umlauts)" int import="1" int export="0" params { char charset="ISO-8859-15" } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/profiles/Makefile.in0000644000175000017500000005062412643540062022564 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/ofx/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in $(srcdir)/iso8859.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf iso8859.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in iso8859.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/ofx/profiles profiles_DATA = default.conf iso8859.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ iso8859.conf: $(top_builddir)/config.status $(srcdir)/iso8859.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/ofx/profiles/default.conf.in0000644000175000017500000000025512364015477023421 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="Default profile" int import="1" int export="0" params { } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/profiles/Makefile.am0000644000175000017500000000022512364015477022552 00000000000000 EXTRA_DIST=default.conf.in iso8859.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/ofx/profiles profiles_DATA=default.conf iso8859.conf aqbanking-5.6.4beta/src/plugins/imexporters/ofx/Makefile.in0000644000175000017500000010050412643540062020732 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/ofx DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/ofx.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = ofx.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = ofx_la_DEPENDENCIES = parser/libofxparser.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_ofx_la_OBJECTS = ofx.lo ofx_la_OBJECTS = $(am_ofx_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ofx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ofx_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ofx_la_SOURCES) DIST_SOURCES = $(ofx_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = parser profiles # Include the source code files here as well. It doesnt hurt to # include them twice in the dist target. EXTRA_DIST = \ ofx.c \ ofx-internal.c ofx-internal_p.h \ ofx.xml.in INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) -Iparser -I$(srcdir)/parser #EXTRA_DIST=README noinst_HEADERS = ofx-internal_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = ofx.la imexporterplugin_DATA = ofx.xml ofx_la_SOURCES = ofx.c ofx_la_LIBADD = parser/libofxparser.la $(aqbanking_internal_libs) $(gwenhywfar_libs) ofx_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ofx.xml: $(top_builddir)/config.status $(srcdir)/ofx.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ofx.la: $(ofx_la_OBJECTS) $(ofx_la_DEPENDENCIES) $(EXTRA_ofx_la_DEPENDENCIES) $(AM_V_CCLD)$(ofx_la_LINK) -rpath $(imexporterplugindir) $(ofx_la_OBJECTS) $(ofx_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ofx.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(ofx_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/ofx/ofx-internal.c0000644000175000017500000001014412364015477021446 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: ofx.c 1411 2008-01-06 17:54:41Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ofx-internal_p.h" #include "ofxxmlctx_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_OFX); GWEN_PLUGIN *imexporter_ofx_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterOFX_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterOFX_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_OFX *ieh; ie=AB_ImExporter_new(ab, "ofx"); GWEN_NEW_OBJECT(AH_IMEXPORTER_OFX, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OFX, ie, ieh, AH_ImExporterOFX_FreeData); AB_ImExporter_SetImportFn(ie, AH_ImExporterOFX_Import); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterOFX_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterOFX_FreeData(void *bp, void *p){ AH_IMEXPORTER_OFX *ieh; ieh=(AH_IMEXPORTER_OFX*)p; GWEN_FREE_OBJECT(ieh); } int AH_ImExporterOFX_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_OFX *ieh; int rv; GWEN_XML_CONTEXT *xmlCtx; const char *s; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OFX, ie); assert(ieh); /* this context does the real work, it sets some callbacks which * make GWEN's normal XML code read an OFX file */ xmlCtx=AIO_OfxXmlCtx_new(0, ctx); assert(xmlCtx); /* possibly set charset */ s=GWEN_DB_GetCharValue(params, "charset", 0, NULL); if (s && *s) AIO_OfxXmlCtx_SetCharset(xmlCtx, s); /* read OFX file into context */ rv=GWEN_XMLContext_ReadFromIo(xmlCtx, sio); GWEN_XmlCtx_free(xmlCtx); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AH_ImExporterOFX_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_OFX *ieh; GWEN_SYNCIO *sio; int rv; uint8_t tbuf[256]; assert(ie); assert(fname); assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OFX, ie); assert(ieh); sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } rv=GWEN_SyncIo_Read(sio, tbuf, sizeof(tbuf)-1); if (rv<1) { DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" is not supported by this plugin", fname); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } tbuf[rv-1]=0; if (-1!=GWEN_Text_ComparePattern((const char*)tbuf, "**", 0) || -1!=GWEN_Text_ComparePattern((const char*)tbuf, "**", 0)) { /* match */ DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" is supported by this plugin", fname); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/Makefile.am0000644000175000017500000000161112364015477020727 00000000000000SUBDIRS=parser profiles # Include the source code files here as well. It doesnt hurt to # include them twice in the dist target. EXTRA_DIST=\ ofx.c \ ofx-internal.c ofx-internal_p.h \ ofx.xml.in INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) -Iparser -I$(srcdir)/parser #EXTRA_DIST=README noinst_HEADERS=ofx-internal_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=ofx.la imexporterplugin_DATA=ofx.xml ofx_la_SOURCES=ofx.c ofx_la_LIBADD = parser/libofxparser.la $(aqbanking_internal_libs) $(gwenhywfar_libs) ofx_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done for f in $(ofx_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/ofx/ofx.c0000644000175000017500000000105212364015477017632 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ofx-internal.c" aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/0000755000175000017500000000000012643540654020250 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtran_l.h0000644000175000017500000000147712364015477022654 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVTRAN_L_H #define AIO_OFX_G_INVTRAN_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVTRAN_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_INVTRAN_TakeData(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_banktranlist.c0000644000175000017500000001124312364015477023337 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_banktranlist_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_bankacc_l.h" #include "g_stmtrn_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST) AIO_OFX_GROUP *AIO_OfxGroup_BANKTRANLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BANKTRANLIST *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BANKTRANLIST, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST, g, xg, AIO_OfxGroup_BANKTRANLIST_FreeData); xg->transactionList=AB_Transaction_List2_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BANKTRANLIST_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BANKTRANLIST_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_BANKTRANLIST_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BANKTRANLIST_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BANKTRANLIST *xg; xg=(AIO_OFX_GROUP_BANKTRANLIST*)p; assert(xg); AB_Transaction_List2_freeAll(xg->transactionList); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } AB_TRANSACTION_LIST2* AIO_OfxGroup_BANKTRANLIST_TakeTransactionList(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKTRANLIST *xg; AB_TRANSACTION_LIST2 *tl; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST, g); assert(xg); tl=xg->transactionList; xg->transactionList=NULL; return tl; } int AIO_OfxGroup_BANKTRANLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BANKTRANLIST *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "DTSTART")==0 || strcasecmp(tagName, "DTEND")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "STMTTRN")==0) { gNew=AIO_OfxGroup_STMTRN_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_BANKTRANLIST_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BANKTRANLIST *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "DTSTART")==0) { free(xg->dtstart); xg->dtstart=strdup(s); } else if (strcasecmp(xg->currentElement, "DTEND")==0) { free(xg->dtend); xg->dtend=strdup(s); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_BANKTRANLIST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_BANKTRANLIST *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKTRANLIST, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "STMTTRN")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_STMTRN_TakeTransaction(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_Transaction_List2_PushBack(xg->transactionList, t); } } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posstock.c0000644000175000017500000000427712364015477022521 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_posstock_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invpos_l.h" #include "i18n_l.h" #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_POSSTOCK_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_POSSTOCK_StartTag); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_POSSTOCK_EndSubGroup); return g; } int AIO_OfxGroup_POSSTOCK_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "INVPOS")==0) { gNew=AIO_OfxGroup_INVPOS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_POSSTOCK_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { const char *s; GWEN_XML_CONTEXT *ctx; ctx=AIO_OfxGroup_GetXmlContext(g); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVPOS")==0) { AB_SECURITY *sec; sec=AIO_OfxGroup_INVPOS_TakeSecurity(sg); if (sec) { AB_IMEXPORTER_CONTEXT *ioCtx; ioCtx=AIO_OfxXmlCtx_GetIoContext(ctx); DBG_INFO(AQBANKING_LOGDOMAIN, "Adding security"); AB_ImExporterContext_AddSecurity(ioCtx, sec); } } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxxmlctx_p.h0000644000175000017500000000272512364015477022722 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_OFXXMLCTX_P_H #define AIO_OFX_OFXXMLCTX_P_H #include "ofxxmlctx_l.h" typedef struct AIO_OFX_XMLCTX AIO_OFX_XMLCTX; struct AIO_OFX_XMLCTX { /* answers for SIGNON */ int resultCode; char *resultSeverity; AB_IMEXPORTER_CONTEXT *ioContext; AIO_OFX_GROUP *currentGroup; char *currentTagName; char *charset; int startDepthOfOfxElement; }; static void GWENHYWFAR_CB AIO_OfxXmlCtx_FreeData(void *bp, void *p); static int AIO_OfxXmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName); static int AIO_OfxXmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing); static int AIO_OfxXmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data); static int AIO_OfxXmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data); static int AIO_OfxXmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData); static int AIO_OfxXmlCtx_CleanupData(GWEN_XML_CONTEXT *ctx, const char *data, GWEN_BUFFER *buf); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmttrnrs_l.h0000644000175000017500000000127012364015477023757 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTTRNRS_L_H #define AIO_OFX_G_INVSTMTTRNRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtrs_l.h0000644000175000017500000000125112364015477023232 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTRS_L_H #define AIO_OFX_G_INVSTMTRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_sonrs_l.h0000644000175000017500000000124312364015477022326 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SONRS_L_H #define AIO_OFX_G_SONRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SONRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ignore_p.h0000644000175000017500000000177212364015477022460 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_IGNORE_P_H #define AIO_OFX_G_IGNORE_P_H #include "g_ignore_l.h" #include typedef struct AIO_OFX_GROUP_IGNORE AIO_OFX_GROUP_IGNORE; struct AIO_OFX_GROUP_IGNORE { GWEN_STRINGLIST *openTags; }; static void GWENHYWFAR_CB AIO_OfxGroup_Ignore_FreeData(void *bp, void *p); static int AIO_OfxGroup_Ignore_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_Ignore_EndTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_Ignore_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxxmlctx.c0000644000175000017500000002633612364015477022402 00000000000000/*************************************************************************** begin : Mon Jan 07 2008 copyright : (C) 2008,2012 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ofxxmlctx_p.h" #include "g_document_l.h" #include #include #include GWEN_INHERIT(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX) GWEN_XML_CONTEXT *AIO_OfxXmlCtx_new(uint32_t flags, AB_IMEXPORTER_CONTEXT *ioContext) { GWEN_XML_CONTEXT *ctx; AIO_OFX_XMLCTX *xctx; AIO_OFX_GROUP *g; /* create base object */ ctx=GWEN_XmlCtx_new(flags); assert(ctx); /* create and assign extension */ GWEN_NEW_OBJECT(AIO_OFX_XMLCTX, xctx); assert(xctx); GWEN_INHERIT_SETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx, xctx, AIO_OfxXmlCtx_FreeData); xctx->ioContext=ioContext; /* set virtual functions */ GWEN_XmlCtx_SetStartTagFn(ctx, AIO_OfxXmlCtx_StartTag); GWEN_XmlCtx_SetEndTagFn(ctx, AIO_OfxXmlCtx_EndTag); GWEN_XmlCtx_SetAddDataFn(ctx, AIO_OfxXmlCtx_AddData); GWEN_XmlCtx_SetAddCommentFn(ctx, AIO_OfxXmlCtx_AddComment); GWEN_XmlCtx_SetAddAttrFn(ctx, AIO_OfxXmlCtx_AddAttr); /* create initial group */ g=AIO_OfxGroup_Document_new("OFX_FILE", NULL, ctx); assert(g); AIO_OfxXmlCtx_SetCurrentGroup(ctx, g); /* return base object */ return ctx; } GWENHYWFAR_CB void AIO_OfxXmlCtx_FreeData(void *bp, void *p) { AIO_OFX_XMLCTX *xctx; AIO_OFX_GROUP *g; xctx=(AIO_OFX_XMLCTX*)p; g=xctx->currentGroup; while (g) { AIO_OFX_GROUP *gParent; gParent=AIO_OfxGroup_GetParent(g); AIO_OfxGroup_free(g); g=gParent; } free(xctx->resultSeverity); free(xctx->currentTagName); free(xctx->charset); GWEN_FREE_OBJECT(xctx); } const char *AIO_OfxXmlCtx_GetCharset(const GWEN_XML_CONTEXT *ctx) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->charset; } void AIO_OfxXmlCtx_SetCharset(GWEN_XML_CONTEXT *ctx, const char *s) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); free(xctx->charset); if (s) xctx->charset=strdup(s); else xctx->charset=NULL; } int AIO_OfxXmlCtx_GetResultCode(const GWEN_XML_CONTEXT *ctx) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->resultCode; } void AIO_OfxXmlCtx_SetResultCode(GWEN_XML_CONTEXT *ctx, int i) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); xctx->resultCode=i; } const char *AIO_OfxXmlCtx_GetResultSeverity(const GWEN_XML_CONTEXT *ctx) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->resultSeverity; } void AIO_OfxXmlCtx_SetResultSeverity(GWEN_XML_CONTEXT *ctx, const char *s) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); free(xctx->resultSeverity); if (s) xctx->resultSeverity=strdup(s); else xctx->resultSeverity=NULL; } AB_IMEXPORTER_CONTEXT* AIO_OfxXmlCtx_GetIoContext(const GWEN_XML_CONTEXT *ctx){ AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->ioContext; } AIO_OFX_GROUP *AIO_OfxXmlCtx_GetCurrentGroup(const GWEN_XML_CONTEXT *ctx) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->currentGroup; } void AIO_OfxXmlCtx_SetCurrentGroup(GWEN_XML_CONTEXT *ctx, AIO_OFX_GROUP *g){ AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); xctx->currentGroup=g; } const char *AIO_OfxXmlCtx_GetCurrentTagName(const GWEN_XML_CONTEXT *ctx) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); return xctx->currentTagName; } void AIO_OfxXmlCtx_SetCurrentTagName(GWEN_XML_CONTEXT *ctx, const char *s) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); free(xctx->currentTagName); if (s) xctx->currentTagName=strdup(s); else xctx->currentTagName=NULL; } int AIO_OfxXmlCtx_CleanupData(GWEN_XML_CONTEXT *ctx, const char *data, GWEN_BUFFER *buf) { const uint8_t *p; uint8_t *dst; uint8_t *src; unsigned int size; unsigned int i; int lastWasBlank; uint8_t *lastBlankPos; uint32_t bStart=0; if (GWEN_Text_UnescapeXmlToBuffer(data, buf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return GWEN_ERROR_BAD_DATA; } dst=(uint8_t*)GWEN_Buffer_GetStart(buf); src=dst; /* skip leading blanks */ while(*src && (*src<33 || *src>=127)) src++; p=src; bStart=src-((uint8_t*)GWEN_Buffer_GetStart(buf)); size=GWEN_Buffer_GetUsedBytes(buf)-bStart; lastWasBlank=0; lastBlankPos=0; for (i=0; i=127 would filter out umlauts... if (c<32 || c>=127)*/ if (c<32) c=32; /* remember next loop whether this char was a blank */ if (c==32) { if (!lastWasBlank) { /* store only one blank */ lastWasBlank=1; lastBlankPos=dst; *(dst++)=c; } } else { lastWasBlank=0; lastBlankPos=0; *(dst++)=c; } p++; } /* remove trailing blanks */ if (lastBlankPos!=0) dst=lastBlankPos; size=dst-(uint8_t*)GWEN_Buffer_GetStart(buf); GWEN_Buffer_Crop(buf, 0, size); return 0; } int AIO_OfxXmlCtx_SanitizeData(GWEN_XML_CONTEXT *ctx, const char *data, GWEN_BUFFER *buf) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); if (xctx->charset) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=AIO_OfxXmlCtx_CleanupData(ctx, data, tbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } rv=GWEN_Text_ConvertCharset(xctx->charset, "UTF-8", GWEN_Buffer_GetStart(tbuf), GWEN_Buffer_GetUsedBytes(tbuf), buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); return rv; } GWEN_Buffer_free(tbuf); return 0; } else return AIO_OfxXmlCtx_CleanupData(ctx, data, buf); } int AIO_OfxXmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); DBG_INFO(AQBANKING_LOGDOMAIN, "Starting tag [%s]", tagName); /* store for later, do nothing more here */ AIO_OfxXmlCtx_SetCurrentTagName(ctx, tagName); return 0; } int AIO_OfxXmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); if (closing) { /* just ignore empty tags which are closed immediately */ DBG_INFO(AQBANKING_LOGDOMAIN, "Closing empty tag [%s]", (xctx->currentTagName)?xctx->currentTagName:""); return 0; } if (xctx->currentTagName==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "No tag name, malformed OFX file"); return GWEN_ERROR_BAD_DATA; } DBG_INFO(AQBANKING_LOGDOMAIN, "Completed tag [%s]", xctx->currentTagName); if (xctx->currentGroup) { if (*(xctx->currentTagName)=='/') { int rv; int endingOfxDoc=0; if (strcasecmp(xctx->currentTagName, "/OFX")==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "End of OFX document reached, will reset depth to %d", xctx->startDepthOfOfxElement); endingOfxDoc=1; } /* it is a closing tag, call EndTagFn */ DBG_INFO(AQBANKING_LOGDOMAIN, "Calling %s->EndTag(%s)", AIO_OfxGroup_GetGroupName(xctx->currentGroup), xctx->currentTagName); rv=AIO_OfxGroup_EndTag(xctx->currentGroup, xctx->currentTagName+1); if (rv<0) { if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in EndTag(%s) for [%s]", AIO_OfxGroup_GetGroupName(xctx->currentGroup), xctx->currentTagName); return rv; } } else if (rv==1) { AIO_OFX_GROUP *g; AIO_OFX_GROUP *gParent; /* pop current group from stack */ g=xctx->currentGroup; gParent=AIO_OfxGroup_GetParent(g); xctx->currentGroup=gParent; if (gParent) { DBG_INFO(AQBANKING_LOGDOMAIN, "Calling %s->EndSubGroup(%s)", AIO_OfxGroup_GetGroupName(gParent), AIO_OfxGroup_GetGroupName(g)); AIO_OfxGroup_EndSubGroup(gParent, g); } AIO_OfxGroup_free(g); GWEN_XmlCtx_DecDepth(ctx); } if (endingOfxDoc) { /* TODO: Tags which have no closing element should decrease the depth by themselves... */ DBG_INFO(AQBANKING_LOGDOMAIN, "End of OFX document reached, resetting depth to %d", xctx->startDepthOfOfxElement); GWEN_XmlCtx_SetDepth(ctx, xctx->startDepthOfOfxElement); } } else { int rv; if (strcasecmp(xctx->currentTagName, "OFX")==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Start of OFX document reached, storing depth"); xctx->startDepthOfOfxElement=GWEN_XmlCtx_GetDepth(ctx); } /* it is an opening tag, call StartTagFn */ DBG_INFO(AQBANKING_LOGDOMAIN, "Calling %s->StartTag(%s)", AIO_OfxGroup_GetGroupName(xctx->currentGroup), xctx->currentTagName); rv=AIO_OfxGroup_StartTag(xctx->currentGroup, xctx->currentTagName); if (rv<0) { if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in StartTag(%s) for [%s]", AIO_OfxGroup_GetGroupName(xctx->currentGroup), xctx->currentTagName); return rv; } } } } return 0; } int AIO_OfxXmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); if (xctx->currentGroup) { int rv; DBG_INFO(AQBANKING_LOGDOMAIN, "Calling %s->AddData()", AIO_OfxGroup_GetGroupName(xctx->currentGroup)); rv=AIO_OfxGroup_AddData(xctx->currentGroup, data); if (rv<0) { if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in AddData(%s)", AIO_OfxGroup_GetGroupName(xctx->currentGroup)); return rv; } } } return 0; } int AIO_OfxXmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); /* ignore comments */ return 0; } int AIO_OfxXmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData) { AIO_OFX_XMLCTX *xctx; assert(ctx); xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, AIO_OFX_XMLCTX, ctx); assert(xctx); /* ignore attributes */ return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacc_l.h0000644000175000017500000000210012364015477022535 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKACC_L_H #define AIO_OFX_G_BANKACC_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BANKACC_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_BANKACC_GetBankId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_BANKACC_SetBankId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_BANKACC_GetAccId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_BANKACC_SetAccId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_BANKACC_GetAccType(const AIO_OFX_GROUP *g); void AIO_OfxGroup_BANKACC_SetAccType(AIO_OFX_GROUP *g, const char *s); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrs_p.h0000644000175000017500000000202012364015477022514 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTRS_P_H #define AIO_OFX_G_STMTRS_P_H #include "g_stmtrs_l.h" typedef struct AIO_OFX_GROUP_STMTRS AIO_OFX_GROUP_STMTRS; struct AIO_OFX_GROUP_STMTRS { char *currentElement; char *currency; AB_IMEXPORTER_ACCOUNTINFO *accountInfo; }; static void GWENHYWFAR_CB AIO_OfxGroup_STMTRS_FreeData(void *bp, void *p); static int AIO_OfxGroup_STMTRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_STMTRS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_STMTRS_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankmsgsrsv1.c0000644000175000017500000000334512364015477023270 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_bankmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_stmttrnrs_l.h" #include "g_acctinfotrnrs_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_BANKMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BANKMSGSRSV1_StartTag); return g; } int AIO_OfxGroup_BANKMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "STMTTRNRS")==0) { gNew=AIO_OfxGroup_STMTTRNRS_new(tagName, g, ctx); } else if (strcasecmp(tagName, "ACCTINFOTRNRS")==0) { gNew=AIO_OfxGroup_ACCTINFOTRNRS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buymf_l.h0000644000175000017500000000147512364015477022313 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BUYMF_L_H #define AIO_OFX_G_BUYMF_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BUYMF_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_BUYMF_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_creditcardmsgsrsv1_l.h0000644000175000017500000000131012364015477024767 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_CREDITCARDMSGSRSV1_L_H #define AIO_OFX_G_CREDITCARDMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_CREDITCARDMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfo_p.h0000644000175000017500000000212712364015477022756 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFO_P_H #define AIO_OFX_G_ACCTINFO_P_H #include "g_acctinfo_l.h" typedef struct AIO_OFX_GROUP_ACCTINFO AIO_OFX_GROUP_ACCTINFO; struct AIO_OFX_GROUP_ACCTINFO { char *currentElement; char *description; char *bankId; char *accId; char *accType; AB_IMEXPORTER_ACCOUNTINFO *accountInfo; }; static void GWENHYWFAR_CB AIO_OfxGroup_ACCTINFO_FreeData(void *bp, void *p); static int AIO_OfxGroup_ACCTINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_ACCTINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_ACCTINFO_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclistmsgsrsv1.c0000644000175000017500000000311512364015477024016 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_seclistmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_seclist_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_SECLISTMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SECLISTMSGSRSV1_StartTag); return g; } int AIO_OfxGroup_SECLISTMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "SECLIST")==0) { gNew=AIO_OfxGroup_SECLIST_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfotrnrs_l.h0000644000175000017500000000127512364015477024046 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFOTRNRS_L_H #define AIO_OFX_G_ACCTINFOTRNRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFOTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_mfinfo.c0000644000175000017500000000523012364015477022120 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_mfinfo_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_secinfo_l.h" #include #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_MFINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_MFINFO_StartTag); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_MFINFO_EndSubGroup); return g; } int AIO_OfxGroup_MFINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName) { GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "SECINFO")==0) { gNew=AIO_OfxGroup_SECINFO_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_MFINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { const char *s; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "SECINFO")==0) { AB_SECURITY *sec=NULL; const char *uid; const char *ns; uid=AIO_OfxGroup_SECINFO_GetUniqueId(sg); ns=AIO_OfxGroup_SECINFO_GetNameSpace(sg); if (uid && ns) sec=AB_ImExporterContext_FindSecurity(AIO_OfxXmlCtx_GetIoContext(ctx), ns, uid); if (sec==NULL) { sec=AB_Security_new(); AB_Security_SetUniqueId(sec, uid); AB_Security_SetNameSpace(sec, ns); AB_ImExporterContext_AddSecurity(AIO_OfxXmlCtx_GetIoContext(ctx), sec); } AB_Security_SetName(sec, AIO_OfxGroup_SECINFO_GetSecurityName(sg)); AB_Security_SetTickerSymbol(sec, AIO_OfxGroup_SECINFO_GetTicker(sg)); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacc_p.h0000644000175000017500000000167412364015477022560 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKACC_P_H #define AIO_OFX_G_BANKACC_P_H #include "g_bankacc_l.h" typedef struct AIO_OFX_GROUP_BANKACC AIO_OFX_GROUP_BANKACC; struct AIO_OFX_GROUP_BANKACC { char *bankId; char *accId; char *accType; char *currentElement; }; static void GWENHYWFAR_CB AIO_OfxGroup_BANKACC_FreeData(void *bp, void *p); static int AIO_OfxGroup_BANKACC_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BANKACC_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrs_l.h0000644000175000017500000000125012364015477022514 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTRS_L_H #define AIO_OFX_G_STMTRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_STMTRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_income.c0000644000175000017500000001372512364015477022124 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_income_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invtran_l.h" #include "g_secid_l.h" #include "types/transaction.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME) AIO_OFX_GROUP *AIO_OfxGroup_INCOME_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INCOME *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INCOME, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME, g, xg, AIO_OfxGroup_INCOME_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INCOME_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INCOME_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_INCOME_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INCOME_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INCOME *xg; xg=(AIO_OFX_GROUP_INCOME*)p; assert(xg); AB_Transaction_free(xg->transaction); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_INCOME_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INCOME *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "TOTAL")==0 || strcasecmp(tagName, "INCOMETYPE")==0 || strcasecmp(tagName, "SUBACCTSEC")==0 || strcasecmp(tagName, "SUBACCTFUND")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "INVTRAN")==0) { gNew=AIO_OfxGroup_INVTRAN_new(tagName, g, ctx); } else if (strcasecmp(tagName, "SECID")==0) { gNew=AIO_OfxGroup_SECID_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_INCOME_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INCOME *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "TOTAL")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for TOTAL: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetValue(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "INCOMETYPE")==0) { /* TODO */ } else if (strcasecmp(xg->currentElement, "SUBACCTSEC")==0) { /* TODO */ } else if (strcasecmp(xg->currentElement, "SUBACCTFUND")==0) { /* TODO */ } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_INCOME_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_INCOME *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVTRAN")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_INVTRAN_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetFiId(xg->transaction, AB_Transaction_GetFiId(t)); AB_Transaction_SetValutaDate(xg->transaction, AB_Transaction_GetValutaDate(t)); AB_Transaction_SetDate(xg->transaction, AB_Transaction_GetDate(t)); AB_Transaction_SetPurpose(xg->transaction, AB_Transaction_GetPurpose(t)); } } else if (strcasecmp(s, "SECID")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_SECID_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetUnitId(xg->transaction, AB_Transaction_GetUnitId(t)); AB_Transaction_SetUnitIdNameSpace(xg->transaction, AB_Transaction_GetUnitIdNameSpace(t)); } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", s); } return 0; } AB_TRANSACTION *AIO_OfxGroup_INCOME_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_INCOME *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INCOME, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_status.c0000644000175000017500000004437112364015477022176 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_status_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS) typedef struct AIO_OFX_GROUP_STATUS_ERROR AIO_OFX_GROUP_STATUS_ERROR; struct AIO_OFX_GROUP_STATUS_ERROR { int code; /**< The error's code */ const char *name; /**< The error's name */ const char *description; /**< The long description of the error */ }; /* this list has been copied from LibOFX */ static AIO_OFX_GROUP_STATUS_ERROR error_msg_list[] = { {0, I18S("Success"), I18S("The server successfully processed the request.")}, {1, I18S("Client is up-to-date"), I18S("Based on the client timestamp, the client has the latest information. The response does not supply any additional information.")}, {2000, I18S("General error"), I18S("Error other than those specified by the remaining error codes. (Note: Servers should provide a more specific error whenever possible. Error code 2000 should be reserved for cases in which a more specific code is not available.)")}, {2001, I18S("Invalid account"), I18S("The account was invalid (whatever that means)")}, {2002, I18S("General account error"), I18S("Account error not specified by the remaining error codes.")}, {2003, I18S("Account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")}, {2004, I18S("Account closed"), I18S("The specified account number corresponds to an account that has been closed.")}, {2005, I18S("Account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")}, {2006, I18S("Source account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")}, {2007, I18S("Source account closed"), I18S("The specified account number corresponds to an account that has been closed.")}, {2008, I18S("Source account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")}, {2009, I18S("Destination account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")}, {2010, I18S("Destination account closed"), I18S("The specified account number corresponds to an account that has been closed.")}, {2011, I18S("Destination account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")}, {2012, I18S("Invalid amount"), I18S("The specified amount is not valid for this action; for example, the user specified a negative payment amount.")}, {2014, I18S("Date too soon"), I18S("The server cannot process the requested action by the date specified by the user.")}, {2015, I18S("Date too far in future"), I18S("The server cannot accept requests for an action that far in the future.")}, {2016, I18S("Transaction already committed"), I18S("Transaction has entered the processing loop and cannot be modified/cancelled using OFX. The transaction may still be cancelled or modified using other means (for example, a phone call to Customer Service).")}, {2017, I18S("Already canceled"), I18S("The transaction cannot be canceled or modified because it has already been canceled.")}, {2018, I18S("Unknown server ID"), I18S("The specified server ID does not exist or no longer exists.")}, {2019, I18S("Duplicate request"), I18S("A request with this has already been received and processed.")}, {2020, I18S("Invalid date"), I18S("The specified datetime stamp cannot be parsed; for instance, the datetime stamp specifies 25:00 hours.")}, {2021, I18S("Unsupported version"), I18S("The server does not support the requested version. The version of the message set specified by the client is not supported by this server.")}, {2022, I18S("Invalid TAN"), I18S("The server was unable to validate the TAN sent in the request.")}, {2023, I18S("Unknown FITID"), I18S("The specified FITID/BILLID does not exist or no longer exists. [BILLID not found in the billing message sets]")}, {2025, I18S("Branch ID missing"), I18S("A value must be provided in the aggregate for this country system, but this field is missing.")}, {2026, I18S("Bank name does not match bank ID"), I18S("The value of in the aggregate is inconsistent with the value of in the aggregate.")}, {2027, I18S("Invalid date range"), I18S("Response for non-overlapping dates, date ranges in the future, et cetera.")}, {2028, I18S("Requested element unknown"), I18S("One or more elements of the request were not recognized by the server or the server (as noted in the FI Profile) does not support the elements. The server executed the element transactions it understood and supported. For example, the request file included private tags in a but the server was able to execute the rest of the request.")}, {6500, I18S("Y invalid without "), I18S("This error code may appear element of an wrapper (in and V2 message set responses) or the contained in any embedded transaction wrappers within a sync response. The corresponding sync request wrapper included Y with Y or Y, which is illegal.")}, {6501, I18S("Embedded transactions in request failed to process: Out of date"), I18S("Y and embedded transactions appeared in the request sync wrapper and the provided was out of date. This code should be used in the of the response sync wrapper.")}, {6502, I18S("Unable to process embedded transaction due to out-of-date "), I18S("Used in response transaction wrapper for embedded transactions when 6501 appears in the surrounding sync wrapper.")}, {10000, I18S("Stop check in process"), I18S("Stop check is already in process.")}, {10500, I18S("Too many checks to process"), I18S("The stop-payment request specifies too many checks.")}, {10501, I18S("Invalid payee"), I18S("Payee error not specified by the remainingerror codes.")}, {10502, I18S("Invalid payee address"), I18S("Some portion of the payee's address is incorrect or unknown.")}, {10503, I18S("Invalid payee account number"), I18S("The account number of the requested payee is invalid.")}, {10504, I18S("Insufficient funds"), I18S("The server cannot process the request because the specified account does not have enough funds.")}, {10505, I18S("Cannot modify element"), I18S("The server does not allow modifications to one or more values in a modification request.")}, {10506, I18S("Cannot modify source account"), I18S("Reserved for future use.")}, {10507, I18S("Cannot modify destination account"), I18S("Reserved for future use.")}, {10508, I18S("Invalid frequency"), I18S("The specified frequency does not match one of the accepted frequencies for recurring transactions.")}, {10509, I18S("Model already canceled"), I18S("The server has already canceled the specified recurring model.")}, {10510, I18S("Invalid payee ID"), I18S("The specified payee ID does not exist or no longer exists.")}, {10511, I18S("Invalid payee city"), I18S("The specified city is incorrect or unknown.")}, {10512, I18S("Invalid payee state"), I18S("The specified state is incorrect or unknown.")}, {10513, I18S("Invalid payee postal code"), I18S("The specified postal code is incorrect or unknown.")}, {10514, I18S("Transaction already processed"), I18S("Transaction has already been sent or date due is past")}, {10515, I18S("Payee not modifiable by client"), I18S("The server does not allow clients to change payee information.")}, {10516, I18S("Wire beneficiary invalid"), I18S("The specified wire beneficiary does not exist or no longer exists.")}, {10517, I18S("Invalid payee name"), I18S("The server does not recognize the specified payee name.")}, {10518, I18S("Unknown model ID"), I18S("The specified model ID does not exist or no longer exists.")}, {10519, I18S("Invalid payee list ID"), I18S("The specified payee list ID does not exist or no longer exists.")}, {10600, I18S("Table type not found"), I18S("The specified table type is not recognized or does not exist.")}, {12250, I18S("Investment transaction download not supported (WARN)"), I18S("The server does not support investment transaction download.")}, {12251, I18S("Investment position download not supported (WARN)"), I18S("The server does not support investment position download.")}, {12252, I18S("Investment positions for specified date not available"), I18S("The server does not support investment positions for the specified date.")}, {12253, I18S("Investment open order download not supported (WARN)"), I18S("The server does not support open order download.")}, {12254, I18S("Investment balances download not supported (WARN)"), I18S("The server does not support investment balances download.")}, {12255, I18S("401(k) not available for this account"), I18S("401(k) information requested from a non-401(k) account.")}, {12500, I18S("One or more securities not found"), I18S("The server could not find the requested securities.")}, {13000, I18S("User ID & password will be sent out-of-band (INFO)"), I18S("The server will send the user ID and password via postal mail, e-mail, or another means. The accompanying message will provide details.")}, {13500, I18S("Unable to enroll user"), I18S("The server could not enroll the user.")}, {13501, I18S("User already enrolled"), I18S("The server has already enrolled the user.")}, {13502, I18S("Invalid service"), I18S("The server does not support the service specified in the service-activation request.")}, {13503, I18S("Cannot change user information"), I18S("The server does not support the request.")}, {13504, I18S(" Missing or Invalid in "), I18S("The FI requires the client to provide the aggregate in the request, but either none was provided, or the one provided was invalid.")}, {14500, I18S("1099 forms not available"), I18S("1099 forms are not yet available for the tax year requested.")}, {14501, I18S("1099 forms not available for user ID"), I18S("This user does not have any 1099 forms available.")}, {14600, I18S("W2 forms not available"), I18S("W2 forms are not yet available for the tax year requested.")}, {14601, I18S("W2 forms not available for user ID"), I18S("The user does not have any W2 forms available.")}, {14700, I18S("1098 forms not available"), I18S("1098 forms are not yet available for the tax year requested.")}, {14701, I18S("1098 forms not available for user ID"), I18S("The user does not have any 1098 forms available.")}, {15000, I18S("Must change USERPASS"), I18S("The user must change his or her number as part of the next OFX request.")}, {15500, I18S("Signon invalid"), I18S("The user cannot signon because he or she entered an invalid user ID or password.")}, {15501, I18S("Customer account already in use"), I18S("The server allows only one connection at a time, and another user is already signed on. Please try again later.")}, {15502, I18S("USERPASS lockout"), I18S("The server has received too many failed signon attempts for this user. Please call the FI's technical support number.")}, {15503, I18S("Could not change USERPASS"), I18S("The server does not support the request.")}, {15504, I18S("Could not provide random data"), I18S("The server could not generate random data as requested by the .")}, {15505, I18S("Country system not supported"), I18S("The server does not support the country specified in the field of the aggregate.")}, {15506, I18S("Empty signon not supported"), I18S("The server does not support signons not accompanied by some other transaction.")}, {15507, I18S("Signon invalid without supporting pin change request"), I18S("The OFX block associated with the signon does not contain a pin change request and should.")}, {15508, I18S("Transaction not authorized"), I18S("Current user is not authorized to perform this action on behalf of the .")}, {16500, I18S("HTML not allowed"), I18S("The server does not accept HTML formatting in the request.")}, {16501, I18S("Unknown mail To:"), I18S("The server was unable to send mail to the specified Internet address.")}, {16502, I18S("Invalid URL"), I18S("The server could not parse the URL.")}, {16503, I18S("Unable to get URL"), I18S("The server was unable to retrieve the information at this URL (e.g., an HTTP 400 or 500 series error).")}, {-1, I18S("Unknown code"), I18S("No description for this code")} }; const AIO_OFX_GROUP_STATUS_ERROR* AIO_OfxGroup_STATUS__getErrorStruct(int e) { int i; for (i=0; ; i++) { if (error_msg_list[i].code==e) return &error_msg_list[i]; if (error_msg_list[i].code==-1) break; } return NULL; } AIO_OFX_GROUP *AIO_OfxGroup_STATUS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx, const char *description) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_STATUS *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_STATUS, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS, g, xg, AIO_OfxGroup_STATUS_FreeData); if (description) xg->description=strdup(description); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_STATUS_StartTag); xg->oldEndTagFn=AIO_OfxGroup_SetEndTagFn(g, AIO_OfxGroup_STATUS_EndTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_STATUS_AddData); return g; } GWENHYWFAR_CB void AIO_OfxGroup_STATUS_FreeData(void *bp, void *p) { AIO_OFX_GROUP_STATUS *xg; xg=(AIO_OFX_GROUP_STATUS*)p; assert(xg); free(xg->currentElement); free(xg->severity); free(xg->description); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_STATUS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_STATUS *xg; //GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS, g); assert(xg); //ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "CODE")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "SEVERITY")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "MESSAGE")==0) { xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } return 0; } int AIO_OfxGroup_STATUS_EndTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_STATUS *xg; //GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS, g); assert(xg); //ctx=AIO_OfxGroup_GetXmlContext(g); assert(tagName); if (strcasecmp(tagName, AIO_OfxGroup_GetGroupName(g))!=0) { /* tag does not close this one */ DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag [%s] does not close [%s], ignoring", tagName, AIO_OfxGroup_GetGroupName(g)); return 0; } /* show status message */ if (xg->description) { GWEN_BUFFER *buf; char numbuf[32]; const AIO_OFX_GROUP_STATUS_ERROR *e; e=AIO_OfxGroup_STATUS__getErrorStruct(xg->code); buf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(buf, xg->description); GWEN_Buffer_AppendString(buf, ": "); /* append error string if available */ if (e && e->name) { GWEN_Buffer_AppendString(buf, I18N(e->name)); GWEN_Buffer_AppendString(buf, " ("); } GWEN_Buffer_AppendString(buf, I18N("Code")); GWEN_Buffer_AppendString(buf, " "); snprintf(numbuf, sizeof(numbuf)-1, "%d", xg->code); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(buf, numbuf); if (xg->severity) { GWEN_Buffer_AppendString(buf, ", "); GWEN_Buffer_AppendString(buf, I18N("severity")); GWEN_Buffer_AppendString(buf, " \""); GWEN_Buffer_AppendString(buf, xg->severity); GWEN_Buffer_AppendString(buf, "\""); } if (e && e->name) { GWEN_Buffer_AppendString(buf, ")"); } /* append error description if available */ if (e && e->description) { GWEN_Buffer_AppendString(buf, "\n"); GWEN_Buffer_AppendString(buf, I18N(e->description)); } DBG_INFO(AQBANKING_LOGDOMAIN, "%s", GWEN_Buffer_GetStart(buf)); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); } if (xg->oldEndTagFn) return xg->oldEndTagFn(g, tagName); else return 1; } int AIO_OfxGroup_STATUS_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_STATUS *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "CODE")==0) { if (1!=sscanf(s, "%d", &xg->code)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad data for element [%s]", xg->currentElement); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } } else if (strcasecmp(xg->currentElement, "SEVERITY")==0) { free(xg->severity); xg->severity=strdup(GWEN_Buffer_GetStart(buf)); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invpos.c0000644000175000017500000001314612364015477022165 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invpos_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_secid_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS) AIO_OFX_GROUP *AIO_OfxGroup_INVPOS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVPOS *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVPOS, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS, g, xg, AIO_OfxGroup_INVPOS_FreeData); xg->security=AB_Security_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVPOS_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVPOS_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_INVPOS_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVPOS_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVPOS *xg; xg=(AIO_OFX_GROUP_INVPOS*)p; assert(xg); free(xg->currentElement); AB_Security_free(xg->security); GWEN_FREE_OBJECT(xg); } AB_SECURITY *AIO_OfxGroup_INVPOS_TakeSecurity(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_INVPOS *xg; AB_SECURITY *sec; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS, g); assert(xg); sec=xg->security; xg->security=NULL; return sec; } int AIO_OfxGroup_INVPOS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVPOS *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "HELDINACCT")==0 || strcasecmp(tagName, "POSTYPE")==0 || strcasecmp(tagName, "UNITS")==0 || strcasecmp(tagName, "UNITPRICE")==0 || strcasecmp(tagName, "MKTVAL")==0 || strcasecmp(tagName, "DTPRICEASOF")==0 || strcasecmp(tagName, "MEMO")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "SECID")==0) { gNew=AIO_OfxGroup_SECID_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_INVPOS_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVPOS *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "UNITS")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITS: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Security_SetUnits(xg->security, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "UNITPRICE")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITPRICE: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } if (xg->currency) AB_Value_SetCurrency(v, xg->currency); AB_Security_SetUnitPriceValue(xg->security, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "DTPRICEASOF")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTPRICEASOF: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Security_SetUnitPriceDate(xg->security, ti); GWEN_Time_free(ti); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_INVPOS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_INVPOS *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVPOS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "SECID")==0) { AB_Security_SetUniqueId(xg->security, AIO_OfxGroup_SECID_GetUniqueId(sg)); AB_Security_SetNameSpace(xg->security, AIO_OfxGroup_SECID_GetNameSpace(sg)); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmttrnrs.c0000644000175000017500000000366112364015477022730 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_stmttrnrs_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_status_l.h" #include "g_stmtrs_l.h" #include "i18n_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_STMTTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_STMTTRNRS_StartTag); return g; } int AIO_OfxGroup_STMTTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "STATUS")==0) { gNew=AIO_OfxGroup_STATUS_new(tagName, g, ctx, I18N("Status for transaction statement request")); } else if (strcasecmp(tagName, "TRNUID")==0 || strcasecmp(tagName, "CLTCOOKIE")==0) { /* some tags, just ignore them here */ } else if (strcasecmp(tagName, "STMTRS")==0 || strcasecmp(tagName, "CCSTMTRS")==0) { gNew=AIO_OfxGroup_STMTRS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_mfinfo_p.h0000644000175000017500000000140512364015477022444 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_MFINFO_P_H #define AIO_OFX_G_MFINFO_P_H #include "g_mfinfo_l.h" int AIO_OfxGroup_MFINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName); int AIO_OfxGroup_MFINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bal_l.h0000644000175000017500000000175512364015477021730 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BAL_L_H #define AIO_OFX_G_BAL_L_H #include "ofxgroup_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_BAL_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const AB_VALUE *AIO_OfxGroup_BAL_GetValue(const AIO_OFX_GROUP *g); void AIO_OfxGroup_BAL_SetValue(AIO_OFX_GROUP *g, const AB_VALUE *v); const GWEN_TIME *AIO_OfxGroup_BAL_GetDate(const AIO_OFX_GROUP *g); void AIO_OfxGroup_BAL_SetDate(AIO_OFX_GROUP *g, const GWEN_TIME *ti); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ofx_p.h0000644000175000017500000000115012364015477021757 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_OFX_P_H #define AIO_OFX_G_OFX_P_H #include "g_ofx_l.h" static int AIO_OfxGroup_OFX_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankmsgsrsv1_p.h0000644000175000017500000000122712364015477023611 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKMSGSRSV1_P_H #define AIO_OFX_G_BANKMSGSRSV1_P_H #include "g_bankmsgsrsv1_l.h" static int AIO_OfxGroup_BANKMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signupmsgsrsv1_l.h0000644000175000017500000000130212364015477024171 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SIGNUPMSGSRSV1_L_H #define AIO_OFX_G_SIGNUPMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SIGNUPMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posmf.c0000644000175000017500000000434512364015477021774 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_posmf_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invpos_l.h" #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_POSMF_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_POSMF_StartTag); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_POSMF_EndSubGroup); return g; } int AIO_OfxGroup_POSMF_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "INVPOS")==0) { gNew=AIO_OfxGroup_INVPOS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_POSMF_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { const char *s; GWEN_XML_CONTEXT *ctx; ctx=AIO_OfxGroup_GetXmlContext(g); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVPOS")==0) { AB_SECURITY *sec; sec=AIO_OfxGroup_INVPOS_TakeSecurity(sg); if (sec) { AB_IMEXPORTER_CONTEXT *ioCtx; ioCtx=AIO_OfxXmlCtx_GetIoContext(ctx); DBG_INFO(AQBANKING_LOGDOMAIN, "Adding security"); AB_ImExporterContext_AddSecurity(ioCtx, sec); } } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_reinvest_l.h0000644000175000017500000000151012364015477023016 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_REINVEST_L_H #define AIO_OFX_G_REINVEST_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_REINVEST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_REINVEST_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclist_p.h0000644000175000017500000000117612364015477022641 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECLIST_P_H #define AIO_OFX_G_SECLIST_P_H #include "g_seclist_l.h" static int AIO_OfxGroup_SECLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacc.c0000644000175000017500000001261412364015477022230 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_bankacc_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC) AIO_OFX_GROUP *AIO_OfxGroup_BANKACC_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BANKACC *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BANKACC, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g, xg, AIO_OfxGroup_BANKACC_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BANKACC_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BANKACC_AddData); if (strcasecmp(groupName, "CCACCTFROM")==0 || strcasecmp(groupName, "CCACCTTO")==0) xg->accType=strdup("CREDITCARD"); else if (strcasecmp(groupName, "INVACCTFROM")==0 || strcasecmp(groupName, "INVACCTTO")==0) xg->accType=strdup("MONEYMRKT"); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BANKACC_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BANKACC *xg; xg=(AIO_OFX_GROUP_BANKACC*)p; assert(xg); free(xg->currentElement); free(xg->bankId); free(xg->accId); free(xg->accType); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_BANKACC_GetBankId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); return xg->bankId; } void AIO_OfxGroup_BANKACC_SetBankId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); free(xg->bankId); if (s) xg->bankId=strdup(s); else xg->bankId=NULL; } const char *AIO_OfxGroup_BANKACC_GetAccId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); return xg->accId; } void AIO_OfxGroup_BANKACC_SetAccId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); free(xg->accId); if (s) xg->accId=strdup(s); else xg->accId=NULL; } const char *AIO_OfxGroup_BANKACC_GetAccType(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); return xg->accType; } void AIO_OfxGroup_BANKACC_SetAccType(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); free(xg->accType); if (s) xg->accType=strdup(s); else xg->accType=NULL; } int AIO_OfxGroup_BANKACC_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BANKACC *xg; //GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); //ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "BANKID")==0 || strcasecmp(tagName, "ACCTID")==0 || strcasecmp(tagName, "ACCTTYPE")==0 || strcasecmp(tagName, "BRANCHID")==0 || strcasecmp(tagName, "ACCTKEY")==0 || strcasecmp(tagName, "BROKERID")==0) { xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } return 0; } int AIO_OfxGroup_BANKACC_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BANKACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACC, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "BANKID")==0) AIO_OfxGroup_BANKACC_SetBankId(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "BROKERID")==0) AIO_OfxGroup_BANKACC_SetBankId(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "ACCTID")==0) AIO_OfxGroup_BANKACC_SetAccId(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "ACCTTYPE")==0) AIO_OfxGroup_BANKACC_SetAccType(g, GWEN_Buffer_GetStart(buf)); else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankmsgsrsv1_l.h0000644000175000017500000000127012364015477023603 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKMSGSRSV1_L_H #define AIO_OFX_G_BANKMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BANKMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secid_l.h0000644000175000017500000000211512364015477022250 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECID_L_H #define AIO_OFX_G_SECID_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SECID_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_SECID_GetUniqueId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECID_SetUniqueId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_SECID_GetNameSpace(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECID_SetNameSpace(AIO_OFX_GROUP *g, const char *s); AB_TRANSACTION *AIO_OfxGroup_SECID_TakeData(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_generic_l.h0000644000175000017500000000141212364015477022574 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_GENERIC_L_H #define AIO_OFX_G_GENERIC_L_H #include "ofxgroup_l.h" #include AIO_OFX_GROUP *AIO_OfxGroup_Generic_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_ACCOUNT_TYPE AIO_OfxGroup_Generic_AccountTypeFromString(const char *s); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrn_p.h0000644000175000017500000000200512364015477022512 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTRN_P_H #define AIO_OFX_G_STMTRN_P_H #include "g_stmtrn_l.h" typedef struct AIO_OFX_GROUP_STMTRN AIO_OFX_GROUP_STMTRN; struct AIO_OFX_GROUP_STMTRN { char *currentElement; char *currency; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_STMTRN_FreeData(void *bp, void *p); static int AIO_OfxGroup_STMTRN_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_STMTRN_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_STMTRN_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclistmsgsrsv1_l.h0000644000175000017500000000127112364015477024337 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECLISTMSGSRSV1_L_H #define AIO_OFX_G_SECLISTMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SECLISTMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtmsgsrsv1_l.h0000644000175000017500000000127112364015477024375 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTMSGSRSV1_L_H #define AIO_OFX_G_INVSTMTMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtmsgsrsv1_p.h0000644000175000017500000000123712364015477024403 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTMSGSRSV1_P_H #define AIO_OFX_G_INVSTMTMSGSRSV1_P_H #include "g_invstmtmsgsrsv1_l.h" static int AIO_OfxGroup_INVSTMTMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_creditcardmsgsrsv1.c0000644000175000017500000000315112364015477024454 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_creditcardmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_stmttrnrs_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_CREDITCARDMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_CREDITCARDMSGSRSV1_StartTag); return g; } int AIO_OfxGroup_CREDITCARDMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "CCSTMTTRNRS")==0) { gNew=AIO_OfxGroup_STMTTRNRS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invacc.c0000644000175000017500000001166412364015477022115 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Thur Apr 23 2009 copyright : (C) 2009 by Stephen R. Besch (C) 2008 by Martin Preuss email : sbesch@buffalo.edu martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invacc_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC) AIO_OFX_GROUP *AIO_OfxGroup_INVACC_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVACC *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVACC, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g, xg, AIO_OfxGroup_INVACC_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVACC_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVACC_AddData); if (strcasecmp(groupName, "INVACCTFROM")==0 || strcasecmp(groupName, "INVACCTTO")==0) xg->accType=strdup("INVESTMENT"); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVACC_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVACC *xg; xg=(AIO_OFX_GROUP_INVACC*)p; assert(xg); free(xg->currentElement); free(xg->brokerId); free(xg->accId); free(xg->accType); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_INVACC_GetBrokerId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); return xg->brokerId; } void AIO_OfxGroup_INVACC_SetBrokerId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); free(xg->brokerId); if (s) xg->brokerId=strdup(s); else xg->brokerId=NULL; } const char *AIO_OfxGroup_INVACC_GetAccId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); return xg->accId; } void AIO_OfxGroup_INVACC_SetAccId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); free(xg->accId); if (s) xg->accId=strdup(s); else xg->accId=NULL; } const char *AIO_OfxGroup_INVACC_GetAccType(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); return xg->accType; } void AIO_OfxGroup_INVACC_SetAccType(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); free(xg->accType); if (s) xg->accType=strdup(s); else xg->accType=NULL; } int AIO_OfxGroup_INVACC_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVACC *xg; //GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); //ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "BANKID")==0 || strcasecmp(tagName, "BROKERID")==0 || strcasecmp(tagName, "ACCTID")==0) xg->currentElement=strdup(tagName); else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } return 0; } int AIO_OfxGroup_INVACC_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVACC *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVACC, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "BROKERID")==0 || strcasecmp(xg->currentElement, "BANKID")==0) AIO_OfxGroup_INVACC_SetBrokerId(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "ACCTID")==0) AIO_OfxGroup_INVACC_SetAccId(g, GWEN_Buffer_GetStart(buf)); else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclist.c0000644000175000017500000000313212364015477022307 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_seclist_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_stockinfo_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_SECLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SECLIST_StartTag); return g; } int AIO_OfxGroup_SECLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "STOCKINFO")==0 || strcasecmp(tagName, "MFINFO")==0) { gNew=AIO_OfxGroup_STOCKINFO_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_document.c0000644000175000017500000000346112364015477022464 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_document_p.h" #include "ofxxmlctx_l.h" #include "g_ofx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_Document_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_Document_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_Document_AddData); return g; } int AIO_OfxGroup_Document_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "OFX")==0) gNew=AIO_OfxGroup_OFX_new(tagName, g, ctx); else if (strcasecmp(tagName, "OFC")==0) { gNew=AIO_OfxGroup_OFX_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_Document_AddData(AIO_OFX_GROUP *g, const char *data) { /* TODO: evaluate OFX header */ return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacctinfo.c0000644000175000017500000001324312364015477023267 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_bankacctinfo_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_bankacc_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO) AIO_OFX_GROUP *AIO_OfxGroup_BANKACCTINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BANKACCTINFO *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BANKACCTINFO, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g, xg, AIO_OfxGroup_BANKACCTINFO_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BANKACCTINFO_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BANKACCTINFO_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_BANKACCTINFO_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BANKACCTINFO_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BANKACCTINFO *xg; xg=(AIO_OFX_GROUP_BANKACCTINFO*)p; assert(xg); free(xg->currentElement); free(xg->bankId); free(xg->accId); free(xg->accType); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_BANKACCTINFO_GetBankId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); return xg->bankId; } const char *AIO_OfxGroup_BANKACCTINFO_GetAccId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); return xg->accId; } const char *AIO_OfxGroup_BANKACCTINFO_GetAccType(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BANKACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); return xg->accType; } int AIO_OfxGroup_BANKACCTINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BANKACCTINFO *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "USPRODUCTTYPE")==0 || strcasecmp(tagName, "CHECKING")==0 || strcasecmp(tagName, "OPTIONLEVEL")==0 || strcasecmp(tagName, "SUPTXDL")==0 || strcasecmp(tagName, "XFERSRC")==0 || strcasecmp(tagName, "XFERDEST")==0 || strcasecmp(tagName, "INVACCTTYPE")==0 || strcasecmp(tagName, "SVCSTATUS")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "BANKACCTFROM")==0 || strcasecmp(tagName, "CCACCTFROM")==0 || strcasecmp(tagName, "INVACCTFROM")==0) { gNew=AIO_OfxGroup_BANKACC_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_BANKACCTINFO_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BANKACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "SUPTXDL")==0) { } else if (strcasecmp(xg->currentElement, "XFERSRC")==0) { } else if (strcasecmp(xg->currentElement, "XFERDEST")==0) { } else if (strcasecmp(xg->currentElement, "SVCSTATUS")==0) { } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_BANKACCTINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_BANKACCTINFO *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BANKACCTINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "BANKACCTFROM")==0 || strcasecmp(s, "CCACCTFROM")==0 || strcasecmp(s, "INVACCTFROM")==0) { const char *s; s=AIO_OfxGroup_BANKACC_GetBankId(sg); free(xg->bankId); if (s) xg->bankId=strdup(s); else xg->bankId=NULL; s=AIO_OfxGroup_BANKACC_GetAccId(sg); free(xg->accId); if (s) xg->accId=strdup(s); else xg->accId=NULL; s=AIO_OfxGroup_BANKACC_GetAccType(sg); free(xg->accType); if (s) xg->accType=strdup(s); else xg->accType=NULL; } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_document_l.h0000644000175000017500000000124412364015477023001 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_DOCUMENT_L_H #define AIO_OFX_G_DOCUMENT_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_Document_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtranlist.c0000644000175000017500000001601012364015477023215 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de begin : Fri Apr 17 2009 copyright : (C) 2009 by Stephen R. Besch email : sbesch@buffalo.edu begin : Sat May 18 2013 copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invtranlist_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_buystock_l.h" #include "g_income_l.h" #include "g_stmtrn_l.h" #include "g_buymf_l.h" #include "g_reinvest_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST) AIO_OFX_GROUP *AIO_OfxGroup_INVTRANLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVTRANLIST *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVTRANLIST, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST, g, xg, AIO_OfxGroup_INVTRANLIST_FreeData); xg->transactionList=AB_Transaction_List2_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVTRANLIST_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVTRANLIST_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_INVTRANLIST_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVTRANLIST_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVTRANLIST *xg; xg=(AIO_OFX_GROUP_INVTRANLIST*)p; assert(xg); AB_Transaction_List2_freeAll(xg->transactionList); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } AB_TRANSACTION_LIST2* AIO_OfxGroup_INVTRANLIST_TakeTransactionList(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_INVTRANLIST *xg; AB_TRANSACTION_LIST2 *tl; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST, g); assert(xg); tl=xg->transactionList; xg->transactionList=NULL; return tl; } /*The INVTRANLIST has 2 data and at least 4 groups. The BUYSTOCK, SELLSTOCK, and INCOME are similar enough to be handled using a single subgroup and some steering logic. The INVBANKTRAN is essentially identical to the Bank equivalent, so we use the STMTTRN group for it.*/ /* The and aggregates are similar, therefore each is handled by the * method. The difference between a buy and a sell is indicated by a positive or negative value * in the total and units datum. The aggregate represents an income event * (e.g. dividends) and a buy transaction of the like commodity. */ int AIO_OfxGroup_INVTRANLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVTRANLIST *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "DTSTART")==0 || strcasecmp(tagName, "DTEND")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "BUYSTOCK")==0 || strcasecmp(tagName, "SELLSTOCK")==0) gNew=AIO_OfxGroup_BUYSTOCK_new(tagName, g, ctx); else if (strcasecmp(tagName, "INCOME")==0) gNew=AIO_OfxGroup_INCOME_new(tagName, g, ctx); else if (strcasecmp(tagName, "INVBANKTRAN")==0) gNew=AIO_OfxGroup_STMTRN_new(tagName, g, ctx); else if (strcasecmp(tagName, "BUYMF")==0 || strcasecmp(tagName, "SELLMF")==0) gNew=AIO_OfxGroup_BUYMF_new(tagName, g, ctx); else if (strcasecmp(tagName, "REINVEST")==0) gNew=AIO_OfxGroup_REINVEST_new(tagName, g, ctx); else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } /*Here when the data for either DTSTART or DTEND arrives*/ int AIO_OfxGroup_INVTRANLIST_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVTRANLIST *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "DTSTART")==0) { free(xg->dtstart); xg->dtstart=strdup(s); } else if (strcasecmp(xg->currentElement, "DTEND")==0) { free(xg->dtend); xg->dtend=strdup(s); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown elements [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } /* Come here when the , , , , * , or tags are encountered. */ int AIO_OfxGroup_INVTRANLIST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_INVTRANLIST *xg; const char *s; GWEN_XML_CONTEXT *ctx; AB_TRANSACTION *t; /*First connect to the data list. Throw a hissy if either the group object or the inherited group object is invalid*/ assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRANLIST, g); assert(xg); /*Fetch a copy of this groups context - and it better be valid too.*/ ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); /*We need to look at the group name to see what to do. Then call the appropriate routine to take the transaction and push it into the transaction list.*/ s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "BUYSTOCK")==0 || strcasecmp(s, "SELLSTOCK")==0) t=AIO_OfxGroup_BUYSTOCK_TakeTransaction(sg); else if (strcasecmp(s, "INCOME")==0) t=AIO_OfxGroup_INCOME_TakeTransaction(sg); else if (strcasecmp(s, "INVBANKTRAN")==0) t=AIO_OfxGroup_STMTRN_TakeTransaction(sg); else if (strcasecmp(s, "BUYMF")==0 || strcasecmp(s, "SELLMF")==0) t=AIO_OfxGroup_BUYMF_TakeTransaction(sg); else if (strcasecmp(s, "REINVEST")==0) t=AIO_OfxGroup_REINVEST_TakeTransaction(sg); else return 0; /*If one of the groups matches, then post a message about adding the new transaction to the list*/ if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_Transaction_List2_PushBack(xg->transactionList, t); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclist_l.h0000644000175000017500000000123712364015477022633 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECLIST_L_H #define AIO_OFX_G_SECLIST_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SECLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtmsgsrsv1.c0000644000175000017500000000502112364015477024052 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de comments :Stephen R. Besch email :sbesch@acsu.buffalo.edu *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invstmtmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invstmttrnrs_l.h" #include #include /*This code parallels the code in BANKMSGSRSV1. First order of business is the object constructor. After setting up the base group object, all we need to do is watch for the arrival of the INVSTMTTRNRS tag, so we set up a virtual function to intercept future tags.*/ AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVSTMTMSGSRSV1_StartTag); return g; } /*The goal here is to filter all the tags in this group until we find a the INVSTMTTRNRS tag. At that point we create a new group (the INVSTMTTRNRS group) and let it handle all the tags for that group.*/ int AIO_OfxGroup_INVSTMTMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); /*Make sure that the parent group exists*/ ctx=AIO_OfxGroup_GetXmlContext(g); /*If it does, then get the context from it*/ if (strcasecmp(tagName, "INVSTMTTRNRS")==0) { gNew=AIO_OfxGroup_INVSTMTTRNRS_new(tagName, g, ctx); /*We've found the tag, so create a new group*/ } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); /*All other groups are ignored!*/ } /*OK, so we have a new group - even if it's going to be just the ignore group. So we set that new group into the context and bump the depth counter.*/ if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacctinfo_l.h0000644000175000017500000000173612364015477023613 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKACCTINFO_L_H #define AIO_OFX_G_BANKACCTINFO_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BANKACCTINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_BANKACCTINFO_GetBankId(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_BANKACCTINFO_GetAccId(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_BANKACCTINFO_GetAccType(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_BANKACCTINFO_GetAccDescr(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invbuy.c0000644000175000017500000001622512364015477022164 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invbuy_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invtran_l.h" #include "g_secid_l.h" #include "types/transaction.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY) AIO_OFX_GROUP *AIO_OfxGroup_INVBUY_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVBUY *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVBUY, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY, g, xg, AIO_OfxGroup_INVBUY_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVBUY_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVBUY_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_INVBUY_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVBUY_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVBUY *xg; xg=(AIO_OFX_GROUP_INVBUY*)p; assert(xg); AB_Transaction_free(xg->transaction); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_INVBUY_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVBUY *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "UNITS")==0 || strcasecmp(tagName, "UNITPRICE")==0 || strcasecmp(tagName, "COMMISSION")==0 || strcasecmp(tagName, "TOTAL")==0 || strcasecmp(tagName, "SUBACCTSEC")==0 || strcasecmp(tagName, "SUBACCTFUND")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "INVTRAN")==0) { gNew=AIO_OfxGroup_INVTRAN_new(tagName, g, ctx); } else if (strcasecmp(tagName, "SECID")==0) { gNew=AIO_OfxGroup_SECID_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_INVBUY_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVBUY *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "UNITS")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITS: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetUnits(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "UNITPRICE")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITPRICE: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetUnitPrice(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "TOTAL")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for TOTAL: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetValue(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "COMMISSION")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for TOTAL: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetCommission(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "SUBACCTSEC")==0) { /* TODO */ } else if (strcasecmp(xg->currentElement, "SUBACCTFUND")==0) { /* TODO */ } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_INVBUY_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_INVBUY *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVTRAN")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_INVTRAN_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetFiId(xg->transaction, AB_Transaction_GetFiId(t)); AB_Transaction_SetValutaDate(xg->transaction, AB_Transaction_GetValutaDate(t)); AB_Transaction_SetDate(xg->transaction, AB_Transaction_GetDate(t)); AB_Transaction_SetPurpose(xg->transaction, AB_Transaction_GetPurpose(t)); } } else if (strcasecmp(s, "SECID")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_SECID_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetUnitId(xg->transaction, AB_Transaction_GetUnitId(t)); AB_Transaction_SetUnitIdNameSpace(xg->transaction, AB_Transaction_GetUnitIdNameSpace(t)); } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", s); } return 0; } AB_TRANSACTION *AIO_OfxGroup_INVBUY_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_INVBUY *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVBUY, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buymf_p.h0000644000175000017500000000206612364015477022314 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BUYMF_P_H #define AIO_OFX_G_BUYMF_P_H #include "g_buymf_l.h" typedef struct AIO_OFX_GROUP_BUYMF AIO_OFX_GROUP_BUYMF; struct AIO_OFX_GROUP_BUYMF { char *currentElement; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_BUYMF_FreeData(void *bp, void *p); static int AIO_OfxGroup_BUYMF_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BUYMF_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_BUYMF_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invposlist_l.h0000644000175000017500000000125612364015477023400 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVPOSLIST_L_H #define AIO_OFX_G_INVPOSLIST_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVPOSLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invposlist_p.h0000644000175000017500000000121512364015477023377 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVPOSLIST_P_H #define AIO_OFX_G_INVPOSLIST_P_H #include "g_invposlist_l.h" static int AIO_OfxGroup_INVPOSLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_status_l.h0000644000175000017500000000131412364015477022504 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STATUS_L_H #define AIO_OFX_G_STATUS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_STATUS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx, const char *description); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtranlist_p.h0000644000175000017500000000244212364015477023545 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de begin : Fri Apr 17 2009 copyright : (C) 2009 by Stephen R. Besch email : sbesch@buffalo.edu begin : Sat May 18 2013 copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVTRANLIST_P_H #define AIO_OFX_G_INVTRANLIST_P_H #include "g_invtranlist_l.h" typedef struct AIO_OFX_GROUP_INVTRANLIST AIO_OFX_GROUP_INVTRANLIST; struct AIO_OFX_GROUP_INVTRANLIST { char *currentElement; char *dtstart; char *dtend; AB_TRANSACTION_LIST2 *transactionList; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVTRANLIST_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVTRANLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVTRANLIST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_INVTRANLIST_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signonmsgsrsv1.c0000644000175000017500000000311512364015477023645 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_signonmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_sonrs_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_SIGNONMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SIGNONMSGSRSV1_StartTag); return g; } int AIO_OfxGroup_SIGNONMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "SONRS")==0) { gNew=AIO_OfxGroup_SONRS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posstock_l.h0000644000175000017500000000124412364015477023030 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_POSSTOCK_L_H #define AIO_OFX_G_POSSTOCK_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_POSSTOCK_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/Makefile.in0000644000175000017500000007234212643540062022236 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/ofx/parser DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libofxparser_la_LIBADD = am_libofxparser_la_OBJECTS = ofxxmlctx.lo ofxgroup.lo g_acctinfo.lo \ g_acctinfors.lo g_acctinfotrnrs.lo g_bal.lo g_bankacc.lo \ g_bankacctinfo.lo g_bankmsgsrsv1.lo g_banktranlist.lo \ g_buymf.lo g_buystock.lo g_creditcardmsgsrsv1.lo g_document.lo \ g_generic.lo g_ignore.lo g_income.lo g_invacc.lo g_invbuy.lo \ g_invpos.lo g_invposlist.lo g_invstmtmsgsrsv1.lo \ g_invstmtrs.lo g_invstmttrnrs.lo g_invtran.lo g_invtranlist.lo \ g_mfinfo.lo g_ofx.lo g_posmf.lo g_posstock.lo g_reinvest.lo \ g_secid.lo g_secinfo.lo g_seclist.lo g_seclistmsgsrsv1.lo \ g_signonmsgsrsv1.lo g_signupmsgsrsv1.lo g_sonrs.lo g_status.lo \ g_stmtrn.lo g_stmtrs.lo g_stmttrnrs.lo g_stockinfo.lo libofxparser_la_OBJECTS = $(am_libofxparser_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libofxparser_la_SOURCES) DIST_SOURCES = $(libofxparser_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) -I$(top_srcdir)/src/libs/aqbanking noinst_LTLIBRARIES = libofxparser.la libofxparser_la_SOURCES = \ ofxxmlctx.c \ ofxgroup.c \ g_acctinfo.c \ g_acctinfors.c \ g_acctinfotrnrs.c \ g_bal.c \ g_bankacc.c \ g_bankacctinfo.c \ g_bankmsgsrsv1.c \ g_banktranlist.c \ g_buymf.c \ g_buystock.c \ g_creditcardmsgsrsv1.c \ g_document.c \ g_generic.c \ g_ignore.c \ g_income.c \ g_invacc.c \ g_invbuy.c \ g_invpos.c \ g_invposlist.c \ g_invstmtmsgsrsv1.c \ g_invstmtrs.c \ g_invstmttrnrs.c \ g_invtran.c \ g_invtranlist.c \ g_mfinfo.c \ g_ofx.c \ g_posmf.c \ g_posstock.c \ g_reinvest.c \ g_secid.c \ g_secinfo.c \ g_seclist.c \ g_seclistmsgsrsv1.c \ g_signonmsgsrsv1.c \ g_signupmsgsrsv1.c \ g_sonrs.c \ g_status.c \ g_stmtrn.c \ g_stmtrs.c \ g_stmttrnrs.c \ g_stockinfo.c noinst_HEADERS = \ ofxxmlctx_l.h ofxxmlctx_p.h \ ofxgroup_l.h ofxgroup_p.h \ g_acctinfo_l.h g_acctinfo_p.h \ g_acctinfors_l.h g_acctinfors_p.h \ g_acctinfotrnrs_l.h g_acctinfotrnrs_p.h \ g_bal_l.h g_bal_p.h \ g_bankacc_l.h g_bankacc_p.h \ g_bankacctinfo_l.h g_bankacctinfo_p.h \ g_bankmsgsrsv1_l.h g_bankmsgsrsv1_p.h \ g_banktranlist_l.h g_banktranlist_p.h \ g_buymf_l.h g_buymf_p.h \ g_buystock_l.h g_buystock_p.h \ g_creditcardmsgsrsv1_l.h g_creditcardmsgsrsv1_p.h \ g_document_l.h g_document_p.h \ g_generic_l.h g_generic_p.h \ g_ignore_l.h g_ignore_p.h \ g_income_l.h g_income_p.h \ g_invacc_l.h g_invacc_p.h \ g_invbuy_l.h g_invbuy_p.h \ g_invpos_l.h g_invpos_p.h \ g_invposlist_l.h g_invposlist_p.h \ g_invstmtmsgsrsv1_l.h g_invstmtmsgsrsv1_p.h \ g_invstmtrs_l.h g_invstmtrs_p.h \ g_invstmttrnrs_l.h g_invstmttrnrs_p.h \ g_invtran_l.h g_invtran_p.h \ g_invtranlist_l.h g_invtranlist_p.h \ g_mfinfo_l.h g_mfinfo_p.h \ g_ofx_l.h g_ofx_p.h \ g_posmf_l.h g_posmf_p.h \ g_posstock_l.h g_posstock_p.h \ g_reinvest_l.h g_reinvest_p.h \ g_secid_l.h g_secid_p.h \ g_secinfo_l.h g_secinfo_p.h \ g_seclist_l.h g_seclist_p.h \ g_seclistmsgsrsv1_l.h g_seclistmsgsrsv1_p.h \ g_signonmsgsrsv1_l.h g_signonmsgsrsv1_p.h \ g_signupmsgsrsv1_l.h g_signupmsgsrsv1_p.h \ g_sonrs_l.h g_sonrs_p.h \ g_status_l.h g_status_p.h \ g_stmtrn_l.h g_stmtrn_p.h \ g_stmtrs_l.h g_stmtrs_p.h \ g_stmttrnrs_l.h g_stmttrnrs_p.h \ g_stockinfo_l.h g_stockinfo_p.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/parser/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/ofx/parser/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libofxparser.la: $(libofxparser_la_OBJECTS) $(libofxparser_la_DEPENDENCIES) $(EXTRA_libofxparser_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libofxparser_la_OBJECTS) $(libofxparser_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_acctinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_acctinfors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_acctinfotrnrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_bal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_bankacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_bankacctinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_bankmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_banktranlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_buymf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_buystock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_creditcardmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_document.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_generic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_ignore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_income.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invbuy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invpos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invposlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invstmtmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invstmtrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invstmttrnrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invtran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_invtranlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_mfinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_ofx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_posmf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_posstock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_reinvest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_secid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_secinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_seclist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_seclistmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_signonmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_signupmsgsrsv1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_sonrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_stmtrn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_stmtrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_stmttrnrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/g_stockinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ofxgroup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ofxxmlctx.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am sources: for f in $(libofxparser_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_seclistmsgsrsv1_p.h0000644000175000017500000000123712364015477024345 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECLISTMSGSRSV1_P_H #define AIO_OFX_G_SECLISTMSGSRSV1_P_H #include "g_seclistmsgsrsv1_l.h" static int AIO_OfxGroup_SECLISTMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secinfo_l.h0000644000175000017500000000234612364015477022615 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECINFO_L_H #define AIO_OFX_G_SECINFO_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SECINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_SECINFO_GetTicker(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECINFO_SetTicker(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_SECINFO_GetSecurityName(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECINFO_SetSecurityName(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_SECINFO_GetUniqueId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECINFO_SetUniqueId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_SECINFO_GetNameSpace(const AIO_OFX_GROUP *g); void AIO_OfxGroup_SECINFO_SetNameSpace(AIO_OFX_GROUP *g, const char *s); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmttrnrs_l.h0000644000175000017500000000125112364015477023241 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTTRNRS_L_H #define AIO_OFX_G_STMTTRNRS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_STMTTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxgroup.c0000644000175000017500000000612112364015477022205 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ofxgroup_p.h" #include #include GWEN_INHERIT_FUNCTIONS(AIO_OFX_GROUP) AIO_OFX_GROUP *AIO_OfxGroup_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; GWEN_NEW_OBJECT(AIO_OFX_GROUP, g); GWEN_INHERIT_INIT(AIO_OFX_GROUP, g); g->parent=parent; g->xmlContext=ctx; if (groupName) g->groupName=strdup(groupName); if (g->xmlContext==NULL && g->parent) g->xmlContext=parent->xmlContext; return g; } void AIO_OfxGroup_free(AIO_OFX_GROUP *g) { if (g) { GWEN_INHERIT_FINI(AIO_OFX_GROUP, g); free(g->groupName); GWEN_FREE_OBJECT(g); } } AIO_OFX_GROUP *AIO_OfxGroup_GetParent(const AIO_OFX_GROUP *g) { assert(g); return g->parent; } GWEN_XML_CONTEXT *AIO_OfxGroup_GetXmlContext(const AIO_OFX_GROUP *g) { assert(g); return g->xmlContext; } const char *AIO_OfxGroup_GetGroupName(const AIO_OFX_GROUP *g) { assert(g); return g->groupName; } AIO_OFX_GROUP_STARTTAG_FN AIO_OfxGroup_SetStartTagFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_STARTTAG_FN f) { AIO_OFX_GROUP_STARTTAG_FN oldFn; assert(g); oldFn=g->startTagFn; g->startTagFn=f; return oldFn; } AIO_OFX_GROUP_ENDTAG_FN AIO_OfxGroup_SetEndTagFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ENDTAG_FN f) { AIO_OFX_GROUP_ENDTAG_FN oldFn; assert(g); oldFn=g->endTagFn; g->endTagFn=f; return oldFn; } AIO_OFX_GROUP_ADDDATA_FN AIO_OfxGroup_SetAddDataFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ADDDATA_FN f) { AIO_OFX_GROUP_ADDDATA_FN oldFn; assert(g); oldFn=g->addDataFn; g->addDataFn=f; return oldFn; } AIO_OFX_GROUP_ENDSUBGROUP_FN AIO_OfxGroup_SetEndSubGroupFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ENDSUBGROUP_FN f) { AIO_OFX_GROUP_ENDSUBGROUP_FN oldFn; assert(g); oldFn=g->endSubGroupFn; g->endSubGroupFn=f; return oldFn; } int AIO_OfxGroup_StartTag(AIO_OFX_GROUP *g, const char *tagName) { assert(g); if (g->startTagFn) return g->startTagFn(g, tagName); else return GWEN_ERROR_NOT_IMPLEMENTED; } int AIO_OfxGroup_EndTag(AIO_OFX_GROUP *g, const char *tagName) { assert(g); if (g->endTagFn) return g->endTagFn(g, tagName); else return GWEN_ERROR_NOT_IMPLEMENTED; } int AIO_OfxGroup_AddData(AIO_OFX_GROUP *g, const char *data) { assert(g); if (g->addDataFn) return g->addDataFn(g, data); else return GWEN_ERROR_NOT_IMPLEMENTED; } int AIO_OfxGroup_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { assert(g); if (g->endSubGroupFn) return g->endSubGroupFn(g, sg); else return GWEN_ERROR_NOT_IMPLEMENTED; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmttrnrs_p.h0000644000175000017500000000122712364015477023765 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTTRNRS_P_H #define AIO_OFX_G_INVSTMTTRNRS_P_H #include "g_invstmttrnrs_l.h" static int AIO_OfxGroup_INVSTMTTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invpos_p.h0000644000175000017500000000177712364015477022520 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVPOS_P_H #define AIO_OFX_G_INVPOS_P_H #include "g_invpos_l.h" typedef struct AIO_OFX_GROUP_INVPOS AIO_OFX_GROUP_INVPOS; struct AIO_OFX_GROUP_INVPOS { char *currentElement; char *currency; AB_SECURITY *security; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVPOS_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVPOS_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVPOS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_INVPOS_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stockinfo_p.h0000644000175000017500000000130712364015477023166 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STOCKINFO_P_H #define AIO_OFX_G_STOCKINFO_P_H #include "g_stockinfo_l.h" int AIO_OfxGroup_STOCKINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName); int AIO_OfxGroup_STOCKINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invbuy_p.h0000644000175000017500000000212212364015477022477 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVBUY_P_H #define AIO_OFX_G_INVBUY_P_H #include "g_invbuy_l.h" typedef struct AIO_OFX_GROUP_INVBUY AIO_OFX_GROUP_INVBUY; struct AIO_OFX_GROUP_INVBUY { char *currentElement; char *currency; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVBUY_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVBUY_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVBUY_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_INVBUY_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_mfinfo_l.h0000644000175000017500000000136512364015477022445 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_MFINFO_L_H #define AIO_OFX_G_MFINFO_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_MFINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_sonrs_p.h0000644000175000017500000000117312364015477022334 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SONRS_P_H #define AIO_OFX_G_SONRS_P_H #include "g_sonrs_l.h" static int AIO_OfxGroup_SONRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ofx_l.h0000644000175000017500000000123112364015477021753 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_OFX_L_H #define AIO_OFX_G_OFX_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_OFX_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secinfo_p.h0000644000175000017500000000205512364015477022616 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECINFO_P_H #define AIO_OFX_G_SECINFO_P_H #include "g_secinfo_l.h" typedef struct AIO_OFX_GROUP_SECINFO AIO_OFX_GROUP_SECINFO; struct AIO_OFX_GROUP_SECINFO { char *secname; char *ticker; char *uniqueId; char *nameSpace; char *currentElement; }; static void GWENHYWFAR_CB AIO_OfxGroup_SECINFO_FreeData(void *bp, void *p); static int AIO_OfxGroup_SECINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_SECINFO_AddData(AIO_OFX_GROUP *g, const char *data); static int AIO_OfxGroup_SECINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invacc_p.h0000644000175000017500000000245112364015477022433 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Thur Apr 23 2009 copyright : (C) 2009 by Stephen R. Besch (C) 2008 by Martin Preuss email : sbesch@buffalo.edu martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ /*This is the public part of the include file for g_invacc.c*/ #ifndef AIO_OFX_G_INVACC_P_H #define AIO_OFX_G_INVACC_P_H #include "g_invacc_l.h" /*Include the private part of the file*/ /*The and groups include and tags. To these we add an additional field for the account type and the Object required currentElement field.*/ typedef struct AIO_OFX_GROUP_INVACC AIO_OFX_GROUP_INVACC; struct AIO_OFX_GROUP_INVACC { char *brokerId; char *accId; char *accType; char *currentElement; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVACC_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVACC_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVACC_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signupmsgsrsv1.c0000644000175000017500000000314512364015477023660 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_signupmsgsrsv1_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_acctinfotrnrs_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_SIGNUPMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SIGNUPMSGSRSV1_StartTag); return g; } int AIO_OfxGroup_SIGNUPMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "ACCTINFOTRNRS")==0) { gNew=AIO_OfxGroup_ACCTINFOTRNRS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invacc_l.h0000644000175000017500000000214512364015477022427 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Thur Apr 23 2009 copyright : (C) 2009 by Stephen R. Besch (C) 2008 by Martin Preuss email : sbesch@buffalo.edu martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVACC_L_H #define AIO_OFX_G_INVACC_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVACC_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_INVACC_GetBrokerId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_INVACC_SetBrokerId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_INVACC_GetAccId(const AIO_OFX_GROUP *g); void AIO_OfxGroup_INVACC_SetAccId(AIO_OFX_GROUP *g, const char *s); const char *AIO_OfxGroup_INVACC_GetAccType(const AIO_OFX_GROUP *g); void AIO_OfxGroup_INVACC_SetAccType(AIO_OFX_GROUP *g, const char *s); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrs.c0000644000175000017500000001772512364015477022212 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_stmtrs_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_bankacc_l.h" #include "g_banktranlist_l.h" #include "g_bal_l.h" #include #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRS) AIO_OFX_GROUP *AIO_OfxGroup_STMTRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_STMTRS *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_STMTRS, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRS, g, xg, AIO_OfxGroup_STMTRS_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_STMTRS_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_STMTRS_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_STMTRS_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_STMTRS_FreeData(void *bp, void *p) { AIO_OFX_GROUP_STMTRS *xg; xg=(AIO_OFX_GROUP_STMTRS*)p; assert(xg); free(xg->currency); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_STMTRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_STMTRS *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "CURDEF")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "BANKACCTFROM")==0) { gNew=AIO_OfxGroup_BANKACC_new(tagName, g, ctx); } else if (strcasecmp(tagName, "CCACCTFROM")==0) { gNew=AIO_OfxGroup_BANKACC_new(tagName, g, ctx); } else if (strcasecmp(tagName, "BANKTRANLIST")==0) { gNew=AIO_OfxGroup_BANKTRANLIST_new(tagName, g, ctx); } else if (strcasecmp(tagName, "LEDGERBAL")==0) { gNew=AIO_OfxGroup_BAL_new(tagName, g, ctx); } else if (strcasecmp(tagName, "AVAILBAL")==0) { gNew=AIO_OfxGroup_BAL_new(tagName, g, ctx); } else if (strcasecmp(tagName, "MKTGINFO")==0) { /* ignore marketing info */ } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_STMTRS_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_STMTRS *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRS, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "CURDEF")==0) { free(xg->currency); xg->currency=strdup(s); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_STMTRS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_STMTRS *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "BANKACCTFROM")==0 || strcasecmp(s, "CCACCTFROM")==0) { AB_IMEXPORTER_ACCOUNTINFO *ai; const char *s; DBG_INFO(AQBANKING_LOGDOMAIN, "Importing account %s/%s", AIO_OfxGroup_BANKACC_GetBankId(sg), AIO_OfxGroup_BANKACC_GetAccId(sg)); ai=AB_ImExporterAccountInfo_new(); assert(ai); s=AIO_OfxGroup_BANKACC_GetBankId(sg); if (s) AB_ImExporterAccountInfo_SetBankCode(ai, s); s=AIO_OfxGroup_BANKACC_GetAccId(sg); if (s) AB_ImExporterAccountInfo_SetAccountNumber(ai, s); /* set currency */ if (xg->currency) AB_ImExporterAccountInfo_SetCurrency(ai, xg->currency); /* set account type, if known */ s=AIO_OfxGroup_BANKACC_GetAccType(sg); if (!s) s="BANK"; /* not a real code */ if (s) { AB_ACCOUNT_TYPE t; t=AIO_OfxGroup_Generic_AccountTypeFromString(s); AB_ImExporterAccountInfo_SetType(ai, t); } DBG_INFO(AQBANKING_LOGDOMAIN, "Adding account"); AB_ImExporterContext_AddAccountInfo(AIO_OfxXmlCtx_GetIoContext(ctx), ai); xg->accountInfo=ai; } else if (strcasecmp(s, "BANKTRANLIST")==0) { AB_TRANSACTION_LIST2 *tl; tl=AIO_OfxGroup_BANKTRANLIST_TakeTransactionList(sg); if (tl) { AB_TRANSACTION_LIST2_ITERATOR *it; it=AB_Transaction_List2_First(tl); if (it) { AB_TRANSACTION *t; t=AB_Transaction_List2Iterator_Data(it); while(t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Importing transaction"); /* set currency if missing */ if (xg->currency) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v && AB_Value_GetCurrency(v)==NULL) { AB_VALUE *v2; v2=AB_Value_dup(v); AB_Value_SetCurrency(v2, xg->currency); AB_Transaction_SetValue(t, v2); AB_Value_free(v2); } } AB_ImExporterAccountInfo_AddTransaction(xg->accountInfo, t); t=AB_Transaction_List2Iterator_Next(it); } AB_Transaction_List2Iterator_free(it); } /* don't call AB_Transaction_List2_freeAll(), because the transactions * from the list have been taken over by the AccountInfo object */ AB_Transaction_List2_free(tl); } } else if (strcasecmp(s, "LEDGERBAL")==0) { const GWEN_TIME *ti; const AB_VALUE *v; ti=AIO_OfxGroup_BAL_GetDate(sg); v=AIO_OfxGroup_BAL_GetValue(sg); if (v) { AB_ACCOUNT_STATUS *ast; AB_BALANCE *bal; ast=AB_AccountStatus_new(); AB_AccountStatus_SetTime(ast, ti); bal=AB_Balance_new(v, ti); if (xg->currency && AB_Value_GetCurrency(v)==NULL) { AB_VALUE *v2; v2=AB_Value_dup(v); AB_Value_SetCurrency(v2, xg->currency); AB_Balance_SetValue(bal, v2); AB_Value_free(v2); } AB_AccountStatus_SetBookedBalance(ast, bal); AB_Balance_free(bal); DBG_INFO(AQBANKING_LOGDOMAIN, "Adding account status"); AB_ImExporterAccountInfo_AddAccountStatus(xg->accountInfo, ast); } } else if (strcasecmp(s, "AVAILBAL")==0) { const GWEN_TIME *ti; const AB_VALUE *v; ti=AIO_OfxGroup_BAL_GetDate(sg); v=AIO_OfxGroup_BAL_GetValue(sg); if (v) { AB_ACCOUNT_STATUS *ast; AB_BALANCE *bal; ast=AB_AccountStatus_new(); AB_AccountStatus_SetTime(ast, ti); bal=AB_Balance_new(v, ti); if (xg->currency && AB_Value_GetCurrency(v)==NULL) { AB_VALUE *v2; v2=AB_Value_dup(v); AB_Value_SetCurrency(v2, xg->currency); AB_Balance_SetValue(bal, v2); AB_Value_free(v2); } AB_AccountStatus_SetNotedBalance(ast, bal); AB_Balance_free(bal); DBG_INFO(AQBANKING_LOGDOMAIN, "Adding account status"); AB_ImExporterAccountInfo_AddAccountStatus(xg->accountInfo, ast); } } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buystock_l.h0000644000175000017500000000160712364015477023031 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BUYSTOCK_L_H #define AIO_OFX_G_BUYSTOCK_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BUYSTOCK_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_BUYSTOCK_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxgroup_p.h0000644000175000017500000000152512364015477022534 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_OFXGROUP_P_H #define AIO_OFX_OFXGROUP_P_H #include "ofxgroup_l.h" struct AIO_OFX_GROUP { GWEN_INHERIT_ELEMENT(AIO_OFX_GROUP) AIO_OFX_GROUP *parent; GWEN_XML_CONTEXT *xmlContext; char *groupName; AIO_OFX_GROUP_STARTTAG_FN startTagFn; AIO_OFX_GROUP_ENDTAG_FN endTagFn; AIO_OFX_GROUP_ADDDATA_FN addDataFn; AIO_OFX_GROUP_ENDSUBGROUP_FN endSubGroupFn; }; #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secid_p.h0000644000175000017500000000201312364015477022251 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SECID_P_H #define AIO_OFX_G_SECID_P_H #include "g_secid_l.h" typedef struct AIO_OFX_GROUP_SECID AIO_OFX_GROUP_SECID; struct AIO_OFX_GROUP_SECID { char *uniqueId; char *nameSpace; char *currentElement; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_SECID_FreeData(void *bp, void *p); static int AIO_OfxGroup_SECID_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_SECID_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfors_p.h0000644000175000017500000000131412364015477023320 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFORS_P_H #define AIO_OFX_G_ACCTINFORS_P_H #include "g_acctinfors_l.h" int AIO_OfxGroup_ACCTINFORS_StartTag(AIO_OFX_GROUP *g, const char *tagName); int AIO_OfxGroup_ACCTINFORS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/Makefile.am0000644000175000017500000000462312364015477022231 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) -I$(top_srcdir)/src/libs/aqbanking noinst_LTLIBRARIES=libofxparser.la libofxparser_la_SOURCES=\ ofxxmlctx.c \ ofxgroup.c \ g_acctinfo.c \ g_acctinfors.c \ g_acctinfotrnrs.c \ g_bal.c \ g_bankacc.c \ g_bankacctinfo.c \ g_bankmsgsrsv1.c \ g_banktranlist.c \ g_buymf.c \ g_buystock.c \ g_creditcardmsgsrsv1.c \ g_document.c \ g_generic.c \ g_ignore.c \ g_income.c \ g_invacc.c \ g_invbuy.c \ g_invpos.c \ g_invposlist.c \ g_invstmtmsgsrsv1.c \ g_invstmtrs.c \ g_invstmttrnrs.c \ g_invtran.c \ g_invtranlist.c \ g_mfinfo.c \ g_ofx.c \ g_posmf.c \ g_posstock.c \ g_reinvest.c \ g_secid.c \ g_secinfo.c \ g_seclist.c \ g_seclistmsgsrsv1.c \ g_signonmsgsrsv1.c \ g_signupmsgsrsv1.c \ g_sonrs.c \ g_status.c \ g_stmtrn.c \ g_stmtrs.c \ g_stmttrnrs.c \ g_stockinfo.c noinst_HEADERS=\ ofxxmlctx_l.h ofxxmlctx_p.h \ ofxgroup_l.h ofxgroup_p.h \ g_acctinfo_l.h g_acctinfo_p.h \ g_acctinfors_l.h g_acctinfors_p.h \ g_acctinfotrnrs_l.h g_acctinfotrnrs_p.h \ g_bal_l.h g_bal_p.h \ g_bankacc_l.h g_bankacc_p.h \ g_bankacctinfo_l.h g_bankacctinfo_p.h \ g_bankmsgsrsv1_l.h g_bankmsgsrsv1_p.h \ g_banktranlist_l.h g_banktranlist_p.h \ g_buymf_l.h g_buymf_p.h \ g_buystock_l.h g_buystock_p.h \ g_creditcardmsgsrsv1_l.h g_creditcardmsgsrsv1_p.h \ g_document_l.h g_document_p.h \ g_generic_l.h g_generic_p.h \ g_ignore_l.h g_ignore_p.h \ g_income_l.h g_income_p.h \ g_invacc_l.h g_invacc_p.h \ g_invbuy_l.h g_invbuy_p.h \ g_invpos_l.h g_invpos_p.h \ g_invposlist_l.h g_invposlist_p.h \ g_invstmtmsgsrsv1_l.h g_invstmtmsgsrsv1_p.h \ g_invstmtrs_l.h g_invstmtrs_p.h \ g_invstmttrnrs_l.h g_invstmttrnrs_p.h \ g_invtran_l.h g_invtran_p.h \ g_invtranlist_l.h g_invtranlist_p.h \ g_mfinfo_l.h g_mfinfo_p.h \ g_ofx_l.h g_ofx_p.h \ g_posmf_l.h g_posmf_p.h \ g_posstock_l.h g_posstock_p.h \ g_reinvest_l.h g_reinvest_p.h \ g_secid_l.h g_secid_p.h \ g_secinfo_l.h g_secinfo_p.h \ g_seclist_l.h g_seclist_p.h \ g_seclistmsgsrsv1_l.h g_seclistmsgsrsv1_p.h \ g_signonmsgsrsv1_l.h g_signonmsgsrsv1_p.h \ g_signupmsgsrsv1_l.h g_signupmsgsrsv1_p.h \ g_sonrs_l.h g_sonrs_p.h \ g_status_l.h g_status_p.h \ g_stmtrn_l.h g_stmtrn_p.h \ g_stmtrs_l.h g_stmtrs_p.h \ g_stmttrnrs_l.h g_stmttrnrs_p.h \ g_stockinfo_l.h g_stockinfo_p.h sources: for f in $(libofxparser_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxgroup_l.h0000644000175000017500000000430312364015477022525 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_OFXGROUP_L_H #define AIO_OFX_OFXGROUP_L_H #include #include #include typedef struct AIO_OFX_GROUP AIO_OFX_GROUP; GWEN_INHERIT_FUNCTION_DEFS(AIO_OFX_GROUP) typedef int (*AIO_OFX_GROUP_STARTTAG_FN)(AIO_OFX_GROUP *g, const char *tagName); typedef int (*AIO_OFX_GROUP_ENDTAG_FN)(AIO_OFX_GROUP *g, const char *tagName); typedef int (*AIO_OFX_GROUP_ADDDATA_FN)(AIO_OFX_GROUP *g, const char *data); typedef int (*AIO_OFX_GROUP_ENDSUBGROUP_FN)(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); AIO_OFX_GROUP *AIO_OfxGroup_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); void AIO_OfxGroup_free(AIO_OFX_GROUP *g); AIO_OFX_GROUP *AIO_OfxGroup_GetParent(const AIO_OFX_GROUP *g); GWEN_XML_CONTEXT *AIO_OfxGroup_GetXmlContext(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_GetGroupName(const AIO_OFX_GROUP *g); AIO_OFX_GROUP_STARTTAG_FN AIO_OfxGroup_SetStartTagFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_STARTTAG_FN f); AIO_OFX_GROUP_ENDTAG_FN AIO_OfxGroup_SetEndTagFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ENDTAG_FN f); AIO_OFX_GROUP_ADDDATA_FN AIO_OfxGroup_SetAddDataFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ADDDATA_FN f); AIO_OFX_GROUP_ENDSUBGROUP_FN AIO_OfxGroup_SetEndSubGroupFn(AIO_OFX_GROUP *g, AIO_OFX_GROUP_ENDSUBGROUP_FN f); int AIO_OfxGroup_StartTag(AIO_OFX_GROUP *g, const char *tagName); /** * @return 1 if this tag ends the current group, 0 otherwise (<0 on error) */ int AIO_OfxGroup_EndTag(AIO_OFX_GROUP *g, const char *tagName); int AIO_OfxGroup_AddData(AIO_OFX_GROUP *g, const char *data); int AIO_OfxGroup_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buymf.c0000644000175000017500000001075112364015477021770 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_buymf_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invbuy_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF) AIO_OFX_GROUP *AIO_OfxGroup_BUYMF_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BUYMF *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BUYMF, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF, g, xg, AIO_OfxGroup_BUYMF_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BUYMF_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BUYMF_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_BUYMF_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BUYMF_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BUYMF *xg; xg=(AIO_OFX_GROUP_BUYMF*)p; assert(xg); AB_Transaction_free(xg->transaction); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_BUYMF_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BUYMF *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "BUYTYPE")==0 || strcasecmp(tagName, "SELLTYPE")==0) { /* TODO */ } else if (strcasecmp(tagName, "INVBUY")==0 || strcasecmp(tagName, "INVSELL")==0) { gNew=AIO_OfxGroup_INVBUY_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_BUYMF_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BUYMF *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "BUYTYPE")==0 || (strcasecmp(xg->currentElement, "SELLTYPE") ==0)) { /*TODO*/ } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_BUYMF_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_BUYMF *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVBUY")==0 || strcasecmp(s, "INVSELL")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_INVBUY_TakeTransaction(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding transaction"); xg->transaction=t; /*TODO*/ } } return 0; } AB_TRANSACTION *AIO_OfxGroup_BUYMF_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_BUYMF *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYMF, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_generic_p.h0000644000175000017500000000142512364015477022604 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_GENERIC_P_H #define AIO_OFX_G_GENERIC_P_H #include "g_generic_l.h" static int AIO_OfxGroup_Generic_EndTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_Generic_AddData(AIO_OFX_GROUP *g, const char *data); static int AIO_OfxGroup_Generic_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bankacctinfo_p.h0000644000175000017500000000210612364015477023607 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKACCTINFO_P_H #define AIO_OFX_G_BANKACCTINFO_P_H #include "g_bankacctinfo_l.h" typedef struct AIO_OFX_GROUP_BANKACCTINFO AIO_OFX_GROUP_BANKACCTINFO; struct AIO_OFX_GROUP_BANKACCTINFO { char *currentElement; char *bankId; char *accId; char *accType; }; static void GWENHYWFAR_CB AIO_OfxGroup_BANKACCTINFO_FreeData(void *bp, void *p); static int AIO_OfxGroup_BANKACCTINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BANKACCTINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_BANKACCTINFO_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfo.c0000644000175000017500000001303712364015477022434 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_acctinfo_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_bankacc_l.h" #include "g_bankacctinfo_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO) AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_ACCTINFO *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_ACCTINFO, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g, xg, AIO_OfxGroup_ACCTINFO_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_ACCTINFO_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_ACCTINFO_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_ACCTINFO_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_ACCTINFO_FreeData(void *bp, void *p) { AIO_OFX_GROUP_ACCTINFO *xg; xg=(AIO_OFX_GROUP_ACCTINFO*)p; assert(xg); free(xg->description); free(xg->bankId); free(xg->accId); free(xg->accType); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_ACCTINFO_GetBankId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_ACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); return xg->bankId; } const char *AIO_OfxGroup_ACCTINFO_GetAccId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_ACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); return xg->accId; } const char *AIO_OfxGroup_ACCTINFO_GetAccType(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_ACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); return xg->accType; } const char *AIO_OfxGroup_ACCTINFO_GetAccDescr(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_ACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); return xg->description; } int AIO_OfxGroup_ACCTINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_ACCTINFO *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "DESC")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "BANKACCTINFO")==0 || strcasecmp(tagName, "CCACCTINFO")==0 || strcasecmp(tagName, "BPACCTINFO")==0 || strcasecmp(tagName, "INVACCTINFO")==0) { gNew=AIO_OfxGroup_BANKACCTINFO_new(tagName, g, ctx); } else if (strcasecmp(tagName, "DESC")==0) { xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_ACCTINFO_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_ACCTINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "DESC")==0) { free(xg->description); xg->description=strdup(s); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_ACCTINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_ACCTINFO *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_ACCTINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "BANKACCTINFO")==0 || strcasecmp(s, "CCACCTINFO")==0 || strcasecmp(s, "BPACCTINFO")==0 || strcasecmp(s, "INVACCTINFO")==0) { const char *s; s=AIO_OfxGroup_BANKACCTINFO_GetBankId(sg); free(xg->bankId); if (s) xg->bankId=strdup(s); else xg->bankId=NULL; s=AIO_OfxGroup_BANKACCTINFO_GetAccId(sg); free(xg->accId); if (s) xg->accId=strdup(s); else xg->accId=NULL; s=AIO_OfxGroup_BANKACCTINFO_GetAccType(sg); free(xg->accType); if (s) xg->accType=strdup(s); else xg->accType=NULL; } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signonmsgsrsv1_l.h0000644000175000017500000000130212364015477024161 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SIGNONMSGSRSV1_L_H #define AIO_OFX_G_SIGNONMSGSRSV1_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_SIGNONMSGSRSV1_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfors_l.h0000644000175000017500000000125612364015477023321 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFORS_L_H #define AIO_OFX_G_ACCTINFORS_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFORS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_generic.c0000644000175000017500000000504412364015477022261 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_generic_p.h" #include "ofxxmlctx_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_Generic_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetEndTagFn(g, AIO_OfxGroup_Generic_EndTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_Generic_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_Generic_EndSubGroup); return g; } int AIO_OfxGroup_Generic_EndTag(AIO_OFX_GROUP *g, const char *tagName) { assert(g); if (strcasecmp(AIO_OfxGroup_GetGroupName(g), tagName)!=0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Tag [%s] does not close [%s], ignoring", tagName, AIO_OfxGroup_GetGroupName(g)); /*return GWEN_ERROR_BAD_DATA;*/ return 0; } /* always end this tag */ return 1; } int AIO_OfxGroup_Generic_AddData(AIO_OFX_GROUP *g, const char *data) { assert(g); /* just ignore the data */ return 0; } int AIO_OfxGroup_Generic_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg){ assert(g); /* just ignore the end of sub group */ return 0; } AB_ACCOUNT_TYPE AIO_OfxGroup_Generic_AccountTypeFromString(const char *s) { AB_ACCOUNT_TYPE t; if (strcasecmp(s, "CHECKING")==0) t=AB_AccountType_Checking; else if (strcasecmp(s, "SAVINGS")==0) t=AB_AccountType_Savings; else if (strcasecmp(s, "MONEYMRKT")==0) t=AB_AccountType_MoneyMarket; else if (strcasecmp(s, "INVESTMENT")==0) t=AB_AccountType_Investment; /*INVESTMENT String added by SRB 4/23/09*/ else if (strcasecmp(s, "CREDITLINE")==0) t=AB_AccountType_Bank; else if (strcasecmp(s, "BANK")==0) /* not a real code */ t=AB_AccountType_Bank; else if (strcasecmp(s, "CREDITCARD")==0) /* not a real code */ t=AB_AccountType_CreditCard; else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown account type [%s], assuming bank account", s); t=AB_AccountType_Bank; } return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtrs_p.h0000644000175000017500000000205612364015477023242 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVSTMTRS_P_H #define AIO_OFX_G_INVSTMTRS_P_H #include "g_invstmtrs_l.h" typedef struct AIO_OFX_GROUP_INVSTMTRS AIO_OFX_GROUP_INVSTMTRS; struct AIO_OFX_GROUP_INVSTMTRS { char *currentElement; char *currency; AB_IMEXPORTER_ACCOUNTINFO *accountInfo; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVSTMTRS_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVSTMTRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVSTMTRS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_INVSTMTRS_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/ofxxmlctx_l.h0000644000175000017500000000306412364015477022713 00000000000000/*************************************************************************** begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_OFXXMLCTX_L_H #define AIO_OFX_OFXXMLCTX_L_H #include "ofxgroup_l.h" #include #include GWEN_XML_CONTEXT *AIO_OfxXmlCtx_new(uint32_t flags, AB_IMEXPORTER_CONTEXT *ioContext); const char *AIO_OfxXmlCtx_GetCharset(const GWEN_XML_CONTEXT *ctx); void AIO_OfxXmlCtx_SetCharset(GWEN_XML_CONTEXT *ctx, const char *s); int AIO_OfxXmlCtx_GetResultCode(const GWEN_XML_CONTEXT *ctx); void AIO_OfxXmlCtx_SetResultCode(GWEN_XML_CONTEXT *ctx, int i); const char *AIO_OfxXmlCtx_GetResultSeverity(const GWEN_XML_CONTEXT *ctx); void AIO_OfxXmlCtx_SetResultSeverity(GWEN_XML_CONTEXT *ctx, const char *s); AB_IMEXPORTER_CONTEXT *AIO_OfxXmlCtx_GetIoContext(const GWEN_XML_CONTEXT *ctx); AIO_OFX_GROUP *AIO_OfxXmlCtx_GetCurrentGroup(const GWEN_XML_CONTEXT *ctx); void AIO_OfxXmlCtx_SetCurrentGroup(GWEN_XML_CONTEXT *ctx, AIO_OFX_GROUP *g); const char *AIO_OfxXmlCtx_GetCurrentTagName(const GWEN_XML_CONTEXT *ctx); void AIO_OfxXmlCtx_SetCurrentTagName(GWEN_XML_CONTEXT *ctx, const char *s); int AIO_OfxXmlCtx_SanitizeData(GWEN_XML_CONTEXT *ctx, const char *data, GWEN_BUFFER *buf); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtran.c0000644000175000017500000001112512364015477022323 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invtran_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRAN) AIO_OFX_GROUP *AIO_OfxGroup_INVTRAN_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVTRAN *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVTRAN, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRAN, g, xg, AIO_OfxGroup_INVTRAN_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVTRAN_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVTRAN_AddData); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVTRAN_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVTRAN *xg; xg=(AIO_OFX_GROUP_INVTRAN*)p; assert(xg); free(xg->currentElement); AB_Transaction_free(xg->transaction); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_INVTRAN_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVTRAN *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRAN, g); assert(xg); if (strcasecmp(tagName, "FITID")==0 || strcasecmp(tagName, "DTTRADE")==0 || strcasecmp(tagName, "DTSETTLE")==0 || strcasecmp(tagName, "MEMO")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } return 0; } int AIO_OfxGroup_INVTRAN_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVTRAN *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRAN, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "FITID")==0) { AB_Transaction_SetFiId(xg->transaction, s); } else if (strcasecmp(xg->currentElement, "DTTRADE")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTTRADE: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetValutaDate(xg->transaction, ti); GWEN_Time_free(ti); } else if (strcasecmp(xg->currentElement, "DTSETTLE")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTSETTLE: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetDate(xg->transaction, ti); GWEN_Time_free(ti); } else if (strcasecmp(xg->currentElement, "MEMO")==0) { AB_Transaction_AddPurpose(xg->transaction, s, 1); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } AB_TRANSACTION *AIO_OfxGroup_INVTRAN_TakeData(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_INVTRAN *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVTRAN, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signupmsgsrsv1_p.h0000644000175000017500000000123212364015477024177 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SIGNUPMSGSRSV1_P_H #define AIO_OFX_G_SIGNUPMSGSRSV1_P_H #include "g_signupmsgsrsv1_l.h" static int AIO_OfxGroup_SIGNUPMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buystock.c0000644000175000017500000001106412364015477022507 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_buystock_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invbuy_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK) AIO_OFX_GROUP *AIO_OfxGroup_BUYSTOCK_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BUYSTOCK *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BUYSTOCK, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK, g, xg, AIO_OfxGroup_BUYSTOCK_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BUYSTOCK_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BUYSTOCK_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_BUYSTOCK_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BUYSTOCK_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BUYSTOCK *xg; xg=(AIO_OFX_GROUP_BUYSTOCK*)p; assert(xg); AB_Transaction_free(xg->transaction); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_BUYSTOCK_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BUYSTOCK *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "BUYTYPE")==0 || strcasecmp(tagName, "SELLTYPE")==0) { /* TODO */ } else if (strcasecmp(tagName, "INVBUY")==0 || strcasecmp(tagName, "INVSELL")==0) { gNew=AIO_OfxGroup_INVBUY_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_BUYSTOCK_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BUYSTOCK *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "BUYTYPE")==0 || (strcasecmp(xg->currentElement, "SELLTYPE") ==0)) { /*TODO*/ } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_BUYSTOCK_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_BUYSTOCK *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVBUY")==0 || strcasecmp(s, "INVSELL")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_INVBUY_TakeTransaction(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding transaction"); xg->transaction=t; /*TODO*/ } } return 0; } AB_TRANSACTION *AIO_OfxGroup_BUYSTOCK_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_BUYSTOCK *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BUYSTOCK, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_buystock_p.h0000644000175000017500000000212412364015477023030 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BUYSTOCK_P_H #define AIO_OFX_G_BUYSTOCK_P_H #include "g_buystock_l.h" typedef struct AIO_OFX_GROUP_BUYSTOCK AIO_OFX_GROUP_BUYSTOCK; struct AIO_OFX_GROUP_BUYSTOCK { char *currentElement; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_BUYSTOCK_FreeData(void *bp, void *p); static int AIO_OfxGroup_BUYSTOCK_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BUYSTOCK_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_BUYSTOCK_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_banktranlist_l.h0000644000175000017500000000143012364015477023654 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKTRANLIST_L_H #define AIO_OFX_G_BANKTRANLIST_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_BANKTRANLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION_LIST2* AIO_OfxGroup_BANKTRANLIST_TakeTransactionList(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secid.c0000644000175000017500000001075412364015477021740 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_secid_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID) AIO_OFX_GROUP *AIO_OfxGroup_SECID_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_SECID *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_SECID, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g, xg, AIO_OfxGroup_SECID_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SECID_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_SECID_AddData); return g; } GWENHYWFAR_CB void AIO_OfxGroup_SECID_FreeData(void *bp, void *p) { AIO_OFX_GROUP_SECID *xg; xg=(AIO_OFX_GROUP_SECID*)p; assert(xg); free(xg->currentElement); free(xg->uniqueId); free(xg->nameSpace); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_SECID_GetUniqueId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); return xg->uniqueId; } void AIO_OfxGroup_SECID_SetUniqueId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); free(xg->uniqueId); if (s) xg->uniqueId=strdup(s); else xg->uniqueId=NULL; } const char *AIO_OfxGroup_SECID_GetNameSpace(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); return xg->nameSpace; } void AIO_OfxGroup_SECID_SetNameSpace(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); free(xg->nameSpace); if (s) xg->nameSpace=strdup(s); else xg->nameSpace=NULL; } int AIO_OfxGroup_SECID_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "UNIQUEID")==0 || strcasecmp(tagName, "UNIQUEIDTYPE")==0) { xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } return 0; } int AIO_OfxGroup_SECID_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_SECID *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "UNIQUEID")==0) AIO_OfxGroup_SECID_SetUniqueId(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "UNIQUEIDTYPE")==0) AIO_OfxGroup_SECID_SetNameSpace(g, GWEN_Buffer_GetStart(buf)); else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } AB_TRANSACTION *AIO_OfxGroup_SECID_TakeData(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_SECID *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECID, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ignore.c0000644000175000017500000000544712364015477022137 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_ignore_p.h" #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_IGNORE) AIO_OFX_GROUP *AIO_OfxGroup_Ignore_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_IGNORE *xg; /* create base group */ g=AIO_OfxGroup_new(groupName, parent, ctx); assert(g); /* create extension, assign to base group */ GWEN_NEW_OBJECT(AIO_OFX_GROUP_IGNORE, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_IGNORE, g, xg, AIO_OfxGroup_Ignore_FreeData); xg->openTags=GWEN_StringList_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_Ignore_StartTag); AIO_OfxGroup_SetEndTagFn(g, AIO_OfxGroup_Ignore_EndTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_Ignore_AddData); return g; } GWENHYWFAR_CB void AIO_OfxGroup_Ignore_FreeData(void *bp, void *p) { AIO_OFX_GROUP_IGNORE *xg; xg=(AIO_OFX_GROUP_IGNORE*)p; GWEN_StringList_free(xg->openTags); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_Ignore_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_IGNORE *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_IGNORE, g); assert(xg); /* just insert the new tag into list */ GWEN_StringList_InsertString(xg->openTags, tagName, 0, 0); return 0; } int AIO_OfxGroup_Ignore_EndTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_IGNORE *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_IGNORE, g); assert(xg); if (strcasecmp(AIO_OfxGroup_GetGroupName(g), tagName)==0) /* ending this tag */ return 1; /* should be a subtag */ for (;;) { const char *s; s=GWEN_StringList_FirstString(xg->openTags); if (!s) /* empty and it is not our name, so let tha caller try parents */ break; /* remove 1st open tag in any case */ GWEN_StringList_RemoveString(xg->openTags, s); if (strcasecmp(s, tagName)==0) /* it was the one we wanted, stop here */ break; /* otherwise this loop continues to remove all subtags until the * matching one is found */ } return 0; } int AIO_OfxGroup_Ignore_AddData(AIO_OFX_GROUP *g, const char *data) { /* just ignore the data */ return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stockinfo_l.h0000644000175000017500000000125112364015477023160 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STOCKINFO_L_H #define AIO_OFX_G_STOCKINFO_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_STOCKINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posmf_l.h0000644000175000017500000000136012364015477022306 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_POSMF_L_H #define AIO_OFX_G_POSMF_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_POSMF_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posstock_p.h0000644000175000017500000000134112364015477023032 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_POSSTOCK_P_H #define AIO_OFX_G_POSSTOCK_P_H #include "g_posstock_l.h" static int AIO_OfxGroup_POSSTOCK_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_POSSTOCK_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_posmf_p.h0000644000175000017500000000144012364015477022311 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_POSMF_P_H #define AIO_OFX_G_POSMF_P_H #include "g_posmf_l.h" static int AIO_OfxGroup_POSMF_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_POSMF_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtranlist_l.h0000644000175000017500000000174512364015477023546 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de begin : Fri Apr 17 2009 copyright : (C) 2009 by Stephen R. Besch email : sbesch@buffalo.edu begin : Sat May 18 2013 copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVTRANLIST_L_H #define AIO_OFX_G_INVTRANLIST_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVTRANLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION_LIST2* AIO_OfxGroup_INVTRANLIST_TakeTransactionList(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfo_l.h0000644000175000017500000000167212364015477022756 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFO_L_H #define AIO_OFX_G_ACCTINFO_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); const char *AIO_OfxGroup_ACCTINFO_GetBankId(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_ACCTINFO_GetAccId(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_ACCTINFO_GetAccType(const AIO_OFX_GROUP *g); const char *AIO_OfxGroup_ACCTINFO_GetAccDescr(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_secinfo.c0000644000175000017500000001435712364015477022302 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_secinfo_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_secid_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO) AIO_OFX_GROUP *AIO_OfxGroup_SECINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_SECINFO *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_SECINFO, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g, xg, AIO_OfxGroup_SECINFO_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SECINFO_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_SECINFO_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_SECINFO_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_SECINFO_FreeData(void *bp, void *p) { AIO_OFX_GROUP_SECINFO *xg; xg=(AIO_OFX_GROUP_SECINFO*)p; assert(xg); free(xg->currentElement); free(xg->ticker); free(xg->secname); free(xg->uniqueId); free(xg->nameSpace); GWEN_FREE_OBJECT(xg); } const char *AIO_OfxGroup_SECINFO_GetTicker(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); return xg->ticker; } void AIO_OfxGroup_SECINFO_SetTicker(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); free(xg->ticker); if (s) xg->ticker=strdup(s); else xg->ticker=NULL; } const char *AIO_OfxGroup_SECINFO_GetSecurityName(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); return xg->secname; } void AIO_OfxGroup_SECINFO_SetSecurityName(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); free(xg->secname); if (s) xg->secname=strdup(s); else xg->secname=NULL; } const char *AIO_OfxGroup_SECINFO_GetUniqueId(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); return xg->uniqueId; } void AIO_OfxGroup_SECINFO_SetUniqueId(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); free(xg->uniqueId); if (s) xg->uniqueId=strdup(s); else xg->uniqueId=NULL; } const char *AIO_OfxGroup_SECINFO_GetNameSpace(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); return xg->nameSpace; } void AIO_OfxGroup_SECINFO_SetNameSpace(AIO_OFX_GROUP *g, const char *s) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); free(xg->nameSpace); if (s) xg->nameSpace=strdup(s); else xg->nameSpace=NULL; } int AIO_OfxGroup_SECINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_SECINFO *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); xg->currentElement=NULL; if (strcasecmp(tagName, "SECNAME")==0 || strcasecmp(tagName, "TICKER")==0 || strcasecmp(tagName, "FIID")==0 || strcasecmp(tagName, "UNITPRICE")==0 || strcasecmp(tagName, "DTASOF")==0) { xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "SECID")==0) { gNew=AIO_OfxGroup_SECID_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_SECINFO_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_SECINFO *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "SECNAME")==0) AIO_OfxGroup_SECINFO_SetSecurityName(g, GWEN_Buffer_GetStart(buf)); else if (strcasecmp(xg->currentElement, "TICKER")==0) AIO_OfxGroup_SECINFO_SetTicker(g, GWEN_Buffer_GetStart(buf)); else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_SECINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_SECINFO *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_SECINFO, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "SECID")==0) { AIO_OfxGroup_SECINFO_SetUniqueId(g, AIO_OfxGroup_SECID_GetUniqueId(sg)); AIO_OfxGroup_SECINFO_SetNameSpace(g, AIO_OfxGroup_SECID_GetNameSpace(sg)); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ignore_l.h0000644000175000017500000000125012364015477022443 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_IGNORE_L_H #define AIO_OFX_G_IGNORE_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_Ignore_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_income_l.h0000644000175000017500000000150212364015477022432 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INCOME_L_H #define AIO_OFX_G_INCOME_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INCOME_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_INCOME_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmttrnrs_p.h0000644000175000017500000000121012364015477023240 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTTRNRS_P_H #define AIO_OFX_G_STMTTRNRS_P_H #include "g_stmttrnrs_l.h" static int AIO_OfxGroup_STMTTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_document_p.h0000644000175000017500000000131212364015477023001 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_DOCUMENT_P_H #define AIO_OFX_G_DOCUMENT_P_H #include "g_document_l.h" static int AIO_OfxGroup_Document_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_Document_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_sonrs.c0000644000175000017500000000422412364015477022010 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_sonrs_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_status_l.h" #include "i18n_l.h" #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_SONRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_SONRS_StartTag); return g; } int AIO_OfxGroup_SONRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "STATUS")==0) { gNew=AIO_OfxGroup_STATUS_new(tagName, g, ctx, I18N("Status for signon request")); } else if (strcasecmp(tagName, "DTSERVER")==0 || strcasecmp(tagName, "LANGUAGE")==0 || strcasecmp(tagName, "DTPROFUP")==0 || strcasecmp(tagName, "DTACCTUP")==0 || strcasecmp(tagName, "SESSCOOKIE")==0) { /* some tags, just ignore them here */ } else if (strcasecmp(tagName, "FI")==0) { gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } else if (-1!=GWEN_Text_ComparePattern(tagName, "INTU.*", 0) || -1!=GWEN_Text_ComparePattern(tagName, "AT.*", 0)) { /* simply ignore INTU. stuff */ } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring element [%s]", tagName); /*gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx);*/ } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_income_p.h0000644000175000017500000000212212364015477022435 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INCOME_P_H #define AIO_OFX_G_INCOME_P_H #include "g_income_l.h" typedef struct AIO_OFX_GROUP_INCOME AIO_OFX_GROUP_INCOME; struct AIO_OFX_GROUP_INCOME { char *currentElement; char *currency; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_INCOME_FreeData(void *bp, void *p); static int AIO_OfxGroup_INCOME_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INCOME_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_INCOME_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_banktranlist_p.h0000644000175000017500000000213212364015477023660 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BANKTRANLIST_P_H #define AIO_OFX_G_BANKTRANLIST_P_H #include "g_banktranlist_l.h" typedef struct AIO_OFX_GROUP_BANKTRANLIST AIO_OFX_GROUP_BANKTRANLIST; struct AIO_OFX_GROUP_BANKTRANLIST { char *currentElement; char *dtstart; char *dtend; AB_TRANSACTION_LIST2 *transactionList; }; static void GWENHYWFAR_CB AIO_OfxGroup_BANKTRANLIST_FreeData(void *bp, void *p); static int AIO_OfxGroup_BANKTRANLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BANKTRANLIST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_BANKTRANLIST_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_status_p.h0000644000175000017500000000205412364015477022512 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STATUS_P_H #define AIO_OFX_G_STATUS_P_H #include "g_status_l.h" typedef struct AIO_OFX_GROUP_STATUS AIO_OFX_GROUP_STATUS; struct AIO_OFX_GROUP_STATUS { char *description; int code; char *severity; char *currentElement; AIO_OFX_GROUP_ENDTAG_FN oldEndTagFn; }; static void GWENHYWFAR_CB AIO_OfxGroup_STATUS_FreeData(void *bp, void *p); static int AIO_OfxGroup_STATUS_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_STATUS_EndTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_STATUS_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invbuy_l.h0000644000175000017500000000150212364015477022474 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVBUY_L_H #define AIO_OFX_G_INVBUY_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_INVBUY_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_INVBUY_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_ofx.c0000644000175000017500000000436612364015477021447 00000000000000/*************************************************************************** begin : Mon Jan 07 2008 copyright : (C) 2008, 2012 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_ofx_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_signonmsgsrsv1_l.h" #include "g_bankmsgsrsv1_l.h" #include "g_creditcardmsgsrsv1_l.h" #include "g_signupmsgsrsv1_l.h" #include "g_invstmtmsgsrsv1_l.h" #include "g_seclistmsgsrsv1_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_OFX_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_OFX_StartTag); return g; } int AIO_OfxGroup_OFX_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "SIGNONMSGSRSV1")==0) gNew=AIO_OfxGroup_SIGNONMSGSRSV1_new(tagName, g, ctx); else if (strcasecmp(tagName, "BANKMSGSRSV1")==0) { gNew=AIO_OfxGroup_BANKMSGSRSV1_new(tagName, g, ctx); } else if (strcasecmp(tagName, "CREDITCARDMSGSRSV1")==0) { gNew=AIO_OfxGroup_CREDITCARDMSGSRSV1_new(tagName, g, ctx); } else if (strcasecmp(tagName, "SIGNUPMSGSRSV1")==0) gNew=AIO_OfxGroup_SIGNUPMSGSRSV1_new(tagName, g, ctx); else if (strcasecmp(tagName, "INVSTMTMSGSRSV1")==0) gNew=AIO_OfxGroup_INVSTMTMSGSRSV1_new(tagName, g, ctx); else if (strcasecmp(tagName, "SECLISTMSGSRSV1")==0) gNew=AIO_OfxGroup_SECLISTMSGSRSV1_new(tagName, g, ctx); else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfotrnrs_p.h0000644000175000017500000000123412364015477024045 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_ACCTINFOTRNRS_P_H #define AIO_OFX_G_ACCTINFOTRNRS_P_H #include "g_acctinfotrnrs_l.h" static int AIO_OfxGroup_ACCTINFOTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invposlist.c0000644000175000017500000000345012364015477023056 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invposlist_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_posstock_l.h" #include "g_posmf_l.h" #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_INVPOSLIST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVPOSLIST_StartTag); return g; } int AIO_OfxGroup_INVPOSLIST_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "POSSTOCK")==0) { gNew=AIO_OfxGroup_POSSTOCK_new(tagName, g, ctx); } else if (strcasecmp(tagName, "POSMF")==0) { gNew=AIO_OfxGroup_POSMF_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmttrnrs.c0000644000175000017500000000537612364015477023452 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de comments :Stephen R. Besch email :sbesch@acsu.buffalo.edu *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invstmttrnrs_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_status_l.h" #include "g_invstmtrs_l.h" #include "i18n_l.h" #include #include /*This code parallels the code in g_stmttrnrs. Since there are no data items that we are interested in, we only need to deal with sub-group creation. Hence there is only a virtual function for filtering start tags.*/ AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVSTMTTRNRS_StartTag); return g; } /*There are 4 data items and subgroups here. We are only interested in the STATUS and INVSTMTRS groups. The TRNUID and CLTCOOKIE datums are ignored.*/ int AIO_OfxGroup_INVSTMTTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); /*If this is a STATUS subgroup, define it*/ if (strcasecmp(tagName, "STATUS")==0) { gNew=AIO_OfxGroup_STATUS_new(tagName, g, ctx, I18N("Status for investment transaction statement request")); } /*Or, if it's the TRNUID or CLTCOOKIE data, just ignore them. These are really easy since no subgroup Ignore trap is needed.*/ else if (strcasecmp(tagName, "TRNUID")==0 || strcasecmp(tagName, "CLTCOOKIE")==0) { /* some tags, just ignore them here */ } /*If this is the Investment Statement Request, define it's subgroup*/ else if (strcasecmp(tagName, "INVSTMTRS")==0) { gNew=AIO_OfxGroup_INVSTMTRS_new(tagName, g, ctx); } /*All other sub-groups pass on to the ignore trap.*/ else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } /*If we really made up a new group, put it in to the context. Do nothing if this was a data tag.*/ if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfors.c0000644000175000017500000000616012364015477023000 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_acctinfors_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_acctinfo_l.h" #include #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFORS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_ACCTINFORS_StartTag); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_ACCTINFORS_EndSubGroup); return g; } int AIO_OfxGroup_ACCTINFORS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "ACCTINFO")==0) { gNew=AIO_OfxGroup_ACCTINFO_new(tagName, g, ctx); } else if (strcasecmp(tagName, "DTACCTUP")==0) { /* ignore */ } else if (strcasecmp(tagName, "ESP.XREGION")==0) { /* ignore */ } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_ACCTINFORS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { const char *s; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "ACCTINFO")==0) { AB_IMEXPORTER_ACCOUNTINFO *ai; const char *s; DBG_INFO(AQBANKING_LOGDOMAIN, "Importing account %s/%s", AIO_OfxGroup_ACCTINFO_GetBankId(sg), AIO_OfxGroup_ACCTINFO_GetAccId(sg)); ai=AB_ImExporterAccountInfo_new(); assert(ai); s=AIO_OfxGroup_ACCTINFO_GetBankId(sg); if (s) AB_ImExporterAccountInfo_SetBankCode(ai, s); s=AIO_OfxGroup_ACCTINFO_GetAccId(sg); if (s) AB_ImExporterAccountInfo_SetAccountNumber(ai, s); s=AIO_OfxGroup_ACCTINFO_GetAccDescr(sg); if (s) AB_ImExporterAccountInfo_SetAccountName(ai, s); /* set account type, if known */ s=AIO_OfxGroup_ACCTINFO_GetAccType(sg); if (!s) s="BANK"; /* not a real code */ if (s) { AB_ACCOUNT_TYPE t; t=AIO_OfxGroup_Generic_AccountTypeFromString(s); AB_ImExporterAccountInfo_SetType(ai, t); } DBG_INFO(AQBANKING_LOGDOMAIN, "Adding account"); AB_ImExporterContext_AddAccountInfo(AIO_OfxXmlCtx_GetIoContext(ctx), ai); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_reinvest.c0000644000175000017500000001541212364015477022504 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_reinvest_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invtran_l.h" #include "g_secid_l.h" #include "types/transaction.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST) AIO_OFX_GROUP *AIO_OfxGroup_REINVEST_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_REINVEST *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_REINVEST, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST, g, xg, AIO_OfxGroup_REINVEST_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_REINVEST_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_REINVEST_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_REINVEST_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_REINVEST_FreeData(void *bp, void *p) { AIO_OFX_GROUP_REINVEST *xg; xg=(AIO_OFX_GROUP_REINVEST*)p; assert(xg); AB_Transaction_free(xg->transaction); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } int AIO_OfxGroup_REINVEST_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_REINVEST *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "UNITS")==0 || strcasecmp(tagName, "UNITPRICE")==0 || strcasecmp(tagName, "TOTAL")==0 || strcasecmp(tagName, "SUBACCTSEC")==0 || strcasecmp(tagName, "INCOMETYPE")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "INVTRAN")==0) { gNew=AIO_OfxGroup_INVTRAN_new(tagName, g, ctx); } else if (strcasecmp(tagName, "SECID")==0) { gNew=AIO_OfxGroup_SECID_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_REINVEST_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_REINVEST *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "UNITS")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITS: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetUnits(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "UNITPRICE")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for UNITPRICE: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetUnitPrice(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "TOTAL")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for TOTAL: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetValue(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "SUBACCTSEC")==0) { /* TODO */ } else if (strcasecmp(xg->currentElement, "INCOMETYPE")==0) { /* TODO */ } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_REINVEST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_REINVEST *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "INVTRAN")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_INVTRAN_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetFiId(xg->transaction, AB_Transaction_GetFiId(t)); AB_Transaction_SetValutaDate(xg->transaction, AB_Transaction_GetValutaDate(t)); AB_Transaction_SetDate(xg->transaction, AB_Transaction_GetDate(t)); AB_Transaction_SetPurpose(xg->transaction, AB_Transaction_GetPurpose(t)); } } else if (strcasecmp(s, "SECID")==0) { AB_TRANSACTION *t; t=AIO_OfxGroup_SECID_TakeData(sg); if (t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Adding data"); AB_Transaction_SetUnitId(xg->transaction, AB_Transaction_GetUnitId(t)); AB_Transaction_SetUnitIdNameSpace(xg->transaction, AB_Transaction_GetUnitIdNameSpace(t)); } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", s); } return 0; } AB_TRANSACTION *AIO_OfxGroup_REINVEST_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_REINVEST *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_REINVEST, g); assert(xg); t=xg->transaction; xg->transaction=NULL; free(xg->transaction); return t; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_creditcardmsgsrsv1_p.h0000644000175000017500000000125612364015477025004 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_CREDITCARDMSGSRSV1_P_H #define AIO_OFX_G_CREDITCARDMSGSRSV1_P_H #include "g_creditcardmsgsrsv1_l.h" static int AIO_OfxGroup_CREDITCARDMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_signonmsgsrsv1_p.h0000644000175000017500000000123212364015477024167 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_SIGNONMSGSRSV1_P_H #define AIO_OFX_G_SIGNONMSGSRSV1_P_H #include "g_signonmsgsrsv1_l.h" static int AIO_OfxGroup_SIGNONMSGSRSV1_StartTag(AIO_OFX_GROUP *g, const char *tagName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invtran_p.h0000644000175000017500000000201212364015477022642 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVTRAN_P_H #define AIO_OFX_G_INVTRAN_P_H #include "g_invtran_l.h" typedef struct AIO_OFX_GROUP_INVTRAN AIO_OFX_GROUP_INVTRAN; struct AIO_OFX_GROUP_INVTRAN { char *currentElement; char *currency; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_INVTRAN_FreeData(void *bp, void *p); static int AIO_OfxGroup_INVTRAN_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_INVTRAN_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrn_l.h0000644000175000017500000000136612364015477022517 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_STMTRN_L_H #define AIO_OFX_G_STMTRN_L_H #include "ofxgroup_l.h" AIO_OFX_GROUP *AIO_OfxGroup_STMTRN_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_TRANSACTION *AIO_OfxGroup_STMTRN_TakeTransaction(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_reinvest_p.h0000644000175000017500000000214612364015477023030 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de copyright : (C) 2013 by Paul Conrady email : c.p.conrady@gmail.com *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_REINVEST_P_H #define AIO_OFX_G_REINVEST_P_H #include "g_reinvest_l.h" typedef struct AIO_OFX_GROUP_REINVEST AIO_OFX_GROUP_REINVEST; struct AIO_OFX_GROUP_REINVEST { char *currentElement; char *currency; AB_TRANSACTION *transaction; }; static void GWENHYWFAR_CB AIO_OfxGroup_REINVEST_FreeData(void *bp, void *p); static int AIO_OfxGroup_REINVEST_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_REINVEST_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg); static int AIO_OfxGroup_REINVEST_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invstmtrs.c0000644000175000017500000002243212364015477022716 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de comments :Stephen R. Besch email :sbesch@acsu.buffalo.edu *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_invstmtrs_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_invacc_l.h" /*SRB 4/22/09*/ #include "g_invposlist_l.h" #include "g_invtranlist_l.h" /*SRB 4/22/09*/ #include #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_INVSTMTRS) /*This code parallels the code in g_stmtrs with the exception that there are quite a few more items to ignore and more items to handle. Since there are data items that we want to use, we need to define virtual functions for adding data items. And, since some of the subgroups return data, we will need to watch for end-tags so we can dispose of the data when the group closes.*/ AIO_OFX_GROUP *AIO_OfxGroup_INVSTMTRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_INVSTMTRS *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_INVSTMTRS, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVSTMTRS, g, xg, AIO_OfxGroup_INVSTMTRS_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_INVSTMTRS_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_INVSTMTRS_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_INVSTMTRS_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_INVSTMTRS_FreeData(void *bp, void *p) { AIO_OFX_GROUP_INVSTMTRS *xg; xg=(AIO_OFX_GROUP_INVSTMTRS*)p; assert(xg); free(xg->currency); free(xg->currentElement); GWEN_FREE_OBJECT(xg); } /*There are 2 data items and 7 subgroups (INVACCTFROM, INVACCTTO, INVTRANLIST, INVPOSLIST, INVOOLIST, INCOME, INVBAL) Original code handled 3 of the 7 groups. I've added the INVTRANLIST group to the mix.*/ int AIO_OfxGroup_INVSTMTRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_INVSTMTRS *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; /*First, get the data and context.*/ assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVSTMTRS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); free(xg->currentElement); /*Get rid of the old contents*/ xg->currentElement=NULL; /*Handle the data tags first We only need to make the current element's value match the tag.*/ if (strcasecmp(tagName, "CURDEF")==0 || strcasecmp(tagName, "DTASOF")==0) { xg->currentElement=strdup(tagName); } /*Then handle the groups.*/ else if (strcasecmp(tagName, "INVACCTFROM")==0 || strcasecmp(tagName, "INVACCTTO")==0) gNew=AIO_OfxGroup_INVACC_new(tagName, g, ctx); else if (strcasecmp(tagName, "INVTRANLIST")==0) gNew=AIO_OfxGroup_INVTRANLIST_new(tagName, g, ctx); /*SRB 4/22/09*/ else if (strcasecmp(tagName, "INVPOSLIST")==0) gNew=AIO_OfxGroup_INVPOSLIST_new(tagName, g, ctx); else { DBG_WARN(AQBANKING_LOGDOMAIN,"Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } /*Even though we look for the DTASOF tag above (we must, so that it can be distinguished from a group), nothing is done with the data. The only tag we preocess is the currency definition.*/ int AIO_OfxGroup_INVSTMTRS_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_INVSTMTRS *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVSTMTRS, g); assert(xg); /*If the last start tag defined a "currentElement", then see if we recognize it.*/ if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; /*Always make sure that there are no weird or extra characters in the string data.*/ buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { /*If there is actually a string there, then*/ DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "CURDEF")==0) { /*See if it was following a CURDEF*/ free(xg->currency); /*If so, then remove any debris*/ xg->currency=strdup(s); /*and dup the string into xg->currency*/ } else { /*All other tags are ignored!*/ DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } /*We need to watch for the ending of our 3 groups. Ignore INVACCTTO for now.*/ int AIO_OfxGroup_INVSTMTRS_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_INVSTMTRS *xg; const char *s; GWEN_XML_CONTEXT *ctx; /*Set up pointers to INVSTMTRS group data*/ assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_INVSTMTRS, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); /*Pointer to the group name*/ /*First look for the INVACCTFROM group. This is quite simple and is in fact nearly identical to the code for BANKACCTFROM in g_stmtrn.c. ....What about INVACCTTO? */ if (strcasecmp(s, "INVACCTFROM")==0) { AB_IMEXPORTER_ACCOUNTINFO *ai; const char *s; DBG_INFO(AQBANKING_LOGDOMAIN, "Importing account %s/%s", AIO_OfxGroup_INVACC_GetBrokerId(sg), AIO_OfxGroup_INVACC_GetAccId(sg)); ai=AB_ImExporterAccountInfo_new(); /*Create the AccountInfo Structure*/ assert(ai); /*Validate creation*/ s=AIO_OfxGroup_INVACC_GetBrokerId(sg); if (s) AB_ImExporterAccountInfo_SetBankCode(ai, s); /*Install Broker ID*/ s=AIO_OfxGroup_INVACC_GetAccId(sg); if (s) AB_ImExporterAccountInfo_SetAccountNumber(ai, s); /*And account number*/ /* and set currency if there is one */ if (xg->currency) AB_ImExporterAccountInfo_SetCurrency(ai, xg->currency); /* set account type, if known */ s=AIO_OfxGroup_INVACC_GetAccType(sg); if (!s) s="INVESTMENT"; /* Investment is a real code now?--- SRB 4/22/09*/ if (s) { AB_ACCOUNT_TYPE t; t=AIO_OfxGroup_Generic_AccountTypeFromString(s); AB_ImExporterAccountInfo_SetType(ai, t); } DBG_INFO(AQBANKING_LOGDOMAIN, "Adding investment account"); AB_ImExporterContext_AddAccountInfo(AIO_OfxXmlCtx_GetIoContext(ctx), ai); xg->accountInfo=ai; } else if (strcasecmp(s, "INVTRANLIST") == 0) { /*Here when we finish an Investment transaction list. Uncommented and extended by SRB*/ AB_TRANSACTION_LIST2 *tl; AB_TRANSACTION_LIST2_ITERATOR *it; tl=AIO_OfxGroup_INVTRANLIST_TakeTransactionList(sg); if (!tl) return 0; /*No list - just return*/ it=AB_Transaction_List2_First(tl); if (it) { AB_TRANSACTION *t; t=AB_Transaction_List2Iterator_Data(it); /* int transactionCount=0; char st[20]; */ while(t) { DBG_INFO(AQBANKING_LOGDOMAIN, "Importing investment transaction"); if (xg->currency) { /* set currency using xg->currency if missing from transaction */ const AB_VALUE *v; v=AB_Transaction_GetValue(t); /*Returns pointer to actual data item*/ if (v && AB_Value_GetCurrency(v)==NULL) { /*If v is valid, check for currency valid*/ AB_VALUE *v2; /*We're duplicating here (why??)*/ v2=AB_Value_dup(v); /*Can do AB_Value_SetCurrency(v, xg->currency) for whole mess*/ AB_Value_SetCurrency(v2, xg->currency); /*Install the currency*/ AB_Transaction_SetValue(t, v2); /*This destroys v, duplicates v2 and uses duplicate*/ AB_Value_free(v2); } } /* sprintf(st,"%d",transactionCount); AB_Transaction_SetCustomerReference(t,st); transactionCount++; */ AB_ImExporterAccountInfo_AddTransaction(xg->accountInfo, t); t=AB_Transaction_List2Iterator_Next(it); } AB_Transaction_List2Iterator_free(it); } /* don't call AB_Transaction_List2_freeAll(), because the transactions from the list have been taken over by the AccountInfo object */ AB_Transaction_List2_free(tl); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bal_p.h0000644000175000017500000000161612364015477021730 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_BAL_P_H #define AIO_OFX_G_BAL_P_H #include "g_bal_l.h" typedef struct AIO_OFX_GROUP_BAL AIO_OFX_GROUP_BAL; struct AIO_OFX_GROUP_BAL { AB_VALUE *value; GWEN_TIME *date; char *currentElement; }; static void GWENHYWFAR_CB AIO_OfxGroup_BAL_FreeData(void *bp, void *p); static int AIO_OfxGroup_BAL_StartTag(AIO_OFX_GROUP *g, const char *tagName); static int AIO_OfxGroup_BAL_AddData(AIO_OFX_GROUP *g, const char *data); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stmtrn.c0000644000175000017500000002451712364015477022202 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_stmtrn_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_bankacc_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN) AIO_OFX_GROUP *AIO_OfxGroup_STMTRN_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_STMTRN *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_STMTRN, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN, g, xg, AIO_OfxGroup_STMTRN_FreeData); xg->transaction=AB_Transaction_new(); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_STMTRN_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_STMTRN_AddData); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_STMTRN_EndSubGroup); return g; } GWENHYWFAR_CB void AIO_OfxGroup_STMTRN_FreeData(void *bp, void *p) { AIO_OFX_GROUP_STMTRN *xg; xg=(AIO_OFX_GROUP_STMTRN*)p; assert(xg); free(xg->currentElement); AB_Transaction_free(xg->transaction); GWEN_FREE_OBJECT(xg); } AB_TRANSACTION *AIO_OfxGroup_STMTRN_TakeTransaction(const AIO_OFX_GROUP *g){ AIO_OFX_GROUP_STMTRN *xg; AB_TRANSACTION *t; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN, g); assert(xg); t=xg->transaction; xg->transaction=NULL; return t; } int AIO_OfxGroup_STMTRN_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_STMTRN *xg; GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "TRNTYPE")==0 || strcasecmp(tagName, "DTPOSTED")==0 || strcasecmp(tagName, "DTUSER")==0 || strcasecmp(tagName, "DTAVAIL")==0 || strcasecmp(tagName, "TRNAMT")==0 || strcasecmp(tagName, "FITID")==0 || strcasecmp(tagName, "CORRECTFITID")==0 || strcasecmp(tagName, "CORRECTATION")==0 || strcasecmp(tagName, "SRVTID")==0 || strcasecmp(tagName, "CHECKNUM")==0 || strcasecmp(tagName, "REFNUM")==0 || strcasecmp(tagName, "SIC")==0 || strcasecmp(tagName, "PAYEEID")==0 || strcasecmp(tagName, "NAME")==0 || strcasecmp(tagName, "MEMO")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else if (strcasecmp(tagName, "BANKACCTTO")==0) { gNew=AIO_OfxGroup_BANKACC_new(tagName, g, ctx); } else if (strcasecmp(tagName, "CCACCTTO")==0) { /* TODO */ gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } else if (strcasecmp(tagName, "PAYEE")==0) { /* TODO */ gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } else if (strcasecmp(tagName, "CURRENCY")==0) { /* TODO */ gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } else if (strcasecmp(tagName, "ORIGCURRENCY")==0) { /* TODO */ gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); /*gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx);*/ free(xg->currentElement); xg->currentElement=strdup(tagName); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_STMTRN_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_STMTRN *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "TRNTYPE")==0) { AB_TRANSACTION *t; t=xg->transaction; if (strcasecmp(s, "CREDIT")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); AB_Transaction_SetTransactionText(t, I18N("Generic credit")); } else if (strcasecmp(s, "DEBIT")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); AB_Transaction_SetTransactionText(t, I18N("Generic debit")); } else if (strcasecmp(s, "INT")==0) { AB_Transaction_SetTransactionKey(t, "INT"); AB_Transaction_SetTransactionText(t, I18N("Interest earned or paid (Note: Depends on signage of amount)")); } else if (strcasecmp(s, "DIV")==0) { AB_Transaction_SetTransactionKey(t, "DIV"); AB_Transaction_SetTransactionText(t, I18N("Dividend")); } else if (strcasecmp(s, "FEE")==0) { AB_Transaction_SetTransactionKey(t, "BRF"); AB_Transaction_SetTransactionText(t, I18N("FI fee")); } else if (strcasecmp(s, "SRVCHG")==0) { AB_Transaction_SetTransactionKey(t, "CHG"); AB_Transaction_SetTransactionText(t, I18N("Service charge")); } else if (strcasecmp(s, "DEP")==0) { AB_Transaction_SetTransactionKey(t, "LDP"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, I18N("Deposit")); } else if (strcasecmp(s, "ATM")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); /* misc */ AB_Transaction_SetTransactionText(t, I18N("ATM debit or credit (Note: Depends on signage of amount)")); } else if (strcasecmp(s, "POS")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); /* misc */ AB_Transaction_SetTransactionText(t, I18N("Point of sale debit or credit (Note: Depends on signage of amount)")); } else if (strcasecmp(s, "XFER")==0) { AB_Transaction_SetTransactionKey(t, "TRF"); AB_Transaction_SetTransactionText(t, I18N("Transfer")); } else if (strcasecmp(s, "CHECK")==0) { AB_Transaction_SetTransactionKey(t, "CHK"); AB_Transaction_SetTransactionText(t, I18N("Check")); } else if (strcasecmp(s, "PAYMENT")==0) { AB_Transaction_SetTransactionKey(t, "TRF"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, I18N("Electronic payment")); } else if (strcasecmp(s, "CASH")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, I18N("Cash withdrawal")); } else if (strcasecmp(s, "DIRECTDEP")==0) { AB_Transaction_SetTransactionKey(t, "LDP"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, I18N("Direct deposit")); } else if (strcasecmp(s, "DIRECTDEBIT")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, I18N("Merchant initiated debit")); } else if (strcasecmp(s, "REPEATPMT")==0) { AB_Transaction_SetTransactionKey(t, "STO"); AB_Transaction_SetTransactionText(t, I18N("Repeating payment/standing order")); } else if (strcasecmp(s, "OTHER")==0) { AB_Transaction_SetTransactionKey(t, "MSC"); AB_Transaction_SetTransactionText(t, I18N("Other")); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown transaction type [%s]", s); AB_Transaction_SetTransactionText(t, I18N("Unknown transaction type")); } } else if (strcasecmp(xg->currentElement, "DTPOSTED")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTPOSTED: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetValutaDate(xg->transaction, ti); GWEN_Time_free(ti); } else if (strcasecmp(xg->currentElement, "DTUSER")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTUSER: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Transaction_SetDate(xg->transaction, ti); GWEN_Time_free(ti); } else if (strcasecmp(xg->currentElement, "DTAVAIL")==0) { /* ignore */ } else if (strcasecmp(xg->currentElement, "TRNAMT")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for TRNAMT: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } if (xg->currency) AB_Value_SetCurrency(v, xg->currency); AB_Transaction_SetValue(xg->transaction, v); AB_Value_free(v); } else if (strcasecmp(xg->currentElement, "FITID")==0) { AB_Transaction_SetFiId(xg->transaction, s); } else if (strcasecmp(xg->currentElement, "CHECKNUM")==0) { AB_Transaction_SetCustomerReference(xg->transaction, s); } else if (strcasecmp(xg->currentElement, "REFNUM")==0) { AB_Transaction_SetCustomerReference(xg->transaction, s); } else if (strcasecmp(xg->currentElement, "PAYEEID")==0) { /* ignore */ } else if (strcasecmp(xg->currentElement, "NAME")==0) { AB_Transaction_AddRemoteName(xg->transaction, s, 1); } else if (strcasecmp(xg->currentElement, "MEMO")==0 || strcasecmp(xg->currentElement, "MEMO2")==0) { AB_Transaction_AddPurpose(xg->transaction, s, 1); } else if (strcasecmp(xg->currentElement, "SRVRTID")==0 || strcasecmp(xg->currentElement, "SRVRTID2")==0) { AB_Transaction_SetBankReference(xg->transaction, s); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } int AIO_OfxGroup_STMTRN_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { AIO_OFX_GROUP_STMTRN *xg; const char *s; GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_STMTRN, g); assert(xg); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "PAYEE")==0) { } else if (strcasecmp(s, "BANKACCTTO")==0) { } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_acctinfotrnrs.c0000644000175000017500000000363612364015477023531 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_acctinfotrnrs_p.h" #include "ofxxmlctx_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_status_l.h" #include "g_acctinfors_l.h" #include "i18n_l.h" #include #include AIO_OFX_GROUP *AIO_OfxGroup_ACCTINFOTRNRS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_ACCTINFOTRNRS_StartTag); return g; } int AIO_OfxGroup_ACCTINFOTRNRS_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP *gNew=NULL; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "STATUS")==0) { gNew=AIO_OfxGroup_STATUS_new(tagName, g, ctx, I18N("Status for account info request")); } else if (strcasecmp(tagName, "TRNUID")==0 || strcasecmp(tagName, "CLTCOOKIE")==0) { /* some tags, just ignore them here */ } else if (strcasecmp(tagName, "ACCTINFORS")==0){ gNew=AIO_OfxGroup_ACCTINFORS_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_stockinfo.c0000644000175000017500000000515612364015477022650 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_stockinfo_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include "g_secinfo_l.h" #include #include #include #include AIO_OFX_GROUP *AIO_OfxGroup_STOCKINFO_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_STOCKINFO_StartTag); AIO_OfxGroup_SetEndSubGroupFn(g, AIO_OfxGroup_STOCKINFO_EndSubGroup); return g; } int AIO_OfxGroup_STOCKINFO_StartTag(AIO_OFX_GROUP *g, const char *tagName) { GWEN_XML_CONTEXT *ctx; AIO_OFX_GROUP *gNew=NULL; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "SECINFO")==0) { gNew=AIO_OfxGroup_SECINFO_new(tagName, g, ctx); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", tagName); gNew=AIO_OfxGroup_Ignore_new(tagName, g, ctx); } if (gNew) { AIO_OfxXmlCtx_SetCurrentGroup(ctx, gNew); GWEN_XmlCtx_IncDepth(ctx); } return 0; } int AIO_OfxGroup_STOCKINFO_EndSubGroup(AIO_OFX_GROUP *g, AIO_OFX_GROUP *sg) { const char *s; GWEN_XML_CONTEXT *ctx; assert(g); ctx=AIO_OfxGroup_GetXmlContext(g); assert(ctx); s=AIO_OfxGroup_GetGroupName(sg); if (strcasecmp(s, "SECINFO")==0) { AB_SECURITY *sec=NULL; const char *uid; const char *ns; uid=AIO_OfxGroup_SECINFO_GetUniqueId(sg); ns=AIO_OfxGroup_SECINFO_GetNameSpace(sg); if (uid && ns) sec=AB_ImExporterContext_FindSecurity(AIO_OfxXmlCtx_GetIoContext(ctx), ns, uid); if (sec==NULL) { sec=AB_Security_new(); AB_Security_SetUniqueId(sec, uid); AB_Security_SetNameSpace(sec, ns); AB_ImExporterContext_AddSecurity(AIO_OfxXmlCtx_GetIoContext(ctx), sec); } AB_Security_SetName(sec, AIO_OfxGroup_SECINFO_GetSecurityName(sg)); AB_Security_SetTickerSymbol(sec, AIO_OfxGroup_SECINFO_GetTicker(sg)); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_invpos_l.h0000644000175000017500000000142012364015477022475 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AIO_OFX_G_INVPOS_L_H #define AIO_OFX_G_INVPOS_L_H #include "ofxgroup_l.h" #include AIO_OFX_GROUP *AIO_OfxGroup_INVPOS_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx); AB_SECURITY *AIO_OfxGroup_INVPOS_TakeSecurity(const AIO_OFX_GROUP *g); #endif aqbanking-5.6.4beta/src/plugins/imexporters/ofx/parser/g_bal.c0000644000175000017500000001076512364015477021411 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon Jan 07 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "g_bal_p.h" #include "ofxxmlctx_l.h" #include "i18n_l.h" #include "g_generic_l.h" #include "g_ignore_l.h" #include #include #include #include GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL) AIO_OFX_GROUP *AIO_OfxGroup_BAL_new(const char *groupName, AIO_OFX_GROUP *parent, GWEN_XML_CONTEXT *ctx) { AIO_OFX_GROUP *g; AIO_OFX_GROUP_BAL *xg; /* create base group */ g=AIO_OfxGroup_Generic_new(groupName, parent, ctx); assert(g); GWEN_NEW_OBJECT(AIO_OFX_GROUP_BAL, xg); assert(xg); GWEN_INHERIT_SETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g, xg, AIO_OfxGroup_BAL_FreeData); /* set virtual functions */ AIO_OfxGroup_SetStartTagFn(g, AIO_OfxGroup_BAL_StartTag); AIO_OfxGroup_SetAddDataFn(g, AIO_OfxGroup_BAL_AddData); return g; } GWENHYWFAR_CB void AIO_OfxGroup_BAL_FreeData(void *bp, void *p) { AIO_OFX_GROUP_BAL *xg; xg=(AIO_OFX_GROUP_BAL*)p; assert(xg); free(xg->currentElement); GWEN_Time_free(xg->date); AB_Value_free(xg->value); GWEN_FREE_OBJECT(xg); } const AB_VALUE *AIO_OfxGroup_BAL_GetValue(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BAL *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); return xg->value; } void AIO_OfxGroup_BAL_SetValue(AIO_OFX_GROUP *g, const AB_VALUE *v) { AIO_OFX_GROUP_BAL *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); AB_Value_free(xg->value); if (v) xg->value=AB_Value_dup(v); else xg->value=NULL; } const GWEN_TIME *AIO_OfxGroup_BAL_GetDate(const AIO_OFX_GROUP *g) { AIO_OFX_GROUP_BAL *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); return xg->date; } void AIO_OfxGroup_BAL_SetDate(AIO_OFX_GROUP *g, const GWEN_TIME *ti) { AIO_OFX_GROUP_BAL *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); GWEN_Time_free(xg->date); if (ti) xg->date=GWEN_Time_dup(ti); else xg->date=NULL; } int AIO_OfxGroup_BAL_StartTag(AIO_OFX_GROUP *g, const char *tagName) { AIO_OFX_GROUP_BAL *xg; //GWEN_XML_CONTEXT *ctx; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); //ctx=AIO_OfxGroup_GetXmlContext(g); if (strcasecmp(tagName, "BALAMT")==0 || strcasecmp(tagName, "DTASOF")==0) { free(xg->currentElement); xg->currentElement=strdup(tagName); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring tag [%s]", tagName); } return 0; } int AIO_OfxGroup_BAL_AddData(AIO_OFX_GROUP *g, const char *data) { AIO_OFX_GROUP_BAL *xg; assert(g); xg=GWEN_INHERIT_GETDATA(AIO_OFX_GROUP, AIO_OFX_GROUP_BAL, g); assert(xg); if (xg->currentElement) { GWEN_BUFFER *buf; int rv; const char *s; buf=GWEN_Buffer_new(0, strlen(data), 0, 1); rv=AIO_OfxXmlCtx_SanitizeData(AIO_OfxGroup_GetXmlContext(g), data, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } s=GWEN_Buffer_GetStart(buf); if (*s) { DBG_INFO(AQBANKING_LOGDOMAIN, "AddData: %s=[%s]", xg->currentElement, s); if (strcasecmp(xg->currentElement, "BALAMT")==0) { AB_VALUE *v; v=AB_Value_fromString(s); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for BALAMT: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } AB_Value_free(xg->value); xg->value=v; } else if (strcasecmp(xg->currentElement, "DTASOF")==0) { GWEN_TIME *ti; ti=GWEN_Time_fromString(s, "YYYYMMDD"); if (ti==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid data for DTASOF: [%s]", s); GWEN_Buffer_free(buf); return GWEN_ERROR_BAD_DATA; } GWEN_Time_free(xg->date); xg->date=ti; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring data for unknown element [%s]", xg->currentElement); } } GWEN_Buffer_free(buf); } return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/0000755000175000017500000000000012643540655017617 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/ctxfile.c0000644000175000017500000001042612364015477021343 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ctxfile_p.h" #include "i18n_l.h" #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_CTXFILE); GWEN_PLUGIN *imexporter_ctxfile_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterCtxFile_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterCtxFile_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_CTXFILE *ieh; ie=AB_ImExporter_new(ab, "ctxfile"); GWEN_NEW_OBJECT(AH_IMEXPORTER_CTXFILE, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CTXFILE, ie, ieh, AH_ImExporterCtxFile_FreeData); AB_ImExporter_SetImportFn(ie, AH_ImExporterCtxFile_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterCtxFile_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterCtxFile_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterCtxFile_FreeData(void *bp, void *p){ AH_IMEXPORTER_CTXFILE *ieh; ieh=(AH_IMEXPORTER_CTXFILE*)p; GWEN_FREE_OBJECT(ieh); } int AH_ImExporterCtxFile_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_CTXFILE *ieh; GWEN_DB_NODE *dbData; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CTXFILE, ie); assert(ieh); dbData=GWEN_DB_Group_new("context"); rv=GWEN_DB_ReadFromIo(dbData, sio, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Data imported, transforming to UTF-8")); rv=AB_ImExporter_DbFromIso8859_1ToUtf8(dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error converting data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Transforming data to transactions"); rv=AB_ImExporterContext_ReadDb(ctx, dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterCtxFile_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_CTXFILE *ieh; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CTXFILE, ie); assert(ieh); /* always return indifferent (for now) */ return AB_ERROR_INDIFFERENT; } int AH_ImExporterCtxFile_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_CTXFILE *ieh; GWEN_DB_NODE *dbData; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CTXFILE, ie); assert(ieh); /* create db, store context in it */ dbData=GWEN_DB_Group_new("context"); rv=AB_ImExporterContext_toDb(ctx, dbData); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error exporting data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } rv=GWEN_DB_WriteToIo(dbData, sio, GWEN_DB_FLAGS_DEFAULT); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error exporting data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } GWEN_DB_Group_free(dbData); return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/ctxfile.xml.in0000644000175000017500000000051412364015477022323 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) This plugin directly reads and writes context files. This plugin imports/exports CTX files. aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/ctxfile_p.h0000644000175000017500000000254112364015477021666 00000000000000/*************************************************************************** begin : Tue Mar 31 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_CTXFILE_P_H #define AQHBCI_IMEX_CTXFILE_P_H #include #include typedef struct AH_IMEXPORTER_CTXFILE AH_IMEXPORTER_CTXFILE; struct AH_IMEXPORTER_CTXFILE { int dummy; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_ctxfile_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterCtxFile_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterCtxFile_FreeData(void *bp, void *p); static int AH_ImExporterCtxFile_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterCtxFile_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterCtxFile_CheckFile(AB_IMEXPORTER *ie, const char *fname); #endif /* AQHBCI_IMEX_CTXFILE_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/profiles/0000755000175000017500000000000012643540655021442 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/profiles/Makefile.in0000644000175000017500000005033512643540061023424 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/ctxfile/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/ctxfile/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/ctxfile/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/ctxfile/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/profiles/default.conf.in0000644000175000017500000000031212364015477024255 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports context files" int import="1" int export="1" params { } # params aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/profiles/Makefile.am0000644000175000017500000000017412364015477023417 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/ctxfile/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/Makefile.in0000644000175000017500000010023412643540061021573 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/ctxfile DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/ctxfile.xml.in $(top_srcdir)/depcomp \ $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = ctxfile.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = ctxfile_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_ctxfile_la_OBJECTS = ctxfile.lo ctxfile_la_OBJECTS = $(am_ctxfile_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ctxfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ctxfile_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ctxfile_la_SOURCES) DIST_SOURCES = $(ctxfile_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST = README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = ctxfile.la imexporterplugin_DATA = ctxfile.xml noinst_HEADERS = ctxfile_p.h ctxfile_la_SOURCES = ctxfile.c ctxfile_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) ctxfile_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/ctxfile/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/ctxfile/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ctxfile.xml: $(top_builddir)/config.status $(srcdir)/ctxfile.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ctxfile.la: $(ctxfile_la_OBJECTS) $(ctxfile_la_DEPENDENCIES) $(EXTRA_ctxfile_la_DEPENDENCIES) $(AM_V_CCLD)$(ctxfile_la_LINK) -rpath $(imexporterplugindir) $(ctxfile_la_OBJECTS) $(ctxfile_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctxfile.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(ctxfile_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/Makefile.am0000644000175000017500000000121612364015477021572 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST=README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=ctxfile.la imexporterplugin_DATA=ctxfile.xml noinst_HEADERS=ctxfile_p.h ctxfile_la_SOURCES=ctxfile.c ctxfile_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) ctxfile_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(ctxfile_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/ctxfile/README0000644000175000017500000000000012364015477020404 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/csv/0000755000175000017500000000000012643540654016753 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv_editprofile_p.h0000644000175000017500000000202012364015477022536 00000000000000/*************************************************************************** begin : Sat Jan 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AB_CSV_EDITPROFILE_P_H #define AB_CSV_EDITPROFILE_P_H #include "csv_editprofile_l.h" struct AB_CSV_EDIT_PROFILE_DIALOG { AB_BANKING *banking; AB_IMEXPORTER *imExporter; const char *testFileName; GWEN_DB_NODE *dbProfile; GWEN_BUFFER *dataBuffer; GWEN_STRINGLIST *columns; }; typedef struct AB_CSV_EDIT_PROFILE_DIALOG AB_CSV_EDIT_PROFILE_DIALOG; static GWENHYWFAR_CB void AB_CSV_EditProfileDialog_FreeData(void *bp, void *p); static GWENHYWFAR_CB int AB_CSV_EditProfileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv_p.h0000644000175000017500000000441612364015477020163 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004,2012 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_CSV_P_H #define AQHBCI_IMEX_CSV_P_H #include #include typedef struct AH_IMEXPORTER_CSV AH_IMEXPORTER_CSV; struct AH_IMEXPORTER_CSV { GWEN_DBIO *dbio; }; #define AH_IMEXPORTERCSV_SUBJECT_TRANSACTIONS 0 #define AH_IMEXPORTERCSV_SUBJECT_NOTEDTRANSACTIONS 1 #define AH_IMEXPORTERCSV_SUBJECT_TRANSFERS 2 AQBANKING_EXPORT GWEN_PLUGIN *imexporter_csv_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterCSV_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterCSV_FreeData(void *bp, void *p); static int AH_ImExporterCSV_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterCSV_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterCSV_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AH_ImExporterCSV_GetEditProfileDialog(AB_IMEXPORTER *ie, GWEN_DB_NODE *params, const char *testFileName, GWEN_DIALOG **pDlg); static int AH_ImExporterCSV__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams); static int AH_ImExporterCSV__ExportTransactions(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params, int noted); static AB_VALUE *AH_ImExporterCSV__ValueFromDb(GWEN_DB_NODE *dbV, int commaThousands, int commaDecimal); #endif /* AQHBCI_IMEX_CSV_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/0000755000175000017500000000000012643540654020576 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/oko.conf.in0000644000175000017500000000226712364015477022571 00000000000000 char name="oko" char shortDescr="Profile for OP Pankki CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by OP Pankki" int import="1" #int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { # if 1 then values are quoted quote="0" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="value/value" 3="category[0]" 4="purpose[0]" 5="remoteName[0]" 6="remoteAccountNumber" 7="purpose[1]" 8="purpose[2]" 9="purpose[3]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/tonline-banking.conf.in0000644000175000017500000000327512364015477025060 00000000000000char name="T-ONLINE" char shortDescr="Files from T-Online Banking Module" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by T-Online" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" #char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="localAccountNumber" 2="localBankCode" #3="date" (not used) #4="saldo" (not used) #5="currency" (not used) 6="date" 7="valutadate" #8="transfertype" 9="purpose[0]" 10="remoteName[0]" 11="value/value" 12="value/currency" #13="category" (not used) } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/sns.conf.in0000644000175000017500000000122112364015477022571 00000000000000char name="sns" char shortDescr="SNS Bank" char version="0.2" char longDescr="CSV profiel voor de Nederlandse SNS Bank" char author="Koos Pol " int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD-MM-YYYY" int utc="0" char valueFormat="rational" params { int ignoreLines="0" int quote="0" int title="0" char delimiter="," columns { 1="Date" 2="LocalAccountNumber" 3="RemoteAccountNumber" 4="RemoteName" 10="Value/Currency" 11="Value/Value" 13="ValutaDate" 15="Type" 17="CustomerReference" 18="Purpose" } } aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/psk.conf.in0000644000175000017500000000327312364015477022574 00000000000000char name="PSK" char shortDescr="Oesterreichische Post Bank" char version="@AQBANKING_VERSION_STRING@" char longDescr="CSV format of Austrian Post Bank Homebanking" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" # default is "float", other values: "rational" char valueFormat="float" params { # if 1 then values are quoted quote="0" # if 1 then a title line will be written containing the names of each # column title="0" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="localAccountNumber" 2="purpose" 3="date" 4="valutadate" 5="value/value" 6="value/currency" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/bankaustria.conf.in0000644000175000017500000000365112364015477024303 00000000000000 char name="BankAustria" char shortDescr="Profile for Bank Austria" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format of Bank Austria" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" int splitValueInOut="1" # default is "float", other values: "rational" char valueFormat="float" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="field1" # Downloaddatum 2="localAccountNumber" 3="field3" # Kontowortlaut 4="field4" # Kontowaehrung 5="field5" # ValutaSaldo 6="field6" # Disposaldo 7="field7" # Kontostand 8="date" 9="valutaDate" 10="value/currency" 11="valueIn/value" 12="valueOut/value" 13="purpose[0]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/aqmoney2.conf.in0000644000175000017500000000275212364015477023533 00000000000000 char name="AqMoney2" char shortDescr="Profile for AqMoney2 CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by AqMoney2" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYYMMDD" int utc="0" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="transactionId" 2="localBankCode" 3="localAccountNumber" 4="remoteBankCode" 5="remoteAccountNumber" 6="date" 7="valutadate" 8="value/value" 9="value/currency" 10="remoteName[0]" 11="remoteName[1]" 12="purpose[0]" 13="purpose[1]" 14="purpose[2]" 15="purpose[3]" 16="purpose[4]" 17="purpose[5]" 18="purpose[6]" 19="purpose[7]" 20="purpose[8]" 21="purpose[9]" 22="purpose[10]" 23="purpose[11]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/full.conf.in0000644000175000017500000000703212364015477022736 00000000000000 char name="full" char shortDescr="full profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" # default is "float", other values: "rational" char valueFormat="rational" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="localCountry" 2="localBankCode" 3="localBranchId" 4="localAccountNumber" 5="localSuffix" 6="localIban" 7="localName" 8="localBic" 9="remoteCountry" 10="remoteBankName" 11="remoteBankLocation" 12="remoteBankCode" 13="remoteBranchId" 14="remoteAccountNumber" 15="remoteSuffix" 16="remoteIban" 17="remoteName[0]" 18="remoteName[1]" 19="remoteBic" 20="uniqueId" 21="idForApplication" 22="groupId" 23="valutaDate" 24="date" 25="value/value" 26="value/currency" 27="fees/value" 28="fees/currency" 29="textKey" 30="textKeyExt" 31="transactionKey" 32="customerReference" 33="bankReference" 34="transactionCode" 35="transactionText" 36="primanota" 37="fiId" 38="purpose[0]" 39="purpose[1]" 40="purpose[2]" 41="purpose[3]" 42="purpose[4]" 43="purpose[5]" 44="purpose[6]" 45="purpose[7]" 46="purpose[8]" 47="purpose[9]" 48="purpose[10]" 49="purpose[11]" 50="category[0]" 51="category[1]" 52="category[2]" 53="category[3]" 54="category[4]" 55="category[5]" 56="category[6]" 57="category[7]" 58="period" 59="cycle" 60="executionDay" 61="firstExecutionDate" 62="lastExecutionDate" 63="nextExecutionDate" 64="type" 65="subType" 66="status" 67="charge" 68="remoteAddrStreet" 69="remoteAddrZipcode" 70="remoteAddrCity" 71="remotePhone" 72="unitId" 73="unitIdNameSpace" 74="units/value" 75="units/currency" 76="unitprice/value" 77="unitprice/currency" 78="commission/value" 79="commission/currency" 80="bankAccountId" 81="groupId" # double entry 82="creditorSchemeId" # SEPA debit notes 83="mandateId" 84="mandateDate/dateString" 85="mandateDebitorName" 86="sequenceType" 87="originalCreditorSchemeId" 88="originalMandateId" 89="originalCreditorName" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/sparda.conf.in0000644000175000017500000000224312364015477023245 00000000000000 char name="sparda" char shortDescr="Profile for Sparda CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by the Sparda bank" int import="1" #int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { # number of lines to ignore int ignoreLines="16" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="valutadate" 3="purpose[0]" 4="value/value" 5="value/currency" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/consors-tagesgeld.conf.in0000644000175000017500000000452312364015477025421 00000000000000char name="Consors" char shortDescr="Consors Tagesgeld Konto" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by Cortal Consors" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" char commaThousands="." char commaDecimal="," # default is "float", other values: "rational" char valueFormat="rational" params { # ignore the header int ignoreLines="1" # if 1 then values are quoted quote="0" # if 1 then a title line will be written containing the names of each # column title="0" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # title of Consors CSV files # # example entry of a Consors CSV file: # # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="Date" # Buchungstag 2="ValutaDate" # Wertstellung 3="Type" # Buchungsart 4="Purpose" # Verwendungszweck 5="RemoteName" # Auftraggeber/Beguenstigter # 6="RemoteAccountNumber" # Kontonummer # 7="CustomerReference" # Bankleitzahl 6="Value/Value" # Betrag (EUR) } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/spk-aachen.conf.in0000644000175000017500000000314112364015477024003 00000000000000char name="SPK-AACHEN" char shortDescr="Files from Sparkasse Aachen" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by Sparkasse Aachen" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YY" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="localAccountNumber" #2="date" 3="valutadate" 4="transactionText" 5="purpose[0]" 6="remoteName[0]" 7="remoteAccountNumber" 8="remoteBankCode" 9="value/value" 10="value/currency" #11="purpose[1]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/dkb.conf.in0000644000175000017500000000430312364015477022532 00000000000000 char name="DKB" char shortDescr="Profile for Deutsche Kreditbank CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by the Deutsche Kreditbank" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" # default is "float", other values: "rational" char valueFormat="float" params { # ignore the header int ignoreLines="7" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # title of DKB CSV files #"Umsatz abgerechnet";"Buchungstag";"Belegdatum";"Umsatzbeschreibung";"Betrag (EUR)";"Ursprünglicher Betrag"; # example entry of a DKB CSV file: #"Nein";"17.02.2009";"15.02.2009";"SOME PURPOSE";"-41,37";"-456,00 SEK"; # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { # 1="N/A" # Umsatz abgerechnet (JA oder NEIN) 2="valutadate" # Buchungstag 3="date" # Belegdatum 4="purpose[0]" # Umsatzbeschreibung 5="value/value" # Betrag (EUR) 6="purpose[1]" # Ursprünglicher Betrag } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/spk-steiermark.conf.in0000644000175000017500000000102412364015477024730 00000000000000char name="spk-steiermark" char shortDescr="Profile for steiermaerkische Sparkasse (AT)" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format of steiermaerkische Sparkasse" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { quote="1" title="1" delimiter=";" columns { 1="purpose[0]" 2="valutadate" 3="value/value" 4="purpose[1]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/Makefile.in0000644000175000017500000006320112643540061022555 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/csv/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in $(srcdir)/amex.conf.in \ $(srcdir)/aqmoney1.conf.in $(srcdir)/aqmoney2.conf.in \ $(srcdir)/comdirect.conf.in \ $(srcdir)/consors-tagesgeld.conf.in \ $(srcdir)/mijnpostbank.conf.in $(srcdir)/oko.conf.in \ $(srcdir)/spk-aachen.conf.in $(srcdir)/spk-steiermark.conf.in \ $(srcdir)/tonline-banking.conf.in $(srcdir)/test.conf.in \ $(srcdir)/vrnetworld.conf.in $(srcdir)/lbbberlin.conf.in \ $(srcdir)/bankaustria.conf.in $(srcdir)/psk.conf.in \ $(srcdir)/diba.conf.in $(srcdir)/dkb.conf.in \ $(srcdir)/dkb-cash.conf.in $(srcdir)/sparda.conf.in \ $(srcdir)/full.conf.in $(srcdir)/hypovereinsbank.conf.in \ $(srcdir)/postbankffm.conf.in $(srcdir)/cli-transfers.conf.in \ $(srcdir)/sns.conf.in $(srcdir)/transfers.conf.in \ $(srcdir)/sepadebitnotes.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf amex.conf aqmoney1.conf \ aqmoney2.conf comdirect.conf consors-tagesgeld.conf \ mijnpostbank.conf oko.conf spk-aachen.conf spk-steiermark.conf \ tonline-banking.conf test.conf vrnetworld.conf lbbberlin.conf \ bankaustria.conf psk.conf diba.conf dkb.conf dkb-cash.conf \ sparda.conf full.conf hypovereinsbank.conf postbankffm.conf \ cli-transfers.conf sns.conf transfers.conf sepadebitnotes.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in aqmoney1.conf.in aqmoney2.conf.in \ comdirect.conf.in test.conf.in mijnpostbank.conf.in \ spk-aachen.conf.in tonline-banking.conf.in \ amex.conf.in oko.conf.in spk-steiermark.conf.in \ vrnetworld.conf.in lbbberlin.conf.in bankaustria.conf.in psk.conf.in \ diba.conf.in sparda.conf.in full.conf.in dkb.conf.in dkb-cash.conf.in \ hypovereinsbank.conf.in postbankffm.conf.in cli-transfers.conf.in \ sns.conf.in consors-tagesgeld.conf.in \ transfers.conf.in sepadebitnotes.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/csv/profiles profiles_DATA = default.conf aqmoney1.conf aqmoney2.conf \ comdirect.conf mijnpostbank.conf \ spk-aachen.conf tonline-banking.conf amex.conf oko.conf spk-steiermark.conf \ vrnetworld.conf lbbberlin.conf bankaustria.conf psk.conf \ diba.conf sparda.conf full.conf dkb.conf dkb-cash.conf \ hypovereinsbank.conf postbankffm.conf cli-transfers.conf \ sns.conf consors-tagesgeld.conf \ transfers.conf sepadebitnotes.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/csv/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/csv/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ amex.conf: $(top_builddir)/config.status $(srcdir)/amex.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ aqmoney1.conf: $(top_builddir)/config.status $(srcdir)/aqmoney1.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ aqmoney2.conf: $(top_builddir)/config.status $(srcdir)/aqmoney2.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ comdirect.conf: $(top_builddir)/config.status $(srcdir)/comdirect.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ consors-tagesgeld.conf: $(top_builddir)/config.status $(srcdir)/consors-tagesgeld.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mijnpostbank.conf: $(top_builddir)/config.status $(srcdir)/mijnpostbank.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ oko.conf: $(top_builddir)/config.status $(srcdir)/oko.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ spk-aachen.conf: $(top_builddir)/config.status $(srcdir)/spk-aachen.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ spk-steiermark.conf: $(top_builddir)/config.status $(srcdir)/spk-steiermark.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ tonline-banking.conf: $(top_builddir)/config.status $(srcdir)/tonline-banking.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test.conf: $(top_builddir)/config.status $(srcdir)/test.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ vrnetworld.conf: $(top_builddir)/config.status $(srcdir)/vrnetworld.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ lbbberlin.conf: $(top_builddir)/config.status $(srcdir)/lbbberlin.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ bankaustria.conf: $(top_builddir)/config.status $(srcdir)/bankaustria.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ psk.conf: $(top_builddir)/config.status $(srcdir)/psk.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ diba.conf: $(top_builddir)/config.status $(srcdir)/diba.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ dkb.conf: $(top_builddir)/config.status $(srcdir)/dkb.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ dkb-cash.conf: $(top_builddir)/config.status $(srcdir)/dkb-cash.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ sparda.conf: $(top_builddir)/config.status $(srcdir)/sparda.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ full.conf: $(top_builddir)/config.status $(srcdir)/full.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ hypovereinsbank.conf: $(top_builddir)/config.status $(srcdir)/hypovereinsbank.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ postbankffm.conf: $(top_builddir)/config.status $(srcdir)/postbankffm.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ cli-transfers.conf: $(top_builddir)/config.status $(srcdir)/cli-transfers.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ sns.conf: $(top_builddir)/config.status $(srcdir)/sns.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ transfers.conf: $(top_builddir)/config.status $(srcdir)/transfers.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ sepadebitnotes.conf: $(top_builddir)/config.status $(srcdir)/sepadebitnotes.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/aqmoney1.conf.in0000644000175000017500000000216112364015477023524 00000000000000 char name="AqMoney1" char shortDescr="Profile for AqMoney1 CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by AqMoney (1)" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="*D.*M.YYYY" int utc="0" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="remoteName[0]" 2="purpose[0]" 3="value/value" 4="value/currency" 5="valutadate" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/default.conf.in0000644000175000017500000000432712364015477023424 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" # default is "float", other values: "rational" char valueFormat="float" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="transactionId" 2="localBankCode" 3="localAccountNumber" 4="remoteBankCode" 5="remoteAccountNumber" 6="date" 7="valutadate" 8="value/value" 9="value/currency" 10="localName" 11="remoteName[0]" 12="remoteName[1]" 13="purpose[0]" 14="purpose[1]" 15="purpose[2]" 16="purpose[3]" 17="purpose[4]" 18="purpose[5]" 19="purpose[6]" 20="purpose[7]" 21="purpose[8]" 22="purpose[9]" 23="purpose[10]" 24="purpose[11]" 25="category[0]" 26="category[1]" 27="category[2]" 28="category[3]" 29="category[4]" 30="category[5]" 31="category[6]" 32="category[7]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/vrnetworld.conf.in0000644000175000017500000000322612364015477024203 00000000000000 char name="vrnetworld" char shortDescr="Profile for VR Networld" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format of VR Networld" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter="TAB" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="valutadate" 3="remoteName[0]" 4="remoteAccountNumber" 5="remoteBankCode" 6="purpose[0]" 7="category[0]" 8="value/value" 9="value/currency" 10="localBankCode" 11="localAccountNumber" 12="transactionText" 13="transactionText" 14="dummy" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/lbbberlin.conf.in0000644000175000017500000000306712364015477023733 00000000000000 char name="LandesBankBerlin" char shortDescr="Profile for Landesbank Berlin CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by Landesbank Berlin for the Amazon.de Credit Card" int import="1" #int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { # if 1 then values are quoted quote="0" # if 1 then a title line will be written containing the names of each # column title="0" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_WriteA #example entry: #Kreditkartennr;Buchungsdatum;Kaufdatum;Zweck;Betrag Währung;Wechselkurs;Betrag in EUR #4344123412341234;07.07.2008;05.07.2008;TRAVELEX London (2) / London;60,00 GBP;0,78930;-76,02 columns { 1="localAccountNumber" # Kreditkartennummer 2="valutadate" # Buchungsdatum 3="date" # Kaufdatum 4="purpose[0]" # Zweck 5="purpose[1]" # Betrag in Fremdwährung (e.g.: 60,00 GBP) 6="purpose[2]" # Wechselkurs (e.g.: 0,78930) 7="value/value" # Betrag in EUR (e.g.: -76,02) } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/Makefile.am0000644000175000017500000000176612364015477022564 00000000000000 EXTRA_DIST=default.conf.in aqmoney1.conf.in aqmoney2.conf.in \ comdirect.conf.in test.conf.in mijnpostbank.conf.in \ spk-aachen.conf.in tonline-banking.conf.in \ amex.conf.in oko.conf.in spk-steiermark.conf.in \ vrnetworld.conf.in lbbberlin.conf.in bankaustria.conf.in psk.conf.in \ diba.conf.in sparda.conf.in full.conf.in dkb.conf.in dkb-cash.conf.in \ hypovereinsbank.conf.in postbankffm.conf.in cli-transfers.conf.in \ sns.conf.in consors-tagesgeld.conf.in \ transfers.conf.in sepadebitnotes.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/csv/profiles profiles_DATA=default.conf aqmoney1.conf aqmoney2.conf \ comdirect.conf mijnpostbank.conf \ spk-aachen.conf tonline-banking.conf amex.conf oko.conf spk-steiermark.conf \ vrnetworld.conf lbbberlin.conf bankaustria.conf psk.conf \ diba.conf sparda.conf full.conf dkb.conf dkb-cash.conf \ hypovereinsbank.conf postbankffm.conf cli-transfers.conf \ sns.conf consors-tagesgeld.conf \ transfers.conf sepadebitnotes.conf aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/mijnpostbank.conf.in0000644000175000017500000000311212364015477024466 00000000000000 char name="mijnpostbank" char shortDescr="Profile of MijnPostbank.nl csv export format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYYMMDD" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="1" char posNegFieldName="posNeg" char positiveValues="Bij", "C" char negativeValues="Af", "D" int defaultIsPositive="1" params { # no line to ignore int ignoreLines="0" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter="," # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="remoteName" 3="localAccountNumber" 4="remoteAccountNumber" 5="transactionId" 6="posNeg" 7="value/value" 8="category" 9="purpose" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/comdirect.conf.in0000644000175000017500000000225012364015477023742 00000000000000 char name="comdirect" char shortDescr="Profile for Comdirect CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by the ComDirect bank" int import="1" #int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { # number of lines to ignore int ignoreLines="22" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="valutadate" 3="purpose[0]" 4="purpose[1]" 5="value/value" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/cli-transfers.conf.in0000644000175000017500000000366212364015477024555 00000000000000 char name="cli-transfers" char shortDescr="default profile" char version="@AQBANKING_CLI_VERSION_STRING@" char longDescr="This profile is used for transactions" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) columns { 1="fiId" 2="localBankCode" 3="localAccountNumber" 4="remoteBankCode" 5="remoteAccountNumber" 6="date" 7="valutadate" 8="value/value" 9="value/currency" 10="localName" 11="remoteName[0]" 12="remoteName[1]" 13="status" 14="type" 15="purpose[0]" 16="purpose[1]" 17="purpose[2]" 18="purpose[3]" 19="purpose[4]" 20="purpose[5]" 21="purpose[6]" 22="purpose[7]" 23="purpose[8]" 24="purpose[9]" 25="purpose[10]" 26="purpose[11]" 27="category[0]" 28="groupId" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/hypovereinsbank.conf.in0000644000175000017500000000111112364015477025173 00000000000000char name="HypoVereinsbank" char shortDescr="Files from HypoVereinsbank banking online portal" char version="@AQBANKING_VERSION_STRING@" char longDescr="" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" int usePosNegField="0" int defaultIsPositive="1" params { quote="0" title="1" delimiter=";" columns { 1="localAccountNumber" 2="date" 3="valutadate" 4=remoteName[0] 5=remoteName[1] 6="purpose[0]" 7="value/value" 8="value/currency" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/test.conf.in0000644000175000017500000000376312364015477022762 00000000000000 char name="test" char shortDescr="test profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="1" char posNegFieldName="posNeg" char positiveValues="Bij", "C" char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="transactionId" 2="localBankCode" 3="localAccountNumber" 4="remoteBankCode" 5="remoteAccountNumber" 6="date" 7="valutadate" 8="value/value" 9="value/currency" 10="localName" 11="remoteName[0]" 12="remoteName[1]" 13="purpose[0]" 14="purpose[1]" 15="purpose[2]" 16="purpose[3]" 17="purpose[4]" 18="purpose[5]" 19="purpose[6]" 20="purpose[7]" 21="purpose[8]" 22="purpose[9]" 23="purpose[10]" 24="purpose[11]" 25="category[0]" 26="category[1]" 27="category[2]" 28="category[3]" 29="category[4]" 30="category[5]" 31="category[6]" 32="category[7]" 33="posNeg" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/diba.conf.in0000644000175000017500000000231212364015477022667 00000000000000 char name="diba" char shortDescr="Profile for DiBa CSV files" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by the DiBa bank" int import="1" #int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" params { # number of lines to ignore int ignoreLines="8" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="valutadate" 3="remoteName[0]" 4="transactionText" 5="purpose[0]" 6="value/value" 7="value/currency" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/sepadebitnotes.conf.in0000644000175000017500000000245012364015477025004 00000000000000 char name="sepadebitnotes" char shortDescr="sepadebitnotes" char version="@AQBANKING_CLI_VERSION_STRING@" char longDescr="This profile is used for SEPA debit notes" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" char subject="transactions" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) columns { 1="localBic" 2="localIban" 3="remoteBic" 4="remoteIban" 5="date" 6="value/value" 7="value/currency" 8="localName" 9="remoteName" 10="creditorSchemeId" # SEPA debit notes 11="mandateId" 12="mandateDate/dateString" 13="mandateDebitorName" 14="sequenceType" 15="purpose[0]" 16="purpose[1]" 17="purpose[2]" 18="purpose[3]" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/postbankffm.conf.in0000644000175000017500000000334512364015477024311 00000000000000 char name="PostbankFFM" char shortDescr="PostbankFFM" char version="@AQBANKING_VERSION_STRING@" char longDescr="Postbank FFM" int import="1" int export="0" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" int switchLocalRemote="1" int switchOnNegative="0" # default is "float", other values: "rational" char valueFormat="float" params { # if 1 then values are quoted quote="0" IgnoreLines=10 # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter="TAB" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="date" 2="valutadate" 3="TransactionText" 4="purpose" 5="localname" 6="remoteName" 7="value/value" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/amex.conf.in0000644000175000017500000000306612364015477022731 00000000000000 char name="amex" char shortDescr="American Express Card" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="0" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="localName" # CardholderName 2="valutadate" # ProcessingDate 3="purpose[0]" # Merchant Category 4="purpose[1]" # Subcategory 5="remoteName[0]" # MerchantNameLocation 6="value/value" # Amount } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/dkb-cash.conf.in0000644000175000017500000000510012364015477023442 00000000000000char name="DKB-Cash" char shortDescr="DKB Cash Konto" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the CSV format used by the Deutsche Kreditbank" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="DD.MM.YYYY" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transactions" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" char commaThousands="." char commaDecimal="," # default is "float", other values: "rational" char valueFormat="rational" params { # ignore the header int ignoreLines="6" # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # title of DKB CSV files #"Buchungstag";"Wertstellung";"Buchungstext";"Auftraggeber/Beguenstigter";"Verwendungszweck";"Kontonummer";"BLZ";"Betrag (EUR)"; # example entry of a DKB CSV file: #"14.07.2010";"14.07.2010";"LASTSCHRIFT";"SOME PURPOSE";"123456";"12345678";"-1.413,30"; # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) # the value of each of these variables is the name of a variable to be looked # up in the data given to GWEN_CSV_Write columns { 1="Date" # Buchungstag 2="ValutaDate" # Wertstellung 3="Type" # Buchungsart 4="RemoteName" # Auftraggeber/Beguenstigter 5="Purpose" # Verwendungszweck 6="RemoteAccountNumber" # Kontonummer 7="CustomerReference" # Bankleitzahl 8="Value/Value" # Betrag (EUR) } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/profiles/transfers.conf.in0000644000175000017500000000364212364015477024006 00000000000000 char name="transfers" char shortDescr="transfers" char version="@AQBANKING_CLI_VERSION_STRING@" char longDescr="This profile is used for transfers" int import="1" int export="1" char type="csv" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYY/MM/DD" int utc="0" # Valid subjects are: # - transactions: This exports booked transactions (default) # - notedTransactions: Exports noted transactions # char subject="transfers" # The following vars are used when there is an additional field within a # record which defines the sign of the amount. # Some banks use "C" (positive) and "D" (negative) or "Af" (negative) and # "Bij" (positive) int usePosNegField="0" char posNegFieldName="posNeg" #char positiveValues="Bij", "C" #char negativeValues="Af", "D" int defaultIsPositive="1" params { # if 1 then values are quoted quote="1" # if 1 then a title line will be written containing the names of each # column title="1" # special values are "TAB" and "SPACE" delimiter=";" # this is the group name looked for in the given data to GWEN_CSV_Write # if not given then all groups match #group="transaction" # this group contains the definition for each column # each variable in this group has its number as name # you can use index variables in the names (using square brackets) columns { 1="fiId" 2="localBankCode" 3="localAccountNumber" 4="remoteBankCode" 5="remoteAccountNumber" 6="date" 7="valutadate" 8="value/value" 9="value/currency" 10="localName" 11="remoteName[0]" 12="remoteName[1]" 13="status" 14="type" 15="purpose[0]" 16="purpose[1]" 17="purpose[2]" 18="purpose[3]" 19="purpose[4]" 20="purpose[5]" 21="purpose[6]" 22="purpose[7]" 23="purpose[8]" 24="purpose[9]" 25="purpose[10]" 26="purpose[11]" 27="category[0]" 28="groupId" } # columns } # params aqbanking-5.6.4beta/src/plugins/imexporters/csv/Makefile.in0000644000175000017500000010261612643540061020736 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/csv DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/csv.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = csv.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(dialogdatadir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = csv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_csv_la_OBJECTS = csv.lo csv_editprofile.lo csv_la_OBJECTS = $(am_csv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = csv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(csv_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(csv_la_SOURCES) DIST_SOURCES = $(csv_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dialogdata_DATA) $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = csv.la imexporterplugin_DATA = csv.xml dialogdatadir = $(aqbanking_pkgdatadir)/imexporters/csv/dialogs dialogdata_DATA = csv_editprofile.dlg csv_la_SOURCES = \ csv.c \ csv_editprofile.c noinst_HEADERS = \ csv_p.h \ csv_editprofile_l.h csv_editprofile_p.h EXTRA_DIST = README $(dialogdata_DATA) csv_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) csv_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/csv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/csv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): csv.xml: $(top_builddir)/config.status $(srcdir)/csv.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } csv.la: $(csv_la_OBJECTS) $(csv_la_DEPENDENCIES) $(EXTRA_csv_la_DEPENDENCIES) $(AM_V_CCLD)$(csv_la_LINK) -rpath $(imexporterplugindir) $(csv_la_OBJECTS) $(csv_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv_editprofile.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dialogdataDATA: $(dialogdata_DATA) @$(NORMAL_INSTALL) @list='$(dialogdata_DATA)'; test -n "$(dialogdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dialogdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dialogdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dialogdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dialogdatadir)" || exit $$?; \ done uninstall-dialogdataDATA: @$(NORMAL_UNINSTALL) @list='$(dialogdata_DATA)'; test -n "$(dialogdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dialogdatadir)'; $(am__uninstall_files_from_dir) install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(dialogdatadir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dialogdataDATA install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dialogdataDATA uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dialogdataDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dialogdataDATA \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(csv_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dialogdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv.xml.in0000644000175000017500000000044512364015477020620 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Im-/exporter for CSV This plugin imports/exports CSV data. aqbanking-5.6.4beta/src/plugins/imexporters/csv/Makefile.am0000644000175000017500000000162012364015477020726 00000000000000SUBDIRS=profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=csv.la imexporterplugin_DATA=csv.xml dialogdatadir = $(aqbanking_pkgdatadir)/imexporters/csv/dialogs dialogdata_DATA=csv_editprofile.dlg csv_la_SOURCES=\ csv.c \ csv_editprofile.c noinst_HEADERS=\ csv_p.h \ csv_editprofile_l.h csv_editprofile_p.h EXTRA_DIST=README $(dialogdata_DATA) csv_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) csv_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(csv_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dialogdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv_editprofile.dlg0000644000175000017500000003153312364015477022551 00000000000000 aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv_editprofile_l.h0000644000175000017500000000127512364015477022545 00000000000000/*************************************************************************** begin : Sat Jan 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AB_CSV_EDITPROFILE_L_H #define AB_CSV_EDITPROFILE_L_H #include #include GWEN_DIALOG *AB_CSV_EditProfileDialog_new(AB_IMEXPORTER *ie, GWEN_DB_NODE *params, const char *testFileName); #endif aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv.c0000644000175000017500000005427612364015477017650 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004,2012 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "csv_p.h" #include "csv_editprofile_l.h" #include "i18n_l.h" #include "imexporter_be.h" #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_CSV); GWEN_PLUGIN *imexporter_csv_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterCSV_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterCSV_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_CSV *ieh; ie=AB_ImExporter_new(ab, "csv"); GWEN_NEW_OBJECT(AH_IMEXPORTER_CSV, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CSV, ie, ieh, AH_ImExporterCSV_FreeData); ieh->dbio=GWEN_DBIO_GetPlugin("csv"); if (!ieh->dbio) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN DBIO plugin \"CSV\" not available"); AB_ImExporter_free(ie); return 0; } AB_ImExporter_SetImportFn(ie, AH_ImExporterCSV_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterCSV_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterCSV_CheckFile); AB_ImExporter_SetGetEditProfileDialogFn(ie, AH_ImExporterCSV_GetEditProfileDialog); /* announce special features */ AB_ImExporter_AddFlags(ie, AB_IMEXPORTER_FLAGS_GETPROFILEEDITOR_SUPPORTED); return ie; } void GWENHYWFAR_CB AH_ImExporterCSV_FreeData(void *bp, void *p){ AH_IMEXPORTER_CSV *ieh; ieh=(AH_IMEXPORTER_CSV*)p; GWEN_DBIO_free(ieh->dbio); GWEN_FREE_OBJECT(ieh); } int AH_ImExporterCSV_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_CSV *ieh; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CSV, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("transactions"); rv=GWEN_DBIO_Import(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Data imported, transforming to UTF-8")); rv=AB_ImExporter_DbFromIso8859_1ToUtf8(dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error converting data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Transforming data to transactions"); rv=AH_ImExporterCSV__ImportFromGroup(ctx, dbData, params); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } AB_VALUE *AH_ImExporterCSV__ValueFromDb(GWEN_DB_NODE *dbV, int commaThousands, int commaDecimal) { const char *sv; const char *sc; char *cbuf=NULL; AB_VALUE *val; sv=GWEN_DB_GetCharValue(dbV, "value", 0, 0); sc=GWEN_DB_GetCharValue(dbV, "currency", 0, "EUR"); if (commaThousands || commaDecimal) { const char *pSrc; char *pDst; cbuf=(char*) malloc(strlen(sv)+1); pSrc=sv; pDst=cbuf; /* copy all but thousands commas to new buffer */ while(*pSrc) { if (commaThousands && *pSrc==commaThousands) { /* skip thousands comma */ } else if (commaDecimal && *pSrc==commaDecimal) /* replace whatever is given by a recognizable decimal point */ *(pDst++)='.'; else *(pDst++)=*pSrc; pSrc++; } /* add trailing 0 to end the string */ *pDst=0; sv=(const char*) cbuf; } val=AB_Value_fromString(sv); if (cbuf) free(cbuf); if (val && sc) AB_Value_SetCurrency(val, sc); return val; } int AH_ImExporterCSV__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams) { GWEN_DB_NODE *dbT; const char *dateFormat; int inUtc; int usePosNegField; int splitValueInOut; int defaultIsPositive; int switchLocalRemote; int switchOnNegative; const char *posNegFieldName; int commaThousands=0; int commaDecimal=0; uint32_t progressId; const char *s; dateFormat=GWEN_DB_GetCharValue(dbParams, "dateFormat", 0, "YYYY/MM/DD"); inUtc=GWEN_DB_GetIntValue(dbParams, "utc", 0, 0); usePosNegField=GWEN_DB_GetIntValue(dbParams, "usePosNegField", 0, 0); defaultIsPositive=GWEN_DB_GetIntValue(dbParams, "defaultIsPositive", 0, 1); posNegFieldName=GWEN_DB_GetCharValue(dbParams, "posNegFieldName", 0, "posNeg"); splitValueInOut=GWEN_DB_GetIntValue(dbParams, "splitValueInOut", 0, 0); switchLocalRemote=GWEN_DB_GetIntValue(dbParams, "switchLocalRemote", 0, 0); switchOnNegative=GWEN_DB_GetIntValue(dbParams, "switchOnNegative", 0, 1); s=GWEN_DB_GetCharValue(dbParams, "commaThousands", 0, 0); if (s) commaThousands=*s; s=GWEN_DB_GetCharValue(dbParams, "commaDecimal", 0, 0); if (s) commaDecimal=*s; progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Importing parsed data..."), NULL, GWEN_DB_Groups_Count(db), 0); dbT=GWEN_DB_GetFirstGroup(db); while(dbT) { int matches; int i; const char *p; const char *gn; /* check whether the name of the current groups matches */ matches=0; gn=GWEN_DB_GroupName(dbT); for (i=0; ; i++) { p=GWEN_DB_GetCharValue(dbParams, "groupNames", i, 0); if (!p) break; if (strcasecmp(gn, p)==0) { matches=1; break; } } /* for */ if (!matches && i==0) { /* no names given, check default */ if ((strcasecmp(GWEN_DB_GroupName(dbT), "transaction")==0) || (strcasecmp(GWEN_DB_GroupName(dbT), "debitnote")==0) || (strcasecmp(GWEN_DB_GroupName(dbT), "line")==0)) matches=1; } if (matches) { /* possibly merge in/out values */ if (splitValueInOut) { AB_VALUE *tv=NULL; const char *s; const char *tc; tc=GWEN_DB_GetCharValue(dbT, "value/currency", 0, NULL); s=GWEN_DB_GetCharValue(dbT, "valueIn/value", 0, 0); if (s && *s) { GWEN_DB_NODE *dbV; dbV=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "valueIn"); tv=AH_ImExporterCSV__ValueFromDb(dbV, commaThousands, commaDecimal); } else { s=GWEN_DB_GetCharValue(dbT, "valueOut/value", 0, 0); if (s && *s) { GWEN_DB_NODE *dbV; dbV=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "valueOut"); if (dbV) { tv=AH_ImExporterCSV__ValueFromDb(dbV, commaThousands, commaDecimal); if (!AB_Value_IsNegative(tv)) /* outgoing but positive, negate */ AB_Value_Negate(tv); } } } if (tv) { GWEN_DB_NODE *dbTV; if (tc) AB_Value_SetCurrency(tv, tc); dbTV=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); AB_Value_toDb(tv, dbTV); AB_Value_free(tv); } } if (GWEN_DB_GetCharValue(dbT, "value/value", 0, 0)) { AB_TRANSACTION *t; const char *p; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Found a possible transaction"); t=AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in config file"); GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Error, "Error in config file"); GWEN_Gui_ProgressEnd(progressId); return GWEN_ERROR_GENERIC; } /* translate date */ p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) { GWEN_TIME *ti; ti=AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } /* translate valutaDate */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) { GWEN_TIME *ti; ti=AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); } /* translate mandateDate */ p=GWEN_DB_GetCharValue(dbT, "mandateDate", 0, 0); if (p) { GWEN_DATE *dt; dt=GWEN_Date_fromStringWithTemplate(p, dateFormat); if (dt) { AB_Transaction_SetMandateDate(t, dt); GWEN_Date_free(dt); } } /* possibly translate value */ if (usePosNegField) { const char *s; int determined=0; /* get positive/negative mark */ s=GWEN_DB_GetCharValue(dbT, posNegFieldName, 0, 0); if (s) { int j; /* try positive marks first */ for (j=0; ; j++) { const char *patt; patt=GWEN_DB_GetCharValue(dbParams, "positiveValues", j, 0); if (!patt) break; if (-1!=GWEN_Text_ComparePattern(s, patt, 0)) { /* value already is positive, keep it that way */ determined=1; break; } } /* for */ if (!determined) { for (j=0; ; j++) { const char *patt; patt=GWEN_DB_GetCharValue(dbParams, "negativeValues", j, 0); if (!patt) break; if (-1!=GWEN_Text_ComparePattern(s, patt, 0)) { const AB_VALUE *pv; /* value must be negated */ pv=AB_Transaction_GetValue(t); if (pv) { AB_VALUE *v; v=AB_Value_dup(pv); AB_Value_Negate(v); AB_Transaction_SetValue(t, v); AB_Value_free(v); } determined=1; break; } } /* for */ } } /* still undecided? */ if (!determined && !defaultIsPositive) { const AB_VALUE *pv; /* value must be negated, because default is negative */ pv=AB_Transaction_GetValue(t); if (pv) { AB_VALUE *v; v=AB_Value_dup(pv); AB_Value_Negate(v); AB_Transaction_SetValue(t, v); AB_Value_free(v); } } } /* if usePosNegField */ else if (switchLocalRemote) { const AB_VALUE *pv; /* value must be negated, because default is negative */ pv=AB_Transaction_GetValue(t); if (pv) { if (!(AB_Value_IsNegative(pv) ^ (switchOnNegative!=0))) { const GWEN_STRINGLIST *csl; GWEN_BUFFER *b1; GWEN_BUFFER *b2; /* need to switch local/remote name */ b1=GWEN_Buffer_new(0, 64, 0, 1); b2=GWEN_Buffer_new(0, 64, 0, 1); /* get data */ csl=AB_Transaction_GetRemoteName(t); if (csl && GWEN_StringList_Count(csl)) GWEN_Buffer_AppendString(b1, GWEN_StringList_FirstString(csl)); if (AB_Transaction_GetLocalName(t)) GWEN_Buffer_AppendString(b2, AB_Transaction_GetLocalName(t)); /* clear */ AB_Transaction_ClearRemoteName(t); AB_Transaction_SetLocalName(t, NULL); /* set reversed */ if (GWEN_Buffer_GetUsedBytes(b2)) AB_Transaction_AddRemoteName(t, GWEN_Buffer_GetStart(b2), 0); if (GWEN_Buffer_GetUsedBytes(b1)) AB_Transaction_SetLocalName(t, GWEN_Buffer_GetStart(b1)); /* cleanup */ GWEN_Buffer_free(b2); GWEN_Buffer_free(b1); } } } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_ImExporterContext_AddTransaction(ctx, t); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Empty group"); } } else { int rv; DBG_INFO(AQBANKING_LOGDOMAIN, "Not a transaction, checking subgroups"); /* not a transaction, check subgroups */ rv=AH_ImExporterCSV__ImportFromGroup(ctx, dbT, dbParams); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_Gui_ProgressEnd(progressId); return rv; } } if (GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_ONE)== GWEN_ERROR_USER_ABORTED) { GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Error, I18N("Aborted by user")); GWEN_Gui_ProgressEnd(progressId); return GWEN_ERROR_USER_ABORTED; } dbT=GWEN_DB_GetNextGroup(dbT); } // while GWEN_Gui_ProgressEnd(progressId); return 0; } int AH_ImExporterCSV_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_CSV *ieh; GWEN_DBIO_CHECKFILE_RESULT rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CSV, ie); assert(ieh); assert(ieh->dbio); rv=GWEN_DBIO_CheckFile(ieh->dbio, fname); switch(rv) { case GWEN_DBIO_CheckFileResultOk: return 0; case GWEN_DBIO_CheckFileResultNotOk: return GWEN_ERROR_BAD_DATA; case GWEN_DBIO_CheckFileResultUnknown: return AB_ERROR_INDIFFERENT; default: return GWEN_ERROR_GENERIC; } /* switch */ } int AH_ImExporterCSV__ExportTransactions(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params, int notedOrTransfers){ AH_IMEXPORTER_CSV *ieh; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; const char *dateFormat; int inUtc; int usePosNegField; //int defaultIsPositive; int splitValueInOut; const char *posNegFieldName; const char *valueFormat; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CSV, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dateFormat=GWEN_DB_GetCharValue(params, "dateFormat", 0, "YYYY/MM/DD"); inUtc=GWEN_DB_GetIntValue(params, "utc", 0, 0); usePosNegField=GWEN_DB_GetIntValue(params, "usePosNegField", 0, 0); //defaultIsPositive=GWEN_DB_GetIntValue(params, "defaultIsPositive", 0, 1); posNegFieldName=GWEN_DB_GetCharValue(params, "posNegFieldName", 0, "posNeg"); splitValueInOut=GWEN_DB_GetIntValue(params, "splitValueInOut", 0, 0); valueFormat=GWEN_DB_GetCharValue(params, "valueFormat", 0, "float"); /* create db, store transactions in it */ dbData=GWEN_DB_Group_new("transactions"); ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(ai) { const AB_TRANSACTION *t; switch(notedOrTransfers) { case AH_IMEXPORTERCSV_SUBJECT_TRANSACTIONS: t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); break; case AH_IMEXPORTERCSV_SUBJECT_NOTEDTRANSACTIONS: t=AB_ImExporterAccountInfo_GetFirstNotedTransaction(ai); break; case AH_IMEXPORTERCSV_SUBJECT_TRANSFERS: t=AB_ImExporterAccountInfo_GetFirstTransfer(ai); break; default: DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid subject type %d", notedOrTransfers); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, "Invalid subject type %d", notedOrTransfers); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } while(t) { GWEN_DB_NODE *dbTransaction; const GWEN_TIME *ti; const GWEN_DATE *dt; dbTransaction=GWEN_DB_Group_new("transaction"); rv=AB_Transaction_toDb(t, dbTransaction); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not transform transaction to db"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error transforming data to db"); GWEN_DB_Group_free(dbData); GWEN_DB_Group_free(dbTransaction); return GWEN_ERROR_GENERIC; } /* transform dates */ GWEN_DB_DeleteGroup(dbTransaction, "date"); GWEN_DB_DeleteGroup(dbTransaction, "valutaDate"); GWEN_DB_DeleteGroup(dbTransaction, "mandateDate"); ti=AB_Transaction_GetDate(t); if (ti) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (inUtc) rv=GWEN_Time_toUtcString(ti, dateFormat, tbuf); else rv=GWEN_Time_toString(ti, dateFormat, tbuf); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad date format string/date"); } else GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, "date", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } ti=AB_Transaction_GetValutaDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (inUtc) rv=GWEN_Time_toUtcString(ti, dateFormat, tbuf); else rv=GWEN_Time_toString(ti, dateFormat, tbuf); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad date format string/date"); } else GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, "valutaDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } dt=AB_Transaction_GetMandateDate(t); if (dt) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); rv=GWEN_Date_toStringWithTemplate(dt, dateFormat, tbuf); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad date format string/date"); } else GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, "mandateDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* possibly transform value */ if (usePosNegField) { const AB_VALUE *v; const char *s; v=AB_Transaction_GetValue(t); if (v) { if (!AB_Value_IsNegative(v)) { s=GWEN_DB_GetCharValue(params, "positiveValues", 0, 0); if (s) { GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, posNegFieldName, s); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No value for \"positiveValues\" in params"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } } else { s=GWEN_DB_GetCharValue(params, "negativeValues", 0, 0); if (s) { AB_VALUE *nv; GWEN_DB_NODE *dbV; GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, posNegFieldName, s); nv=AB_Value_dup(v); AB_Value_Negate(nv); dbV=GWEN_DB_GetGroup(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); assert(dbV); if (AB_Value_toDb(nv, dbV)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not store value to DB"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No value for \"negativeValues\" in params"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } } } } else if (splitValueInOut) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) { const char *gn; GWEN_DB_NODE *dbV; if (AB_Value_IsNegative(v)) gn="valueOut"; else gn="valueIn"; dbV=GWEN_DB_GetGroup(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_GROUPS, gn); assert(dbV); if (strcasecmp(valueFormat, "float")==0) AB_Value_toDbFloat(v, dbV); else AB_Value_toDb(v, dbV); GWEN_DB_ClearGroup(dbTransaction, "value"); } } if (strcasecmp(valueFormat, "float")==0) { GWEN_DB_NODE *dbV; dbV=GWEN_DB_GetGroup(dbTransaction, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbV) { AB_VALUE *v; v=AB_Value_fromDb(dbV); if (v) { GWEN_DB_ClearGroup(dbV, 0); AB_Value_toDbFloat(v, dbV); AB_Value_free(v); } } } /* add transaction db */ GWEN_DB_AddGroup(dbData, dbTransaction); switch(notedOrTransfers) { case AH_IMEXPORTERCSV_SUBJECT_TRANSACTIONS: t=AB_ImExporterAccountInfo_GetNextTransaction(ai); break; case AH_IMEXPORTERCSV_SUBJECT_NOTEDTRANSACTIONS: t=AB_ImExporterAccountInfo_GetNextNotedTransaction(ai); break; case AH_IMEXPORTERCSV_SUBJECT_TRANSFERS: t=AB_ImExporterAccountInfo_GetNextTransfer(ai); break; default: DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid subject type %d", notedOrTransfers); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, "Invalid subject type %d", notedOrTransfers); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } } ai=AB_ImExporterContext_GetNextAccountInfo(ctx); } rv=GWEN_DBIO_Export(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error exporting data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterCSV_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_CSV *ieh; const char *subject; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_CSV, ie); assert(ieh); assert(ieh->dbio); subject=GWEN_DB_GetCharValue(params, "subject", 0, "transactions"); if (strcasecmp(subject, "transactions")==0) return AH_ImExporterCSV__ExportTransactions(ie, ctx, sio, params, AH_IMEXPORTERCSV_SUBJECT_TRANSACTIONS); else if (strcasecmp(subject, "notedTransactions")==0) return AH_ImExporterCSV__ExportTransactions(ie, ctx, sio, params, AH_IMEXPORTERCSV_SUBJECT_NOTEDTRANSACTIONS); else if (strcasecmp(subject, "transfers")==0) return AH_ImExporterCSV__ExportTransactions(ie, ctx, sio, params, AH_IMEXPORTERCSV_SUBJECT_TRANSFERS); else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to export unknown subject \"%s\"", subject); return GWEN_ERROR_INVALID; } } int AH_ImExporterCSV_GetEditProfileDialog(AB_IMEXPORTER *ie, GWEN_DB_NODE *dbProfile, const char *testFileName, GWEN_DIALOG **pDlg) { GWEN_DIALOG *dlg; dlg=AB_CSV_EditProfileDialog_new(ie, dbProfile, testFileName); if (dlg==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "Unable to create the dialog"); return GWEN_ERROR_INTERNAL; } *pDlg=dlg; return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/csv/csv_editprofile.c0000644000175000017500000006357712364015477022242 00000000000000/*************************************************************************** begin : Sat Jan 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "csv_editprofile_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 400 #define DIALOG_MAX_COLUMNS 30 #define DIALOG_MAX_TESTLINES 100 GWEN_INHERIT(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG) static const char *csv_dateFormats[]={ "DD.MM.YYYY", "dD.mM.YYYY", "MM/DD/YYYY", "mM/dD/YYYY", "DD/MM/YYYY", "dD/mM/YYYY", "YYYY/MM/DD", "YYYY/mM/dD", NULL }; static const char *csv_delimiters[]={ "TAB", I18S("Tabulator (default)"), "SPACE", I18S("Space"), ",", I18S("Komma (,)"), ";", I18S("Semicolon (;)"), ":", I18S("Colon (:)"), NULL }; static const char *csv_subjects[]={ "transactions", I18S("Booked Transactions (default)"), "notedTransactions", I18S("Noted Transactions"), NULL }; static const char *csv_amountFormats[]={ "rational", I18S("Rational (default)"), "float", I18S("Float"), NULL }; static const char *csv_columns[]={ "", I18S("-- empty --"), "localCountry", I18S("Local Country Code"), "localBankCode", I18S("Local Bank Code"), "localBranchId", I18S("Local Branch Id"), "localAccountNumber", I18S("Local Account Number"), "localSuffix", I18S("Local Account Suffix"), "localIban", I18S("Local IBAN"), "localName", I18S("Local Name (e.g. your name)"), "localBIC", I18S("Local BIC"), "remoteCountry", I18S("Remote Country Code"), "remoteBankCode", I18S("Remote Bank Code"), "remoteBranchId", I18S("Remote Branch Id"), "remoteAccountNumber", I18S("Remote Account Number"), "remoteSuffix", I18S("Remote Account Suffix"), "remoteIban", I18S("Remote IBAN"), "remoteName[0]", I18S("Remote Name (First Line)"), "remoteName[1]", I18S("Remote Name (Second Line)"), "remoteBIC", I18S("Remote BIC"), "uniqueId", I18S("Unique Transaction Id"), "idForApplication", I18S("Id assigned by Application"), // "groupId", I18S("Group Id"), "valutaDate", I18S("Valuta Date"), "date", I18S("Booking Date"), "value/value", I18S("Amount (Value)"), "value/currency", I18S("Amount (Currency)"), "fees/value", I18S("Fees (Amount)"), "fees/currency", I18S("Fees (Currency)"), "textKey", I18S("Textkey"), "textKeyExt", I18S("Textkey Extensions"), "transactionKey", I18S("Transaction Key"), "customerReference", I18S("Customer Reference"), "bankReference", I18S("Bank Reference"), "transactionCode", I18S("Transaction Code"), "transactionText", I18S("Transaction Text (not purpose!)"), "primanota", I18S("Primanota"), "fiId", I18S("Id assigned by Finance Institute"), "purpose[0]", I18S("Purpose (1st Line)"), "purpose[1]", I18S("Purpose (2nd Line)"), "purpose[2]", I18S("Purpose (3rd Line)"), "purpose[3]", I18S("Purpose (4th Line)"), "purpose[4]", I18S("Purpose (5th Line)"), "purpose[5]", I18S("Purpose (6th Line)"), "purpose[6]", I18S("Purpose (7th Line)"), "purpose[7]", I18S("Purpose (8th Line)"), "purpose[8]", I18S("Purpose (9th Line)"), "purpose[9]", I18S("Purpose (10th Line)"), "category[0]", I18S("Category (1st Line)"), "category[1]", I18S("Category (2nd Line)"), "category[2]", I18S("Category (3rd Line)"), "category[3]", I18S("Category (4th Line)"), "category[4]", I18S("Category (5th Line)"), "category[5]", I18S("Category (6th Line)"), "category[6]", I18S("Category (7th Line)"), "category[7]", I18S("Category (8th Line)"), "period", I18S("Period (Standing Order)"), "cycle", I18S("Cycle (Standing Order)"), "executionDay", I18S("Execution Day (Standing Order)"), "firstExecutionDate", I18S("Date of First Execution (Standing Order)"), "lastExecutionDate", I18S("Date of Last Execution (Standing Order)"), "nextExecutionDate", I18S("Date of Next Execution (Standing Order)"), "type", I18S("Type"), "subtype", I18S("Subtype"), "status", I18S("Status"), "remoteAddrStreet", I18S("Remote Address: Street"), "remoteAddrZipCode", I18S("Remote Address: Zipcode"), "remoteAddrCity", I18S("Remote Address: City"), "remotePhone", I18S("Remote Address: Phone Number"), "unitId", I18S("Unit Id (Stock)"), "unitIdNameSpace", I18S("Namespace of Unit Id (Securities)"), "units/value", I18S("Amount of Units (Securities) (value)"), "units/currency", I18S("Amount of Units (Securities) (currency)"), "unitprice/value", I18S("Price per Unit (Securities) (value)"), "unitprice/currency", I18S("Price per Unit (Securities) (currency)"), "commission/value", I18S("Commission (Securities) (value)"), "commission/currency", I18S("Commission (Securities) (currency)"), "bankAccountId", I18S("Bank Account Id"), "posNeg", I18S("Positive/Negative Mark"), NULL }; GWEN_DIALOG *AB_CSV_EditProfileDialog_new(AB_IMEXPORTER *ie, GWEN_DB_NODE *dbProfile, const char *testFileName) { AB_BANKING *ab; GWEN_DIALOG *dlg; AB_CSV_EDIT_PROFILE_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; assert(ie); assert(dbProfile); ab=AB_ImExporter_GetBanking(ie); dlg=GWEN_Dialog_new("ab_csv_edit_profile"); GWEN_NEW_OBJECT(AB_CSV_EDIT_PROFILE_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg, xdlg, AB_CSV_EditProfileDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_CSV_EditProfileDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/imexporters/csv/dialogs/csv_editprofile.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->imExporter=ie; xdlg->testFileName=testFileName; xdlg->dbProfile=dbProfile; xdlg->columns=GWEN_StringList_new(); /* done */ return dlg; } void GWENHYWFAR_CB AB_CSV_EditProfileDialog_FreeData(void *bp, void *p) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; xdlg=(AB_CSV_EDIT_PROFILE_DIALOG*) p; assert(xdlg); GWEN_Buffer_free(xdlg->dataBuffer); GWEN_FREE_OBJECT(xdlg); } static const char *getCharValueFromDoubleStringsCombo(GWEN_DIALOG *dlg, const char *comboBoxName, const char **strings) { int i; int j; /* count number of string entries */ for (j=0; ; j+=2) { if (strings[j]==NULL) break; } j>>=1; i=GWEN_Dialog_GetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_Value, 0, -1); if (i<0 || i>=j) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Index %d in %s out of range (%d)", i, comboBoxName, j); return NULL; } return strings[i*2]; } static int readTestData(GWEN_DIALOG *dlg) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; GWEN_SYNCIO *sio; GWEN_SYNCIO *baseIo; GWEN_BUFFER *dbuf; int i; int ignoreLines=0; int rv; const char *delimiter; GWEN_BUFFER *wbuffer; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); GWEN_StringList_Clear(xdlg->columns); /* create file IO */ sio=GWEN_SyncIo_File_new(xdlg->testFileName, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); baseIo=sio; /* create buffered IO on top of file io to allow for reading of lines below */ sio=GWEN_SyncIo_Buffered_new(baseIo); dbuf=GWEN_Buffer_new(0, 1024, 0, 1); /* skip lines */ ignoreLines=GWEN_Dialog_GetIntProperty(dlg, "ignoreLinesSpin", GWEN_DialogProperty_Value, 0, 0); i=GWEN_Dialog_GetIntProperty(dlg, "headerCheck", GWEN_DialogProperty_Value, 0, 0); if (i) ignoreLines++; delimiter=getCharValueFromDoubleStringsCombo(dlg, "delimiterCombo", csv_delimiters); if (!(delimiter && *delimiter)) delimiter="TAB"; if (strcasecmp(delimiter, "TAB")==0) delimiter="\t"; else if (strcasecmp(delimiter, "SPACE")==0) delimiter=" "; /* open file */ rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(dbuf); GWEN_SyncIo_free(sio); return rv; } for (i=0; icolumns, GWEN_Buffer_GetStart(wbuffer), 0, 0); GWEN_Buffer_Reset(wbuffer); if (*s) { if (strchr(delimiter, *s)) s++; } } /* while */ GWEN_Buffer_free(wbuffer); for (i=0; icolumns, i); if (s==NULL) break; GWEN_Dialog_SetCharProperty(dlg, editName, GWEN_DialogProperty_Value, 0, s, 0); } return 0; } static void setUpComboFromSingleStrings(GWEN_DIALOG *dlg, const char *comboBoxName, const char **strings, const char *s) { int i; int j; const char *t; GWEN_Dialog_SetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_ClearValues, 0, 0, 0); j=-1; for (i=0; ; i++) { t=strings[i]; if (t==NULL) break; GWEN_Dialog_SetCharProperty(dlg, comboBoxName, GWEN_DialogProperty_AddValue, 0, t, 0); if (s && *s && strcmp(s, t)==0) j=i; } if (j==-1) { if (s && *s) { GWEN_Dialog_SetCharProperty(dlg, comboBoxName, GWEN_DialogProperty_AddValue, 0, s, 0); j=i; } else j=0; } GWEN_Dialog_SetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_Value, 0, j, 0); } static void setUpComboFromDoubleStrings(GWEN_DIALOG *dlg, const char *comboBoxName, const char **strings, const char *s) { int i; int j; const char *t1; const char *t2; GWEN_Dialog_SetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_ClearValues, 0, 0, 0); j=-1; for (i=0; ; i+=2) { t1=strings[i]; if (t1==NULL) break; t2=strings[i+1]; GWEN_Dialog_SetCharProperty(dlg, comboBoxName, GWEN_DialogProperty_AddValue, 0, I18N(t2), 0); if (s && *s && strcasecmp(s, t1)==0) j=i/2; } if (j==-1) { if (s && *s) { GWEN_Dialog_SetCharProperty(dlg, comboBoxName, GWEN_DialogProperty_AddValue, 0, s, 0); j=i/2; } else j=0; } GWEN_Dialog_SetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_Value, 0, j, 0); } static int setDbValueFromDoubleStringsCombo(GWEN_DIALOG *dlg, GWEN_DB_NODE *db, const char *varName, const char *comboBoxName, const char **strings) { int i; int j; /* count number of string entries */ for (j=0; ; j+=2) { if (strings[j]==NULL) break; } j>>=1; i=GWEN_Dialog_GetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_Value, 0, -1); if (i<0 || i>=j) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Index %d in %s out of range (%d)", i, comboBoxName, j); return GWEN_ERROR_INVALID; } GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, varName, strings[i*2]); return 0; } static int setColumnValueFromCombo(GWEN_DIALOG *dlg, GWEN_DB_NODE *db, const char *varName, const char *comboBoxName, const char **strings) { int i; int j; /* count number of string entries */ for (j=0; ; j+=2) { if (strings[j]==NULL) break; } j>>=1; i=GWEN_Dialog_GetIntProperty(dlg, comboBoxName, GWEN_DialogProperty_Value, 0, -1); if (i<0 || i>=j) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Index %d of %s out of range (%d)", i, comboBoxName, j); return GWEN_ERROR_INVALID; } if (i!=0) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, varName, strings[i*2]); return 0; } void AB_CSV_EditProfileDialog_Init(GWEN_DIALOG *dlg) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; int i; const char *s; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); /* setup dialog size */ dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit CSV Profile"), 0); /* setup dialog widgets */ s=GWEN_DB_GetCharValue(xdlg->dbProfile, "name", 0, NULL); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "nameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=GWEN_DB_GetCharValue(xdlg->dbProfile, "version", 0, NULL); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "versionEdit", GWEN_DialogProperty_Value, 0, s, 0); s=GWEN_DB_GetCharValue(xdlg->dbProfile, "shortDescr", 0, NULL); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "shortDescrEdit", GWEN_DialogProperty_Value, 0, s, 0); s=GWEN_DB_GetCharValue(xdlg->dbProfile, "longDescr", 0, NULL); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "longDescrEdit", GWEN_DialogProperty_Value, 0, s, 0); i=GWEN_DB_GetIntValue(xdlg->dbProfile, "import", 0, 1); GWEN_Dialog_SetIntProperty(dlg, "importCheck", GWEN_DialogProperty_Value, 0, i?1:0, 0); i=GWEN_DB_GetIntValue(xdlg->dbProfile, "export", 0, 1); GWEN_Dialog_SetIntProperty(dlg, "exportCheck", GWEN_DialogProperty_Value, 0, i?1:0, 0); GWEN_Dialog_SetIntProperty(dlg, "ignoreLinesSpin", GWEN_DialogProperty_MinValue, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "ignoreLinesSpin", GWEN_DialogProperty_MaxValue, 0, 1000, 0); i=GWEN_DB_GetIntValue(xdlg->dbProfile, "params/ignoreLines", 0, 0); GWEN_Dialog_SetIntProperty(dlg, "ignoreLinesSpin", GWEN_DialogProperty_Value, 0, i, 0); i=GWEN_DB_GetIntValue(xdlg->dbProfile, "params/title", 0, 0); GWEN_Dialog_SetIntProperty(dlg, "headerCheck", GWEN_DialogProperty_Value, 0, i?1:0, 0); i=GWEN_DB_GetIntValue(xdlg->dbProfile, "params/quote", 0, 1); GWEN_Dialog_SetIntProperty(dlg, "quoteCheck", GWEN_DialogProperty_Value, 0, i?1:0, 0); /* setup delimiter combo box */ s=GWEN_DB_GetCharValue(xdlg->dbProfile, "params/delimiter", 0, NULL); setUpComboFromDoubleStrings(dlg, "delimiterCombo", csv_delimiters, s); /* setup subject combo box */ s=GWEN_DB_GetCharValue(xdlg->dbProfile, "subject", 0, NULL); setUpComboFromDoubleStrings(dlg, "subjectCombo", csv_subjects, s); /* setup date format combo box */ s=GWEN_DB_GetCharValue(xdlg->dbProfile, "dateFormat", 0, NULL); setUpComboFromSingleStrings(dlg, "dateFormatCombo", csv_dateFormats, s); /* setup amount format combo box */ s=GWEN_DB_GetCharValue(xdlg->dbProfile, "valueFormat", 0, NULL); setUpComboFromDoubleStrings(dlg, "amountFormatCombo", csv_amountFormats, s); /* setup columns page */ for (i=0; idbProfile, varName, 0, NULL); setUpComboFromDoubleStrings(dlg, comboName, csv_columns, s); } if (xdlg->testFileName) readTestData(dlg); } void AB_CSV_EditProfileDialog_Fini(GWEN_DIALOG *dlg) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); if (idbProfile, NULL); GWEN_DB_AddGroupChildren(xdlg->dbProfile, db); GWEN_DB_Group_free(db); return GWEN_DialogEvent_ResultAccept; } else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { } else if (strcasecmp(sender, "headerCheck")==0) { if (xdlg->testFileName) readTestData(dlg); return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AB_CSV_EditProfileDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender){ AB_CSV_EDIT_PROFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); if (strcasecmp(sender, "ignoreLinesSpin")==0 || strcasecmp(sender, "delimiterCombo")==0 || strcasecmp(sender, "headerCheck")==0 || strcasecmp(sender, "quoteCheck")==0) { if (xdlg->testFileName) readTestData(dlg); } return GWEN_DialogEvent_ResultHandled; } int GWENHYWFAR_CB AB_CSV_EditProfileDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_CSV_EDIT_PROFILE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_CSV_EDIT_PROFILE_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_CSV_EditProfileDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_CSV_EditProfileDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AB_CSV_EditProfileDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AB_CSV_EditProfileDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/plugins/imexporters/csv/README0000644000175000017500000000000012364015477017541 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/q43/0000755000175000017500000000000012643540655016570 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/q43/q43_p.h0000644000175000017500000000310512364015477017605 00000000000000/*************************************************************************** begin : Mon May 03 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_Q43_P_H #define AQHBCI_IMEX_Q43_P_H #include typedef struct AH_IMEXPORTER_Q43 AH_IMEXPORTER_Q43; struct AH_IMEXPORTER_Q43 { int dummy; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_q43_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterQ43_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterQ43_FreeData(void *bp, void *p); static const char *AH_ImExporterQ43_GetCurrencyCode(int code); static int AH_ImExporterQ43_ReadInt(const char *p, int len); static int AH_ImExporterQ43_ReadDocument(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_FAST_BUFFER *fb, GWEN_DB_NODE *params); static int AH_ImExporterQ43_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterQ43_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterQ43_CheckFile(AB_IMEXPORTER *ie, const char *fname); #endif /* AQHBCI_IMEX_CTXFILE_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/q43/profiles/0000755000175000017500000000000012643540655020413 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/q43/profiles/Makefile.in0000644000175000017500000005031512643540063022375 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/q43/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/q43/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/q43/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/q43/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/q43/profiles/default.conf.in0000644000175000017500000000030612364015477023231 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports Q43 files" int import="1" int export="0" params { } # params aqbanking-5.6.4beta/src/plugins/imexporters/q43/profiles/Makefile.am0000644000175000017500000000017012364015477022364 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/q43/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/q43/Makefile.in0000644000175000017500000010001412643540063020542 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/q43 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/q43.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = q43.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = q43_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_q43_la_OBJECTS = q43.lo q43_la_OBJECTS = $(am_q43_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = q43_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(q43_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(q43_la_SOURCES) DIST_SOURCES = $(q43_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST = imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = q43.la imexporterplugin_DATA = q43.xml noinst_HEADERS = q43_p.h q43_la_SOURCES = q43.c q43_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) q43_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/q43/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/q43/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): q43.xml: $(top_builddir)/config.status $(srcdir)/q43.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } q43.la: $(q43_la_OBJECTS) $(q43_la_DEPENDENCIES) $(EXTRA_q43_la_DEPENDENCIES) $(AM_V_CCLD)$(q43_la_LINK) -rpath $(imexporterplugindir) $(q43_la_OBJECTS) $(q43_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q43.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(q43_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/q43/Makefile.am0000644000175000017500000000115012364015477020540 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST= imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=q43.la imexporterplugin_DATA=q43.xml noinst_HEADERS=q43_p.h q43_la_SOURCES=q43.c q43_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) q43_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(q43_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/q43/q43.xml.in0000644000175000017500000000047212364015477020250 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) This plugin reads and writes Spanish Q43 files. This plugin imports Q43 files. aqbanking-5.6.4beta/src/plugins/imexporters/q43/q43.c0000644000175000017500000002433612364015477017272 00000000000000/*************************************************************************** begin : Mon May 03 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "q43_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define YEAR_2000_CUTOFF 80 GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_Q43); GWEN_PLUGIN *imexporter_q43_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterQ43_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterQ43_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_Q43 *ieh; ie=AB_ImExporter_new(ab, "q43"); GWEN_NEW_OBJECT(AH_IMEXPORTER_Q43, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_Q43, ie, ieh, AH_ImExporterQ43_FreeData); AB_ImExporter_SetImportFn(ie, AH_ImExporterQ43_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterQ43_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterQ43_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterQ43_FreeData(void *bp, void *p){ AH_IMEXPORTER_Q43 *ieh; ieh=(AH_IMEXPORTER_Q43*)p; GWEN_FREE_OBJECT(ieh); } /* this needs to be replaced later by a more generic approach */ const char *AH_ImExporterQ43_GetCurrencyCode(int code) { switch(code) { case 978: return "EUR"; break; default: break; } return NULL; } int AH_ImExporterQ43_ReadInt(const char *p, int len) { int res=0; int i; for (i=0; iYEAR_2000_CUTOFF) y+=1900; else y+=2000; GWEN_Date_free(date); date=GWEN_Date_fromGregorian(y, m, d); if (date==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid date in record %02d", code); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } break; } case 11: { /* account header */ char bankCode[9]; char accountNumber[11]; int cy; if (size<80) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Record %02d too short (%d bytes)", code, GWEN_Buffer_GetUsedBytes(lbuf)); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } /* get bankcode (combine bank code key and office branch code */ strncpy(bankCode, p+2, 8); bankCode[8]=0; /* get account number */ strncpy(accountNumber, p+10, 10); accountNumber[10]=0; /* get account info (or create it if necessary) */ iea=AB_ImExporterContext_GetAccountInfo(ctx, bankCode, accountNumber); assert(iea); cy=((p[47]-'0')*100)+((p[48]-'0')*10)+(p[49]-'0'); currency=AH_ImExporterQ43_GetCurrencyCode(cy); if (!currency) { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown currency code %d, ignoring", cy); } /* TODO: read initial balance */ hadSome++; break; } case 22: { GWEN_TIME *ti; AB_VALUE *v; int y, m, d; char amount[32]; const char *s; if (size<80) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Record %02d too short (%d bytes)", code, GWEN_Buffer_GetUsedBytes(lbuf)); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } if (iea==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad order of records (22 before 11)"); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } if (t) AB_ImExporterAccountInfo_AddTransaction(iea, t); t=AB_Transaction_new(); /* extract booking date */ y=((p[10]-'0')*10)+(p[11]-'0'); m=((p[12]-'0')*10)+(p[13]-'0'); d=((p[14]-'0')*10)+(p[15]-'0'); if (y>YEAR_2000_CUTOFF) y+=1900; else y+=2000; ti=GWEN_Time_new(y, m-1, d, 12, 0, 0, 1); if (ti==NULL) { DBG_WARN(AQBANKING_LOGDOMAIN, "Invalid booking date in record %02d, ignoring", code); } else { AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } /* extract valuta date */ y=((p[16]-'0')*10)+(p[17]-'0'); m=((p[18]-'0')*10)+(p[18]-'0'); d=((p[19]-'0')*10)+(p[20]-'0'); if (y>YEAR_2000_CUTOFF) y+=1900; else y+=2000; ti=GWEN_Time_new(y, m-1, d, 12, 0, 0, 1); if (ti==NULL) { DBG_WARN(AQBANKING_LOGDOMAIN, "Invalid valuta date in record %02d, ignoring", code); } else { AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); } /* get amount */ strncpy(amount, p+28, 14); amount[14]=0; strncat(amount, "/100:", sizeof(amount)-1); if (currency) strncat(amount, currency, sizeof(amount)-1); amount[sizeof(amount)-1]=0; v=AB_Value_fromString(amount); if (v==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid amount in transaction"); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } else { if (p[27]=='1') /* FIXME: Do we have to negate on "1" or "2"? */ AB_Value_Negate(v); AB_Transaction_SetValue(t, v); AB_Value_free(v); } /* copy local account info */ s=AB_ImExporterAccountInfo_GetAccountNumber(iea); AB_Transaction_SetLocalAccountNumber(t, s); s=AB_ImExporterAccountInfo_GetBankCode(iea); AB_Transaction_SetLocalBankCode(t, s); break; } case 23: { /* transaction comments */ GWEN_BUFFER *tbuf; if (size<80) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Record %02d too short (%d bytes)", code, GWEN_Buffer_GetUsedBytes(lbuf)); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } if (t==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad order of records (23 before 22)"); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } tbuf=GWEN_Buffer_new(0, 256, 0, 1); /* comment 1 */ GWEN_Buffer_AppendBytes(tbuf, p+4, 38); GWEN_Text_CondenseBuffer(tbuf); if (GWEN_Buffer_GetUsedBytes(tbuf)) AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); /* comment 2 */ GWEN_Buffer_AppendBytes(tbuf, p+42, 38); GWEN_Text_CondenseBuffer(tbuf); if (GWEN_Buffer_GetUsedBytes(tbuf)) AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_free(tbuf); break; } case 33: { /* end of accunt record */ /* store current transaction if any */ if (t) { AB_ImExporterAccountInfo_AddTransaction(iea, t); t=NULL; } // TODO: check the control fields here, read final account balance break; } case 88: { int numrecs; numrecs=AH_ImExporterQ43_ReadInt(p+20, 6); if (numrecs!=records) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Number of records doesn't match (%d != %d)", numrecs, records); AB_Transaction_free(t); GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return GWEN_ERROR_BAD_DATA; } break; } default: DBG_WARN(AQBANKING_LOGDOMAIN, "Ignoring line with code %02d", code); } GWEN_Buffer_Reset(lbuf); if (code!=0) records++; } } while (rv>=0); if (rv==GWEN_ERROR_EOF && hadSome) /* ignore EOF when we received some data */ rv=0; if (t) { DBG_WARN(AQBANKING_LOGDOMAIN, "There is still a transaction open..."); AB_Transaction_free(t); } /* done */ GWEN_Date_free(date); GWEN_Buffer_free(lbuf); return rv; } int AH_ImExporterQ43_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_Q43 *ieh; GWEN_FAST_BUFFER *fb; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_Q43, ie); assert(ieh); fb=GWEN_FastBuffer_new(1024, sio); rv=AH_ImExporterQ43_ReadDocument(ie, ctx, fb, params); GWEN_FastBuffer_free(fb); return rv; } int AH_ImExporterQ43_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_Q43 *ieh; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_Q43, ie); assert(ieh); /* always return indifferent (for now) */ return AB_ERROR_INDIFFERENT; } int AH_ImExporterQ43_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_Q43 *ieh; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_Q43, ie); assert(ieh); // TODO return GWEN_ERROR_NOT_IMPLEMENTED; } aqbanking-5.6.4beta/src/plugins/imexporters/sepa/0000755000175000017500000000000012643540655017111 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/sepa/sepa_pain_008.c0000644000175000017500000003110612374723023021515 00000000000000 #include int AH_ImExporterSEPA_Export_Pain_008(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *painNode, uint32_t doctype[], GWEN_DB_NODE *params){ GWEN_XMLNODE *n; AH_IMEXPORTER_SEPA_PMTINF_LIST *pl; AH_IMEXPORTER_SEPA_PMTINF *pmtinf; int is_8_1_1=(doctype[1]==1 && doctype[2]==1); const char *s; int rv; rv=AH_ImExporterSEPA_Export_Pain_Setup(ie, ctx, painNode, doctype, &pl); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here %d", rv); return rv; } /* generate PmtInf blocks */ pmtinf=AH_ImExporter_Sepa_PmtInf_List_First(pl); while(pmtinf) { const GWEN_TIME *tti; GWEN_XMLNODE *nn; AB_TRANSACTION *t; AB_TRANSACTION_LIST2_ITERATOR *it; n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "PmtInf"); GWEN_XMLNode_AddChild(painNode, n); /* generate PmtInfId */ if (1) { GWEN_TIME *ti; GWEN_BUFFER *tbuf; uint32_t uid; char numbuf[32]; ti=GWEN_CurrentTime(); tbuf=GWEN_Buffer_new(0, 64, 0, 1); uid=AB_Banking_GetUniqueId(AB_ImExporter_GetBanking(ie)); GWEN_Time_toUtcString(ti, "YYYYMMDD-hh:mm:ss-", tbuf); snprintf(numbuf, sizeof(numbuf)-1, "%08x", uid); GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_XMLNode_SetCharValue(n, "PmtInfId", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); GWEN_Time_free(ti); } GWEN_XMLNode_SetCharValue(n, "PmtMtd", "DD"); if (!is_8_1_1) { /* store BtchBookg */ GWEN_XMLNode_SetCharValue(n, "BtchBookg", GWEN_DB_GetIntValue(params, "singleBookingWanted", 0, 1) ? "false" : "true"); /* store NbOfTxs */ GWEN_XMLNode_SetIntValue(n, "NbOfTxs", pmtinf->tcount); /* store CtrlSum */ GWEN_XMLNode_SetCharValue(n, "CtrlSum", pmtinf->ctrlsum); } /* PmtTpInf */ nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "PmtTpInf"); if (nn) { GWEN_XMLNODE *nnn; nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "SvcLvl"); if (nnn) { GWEN_XMLNode_SetCharValue(nnn, "Cd", "SEPA"); GWEN_XMLNode_AddChild(nn, nnn); } if (!is_8_1_1) { s=GWEN_DB_GetCharValue(params, "LocalInstrumentSEPACode", 0, "CORE"); if ((doctype[1]>=3 && !strcmp(s, "COR1")) || /* new in 008.003.02 */ !strcmp(s, "CORE") || !strcmp(s, "B2B")) GWEN_XMLNode_SetCharValueByPath(nn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "LclInstrm/Cd", s); else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid Local InstrumentCode"); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } } switch(pmtinf->sequenceType) { case AB_Transaction_SequenceTypeOnce: GWEN_XMLNode_SetCharValue(nn, "SeqTp", "OOFF"); break; case AB_Transaction_SequenceTypeFirst: GWEN_XMLNode_SetCharValue(nn, "SeqTp", "FRST"); break; case AB_Transaction_SequenceTypeFollowing: GWEN_XMLNode_SetCharValue(nn, "SeqTp", "RCUR"); break; case AB_Transaction_SequenceTypeFinal: GWEN_XMLNode_SetCharValue(nn, "SeqTp", "FNAL"); break; default: DBG_ERROR(AQBANKING_LOGDOMAIN, "Sequence type of debit note unknown"); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } GWEN_XMLNode_AddChild(n, nn); } /* create "ReqdColltnDt" */ tti=pmtinf->date; if (tti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Time_toString(tti, "YYYY-MM-DD", tbuf); GWEN_XMLNode_SetCharValue(n, "ReqdColltnDt", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { GWEN_XMLNode_SetCharValue(n, "ReqdColltnDt", "1999-01-01"); } /* create "Cdtr" */ nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Cdtr"); if (nn) { GWEN_XMLNode_AddChild(n, nn); GWEN_XMLNode_SetCharValue(nn, "Nm", pmtinf->localName); } /* create "CdtrAcct" */ GWEN_XMLNode_SetCharValueByPath(n, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrAcct/Id/IBAN", pmtinf->localIban); /* create "CdtrAgt" */ GWEN_XMLNode_SetCharValueByPath(n, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrAgt/FinInstnId/BIC", pmtinf->localBic); GWEN_XMLNode_SetCharValue(n, "ChrgBr", "SLEV"); /* create "CdtrSchmeId" */ if (!is_8_1_1) { /* Otherwise set on DrctDbtTx level */ GWEN_XMLNode_SetCharValueByPath(n, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrSchmeId/Id/PrvtId/Othr/Id", pmtinf->creditorSchemeId); GWEN_XMLNode_SetCharValueByPath(n, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrSchmeId/Id/PrvtId/Othr/SchmeNm/Prtry", "SEPA"); } /* DrctDbtTxInf */ it=AB_Transaction_List2_First(pmtinf->transactions); assert(it); t=AB_Transaction_List2Iterator_Data(it); while(t) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "DrctDbtTxInf"); if (nn) { GWEN_XMLNODE *nnn; const AB_VALUE *tv; GWEN_XMLNode_AddChild(n, nn); /* create "PmtId/EndToEndId" */ s=AB_Transaction_GetEndToEndReference(t); if (!( s && *s)) s=AB_Transaction_GetCustomerReference(t); if (!s) s="NOTPROVIDED"; GWEN_XMLNode_SetCharValueByPath(nn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "PmtId/EndToEndId", s); tv=AB_Transaction_GetValue(t); if (tv==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No value in transaction"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "InstdAmt"); if (nnn) { GWEN_BUFFER *tbuf; GWEN_XMLNODE *nnnn; GWEN_XMLNode_AddChild(nn, nnn); tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(tv, tbuf, 2, 0); s=AB_Value_GetCurrency(tv); if (!s) s="EUR"; GWEN_XMLNode_SetProperty(nnn, "Ccy", s); nnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeData, GWEN_Buffer_GetStart(tbuf)); GWEN_XMLNode_AddChild(nnn, nnnn); GWEN_Buffer_free(tbuf); } /* DrctDbtTx */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "DrctDbtTx"); if (nnn) { GWEN_XMLNODE *nnnn; GWEN_XMLNode_AddChild(nn, nnn); /* add mandate info */ nnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "MndtRltdInf"); if (nnnn) { const char *mandateId; const char *origCredSchemId; const char *origMandateId; const char *origCreditorName; const GWEN_DATE *dt; GWEN_BUFFER *tbuf; GWEN_XMLNode_AddChild(nnn, nnnn); dt=AB_Transaction_GetMandateDate(t); if (!dt) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing mandate date for direct debit"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } mandateId=AB_Transaction_GetMandateId(t); if (!mandateId) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing mandate id for direct debit"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } origCredSchemId=AB_Transaction_GetOriginalCreditorSchemeId(t); origMandateId=AB_Transaction_GetOriginalMandateId(t); origCreditorName=AB_Transaction_GetOriginalCreditorName(t); /* MndtId */ GWEN_XMLNode_SetCharValue(nnnn, "MndtId", mandateId); /* DtOfSgntr */ tbuf=GWEN_Buffer_new(0, 32, 0, 1); rv=GWEN_Date_toStringWithTemplate(dt, "YYYY-MM-DD", tbuf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error converting date to string"); GWEN_Buffer_free(tbuf); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return rv; } GWEN_XMLNode_SetCharValue(nnnn, "DtOfSgntr", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); if ((origCredSchemId && *origCredSchemId) || (origMandateId && *origMandateId) || (origCreditorName && *origCreditorName)) { GWEN_XMLNODE *n5; GWEN_XMLNode_SetCharValue(nnnn, "AmdmntInd", "true"); n5=GWEN_XMLNode_GetNodeByXPath(nnnn, "AmdmntInfDtls/OrgnlCdtrSchmeId", 0); if (n5) { if (origMandateId && *origMandateId) GWEN_XMLNode_SetCharValue(n5, "OrgnlMndtId", origMandateId); if (origCreditorName && *origCreditorName) GWEN_XMLNode_SetCharValue(n5, "Nm", origCreditorName); if (origCredSchemId && *origCredSchemId) { GWEN_XMLNode_SetCharValueByPath(n5, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, !is_8_1_1 ? "Id/PrvtId/Othr/Id" : "Id/PrvtId/OthrId/Id", origCredSchemId); GWEN_XMLNode_SetCharValueByPath(n5, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, !is_8_1_1 ? "Id/PrvtId/Othr/SchmeNm/Prtry" : "Id/PrvtId/OthrId/IdTp", "SEPA"); } } } else { GWEN_XMLNode_SetCharValue(nnnn, "AmdmntInd", "false"); } } /* create "CdtrSchmeId" */ if (is_8_1_1) { /* Otherwise set on PmtInf level */ GWEN_XMLNode_SetCharValueByPath(nnn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrSchmeId/Id/PrvtId/OthrId/Id", pmtinf->creditorSchemeId); GWEN_XMLNode_SetCharValueByPath(nnn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrSchmeId/Id/PrvtId/OthrId/IdTp", "SEPA"); } } /* create "DbtrAgt" */ s=AB_Transaction_GetRemoteBic(t); if (s && *s) GWEN_XMLNode_SetCharValueByPath(nn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "DbtrAgt/FinInstnId/BIC", s); else if (doctype[1]<3) { /* BIC not required since 008.003.02 */ DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote BIC"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } /* create "Dbtr" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Dbtr"); if (nnn) { const GWEN_STRINGLIST *sl; const char *s=NULL; GWEN_XMLNode_AddChild(nn, nnn); sl=AB_Transaction_GetRemoteName(t); if (sl) s=GWEN_StringList_FirstString(sl); if (!s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote name"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } GWEN_XMLNode_SetCharValue(nnn, "Nm", s); } /* create "DbtrAcct" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "DbtrAcct"); if (nnn) { GWEN_XMLNODE *nnnn; GWEN_XMLNode_AddChild(nn, nnn); s=AB_Transaction_GetRemoteIban(t); if (!s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote IBAN"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } nnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Id"); if (nnnn) { GWEN_XMLNode_AddChild(nnn, nnnn); GWEN_XMLNode_SetCharValue(nnnn, "IBAN", s); } } /* add "Ultimate Debitor Name", if given */ s=AB_Transaction_GetMandateDebitorName(t); if (s && *s) GWEN_XMLNode_SetCharValueByPath(nn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "UltmtDbtr/Nm", s); /* create "RmtInf" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "RmtInf"); if (nnn) { const GWEN_STRINGLIST *sl; GWEN_BUFFER *tbuf; GWEN_XMLNode_AddChild(nn, nnn); tbuf=GWEN_Buffer_new(0, 140, 0, 1); sl=AB_Transaction_GetPurpose(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_Buffer_GetUsedBytes(tbuf)) GWEN_Buffer_AppendByte(tbuf, ' '); GWEN_Buffer_AppendString(tbuf, s); se=GWEN_StringListEntry_Next(se); } if (GWEN_Buffer_GetUsedBytes(tbuf)>140) GWEN_Buffer_Crop(tbuf, 0, 140); } if (GWEN_Buffer_GetUsedBytes(tbuf)<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing purpose in transaction"); GWEN_Buffer_free(tbuf); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } GWEN_XMLNode_SetCharValue(nnn, "Ustrd", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } t=AB_Transaction_List2Iterator_Next(it); } /* while t */ AB_Transaction_List2Iterator_free(it); pmtinf=AH_ImExporter_Sepa_PmtInf_List_Next(pmtinf); } /* while pmtinf */ AH_ImExporter_Sepa_PmtInf_List_free(pl); return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/sepa/sepa.xml.in0000644000175000017500000000041712364015477021111 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) SEPA This plugin exports SEPA data. aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/0000755000175000017500000000000012643540655020734 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/008_002_02.conf.in0000644000175000017500000000073312364015477023323 00000000000000 char name="008_002_02" char shortDescr="pain.008.002.02" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.008.002.02" int import="0" int export="1" char type="008.002.02" # XML namespace of the pain messages handled by this profile char xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02" # Disable this option if transactions initiated in a batch job should # not be listed seperately in your account statements. int singleBookingWanted="1" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/Makefile.in0000644000175000017500000005301412643540063022715 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/sepa/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in $(srcdir)/001_001_02.conf.in \ $(srcdir)/001_002_03.conf.in $(srcdir)/001_003_03.conf.in \ $(srcdir)/008_001_01.conf.in $(srcdir)/008_002_02.conf.in \ $(srcdir)/008_003_02.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf 001_001_02.conf 001_002_03.conf \ 001_003_03.conf 008_001_01.conf 008_002_02.conf \ 008_003_02.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = \ default.conf.in \ 001_001_02.conf.in \ 001_002_03.conf.in \ 001_003_03.conf.in \ 008_001_01.conf.in \ 008_002_02.conf.in \ 008_003_02.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/sepa/profiles profiles_DATA = default.conf 001_001_02.conf 001_002_03.conf 001_003_03.conf 008_001_01.conf 008_002_02.conf 008_003_02.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/sepa/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/sepa/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 001_001_02.conf: $(top_builddir)/config.status $(srcdir)/001_001_02.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 001_002_03.conf: $(top_builddir)/config.status $(srcdir)/001_002_03.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 001_003_03.conf: $(top_builddir)/config.status $(srcdir)/001_003_03.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 008_001_01.conf: $(top_builddir)/config.status $(srcdir)/008_001_01.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 008_002_02.conf: $(top_builddir)/config.status $(srcdir)/008_002_02.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 008_003_02.conf: $(top_builddir)/config.status $(srcdir)/008_003_02.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/default.conf.in0000644000175000017500000000046212364015477023555 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports transfers" int import="0" int export="1" char type="001.001.02" # XML namespace of the pain messages handled by this profile char xmlns="urn:sepade:xsd:pain.001.001.02" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/008_001_01.conf.in0000644000175000017500000000046112364015477023317 00000000000000 char name="008_001_01" char shortDescr="pain.008.001.01" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.008.001.01" int import="0" int export="1" char type="008.001.01" # XML namespace of the pain messages handled by this profile char xmlns="urn:sepade:xsd:pain.008.001.01" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/Makefile.am0000644000175000017500000000054012364015477022706 00000000000000 EXTRA_DIST=\ default.conf.in \ 001_001_02.conf.in \ 001_002_03.conf.in \ 001_003_03.conf.in \ 008_001_01.conf.in \ 008_002_02.conf.in \ 008_003_02.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/sepa/profiles profiles_DATA=default.conf 001_001_02.conf 001_002_03.conf 001_003_03.conf 008_001_01.conf 008_002_02.conf 008_003_02.conf aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/001_002_03.conf.in0000644000175000017500000000073312364015477023315 00000000000000 char name="001_002_03" char shortDescr="pain.001.002.03" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.001.002.03" int import="0" int export="1" char type="001.002.03" # XML namespace of the pain messages handled by this profile char xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.002.03" # Disable this option if transactions initiated in a batch job should # not be listed seperately in your account statements. int singleBookingWanted="1" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/001_001_02.conf.in0000644000175000017500000000053312364015477023311 00000000000000 char name="001_001_02" char shortDescr="pain.001.001.02 (sepade)" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.001.001.02 (sepade rather than ISO version)" int import="0" int export="1" char type="001.001.02" # XML namespace of the pain messages handled by this profile char xmlns="urn:sepade:xsd:pain.001.001.02" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/008_003_02.conf.in0000644000175000017500000000113212364015477023316 00000000000000 char name="008_003_02" char shortDescr="pain.008.003.02" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.008.003.02" int import="0" int export="1" char type="008.003.02" # XML namespace of the pain messages handled by this profile char xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.003.02" # Determine the type of direct debit transactions. # Options: CORE (default), COR1, B2B. #char LocalInstrumentSEPACode="CORE" # Disable this option if transactions initiated in a batch job should # not be listed seperately in your account statements. int singleBookingWanted="1" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/profiles/001_003_03.conf.in0000644000175000017500000000073312364015477023316 00000000000000 char name="001_003_03" char shortDescr="pain.001.003.03" char version="@AQBANKING_VERSION_STRING@" char longDescr="Profile for pain.001.003.03" int import="0" int export="1" char type="001.003.03" # XML namespace of the pain messages handled by this profile char xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.003.03" # Disable this option if transactions initiated in a batch job should # not be listed seperately in your account statements. int singleBookingWanted="1" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/Makefile.in0000644000175000017500000010020612643540063021066 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/sepa DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/sepa.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = sepa.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = sepa_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_sepa_la_OBJECTS = sepa.lo sepa_la_OBJECTS = $(am_sepa_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = sepa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(sepa_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(sepa_la_SOURCES) DIST_SOURCES = $(sepa_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) extra_sources = \ sepa_pain_001.c \ sepa_pain_008.c EXTRA_DIST = README $(extra_sources) noinst_HEADERS = sepa_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = sepa.la imexporterplugin_DATA = sepa.xml sepa_la_SOURCES = sepa.c sepa_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) sepa_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/sepa/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/sepa/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): sepa.xml: $(top_builddir)/config.status $(srcdir)/sepa.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } sepa.la: $(sepa_la_OBJECTS) $(sepa_la_DEPENDENCIES) $(EXTRA_sepa_la_DEPENDENCIES) $(AM_V_CCLD)$(sepa_la_LINK) -rpath $(imexporterplugindir) $(sepa_la_OBJECTS) $(sepa_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sepa.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(sepa_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/sepa/sepa_p.h0000644000175000017500000000510312364015477020447 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_SEPA_P_H #define AQHBCI_IMEX_SEPA_P_H #include typedef struct AH_IMEXPORTER_SEPA AH_IMEXPORTER_SEPA; struct AH_IMEXPORTER_SEPA { int dummy; }; typedef struct AH_IMEXPORTER_SEPA_PMTINF AH_IMEXPORTER_SEPA_PMTINF; struct AH_IMEXPORTER_SEPA_PMTINF { GWEN_LIST_ELEMENT(AH_IMEXPORTER_SEPA_PMTINF) int tcount; AB_VALUE *value; char *ctrlsum; const GWEN_TIME *date; uint32_t transDate; const char *localName; const char *localIban; const char *localBic; AB_TRANSACTION_SEQUENCETYPE sequenceType; const char *creditorSchemeId; AB_TRANSACTION_LIST2 *transactions; }; /* these functions are not part of the public API */ static void AH_ImExporter_Sepa_PmtInf_free(AH_IMEXPORTER_SEPA_PMTINF *pmtinf); GWEN_LIST_FUNCTION_DEFS(AH_IMEXPORTER_SEPA_PMTINF, AH_ImExporter_Sepa_PmtInf) AQBANKING_EXPORT GWEN_PLUGIN *imexporter_sepa_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterSEPA_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterSEPA_FreeData(void *bp, void *p); static int AH_ImExporterSEPA_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterSEPA_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterSEPA_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AH_ImExporterSEPA_Export_Pain_001(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *painNode, uint32_t doctype[], GWEN_DB_NODE *params); static int AH_ImExporterSEPA_Export_Pain_008(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *painNode, uint32_t doctype[], GWEN_DB_NODE *params); #endif /* AQHBCI_IMEX_SEPA_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/sepa/Makefile.am0000644000175000017500000000130012364015477021056 00000000000000SUBDIRS=profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) extra_sources=\ sepa_pain_001.c \ sepa_pain_008.c EXTRA_DIST=README $(extra_sources) noinst_HEADERS=sepa_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=sepa.la imexporterplugin_DATA=sepa.xml sepa_la_SOURCES=sepa.c sepa_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) sepa_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(sepa_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/sepa/sepa_pain_001.c0000644000175000017500000001734412374723023021516 00000000000000 #include int AH_ImExporterSEPA_Export_Pain_001(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *painNode, uint32_t doctype[], GWEN_DB_NODE *params){ GWEN_XMLNODE *n; AH_IMEXPORTER_SEPA_PMTINF_LIST *pl; AH_IMEXPORTER_SEPA_PMTINF *pmtinf; int post_1_1_2=(doctype[1]>1 || doctype[2]>2); const char *s; int rv; rv=AH_ImExporterSEPA_Export_Pain_Setup(ie, ctx, painNode, doctype, &pl); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here %d", rv); return rv; } /* generate PmtInf blocks */ pmtinf=AH_ImExporter_Sepa_PmtInf_List_First(pl); while(pmtinf) { const GWEN_TIME *tti; GWEN_XMLNODE *nn; AB_TRANSACTION *t; AB_TRANSACTION_LIST2_ITERATOR *it; n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "PmtInf"); GWEN_XMLNode_AddChild(painNode, n); /* generate PmtInfId */ if (1) { GWEN_TIME *ti; GWEN_BUFFER *tbuf; uint32_t uid; char numbuf[32]; ti=GWEN_CurrentTime(); tbuf=GWEN_Buffer_new(0, 64, 0, 1); uid=AB_Banking_GetUniqueId(AB_ImExporter_GetBanking(ie)); GWEN_Time_toUtcString(ti, "YYYYMMDD-hh:mm:ss-", tbuf); snprintf(numbuf, sizeof(numbuf)-1, "%08x", uid); GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_XMLNode_SetCharValue(n, "PmtInfId", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); GWEN_Time_free(ti); } GWEN_XMLNode_SetCharValue(n, "PmtMtd", "TRF"); if (post_1_1_2) { /* store BtchBookg */ GWEN_XMLNode_SetCharValue(n, "BtchBookg", GWEN_DB_GetIntValue(params, "singleBookingWanted", 0, 1) ? "false" : "true"); /* store NbOfTxs */ GWEN_XMLNode_SetIntValue(n, "NbOfTxs", pmtinf->tcount); /* store CtrlSum */ GWEN_XMLNode_SetCharValue(n, "CtrlSum", pmtinf->ctrlsum); } nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "PmtTpInf"); if (nn) { GWEN_XMLNODE *nnn; nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "SvcLvl"); if (nnn) { GWEN_XMLNode_SetCharValue(nnn, "Cd", "SEPA"); GWEN_XMLNode_AddChild(nn, nnn); } GWEN_XMLNode_AddChild(n, nn); } /* create ReqdExctnDt" */ tti=pmtinf->date; if (tti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Time_toString(tti, "YYYY-MM-DD", tbuf); GWEN_XMLNode_SetCharValue(n, "ReqdExctnDt", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { GWEN_XMLNode_SetCharValue(n, "ReqdExctnDt", "1999-01-01"); } /* create "Dbtr" */ nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Dbtr"); if (nn) { GWEN_XMLNode_AddChild(n, nn); GWEN_XMLNode_SetCharValue(nn, "Nm", pmtinf->localName); } /* create "DbtrAcct" */ nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "DbtrAcct"); if (nn) { GWEN_XMLNODE *nnn; GWEN_XMLNode_AddChild(n, nn); nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Id"); if (nnn) { GWEN_XMLNode_AddChild(nn, nnn); GWEN_XMLNode_SetCharValue(nnn, "IBAN", pmtinf->localIban); } } /* create "DbtrAgt" */ nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "DbtrAgt"); if (nn) { GWEN_XMLNODE *nnn; GWEN_XMLNode_AddChild(n, nn); nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "FinInstnId"); if (nnn) { GWEN_XMLNode_AddChild(nn, nnn); GWEN_XMLNode_SetCharValue(nnn, "BIC", pmtinf->localBic); } } GWEN_XMLNode_SetCharValue(n, "ChrgBr", "SLEV"); it=AB_Transaction_List2_First(pmtinf->transactions); assert(it); t=AB_Transaction_List2Iterator_Data(it); while(t) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "CdtTrfTxInf"); if (nn) { GWEN_XMLNODE *nnn; const AB_VALUE *tv; GWEN_XMLNode_AddChild(n, nn); /* create "PmtId" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "PmtId"); if (nnn) { GWEN_XMLNode_AddChild(nn, nnn); s=AB_Transaction_GetEndToEndReference(t); if (!( s && *s)) s=AB_Transaction_GetCustomerReference(t); if (!s) s="NOTPROVIDED"; GWEN_XMLNode_SetCharValue(nnn, "EndToEndId", s); } tv=AB_Transaction_GetValue(t); if (tv==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No value in transaction"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Amt"); if (nnn) { GWEN_XMLNODE *nnnn; GWEN_XMLNode_AddChild(nn, nnn); nnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "InstdAmt"); if (nnnn) { GWEN_BUFFER *tbuf; GWEN_XMLNODE *nnnnn; GWEN_XMLNode_AddChild(nnn, nnnn); tbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Value_toHumanReadableString2(tv, tbuf, 2, 0); s=AB_Value_GetCurrency(tv); if (!s) s="EUR"; GWEN_XMLNode_SetProperty(nnnn, "Ccy", s); nnnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeData, GWEN_Buffer_GetStart(tbuf)); GWEN_XMLNode_AddChild(nnnn, nnnnn); GWEN_Buffer_free(tbuf); } } /* create "CdtrAgt" */ s=AB_Transaction_GetRemoteBic(t); if (s && *s) GWEN_XMLNode_SetCharValueByPath(nn, GWEN_XML_PATH_FLAGS_OVERWRITE_VALUES, "CdtrAgt/FinInstnId/BIC", s); else if (doctype[1]<3) { /* BIC not required since 001.003.03 */ DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote BIC"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } /* create "Cdtr" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Cdtr"); if (nnn) { const GWEN_STRINGLIST *sl; s=NULL; GWEN_XMLNode_AddChild(nn, nnn); sl=AB_Transaction_GetRemoteName(t); if (sl) s=GWEN_StringList_FirstString(sl); if (!s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote name"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } GWEN_XMLNode_SetCharValue(nnn, "Nm", s); } /* create "CdtrAcct" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "CdtrAcct"); if (nnn) { GWEN_XMLNODE *nnnn; GWEN_XMLNode_AddChild(nn, nnn); s=AB_Transaction_GetRemoteIban(t); if (!s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote IBAN"); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } nnnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Id"); if (nnnn) { GWEN_XMLNode_AddChild(nnn, nnnn); GWEN_XMLNode_SetCharValue(nnnn, "IBAN", s); } } /* create "RmtInf" */ nnn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "RmtInf"); if (nnn) { const GWEN_STRINGLIST *sl; GWEN_BUFFER *tbuf; GWEN_XMLNode_AddChild(nn, nnn); tbuf=GWEN_Buffer_new(0, 140, 0, 1); sl=AB_Transaction_GetPurpose(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_Buffer_GetUsedBytes(tbuf)) GWEN_Buffer_AppendByte(tbuf, ' '); GWEN_Buffer_AppendString(tbuf, s); se=GWEN_StringListEntry_Next(se); } if (GWEN_Buffer_GetUsedBytes(tbuf)>140) GWEN_Buffer_Crop(tbuf, 0, 140); } if (GWEN_Buffer_GetUsedBytes(tbuf)<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing purpose in transaction"); GWEN_Buffer_free(tbuf); AB_Transaction_List2Iterator_free(it); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } GWEN_XMLNode_SetCharValue(nnn, "Ustrd", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } t=AB_Transaction_List2Iterator_Next(it); } /* while t */ AB_Transaction_List2Iterator_free(it); pmtinf=AH_ImExporter_Sepa_PmtInf_List_Next(pmtinf); } /* while pmtinf */ AH_ImExporter_Sepa_PmtInf_List_free(pl); return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/sepa/sepa.c0000644000175000017500000003170412635603450020124 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "sepa_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AH_IMEXPORTER_SEPA_PMTINF, AH_ImExporter_Sepa_PmtInf) GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_SEPA); static AH_IMEXPORTER_SEPA_PMTINF* AH_ImExporter_Sepa_PmtInf_new() { AH_IMEXPORTER_SEPA_PMTINF *pmtinf; GWEN_NEW_OBJECT(AH_IMEXPORTER_SEPA_PMTINF, pmtinf) GWEN_LIST_INIT(AH_IMEXPORTER_SEPA_PMTINF, pmtinf) pmtinf->value=AB_Value_new(); pmtinf->transactions=AB_Transaction_List2_new(); return pmtinf; } static void AH_ImExporter_Sepa_PmtInf_free(AH_IMEXPORTER_SEPA_PMTINF *pmtinf) { if (pmtinf) { free(pmtinf->ctrlsum); AB_Value_free(pmtinf->value); AB_Transaction_List2_free(pmtinf->transactions); GWEN_LIST_FINI(AH_IMEXPORTER_SEPA_PMTINF, pmtinf) GWEN_FREE_OBJECT(pmtinf) } } GWEN_PLUGIN *imexporter_sepa_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterSEPA_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterSEPA_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_SEPA *ieh; ie=AB_ImExporter_new(ab, "sepa"); GWEN_NEW_OBJECT(AH_IMEXPORTER_SEPA, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SEPA, ie, ieh, AH_ImExporterSEPA_FreeData); AB_ImExporter_SetImportFn(ie, AH_ImExporterSEPA_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterSEPA_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterSEPA_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterSEPA_FreeData(void *bp, void *p){ AH_IMEXPORTER_SEPA *ieh; ieh=(AH_IMEXPORTER_SEPA*)p; GWEN_FREE_OBJECT(ieh); } int AH_ImExporterSEPA_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_SEPA *ieh; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SEPA, ie); assert(ieh); return GWEN_ERROR_NOT_SUPPORTED; } static int AH_ImExporterSEPA_Export_Pain_Setup(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *painNode, uint32_t doctype[], AH_IMEXPORTER_SEPA_PMTINF_LIST **pList) { GWEN_XMLNODE *n; AB_IMEXPORTER_ACCOUNTINFO *ai; AB_TRANSACTION *t; AH_IMEXPORTER_SEPA_PMTINF_LIST *pl; AH_IMEXPORTER_SEPA_PMTINF *pmtinf; int tcount=0; AB_VALUE *v; GWEN_BUFFER *tbuf; char *ctrlsum; ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); if (ai==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No account info"); return GWEN_ERROR_NO_DATA; } else if (AB_ImExporterContext_GetNextAccountInfo(ctx)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Account info for more than one local account"); return GWEN_ERROR_NOT_SUPPORTED; } t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); if (!t) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No transactions in ImExporter context"); return GWEN_ERROR_NO_DATA; } /* collect matching transactions for storage in a shared PmtInf block */ pl=AH_ImExporter_Sepa_PmtInf_List_new(); pmtinf=AH_ImExporter_Sepa_PmtInf_new(); AH_ImExporter_Sepa_PmtInf_List_Add(pmtinf, pl); while(t) { const GWEN_TIME *ti; int day, month, year; uint32_t transDate; const char *name=NULL, *iban=NULL, *bic=NULL, *cdtrSchmeId=NULL; AB_TRANSACTION_SEQUENCETYPE sequenceType=AB_Transaction_SequenceTypeUnknown; const char *s; const AB_VALUE *tv; tcount++; ti=AB_Transaction_GetDate(t); if (ti) { GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year); transDate=(year<<16)+(month<<8)+(day); } else transDate=0; s=AB_ImExporterAccountInfo_GetOwner(ai); if (!s || !*s) { name=AB_Transaction_GetLocalName(t); if (!name || !*name) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing local name in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } } s=AB_ImExporterAccountInfo_GetIban(ai); if (!s || !*s) { iban=AB_Transaction_GetLocalIban(t); if (!iban || !*iban) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing local IBAN in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } } s=AB_ImExporterAccountInfo_GetBic(ai); if (!s || !*s) { bic=AB_Transaction_GetLocalBic(t); if (!bic || !*bic) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing local BIC in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } } if (doctype[0]==8) { sequenceType=AB_Transaction_GetSequenceType(t); if (sequenceType==AB_Transaction_SequenceTypeUnknown) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing sequence type in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } cdtrSchmeId=AB_Transaction_GetCreditorSchemeId(t); if (!cdtrSchmeId || !*cdtrSchmeId) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing creditor scheme id in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } } if (pmtinf->tcount) { /* specify list of match criteria in one place */ #define TRANSACTION_DOES_NOT_MATCH \ (transDate!=pmtinf->transDate || \ (name && strcmp(name, pmtinf->localName)) || \ (iban && strcmp(iban, pmtinf->localIban)) || \ (bic && strcmp(bic, pmtinf->localBic)) || \ (doctype[0]==8 && \ (sequenceType!=pmtinf->sequenceType || \ (cdtrSchmeId && strcmp(cdtrSchmeId, pmtinf->creditorSchemeId))))) /* match against current PmtInf block */ if (TRANSACTION_DOES_NOT_MATCH) { /* search for a fitting PmtInf block */ pmtinf=AH_ImExporter_Sepa_PmtInf_List_First(pl); while(pmtinf && TRANSACTION_DOES_NOT_MATCH) pmtinf=AH_ImExporter_Sepa_PmtInf_List_Next(pmtinf); #undef TRANSACTION_DOES_NOT_MATCH if (!pmtinf) { pmtinf=AH_ImExporter_Sepa_PmtInf_new(t); AH_ImExporter_Sepa_PmtInf_List_Add(pmtinf, pl); } } } if (!pmtinf->tcount) { /* initialise match data for this PmtInf block */ pmtinf->localName = name ? name : AB_ImExporterAccountInfo_GetOwner(ai); pmtinf->localIban = iban ? iban : AB_ImExporterAccountInfo_GetIban(ai); pmtinf->localBic = bic ? bic : AB_ImExporterAccountInfo_GetBic(ai); pmtinf->date=ti; /* transaction date (AB_Transaction_GetDate()) */ pmtinf->transDate=transDate; /* transaction date short representation ((year<<16)+(month<<8)+(day)) */ if (doctype[0]==8) { pmtinf->sequenceType=sequenceType; pmtinf->creditorSchemeId=cdtrSchmeId; } } AB_Transaction_List2_PushBack(pmtinf->transactions, t); pmtinf->tcount++; tv=AB_Transaction_GetValue(t); if (tv==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing value in transaction %d", tcount); AH_ImExporter_Sepa_PmtInf_List_free(pl); return GWEN_ERROR_BAD_DATA; } AB_Value_AddValue(pmtinf->value, tv); t=AB_ImExporterAccountInfo_GetNextTransaction(ai); } /* construct CtrlSum for PmtInf blocks and GrpHdr */ v=AB_Value_new(); tbuf=GWEN_Buffer_new(0, 64, 0, 1); pmtinf=AH_ImExporter_Sepa_PmtInf_List_First(pl); while(pmtinf) { AB_Value_toHumanReadableString2(pmtinf->value, tbuf, 2, 0); pmtinf->ctrlsum=strdup(GWEN_Buffer_GetStart(tbuf)); assert(pmtinf->ctrlsum); GWEN_Buffer_Reset(tbuf); AB_Value_AddValue(v, pmtinf->value); pmtinf=AH_ImExporter_Sepa_PmtInf_List_Next(pmtinf); } AB_Value_toHumanReadableString2(v, tbuf, 2, 0); ctrlsum=strdup(GWEN_Buffer_GetStart(tbuf)); assert(ctrlsum); GWEN_Buffer_free(tbuf); AB_Value_free(v); /* create GrpHdr */ n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "GrpHdr"); if (n) { GWEN_TIME *ti; uint32_t uid; char numbuf[32]; GWEN_XMLNODE *nn; GWEN_XMLNode_AddChild(painNode, n); ti=GWEN_CurrentTime(); tbuf=GWEN_Buffer_new(0, 64, 0, 1); /* generate MsgId */ uid=AB_Banking_GetUniqueId(AB_ImExporter_GetBanking(ie)); GWEN_Time_toUtcString(ti, "YYYYMMDD-hh:mm:ss-", tbuf); snprintf(numbuf, sizeof(numbuf)-1, "%08x", uid); GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_XMLNode_SetCharValue(n, "MsgId", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_Reset(tbuf); /* generate CreDtTm */ GWEN_Time_toUtcString(ti, "YYYY-MM-DDThh:mm:ssZ", tbuf); GWEN_XMLNode_SetCharValue(n, "CreDtTm", GWEN_Buffer_GetStart(tbuf)); GWEN_Time_free(ti); GWEN_Buffer_free(tbuf); /* store NbOfTxs */ GWEN_XMLNode_SetIntValue(n, "NbOfTxs", tcount); /* store CtrlSum */ GWEN_XMLNode_SetCharValue(n, "CtrlSum", ctrlsum); /* special treatment for pain.001.001.02 and pain.008.001.01 */ if (doctype[1]==1 && ((doctype[0]==1 && doctype[2]==2) || (doctype[0]==8 && doctype[2]==1))) GWEN_XMLNode_SetCharValue(n, "Grpg", "GRPD"); nn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "InitgPty"); if (nn) { GWEN_XMLNode_AddChild(n, nn); pmtinf=AH_ImExporter_Sepa_PmtInf_List_First(pl); GWEN_XMLNode_SetCharValue(nn, "Nm", pmtinf->localName); } } free(ctrlsum); *pList=pl; return 0; } int AH_ImExporterSEPA_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_SEPA *ieh; GWEN_XMLNODE *root; GWEN_XMLNODE *documentNode; GWEN_XMLNODE *topNode; GWEN_XMLNODE *n; uint32_t doctype[]={0, 0, 0}; const char *s; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SEPA, ie); assert(ieh); s=GWEN_DB_GetCharValue(params, "type", 0, 0); if (s) { int i, j; const char *p; char *tail; /* Parse strings of the form xxx.yyy.zz */ p=tail=(char*)s; for (i=0; i<3 && *tail; i++) { j=strtol(p, &tail, 10); if (!isspace(*p) && ((*tail=='.' && tail-p==3) || (*tail=='\0' && tail-p==2)) && j>0) doctype[i]=j; else break; p=tail+1; } if (i<3) /* Parsing the "type" option failed, record it for later reference */ doctype[0]=0; } root=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "?xml"); if (n) { GWEN_XMLNode_AddHeader(root, n); GWEN_XMLNode_SetProperty(n, "version", "1.0"); GWEN_XMLNode_SetProperty(n, "encoding", "UTF-8"); } documentNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "Document"); s=GWEN_DB_GetCharValue(params, "xmlns", 0, 0); if (!s || !*s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "xmlns not specified in profile \"%s\"", GWEN_DB_GetCharValue(params, "name", 0, 0)); GWEN_XMLNode_free(root); return GWEN_ERROR_INVALID; } GWEN_XMLNode_SetProperty(documentNode, "xmlns", s); GWEN_XMLNode_AddChild(root, documentNode); switch(doctype[0]) { case 1: if (doctype[1]>1 || doctype[2]>2) s="CstmrCdtTrfInitn"; else s=strstr(s, "pain"); topNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, s); GWEN_XMLNode_AddChild(documentNode, topNode); rv=AH_ImExporterSEPA_Export_Pain_001(ie, ctx, topNode, doctype, params); break; case 8: if (!(doctype[1]==1 && doctype[2]==1)) s="CstmrDrctDbtInitn"; else s=strstr(s, "pain"); topNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, s); GWEN_XMLNode_AddChild(documentNode, topNode); rv=AH_ImExporterSEPA_Export_Pain_008(ie, ctx, topNode, doctype, params); break; default: DBG_ERROR(AQBANKING_LOGDOMAIN, "Unknown SEPA type \"%s\"", GWEN_DB_GetCharValue(params, "type", 0, 0)); GWEN_XMLNode_free(root); return GWEN_ERROR_INVALID; } if (rv==0) { GWEN_XML_CONTEXT *xmlctx; xmlctx=GWEN_XmlCtxStore_new(root, GWEN_XML_FLAGS_INDENT | GWEN_XML_FLAGS_SIMPLE | GWEN_XML_FLAGS_HANDLE_HEADERS); rv=GWEN_XMLNode_WriteToStream(root, xmlctx, sio); if (rv) DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_XmlCtx_free(xmlctx); GWEN_XMLNode_free(root); } /* TODO */ return rv; } int AH_ImExporterSEPA_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_SEPA *ieh; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SEPA, ie); assert(ieh); #if 0 return AB_ERROR_INDIFFERENT; #else /* TODO */ return GWEN_ERROR_NOT_IMPLEMENTED; #endif } #include "sepa_pain_001.c" #include "sepa_pain_008.c" aqbanking-5.6.4beta/src/plugins/imexporters/sepa/README0000644000175000017500000000000012364015477017676 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/swift/0000755000175000017500000000000012643540654017314 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/swift/swift_p.h0000644000175000017500000000264012364015477021062 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_SWIFT_P_H #define AQHBCI_IMEX_SWIFT_P_H #include #include typedef struct AH_IMEXPORTER_SWIFT AH_IMEXPORTER_SWIFT; struct AH_IMEXPORTER_SWIFT { GWEN_DBIO *dbio; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_swift_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterSWIFT_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterSWIFT_FreeData(void *bp, void *p); static int AH_ImExporterSWIFT_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterSWIFT_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AH_ImExporterSWIFT__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams); #endif /* AQHBCI_IMEX_SWIFT_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/0000755000175000017500000000000012643540654021137 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/amro942.conf.in0000644000175000017500000000060012364015477023524 00000000000000 char name="AMRO-MT942" char shortDescr="SWIFT MT942 Format used by AMRO Bank (NL)" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports SWIFT MT942 documents in the format used by the AMRO Bank" int import="1" int export="0" char type="swift" char groupNames="transaction", "transfer", "debitnote" params { char type="mt942" int skipDocLines="3" } aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/swiftmt940.conf.in0000644000175000017500000000145612364015477024273 00000000000000 char name="SWIFT-MT940" char shortDescr="Generic SWIFT MT940 Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports SWIFT MT940 documents" int import="1" int export="0" char type="swift" char groupNames="transaction", "transfer", "debitnote" params { # currently supported: 940 and 942 char type="mt940" # the following can be used to define the SWIFT reports # to be used (the value must match the content of tag :20:, # wildcards and jokers allowed) # rejectTag20 takes precedence over acceptTag20 #char acceptTag20="STARTDISP" # define content of tag :20: whose reports are to be ignored char rejectTag20="STARTDISP" # number of lines per file to skip int skipFileLines=0 # number of lines per document to skip int skipDocLines=0 } aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/Makefile.in0000644000175000017500000005152412643540063023125 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/swift/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/swiftmt940.conf.in $(srcdir)/swiftmt942.conf.in \ $(srcdir)/amro940.conf.in $(srcdir)/amro942.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = swiftmt940.conf swiftmt942.conf amro940.conf \ amro942.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = swiftmt940.conf.in swiftmt942.conf.in amro942.conf.in amro940.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/swift/profiles profiles_DATA = swiftmt940.conf swiftmt942.conf amro942.conf amro940.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/swift/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/swift/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): swiftmt940.conf: $(top_builddir)/config.status $(srcdir)/swiftmt940.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ swiftmt942.conf: $(top_builddir)/config.status $(srcdir)/swiftmt942.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ amro940.conf: $(top_builddir)/config.status $(srcdir)/amro940.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ amro942.conf: $(top_builddir)/config.status $(srcdir)/amro942.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/swiftmt942.conf.in0000644000175000017500000000046712364015477024276 00000000000000 char name="SWIFT-MT942" char shortDescr="Generic SWIFT MT942 Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports SWIFT MT942 documents" int import="1" int export="0" char type="swift" char groupNames="transaction", "transfer", "debitnote" params { char type="mt942" } aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/amro940.conf.in0000644000175000017500000000060012364015477023522 00000000000000 char name="AMRO-MT940" char shortDescr="SWIFT MT940 Format used by AMRO Bank (NL)" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports SWIFT MT940 documents in the format used by the AMRO Bank" int import="1" int export="0" char type="swift" char groupNames="transaction", "transfer", "debitnote" params { char type="mt940" int skipDocLines="3" } aqbanking-5.6.4beta/src/plugins/imexporters/swift/profiles/Makefile.am0000644000175000017500000000033512364015477023114 00000000000000 EXTRA_DIST=swiftmt940.conf.in swiftmt942.conf.in amro942.conf.in amro940.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/swift/profiles profiles_DATA=swiftmt940.conf swiftmt942.conf amro942.conf amro940.conf aqbanking-5.6.4beta/src/plugins/imexporters/swift/Makefile.in0000644000175000017500000010013512643540063021273 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/swift DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/swift.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = swift.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = swift_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_swift_la_OBJECTS = swift.lo swift_la_OBJECTS = $(am_swift_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = swift_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(swift_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(swift_la_SOURCES) DIST_SOURCES = $(swift_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) EXTRA_DIST = README noinst_HEADERS = swift_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = swift.la imexporterplugin_DATA = swift.xml swift_la_SOURCES = swift.c swift_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) swift_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/swift/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/swift/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): swift.xml: $(top_builddir)/config.status $(srcdir)/swift.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } swift.la: $(swift_la_OBJECTS) $(swift_la_DEPENDENCIES) $(EXTRA_swift_la_DEPENDENCIES) $(AM_V_CCLD)$(swift_la_LINK) -rpath $(imexporterplugindir) $(swift_la_OBJECTS) $(swift_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swift.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(swift_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/swift/swift.xml.in0000644000175000017500000000046312364015477021522 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Im-/exporter for SWIFT This plugin imports SWIFT MT940 and MT942 data. aqbanking-5.6.4beta/src/plugins/imexporters/swift/Makefile.am0000644000175000017500000000120212364015477021263 00000000000000SUBDIRS=profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) EXTRA_DIST=README noinst_HEADERS=swift_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=swift.la imexporterplugin_DATA=swift.xml swift_la_SOURCES=swift.c swift_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) swift_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(swift_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/swift/swift.c0000644000175000017500000001673012364015477020543 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "swift_p.h" #include "i18n_l.h" #include #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_SWIFT); GWEN_PLUGIN *imexporter_swift_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterSWIFT_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterSWIFT_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_SWIFT *ieh; ie=AB_ImExporter_new(ab, "swift"); GWEN_NEW_OBJECT(AH_IMEXPORTER_SWIFT, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SWIFT, ie, ieh, AH_ImExporterSWIFT_FreeData); ieh->dbio=GWEN_DBIO_GetPlugin("swift"); if (!ieh->dbio) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN DBIO plugin \"SWIFT\" not available"); AB_ImExporter_free(ie); return 0; } AB_ImExporter_SetImportFn(ie, AH_ImExporterSWIFT_Import); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterSWIFT_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterSWIFT_FreeData(void *bp, void *p){ AH_IMEXPORTER_SWIFT *ieh; ieh=(AH_IMEXPORTER_SWIFT*)p; GWEN_DBIO_free(ieh->dbio); GWEN_FREE_OBJECT(ieh); } int AH_ImExporterSWIFT_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_SWIFT *ieh; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SWIFT, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("transactions"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Reading file...")); rv=GWEN_DBIO_Import(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error importing data")); GWEN_DB_Group_free(dbData); return GWEN_ERROR_BAD_DATA; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, "Data imported, transforming to transactions"); rv=AH_ImExporterSWIFT__ImportFromGroup(ctx, dbData, params); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterSWIFT__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams) { GWEN_DB_NODE *dbT; uint32_t progressId; progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Importing parsed data..."), NULL, GWEN_DB_Groups_Count(db), 0); dbT=GWEN_DB_GetFirstGroup(db); while(dbT) { int matches; int i; const char *p; const char *gn; // check whether the name of the current groups matches matches=0; gn=GWEN_DB_GroupName(dbT); for (i=0; ; i++) { p=GWEN_DB_GetCharValue(dbParams, "groupNames", i, 0); if (!p) break; if (strcasecmp(gn, p)==0) { matches=1; break; } } // for if (!matches && i==0) { // no names given, check default if ((strcasecmp(GWEN_DB_GroupName(dbT), "transaction")==0) || (strcasecmp(GWEN_DB_GroupName(dbT), "debitnote")==0)) matches=1; } if (matches) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in config file"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error in config file")); return GWEN_ERROR_GENERIC; } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding transaction"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Debug, I18N("Adding transaction")); AB_ImExporterContext_AddTransaction(ctx, t); } else if (strcasecmp(GWEN_DB_GroupName(dbT), "startSaldo")==0) { /* ignore start saldo, but since the existence of this group shows * that we in fact are within a swift DB group we don't need recursions. */ } else if (strcasecmp(GWEN_DB_GroupName(dbT), "endSaldo")==0) { GWEN_DB_NODE *dbX; GWEN_TIME *ti=0; const char *bankCode; const char *accountNumber; bankCode=GWEN_DB_GetCharValue(dbT, "localBankCode", 0, 0); accountNumber=GWEN_DB_GetCharValue(dbT, "localAccountNumber", 0, 0); dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); if (dbX) ti=GWEN_Time_fromDb(dbX); dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbX) { AB_VALUE *v; v=AB_Value_fromDb(dbX); if (v) { AB_BALANCE *bal; AB_IMEXPORTER_ACCOUNTINFO *iea; AB_ACCOUNT_STATUS *as; bal=AB_Balance_new(v, ti); AB_Value_free(v); as=AB_AccountStatus_new(); if (ti) AB_AccountStatus_SetTime(as, ti); AB_AccountStatus_SetNotedBalance(as, bal); AB_Balance_free(bal); iea=AB_ImExporterContext_GetAccountInfo(ctx, bankCode, accountNumber); AB_ImExporterAccountInfo_AddAccountStatus(iea, as); } } GWEN_Time_free(ti); } else { int rv; // not a transaction, check subgroups rv=AH_ImExporterSWIFT__ImportFromGroup(ctx, dbT, dbParams); if (rv) { GWEN_Gui_ProgressEnd(progressId); return rv; } } if (GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_ONE)== GWEN_ERROR_USER_ABORTED) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Aborted by user")); GWEN_Gui_ProgressEnd(progressId); return GWEN_ERROR_USER_ABORTED; } dbT=GWEN_DB_GetNextGroup(dbT); } // while GWEN_Gui_ProgressEnd(progressId); return 0; } int AH_ImExporterSWIFT_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_SWIFT *ieh; GWEN_DBIO_CHECKFILE_RESULT rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_SWIFT, ie); assert(ieh); assert(ieh->dbio); rv=GWEN_DBIO_CheckFile(ieh->dbio, fname); switch(rv) { case GWEN_DBIO_CheckFileResultOk: return 0; case GWEN_DBIO_CheckFileResultNotOk: return GWEN_ERROR_BAD_DATA; case GWEN_DBIO_CheckFileResultUnknown: return AB_ERROR_INDIFFERENT; default: return GWEN_ERROR_GENERIC; } /* switch */ } aqbanking-5.6.4beta/src/plugins/imexporters/swift/README0000644000175000017500000000000012364015477020102 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/0000755000175000017500000000000012643540654017266 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/xmldb.xml.in0000644000175000017500000000042212364015477021441 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) XML DB This plugin imports XML data. aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/profiles/0000755000175000017500000000000012643540654021111 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/profiles/Makefile.in0000644000175000017500000005032512643540063023075 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/xmldb/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/xmldb/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/xmldb/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/xmldb/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/profiles/default.conf.in0000644000175000017500000000035512364015477023734 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports XML files" int import="1" int export="1" params { char rootElement="ImExporterContext" } # params aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/profiles/Makefile.am0000644000175000017500000000017212364015477023065 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/xmldb/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/Makefile.in0000644000175000017500000010013412643540063021244 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/xmldb DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/xmldb.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = xmldb.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = xmldb_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_xmldb_la_OBJECTS = xmldb.lo xmldb_la_OBJECTS = $(am_xmldb_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = xmldb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(xmldb_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(xmldb_la_SOURCES) DIST_SOURCES = $(xmldb_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) EXTRA_DIST = README noinst_HEADERS = xmldb_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = xmldb.la imexporterplugin_DATA = xmldb.xml xmldb_la_SOURCES = xmldb.c xmldb_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) xmldb_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/xmldb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/xmldb/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): xmldb.xml: $(top_builddir)/config.status $(srcdir)/xmldb.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } xmldb.la: $(xmldb_la_OBJECTS) $(xmldb_la_DEPENDENCIES) $(EXTRA_xmldb_la_DEPENDENCIES) $(AM_V_CCLD)$(xmldb_la_LINK) -rpath $(imexporterplugindir) $(xmldb_la_OBJECTS) $(xmldb_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmldb.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(xmldb_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/xmldb.c0000644000175000017500000001222612364015477020463 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "xmldb_p.h" #include "i18n_l.h" #include #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_XMLDB); GWEN_PLUGIN *imexporter_xmldb_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterXMLDB_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterXMLDB_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_XMLDB *ieh; ie=AB_ImExporter_new(ab, "xmldb"); GWEN_NEW_OBJECT(AH_IMEXPORTER_XMLDB, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_XMLDB, ie, ieh, AH_ImExporterXMLDB_FreeData); ieh->dbio=GWEN_DBIO_GetPlugin("xmldb"); if (!ieh->dbio) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN DBIO plugin \"XMLDB\" not available"); AB_ImExporter_free(ie); return 0; } AB_ImExporter_SetImportFn(ie, AH_ImExporterXMLDB_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterXMLDB_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterXMLDB_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterXMLDB_FreeData(void *bp, void *p){ AH_IMEXPORTER_XMLDB *ieh; ieh=(AH_IMEXPORTER_XMLDB*)p; GWEN_DBIO_free(ieh->dbio); GWEN_FREE_OBJECT(ieh); } int AH_ImExporterXMLDB_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_XMLDB *ieh; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_XMLDB, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("transactions"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Reading file...")); rv=GWEN_DBIO_Import(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error importing data")); GWEN_DB_Group_free(dbData); return GWEN_ERROR_BAD_DATA; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Data imported, transforming to transactions"); rv=AB_ImExporterContext_ReadDb(ctx, dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterXMLDB_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_XMLDB *ieh; GWEN_DB_NODE *dbSubParams; GWEN_DB_NODE *dbData; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_XMLDB, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("GWEN_DB"); rv=AB_ImExporterContext_toDb(ctx, dbData); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error exporting data")); GWEN_DB_Group_free(dbData); return rv; } rv=GWEN_DBIO_Export(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Error exporting data")); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterXMLDB_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_XMLDB *ieh; GWEN_DBIO_CHECKFILE_RESULT rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_XMLDB, ie); assert(ieh); assert(ieh->dbio); rv=GWEN_DBIO_CheckFile(ieh->dbio, fname); switch(rv) { case GWEN_DBIO_CheckFileResultOk: return 0; case GWEN_DBIO_CheckFileResultNotOk: return GWEN_ERROR_BAD_DATA; case GWEN_DBIO_CheckFileResultUnknown: return AB_ERROR_INDIFFERENT; default: return GWEN_ERROR_GENERIC; } /* switch */ } aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/Makefile.am0000644000175000017500000000117712364015477021250 00000000000000SUBDIRS=profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) EXTRA_DIST=README noinst_HEADERS=xmldb_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=xmldb.la imexporterplugin_DATA=xmldb.xml xmldb_la_SOURCES=xmldb.c xmldb_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) xmldb_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(xmldb_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/xmldb_p.h0000644000175000017500000000267712364015477021020 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_XMLDB_P_H #define AQHBCI_IMEX_XMLDB_P_H #include #include typedef struct AH_IMEXPORTER_XMLDB AH_IMEXPORTER_XMLDB; struct AH_IMEXPORTER_XMLDB { GWEN_DBIO *dbio; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_xmldb_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterXMLDB_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterXMLDB_FreeData(void *bp, void *p); static int AH_ImExporterXMLDB_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterXMLDB_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterXMLDB_CheckFile(AB_IMEXPORTER *ie, const char *fname); #endif /* AQHBCI_IMEX_XMLDB_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/xmldb/README0000644000175000017500000000000012364015477020054 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/Makefile.in0000644000175000017500000006014012643540061020136 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = $(aqbanking_plugins_imexporters_dirs) DIST_SUBDIRS = qif dtaus ofx swift csv openhbci1 eri2 yellownet xmldb sepa ctxfile q43 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: # 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: aqbanking-5.6.4beta/src/plugins/imexporters/Makefile.am0000644000175000017500000000033412364015477020134 00000000000000SUBDIRS=$(aqbanking_plugins_imexporters_dirs) DIST_SUBDIRS=qif dtaus ofx swift csv openhbci1 eri2 yellownet xmldb sepa ctxfile q43 sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/0000755000175000017500000000000012643540654020030 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/openhbci1_p.h0000644000175000017500000000340312364015477022310 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_OHBCI1_P_H #define AQHBCI_IMEX_OHBCI1_P_H #include #include typedef struct AH_IMEXPORTER_OPENHBCI1 AH_IMEXPORTER_OPENHBCI1; struct AH_IMEXPORTER_OPENHBCI1 { GWEN_DBIO *dbio; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_openhbci1_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterOpenHBCI1_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterOpenHBCI1_FreeData(void *bp, void *p); static int AH_ImExporterOpenHBCI1_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterOpenHBCI1_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterOpenHBCI1_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AH_ImExporterOpenHBCI1__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams); #endif /* AQHBCI_IMEX_OHBCI1_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/profiles/0000755000175000017500000000000012643540654021653 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/profiles/Makefile.in0000644000175000017500000005034512643540062023640 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/openhbci1/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/openhbci1/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/openhbci1/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/openhbci1/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/profiles/default.conf.in0000644000175000017500000000047312364015477024477 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the old OpenHBCI format" int import="1" int export="1" char groupNames="transaction", "transfer", "debitnote", "line" char dateFormat="YYYYMMDD" int utc="0" params { } # params aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/profiles/Makefile.am0000644000175000017500000000017612364015477023633 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/openhbci1/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/Makefile.in0000644000175000017500000010033712643540062022012 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/openhbci1 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/openhbci1.xml.in $(top_srcdir)/depcomp \ $(noinst_HEADERS) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = openhbci1.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = openhbci1_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_openhbci1_la_OBJECTS = openhbci1.lo openhbci1_la_OBJECTS = $(am_openhbci1_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = openhbci1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(openhbci1_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(openhbci1_la_SOURCES) DIST_SOURCES = $(openhbci1_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST = README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = openhbci1.la imexporterplugin_DATA = openhbci1.xml noinst_HEADERS = openhbci1_p.h openhbci1_la_SOURCES = openhbci1.c openhbci1_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) openhbci1_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/openhbci1/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/openhbci1/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): openhbci1.xml: $(top_builddir)/config.status $(srcdir)/openhbci1.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } openhbci1.la: $(openhbci1_la_OBJECTS) $(openhbci1_la_DEPENDENCIES) $(EXTRA_openhbci1_la_DEPENDENCIES) $(AM_V_CCLD)$(openhbci1_la_LINK) -rpath $(imexporterplugindir) $(openhbci1_la_OBJECTS) $(openhbci1_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openhbci1.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(openhbci1_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/openhbci1.c0000644000175000017500000002641512364015477021774 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "openhbci1_p.h" #include "i18n_l.h" #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_OPENHBCI1); GWEN_PLUGIN *imexporter_openhbci1_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterOpenHBCI1_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterOpenHBCI1_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_OPENHBCI1 *ieh; ie=AB_ImExporter_new(ab, "openhbci1"); GWEN_NEW_OBJECT(AH_IMEXPORTER_OPENHBCI1, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OPENHBCI1, ie, ieh, AH_ImExporterOpenHBCI1_FreeData); ieh->dbio=GWEN_DBIO_GetPlugin("olddb"); if (!ieh->dbio) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN DBIO plugin \"OldDb\" not available"); AB_ImExporter_free(ie); return 0; } AB_ImExporter_SetImportFn(ie, AH_ImExporterOpenHBCI1_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterOpenHBCI1_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterOpenHBCI1_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterOpenHBCI1_FreeData(void *bp, void *p){ AH_IMEXPORTER_OPENHBCI1 *ieh; ieh=(AH_IMEXPORTER_OPENHBCI1*)p; GWEN_DBIO_free(ieh->dbio); GWEN_FREE_OBJECT(ieh); } int AH_ImExporterOpenHBCI1_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_OPENHBCI1 *ieh; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OPENHBCI1, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("transactions"); rv=GWEN_DBIO_Import(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, I18N("Data imported, transforming to UTF-8")); rv=AB_ImExporter_DbFromIso8859_1ToUtf8(dbData); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error converting data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Transforming data to transactions"); rv=AH_ImExporterOpenHBCI1__ImportFromGroup(ctx, dbData, params); if (rv) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterOpenHBCI1__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams) { GWEN_DB_NODE *dbBanks; const char *dateFormat; int inUtc; dateFormat=GWEN_DB_GetCharValue(dbParams, "dateFormat", 0, "YYYYMMDD"); inUtc=GWEN_DB_GetIntValue(dbParams, "utc", 0, 0); dbBanks=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bank"); if (dbBanks) { GWEN_DB_NODE *dbBank; dbBank=GWEN_DB_GetFirstGroup(dbBanks); if (!dbBank) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No bank groups"); } while(dbBank) { GWEN_DB_NODE *dbAccounts; dbAccounts=GWEN_DB_GetGroup(dbBank, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "account"); if (dbAccounts) { GWEN_DB_NODE *dbAccount; dbAccount=GWEN_DB_GetFirstGroup(dbAccounts); if (!dbAccount) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No account groups"); } while(dbAccount) { GWEN_DB_NODE *dbT; const char *bankId; const char *accountId; bankId=GWEN_DB_GetCharValue(dbAccount, "params/institute", 0, 0); accountId=GWEN_DB_GetCharValue(dbAccount, "params/accountNumber", 0, 0); dbT=GWEN_DB_FindFirstGroup(dbAccount, "transaction"); if (!dbT) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No transaction groups"); } while(dbT) { AB_TRANSACTION *t; const char *p; int i; t=AB_Transaction_new(); AB_Transaction_SetLocalBankCode(t, bankId); AB_Transaction_SetLocalAccountNumber(t, accountId); p=GWEN_DB_GetCharValue(dbT, "otherInstitute", 0, 0); AB_Transaction_SetRemoteBankCode(t, p); p=GWEN_DB_GetCharValue(dbT, "otherId", 0, 0); AB_Transaction_SetRemoteAccountNumber(t, p); p=GWEN_DB_GetCharValue(dbT, "primanota", 0, 0); AB_Transaction_SetPrimanota(t, p); p=GWEN_DB_GetCharValue(dbT, "key", 0, 0); AB_Transaction_SetTransactionKey(t, p); p=GWEN_DB_GetCharValue(dbT, "text", 0, 0); AB_Transaction_SetTransactionText(t, p); AB_Transaction_SetTextKey(t, GWEN_DB_GetIntValue(dbT, "code", 0, 53)); for (i=0; ; i++) { p=GWEN_DB_GetCharValue(dbT, "description", i, 0); if (!p) break; AB_Transaction_AddPurpose(t, p, 0); } for (i=0; ; i++) { p=GWEN_DB_GetCharValue(dbT, "otherName", i, 0); if (!p) break; AB_Transaction_AddRemoteName(t, p, 0); } p=GWEN_DB_GetCharValue(dbT, "customerReference", 0, 0); AB_Transaction_SetCustomerReference(t, p); p=GWEN_DB_GetCharValue(dbT, "bankReference", 0, 0); AB_Transaction_SetBankReference(t, p); p=GWEN_DB_GetCharValue(dbT, "value", 0, 0); if (p) { AB_VALUE *val; val=AB_Value_fromString(p); if (!val) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value"); } else { if (AB_Value_GetCurrency(val)==0) AB_Value_SetCurrency(val, "DEM"); AB_Transaction_SetValue(t, val); } } /* translate date */ p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) { GWEN_TIME *ti; ti=AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } /* translate valutaDate */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) { GWEN_TIME *ti; ti=AB_ImExporter_DateFromString(p, dateFormat, inUtc); if (ti) AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); } DBG_NOTICE(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_ImExporterContext_AddTransaction(ctx, t); dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } /* while dbT */ dbAccount=GWEN_DB_GetNextGroup(dbAccount); } /* while dbAccount */ } /* if dbAccounts */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No account group"); } dbBank=GWEN_DB_GetNextGroup(dbBank); } /* while dbBank */ } /* if dbBanks */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No bank group"); } return 0; } int AH_ImExporterOpenHBCI1_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_OPENHBCI1 *ieh; GWEN_DBIO_CHECKFILE_RESULT rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OPENHBCI1, ie); assert(ieh); assert(ieh->dbio); rv=GWEN_DBIO_CheckFile(ieh->dbio, fname); switch(rv) { case GWEN_DBIO_CheckFileResultOk: return AB_ERROR_INDIFFERENT; case GWEN_DBIO_CheckFileResultNotOk: return GWEN_ERROR_BAD_DATA; case GWEN_DBIO_CheckFileResultUnknown: return AB_ERROR_INDIFFERENT; default: return GWEN_ERROR_GENERIC; } /* switch */ } int AH_ImExporterOpenHBCI1_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_OPENHBCI1 *ieh; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; const char *dateFormat; int inUtc; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_OPENHBCI1, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dateFormat=GWEN_DB_GetCharValue(params, "dateFormat", 0, "YYYY/MM/DD"); inUtc=GWEN_DB_GetIntValue(params, "utc", 0, 0); /* create db, store transactions in it */ dbData=GWEN_DB_Group_new("transactions"); ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(ai) { const AB_TRANSACTION *t; t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); while(t) { GWEN_DB_NODE *dbTransaction; const GWEN_TIME *ti; dbTransaction=GWEN_DB_Group_new("transaction"); rv=AB_Transaction_toDb(t, dbTransaction); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not transform transaction to db"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error transforming data to db"); GWEN_DB_Group_free(dbData); GWEN_DB_Group_free(dbTransaction); return GWEN_ERROR_GENERIC; } /* transform dates */ GWEN_DB_DeleteGroup(dbTransaction, "date"); GWEN_DB_DeleteGroup(dbTransaction, "valutaDate"); ti=AB_Transaction_GetDate(t); if (ti) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (inUtc) rv=GWEN_Time_toUtcString(ti, dateFormat, tbuf); else rv=GWEN_Time_toString(ti, dateFormat, tbuf); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad date format string/date"); } else GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, "date", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } ti=AB_Transaction_GetValutaDate(t); if (ti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 32, 0, 1); if (inUtc) rv=GWEN_Time_toUtcString(ti, dateFormat, tbuf); else rv=GWEN_Time_toString(ti, dateFormat, tbuf); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad date format string/date"); } else GWEN_DB_SetCharValue(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_VARS, "valutaDate", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* add transaction db */ GWEN_DB_AddGroup(dbData, dbTransaction); t=AB_ImExporterAccountInfo_GetNextTransaction(ai); } ai=AB_ImExporterContext_GetNextAccountInfo(ctx); } rv=GWEN_DBIO_Export(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error exporting data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error exporting data"); GWEN_DB_Group_free(dbData); return GWEN_ERROR_GENERIC; } GWEN_DB_Group_free(dbData); return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/Makefile.am0000644000175000017500000000123612364015477022006 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) EXTRA_DIST=README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=openhbci1.la imexporterplugin_DATA=openhbci1.xml noinst_HEADERS=openhbci1_p.h openhbci1_la_SOURCES=openhbci1.c openhbci1_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) openhbci1_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(openhbci1_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/openhbci1.xml.in0000644000175000017500000000052112364015477022745 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Old AqMoney1/OpenHBCI1 data This plugin imports/exports old data from AqMoney1 and OpenHBCI1. aqbanking-5.6.4beta/src/plugins/imexporters/openhbci1/README0000644000175000017500000000000012364015477020616 00000000000000aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/0000755000175000017500000000000012643540654020202 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/yellownet.xml.in0000644000175000017500000000045412364015477023276 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) YellowNet XML Data This plugin imports YellowNet XML files. aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/profiles/0000755000175000017500000000000012643540654022025 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/profiles/Makefile.in0000644000175000017500000005034512643540064024014 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/yellownet/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/yellownet/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/yellownet/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/yellownet/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/profiles/default.conf.in0000644000175000017500000000033112364015477024642 00000000000000 char name="default" char shortDescr="default profile" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the old YellowNet XML format" int import="1" int export="0" params { } # params aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/profiles/Makefile.am0000644000175000017500000000017612364015477024005 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/yellownet/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/Makefile.in0000644000175000017500000010032112643540064022157 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/yellownet DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/yellownet.xml.in $(top_srcdir)/depcomp \ $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = yellownet.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = yellownet_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_yellownet_la_OBJECTS = yellownet.lo yellownet_la_OBJECTS = $(am_yellownet_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = yellownet_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(yellownet_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(yellownet_la_SOURCES) DIST_SOURCES = $(yellownet_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) #EXTRA_DIST= noinst_HEADERS = yellownet_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = yellownet.la imexporterplugin_DATA = yellownet.xml yellownet_la_SOURCES = yellownet.c yellownet_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) yellownet_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/yellownet/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/yellownet/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): yellownet.xml: $(top_builddir)/config.status $(srcdir)/yellownet.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } yellownet.la: $(yellownet_la_OBJECTS) $(yellownet_la_DEPENDENCIES) $(EXTRA_yellownet_la_DEPENDENCIES) $(AM_V_CCLD)$(yellownet_la_LINK) -rpath $(imexporterplugindir) $(yellownet_la_OBJECTS) $(yellownet_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yellownet.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(yellownet_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/yellownet.c0000644000175000017500000003022112364015477022306 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: openhbci1.c 566 2005-08-23 06:25:03Z aquamaniac $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "yellownet_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AB_IMEXPORTER_YELLOWNET); GWEN_PLUGIN *imexporter_yellownet_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterYellowNet_Factory); return pl; } AB_IMEXPORTER *AB_Plugin_ImExporterYellowNet_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AB_IMEXPORTER_YELLOWNET *ieh; ie=AB_ImExporter_new(ab, "yellownet"); GWEN_NEW_OBJECT(AB_IMEXPORTER_YELLOWNET, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AB_IMEXPORTER_YELLOWNET, ie, ieh, AB_ImExporterYN_FreeData); AB_ImExporter_SetImportFn(ie, AB_ImExporterYN_Import); AB_ImExporter_SetCheckFileFn(ie, AB_ImExporterYN_CheckFile); return ie; } void GWENHYWFAR_CB AB_ImExporterYN_FreeData(void *bp, void *p){ AB_IMEXPORTER_YELLOWNET *ieh; ieh=(AB_IMEXPORTER_YELLOWNET*)p; GWEN_FREE_OBJECT(ieh); } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterYN__ReadAccountInfo(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *doc) { GWEN_XMLNODE *n; AB_IMEXPORTER_ACCOUNTINFO *ai; ai=AB_ImExporterAccountInfo_new(); n=GWEN_XMLNode_FindFirstTag(doc, "SG2", 0, 0); if (n) n=GWEN_XMLNode_FindFirstTag(n, "FII", 0, 0); if (n) { GWEN_XMLNODE *nn; const char *s; nn=GWEN_XMLNode_FindFirstTag(n, "C078", 0, 0); if (nn) { GWEN_XMLNODE *nnn; /* account number */ s=GWEN_XMLNode_GetCharValue(nn, "D_3194", 0); if (s) AB_ImExporterAccountInfo_SetAccountNumber(ai, s); /* IBAN */ s=GWEN_XMLNode_GetCharValue(nn, "D_3192", 0); if (s) AB_ImExporterAccountInfo_SetIban(ai, s); /* currency */ nnn=GWEN_XMLNode_FindFirstTag(nn, "D_6345", 0, 0); if (nnn) { s=GWEN_XMLNode_GetProperty(nnn, "value", 0); if (s) AB_ImExporterAccountInfo_SetCurrency(ai, s); } } /* account number */ s=GWEN_XMLNode_GetCharValue(n, "PF:D_5388", 0); if (s) AB_ImExporterAccountInfo_SetAccountName(ai, s); } /* owner name */ n=GWEN_XMLNode_GetNodeByXPath(doc, "SG3[1]/NAD", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (n) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_FindFirstTag(n, "D_3035", 0, 0); if (nn) { const char *s; s=GWEN_XMLNode_GetProperty(nn, "Value", 0); if (s && strcasecmp(s, "HQ")==0) { nn=GWEN_XMLNode_FindFirstTag(n, "C058", 0, 0); if (nn) { s=GWEN_XMLNode_GetCharValue(nn, "D_3124", 0); if (s && *s) { GWEN_BUFFER *xbuf; xbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_ImExporter_Iso8859_1ToUtf8(s, strlen(s), xbuf); AB_ImExporterAccountInfo_SetOwner(ai, GWEN_Buffer_GetStart(xbuf)); GWEN_Buffer_free(xbuf); } } } } } return ai; } AB_VALUE *AB_ImExporterYN__ReadValue(AB_IMEXPORTER *ie, GWEN_XMLNODE *node, int value) { GWEN_XMLNODE *n; AB_VALUE *val=0; n=GWEN_XMLNode_FindFirstTag(node, "C516", 0, 0); if (n) { GWEN_XMLNODE *nn; int v=0; nn=GWEN_XMLNode_FindFirstTag(n, "D_5025", 0, 0); if (nn) v=atoi(GWEN_XMLNode_GetProperty(nn, "Value", "0")); if (value==0 || v==value) { const char *sValue; const char *sSign; sValue=GWEN_XMLNode_GetCharValue(n, "D_5004", 0); sSign=GWEN_XMLNode_GetCharValue(node, "PF:D_5003", 0); if (sValue) { val=AB_Value_fromString(sValue); if (val && sSign && strcmp(sSign, "-")==0) AB_Value_Negate(val); } } } return val; } GWEN_TIME *AB_ImExporterYN__ReadTime(AB_IMEXPORTER *ie, GWEN_XMLNODE *node, int value) { GWEN_XMLNODE *n; GWEN_TIME *ti=0; n=GWEN_XMLNode_GetNodeByXPath(node, "C507", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (n) { GWEN_XMLNODE *nn; int v=0; nn=GWEN_XMLNode_FindFirstTag(n, "D_2005", 0, 0); if (nn) v=atoi(GWEN_XMLNode_GetProperty(nn, "Value", "0")); if (value==0 || v==value) { const char *s; s=GWEN_XMLNode_GetCharValue(n, "D_2380", 0); if (s) ti=AB_ImExporter_DateFromString(s, "YYYYMMDD", 0); } } return ti; } AB_TRANSACTION *AB_ImExporterYN__ReadLNE_LNS(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *node) { GWEN_XMLNODE *n; n=GWEN_XMLNode_FindFirstTag(node, "SG6", 0, 0); if (n) { AB_TRANSACTION *t; GWEN_XMLNODE *nn; GWEN_TIME *ti=0; AB_VALUE *val=0; t=AB_Transaction_new(); /* get date */ nn=GWEN_XMLNode_FindFirstTag(n, "DTM", 0, 0); if (nn) ti=AB_ImExporterYN__ReadTime(ie, nn, 209); AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); ti=0; /* read amount */ nn=GWEN_XMLNode_FindFirstTag(n, "MOA", 0, 0); if (nn) { /* Gutschrift */ val=AB_ImExporterYN__ReadValue(ie, nn, 210); if (val) { if (AB_Value_IsZero(val)) { AB_Value_free(val); val=NULL; } } if (val==NULL) { val=AB_ImExporterYN__ReadValue(ie, nn, 211); if (val) AB_Value_Negate(val); } } if (val==NULL) val=AB_Value_new(); AB_Value_SetCurrency(val, AB_ImExporterAccountInfo_GetCurrency(ai)); AB_Transaction_SetValue(t, val); AB_Value_free(val); val=0; /* read purpose */ nn=GWEN_XMLNode_GetNodeByXPath(n, "FTX/C108", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nn) { GWEN_XMLNODE *nnn; nnn=GWEN_XMLNode_FindFirstTag(nn, "D_4440", 0, 0); while(nnn) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nnn); if (nData) { const char *s; s=GWEN_XMLNode_GetData(nData); if (s) { GWEN_BUFFER *xbuf; xbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_ImExporter_Iso8859_1ToUtf8(s, strlen(s), xbuf); AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(xbuf), 0); GWEN_Buffer_free(xbuf); } } nnn=GWEN_XMLNode_FindNextTag(nnn, "D_4440", 0, 0); } } return t; } return 0; } int AB_ImExporterYN__ReadTransactions(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *doc) { GWEN_XMLNODE *n; n=GWEN_XMLNode_FindFirstTag(doc, "SG4", 0, 0); while(n) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_GetNodeByXPath(n, "LIN/PF:D_0805", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nn) { const char *s; s=GWEN_XMLNode_GetProperty(nn, "Value", 0); if (s && (strcasecmp(s, "LNE")==0 || strcasecmp(s, "LNS")==0) ) { AB_TRANSACTION *t; t=AB_ImExporterYN__ReadLNE_LNS(ie, ai, n); if (t) { const char *s; s=AB_ImExporterAccountInfo_GetAccountNumber(ai); AB_Transaction_SetLocalAccountNumber(t, s); s=AB_ImExporterAccountInfo_GetIban(ai); AB_Transaction_SetLocalIban(t, s); AB_ImExporterAccountInfo_AddTransaction(ai, t); } } } n=GWEN_XMLNode_FindNextTag(n, "SG4", 0, 0); } return 0; } int AB_ImExporterYN__ReadAccountStatus(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *doc) { GWEN_XMLNODE *n; n=GWEN_XMLNode_FindFirstTag(doc, "SG4", 0, 0); while(n) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_GetNodeByXPath(n, "LIN/PF:D_0805", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nn) { const char *s; s=GWEN_XMLNode_GetProperty(nn, "Value", 0); if (s && strcasecmp(s, "LEN")==0) { GWEN_XMLNODE *nnn; GWEN_TIME *ti=0; AB_VALUE *val=0; /* read time */ nnn=GWEN_XMLNode_GetNodeByXPath(n, "SG5/DTM", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nnn) ti=AB_ImExporterYN__ReadTime(ie, nnn, 202); /* read value */ nnn=GWEN_XMLNode_GetNodeByXPath(n, "SG5/MOA", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nnn) val=AB_ImExporterYN__ReadValue(ie, nnn, 343); if (val) { AB_ACCOUNT_STATUS *ast; AB_BALANCE *bal; AB_Value_SetCurrency(val, AB_ImExporterAccountInfo_GetCurrency(ai)); ast=AB_AccountStatus_new(); bal=AB_Balance_new(val, ti); AB_AccountStatus_SetBookedBalance(ast, bal); AB_Balance_free(bal); AB_ImExporterAccountInfo_AddAccountStatus(ai, ast); } AB_Value_free(val); GWEN_Time_free(ti); } } n=GWEN_XMLNode_FindNextTag(n, "SG4", 0, 0); } return 0; } int AB_ImExporterYN_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AB_IMEXPORTER_YELLOWNET *ieh; //GWEN_DB_NODE *dbSubParams; GWEN_XMLNODE *doc; GWEN_XMLNODE *node; int rv; GWEN_XML_CONTEXT *ctxml; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AB_IMEXPORTER_YELLOWNET, ie); assert(ieh); // dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, // "params"); doc=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); ctxml=GWEN_XmlCtxStore_new(doc, GWEN_XML_FLAGS_HANDLE_HEADERS); rv=GWEN_XMLContext_ReadFromIo(ctxml, sio); GWEN_XmlCtx_free(ctxml); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not parse XML stream (%d)", rv); GWEN_XMLNode_free(doc); return GWEN_ERROR_BAD_DATA; } node=GWEN_XMLNode_FindFirstTag(doc, "IC", 0, 0); if (node==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Document does not contain element \"IC\""); GWEN_XMLNode_Dump(doc, 2); GWEN_XMLNode_free(doc); return GWEN_ERROR_BAD_DATA; } node=GWEN_XMLNode_FindFirstTag(node, "KONAUS", 0, 0); while(node) { AB_IMEXPORTER_ACCOUNTINFO *ai; ai=AB_ImExporterYN__ReadAccountInfo(ie, ctx, node); assert(ai); rv=AB_ImExporterYN__ReadAccountStatus(ie, ai, node); if (rv==0) rv=AB_ImExporterYN__ReadTransactions(ie, ai, node); if (rv) { AB_ImExporterAccountInfo_free(ai); GWEN_XMLNode_free(doc); return rv; } AB_ImExporterContext_AddAccountInfo(ctx, ai); node=GWEN_XMLNode_FindNextTag(node, "KONAUS", 0, 0); } GWEN_XMLNode_free(doc); return 0; } int AB_ImExporterYN_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AB_IMEXPORTER_YELLOWNET *ieh; GWEN_SYNCIO *sio; int rv; uint8_t tbuf[256]; assert(ie); assert(fname); assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AB_IMEXPORTER_YELLOWNET, ie); assert(ieh); sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } rv=GWEN_SyncIo_Read(sio, tbuf, sizeof(tbuf)-1); if (rv<1) { DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" is not supported by this plugin", fname); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } tbuf[rv-1]=0; if (-1!=GWEN_Text_ComparePattern((const char*)tbuf, "**", 0)) { /* match */ DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" is supported by this plugin", fname); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return GWEN_ERROR_BAD_DATA; } aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/Makefile.am0000644000175000017500000000123112364015477022153 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) -I$(top_srcdir)/src/libs/aqbanking $(all_includes) #EXTRA_DIST= noinst_HEADERS=yellownet_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=yellownet.la imexporterplugin_DATA=yellownet.xml yellownet_la_SOURCES=yellownet.c yellownet_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) yellownet_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(yellownet_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/yellownet/yellownet_p.h0000644000175000017500000000457712364015477022651 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_YN_P_H #define AQHBCI_IMEX_YN_P_H #include #include typedef struct AB_IMEXPORTER_YELLOWNET AB_IMEXPORTER_YELLOWNET; struct AB_IMEXPORTER_YELLOWNET { int dummy; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_yellownet_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterYellowNet_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AB_ImExporterYN_FreeData(void *bp, void *p); static int AB_ImExporterYN_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AB_ImExporterYN_CheckFile(AB_IMEXPORTER *ie, const char *fname); static AB_VALUE *AB_ImExporterYN__ReadValue(AB_IMEXPORTER *ie, GWEN_XMLNODE *node, int value); static GWEN_TIME *AB_ImExporterYN__ReadTime(AB_IMEXPORTER *ie, GWEN_XMLNODE *node, int value); static AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterYN__ReadAccountInfo(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_XMLNODE *doc); static AB_TRANSACTION *AB_ImExporterYN__ReadLNE_LNS(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *node); static int AB_ImExporterYN__ReadTransactions(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *doc); static int AB_ImExporterYN__ReadAccountStatus(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *doc); #endif /* AQHBCI_IMEX_YN_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/qif/0000755000175000017500000000000012643540652016735 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/qif/qif_p.h0000644000175000017500000000346612364015477020137 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_QIF_P_H #define AQHBCI_IMEX_QIF_P_H #include #include #include #include #include #include typedef struct AH_IMEXPORTER_QIF AH_IMEXPORTER_QIF; struct AH_IMEXPORTER_QIF { GWEN_DB_NODE *dbData; AB_IMEXPORTER_ACCOUNTINFO *currentAccount; }; AB_IMEXPORTER* qif_factory(AB_BANKING *ab, GWEN_DB_NODE *db); void GWENHYWFAR_CB AH_ImExporterQIF_FreeData(void *bp, void *p); int AH_ImExporterQIF_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFEREDIO *bio, GWEN_DB_NODE *params); int AH_ImExporterQIF_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFEREDIO *bio, GWEN_DB_NODE *params); int AH_ImExporterQIF_CheckFile(AB_IMEXPORTER *ie, const char *fname); int AH_ImExporterQIF__ImportAccount(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFEREDIO *bio, GWEN_BUFFER *buf, GWEN_DB_NODE *params); #endif /* AQHBCI_IMEX_QIF_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/qif/qif.xml.in0000644000175000017500000000046712364015477020574 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) QIF This plugin imports QIF data. (Export currently unimplemented.) aqbanking-5.6.4beta/src/plugins/imexporters/qif/profiles/0000755000175000017500000000000012643540652020560 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/qif/profiles/Makefile.in0000644000175000017500000005031512643540063022545 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/qif/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/qif/profiles profiles_DATA = default.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/qif/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/qif/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/qif/profiles/default.conf.in0000644000175000017500000000033512364015477023403 00000000000000 char name="default" char shortDescr="Quicken Interchange Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the QIF format used by Quicken" int import="1" int export="1" params { } aqbanking-5.6.4beta/src/plugins/imexporters/qif/profiles/Makefile.am0000644000175000017500000000017012364015477022534 00000000000000 EXTRA_DIST=default.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/qif/profiles profiles_DATA=default.conf aqbanking-5.6.4beta/src/plugins/imexporters/qif/Makefile.in0000644000175000017500000010003212643540063020712 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/qif DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/qif.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = qif.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = qif_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_qif_la_OBJECTS = qif.lo qif_la_OBJECTS = $(am_qif_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = qif_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(qif_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(qif_la_SOURCES) DIST_SOURCES = $(qif_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) #EXTRA_DIST=README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = qif.la imexporterplugin_DATA = qif.xml noinst_HEADERS = \ qif_p.h qif_la_SOURCES = \ qif.c qif_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) qif_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/qif/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/qif/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): qif.xml: $(top_builddir)/config.status $(srcdir)/qif.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } qif.la: $(qif_la_OBJECTS) $(qif_la_DEPENDENCIES) $(EXTRA_qif_la_DEPENDENCIES) $(AM_V_CCLD)$(qif_la_LINK) -rpath $(imexporterplugindir) $(qif_la_OBJECTS) $(qif_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qif.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(qif_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/qif/Makefile.am0000644000175000017500000000117012364015477020712 00000000000000SUBDIRS=profiles INCLUDES = -I$(top_srcdir)/src/libs/aqbanking -I$(aqbanking_symlinkdir) $(all_includes) #EXTRA_DIST=README imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=qif.la imexporterplugin_DATA=qif.xml noinst_HEADERS=\ qif_p.h qif_la_SOURCES=\ qif.c qif_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) qif_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(qif_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/qif/qif.c0000644000175000017500000005227112364015477017611 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "qif_p.h" #include "i18n_l.h" #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_QIF); AB_IMEXPORTER *qif_factory(AB_BANKING *ab, GWEN_DB_NODE *db){ AB_IMEXPORTER *ie; AH_IMEXPORTER_QIF *ieh; ie=AB_ImExporter_new(ab, "qif"); GWEN_NEW_OBJECT(AH_IMEXPORTER_QIF, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie, ieh, AH_ImExporterQIF_FreeData); ieh->dbData=db; AB_ImExporter_SetImportFn(ie, AH_ImExporterQIF_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterQIF_Export); /* AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterQIF_CheckFile); -- not yet implemented?! */ return ie; } void GWENHYWFAR_CB AH_ImExporterQIF_FreeData(void *bp, void *p){ } int AH_ImExporterQIF__GetDate(AB_IMEXPORTER *ie, GWEN_DB_NODE *params, const char *paramName, const char *paramDescr, const char *paramContent, GWEN_TIME **pti) { const char *dateFormat; char dfbuf[32]; int rv; GWEN_TIME *ti=0; AH_IMEXPORTER_QIF *ieqif; int first=1; assert(ie); ieqif=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie); assert(ieqif); dateFormat=GWEN_DB_GetCharValue(params, paramName, 0, 0); if (!dateFormat) dateFormat=GWEN_DB_GetCharValue(ieqif->dbData, paramName, 0, 0); if (!dateFormat) dateFormat=GWEN_DB_GetCharValue(params, "dateFormat", 0, 0); while(!ti) { if (!dateFormat) { GWEN_BUFFER *tbuf; const char *t1a=I18N_NOOP("Please enter the date format for the " "following item:\n"); const char *t1h=I18N_NOOP("" "Please enter the date format for the " "following item:
"); const char *t2a=I18N_NOOP ("The following characters can be used:\n" "- \'Y\': digit of the year\n" "- \'M\': digit of the month\n" "- \'D\': digit of the day\n" "\n" "Examples:\n" " \"YYYY/MM/DD\" (-> 2005/02/25)\n" " \"DD.MM.YYYY\" (-> 25.02.2005)\n" " \"MM/DD/YY\" (-> 02/25/05)\n"); const char *t2h=I18N_NOOP ("The following characters can be used:" "" " \n" " \n" " \n" "
Ydigit of the year
Mdigit of the month
Ddigit of the day
\n" "
" "Examples:" "" " \n" " \n" " \n" ""); tbuf=GWEN_Buffer_new(0, 256, 0, 1); /* ASCII version */ GWEN_Buffer_AppendString(tbuf, I18N(t1a)); GWEN_Buffer_AppendString(tbuf, paramDescr); GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, paramContent); GWEN_Buffer_AppendString(tbuf, " )\n"); GWEN_Buffer_AppendString(tbuf, I18N(t2a)); /* HTML version */ GWEN_Buffer_AppendString(tbuf, I18N(t1h)); GWEN_Buffer_AppendString(tbuf, paramDescr); GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, paramContent); GWEN_Buffer_AppendString(tbuf, " )\n"); GWEN_Buffer_AppendString(tbuf, I18N(t2h)); rv=GWEN_Gui_InputBox(0, first?I18N("Enter Date Format"): I18N("Enter Correct Date Format"), GWEN_Buffer_GetStart(tbuf), dfbuf, 4, sizeof(dfbuf)-1, 0); GWEN_Buffer_free(tbuf); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return rv; } dateFormat=dfbuf; ti=GWEN_Time_fromString(paramContent, dateFormat); if (ti) { /* store particular date format */ GWEN_DB_SetCharValue(ieqif->dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, paramName, dfbuf); break; } dateFormat=0; } else break; } /* for */ *pti=ti; return 0; } int AH_ImExporterQIF__GetValue(AB_IMEXPORTER *ie, GWEN_DB_NODE *params, const char *paramName, const char *paramDescr, const char *paramContent, AB_VALUE **pv) { const char *s; char komma = 0; char fixpoint = 0; AH_IMEXPORTER_QIF *ieqif; char numbuf[64]; int i; double dval; AB_VALUE *v; assert(ie); ieqif=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie); assert(ieqif); /* get komma character */ s=GWEN_DB_GetCharValue(params, "value/komma", 0, 0); if (!s) s=GWEN_DB_GetCharValue(ieqif->dbData, "value/komma", 0, 0); if (s) komma=*s; /* get fixpoint character */ s=GWEN_DB_GetCharValue(params, "value/fixpoint", 0, 0); if (!s) s=GWEN_DB_GetCharValue(ieqif->dbData, "value/fixpoint", 0, 0); if (s) fixpoint=*s; if (!fixpoint) { const char *lastKommaPos = NULL; char lastKommaChar=0; int komma1Count=0; int komma2Count=0; int kommaTypeCount=0; fixpoint=0; komma=0; /* nothing known about fixpoint, elaborate */ s=paramContent; while(*s) { if (*s=='.' || *s==',') { if (*s==',') komma1Count++; else komma2Count++; lastKommaChar=*s; lastKommaChar=*s; kommaTypeCount++; lastKommaPos=s; } s++; } /* while */ if ( ( (komma1Count+komma2Count)==1 ) && lastKommaPos) { int i=0; /* only one komma, check for digits behind it */ s=lastKommaPos; s++; while(*s && isdigit(*s)) { s++; i++; } if (i<3) { /* most likely got the fixpoint */ fixpoint=lastKommaChar; } } else if ((komma1Count==1 && komma2Count>0) || (komma2Count==1 && komma1Count>0)) { if (komma1Count==1) { fixpoint=','; komma='.'; } else { fixpoint='.'; komma=','; } } else { GWEN_BUFFER *tbuf; int rv; const char *t1a= I18N_NOOP("The following value could not be parsed: \n"); const char *t2a= I18N_NOOP("There are now two possibilities of what character\n" "represents the decimal fixpoint:\n" " 1) \'.\' (as in \"123.45\")\n" " 2) \',\' (as in \"123,45\")\n" "What is the fixpoint in the value above?"); const char *t1h= I18N_NOOP("The following value could not be parsed:
"); const char *t2h= I18N_NOOP("
" "There are now two possibilities of what character " "represents the decimal fixpoint: " "
    " "
  1. \'.\' (as in \"123.45\")
  2. \n" "
  3. \',\' (as in \"123,45\")
  4. \n" "
" "What is the fixpoint in the value above?" ""); /* this is weird, ask the user */ tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, t1a); GWEN_Buffer_AppendString(tbuf, paramContent); GWEN_Buffer_AppendString(tbuf, t2a); GWEN_Buffer_AppendString(tbuf, t1h); GWEN_Buffer_AppendString(tbuf, paramContent); GWEN_Buffer_AppendString(tbuf, t2h); rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Value Parsing"), I18N(GWEN_Buffer_GetStart(tbuf)), I18N("Possibility 1"), I18N("Possibility 2"), 0, 0); GWEN_Buffer_free(tbuf); if (rv==1) { fixpoint='.'; komma=','; } else if (rv==2) { fixpoint=','; komma='.'; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return rv; } } } /* if !fixpoint */ /* now we know what the fixpoint is, store it */ numbuf[0]=komma; numbuf[1]=0; GWEN_DB_SetCharValue(ieqif->dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "value/komma", numbuf); numbuf[0]=fixpoint; GWEN_DB_SetCharValue(ieqif->dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "value/fixpoint", numbuf); i=0; s=paramContent; while(*s && i<(int)sizeof(numbuf)) { if (*s==fixpoint) numbuf[i++]=','; else if (*s=='-' || *s=='+' || *s==isdigit(*s)) numbuf[i++]=*s; else if (*s!=komma) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad character in value string"); return GWEN_ERROR_BAD_DATA; } } if (i>=(int)sizeof(numbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Value string too long"); return GWEN_ERROR_BAD_DATA; } numbuf[i]=0; if (GWEN_Text_StringToDouble(numbuf, &dval)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Value string does not contain a floating point value."); return GWEN_ERROR_BAD_DATA; } v=AB_Value_fromDouble(dval); *pv=v; return 0; } int AH_ImExporterQIF__ImportAccount(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *iec, GWEN_BUFFEREDIO *bio, GWEN_BUFFER *buf, GWEN_DB_NODE *params){ AH_IMEXPORTER_QIF *ieqif; GWEN_DB_NODE *dbData; AB_IMEXPORTER_ACCOUNTINFO *iea = 0; int done=0; const char *s; GWEN_TIME *ti=0; AB_VALUE *vCreditLine=0; AB_VALUE *vBalance=0; assert(ie); ieqif=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie); assert(ieqif); dbData=GWEN_DB_Group_new("data"); while (!done) { const char *p; if (!GWEN_Buffer_GetUsedBytes(buf)) { int err; if (GWEN_BufferedIO_CheckEOF(bio)) { done=1; continue; } err=GWEN_BufferedIO_ReadLine2Buffer(bio, buf); if (err) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); GWEN_DB_Group_free(dbData); return err; } } p=GWEN_Buffer_GetStart(buf); while(isspace(*p)) p++; switch(toupper(*p)) { case 'N': /* account name */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", p+1); break; case 'T': /* account type */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", p+1); break; case 'D': /* description */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "descr", p+1); break; case 'L': /* credit line (credit card accounts only */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "creditLine", p+1); break; case '/': /* date of statement balance */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "date", p+1); break; case '$': /* statement balance */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "balance", p+1); break; case '^': /* end of record */ done=1; break; default: /* unknown line, ignore */ DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown item \"%s\", ignoring", GWEN_Buffer_GetStart(buf)); } /* switch */ GWEN_Buffer_Reset(buf); } /* while not end of block reached */ /* find account info by account name */ s=GWEN_DB_GetCharValue(dbData, "name", 0, 0); if (s) { iea=AB_ImExporterContext_GetFirstAccountInfo(iec); while(iea) { if (strcasecmp(AB_ImExporterAccountInfo_GetAccountName(iea), s)==0) break; iea=AB_ImExporterContext_GetNextAccountInfo(iec); } /* while */ } if (!iea) { /* not found, add it */ iea=AB_ImExporterAccountInfo_new(); AB_ImExporterContext_AddAccountInfo(iec, iea); /* set account info */ if (s) AB_ImExporterAccountInfo_SetAccountName(iea, s); s=GWEN_DB_GetCharValue(dbData, "descr", 0, 0); if (s) AB_ImExporterAccountInfo_SetDescription(iea, s); s=GWEN_DB_GetCharValue(dbData, "type", 0, 0); if (s) { if (strcasecmp(s, "bank")==0) AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_Bank); else if (strcasecmp(s, "Invst")==0) AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_Investment); else if (strcasecmp(s, "CCard")==0) AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_CreditCard); else if (strcasecmp(s, "Cash")==0) AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_Cash); else AB_ImExporterAccountInfo_SetType(iea, AB_AccountType_Unknown); } } assert(iea); ieqif->currentAccount=iea; s=GWEN_DB_GetCharValue(dbData, "date", 0, 0); if (s) { int rv; rv=AH_ImExporterQIF__GetDate(ie, params, "account/statement/dateFormat", I18N("Account statement date"), s, &ti); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_DB_Group_free(dbData); return rv; } }/* if date */ s=GWEN_DB_GetCharValue(dbData, "creditLine", 0, 0); if (s) { int rv; rv=AH_ImExporterQIF__GetValue(ie, params, "account/statement/creditLineFormat", I18N("Account statement credit line value"), s, &vCreditLine); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_Time_free(ti); GWEN_DB_Group_free(dbData); return rv; } }/* if date */ s=GWEN_DB_GetCharValue(dbData, "balance", 0, 0); if (s) { int rv; rv=AH_ImExporterQIF__GetValue(ie, params, "account/statement/balanceFormat", I18N("Account statement balance value"), s, &vBalance); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); AB_Value_free(vCreditLine); GWEN_Time_free(ti); GWEN_DB_Group_free(dbData); return rv; } }/* if date */ if (ti && (vBalance || vCreditLine)) { AB_BALANCE *balance=0; AB_ACCOUNT_STATUS *ast=0; if (vBalance && ti) balance=AB_Balance_new(vBalance, ti); ast=AB_AccountStatus_new(); if (ti) AB_AccountStatus_SetTime(ast, ti); if (vCreditLine) AB_AccountStatus_SetBankLine(ast, vCreditLine); if (balance) AB_AccountStatus_SetBookedBalance(ast, balance); /* add account status */ AB_ImExporterAccountInfo_AddAccountStatus(iea, ast); AB_AccountStatus_free(ast); AB_Balance_free(balance); } AB_Value_free(vBalance); AB_Value_free(vCreditLine); GWEN_Time_free(ti); GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterQIF__ImportBank(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *iec, GWEN_BUFFEREDIO *bio, GWEN_BUFFER *buf, GWEN_DB_NODE *params){ AH_IMEXPORTER_QIF *ieqif; GWEN_DB_NODE *dbData; AB_IMEXPORTER_ACCOUNTINFO *iea; int done=0; const char *s; GWEN_TIME *ti=0; AB_VALUE *vAmount=0; GWEN_DB_NODE *dbCurrentSplit=0; AB_TRANSACTION *t=0; assert(ie); ieqif=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie); assert(ieqif); dbData=GWEN_DB_Group_new("data"); while (!done) { const char *p; if (!GWEN_Buffer_GetUsedBytes(buf)) { int err; if (GWEN_BufferedIO_CheckEOF(bio)) { done=1; continue; } err=GWEN_BufferedIO_ReadLine2Buffer(bio, buf); if (err) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); GWEN_DB_Group_free(dbData); return err; } } p=GWEN_Buffer_GetStart(buf); while(isspace(*p)) p++; switch(toupper(*p)) { case 'S': dbCurrentSplit=GWEN_DB_GetGroup(dbData, GWEN_PATH_FLAGS_CREATE_GROUP, "split"); assert(dbCurrentSplit); GWEN_DB_SetCharValue(dbCurrentSplit, GWEN_DB_FLAGS_OVERWRITE_VARS, "category", p+1); break; case '$': /* split amount */ assert(dbCurrentSplit); GWEN_DB_SetCharValue(dbCurrentSplit, GWEN_DB_FLAGS_OVERWRITE_VARS, "amount", p+1); break; case 'E': /* split memo */ assert(dbCurrentSplit); GWEN_DB_SetCharValue(dbCurrentSplit, GWEN_DB_FLAGS_OVERWRITE_VARS, "memo", p+1); break; case 'D': /* date */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "date", p+1); break; case 'N': /* reference */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "reference", p+1); break; case 'T': /* amount */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "amount", p+1); break; case 'P': /* payee */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_DEFAULT, "payee", p+1); break; case 'M': /* memo */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "memo", p+1); break; case 'A': /* address */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_DEFAULT, "address", p+1); break; case 'L': /* category */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "category", p+1); break; case 'C': /* cleared status */ GWEN_DB_SetCharValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "cleared", p+1); break; case '^': /* end of record */ done=1; break; default: /* unknown line, ignore */ DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown item \"%s\", ignoring", GWEN_Buffer_GetStart(buf)); } /* switch */ GWEN_Buffer_Reset(buf); } /* while not end of block reached */ iea=ieqif->currentAccount; assert(iea); s=GWEN_DB_GetCharValue(dbData, "date", 0, 0); if (s) { int rv; rv=AH_ImExporterQIF__GetDate(ie, params, "account/statement/dateFormat", I18N("Account statement date"), s, &ti); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_DB_Group_free(dbData); return rv; } }/* if date */ s=GWEN_DB_GetCharValue(dbData, "amount", 0, 0); if (s) { int rv; rv=AH_ImExporterQIF__GetValue(ie, params, "bank/statement/amountFormat", I18N("Transaction statement amount value"), s, &vAmount); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_Time_free(ti); GWEN_DB_Group_free(dbData); return rv; } }/* if date */ t=AB_Transaction_new(); if (ti) { AB_Transaction_SetValutaDate(t, ti); AB_Transaction_SetDate(t, ti); } if (vAmount) AB_Transaction_SetValue(t, vAmount); s=GWEN_DB_GetCharValue(dbData, "payee", 0, 0); if (s) AB_Transaction_AddRemoteName(t, s, 0); s=GWEN_DB_GetCharValue(dbData, "memo", 0, 0); if (s) AB_Transaction_AddPurpose(t, s, 0); DBG_INFO(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(iea, t); AB_Value_free(vAmount); GWEN_Time_free(ti); GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterQIF_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFEREDIO *bio, GWEN_DB_NODE *params){ GWEN_BUFFER *buf; char lastSectionName[256]; AH_IMEXPORTER_QIF *ieqif; assert(ie); ieqif=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_QIF, ie); assert(ieqif); buf=GWEN_Buffer_new(0, 256, 0, 1); while(!GWEN_BufferedIO_CheckEOF(bio)) { int err; const char *p; int rv; err=GWEN_BufferedIO_ReadLine2Buffer(bio, buf); if (err) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); GWEN_Buffer_free(buf); return err; } p=GWEN_Buffer_GetStart(buf); while(isspace(*p)) p++; if (*p=='!') { p++; if (strlen(p)>=(int)sizeof(lastSectionName)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Buffer too small. Internal error, should not occurr."); abort(); } strcpy(lastSectionName, p); GWEN_Buffer_Reset(buf); } if (lastSectionName[0]) { if (strcasecmp(lastSectionName, "Account")==0) rv=AH_ImExporterQIF__ImportAccount(ie, ctx, bio, buf, params); else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown section \"%s\", ignoring", GWEN_Buffer_GetStart(buf)); lastSectionName[0]=0; rv=0; /* ignore this section */ } } GWEN_Buffer_Reset(buf); } /* while */ return 0; } int AH_ImExporterQIF_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFEREDIO *bio, GWEN_DB_NODE *params){ return GWEN_ERROR_NOT_SUPPORTED; } aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/0000755000175000017500000000000012643540653017277 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/0000755000175000017500000000000012643540653021122 500000000000000aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/transfer.conf.in0000644000175000017500000000045312364015477024145 00000000000000 char name="transfer" char shortDescr="DTAUS Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the German DTAUS format for transfers" int import="1" int export="1" char type="dtaus" char groupNames="transfer", "transaction" params { char type="transfer" } aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/debitnote.conf.in0000644000175000017500000000046012364015477024274 00000000000000 char name="debitnote" char shortDescr="DTAUS Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the German DTAUS format for debit notes" int import="1" int export="1" char type="dtaus" char groupNames="debitnote", "transaction" params { char type="debitnote" } aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/Makefile.in0000644000175000017500000005117012643540062023105 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/dtaus/profiles DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/default.conf.in $(srcdir)/debitnote.conf.in \ $(srcdir)/transfer.conf.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = default.conf debitnote.conf transfer.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(profilesdir)" DATA = $(profiles_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = default.conf.in debitnote.conf.in transfer.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/dtaus/profiles profiles_DATA = default.conf debitnote.conf transfer.conf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/dtaus/profiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/dtaus/profiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): default.conf: $(top_builddir)/config.status $(srcdir)/default.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ debitnote.conf: $(top_builddir)/config.status $(srcdir)/debitnote.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ transfer.conf: $(top_builddir)/config.status $(srcdir)/transfer.conf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-profilesDATA: $(profiles_DATA) @$(NORMAL_INSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(profilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(profilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(profilesdir)" || exit $$?; \ done uninstall-profilesDATA: @$(NORMAL_UNINSTALL) @list='$(profiles_DATA)'; test -n "$(profilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(profilesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(profilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-profilesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-profilesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-profilesDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-profilesDATA # 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: aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/default.conf.in0000644000175000017500000000045112364015477023743 00000000000000 char name="default" char shortDescr="DTAUS Format" char version="@AQBANKING_VERSION_STRING@" char longDescr="This profile supports the German DTAUS format" int import="1" int export="1" char type="dtaus" char groupNames="transaction", "transfer", "debitnote" params { char type="transfer" } aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/profiles/Makefile.am0000644000175000017500000000027212364015477023100 00000000000000 EXTRA_DIST=default.conf.in debitnote.conf.in transfer.conf.in profilesdir = $(aqbanking_pkgdatadir)/imexporters/dtaus/profiles profiles_DATA=default.conf debitnote.conf transfer.conf aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/Makefile.in0000644000175000017500000010013412643540062021255 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/imexporters/dtaus DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/dtaus.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = dtaus.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(imexporterplugindir)" \ "$(DESTDIR)$(imexporterplugindir)" LTLIBRARIES = $(imexporterplugin_LTLIBRARIES) am__DEPENDENCIES_1 = dtaus_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_dtaus_la_OBJECTS = dtaus.lo dtaus_la_OBJECTS = $(am_dtaus_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dtaus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(dtaus_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dtaus_la_SOURCES) DIST_SOURCES = $(dtaus_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(imexporterplugin_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = profiles INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST = README noinst_HEADERS = dtaus_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES = dtaus.la imexporterplugin_DATA = dtaus.xml dtaus_la_SOURCES = dtaus.c dtaus_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) dtaus_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/imexporters/dtaus/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/imexporters/dtaus/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): dtaus.xml: $(top_builddir)/config.status $(srcdir)/dtaus.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-imexporterpluginLTLIBRARIES: $(imexporterplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(imexporterplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(imexporterplugindir)"; \ } uninstall-imexporterpluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_LTLIBRARIES)'; test -n "$(imexporterplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(imexporterplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(imexporterplugindir)/$$f"; \ done clean-imexporterpluginLTLIBRARIES: -test -z "$(imexporterplugin_LTLIBRARIES)" || rm -f $(imexporterplugin_LTLIBRARIES) @list='$(imexporterplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dtaus.la: $(dtaus_la_OBJECTS) $(dtaus_la_DEPENDENCIES) $(EXTRA_dtaus_la_DEPENDENCIES) $(AM_V_CCLD)$(dtaus_la_LINK) -rpath $(imexporterplugindir) $(dtaus_la_OBJECTS) $(dtaus_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtaus.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-imexporterpluginDATA: $(imexporterplugin_DATA) @$(NORMAL_INSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(imexporterplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(imexporterplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(imexporterplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(imexporterplugindir)" || exit $$?; \ done uninstall-imexporterpluginDATA: @$(NORMAL_UNINSTALL) @list='$(imexporterplugin_DATA)'; test -n "$(imexporterplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(imexporterplugindir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(imexporterplugindir)" "$(DESTDIR)$(imexporterplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-imexporterpluginLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-imexporterpluginDATA \ install-imexporterpluginLTLIBRARIES install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-imexporterpluginDATA \ uninstall-imexporterpluginLTLIBRARIES sources: for f in $(dtaus_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/dtaus.xml.in0000644000175000017500000000043612364015477021472 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) DTAUS This plugin imports and exports DTAUS data. aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/Makefile.am0000644000175000017500000000117712364015477021262 00000000000000SUBDIRS=profiles INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST=README noinst_HEADERS=dtaus_p.h imexporterplugindir = $(aqbanking_plugindir)/imexporters imexporterplugin_LTLIBRARIES=dtaus.la imexporterplugin_DATA=dtaus.xml dtaus_la_SOURCES=dtaus.c dtaus_la_LIBADD=$(aqbanking_internal_libs) $(gwenhywfar_libs) dtaus_la_LDFLAGS = -no-undefined @STRIPALL@ -module -avoid-version sources: for f in $(dtaus_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(imexporterplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/dtaus_p.h0000644000175000017500000000315612364015477021035 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCI_IMEX_DTAUS_P_H #define AQHBCI_IMEX_DTAUS_P_H #include #include typedef struct AH_IMEXPORTER_DTAUS AH_IMEXPORTER_DTAUS; struct AH_IMEXPORTER_DTAUS { GWEN_DBIO *dbio; }; AQBANKING_EXPORT GWEN_PLUGIN *imexporter_dtaus_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); static AB_IMEXPORTER *AB_Plugin_ImExporterDTAUS_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); static void GWENHYWFAR_CB AH_ImExporterDTAUS_FreeData(void *bp, void *p); static int AH_ImExporterDTAUS_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterDTAUS_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); static int AH_ImExporterDTAUS_CheckFile(AB_IMEXPORTER *ie, const char *fname); static int AH_ImExporterDTAUS__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams); #endif /* AQHBCI_IMEX_DTAUS_P_H */ aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/dtaus.c0000644000175000017500000002337112364015477020512 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dtaus_p.h" #include "i18n_l.h" #include #include #include #include #include GWEN_INHERIT(AB_IMEXPORTER, AH_IMEXPORTER_DTAUS); GWEN_PLUGIN *imexporter_dtaus_factory(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; pl=AB_Plugin_ImExporter_new(pm, name, fileName); assert(pl); AB_Plugin_ImExporter_SetFactoryFn(pl, AB_Plugin_ImExporterDTAUS_Factory); return pl; } /** @TODO: Need to prepare transactions befor exporting them... */ AB_IMEXPORTER *AB_Plugin_ImExporterDTAUS_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab){ AB_IMEXPORTER *ie; AH_IMEXPORTER_DTAUS *ieh; ie=AB_ImExporter_new(ab, "dtaus"); GWEN_NEW_OBJECT(AH_IMEXPORTER_DTAUS, ieh); GWEN_INHERIT_SETDATA(AB_IMEXPORTER, AH_IMEXPORTER_DTAUS, ie, ieh, AH_ImExporterDTAUS_FreeData); ieh->dbio=GWEN_DBIO_GetPlugin("dtaus"); if (!ieh->dbio) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN DBIO plugin \"DTAUS\" not available"); AB_ImExporter_free(ie); return 0; } AB_ImExporter_SetImportFn(ie, AH_ImExporterDTAUS_Import); AB_ImExporter_SetExportFn(ie, AH_ImExporterDTAUS_Export); AB_ImExporter_SetCheckFileFn(ie, AH_ImExporterDTAUS_CheckFile); return ie; } void GWENHYWFAR_CB AH_ImExporterDTAUS_FreeData(void *bp, void *p){ AH_IMEXPORTER_DTAUS *ieh; ieh=(AH_IMEXPORTER_DTAUS*)p; GWEN_DBIO_free(ieh->dbio); GWEN_FREE_OBJECT(ieh); } int AH_ImExporterDTAUS_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_DTAUS *ieh; GWEN_DB_NODE *dbData; GWEN_DB_NODE *dbSubParams; int rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_DTAUS, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); dbData=GWEN_DB_Group_new("transactions"); rv=GWEN_DBIO_Import(ieh->dbio, sio, dbData, dbSubParams, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error importing data (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } /* transform DB to transactions */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Notice, "Data imported, transforming to transactions"); rv=AH_ImExporterDTAUS__ImportFromGroup(ctx, dbData, params); if (rv<0) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error importing data"); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } int AH_ImExporterDTAUS__ImportFromGroup(AB_IMEXPORTER_CONTEXT *ctx, GWEN_DB_NODE *db, GWEN_DB_NODE *dbParams) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetFirstGroup(db); while(dbT) { int matches; int i; const char *p; const char *gn; /* check whether the name of the current groups matches */ matches=0; gn=GWEN_DB_GroupName(dbT); for (i=0; ; i++) { p=GWEN_DB_GetCharValue(dbParams, "groupNames", i, 0); if (!p) break; if (strcasecmp(gn, p)==0) { matches=1; break; } } /* for */ if (!matches && i==0) { /* no names given, check default */ if ((strcasecmp(GWEN_DB_GroupName(dbT), "transaction")==0) || (strcasecmp(GWEN_DB_GroupName(dbT), "debitnote")==0)) matches=1; } if (matches) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in config file"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "Error in config file"); return GWEN_ERROR_GENERIC; } if (strcasecmp(GWEN_DB_GroupName(dbT), "debitnote")==0) AB_Transaction_SetType(t, AB_Transaction_TypeDebitNote); else AB_Transaction_SetType(t, AB_Transaction_TypeTransfer); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding transaction"); AB_ImExporterContext_AddTransaction(ctx, t); } else { int rv; /* not a transaction, check subgroups */ rv=AH_ImExporterDTAUS__ImportFromGroup(ctx, dbT, dbParams); if (rv) return rv; } dbT=GWEN_DB_GetNextGroup(dbT); } /* while */ return 0; } int AH_ImExporterDTAUS_CheckFile(AB_IMEXPORTER *ie, const char *fname){ AH_IMEXPORTER_DTAUS *ieh; GWEN_DBIO_CHECKFILE_RESULT rv; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_DTAUS, ie); assert(ieh); assert(ieh->dbio); rv=GWEN_DBIO_CheckFile(ieh->dbio, fname); switch(rv) { case GWEN_DBIO_CheckFileResultOk: return 0; case GWEN_DBIO_CheckFileResultNotOk: return GWEN_ERROR_BAD_DATA; case GWEN_DBIO_CheckFileResultUnknown: return AB_ERROR_INDIFFERENT; default: return GWEN_ERROR_GENERIC; } /* switch */ } int AH_ImExporterDTAUS_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ AH_IMEXPORTER_DTAUS *ieh; GWEN_DB_NODE *dbSubParams; int rv; const char *groupName; AB_IMEXPORTER_ACCOUNTINFO *ai; assert(ie); ieh=GWEN_INHERIT_GETDATA(AB_IMEXPORTER, AH_IMEXPORTER_DTAUS, ie); assert(ieh); assert(ieh->dbio); dbSubParams=GWEN_DB_GetGroup(params, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "params"); groupName=GWEN_DB_GetCharValue(params, "groupNames", 0, "transfer"); ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(ai) { GWEN_DB_NODE *dbTransfers; const char *aiBankCode; const char *aiAccNum; const AB_TRANSACTION *t; GWEN_DB_NODE *dbCfg; const char *localBankCode=NULL; const char *localAccountNumber=NULL; const char *localName=NULL; aiBankCode=AB_ImExporterAccountInfo_GetBankCode(ai); aiAccNum=AB_ImExporterAccountInfo_GetAccountNumber(ai); localBankCode=aiBankCode; localAccountNumber=aiAccNum; /* get values for dbCfg from transactions, check for deviations */ t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); while(t) { const char *tlocalBankCode; const char *tlocalAccountNumber; const char *tlocalName; tlocalBankCode=AB_Transaction_GetLocalBankCode(t); tlocalAccountNumber=AB_Transaction_GetLocalAccountNumber(t); tlocalName=AB_Transaction_GetLocalName(t); if (tlocalBankCode && !localBankCode) localBankCode=tlocalBankCode; if (tlocalAccountNumber && !localAccountNumber) localAccountNumber=tlocalAccountNumber; if (tlocalName && !localName) localName=tlocalName; if (tlocalBankCode && localBankCode && strcasecmp(tlocalBankCode, localBankCode)!=0) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Transactions with multiple bank codes found")); DBG_ERROR(AQBANKING_LOGDOMAIN, "Transactions with multiple bank codes found"); return GWEN_ERROR_BAD_DATA; } if (tlocalAccountNumber && localAccountNumber && strcasecmp(tlocalAccountNumber, localAccountNumber)!=0) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Transactions with multiple account numbers found")); DBG_ERROR(AQBANKING_LOGDOMAIN, "Transactions with multiple account numbers found"); return GWEN_ERROR_BAD_DATA; } if (tlocalName && localName && strcasecmp(tlocalName, localName)!=0) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Transactions with multiple local names found")); DBG_ERROR(AQBANKING_LOGDOMAIN, "Transactions with multiple local names found"); return GWEN_ERROR_BAD_DATA; } t=AB_ImExporterAccountInfo_GetNextTransaction(ai); } if (!localBankCode || !localAccountNumber || !localName) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing local account/name specification"); return GWEN_ERROR_BAD_DATA; } /* now create and setup dbCfg */ if (dbSubParams) dbCfg=GWEN_DB_Group_dup(dbSubParams); else dbCfg=GWEN_DB_Group_new("config"); GWEN_DB_SetCharValue(dbCfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankCode", localBankCode); GWEN_DB_SetCharValue(dbCfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountId", localAccountNumber); GWEN_DB_SetCharValue(dbCfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", localName); /* export transactions to DB */ dbTransfers=GWEN_DB_Group_new("transfers"); t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); while(t) { GWEN_DB_NODE *dbTransfer; dbTransfer=GWEN_DB_Group_new(groupName); AB_Transaction_toDb(t, dbTransfer); GWEN_DB_AddGroup(dbTransfers, dbTransfer); t=AB_ImExporterAccountInfo_GetNextTransaction(ai); } /* export transactions to IO */ rv=GWEN_DBIO_Export(ieh->dbio, sio, dbTransfers, dbCfg, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error creating DTAUS object"); GWEN_DB_Group_free(dbTransfers); GWEN_DB_Group_free(dbCfg); return rv; } GWEN_DB_Group_free(dbTransfers); GWEN_DB_Group_free(dbCfg); ai=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while ai */ return 0; } aqbanking-5.6.4beta/src/plugins/imexporters/dtaus/README0000644000175000017500000000000012364015477020066 00000000000000aqbanking-5.6.4beta/src/plugins/Makefile.in0000644000175000017500000006010512643540056015562 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = parsers imexporters bankinfo backends all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/plugins/parsers/0000755000175000017500000000000012643540652015254 500000000000000aqbanking-5.6.4beta/src/plugins/parsers/swift/0000755000175000017500000000000012643540652016410 500000000000000aqbanking-5.6.4beta/src/plugins/parsers/swift/swift_p.h0000644000175000017500000000425312364015477020162 00000000000000/*************************************************************************** begin : Fri Apr 02 2004 copyright : (C) 2004,2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_SWIFT_P_H #define AQHBCIBANK_SWIFT_P_H #include #include #include #define AHB_SWIFT_MAXLINELEN 512 #include "swift_l.h" struct AHB_SWIFT_TAG { GWEN_LIST_ELEMENT(AHB_SWIFT_TAG); char *id; char *content; }; AHB_SWIFT_TAG *AHB_SWIFT_Tag_new(const char *id, const char *content); void AHB_SWIFT_Tag_free(AHB_SWIFT_TAG *tg); struct AHB_SWIFT_SUBTAG { GWEN_LIST_ELEMENT(AHB_SWIFT_SUBTAG); int id; char *content; }; /** * This function reads a line from a buffered IO stream. It stops when either * the line or the stream ends. The end of line is signalled by an LF * character or a series of two "@" characters (for historical reasons). */ int AHB_SWIFT_ReadLine(GWEN_FAST_BUFFER *fb, char *buffer, unsigned int s); int AHB_SWIFT__ReadDocument(GWEN_FAST_BUFFER *fb, AHB_SWIFT_TAG_LIST *tl, unsigned int maxTags); int AHB_SWIFT_ReadDocument(GWEN_FAST_BUFFER *fb, AHB_SWIFT_TAG_LIST *tl, unsigned int maxTags); int AHB_SWIFT_Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags); int AHB_SWIFT_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags); GWEN_DBIO_CHECKFILE_RESULT AHB_SWIFT_CheckFile(GWEN_DBIO *dbio, const char *fname); GWEN_DBIO *GWEN_DBIO_SWIFT_Factory(GWEN_PLUGIN *pl); GWEN_PLUGIN *dbio_swift_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName); #endif /* AQHBCIBANK_SWIFT_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/swift/swift940_l.h0000644000175000017500000000123312364015477020406 00000000000000/*************************************************************************** begin : Fri Apr 02 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_SWIFT940_L_H #define AQHBCIBANK_SWIFT940_L_H #include "swift_l.h" int AHB_SWIFT940_Import(AHB_SWIFT_TAG_LIST *tl, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags); #endif /* AQHBCIBANK_SWIFT940_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/swift/Makefile.in0000644000175000017500000006731712643540064020410 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/parsers/swift DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/swift.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = swift.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dbioplugindir)" \ "$(DESTDIR)$(dbioplugindir)" LTLIBRARIES = $(dbioplugin_LTLIBRARIES) am__DEPENDENCIES_1 = swift_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_swift_la_OBJECTS = swift.lo swift940.lo swift_la_OBJECTS = $(am_swift_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = swift_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(swift_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(swift_la_SOURCES) DIST_SOURCES = $(swift_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dbioplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = \ -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST = README noinst_HEADERS = \ swift.h \ swift_l.h \ swift_p.h \ swift940_l.h \ swift940_p.h dbioplugindir = $(aqbanking_plugindir)/dbio dbioplugin_DATA = swift.xml dbioplugin_LTLIBRARIES = swift.la swift_la_SOURCES = \ swift.c \ swift940.c swift_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) swift_la_LDFLAGS = -no-undefined $(STRIPALL) -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/parsers/swift/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/parsers/swift/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): swift.xml: $(top_builddir)/config.status $(srcdir)/swift.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-dbiopluginLTLIBRARIES: $(dbioplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(dbioplugin_LTLIBRARIES)'; test -n "$(dbioplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(dbioplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dbioplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dbioplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dbioplugindir)"; \ } uninstall-dbiopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(dbioplugin_LTLIBRARIES)'; test -n "$(dbioplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dbioplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dbioplugindir)/$$f"; \ done clean-dbiopluginLTLIBRARIES: -test -z "$(dbioplugin_LTLIBRARIES)" || rm -f $(dbioplugin_LTLIBRARIES) @list='$(dbioplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } swift.la: $(swift_la_OBJECTS) $(swift_la_DEPENDENCIES) $(EXTRA_swift_la_DEPENDENCIES) $(AM_V_CCLD)$(swift_la_LINK) -rpath $(dbioplugindir) $(swift_la_OBJECTS) $(swift_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swift.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swift940.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dbiopluginDATA: $(dbioplugin_DATA) @$(NORMAL_INSTALL) @list='$(dbioplugin_DATA)'; test -n "$(dbioplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dbioplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dbioplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbioplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dbioplugindir)" || exit $$?; \ done uninstall-dbiopluginDATA: @$(NORMAL_UNINSTALL) @list='$(dbioplugin_DATA)'; test -n "$(dbioplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dbioplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dbioplugindir)" "$(DESTDIR)$(dbioplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-dbiopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dbiopluginDATA install-dbiopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dbiopluginDATA uninstall-dbiopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-dbiopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dbiopluginDATA \ install-dbiopluginLTLIBRARIES install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dbiopluginDATA \ uninstall-dbiopluginLTLIBRARIES sources: for f in $(swift_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dbioplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/parsers/swift/swift940_p.h0000644000175000017500000000247712526065767020434 00000000000000/*************************************************************************** begin : Fri Apr 02 2004 copyright : (C) 2004-2015 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_SWIFT940_P_H #define AQHBCIBANK_SWIFT940_P_H #include "swift_l.h" #include int AHB_SWIFT940_Parse_25(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg); int AHB_SWIFT940_Parse_86(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg); int AHB_SWIFT940_Parse_61(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg); int AHB_SWIFT940_Parse_6_0_2(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg); #endif /* AQHBCIBANK_SWIFT940_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/swift/swift.xml.in0000644000175000017500000000043012364015477020612 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Importer and Exporter for SWIFT This plugin imports SWIFT (MT940) data. aqbanking-5.6.4beta/src/plugins/parsers/swift/swift940.c0000644000175000017500000010314612533111554020063 00000000000000/*************************************************************************** begin : Fri Apr 02 2004 copyright : (C) 2004-2015 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "swift940_p.h" #include "i18n_l.h" /* #include */ #include #include #include #include #include #include #include #include #include #include /* #define ENABLE_FULL_SEPA_LOG */ #define CENTURY_CUTOFF_YEAR 79 int AHB_SWIFT__SetCharValue(GWEN_DB_NODE *db, uint32_t flags, const char *name, const char *s) { GWEN_BUFFER *vbuf; int rv; vbuf=GWEN_Buffer_new(0, strlen(s)+32, 0, 1); AB_ImExporter_Iso8859_1ToUtf8(s, -1, vbuf); rv=GWEN_DB_SetCharValue(db, flags, name, GWEN_Buffer_GetStart(vbuf)); GWEN_Buffer_free(vbuf); return rv; } int AHB_SWIFT940_Parse_25(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg){ const char *p; const char *p2; p=AHB_SWIFT_Tag_GetData(tg); assert(p); while(*p && *p==32) p++; if (*p==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Tag 25 is empty"); return 0; } p2=strchr(p, '/'); if (p2) { char *s; /* "BLZ/Konto" */ s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p+1); s[p2-p]=0; AHB_SWIFT__SetCharValue(data, GWEN_DB_FLAGS_OVERWRITE_VARS, "localBankCode", s); GWEN_Memory_dealloc(s); p=p2+1; } while(*p && *p==32) p++; if (*p) { p2=p; while(*p2 && isdigit(*p2)) p2++; if (p2==p) { DBG_INFO(AQBANKING_LOGDOMAIN, "LocalAccountNumber starts with nondigits (%s)", p); AHB_SWIFT__SetCharValue(data, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccountNumber", p); } else { char *s; s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p+1); s[p2-p]=0; AHB_SWIFT__SetCharValue(data, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccountNumber", s); GWEN_Memory_dealloc(s); } } return 0; } int AHB_SWIFT940_Parse_86(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg){ const char *p; int isStructured; int code; int keepMultipleBlanks; keepMultipleBlanks=GWEN_DB_GetIntValue(cfg, "keepMultipleBlanks", 0, 1); p=AHB_SWIFT_Tag_GetData(tg); assert(p); isStructured=0; code=999; if (strlen(p)>3) { if (isdigit(p[0]) && isdigit(p[1]) && isdigit(p[2])) { /* starts with a three digit number */ code=(((p[0]-'0')*100) + ((p[1]-'0')*10) + (p[2]-'0')); if (p[3]=='?') /* it is structured, get the code */ isStructured=1; p+=3; } } if (isStructured) { AHB_SWIFT_SUBTAG_LIST *stlist; int rv; /* store code */ GWEN_DB_SetIntValue(data, flags, "transactioncode", code); stlist=AHB_SWIFT_SubTag_List_new(); rv=AHB_SWIFT_ParseSubTags(p, stlist, keepMultipleBlanks); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Handling tag :86: as unstructured (%d)", rv); isStructured=0; } else { if (code<900) { AHB_SWIFT_SUBTAG *stg; GWEN_DB_NODE *dbSepaTags=NULL; GWEN_BUFFER *bufFullPurpose; int realSepaTagCount=0; bufFullPurpose=GWEN_Buffer_new(0, 256, 0, 1); /* SEPA transaction, needs special handling */ dbSepaTags=GWEN_DB_Group_new("sepa-tags"); stg=AHB_SWIFT_SubTag_List_First(stlist); while(stg) { const char *s; int id; int intVal; id=AHB_SWIFT_SubTag_GetId(stg); s=AHB_SWIFT_SubTag_GetData(stg); switch(id) { case 0: /* Buchungstext */ AHB_SWIFT__SetCharValue(data, flags, "transactionText", s); break; case 10: /* Primanota */ AHB_SWIFT__SetCharValue(data, flags, "primanota", s); break; case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 60: case 61: case 62: case 63: /* Verwendungszweck */ /* store purpose in any case, if the transaction doesn't have SEPA tags * we can just use what we produced here */ AHB_SWIFT__SetCharValue(data, flags, "purpose", s); /* possibly handle full purpose later */ GWEN_Buffer_AppendString(bufFullPurpose, s); break; case 30: /* BLZ Gegenseite */ AHB_SWIFT__SetCharValue(data, flags, "remoteBankCode", s); break; case 31: /* Kontonummer Gegenseite */ AHB_SWIFT__SetCharValue(data, flags, "remoteAccountNumber", s); break; case 32: case 33: /* Name Auftraggeber */ AHB_SWIFT__SetCharValue(data, flags, "remoteName", s); break; case 34: /* Textschluesselergaenzung */ if (1==sscanf(s, "%d", &intVal)) { GWEN_DB_SetIntValue(data, flags, "textkeyExt", intVal); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Value [%s] is not a number (textkeyext)", s); } break; case 38: /* IBAN */ AHB_SWIFT__SetCharValue(data, flags, "remoteIban", s); break; default: /* ignore all other fields (if any) */ DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown :86: field \"%02d\" (%s) (%s)", id, s, AHB_SWIFT_Tag_GetData(tg)); break; } /* switch */ stg=AHB_SWIFT_SubTag_List_Next(stg); } /* while */ if (GWEN_Buffer_GetUsedBytes(bufFullPurpose)) { const char *s; const char *sLastTagStart; #ifdef ENABLE_FULL_SEPA_LOG DBG_ERROR(0, "FullPurposeBuffer:"); GWEN_Buffer_Dump(bufFullPurpose, 2); #endif s=GWEN_Buffer_GetStart(bufFullPurpose); sLastTagStart=s; /* sample all SEPA fields from concatenated string of purpose lines */ while(*s) { /* look for begin of next tag */ while(*s) { if ((*s && isalpha(*s)) && (s[1] && isalpha(s[1])) && (s[2] && isalpha(s[2])) && (s[3] && isalpha(s[3])) && s[4]=='+') break; /* not the beginning of a SEPA field, just skip */ s++; } /* found begin of the next SEPA field or end of buffer */ if (s > sLastTagStart) { int tagLen; /* we currently have a field, close that first */ tagLen=s-sLastTagStart; #ifdef ENABLE_FULL_SEPA_LOG DBG_ERROR(0, "Current tag:"); GWEN_Text_LogString(sLastTagStart, tagLen, 0, GWEN_LoggerLevel_Error); #endif /* check tag length (must be long enough for 'XXX+', i.e. at least 5 bytes) */ if (tagLen>5 && sLastTagStart[4]=='+') { char sIdentifier[6]; const char *sPayload; /* ok, 5 bytes or more, 4 alphas and a plus sign, should be the begin of a SEPA tag */ strncpy(sIdentifier, sLastTagStart, 5); sIdentifier[5]=0; /* remove leading blanks */ sPayload=sLastTagStart+5; tagLen-=5; while(tagLen>0 && *sPayload && isblank(*sPayload)) { sPayload++; tagLen--; } /* remove trailing blanks */ if (tagLen>0) { while(tagLen>0) { if (!isblank(sPayload[tagLen-1])) break; tagLen--; } } /* store tag, if still data left */ if (tagLen>0) { char *sCopyPayload; sCopyPayload=strndup(sPayload, tagLen); GWEN_DB_SetCharValue(dbSepaTags, GWEN_DB_FLAGS_DEFAULT, sIdentifier, sCopyPayload); free(sCopyPayload); realSepaTagCount++; } else { DBG_WARN(GWEN_LOGDOMAIN, "Ignoring empty SEPA field \"%s\"", sIdentifier); } } else { /* tag is shorter than 5 bytes or pos 4 doesn't contain a plus, treat as normal purpose */ if (tagLen>0) { char *sCopyPayload; sCopyPayload=strndup(sLastTagStart, tagLen); GWEN_DB_SetCharValue(dbSepaTags, GWEN_DB_FLAGS_DEFAULT, "_purpose", sCopyPayload); free(sCopyPayload); } } } if (*s) { /* save start of next tag */ sLastTagStart=s; /* skip XXX+ at the beginning, otherwise we would immediately stop in next loop * we know that the next 5 bytes are valid, so it is safe to skip them */ s+=5; } } /* while */ } /* if GWEN_Buffer_GetUsedBytes(bufFullPurpose) */ /* buffer no longer needed */ GWEN_Buffer_free(bufFullPurpose); /* handle SEPA tags, iterate through them and parse according to variable name */ if (realSepaTagCount>0 && GWEN_DB_Variables_Count(dbSepaTags)) { GWEN_DB_NODE *dbVar; #ifdef ENABLE_FULL_SEPA_LOG DBG_ERROR(0, "Got these SEPA tags:"); GWEN_DB_Dump(dbSepaTags, 2); #endif /* clear purpose variable, since we are about to add it back from SEPA tags */ GWEN_DB_DeleteVar(data, "purpose"); dbVar=GWEN_DB_GetFirstVar(dbSepaTags); while(dbVar) { const char *sVarName; sVarName=GWEN_DB_VariableName(dbVar); if (sVarName && *sVarName) { GWEN_BUFFER *tbuf; GWEN_DB_NODE *dbValue; /* sample all values into a buffer and concatenate */ tbuf=GWEN_Buffer_new(0, 128, 0, 1); dbValue=GWEN_DB_GetFirstValue(dbVar); while(dbValue) { const char *s; s=GWEN_DB_GetCharValueFromNode(dbValue); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); dbValue=GWEN_DB_GetNextValue(dbValue); } if (strcasecmp(sVarName, "EREF+")==0) { AHB_SWIFT__SetCharValue(data, flags, "endToEndReference", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "KREF+")==0) { AHB_SWIFT__SetCharValue(data, flags, "customerReference", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "MREF+")==0) { AHB_SWIFT__SetCharValue(data, flags, "mandateId", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "CRED+")==0) { AHB_SWIFT__SetCharValue(data, flags, "creditorSchemeId", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "DEBT+")==0) { AHB_SWIFT__SetCharValue(data, flags, "originatorIdentifier", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "SVWZ+")==0) { AHB_SWIFT__SetCharValue(data, flags, "purpose", GWEN_Buffer_GetStart(tbuf)); } else if (strcasecmp(sVarName, "ABWA+")==0) { } else if (strcasecmp(sVarName, "_purpose")==0) { /* manually added tag (i.e. data outside a tag) * TODO: only add if there was no real purpose field (i.e. no "SVWZ+") */ AHB_SWIFT__SetCharValue(data, flags, "purpose", GWEN_Buffer_GetStart(tbuf)); } GWEN_Buffer_free(tbuf); } dbVar=GWEN_DB_GetNextVar(dbVar); } } #ifdef ENABLE_FULL_SEPA_LOG DBG_ERROR(0, "SEPA Tags:"); GWEN_DB_Dump(dbSepaTags, 2); #endif GWEN_DB_Group_free(dbSepaTags); } /* if sepa */ else { AHB_SWIFT_SUBTAG *stg; /* non-sepa */ stg=AHB_SWIFT_SubTag_List_First(stlist); while(stg) { int id; const char *s; int intVal; id=AHB_SWIFT_SubTag_GetId(stg); s=AHB_SWIFT_SubTag_GetData(stg); switch(id) { case 0: /* Buchungstext */ AHB_SWIFT__SetCharValue(data, flags, "transactionText", s); break; case 10: /* Primanota */ AHB_SWIFT__SetCharValue(data, flags, "primanota", s); break; case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 60: case 61: case 62: case 63: /* Verwendungszweck */ AHB_SWIFT__SetCharValue(data, flags, "purpose", s); break; case 30: /* BLZ Gegenseite */ AHB_SWIFT__SetCharValue(data, flags, "remoteBankCode", s); break; case 31: /* Kontonummer Gegenseite */ AHB_SWIFT__SetCharValue(data, flags, "remoteAccountNumber", s); break; case 32: case 33: /* Name Auftraggeber */ AHB_SWIFT__SetCharValue(data, flags, "remoteName", s); break; case 34: /* Textschluesselergaenzung */ if (1==sscanf(s, "%d", &intVal)) { GWEN_DB_SetIntValue(data, flags, "textkeyExt", intVal); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Value [%s] is not a number (textkeyext)", s); } break; case 38: /* IBAN */ AHB_SWIFT__SetCharValue(data, flags, "remoteIban", s); break; default: /* ignore all other fields (if any) */ DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown :86: field \"%02d\" (%s) (%s)", id, s, AHB_SWIFT_Tag_GetData(tg)); break; } /* switch */ stg=AHB_SWIFT_SubTag_List_Next(stg); } /* while */ } } /* if really structured */ AHB_SWIFT_SubTag_List_free(stlist); } /* if isStructured */ else { char *pcopy=strdup(p); char *p1; /* unstructured :86:, simply store as mutliple purpose lines */ p1=pcopy; while(p1 && *p1) { char *p2; p2=strchr(p1, 10); if (p2) { *p2=0; p2++; } /* look for pattern "KTO/BLZ", if found try to extract remote account info * from unstructured purpose string */ if (-1!=GWEN_Text_ComparePattern(p1, "*KTO/BLZ */*", 0)) { char *p3; char *kto; p3=p1; while(*p3) { *p3=toupper(*p3); p3++; } kto=strstr(p1, "KTO/BLZ "); if (kto) { char *blz; kto+=8; blz=strchr(kto, '/'); if (blz) { *blz=0; blz++; } p3=blz; while(*p3 && isdigit(*p3)) p3++; *p3=0; AHB_SWIFT__SetCharValue(data, flags, "remoteBankCode", blz); AHB_SWIFT__SetCharValue(data, flags, "remoteAccountNumber", kto); } else { AHB_SWIFT__SetCharValue(data, flags, "purpose", p1); } } else AHB_SWIFT__SetCharValue(data, flags, "purpose", p1); p1=p2; } free(pcopy); } return 0; } int AHB_SWIFT940_Parse_61(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg){ const char *p; const char *p2; char *s; char buffer[32]; unsigned int bleft; int d1a, d2a, d3a; int d1b, d2b, d3b; int neg; GWEN_TIME *ti; //char curr3=0; const char *currency; p=AHB_SWIFT_Tag_GetData(tg); assert(p); bleft=strlen(p); /* valuata date (M) */ if (bleft<6) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing valuta date (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing valuta date"); return -1; } d1a=((p[0]-'0')*10) + (p[1]-'0'); if (d1a>CENTURY_CUTOFF_YEAR) d1a+=1900; else d1a+=2000; d2a=((p[2]-'0')*10) + (p[3]-'0'); d3a=((p[4]-'0')*10) + (p[5]-'0'); if (d3a==30 && d2a==2) { /* date is Feb 30, this date is invalid. However, some banks use this * to indicate the last day of February, so we move along */ d3a=1; d2a=3; ti=GWEN_Time_new(d1a, d2a-1, d3a, 12, 0, 0, 1); assert(ti); /* subtract a day to get the last day in FEB */ GWEN_Time_SubSeconds(ti, 60*60*24); } else { ti=GWEN_Time_new(d1a, d2a-1, d3a, 12, 0, 0, 1); assert(ti); } if (GWEN_Time_toDb(ti, GWEN_DB_GetGroup(data, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "valutadate"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving valuta date"); } GWEN_Time_free(ti); p+=6; bleft-=6; /* booking date (K) */ if (*p && isdigit(*p)) { if (bleft<4) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad booking date (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, "SWIFT: Bad booking date"); return -1; } d2b=((p[0]-'0')*10) + (p[1]-'0'); d3b=((p[2]-'0')*10) + (p[3]-'0'); /* use year from valutaDate. * However: if valuta date and booking date are in different years * the booking year might be too high. * We detect this case by comparing the months: If the booking month * is and the valuta month differ by more than 10 months then the year * of the booking date will be adjusted. */ if (d2b-d2a>7) { /* booked before actually withdrawn */ d1b=d1a-1; } else if (d2a-d2b>7) { /* withdrawn and booked later */ d1b=d1a+1; } else d1b=d1a; ti=GWEN_Time_new(d1b, d2b-1, d3b, 12, 0, 0, 1); assert(ti); if (GWEN_Time_toDb(ti, GWEN_DB_GetGroup(data, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "date"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving date"); } GWEN_Time_free(ti); p+=4; bleft-=4; } /* credit/debit mark (M) */ if (bleft<2) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value string (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad value string"); return -1; } neg=0; if (*p=='R') { if (p[1]=='C' || p[1]=='c') neg=1; p+=2; bleft-=2; } else { if (*p=='D' || *p=='d') neg=1; p++; bleft--; } /* third character of currency (K) */ if (bleft<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad data (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad currency"); return -1; } if (!isdigit(*p)) { /* found third character, skip it */ //curr3=*p; p++; bleft--; } /* value (M) */ p2=p; while(*p2 && (isdigit(*p2) || *p2==',')) p2++; if (p2==p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No value (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad value"); return -1; } s=(char*)GWEN_Memory_malloc(p2-p+1+(neg?1:0)); if (neg) { s[0]='-'; memmove(s+1, p, p2-p+1); s[p2-p+1]=0; } else { memmove(s, p, p2-p+1); s[p2-p]=0; } AHB_SWIFT__SetCharValue(data, flags, "value/value", s); currency=GWEN_DB_GetCharValue(cfg, "currency", 0, 0); if (currency) AHB_SWIFT__SetCharValue(data, flags, "value/currency", currency); GWEN_Memory_dealloc(s); bleft-=p2-p; p=p2; /* skip 'N' */ p++; bleft--; /* key (M) */ if (bleft<3) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing booking key (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing booking key"); return -1; } memmove(buffer, p, 3); buffer[3]=0; AHB_SWIFT__SetCharValue(data, flags, "transactionKey", buffer); p+=3; bleft-=3; /* customer reference (M) */ if (bleft>0) { if (bleft>1) { if (*p=='/' && p[1]!='/') { p++; bleft--; } } p2=p; while(*p2 && *p2!='/' && *p2!=10) p2++; if (p2==p) { DBG_WARN(AQBANKING_LOGDOMAIN, "Missing customer reference (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing customer reference"); } else { s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p); s[p2-p]=0; if (strcasecmp(s, "NONREF")!=0) AHB_SWIFT__SetCharValue(data, flags, "customerReference", s); GWEN_Memory_dealloc(s); } bleft-=p2-p; p=p2; assert(bleft>=0); } /* bank reference (K) */ if (bleft>1) { if (*p=='/' && p[1]=='/') { /* found bank reference */ p+=2; bleft-=2; p2=p; while(*p2 && *p2!='/' && *p2!=10) p2++; if (p2==p) { DBG_WARN(AQBANKING_LOGDOMAIN, "Missing bank reference (%s) - ignored", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, "SWIFT: Non-Standard MT940 file: Missing bank reference field in :61: line - ignored."); return 0; } s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p+1); s[p2-p]=0; AHB_SWIFT__SetCharValue(data, flags, "bankReference", s); GWEN_Memory_dealloc(s); bleft-=p2-p; p=p2; assert(bleft>=0); } } /* more information ? */ if (*p==10) { /* yes... */ p++; bleft--; while(*p) { /* read extra information */ if (*p=='/') { if (p[1]==0) return 0; if (bleft<6) { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown extra data, ignoring (%s)", p); return 0; } if (strncasecmp(p, "/OCMT/", 6)==0) { /* original value */ p+=6; bleft-=6; /* get currency */ memmove(buffer, p, 3); buffer[3]=0; AHB_SWIFT__SetCharValue(data, flags, "origvalue/currency", buffer); p+=3; bleft-=3; if (*p=='/') { /* Deutsche Bank seems to be sending */ p++; /* a "/" between currency and amount */ bleft--; } /* get value */ p2=p; while(*p2 && *p2!='/') p2++; if (p2==p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad original value (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad original value"); return -1; } s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p+1); s[p2-p]=0; AHB_SWIFT__SetCharValue(data, flags, "origvalue/value", s); GWEN_Memory_dealloc(s); bleft-=p2-p; p=p2; } else if (strncasecmp(p, "/CHGS/", 6)==0) { /* charges */ p+=6; bleft-=6; /* get currency */ memmove(buffer, p, 3); buffer[3]=0; AHB_SWIFT__SetCharValue(data, flags, "charges/currency", buffer); p+=3; bleft-=3; if (*p=='/') { /* Deutsche Bank seems to be sending */ p++; /* a "/" between currency and amount */ bleft--; } /* get value */ p2=p; while(*p2 && *p2!='/') p2++; if (p2==p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad charges value (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad charges value"); return -1; } s=(char*)GWEN_Memory_malloc(p2-p+1); memmove(s, p, p2-p+1); s[p2-p]=0; AHB_SWIFT__SetCharValue(data, flags, "charges/value", s); GWEN_Memory_dealloc(s); bleft-=p2-p; p=p2; } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown extra data, ignoring (%s)", p); return 0; } } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad extra data, ignoring (%s)", p); return 0; } } /* while */ } /* if there is extra data */ return 0; } int AHB_SWIFT940_Parse_6_0_2(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg){ const char *p; const char *p2; char *s; char buffer[32]; unsigned int bleft; int d1, d2, d3; int neg; GWEN_TIME *ti; p=AHB_SWIFT_Tag_GetData(tg); assert(p); bleft=strlen(p); /* credit/debit mark (M) */ if (bleft<2) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value string (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad value string"); return -1; } neg=0; if (*p=='D' || *p=='d') neg=1; p++; bleft--; /* date (M) */ if (bleft<6) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing date (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing date"); return -1; } d1=((p[0]-'0')*10) + (p[1]-'0'); if (d1>CENTURY_CUTOFF_YEAR) d1+=1900; else d1+=2000; d2=((p[2]-'0')*10) + (p[3]-'0'); d3=((p[4]-'0')*10) + (p[5]-'0'); ti=GWEN_Time_new(d1, d2-1, d3, 12, 0, 0, 1); assert(ti); if (GWEN_Time_toDb(ti, GWEN_DB_GetGroup(data, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "date"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving date"); } GWEN_Time_free(ti); p+=6; bleft-=6; /* currency (M) */ if (!isdigit(*p)) { /* only read currency if this is not part of the value (like in some * swiss MT940) */ if (bleft<3) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing currency (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing currency"); return -1; } memmove(buffer, p, 3); buffer[3]=0; AHB_SWIFT__SetCharValue(data, flags, "value/currency", buffer); p+=3; bleft-=3; } /* value (M) */ if (bleft<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing value (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Missing value"); return -1; } p2=p; while(*p2 && (isdigit(*p2) || *p2==',')) p2++; if (p2==p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value (%s)", p); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, "SWIFT: Bad value"); return -1; } s=(char*)GWEN_Memory_malloc(p2-p+1+(neg?1:0)); if (neg) { s[0]='-'; memmove(s+1, p, p2-p+1); s[p2-p+1]=0; } else { memmove(s, p, p2-p+1); s[p2-p]=0; } AHB_SWIFT__SetCharValue(data, flags, "value/value", s); GWEN_Memory_dealloc(s); bleft-=p2-p; p=p2; return 0; } int AHB_SWIFT940_Parse_NS(const AHB_SWIFT_TAG *tg, uint32_t flags, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg){ const char *p; const char *p2; /* TODO: Use AHB_SWIFT_ParseSubTags */ p=AHB_SWIFT_Tag_GetData(tg); assert(p); while(*p) { int code; code=0; /* read code */ if (strlen(p)>2) { if (isdigit(p[0]) && isdigit(p[1])) { /* starts with a two digit number */ code=(((p[0]-'0')*10) + (p[1]-'0')); p+=2; } } /* search for end of line */ p2=p; while(*p2 && *p2!=10 && *p2!=13) p2++; if (code==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No code in line"); p=p2; } else { int len; len=p2-p; if (len<1 || (len==1 && *p=='/')) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Empty field %02d", code); } else { char *s; s=(char*)GWEN_Memory_malloc(len+1); memmove(s, p, len); s[len]=0; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Got his field: %02d: %s", code, s); switch(code) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: AHB_SWIFT__SetCharValue(data, flags, "purpose", s); break; case 15: /* Auftraggeber1 */ case 16: /* Auftraggeber2 */ AHB_SWIFT__SetCharValue(data, flags, "localName", s); break; case 17: /* Buchungstext */ AHB_SWIFT__SetCharValue(data, flags, "transactionText", s); break; case 18: /* Primanota */ AHB_SWIFT__SetCharValue(data, flags, "primanota", s); break; case 19: /* Uhrzeit der Buchung */ case 20: /* Anzahl der Sammlerposten */ case 33: /* BLZ Auftraggeber */ case 34: /* Konto Auftraggeber */ break; default: /* ignore all other fields (if any) */ DBG_WARN(AQBANKING_LOGDOMAIN, "Unknown :NS: field \"%02d\" (%s) (%s)", code, s, AHB_SWIFT_Tag_GetData(tg)); break; } GWEN_Memory_dealloc(s); } p=p2; } if (*p==10) p++; if (*p==13) p++; if (*p==10) p++; } /* while */ return 0; } /* Import SWIFT MT940 data. @param tl input: list of tags. Tags are lines in a SWIFT data block (block 4). A tag has an id and content. See the AHB_SWIFT_Tag_new function for more information. */ int AHB_SWIFT940_Import(AHB_SWIFT_TAG_LIST *tl, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags) { AHB_SWIFT_TAG *tg; GWEN_DB_NODE *dbDay=NULL; GWEN_DB_NODE *dbTemplate=NULL; GWEN_DB_NODE *dbTransaction=NULL; GWEN_DB_NODE *dbDate=NULL; uint32_t progressId; const char *acceptTag20="*"; const char *rejectTag20=NULL; int ignoreCurrentReport=0; acceptTag20=GWEN_DB_GetCharValue(cfg, "acceptTag20", 0, NULL); if (acceptTag20 && *acceptTag20==0) acceptTag20=NULL; rejectTag20=GWEN_DB_GetCharValue(cfg, "rejectTag20", 0, NULL); if (rejectTag20 && *rejectTag20==0) rejectTag20=NULL; dbTemplate=GWEN_DB_Group_new("template"); progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Importing SWIFT tags..."), NULL, AHB_SWIFT_Tag_List_GetCount(tl), 0); tg=AHB_SWIFT_Tag_List_First(tl); while(tg) { const char *id; id=AHB_SWIFT_Tag_GetId(tg); assert(id); if (strcasecmp(id, "20")==0) { if (acceptTag20 || rejectTag20) { const char *p; p=AHB_SWIFT_Tag_GetData(tg); assert(p); if (rejectTag20) { if (-1!=GWEN_Text_ComparePattern(p, rejectTag20, 0)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring report [%s]", p); ignoreCurrentReport=1; } else { ignoreCurrentReport=0; } } else if (acceptTag20) { if (-1==GWEN_Text_ComparePattern(p, acceptTag20, 0)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring report [%s] (not matching [%s])", p, acceptTag20); ignoreCurrentReport=1; } else { ignoreCurrentReport=0; } } } } else { if (!ignoreCurrentReport) { if (strcasecmp(id, "25")==0) { /* LocalAccount */ if (AHB_SWIFT940_Parse_25(tg, flags, dbTemplate, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } } else if (strcasecmp(id, "28C")==0) { /* Sequence/Statement Number - currently ignored */ /* PostFinance statements don't have a correctly incrementing count... */ } else if (strcasecmp(id, "60M")==0 || /* Interim StartSaldo */ strcasecmp(id, "60F")==0) { /* StartSaldo */ GWEN_DB_NODE *dbSaldo; const char *curr; /* start a new day */ dbDay=GWEN_DB_GetGroup(data, GWEN_PATH_FLAGS_CREATE_GROUP, "day"); dbTransaction=0; DBG_INFO(AQBANKING_LOGDOMAIN, "Starting new day"); dbSaldo=GWEN_DB_GetGroup(dbDay, GWEN_PATH_FLAGS_CREATE_GROUP, "StartSaldo"); GWEN_DB_AddGroupChildren(dbSaldo, dbTemplate); if (AHB_SWIFT940_Parse_6_0_2(tg, flags, dbSaldo, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } else { dbDate=GWEN_DB_GetGroup(dbSaldo, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); } curr=GWEN_DB_GetCharValue(dbSaldo, "value/currency", 0, 0); if (curr) { AHB_SWIFT__SetCharValue(dbTemplate, flags, "value/currency", curr); } } else if (strcasecmp(id, "62M")==0 || /* Interim EndSaldo */ strcasecmp(id, "62F")==0) { /* EndSaldo */ GWEN_DB_NODE *dbSaldo; /* end current day */ dbTransaction=0; if (!dbDay) { DBG_WARN(AQBANKING_LOGDOMAIN, "Your bank does not send an opening saldo"); dbDay=GWEN_DB_GetGroup(data, GWEN_PATH_FLAGS_CREATE_GROUP, "day"); } dbSaldo=GWEN_DB_GetGroup(dbDay, GWEN_PATH_FLAGS_CREATE_GROUP, "EndSaldo"); GWEN_DB_AddGroupChildren(dbSaldo, dbTemplate); if (AHB_SWIFT940_Parse_6_0_2(tg, flags, dbSaldo, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } dbDay=0; } else if (strcasecmp(id, "61")==0) { if (!dbDay) { DBG_WARN(AQBANKING_LOGDOMAIN, "Your bank does not send an opening saldo"); dbDay=GWEN_DB_GetGroup(data, GWEN_PATH_FLAGS_CREATE_GROUP, "day"); } DBG_INFO(AQBANKING_LOGDOMAIN, "Creating new transaction"); dbTransaction=GWEN_DB_GetGroup(dbDay, GWEN_PATH_FLAGS_CREATE_GROUP, "transaction"); GWEN_DB_AddGroupChildren(dbTransaction, dbTemplate); if (dbDate) { GWEN_DB_NODE *dbT; /* dbDate is set upon parsing of tag 60F, use it as a default * if possible */ dbT=GWEN_DB_GetGroup(dbTransaction, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "date"); assert(dbT); GWEN_DB_AddGroupChildren(dbT, dbDate); } if (AHB_SWIFT940_Parse_61(tg, flags, dbTransaction, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } } else if (strcasecmp(id, "86")==0) { if (!dbTransaction) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad sequence of tags (86 before 61), ignoring"); } else { if (AHB_SWIFT940_Parse_86(tg, flags, dbTransaction, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } } } else if (strcasecmp(id, "NS")==0) { if (!dbTransaction) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Ignoring NS tags outside transactions"); } else { if (AHB_SWIFT940_Parse_NS(tg, flags, dbTransaction, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error in tag"); GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return -1; } } } else if (strcmp(id, "21")==0) { const char *p; p=AHB_SWIFT_Tag_GetData(tg); assert (p); if (0==strcmp(p, "NONREF")) { DBG_INFO(AQBANKING_LOGDOMAIN, "Ignoring related reference '%s' in document tag 21.", p); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unexpected related reference '%s' in document tag 21 encountered.", p); } } else { DBG_WARN(AQBANKING_LOGDOMAIN, "Unexpected tag '%s' found.", id) DBG_WARN(AQBANKING_LOGDOMAIN, "To debug set environment variable AQBANKING_LOGLEVEL=info and rerun"); } } } if (GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_ONE)== GWEN_ERROR_USER_ABORTED) { GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Aborted by user")); GWEN_Gui_ProgressEnd(progressId); GWEN_DB_Group_free(dbTemplate); return GWEN_ERROR_USER_ABORTED; } tg=AHB_SWIFT_Tag_List_Next(tg); } /* while */ GWEN_DB_Group_free(dbTemplate); GWEN_Gui_ProgressEnd(progressId); return 0; } aqbanking-5.6.4beta/src/plugins/parsers/swift/Makefile.am0000644000175000017500000000126112364015477020366 00000000000000INCLUDES = \ -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST=README noinst_HEADERS=\ swift.h \ swift_l.h \ swift_p.h \ swift940_l.h \ swift940_p.h dbioplugindir = $(aqbanking_plugindir)/dbio dbioplugin_DATA=swift.xml dbioplugin_LTLIBRARIES=swift.la swift_la_SOURCES=\ swift.c \ swift940.c swift_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) swift_la_LDFLAGS = -no-undefined $(STRIPALL) -module -avoid-version sources: for f in $(swift_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dbioplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/parsers/swift/swift.h0000644000175000017500000000224612364015477017643 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon May 02 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_SWIFT_H #define AQHBCIBANK_SWIFT_H /** * @defgroup MOD_PLUGIN_SWIFT SWIFT Parser * @ingroup MOD_PLUGINS * *

* This DBIO plugin allows parsing and creating of SWIFT documents. *

*

* Every DBIO plugin uses a GWEN_DB which contains the configuration for * the given plugin. For this plugin the configuration is as follows: *

*
YYYY/MM/DD(-> 2005/02/25)
DD.MM.YYYY(-> 25.02.2005)
MM/DD/YY(-> 02/25/05)
* * * * * * * * * * * * * * * *
NameTypeContentMode
typecharmt940, mt942: type of SWIFT documentrequired
* */ #endif /* AQHBCIBANK_SWIFT_H */ aqbanking-5.6.4beta/src/plugins/parsers/swift/swift.c0000644000175000017500000006042312643256101017626 00000000000000/*************************************************************************** begin : Fri Apr 02 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "swift_p.h" #include "swift940_l.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AHB_SWIFT_TAG, AHB_SWIFT_Tag); GWEN_LIST_FUNCTIONS(AHB_SWIFT_SUBTAG, AHB_SWIFT_SubTag); int AHB_SWIFT_Condense(char *buffer, int keepMultipleBlanks) { char *src; char *dst; if (keepMultipleBlanks) { src=buffer; dst=buffer; /* only remove line feed */ while(*src) { if (*src!=10) { *dst=*src; dst++; } src++; } /* while */ } else { int lastWasBlank; src=buffer; while(*src && isspace(*src)) src++; dst=buffer; lastWasBlank=0; while(*src) { if (isspace(*src) && (*src!=10)) { if (!lastWasBlank) { *(dst++)=' '; lastWasBlank=1; } } else { lastWasBlank=0; if (*src!=10) { *(dst++)=*src; } } src++; } /* while */ } *dst=0; return 0; } /* Create a tag object from a tag ID and the content of the tag. Example: Given the following line inside a SWIFT data block: :28C:7/1 You'd call AHB_SWIFT_Tag_new like this: AHB_SWIFT_Tag_new("28C", "7/1") @return a new AHB_SWIFT_TAG */ AHB_SWIFT_TAG *AHB_SWIFT_Tag_new(const char *id, const char *content){ AHB_SWIFT_TAG *tg; assert(id); assert(content); GWEN_NEW_OBJECT(AHB_SWIFT_TAG, tg); GWEN_LIST_INIT(AHB_SWIFT_TAG, tg); tg->id=strdup(id); tg->content=strdup(content); return tg; } void AHB_SWIFT_Tag_free(AHB_SWIFT_TAG *tg){ if (tg) { GWEN_LIST_FINI(AHB_SWIFT_TAG, tg); free(tg->id); free(tg->content); GWEN_FREE_OBJECT(tg); } } const char *AHB_SWIFT_Tag_GetId(const AHB_SWIFT_TAG *tg){ assert(tg); return tg->id; } const char *AHB_SWIFT_Tag_GetData(const AHB_SWIFT_TAG *tg){ assert(tg); return tg->content; } AHB_SWIFT_SUBTAG *AHB_SWIFT_SubTag_new(int id, const char *content, int clen) { AHB_SWIFT_SUBTAG *stg; assert(content); GWEN_NEW_OBJECT(AHB_SWIFT_SUBTAG, stg); GWEN_LIST_INIT(AHB_SWIFT_SUBTAG, stg); stg->id=id; if (clen==-1) clen=strlen(content); stg->content=(char*)malloc(clen+1); memmove(stg->content, content, clen); stg->content[clen]=0; return stg; } void AHB_SWIFT_SubTag_free(AHB_SWIFT_SUBTAG *stg) { if (stg) { GWEN_LIST_FINI(AHB_SWIFT_SUBTAG, stg); free(stg->content); GWEN_FREE_OBJECT(stg); } } int AHB_SWIFT_SubTag_GetId(const AHB_SWIFT_SUBTAG *stg){ assert(stg); return stg->id; } const char *AHB_SWIFT_SubTag_GetData(const AHB_SWIFT_SUBTAG *stg){ assert(stg); return stg->content; } AHB_SWIFT_SUBTAG *AHB_SWIFT_FindSubTagById(const AHB_SWIFT_SUBTAG_LIST *stlist, int id) { AHB_SWIFT_SUBTAG *stg; stg=AHB_SWIFT_SubTag_List_First(stlist); while(stg) { if (stg->id==id) break; stg=AHB_SWIFT_SubTag_List_Next(stg); } return stg; } void AHB_SWIFT_SubTag_Condense(AHB_SWIFT_SUBTAG *stg, int keepMultipleBlanks) { assert(stg); AHB_SWIFT_Condense(stg->content, keepMultipleBlanks); } int AHB_SWIFT_GetNextSubTag(const char **sptr, AHB_SWIFT_SUBTAG **tptr) { const char *s; int id=0; int nextId=0; const char *content=NULL; AHB_SWIFT_SUBTAG *stg; s=*sptr; if (*s=='?') { const char *t; t=s; t++; if (*t==0x0a) t++; if (*t && isdigit(*t)) { id=(*(t++)-'0')*10; if (*t==0x0a) t++; if (*t && isdigit(*t)) { id+=*(t++)-'0'; s=t; } } } content=s; /* find end of content */ for (;;) { while(*s && *s!='?') s++; if (*s=='?') { const char *t; t=s; t++; if (*t==0x0a) t++; if (*t && isdigit(*t)) { nextId=(*(t++)-'0')*10; if (*t==0x0a) t++; if (*t && isdigit(*t)) { nextId+=*(t++)-'0'; /* TODO: check nextId */ /* s is the beginning of a new subtag, so the end has been found */ break; } else { /* next is not a digit, so this is not the begin of a new tag */ if (*s) s++; else /* end of string, also end of content */ break; } } else { /* next is not a digit, so this is not the begin of a new tag */ if (*s) s++; else /* end of string, also end of content */ break; } } else if (*s) /* not the beginning of a new tag, continue */ s++; else /* end of string, also end of content */ break; } /* create subtag */ stg=AHB_SWIFT_SubTag_new(id, content, s-content); /* update return pointers */ *tptr=stg; *sptr=s; return 0; } int AHB_SWIFT_ParseSubTags(const char *s, AHB_SWIFT_SUBTAG_LIST *stlist, int keepMultipleBlanks) { while(*s) { int rv; AHB_SWIFT_SUBTAG *stg=NULL; rv=AHB_SWIFT_GetNextSubTag(&s, &stg); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } AHB_SWIFT_SubTag_Condense(stg, keepMultipleBlanks); AHB_SWIFT_SubTag_List_Add(stg, stlist); } return 0; } /* This reads a line within a SWIFT data block (block 4) @param *fb pointer to a GWEN_FAST_BUFFER input buffer @param *buffer pointer to a char* output buffer @param s size of the output buffer */ int AHB_SWIFT_ReadLine(GWEN_FAST_BUFFER *fb, char *buffer, unsigned int s){ int lastWasAt; char *obuffer; assert(fb); assert(buffer); assert(s); obuffer=buffer; *buffer=0; lastWasAt=0; for(;;) { int c; GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { if (*obuffer==0) { return GWEN_ERROR_EOF; } break; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from stream"); *buffer=0; return c; } } if (c=='}') { /* stop on curly bracket without reading it */ break; } GWEN_FASTBUFFER_READBYTE(fb, c); if (c==10) break; else if (c=='@') { if (lastWasAt) break; else lastWasAt=1; } else { lastWasAt=0; if (c!=13) { if (s<2) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Buffer full (line too long)"); *buffer=0; return -1; } *buffer=c; buffer++; s--; } } } /* for */ *buffer=0; /*GWEN_Text_DumpString(obuffer, buffer-obuffer+1, stderr, 2);*/ return 0; } /* This will read the contents of a SWIFT data block ({4: ... }) inside of a SWIFT document */ int AHB_SWIFT_ReadTextBlock(GWEN_FAST_BUFFER *fb, AHB_SWIFT_TAG_LIST *tl, unsigned int maxTags) { GWEN_BUFFER *lbuf; char buffer[AHB_SWIFT_MAXLINELEN]; char *p; char *p2; AHB_SWIFT_TAG *tag; int tagCount; int rv; lbuf=GWEN_Buffer_new(0, AHB_SWIFT_MAXLINELEN, 0, 1); tagCount=0; /* read first line, should be empty */ for (;;) { rv=AHB_SWIFT_ReadLine(fb, buffer, sizeof(buffer)-1); if (rv<0) { if (rv==GWEN_ERROR_EOF) { GWEN_Buffer_free(lbuf); return 1; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from stream (%d)", rv); GWEN_Buffer_free(lbuf); return rv; } if (buffer[0]) /* line is not empty, let's dance */ break; } /* for */ if (buffer[0]=='-') { DBG_WARN(AQBANKING_LOGDOMAIN, "Empty report"); GWEN_Buffer_free(lbuf); return 1; } for (;;) { /* get a tag */ GWEN_Buffer_Reset(lbuf); if (buffer[0]) { if (buffer[0]=='-' && buffer[1]==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "End of SWIFT document reached"); GWEN_Buffer_free(lbuf); return 0; } GWEN_Buffer_AppendString(lbuf, buffer); } /* get a complete tag, don't be fooled by CR/LF inside a tag. * well, normally a CR/LF sequence ends a tag. However, in :86: tags * we may have fields which might include CR/LF sequences... */ for (;;) { buffer[0]=0; GWEN_FASTBUFFER_PEEKBYTE(fb, rv); if (rv<0) { if (rv==GWEN_ERROR_EOF) { /* eof met */ if (GWEN_Buffer_GetUsedBytes(lbuf)==0) { /* eof met and buffer empty, finished */ DBG_INFO(AQBANKING_LOGDOMAIN, "SWIFT document not terminated by \'-\'"); GWEN_Buffer_free(lbuf); return 0; } else { buffer[0]='-'; buffer[1]=0; break; } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(lbuf); return rv; } } else { /* read next line */ rv=AHB_SWIFT_ReadLine(fb, buffer, sizeof(buffer)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from stream (%d)", rv); GWEN_Buffer_free(lbuf); return rv; } } /* check whether the line starts with a new tag (:123x:) */ if (buffer[0]==':') { const char *s; if (strncasecmp(buffer, ":NS:", 4)==0) { break; } else { s=buffer+1; while(*s && isdigit(*s)) s++; if (isalpha(*s)) s++; if (*s==':') { DBG_DEBUG(AQBANKING_LOGDOMAIN, "End of tag reached"); break; } } } /* check whether the line starts with a ":" or "-" */ if (buffer[0]=='-' && buffer[1]==0) { /* it does, so the buffer contains the next line, go handle the * previous line */ DBG_DEBUG(AQBANKING_LOGDOMAIN, "End of doc reached"); break; } /* it doesn't, so there is a CR/LF inside the tag */ if (GWEN_Buffer_GetUsedBytes(lbuf)>AHB_SWIFT_MAXLINELEN*4) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many bytes in line, maybe not SWIFT"); GWEN_Buffer_free(lbuf); return -1; } GWEN_Buffer_AppendByte(lbuf, 10); GWEN_Buffer_AppendString(lbuf, buffer); } /* for */ /* tag complete, parse it */ p=GWEN_Buffer_GetStart(lbuf); if (*p!=':') { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in SWIFT data: no tag name"); GWEN_Text_DumpString(GWEN_Buffer_GetStart(lbuf), GWEN_Buffer_GetUsedBytes(lbuf), 2); GWEN_Buffer_free(lbuf); return -1; } p++; p2=p; while(*p2 && *p2!=':') p2++; if (*p2!=':') { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in SWIFT data: incomplete tag name"); GWEN_Text_DumpString(GWEN_Buffer_GetStart(lbuf), GWEN_Buffer_GetUsedBytes(lbuf), 2); GWEN_Buffer_free(lbuf); return -1; } *p2=0; p2++; /* create tag */ DBG_DEBUG(AQBANKING_LOGDOMAIN, "Creating tag \"%s\" (%s)", p, p2); tag=AHB_SWIFT_Tag_new(p, p2); AHB_SWIFT_Tag_List_Add(tag, tl); tagCount++; if (maxTags && tagCount>=maxTags) { DBG_INFO(AQBANKING_LOGDOMAIN, "Read maximum number of tags (%d)", tagCount); GWEN_Buffer_free(lbuf); return 0; } } /* for */ /* we should never reach this point... */ return 0; } #if 0 int AHB_SWIFT_ReadDocument(GWEN_FAST_BUFFER *fb, AHB_SWIFT_TAG_LIST *tl, unsigned int maxTags) { int rv; int c; int isFullSwift=0; /* check for first character being a curly bracket */ for (;;) { GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_INFO(AQBANKING_LOGDOMAIN, "EOF met, empty document"); return 1; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return c; } if (c=='{') { isFullSwift=1; break; } else if (c>3) /* some SWIFT documents contain 01 at the beginning and 03 at the end, * we simply skip those characters here */ break; GWEN_FASTBUFFER_READBYTE(fb, c); } /* for */ if (isFullSwift) { /* read header, seek block 4 */ for (;;) { int err; char swhead[4]; unsigned int bsize; int curls=0; /* read block start ("{n:...") */ bsize=3; GWEN_FASTBUFFER_READFORCED(fb, err, swhead, bsize); if (err<0) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); return err; } if (swhead[2]!=':') { DBG_ERROR(AQBANKING_LOGDOMAIN, "Not a SWIFT block"); GWEN_Text_DumpString(swhead, 4, 2); return GWEN_ERROR_BAD_DATA; } DBG_DEBUG(0, "Reading block %d", swhead[1]-'0'); if (swhead[1]=='4') break; /* skip block */ for (;;) { GWEN_FASTBUFFER_READBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_ERROR(AQBANKING_LOGDOMAIN, "EOF met (%d)", c); return GWEN_ERROR_EOF; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return GWEN_ERROR_READ; } if (c=='{') curls++; else if (c=='}') { if (curls==0) break; else curls--; } } } /* for */ } rv=AHB_SWIFT_ReadTextBlock(fb, tl, maxTags); if (rv) return rv; if (isFullSwift) { int curls=0; /* read trailer */ /* skip rest of block 4 */ for (;;) { GWEN_FASTBUFFER_READBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_ERROR(AQBANKING_LOGDOMAIN, "EOF met (%d)", c); return c; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return c; } if (c=='{') curls++; else if (c=='}') { if (curls==0) break; else curls--; } } GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c>=0) { for (;;) { int err; char swhead[4]; unsigned int bsize; int curls=0; /* read block start ("{n:...") */ bsize=3; GWEN_FASTBUFFER_READFORCED(fb, err, swhead, bsize); if (err<0) { if (err==GWEN_ERROR_EOF) { DBG_ERROR(AQBANKING_LOGDOMAIN, "EOF met (%d)", c); return 0; } DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); return err; } #if 0 if (swhead[2]!=':') { DBG_ERROR(AQBANKING_LOGDOMAIN, "Not a SWIFT block"); return GWEN_ERROR_BAD_DATA; } #endif /* skip block */ for (;;) { GWEN_FASTBUFFER_READBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_ERROR(AQBANKING_LOGDOMAIN, "EOF met (%d)", c); return 0; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return GWEN_ERROR_READ; } if (c=='{') curls++; else if (c=='}') { if (curls==0) break; else curls--; } } if (swhead[1]=='5') break; } /* for */ } /* if something follows block 4 */ } /* if full SWIFT with blocks */ return 0; } #endif int AHB_SWIFT_ReadDocument(GWEN_FAST_BUFFER *fb, AHB_SWIFT_TAG_LIST *tl, unsigned int maxTags) { int rv; int c; int isFullSwift=0; int subDocs=0; /* check for first character being a curly bracket */ for (;;) { GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_INFO(AQBANKING_LOGDOMAIN, "EOF met, empty document"); return 1; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return c; } if (c=='{') { isFullSwift=1; break; } else if (c>3) /* some SWIFT documents contain 01 at the beginning and 03 at the end, * we simply skip those characters here */ break; GWEN_FASTBUFFER_READBYTE(fb, c); } /* for */ if (isFullSwift) { /* read header, seek block 4 */ for (;;) { int err; char swhead[4]; unsigned int bsize; int curls=0; /* skip everything before curly bracket */ for (;;) { GWEN_FASTBUFFER_PEEKBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_INFO(AQBANKING_LOGDOMAIN, "EOF met, empty block"); if (subDocs>0) { DBG_INFO(AQBANKING_LOGDOMAIN, "We got %d text blocks, returning", subDocs); return 0; } return 1; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return c; } if (c=='{') { break; } GWEN_FASTBUFFER_READBYTE(fb, c); } /* for */ /* read block start ("{n:...") */ bsize=3; GWEN_FASTBUFFER_READFORCED(fb, err, swhead, bsize); if (err<0) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); return err; } if (swhead[2]!=':') { DBG_ERROR(AQBANKING_LOGDOMAIN, "Not a SWIFT block"); GWEN_Text_DumpString(swhead, 4, 2); return GWEN_ERROR_BAD_DATA; } /* handle block */ DBG_DEBUG(0, "Reading block %d", swhead[1]-'0'); if (swhead[1]=='4') { /* read document from block 4 */ rv=AHB_SWIFT_ReadTextBlock(fb, tl, maxTags); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } subDocs++; } /* skip block */ for (;;) { GWEN_FASTBUFFER_READBYTE(fb, c); if (c<0) { if (c==GWEN_ERROR_EOF) { DBG_ERROR(AQBANKING_LOGDOMAIN, "EOF met (%d)", c); return GWEN_ERROR_EOF; } DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading from BIO (%d)", c); return GWEN_ERROR_READ; } if (c=='{') curls++; else if (c=='}') { if (curls==0) break; else curls--; } } /* for */ } /* for */ } else { /* not a full swift document, just read the SWIFT document directly */ rv=AHB_SWIFT_ReadTextBlock(fb, tl, maxTags); if (rv) return rv; } return 0; } int AHB_SWIFT_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags) { int rv; const char *p; int skipFileLines; int skipDocLines; GWEN_FAST_BUFFER *fb; int docsImported=0; p=GWEN_DB_GetCharValue(cfg, "type", 0, "mt940"); if (strcasecmp(p, "mt940")!=0 && strcasecmp(p, "mt942")!=0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Type \"%s\" not supported by plugin \"%s\"", p, GWEN_DBIO_GetName(dbio)); return GWEN_ERROR_INVALID; } skipFileLines=GWEN_DB_GetIntValue(cfg, "skipFileLines", 0, 0); skipDocLines=GWEN_DB_GetIntValue(cfg, "skipDocLines", 0, 0); fb=GWEN_FastBuffer_new(256, sio); /* skip lines at the beginning if requested */ if (skipFileLines>0) { int i; GWEN_BUFFER *lbuf; lbuf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; i0) { int i; GWEN_BUFFER *lbuf; lbuf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; i #include #define AHB_SWIFT_MAXLINELEN 512 typedef struct AHB_SWIFT_TAG AHB_SWIFT_TAG; typedef struct AHB_SWIFT_SUBTAG AHB_SWIFT_SUBTAG; GWEN_LIST_FUNCTION_DEFS(AHB_SWIFT_TAG, AHB_SWIFT_Tag); const char *AHB_SWIFT_Tag_GetId(const AHB_SWIFT_TAG *tg); const char *AHB_SWIFT_Tag_GetData(const AHB_SWIFT_TAG *tg); GWEN_LIST_FUNCTION_DEFS(AHB_SWIFT_SUBTAG, AHB_SWIFT_SubTag); AHB_SWIFT_SUBTAG *AHB_SWIFT_SubTag_new(int id, const char *content, int clen); void AHB_SWIFT_SubTag_free(AHB_SWIFT_SUBTAG *stg); int AHB_SWIFT_SubTag_GetId(const AHB_SWIFT_SUBTAG *stg); const char *AHB_SWIFT_SubTag_GetData(const AHB_SWIFT_SUBTAG *stg); AHB_SWIFT_SUBTAG *AHB_SWIFT_FindSubTagById(const AHB_SWIFT_SUBTAG_LIST *stlist, int id); void AHB_SWIFT_SubTag_Condense(AHB_SWIFT_SUBTAG *stg, int keepMultipleBlanks); int AHB_SWIFT_GetNextSubTag(const char **sptr, AHB_SWIFT_SUBTAG **tptr); int AHB_SWIFT_ParseSubTags(const char *s, AHB_SWIFT_SUBTAG_LIST *stlist, int keepMultipleBlanks); int AHB_SWIFT_Condense(char *buffer, int keepDoubleBlanks); #endif /* AQHBCIBANK_SWIFT_L_H */ aqbanking-5.6.4beta/src/plugins/parsers/swift/README0000644000175000017500000000026612364015477017216 00000000000000This folder contains a parser for the international finance transaction format SWIFT. It currently contains code for SWIFT MT940 and MT942 records used in transaction statements. aqbanking-5.6.4beta/src/plugins/parsers/Makefile.in0000644000175000017500000006003312643540064017240 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/parsers DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = $(aqbanking_plugins_parsers_dirs) DIST_SUBDIRS = dtaus swift all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/parsers/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/parsers/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: # 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: aqbanking-5.6.4beta/src/plugins/parsers/Makefile.am0000644000175000017500000000023412364015477017231 00000000000000SUBDIRS=$(aqbanking_plugins_parsers_dirs) DIST_SUBDIRS=dtaus swift sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: aqbanking-5.6.4beta/src/plugins/parsers/dtaus/0000755000175000017500000000000012643540652016374 500000000000000aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus-import_p.h0000644000175000017500000000463012364015477021441 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Thu Apr 29 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_DTAUS_IMPORT_P_H #define AQHBCIBANK_DTAUS_IMPORT_P_H #include #include #include #include int AHB_DTAUS__SetCharValue(GWEN_DB_NODE *db, uint32_t flags, const char *name, const char *s); int AHB_DTAUS__ReadWord(GWEN_BUFFER *src, GWEN_BUFFER *dst, unsigned int pos, unsigned int size); int AHB_DTAUS__ParseExtSet(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *xa); /** * Completes the given template DB node. * @return -1 on error, size of A-set if ok */ int AHB_DTAUS__ParseSetA(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *xa); /** * @return -1 on error, size of C-set if ok */ int AHB_DTAUS__ParseSetC(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *xa, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds); /** * @return -1 on error, size of E-set if ok */ int AHB_DTAUS__ParseSetE(GWEN_BUFFER *src, unsigned int pos, unsigned int csets, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds); /** * @return -1 on error, size of DTAUS record if ok */ int AHB_DTAUS__ReadDocument(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *cfg); int AHB_DTAUS__Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags); #endif /* AQHBCIBANK_DTAUS_IMPORT_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus-import.c0000644000175000017500000010116612364015477021117 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Thu Apr 29 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dtaus_p.h" #include "dtaus-import_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include int AHB_DTAUS__SetCharValue(GWEN_DB_NODE *db, uint32_t flags, const char *name, const char *s) { GWEN_BUFFER *vbuf; int rv; vbuf=GWEN_Buffer_new(0, strlen(s)+32, 0, 1); AB_ImExporter_DtaToUtf8(s, -1, vbuf); rv=GWEN_DB_SetCharValue(db, flags, name, GWEN_Buffer_GetStart(vbuf)); GWEN_Buffer_free(vbuf); return rv; } int AHB_DTAUS__ReadWord(GWEN_BUFFER *src, GWEN_BUFFER *dst, unsigned int pos, unsigned int size) { unsigned int i; char *p; if (GWEN_Buffer_SetPos(src, pos)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Position %d out of range (size is %d)", pos, GWEN_Buffer_GetUsedBytes(src)); return -1; } /* skip blanks */ for (i=0; i92) year+=1900; else year+=2000; ti=GWEN_Time_new(year, month-1, day, 12, 0, 0, 1); if (GWEN_Time_toDb(ti, GWEN_DB_GetGroup(xa, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "date"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving date"); GWEN_Buffer_free(tmp); return -1; } } /* account id */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+60, 10)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading account id at %d", pos+60); GWEN_Buffer_free(tmp); return -1; } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Our account id: %s", GWEN_Buffer_GetStart(tmp)); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccountNumber", GWEN_Buffer_GetStart(tmp)); /* customer reference */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+70, 10)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading customer reference at %d", pos+70); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Customer reference: %s", GWEN_Buffer_GetStart(tmp)); AHB_DTAUS__SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "custref", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No customer reference"); } /* execution date */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+95, 8)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading execution date at %d", pos+95); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { int day, month, year; const char *p; GWEN_TIME *ti; if (GWEN_Buffer_GetUsedBytes(tmp)!=8) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid execution date at %d", pos+95); GWEN_Buffer_free(tmp); return -1; } p=GWEN_Buffer_GetStart(tmp); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Exec date: %s", p); day=((p[0]-'0')*10) + (p[1]-'0'); month=((p[2]-'0')*10) + (p[3]-'0'); year=((p[4]-'0')*1000)+ ((p[5]-'0')*100)+ ((p[6]-'0')*10) + (p[7]-'0'); ti=GWEN_Time_new(year, month-1, day, 12, 0, 0, 1); if (GWEN_Time_toDb(ti, GWEN_DB_GetGroup(xa, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "execDate"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving date"); GWEN_Buffer_free(tmp); return -1; } } /* currency mark */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+127, 1)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading currency mark at %d", pos+127); GWEN_Buffer_free(tmp); return -1; } if (*(GWEN_Buffer_GetStart(tmp))=='1') { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Currency: EUR"); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "value/currency", "EUR"); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Currency: DEM"); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "value/currency", "DEM"); } GWEN_Buffer_free(tmp); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Set size: %d", 128); return 128; } int AHB_DTAUS__ParseSetC(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *xa, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds){ GWEN_BUFFER *tmp; AB_VALUE *val; unsigned int extSets; unsigned int i; unsigned int lpos; tmp=GWEN_Buffer_new(0, 256, 0, 1); /* read peer's bank code */ if (AHB_DTAUS__ReadWord(src, tmp, pos+13, 8)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading bank code at %d", pos+13); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bank code: %s", GWEN_Buffer_GetStart(tmp)); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad bank code at %d", pos+13); GWEN_Buffer_free(tmp); return -1; } AB_Value_AddValue(sumBankCodes, val); AB_Value_free(val); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBankCode", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No bank code"); } /* read peer's account id */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+21, 10)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading account id at %d", pos+21); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Account id: %s", GWEN_Buffer_GetStart(tmp)); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad account id at %d", pos+21); GWEN_Buffer_free(tmp); return -1; } AB_Value_AddValue(sumAccountIds, val); AB_Value_free(val); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteAccountNumber", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No account id"); } /* read text key */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+44, 2)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error text key at %d", pos+44); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { const char *x; x=GWEN_Buffer_GetStart(tmp); if (*x=='0') x++; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Text key: %s", x); AHB_DTAUS__SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "textkey", x); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No text key"); } /* read own bank code */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+61, 8)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading bank code at %d", pos+61); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bank code: %s", GWEN_Buffer_GetStart(tmp)); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "localBankCode", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No bank code"); } /* read own account id */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+69, 10)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading account id at %d", pos+69); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Account id: %s", GWEN_Buffer_GetStart(tmp)); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccountNumber", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No account id"); } /* read value */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+182, 1)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading currency mark at %d", pos+182); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetStart(tmp)[0]=='1') { /* EUR */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+79, 11)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+79); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { if (GWEN_Buffer_GetUsedBytes(tmp)==11) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Value: %s", GWEN_Buffer_GetStart(tmp)); GWEN_Buffer_AppendString(tmp, "/100"); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "value/value", GWEN_Buffer_GetStart(tmp)); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "value/currency", "EUR"); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bad EUR value"); GWEN_Buffer_free(tmp); return -1; } AB_Value_AddValue(sumEUR, val); AB_Value_free(val); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bad EUR value"); GWEN_Buffer_free(tmp); return -1; } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No EUR value"); GWEN_Buffer_free(tmp); return -1; } } else { /* DEM */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+50, 11)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+50); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { if (GWEN_Buffer_GetUsedBytes(tmp)==11) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Value: %s", GWEN_Buffer_GetStart(tmp)); GWEN_Buffer_AppendString(tmp, "/100"); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "value/value", GWEN_Buffer_GetStart(tmp)); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "value/currency", "DEM"); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bad DEM value"); GWEN_Buffer_free(tmp); return -1; } AB_Value_AddValue(sumDEM, val); AB_Value_free(val); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bad DEM value"); GWEN_Buffer_free(tmp); return -1; } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No DEM value"); GWEN_Buffer_free(tmp); return -1; } } /* read peer name */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+93, 27)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading peer name at %d", pos+93); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Peer name: %s", GWEN_Buffer_GetStart(tmp)); AHB_DTAUS__SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteName", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No peer name"); } /* read own name */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+128, 27)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading peer name at %d", pos+128); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Name: %s", GWEN_Buffer_GetStart(tmp)); AHB_DTAUS__SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "localName", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No name"); } /* read purpose */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+155, 27)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading purpose at %d", pos+155); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Purpose: %s", GWEN_Buffer_GetStart(tmp)); AHB_DTAUS__SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT | GWEN_DB_FLAGS_OVERWRITE_VARS, "purpose", GWEN_Buffer_GetStart(tmp)); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No purpose"); } /* read number of extension sets */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+185, 2)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading number of ext sets at %d", pos+185); GWEN_Buffer_free(tmp); return -1; } if (1!=sscanf(GWEN_Buffer_GetStart(tmp), "%ud", &extSets)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of ext sets at %d (%04x)", pos+185, pos+185); GWEN_Buffer_free(tmp); return -1; } DBG_INFO(AQBANKING_LOGDOMAIN, "%d extension sets", extSets); /* read extension sets */ if (extSets>0) { if (AHB_DTAUS__ParseExtSet(src, pos+187, xa)==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in first extension set at %d", pos+187); GWEN_Buffer_free(tmp); return -1; } } if (extSets>1) { if (AHB_DTAUS__ParseExtSet(src, pos+216, xa)==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in second extension set at %d", pos+216); GWEN_Buffer_free(tmp); return -1; } } /* read next extension sets */ i=2; lpos=256; while(i=extSets) break; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Reading extension set %d at %d", i+j, pos+lpos); if (AHB_DTAUS__ParseExtSet(src, pos+lpos, xa)==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in extension set %d at %d", i+j, pos+lpos); GWEN_Buffer_free(tmp); return -1; } lpos+=29; } /* for j */ i+=j; lpos+=12; } /* while */ lpos=(lpos+127) & ~127; GWEN_Buffer_free(tmp); return lpos; } int AHB_DTAUS__ParseSetE(GWEN_BUFFER *src, unsigned int pos, unsigned int csets, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds){ GWEN_BUFFER *tmp; unsigned int i; AB_VALUE *val; tmp=GWEN_Buffer_new(0, 128, 0, 1); if (AHB_DTAUS__ReadWord(src, tmp, pos+10, 7)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading number of C sets at %d", pos+10); GWEN_Buffer_free(tmp); return -1; } if (1!=sscanf(GWEN_Buffer_GetStart(tmp), "%ud", &i)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of C sets at %d", pos+10); GWEN_Buffer_free(tmp); return -1; } if (i!=csets) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of C sets (is %d, should be %d)", csets, i); GWEN_Buffer_free(tmp); return -1; } /* checksum of DEM values */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+17, 13)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+17); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "DEM checksum: %s", GWEN_Buffer_GetStart(tmp)); GWEN_Buffer_AppendString(tmp, "/100"); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value at %d", pos+17); GWEN_Buffer_free(tmp); return -1; } if (AB_Value_Compare(sumDEM, val)!=0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad DEM checksum (is %.2f, should be %.2f)", AB_Value_GetValueAsDouble(sumDEM), AB_Value_GetValueAsDouble(val)); AB_Value_free(val); GWEN_Buffer_free(tmp); return -1; } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "DEM checksum ok"); AB_Value_free(val); } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No DEM checksum"); } /* checksum of account ids */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+30, 17)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+30); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Account id checksum: %s", GWEN_Buffer_GetStart(tmp)); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value at %d", pos+30); GWEN_Buffer_free(tmp); return -1; } if (AB_Value_Compare(sumAccountIds, val)!=0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad account id checksum (is %f, should be %f)", AB_Value_GetValueAsDouble(sumAccountIds), AB_Value_GetValueAsDouble(val)); AB_Value_free(val); GWEN_Buffer_free(tmp); return -1; } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Account id checksum ok"); AB_Value_free(val); } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No account id checksum"); } /* checksum of bank codes */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+47, 17)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+30); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bank code checksum: %s", GWEN_Buffer_GetStart(tmp)); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad bank code checksum: %s", GWEN_Buffer_GetStart(tmp)); GWEN_Buffer_free(tmp); return -1; } if (AB_Value_Compare(sumBankCodes, val)!=0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad bank code checksum (is %f, should be %f)", AB_Value_GetValueAsDouble(sumBankCodes), AB_Value_GetValueAsDouble(val)); AB_Value_free(val); GWEN_Buffer_free(tmp); return -1; } else { AB_Value_free(val); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Bank code checksum ok"); } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No bank code checksum"); } /* checksum of EUR values */ GWEN_Buffer_Reset(tmp); if (AHB_DTAUS__ReadWord(src, tmp, pos+64, 13)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading value at %d", pos+64); GWEN_Buffer_free(tmp); return -1; } if (GWEN_Buffer_GetUsedBytes(tmp)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "EUR checksum: %s", GWEN_Buffer_GetStart(tmp)); GWEN_Buffer_AppendString(tmp, "/100"); val=AB_Value_fromString(GWEN_Buffer_GetStart(tmp)); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value at %d", pos+64); GWEN_Buffer_free(tmp); return -1; } if (AB_Value_Compare(sumEUR, val)!=0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad EUR checksum (is %.2f, should be %.2f)", AB_Value_GetValueAsDouble(sumEUR), AB_Value_GetValueAsDouble(val)); AB_Value_free(val); GWEN_Buffer_free(tmp); return -1; } else { AB_Value_free(val); DBG_DEBUG(AQBANKING_LOGDOMAIN, "EUR checksum ok"); } } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "No EUR checksum"); } GWEN_Buffer_free(tmp); return 128; } int AHB_DTAUS__ReadDocument(GWEN_BUFFER *src, unsigned int pos, GWEN_DB_NODE *cfg) { GWEN_DB_NODE *dcfg=0; GWEN_DB_NODE *xa; int rv; unsigned int cSets; AB_VALUE *sumEUR; AB_VALUE *sumDEM; AB_VALUE *sumBankCodes; AB_VALUE *sumAccountIds; int hasESet; int sn; int isDebitNote; const char *p; /* preset */ hasESet=0; dcfg=0; cSets=0; sumEUR=AB_Value_new(); sumDEM=AB_Value_new(); sumBankCodes=AB_Value_new(); sumAccountIds=AB_Value_new(); /* read A set */ DBG_INFO(AQBANKING_LOGDOMAIN, "Reading A set (pos=%d)", pos); GWEN_Buffer_SetPos(src, pos+4); sn=GWEN_Buffer_PeekByte(src); if (sn==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few data"); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } if (sn=='A') { /* create template */ dcfg=GWEN_DB_Group_new("dcfg"); rv=AHB_DTAUS__ParseSetA(src, pos, dcfg); if (rv==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in A set"); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); GWEN_DB_Group_free(dcfg); return -1; } pos+=rv; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "DTAUS record does not start with an A set"); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } isDebitNote=(strcasecmp(GWEN_DB_GetCharValue(dcfg, "type", 0, "transfer"), "debitnote")==0); /* now read C sets */ for (;;) { GWEN_Buffer_SetPos(src, pos+4); sn=GWEN_Buffer_PeekByte(src); if (sn==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few data"); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); GWEN_DB_Group_free(dcfg); return -1; } if (sn=='C') { GWEN_DB_NODE *dbDate; cSets++; DBG_INFO(AQBANKING_LOGDOMAIN, "Reading C set (pos=%d)", pos); if (isDebitNote) xa=GWEN_DB_Group_new("debitnote"); else xa=GWEN_DB_Group_new("transfer"); GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "value/currency", GWEN_DB_GetCharValue(dcfg, "currency", 0, "EUR")); p=GWEN_DB_GetCharValue(dcfg, "localBankCode", 0, 0); if (!p) p=GWEN_DB_GetCharValue(cfg, "bankCode", 0, 0); if (p) GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "localBankCode", p); p=GWEN_DB_GetCharValue(dcfg, "localAccountNumber", 0, 0); if (!p) p=GWEN_DB_GetCharValue(cfg, "acccountId", 0, 0); if (p) GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "localAccountNumber", p); p=GWEN_DB_GetCharValue(cfg, "name", 0, 0); if (p) GWEN_DB_SetCharValue(xa, GWEN_DB_FLAGS_DEFAULT, "localName", p); dbDate=GWEN_DB_GetGroup(dcfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST,"execDate"); if (!dbDate) dbDate=GWEN_DB_GetGroup(dcfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); if (dbDate) { GWEN_DB_NODE *dbX; dbX=GWEN_DB_GetGroup(xa, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "date"); assert(dbX); GWEN_DB_AddGroupChildren(dbX, dbDate); } rv=AHB_DTAUS__ParseSetC(src, pos, xa, sumEUR, sumDEM, sumBankCodes, sumAccountIds); if (rv==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in C set"); GWEN_DB_Group_free(xa); GWEN_DB_Group_free(dcfg); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } DBG_INFO(AQBANKING_LOGDOMAIN, "Size of C set was %d", rv); pos+=rv; GWEN_DB_AddGroup(cfg, xa); } /* if C set */ else if (sn=='E') { DBG_INFO(AQBANKING_LOGDOMAIN, "Reading E set (pos=%d)", pos); /* E set, check */ rv=AHB_DTAUS__ParseSetE(src, pos, cSets, sumEUR, sumDEM, sumBankCodes, sumAccountIds); if (rv==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in E set"); GWEN_DB_Group_free(dcfg); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } hasESet=1; DBG_INFO(AQBANKING_LOGDOMAIN, "Size of E set was %d", rv); pos+=rv; break; } /* if E set */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unknown set \"%c\" at %d", sn, pos+4); GWEN_DB_Group_free(dcfg); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } } /* for */ if (!hasESet) { DBG_WARN(AQBANKING_LOGDOMAIN, "DTAUS record does not have an E set"); } GWEN_DB_Group_free(dcfg); dcfg=GWEN_DB_GetGroup(cfg, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "summary"); assert(dcfg); GWEN_DB_SetIntValue(dcfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "cSets", cSets); GWEN_DB_SetIntValue(dcfg, GWEN_DB_FLAGS_OVERWRITE_VARS, "isDebitNote", isDebitNote); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return pos; } int AHB_DTAUS__Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags) { GWEN_BUFFER *src; int rv; unsigned int pos; src=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AddMode(src, GWEN_BUFFER_MODE_USE_SYNCIO); GWEN_Buffer_SetSourceSyncIo(src, sio, 0); pos=0; rv=0; rv=AHB_DTAUS__ReadDocument(src, pos, data); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error reading DTAUS record (%d)", rv); } else { /*GWEN_DB_Dump(data, stderr, 3);*/ } GWEN_Buffer_free(src); return rv; } GWEN_DBIO_CHECKFILE_RESULT AHB_DTAUS__ReallyCheckFile(GWEN_BUFFER *src, unsigned int pos) { int sn; int rv; /* read A set */ DBG_INFO(AQBANKING_LOGDOMAIN, "Checking for A set (pos=%d)", pos); GWEN_Buffer_SetPos(src, pos+4); sn=GWEN_Buffer_PeekByte(src); if (sn==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few data"); return GWEN_DBIO_CheckFileResultNotOk; } if (sn=='A') { GWEN_DB_NODE *dcfg; /* create template */ dcfg=GWEN_DB_Group_new("dcfg"); rv=AHB_DTAUS__ParseSetA(src, pos, dcfg); GWEN_DB_Group_free(dcfg); if (rv==-1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in A set"); return GWEN_DBIO_CheckFileResultNotOk; } pos+=rv; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "DTAUS record does not start with an A set"); return GWEN_DBIO_CheckFileResultNotOk; } return GWEN_DBIO_CheckFileResultOk; } GWEN_DBIO_CHECKFILE_RESULT AHB_DTAUS__CheckFile(GWEN_DBIO *dbio, const char *fname) { GWEN_BUFFER *src; GWEN_DBIO_CHECKFILE_RESULT rv; int rv_int; unsigned int pos; GWEN_SYNCIO *sio; assert(dbio); assert(fname); sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv_int = GWEN_SyncIo_Connect(sio); if (rv_int < 0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv_int); GWEN_SyncIo_free(sio); return GWEN_DBIO_CheckFileResultNotOk; } src=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AddMode(src, GWEN_BUFFER_MODE_USE_SYNCIO); GWEN_Buffer_SetSourceSyncIo(src, sio, 0); pos=0; rv=AHB_DTAUS__ReallyCheckFile(src, pos); GWEN_Buffer_free(src); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus-export.c0000644000175000017500000006057612364015477021137 00000000000000/*************************************************************************** begin : Thu Apr 29 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dtaus_p.h" #include "dtaus-export_p.h" #include #include #include #include #include #include #include #include #ifdef HAVE_LOCALE_H # include #endif /* TODO: AHB_DTAUS__AddWord transforms a given word into the DTA charset. * This might change the size of the word in bytes, so this transformation * should really be left to the caller... */ int AHB_DTAUS__ToDTA(int c) { if (isdigit(c)) return c; if (c>='A' && c<='Z') return c; if (c>='a' && c<='z') return toupper(c); if (strchr(" .,&-+*%/$", c)) return c; switch(c) { case 0xc4 : return 0x5b; // A umlaut case 0xd6 : return 0x5c; // O umlaut case 0xdc : return 0x5d; // U umlaut case 0xdf : return 0x7e; // szlig default: break; } /* switch */ return 0; } int AHB_DTAUS__AddWord(GWEN_BUFFER *dst, unsigned int size, const char *s) { unsigned int i; unsigned int ssize; GWEN_BUFFER *nbuf; assert(dst); assert(size); assert(s); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding word: %s", s); nbuf=GWEN_Buffer_new(0, size, 0, 1); AB_ImExporter_Utf8ToDta(s, -1, nbuf); s=GWEN_Buffer_GetStart(nbuf); ssize=strlen(s); if (ssize>size) { /* Error out here because e.g. truncated accountid will lead to failed jobs. */ DBG_ERROR(AQBANKING_LOGDOMAIN, "Word \"%s\" too long: Has length %d but must not be longer than %d characters", s, ssize, size); return -1; } for (i=0; i=ssize) c=0; else c=s[i]; if (c) GWEN_Buffer_AppendByte(dst, c); else GWEN_Buffer_AppendByte(dst, ' '); } /* for */ GWEN_Buffer_free(nbuf); return 0; } int AHB_DTAUS__AddDtaWord(GWEN_BUFFER *dst, unsigned int size, const char *s) { unsigned int i; unsigned int ssize; assert(dst); assert(size); assert(s); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding DTA word: %s", s); ssize=strlen(s); if (ssize>size) { /* Error out here because e.g. truncated accountid will lead to failed jobs. */ DBG_ERROR(AQBANKING_LOGDOMAIN, "Word \"%s\" too long: Has length %d but must not be longer than %d characters", s, ssize, size); return -1; } for (i=0; i=ssize) c=0; else c=s[i]; if (c) GWEN_Buffer_AppendByte(dst, c); else GWEN_Buffer_AppendByte(dst, ' '); } /* for */ return 0; } int AHB_DTAUS__AddNum(GWEN_BUFFER *dst, unsigned int size, const char *s) { unsigned int i, j; assert(dst); assert(s); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding num : %s", s); i=strlen(s); if (i>size) { /* Error out here because e.g. truncated BLZ will lead to failed jobs. */ DBG_ERROR(AQBANKING_LOGDOMAIN, "Number \"%s\" too long: Has length %d but must not be longer than %d characters", s, i, size); return -1; } j=size-i; if (j) { unsigned int k; for (k=0; k14) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many purpose lines (maxmimum is 14)"); GWEN_StringList_free(purposeList); return -1; } slen=strlen(p); nbuf=GWEN_Buffer_new(0, slen+1, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, nbuf); p=GWEN_Buffer_GetStart(nbuf); while(*p) { while(*p>0 && *p<33) p++; slen=strlen(p); if (slen==0) break; else if (slen>27) { char *ns; ns=(char*) malloc(28); assert(ns); memmove(ns, p, 27); ns[27]=0; /* let stringlist take over ownership of the the string */ GWEN_StringList_AppendString(purposeList, ns, 1, 0); p+=27; } else { GWEN_StringList_AppendString(purposeList, p, 0, 0); break; } } GWEN_Buffer_free(nbuf); } /* for */ //startPos=GWEN_Buffer_GetPos(dst); GWEN_Buffer_AllocRoom(dst, 256); isDebitNote=(strcasecmp(GWEN_DB_GetCharValue(cfg, "type", 0, "transfer"), "debitnote")==0); isEuro=(strcasecmp(GWEN_DB_GetCharValue(cfg, "currency", 0, "EUR"), "EUR")==0); /* compute number of extension sets */ extSets=0; /* add purpose */ if (GWEN_StringList_Count(purposeList)) extSets+=GWEN_StringList_Count(purposeList)-1; /* add name */ for (i=1; i<2; i++) { /* max 1 extset for local name */ if (GWEN_DB_GetCharValue(xa, "localName", i, 0)==0) break; if (i>1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many name lines (maxmimum is 2)"); GWEN_StringList_free(purposeList); return -1; } extSets++; } /* for */ /* add other name */ for (i=1; i<2; i++) { /* max 1 extset for remote name */ if (GWEN_DB_GetCharValue(xa, "remoteName", i, 0)==0) break; if (i>1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many peer name lines (maxmimum is 2)"); GWEN_StringList_free(purposeList); return -1; } extSets++; } /* for */ /* check number of extension sets */ if (extSets>15) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many extension sets (%d)", extSets); GWEN_StringList_free(purposeList); return -1; } /* ______________________________________________________________________ * actually write C set */ /* field 1, 2: record header */ snprintf(buffer, sizeof(buffer), "%04d", 187+(extSets*29)); GWEN_Buffer_AppendString(dst, buffer); GWEN_Buffer_AppendByte(dst, 'C'); /* field 3: acting bank code */ if (AHB_DTAUS__AddNum(dst, 8, GWEN_DB_GetCharValue(cfg, "bankCode", 0, ""))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 4: destination bank code */ p=GWEN_DB_GetCharValue(xa, "remoteBankCode", 0, 0); if (p) { val=AB_Value_fromString(p); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad bank code"); GWEN_StringList_free(purposeList); return -1; } AB_Value_AddValue(sumBankCodes, val); AB_Value_free(val); if (AHB_DTAUS__AddNum(dst, 8, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Peer bank code missing"); GWEN_StringList_free(purposeList); return -1; } /* field 5: destination account id */ p=GWEN_DB_GetCharValue(xa, "remoteAccountNumber", 0, 0); if (p) { val=AB_Value_fromString(p); if (val==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad account id"); GWEN_StringList_free(purposeList); return -1; } AB_Value_AddValue(sumAccountIds, val); AB_Value_free(val); if (AHB_DTAUS__AddNum(dst, 10, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Peer account id missing"); GWEN_StringList_free(purposeList); return -1; } /* field 6: internal customer number (0s for now) */ for (i=0; i<13; i++) GWEN_Buffer_AppendByte(dst, '0'); /* field 7a: text key */ snprintf(buffer, sizeof(buffer), "%02d", GWEN_DB_GetIntValue(xa, "textkey", 0, isDebitNote?5:51)); if (AHB_DTAUS__AddNum(dst, 2, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 7b: text key extension */ snprintf(buffer, sizeof(buffer), "%03d", GWEN_DB_GetIntValue(xa, "textkeyext", 0, 0)); if (AHB_DTAUS__AddNum(dst, 3, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 8: bank internal field */ GWEN_Buffer_AppendByte(dst, ' '); /* field 9: value in DEM */ if (!isEuro) { val=AB_Value_fromString(GWEN_DB_GetCharValue(xa, "value/value", 0, "0,0")); if (val==NULL || AB_Value_IsZero(val)) { AB_Value_free(val); DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad DEM value:"); GWEN_StringList_free(purposeList); return -1; } AB_Value_AddValue(sumDEM, val); snprintf(buffer, sizeof(buffer), "%011.0f", AB_Value_GetValueAsDouble(val)*100.0); AB_Value_free(val); if (AHB_DTAUS__AddNum(dst, 11, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } else { if (AHB_DTAUS__AddNum(dst, 11, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } /* field 10: local bank code */ p=GWEN_DB_GetCharValue(xa, "localbankCode", 0, 0); if (!p) p=GWEN_DB_GetCharValue(cfg, "bankCode", 0, 0); if (!p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No local bank code"); GWEN_StringList_free(purposeList); return -1; } if (AHB_DTAUS__AddNum(dst, 8, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 11: local account id */ p=GWEN_DB_GetCharValue(xa, "localAccountNumber", 0, 0); if (!p) GWEN_DB_GetCharValue(cfg, "accountId", 0, 0); if (!p) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No local account number"); GWEN_StringList_free(purposeList); return -1; } if (AHB_DTAUS__AddNum(dst, 10, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 12: value in EUR */ if (isEuro) { val=AB_Value_fromString(GWEN_DB_GetCharValue(xa, "value/value", 0, "0,0")); if (val==NULL || AB_Value_IsZero(val)) { AB_Value_free(val); DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad EUR value:"); GWEN_StringList_free(purposeList); return -1; } AB_Value_AddValue(sumEUR, val); snprintf(buffer, sizeof(buffer), "%011.0f", AB_Value_GetValueAsDouble(val)*100.0); AB_Value_free(val); if (AHB_DTAUS__AddNum(dst, 11, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } else { if (AHB_DTAUS__AddNum(dst, 11, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } } /* field 13: blanks */ for (i=0; i<3; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 14a: peer name */ if (AHB_DTAUS__AddWord(dst, 27, GWEN_DB_GetCharValue(xa, "remoteName", 0, ""))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 14b: blanks */ for (i=0; i<8; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 15: name */ if (AHB_DTAUS__AddWord(dst, 27, GWEN_DB_GetCharValue(xa, "localname", 0, ""))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 16: purpose */ p=GWEN_StringList_FirstString(purposeList); if (p==NULL) p=""; if (AHB_DTAUS__AddWord(dst, 27, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } /* field 17a: currency */ if (isEuro) GWEN_Buffer_AppendByte(dst, '1'); else GWEN_Buffer_AppendByte(dst, ' '); /* field 17b: blanks */ for (i=0; i<2; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 18: number of extension sets */ snprintf(buffer, sizeof(buffer), "%02d", extSets); if (AHB_DTAUS__AddNum(dst, 2, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } if (extSets) { unsigned int writtenExtSets=0; /* now append extension sets */ /* add peer name lines */ for (i=1; i<2; i++) { /* max: 1 extset */ unsigned int j; p=GWEN_DB_GetCharValue(xa, "remoteName", i, 0); if (!p) break; /* append extension set */ GWEN_Buffer_AppendString(dst, "01"); if (AHB_DTAUS__AddWord(dst, 27, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } writtenExtSets++; if (writtenExtSets==2) /* 2 ext sets written, so we need to align "C 2.Satzabschnitt" to 128 now */ for (j=0; j<11; j++) GWEN_Buffer_AppendByte(dst, ' '); else if (writtenExtSets>2 && ((writtenExtSets-2) % 4)==0) /* "C 3-5.Satzabschnitt" complete, align to 128 bytes */ for (j=0; j<12; j++) GWEN_Buffer_AppendByte(dst, ' '); } /* for */ /* add purpose lines */ for (i=1; i2 && ((writtenExtSets-2) % 4)==0) /* "C 3-5.Satzabschnitt" complete, align to 128 bytes */ for (j=0; j<12; j++) GWEN_Buffer_AppendByte(dst, ' '); } /* for */ /* add name lines */ for (i=1; i<2; i++) { /* max: 1 extset */ unsigned int j; p=GWEN_DB_GetCharValue(xa, "localname", i, 0); if (!p) break; /* append extension set */ GWEN_Buffer_AppendString(dst, "03"); if (AHB_DTAUS__AddWord(dst, 27, p)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); GWEN_StringList_free(purposeList); return -1; } writtenExtSets++; if (writtenExtSets==2) /* 2 ext sets written, so we need to align "C 2.Satzabschnitt" to 128 now */ for (j=0; j<11; j++) GWEN_Buffer_AppendByte(dst, ' '); else if (writtenExtSets>2 && ((writtenExtSets-2) % 4)==0) /* "C 3-5.Satzabschnitt" complete, align to 128 bytes */ for (j=0; j<12; j++) GWEN_Buffer_AppendByte(dst, ' '); } /* for */ } i=((GWEN_Buffer_GetUsedBytes(dst)+127) & ~127)-GWEN_Buffer_GetUsedBytes(dst); while(i--) GWEN_Buffer_AppendByte(dst, ' '); GWEN_StringList_free(purposeList); return 0; } int AHB_DTAUS__CreateSetE(GWEN_BUFFER *dst, GWEN_DB_NODE *cfg, int csets, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds){ unsigned int i; char buffer[32]; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Creating E set"); /* field 1, 2: record header */ GWEN_Buffer_AppendString(dst, "0128E"); /* field 3: reserved */ for (i=0; i<5; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 4: number of C sets */ snprintf(buffer, sizeof(buffer), "%07d", csets); if (AHB_DTAUS__AddNum(dst, 7, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 5: sum of DEM values */ snprintf(buffer, sizeof(buffer), "%013.0f", AB_Value_GetValueAsDouble(sumDEM)*100.0); if (AHB_DTAUS__AddNum(dst, 13, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 6: sum of peer account ids */ snprintf(buffer, sizeof(buffer), "%017.0f", AB_Value_GetValueAsDouble(sumAccountIds)); if (AHB_DTAUS__AddNum(dst, 17, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 7: sum of peer bank codes */ snprintf(buffer, sizeof(buffer), "%017.0f", AB_Value_GetValueAsDouble(sumBankCodes)); if (AHB_DTAUS__AddNum(dst, 17, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 8: sum of EUR values */ snprintf(buffer, sizeof(buffer), "%013.0f", AB_Value_GetValueAsDouble(sumEUR)*100.0); if (AHB_DTAUS__AddNum(dst, 13, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 9: reserved */ for (i=0; i<51; i++) GWEN_Buffer_AppendByte(dst, ' '); return 0; } int AHB_DTAUS__Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags){ AB_VALUE *sumEUR; AB_VALUE *sumDEM; AB_VALUE *sumBankCodes; AB_VALUE *sumAccountIds; unsigned int cSets; GWEN_BUFFER *dst; GWEN_DB_NODE *gr; int isDebitNote; //int isEuro; const uint8_t *p; uint32_t size; int rv; isDebitNote=(strcasecmp(GWEN_DB_GetCharValue(cfg, "type", 0, "transfer"), "debitnote")==0); //isEuro=(strcasecmp(GWEN_DB_GetCharValue(cfg, "currency", 0, "EUR"), // "EUR")==0); cSets=0; sumEUR=AB_Value_new(); sumDEM=AB_Value_new(); sumBankCodes=AB_Value_new(); sumAccountIds=AB_Value_new(); dst=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_SetHardLimit(dst, AHB_DTAUS_HARDLIMIT); /* create A set */ if (AHB_DTAUS__CreateSetA(dst, cfg)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error creating A set"); GWEN_Buffer_free(dst); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } /* create C sets */ gr=GWEN_DB_GetFirstGroup(data); while(gr) { const char *gn; gn=GWEN_DB_GroupName(gr); if ((isDebitNote && strcasecmp(gn, "debitnote")==0) || (!isDebitNote && (strcasecmp(gn, "transfer")==0 || strcasecmp(gn, "transaction")==0))){ if (AHB_DTAUS__CreateSetC(dst, cfg, gr, sumEUR, sumDEM, sumBankCodes, sumAccountIds)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error creating C set from this data:"); GWEN_DB_Dump(gr, 2); GWEN_Buffer_free(dst); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } cSets++; } /* if group matches */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Ignoring group [%s]", GWEN_DB_GroupName(gr)); } gr=GWEN_DB_GetNextGroup(gr); } /* while */ /* create E set */ if (AHB_DTAUS__CreateSetE(dst, cfg, cSets, sumEUR, sumDEM, sumBankCodes, sumAccountIds)) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error creating E set"); GWEN_Buffer_free(dst); AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); return -1; } AB_Value_free(sumAccountIds); AB_Value_free(sumBankCodes); AB_Value_free(sumDEM); AB_Value_free(sumEUR); /* DTAUS finished, write it */ p=(const uint8_t*)GWEN_Buffer_GetStart(dst); size=GWEN_Buffer_GetUsedBytes(dst); rv=GWEN_SyncIo_WriteForced(sio, p, size); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Broken pipe"); GWEN_Buffer_free(dst); return GWEN_ERROR_IO; } GWEN_Buffer_free(dst); return 0; } aqbanking-5.6.4beta/src/plugins/parsers/dtaus/Makefile.in0000644000175000017500000006750012643540064020366 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/plugins/parsers/dtaus DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/dtaus.xml.in $(top_srcdir)/depcomp $(noinst_HEADERS) \ README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = dtaus.xml CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dbioplugindir)" \ "$(DESTDIR)$(dbioplugindir)" LTLIBRARIES = $(dbioplugin_LTLIBRARIES) am__DEPENDENCIES_1 = dtaus_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_dtaus_la_OBJECTS = dtaus.lo dtaus-import.lo dtaus-export.lo dtaus_la_OBJECTS = $(am_dtaus_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dtaus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(dtaus_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dtaus_la_SOURCES) DIST_SOURCES = $(dtaus_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(dbioplugin_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = \ -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST = README noinst_HEADERS = \ dtaus.h \ dtaus_p.h \ dtaus-import_p.h \ dtaus-export_p.h dbioplugindir = $(aqbanking_plugindir)/dbio dbioplugin_LTLIBRARIES = dtaus.la dbioplugin_DATA = dtaus.xml dtaus_la_SOURCES = \ dtaus.c \ dtaus-import.c \ dtaus-export.c dtaus_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) dtaus_la_LDFLAGS = -no-undefined $(STRIPALL) -module -avoid-version all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/plugins/parsers/dtaus/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/plugins/parsers/dtaus/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): dtaus.xml: $(top_builddir)/config.status $(srcdir)/dtaus.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-dbiopluginLTLIBRARIES: $(dbioplugin_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(dbioplugin_LTLIBRARIES)'; test -n "$(dbioplugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(dbioplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dbioplugindir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dbioplugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dbioplugindir)"; \ } uninstall-dbiopluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(dbioplugin_LTLIBRARIES)'; test -n "$(dbioplugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dbioplugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dbioplugindir)/$$f"; \ done clean-dbiopluginLTLIBRARIES: -test -z "$(dbioplugin_LTLIBRARIES)" || rm -f $(dbioplugin_LTLIBRARIES) @list='$(dbioplugin_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dtaus.la: $(dtaus_la_OBJECTS) $(dtaus_la_DEPENDENCIES) $(EXTRA_dtaus_la_DEPENDENCIES) $(AM_V_CCLD)$(dtaus_la_LINK) -rpath $(dbioplugindir) $(dtaus_la_OBJECTS) $(dtaus_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtaus-export.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtaus-import.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtaus.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dbiopluginDATA: $(dbioplugin_DATA) @$(NORMAL_INSTALL) @list='$(dbioplugin_DATA)'; test -n "$(dbioplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dbioplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dbioplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbioplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dbioplugindir)" || exit $$?; \ done uninstall-dbiopluginDATA: @$(NORMAL_UNINSTALL) @list='$(dbioplugin_DATA)'; test -n "$(dbioplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dbioplugindir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dbioplugindir)" "$(DESTDIR)$(dbioplugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-dbiopluginLTLIBRARIES clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dbiopluginDATA install-dbiopluginLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dbiopluginDATA uninstall-dbiopluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-dbiopluginLTLIBRARIES clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dbiopluginDATA \ install-dbiopluginLTLIBRARIES install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-dbiopluginDATA \ uninstall-dbiopluginLTLIBRARIES sources: for f in $(dtaus_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dbioplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done # 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: aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus-export_p.h0000644000175000017500000000355012364015477021450 00000000000000/*************************************************************************** begin : Thu Apr 29 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_DTAUS_EXPORT_P_H #define AQHBCIBANK_DTAUS_EXPORT_P_H #define AHB_DTAUS_HARDLIMIT (256*1024) #include int AHB_DTAUS__ToDTA(int c); int AHB_DTAUS__AddWord(GWEN_BUFFER *dst, unsigned int size, const char *s); int AHB_DTAUS__AddDtaWord(GWEN_BUFFER *dst, unsigned int size, const char *s); int AHB_DTAUS__AddNum(GWEN_BUFFER *dst, unsigned int size, const char *s); double AHB_DTAUS__string2double(const char *s); int AHB_DTAUS__CreateSetA(GWEN_BUFFER *dst, GWEN_DB_NODE *cfg); int AHB_DTAUS__CreateSetC(GWEN_BUFFER *dst, GWEN_DB_NODE *cfg, GWEN_DB_NODE *xa, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds); int AHB_DTAUS__CreateSetE(GWEN_BUFFER *dst, GWEN_DB_NODE *cfg, int csets, AB_VALUE *sumEUR, AB_VALUE *sumDEM, AB_VALUE *sumBankCodes, AB_VALUE *sumAccountIds); int AHB_DTAUS__Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *data, GWEN_DB_NODE *cfg, uint32_t flags); #endif /* AQHBCIBANK_DTAUS_EXPORT_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus.xml.in0000644000175000017500000000044312364015477020566 00000000000000 @AQBANKING_VERSION_STRING@ Martin Preuss(martin@libchipcard.de) Importer and Exporter for DTAUS This plugin imports and exports German DTAUS data. aqbanking-5.6.4beta/src/plugins/parsers/dtaus/Makefile.am0000644000175000017500000000127712364015477020361 00000000000000INCLUDES = \ -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) \ -I$(top_srcdir)/src/libs/aqbanking EXTRA_DIST=README noinst_HEADERS=\ dtaus.h \ dtaus_p.h \ dtaus-import_p.h \ dtaus-export_p.h dbioplugindir = $(aqbanking_plugindir)/dbio dbioplugin_LTLIBRARIES=dtaus.la dbioplugin_DATA=dtaus.xml dtaus_la_SOURCES=\ dtaus.c \ dtaus-import.c \ dtaus-export.c dtaus_la_LIBADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) dtaus_la_LDFLAGS = -no-undefined $(STRIPALL) -module -avoid-version sources: for f in $(dtaus_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dbioplugin_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/pdsources; \ done aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus_p.h0000644000175000017500000000203312364015477020124 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Thu Apr 29 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_DTAUS_P_H #define AQHBCIBANK_DTAUS_P_H #include GWEN_PLUGIN *dbio_dtaus_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName); GWEN_DBIO *AHB_DTAUS_Factory(GWEN_PLUGIN *pl); GWEN_DBIO_CHECKFILE_RESULT AHB_DTAUS__ReallyCheckFile(GWEN_BUFFER *src, unsigned int pos); GWEN_DBIO_CHECKFILE_RESULT AHB_DTAUS__CheckFile(GWEN_DBIO *dbio, const char *fname); #endif /* AQHBCIBANK_DTAUS_P_H */ aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus.c0000644000175000017500000000253012364015477017602 00000000000000/*************************************************************************** begin : Thu Apr 29 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dtaus_p.h" #include "dtaus-import_p.h" #include "dtaus-export_p.h" #include #include #include #include #include #include #include GWEN_DBIO *AHB_DTAUS_Factory(GWEN_PLUGIN *pl) { GWEN_DBIO *dbio; dbio=GWEN_DBIO_new("dtaus", "Imports and exports DTAUS data"); GWEN_DBIO_SetImportFn(dbio, AHB_DTAUS__Import); GWEN_DBIO_SetExportFn(dbio, AHB_DTAUS__Export); GWEN_DBIO_SetCheckFileFn(dbio, AHB_DTAUS__CheckFile); return dbio; } GWEN_PLUGIN *dbio_dtaus_factory(GWEN_PLUGIN_MANAGER *pm, const char *modName, const char *fileName) { GWEN_PLUGIN *pl; pl=GWEN_DBIO_Plugin_new(pm, modName, fileName); assert(pl); GWEN_DBIO_Plugin_SetFactoryFn(pl, AHB_DTAUS_Factory); return pl; } aqbanking-5.6.4beta/src/plugins/parsers/dtaus/dtaus.h0000644000175000017500000000362212364015477017612 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Thu Apr 29 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQHBCIBANK_DTAUS_H #define AQHBCIBANK_DTAUS_H /** * @defgroup MOD_PLUGIN_DTAUS DTAUS Parser * @ingroup MOD_PLUGINS * *

* This DBIO plugin allows parsing and creating of DTAUS records. *

*

* Every DBIO plugin uses a GWEN_DB which contains the configuration for * the given plugin. For this plugin the configuration is as follows: *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
NameTypeContentMode
typechartransfer, debitnote: type of transactionsrequired
bankCodecharbank code of the executing credit instituterequired
accountIdcharid of the account to be used for the transactionsrequired
currencycharEUR, DEM: currency of all transactionsrequired
execDatechardate of execution for the transactions involvedoptional
custRefcharcustomer referenceoptional
* */ #endif /* AQHBCIBANK_DTAUS_H */ aqbanking-5.6.4beta/src/plugins/parsers/dtaus/README0000644000175000017500000000104712364015477017200 00000000000000This folder contains a parser for the German finance transaction format DTAUS. 1. Variables read from a configuration 1.1. char type This variable contains the type of transactions to export. Possibly values are: - transfer - debitnote (default: "transfer") 1.2. char currency This variable holds the currency (default: "EUR") 1.3. char bankCode Bank code of the issuers bank account. 1.4. char accountId Account id of the issuers bank account. 1.5. char name Name of the issuer. 1.6. char custref Customer referenece (A-set) aqbanking-5.6.4beta/src/plugins/parsers/README0000644000175000017500000000010012364015477016045 00000000000000This folder contains GWEN_DBIO plugins for common data formats. aqbanking-5.6.4beta/src/plugins/Makefile.am0000644000175000017500000000031512364015477015552 00000000000000SUBDIRS=parsers imexporters bankinfo backends sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/test/0000755000175000017500000000000012643540662013074 500000000000000aqbanking-5.6.4beta/src/test/test-dlg-setup.c0000644000175000017500000000163312364015477016045 00000000000000#include #include #include #include int main(int argc, char **argv) { GWEN_GUI *gui; int r; gtk_init(&argc, &argv); gui = Gtk2_Gui_new(); GWEN_Gui_SetGui(gui); { AB_BANKING *ab; ab = AB_Banking_new("test-dlg-setup", NULL, 0); r = AB_Banking_Init(ab); assert(r == 0); r = AB_Banking_OnlineInit(ab); assert(r == 0); { GWEN_DIALOG *dlg; dlg = AB_SetupDialog_new(ab); r = GWEN_Gui_ExecDialog(dlg, 0); if (r <= 0) { printf("Dialog was aborted/rejected\n"); } else { printf("Dialog accepted, all fine\n"); } GWEN_Dialog_free(dlg); } r = AB_Banking_OnlineFini(ab); assert(r == 0); r = AB_Banking_Fini(ab); assert(r == 0); AB_Banking_free(ab); } GWEN_Gui_free(gui); return 0; } aqbanking-5.6.4beta/src/test/Makefile.in0000644000175000017500000006123512643540064015064 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_GWENGUI_GTK2_FALSE@noinst_PROGRAMS = abtest$(EXEEXT) @WITH_GWENGUI_GTK2_TRUE@noinst_PROGRAMS = abtest$(EXEEXT) \ @WITH_GWENGUI_GTK2_TRUE@ test-dlg-setup$(EXEEXT) subdir = src/test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_abtest_OBJECTS = abtest.$(OBJEXT) abtest_OBJECTS = $(am_abtest_OBJECTS) am__DEPENDENCIES_1 = abtest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__test_dlg_setup_SOURCES_DIST = test-dlg-setup.c @WITH_GWENGUI_GTK2_TRUE@am_test_dlg_setup_OBJECTS = \ @WITH_GWENGUI_GTK2_TRUE@ test-dlg-setup.$(OBJEXT) test_dlg_setup_OBJECTS = $(am_test_dlg_setup_OBJECTS) @WITH_GWENGUI_GTK2_TRUE@test_dlg_setup_DEPENDENCIES = \ @WITH_GWENGUI_GTK2_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_GWENGUI_GTK2_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_GWENGUI_GTK2_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_GWENGUI_GTK2_TRUE@ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(abtest_SOURCES) $(test_dlg_setup_SOURCES) DIST_SOURCES = $(abtest_SOURCES) $(am__test_dlg_setup_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) $(GWENGUI_GTK2_CFLAGS) $(GTK2_CFLAGS) abtest_SOURCES = abtest.c abtest_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) @WITH_GWENGUI_GTK2_TRUE@test_dlg_setup_SOURCES = test-dlg-setup.c @WITH_GWENGUI_GTK2_TRUE@test_dlg_setup_LDADD = \ @WITH_GWENGUI_GTK2_TRUE@ $(aqbanking_internal_libs) \ @WITH_GWENGUI_GTK2_TRUE@ $(gwenhywfar_libs) \ @WITH_GWENGUI_GTK2_TRUE@ $(GWENGUI_GTK2_LIBS) \ @WITH_GWENGUI_GTK2_TRUE@ $(GTK2_LIBS) EXTRA_DIST = test-dlg-setup.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list abtest$(EXEEXT): $(abtest_OBJECTS) $(abtest_DEPENDENCIES) $(EXTRA_abtest_DEPENDENCIES) @rm -f abtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(abtest_OBJECTS) $(abtest_LDADD) $(LIBS) test-dlg-setup$(EXEEXT): $(test_dlg_setup_OBJECTS) $(test_dlg_setup_DEPENDENCIES) $(EXTRA_test_dlg_setup_DEPENDENCIES) @rm -f test-dlg-setup$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_dlg_setup_OBJECTS) $(test_dlg_setup_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-dlg-setup.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am #cpptest_SOURCES=cpptest.cpp #cpptest_LDADD = $(aqbanking_internal_libs) $(top_builddir)/src/libs/aqbanking++/libaqbankingpp.la $(gwenhywfar_libs) -lstdc++ sources: for f in $(abtest_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done built_sources: # 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: aqbanking-5.6.4beta/src/test/Makefile.am0000644000175000017500000000140412364015477015050 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) $(all_includes) $(GWENGUI_GTK2_CFLAGS) $(GTK2_CFLAGS) if WITH_GWENGUI_GTK2 noinst_PROGRAMS=abtest test-dlg-setup else noinst_PROGRAMS=abtest endif abtest_SOURCES=abtest.c abtest_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) if WITH_GWENGUI_GTK2 test_dlg_setup_SOURCES = test-dlg-setup.c test_dlg_setup_LDADD = \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) \ $(GWENGUI_GTK2_LIBS) \ $(GTK2_LIBS) endif EXTRA_DIST = test-dlg-setup.c #cpptest_SOURCES=cpptest.cpp #cpptest_LDADD = $(aqbanking_internal_libs) $(top_builddir)/src/libs/aqbanking++/libaqbankingpp.la $(gwenhywfar_libs) -lstdc++ sources: for f in $(abtest_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done built_sources: aqbanking-5.6.4beta/src/test/abtest.c0000644000175000017500000006704012364015477014452 00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int test1(int argc, char **argv) { AB_BANKING *ab; int rv; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", "./aqbanking.conf", 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test3(int argc, char **argv) { AB_BANKING *ab; int rv; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", "./aqbanking.conf", 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test5(int argc, char **argv) { int rv; GWEN_DB_NODE *db; GWEN_DB_NODE *dbParams; db=GWEN_DB_Group_new("test"); dbParams=GWEN_DB_Group_new("params"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "params/type", "mt940"); rv=GWEN_DB_ReadFileAs(db, "test.swift", "swift", dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(0, "Error reading file"); return 2; } GWEN_DB_Dump(db, 2); return 0; } int test6(int argc, char **argv) { int rv; GWEN_DB_NODE *db; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbT; GWEN_DB_NODE *dbOut; FILE *f; int first=1; db=GWEN_DB_Group_new("test"); dbParams=GWEN_DB_Group_new("params"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "quote", "1"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "title", "0"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "delimiter", "SPACE"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "group", "country"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/1", "v[0]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/2", "v[1]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/3", "v[2]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/4", "v[3]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/5", "v[4]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/6", "v[5]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/7", "v[6]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/8", "v[7]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/9", "v[8]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/10", "v[9]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/11", "v[10]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/12", "v[11]"); rv=GWEN_DB_ReadFileAs(db, "test.txt", "csv", dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(0, "Error reading file"); return 2; } GWEN_DB_Dump(db, 2); dbOut=GWEN_DB_Group_new("out"); GWEN_DB_ClearGroup(dbParams, 0); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "quote", "1"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "title", "0"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "delimiter", ";"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "group", "country"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/1", "v[0]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/2", "v[1]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/3", "v[2]"); dbT=GWEN_DB_FindFirstGroup(db, "country"); while(dbT) { int cnt; int i; GWEN_BUFFER *buf; GWEN_DB_NODE *dbX; dbX=GWEN_DB_GetGroup(dbOut, GWEN_PATH_FLAGS_CREATE_GROUP, "country"); assert(dbX); buf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; ; i++) { if (GWEN_DB_GetCharValue(dbT, "v", i, 0)==0) break; } cnt=i; for (i=0; i<(cnt-3); i++) { if (GWEN_Buffer_GetUsedBytes(buf)) GWEN_Buffer_AppendByte(buf, ' '); GWEN_Buffer_AppendString(buf, GWEN_DB_GetCharValue(dbT, "v", i, 0)); } GWEN_DB_SetCharValue(dbX, GWEN_DB_FLAGS_DEFAULT, "v", GWEN_Buffer_GetStart(buf)); /* second column */ GWEN_DB_SetCharValue(dbX, GWEN_DB_FLAGS_DEFAULT, "v", GWEN_DB_GetCharValue(dbT, "v", i++, 0)); /* fourth column */ GWEN_DB_SetCharValue(dbX, GWEN_DB_FLAGS_DEFAULT, "v", GWEN_DB_GetCharValue(dbT, "v", ++i, 0)); dbT=GWEN_DB_FindNextGroup(dbT, "country"); } rv=GWEN_DB_WriteFileAs(dbOut, "countries.csv", "csv", dbParams, GWEN_DB_FLAGS_DEFAULT); if (rv) { DBG_ERROR(0, "Error writing file"); return 2; } f=fopen("countries.c", "w+"); assert(f); dbT=GWEN_DB_FindFirstGroup(db, "country"); first=1; fprintf(f, "ab_country_list= {\n"); while(dbT) { int cnt; int i; int j; GWEN_BUFFER *buf; GWEN_DB_NODE *dbX; if (first) { first=0; } else { fprintf(f, ",\n"); } dbX=GWEN_DB_GetGroup(dbOut, GWEN_PATH_FLAGS_CREATE_GROUP, "country"); assert(dbX); buf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; ; i++) { if (GWEN_DB_GetCharValue(dbT, "v", i, 0)==0) break; } cnt=i; for (i=0; i<(cnt-3); i++) { if (GWEN_Buffer_GetUsedBytes(buf)) GWEN_Buffer_AppendByte(buf, ' '); GWEN_Buffer_AppendString(buf, GWEN_DB_GetCharValue(dbT, "v", i, 0)); } fprintf(f, "{ I18N_NOOP(\"%s\"), ", GWEN_Buffer_GetStart(buf)); fprintf(f, "\"%s\", ", GWEN_DB_GetCharValue(dbT, "v", i++, 0)); if (sscanf(GWEN_DB_GetCharValue(dbT, "v", ++i, 0), "%d", &j)!=1) { fprintf(stderr, "ERROR in country %s\n", GWEN_Buffer_GetStart(buf)); return 2; } fprintf(f, "%d }", j); dbT=GWEN_DB_FindNextGroup(dbT, "country"); } /* while */ fprintf(f, "\n}\n"); if (fclose(f)) { fprintf(stderr, "Could not close.\n"); return 3; } return 0; } int readCSVCountries(const char *fname, GWEN_DB_NODE *db) { int rv; GWEN_DB_NODE *dbParams; dbParams=GWEN_DB_Group_new("params"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "quote", "1"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "title", "0"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "delimiter", "SPACE"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "group", "country"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/1", "v[0]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/2", "v[1]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/3", "v[2]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/4", "v[3]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/5", "v[4]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/6", "v[5]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/7", "v[6]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/8", "v[7]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/9", "v[8]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/10", "v[9]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/11", "v[10]"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_DEFAULT, "columns/12", "v[11]"); rv=GWEN_DB_ReadFileAs(db, fname, "csv", dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { DBG_ERROR(0, "Error reading file"); return 2; } return 0; } int readXMLCountries(const char *fname, GWEN_DB_NODE *dbCountries) { GWEN_XMLNODE *nRoot; GWEN_XMLNODE *nRow; GWEN_Logger_SetLevel(GWEN_LOGDOMAIN, GWEN_LoggerLevel_Info); nRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); if (GWEN_XML_ReadFile(nRoot, fname, GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS)) { DBG_ERROR(0, "Could not read XML file.\n"); return 2; } nRow=GWEN_XMLNode_FindFirstTag(nRoot, "tr", 0, 0); while(nRow) { GWEN_XMLNODE *nCol; GWEN_DB_NODE *dbCountry=0; dbCountry=GWEN_DB_Group_new("country"); nCol=GWEN_XMLNode_FindFirstTag(nRow, "td", 0, 0); if (nCol) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nCol); if (nData) { GWEN_BUFFER *dbuf; const char *s; char *p; dbuf=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_XMLNode_GetData(nData); assert(s); if (GWEN_Text_UnescapeXmlToBuffer(s, dbuf)) { fprintf(stderr, "Error unescaping country \"%s\"", s); return 2; } p=GWEN_Buffer_GetStart(dbuf); if (strlen(p)>1) { p=strchr(p, '('); if (p) { *p=0; GWEN_Text_CondenseBuffer(dbuf); } if (strcasecmp(GWEN_Buffer_GetStart(dbuf), " ")!=0) GWEN_DB_SetCharValue(dbCountry, GWEN_DB_FLAGS_DEFAULT, "countryName", GWEN_Buffer_GetStart(dbuf)); } GWEN_Buffer_free(dbuf); } } if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nCol); if (nData) { GWEN_BUFFER *dbuf; const char *s; char *p; dbuf=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_XMLNode_GetData(nData); assert(s); if (GWEN_Text_UnescapeXmlToBuffer(s, dbuf)) { fprintf(stderr, "Error unescaping country code \"%s\"", s); return 2; } p=GWEN_Buffer_GetStart(dbuf); if (strlen(p)>1) { if (strcasecmp(GWEN_Buffer_GetStart(dbuf), " ")!=0) { p[2]=0; GWEN_DB_SetCharValue(dbCountry, GWEN_DB_FLAGS_DEFAULT, "countryCode", GWEN_Buffer_GetStart(dbuf)); } } GWEN_Buffer_free(dbuf); } } if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nCol); if (nData) { GWEN_BUFFER *dbuf; const char *s; char *p; dbuf=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_XMLNode_GetData(nData); assert(s); if (GWEN_Text_UnescapeXmlToBuffer(s, dbuf)) { fprintf(stderr, "Error unescaping currency name \"%s\"", s); return 2; } p=GWEN_Buffer_GetStart(dbuf); if (strlen(p)>1) { p=strchr(p, '('); if (p) { *p=0; GWEN_Text_CondenseBuffer(dbuf); } if (strcasecmp(GWEN_Buffer_GetStart(dbuf), " ")!=0) GWEN_DB_SetCharValue(dbCountry, GWEN_DB_FLAGS_DEFAULT, "currencyName", GWEN_Buffer_GetStart(dbuf)); } GWEN_Buffer_free(dbuf); } } if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) nCol=GWEN_XMLNode_FindNextTag(nCol, "td", 0, 0); if (nCol) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nCol); if (nData) { GWEN_BUFFER *dbuf; const char *s; char *p; dbuf=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_XMLNode_GetData(nData); assert(s); if (GWEN_Text_UnescapeXmlToBuffer(s, dbuf)) { fprintf(stderr, "Error unescaping currency code \"%s\"", s); return 2; } p=GWEN_Buffer_GetStart(dbuf); if (strlen(p)>2) { if (strcasecmp(GWEN_Buffer_GetStart(dbuf), " ")!=0) { p[3]=0; GWEN_DB_SetCharValue(dbCountry, GWEN_DB_FLAGS_DEFAULT, "currencyCode", GWEN_Buffer_GetStart(dbuf)); } } GWEN_Buffer_free(dbuf); } } if (GWEN_DB_VariableExists(dbCountry, "countryName") && GWEN_DB_VariableExists(dbCountry, "countryCode") && GWEN_DB_VariableExists(dbCountry, "currencyName") && GWEN_DB_VariableExists(dbCountry, "currencyCode")) { GWEN_DB_AddGroup(dbCountries, dbCountry); } else { GWEN_DB_Group_free(dbCountry); } nRow=GWEN_XMLNode_FindNextTag(nRow, "tr", 0, 0); } return 0; } int test7(int argc, char **argv) { const char *fname; GWEN_DB_NODE *dbCountries; int rv; if (argc<3) { fprintf(stderr, "Filename for input needed\n"); return 1; } fname=argv[2]; dbCountries=GWEN_DB_Group_new("countries"); rv=readXMLCountries(fname, dbCountries); if (rv) return rv; GWEN_DB_Dump(dbCountries, 2); return 0; } int packCsvCountries(GWEN_DB_NODE *dbCSV) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbCSV, "country"); while(dbT) { int cnt; int i; int j; GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 256, 0, 1); for (i=0; ; i++) { if (GWEN_DB_GetCharValue(dbT, "v", i, 0)==0) break; } cnt=i; for (i=0; i<(cnt-3); i++) { if (GWEN_Buffer_GetUsedBytes(buf)) GWEN_Buffer_AppendByte(buf, ' '); GWEN_Buffer_AppendString(buf, GWEN_DB_GetCharValue(dbT, "v", i, 0)); } GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "countryName", GWEN_Buffer_GetStart(buf)); GWEN_DB_SetCharValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "countryCode", GWEN_DB_GetCharValue(dbT, "v", i++, 0)); if (sscanf(GWEN_DB_GetCharValue(dbT, "v", ++i, 0), "%d", &j)!=1) { fprintf(stderr, "ERROR in country %s\n", GWEN_Buffer_GetStart(buf)); return 2; } else { GWEN_DB_SetIntValue(dbT, GWEN_DB_FLAGS_OVERWRITE_VARS, "countryNum", j); } GWEN_DB_DeleteVar(dbT, "v"); dbT=GWEN_DB_FindNextGroup(dbT, "country"); } /* while */ return 0; } int test8(int argc, char **argv) { const char *fnameXML, *fnameCSV; GWEN_DB_NODE *dbXML; GWEN_DB_NODE *dbCSV; GWEN_DB_NODE *dbC; GWEN_DB_NODE *dbT; FILE *f; int first; int rv; if (argc<4) { fprintf(stderr, "Filenames for input needed (XML, CSV)\n"); return 1; } fnameXML=argv[2]; fnameCSV=argv[3]; dbXML=GWEN_DB_Group_new("countries"); dbCSV=GWEN_DB_Group_new("countries"); rv=readCSVCountries(fnameCSV, dbCSV); if (rv) { fprintf(stderr, "Error reading CSV countries\n"); return rv; } rv=packCsvCountries(dbCSV); if (rv) { fprintf(stderr, "Error packing CSV countries\n"); return rv; } //GWEN_DB_Dump(dbCSV, stderr, 4); rv=readXMLCountries(fnameXML, dbXML); if (rv) return rv; dbC=GWEN_DB_GetFirstGroup(dbXML); while(dbC) { const char *code; code=GWEN_DB_GetCharValue(dbC, "countryCode", 0, 0); if (code) { dbT=GWEN_DB_GetFirstGroup(dbCSV); while(dbT) { const char *s; s=GWEN_DB_GetCharValue(dbT, "countryCode", 0, 0); if (s) { if (strcasecmp(s, code)==0) break; } dbT=GWEN_DB_GetNextGroup(dbT); } if (!dbT) { DBG_ERROR(0, "Country \"%s\" not found", code); } else { int nc; nc=GWEN_DB_GetIntValue(dbT, "countryNum", 0, 0); if (nc) { DBG_ERROR(0, "Setting country code %s=%d", code, nc); GWEN_DB_SetIntValue(dbC, GWEN_DB_FLAGS_OVERWRITE_VARS, "countryNum", nc); } else { DBG_ERROR(0, "Country \"%s\" has no number", code); GWEN_DB_Dump(dbT, 2); } } } else { DBG_ERROR(0, "No country code"); } dbC=GWEN_DB_GetNextGroup(dbC); } f=fopen("countries2.c", "w+"); assert(f); dbT=GWEN_DB_FindFirstGroup(dbXML, "country"); first=1; fprintf(f, "ab_country_list= {\n"); while(dbT) { const char *s; int i; if (first) { first=0; } else { fprintf(f, ",\n"); } i=GWEN_DB_GetIntValue(dbT, "countryNum", 0, 0); if (i!=280) { if (i==276) { s=GWEN_DB_GetCharValue(dbT, "countryName", 0, 0); assert(s); fprintf(f, "{ I18N_NOOP(\"%s\"), ", s); s=GWEN_DB_GetCharValue(dbT, "countryCode", 0, 0); assert(s); fprintf(f, "\"%s\",", s); i=GWEN_DB_GetIntValue(dbT, "countryNum", 0, 0); fprintf(f, " %d,", 280); s=GWEN_DB_GetCharValue(dbT, "currencyName", 0, 0); assert(s); fprintf(f, " I18N_NOOP(\"%s\"), ", s); s=GWEN_DB_GetCharValue(dbT, "currencyCode", 0, 0); assert(s); fprintf(f, " \"%s\" }", s); fprintf(f, ",\n"); } s=GWEN_DB_GetCharValue(dbT, "countryName", 0, 0); assert(s); fprintf(f, "{ I18N_NOOP(\"%s\"), ", s); s=GWEN_DB_GetCharValue(dbT, "countryCode", 0, 0); assert(s); fprintf(f, "\"%s\",", s); fprintf(f, " %d,", i); s=GWEN_DB_GetCharValue(dbT, "currencyName", 0, 0); assert(s); fprintf(f, " I18N_NOOP(\"%s\"), ", s); s=GWEN_DB_GetCharValue(dbT, "currencyCode", 0, 0); assert(s); fprintf(f, " \"%s\" }", s); } dbT=GWEN_DB_FindNextGroup(dbT, "country"); } /* while */ fprintf(f, "\n}\n"); if (fclose(f)) { fprintf(stderr, "Could not close.\n"); return 3; } GWEN_DB_Dump(dbXML, 2); return 0; } int test9(int argc, char **argv) { AB_BANKING *ab; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; int rv; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0, 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); AB_BankInfo_SetLocation(tbi, "Wilhelmshaven"); rv=AB_Banking_GetBankInfoByTemplate(ab, "de", tbi, bl); if (rv) { fprintf(stderr, "Error looking for bank info: %d\n", rv); return 2; } bit=AB_BankInfo_List2_First(bl); if (bit) { AB_BANKINFO *bi; int count=0; fprintf(stdout, "Found the following banks:\n"); bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); while(bi) { count++; fprintf(stdout, "%5d %s %s %s\n", count, AB_BankInfo_GetBankId(bi), AB_BankInfo_GetBankName(bi), AB_BankInfo_GetLocation(bi)); bi=AB_BankInfo_List2Iterator_Next(bit); } AB_BankInfo_List2Iterator_free(bit); } AB_BankInfo_List2_free(bl); fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test10(int argc, char **argv) { AB_BANKING *ab; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; int rv; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0, 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); AB_BankInfo_SetBankId(tbi, "28250110"); rv=AB_Banking_GetBankInfoByTemplate(ab, "de", tbi, bl); if (rv) { fprintf(stderr, "Error looking for bank info: %d\n", rv); return 2; } bit=AB_BankInfo_List2_First(bl); if (bit) { AB_BANKINFO *bi; int count=0; fprintf(stdout, "Found the following banks:\n"); bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); while(bi) { count++; fprintf(stdout, "%5d %s %s %s\n", count, AB_BankInfo_GetBankId(bi), AB_BankInfo_GetBankName(bi), AB_BankInfo_GetLocation(bi)); bi=AB_BankInfo_List2Iterator_Next(bit); } AB_BankInfo_List2Iterator_free(bit); } AB_BankInfo_List2_free(bl); fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test11(int argc, char **argv) { AB_BANKING *ab; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; int rv; GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Notice); fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0, 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); rv=AB_Banking_GetBankInfoByTemplate(ab, "de", tbi, bl); if (rv) { fprintf(stderr, "Error looking for bank info: %d\n", rv); return 2; } bit=AB_BankInfo_List2_First(bl); if (bit) { AB_BANKINFO *bi; int count=0; fprintf(stdout, "Found the following banks:\n"); bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); while(bi) { count++; fprintf(stdout, "%5d %s %s %s\n", count, AB_BankInfo_GetBankId(bi), AB_BankInfo_GetBankName(bi), AB_BankInfo_GetLocation(bi)); bi=AB_BankInfo_List2Iterator_Next(bit); } AB_BankInfo_List2Iterator_free(bit); } AB_BankInfo_List2_free(bl); AB_BankInfo_free(tbi); fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test12(int argc, char **argv) { AB_BANKING *ab; AB_BANKINFO_LIST2 *bl; AB_BANKINFO_LIST2_ITERATOR *bit; AB_BANKINFO *tbi; int rv; const char *country; GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Error); if (argc<3) { fprintf(stderr, "Country code needed.\n"); return 1; } country=argv[2]; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0, 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } bl=AB_BankInfo_List2_new(); tbi=AB_BankInfo_new(); rv=AB_Banking_GetBankInfoByTemplate(ab, country, tbi, bl); if (rv) { fprintf(stderr, "Error looking for bank info: %d\n", rv); return 2; } bit=AB_BankInfo_List2_First(bl); if (bit) { AB_BANKINFO *bi; int count=0; fprintf(stdout, "Found the following banks:\n"); bi=AB_BankInfo_List2Iterator_Data(bit); assert(bi); while(bi) { count++; fprintf(stdout, "%5d %s %s %s\n", count, AB_BankInfo_GetBankId(bi), AB_BankInfo_GetBankName(bi), AB_BankInfo_GetLocation(bi)); bi=AB_BankInfo_List2Iterator_Next(bit); } AB_BankInfo_List2Iterator_free(bit); } AB_BankInfo_List2_free(bl); AB_BankInfo_free(tbi); fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); fprintf(stderr, "Finished\n"); return 0; } int test13(int argc, char **argv) { int rv; const char *iban; GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Error); if (argc<3) { fprintf(stderr, "IBAN needed.\n"); return 1; } iban=argv[2]; /* fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } */ rv=AB_Banking_CheckIban(iban); fprintf(stderr, "Result for IBAN \"%s\": %d\n", iban, rv); /* fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); */ fprintf(stderr, "Finished\n"); return 0; } int test15(int argc, char **argv) { AB_BANKING *ab; int rv; GWEN_DBIO *dbio; const char *fname; GWEN_DB_NODE *dbParams; GWEN_DB_NODE *dbData; GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Error); if (argc<3) { fprintf(stderr, "Usage: %s FILENAME\n", argv[0]); return 1; } fname=argv[2]; fprintf(stderr, "Creating AB_Banking...\n"); ab=AB_Banking_new("abtest", 0, 0); fprintf(stderr, "Initializing AB_Banking...\n"); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Could not init AqBanking (%d)\n", rv); return 2; } dbio=GWEN_DBIO_GetPlugin("swift"); if (dbio==NULL) { fprintf(stderr, "SWIFT plugin not found.\n"); return 2; } dbParams=GWEN_DB_Group_new("params"); dbData=GWEN_DB_Group_new("data"); rv=GWEN_DBIO_ImportFromFile(dbio, fname, dbData, dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv) { fprintf(stderr, "Error on import (%d)\n", rv); return 2; } fprintf(stderr, "Deinitializing AB_Banking...\n"); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Could not deinit AqBanking (%d)\n", rv); return 2; } fprintf(stderr, "Freeing AB_Banking...\n"); AB_Banking_free(ab); GWEN_DB_Dump(dbData, 2); fprintf(stderr, "Finished\n"); return 0; } int testDate(int argc, char **argv) { GWEN_TIME *ti; int y,m,d; if (argc<4) { fprintf(stderr, "Usage: %s msg XMLFILE DATAFILE\n", argv[0]); return 1; } ti=AB_ImExporter_DateFromString(argv[2], argv[3], 1); assert(ti); GWEN_Time_GetBrokenDownDate(ti, &d, &m, &y); DBG_ERROR(0, "Date: %02d %02d %04d", d, m, y); return 0; } int main(int argc, char **argv) { const char *cmd; int rv; if (argc<2) { fprintf(stderr, "Usage: %s COMMAND\n", argv[0]); return 1; } cmd=argv[1]; GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Info); if (strcasecmp(cmd, "test1")==0) rv=test1(argc, argv); else if (strcasecmp(cmd, "test3")==0) rv=test3(argc, argv); else if (strcasecmp(cmd, "test5")==0) rv=test5(argc, argv); else if (strcasecmp(cmd, "test6")==0) rv=test6(argc, argv); else if (strcasecmp(cmd, "test7")==0) rv=test7(argc, argv); else if (strcasecmp(cmd, "test8")==0) rv=test8(argc, argv); else if (strcasecmp(cmd, "test9")==0) rv=test9(argc, argv); else if (strcasecmp(cmd, "test10")==0) rv=test10(argc, argv); else if (strcasecmp(cmd, "test11")==0) rv=test11(argc, argv); else if (strcasecmp(cmd, "test12")==0) rv=test12(argc, argv); else if (strcasecmp(cmd, "test13")==0) rv=test13(argc, argv); else if (strcasecmp(cmd, "test15")==0) rv=test15(argc, argv); else if (strcasecmp(cmd, "date")==0) rv=testDate(argc, argv); else { fprintf(stderr, "Unknown command \"%s\"", cmd); rv=1; } return rv; } aqbanking-5.6.4beta/src/Makefile.in0000644000175000017500000006003712643540054014103 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = libs plugins tools test all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/Makefile.am0000644000175000017500000000027612364015477014077 00000000000000SUBDIRS=libs plugins tools test sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/libs/0000755000175000017500000000000012643540652013045 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/0000755000175000017500000000000012643540652015000 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/country.c0000644000175000017500000005010012364015477016565 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "country_p.h" #include "i18n_l.h" #include #include GWEN_CONSTLIST2_FUNCTIONS(AB_COUNTRY, AB_Country) static AB_COUNTRY ab_country_list[]= { { I18N_NOOP("Albania"), "AL", 8, I18N_NOOP("Lek"), "ALL" }, { I18N_NOOP("Algeria"), "DZ", 12, I18N_NOOP("Algerian Dinar"), "DZD" }, { I18N_NOOP("American Samoa"), "AS", 16, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Andorra"), "AD", 20, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Angola"), "AO", 24, I18N_NOOP("New Kwanza "), "AON" }, { I18N_NOOP("Anguilla"), "AI", 660, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Antarctica"), "AQ", 10, I18N_NOOP("Norwegian Krone"), "NOK" }, { I18N_NOOP("Antigua and Barbuda"), "AG", 28, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Argentina"), "AR", 32, I18N_NOOP("Austral and Argenintinian Neuvo Peso "), "ARA" }, { I18N_NOOP("Armenia"), "AM", 51, I18N_NOOP("Dram "), "AMD" }, { I18N_NOOP("Aruba"), "AW", 533, I18N_NOOP("Aruban Guilder "), "AWG" }, { I18N_NOOP("Australia"), "AU", 36, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Austria"), "AT", 40, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Azerbaijan"), "AZ", 31, I18N_NOOP("Azerbaijani Manat "), "AZM" }, { I18N_NOOP("Bahrain"), "BH", 48, I18N_NOOP("Bahraini Dinar"), "BHD" }, { I18N_NOOP("Bangladesh"), "BD", 50, I18N_NOOP("Taka"), "BDT" }, { I18N_NOOP("Barbados"), "BB", 52, I18N_NOOP("Barbados Dollar"), "BBD" }, { I18N_NOOP("Belgium"), "BE", 56, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Belize"), "BZ", 84, I18N_NOOP("Belize Dollar"), "BZD" }, { I18N_NOOP("Benin"), "BJ", 204, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Bermuda"), "BM", 60, I18N_NOOP("Bermudian Dollar"), "BMD" }, { I18N_NOOP("Bhutan"), "BT", 64, I18N_NOOP("Ngultrum "), "BTN" }, { I18N_NOOP("Bolivia"), "BO", 68, I18N_NOOP("Boliviano and Bolivian Peso"), "BOB" }, { I18N_NOOP("Bosnia & Herzegowina"), "BA", 70, I18N_NOOP("Convertible Mark"), "BAM" }, { I18N_NOOP("Botswana"), "BW", 72, I18N_NOOP("Pula"), "BWP" }, { I18N_NOOP("Bouvet Island"), "BV", 74, I18N_NOOP("Norwegian Krone"), "NOK" }, { I18N_NOOP("Brazil"), "BR", 76, I18N_NOOP("Cruzeiro Real"), "BRR" }, { I18N_NOOP("British Indian Ocean Territory"), "IO", 86, I18N_NOOP("Pound Sterling "), "GBP" }, { I18N_NOOP("Brunei Darussalam"), "BN", 96, I18N_NOOP("Brunei Dollar"), "BND" }, { I18N_NOOP("Bulgaria"), "BG", 100, I18N_NOOP("Lev"), "BGL" }, { I18N_NOOP("Burkina Faso"), "BF", 854, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Burundi"), "BI", 108, I18N_NOOP("Burundi Franc"), "BIF" }, { I18N_NOOP("Cameroon"), "CM", 120, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Canada"), "CA", 124, I18N_NOOP("Canadian Dollar"), "CAD" }, { I18N_NOOP("Cape Verde"), "CV", 132, I18N_NOOP("Escudo Caboverdiano"), "CVE" }, { I18N_NOOP("Cayman Islands"), "KY", 136, I18N_NOOP("Cayman Islands Dollar"), "KYD" }, { I18N_NOOP("Central African Republic"), "CF", 140, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Chad"), "TD", 148, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Chili"), "CL", 152, I18N_NOOP("Unidades de Fomento and Chilean Peso"), "CLF" }, { I18N_NOOP("China"), "CN", 156, I18N_NOOP("Yuan Renminbi"), "CNY" }, { I18N_NOOP("Christmas Island"), "CX", 162, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Cocos "), "CC", 166, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Colombia"), "CO", 170, I18N_NOOP("Colombian Peso"), "COP" }, { I18N_NOOP("Comoros"), "KM", 174, I18N_NOOP("Comorian Franc"), "KMF" }, { I18N_NOOP("Congo"), "CG", 178, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Cook Islands"), "CK", 184, I18N_NOOP("New Zealand Dollar"), "NZD" }, { I18N_NOOP("Costa Rica"), "CR", 188, I18N_NOOP("Costa Rican Colón"), "CRC" }, { I18N_NOOP("Cuba"), "CU", 192, I18N_NOOP("Cuban Peso"), "CUP" }, { I18N_NOOP("Cyprus"), "CY", 196, I18N_NOOP("Cypriot Pound"), "CYP" }, { I18N_NOOP("Djibouti"), "DJ", 262, I18N_NOOP("Djibouti Franc"), "DJF" }, { I18N_NOOP("Dominica"), "DM", 212, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Dominican Republic"), "DO", 214, I18N_NOOP("Dominican Republic Peso"), "DOP" }, { I18N_NOOP("Ecuador"), "EC", 218, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Egypt"), "EG", 818, I18N_NOOP("Egytian Pound"), "EGP" }, { I18N_NOOP("El Salvador"), "SV", 222, I18N_NOOP("El Salvadorian Colón"), "SVC" }, { I18N_NOOP("Equatorial Guinea"), "GQ", 226, I18N_NOOP("Franc de la Communauté financière africaine and Ekwele"), "XAF" }, { I18N_NOOP("Eritrea"), "ER", 232, I18N_NOOP("Eritreian Nakfa, Ethiopian Birr"), "ERN" }, { I18N_NOOP("Estonia"), "EE", 233, I18N_NOOP("Kroon"), "EEK" }, { I18N_NOOP("Ethiopia"), "ET", 231, I18N_NOOP("Birr"), "ETB" }, { I18N_NOOP("European Community"), "??", 0, I18N_NOOP("Euro "), "EUR" }, { I18N_NOOP("Falkland Islands"), "FK", 238, I18N_NOOP("Falkland Pound"), "FKP" }, { I18N_NOOP("Faroe Islands"), "FO", 234, I18N_NOOP("Danish Krone"), "DKK" }, { I18N_NOOP("Fiji Islands"), "FJ", 242, I18N_NOOP("Fiji Dollar"), "FJD" }, { I18N_NOOP("Finland"), "FI", 246, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("France"), "FR", 250, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("France, Metropolitan"), "FX", 0, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("French Guiana"), "GF", 254, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("French Polynesia"), "PF", 258, I18N_NOOP("Franc des Comptoirs français du Pacifique"), "XPF" }, { I18N_NOOP("French Southern and Antarctic Territories"), "TF", 260, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Gambia"), "GM", 270, I18N_NOOP("Dalasi"), "GMD" }, { I18N_NOOP("Georgia"), "GE", 268, I18N_NOOP("Lari "), "GEL" }, { I18N_NOOP("Germany "), "DE", 280, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Germany "), "DE", 276, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Ghana"), "GH", 288, I18N_NOOP("Cedi"), "GHC" }, { I18N_NOOP("Gibraltar"), "GI", 292, I18N_NOOP("Gibraltar Pound"), "GIP" }, { I18N_NOOP("Greece"), "GR", 300, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Greenland"), "GL", 304, I18N_NOOP("Danish Krone"), "DKK" }, { I18N_NOOP("Grenada"), "GD", 308, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Guadeloupe"), "GP", 312, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Guam"), "GU", 316, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Guatemala"), "GT", 320, I18N_NOOP("Quetzal"), "GTQ" }, { I18N_NOOP("Guinea"), "GN", 324, I18N_NOOP("Guinea Syli"), "GNS" }, { I18N_NOOP("Guinea-Bissau"), "GW", 624, I18N_NOOP("Guinea-Bissau Peso and Franc de la Communauté financière africaine"), "GWP" }, { I18N_NOOP("Guyana"), "GY", 328, I18N_NOOP("Guyana Dollar"), "GYD" }, { I18N_NOOP("Heard and McDonald Islands"), "HM", 334, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Honduras"), "HN", 340, I18N_NOOP("Lempira"), "HNL" }, { I18N_NOOP("Hong Kong"), "HK", 344, I18N_NOOP("Hong Kong Dollar"), "HKD" }, { I18N_NOOP("Hungary"), "HU", 348, I18N_NOOP("Forint"), "HUF" }, { I18N_NOOP("India"), "IN", 356, I18N_NOOP("Indian Rupee"), "INR" }, { I18N_NOOP("Iran, Islamic Republic of"), "IR", 364, I18N_NOOP("Iranian Rial"), "IRR" }, { I18N_NOOP("Iraq"), "IQ", 368, I18N_NOOP("Iraqi Dinar"), "IQD" }, { I18N_NOOP("Ireland"), "IE", 372, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Israel"), "IL", 376, I18N_NOOP("Shekel"), "ILS" }, { I18N_NOOP("Italy"), "IT", 380, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Japan"), "JP", 392, I18N_NOOP("Yen"), "JPY" }, { I18N_NOOP("Jordan"), "JO", 400, I18N_NOOP("Jordanian Dinar"), "JOD" }, { I18N_NOOP("Kazakhstan"), "KZ", 398, I18N_NOOP("Tenge "), "KZT" }, { I18N_NOOP("Kenya"), "KE", 404, I18N_NOOP("Kenyan Shilling"), "KES" }, { I18N_NOOP("Kiribati"), "KI", 296, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Korea, Democratic People's Republic of "), "KP", 408, I18N_NOOP("North Korean Won"), "KPW" }, { I18N_NOOP("Korea, Republic of "), "KR", 410, I18N_NOOP("South Korean Won"), "KRW" }, { I18N_NOOP("Kuwait"), "KW", 414, I18N_NOOP("Kuwaiti Dinar"), "KWD" }, { I18N_NOOP("Kyrgyzstan"), "KG", 417, I18N_NOOP("Kyrgyzstani Som"), "KGS" }, { I18N_NOOP("Latvia"), "LV", 428, I18N_NOOP("Lats"), "LVL" }, { I18N_NOOP("Lebanon"), "LB", 422, I18N_NOOP("Lebanese Pound"), "LBP" }, { I18N_NOOP("Lesotho"), "LS", 426, I18N_NOOP("Loti, Maloti and South African Rand"), "LSL" }, { I18N_NOOP("Liberia"), "LR", 430, I18N_NOOP("Liberian Dollar"), "LRD" }, { I18N_NOOP("Libyan Arab Jamahiriya"), "LY", 434, I18N_NOOP("Libyan Dinar"), "LYD" }, { I18N_NOOP("Liechtenstein"), "LI", 438, I18N_NOOP("Swiss Franc"), "CHF" }, { I18N_NOOP("Lithuania"), "LT", 440, I18N_NOOP("Litas"), "LTL" }, { I18N_NOOP("Luxembourg"), "LU", 442, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Macedonia, the Former Yugoslav Republic of"), "MK", 807, I18N_NOOP("Macedonian Dinar"), "MKD" }, { I18N_NOOP("Madagascar"), "MG", 450, I18N_NOOP("Malagasy Franc"), "MGF" }, { I18N_NOOP("Malawi"), "MW", 454, I18N_NOOP("Malawian Kwacha"), "MWK" }, { I18N_NOOP("Malaysia"), "MY", 458, I18N_NOOP("Ringgit "), "MYR" }, { I18N_NOOP("Maldives"), "MV", 462, I18N_NOOP("Rufiyaa"), "MVR" }, { I18N_NOOP("Mali"), "ML", 466, I18N_NOOP("Franc de la Communauté financière africaine and Malian Franc"), "XAF" }, { I18N_NOOP("Malta"), "MT", 470, I18N_NOOP("Maltese Lira "), "MTL" }, { I18N_NOOP("Marshall Islands"), "MH", 584, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Martinique"), "MQ", 474, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Mauritania"), "MR", 478, I18N_NOOP("Ouguiya"), "MRO" }, { I18N_NOOP("Mauritius"), "MU", 480, I18N_NOOP("Mauritius Rupee"), "MUR" }, { I18N_NOOP("Mayotte"), "YT", 175, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Mexico"), "MX", 484, I18N_NOOP("Mexican New Peso "), "MXN" }, { I18N_NOOP("Micronesia, Federated States of"), "FM", 583, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Moldova, Republic of"), "MD", 498, I18N_NOOP("Moldovian Leu"), "MDL" }, { I18N_NOOP("Monaco"), "MC", 492, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Mongolia"), "MN", 496, I18N_NOOP("Tugrik"), "MNT" }, { I18N_NOOP("Montserrat"), "MS", 500, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Morocco"), "MA", 504, I18N_NOOP("Moroccan Dirham"), "MAD" }, { I18N_NOOP("Mozambique"), "MZ", 508, I18N_NOOP("Metical"), "MZM" }, { I18N_NOOP("Nauru"), "NR", 520, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Nepal"), "NP", 524, I18N_NOOP("Nepalese Rupee"), "NPR" }, { I18N_NOOP("Netherlands"), "NL", 528, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Netherlands Antilles"), "AN", 530, I18N_NOOP("Netherlands Antilles Guilder "), "ANG" }, { I18N_NOOP("New Caledonia"), "NC", 540, I18N_NOOP("Franc des Comptoirs français du Pacifique"), "XPF" }, { I18N_NOOP("New Zealand"), "NZ", 554, I18N_NOOP("New Zealand Dollar"), "NZD" }, { I18N_NOOP("Nicaragua"), "NI", 558, I18N_NOOP("Córdoba"), "NIC" }, { I18N_NOOP("Niger"), "NE", 562, I18N_NOOP("West African Franc and Franc de la Communauté financière africaine"), "XOF" }, { I18N_NOOP("Nigeria"), "NG", 566, I18N_NOOP("Naira"), "NGN" }, { I18N_NOOP("Niue"), "NU", 570, I18N_NOOP("New Zealand Dollar"), "NZD" }, { I18N_NOOP("Norfolk Island"), "NF", 574, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Northern Mariana Islands"), "MP", 580, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Norway"), "NO", 578, I18N_NOOP("Norwegian Krone"), "NOK" }, { I18N_NOOP("Palau"), "PW", 585, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Panama"), "PA", 591, I18N_NOOP("Balboa and US Dollar"), "PAB" }, { I18N_NOOP("Papua New Guinea"), "PG", 598, I18N_NOOP("Kina"), "PGK" }, { I18N_NOOP("Paraguay"), "PY", 600, I18N_NOOP("Guarani"), "PYG" }, { I18N_NOOP("Peru"), "PE", 604, I18N_NOOP("Inti and New Sol "), "PEI" }, { I18N_NOOP("Philippines"), "PH", 608, I18N_NOOP("Philippines Peso"), "PHP" }, { I18N_NOOP("Pitcairn Island"), "PN", 612, I18N_NOOP("New Zealand Dollar"), "NZD" }, { I18N_NOOP("Poland"), "PL", 616, I18N_NOOP("New Zloty "), "PLN" }, { I18N_NOOP("Portugal"), "PT", 620, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Puerto Rico"), "PR", 630, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Romania"), "RO", 642, I18N_NOOP("Romanian Leu"), "ROL" }, { I18N_NOOP("Russian Federation"), "RU", 643, I18N_NOOP("Russian Federation Rouble"), "RUR" }, { I18N_NOOP("Rwanda"), "RW", 646, I18N_NOOP("Rwanda Franc"), "RWF" }, { I18N_NOOP("Saint Kitts "), "KN", 659, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Saint Lucia"), "LC", 662, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Saint Vincent and the Grenadines"), "VC", 670, I18N_NOOP("East Caribbean Dollar"), "XCD" }, { I18N_NOOP("Samoa"), "WS", 882, I18N_NOOP("Tala"), "WST" }, { I18N_NOOP("San Marino"), "SM", 674, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("São Tomé and Príncipe"), "ST", 678, I18N_NOOP("Dobra"), "STD" }, { I18N_NOOP("Saudi Arabia"), "SA", 682, I18N_NOOP("Saudi Riyal"), "SAR" }, { I18N_NOOP("Senegal"), "SN", 686, I18N_NOOP("West African Franc and Franc de la Communauté financière africaine"), "XOF" }, { I18N_NOOP("Seychelles"), "SC", 690, I18N_NOOP("Seychelles Rupee"), "SCR" }, { I18N_NOOP("Sierra Leone"), "SL", 694, I18N_NOOP("Leone"), "SLL" }, { I18N_NOOP("Singapore"), "SG", 702, I18N_NOOP("Singapore Dollar"), "SGD" }, { I18N_NOOP("Slovenia"), "SI", 705, I18N_NOOP("Tolar"), "SIT" }, { I18N_NOOP("Solomon Islands"), "SB", 90, I18N_NOOP("Solomon Islands Dollar"), "SBD" }, { I18N_NOOP("Somalia"), "SO", 706, I18N_NOOP("Somali Shilling"), "SOS" }, { I18N_NOOP("South Africa"), "ZA", 710, I18N_NOOP("Rand"), "ZAR" }, { I18N_NOOP("South Georgia and the South Sandwich Islands"), "GS", 239, I18N_NOOP("Pound Sterling"), "GBP" }, { I18N_NOOP("Spain"), "ES", 724, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Sri Lanka"), "LK", 144, I18N_NOOP("Sri Lankan Rupee"), "LKR" }, { I18N_NOOP("St Helena"), "SH", 654, I18N_NOOP("St Helena Pound"), "SHP" }, { I18N_NOOP("St Pierre and Miquelon"), "PM", 666, I18N_NOOP("Euro"), "EUR" }, { I18N_NOOP("Sudan"), "SD", 736, I18N_NOOP("Sudanese Pound and Sudanese Dinar"), "SDP" }, { I18N_NOOP("Suriname"), "SR", 740, I18N_NOOP("Surinam Guilder "), "SRG" }, { I18N_NOOP("Svalbard and Jan Mayen Islands"), "SJ", 744, I18N_NOOP("Norwegian Krone"), "NOK" }, { I18N_NOOP("Swaziland"), "SZ", 748, I18N_NOOP("Lilangeni"), "SZL" }, { I18N_NOOP("Sweden"), "SE", 752, I18N_NOOP("Swedish Krona"), "SEK" }, { I18N_NOOP("Switzerland"), "CH", 756, I18N_NOOP("Swiss Franc"), "CHF" }, { I18N_NOOP("Syrian Arab Republic"), "SY", 760, I18N_NOOP("Syrian Pound"), "SYP" }, { I18N_NOOP("Tajikistan"), "TJ", 762, I18N_NOOP("Tajik Rouble "), "TJR" }, { I18N_NOOP("Tanzania, United Republic of"), "TZ", 834, I18N_NOOP("Tanzanian Shilling"), "TZS" }, { I18N_NOOP("Thailand"), "TH", 764, I18N_NOOP("Baht"), "THB" }, { I18N_NOOP("Togo"), "TG", 768, I18N_NOOP("Franc de la Communauté financière africaine"), "XAF" }, { I18N_NOOP("Tokelau"), "TK", 772, I18N_NOOP("New Zealand Dollar"), "NZD" }, { I18N_NOOP("Tonga"), "TO", 776, I18N_NOOP("Pa'anga"), "TOP" }, { I18N_NOOP("Trinidad and Tobago"), "TT", 780, I18N_NOOP("Trinidad and Tobago Dollar"), "TTD" }, { I18N_NOOP("Tunisia"), "TN", 788, I18N_NOOP("Tunisian Dinar"), "TND" }, { I18N_NOOP("Turkey"), "TR", 792, I18N_NOOP("Turkish Lira"), "TRL" }, { I18N_NOOP("Turkmenistan"), "TM", 795, I18N_NOOP("Turkmenistani Manat"), "TMM" }, { I18N_NOOP("Turks and Caicos Islands"), "TC", 796, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Tuvalu"), "TV", 798, I18N_NOOP("Australian Dollar"), "AUD" }, { I18N_NOOP("Ukraine"), "UA", 804, I18N_NOOP("Hryvna and Karbovanet"), "UAH" }, { I18N_NOOP("Union of Soviet Socialist Republics"), "SU", 0, I18N_NOOP("USSR Rouble"), "SUR" }, { I18N_NOOP("United Arab Emirates"), "AE", 784, I18N_NOOP("UAE Dirham"), "AED" }, { I18N_NOOP("United Kingdom"), "GB", 826, I18N_NOOP("Pound Sterling"), "GBP" }, { I18N_NOOP("United States of America"), "US", 840, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("United States Minor Outlying Islands"), "UM", 581, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Uruguay"), "UY", 858, I18N_NOOP("Uruguayan New Peso "), "UYU" }, { I18N_NOOP("Uzbekistan"), "UZ", 860, I18N_NOOP("Uzbekistani Som "), "UZS" }, { I18N_NOOP("Venezuela"), "VE", 862, I18N_NOOP("Bolivar"), "VEB" }, { I18N_NOOP("Viet Nam"), "VN", 704, I18N_NOOP("Dông"), "VND" }, { I18N_NOOP("Virgin Islands "), "VG", 92, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("Virgin Islands "), "VI", 850, I18N_NOOP("US Dollar"), "USD" }, { I18N_NOOP("West Africa"), "XO", 0, I18N_NOOP("West African Franc"), "XOF" }, { I18N_NOOP("Western Sahara"), "EH", 732, I18N_NOOP("Moroccan Dirham and Mauritanian Ouguiya"), "MAD" }, { I18N_NOOP("Yugoslavia"), "YU", 0, I18N_NOOP("New Dinar"), "YUD" }, { I18N_NOOP("Zambia"), "ZM", 894, I18N_NOOP("Zambian Kwacha"), "ZMK" }, { I18N_NOOP("Zimbabwe"), "ZW", 716, I18N_NOOP("Zimbabwe Dollar"), "ZWD" }, /* Watch out: The last element *has* to be this all-zero element, or else the iterations will not find the end of this list. */ { 0, 0, 0, 0, 0 } }; const AB_COUNTRY *AB_Country_FindByName(const char *name){ AB_COUNTRY *c; c=ab_country_list; while(c->name) { if (-1!=GWEN_Text_ComparePattern(c->name, name, 0)) { return c; } c++; } return 0; } const AB_COUNTRY *AB_Country_FindByLocalName(const char *name){ AB_COUNTRY *c; c=ab_country_list; while(c->name) { if (-1!=GWEN_Text_ComparePattern(AB_Country_GetLocalName(c), name, 0)) { return c; } c++; } return 0; } const AB_COUNTRY *AB_Country_FindByCode(const char *code){ AB_COUNTRY *c; c=ab_country_list; while(c->name) { if (-1!=GWEN_Text_ComparePattern(c->code, code, 0)) { return c; } c++; } return 0; } const AB_COUNTRY *AB_Country_FindByNumeric(int numid){ AB_COUNTRY *c; c=ab_country_list; while(c->name) { if (c->numericCode==numid) return c; c++; } return 0; } const char *AB_Country_GetName(const AB_COUNTRY *cntry){ assert(cntry); return cntry->name; } const char *AB_Country_GetLocalName(const AB_COUNTRY *cntry){ assert(cntry); return I18N(cntry->name); } const char *AB_Country_GetCode(const AB_COUNTRY *cntry){ assert(cntry); return cntry->code; } int AB_Country_GetNumericCode(const AB_COUNTRY *cntry){ assert(cntry); return cntry->numericCode; } AB_COUNTRY_CONSTLIST2 *AB_Country_ListByName(const char *name){ const AB_COUNTRY *c; AB_COUNTRY_CONSTLIST2 *cl; c=ab_country_list; cl=AB_Country_ConstList2_new(); while(c->name) { if (-1!=GWEN_Text_ComparePattern(c->name, name, 0)) { AB_Country_ConstList2_PushBack(cl, c); } c++; } if (AB_Country_ConstList2_GetSize(cl)==0) { AB_Country_ConstList2_free(cl); return 0; } return cl; } AB_COUNTRY_CONSTLIST2 *AB_Country_ListByLocalName(const char *name){ const AB_COUNTRY *c; AB_COUNTRY_CONSTLIST2 *cl; c=ab_country_list; cl=AB_Country_ConstList2_new(); while(c->name) { if (-1!=GWEN_Text_ComparePattern(AB_Country_GetLocalName(c), name, 0)){ AB_Country_ConstList2_PushBack(cl, c); } c++; } if (AB_Country_ConstList2_GetSize(cl)==0) { AB_Country_ConstList2_free(cl); return 0; } return cl; } const char *AB_Country_GetCurrencyName(const AB_COUNTRY *cntry){ assert(cntry); return cntry->currencyName; } const char *AB_Country_GetCurrencyCode(const AB_COUNTRY *cntry){ assert(cntry); return cntry->currencyCode; } const char *AB_Country_GetLocalCurrencyName(const AB_COUNTRY *cntry){ assert(cntry); return I18N(cntry->currencyName); } aqbanking-5.6.4beta/src/libs/aqbanking/httpsession_p.h0000644000175000017500000000162712364015477020003 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_HTTPSESS_P_H #define AB_HTTPSESS_P_H #include "httpsession.h" #include typedef struct AB_HTTP_SESSION AB_HTTP_SESSION; struct AB_HTTP_SESSION { AB_PROVIDER *provider; AB_USER *user; GWEN_BUFFER *logs; }; static void GWENHYWFAR_CB AB_HttpSession_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/job_p.h0000644000175000017500000000230312364015477016162 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOB_P_H #define AQBANKING_JOB_P_H #include "job_l.h" #include #include #include struct AB_JOB { GWEN_INHERIT_ELEMENT(AB_JOB) GWEN_LIST_ELEMENT(AB_JOB) AB_ACCOUNT *account; AB_JOB_STATUS status; char *resultText; AB_JOB_TYPE jobType; int availability; uint32_t jobId; uint32_t usage; char *createdBy; uint32_t idForProvider; GWEN_DB_NODE *dbData; GWEN_TIME *lastStatusChange; char *usedTan; AB_TRANSACTION *transaction; AB_TRANSACTION_LIMITS *limits; }; static AB_JOB *AB_Job__clearAll_cb(AB_JOB *j, void *userData); #endif /* AQBANKING_JOB_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/imexporter_l.h0000644000175000017500000000225112364015477017604 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_IMEXPORTER_L_H #define AQBANKING_IMEXPORTER_L_H #define AB_IMEXPORTER_FOLDER "imexporters" #include #include #include #include GWEN_LIST_FUNCTION_LIB_DEFS(AB_IMEXPORTER, AB_ImExporter, AQBANKING_API) void AB_ImExporter_SetLibLoader(AB_IMEXPORTER *ie, GWEN_LIBLOADER *ll); int AB_ImExporterAccountInfo_toDb(const AB_IMEXPORTER_ACCOUNTINFO *iea, GWEN_DB_NODE *db); AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterAccountInfo_fromDb(GWEN_DB_NODE *db); #endif /* AQBANKING_IMEXPORTER_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/imexporter.h0000644000175000017500000007335712364015477017310 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_IMEXPORTER_H #define AQBANKING_IMEXPORTER_H #include #include #include #include #include #include #include /** @addtogroup G_AB_IMEXPORTER Generic Im- and Exporter * * @short Generic Financial Data Importer/Exporter *

* This group contains a generic importer/exporter. *

*

Importing

*

* When importing this group reads transactions and accounts from a * given stream (in most cases a file) and stores them in a given * importer context. *

*

* The application can later browse through all transactions stored within the * given context and import them into its own database as needed. *

*/ /*@{*/ /** @name Flags returned by @ref AB_ImExporter_GetFlags * */ /*@{*/ /** This module supports the function @ref AB_ImExporter_GetEditProfileDialog */ #define AB_IMEXPORTER_FLAGS_GETPROFILEEDITOR_SUPPORTED 0x00000001 /*@}*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_IMEXPORTER AB_IMEXPORTER; GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_IMEXPORTER, AQBANKING_API) typedef struct AB_IMEXPORTER_CONTEXT AB_IMEXPORTER_CONTEXT; typedef struct AB_IMEXPORTER_ACCOUNTINFO AB_IMEXPORTER_ACCOUNTINFO; #ifdef __cplusplus } #endif #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** @name Virtual Functions for Backends * */ /*@{*/ /** * Reads the given stream and imports all data from it. This imported * data is stored within the given context. * @param ie pointer to the importer/exporter * @param ctx import context * @param bio stream to read from (usually a file, see * @ref GWEN_BufferedIO_File_new) * @param dbProfile configuration data for the importer. You can get this * using @ref AB_Banking_GetImExporterProfiles. */ AQBANKING_API int AB_ImExporter_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *dbProfile); /** * Writes all data to the given stream. * @param ie pointer to the importer/exporter * @param ctx export context * @param bio stream to write to (usually a file, see * @ref GWEN_BufferedIO_File_new) * @param dbProfile configuration data for the exporter. You can get this * using @ref AB_Banking_GetImExporterProfiles. */ AQBANKING_API int AB_ImExporter_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *dbProfile); /** * This function should return a dialog (see @ref GWEN_DIALOG) which * allows editing of the given profile. * You can use @ref AB_ImExporter_GetFlags to determine beforehand whether * this function is supported (look for * @ref AB_IMEXPORTER_FLAGS_GETPROFILEEDITOR_SUPPORTED). * (introduced in AqBanking 4.3.0) * * @param ie pointer to the importer/exporter * * @param dbProfile configuration data for the exporter. You can get this * using @ref AB_Banking_GetImExporterProfiles. * * @param pDlg pointer to a dialog pointer (receives the created dialog if any) * * @return 0 on success, error code otherwise */ AQBANKING_API int AB_ImExporter_GetEditProfileDialog(AB_IMEXPORTER *ie, GWEN_DB_NODE *dbProfile, const char *testFileName, GWEN_DIALOG **pDlg); /** * This is just a convenience function for @ref AB_ImExporter_Import. */ AQBANKING_API int AB_ImExporter_ImportFile(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, const char *fname, GWEN_DB_NODE *dbProfile); AQBANKING_API int AB_ImExporter_ImportBuffer(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFER *buf, GWEN_DB_NODE *dbProfile); AQBANKING_API int AB_ImExporter_ExportToBuffer(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFER *buf, GWEN_DB_NODE *dbProfile); AQBANKING_API int AB_ImExporter_ExportToFile(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, const char *fname, GWEN_DB_NODE *dbProfile); /** * This function checks whether the given importer supports the given file. */ AQBANKING_API int AB_ImExporter_CheckFile(AB_IMEXPORTER *ie, const char *fname); /*@}*/ /** * Returns the AB_BANKING object to which the im/exporter belongs. */ AQBANKING_API AB_BANKING *AB_ImExporter_GetBanking(const AB_IMEXPORTER *ie); /** * Returns the name of the im/exporter. */ AQBANKING_API const char *AB_ImExporter_GetName(const AB_IMEXPORTER *ie); /** * Returns the flags if this im/exporter which specify the supported * features. */ AQBANKING_API uint32_t AB_ImExporter_GetFlags(const AB_IMEXPORTER *ie); /*@}*/ /* defgroup */ /** @defgroup AB_IMEXPORTER_CONTEXT Im- and Exporter Context * @ingroup G_AB_IMEXPORTER * * A context contains the list of accounts for which data has been imported * or which are to be exported. * These accounts each contain a list of imported/to be exported * transactions. */ /*@{*/ AQBANKING_API AB_IMEXPORTER_CONTEXT *AB_ImExporterContext_new(void); AQBANKING_API void AB_ImExporterContext_free(AB_IMEXPORTER_CONTEXT *iec); /** * This function clears the context (e.g. removes all transactions etc). * (introduced in AqBanking 4.3.0) */ AQBANKING_API void AB_ImExporterContext_Clear(AB_IMEXPORTER_CONTEXT *iec); /** Stores a complete import/export context to a GWEN_DB. * */ AQBANKING_API int AB_ImExporterContext_toDb(const AB_IMEXPORTER_CONTEXT *iec, GWEN_DB_NODE *db); /** Restores a complete import/export context from a GWEN_DB. * */ AQBANKING_API AB_IMEXPORTER_CONTEXT *AB_ImExporterContext_fromDb(GWEN_DB_NODE *db); AQBANKING_API int AB_ImExporterContext_ReadDb(AB_IMEXPORTER_CONTEXT *iec, GWEN_DB_NODE *db); /** * Adds the content of the second context to the first one. * Frees the second context. */ AQBANKING_API void AB_ImExporterContext_AddContext(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_CONTEXT *toAdd); /** * Takes over ownership of the given account info. */ AQBANKING_API void AB_ImExporterContext_AddAccountInfo(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_ACCOUNTINFO *iea); /** * Returns the first imported account (if any). * The context remains the owner of the object returned. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetFirstAccountInfo(AB_IMEXPORTER_CONTEXT *iec); /** * Returns the next account data has been imported for. * The context remains the owner of the object returned. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetNextAccountInfo(AB_IMEXPORTER_CONTEXT *iec); /** Callback function type for * AB_ImExporterContext_AccountInfoForEach() * * (As soon as a ACCOUNTINFO_LIST2 is declared in this header, * this declaration can be removed.) */ typedef AB_IMEXPORTER_ACCOUNTINFO * (AB_IMEXPORTER_ACCOUNTINFO_LIST2_FOREACH)(AB_IMEXPORTER_ACCOUNTINFO *element, void *user_data); /** Traverses the list of account infos in this context, calling * the callback function 'func' on each list element. Traversal * will stop when 'func' returns a non-NULL value, and the routine * will return with that value. Otherwise the routine will return * NULL. * * Note: Every list element is still owned by the * IMEXPORTER_CONTEXT object, so it must neither be free'd nor * stored anywhere outside the lifecyle of this * AB_IMEXPORTER_CONTEXT. * * Available since aqbanking-1.9.7. * * @param iec The importer context. * @param func The function to be called with each list element. * @param user_data A pointer passed on to the function 'func'. * @return The non-NULL pointer returned by 'func' as soon as it * returns one. Otherwise (i.e. 'func' always returns NULL) * returns NULL. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO * AB_ImExporterContext_AccountInfoForEach(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_ACCOUNTINFO_LIST2_FOREACH func, void* user_data); /** * Looks for account info for the given account. If it is not found 0 is * returned. * The context remains the owner of the returned object. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_FindAccountInfo(AB_IMEXPORTER_CONTEXT *iec, const char *bankCode, const char *accountNumber); /** * Looks for account info for the given account. If it is not found 0 is * returned. * This is for SEPA. * The context remains the owner of the returned object. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_FindAccountInfoByIban(AB_IMEXPORTER_CONTEXT *iec, const char *iban); /** * Looks for account info for the given account. If there is none it will * be created and added to the context. * The context remains the owner of the returned object. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetAccountInfo(AB_IMEXPORTER_CONTEXT *iec, const char *bankCode, const char *accountNumber); /** * Looks for account info for the given account. If there is none it will * be created and added to the context. * This function is for SEPA. * The context remains the owner of the returned object. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetAccountInfoByIban(AB_IMEXPORTER_CONTEXT *iec, const char *iban); AQBANKING_API int AB_ImExporterContext_GetAccountInfoCount(const AB_IMEXPORTER_CONTEXT *iec); /** * This is just a convenience function. It takes the bank code and * account number from the account, and then calls * @ref AB_ImExporterContext_GetAccountInfo and * @ref AB_ImExporterAccountInfo_AddTransaction. * If you want to add many transactions which are sorted by account * it is much faster to avoid this function and to select the appropriate * account info object once before importing all transactions for this * particular account. This would save you the additional lookup before * every transaction. */ AQBANKING_API void AB_ImExporterContext_AddTransaction(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t); /** * This is just a convenience function. It takes the bank code and * account number from the account, and then calls * @ref AB_ImExporterContext_GetAccountInfo and * @ref AB_ImExporterAccountInfo_AddTransfer. * If you want to add many transfers which are sorted by account * it is much faster to avoid this function and to select the appropriate * account info object once before importing all transactions for this * particular account. This would save you the additional lookup before * every transaction. */ AQBANKING_API void AB_ImExporterContext_AddTransfer(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t); AQBANKING_API void AB_ImExporterContext_AddStandingOrder(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t); AQBANKING_API void AB_ImExporterContext_AddDatedTransfer(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t); /** @defgroup AB_IMEXPORTER_CONTEXT_SECURITY Securities * * These functions handle stocks, mutual funds etc. */ /**@{*/ AQBANKING_API void AB_ImExporterContext_AddSecurity(AB_IMEXPORTER_CONTEXT *iec, AB_SECURITY *sec); AQBANKING_API AB_SECURITY* AB_ImExporterContext_GetFirstSecurity(AB_IMEXPORTER_CONTEXT *iec); AQBANKING_API AB_SECURITY* AB_ImExporterContext_GetNextSecurity(AB_IMEXPORTER_CONTEXT *iec); AQBANKING_API AB_SECURITY* AB_ImExporterContext_FindSecurity(AB_IMEXPORTER_CONTEXT *iec, const char *nameSpace, const char *id); /**@}*/ /** @defgroup AB_IMEXPORTER_CONTEXT_MESSAGE Messages * * These functions handle messages received from a bank. */ /**@{*/ AQBANKING_API void AB_ImExporterContext_AddMessage(AB_IMEXPORTER_CONTEXT *iec, AB_MESSAGE *msg); AQBANKING_API AB_MESSAGE* AB_ImExporterContext_GetFirstMessage(AB_IMEXPORTER_CONTEXT *iec); AQBANKING_API AB_MESSAGE* AB_ImExporterContext_GetNextMessage(AB_IMEXPORTER_CONTEXT *iec); /**@}*/ /** @defgroup AB_IMEXPORTER_CONTEXT_LOGS Logs * * These functions handle logs written by the backends. * Such logs are meant to be read and interpreted by a human user. */ /**@{*/ AQBANKING_API void AB_ImExporterContext_AddLog(AB_IMEXPORTER_CONTEXT *iec, const char *s); AQBANKING_API const char *AB_ImExporterContext_GetLog(const AB_IMEXPORTER_CONTEXT *iec); AQBANKING_API void AB_ImExporterContext_ClearLog(AB_IMEXPORTER_CONTEXT *iec); /**@}*/ /*@}*/ /* defgroup */ /** @defgroup AB_IMEXPORTER_ACCOUNTINFO Im- and Exporter Account Info * @ingroup G_AB_IMEXPORTER * * Such a structure contains the list of imported/to be exported transactions * for a given account. */ /*@{*/ /** @name Constructor, Destructor, Copy * */ /*@{*/ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO *AB_ImExporterAccountInfo_new(void); AQBANKING_API void AB_ImExporterAccountInfo_free(AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_FillFromAccount(AB_IMEXPORTER_ACCOUNTINFO *iea, const AB_ACCOUNT *a); /** * Returns a copy of the given account info. Please note that only the data * is copied, internal pointers for * @ref AB_ImExporterAccountInfo_GetNextTransaction et al are reset in the * copy. */ AQBANKING_API AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterAccountInfo_dup(const AB_IMEXPORTER_ACCOUNTINFO *oldiea); /*@}*/ /** @name Informational Functions * */ /*@{*/ /** * Bank code of the institute the account is at. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetBankCode(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetBankCode(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * Bank name of the institute the account is at. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetBankName(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetBankName(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * Account number. * Used when importing data, not used when exporting. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetAccountNumber(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetAccountNumber(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * Account name. * Used when importing data, not used when exporting. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetAccountName(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetAccountName(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * IBAN. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetIban(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetIban(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * BIC. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetBic(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetBic(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * Account currency */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetCurrency(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetCurrency(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * Name of the account' owner. * Used when importing data, not used when exporting. */ AQBANKING_API const char* AB_ImExporterAccountInfo_GetOwner(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetOwner(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); AQBANKING_API AB_ACCOUNT_TYPE AB_ImExporterAccountInfo_GetType(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetType(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_ACCOUNT_TYPE t); AQBANKING_API const char* AB_ImExporterAccountInfo_GetDescription(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetDescription(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s); /** * This field is not used by AqBanking but might be used by applications. */ AQBANKING_API uint32_t AB_ImExporterAccountInfo_GetAccountId(const AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API void AB_ImExporterAccountInfo_SetAccountId(AB_IMEXPORTER_ACCOUNTINFO *iea, uint32_t id); /*@}*/ /** @name Transactions * */ /*@{*/ /** * Takes over ownership of the given transaction. */ AQBANKING_API void AB_ImExporterAccountInfo_AddTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t); /** * Returns the first transaction stored within the context. * The context remains the owner of the object returned. */ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea); /** * Returns the next transaction stored within the context. * The context remains the owner of the object returned. */ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea); /** Callback function type for * AB_ImExporterAccountInfo_TransactionsForEach() * * (As soon as transaction.h declares this type itself, this * declaration can be removed. Currently transaction.h only * declares the LIST2 but not the CONSTLIST2, so we add this * declaration here. If transaction.h declares the CONSTLIST2 as * well, it wouldn't harm because this typedef is exactly * identical to the one from the GWEN_CONSTLIST2_FUNCTION_LIB_DEFS * macro.) */ typedef const AB_TRANSACTION * (AB_TRANSACTION_CONSTLIST2_FOREACH)(const AB_TRANSACTION *element, void *user_data); /** Traverses the list of Transactions in this AccountInfo, * calling the callback function 'func' on each list element. * Traversal will stop when 'func' returns a non-NULL value, and * the routine will return with that value. Otherwise the routine * will return NULL. * * Note: It is not totally clear to me whether this function might * interfere with AB_ImExporterAccountInfo_GetFirstTransaction() / * AB_ImExporterAccountInfo_GetNextTransaction() . To be on the * safe side, you should probably traverse the transaction list * only *either* by those mentioned two functions *or* by this * ForEach function, but you should probably not mix the access * through this two methods. (This doubt be changed in future * versions.) * * Available since aqbanking-1.9.7. * * @param list The list to traverse. * @param func The function to be called with each list element. * @param user_data A pointer passed on to the function 'func'. * @return The non-NULL pointer returned by 'func' as soon as it * returns one. Otherwise (i.e. 'func' always returns NULL) * returns NULL. */ AQBANKING_API const AB_TRANSACTION* AB_ImExporterAccountInfo_TransactionsForEach(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION_CONSTLIST2_FOREACH func, void* user_data); AQBANKING_API int AB_ImExporterAccountInfo_GetTransactionCount(const AB_IMEXPORTER_ACCOUNTINFO *iea); /** * Clear all transactions stored in the given account info. */ AQBANKING_API void AB_ImExporterAccountInfo_ClearTransactions(AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /** @name Account Status * */ /*@{*/ /** * Takes over ownership of the given account status. */ AQBANKING_API void AB_ImExporterAccountInfo_AddAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_ACCOUNT_STATUS *st); /** * Returns the first account status stored within the context and removes * it. * The context remains the owner of the object returned. */ AQBANKING_API AB_ACCOUNT_STATUS* AB_ImExporterAccountInfo_GetFirstAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea); /** * Returns the next account status stored within the context and removes it * The context remains the owner of the object returned. */ AQBANKING_API AB_ACCOUNT_STATUS* AB_ImExporterAccountInfo_GetNextAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /** @name Standing Orders * */ /*@{*/ /** *

* Takes over ownership of the given standing order. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API void AB_ImExporterAccountInfo_AddStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t); /** *

* Returns the first standing order stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea); /** *

* Returns the next standing order stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API int AB_ImExporterAccountInfo_GetStandingOrderCount(const AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /** @name Transfers * */ /*@{*/ /** *

* Takes over ownership of the given transfer. *

*

* The transfer can be any kind of transfer (like single transfer, * debit note, EU transfer etc). *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API void AB_ImExporterAccountInfo_AddTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t); /** *

* Returns the first transfer stored within the context. * The context remains the owner of the object returned. * The transfer can be any kind of transfer (like single transfer, * debit note, EU transfer etc). *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea); /** *

* Returns the next transfer stored within the context. * The context remains the owner of the object returned. * The transfer can be any kind of transfer (like single transfer, * debit note, EU transfer etc). *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API int AB_ImExporterAccountInfo_GetTransferCount(const AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /** @name Dated Transfers * */ /*@{*/ /** *

* Takes over ownership of the given dated transfer. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API void AB_ImExporterAccountInfo_AddDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t); /** *

* Returns the first dated transfer stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea); /** *

* Returns the next dated transfer stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API int AB_ImExporterAccountInfo_GetDatedTransferCount(const AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /** @name Noted Transactions * */ /*@{*/ /** *

* Takes over ownership of the given noted transfer. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API void AB_ImExporterAccountInfo_AddNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t); /** *

* Returns the first noted transfer stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea); /** *

* Returns the next noted transfer stored within the context. * The context remains the owner of the object returned. *

*

* This function is only used in the context of the function * @ref AB_Banking_GatherResponses. It is especially not used when * importing or exporting normal transactions via * @ref AB_ImExporter_Import or @ref AB_ImExporter_Export unless explicitly * stated otherwise (see documentation of the importer/exporter in question). *

*/ AQBANKING_API AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea); AQBANKING_API int AB_ImExporterAccountInfo_GetNotedTransactionCount(const AB_IMEXPORTER_ACCOUNTINFO *iea); /*@}*/ /*@}*/ /* defgroup */ /** @name Helper Functions * * These functions are most likely used by implementations of im/exporters. */ /*@{*/ /** * Transforms an UTF-8 string to a DTA string. Untranslateable characters * are replaced by a space (chr 32). */ AQBANKING_API void AB_ImExporter_Utf8ToDta(const char *p, int size, GWEN_BUFFER *buf); /** * Transforms a DTA string to an UTF-8 string. */ AQBANKING_API void AB_ImExporter_DtaToUtf8(const char *p, int size, GWEN_BUFFER *buf); AQBANKING_API void AB_ImExporter_Iso8859_1ToUtf8(const char *p, int size, GWEN_BUFFER *buf); AQBANKING_DEPRECATED AQBANKING_API int AH_ImExporter_DbFromIso8859_1ToUtf8(GWEN_DB_NODE *db); /** * This function call @ref AB_ImExporter_Iso8859_1ToUtf8 on all char * values in the given db. */ AQBANKING_API int AB_ImExporter_DbFromIso8859_1ToUtf8(GWEN_DB_NODE *db); AQBANKING_API GWEN_TIME *AB_ImExporter_DateFromString(const char *p, const char *tmpl, int inUtc); AQBANKING_API int AB_ImExporterContext_WriteContext(const AB_IMEXPORTER_CONTEXT *ctx, const char *ctxFile); /*@}*/ #ifdef __cplusplus } #endif #endif /* AQBANKING_IMEXPORTER_H */ aqbanking-5.6.4beta/src/libs/aqbanking/account_be.h0000644000175000017500000000205212364015477017174 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCOUNT_BE_H #define AQBANKING_ACCOUNT_BE_H #ifdef __cplusplus extern "C" { #endif #include GWEN_LIST_FUNCTION_DEFS(AB_ACCOUNT, AB_Account) /** * Frees a List2 of accounts and all its members. * This MUST NOT be used on account lists returned by AqBanking, but only * on account lists created by backends. * Therefore this function is only defined here. */ AQBANKING_API void AB_Account_List2_FreeAll(AB_ACCOUNT_LIST2 *al); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/0000755000175000017500000000000012643540651015734 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletedatedtransfer_be.h0000644000175000017500000000217112364015477023203 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETEDATEDTRANSFER_BE_H #define AQBANKING_JOBDELETEDATEDTRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_DEL * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobDeleteDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingletransfer.c0000644000175000017500000000240012364015477021540 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsingletransfer.h" #include "jobsingletransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobSingleTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeTransfer, a); } void AB_JobSingleTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobSingleTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobSingleTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } AB_TRANSACTION *AB_JobSingleTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgettransactions_p.h0000644000175000017500000000217712364015477022261 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETTRANSACTIONS_P_H #define AQBANKING_JOBGETTRANSACTIONS_P_H #include #include "jobgettransactions_l.h" #ifdef __cplusplus extern "C" { #endif typedef struct AB_JOB_GETTRANSACTIONS AB_JOB_GETTRANSACTIONS; struct AB_JOB_GETTRANSACTIONS { /* arguments */ GWEN_TIME *fromTime; GWEN_TIME *toTime; /* parameters */ int maxStoreDays; /* responses */ AB_TRANSACTION_LIST2 *transactions; AB_ACCOUNT_STATUS_LIST2 *accountStatusList; }; static void GWENHYWFAR_CB AB_JobGetTransactions_FreeData(void *bp, void *p); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETTRANSACTIONS_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifydatedtransfer_l.h0000644000175000017500000000144212364015477023075 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYDATEDTRANSFER_L_H #define AQBANKING_JOBMODIFYDATEDTRANSFER_L_H #include AB_JOB *AB_JobModifyDatedTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobModifyDatedTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgettransactions.c0000644000175000017500000001053312364015477021730 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgettransactions_p.h" #include "jobgettransactions_be.h" #include "job_l.h" #include #include #include #include #include #include GWEN_INHERIT(AB_JOB, AB_JOB_GETTRANSACTIONS) AB_JOB *AB_JobGetTransactions_new(AB_ACCOUNT *a) { AB_JOB *j; AB_JOB_GETTRANSACTIONS *aj; j=AB_Job_new(AB_Job_TypeGetTransactions, a); GWEN_NEW_OBJECT(AB_JOB_GETTRANSACTIONS, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j, aj, AB_JobGetTransactions_FreeData); return j; } void GWENHYWFAR_CB AB_JobGetTransactions_FreeData(void *bp, void *p){ AB_JOB_GETTRANSACTIONS *aj; aj=(AB_JOB_GETTRANSACTIONS*)p; GWEN_Time_free(aj->fromTime); GWEN_Time_free(aj->toTime); if (aj->transactions) AB_Transaction_List2_freeAll(aj->transactions); if (aj->accountStatusList) AB_AccountStatus_List2_freeAll(aj->accountStatusList); GWEN_FREE_OBJECT(aj); } AB_TRANSACTION_LIST2* AB_JobGetTransactions_GetTransactions(const AB_JOB *j){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); if (aj->transactions) { if (AB_Transaction_List2_GetSize(aj->transactions)==0) return 0; } return aj->transactions; } void AB_JobGetTransactions_SetTransactions(AB_JOB *j, AB_TRANSACTION_LIST2 *tl){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); assert(tl); if (aj->transactions) AB_Transaction_List2_freeAll(aj->transactions); aj->transactions=tl; } AB_ACCOUNT_STATUS_LIST2* AB_JobGetTransactions_GetAccountStatusList(const AB_JOB *j){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); if (aj->accountStatusList) { if (AB_AccountStatus_List2_GetSize(aj->accountStatusList)==0) return 0; } return aj->accountStatusList; } void AB_JobGetTransactions_SetAccountStatusList(AB_JOB *j, AB_ACCOUNT_STATUS_LIST2 *tl){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); assert(tl); if (aj->accountStatusList) AB_AccountStatus_List2_freeAll(aj->accountStatusList); aj->accountStatusList=tl; } const GWEN_TIME *AB_JobGetTransactions_GetFromTime(const AB_JOB *j){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); return aj->fromTime; } void AB_JobGetTransactions_SetFromTime(AB_JOB *j, const GWEN_TIME *t){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); GWEN_Time_free(aj->fromTime); if (t) aj->fromTime=GWEN_Time_dup(t); else aj->fromTime=0; } const GWEN_TIME *AB_JobGetTransactions_GetToTime(const AB_JOB *j){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); return aj->toTime; } void AB_JobGetTransactions_SetToTime(AB_JOB *j, const GWEN_TIME *t){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); GWEN_Time_free(aj->toTime); if (t) aj->toTime=GWEN_Time_dup(t); else aj->toTime=0; } int AB_JobGetTransactions_GetMaxStoreDays(const AB_JOB *j){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); return aj->maxStoreDays; } void AB_JobGetTransactions_SetMaxStoreDays(AB_JOB *j, int i){ AB_JOB_GETTRANSACTIONS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETTRANSACTIONS, j); assert(aj); aj->maxStoreDays=i; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingledebitnote.c0000644000175000017500000000245412364015477021702 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsingledebitnote.h" #include "jobsingledebitnote_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobSingleDebitNote_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeDebitNote, a); } void AB_JobSingleDebitNote_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobSingleDebitNote_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobSingleDebitNote_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } AB_TRANSACTION *AB_JobSingleDebitNote_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletedatedtransfer_l.h0000644000175000017500000000144212364015477023050 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETEDATEDTRANSFER_L_H #define AQBANKING_JOBDELETEDATEDTRANSFER_L_H #include AB_JOB *AB_JobDeleteDatedTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobDeleteDatedTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobloadcellphone_be.h0000644000175000017500000000233012364015477022000 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBLOADCELLPHONE_BE_H #define AQBANKING_JOBLOADCELLPHONE_BE_H #include /** @addtogroup G_AB_JOBS_LOADCELLPHONE * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * Set the list of supported cellphone prepaid card products. The list given MUST NOT be empty! * If you want to state that no products are supported use NULL as argument. * The jobs becomes the owner of the lst given (if any). */ AQBANKING_API void AB_JobLoadCellPhone_SetProductList(AB_JOB *j, AB_CELLPHONE_PRODUCT_LIST *l); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingletransfer_l.h0000644000175000017500000000141112364015477022061 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLETRANSFER_L_H #define AQBANKING_JOBSINGLETRANSFER_L_H #include AB_JOB *AB_JobSingleTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobSingleTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingletransfer_be.h0000644000175000017500000000213212364015477022215 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLETRANSFER_BE_H #define AQBANKING_JOBSINGLETRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_XFER_TRANSFER * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobSingleTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifydatedtransfer_be.h0000644000175000017500000000217012364015477023227 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYDATEDTRANSFER_BE_H #define AQBANKING_JOBMODIFYDATEDTRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_MOD * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobModifyDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobeutransfer.h0000644000175000017500000000663512364015477020713 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBEUTRANSFER_H #define AQBANKING_JOBEUTRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_EU * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * This type indicates who is to be charged for the EU transfer. */ typedef enum { AB_JobEuTransfer_ChargeWhom_Unknown=0, /** the issuer of the transfer pays for it */ AB_JobEuTransfer_ChargeWhom_Local, /** the recipient of the transfer pays */ AB_JobEuTransfer_ChargeWhom_Remote, /** the issuer and the recipient share in paying the fees */ AB_JobEuTransfer_ChargeWhom_Share } AB_JOBEUTRANSFER_CHARGE_WHOM; AQBANKING_API AB_JOB *AB_JobEuTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** *

* This function sets the transfer to be performed. *

*

* Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobEuTransfer_GetTransaction. *

* The remote country code in the transaction must refer to the destination * country (see @ref AB_Transaction_SetRemoteCountry). *

* This transaction MUST NOT contain splits. *

*/ AQBANKING_API int AB_JobEuTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API const AB_TRANSACTION *AB_JobEuTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ AQBANKING_API const AB_EUTRANSFER_INFO *AB_JobEuTransfer_FindCountryInfo(const AB_JOB *j, const char *cnt); AQBANKING_API const AB_EUTRANSFER_INFO_LIST* AB_JobEuTransfer_GetCountryInfoList(const AB_JOB *j); /** * Returns !=0 if the IBAN field of a transaction can be used to specify * the destination account. If 0 then the remote account info must set the * traditional way (see @ref AB_Transaction_SetRemoteBankCode). */ AQBANKING_API int AB_JobEuTransfer_GetIbanAllowed(const AB_JOB *j); AQBANKING_API AB_JOBEUTRANSFER_CHARGE_WHOM AB_JobEuTransfer_GetChargeWhom(const AB_JOB *j); /** * Indicate who is to be charged for this transfer (i.e. who has to pay the * extra fees for this transfer). */ AQBANKING_API void AB_JobEuTransfer_SetChargeWhom(AB_JOB *j, AB_JOBEUTRANSFER_CHARGE_WHOM i); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletesto_l.h0000644000175000017500000000140412364015477021025 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETESTO_L_H #define AQBANKING_JOBDELETESTO_L_H #include AB_JOB *AB_JobDeleteStandingOrder_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobDeleteStandingOrder_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetbalance.h0000644000175000017500000000202712364015477020611 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETBALANCE_H #define AQBANKING_JOBGETBALANCE_H #include #include /** @addtogroup G_AB_JOBS_GETBALANCE * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Constructor */ /*@{*/ AQBANKING_API AB_JOB *AB_JobGetBalance_new(AB_ACCOUNT *a); /*@}*/ /** @deprecated */ AQBANKING_API AQBANKING_DEPRECATED const AB_ACCOUNT_STATUS *AB_JobGetBalance_GetAccountStatus(AB_JOB *j); #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif /* AQBANKING_JOBGETBALANCE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingledebitnote_be.h0000644000175000017500000000213412364015477022350 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLEDEBITNOTE_BE_H #define AQBANKING_JOBSINGLEDEBITNOTE_BE_H #include /** @addtogroup G_AB_JOBS_XFER_DEBIT * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobSingleDebitNote_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifysto_be.h0000644000175000017500000000212012364015477021201 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYSTO_BE_H #define AQBANKING_JOBMODIFYSTO_BE_H #include /** @addtogroup G_AB_JOBS_STO_MOD * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobModifyStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetdatedtransfers.h0000644000175000017500000000227612364015477022243 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETDATEDTRANSFERS_H #define AQBANKING_JOBGETDATEDTRANSFERS_H #include #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_GET * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * Creates a job which retrieves a list of currently active dated transfers * for the given account. * @param a account for which you want the dated transfers */ AQBANKING_API AB_JOB *AB_JobGetDatedTransfers_new(AB_ACCOUNT *a); /** @deprecated */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION_LIST2* AB_JobGetDatedTransfers_GetDatedTransfers(const AB_JOB *j); #ifdef __cplusplus } #endif /*@}*/ #endif /* AQBANKING_JOBGETDATEDTRANSFERS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobloadcellphone.h0000644000175000017500000000340412364015477021335 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBLOADCELLPHONE_H #define AQBANKING_JOBLOADCELLPHONE_H #include #include #include /** @addtogroup G_AB_JOBS_LOADCELLPHONE * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Constructor */ /*@{*/ AQBANKING_API AB_JOB *AB_JobLoadCellPhone_new(AB_ACCOUNT *a); /*@}*/ /** @name Job Arguments */ /*@{*/ AQBANKING_API void AB_JobLoadCellPhone_SetCellPhoneProduct(AB_JOB *j, const AB_CELLPHONE_PRODUCT *p); AQBANKING_API const AB_CELLPHONE_PRODUCT *AB_JobLoadCellPhone_GetCellPhoneProduct(const AB_JOB *j); AQBANKING_API void AB_JobLoadCellPhone_SetPhoneNumber(AB_JOB *j, const char *n); AQBANKING_API const char *AB_JobLoadCellPhone_GetPhoneNumber(const AB_JOB *j); AQBANKING_API void AB_JobLoadCellPhone_SetValue(AB_JOB *j, const AB_VALUE *v); AQBANKING_API const AB_VALUE *AB_JobLoadCellPhone_GetValue(const AB_JOB *j); /*@}*/ /** @name Job Parameters */ /*@{*/ /** Returns a list of supported cell phone products (prepaid cards) * The jobs remains the owner of the object returned (if any) */ AQBANKING_API const AB_CELLPHONE_PRODUCT_LIST* AB_JobLoadCellPhone_GetCellPhoneProductList(const AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatesto_l.h0000644000175000017500000000140412364015477021026 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATESTO_L_H #define AQBANKING_JOBCREATESTO_L_H #include AB_JOB *AB_JobCreateStandingOrder_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobCreateStandingOrder_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobinternaltransfer_be.h0000644000175000017500000000214412364015477022553 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBINTERNALTRANSFER_BE_H #define AQBANKING_JOBINTERNALTRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_XFER_INTERNAL * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobInternalTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepagetstandingorders.c0000644000175000017500000000132712367467016023123 00000000000000/*************************************************************************** begin : Sun Aug 03 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepagetstandingorders.h" #include "job_l.h" AB_JOB *AB_JobSepaGetStandingOrders_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaGetStandingOrders, a); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifydatedtransfer.h0000644000175000017500000000442112364015477022562 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYDATEDTRANSFER_H #define AQBANKING_JOBMODIFYDATEDTRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_MOD * * This job modifies an already existing dated transfer at the bank. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobModifyDatedTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobModifyDatedTransfer_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobModifyDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobModifyDatedTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobModifyDatedTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetbalance_be.h0000644000175000017500000000142712364015477021262 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETBALANCE_BE_H #define AQBANKING_JOBGETBALANCE_BE_H #include #include #include #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETBALANCE_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobinternaltransfer.h0000644000175000017500000000467412364015477022117 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBINTERNALTRANSFER_H #define AQBANKING_JOBINTERNALTRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_INTERNAL * * An internal transfer is a transfer between two accounts of the same * customer at the same bank. Some banks only allow to use this job for * this kind of transfer while others only allow normal transfers (as * described in @ref G_AB_JOBS_XFER_TRANSFER). */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobInternalTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobInternalTransfer_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobInternalTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobInternalTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobInternalTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifysto.c0000644000175000017500000000244012364015477020533 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobmodifysto.h" #include "jobmodifysto_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobModifyStandingOrder_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeModifyStandingOrder, a); } void AB_JobModifyStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobModifyStandingOrder_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobModifyStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobModifyStandingOrder_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepaflashdebitnote.c0000644000175000017500000000131512364015477022362 00000000000000/*************************************************************************** begin : Sat Apr 26 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepaflashdebitnote.h" #include "job_l.h" AB_JOB *AB_JobSepaFlashDebitNote_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaFlashDebitNote, a); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadeletesto.c0000644000175000017500000000131512624441727021357 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepadeletesto.h" #include "job_l.h" AB_JOB *AB_JobSepaDeleteStandingOrder_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaDeleteStandingOrder, a); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobloadcellphone_p.h0000644000175000017500000000161412364015477021655 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBLOADCELLPHONE_P_H #define AQBANKING_JOBLOADCELLPHONE_P_H #include "jobloadcellphone_l.h" typedef struct AB_JOBLOADCELLPHONE AB_JOBLOADCELLPHONE; struct AB_JOBLOADCELLPHONE { AB_CELLPHONE_PRODUCT *product; char *phoneNumber; AB_VALUE *value; AB_CELLPHONE_PRODUCT_LIST *productList; }; static void GWENHYWFAR_CB AB_JobLoadCellPhone_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepaflashdebitnote.h0000644000175000017500000000175312364015477022375 00000000000000/*************************************************************************** begin : Sat Apr 26 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPAFLASHDEBITNOTE_H #define AQBANKING_JOBSEPAFLASHDEBITNOTE_H #include /** @addtogroup G_AB_JOBS_XFER_SEPA_FLASH_DEBITNOTE * * This is a SEPA debitnote with very low setup time. This means the date of the execution * is requested be shorter than for normal SEPA debit notes. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaFlashDebitNote_new(AB_ACCOUNT *a); #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletedatedtransfer.h0000644000175000017500000000433312364015477022537 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETEDATEDTRANSFER_H #define AQBANKING_JOBDELETEDATEDTRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_DEL * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobDeleteDatedTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobDeleteDatedTransfer_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobDeleteDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobDeleteDatedTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobDeleteDatedTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifysto_l.h0000644000175000017500000000140412364015477021052 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYSTO_L_H #define AQBANKING_JOBMODIFYSTO_L_H #include AB_JOB *AB_JobModifyStandingOrder_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobModifyStandingOrder_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatedatedtransfer_l.h0000644000175000017500000000144212364015477023051 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATEDATEDTRANSFER_l_H #define AQBANKING_JOBCREATEDATEDTRANSFER_l_H #include AB_JOB *AB_JobCreateDatedTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobCreateDatedTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobeutransfer_p.h0000644000175000017500000000170712364015477021225 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBEUTRANSFER_P_H #define AQBANKING_JOBEUTRANSFER_P_H #include #include #include "jobeutransfer_l.h" typedef struct AB_JOBEUTRANSFER AB_JOBEUTRANSFER; struct AB_JOBEUTRANSFER { AB_TRANSACTION *transaction; AB_EUTRANSFER_INFO_LIST *countryInfoList; int ibanAllowed; AB_JOBEUTRANSFER_CHARGE_WHOM chargeWhom; }; static void GWENHYWFAR_CB AB_JobEuTransfer_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgettransactions_l.h0000644000175000017500000000222712364015477022251 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETTRANSACTIONS_L_H #define AQBANKING_JOBGETTRANSACTIONS_L_H #include #include #ifdef __cplusplus extern "C" { #endif AB_JOB *AB_JobGetTransactions_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobGetTransactions_toDb(const AB_JOB *j, GWEN_DB_NODE *db); void AB_JobGetTransactions_SetTransactions(AB_JOB *j, AB_TRANSACTION_LIST2 *tl); void AB_JobGetTransactions_SetAccountStatusList(AB_JOB *j, AB_ACCOUNT_STATUS_LIST2 *tl); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETTRANSACTIONS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgettransactions_be.h0000644000175000017500000000153312364015477022403 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETTRANSACTIONS_BE_H #define AQBANKING_JOBGETTRANSACTIONS_BE_H #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API void AB_JobGetTransactions_SetMaxStoreDays(AB_JOB *j, int i); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETTRANSACTIONS_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetdatedtransfers.c0000644000175000017500000001043512364015477022232 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetdatedtransfers_p.h" #include "jobgetdatedtransfers_be.h" #include "job_l.h" #include #include #include #include #include #include GWEN_INHERIT(AB_JOB, AB_JOB_GETDATEDTRANSFERS) AB_JOB *AB_JobGetDatedTransfers_new(AB_ACCOUNT *a) { AB_JOB *j; AB_JOB_GETDATEDTRANSFERS *aj; j=AB_Job_new(AB_Job_TypeGetDatedTransfers, a); GWEN_NEW_OBJECT(AB_JOB_GETDATEDTRANSFERS, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j, aj, AB_JobGetDatedTransfers_FreeData); return j; } void GWENHYWFAR_CB AB_JobGetDatedTransfers_FreeData(void *bp, void *p){ AB_JOB_GETDATEDTRANSFERS *aj; aj=(AB_JOB_GETDATEDTRANSFERS*)p; if (aj->datedTransfers) AB_Transaction_List2_freeAll(aj->datedTransfers); GWEN_FREE_OBJECT(aj); } AB_TRANSACTION_LIST2* AB_JobGetDatedTransfers_GetDatedTransfers(const AB_JOB *j){ AB_JOB_GETDATEDTRANSFERS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j); assert(aj); if (aj->datedTransfers) { if (AB_Transaction_List2_GetSize(aj->datedTransfers)==0) return 0; } return aj->datedTransfers; } void AB_JobGetDatedTransfers_SetDatedTransfers(AB_JOB *j, AB_TRANSACTION_LIST2 *tl){ AB_JOB_GETDATEDTRANSFERS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j); assert(aj); assert(tl); if (aj->datedTransfers) AB_Transaction_List2_freeAll(aj->datedTransfers); aj->datedTransfers=tl; } AB_JOB *AB_JobGetDatedTransfers_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db){ AB_JOB *j; AB_JOB_GETDATEDTRANSFERS *aj; GWEN_DB_NODE *dbT; j=AB_Job_new(AB_Job_TypeGetDatedTransfers, a); GWEN_NEW_OBJECT(AB_JOB_GETDATEDTRANSFERS, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j, aj, AB_JobGetDatedTransfers_FreeData); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j); assert(aj); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "result/datedTransfers"); if (dbT) { GWEN_DB_NODE *dbT2; aj->datedTransfers=AB_Transaction_List2_new(); /* read datedTransfers */ dbT2=GWEN_DB_FindFirstGroup(dbT, "datedTransfer"); while(dbT2) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT2); if (t) AB_Transaction_List2_PushBack(aj->datedTransfers, t); dbT2=GWEN_DB_FindNextGroup(dbT2, "datedTransfer"); } /* while */ } /* if datedTransfers */ return j; } int AB_JobGetDatedTransfers_toDb(const AB_JOB *j, GWEN_DB_NODE *db){ AB_JOB_GETDATEDTRANSFERS *aj; GWEN_DB_NODE *dbT; int errors; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETDATEDTRANSFERS, j); assert(aj); errors=0; dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "result"); assert(dbT); if (aj->datedTransfers) { AB_TRANSACTION_LIST2_ITERATOR *it; GWEN_DB_NODE *dbT2; dbT2=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "datedTransfers"); assert(dbT2); it=AB_Transaction_List2_First(aj->datedTransfers); if (it) { AB_TRANSACTION *t; t=AB_Transaction_List2Iterator_Data(it); assert(t); while(t) { GWEN_DB_NODE *dbT3; dbT3=GWEN_DB_GetGroup(dbT2, GWEN_PATH_FLAGS_CREATE_GROUP, "datedTransfer"); assert(dbT3); if (AB_Transaction_toDb(t, dbT3)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving dated transfer"); errors++; } t=AB_Transaction_List2Iterator_Next(it); } /* while */ AB_Transaction_List2Iterator_free(it); } /* if it */ } /* if datedTransfers */ return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifysto.h0000644000175000017500000000436612364015477020551 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBMODIFYSTO_H #define AQBANKING_JOBMODIFYSTO_H #include #include #include /** @addtogroup G_AB_JOBS_STO_MOD * * This job modifies an already existing standing order. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobModifyStandingOrder_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobModifyStandingOrder_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobModifyStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobModifyStandingOrder_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobModifyStandingOrder_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingledebitnote.h0000644000175000017500000000522312364015477021704 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLEDEBITNOTE_H #define AQBANKING_JOBSINGLEDEBITNOTE_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_DEBIT * *

* Debit notes are inverse transfers: You specify an account from which you * want to draw money to on of your accounts. *

*

* Obviously not every customer is allowed to draw from any other account. * This feature is only reserved for business customers of credit institutes * (not restricted by us but by your credit institute). *

*

* In most cases your are required to sign a special document with your bank * to be able to use such a jib. *

* */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSingleDebitNote_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobSingleDebitNote_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobSingleDebitNote_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION *AB_JobSingleDebitNote_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobSingleDebitNote_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobloadcellphone.c0000644000175000017500000000654512364015477021341 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobloadcellphone_p.h" #include "job_l.h" GWEN_INHERIT(AB_JOB, AB_JOBLOADCELLPHONE) AB_JOB *AB_JobLoadCellPhone_new(AB_ACCOUNT *a) { AB_JOB *j; AB_JOBLOADCELLPHONE *aj; j=AB_Job_new(AB_Job_TypeLoadCellPhone, a); GWEN_NEW_OBJECT(AB_JOBLOADCELLPHONE, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j, aj, AB_JobLoadCellPhone_FreeData); return j; } void GWENHYWFAR_CB AB_JobLoadCellPhone_FreeData(void *bp, void *p) { AB_JOBLOADCELLPHONE *aj; aj=(AB_JOBLOADCELLPHONE*)p; AB_CellPhoneProduct_free(aj->product); AB_CellPhoneProduct_List_free(aj->productList); free(aj->phoneNumber); AB_Value_free(aj->value); GWEN_FREE_OBJECT(aj); } void AB_JobLoadCellPhone_SetCellPhoneProduct(AB_JOB *j, const AB_CELLPHONE_PRODUCT *p) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); if (aj->product) AB_CellPhoneProduct_free(aj->product); if (p) aj->product=AB_CellPhoneProduct_dup(p); else aj->product=NULL; } const AB_CELLPHONE_PRODUCT *AB_JobLoadCellPhone_GetCellPhoneProduct(const AB_JOB *j) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); return aj->product; } void AB_JobLoadCellPhone_SetPhoneNumber(AB_JOB *j, const char *s) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); if (aj->phoneNumber) free(aj->phoneNumber); if (s) aj->phoneNumber=strdup(s); else aj->phoneNumber=NULL; } const char *AB_JobLoadCellPhone_GetPhoneNumber(const AB_JOB *j) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); return aj->phoneNumber; } void AB_JobLoadCellPhone_SetValue(AB_JOB *j, const AB_VALUE *v) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); if (aj->value) AB_Value_free(aj->value); if (v) aj->value=AB_Value_dup(v); else aj->value=NULL; } const AB_VALUE *AB_JobLoadCellPhone_GetValue(const AB_JOB *j) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); return aj->value; } const AB_CELLPHONE_PRODUCT_LIST *AB_JobLoadCellPhone_GetCellPhoneProductList(const AB_JOB *j) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); return aj->productList; } void AB_JobLoadCellPhone_SetProductList(AB_JOB *j, AB_CELLPHONE_PRODUCT_LIST *l) { AB_JOBLOADCELLPHONE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBLOADCELLPHONE, j); assert(aj); if (aj->productList) AB_CellPhoneProduct_List_free(aj->productList); aj->productList=l; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetbalance_p.h0000644000175000017500000000161412364015477021131 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETBALANCE_P_H #define AQBANKING_JOBGETBALANCE_P_H #include "jobgetbalance_l.h" #ifdef __cplusplus extern "C" { #endif typedef struct AB_JOBGETBALANCE AB_JOBGETBALANCE; struct AB_JOBGETBALANCE { AB_ACCOUNT_STATUS *accountStatus; }; static void GWENHYWFAR_CB AB_JobGetBalance_FreeData(void *bp, void *p); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETBALANCE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatesto.h0000644000175000017500000000432412364015477020517 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATESTO_H #define AQBANKING_JOBCREATESTO_H #include #include #include /** @addtogroup G_AB_JOBS_STO_MK Create a Standing Order * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobCreateStandingOrder_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobCreateStandingOrder_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobCreateStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobCreateStandingOrder_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobCreateStandingOrder_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/Makefile.in0000644000175000017500000007321712643540055017731 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/jobs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libjobs_la_LIBADD = am_libjobs_la_OBJECTS = jobgetbalance.lo jobgettransactions.lo \ jobgetstandingorders.lo jobgetdatedtransfers.lo \ jobsingletransfer.lo jobsingledebitnote.lo jobsepatransfer.lo \ jobsepadebitnote.lo jobsepaflashdebitnote.lo jobcreatesto.lo \ jobmodifysto.lo jobdeletesto.lo jobcreatedatedtransfer.lo \ jobmodifydatedtransfer.lo jobdeletedatedtransfer.lo \ jobinternaltransfer.lo jobeutransfer.lo jobloadcellphone.lo \ jobsepacreatesto.lo jobsepagetstandingorders.lo \ jobsepadeletesto.lo libjobs_la_OBJECTS = $(am_libjobs_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libjobs_la_SOURCES) DIST_SOURCES = $(libjobs_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) \ $(all_includes) \ -I$(srcdir)/.. \ -I$(srcdir)/../types AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES = libjobs.la noinst_HEADERS = \ jobgettransactions_p.h \ jobgetstandingorders_p.h \ jobgetdatedtransfers_p.h \ jobgetbalance_p.h \ jobeutransfer_p.h \ jobcreatesto_l.h \ jobgetbalance_l.h \ jobgettransactions_l.h \ jobgetstandingorders_l.h \ jobsingletransfer_l.h \ jobsingledebitnote_l.h \ jobsepatransfer_l.h \ jobsepadebitnote_l.h \ jobgetdatedtransfers_l.h \ jobmodifysto_l.h \ jobdeletesto_l.h \ jobcreatedatedtransfer_l.h \ jobmodifydatedtransfer_l.h \ jobdeletedatedtransfer_l.h \ jobinternaltransfer_l.h \ jobeutransfer_l.h \ jobloadcellphone_l.h \ jobloadcellphone_p.h \ jobsepacreatesto.h \ jobsepadeletesto.h iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ jobgetbalance.h \ jobgetbalance_be.h \ jobgettransactions.h \ jobgettransactions_be.h \ jobgetstandingorders.h \ jobgetstandingorders_be.h \ jobsingletransfer.h \ jobsingletransfer_be.h \ jobsingledebitnote.h \ jobsingledebitnote_be.h \ jobsepatransfer.h \ jobsepatransfer_be.h \ jobsepadebitnote.h \ jobsepadebitnote_be.h \ jobsepaflashdebitnote.h \ jobgetdatedtransfers.h \ jobgetdatedtransfers_be.h \ jobcreatesto.h \ jobcreatesto_be.h \ jobmodifysto.h \ jobmodifysto_be.h \ jobdeletesto.h \ jobdeletesto_be.h \ jobcreatedatedtransfer.h \ jobcreatedatedtransfer_be.h \ jobmodifydatedtransfer.h \ jobmodifydatedtransfer_be.h \ jobdeletedatedtransfer.h \ jobdeletedatedtransfer_be.h \ jobinternaltransfer.h \ jobinternaltransfer_be.h \ jobeutransfer.h \ jobeutransfer_be.h \ jobloadcellphone.h \ jobloadcellphone_be.h \ jobsepagetstandingorders.h libjobs_la_SOURCES = \ jobgetbalance.c \ jobgettransactions.c \ jobgetstandingorders.c \ jobgetdatedtransfers.c \ jobsingletransfer.c \ jobsingledebitnote.c \ jobsepatransfer.c \ jobsepadebitnote.c \ jobsepaflashdebitnote.c \ jobcreatesto.c \ jobmodifysto.c \ jobdeletesto.c \ jobcreatedatedtransfer.c \ jobmodifydatedtransfer.c \ jobdeletedatedtransfer.c \ jobinternaltransfer.c \ jobeutransfer.c \ jobloadcellphone.c \ jobsepacreatesto.c \ jobsepagetstandingorders.c \ jobsepadeletesto.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/jobs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/jobs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libjobs.la: $(libjobs_la_OBJECTS) $(libjobs_la_DEPENDENCIES) $(EXTRA_libjobs_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libjobs_la_OBJECTS) $(libjobs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobcreatedatedtransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobcreatesto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobdeletedatedtransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobdeletesto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobeutransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetbalance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetdatedtransfers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgetstandingorders.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobgettransactions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobinternaltransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobloadcellphone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobmodifydatedtransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobmodifysto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepacreatesto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepadebitnote.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepadeletesto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepaflashdebitnote.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepagetstandingorders.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsepatransfer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsingledebitnote.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jobsingletransfer.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS sources: for f in $(libjobs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletedatedtransfer.c0000644000175000017500000000246412364015477022535 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobdeletedatedtransfer.h" #include "jobdeletedatedtransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobDeleteDatedTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeDeleteDatedTransfer, a); } void AB_JobDeleteDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobDeleteDatedTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobDeleteDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobDeleteDatedTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadebitnote_be.h0000644000175000017500000000207012364015477022016 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPADEBITNOTE_BE_H #define AQBANKING_JOBSEPADEBITNOTE_BE_H #include /** @addtogroup G_AB_JOBS_XFER_SEPA_DEBITNOTE * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobSepaDebitNote_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepatransfer_be.h0000644000175000017500000000207112364015477021666 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPATRANSFER_BE_H #define AQBANKING_JOBSEPATRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_XFER_SEPA_TRANSFER * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobSepaTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepatransfer.c0000644000175000017500000000236612364015477021222 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepatransfer.h" #include "jobsepatransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobSepaTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaTransfer, a); } void AB_JobSepaTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobSepaTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobSepaTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } AB_TRANSACTION *AB_JobSepaTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletesto.h0000644000175000017500000000427612364015477020524 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETESTO_H #define AQBANKING_JOBDELETESTO_H #include #include #include /** @addtogroup G_AB_JOBS_STO_DEL * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobDeleteStandingOrder_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobDeleteStandingOrder_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobDeleteStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobDeleteStandingOrder_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobDeleteStandingOrder_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobmodifydatedtransfer.c0000644000175000017500000000253412364015477022560 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobmodifydatedtransfer.h" #include "jobmodifydatedtransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobModifyDatedTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeModifyDatedTransfer, a); } void AB_JobModifyDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobModifyDatedTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobModifyDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobModifyDatedTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatesto_be.h0000644000175000017500000000217612364015477021170 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATESTO_BE_H #define AQBANKING_JOBCREATESTO_BE_H #include /** @addtogroup G_AB_JOBS_STO_MK * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobCreateStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgettransactions.h0000644000175000017500000000605212364015477021736 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETTRANSACTIONS_H #define AQBANKING_JOBGETTRANSACTIONS_H #include #include #include /** @addtogroup G_AB_JOBS_GETTRANSACTIONS * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * Creates a job which retrieves transaction reports for the given timespan * (if any). * @param a account for which you want the reports */ AQBANKING_API AB_JOB *AB_JobGetTransactions_new(AB_ACCOUNT *a); /** @deprecated */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION_LIST2* AB_JobGetTransactions_GetTransactions(const AB_JOB *j); /** @deprecated */ AQBANKING_API AQBANKING_DEPRECATED AB_ACCOUNT_STATUS_LIST2* AB_JobGetTransactions_GetAccountStatusList(const AB_JOB *j); /** @name Arguments * * Possibly arguments for this job are the first date * (@ref AB_JobGetTransactions_SetFromTime) and the last date * (@ref AB_JobGetTransactions_SetToTime). This is only a hint for the * backend. Some backends ignore this date range because their underlying * protocol does not specify a way to communicate this date range. */ /*@{*/ /** * Sets the first date for which you want the reports (the time doesn't * matter, only the date component of the given GWEN_TIME is used). * If NULL then the first day for which the bank has reports is assumed. * @param j job * @param t "from" date */ AQBANKING_API void AB_JobGetTransactions_SetFromTime(AB_JOB *j, const GWEN_TIME *t); /** * Sets the last date for which you want the reports (the time doesn't * matter, only the date component of the given GWEN_TIME is used). * If NULL then the last day for which the bank has reports is assumed. * @param j job * @param t "to" date */ AQBANKING_API void AB_JobGetTransactions_SetToTime(AB_JOB *j, const GWEN_TIME *t); AQBANKING_API const GWEN_TIME *AB_JobGetTransactions_GetFromTime(const AB_JOB *j); AQBANKING_API const GWEN_TIME *AB_JobGetTransactions_GetToTime(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the maximum number of days the bank stores your transaction * data for the account associated with the given job. * @return 0 if unknown, number of days otherwise * @param j job */ AQBANKING_API int AB_JobGetTransactions_GetMaxStoreDays(const AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* addtogroup */ #endif /* AQBANKING_JOBGETTRANSACTIONS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetstandingorders_p.h0000644000175000017500000000204412364015477022570 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETSTANDINGORDERS_P_H #define AQBANKING_JOBGETSTANDINGORDERS_P_H #include #include "jobgetstandingorders_l.h" #ifdef __cplusplus extern "C" { #endif typedef struct AB_JOB_GETSTANDINGORDERS AB_JOB_GETSTANDINGORDERS; struct AB_JOB_GETSTANDINGORDERS { /* arguments */ /* parameters */ /* responses */ AB_TRANSACTION_LIST2 *standingOrders; }; static void GWENHYWFAR_CB AB_JobGetStandingOrders_FreeData(void *bp, void *p); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETSTANDINGORDERS_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingledebitnote_l.h0000644000175000017500000000141612364015477022217 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLEDEBITNOTE_L_H #define AQBANKING_JOBSINGLEDEBITNOTE_L_H #include AB_JOB *AB_JobSingleDebitNote_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobSingleDebitNote_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadebitnote.c0000644000175000017500000000237612364015477021354 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepadebitnote.h" #include "jobsepadebitnote_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobSepaDebitNote_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaDebitNote, a); } void AB_JobSepaDebitNote_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobSepaDebitNote_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobSepaDebitNote_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } AB_TRANSACTION *AB_JobSepaDebitNote_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletesto_be.h0000644000175000017500000000211712364015477021162 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBDELETESTO_BE_H #define AQBANKING_JOBDELETESTO_BE_H #include /** @addtogroup G_AB_JOBS_STO_DEL * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobDeleteStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/Makefile.am0000644000175000017500000000452012621441265017706 00000000000000INCLUDES = -I$(aqbanking_symlinkdir) \ $(all_includes) \ -I$(srcdir)/.. \ -I$(srcdir)/../types AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES=libjobs.la noinst_HEADERS=\ jobgettransactions_p.h \ jobgetstandingorders_p.h \ jobgetdatedtransfers_p.h \ jobgetbalance_p.h \ jobeutransfer_p.h \ jobcreatesto_l.h \ jobgetbalance_l.h \ jobgettransactions_l.h \ jobgetstandingorders_l.h \ jobsingletransfer_l.h \ jobsingledebitnote_l.h \ jobsepatransfer_l.h \ jobsepadebitnote_l.h \ jobgetdatedtransfers_l.h \ jobmodifysto_l.h \ jobdeletesto_l.h \ jobcreatedatedtransfer_l.h \ jobmodifydatedtransfer_l.h \ jobdeletedatedtransfer_l.h \ jobinternaltransfer_l.h \ jobeutransfer_l.h \ jobloadcellphone_l.h \ jobloadcellphone_p.h \ jobsepacreatesto.h \ jobsepadeletesto.h iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS= \ jobgetbalance.h \ jobgetbalance_be.h \ jobgettransactions.h \ jobgettransactions_be.h \ jobgetstandingorders.h \ jobgetstandingorders_be.h \ jobsingletransfer.h \ jobsingletransfer_be.h \ jobsingledebitnote.h \ jobsingledebitnote_be.h \ jobsepatransfer.h \ jobsepatransfer_be.h \ jobsepadebitnote.h \ jobsepadebitnote_be.h \ jobsepaflashdebitnote.h \ jobgetdatedtransfers.h \ jobgetdatedtransfers_be.h \ jobcreatesto.h \ jobcreatesto_be.h \ jobmodifysto.h \ jobmodifysto_be.h \ jobdeletesto.h \ jobdeletesto_be.h \ jobcreatedatedtransfer.h \ jobcreatedatedtransfer_be.h \ jobmodifydatedtransfer.h \ jobmodifydatedtransfer_be.h \ jobdeletedatedtransfer.h \ jobdeletedatedtransfer_be.h \ jobinternaltransfer.h \ jobinternaltransfer_be.h \ jobeutransfer.h \ jobeutransfer_be.h \ jobloadcellphone.h \ jobloadcellphone_be.h \ jobsepagetstandingorders.h libjobs_la_SOURCES=\ jobgetbalance.c \ jobgettransactions.c \ jobgetstandingorders.c \ jobgetdatedtransfers.c \ jobsingletransfer.c \ jobsingledebitnote.c \ jobsepatransfer.c \ jobsepadebitnote.c \ jobsepaflashdebitnote.c \ jobcreatesto.c \ jobmodifysto.c \ jobdeletesto.c \ jobcreatedatedtransfer.c \ jobmodifydatedtransfer.c \ jobdeletedatedtransfer.c \ jobinternaltransfer.c \ jobeutransfer.c \ jobloadcellphone.c \ jobsepacreatesto.c \ jobsepagetstandingorders.c \ jobsepadeletesto.c sources: for f in $(libjobs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetstandingorders_l.h0000644000175000017500000000204212364015477022562 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETSTANDINGORDERS_L_H #define AQBANKING_JOBGETSTANDINGORDERS_L_H #include #include #ifdef __cplusplus extern "C" { #endif AB_JOB *AB_JobGetStandingOrders_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobGetStandingOrders_toDb(const AB_JOB *j, GWEN_DB_NODE *db); void AB_JobGetStandingOrders_SetStandingOrders(AB_JOB *j, AB_TRANSACTION_LIST2 *tl); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETSTANDINGORDERS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepagetstandingorders.h0000644000175000017500000000167212367466675023145 00000000000000/*************************************************************************** begin : Sun Aug 03 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPAGETSTANDINGORDERS_H #define AQBANKING_JOBSEPAGETSTANDINGORDERS_H #include /** @addtogroup G_AB_JOBS_XFER_SEPA_STANDINGORDERS * * This job requests active SEPA standing orders. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaGetStandingOrders_new(AB_ACCOUNT *a); #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AQBANKING_JOBSEPAGETSTANDINGORDERS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetbalance_l.h0000644000175000017500000000172212364015477021125 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETBALANCE_L_H #define AQBANKING_JOBGETBALANCE_L_H #include #ifdef __cplusplus extern "C" { #endif AB_JOB *AB_JobGetBalance_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobGetBalance_toDb(const AB_JOB *j, GWEN_DB_NODE *db); void AB_JobGetBalance_SetAccountStatus(AB_JOB *j, const AB_ACCOUNT_STATUS *as); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETBALANCE_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetstandingorders.h0000644000175000017500000000226112364015477022252 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETSTANDINGORDERS_H #define AQBANKING_JOBGETSTANDINGORDERS_H #include #include /** @addtogroup G_AB_JOBS_STO_GET * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * Creates a job which retrieves a list of currently active standing orders * for the given account. * @param a account for which you want the standing orders */ AQBANKING_API AB_JOB *AB_JobGetStandingOrders_new(AB_ACCOUNT *a); /** @deprecated */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION_LIST2* AB_JobGetStandingOrders_GetStandingOrders(const AB_JOB *j); #ifdef __cplusplus } #endif /*@}*/ #endif /* AQBANKING_JOBGETSTANDINGORDERS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobeutransfer_l.h0000644000175000017500000000140612364015477021215 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBEUTRANSFER_P_H #define AQBANKING_JOBEUTRANSFER_P_H #include #include "jobeutransfer_be.h" AB_JOB *AB_JobEuTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobEuTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatedatedtransfer_be.h0000644000175000017500000000217012364015477023203 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATEDATEDTRANSFER_BE_H #define AQBANKING_JOBCREATEDATEDTRANSFER_BE_H #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_MK * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * This function lets the backend specify the limits for some of the fields * of a @ref AB_TRANSACTION. */ AQBANKING_API AQBANKING_DEPRECATED void AB_JobCreateDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsingletransfer.h0000644000175000017500000000434712364015477021561 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSINGLETRANSFER_H #define AQBANKING_JOBSINGLETRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_TRANSFER * * This is a single national transfer (i.e. the banks of the payee and the * recipient are in the same country). */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSingleTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobSingleTransfer_GetTransaction. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobSingleTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION *AB_JobSingleTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobSingleTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobeutransfer.c0000644000175000017500000002020512364015477020673 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobeutransfer.h" #include "jobeutransfer_be.h" #include "jobeutransfer_p.h" #include "job_l.h" #include "account_l.h" #include "banking_l.h" #include #include #include #include #include GWEN_INHERIT(AB_JOB, AB_JOBEUTRANSFER) AB_JOB *AB_JobEuTransfer_new(AB_ACCOUNT *a){ AB_JOB *j; AB_JOBEUTRANSFER *jd; j=AB_Job_new(AB_Job_TypeEuTransfer, a); GWEN_NEW_OBJECT(AB_JOBEUTRANSFER, jd); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOBEUTRANSFER, j, jd, AB_JobEuTransfer_FreeData); jd->countryInfoList=AB_EuTransferInfo_List_new(); return j; } void GWENHYWFAR_CB AB_JobEuTransfer_FreeData(void *bp, void *p) { AB_JOBEUTRANSFER *jd; jd=(AB_JOBEUTRANSFER*)p; AB_Transaction_free(jd->transaction); AB_EuTransferInfo_List_free(jd->countryInfoList); GWEN_FREE_OBJECT(jd); } void AB_JobEuTransfer_SetCountryInfoList(AB_JOB *j, AB_EUTRANSFER_INFO_LIST *l){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); AB_EuTransferInfo_List_free(jd->countryInfoList); jd->countryInfoList=l; } const AB_EUTRANSFER_INFO *AB_JobEuTransfer_FindCountryInfo(const AB_JOB *j, const char *cnt){ AB_JOBEUTRANSFER *jd; AB_EUTRANSFER_INFO *ei; assert(cnt); assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); if (jd->countryInfoList==0) return 0; ei=AB_EuTransferInfo_List_First(jd->countryInfoList); while(ei) { const char *s; s=AB_EuTransferInfo_GetCountryCode(ei); if (s) { if (strcasecmp(s, cnt)==0) break; } ei=AB_EuTransferInfo_List_Next(ei); } if (!ei) { DBG_INFO(AQBANKING_LOGDOMAIN, "Country \"%s\" not found", cnt); } return ei; } const AB_EUTRANSFER_INFO_LIST* AB_JobEuTransfer_GetCountryInfoList(const AB_JOB *j){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); if (jd->countryInfoList==0) return 0; if (AB_EuTransferInfo_List_GetCount(jd->countryInfoList)==0) return 0; return jd->countryInfoList; } int AB_JobEuTransfer_GetIbanAllowed(const AB_JOB *j){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); return jd->ibanAllowed; } void AB_JobEuTransfer_SetIbanAllowed(AB_JOB *j, int b){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); jd->ibanAllowed=b; } AB_JOBEUTRANSFER_CHARGE_WHOM AB_JobEuTransfer_GetChargeWhom(const AB_JOB *j){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); return jd->chargeWhom; } void AB_JobEuTransfer_SetChargeWhom(AB_JOB *j, AB_JOBEUTRANSFER_CHARGE_WHOM i){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); jd->chargeWhom=i; } int AB_JobEuTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); /* TODO: check transaction */ if (1) { GWEN_DB_NODE *dbT; DBG_ERROR(0, "Transaction is:"); dbT=GWEN_DB_Group_new("Test-Transaction"); AB_Transaction_toDb(t, dbT); GWEN_DB_Dump(dbT, 2); GWEN_DB_Group_free(dbT); } AB_Transaction_free(jd->transaction); if (t) { AB_ACCOUNT *a; AB_BANKING *ba; a=AB_Job_GetAccount(j); assert(a); ba=AB_Account_GetBanking(a); assert(ba); jd->transaction=AB_Transaction_dup(t); /* assign unique id */ AB_Transaction_SetUniqueId(jd->transaction, AB_Banking_GetUniqueId(ba)); } else jd->transaction=0; return 0; } const AB_TRANSACTION *AB_JobEuTransfer_GetTransaction(const AB_JOB *j){ AB_JOBEUTRANSFER *jd; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); return jd->transaction; } int AB_JobEuTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db) { AB_JOBEUTRANSFER *jd; GWEN_DB_NODE *dbT; int rv; assert(j); jd=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBEUTRANSFER, j); assert(jd); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "params/ibanAllowed", jd->ibanAllowed); /* store country info */ dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "params/countryInfo"); if (jd->countryInfoList) { AB_EUTRANSFER_INFO *ei; ei=AB_EuTransferInfo_List_First(jd->countryInfoList); while(ei) { GWEN_DB_NODE *dbEi; dbEi=GWEN_DB_Group_new("country"); if (AB_EuTransferInfo_toDb(ei, dbEi)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not store country info"); GWEN_DB_Group_free(dbEi); } else { GWEN_DB_AddGroup(dbT, dbEi); } ei=AB_EuTransferInfo_List_Next(ei); } /* while */ } /* store transaction */ if (jd->transaction) { dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "args/transaction"); assert(dbT); rv=AB_Transaction_toDb(jd->transaction, dbT); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return rv; } } switch(jd->chargeWhom) { case AB_JobEuTransfer_ChargeWhom_Local: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "args/chargeWhom", "local"); break; case AB_JobEuTransfer_ChargeWhom_Remote: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "args/chargeWhom", "remote"); break; case AB_JobEuTransfer_ChargeWhom_Share: GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "args/chargeWhom", "share"); break; default: break; } /* switch */ return 0; } AB_JOB *AB_JobEuTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db) { AB_JOB *j; AB_JOBEUTRANSFER *jd; GWEN_DB_NODE *dbT; const char *s; j=AB_Job_new(AB_Job_TypeEuTransfer, a); GWEN_NEW_OBJECT(AB_JOBEUTRANSFER, jd); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOBEUTRANSFER, j, jd, AB_JobEuTransfer_FreeData); /* read params */ if (jd->countryInfoList) AB_EuTransferInfo_List_Clear(jd->countryInfoList); else jd->countryInfoList=AB_EuTransferInfo_List_new(); jd->ibanAllowed=GWEN_DB_GetIntValue(db, "params/ibanAllowed", 0, 0); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "args/countryInfo"); if (dbT) { GWEN_DB_NODE *dbEi; dbEi=GWEN_DB_FindFirstGroup(dbT, "country"); while(dbEi) { AB_EUTRANSFER_INFO *ei; ei=AB_EuTransferInfo_fromDb(dbEi); if (ei==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad country info in job"); } else { AB_EuTransferInfo_List_Add(ei, jd->countryInfoList); } dbEi=GWEN_DB_FindNextGroup(dbEi, "country"); } } /* read arguments */ dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "args/transaction"); if (dbT) jd->transaction=AB_Transaction_fromDb(dbT); s=GWEN_DB_GetCharValue(db, "args/chargeWhom", 0, 0); if (s) { if (strcasecmp(s, "local")==0) jd->chargeWhom=AB_JobEuTransfer_ChargeWhom_Local; else if (strcasecmp(s, "remote")==0) jd->chargeWhom=AB_JobEuTransfer_ChargeWhom_Remote; if (strcasecmp(s, "share")==0) jd->chargeWhom=AB_JobEuTransfer_ChargeWhom_Share; else jd->chargeWhom=AB_JobEuTransfer_ChargeWhom_Unknown; } else jd->chargeWhom=AB_JobEuTransfer_ChargeWhom_Unknown; return j; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetdatedtransfers_l.h0000644000175000017500000000204212364015477022545 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETDATEDTRANSFERS_L_H #define AQBANKING_JOBGETDATEDTRANSFERS_L_H #include #include #ifdef __cplusplus extern "C" { #endif AB_JOB *AB_JobGetDatedTransfers_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobGetDatedTransfers_toDb(const AB_JOB *j, GWEN_DB_NODE *db); void AB_JobGetDatedTransfers_SetDatedTransfers(AB_JOB *j, AB_TRANSACTION_LIST2 *tl); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETDATEDTRANSFERS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobeutransfer_be.h0000644000175000017500000000251412364015477021351 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBEUTRANSFER_BE_H #define AQBANKING_JOBEUTRANSFER_BE_H #include #include /** @addtogroup G_AB_JOBS_XFER_EU * */ /*@{*/ /** @name Backend Functions * * Functions in this group are only to be called by banking backends. */ /*@{*/ /** * Set the country info list (containing information about valid destination * countries and transfer limits per country). * This function takes over the given list and all its members. */ AQBANKING_API void AB_JobEuTransfer_SetCountryInfoList(AB_JOB *j, AB_EUTRANSFER_INFO_LIST *l); /** * Tell AqBanking whether it is allowed to specify the IBAN for the * destination account. */ AQBANKING_API void AB_JobEuTransfer_SetIbanAllowed(AB_JOB *j, int b); /*@}*/ /*@}*/ /* addtogroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatesto.c0000644000175000017500000000244012364015477020507 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobcreatesto.h" #include "jobcreatesto_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobCreateStandingOrder_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeCreateStandingOrder, a); } void AB_JobCreateStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobCreateStandingOrder_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobCreateStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobCreateStandingOrder_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadebitnote.h0000644000175000017500000000422212364015477021351 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPADEBITNOTE_H #define AQBANKING_JOBSEPADEBITNOTE_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_SEPA_DEBITNOTE * * This is a SEPA debitnote. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaDebitNote_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the debitnote to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobSepaDebitNote_GetTransaction. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobSepaDebitNote_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION *AB_JobSepaDebitNote_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobSepaDebitNote_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobloadcellphone_l.h0000644000175000017500000000117512364015477021653 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBLOADCELLPHONE_L_H #define AQBANKING_JOBLOADCELLPHONE_L_H #include #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatedatedtransfer.h0000644000175000017500000000440012364015477022533 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBCREATEDATEDTRANSFER_H #define AQBANKING_JOBCREATEDATEDTRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_DATED_TRANSFER_MK * * This job creates a dated transfer. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobCreateDatedTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobCreateDatedTransfer_GetTransaction. * This transaction MUST NOT contain splits. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobCreateDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION *AB_JobCreateDatedTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobCreateDatedTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepatransfer_l.h0000644000175000017500000000116412364015477021535 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPATRANSFER_L_H #define AQBANKING_JOBSEPATRANSFER_L_H #include #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepacreatesto.c0000644000175000017500000000132212364015477021356 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobsepacreatesto.h" #include "job_l.h" AB_JOB *AB_JobSepaCreateStandingOrder_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeSepaCreateStandingOrder, a); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepacreatesto.h0000644000175000017500000000165312364015477021372 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPACREATESTO_H #define AQBANKING_JOBSEPACREATESTO_H #include #include #include /** @addtogroup G_AB_JOBS_SEPA_STO_MK Create a SEPA Standing Order * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaCreateStandingOrder_new(AB_ACCOUNT *a); #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobcreatedatedtransfer.c0000644000175000017500000000253412364015477022534 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobcreatedatedtransfer.h" #include "jobcreatedatedtransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobCreateDatedTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeCreateDatedTransfer, a); } void AB_JobCreateDatedTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobCreateDatedTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobCreateDatedTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobCreateDatedTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobinternaltransfer_l.h0000644000175000017500000000142312364015477022417 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBINTERNALTRANSFER_L_H #define AQBANKING_JOBINTERNALTRANSFER_L_H #include AB_JOB *AB_JobInternalTransfer_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_JobInternalTransfer_toDb(const AB_JOB *j, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetbalance.c0000644000175000017500000000353412364015477020610 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetbalance.h" #include "jobgetbalance_be.h" #include "jobgetbalance_p.h" #include "job_l.h" #include #include #include #include #include GWEN_INHERIT(AB_JOB, AB_JOBGETBALANCE) AB_JOB *AB_JobGetBalance_new(AB_ACCOUNT *a){ AB_JOB *j; AB_JOBGETBALANCE *aj; j=AB_Job_new(AB_Job_TypeGetBalance, a); GWEN_NEW_OBJECT(AB_JOBGETBALANCE, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOBGETBALANCE, j, aj, AB_JobGetBalance_FreeData); return j; } void GWENHYWFAR_CB AB_JobGetBalance_FreeData(void *bp, void *p) { AB_JOBGETBALANCE *aj; aj=(AB_JOBGETBALANCE*)p; AB_AccountStatus_free(aj->accountStatus); GWEN_FREE_OBJECT(aj); } const AB_ACCOUNT_STATUS *AB_JobGetBalance_GetAccountStatus(AB_JOB *j){ AB_JOBGETBALANCE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBGETBALANCE, j); assert(aj); return aj->accountStatus; } void AB_JobGetBalance_SetAccountStatus(AB_JOB *j, const AB_ACCOUNT_STATUS *as){ AB_JOBGETBALANCE *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOBGETBALANCE, j); assert(aj); AB_AccountStatus_free(aj->accountStatus); if (as) aj->accountStatus=AB_AccountStatus_dup(as); else aj->accountStatus=0; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepatransfer.h0000644000175000017500000000421012364015477021215 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPATRANSFER_H #define AQBANKING_JOBSEPATRANSFER_H #include #include #include /** @addtogroup G_AB_JOBS_XFER_SEPA_TRANSFER * * This is a SEPA transfer. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaTransfer_new(AB_ACCOUNT *a); /** @name Arguments * * */ /*@{*/ /** * This function sets the transfer to be performed. * Please note that the backend might later replace the transaction given * here with a validated version (upon execution of the job). * So if you want to be sure that you have the recent version of the * transaction you should call @ref AB_JobSepaTransfer_GetTransaction. */ AQBANKING_API AQBANKING_DEPRECATED int AB_JobSepaTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); /** * Returns the currently stored transaction for this job. After the job has * been executed by the backend the transaction returned will very likely * be a pointer to the validated replacement for the initially given * transaction. */ AQBANKING_API AQBANKING_DEPRECATED AB_TRANSACTION *AB_JobSepaTransfer_GetTransaction(const AB_JOB *j); /*@}*/ /** @name Parameters * * The functions in this group are only available after the function * @ref AB_Job_CheckAvailability has been called and only if that call flagged * success (i.e. that the job is available). */ /*@{*/ /** * Returns the transaction field limits for this job. */ AQBANKING_API AQBANKING_DEPRECATED const AB_TRANSACTION_LIMITS *AB_JobSepaTransfer_GetFieldLimits(AB_JOB *j); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetdatedtransfers_p.h0000644000175000017500000000204412364015477022553 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETDATEDTRANSFERS_P_H #define AQBANKING_JOBGETDATEDTRANSFERS_P_H #include #include "jobgetdatedtransfers_l.h" #ifdef __cplusplus extern "C" { #endif typedef struct AB_JOB_GETDATEDTRANSFERS AB_JOB_GETDATEDTRANSFERS; struct AB_JOB_GETDATEDTRANSFERS { /* arguments */ /* parameters */ /* responses */ AB_TRANSACTION_LIST2 *datedTransfers; }; static void GWENHYWFAR_CB AB_JobGetDatedTransfers_FreeData(void *bp, void *p); #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETDATEDTRANSFERS_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetdatedtransfers_be.h0000644000175000017500000000142312364015477022702 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETDATEDTRANSFERS_BE_H #define AQBANKING_JOBGETDATEDTRANSFERS_BE_H #include #include #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETDATEDTRANSFERS_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadebitnote_l.h0000644000175000017500000000116712364015477021671 00000000000000/*************************************************************************** begin : Sun Sep 21 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPADEBITNOTE_L_H #define AQBANKING_JOBSEPADEBITNOTE_L_H #include #endif aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetstandingorders_be.h0000644000175000017500000000142312364015477022717 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBGETSTANDINGORDERS_BE_H #define AQBANKING_JOBGETSTANDINGORDERS_BE_H #include #include #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* AQBANKING_JOBGETSTANDINGORDERS_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobinternaltransfer.c0000644000175000017500000000243412364015477022102 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobinternaltransfer.h" #include "jobinternaltransfer_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobInternalTransfer_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeInternalTransfer, a); } void AB_JobInternalTransfer_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobInternalTransfer_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobInternalTransfer_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobInternalTransfer_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobdeletesto.c0000644000175000017500000000244012364015477020506 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobdeletesto.h" #include "jobdeletesto_be.h" #include "job_l.h" #include #include #include AB_JOB *AB_JobDeleteStandingOrder_new(AB_ACCOUNT *a){ return AB_Job_new(AB_Job_TypeDeleteStandingOrder, a); } void AB_JobDeleteStandingOrder_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits){ AB_Job_SetFieldLimits(j, limits); } const AB_TRANSACTION_LIMITS *AB_JobDeleteStandingOrder_GetFieldLimits(AB_JOB *j) { return AB_Job_GetFieldLimits(j); } int AB_JobDeleteStandingOrder_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t){ return AB_Job_SetTransaction(j, t); } const AB_TRANSACTION *AB_JobDeleteStandingOrder_GetTransaction(const AB_JOB *j){ return AB_Job_GetTransaction(j); } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobgetstandingorders.c0000644000175000017500000001043512364015477022247 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "jobgetstandingorders_p.h" #include "jobgetstandingorders_be.h" #include "job_l.h" #include #include #include #include #include #include GWEN_INHERIT(AB_JOB, AB_JOB_GETSTANDINGORDERS) AB_JOB *AB_JobGetStandingOrders_new(AB_ACCOUNT *a) { AB_JOB *j; AB_JOB_GETSTANDINGORDERS *aj; j=AB_Job_new(AB_Job_TypeGetStandingOrders, a); GWEN_NEW_OBJECT(AB_JOB_GETSTANDINGORDERS, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j, aj, AB_JobGetStandingOrders_FreeData); return j; } void GWENHYWFAR_CB AB_JobGetStandingOrders_FreeData(void *bp, void *p){ AB_JOB_GETSTANDINGORDERS *aj; aj=(AB_JOB_GETSTANDINGORDERS*)p; if (aj->standingOrders) AB_Transaction_List2_freeAll(aj->standingOrders); GWEN_FREE_OBJECT(aj); } AB_TRANSACTION_LIST2* AB_JobGetStandingOrders_GetStandingOrders(const AB_JOB *j){ AB_JOB_GETSTANDINGORDERS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j); assert(aj); if (aj->standingOrders) { if (AB_Transaction_List2_GetSize(aj->standingOrders)==0) return 0; } return aj->standingOrders; } void AB_JobGetStandingOrders_SetStandingOrders(AB_JOB *j, AB_TRANSACTION_LIST2 *tl){ AB_JOB_GETSTANDINGORDERS *aj; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j); assert(aj); assert(tl); if (aj->standingOrders) AB_Transaction_List2_freeAll(aj->standingOrders); aj->standingOrders=tl; } AB_JOB *AB_JobGetStandingOrders_fromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db){ AB_JOB *j; AB_JOB_GETSTANDINGORDERS *aj; GWEN_DB_NODE *dbT; j=AB_Job_new(AB_Job_TypeGetStandingOrders, a); GWEN_NEW_OBJECT(AB_JOB_GETSTANDINGORDERS, aj); GWEN_INHERIT_SETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j, aj, AB_JobGetStandingOrders_FreeData); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j); assert(aj); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "result/standingOrders"); if (dbT) { GWEN_DB_NODE *dbT2; aj->standingOrders=AB_Transaction_List2_new(); /* read standingOrders */ dbT2=GWEN_DB_FindFirstGroup(dbT, "standingOrder"); while(dbT2) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT2); if (t) AB_Transaction_List2_PushBack(aj->standingOrders, t); dbT2=GWEN_DB_FindNextGroup(dbT2, "standingOrder"); } /* while */ } /* if standingOrders */ return j; } int AB_JobGetStandingOrders_toDb(const AB_JOB *j, GWEN_DB_NODE *db){ AB_JOB_GETSTANDINGORDERS *aj; GWEN_DB_NODE *dbT; int errors; assert(j); aj=GWEN_INHERIT_GETDATA(AB_JOB, AB_JOB_GETSTANDINGORDERS, j); assert(aj); errors=0; dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "result"); assert(dbT); if (aj->standingOrders) { AB_TRANSACTION_LIST2_ITERATOR *it; GWEN_DB_NODE *dbT2; dbT2=GWEN_DB_GetGroup(dbT, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "standingOrders"); assert(dbT2); it=AB_Transaction_List2_First(aj->standingOrders); if (it) { AB_TRANSACTION *t; t=AB_Transaction_List2Iterator_Data(it); assert(t); while(t) { GWEN_DB_NODE *dbT3; dbT3=GWEN_DB_GetGroup(dbT2, GWEN_PATH_FLAGS_CREATE_GROUP, "standingOrder"); assert(dbT3); if (AB_Transaction_toDb(t, dbT3)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error saving standing order"); errors++; } t=AB_Transaction_List2Iterator_Next(it); } /* while */ AB_Transaction_List2Iterator_free(it); } /* if it */ } /* if standingOrders */ return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/jobs/jobsepadeletesto.h0000644000175000017500000000165212624441727021370 00000000000000/*************************************************************************** begin : Wed Jan 15 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOBSEPADELETESTO_H #define AQBANKING_JOBSEPADELETESTO_H #include #include #include /** @addtogroup G_AB_JOBS_SEPA_STO_MK Create a SEPA Standing Order * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_JOB *AB_JobSepaDeleteStandingOrder_new(AB_ACCOUNT *a); #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/bankinfoplugin_l.h0000644000175000017500000000200512364015477020411 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKINFOPLUGIN_L_H #define AQBANKING_BANKINFOPLUGIN_L_H #define AB_BANKINFO_PLUGIN_FOLDER "bankinfo" #include "bankinfoplugin_be.h" #include GWEN_LIST_FUNCTION_LIB_DEFS(AB_BANKINFO_PLUGIN, AB_BankInfoPlugin, AQBANKING_API) void AB_BankInfoPlugin_SetPlugin(AB_BANKINFO_PLUGIN *bip, GWEN_PLUGIN *pl); #endif /* AQBANKING_BANKINFOPLUGIN_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_l.h0000644000175000017500000000164012364015477017020 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_L_H #define AQBANKING_BANKING_L_H #include #include #include #include int AB_Banking_IsOnlineInit(const AB_BANKING *ab); int AB_Banking_PluginSystemInit(void); int AB_Banking_PluginSystemFini(void); GWEN_CONFIGMGR *AB_Banking_GetConfigMgr(AB_BANKING *ab); #endif /* AQBANKING_BANKING_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/imexporter_be.h0000644000175000017500000000714312364015477017744 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file imexporter_be.h * @short This file is used by provider/importer/exporter plugins. */ #ifndef AQBANKING_IMEXPORTER_BE_H #define AQBANKING_IMEXPORTER_BE_H #include #include #include /** @defgroup G_AB_BE_IMEXPORTER Generic Im- and Exporter * @ingroup G_AB_BE_INTERFACE */ /*@{*/ #ifdef __cplusplus extern "C" { #endif typedef AB_IMEXPORTER* (*AB_IMEXPORTER_FACTORY_FN)(AB_BANKING *ab); /** @name Construction and Destruction * */ /*@{*/ AQBANKING_API AB_IMEXPORTER *AB_ImExporter_new(AB_BANKING *ab, const char *name); AQBANKING_API void AB_ImExporter_free(AB_IMEXPORTER *ie); /*@}*/ /** @name Manipulation of the Flags * */ /*@{*/ AQBANKING_API void AB_ImExporter_SetFlags(AB_IMEXPORTER *ie, uint32_t flags); AQBANKING_API void AB_ImExporter_AddFlags(AB_IMEXPORTER *ie, uint32_t flags); AQBANKING_API void AB_ImExporter_SubFlags(AB_IMEXPORTER *ie, uint32_t flags); /*@}*/ /** @name Prototypes for Virtual Backend Functions * */ /*@{*/ typedef int (*AB_IMEXPORTER_IMPORT_FN)(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); typedef int (*AB_IMEXPORTER_EXPORT_FN)(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params); /** * Checks whether the given file is possibly supported by the plugin. */ typedef int (*AB_IMEXPORTER_CHECKFILE_FN)(AB_IMEXPORTER *ie, const char *fname); /** * This function should return a dialog (see @ref GWEN_DIALOG) which * allows editing of the given profile. * (introduced in AqBanking 4.3.0) */ typedef int (*AB_IMEXPORTER_GET_EDITPROFILE_DIALOG_FN)(AB_IMEXPORTER *ie, GWEN_DB_NODE *params, const char *testFileName, GWEN_DIALOG **pDlg); /*@}*/ /** @name Setters for Virtual Backend Functions * */ /*@{*/ AQBANKING_API void AB_ImExporter_SetImportFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_IMPORT_FN f); AQBANKING_API void AB_ImExporter_SetExportFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_EXPORT_FN f); AQBANKING_API void AB_ImExporter_SetCheckFileFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_CHECKFILE_FN f); AQBANKING_API void AB_ImExporter_SetGetEditProfileDialogFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_GET_EDITPROFILE_DIALOG_FN f); /*@}*/ /** @name Handling of ImExporter Plugins * */ /*@{*/ typedef AB_IMEXPORTER* (*AB_PLUGIN_IMEXPORTER_FACTORY_FN)(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API GWEN_PLUGIN *AB_Plugin_ImExporter_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); AQBANKING_API AB_IMEXPORTER *AB_Plugin_ImExporter_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API void AB_Plugin_ImExporter_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_IMEXPORTER_FACTORY_FN fn); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AQBANKING_IMEXPORTER_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/account_l.h0000644000175000017500000000243012364015477017041 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCOUNT_L_H #define AQBANKING_ACCOUNT_L_H #include #include #include #include #include AB_ACCOUNT *AB_Account_new(AB_BANKING *ab, AB_PROVIDER *pro); void AB_Account_Attach(AB_ACCOUNT *acc); int AB_Account_Update(AB_ACCOUNT *a); void AB_Account_SetProvider(AB_ACCOUNT *a, AB_PROVIDER *pro); AB_ACCOUNT *AB_Account_fromDb(AB_BANKING *ab, GWEN_DB_NODE *db); int AB_Account_toDb(const AB_ACCOUNT *a, GWEN_DB_NODE *db); int AB_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db); const char *AB_Account_GetDbId(const AB_ACCOUNT *a); void AB_Account_SetDbId(AB_ACCOUNT *a, const char *s); #endif /* AQBANKING_ACCOUNT_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_init.c0000644000175000017500000003477212453312350017524 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /* This file is included by banking.c */ #ifdef OS_WIN32 # include #endif static uint32_t ab_init_count=0; static uint32_t ab_plugin_init_count=0; static GWEN_PLUGIN_MANAGER *ab_pluginManagerBankInfo=NULL; static GWEN_PLUGIN_MANAGER *ab_pluginManagerProvider=NULL; static GWEN_PLUGIN_MANAGER *ab_pluginManagerImExporter=NULL; static AB_IMEXPORTER_LIST *ab_imexporters=NULL; static AB_BANKINFO_PLUGIN_LIST *ab_bankInfoPlugins=NULL; #define AB_DBIO_FOLDER "dbio" int AB_Banking_PluginSystemInit(void) { if (ab_plugin_init_count==0) { const char *s; GWEN_PLUGIN_MANAGER *pm; int rv; rv=GWEN_Init(); if (rv) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, rv); return rv; } if (!GWEN_Logger_IsOpen(AQBANKING_LOGDOMAIN)) { GWEN_Logger_Open(AQBANKING_LOGDOMAIN, "aqbanking", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Notice); } s=getenv("AQBANKING_LOGLEVEL"); if (s && *s) { GWEN_LOGGER_LEVEL ll; ll=GWEN_Logger_Name2Level(s); GWEN_Logger_SetLevel(AQBANKING_LOGDOMAIN, ll); } DBG_INFO(AQBANKING_LOGDOMAIN, "AqBanking v" AQBANKING_VERSION_FULL_STRING " (compiled at " COMPILE_DATETIME "): initialising"); /* define locale paths */ GWEN_PathManager_DefinePath(AB_PM_LIBNAME, AB_PM_LOCALEDIR); GWEN_PathManager_AddPathFromWinReg(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_LOCALEDIR, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_LOCALEDIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PathManager_AddRelPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_LOCALEDIR, LOCALEDIR, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PathManager_AddPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_LOCALEDIR, LOCALEDIR); #endif if (1) { GWEN_STRINGLIST *sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_LOCALEDIR); const char *localedir=GWEN_StringList_FirstString(sl); rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, localedir); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not bind textdomain (%d)", rv); } else { rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8"); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not set codeset (%d)", rv); } } GWEN_StringList_free(sl); } /* define sysconf paths */ GWEN_PathManager_DefinePath(AB_PM_LIBNAME, AB_PM_SYSCONFDIR); GWEN_PathManager_AddPathFromWinReg(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_SYSCONFDIR, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_SYSCONFDIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PathManager_AddRelPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_SYSCONFDIR, AQBANKING_SYSCONF_DIR, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PathManager_AddPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_SYSCONFDIR, AQBANKING_SYSCONF_DIR); #endif /* define data paths */ GWEN_PathManager_DefinePath(AB_PM_LIBNAME, AB_PM_DATADIR); GWEN_PathManager_AddPathFromWinReg(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_DATADIR, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_DATADIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PathManager_AddRelPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_DATADIR, AQBANKING_DATA_DIR, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PathManager_AddPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_DATADIR, AQBANKING_DATA_DIR); #endif /* define wizard paths */ GWEN_PathManager_DefinePath(AB_PM_LIBNAME, AB_PM_WIZARDDIR); GWEN_PathManager_AddPathFromWinReg(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_WIZARDDIR, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_WIZARDDIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PathManager_AddRelPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_WIZARDDIR, AQBANKING_PLUGINS DIRSEP AB_WIZARD_FOLDER, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PathManager_AddPath(AB_PM_LIBNAME, AB_PM_LIBNAME, AB_PM_WIZARDDIR, AQBANKING_PLUGINS DIRSEP AB_WIZARD_FOLDER); #endif /* create bankinfo plugin manager */ DBG_INFO(AQBANKING_LOGDOMAIN, "Registering bankinfo plugin manager"); pm=GWEN_PluginManager_new("bankinfo", AB_PM_LIBNAME); if (GWEN_PluginManager_Register(pm)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not register bankinfo plugin manager"); return GWEN_ERROR_GENERIC; } GWEN_PluginManager_AddPathFromWinReg(pm, AB_PM_LIBNAME, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_BANKINFODIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PluginManager_AddRelPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_BANKINFO_PLUGIN_FOLDER, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PluginManager_AddPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_BANKINFO_PLUGIN_FOLDER); #endif ab_pluginManagerBankInfo=pm; /* create provider plugin manager */ DBG_INFO(AQBANKING_LOGDOMAIN, "Registering provider plugin manager"); pm=GWEN_PluginManager_new("provider", AB_PM_LIBNAME); if (GWEN_PluginManager_Register(pm)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not register provider plugin manager"); return GWEN_ERROR_GENERIC; } GWEN_PluginManager_AddPathFromWinReg(pm, AB_PM_LIBNAME, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_PROVIDERDIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PluginManager_AddRelPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_PROVIDER_FOLDER, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PluginManager_AddPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_PROVIDER_FOLDER); #endif ab_pluginManagerProvider=pm; /* create imexporters plugin manager */ DBG_INFO(AQBANKING_LOGDOMAIN, "Registering imexporters plugin manager"); pm=GWEN_PluginManager_new("imexporter", AB_PM_LIBNAME); if (GWEN_PluginManager_Register(pm)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not register imexporters plugin manager"); return GWEN_ERROR_GENERIC; } GWEN_PluginManager_AddPathFromWinReg(pm, AB_PM_LIBNAME, AB_BANKING_REGKEY_PATHS, AB_BANKING_REGKEY_IMPORTERDIR); #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* add folder relative to EXE */ GWEN_PluginManager_AddRelPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_IMEXPORTER_FOLDER, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PluginManager_AddPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_IMEXPORTER_FOLDER); #endif ab_pluginManagerImExporter=pm; /* insert DBIO plugin folder */ pm=GWEN_PluginManager_FindPluginManager("dbio"); if (pm) { #if defined(OS_WIN32) || defined(ENABLE_LOCAL_INSTALL) /* insert folder relative to EXE */ GWEN_PluginManager_InsertRelPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_DBIO_FOLDER, GWEN_PathManager_RelModeExe); #else /* add absolute folder */ GWEN_PluginManager_InsertPath(pm, AB_PM_LIBNAME, AQBANKING_PLUGINS DIRSEP AB_DBIO_FOLDER); #endif } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not find DBIO plugin manager, maybe GWEN_Init() was not called?"); return GWEN_ERROR_GENERIC; } ab_imexporters=AB_ImExporter_List_new(); ab_bankInfoPlugins=AB_BankInfoPlugin_List_new(); } ab_plugin_init_count++; return 0; } int AB_Banking_PluginSystemFini(void) { if (ab_plugin_init_count) { if (--ab_plugin_init_count==0) { AB_BankInfoPlugin_List_free(ab_bankInfoPlugins); ab_bankInfoPlugins=NULL; AB_ImExporter_List_free(ab_imexporters); ab_imexporters=NULL; /* unregister and unload provider plugin manager */ if (ab_pluginManagerProvider) { if (GWEN_PluginManager_Unregister(ab_pluginManagerProvider)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unregister provider plugin manager"); } GWEN_PluginManager_free(ab_pluginManagerProvider); ab_pluginManagerProvider=NULL; } /* unregister and unload bankinfo plugin manager */ if (ab_pluginManagerBankInfo) { if (GWEN_PluginManager_Unregister(ab_pluginManagerBankInfo)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unregister bankinfo plugin manager"); } GWEN_PluginManager_free(ab_pluginManagerBankInfo); ab_pluginManagerBankInfo=NULL; } /* unregister and unload imexporters plugin manager */ if (ab_pluginManagerImExporter) { if (GWEN_PluginManager_Unregister(ab_pluginManagerImExporter)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unregister imexporter plugin manager"); } GWEN_PluginManager_free(ab_pluginManagerImExporter); ab_pluginManagerImExporter=NULL; } /* undefine our own paths */ GWEN_PathManager_UndefinePath(AB_PM_LIBNAME, AB_PM_LOCALEDIR); GWEN_PathManager_UndefinePath(AB_PM_LIBNAME, AB_PM_DATADIR); GWEN_PathManager_UndefinePath(AB_PM_LIBNAME, AB_PM_SYSCONFDIR); GWEN_PathManager_UndefinePath(AB_PM_LIBNAME, AB_PM_WIZARDDIR); /* remove AqBanking additions to all pathmanagers */ GWEN_PathManager_RemovePaths(AB_PM_LIBNAME); GWEN_Logger_Close(AQBANKING_LOGDOMAIN); GWEN_Fini(); } } else { DBG_WARN(AQBANKING_LOGDOMAIN, "AB_Banking_PluginSystemFini() called too often!"); } return 0; } int AB_Banking_Init(AB_BANKING *ab) { assert(ab); /* do basic initialisation for all AB_BANKING objects */ if (ab_init_count==0) { int rv; rv=AB_Banking_PluginSystemInit(); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_PluginSystemFini(); return rv; } } ab_init_count++; if (ab_init_count==0) { /* nothing to do extra here right now */ } ab->initCount++; return 0; } int AB_Banking_Fini(AB_BANKING *ab) { /* deinit local stuff */ if (ab->initCount<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "AqBanking object not initialized!"); return GWEN_ERROR_INVALID; } if (--(ab->initCount)==0) { /* nothing to do for banking objects here */ } /* deinit global stuff */ if (ab_init_count<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "AqBanking not initialized, internal error"); return GWEN_ERROR_INVALID; } if (--(ab_init_count)==0) { int rv; rv=AB_Banking_PluginSystemFini(); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); } } return 0; } int AB_Banking_OnlineInit(AB_BANKING *ab) { assert(ab); if (ab->initCount==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Object not initialised"); return GWEN_ERROR_INVALID; } if (ab->onlineInitCount==0) { int rv; rv=AB_Banking_LoadConfig(ab); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnloadConfig(ab); return rv; } } /* if first init */ ab->onlineInitCount++; return 0; } int AB_Banking_OnlineFini(AB_BANKING *ab) { int rv=0; assert(ab); if (ab->onlineInitCount<1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Online part of AqBanking not initialized!"); return GWEN_ERROR_INVALID; } if (ab->onlineInitCount==1) { rv=AB_Banking_SaveConfig(ab); AB_Banking_UnloadConfig(ab); } ab->onlineInitCount--; return rv; } void AB_Banking_ActivateAllProviders(AB_BANKING *ab){ GWEN_PLUGIN_DESCRIPTION_LIST2 *descrs; GWEN_PLUGIN_MANAGER *pm; pm=GWEN_PluginManager_FindPluginManager("provider"); if (!pm) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not find plugin manager for \"%s\"", "provider"); return; } descrs=GWEN_PluginManager_GetPluginDescrs(pm); if (descrs) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *it; GWEN_PLUGIN_DESCRIPTION *pd; it=GWEN_PluginDescription_List2_First(descrs); assert(it); pd=GWEN_PluginDescription_List2Iterator_Data(it); assert(pd); while(pd) { const char *pname=GWEN_PluginDescription_GetName(pd); AB_PROVIDER *pro; pro=AB_Banking_GetProvider(ab, pname); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not load backend \"%s\", ignoring", pname); } else { GWEN_StringList_AppendString(ab->activeProviders, pname, 0, 1); } pd=GWEN_PluginDescription_List2Iterator_Next(it); } /* while */ GWEN_PluginDescription_List2Iterator_free(it); GWEN_PluginDescription_List2_freeAll(descrs); } } #ifdef OS_WIN32 BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { int err; switch (reason) { case DLL_PROCESS_ATTACH: err=GWEN_Init(); if (err) { fprintf(stderr, "Could not initialize Gwenhywfar, aborting\n"); return FALSE; } /* DEBUG */ /*fprintf(stderr, "Gwenhywfar initialized.\n");*/ break; case DLL_PROCESS_DETACH: err=GWEN_Fini(); if (err) { fprintf(stderr, "Could not deinitialize Gwenhywfar\n"); } /* DEBUG */ /*fprintf(stderr, "Gwenhywfar deinitialized.\n");*/ break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } #endif aqbanking-5.6.4beta/src/libs/aqbanking/job_l.h0000644000175000017500000000170512364015477016163 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOB_L_H #define AQBANKING_JOB_L_H #include #include #include #include GWEN_LIST_FUNCTION_DEFS(AB_JOB, AB_Job) GWEN_INHERIT_FUNCTION_DEFS(AB_JOB) AB_JOB *AB_Job_new(AB_JOB_TYPE jt, AB_ACCOUNT *a); int AB_Job_Update(AB_JOB *j); void AB_Job_SetUniqueId(AB_JOB *j, uint32_t jid); #endif /* AQBANKING_JOB_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/imexporter.c0000644000175000017500000014301212364015477017265 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "imexporter_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AB_IMEXPORTER) GWEN_LIST_FUNCTIONS(AB_IMEXPORTER, AB_ImExporter) GWEN_LIST_FUNCTIONS(AB_IMEXPORTER_ACCOUNTINFO, AB_ImExporterAccountInfo) GWEN_INHERIT(GWEN_PLUGIN, AB_PLUGIN_IMEXPORTER) AB_IMEXPORTER *AB_ImExporter_new(AB_BANKING *ab, const char *name){ AB_IMEXPORTER *ie; assert(ab); assert(name); GWEN_NEW_OBJECT(AB_IMEXPORTER, ie); GWEN_LIST_INIT(AB_IMEXPORTER, ie); GWEN_INHERIT_INIT(AB_IMEXPORTER, ie); ie->banking=ab; ie->name=strdup(name); return ie; } void AB_ImExporter_free(AB_IMEXPORTER *ie){ if (ie) { DBG_INFO(AQBANKING_LOGDOMAIN, "Destroying AB_IMEXPORTER"); GWEN_INHERIT_FINI(AB_IMEXPORTER, ie); if (ie->libLoader) { GWEN_LibLoader_CloseLibrary(ie->libLoader); GWEN_LibLoader_free(ie->libLoader); } free(ie->name); GWEN_LIST_FINI(AB_IMEXPORTER, ie); GWEN_FREE_OBJECT(ie); } } uint32_t AB_ImExporter_GetFlags(const AB_IMEXPORTER *ie) { assert(ie); return ie->flags; } void AB_ImExporter_SetFlags(AB_IMEXPORTER *ie, uint32_t flags) { assert(ie); ie->flags=flags; } void AB_ImExporter_AddFlags(AB_IMEXPORTER *ie, uint32_t flags) { assert(ie); ie->flags|=flags; } void AB_ImExporter_SubFlags(AB_IMEXPORTER *ie, uint32_t flags) { assert(ie); ie->flags&=~flags; } int AB_ImExporter_Import(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ assert(ie); assert(ctx); assert(sio); assert(params); if (ie->importFn) { if (GWEN_SyncIo_GetStatus(sio)!=GWEN_SyncIo_Status_Connected) { DBG_ERROR(AQBANKING_LOGDOMAIN, "GWEN_SYNCIO %s not connected (%d); did you forget to call GWEN_SyncIo_Connect()?", GWEN_SyncIo_GetTypeName(sio), GWEN_SyncIo_GetStatus(sio)); return GWEN_ERROR_NOT_OPEN; } return ie->importFn(ie, ctx, sio, params); } else return GWEN_ERROR_NOT_SUPPORTED; } int AB_ImExporter_Export(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_SYNCIO *sio, GWEN_DB_NODE *params){ assert(ie); assert(ctx); assert(sio); assert(params); if (ie->exportFn) return ie->exportFn(ie, ctx, sio, params); else return GWEN_ERROR_NOT_SUPPORTED; } int AB_ImExporter_CheckFile(AB_IMEXPORTER *ie, const char *fname){ assert(ie); assert(fname); if (ie->checkFileFn) return ie->checkFileFn(ie, fname); else return GWEN_ERROR_NOT_SUPPORTED; } int AB_ImExporter_GetEditProfileDialog(AB_IMEXPORTER *ie, GWEN_DB_NODE *dbProfile, const char *testFileName, GWEN_DIALOG **pDlg) { assert(ie); assert(dbProfile); if (ie->getEditProfileDialogFn) return ie->getEditProfileDialogFn(ie, dbProfile, testFileName, pDlg); else return GWEN_ERROR_NOT_SUPPORTED; } int AB_ImExporter_ImportFile(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, const char *fname, GWEN_DB_NODE *dbProfile){ GWEN_SYNCIO *sio; int rv; assert(ie); assert(ctx); assert(fname); assert(dbProfile); if (fname) { sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to Connect() syncio (%d)", rv); GWEN_SyncIo_free(sio); return rv; } } else { sio=GWEN_SyncIo_File_fromStdin(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } rv=AB_ImExporter_Import(ie, ctx, sio, dbProfile); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } int AB_ImExporter_ExportToFile(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, const char *fname, GWEN_DB_NODE *dbProfile) { GWEN_SYNCIO *sio; int rv; assert(ie); assert(ctx); assert(dbProfile); if (fname) { sio=GWEN_SyncIo_File_new(fname, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to Connect() syncio (%d)", rv); GWEN_SyncIo_free(sio); return rv; } } else { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } rv=AB_ImExporter_Export(ie, ctx, sio, dbProfile); rv=GWEN_SyncIo_Disconnect(sio); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Failed to Disconnect() syncio (%d)", rv); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_free(sio); return rv; } int AB_ImExporter_ImportBuffer(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFER *buf, GWEN_DB_NODE *dbProfile) { int rv; GWEN_SYNCIO *sio; assert(ie); assert(ctx); assert(buf); assert(dbProfile); /* create io layer for this file (readonly) */ sio=GWEN_SyncIo_Memory_new(buf, 0); rv=AB_ImExporter_Import(ie, ctx, sio, dbProfile); GWEN_SyncIo_free(sio); return rv; } int AB_ImExporter_ExportToBuffer(AB_IMEXPORTER *ie, AB_IMEXPORTER_CONTEXT *ctx, GWEN_BUFFER *buf, GWEN_DB_NODE *dbProfile) { int rv; GWEN_SYNCIO *sio; assert(ie); assert(ctx); assert(buf); assert(dbProfile); /* create io layer for this file (readonly) */ sio=GWEN_SyncIo_Memory_new(buf, 0); rv=AB_ImExporter_Export(ie, ctx, sio, dbProfile); GWEN_SyncIo_free(sio); return rv; } void AB_ImExporter_SetImportFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_IMPORT_FN f){ assert(ie); ie->importFn=f; } void AB_ImExporter_SetExportFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_EXPORT_FN f){ assert(ie); ie->exportFn=f; } void AB_ImExporter_SetCheckFileFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_CHECKFILE_FN f){ assert(ie); ie->checkFileFn=f; } void AB_ImExporter_SetGetEditProfileDialogFn(AB_IMEXPORTER *ie, AB_IMEXPORTER_GET_EDITPROFILE_DIALOG_FN f) { assert(ie); ie->getEditProfileDialogFn=f; } AB_BANKING *AB_ImExporter_GetBanking(const AB_IMEXPORTER *ie){ assert(ie); return ie->banking; } const char *AB_ImExporter_GetName(const AB_IMEXPORTER *ie){ assert(ie); return ie->name; } void AB_ImExporter_SetLibLoader(AB_IMEXPORTER *ie, GWEN_LIBLOADER *ll) { assert(ie); ie->libLoader=ll; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetFirstAccountInfo(AB_IMEXPORTER_CONTEXT *iec){ AB_IMEXPORTER_ACCOUNTINFO *ai; assert(iec); ai=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); if (ai) { iec->nextAccountInfo=AB_ImExporterAccountInfo_List_Next(ai); return ai; } iec->nextAccountInfo=0; return 0; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetNextAccountInfo(AB_IMEXPORTER_CONTEXT *iec){ AB_IMEXPORTER_ACCOUNTINFO *ai; assert(iec); ai=iec->nextAccountInfo; if (ai) { iec->nextAccountInfo=AB_ImExporterAccountInfo_List_Next(ai); return ai; } iec->nextAccountInfo=0; return 0; } AB_IMEXPORTER_ACCOUNTINFO * AB_ImExporterContext_AccountInfoForEach(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_ACCOUNTINFO_LIST2_FOREACH func, void* user_data) { /* If the accountInfoList were a LIST2, then we would write: */ /* return AB_ImExporterAccountInfo_List2_ForEach(iec->accountInfoList, func, user_data); */ AB_IMEXPORTER_ACCOUNTINFO *it; AB_IMEXPORTER_ACCOUNTINFO *retval; assert(iec); it = AB_ImExporterAccountInfo_List_First(iec->accountInfoList); while (it) { retval = func(it, user_data); if (retval) { return retval; } it = AB_ImExporterAccountInfo_List_Next(it); } return 0; } void AB_ImExporterContext_AddSecurity(AB_IMEXPORTER_CONTEXT *iec, AB_SECURITY *sec) { assert(iec); assert(sec); AB_Security_List_Add(sec, iec->securityList); } AB_SECURITY* AB_ImExporterContext_GetFirstSecurity(AB_IMEXPORTER_CONTEXT *iec) { AB_SECURITY *sec; assert(iec); sec=AB_Security_List_First(iec->securityList); if (sec) { iec->nextSecurity=AB_Security_List_Next(sec); return sec; } iec->nextSecurity=NULL; return NULL; } AB_SECURITY* AB_ImExporterContext_GetNextSecurity(AB_IMEXPORTER_CONTEXT *iec){ AB_SECURITY *sec; assert(iec); sec=iec->nextSecurity; if (sec) { iec->nextSecurity=AB_Security_List_Next(sec); return sec; } iec->nextSecurity=NULL; return NULL; } AB_SECURITY* AB_ImExporterContext_FindSecurity(AB_IMEXPORTER_CONTEXT *iec, const char *nameSpace, const char *id) { AB_SECURITY *sec; assert(iec); if (nameSpace==NULL) nameSpace=""; if (id==NULL) id=""; sec=AB_Security_List_First(iec->securityList); while(sec) { const char *s1, *s2; s1=AB_Security_GetUniqueId(sec); if (s1==NULL) s1=""; s2=AB_Security_GetNameSpace(sec); if (s2==NULL) s2=""; if (strcasecmp(s2, nameSpace)==0 && strcasecmp(s1, id)==0) return sec; sec=AB_Security_List_Next(sec); } return NULL; } void AB_ImExporterContext_AddMessage(AB_IMEXPORTER_CONTEXT *iec, AB_MESSAGE *msg) { assert(iec); assert(msg); AB_Message_List_Add(msg, iec->messageList); } AB_MESSAGE* AB_ImExporterContext_GetFirstMessage(AB_IMEXPORTER_CONTEXT *iec) { AB_MESSAGE *msg; assert(iec); msg=AB_Message_List_First(iec->messageList); if (msg) { iec->nextMessage=AB_Message_List_Next(msg); return msg; } iec->nextMessage=NULL; return NULL; } AB_MESSAGE* AB_ImExporterContext_GetNextMessage(AB_IMEXPORTER_CONTEXT *iec){ AB_MESSAGE *msg; assert(iec); msg=iec->nextMessage; if (msg) { iec->nextMessage=AB_Message_List_Next(msg); return msg; } iec->nextMessage=NULL; return NULL; } void AB_ImExporterContext_AddLog(AB_IMEXPORTER_CONTEXT *iec, const char *s) { assert(iec); if (s) { size_t l=strlen(s); if (s) { GWEN_Buffer_AppendString(iec->logs, s); if (s[l-1]!='\n') GWEN_Buffer_AppendByte(iec->logs, '\n'); } } } const char *AB_ImExporterContext_GetLog(const AB_IMEXPORTER_CONTEXT *iec) { assert(iec); if (GWEN_Buffer_GetUsedBytes(iec->logs)) return GWEN_Buffer_GetStart(iec->logs); else return NULL; } void AB_ImExporterContext_ClearLog(AB_IMEXPORTER_CONTEXT *iec) { assert(iec); GWEN_Buffer_Reset(iec->logs); } AB_IMEXPORTER_ACCOUNTINFO *AB_ImExporterAccountInfo_new(void) { AB_IMEXPORTER_ACCOUNTINFO *iea; GWEN_NEW_OBJECT(AB_IMEXPORTER_ACCOUNTINFO, iea); GWEN_LIST_INIT(AB_IMEXPORTER_ACCOUNTINFO, iea); iea->transactions=AB_Transaction_List_new(); iea->standingOrders=AB_Transaction_List_new(); iea->accStatusList=AB_AccountStatus_List_new(); iea->transfers=AB_Transaction_List_new(); iea->datedTransfers=AB_Transaction_List_new(); iea->notedTransactions=AB_Transaction_List_new(); return iea; } void AB_ImExporterAccountInfo_free(AB_IMEXPORTER_ACCOUNTINFO *iea){ if (iea) { free(iea->bankCode); free(iea->bankName); free(iea->accountNumber); free(iea->accountName); free(iea->iban); free(iea->bic); free(iea->owner); free(iea->currency); free(iea->description); AB_Transaction_List_free(iea->notedTransactions); AB_Transaction_List_free(iea->datedTransfers); AB_Transaction_List_free(iea->transfers); AB_Transaction_List_free(iea->standingOrders); AB_Transaction_List_free(iea->transactions); AB_AccountStatus_List_free(iea->accStatusList); GWEN_LIST_FINI(AB_IMEXPORTER_ACCOUNTINFO, iea); GWEN_FREE_OBJECT(iea); } } void AB_ImExporterAccountInfo_FillFromAccount(AB_IMEXPORTER_ACCOUNTINFO *iea, const AB_ACCOUNT *a) { const char *s; AB_ACCOUNT_TYPE at; assert(iea); assert(a); s=AB_Account_GetBankCode(a); AB_ImExporterAccountInfo_SetBankCode(iea, s); s=AB_Account_GetBankName(a); AB_ImExporterAccountInfo_SetBankName(iea, s); s=AB_Account_GetAccountNumber(a); AB_ImExporterAccountInfo_SetAccountNumber(iea, s); s=AB_Account_GetAccountName(a); AB_ImExporterAccountInfo_SetAccountName(iea, s); s=AB_Account_GetIBAN(a); AB_ImExporterAccountInfo_SetIban(iea, s); s=AB_Account_GetBIC(a); AB_ImExporterAccountInfo_SetBic(iea, s); s=AB_Account_GetCurrency(a); AB_ImExporterAccountInfo_SetCurrency(iea, s); s=AB_Account_GetOwnerName(a); AB_ImExporterAccountInfo_SetOwner(iea, s); at=AB_Account_GetAccountType(a); AB_ImExporterAccountInfo_SetType(iea, at); } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterAccountInfo_dup(const AB_IMEXPORTER_ACCOUNTINFO *oi) { AB_IMEXPORTER_ACCOUNTINFO *iea; GWEN_NEW_OBJECT(AB_IMEXPORTER_ACCOUNTINFO, iea); GWEN_LIST_INIT(AB_IMEXPORTER_ACCOUNTINFO, iea); #define COPY_CHAR(NAME) \ if (oi->NAME) \ iea->NAME=strdup(oi->NAME); COPY_CHAR(bankCode); COPY_CHAR(bankName); COPY_CHAR(accountNumber); COPY_CHAR(accountName); COPY_CHAR(iban); COPY_CHAR(bic); COPY_CHAR(owner); COPY_CHAR(currency); COPY_CHAR(description); iea->accountType=oi->accountType; #undef COPY_CHAR iea->accountId=oi->accountId; iea->accStatusList=AB_AccountStatus_List_dup(oi->accStatusList); iea->transactions=AB_Transaction_List_dup(oi->transactions); iea->standingOrders=AB_Transaction_List_dup(oi->standingOrders); iea->transfers=AB_Transaction_List_dup(oi->transfers); iea->datedTransfers=AB_Transaction_List_dup(oi->datedTransfers); iea->notedTransactions=AB_Transaction_List_dup(oi->notedTransactions); return iea; } int AB_ImExporterAccountInfo_toDb(const AB_IMEXPORTER_ACCOUNTINFO *iea, GWEN_DB_NODE *db){ assert(iea); #define STORE_CHAR(NAME) \ if (iea->NAME) \ GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, \ __STRING(NAME), iea->NAME) #define STORE_INT(NAME) \ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, \ __STRING(NAME), iea->NAME) STORE_CHAR(bankCode); STORE_CHAR(bankName); STORE_CHAR(accountNumber); STORE_CHAR(accountName); STORE_CHAR(iban); STORE_CHAR(bic); STORE_CHAR(owner); STORE_CHAR(currency); STORE_CHAR(description); STORE_INT(accountType); STORE_INT(accountId); #undef STORE_CHAR #undef STORE_INT if (iea->accStatusList) { AB_ACCOUNT_STATUS *ast; ast=AB_AccountStatus_List_First(iea->accStatusList); if (ast) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "statusList"); assert(dbG); while(ast) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "status"); assert(dbT); if (AB_AccountStatus_toDb(ast, dbT)) return -1; ast=AB_AccountStatus_List_Next(ast); } } } if (iea->transactions) { AB_TRANSACTION *t; t=AB_Transaction_List_First(iea->transactions); if (t) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "transactionList"); assert(dbG); while(t) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "transaction"); assert(dbT); if (AB_Transaction_toDb(t, dbT)) return -1; t=AB_Transaction_List_Next(t); } } } if (iea->standingOrders) { AB_TRANSACTION *t; t=AB_Transaction_List_First(iea->standingOrders); if (t) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "standingOrderList"); assert(dbG); while(t) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "standingOrder"); assert(dbT); if (AB_Transaction_toDb(t, dbT)) return -1; t=AB_Transaction_List_Next(t); } } } if (iea->transfers) { AB_TRANSACTION *t; t=AB_Transaction_List_First(iea->transfers); if (t) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "transferList"); assert(dbG); while(t) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "transfer"); assert(dbT); if (AB_Transaction_toDb(t, dbT)) return -1; t=AB_Transaction_List_Next(t); } } } if (iea->datedTransfers) { AB_TRANSACTION *t; t=AB_Transaction_List_First(iea->datedTransfers); if (t) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "datedTransferList"); assert(dbG); while(t) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "datedTransfer"); assert(dbT); if (AB_Transaction_toDb(t, dbT)) return -1; t=AB_Transaction_List_Next(t); } } } if (iea->notedTransactions) { AB_TRANSACTION *t; t=AB_Transaction_List_First(iea->notedTransactions); if (t) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "notedTransactionList"); assert(dbG); while(t) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "notedTransaction"); assert(dbT); if (AB_Transaction_toDb(t, dbT)) return -1; t=AB_Transaction_List_Next(t); } } } return 0; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterAccountInfo_fromDb(GWEN_DB_NODE *db){ AB_IMEXPORTER_ACCOUNTINFO *iea; const char *s; GWEN_DB_NODE *dbT; iea=AB_ImExporterAccountInfo_new(); #define RESTORE_CHAR(NAME) \ s=GWEN_DB_GetCharValue(db, __STRING(NAME), 0, 0);\ if (s)\ iea->NAME=strdup(s); #define RESTORE_INT(NAME, DEFAULT) \ iea->NAME=GWEN_DB_GetIntValue(db, __STRING(NAME), 0, DEFAULT); RESTORE_CHAR(bankCode); RESTORE_CHAR(bankName); RESTORE_CHAR(accountNumber); RESTORE_CHAR(iban); RESTORE_CHAR(bic); RESTORE_CHAR(owner); RESTORE_CHAR(currency); RESTORE_CHAR(description); RESTORE_INT(accountType, AB_AccountType_Bank); RESTORE_INT(accountId, 0); #undef RESTORE_CHAR #undef RESTORE_INT dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "statusList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "status"); while(dbT) { AB_ACCOUNT_STATUS *ast; ast=AB_AccountStatus_fromDb(dbT); assert(ast); AB_AccountStatus_List_Add(ast, iea->accStatusList); dbT=GWEN_DB_FindNextGroup(dbT, "status"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "transactionList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "transaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->transactions); dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "standingOrderList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "standingOrder"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->standingOrders); dbT=GWEN_DB_FindNextGroup(dbT, "standingOrder"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "transferList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "transfer"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->transfers); dbT=GWEN_DB_FindNextGroup(dbT, "transfer"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "datedTransferList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "datedTransfer"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->datedTransfers); dbT=GWEN_DB_FindNextGroup(dbT, "datedTransfer"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "notedTransactionList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "notedTransaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->notedTransactions); dbT=GWEN_DB_FindNextGroup(dbT, "notedTransaction"); } } return iea; } void AB_ImExporterAccountInfo_AddTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t){ assert(iea); assert(t); AB_Transaction_List_Add(t, iea->transactions); } AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=AB_Transaction_List_First(iea->transactions); if (t) { iea->nextTransaction=AB_Transaction_List_Next(t); return t; } iea->nextTransaction=0; return 0; } AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=iea->nextTransaction; if (t) { iea->nextTransaction=AB_Transaction_List_Next(t); return t; } iea->nextTransaction=0; return 0; } const AB_TRANSACTION * AB_ImExporterAccountInfo_TransactionsForEach(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION_CONSTLIST2_FOREACH func, void* user_data) { /* In theory, if the transaction list were a LIST2, then we would simply write: */ /* return AB_Transaction_List2_ForEach(iea->transactions, func, user_data); */ /* well, probably not, because the "const" wouldn't work. Sorry. */ const AB_TRANSACTION *it; const AB_TRANSACTION *retval; assert(iea); it = AB_Transaction_List_First(iea->transactions); while (it) { retval = func(it, user_data); if (retval) { return retval; } it = AB_Transaction_List_Next(it); } return 0; } int AB_ImExporterAccountInfo_GetTransactionCount(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return AB_Transaction_List_GetCount(iea->transactions); } void AB_ImExporterAccountInfo_ClearTransactions(AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); iea->nextTransaction=NULL; AB_Transaction_List_Clear(iea->transactions); } void AB_ImExporterAccountInfo_AddStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t){ assert(iea); assert(t); AB_Transaction_List_Add(t, iea->standingOrders); } AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=AB_Transaction_List_First(iea->standingOrders); if (t) { iea->nextStandingOrder=AB_Transaction_List_Next(t); return t; } iea->nextStandingOrder=0; return 0; } AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextStandingOrder(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=iea->nextStandingOrder; if (t) { iea->nextStandingOrder=AB_Transaction_List_Next(t); return t; } iea->nextStandingOrder=0; return 0; } int AB_ImExporterAccountInfo_GetStandingOrderCount(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return AB_Transaction_List_GetCount(iea->standingOrders); } void AB_ImExporterAccountInfo_AddDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t){ assert(iea); assert(t); AB_Transaction_List_Add(t, iea->datedTransfers); } AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=AB_Transaction_List_First(iea->datedTransfers); if (t) { iea->nextDatedTransfer=AB_Transaction_List_Next(t); return t; } iea->nextDatedTransfer=0; return 0; } AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextDatedTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=iea->nextDatedTransfer; if (t) { iea->nextDatedTransfer=AB_Transaction_List_Next(t); return t; } iea->nextDatedTransfer=0; return 0; } int AB_ImExporterAccountInfo_GetDatedTransferCount(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return AB_Transaction_List_GetCount(iea->datedTransfers); } void AB_ImExporterAccountInfo_AddNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t){ assert(iea); assert(t); AB_Transaction_List_Add(t, iea->notedTransactions); } AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=AB_Transaction_List_First(iea->notedTransactions); if (t) { iea->nextNotedTransaction=AB_Transaction_List_Next(t); return t; } iea->nextNotedTransaction=0; return 0; } AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextNotedTransaction(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=iea->nextNotedTransaction; if (t) { iea->nextNotedTransaction=AB_Transaction_List_Next(t); return t; } iea->nextNotedTransaction=0; return 0; } int AB_ImExporterAccountInfo_GetNotedTransactionCount(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return AB_Transaction_List_GetCount(iea->notedTransactions); } void AB_ImExporterAccountInfo_AddTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_TRANSACTION *t){ assert(iea); assert(t); AB_Transaction_List_Add(t, iea->transfers); } AB_TRANSACTION* AB_ImExporterAccountInfo_GetFirstTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=AB_Transaction_List_First(iea->transfers); if (t) { iea->nextTransfer=AB_Transaction_List_Next(t); return t; } iea->nextTransfer=0; return 0; } AB_TRANSACTION* AB_ImExporterAccountInfo_GetNextTransfer(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_TRANSACTION *t; assert(iea); t=iea->nextTransfer; if (t) { iea->nextTransfer=AB_Transaction_List_Next(t); return t; } iea->nextTransfer=0; return 0; } int AB_ImExporterAccountInfo_GetTransferCount(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return AB_Transaction_List_GetCount(iea->transfers); } const char* AB_ImExporterAccountInfo_GetBankCode(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->bankCode; } void AB_ImExporterAccountInfo_SetBankCode(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->bankCode); if (s) iea->bankCode=strdup(s); else iea->bankCode=0; } const char* AB_ImExporterAccountInfo_GetBankName(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->bankName; } void AB_ImExporterAccountInfo_SetBankName(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->bankName); if (s) iea->bankName=strdup(s); else iea->bankName=0; } const char* AB_ImExporterAccountInfo_GetAccountNumber(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->accountNumber; } void AB_ImExporterAccountInfo_SetAccountNumber(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->accountNumber); if (s) iea->accountNumber=strdup(s); else iea->accountNumber=0; } const char* AB_ImExporterAccountInfo_GetIban(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return iea->iban; } void AB_ImExporterAccountInfo_SetIban(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s) { assert(iea); free(iea->iban); if (s) iea->iban=strdup(s); else iea->iban=0; } const char* AB_ImExporterAccountInfo_GetBic(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return iea->bic; } void AB_ImExporterAccountInfo_SetBic(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s) { assert(iea); free(iea->bic); if (s) iea->bic=strdup(s); else iea->bic=0; } const char* AB_ImExporterAccountInfo_GetCurrency(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return iea->currency; } void AB_ImExporterAccountInfo_SetCurrency(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s) { assert(iea); free(iea->currency); if (s) iea->currency=strdup(s); else iea->currency=0; } const char* AB_ImExporterAccountInfo_GetAccountName(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->accountName; } void AB_ImExporterAccountInfo_SetAccountName(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->accountName); if (s) iea->accountName=strdup(s); else iea->accountName=0; } const char* AB_ImExporterAccountInfo_GetOwner(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->owner; } void AB_ImExporterAccountInfo_SetOwner(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->owner); if (s) iea->owner=strdup(s); else iea->owner=0; } AB_ACCOUNT_TYPE AB_ImExporterAccountInfo_GetType(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->accountType; } void AB_ImExporterAccountInfo_SetType(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_ACCOUNT_TYPE t){ assert(iea); iea->accountType=t; } const char* AB_ImExporterAccountInfo_GetDescription(const AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iea); return iea->description; } void AB_ImExporterAccountInfo_SetDescription(AB_IMEXPORTER_ACCOUNTINFO *iea, const char *s){ assert(iea); free(iea->description); if (s) iea->description=strdup(s); else iea->description=0; } uint32_t AB_ImExporterAccountInfo_GetAccountId(const AB_IMEXPORTER_ACCOUNTINFO *iea) { assert(iea); return iea->accountId; } void AB_ImExporterAccountInfo_SetAccountId(AB_IMEXPORTER_ACCOUNTINFO *iea, uint32_t id) { assert(iea); iea->accountId=id; } void AB_ImExporterAccountInfo_AddAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea, AB_ACCOUNT_STATUS *t){ assert(iea); assert(t); AB_AccountStatus_List_Add(t, iea->accStatusList); } AB_ACCOUNT_STATUS* AB_ImExporterAccountInfo_GetFirstAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_ACCOUNT_STATUS *t; assert(iea); t=AB_AccountStatus_List_First(iea->accStatusList); if (t) { iea->nextAccountStatus=AB_AccountStatus_List_Next(t); return t; } iea->nextAccountStatus=0; return 0; } AB_ACCOUNT_STATUS* AB_ImExporterAccountInfo_GetNextAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea){ AB_ACCOUNT_STATUS *t; assert(iea); t=iea->nextAccountStatus; if (t) { iea->nextAccountStatus=AB_AccountStatus_List_Next(t); return t; } iea->nextAccountStatus=0; return 0; } AB_IMEXPORTER_CONTEXT *AB_ImExporterContext_new(void){ AB_IMEXPORTER_CONTEXT *iec; GWEN_NEW_OBJECT(AB_IMEXPORTER_CONTEXT, iec); iec->accountInfoList=AB_ImExporterAccountInfo_List_new(); iec->securityList=AB_Security_List_new(); iec->messageList=AB_Message_List_new(); iec->logs=GWEN_Buffer_new(0, 128, 0, 1); return iec; } void AB_ImExporterContext_free(AB_IMEXPORTER_CONTEXT *iec){ if (iec) { GWEN_Buffer_free(iec->logs); AB_Message_List_free(iec->messageList); AB_Security_List_free(iec->securityList); AB_ImExporterAccountInfo_List_free(iec->accountInfoList); GWEN_FREE_OBJECT(iec); } } void AB_ImExporterContext_Clear(AB_IMEXPORTER_CONTEXT *iec){ assert(iec); GWEN_Buffer_Reset(iec->logs); AB_Message_List_Clear(iec->messageList); AB_Security_List_Clear(iec->securityList); AB_ImExporterAccountInfo_List_Clear(iec->accountInfoList); } int AB_ImExporterContext_toDb(const AB_IMEXPORTER_CONTEXT *iec, GWEN_DB_NODE *db){ AB_IMEXPORTER_ACCOUNTINFO *iea; AB_SECURITY *sec; AB_MESSAGE *msg; iea=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); if (iea) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "accountInfoList"); assert(dbG); while(iea) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "accountInfo"); assert(dbT); if (AB_ImExporterAccountInfo_toDb(iea, dbT)) return -1; iea=AB_ImExporterAccountInfo_List_Next(iea); } } sec=AB_Security_List_First(iec->securityList); if (sec) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "securityList"); assert(dbG); while(sec) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "security"); assert(dbT); if (AB_Security_toDb(sec, dbT)) return -1; sec=AB_Security_List_Next(sec); } } msg=AB_Message_List_First(iec->messageList); if (msg) { GWEN_DB_NODE *dbG; dbG=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "messageList"); assert(dbG); while(msg) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(dbG, GWEN_PATH_FLAGS_CREATE_GROUP, "message"); assert(dbT); if (AB_Message_toDb(msg, dbT)) return -1; msg=AB_Message_List_Next(msg); } } GWEN_DB_DeleteVar(db, "logs"); if (GWEN_Buffer_GetUsedBytes(iec->logs)) { const char *s; s=GWEN_Buffer_GetStart(iec->logs); while(*s) { char buf[64]; strncpy(buf, s, sizeof(buf)-1); buf[sizeof(buf)-1]=0; GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "logs", buf); s+=strlen(buf); } } return 0; } int AB_ImExporterContext_ReadDb(AB_IMEXPORTER_CONTEXT *iec, GWEN_DB_NODE *db) { GWEN_DB_NODE *dbT; int i; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "accountInfoList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "accountInfo"); while(dbT) { AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterAccountInfo_fromDb(dbT); assert(iea); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); dbT=GWEN_DB_FindNextGroup(dbT, "accountInfo"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "securityList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "security"); while(dbT) { AB_SECURITY *sec; sec=AB_Security_fromDb(dbT); assert(sec); AB_Security_List_Add(sec, iec->securityList); dbT=GWEN_DB_FindNextGroup(dbT, "security"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "messageList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "message"); while(dbT) { AB_MESSAGE *msg; msg=AB_Message_fromDb(dbT); assert(msg); AB_Message_List_Add(msg, iec->messageList); dbT=GWEN_DB_FindNextGroup(dbT, "message"); } } for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "logs", i, NULL); if (!s) break; GWEN_Buffer_AppendString(iec->logs, s); } return 0; } AB_IMEXPORTER_CONTEXT *AB_ImExporterContext_fromDb(GWEN_DB_NODE *db) { AB_IMEXPORTER_CONTEXT *iec; iec=AB_ImExporterContext_new(); AB_ImExporterContext_ReadDb(iec, db); return iec; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetFirstAccount(AB_IMEXPORTER_CONTEXT *iec){ AB_IMEXPORTER_ACCOUNTINFO *iea; assert(iec); iea=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); if (iea) { iec->nextAccountInfo=AB_ImExporterAccountInfo_List_Next(iea); return iea; } iec->nextAccountInfo=0; return 0; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetNextAccount(AB_IMEXPORTER_CONTEXT *iec){ AB_IMEXPORTER_ACCOUNTINFO *iea; assert(iec); iea=iec->nextAccountInfo; if (iea) { iec->nextAccountInfo=AB_ImExporterAccountInfo_List_Next(iea); AB_ImExporterAccountInfo_List_Del(iea); return iea; } iec->nextAccountInfo=0; return 0; } void AB_ImExporterContext_AddAccountInfo(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_ACCOUNTINFO *iea){ assert(iec); assert(iea); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_FindAccountInfo(AB_IMEXPORTER_CONTEXT *iec, const char *bankCode, const char *accountNumber){ AB_IMEXPORTER_ACCOUNTINFO *iea; if (!bankCode) bankCode=""; if (!accountNumber) accountNumber=""; assert(iec); iea=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); while(iea) { const char *sBankCode; const char *sAccountNumber; sBankCode=AB_ImExporterAccountInfo_GetBankCode(iea); if (sBankCode==0) sBankCode=""; sAccountNumber=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (sAccountNumber==0) sAccountNumber=""; if (strcasecmp(sBankCode, bankCode)==0 && strcasecmp(sAccountNumber, accountNumber)==0) { return iea; } iea=AB_ImExporterAccountInfo_List_Next(iea); } return 0; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetAccountInfo(AB_IMEXPORTER_CONTEXT *iec, const char *bankCode, const char *accountNumber){ AB_IMEXPORTER_ACCOUNTINFO *iea; if (!bankCode) bankCode=""; if (!accountNumber) accountNumber=""; assert(iec); iea=AB_ImExporterContext_FindAccountInfo(iec, bankCode, accountNumber); if (!iea) { /* not found, append it */ iea=AB_ImExporterAccountInfo_new(); AB_ImExporterAccountInfo_SetBankCode(iea, bankCode); AB_ImExporterAccountInfo_SetAccountNumber(iea, accountNumber); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); } return iea; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_FindAccountInfoByIban(AB_IMEXPORTER_CONTEXT *iec, const char *iban){ AB_IMEXPORTER_ACCOUNTINFO *iea; if (!iban) iban=""; assert(iec); iea=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); while(iea) { const char *sIban; sIban=AB_ImExporterAccountInfo_GetIban(iea); if (sIban==0) sIban=""; if (strcasecmp(sIban, iban)==0) { return iea; } iea=AB_ImExporterAccountInfo_List_Next(iea); } return 0; } AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterContext_GetAccountInfoByIban(AB_IMEXPORTER_CONTEXT *iec, const char *iban){ AB_IMEXPORTER_ACCOUNTINFO *iea; if (!iban) iban=""; assert(iec); iea=AB_ImExporterContext_FindAccountInfoByIban(iec, iban); if (!iea) { /* not found, append it */ iea=AB_ImExporterAccountInfo_new(); AB_ImExporterAccountInfo_SetIban(iea, iban); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); } return iea; } int AB_ImExporterContext_GetAccountInfoCount(const AB_IMEXPORTER_CONTEXT *iec) { assert(iec); return AB_ImExporterAccountInfo_List_GetCount(iec->accountInfoList); } AB_IMEXPORTER_ACCOUNTINFO *AB_ImExporterContext__GetAccountInfoForTransaction(AB_IMEXPORTER_CONTEXT *iec, const AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; const char *tIban; const char *tBankCode; const char *tAccountNumber; tBankCode=AB_Transaction_GetLocalBankCode(t); if (!tBankCode) tBankCode=""; tAccountNumber=AB_Transaction_GetLocalAccountNumber(t); if (!tAccountNumber) tAccountNumber=""; tIban=AB_Transaction_GetLocalIban(t); if (!tIban) tIban=""; iea=AB_ImExporterAccountInfo_List_First(iec->accountInfoList); while(iea) { const char *sBankCode; const char *sAccountNumber; const char *sIban; sBankCode=AB_ImExporterAccountInfo_GetBankCode(iea); if (!sBankCode) sBankCode=""; sAccountNumber=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!sAccountNumber) sAccountNumber=""; sIban=AB_ImExporterAccountInfo_GetIban(iea); if (!sIban) sIban=""; if (strcasecmp(sIban, tIban)==0) return iea; if ((strcasecmp(sBankCode, tBankCode)==0) && (strcasecmp(sAccountNumber, tAccountNumber)==0)) return iea; iea=AB_ImExporterAccountInfo_List_Next(iea); } /* not found, append it */ iea=AB_ImExporterAccountInfo_new(); if (tIban && *tIban) AB_ImExporterAccountInfo_SetIban(iea, tIban); if (tBankCode && *tBankCode) AB_ImExporterAccountInfo_SetBankCode(iea, tBankCode); if (tAccountNumber && *tAccountNumber) AB_ImExporterAccountInfo_SetAccountNumber(iea, tAccountNumber); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); return iea; } void AB_ImExporterContext_AddTransaction(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext__GetAccountInfoForTransaction(iec, t); assert(iea); AB_ImExporterAccountInfo_AddTransaction(iea, t); } void AB_ImExporterContext_AddTransfer(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext__GetAccountInfoForTransaction(iec, t); assert(iea); AB_ImExporterAccountInfo_AddTransfer(iea, t); } void AB_ImExporterContext_AddDatedTransfer(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext__GetAccountInfoForTransaction(iec, t); assert(iea); AB_ImExporterAccountInfo_AddDatedTransfer(iea, t); } void AB_ImExporterContext_AddStandingOrder(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext__GetAccountInfoForTransaction(iec, t); assert(iea); AB_ImExporterAccountInfo_AddStandingOrder(iea, t); } void AB_ImExporter_Utf8ToDta(const char *p, int size, GWEN_BUFFER *buf) { while(*p) { unsigned int c; if (!size) break; c=(unsigned char)(*(p++)); if (size!=-1) size--; switch(c & 0xc0) { case 0xc0: if (!size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Incomplete UTF-8 sequence"); c=' '; break; } c=(unsigned char)(*(p++)); if (size!=-1) size--; if ((c & 0xc0) != 0x80) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid UTF-8 sequence"); c=' '; break; } if (size && (*p & 0xc0) == 0x80) /* a sequence of 3 bytes and more cannot be translated to DTA */ goto nextUtf8; switch(c) { case 0x84: case 0xa4: c=0x5b; break; case 0x96: case 0xb6: c=0x5c; break; case 0x9c: case 0xbc: c=0x5d; break; case 0x9f: c=0x7e; break; default: c=' '; break; } /* switch */ break; case 0x80: DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid UTF-8 sequence"); nextUtf8: c=' '; while(size && (*p & 0xc0) == 0x80) { p++; if (size!=-1) size--; } break; default: c=toupper(c); if (!(isdigit(c) || (c>='A' && c<='Z') || (strchr(" .,&-+*%/$", c)))) c=' '; } /* switch */ GWEN_Buffer_AppendByte(buf, c); } /* while */ } void AB_ImExporter_DtaToUtf8(const char *p, int size, GWEN_BUFFER *buf) { while(*p) { unsigned int c; if (!size) break; c=(unsigned char)(*(p++)); switch(c) { case 0x5b: /* AE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x84); break; case 0x5c: /* OE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x96); break; case 0x5d: /* UE */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x9c); break; case 0x7e: /* sharp s */ GWEN_Buffer_AppendByte(buf, 0xc3); GWEN_Buffer_AppendByte(buf, 0x9f); break; default: if (c & 0x80) { /* produce sane UTF-8 even if something went wrong */ DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in DTA string"); c=' '; } GWEN_Buffer_AppendByte(buf, c); } if (size!=-1) size--; } /* while */ } GWEN_TIME *AB_ImExporter_DateFromString(const char *p, const char *tmpl, int inUtc) { GWEN_TIME *ti; if (strchr(tmpl, 'h')==0) { GWEN_BUFFER *dbuf; GWEN_BUFFER *tbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, p); GWEN_Buffer_AppendString(dbuf, "-12:00"); tbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(tbuf, tmpl); GWEN_Buffer_AppendString(tbuf, "-hh:mm"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); GWEN_Buffer_free(dbuf); } else { if (inUtc) ti=GWEN_Time_fromUtcString(p, tmpl); else ti=GWEN_Time_fromString(p, tmpl); } return ti; } void AB_ImExporter_Iso8859_1ToUtf8(const char *p, int size, GWEN_BUFFER *buf) { while(*p) { unsigned int c; if (!size) break; c=(unsigned char)(*(p++)); if (c<32 || c==127) c=32; if (c & 0x80) { GWEN_Buffer_AppendByte(buf, 0xc0 | c>>6); c &= ~0x40; } GWEN_Buffer_AppendByte(buf, c); if (size!=-1) size--; } /* while */ } int AH_ImExporter__Transform_Var(GWEN_DB_NODE *db, int level) { GWEN_DB_NODE *dbC; dbC=GWEN_DB_GetFirstValue(db); while(dbC) { if (GWEN_DB_GetValueType(dbC)==GWEN_DB_NodeType_ValueChar) { const char *s; unsigned int l; s=GWEN_DB_GetCharValueFromNode(dbC); assert(s); l=strlen(s); if (l) { GWEN_BUFFER *vbuf; vbuf=GWEN_Buffer_new(0, 1+(l*15/10), 0, 1); AB_ImExporter_Iso8859_1ToUtf8(s, l, vbuf); GWEN_DB_SetCharValueInNode(dbC, GWEN_Buffer_GetStart(vbuf)); GWEN_Buffer_free(vbuf); } } dbC=GWEN_DB_GetNextValue(dbC); } return 0; } int AH_ImExporter__Transform_Group(GWEN_DB_NODE *db, int level) { GWEN_DB_NODE *dbC; int rv; if (level>AH_IMEXPORTER_TRANSFORM_MAXLEVEL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "DB too deep (%d)", level); return -1; } dbC=GWEN_DB_GetFirstGroup(db); while(dbC) { rv=AH_ImExporter__Transform_Group(dbC, level+1); if (rv) return rv; dbC=GWEN_DB_GetNextGroup(dbC); } dbC=GWEN_DB_GetFirstVar(db); while(dbC) { rv=AH_ImExporter__Transform_Var(dbC, level+1); if (rv) return rv; dbC=GWEN_DB_GetNextVar(dbC); } return 0; } int AH_ImExporter_DbFromIso8859_1ToUtf8(GWEN_DB_NODE *db) { return AH_ImExporter__Transform_Group(db, 0); } int AB_ImExporter_DbFromIso8859_1ToUtf8(GWEN_DB_NODE *db) { return AH_ImExporter__Transform_Group(db, 0); } void AB_ImExporterContext_AddContext(AB_IMEXPORTER_CONTEXT *iec, AB_IMEXPORTER_CONTEXT *toAdd) { AB_IMEXPORTER_ACCOUNTINFO *iea; assert(iec); iea=AB_ImExporterAccountInfo_List_First(toAdd->accountInfoList); while(iea) { AB_IMEXPORTER_ACCOUNTINFO *nextIea; nextIea=AB_ImExporterAccountInfo_List_Next(iea); AB_ImExporterAccountInfo_List_Del(iea); AB_ImExporterAccountInfo_List_Add(iea, iec->accountInfoList); iea=nextIea; } GWEN_Buffer_AppendBuffer(iec->logs, toAdd->logs); AB_ImExporterContext_free(toAdd); } int AB_ImExporterContext_WriteContext(const AB_IMEXPORTER_CONTEXT *ctx, const char *ctxFile) { GWEN_DB_NODE *dbCtx; GWEN_SYNCIO *sio; int rv; dbCtx=GWEN_DB_Group_new("context"); rv=AB_ImExporterContext_toDb(ctx, dbCtx); if (rv<0) { DBG_ERROR(0, "Error writing context to db"); return rv; } if (ctxFile==NULL) { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE | GWEN_SYNCIO_FILE_FLAGS_WRITE); } else { sio=GWEN_SyncIo_File_new(ctxFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error selecting output file: %s", strerror(errno)); GWEN_SyncIo_free(sio); return rv; } } rv=GWEN_DB_WriteToIo(dbCtx, sio, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(0, "Error writing context (%d)", rv); GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_DB_Group_free(dbCtx); return 0; } GWEN_PLUGIN *AB_Plugin_ImExporter_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; AB_PLUGIN_IMEXPORTER *xpl; pl=GWEN_Plugin_new(pm, name, fileName); GWEN_NEW_OBJECT(AB_PLUGIN_IMEXPORTER, xpl); GWEN_INHERIT_SETDATA(GWEN_PLUGIN, AB_PLUGIN_IMEXPORTER, pl, xpl, AB_Plugin_ImExporter_FreeData); return pl; } void GWENHYWFAR_CB AB_Plugin_ImExporter_FreeData(void *bp, void *p) { AB_PLUGIN_IMEXPORTER *xpl; xpl=(AB_PLUGIN_IMEXPORTER*)p; GWEN_FREE_OBJECT(xpl); } AB_IMEXPORTER *AB_Plugin_ImExporter_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab) { AB_PLUGIN_IMEXPORTER *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_IMEXPORTER, pl); assert(xpl); assert(xpl->pluginFactoryFn); return xpl->pluginFactoryFn(pl, ab); } void AB_Plugin_ImExporter_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_IMEXPORTER_FACTORY_FN fn) { AB_PLUGIN_IMEXPORTER *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_IMEXPORTER, pl); assert(xpl); xpl->pluginFactoryFn=fn; } aqbanking-5.6.4beta/src/libs/aqbanking/ab-value-test.c0000644000175000017500000000155112364015477017541 00000000000000#include #include char *input = "1,361.54"; int main(int argc, char *argv[]) { AB_VALUE *value; GWEN_BUFFER *buf, *buf2; int result = 0; if (argc > 1) input = argv[1]; value = AB_Value_fromString(input); buf = GWEN_Buffer_new(NULL, 300, 0, 0); AB_Value_toString(value, buf); if (strcmp(GWEN_Buffer_GetStart(buf), "136154/100") != 0) result = -1; buf2 = GWEN_Buffer_new(NULL, 300, 0, 0); AB_Value_toHumanReadableString2(value, buf2, 2, 0); if ((strcmp(GWEN_Buffer_GetStart(buf2), "1361.54") != 0) && (strcmp(GWEN_Buffer_GetStart(buf2), "1361,54") != 0)) result = -1; printf("Storing %s internally as rational number %s; as double: %s\n", input, GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetStart(buf2)); GWEN_Buffer_free(buf); GWEN_Buffer_free(buf2); AB_Value_free(value); return result; } aqbanking-5.6.4beta/src/libs/aqbanking/banking_info.h0000644000175000017500000001443112364015477017522 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_INFO_H #define AQBANKING_BANKING_INFO_H #include #include #include #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_INFO */ /*@{*/ /** @name Getting Bank/Account Information * * Functions in this group retrieve information about credit institutes and * allow checking of bank code/account id combinations. * These functions load the appropriate checker plugins for selected * countries. */ /*@{*/ /** * This functions retrieves information about a given bank. It loads the * appropriate bank checker module and asks it for information about the given * bank. The caller is responsible for freeing the object returned (if any) * by calling @ref AB_BankInfo_free. * @param ab AqBanking main object * @param country ISO country code ("de" for Germany, "at" for Austria etc) * @param branchId optional branch id (not needed for "de") * @param bankId bank id ("Bankleitzahl" for "de") */ AQBANKING_API AB_BANKINFO *AB_Banking_GetBankInfo(AB_BANKING *ab, const char *country, const char *branchId, const char *bankId); /** * This function retrieves information about banks. It loads the * appropriate bank checker module and asks it for a list of AB_BANKINFO * objects which match the given template. Empty fields in this template * always match. Service entries (AB_BANKINFO_SERVICE) are not compared. * Matching entries are added to the given list. * The caller is responsible for freeing the objects returned (if any) * by calling @ref AB_BankInfo_free (or by calling * @ref AB_BankInfo_List_freeAll). * @param ab AqBanking main object * @param country ISO country code ("de" for Germany, "at" for Austria etc) * @param tbi template to compare against * @param bl list to which matching banks are added */ AQBANKING_API int AB_Banking_GetBankInfoByTemplate(AB_BANKING *ab, const char *country, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl); /** * This function checks whether the given combination represents a valid * account. It loads the appropriate bank checker module and lets it check * the information. * @param ab AqBanking main object * @param country ISO country code ("de" for Germany, "at" for Austria etc) * @param branchId optional branch id (not needed for "de") * @param bankId bank id ("Bankleitzahl" for "de") * @param accountId account id */ AQBANKING_API AB_BANKINFO_CHECKRESULT AB_Banking_CheckAccount(AB_BANKING *ab, const char *country, const char *branchId, const char *bankId, const char *accountId); /** * Checks whether a given international bank account number (IBAN) is * valid or not. * @return 0 if valid, 1 if not and -1 on error * @param iban IBAN (e.g. "DE88 2008 0000 09703 7570 0") */ AQBANKING_API int AB_Banking_CheckIban(const char *iban); /** * Create an IBAN from German bank code and account number. */ AQBANKING_API int AB_Banking_MakeGermanIban(const char *bankCode, const char *accountNumber, GWEN_BUFFER *ibanBuf); /*@}*/ /** @name Getting Country Information * * Functions in this group retrieve information about countries (name, * code, numeric code). */ /*@{*/ /** * Searches for information about a country by its international name * (in English). * The name may contain jokers ("?") and wildcards ("*") and is case * insensitive. */ AQBANKING_API const AB_COUNTRY *AB_Banking_FindCountryByName(AB_BANKING *ab, const char *name); /** * Searches for information about a country by its local name * (in the currently selected language). * The name may contain jokers ("?") and wildcards ("*") and is case * insensitive. */ AQBANKING_API const AB_COUNTRY *AB_Banking_FindCountryByLocalName(AB_BANKING *ab, const char *name); /** * Searches for information about a country by its ISO country code * (e.g. "DE"=Germany, "AT"=Austria etc). * The code may contain jokers ("?") and wildcards ("*") and is case * insensitive. */ AQBANKING_API const AB_COUNTRY *AB_Banking_FindCountryByCode(AB_BANKING *ab, const char *code); /** * Searches for information about a country by its ISO numeric code * (e.g. 280=Germany etc). */ AQBANKING_API const AB_COUNTRY *AB_Banking_FindCountryByNumeric(AB_BANKING *ab, int numid); /** * Returns a list of informations about countries whose international name * (in English) matches the given argument. * The list returned must be freed using @ref AB_Country_ConstList2_free() * by the caller. The elements of that list are all const. * The name may contain jokers ("?") and wildcards ("*") and is case * insensitive. */ AQBANKING_API AB_COUNTRY_CONSTLIST2 *AB_Banking_ListCountriesByName(AB_BANKING *ab, const char *name); /** * Returns a list of informations about countries whose local name * (in the currently selected language) matches the given argument. * The list returned must be freed using @ref AB_Country_ConstList2_free() * by the caller. The elements of that list are all const. * The name may contain jokers ("?") and wildcards ("*") and is case * insensitive. */ AQBANKING_API AB_COUNTRY_CONSTLIST2 *AB_Banking_ListCountriesByLocalName(AB_BANKING *ab, const char *name); /*@}*/ /*@}*/ /* addtogroup */ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/banking_online.c0000644000175000017500000005504712364015477020056 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /* This file is included by banking.c */ int AB_Banking_ExecutionProgress(AB_BANKING *ab) { if (!ab->currentJobs) return 0; else { AB_JOB_LIST2_ITERATOR *jit; uint32_t count=0; jit=AB_Job_List2_First(ab->currentJobs); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); while(j) { AB_JOB_STATUS jst; jst=AB_Job_GetStatus(j); if (jst==AB_Job_StatusFinished || jst==AB_Job_StatusPending || jst==AB_Job_StatusError) count++; j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } return GWEN_Gui_ProgressAdvance(0, count); } } int AB_Banking__ExecuteQueue(AB_BANKING *ab, AB_JOB_LIST2 *jl, AB_IMEXPORTER_CONTEXT *ctx){ AB_PROVIDER *pro; int succ; assert(ab); pro=AB_Provider_List_First(ab->providers); succ=0; ab->currentJobs=jl; while(pro) { AB_JOB_LIST2_ITERATOR *jit; int jobs=0; int rv; jit=AB_Job_List2_First(jl); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); while(j) { AB_JOB_STATUS jst; jst=AB_Job_GetStatus(j); DBG_INFO(AQBANKING_LOGDOMAIN, "Checking job..."); if (jst==AB_Job_StatusEnqueued || jst==AB_Job_StatusPending) { AB_ACCOUNT *a; a=AB_Job_GetAccount(j); assert(a); if (AB_Account_GetProvider(a)==pro) { DBG_INFO(AQBANKING_LOGDOMAIN, "Same provider, adding job"); /* same provider, add job */ AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", "Adding job to backend"); rv=AB_Provider_AddJob(pro, j); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not add job (%d)", rv); AB_Job_SetStatus(j, AB_Job_StatusError); AB_Job_SetResultText(j, "Refused by backend"); AB_Job_Log(j, GWEN_LoggerLevel_Error, "aqbanking", "Adding job: Refused by backend"); } else { jobs++; if (AB_Job_GetStatus(j)!=AB_Job_StatusPending) { AB_Job_SetStatus(j, AB_Job_StatusSent); } } } } /* if job enqueued */ else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Job %08x in queue with status \"%s\"", AB_Job_GetJobId(j), AB_Job_Status2Char(AB_Job_GetStatus(j))); } j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } if (jobs) { DBG_INFO(AQBANKING_LOGDOMAIN, "Letting backend \"%s\" work", AB_Provider_GetName(pro)); rv=AB_Provider_Execute(pro, ctx); if (rv<0) { if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); ab->currentJobs=0; return rv; } DBG_NOTICE(AQBANKING_LOGDOMAIN, "Error executing backend's queue"); } else { rv=AB_Banking_ExecutionProgress(ab); if (rv==GWEN_ERROR_USER_ABORTED) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); ab->currentJobs=0; return rv; } succ++; } } /* if jobs in backend's queue */ pro=AB_Provider_List_Next(pro); } /* while */ ab->currentJobs=0; if (!succ) { DBG_WARN(AQBANKING_LOGDOMAIN, "Not a single job successfully executed"); /* don't return an error here, because at least when retrieving the * list of allowed iTAN modes there will most definately be an error with * the only job in the queue */ /*return GWEN_ERROR_GENERIC;*/ } return 0; } int AB_Banking_ExecuteJobs(AB_BANKING *ab, AB_JOB_LIST2 *jl2, AB_IMEXPORTER_CONTEXT *ctx){ int rv; uint32_t pid; AB_JOB_LIST2_ITERATOR *jit; AB_PROVIDER *pro=0; assert(ab); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Attaching to jobs, dequeing them"); jit=AB_Job_List2_First(jl2); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); while(j) { AB_Job_SetStatus(j, AB_Job_StatusEnqueued); j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } /* execute jobs */ pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_ALLOW_SUBLEVELS | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_KEEP_OPEN | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Executing Jobs"), I18N("Now the jobs are send via their " "backends to the credit institutes."), AB_Job_List2_GetSize(jl2), 0); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, "AqBanking v"AQBANKING_VERSION_FULL_STRING); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Sending jobs to the bank(s)")); rv=AB_Banking__ExecuteQueue(ab, jl2, ctx); AB_Banking_ClearCryptTokenList(ab); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); } /* clear queue */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Postprocessing jobs")); jit=AB_Job_List2_First(jl2); if (jit) { AB_JOB *j; j=AB_Job_List2Iterator_Data(jit); while(j) { switch(AB_Job_GetStatus(j)) { case AB_Job_StatusEnqueued: /* job still enqueued, so it has never been sent */ GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Job %s: never been sent"), AB_Job_Type2LocalChar(AB_Job_GetType(j))); AB_Job_SetStatus(j, AB_Job_StatusError); AB_Job_SetResultText(j, "Job has never been sent"); AB_Job_Log(j, GWEN_LoggerLevel_Error, "aqbanking", "Job has never been sent"); break; case AB_Job_StatusPending: GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Warning, I18N("Job %s: pending"), AB_Job_Type2LocalChar(AB_Job_GetType(j))); AB_Job_Log(j, GWEN_LoggerLevel_Notice, "aqbanking", "Job is still pending"); break; case AB_Job_StatusSent: GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Notice, I18N("Job %s: sent"), AB_Job_Type2LocalChar(AB_Job_GetType(j))); AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", "Job finished"); break; case AB_Job_StatusFinished: GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Notice, I18N("Job %s: finished"), AB_Job_Type2LocalChar(AB_Job_GetType(j))); AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", "Job finished"); break; case AB_Job_StatusError: GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Job %s: error"), AB_Job_Type2LocalChar(AB_Job_GetType(j))); AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", "Job finished"); break; default: AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", "Job finished"); break; } j=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } /* reset all provider queues, this makes sure no job remains in any queue */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Resetting provider queues")); pro=AB_Provider_List_First(ab->providers); while(pro) { int lrv; lrv=AB_Provider_ResetQueue(pro); if (lrv) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error resetting providers queue (%d)", lrv); } pro=AB_Provider_List_Next(pro); } /* while */ GWEN_Gui_ProgressEnd(pid); return rv; } const GWEN_STRINGLIST *AB_Banking_GetActiveProviders(const AB_BANKING *ab) { assert(ab); if (GWEN_StringList_Count(ab->activeProviders)==0) return 0; return ab->activeProviders; } AB_PROVIDER *AB_Banking__LoadProviderPlugin(AB_BANKING *ab, const char *modname){ GWEN_PLUGIN *pl; pl=GWEN_PluginManager_GetPlugin(ab_pluginManagerProvider, modname); if (pl) { AB_PROVIDER *pro; pro=AB_Plugin_Provider_Factory(pl, ab); if (!pro) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in plugin [%s]: No provider created", modname); return NULL; } return pro; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Plugin [%s] not found", modname); return NULL; } } int AB_Banking_FindDebugger(AB_BANKING *ab, const char *backend, const char *frontends, GWEN_BUFFER *pbuf){ GWEN_PLUGIN_DESCRIPTION_LIST2 *pl; char *s; char *p; pl=AB_Banking_GetDebuggerDescrs(ab, backend); if (!pl) { DBG_WARN(AQBANKING_LOGDOMAIN, "No debuggers available for backend \"%s\"", backend); return -1; } if (frontends==0) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; GWEN_PLUGIN_DESCRIPTION *pd; const char *name; pit=GWEN_PluginDescription_List2_First(pl); assert(pit); pd=GWEN_PluginDescription_List2Iterator_Data(pit); while(pd) { name=GWEN_PluginDescription_GetName(pd); if (!name) { DBG_WARN(AQBANKING_LOGDOMAIN, "Found a plugin description with no name"); } else { int rv; rv=AB_Banking__GetDebuggerPath(ab, backend, pbuf); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return rv; } GWEN_Buffer_AppendString(pbuf, DIRSEP); GWEN_Buffer_AppendString(pbuf, name); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return 0; } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } GWEN_PluginDescription_List2Iterator_free(pit); } /* if no frontend list */ /* check for every given frontend */ s=strdup(frontends); p=s; while(*p) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; GWEN_PLUGIN_DESCRIPTION *pd; char *t; t=strchr(p, ';'); if (t) *(t++)=0; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Trying frontend \"%s\"", p); pit=GWEN_PluginDescription_List2_First(pl); assert(pit); pd=GWEN_PluginDescription_List2Iterator_Data(pit); assert(pd); while(pd) { GWEN_XMLNODE *n; const char *fr; n=GWEN_PluginDescription_GetXmlNode(pd); assert(n); fr=GWEN_XMLNode_GetProperty(n, "frontend", ""); if (-1!=GWEN_Text_ComparePattern(fr, p, 0)) { const char *name; name=GWEN_PluginDescription_GetName(pd); if (!name) { DBG_WARN(AQBANKING_LOGDOMAIN, "Found a plugin description with no name"); } else { int rv; rv=AB_Banking__GetDebuggerPath(ab, backend, pbuf); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); free(s); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return rv; } GWEN_Buffer_AppendString(pbuf, DIRSEP); GWEN_Buffer_AppendString(pbuf, name); free(s); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return 0; } } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } /* while pd */ GWEN_PluginDescription_List2Iterator_free(pit); if (!t) break; p=t; } /* while */ free(s); GWEN_PluginDescription_List2_freeAll(pl); DBG_ERROR(AQBANKING_LOGDOMAIN, "No matching debugger found"); return -1; } int AB_Banking_FindWizard(AB_BANKING *ab, const char *backend, const char *frontends, GWEN_BUFFER *pbuf){ GWEN_PLUGIN_DESCRIPTION_LIST2 *pl; char *s; char *pfront; assert(ab); assert(pbuf); pl=AB_Banking_GetWizardDescrs(ab); if (!pl) { DBG_WARN(AQBANKING_LOGDOMAIN, "No wizards available."); return -1; } if (frontends==0) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; GWEN_PLUGIN_DESCRIPTION *pd; const char *name; pit=GWEN_PluginDescription_List2_First(pl); assert(pit); pd=GWEN_PluginDescription_List2Iterator_Data(pit); while(pd) { name=GWEN_PluginDescription_GetName(pd); if (!name) { DBG_WARN(AQBANKING_LOGDOMAIN, "Found a plugin description with no name."); } else { GWEN_STRINGLIST *sl; const char *wizard_folder; sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_WIZARDDIR); /* Out of laziness we simply use the first path. */ wizard_folder = GWEN_StringList_FirstString(sl); GWEN_Buffer_AppendString(pbuf, wizard_folder); GWEN_StringList_free(sl); GWEN_Buffer_AppendString(pbuf, DIRSEP); GWEN_Buffer_AppendString(pbuf, name); /* For windows, we need the exe extension as well */ if (strlen(EXEEXT) > 0) GWEN_Buffer_AppendString(pbuf, EXEEXT); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return 0; } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } GWEN_PluginDescription_List2Iterator_free(pit); } /* if no frontend list */ /* check for every given frontend */ s=strdup(frontends); pfront=s; while(*pfront) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; GWEN_PLUGIN_DESCRIPTION *pd; char *t; t=strchr(pfront, ';'); if (t) *(t++)=0; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Trying frontend \"%s\"", pfront); pit=GWEN_PluginDescription_List2_First(pl); assert(pit); pd=GWEN_PluginDescription_List2Iterator_Data(pit); assert(pd); while(pd) { GWEN_XMLNODE *n; const char *fr; n=GWEN_PluginDescription_GetXmlNode(pd); assert(n); fr=GWEN_XMLNode_GetProperty(n, "frontend", ""); if (-1!=GWEN_Text_ComparePattern(fr, pfront, 0)) { const char *name; name=GWEN_PluginDescription_GetName(pd); if (!name) { DBG_WARN(AQBANKING_LOGDOMAIN, "Found a plugin description with no name"); } else { GWEN_STRINGLIST *sl; const char *wizard_folder; sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_WIZARDDIR); /* Out of laziness we simply use the first path. */ wizard_folder = GWEN_StringList_FirstString(sl); GWEN_Buffer_AppendString(pbuf, wizard_folder); GWEN_StringList_free(sl); GWEN_Buffer_AppendString(pbuf, DIRSEP); GWEN_Buffer_AppendString(pbuf, name); /* For windows, we need the exe extension as well */ if (strlen(EXEEXT) > 0) GWEN_Buffer_AppendString(pbuf, EXEEXT); free(s); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pl); return 0; } } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } /* while pd */ GWEN_PluginDescription_List2Iterator_free(pit); if (!t) break; pfront=t; } /* while */ free(s); GWEN_PluginDescription_List2_freeAll(pl); DBG_ERROR(AQBANKING_LOGDOMAIN, "No matching wizard found"); return -1; } GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetProviderDescrs(AB_BANKING *ab){ GWEN_PLUGIN_DESCRIPTION_LIST2 *l; GWEN_PLUGIN_MANAGER *pm; pm = GWEN_PluginManager_FindPluginManager("provider"); if (!pm) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not find plugin manager for \"%s\"", "provider"); return 0; } l = GWEN_PluginManager_GetPluginDescrs(pm); if (l) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *it; GWEN_PLUGIN_DESCRIPTION *pd; it=GWEN_PluginDescription_List2_First(l); assert(it); pd=GWEN_PluginDescription_List2Iterator_Data(it); assert(pd); while(pd) { if (GWEN_StringList_HasString(ab->activeProviders, GWEN_PluginDescription_GetName(pd))) GWEN_PluginDescription_SetIsActive(pd, 1); else GWEN_PluginDescription_SetIsActive(pd, 0); pd=GWEN_PluginDescription_List2Iterator_Next(it); } GWEN_PluginDescription_List2Iterator_free(it); } return l; } GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetWizardDescrs(AB_BANKING *ab){ GWEN_PLUGIN_DESCRIPTION_LIST2 *wdl; GWEN_STRINGLIST *sl; const char *wizard_folder; sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_WIZARDDIR); /* Out of laziness we simply use the first path. */ wizard_folder = GWEN_StringList_FirstString(sl); wdl=GWEN_LoadPluginDescrs(wizard_folder); GWEN_StringList_free(sl); return wdl; } GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetDebuggerDescrs(AB_BANKING *ab, const char *pn){ GWEN_BUFFER *pbuf; GWEN_PLUGIN_DESCRIPTION_LIST2 *wdl; pbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(pbuf, AQBANKING_PLUGINS DIRSEP AB_PROVIDER_DEBUGGER_FOLDER DIRSEP); GWEN_Buffer_AppendString(pbuf, pn); wdl=GWEN_LoadPluginDescrs(GWEN_Buffer_GetStart(pbuf)); GWEN_Buffer_free(pbuf); return wdl; } int AB_Banking_InitProvider(AB_BANKING *ab, AB_PROVIDER *pro) { return AB_Provider_Init(pro); } int AB_Banking_FiniProvider(AB_BANKING *ab, AB_PROVIDER *pro) { int rv; rv=AB_Provider_Fini(pro); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "Error deinit backend (%d)", rv); } return rv; } AB_PROVIDER *AB_Banking_FindProvider(AB_BANKING *ab, const char *name) { AB_PROVIDER *pro; assert(ab); assert(name); pro=AB_Provider_List_First(ab->providers); while(pro) { if (strcasecmp(AB_Provider_GetName(pro), name)==0) break; pro=AB_Provider_List_Next(pro); } /* while */ return pro; } AB_PROVIDER *AB_Banking_GetProvider(AB_BANKING *ab, const char *name) { AB_PROVIDER *pro; assert(ab); assert(name); pro=AB_Banking_FindProvider(ab, name); if (pro) return pro; pro=AB_Banking__LoadProviderPlugin(ab, name); if (pro) { if (AB_Banking_InitProvider(ab, pro)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not init provider \"%s\"", name); AB_Provider_free(pro); return 0; } AB_Provider_List_Add(pro, ab->providers); } return pro; } int AB_Banking_GetCryptToken(AB_BANKING *ab, const char *tname, const char *cname, GWEN_CRYPT_TOKEN **pCt) { GWEN_CRYPT_TOKEN *ct=NULL; GWEN_CRYPT_TOKEN_LIST2_ITERATOR *it; assert(ab); assert(pCt); if (!tname || !cname) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in your configuration: TokenType \"%s\" or TokenName \"%s\" is NULL. Maybe you need to remove your configuration and create it again? Aborting.", tname ? tname : "NULL", cname ? cname : "NULL"); return GWEN_ERROR_IO; } it=GWEN_Crypt_Token_List2_First(ab->cryptTokenList); if (it) { ct=GWEN_Crypt_Token_List2Iterator_Data(it); assert(ct); while(ct) { const char *s1; const char *s2; s1=GWEN_Crypt_Token_GetTypeName(ct); s2=GWEN_Crypt_Token_GetTokenName(ct); assert(s1); assert(s2); if (strcasecmp(s1, tname)==0 && strcasecmp(s2, cname)==0) break; ct=GWEN_Crypt_Token_List2Iterator_Next(it); } GWEN_Crypt_Token_List2Iterator_free(it); } if (ct==NULL) { GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; /* get crypt token */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "CryptToken plugin manager not found"); return GWEN_ERROR_INTERNAL; } pl=GWEN_PluginManager_GetPlugin(pm, tname); if (pl==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Plugin \"%s\" not found", tname); return GWEN_ERROR_NOT_FOUND; } ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, cname); if (ct==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create crypt token"); return GWEN_ERROR_IO; } if (GWEN_Gui_GetFlags(GWEN_Gui_GetGui()) & GWEN_GUI_FLAGS_NONINTERACTIVE) /* in non-interactive mode, so don't use the secure pin input of card readers because * that wouldn't give us a chance to inject the pin via a pinfile */ GWEN_Crypt_Token_AddModes(ct, GWEN_CRYPT_TOKEN_MODE_FORCE_PIN_ENTRY); /* add to internal list */ GWEN_Crypt_Token_List2_PushBack(ab->cryptTokenList, ct); } *pCt=ct; return 0; } void AB_Banking_ClearCryptTokenList(AB_BANKING *ab) { GWEN_CRYPT_TOKEN_LIST2_ITERATOR *it; assert(ab); assert(ab->cryptTokenList); it=GWEN_Crypt_Token_List2_First(ab->cryptTokenList); if (it) { GWEN_CRYPT_TOKEN *ct; ct=GWEN_Crypt_Token_List2Iterator_Data(it); assert(ct); while(ct) { while(GWEN_Crypt_Token_IsOpen(ct)) { int rv; rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not close crypt token [%s:%s], abandoning (%d)", GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct), rv); GWEN_Crypt_Token_Close(ct, 1, 0); } } GWEN_Crypt_Token_free(ct); ct=GWEN_Crypt_Token_List2Iterator_Next(it); } GWEN_Crypt_Token_List2Iterator_free(it); } GWEN_Crypt_Token_List2_Clear(ab->cryptTokenList); } int AB_Banking_CheckCryptToken(AB_BANKING *ab, GWEN_CRYPT_TOKEN_DEVICE devt, GWEN_BUFFER *typeName, GWEN_BUFFER *tokenName) { GWEN_PLUGIN_MANAGER *pm; int rv; /* get crypt token */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "CryptToken plugin manager not found"); return GWEN_ERROR_NOT_FOUND; } /* try to determine the type and name */ rv=GWEN_Crypt_Token_PluginManager_CheckToken(pm, devt, typeName, tokenName, 0); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AB_Banking_GetCert(AB_BANKING *ab, const char *url, const char *defaultProto, int defaultPort, uint32_t *httpFlags, uint32_t pid) { int rv; GWEN_HTTP_SESSION *sess; sess=GWEN_HttpSession_new(url, defaultProto, defaultPort); GWEN_HttpSession_SetFlags(sess, *httpFlags); rv=GWEN_HttpSession_Init(sess); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not init HTTP session (%d)"), rv); GWEN_HttpSession_free(sess); return rv; } rv=GWEN_HttpSession_ConnectionTest(sess); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not connect to server (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not connect to server, giving up (%d)"), rv); return rv; } *httpFlags=GWEN_HttpSession_GetFlags(sess); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Connection ok, certificate probably received")); return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/banking.h0000644000175000017500000002575512364015477016522 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file * @short The main interface of the aqbanking library */ #ifndef AQBANKING_BANKING_H #define AQBANKING_BANKING_H /** @addtogroup G_AB_BANKING Main Interface */ /*@{*/ /** * Object to be operated on by functions in this group (@ref AB_BANKING). */ typedef struct AB_BANKING AB_BANKING; /*@}*/ #include #include #include #include #include #include #include /* for AQBANKING_API */ #include /* outsourced */ #include #include #include #include #include #include #include #define AB_PM_LIBNAME "aqbanking" #define AB_PM_SYSCONFDIR "sysconfdir" #define AB_PM_DATADIR "datadir" #define AB_PM_WIZARDDIR "wizarddir" #define AB_PM_LOCALEDIR "localedir" #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_BANKING Main Interface * * @short This group contains the main API function group. * *

* A program should first call @ref AB_Banking_Init to allow AqBanking * to load its configuration files and initialize itself. *

* After that you may call any other function of this group (most likely * the program will request a list of managed account via * @ref AB_Banking_GetAccounts). *

*

* When the program has finished its work it should call @ref AB_Banking_Fini * as the last function of AqBanking (just before calling * @ref AB_Banking_free). *

*/ /*@{*/ /** @name Extensions supported by the application * */ /*@{*/ #define AB_BANKING_EXTENSION_NONE 0x00000000 /*@}*/ /** * This object is prepared to be inherited (using @ref GWEN_INHERIT_SETDATA). */ GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_BANKING, AQBANKING_API) /** @name Constructor, Destructor, Init, Fini * */ /*@{*/ /** *

* Creates an instance of AqBanking. Though AqBanking is quite object * oriented (and thus allows multiple instances of AB_BANKING to co-exist) * you should avoid having multiple AB_BANKING objects in parallel. *

*

* This is just because the backends are loaded dynamically and might not like * to be used with multiple instances of AB_BANKING in parallel. *

*

* You should later free this object using @ref AB_Banking_free. *

*

* This function does not actually load the configuration file or setup * AqBanking, that is performed by @ref AB_Banking_Init and * @ref AB_Banking_OnlineInit, respectively. *

* * @return new instance of AB_BANKING * * @param appName name of the application which wants to use AqBanking. * This allows AqBanking to separate settings and data for multiple * applications. * * @param dname Path for the directory containing the user data of * AqBanking. You should in most cases present a NULL for this * parameter, which means AqBanking will choose the default user * data folder which is "$HOME/.aqbanking". * The configuration itself is handled using GWEN's GWEN_ConfigMgr * module (see @ref GWEN_ConfigMgr_Factory). That module stores the * configuration in AqBanking's subfolder "settings" (i.e. the * full path to the user/account configuration is "$HOME/.aqbanking/settings"). * * @param extensions use 0 for now. */ AQBANKING_API AB_BANKING *AB_Banking_new(const char *appName, const char *dname, uint32_t extensions); /** * Destroys the given instance of AqBanking. Please note that if * @ref AB_Banking_Init has been called on this object then * @ref AB_Banking_Fini should be called before this function. */ AQBANKING_API void AB_Banking_free(AB_BANKING *ab); AQBANKING_API void AB_Banking_GetVersion(int *major, int *minor, int *patchlevel, int *build); /** * Initializes AqBanking. * This sets up the plugins, plugin managers and path managers. * If you want to use online banking tasks you must also call * @ref AB_Banking_OnlineInit afterwards. * * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * * @param ab banking interface */ AQBANKING_API int AB_Banking_Init(AB_BANKING *ab); /** * Deinitializes AqBanking thus allowing it to save its data and to unload * backends. * Please remember to call @ref AB_Banking_OnlineFini before this function * if you have used online banking functions. * * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * * @param ab banking interface */ AQBANKING_API int AB_Banking_Fini(AB_BANKING *ab); /** * Setup the online banking part of AqBanking. This function actually loads * the users and accounts. * * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * * @param ab banking interface */ AQBANKING_API int AB_Banking_OnlineInit(AB_BANKING *ab); /** * Uninitialize the online banking part of AqBanking. * * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * * @param ab banking interface */ AQBANKING_API int AB_Banking_OnlineFini(AB_BANKING *ab); /*@}*/ /** @name Working With Backends * */ /*@{*/ /** * Returns a list of the names of currently active providers. */ AQBANKING_API const GWEN_STRINGLIST *AB_Banking_GetActiveProviders(const AB_BANKING *ab); AQBANKING_API GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetProviderDescrs(AB_BANKING *ab); /** * Create a dialog which allows to create a new user. * * @return dialog * * @param ab pointer to the AqBanking object * * @param backend name of the backend for which a user is to be created * (e.g. "aqhbci", "aqebics" etc) * * @param mode additional parameter depending on the backend. it can be used * to specify the user type to be created (e.g. for HBCI those values * specify whether PIN/TAN, keyfile or chipcard users are to be created, * see @ref AqHBCI_NewUserDialog_CodeGeneric and following). * Use value 0 for the generic dialog. */ AQBANKING_API GWEN_DIALOG *AB_Banking_GetNewUserDialog(AB_BANKING *ab, const char *backend, int mode); /*@}*/ /** @name Working With Backends (Deprecated) * *

* These functions are now deprecated and will be removed prior to the release * of AqBanking5. *

*

* Since AqBanking5 configuration dialogs * and assistents are implemented using GWEN's Dialog Framework. This framework * allows for platform-independent dialogs (see @ref AB_ImporterDialog_new). *

*/ /*@{*/ /** * This function is deprecated and will be removed for the final release * of AqBanking5. * You can use @ref AB_SetupDialog_new to create the new setup dialog within your * application and run it via @ref GWEN_Dialog_Exec(). */ AQBANKING_API AQBANKING_DEPRECATED int AB_Banking_FindWizard(AB_BANKING *ab, const char *backend, const char *frontends, GWEN_BUFFER *pbuf); AQBANKING_API AQBANKING_DEPRECATED int AB_Banking_FindDebugger(AB_BANKING *ab, const char *backend, const char *frontends, GWEN_BUFFER *pbuf); /*@}*/ /** @name Application Data * * Applications may let AqBanking store global application specific data. */ /*@{*/ /** * Returns the application name as given to @ref AB_Banking_new. * @param ab pointer to the AB_BANKING object */ AQBANKING_API const char *AB_Banking_GetAppName(const AB_BANKING *ab); /** * Returns the escaped version of the application name. This name can * safely be used to create file paths since all special characters (like * '/', '.' etc) are escaped. * @param ab pointer to the AB_BANKING object */ AQBANKING_API const char *AB_Banking_GetEscapedAppName(const AB_BANKING *ab); /** * Returns the name of the user folder for AqBanking's data. * Normally this is something like "/home/me/.aqbanking". * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * @param ab pointer to the AB_BANKING object * @param buf GWEN_BUFFER to append the path name to */ AQBANKING_API int AB_Banking_GetUserDataDir(const AB_BANKING *ab, GWEN_BUFFER *buf); /** * Returns the name of the user folder for application data. * Normally this is something like "/home/me/.aqbanking/apps". * Your application may choose to create folders below this one to store * user data. If you only add AqBanking to an existing program to add * home banking support you will most likely use your own folders and thus * won't need this function. * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * @param ab pointer to the AB_BANKING object * @param buf GWEN_BUFFER to append the path name to */ AQBANKING_API int AB_Banking_GetAppUserDataDir(const AB_BANKING *ab, GWEN_BUFFER *buf); /** * Returns the path to a folder to which shared data can be stored. * This might be used by multiple applications if they wish to share some * of their data, e.g. QBankManager and AqMoney3 share their transaction * storage so that both may work with it. * Please note that this folder does not necessarily exist, but you are free * to create it. */ AQBANKING_API int AB_Banking_GetSharedDataDir(const AB_BANKING *ab, const char *name, GWEN_BUFFER *buf); /** Returns the void pointer that was stored by * AB_Banking_SetUserData(). This might be useful for passing data to * the callback functions. * * On the other hand, we strongly encourage using the GWEN_INHERIT * macros to store non-trivial data structures in this object. * * @param ab Pointer to the AB_BANKING object */ AQBANKING_API void *AB_Banking_GetUserData(AB_BANKING *ab); /** Save the void pointer that can be retrieved by * AB_Banking_GetUserData(). This might be useful for passing data to * the callback functions. * * On the other hand, we strongly encourage using the GWEN_INHERIT * macros to store non-trivial data structures in this object. * * @param ab Pointer to the AB_BANKING object * @param user_data Arbitrary pointer to be stored in the AB_BANKING */ AQBANKING_API void AB_Banking_SetUserData(AB_BANKING *ab, void *user_data); /*@}*/ /** @name Plugin Handling * * These functions are also obsolete and will be removed for AqBanking5. */ /*@{*/ AQBANKING_API AQBANKING_DEPRECATED GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetWizardDescrs(AB_BANKING *ab); AQBANKING_API AQBANKING_DEPRECATED GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetDebuggerDescrs(AB_BANKING *ab, const char *pn); /*@}*/ /*@}*/ /* addtogroup */ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/banking_be.h0000644000175000017500000000744512364015477017164 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file banking_be.h * @short This file is used by provider backends. */ #ifndef AQBANKING_BANKING_BE_H #define AQBANKING_BANKING_BE_H #include #include #define AB_CFG_GROUP_BACKENDS "backends" #define AB_CFG_GROUP_BANKINFO "bankinfo" #define AB_CFG_GROUP_IMEXPORTER "imexporter" /** @addtogroup G_AB_BE_BANKING */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Functions Used by Backends And Wizards * */ /*@{*/ /** * Loads a backend with the given name. You can use * @ref AB_Banking_GetProviderDescrs to retrieve a list of available * backends. */ AQBANKING_API AB_PROVIDER *AB_Banking_GetProvider(AB_BANKING *ab, const char *name); /** * Returns the list of global data folders. In most cases this is something * like $PREFIX/share/. Plugins are required to use the folders * returned here + "aqbanking" when searching for their specific data instead * of using the compile time fixed values. This way it is easier under * windows to find data. */ AQBANKING_API GWEN_STRINGLIST *AB_Banking_GetGlobalDataDirs(void); AQBANKING_API GWEN_STRINGLIST *AB_Banking_GetGlobalSysconfDirs(void); /*@}*/ /** @name Administration of Crypt Token List * */ /*@{*/ AQBANKING_API int AB_Banking_GetCryptToken(AB_BANKING *ab, const char *tname, const char *cname, GWEN_CRYPT_TOKEN **pCt); AQBANKING_API void AB_Banking_ClearCryptTokenList(AB_BANKING *ab); AQBANKING_API int AB_Banking_CheckCryptToken(AB_BANKING *ab, GWEN_CRYPT_TOKEN_DEVICE devt, GWEN_BUFFER *typeName, GWEN_BUFFER *tokenName); /*@}*/ /** @name Configuration Data Handling for Plugins * */ /*@{*/ AQBANKING_API int AB_Banking_LoadPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name, GWEN_DB_NODE **pDb); AQBANKING_API int AB_Banking_SavePluginConfig(AB_BANKING *ab, const char *pluginName, const char *name, GWEN_DB_NODE *db); AQBANKING_API int AB_Banking_LockPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name); AQBANKING_API int AB_Banking_UnlockPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name); AQBANKING_API int AB_Banking_SaveAccountConfig(AB_BANKING *ab, AB_ACCOUNT *a, int doLock); AQBANKING_API int AB_Banking_SaveUserConfig(AB_BANKING *ab, AB_USER *u, int doLock); /*@}*/ AQBANKING_API int AB_Banking_ExecutionProgress(AB_BANKING *ab); AQBANKING_API int AB_Banking_GetUniqueId(AB_BANKING *ab); AQBANKING_API int AB_Banking_GetCert(AB_BANKING *ab, const char *url, const char *defaultProto, int defaultPort, uint32_t *httpFlags, uint32_t pid); /** * This copies the name of the folder for AqBanking's backend data into * the given GWEN_Buffer (not including the provider's name). * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * @param ab pointer to the AB_BANKING object * @param buf buffer to append the path name to */ AQBANKING_API int AB_Banking_GetProviderUserDataDir(const AB_BANKING *ab, const char *name, GWEN_BUFFER *buf); #ifdef __cplusplus } #endif /*@}*/ #endif /* AQBANKING_BANKING_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/job.c0000644000175000017500000004176012367457123015651 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "job_p.h" #include "job_be.h" #include "i18n_l.h" #include "account_l.h" #include "banking_l.h" #include "provider_l.h" #include "jobs/jobgetdatedtransfers_l.h" #include "jobs/jobgettransactions_l.h" #include "jobs/jobgetstandingorders_l.h" #include "jobs/jobgetbalance_l.h" #include "jobs/jobsingletransfer_l.h" #include "jobs/jobsingledebitnote_l.h" #include "jobs/jobeutransfer_l.h" #include "jobs/jobsepatransfer_l.h" #include "jobs/jobcreatesto_l.h" #include "jobs/jobmodifysto_l.h" #include "jobs/jobdeletesto_l.h" #include "jobs/jobcreatedatedtransfer_l.h" #include "jobs/jobmodifydatedtransfer_l.h" #include "jobs/jobdeletedatedtransfer_l.h" #include "jobs/jobinternaltransfer_l.h" #include "jobs/jobloadcellphone_l.h" #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_JOB, AB_Job) GWEN_LIST2_FUNCTIONS(AB_JOB, AB_Job) GWEN_INHERIT_FUNCTIONS(AB_JOB) AB_JOB *AB_Job_new(AB_JOB_TYPE jt, AB_ACCOUNT *a){ AB_JOB *j; GWEN_BUFFER *lbuf; const char *bankCode; const char *accountNumber; AB_BANKING *ab; assert(a); ab=AB_Account_GetBanking(a); assert(ab); GWEN_NEW_OBJECT(AB_JOB, j); j->usage=1; GWEN_INHERIT_INIT(AB_JOB, j); GWEN_LIST_INIT(AB_JOB, j); j->jobId=AB_Banking_GetUniqueId(ab); j->jobType=jt; j->account=a; AB_Account_Attach(j->account); j->createdBy=strdup(AB_Banking_GetAppName(AB_Account_GetBanking(a))); j->dbData=GWEN_DB_Group_new("data"); bankCode=AB_Account_GetBankCode(a); if (!bankCode || !*bankCode) bankCode="[no bankcode]"; accountNumber=AB_Account_GetAccountNumber(a); lbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(lbuf, "Created job for account \""); GWEN_Buffer_AppendString(lbuf, accountNumber); GWEN_Buffer_AppendString(lbuf, "\" at \""); GWEN_Buffer_AppendString(lbuf, bankCode); GWEN_Buffer_AppendString(lbuf, "\""); AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); return j; } int AB_Job_Update(AB_JOB *j){ AB_PROVIDER *pro; assert(j); /* check whether the job is available */ pro=AB_Account_GetProvider(j->account); assert(pro); j->availability=AB_Provider_UpdateJob(pro, j); return j->availability; } void AB_Job_Attach(AB_JOB *j){ assert(j); assert(j->usage); j->usage++; } void AB_Job_free(AB_JOB *j){ if (j) { assert(j->usage); if (--(j->usage)==0) { DBG_VERBOUS(AQBANKING_LOGDOMAIN, "Destroying AB_JOB"); GWEN_INHERIT_FINI(AB_JOB, j); GWEN_LIST_FINI(AB_JOB, j); AB_Transaction_free(j->transaction); AB_TransactionLimits_free(j->limits); AB_Account_free(j->account); GWEN_DB_Group_free(j->dbData); GWEN_Time_free(j->lastStatusChange); free(j->resultText); free(j->createdBy); free(j->usedTan); GWEN_FREE_OBJECT(j); } } } int AB_Job_CheckAvailability(AB_JOB *j){ assert(j); AB_Job_Update(j); return j->availability; } AB_JOB_STATUS AB_Job_GetStatus(const AB_JOB *j){ assert(j); return j->status; } void AB_Job_SetStatus(AB_JOB *j, AB_JOB_STATUS st){ assert(j); if (j->status!=st) { GWEN_BUFFER *lbuf; GWEN_Time_free(j->lastStatusChange); lbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(lbuf, "Status changed from \""); GWEN_Buffer_AppendString(lbuf, AB_Job_Status2Char(j->status)); GWEN_Buffer_AppendString(lbuf, "\" to \""); GWEN_Buffer_AppendString(lbuf, AB_Job_Status2Char(st)); GWEN_Buffer_AppendString(lbuf, "\""); AB_Job_Log(j, GWEN_LoggerLevel_Info, "aqbanking", GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); j->lastStatusChange=GWEN_CurrentTime(); j->status=st; } } AB_JOB_TYPE AB_Job_GetType(const AB_JOB *j){ assert(j); return j->jobType; } const char *AB_Job_GetUsedTan(const AB_JOB *j) { assert(j); return j->usedTan; } void AB_Job_SetUsedTan(AB_JOB *j, const char *s) { assert(j); free(j->usedTan); if (s) j->usedTan=strdup(s); else j->usedTan=0; } const char *AB_Job_Status2Char(AB_JOB_STATUS i) { const char *s; switch(i) { case AB_Job_StatusNew: s="new"; break; case AB_Job_StatusUpdated: s="updated"; break; case AB_Job_StatusEnqueued: s="enqueued"; break; case AB_Job_StatusSent: s="sent"; break; case AB_Job_StatusPending: s="pending"; break; case AB_Job_StatusFinished: s="finished"; break; case AB_Job_StatusError: s="error"; break; default: s="unknown"; break; } return s; } AB_JOB_STATUS AB_Job_Char2Status(const char *s) { AB_JOB_STATUS i; if (strcasecmp(s, "new")==0) i=AB_Job_StatusNew; else if (strcasecmp(s, "updated")==0) i=AB_Job_StatusUpdated; else if (strcasecmp(s, "enqueued")==0) i=AB_Job_StatusEnqueued; else if (strcasecmp(s, "sent")==0) i=AB_Job_StatusSent; else if (strcasecmp(s, "pending")==0) i=AB_Job_StatusPending; else if (strcasecmp(s, "finished")==0) i=AB_Job_StatusFinished; else if (strcasecmp(s, "error")==0) i=AB_Job_StatusError; else i=AB_Job_StatusUnknown; return i; } const char *AB_Job_Type2Char(AB_JOB_TYPE i) { const char *s; switch(i) { case AB_Job_TypeGetBalance: s="getbalance"; break; case AB_Job_TypeGetTransactions: s="gettransactions"; break; case AB_Job_TypeTransfer: s="transfer"; break; case AB_Job_TypeDebitNote: s="debitnote"; break; case AB_Job_TypeEuTransfer: s="eutransfer"; break; case AB_Job_TypeGetStandingOrders: s="getstandingorders"; break; case AB_Job_TypeGetDatedTransfers: s="getdatedtransfers"; break; case AB_Job_TypeCreateStandingOrder: s="createstandingorder"; break; case AB_Job_TypeModifyStandingOrder: s="modifystandingorder"; break; case AB_Job_TypeDeleteStandingOrder: s="deletestandingorder"; break; case AB_Job_TypeCreateDatedTransfer: s="createdatedtransfer"; break; case AB_Job_TypeModifyDatedTransfer: s="modifydatedtransfer"; break; case AB_Job_TypeDeleteDatedTransfer: s="deletedatedtransfer"; break; case AB_Job_TypeInternalTransfer: s="internaltransfer"; break; case AB_Job_TypeLoadCellPhone: s="loadCellPhone"; break; case AB_Job_TypeSepaTransfer: s="sepaTransfer"; break; case AB_Job_TypeSepaDebitNote: s="sepaDebitNote"; break; case AB_Job_TypeSepaCreateStandingOrder: s="sepaCreateStandingOrder"; break; case AB_Job_TypeSepaModifyStandingOrder: s="sepaModifyStandingOrder"; break; case AB_Job_TypeSepaDeleteStandingOrder: s="sepaDeleteStandingOrder"; break; case AB_Job_TypeSepaFlashDebitNote: s="sepaFlashDebitNote"; break; case AB_Job_TypeSepaGetStandingOrders: s="sepaGetStandingOrders"; break; default: case AB_Job_TypeUnknown: s="unknown"; break; } return s; } const char *AB_Job_Type2LocalChar(AB_JOB_TYPE i) { const char *s; switch(i) { case AB_Job_TypeGetBalance: s=I18N("Get Balance"); break; case AB_Job_TypeGetTransactions: s=I18N("Get Transactions"); break; case AB_Job_TypeTransfer: s=I18N("Transfer"); break; case AB_Job_TypeDebitNote: s=I18N("Debit Note"); break; case AB_Job_TypeEuTransfer: s=I18N("EU Transfer"); break; case AB_Job_TypeGetStandingOrders: s=I18N("Get Standing Orders"); break; case AB_Job_TypeGetDatedTransfers: s=I18N("Get Dated Transfers"); break; case AB_Job_TypeCreateStandingOrder: s=I18N("Create Standing Order"); break; case AB_Job_TypeModifyStandingOrder: s=I18N("Modify Standing Order"); break; case AB_Job_TypeDeleteStandingOrder: s=I18N("Delete Standing Order"); break; case AB_Job_TypeCreateDatedTransfer: s=I18N("Create Dated Transfer"); break; case AB_Job_TypeModifyDatedTransfer: s=I18N("Modify Dated Transfer"); break; case AB_Job_TypeDeleteDatedTransfer: s=I18N("Delete Dated Transfer"); break; case AB_Job_TypeInternalTransfer: s=I18N("Internal Transfer"); break; case AB_Job_TypeLoadCellPhone: s=I18N("Load Cellphone"); break; case AB_Job_TypeSepaTransfer: s=I18N("SEPA Transfer"); break; case AB_Job_TypeSepaDebitNote: s=I18N("SEPA Debit Note"); break; case AB_Job_TypeSepaCreateStandingOrder: s=I18N("SEPA Create Standing Order"); break; case AB_Job_TypeSepaModifyStandingOrder: s=I18N("SEPA Modify Standing Order"); break; case AB_Job_TypeSepaDeleteStandingOrder: s=I18N("SEPA Delete Standing Order"); break; case AB_Job_TypeSepaFlashDebitNote: s=I18N("SEPA Flash Debit Note"); break; case AB_Job_TypeSepaGetStandingOrders: s=I18N("SEPA Get Standing Orders"); break; default: case AB_Job_TypeUnknown: s=I18N("unknown"); break; } return s; } AB_JOB_TYPE AB_Job_Char2Type(const char *s) { AB_JOB_TYPE i; if (strcasecmp(s, "getbalance")==0) i=AB_Job_TypeGetBalance; else if (strcasecmp(s, "gettransactions")==0) i=AB_Job_TypeGetTransactions; else if (strcasecmp(s, "transfer")==0) i=AB_Job_TypeTransfer; else if (strcasecmp(s, "debitnote")==0) i=AB_Job_TypeDebitNote; else if (strcasecmp(s, "eutransfer")==0) i=AB_Job_TypeEuTransfer; else if (strcasecmp(s, "getstandingorders")==0) i=AB_Job_TypeGetStandingOrders; else if (strcasecmp(s, "getdatedtransfers")==0) i=AB_Job_TypeGetDatedTransfers; else if (strcasecmp(s, "createstandingorder")==0) i=AB_Job_TypeCreateStandingOrder; else if (strcasecmp(s, "modifystandingorder")==0) i=AB_Job_TypeModifyStandingOrder; else if (strcasecmp(s, "deletestandingorder")==0) i=AB_Job_TypeDeleteStandingOrder; else if (strcasecmp(s, "createdatedtransfer")==0) i=AB_Job_TypeCreateDatedTransfer; else if (strcasecmp(s, "modifydatedtransfer")==0) i=AB_Job_TypeModifyDatedTransfer; else if (strcasecmp(s, "deletedatedtransfer")==0) i=AB_Job_TypeDeleteDatedTransfer; else if (strcasecmp(s, "internaltransfer")==0) i=AB_Job_TypeInternalTransfer; else if (strcasecmp(s, "loadCellPhone")==0) i=AB_Job_TypeLoadCellPhone; else if (strcasecmp(s, "sepaTransfer")==0) i=AB_Job_TypeSepaTransfer; else if (strcasecmp(s, "sepaDebitNote")==0) i=AB_Job_TypeSepaDebitNote; else i=AB_Job_TypeUnknown; return i; } uint32_t AB_Job_GetIdForProvider(const AB_JOB *j) { assert(j); return j->idForProvider; } void AB_Job_SetIdForProvider(AB_JOB *j, uint32_t i) { assert(j); j->idForProvider=i; } AB_ACCOUNT *AB_Job_GetAccount(const AB_JOB *j){ assert(j); return j->account; } void AB_Job_List2_FreeAll(AB_JOB_LIST2 *jl){ AB_Job_List2_ClearAll(jl); AB_Job_List2_free(jl); } AB_JOB *AB_Job__clearAll_cb(AB_JOB *j, void *userData) { AB_Job_free(j); return 0; } void AB_Job_List2_ClearAll(AB_JOB_LIST2 *jl){ AB_Job_List2_ForEach(jl, AB_Job__clearAll_cb, 0); AB_Job_List2_Clear(jl); } const char *AB_Job_GetResultText(const AB_JOB *j){ assert(j); return j->resultText; } void AB_Job_SetResultText(AB_JOB *j, const char *s){ assert(j); free(j->resultText); if (s) j->resultText=strdup(s); else j->resultText=0; } uint32_t AB_Job_GetJobId(const AB_JOB *j) { assert(j); return j->jobId; } const char *AB_Job_GetCreatedBy(const AB_JOB *j) { assert(j); return j->createdBy; } void AB_Job_SetUniqueId(AB_JOB *j, uint32_t jid){ assert(j); j->jobId=jid; } GWEN_DB_NODE *AB_Job_GetAppData(AB_JOB *j){ const char *s; GWEN_DB_NODE *db; assert(j); s=AB_Banking_GetEscapedAppName(AB_Account_GetBanking(AB_Job_GetAccount(j))); assert(s); db=GWEN_DB_GetGroup(j->dbData, GWEN_DB_FLAGS_DEFAULT, "apps"); assert(db); return GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, s); } GWEN_DB_NODE *AB_Job_GetProviderData(AB_JOB *j, AB_PROVIDER *pro){ const char *s; GWEN_DB_NODE *db; assert(j); assert(pro); s=AB_Provider_GetEscapedName(pro); db=GWEN_DB_GetGroup(j->dbData, GWEN_DB_FLAGS_DEFAULT, "backends"); assert(db); return GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, s); } const GWEN_TIME *AB_Job_GetLastStatusChange(const AB_JOB *j){ assert(j); return j->lastStatusChange; } void AB_Job_Log(AB_JOB *j, GWEN_LOGGER_LEVEL ll, const char *who, const char *txt) { GWEN_DB_NODE *db; char buffer[32]; GWEN_TIME *ti; GWEN_BUFFER *lbuf; assert(j); db=GWEN_DB_GetGroup(j->dbData, GWEN_DB_FLAGS_DEFAULT, "logs"); assert(db); lbuf=GWEN_Buffer_new(0, 128, 0, 1); snprintf(buffer, sizeof(buffer), "%02d", ll); GWEN_Buffer_AppendString(lbuf, buffer); GWEN_Buffer_AppendByte(lbuf, ':'); ti=GWEN_CurrentTime(); assert(ti); GWEN_Time_toString(ti, "YYYYMMDD:hhmmss:", lbuf); GWEN_Time_free(ti); GWEN_Text_EscapeToBufferTolerant(who, lbuf); GWEN_Buffer_AppendByte(lbuf, ':'); GWEN_Text_EscapeToBufferTolerant(txt, lbuf); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "log", GWEN_Buffer_GetStart(lbuf)); GWEN_Buffer_free(lbuf); } void AB_Job_LogRaw(AB_JOB *j, const char *txt) { GWEN_DB_NODE *db; assert(j); db=GWEN_DB_GetGroup(j->dbData, GWEN_DB_FLAGS_DEFAULT, "logs"); assert(db); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "log", txt); } GWEN_STRINGLIST *AB_Job_GetLogs(const AB_JOB *j) { const char *s; int i; GWEN_STRINGLIST *sl; GWEN_DB_NODE *db; assert(j); db=GWEN_DB_GetGroup(j->dbData, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "logs"); if (!db) return 0; sl=GWEN_StringList_new(); for (i=0; ; i++) { s=GWEN_DB_GetCharValue(db, "log", i, 0); if (!s) break; GWEN_StringList_AppendString(sl, s, 0, 0); } if (GWEN_StringList_Count(sl)==0) { GWEN_StringList_free(sl); return 0; } return sl; } int AB_Job_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t) { assert(j); if (t) { AB_TRANSACTION *cpy; AB_ACCOUNT *a; AB_BANKING *ba; cpy=AB_Transaction_dup(t); a=AB_Job_GetAccount(j); assert(a); ba=AB_Account_GetBanking(a); assert(ba); AB_Transaction_free(j->transaction); j->transaction=cpy; /* assign unique id */ AB_Transaction_SetUniqueId(j->transaction, AB_Banking_GetUniqueId(ba)); } else { AB_Transaction_free(j->transaction); j->transaction=NULL; } return 0; } AB_TRANSACTION *AB_Job_GetTransaction(const AB_JOB *j) { assert(j); return j->transaction; } const AB_TRANSACTION_LIMITS *AB_Job_GetFieldLimits(AB_JOB *j) { assert(j); return j->limits; } void AB_Job_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits) { assert(j); AB_TransactionLimits_free(j->limits); if (limits) j->limits=AB_TransactionLimits_dup(limits); else j->limits=0; } void AB_Job_DateToDb(const GWEN_TIME *ti, GWEN_DB_NODE *db, const char *name){ if (ti) { GWEN_BUFFER *dbuf; int rv; dbuf=GWEN_Buffer_new(0, 32, 0, 1); rv=GWEN_Time_toUtcString(ti, "YYYYMMDD hh:mm:ss", dbuf); assert(rv==0); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, name, GWEN_Buffer_GetStart(dbuf)); GWEN_Buffer_free(dbuf); } } GWEN_TIME *AB_Job_DateFromDb(GWEN_DB_NODE *db, const char *name) { const char *p; p=GWEN_DB_GetCharValue(db, name, 0, 0); if (p) { GWEN_TIME *ti; ti=GWEN_Time_fromUtcString(p, "YYYYMMDD hh:mm:ss"); assert(ti); return ti; } else { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, name); if (dbT) { GWEN_TIME *ti; ti=GWEN_Time_fromDb(dbT); assert(ti); return ti; } } return 0; } void AB_Job_DateOnlyToDb(const GWEN_TIME *ti, GWEN_DB_NODE *db, const char *name){ if (ti) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); rv=GWEN_Time_toUtcString(ti, "YYYYMMDD", tbuf); assert(rv==0); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, name, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } } GWEN_TIME *AB_Job_DateOnlyFromDb(GWEN_DB_NODE *db, const char *name) { const char *p; p=GWEN_DB_GetCharValue(db, name, 0, 0); if (p) { GWEN_TIME *ti; GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, p); GWEN_Buffer_AppendString(dbuf, "-12:00"); ti=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); assert(ti); GWEN_Buffer_free(dbuf); return ti; } else { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, name); if (dbT) { GWEN_TIME *ti; ti=GWEN_Time_fromDb(dbT); assert(ti); return ti; } } return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/provider_be.h0000644000175000017500000002541412364015477017401 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file provider_be.h * @short This file is used by provider backends. */ #ifndef AQBANKING_PROVIDER_BE_H #define AQBANKING_PROVIDER_BE_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_PROVIDER * */ /*@{*/ #define AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG 0x00000001 #define AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG 0x00000002 #define AB_PROVIDER_FLAGS_HAS_NEWACCOUNT_DIALOG 0x00000004 #define AB_PROVIDER_FLAGS_HAS_EDITACCOUNT_DIALOG 0x00000008 #define AB_PROVIDER_FLAGS_HAS_USERTYPE_DIALOG 0x00000010 /** * This type is used with @ref AB_Provider_ExtendAccount and * @ref AB_Provider_ExtendUser. */ typedef enum { /** Object to be extended has just been created. For some backends this * means that some settings are allowed to be missing at this point.*/ AB_ProviderExtendMode_Create=0, /** Object to be extended has been read from the configuration file */ AB_ProviderExtendMode_Extend, /** Object to be extended has just been added to internal lists. * For the backend this might mean that the object should be completely * setup at this point. */ AB_ProviderExtendMode_Add, /** Object to be extended is just about to be removed from the internal * list. */ AB_ProviderExtendMode_Remove, /** This extend mode just lets the backend store data which has not yet * been stored into the users/accounts DB. * Please note that in this mode the backend might no longer be * initialized, so you should not call any other provider function (or call * @ref AB_Provider_IsInit to see whether the backend still is initialized). */ AB_ProviderExtendMode_Save, /** This mode tells the backend to reload its configuration from the given * DB. */ AB_ProviderExtendMode_Reload } AB_PROVIDER_EXTEND_MODE; /** @name Prototypes For Virtual Functions * */ /*@{*/ /** * See @ref AB_Provider_Init. */ typedef int (*AB_PROVIDER_INIT_FN)(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); /** * See @ref AB_Provider_Fini. */ typedef int (*AB_PROVIDER_FINI_FN)(AB_PROVIDER *pro, GWEN_DB_NODE *dbData); /** * See @ref AB_Provider_UpdateJob */ typedef int (*AB_PROVIDER_UPDATEJOB_FN)(AB_PROVIDER *pro, AB_JOB *j); /** * See @ref AB_Provider_AddJob. */ typedef int (*AB_PROVIDER_ADDJOB_FN)(AB_PROVIDER *pro, AB_JOB *j); /** * See @ref AB_Provider_Execute */ typedef int (*AB_PROVIDER_EXECUTE_FN)(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); /** * See @ref AB_Provider_ResetQueue. */ typedef int (*AB_PROVIDER_RESETQUEUE_FN)(AB_PROVIDER *pro); /** * See @ref AB_Provider_ExtendUser. */ typedef int (*AB_PROVIDER_EXTEND_USER_FN)(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE um, GWEN_DB_NODE *db); /** * See @ref AB_Provider_ExtendAccount. */ typedef int (*AB_PROVIDER_EXTEND_ACCOUNT_FN)(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE um, GWEN_DB_NODE *db); typedef int (*AB_PROVIDER_UPDATE_FN)(AB_PROVIDER *pro, uint32_t lastVersion, uint32_t currentVersion); typedef GWEN_DIALOG* (*AB_PROVIDER_GET_NEWUSER_DIALOG_FN)(AB_PROVIDER *pro, int i); typedef GWEN_DIALOG* (*AB_PROVIDER_GET_EDITUSER_DIALOG_FN)(AB_PROVIDER *pro, AB_USER *u); typedef GWEN_DIALOG* (*AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN)(AB_PROVIDER *pro); typedef GWEN_DIALOG* (*AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN)(AB_PROVIDER *pro, AB_ACCOUNT *a); typedef GWEN_DIALOG* (*AB_PROVIDER_GET_USERTYPE_DIALOG_FN)(AB_PROVIDER *pro); /*@}*/ AQBANKING_API AB_PROVIDER *AB_Provider_new(AB_BANKING *ab, const char *name); /** * @return 0 if the backend is not initialized, !=0 if it is */ AQBANKING_API int AB_Provider_IsInit(const AB_PROVIDER *pro); AQBANKING_API void AB_Provider_AddFlags(AB_PROVIDER *pro, uint32_t fl); /** @name Virtual Functions * */ /*@{*/ /** * Allow the backend to initialize itself. * @param pro backend object */ AQBANKING_API int AB_Provider_Init(AB_PROVIDER *pro); /** * Allow the backend to deinitialize itself. * @param pro backend object */ AQBANKING_API int AB_Provider_Fini(AB_PROVIDER *pro); /** * This function should check for the availability of the given job and * prepare it for the next call to @ref AB_PROVIDER_ADDJOB_FN. * If the job is available with this backend it should also set the job * parameters (such as the maximum number of purpose lines for transfer jobs * etc). * This function is called from the constructor AB_Job_new() in AqBanking. * The value returned here is stored within the job in question and becomes * available via @ref AB_Job_CheckAvailability. * @param pro backend object * @param j job to update */ AQBANKING_API int AB_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j); /** *

* Add the given job to the backend's internal queue. This is an immediate * queue, it is not persistent. The queue is flushed by * @ref AB_PROVIDER_EXECUTE_FN. The added job is removed in any case * after @ref AB_PROVIDER_EXECUTE_FN has been called. *

*

* This function should first check the job arguments (sanity checks etc). * If this function returns an error the job MUST NOT be enqueued in the * providers own queue. In this case the job will be marked "errornous". *

*

* However, if the backend prepares the job well enough (via * @ref AB_PROVIDER_UPDATEJOB_FN) then the application should have made sure * that the job complies to the rules laid out by the backend. So rejecting * a job here should be a rare case with well-designed applications and * backends. *

* @param pro backend object */ AQBANKING_API int AB_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j); /** * Executes all jobs in the queue which have just been added via * @ref AB_PROVIDER_ADDJOB_FN. After calling this function @b all jobs are * removed from the backend's queue in any case. * @param pro backend object * @param ctx im-/exporter context to receive responses */ AQBANKING_API int AB_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx); /** * Resets the queue of the backend. * After calling this function @b all jobs are removed from the * backend's queue in any case. * @param pro backend object */ AQBANKING_API int AB_Provider_ResetQueue(AB_PROVIDER *pro); /** * Allows the backend to extend the given user (e.g. load backend-specific * data for the given user). */ AQBANKING_API int AB_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); /** * Allows the backend to extend the given account (e.g. load backend-specific * data for the given account). */ AQBANKING_API int AB_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db); /** * Allows the backend to update AqBanking data. * This function is called for each active provider after all backends, users * and accounts have been loaded and initialised but before loading the * outbox jobs. */ AQBANKING_API int AB_Provider_Update(AB_PROVIDER *pro, uint32_t lastVersion, uint32_t currentVersion); /** * Create a dialog which allows to create a new user. * The dialog returned (if any) must be derived via @ref AB_NewUserDialog_new(). * @param pro pointer to the backend for which a new user is to be created * @param i additional parameter depending on the backend. it can be used * to specify the user type to be created (e.g. for HBCI those values * specify whether PIN/TAN, keyfile or chipcard users are to be created). * Use value 0 for the generic dialog. */ AQBANKING_API GWEN_DIALOG *AB_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i); AQBANKING_API GWEN_DIALOG *AB_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u); /** * Create a dialog which allows to create a new account. * The dialog returned (if any) must be derived via @ref AB_NewAccountDialog_new(). */ AQBANKING_API GWEN_DIALOG *AB_Provider_GetNewAccountDialog(AB_PROVIDER *pro); AQBANKING_API GWEN_DIALOG *AB_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a); AQBANKING_API GWEN_DIALOG *AB_ProviderGetUserTypeDialog(AB_PROVIDER *pro); /*@}*/ /** @name Setters For Virtual Functions * */ /*@{*/ AQBANKING_API void AB_Provider_SetInitFn(AB_PROVIDER *pro, AB_PROVIDER_INIT_FN f); AQBANKING_API void AB_Provider_SetFiniFn(AB_PROVIDER *pro, AB_PROVIDER_FINI_FN f); AQBANKING_API void AB_Provider_SetUpdateJobFn(AB_PROVIDER *pro, AB_PROVIDER_UPDATEJOB_FN f); AQBANKING_API void AB_Provider_SetAddJobFn(AB_PROVIDER *pro, AB_PROVIDER_ADDJOB_FN f); AQBANKING_API void AB_Provider_SetExecuteFn(AB_PROVIDER *pro, AB_PROVIDER_EXECUTE_FN f); AQBANKING_API void AB_Provider_SetResetQueueFn(AB_PROVIDER *pro, AB_PROVIDER_RESETQUEUE_FN f); AQBANKING_API void AB_Provider_SetExtendUserFn(AB_PROVIDER *pro, AB_PROVIDER_EXTEND_USER_FN f); AQBANKING_API void AB_Provider_SetExtendAccountFn(AB_PROVIDER *pro, AB_PROVIDER_EXTEND_ACCOUNT_FN f); AQBANKING_API void AB_Provider_SetUpdateFn(AB_PROVIDER *pro, AB_PROVIDER_UPDATE_FN f); AQBANKING_API void AB_Provider_SetGetNewUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWUSER_DIALOG_FN f); AQBANKING_API void AB_Provider_SetGetEditUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITUSER_DIALOG_FN f); AQBANKING_API void AB_Provider_SetGetNewAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN f); AQBANKING_API void AB_Provider_SetGetEditAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN f); AQBANKING_API void AB_Provider_SetGetUserTypeDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_USERTYPE_DIALOG_FN f); /*@}*/ typedef AB_PROVIDER* (*AB_PLUGIN_PROVIDER_FACTORY_FN)(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API GWEN_PLUGIN *AB_Plugin_Provider_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); AQBANKING_API AB_PROVIDER *AB_Plugin_Provider_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API void AB_Plugin_Provider_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_PROVIDER_FACTORY_FN fn); /*@}*/ /* defgroup */ #ifdef __cplusplus } #endif #endif /* AQBANKING_PROVIDER_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/provider_l.h0000644000175000017500000000174312364015477017245 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_PROVIDER_L_H #define AQBANKING_PROVIDER_L_H #define AB_PROVIDER_FOLDER "providers" #define AB_PROVIDER_DEBUGGER_FOLDER "debugger" #include #include #include GWEN_LIST_FUNCTION_DEFS(AB_PROVIDER, AB_Provider) void AB_Provider_SetPlugin(AB_PROVIDER *pro, GWEN_PLUGIN *pl); void AB_Provider_free(AB_PROVIDER *pro); #endif /* AQBANKING_PROVIDER_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_account.c0000644000175000017500000002633012364015477020217 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /* This file is included by banking.c */ AB_ACCOUNT_LIST2 *AB_Banking_GetAccounts(const AB_BANKING *ab){ AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } al=AB_Account_List2_new(); a=AB_Account_List_First(ab->accounts); assert(a); while(a) { AB_Account_List2_PushBack(al, a); a=AB_Account_List_Next(a); } /* while */ return al; } AB_ACCOUNT *AB_Banking_GetAccount(const AB_BANKING *ab, uint32_t uniqueId){ AB_ACCOUNT *a; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } a=AB_Account_List_First(ab->accounts); assert(a); while(a) { if (AB_Account_GetUniqueId(a)==uniqueId) break; a=AB_Account_List_Next(a); } /* while */ return a; } AB_ACCOUNT *AB_Banking_FindAccount(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *accountId, const char *subAccountId) { AB_ACCOUNT *a; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } a=AB_Account_List_First(ab->accounts); assert(a); if (!backendName) backendName="*"; if (!country) country="*"; if (!bankId) bankId="*"; if (!accountId) accountId="*"; if (!subAccountId) subAccountId="*"; while(a) { const char *lbackendName; const char *lcountry; const char *lbankId; const char *laccountId; const char *lsubAccountId; lbackendName=AB_Account_GetBackendName(a); if (!lbackendName) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Account: %s/%s/%s: No backend\n", AB_Account_GetCountry(a), AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); abort(); } lcountry=AB_Account_GetCountry(a); lbankId=AB_Account_GetBankCode(a); laccountId=AB_Account_GetAccountNumber(a); lsubAccountId=AB_Account_GetSubAccountId(a); if (!lcountry) lcountry=""; if (!lbankId) lbankId=""; if (!laccountId) laccountId=""; if (!lsubAccountId) lsubAccountId=""; if ((-1!=GWEN_Text_ComparePattern(lbackendName, backendName, 0)) && (-1!=GWEN_Text_ComparePattern(lcountry, country, 0)) && (-1!=GWEN_Text_ComparePattern(lbankId, bankId, 0)) && (-1!=GWEN_Text_ComparePattern(laccountId, accountId, 0)) && (-1!=GWEN_Text_ComparePattern(lsubAccountId, subAccountId, 0))) break; a=AB_Account_List_Next(a); } /* while */ return a; } AB_ACCOUNT_LIST2 *AB_Banking_FindAccounts(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *accountId, const char *subAccountId) { AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } al=AB_Account_List2_new(); a=AB_Account_List_First(ab->accounts); assert(a); if (!backendName) backendName="*"; if (!country) country="*"; if (!bankId) bankId="*"; if (!accountId) accountId="*"; if (!subAccountId) subAccountId="*"; while(a) { const char *lbackendName; const char *lcountry; const char *lbankId; const char *laccountId; const char *lsubAccountId; lbackendName=AB_Account_GetBackendName(a); if (!lbackendName) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Account: %s/%s/%s: No backend\n", AB_Account_GetCountry(a), AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); abort(); } lcountry=AB_Account_GetCountry(a); lbankId=AB_Account_GetBankCode(a); laccountId=AB_Account_GetAccountNumber(a); lsubAccountId=AB_Account_GetSubAccountId(a); if (!lcountry) lcountry=""; if (!lbankId) lbankId=""; if (!laccountId) laccountId=""; if (!lsubAccountId) lsubAccountId=""; if ((-1!=GWEN_Text_ComparePattern(lbackendName, backendName, 0)) && (-1!=GWEN_Text_ComparePattern(lcountry, country, 0)) && (-1!=GWEN_Text_ComparePattern(lbankId, bankId, 0)) && (-1!=GWEN_Text_ComparePattern(laccountId, accountId, 0)) && (-1!=GWEN_Text_ComparePattern(lsubAccountId, subAccountId, 0))) AB_Account_List2_PushBack(al, a); a=AB_Account_List_Next(a); } /* while */ if (AB_Account_List2_GetSize(al)==0) { AB_Account_List2_free(al); return 0; } return al; } AB_ACCOUNT *AB_Banking_CreateAccount(AB_BANKING *ab, const char *backendName){ AB_ACCOUNT *a; AB_PROVIDER *pro; int rv; uint32_t uid; assert(ab); pro=AB_Banking_GetProvider(ab, backendName); if (!pro) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Backend \"%s\" not found", backendName); return 0; } uid=AB_Banking_GetUniqueId(ab); assert(uid); a=AB_Account_new(ab, pro); AB_Account_SetUniqueId(a, uid); rv=AB_Provider_ExtendAccount(pro, a, AB_ProviderExtendMode_Create, NULL); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error extending account (%d)", rv); AB_Account_free(a); return 0; } return a; } int AB_Banking_AddAccount(AB_BANKING *ab, AB_ACCOUNT *a) { int rv; char groupName[32]; GWEN_DB_NODE *db; GWEN_DB_NODE *dbP; assert(ab); assert(a); rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Add, NULL); if (rv) return rv; db=GWEN_DB_Group_new("account"); AB_Account_toDb(a, db); dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Save, dbP); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for account [%08x] (%d)", AB_Account_GetUniqueId(a), rv); GWEN_DB_Group_free(db); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config [%08x] (%d)", AB_Account_GetUniqueId(a), rv); GWEN_DB_Group_free(db); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, db); GWEN_DB_Group_free(db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save account config [%08x] (%d)", AB_Account_GetUniqueId(a), rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock account config [%08x] (%d)", AB_Account_GetUniqueId(a), rv); return rv; } AB_Account_SetDbId(a, groupName); AB_Account_List_Add(a, ab->accounts); return 0; } int AB_Banking_DeleteAccount(AB_BANKING *ab, AB_ACCOUNT *a) { int rv; const char *groupName; assert(ab); assert(a); rv=AB_Account_List_Del(a); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error on removing account from list (%d)", rv); return rv; } rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Remove, NULL); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error on remove extension of account (%d)", rv); return rv; } groupName=AB_Account_GetDbId(a); if (groupName) { rv=GWEN_ConfigMgr_DeleteGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to delete account config [%08x] (%d)", AB_Account_GetUniqueId(a), rv); return rv; } } AB_Account_free(a); return 0; } uint64_t AB_Banking__char2uint64(const char *accountId) { uint64_t res=0; const char *s; s=accountId; while(*s) { if (*s<'0' || *s>'9') return 0; res*=10; res+=(*s-'0'); s++; } return res; } AB_ACCOUNT *AB_Banking_GetAccountByCodeAndNumber(const AB_BANKING *ab, const char *bankCode, const char *accountId){ AB_ACCOUNT *a; const char *our_bankCode, *our_accountId; if (accountId==NULL) return NULL; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } a=AB_Account_List_First(ab->accounts); assert(a); while(a) { if (bankCode) { our_bankCode = AB_Account_GetBankCode(a); our_accountId = AB_Account_GetAccountNumber(a); if (our_bankCode && strcasecmp(our_bankCode, bankCode)==0 && our_accountId && strcasecmp(our_accountId, accountId)==0) break; } else { our_accountId = AB_Account_GetAccountNumber(a); if (our_accountId && strcasecmp(our_accountId, accountId)==0) break; } a=AB_Account_List_Next(a); } /* while */ if (!a) { uint64_t an; an=AB_Banking__char2uint64(accountId); if (an) { a=AB_Account_List_First(ab->accounts); assert(a); while(a) { uint64_t lan; lan=AB_Banking__char2uint64(AB_Account_GetAccountNumber(a)); if (lan) { if (bankCode) { our_bankCode = AB_Account_GetBankCode(a); if (our_bankCode && strcasecmp(our_bankCode, bankCode)==0 && an==lan) break; } else { if (an==lan) break; } } a=AB_Account_List_Next(a); } /* while */ } } return a; } AB_ACCOUNT *AB_Banking_GetAccountByIban(const AB_BANKING *ab, const char *iban){ AB_ACCOUNT *a; const char *our_iban; if (iban==NULL) return NULL; assert(ab); if (AB_Account_List_GetCount(ab->accounts)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No accounts"); return 0; } a=AB_Account_List_First(ab->accounts); assert(a); while(a) { if (iban) { our_iban=AB_Account_GetIBAN(a); if (our_iban && strcasecmp(our_iban, iban)==0) break; } a=AB_Account_List_Next(a); } /* while */ return a; } aqbanking-5.6.4beta/src/libs/aqbanking/job_be.h0000644000175000017500000000421112364015477016311 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file job_be.h * @short This file is used by provider backends. */ #ifndef AQBANKING_JOB_BE_H #define AQBANKING_JOB_BE_H #include /** @defgroup G_AB_BE_JOB Online Banking Tasks * @ingroup G_AB_BE_INTERFACE */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** @name Functions To Be Used by Backends * */ /*@{*/ /** * This id can be used by a AB_PROVIDER to map AB_Jobs to whatever the * provider uses. This id is not used by AB_Banking itself. */ AQBANKING_API uint32_t AB_Job_GetIdForProvider(const AB_JOB *j); AQBANKING_API void AB_Job_SetIdForProvider(AB_JOB *j, uint32_t i); /** * Store backend specific data with a job. This data is not specific * to an application, it will rather be used with every application (since * it doesn't depend on the application but on the backend). * @param j pointer to the AB_JOB object * @param pro pointer to the backend for which the data is to be returned */ AQBANKING_API GWEN_DB_NODE *AB_Job_GetProviderData(AB_JOB *j, AB_PROVIDER *pro); AQBANKING_API void AB_Job_SetResultText(AB_JOB *j, const char *s); AQBANKING_API void AB_Job_SetUsedTan(AB_JOB *j, const char *s); /** * This function should only be used when copying logs from a backend-private * job object (e.g. AqHBCI internally uses its own job types) to an * AqBanking job. * @param j job to operate on * @param txt the text to log (it is expected to have the same format as * logs created via @ref AB_Job_Log). */ AQBANKING_API void AB_Job_LogRaw(AB_JOB *j, const char *txt); /*@}*/ #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AQBANKING_JOB_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/account.c0000644000175000017500000004421112364015477016524 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "account_p.h" #include "banking_l.h" #include "provider_l.h" #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AB_ACCOUNT) GWEN_LIST_FUNCTIONS(AB_ACCOUNT, AB_Account) GWEN_LIST2_FUNCTIONS(AB_ACCOUNT, AB_Account) AB_ACCOUNT *AB_Account_new(AB_BANKING *ab, AB_PROVIDER *pro){ AB_ACCOUNT *a; assert(ab); assert(pro); GWEN_NEW_OBJECT(AB_ACCOUNT, a); a->usage=1; GWEN_INHERIT_INIT(AB_ACCOUNT, a); GWEN_LIST_INIT(AB_ACCOUNT, a); a->banking=ab; a->provider=pro; a->backendName=strdup(AB_Provider_GetName(pro)); a->userIds=GWEN_StringList_new(); a->selectedUserIds=GWEN_StringList_new(); return a; } AB_ACCOUNT *AB_Account_fromDb(AB_BANKING *ab, GWEN_DB_NODE *db){ AB_ACCOUNT *a; const char *pname; AB_PROVIDER *pro; int rv; assert(ab); pname=GWEN_DB_GetCharValue(db, "provider", 0, NULL); if (!(pname && *pname)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Account group does not contain a provider name, ignoring account"); return NULL; } pro=AB_Banking_GetProvider(ab, pname); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Provider \"%s\" is not available, ignoring account", pname); return NULL; } GWEN_NEW_OBJECT(AB_ACCOUNT, a); a->usage=1; GWEN_INHERIT_INIT(AB_ACCOUNT, a); GWEN_LIST_INIT(AB_ACCOUNT, a); a->banking=ab; a->provider=pro; a->backendName=strdup(pname); a->userIds=GWEN_StringList_new(); a->selectedUserIds=GWEN_StringList_new(); rv=AB_Account_ReadDb(a, db); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Account_free(a); return NULL; } return a; } int AB_Account_ReadDb(AB_ACCOUNT *a, GWEN_DB_NODE *db){ GWEN_DB_NODE *dbT; const char *s; int i; assert(a); assert(db); a->accountType=GWEN_DB_GetIntValue(db, "accountType", 0, 1); a->uniqueId=GWEN_DB_GetIntValue(db, "uniqueId", 0, 1); free(a->accountNumber); s=GWEN_DB_GetCharValue(db, "accountNumber", 0, NULL); if (s) a->accountNumber=strdup(s); else a->accountNumber=NULL; free(a->subAccountId); s=GWEN_DB_GetCharValue(db, "subAccountId", 0, NULL); if (s) a->subAccountId=strdup(s); else a->subAccountId=NULL; free(a->bankCode); s=GWEN_DB_GetCharValue(db, "bankCode", 0, NULL); if (s) a->bankCode=strdup(s); else a->bankCode=NULL; free(a->accountName); s=GWEN_DB_GetCharValue(db, "accountName", 0, NULL); if (s) a->accountName=strdup(s); else a->accountName=NULL; free(a->bankName); s=GWEN_DB_GetCharValue(db, "bankName", 0, NULL); if (s) a->bankName=strdup(s); else a->bankName=NULL; free(a->iban); s=GWEN_DB_GetCharValue(db, "iban", 0, NULL); if (s) a->iban=strdup(s); else a->iban=NULL; free(a->bic); s=GWEN_DB_GetCharValue(db, "bic", 0, NULL); if (s) a->bic=strdup(s); else a->bic=NULL; free(a->ownerName); s=GWEN_DB_GetCharValue(db, "ownerName", 0, NULL); if (s) a->ownerName=strdup(s); else a->ownerName=NULL; free(a->currency); s=GWEN_DB_GetCharValue(db, "currency", 0, "EUR"); if (s) a->currency=strdup(s); else a->currency=NULL; free(a->country); s=GWEN_DB_GetCharValue(db, "country", 0, "de"); if (s) a->country=strdup(s); else a->country=NULL; GWEN_StringList_Clear(a->userIds); for (i=0; i<100; i++) { uint32_t id; char numbuf[16]; id=GWEN_DB_GetIntValue(db, "user", i, 0); if (id==0) break; snprintf(numbuf, sizeof(numbuf)-1, "%u", id); GWEN_StringList_AppendString(a->userIds, numbuf, 0, 1); } GWEN_StringList_Clear(a->selectedUserIds); for (i=0; i<100; i++) { uint32_t id; char numbuf[16]; id=GWEN_DB_GetIntValue(db, "selectedUser", i, 0); if (id==0) break; snprintf(numbuf, sizeof(numbuf)-1, "%u", id); GWEN_StringList_AppendString(a->selectedUserIds, numbuf, 0, 1); } /* fix problem where there is no userId in the list */ if (GWEN_StringList_Count(a->userIds)selectedUserIds)) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(a->selectedUserIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { GWEN_StringList_AppendString(a->userIds, s, 0, 1); } se=GWEN_StringListEntry_Next(se); } } /* TODO: START: remove this */ GWEN_DB_Group_free(a->appData); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "apps"); if (dbT) a->appData=GWEN_DB_Group_dup(dbT); else a->appData=GWEN_DB_Group_new("apps"); GWEN_DB_Group_free(a->providerData); dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "provider"); if (dbT) a->providerData=GWEN_DB_Group_dup(dbT); else a->providerData=GWEN_DB_Group_new("provider"); /* TODO: END: remove this */ return 0; } const char *AB_Account_GetBackendName(const AB_ACCOUNT *a) { assert(a); assert(a->usage); return a->backendName; } AB_USER_LIST2 *AB_Account_GetUsers(const AB_ACCOUNT *a) { AB_USER_LIST2 *ul; GWEN_STRINGLISTENTRY *se; assert(a); assert(a->usage); ul=AB_User_List2_new(); se=GWEN_StringList_FirstEntry(a->userIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) { AB_USER *u; u=AB_Banking_GetUser(a->banking, id); if (u) { AB_User_List2_PushBack(ul, u); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "User with id \"%08x\" not found", id); } } } se=GWEN_StringListEntry_Next(se); } if (AB_User_List2_GetSize(ul)==0) { AB_User_List2_free(ul); return NULL; } return ul; } AB_USER *AB_Account_GetFirstUser(const AB_ACCOUNT *a) { GWEN_STRINGLISTENTRY *se; assert(a); assert(a->usage); se=GWEN_StringList_FirstEntry(a->userIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) { AB_USER *u; u=AB_Banking_GetUser(a->banking, id); if (u) { return u; } else { DBG_WARN(AQBANKING_LOGDOMAIN, "User with id \"%08x\" not found", id); } } } se=GWEN_StringListEntry_Next(se); } return NULL; } void AB_Account_SetUsers(AB_ACCOUNT *a, const AB_USER_LIST2 *ul) { assert(a); assert(a->usage); GWEN_StringList_Clear(a->userIds); if (ul) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; u=AB_User_List2Iterator_Data(it); while(u) { char numbuf[16]; snprintf(numbuf, sizeof(numbuf)-1, "%u", AB_User_GetUniqueId(u)); GWEN_StringList_AppendString(a->userIds, numbuf, 0, 1); u=AB_User_List2Iterator_Next(it); } AB_User_List2Iterator_free(it); } } } void AB_Account_SetUser(AB_ACCOUNT *a, const AB_USER *u) { assert(a); assert(a->usage); GWEN_StringList_Clear(a->userIds); if (u) { char numbuf[16]; snprintf(numbuf, sizeof(numbuf)-1, "%u", AB_User_GetUniqueId(u)); GWEN_StringList_AppendString(a->userIds, numbuf, 0, 1); } } AB_USER_LIST2 *AB_Account_GetSelectedUsers(const AB_ACCOUNT *a) { AB_USER_LIST2 *ul; GWEN_STRINGLISTENTRY *se; assert(a); assert(a->usage); ul=AB_User_List2_new(); se=GWEN_StringList_FirstEntry(a->selectedUserIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) { AB_USER *u; u=AB_Banking_GetUser(a->banking, id); if (u) { AB_User_List2_PushBack(ul, u); } else { DBG_WARN(AQBANKING_LOGDOMAIN, "User with id \"%08x\" not found", id); } } } se=GWEN_StringListEntry_Next(se); } if (AB_User_List2_GetSize(ul)==0) { AB_User_List2_free(ul); return NULL; } return ul; } AB_USER *AB_Account_GetFirstSelectedUser(const AB_ACCOUNT *a) { GWEN_STRINGLISTENTRY *se; assert(a); assert(a->usage); se=GWEN_StringList_FirstEntry(a->selectedUserIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) { AB_USER *u; u=AB_Banking_GetUser(a->banking, id); if (u) { return u; } else { DBG_WARN(AQBANKING_LOGDOMAIN, "User with id \"%08x\" not found", id); } } } se=GWEN_StringListEntry_Next(se); } return NULL; } void AB_Account_SetSelectedUsers(AB_ACCOUNT *a, const AB_USER_LIST2 *ul) { assert(a); assert(a->usage); GWEN_StringList_Clear(a->selectedUserIds); if (ul) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; u=AB_User_List2Iterator_Data(it); while(u) { char numbuf[16]; snprintf(numbuf, sizeof(numbuf)-1, "%u", AB_User_GetUniqueId(u)); numbuf[sizeof(numbuf)-1]=0; GWEN_StringList_AppendString(a->selectedUserIds, numbuf, 0, 1); GWEN_StringList_AppendString(a->userIds, numbuf, 0, 1); /* also add to userIds, if not already done */ u=AB_User_List2Iterator_Next(it); } AB_User_List2Iterator_free(it); } } } void AB_Account_SetSelectedUser(AB_ACCOUNT *a, const AB_USER *u) { assert(a); assert(a->usage); GWEN_StringList_Clear(a->selectedUserIds); if (u) { char numbuf[16]; snprintf(numbuf, sizeof(numbuf)-1, "%u", AB_User_GetUniqueId(u)); GWEN_StringList_AppendString(a->selectedUserIds, numbuf, 0, 1); GWEN_StringList_AppendString(a->userIds, numbuf, 0, 1); /* also add to userIds, if not already done */ } } int AB_Account_toDb(const AB_ACCOUNT *a, GWEN_DB_NODE *db){ GWEN_STRINGLISTENTRY *se; GWEN_DB_NODE *dbT; assert(a); assert(a->usage); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "provider", a->backendName); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", a->uniqueId); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountType", a->accountType); if (a->accountNumber) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountNumber", a->accountNumber); if (a->subAccountId) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "subAccountId", a->subAccountId); if (a->bankCode) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankCode", a->bankCode); if (a->accountName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountName", a->accountName); if (a->bankName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankName", a->bankName); if (a->iban) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "iban", a->iban); if (a->bic) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bic", a->bic); if (a->ownerName) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "ownerName", a->ownerName); if (a->currency) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", a->currency); if (a->country) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "country", a->country); GWEN_DB_DeleteVar(db, "user"); se=GWEN_StringList_FirstEntry(a->userIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "user", id); } se=GWEN_StringListEntry_Next(se); } GWEN_DB_DeleteVar(db, "selectedUser"); se=GWEN_StringList_FirstEntry(a->selectedUserIds); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s) { unsigned int id; if (1==sscanf(s, "%u", &id)) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_DEFAULT, "selectedUser", id); } se=GWEN_StringListEntry_Next(se); } if (a->appData) { dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "apps"); assert(dbT); GWEN_DB_AddGroupChildren(dbT, a->appData); } if (a->providerData) { dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "provider"); assert(dbT); GWEN_DB_AddGroupChildren(dbT, a->providerData); } return 0; } void AB_Account_free(AB_ACCOUNT *a){ if (a) { assert(a->usage); if (a->usage==1) { DBG_VERBOUS(AQBANKING_LOGDOMAIN, "Destroying AB_ACCOUNT"); GWEN_LIST_FINI(AB_ACCOUNT, a); GWEN_INHERIT_FINI(AB_ACCOUNT, a); free(a->backendName); free(a->subAccountId); free(a->accountNumber); free(a->bankCode); free(a->accountName); free(a->bankName); free(a->iban); free(a->bic); free(a->ownerName); free(a->currency); free(a->country); free(a->dbId); GWEN_StringList_free(a->userIds); GWEN_StringList_free(a->selectedUserIds); GWEN_DB_Group_free(a->appData); GWEN_DB_Group_free(a->providerData); a->usage=0; GWEN_FREE_OBJECT(a); } else a->usage--; } } void AB_Account_Attach(AB_ACCOUNT *a){ assert(a); a->usage++; } uint32_t AB_Account_GetUniqueId(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->uniqueId; } void AB_Account_SetUniqueId(AB_ACCOUNT *a, uint32_t id){ assert(a); assert(a->usage); a->uniqueId=id; } AB_ACCOUNT_TYPE AB_Account_GetAccountType(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->accountType; } void AB_Account_SetAccountType(AB_ACCOUNT *a, AB_ACCOUNT_TYPE t){ assert(a); assert(a->usage); a->accountType=t; } AB_PROVIDER *AB_Account_GetProvider(const AB_ACCOUNT *a) { assert(a); assert(a->usage); return a->provider; } const char *AB_Account_GetAccountNumber(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->accountNumber; } void AB_Account_SetAccountNumber(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->accountNumber); if (s) a->accountNumber=strdup(s); else a->accountNumber=NULL; } const char *AB_Account_GetSubAccountId(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->subAccountId; } void AB_Account_SetSubAccountId(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->subAccountId); if (s) a->subAccountId=strdup(s); else a->subAccountId=NULL; } const char *AB_Account_GetBankCode(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->bankCode; } void AB_Account_SetBankCode(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->bankCode); if (s) a->bankCode=strdup(s); else a->bankCode=NULL; } const char *AB_Account_GetAccountName(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->accountName; } void AB_Account_SetAccountName(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->accountName); if (s) a->accountName=strdup(s); else a->accountName=NULL; } const char *AB_Account_GetBankName(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->bankName; } void AB_Account_SetBankName(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->bankName); if (s) a->bankName=strdup(s); else a->bankName=NULL; } const char *AB_Account_GetIBAN(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->iban; } void AB_Account_SetIBAN(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->iban); if (s) a->iban=strdup(s); else a->iban=NULL; } const char *AB_Account_GetBIC(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->bic; } void AB_Account_SetBIC(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->bic); if (s) a->bic=strdup(s); else a->bic=NULL; } const char *AB_Account_GetOwnerName(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->ownerName; } void AB_Account_SetOwnerName(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); free(a->ownerName); if (s) a->ownerName=strdup(s); else a->ownerName=NULL; } AB_BANKING *AB_Account_GetBanking(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->banking; } const char *AB_Account_GetCurrency(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->currency; } void AB_Account_SetCurrency(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); assert(s); free(a->currency); if (s) a->currency=strdup(s); else a->currency=NULL; } const char *AB_Account_GetCountry(const AB_ACCOUNT *a){ assert(a); assert(a->usage); return a->country; } void AB_Account_SetCountry(AB_ACCOUNT *a, const char *s){ assert(a); assert(a->usage); assert(s); free(a->country); if (s) a->country=strdup(s); else a->country=NULL; } void AB_Account_SetProvider(AB_ACCOUNT *a, AB_PROVIDER *pro){ assert(a); assert(a->usage); assert(pro); a->provider=pro; free(a->backendName); a->backendName=strdup(AB_Provider_GetName(pro)); } const char *AB_Account_GetDbId(const AB_ACCOUNT *a) { assert(a); assert(a->usage); return a->dbId; } void AB_Account_SetDbId(AB_ACCOUNT *a, const char *s) { assert(a); assert(a->usage); free(a->dbId); if (s) a->dbId=strdup(s); else a->dbId=NULL; } AB_ACCOUNT *AB_Account__freeAll_cb(AB_ACCOUNT *a, void *userData) { AB_Account_free(a); return 0; } void AB_Account_List2_FreeAll(AB_ACCOUNT_LIST2 *al){ AB_Account_List2_ForEach(al, AB_Account__freeAll_cb, 0); AB_Account_List2_free(al); } AB_ACCOUNT *AB_Account_List2_GetAccountByUniqueId(const AB_ACCOUNT_LIST2 *al, uint32_t aid) { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { if (aid==AB_Account_GetUniqueId(a)) { AB_Account_List2Iterator_free(ait); return a; } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } return NULL; } aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/0000755000175000017500000000000012643540652017063 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/0000755000175000017500000000000012643540652017305 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/ab_job_list.tm20000644000175000017500000000031112364015477022115 00000000000000 AB_JOB_LIST AB_Job_List aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/ab_job_list2.tm20000644000175000017500000000031412364015477022202 00000000000000 AB_JOB_LIST2 AB_Job_List2 aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/ab_user.tm20000644000175000017500000000025512364015477021275 00000000000000 AB_USER AB_User aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/Makefile.in0000644000175000017500000005023612643540055021275 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/typemaker2/c DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_typedata_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(typedatadir)" DATA = $(dist_typedata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ typedatadir = $(aqbanking_pkgdatadir)/aqbanking/typemaker2/c dist_typedata_DATA = \ ab_account.tm2 \ ab_job.tm2 \ ab_job_list.tm2 \ ab_job_list2.tm2 \ ab_user.tm2 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/typemaker2/c/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/typemaker2/c/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_typedataDATA: $(dist_typedata_DATA) @$(NORMAL_INSTALL) @list='$(dist_typedata_DATA)'; test -n "$(typedatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(typedatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(typedatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typedatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(typedatadir)" || exit $$?; \ done uninstall-dist_typedataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_typedata_DATA)'; test -n "$(typedatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(typedatadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(typedatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_typedataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_typedataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_typedataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_typedataDATA sources: # 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: aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/Makefile.am0000644000175000017500000000026712364015477021270 00000000000000 typedatadir=$(aqbanking_pkgdatadir)/aqbanking/typemaker2/c dist_typedata_DATA=\ ab_account.tm2 \ ab_job.tm2 \ ab_job_list.tm2 \ ab_job_list2.tm2 \ ab_user.tm2 sources: aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/ab_account.tm20000644000175000017500000000026512364015477021754 00000000000000 AB_ACCOUNT AB_Account aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/c/ab_job.tm20000644000175000017500000000025112364015477021065 00000000000000 AB_JOB AB_Job aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/Makefile.in0000644000175000017500000005770312643540055021061 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/typemaker2 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = c all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/typemaker2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/typemaker2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: # 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: aqbanking-5.6.4beta/src/libs/aqbanking/typemaker2/Makefile.am0000644000175000017500000000002412364015477021035 00000000000000SUBDIRS=c sources: aqbanking-5.6.4beta/src/libs/aqbanking/bankinfoplugin_p.h0000644000175000017500000000245312364015477020424 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKINFOPLUGIN_P_H #define AQBANKING_BANKINFOPLUGIN_P_H #include "bankinfoplugin_l.h" #include #include struct AB_BANKINFO_PLUGIN { GWEN_INHERIT_ELEMENT(AB_BANKINFO_PLUGIN); GWEN_LIST_ELEMENT(AB_BANKINFO_PLUGIN); uint32_t usage; char *country; GWEN_PLUGIN *plugin; AB_BANKINFOPLUGIN_GETBANKINFO_FN getBankInfoFn; AB_BANKINFOPLUGIN_CHECKACCOUNT_FN checkAccountFn; AB_BANKINFOPLUGIN_GETBANKINFOBYTMPLATE_FN getBankInfoByTemplateFn; }; typedef struct AB_PLUGIN_BANKINFO AB_PLUGIN_BANKINFO; struct AB_PLUGIN_BANKINFO { AB_PLUGIN_BANKINFO_FACTORY_FN pluginFactoryFn; }; static void GWENHYWFAR_CB AB_Plugin_BankInfo_FreeData(void *bp, void *p); #endif /* AQBANKING_BANKINFOPLUGIN_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/msgengine.c0000644000175000017500000006432512364015477017054 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "msgengine_p.h" #include #include #include #include #include #include #include GWEN_INHERIT(GWEN_MSGENGINE, AB_MSGENGINE) GWEN_MSGENGINE *AB_MsgEngine_new(void){ GWEN_MSGENGINE *e; AB_MSGENGINE *le; e=GWEN_MsgEngine_new(); GWEN_NEW_OBJECT(AB_MSGENGINE, le); GWEN_INHERIT_SETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e, le, AB_MsgEngine_FreeData); GWEN_MsgEngine_SetTypeReadFunction(e, AB_MsgEngine_TypeRead); GWEN_MsgEngine_SetTypeWriteFunction(e, AB_MsgEngine_TypeWrite); GWEN_MsgEngine_SetTypeCheckFunction(e, AB_MsgEngine_TypeCheck); GWEN_MsgEngine_SetBinTypeReadFunction(e, AB_MsgEngine_BinTypeRead); GWEN_MsgEngine_SetBinTypeWriteFunction(e, AB_MsgEngine_BinTypeWrite); GWEN_MsgEngine_SetGetCharValueFunction(e, AB_MsgEngine_GetCharValue); GWEN_MsgEngine_SetGetIntValueFunction(e, AB_MsgEngine_GetIntValue); GWEN_MsgEngine_SetEscapeChar(e, '?'); GWEN_MsgEngine_SetDelimiters(e, ""); return e; } void GWENHYWFAR_CB AB_MsgEngine_FreeData(void *bp, void *p){ //GWEN_MSGENGINE *e; AB_MSGENGINE *le; //e=(GWEN_MSGENGINE*)bp; le=(AB_MSGENGINE*)p; /* free all objects inside AB_MsgEngine */ GWEN_FREE_OBJECT(le); } uint32_t AB_MsgEngine__FromBCD(uint32_t value) { uint32_t rv; rv=0; rv+=((value>>28)&0xf)*10000000; rv+=((value>>24)&0xf)*1000000; rv+=((value>>20)&0xf)*100000; rv+=((value>>16)&0xf)*10000; rv+=((value>>12)&0xf)*1000; rv+=((value>>8)&0xf)*100; rv+=((value>>4)&0xf)*10; rv+=((value)&0xf); return rv; } uint32_t AB_MsgEngine__ToBCD(uint32_t value) { uint32_t rv; rv=0; rv+=value/10000000; value%=10000000; rv<<=4; rv+=value/1000000; value%=1000000; rv<<=4; rv+=value/100000; value%=100000; rv<<=4; rv+=value/10000; value%=10000; rv<<=4; rv+=value/1000; value%=1000; rv<<=4; rv+=value/100; value%=100; rv<<=4; rv+=value/10; value%=10; rv<<=4; rv+=value; return rv; } int AB_MsgEngine_TypeRead(GWEN_MSGENGINE *e, GWEN_BUFFER *msgbuf, GWEN_XMLNODE *node, GWEN_BUFFER *vbuf, char escapeChar, const char *delimiters){ AB_MSGENGINE *le; const char *type; assert(e); le=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e); assert(le); if (!GWEN_Buffer_GetBytesLeft(msgbuf)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Buffer empty"); return 0; } type=GWEN_XMLNode_GetProperty(node, "type",""); if (strcasecmp(type, "byte")==0) { int isBCD; int c; char numbuf[32]; unsigned int value; isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value=c&0xff; if (isBCD) value=AB_MsgEngine__FromBCD(value); snprintf(numbuf, sizeof(numbuf), "%d", (unsigned int)value); if (GWEN_Buffer_AppendString(vbuf, numbuf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else if (strcasecmp(type, "word")==0) { int bigEndian; int isBCD; unsigned int value; int c; char numbuf[32]; bigEndian=atoi(GWEN_XMLNode_GetProperty(node, "bigEndian", "1")); isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); value=0; if (bigEndian) { c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value=(((unsigned char)(c&0xff)<<8)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)((c&0xff)); } /* if bigEndian */ else { c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value=(unsigned char)((c&0xff)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)(((c&0xff)<<8)); } if (isBCD) value=AB_MsgEngine__FromBCD(value); snprintf(numbuf, sizeof(numbuf), "%d", (unsigned int)value); if (GWEN_Buffer_AppendString(vbuf, numbuf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } /* if word */ else if (strcasecmp(type, "dword")==0) { int bigEndian; int isBCD; uint32_t value; int c; char numbuf[32]; bigEndian=atoi(GWEN_XMLNode_GetProperty(node, "bigEndian", "1")); isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); value=0; if (bigEndian) { c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value=(((unsigned char)(c&0xff)<<24)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(((unsigned char)(c&0xff)<<16)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(((unsigned char)(c&0xff)<<8)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)((c&0xff)); } /* if bigEndian */ else { c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value=(unsigned char)((c&0xff)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)(((c&0xff)<<8)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)(((c&0xff)<<16)); c=GWEN_Buffer_ReadByte(msgbuf); if (c==-1) return -1; value|=(unsigned char)(((c&0xff)<<24)); } if (isBCD) value=AB_MsgEngine__FromBCD(value); snprintf(numbuf, sizeof(numbuf), "%d", (unsigned int)value); if (GWEN_Buffer_AppendString(vbuf, numbuf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } /* if word */ else if (strcasecmp(type, "bytes")==0) { int size; if (1!=sscanf(GWEN_XMLNode_GetProperty(node, "size", "-1"), "%i", &size)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of bytes"); return -1; } if (size==-1) { size=GWEN_Buffer_GetBytesLeft(msgbuf); if (size==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No bytes found"); return 0; } } else { if (size>GWEN_Buffer_GetBytesLeft(msgbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes in message (%d>%d)", size, GWEN_Buffer_GetBytesLeft(msgbuf)); return -1; } } if (GWEN_Buffer_AppendBytes(vbuf, GWEN_Buffer_GetPosPointer(msgbuf), size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } if (GWEN_Buffer_IncrementPos(msgbuf, size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else if (strcasecmp(type, "bcd")==0) { int size; int skipLeadingZeroes; skipLeadingZeroes=atoi(GWEN_XMLNode_GetProperty(node, "skipZeroes", "0")); if (1!=sscanf(GWEN_XMLNode_GetProperty(node, "size", "-1"), "%i", &size)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of bytes"); return -1; } if (size==-1) { size=GWEN_Buffer_GetBytesLeft(msgbuf); if (size==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No bytes found"); return 0; } } else { if (size>GWEN_Buffer_GetBytesLeft(msgbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes in message (%d>%d)", size, GWEN_Buffer_GetBytesLeft(msgbuf)); return -1; } } if (GWEN_Text_ToBcdBuffer(GWEN_Buffer_GetPosPointer(msgbuf), size, vbuf, 0, 0, skipLeadingZeroes)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error parsing BCD string"); return -1; } if (GWEN_Buffer_IncrementPos(msgbuf, size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else if (strcasecmp(type, "ascii")==0) { int size; int condense; int kvk; //uint32_t vpos=0; kvk=atoi(GWEN_XMLNode_GetProperty(node, "kvk", "0")); condense=atoi(GWEN_XMLNode_GetProperty(node, "condense", "1")); if (1!=sscanf(GWEN_XMLNode_GetProperty(node, "size", "-1"), "%i", &size)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of bytes"); return -1; } if (size==-1) { /* if no fixed size given let GWEN handle this */ return 1; } else { if (size>GWEN_Buffer_GetBytesLeft(msgbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes in message (%d>%d)", size, GWEN_Buffer_GetBytesLeft(msgbuf)); return -1; } } if (kvk) { // vpos=GWEN_Buffer_GetPos(vbuf); } if (condense) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, size, 0, 1); GWEN_Buffer_AppendBytes(tbuf, GWEN_Buffer_GetPosPointer(msgbuf), size); GWEN_Text_CondenseBuffer(tbuf); GWEN_Buffer_Rewind(tbuf); if (GWEN_Buffer_GetUsedBytes(tbuf)==0) { /* just to fool the caller */ GWEN_Buffer_AppendByte(tbuf, 0); } if (GWEN_Buffer_AppendBuffer(vbuf, tbuf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); GWEN_Buffer_free(tbuf); return -1; } GWEN_Buffer_free(tbuf); } else { if (GWEN_Buffer_AppendBytes(vbuf, GWEN_Buffer_GetPosPointer(msgbuf), size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } } if (GWEN_Buffer_IncrementPos(msgbuf, size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else if (strcasecmp(type, "tlv")==0) { int isBerTlv; const char *p; unsigned int size; unsigned int pos; unsigned int j; p=GWEN_Buffer_GetPosPointer(msgbuf); pos=0; size=GWEN_Buffer_GetBytesLeft(msgbuf); isBerTlv=(strcasecmp(GWEN_XMLNode_GetProperty(node, "tlvtype", "bertlv"), "BER")==0); /* get tag type */ if (size<2) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes for BER-TLV"); return -1; } j=(unsigned char)(p[pos]); if (isBerTlv) { if ((j & 0x1f)==0x1f) { pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); } else j&=0x1f; } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag type %02x%s", j, isBerTlv?" (BER-TLV)":""); /* get length */ pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); if (isBerTlv) { if (j & 0x80) { if (j==0x81) { pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); } /* 0x81 */ else if (j==0x82) { if (pos+1>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } pos++; j=((unsigned char)(p[pos]))<<8; pos++; j+=(unsigned char)(p[pos]); } /* 0x82 */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unexpected tag length modifier %02x", j); return -1; } } /* if tag length modifier */ } else { if (j==255) { if (pos+2>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } pos++; j=((unsigned char)(p[pos]))<<8; pos++; j+=(unsigned char)(p[pos]); } } pos++; pos+=j; if (pos>size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag data length is %d (total %d)", j, pos); if (GWEN_Buffer_AppendBytes(vbuf, GWEN_Buffer_GetPosPointer(msgbuf), pos)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } if (GWEN_Buffer_IncrementPos(msgbuf, pos)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Type \"%s\" not supported by AB_MsgEngine", type); return 1; } } int AB_MsgEngine_TypeWrite(GWEN_MSGENGINE *e, GWEN_BUFFER *gbuf, GWEN_BUFFER *data, GWEN_XMLNODE *node){ AB_MSGENGINE *le; const char *type; assert(e); le=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e); assert(le); type=GWEN_XMLNode_GetProperty(node, "type",""); if (strcasecmp(type, "byte")==0) { int value; int isBCD; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Supporting type \"byte\""); isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); if (1!=sscanf(GWEN_Buffer_GetPosPointer(data), "%i", &value)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number"); return -1; } if (value>255 || value<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Number out of range (%d)", value); return -1; } if (isBCD) value=AB_MsgEngine__ToBCD(value); if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)value)) { DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } return 0; } /* byte */ else if (strcasecmp(type, "word")==0) { int bigEndian; int value; int isBCD; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Supporting type \"word\""); isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); if (1!=sscanf(GWEN_Buffer_GetPosPointer(data), "%i", &value)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number"); return -1; } if (value>0xffff || value<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Number out of range (%d)", value); return -1; } if (isBCD) value=AB_MsgEngine__ToBCD(value); bigEndian=atoi(GWEN_XMLNode_GetProperty(node, "bigEndian", "1")); if (bigEndian) { if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>8)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)(value&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } } else { if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)(value&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>8)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } } return 0; } /* word */ else if (strcasecmp(type, "dword")==0) { int bigEndian; int isBCD; uint32_t value; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Supporting type \"dword\""); isBCD=atoi(GWEN_XMLNode_GetProperty(node, "bcd", "0")); if (1!=sscanf(GWEN_Buffer_GetPosPointer(data), "%i", &value)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number"); return -1; } if (isBCD) value=AB_MsgEngine__ToBCD(value); bigEndian=atoi(GWEN_XMLNode_GetProperty(node, "bigEndian", "1")); if (bigEndian) { if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>24)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>16)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>8)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)(value&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } } else { if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)(value&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>8)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>16)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } if (GWEN_Buffer_AppendByte(gbuf, (unsigned char)((value>>24)&0xff))){ DBG_INFO(AQBANKING_LOGDOMAIN, "called from here"); return -1; } } return 0; } /* word */ else if (strcasecmp(type, "bytes")==0) { if (GWEN_Buffer_GetUsedBytes(data)) { if (GWEN_Buffer_AppendBytes(gbuf, GWEN_Buffer_GetStart(data), GWEN_Buffer_GetUsedBytes(data))) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } } return 0; } else if (strcasecmp(type, "bcd")==0) { if (GWEN_Text_FromBcdBuffer(GWEN_Buffer_GetStart(data), gbuf)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else if (strcasecmp(type, "tlv")==0) { int size; size=GWEN_Buffer_GetUsedBytes(data); if (size) { if (GWEN_Buffer_AppendBytes(gbuf, GWEN_Buffer_GetStart(data), size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } if (GWEN_Buffer_IncrementPos(data, size)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } } return 0; } else if (strcasecmp(type, "ascii")==0) { int size; if (1!=sscanf(GWEN_XMLNode_GetProperty(node, "size", "-1"), "%i", &size)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad number of bytes"); return -1; } if (size==-1) { size=GWEN_Buffer_GetUsedBytes(data); } else { if (size>GWEN_Buffer_GetUsedBytes(data)) { int lfiller; const char *lfs; /* check for left-filler, fill left if needed */ lfs=GWEN_XMLNode_GetProperty(node, "lfiller", 0); if (lfs) { if (1!=sscanf(lfs, "%i", &lfiller)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad value for property lfiller"); return -1; } GWEN_Buffer_FillWithBytes(gbuf, (unsigned char)lfiller, size-GWEN_Buffer_GetUsedBytes(data)); } } } if (GWEN_Buffer_AppendBytes(gbuf, GWEN_Buffer_GetStart(data), GWEN_Buffer_GetUsedBytes(data))) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } return 0; } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Type \"%s\" not supported by AB_MsgEngine", type); return 1; } } GWEN_DB_NODE_TYPE AB_MsgEngine_TypeCheck(GWEN_MSGENGINE *e, const char *tname){ AB_MSGENGINE *le; assert(e); le=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e); assert(le); if (strcasecmp(tname, "byte")==0 || strcasecmp(tname, "word")==0 || strcasecmp(tname, "dword")==0) return GWEN_DB_NodeType_ValueInt; else if (strcasecmp(tname, "bytes")==0 || strcasecmp(tname, "tlv")==0) return GWEN_DB_NodeType_ValueBin; else if (strcasecmp(tname, "bcd")==0) return GWEN_DB_NodeType_ValueChar; else return GWEN_DB_NodeType_Unknown; } const char *AB_MsgEngine_GetCharValue(GWEN_MSGENGINE *e, const char *name, const char *defValue){ AB_MSGENGINE *le; assert(e); le=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e); assert(le); return defValue; } int AB_MsgEngine_GetIntValue(GWEN_MSGENGINE *e, const char *name, int defValue){ AB_MSGENGINE *le; assert(e); le=GWEN_INHERIT_GETDATA(GWEN_MSGENGINE, AB_MSGENGINE, e); assert(le); return defValue; } int AB_MsgEngine_BinTypeRead(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *vbuf){ const char *typ; typ=GWEN_XMLNode_GetProperty(node, "type", ""); if (strcasecmp(typ, "tlv")==0) { int isBerTlv; const char *p; unsigned int tagType; unsigned int tagLength; //const char *tagData; unsigned int size; unsigned int pos; unsigned int j; GWEN_XMLNODE *tlvNode; GWEN_DB_NODE *ngr; const char *name; GWEN_Buffer_Rewind(vbuf); if (!GWEN_Buffer_GetBytesLeft(vbuf)) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Buffer empty"); return 0; } DBG_VERBOUS(AQBANKING_LOGDOMAIN, "Entering BinTypeRead with this:"); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Verbous) GWEN_Buffer_Dump(vbuf, 2); p=GWEN_Buffer_GetStart(vbuf); pos=0; size=GWEN_Buffer_GetBytesLeft(vbuf); isBerTlv=(strcasecmp(GWEN_XMLNode_GetProperty(node, "tlvtype", "bertlv"), "BER")==0); /* get tag type */ if (size<2) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes for BER-TLV"); return -1; } j=(unsigned char)(p[pos]); if (isBerTlv) { if ((j & 0x1f)==0x1f) { pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); } else j&=0x1f; } DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag type %02x%s", j, isBerTlv?" (BER-TLV)":""); tagType=j; /* get length */ pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); if (isBerTlv) { if (j & 0x80) { if (j==0x81) { pos++; if (pos>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } j=(unsigned char)(p[pos]); } /* 0x81 */ else if (j==0x82) { if (pos+1>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } pos++; j=((unsigned char)(p[pos]))<<8; pos++; j+=(unsigned char)(p[pos]); } /* 0x82 */ else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unexpected tag length modifier %02x", j); return -1; } } /* if tag length modifier */ } else { if (j==255) { if (pos+2>=size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } pos++; j=((unsigned char)(p[pos]))<<8; pos++; j+=(unsigned char)(p[pos]); } } pos++; tagLength=j; //tagData=p+pos; GWEN_Buffer_SetPos(vbuf, pos); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag: %02x (%d bytes)", tagType, tagLength); if (pos+j>size) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few bytes"); return -1; } /* parse TLV data */ tlvNode=GWEN_XMLNode_FindFirstTag(node, "tlv", 0, 0); while (tlvNode) { int ltagType; if (1!=sscanf(GWEN_XMLNode_GetProperty(tlvNode, "id", "-1"), "%i", <agType)) { DBG_WARN(AQBANKING_LOGDOMAIN, "Bad tag id in XML file"); } else { if (ltagType==tagType) { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Tag %02x found in XML file", ltagType); name=GWEN_XMLNode_GetProperty(node, "name", 0); ngr=gr; if (name) { if (*name) { ngr=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT, name); assert(ngr); } } name=GWEN_XMLNode_GetProperty(tlvNode, "name", 0); if (name) { if (*name) { ngr=GWEN_DB_GetGroup(ngr, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP, name); assert(ngr); } } if (tagLength) { if (GWEN_MsgEngine_ParseMessage(e, tlvNode, vbuf, ngr, GWEN_MSGENGINE_READ_FLAGS_DEFAULT)){ DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } } return 0; } /* if tag id matches */ } /* if id is ok */ tlvNode=GWEN_XMLNode_FindNextTag(tlvNode, "tlv", 0, 0); } /* while */ DBG_INFO(AQBANKING_LOGDOMAIN, "Tag \"%02x\" not found", tagType); name=GWEN_XMLNode_GetProperty(node, "name", 0); ngr=gr; if (name) { if (*name) { ngr=GWEN_DB_GetGroup(gr, GWEN_DB_FLAGS_DEFAULT, name); assert(ngr); } } ngr=GWEN_DB_GetGroup(ngr, GWEN_PATH_FLAGS_CREATE_GROUP, "UnknownTag"); assert(ngr); GWEN_DB_SetIntValue(ngr, GWEN_DB_FLAGS_OVERWRITE_VARS, "tag", tagType); GWEN_DB_SetBinValue(ngr, GWEN_DB_FLAGS_OVERWRITE_VARS, "data", GWEN_Buffer_GetPosPointer(vbuf), GWEN_Buffer_GetBytesLeft(vbuf)); return 0; } else { return 1; } } int AB_MsgEngine_BinTypeWrite(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *dbuf){ return 1; } aqbanking-5.6.4beta/src/libs/aqbanking/banking_imex.h0000644000175000017500000003106312364015477017531 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_IMEX_H #define AQBANKING_BANKING_IMEX_H #include #include #include #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_IMEXPORTER */ /*@{*/ /** @name Plugin Handling * */ /*@{*/ /** * Returns a list2 of available importers and exporters. * You must free this list after using it via * @ref GWEN_PluginDescription_List2_freeAll. * Please note that a simple @ref GWEN_PluginDescription_List2_free would * not suffice, since that would only free the list but not the objects * stored within the list ! * @param ab pointer to the AB_BANKING object */ AQBANKING_API GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetImExporterDescrs(AB_BANKING *ab); /** * Loads an importer/exporter backend with the given name. You can use * @ref AB_Banking_GetImExporterDescrs to retrieve a list of available * im-/exporters. * AqBanking remains the owner of the object returned (if any), so you * must not free it. */ AQBANKING_API AB_IMEXPORTER *AB_Banking_GetImExporter(AB_BANKING *ab, const char *name); /** *

* Loads all available profiles for the given importer/exporter. * This includes global profiles as well as local ones. *

*

* Local profiles overwrite global ones, allowing the user to customize the * profiles. Local profiles are expected in a folder below the user * local folder (e.g. "$HOME/.aqbanking"). The local profile folder for the * CSV plugin is in "$HOME/.aqbanking/imexporters/csv/profiles". *

*

* The GWEN_DB returned contains one group for every loaded profile. Every * group has the name of the profile it contains. Every group contains at * least three variables: *

    *
  • char "name": name of the profile
  • *
  • int "isGlobal": this is 0 for profiles loaded from the users home directory and * 1 otherwise.
  • *
  • char "fileName": name of the loaded file (without path, so it can be used for * @ref AB_Banking_SaveLocalImExporterProfile)
  • *
* The remaining content of each group is completely defined by * the importer/exporter. *

*

* You can use @ref GWEN_DB_GetFirstGroup and @ref GWEN_DB_GetNextGroup * to browse the profiles. *

*

* The caller becomes the new owner of the object returned (if any). * This makes him/her responsible for freeing it via * @ref GWEN_DB_Group_free. *

*

* You can use any of the subgroups below the returned one as argument * to @ref AB_ImExporter_Import. *

* @param ab pointer to the AB_BANKING object * @param name name of the importer whose profiles are to be read */ AQBANKING_API GWEN_DB_NODE *AB_Banking_GetImExporterProfiles(AB_BANKING *ab, const char *imExporterName); AQBANKING_API GWEN_DB_NODE *AB_Banking_GetImExporterProfile(AB_BANKING *ab, const char *imExporterName, const char *profileName); /** * Save the given profile in the local user folder of the given im-/exporter * module. After that this profile will appear in the list returned by * @ref AB_Banking_GetImExporterProfiles. * Existing profiles with the same file name (argument @c fname) will be overwritten. * It is best practice to use the name of the profile plus ".conf" as file name * (e.g. "testprofile.conf"). The caller has to make sure that the name of the profile * is unique among all profiles of the given im-/exporter module, otherwise some * profiles can not be loaded. * * @param ab pointer to the AB_BANKING object * @param imexporterName name of the im-/exporter whose profile is to be written * @param dbProfile DB group containing the profile * @param fname name of the file to write without path (e.g. "testprofile.conf") * (if NULL then the path is determined by AqBanking using the given name of the im-/exporter). */ AQBANKING_API int AB_Banking_SaveLocalImExporterProfile(AB_BANKING *ab, const char *imexporterName, GWEN_DB_NODE *dbProfile, const char *fname); /*@}*/ /** @name Convenience Functions for Import/Export * * For import and exports the following objects are generally needed: *
    *
  • im/exporter module (e.g. "csv", "ofx", "swift")
  • *
  • im/export profile with the settings for the im/exporter module (e.g. "SWIFT-MT940" for * the "swift" importer)
  • *
  • im/export context (needed on import to store imported data, on export to hold the data * to export)
  • *
  • source/destination for the data to import/export (e.g. a CSV-file, OFX file etc)
  • *
* * To make it easier for applications to import/export data this group contains some convenience * functions which automatically load the appropriate im/exporter plugin and a selected im/exporter * settings profile. * * The raw im/export API of AqBanking works with GWEN_SYNCIO objects as source/destination for the * formatted data. Such a GWEN_SYNCIO object can be a file or a buffer in memory. * However, the functions in this group allow you just to specify the file to import from/export to * and leave the gory details of setting up a GWEN_SYNCIO to AqBanking. * * There are functions to: *
    *
  • import from a file
  • *
  • import from a memory buffer
  • *
  • export to a file
  • *
  • export to a memory buffer
  • *
*/ /*@{*/ /** * This function tries to fill missing fields in a given imexporter context. * It tries to find the online banking accounts for all account info objects in * the context and copies missing information (like IBAN, BIC, owner name etc). * * @param ab pointer to the AB_BANKING object * @param iec pointer to the imexporter context to fill * @return 0 if all accounts were found, 1 if there was at least 1 unknown account */ AQBANKING_API int AB_Banking_FillGapsInImExporterContext(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *iec); /** * This function tries to fill missing fields in a given transaction. * It tries to fill missing data from the given local account (IBAN, BIC, owner name etc). * It also fills in remote IBAN and BIC if the remote account is located in Germany. * * @param ab pointer to the AB_BANKING object * @param localAccount account from which local info is copied (may be NULL) * @param t transaction to fill */ AQBANKING_API void AB_Banking_FillGapsInTransaction(AB_BANKING *ab, AB_ACCOUNT *localAccount, AB_TRANSACTION *t); /** * This function loads the given im/exporter plugin (if necessary) and also loads the given * im/exporter settings profile. The resulting data is written to a GWEN_BUFFER (which is basically * a memory buffer). * @return 0 on success, an error code otherwise * @param ab banking API object * @param ctx export context containing the accounts, transactions etc to export * @param exporterName name of the exporter module (e.g. "csv", "swift", "ofx" etc) * @param profileName name of the exporter settings profile to use (most plugins only provide the * "default" profile, but especially the CSV im/exporter has many profiles from which to choose) * @param buf buffer to write the exported data to */ AQBANKING_API int AB_Banking_ExportToBuffer(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, GWEN_BUFFER *buf); /** * This function loads the given im/exporter plugin (if necessary) and also loads the given * im/exporter settings profile. The resulting data is written to the given file. * @return 0 on success, an error code otherwise * @param ab banking API object * @param ctx export context containing the accounts, transactions etc to export * @param exporterName name of the exporter module (e.g. "csv", "swift", "ofx" etc) * @param profileName name of the exporter settings profile to use (most plugins only provide the * "default" profile, but especially the CSV im/exporter has many profiles from which to choose) * @param fileName name of the file to create and to write the formatted data to */ AQBANKING_API int AB_Banking_ExportToFile(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, const char *fileName); /** * This function basically does the same as @ref AB_Banking_ExportToFile. However, it loads the * exporter settings profile from a given file (as opposed to the forementioned function which * loads the profile by name from the set of system- or user-wide installed profiles). * So this functions allows for loading of special profiles which aren't installed. * @return 0 on success, an error code otherwise * @param ab banking API object * @param ctx export context containing the accounts, transactions etc to export * @param exporterName name of the exporter module (e.g. "csv", "swift", "ofx" etc) * @param profileName name of the exporter settings profile stored in the file whose name * is given in @b profileFile * @param profileFile name of the file to load the exporter settings profile from. * @param outFileName name of the file to create and to write the formatted data to */ AQBANKING_API int AB_Banking_ExportToFileWithProfile(AB_BANKING *ab, const char *exporterName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, const char *outputFileName); AQBANKING_API int AB_Banking_ExportWithProfile(AB_BANKING *ab, const char *exporterName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, GWEN_SYNCIO *sio); AQBANKING_API int AB_Banking_ImportBuffer(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, GWEN_BUFFER *buf); AQBANKING_API int AB_Banking_ImportFileWithProfile(AB_BANKING *ab, const char *importerName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, const char *inputFileName); /** * Imports data using a profile. * * @param ab banking API object * @param ctx import context to receive the imported accounts, transactions etc * @param importerName name of the importer module (e.g. "csv", "swift", "ofx" etc) * @param profileName name of the importer settings profile stored in the file whose name * is given in @b profileFile * @param profileFile name of the file to load the exporter settings profile from. This should * contain at least one profile in a "profile" group. If you want to use profiles installed with * AqBanking you can specify its name via @b profileName and use NULL here * @param sio IO from which to import * * Example for a profile file: * @code * profile { * char name="test" * char shortDescr="Test" * char version="5.0.4" * char longDescr="Test Profile" * int import="1" * int export="1" * char type="csv" * char groupNames="transaction", "transfer", "debitnote", "line" * char dateFormat="DD.MM.YYYY" * int utc="0" * char subject="transactions" * int usePosNegField="0" * char posNegFieldName="posNeg" * int defaultIsPositive="1" * char valueFormat="float" * params { * quote="0" * title="1" * delimiter=";" * group="transaction" * columns { * 1="remoteBankCode" * 2="remoteAccountNumber" * 3="remoteName[0]" * 4="value/value" * 5="purpose[0]" * 6="purpose[1]" * } # columns * } # params * } # profile * @endcode */ AQBANKING_API int AB_Banking_ImportWithProfile(AB_BANKING *ab, const char *importerName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, GWEN_SYNCIO *sio); /** * Another convenience function to import a given file. * (introduced in AqBanking 4.3.0) */ AQBANKING_API int AB_Banking_ImportFileWithProfile(AB_BANKING *ab, const char *importerName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, const char *inputFileName); /*@}*/ /*@}*/ /* addtogroup */ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/error.h0000644000175000017500000000561312364015477016231 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ERROR_H #define AQBANKING_ERROR_H #include #include #ifdef AQBANKING_IS_SUBPROJECT # define AQBANKING_API # define AQBANKING_EXPORT # define AQBANKING_NOEXPORT #else # ifdef BUILDING_AQBANKING # /* building AqBanking */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQBANKING_API __declspec (dllexport) # else /* if __declspec */ # define AQBANKING_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQBANKING_API __attribute__((visibility("default"))) # else # define AQBANKING_API # endif # endif # else # /* not building AqBanking */ # if AQBANKING_SYS_IS_WINDOWS # /* for windows */ # ifdef __declspec # define AQBANKING_API __declspec (dllimport) # else /* if __declspec */ # define AQBANKING_API # endif /* if NOT __declspec */ # else # /* for non-win32 */ # define AQBANKING_API # endif # endif # ifdef GCC_WITH_VISIBILITY_ATTRIBUTE # define AQBANKING_EXPORT __attribute__((visibility("default"))) # define AQBANKING_NOEXPORT __attribute__((visibility("hidden"))) # else # define AQBANKING_EXPORT # define AQBANKING_NOEXPORT # endif #endif #ifndef AQBANKING_NOWARN_DEPRECATED # ifdef __GNUC__ # define AQBANKING_DEPRECATED __attribute((__deprecated__)) # else # define AQBANKING_DEPRECATED # endif # else # define AQBANKING_DEPRECATED #endif #define AQBANKING_LOGDOMAIN "aqbanking" /** @defgroup AB_ERROR Error Codes * @ingroup G_AB_C_INTERFACE */ /*@{*/ #define AB_ERROR_OFFSET GWEN_ERROR_USEROFFSET #define AB_ERROR_BAD_CONFIG_FILE (AB_ERROR_OFFSET-1) #define AB_ERROR_NETWORK (AB_ERROR_OFFSET-2) #define AB_ERROR_EMPTY (AB_ERROR_OFFSET-3) #define AB_ERROR_INDIFFERENT (AB_ERROR_OFFSET-4) #define AB_ERROR_UNKNOWN_ACCOUNT (AB_ERROR_OFFSET-5) #define AB_ERROR_NOT_INIT (AB_ERROR_OFFSET-6) #define AB_ERROR_SECURITY (AB_ERROR_OFFSET-7) #define AB_ERROR_PLUGIN_MISSING (AB_ERROR_OFFSET-8) #define AB_ERROR_USER1 (AB_ERROR_OFFSET-50) #define AB_ERROR_USER2 (AB_ERROR_OFFSET-51) #define AB_ERROR_USER3 (AB_ERROR_OFFSET-52) #define AB_ERROR_USER4 (AB_ERROR_OFFSET-53) #define AB_ERROR_USEROFFSET (AB_ERROR_OFFSET-100) /*@}*/ #endif /* AQBANKING_ERROR_H */ aqbanking-5.6.4beta/src/libs/aqbanking/Makefile.in0000644000175000017500000014007012643540055016764 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testlib$(EXEEXT) ab_value_test$(EXEEXT) TESTS = testlib$(EXEEXT) ab_value_test$(EXEEXT) subdir = src/libs/aqbanking DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(iheaderdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libaqbanking_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ backendsupport/libabbesupport.la jobs/libjobs.la \ types/libtypes.la gui/libabgui.la dialogs/libabdialogs.la am_libaqbanking_la_OBJECTS = account.lo bankinfoplugin.lo banking.lo \ country.lo imexporter.lo job.lo provider.lo msgengine.lo \ httpsession.lo libaqbanking_la_OBJECTS = $(am_libaqbanking_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libaqbanking_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libaqbanking_la_LDFLAGS) $(LDFLAGS) \ -o $@ PROGRAMS = $(noinst_PROGRAMS) am_ab_value_test_OBJECTS = ab-value-test.$(OBJEXT) ab_value_test_OBJECTS = $(am_ab_value_test_OBJECTS) ab_value_test_DEPENDENCIES = libaqbanking.la $(am__DEPENDENCIES_1) am_testlib_OBJECTS = testlib.$(OBJEXT) testlib_OBJECTS = $(am_testlib_OBJECTS) testlib_DEPENDENCIES = libaqbanking.la $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libaqbanking_la_SOURCES) $(ab_value_test_SOURCES) \ $(testlib_SOURCES) DIST_SOURCES = $(libaqbanking_la_SOURCES) $(ab_value_test_SOURCES) \ $(testlib_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ # We define those here because within the configure script the variables # $(datadir) et al are not available. DEFS = @DEFS@ -DEXEEXT=\"$(EXEEXT)\" \ -DLOCALEDIR=\"@aqbanking_locale_searchdir@\" \ -DAQBANKING_PLUGINS=\"$(aqbanking_plugin_searchdir)\" \ -DAQBANKING_SYSCONF_DIR=\"$(aqbanking_cfg_searchdir)\" \ -DAQBANKING_DATA_DIR=\"$(aqbanking_data_searchdir)\" \ -DCOMPILE_DATETIME=\"@DATETIME@\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = types jobs gui dialogs backendsupport typemaker2 INCLUDES = \ -I$(aqbanking_symlinkdir) \ -I$(srcdir)/types -I$(srcdir)/jobs $(gwenhywfar_includes) lib_LTLIBRARIES = libaqbanking.la AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ EXTRA_DIST = \ banking_account.c \ banking_cfg.c \ banking_deprec.c \ banking_init.c \ banking_online.c \ banking_user.c \ banking_imex.c noinst_HEADERS = \ account_l.h \ account_p.h \ banking_l.h \ banking_p.h \ bankinfoplugin_l.h \ bankinfoplugin_p.h \ country_l.h \ country_p.h \ i18n_l.h \ imexporter_l.h \ imexporter_p.h \ job_l.h \ job_p.h \ provider_l.h \ provider_p.h \ msgengine_p.h \ httpsession_p.h iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ account.h \ account_be.h \ banking.h \ banking_be.h \ banking_cfg.h \ banking_imex.h \ banking_info.h \ banking_ob.h \ banking_simple.h \ banking_virt.h \ bankinfoplugin.h \ bankinfoplugin_be.h \ country.h \ error.h \ imexporter.h \ imexporter_be.h \ job.h \ job_be.h \ provider.h \ provider_be.h\ msgengine.h \ httpsession.h libaqbanking_la_SOURCES = \ account.c \ bankinfoplugin.c \ banking.c \ country.c \ imexporter.c \ job.c \ provider.c \ msgengine.c \ httpsession.c libaqbanking_la_LIBADD = $(gwenhywfar_libs) $(gmp_libs) $(i18n_libs) \ backendsupport/libabbesupport.la \ jobs/libjobs.la \ types/libtypes.la \ gui/libabgui.la \ dialogs/libabdialogs.la libaqbanking_la_LDFLAGS = -no-undefined \ -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ testlib_SOURCES = testlib.c testlib_LDADD = libaqbanking.la $(gwenhywfar_libs) # Another test program to verify the parsing of decimal numbers ab_value_test_SOURCES = ab-value-test.c ab_value_test_LDADD = libaqbanking.la $(gwenhywfar_libs) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libaqbanking.la: $(libaqbanking_la_OBJECTS) $(libaqbanking_la_DEPENDENCIES) $(EXTRA_libaqbanking_la_DEPENDENCIES) $(AM_V_CCLD)$(libaqbanking_la_LINK) -rpath $(libdir) $(libaqbanking_la_OBJECTS) $(libaqbanking_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ab_value_test$(EXEEXT): $(ab_value_test_OBJECTS) $(ab_value_test_DEPENDENCIES) $(EXTRA_ab_value_test_DEPENDENCIES) @rm -f ab_value_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ab_value_test_OBJECTS) $(ab_value_test_LDADD) $(LIBS) testlib$(EXEEXT): $(testlib_OBJECTS) $(testlib_DEPENDENCIES) $(EXTRA_testlib_DEPENDENCIES) @rm -f testlib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testlib_OBJECTS) $(testlib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab-value-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/account.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bankinfoplugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/banking.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/country.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpsession.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imexporter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msgengine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? testlib.log: testlib$(EXEEXT) @p='testlib$(EXEEXT)'; \ b='testlib'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ab_value_test.log: ab_value_test$(EXEEXT) @p='ab_value_test$(EXEEXT)'; \ b='ab_value_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-iheaderHEADERS uninstall-libLTLIBRARIES .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-iheaderHEADERS uninstall-libLTLIBRARIES sources: for f in $(libaqbanking_la_SOURCES) $(EXTRA_DIST); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in backendsupport ; do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/libs/aqbanking/httpsession.c0000644000175000017500000000567512364015477017466 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "httpsession_p.h" #include "i18n_l.h" #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif GWEN_INHERIT(GWEN_HTTP_SESSION, AB_HTTP_SESSION) GWEN_HTTP_SESSION *AB_HttpSession_new(AB_PROVIDER *pro, AB_USER *u, const char *url, const char *defaultProto, int defaultPort) { GWEN_HTTP_SESSION *sess; AB_HTTP_SESSION *xsess; assert(pro); assert(u); sess=GWEN_HttpSession_new(url, defaultProto, defaultPort); assert(sess); GWEN_NEW_OBJECT(AB_HTTP_SESSION, xsess); GWEN_INHERIT_SETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess, xsess, AB_HttpSession_FreeData); xsess->provider=pro; xsess->user=u; xsess->logs=GWEN_Buffer_new(0, 256, 0, 1); return sess; } void GWENHYWFAR_CB AB_HttpSession_FreeData(void *bp, void *p) { AB_HTTP_SESSION *xsess; xsess=(AB_HTTP_SESSION*)p; GWEN_Buffer_free(xsess->logs); GWEN_FREE_OBJECT(xsess); } AB_PROVIDER *AB_HttpSession_GetProvider(const GWEN_HTTP_SESSION *sess) { AB_HTTP_SESSION *xsess; assert(sess); xsess=GWEN_INHERIT_GETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess); assert(xsess); return xsess->provider; } AB_USER *AB_HttpSession_GetUser(const GWEN_HTTP_SESSION *sess) { AB_HTTP_SESSION *xsess; assert(sess); xsess=GWEN_INHERIT_GETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess); assert(xsess); return xsess->user; } void Ab_HttpSession_AddLog(GWEN_HTTP_SESSION *sess, const char *s) { AB_HTTP_SESSION *xsess; assert(sess); xsess=GWEN_INHERIT_GETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess); assert(xsess); if (s) { size_t l=strlen(s); if (s) { GWEN_Buffer_AppendString(xsess->logs, s); if (s[l-1]!='\n') GWEN_Buffer_AppendByte(xsess->logs, '\n'); } } } const char *AB_HttpSession_GetLog(const GWEN_HTTP_SESSION *sess) { AB_HTTP_SESSION *xsess; assert(sess); xsess=GWEN_INHERIT_GETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess); assert(xsess); if (GWEN_Buffer_GetUsedBytes(xsess->logs)) return GWEN_Buffer_GetStart(xsess->logs); else return NULL; } void AB_HttpSession_ClearLog(GWEN_HTTP_SESSION *sess) { AB_HTTP_SESSION *xsess; assert(sess); xsess=GWEN_INHERIT_GETDATA(GWEN_HTTP_SESSION, AB_HTTP_SESSION, sess); assert(xsess); GWEN_Buffer_Reset(xsess->logs); } aqbanking-5.6.4beta/src/libs/aqbanking/provider.c0000644000175000017500000003037412364015477016727 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "provider_p.h" #include "provider_be.h" #include "banking_l.h" #include #include #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AB_PROVIDER) GWEN_LIST_FUNCTIONS(AB_PROVIDER, AB_Provider) GWEN_INHERIT(GWEN_PLUGIN, AB_PLUGIN_PROVIDER) AB_PROVIDER *AB_Provider_new(AB_BANKING *ab, const char *name){ AB_PROVIDER *pro; GWEN_BUFFER *nbuf; assert(ab); assert(name); nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Text_EscapeToBufferTolerant(name, nbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad backend name, aborting."); GWEN_Buffer_free(nbuf); abort(); } else { char *s; s=GWEN_Buffer_GetStart(nbuf); while(*s) { *s=tolower(*s); s++; } } GWEN_NEW_OBJECT(AB_PROVIDER, pro); pro->usage=1; GWEN_INHERIT_INIT(AB_PROVIDER, pro); GWEN_LIST_INIT(AB_PROVIDER, pro); pro->banking=ab; pro->name=strdup(name); pro->escName=strdup(GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); return pro; } void AB_Provider_free(AB_PROVIDER *pro){ if (pro) { assert(pro->usage); if (--(pro->usage)==0) { DBG_VERBOUS(AQBANKING_LOGDOMAIN, "Destroying AB_PROVIDER (%s)", pro->name); GWEN_INHERIT_FINI(AB_PROVIDER, pro); GWEN_Plugin_free(pro->plugin); free(pro->name); free(pro->escName); GWEN_LIST_FINI(AB_PROVIDER, pro); GWEN_FREE_OBJECT(pro); } } } void AB_Provider_AddFlags(AB_PROVIDER *pro, uint32_t fl) { assert(pro); pro->flags|=fl; } void AB_Provider_SetPlugin(AB_PROVIDER *pro, GWEN_PLUGIN *pl) { assert(pro); pro->plugin=pl; } int AB_Provider_Init(AB_PROVIDER *pro){ assert(pro); if (pro->isInit) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider already is initialized"); return GWEN_ERROR_INVALID; } if (pro->initFn) { int rv; GWEN_DB_NODE *dbData=NULL; rv=AB_Banking_LoadPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name, &dbData); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } else { assert(dbData); rv=pro->initFn(pro, dbData); if (!rv) pro->isInit=1; GWEN_DB_Group_free(dbData); return rv; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No init function set"); return GWEN_ERROR_NOT_IMPLEMENTED; } } int AB_Provider_Fini(AB_PROVIDER *pro){ assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return GWEN_ERROR_INVALID; } if (pro->finiFn) { int rv; GWEN_DB_NODE *dbData; rv=AB_Banking_LockPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } rv=AB_Banking_LoadPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name, &dbData); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnlockPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name); return rv; } pro->isInit=0; rv=pro->finiFn(pro, dbData); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnlockPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name); GWEN_DB_Group_free(dbData); return rv; } rv=AB_Banking_SavePluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name, dbData); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnlockPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name); GWEN_DB_Group_free(dbData); return rv; } rv=AB_Banking_UnlockPluginConfig(pro->banking, AB_CFG_GROUP_BACKENDS, pro->name); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbData); return rv; } GWEN_DB_Group_free(dbData); return 0; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No fini function set"); pro->isInit=0; return GWEN_ERROR_NOT_IMPLEMENTED; } } const char *AB_Provider_GetName(const AB_PROVIDER *pro){ assert(pro); return pro->name; } const char *AB_Provider_GetEscapedName(const AB_PROVIDER *pro){ assert(pro); return pro->escName; } AB_BANKING *AB_Provider_GetBanking(const AB_PROVIDER *pro){ assert(pro); return pro->banking; } void AB_Provider_SetInitFn(AB_PROVIDER *pro, AB_PROVIDER_INIT_FN f){ assert(pro); pro->initFn=f; } void AB_Provider_SetFiniFn(AB_PROVIDER *pro, AB_PROVIDER_FINI_FN f){ assert(pro); pro->finiFn=f; } void AB_Provider_SetUpdateJobFn(AB_PROVIDER *pro, AB_PROVIDER_UPDATEJOB_FN f){ assert(pro); pro->updateJobFn=f; } void AB_Provider_SetAddJobFn(AB_PROVIDER *pro, AB_PROVIDER_ADDJOB_FN f){ assert(pro); pro->addJobFn=f; } void AB_Provider_SetExecuteFn(AB_PROVIDER *pro, AB_PROVIDER_EXECUTE_FN f){ assert(pro); pro->executeFn=f; } void AB_Provider_SetResetQueueFn(AB_PROVIDER *pro, AB_PROVIDER_RESETQUEUE_FN f){ assert(pro); pro->resetQueueFn=f; } void AB_Provider_SetExtendUserFn(AB_PROVIDER *pro, AB_PROVIDER_EXTEND_USER_FN f){ assert(pro); pro->extendUserFn=f; } void AB_Provider_SetExtendAccountFn(AB_PROVIDER *pro, AB_PROVIDER_EXTEND_ACCOUNT_FN f){ assert(pro); pro->extendAccountFn=f; } void AB_Provider_SetUpdateFn(AB_PROVIDER *pro, AB_PROVIDER_UPDATE_FN f) { assert(pro); pro->updateFn=f; } void AB_Provider_SetGetNewUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWUSER_DIALOG_FN f) { assert(pro); pro->getNewUserDialogFn=f; } void AB_Provider_SetGetEditUserDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITUSER_DIALOG_FN f) { assert(pro); pro->getEditUserDialogFn=f; } void AB_Provider_SetGetNewAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN f) { assert(pro); pro->getNewAccountDialogFn=f; } void AB_Provider_SetGetEditAccountDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN f) { assert(pro); pro->getEditAccountDialogFn=f; } void AB_Provider_SetGetUserTypeDialogFn(AB_PROVIDER *pro, AB_PROVIDER_GET_USERTYPE_DIALOG_FN f) { assert(pro); pro->getUserTypeDialogFn=f; } int AB_Provider_UpdateJob(AB_PROVIDER *pro, AB_JOB *j){ assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return GWEN_ERROR_INVALID; } if (pro->updateJobFn) { return pro->updateJobFn(pro, j); } DBG_ERROR(AQBANKING_LOGDOMAIN, "No updateJob function set"); return GWEN_ERROR_NOT_IMPLEMENTED; } int AB_Provider_AddJob(AB_PROVIDER *pro, AB_JOB *j){ assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return GWEN_ERROR_INVALID; } if (pro->addJobFn) { return pro->addJobFn(pro, j); } DBG_ERROR(AQBANKING_LOGDOMAIN, "No addJob function set"); return GWEN_ERROR_NOT_IMPLEMENTED; } int AB_Provider_Execute(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx){ assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return GWEN_ERROR_INVALID; } if (pro->executeFn) { return pro->executeFn(pro, ctx); } DBG_ERROR(AQBANKING_LOGDOMAIN, "No execute function set"); return GWEN_ERROR_NOT_IMPLEMENTED; } int AB_Provider_ResetQueue(AB_PROVIDER *pro){ assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return GWEN_ERROR_INVALID; } if (pro->resetQueueFn) { return pro->resetQueueFn(pro); } DBG_ERROR(AQBANKING_LOGDOMAIN, "No resetQueue function set"); return GWEN_ERROR_NOT_IMPLEMENTED; } int AB_Provider_ExtendUser(AB_PROVIDER *pro, AB_USER *u, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { assert(pro); assert(u); if (em!=AB_ProviderExtendMode_Save && pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return AB_ERROR_NOT_INIT; } if (pro->extendUserFn) return pro->extendUserFn(pro, u, em, db); DBG_INFO(AQBANKING_LOGDOMAIN, "No extendUser function set"); return 0; } int AB_Provider_ExtendAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, AB_PROVIDER_EXTEND_MODE em, GWEN_DB_NODE *db) { assert(pro); assert(a); if (em!=AB_ProviderExtendMode_Save && pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider is not initialized"); return AB_ERROR_NOT_INIT; } if (pro->extendAccountFn) return pro->extendAccountFn(pro, a, em, db); DBG_INFO(AQBANKING_LOGDOMAIN, "No extendAccount function set"); return 0; } int AB_Provider_Update(AB_PROVIDER *pro, uint32_t lastVersion, uint32_t currentVersion) { assert(pro); if (pro->isInit==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider \"%s\" is not initialized", AB_Provider_GetName(pro)); return AB_ERROR_NOT_INIT; } if (pro->updateFn) return pro->updateFn(pro, lastVersion, currentVersion); DBG_INFO(AQBANKING_LOGDOMAIN, "No update function set"); return 0; } GWEN_DIALOG *AB_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i) { assert(pro); if (pro->getNewUserDialogFn) return pro->getNewUserDialogFn(pro, i); else return NULL; } GWEN_DIALOG *AB_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u) { assert(pro); if (pro->getEditUserDialogFn) return pro->getEditUserDialogFn(pro, u); else return NULL; } GWEN_DIALOG *AB_Provider_GetNewAccountDialog(AB_PROVIDER *pro) { assert(pro); if (pro->getNewAccountDialogFn) return pro->getNewAccountDialogFn(pro); else return NULL; } GWEN_DIALOG *AB_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a) { assert(pro); if (pro->getEditAccountDialogFn) return pro->getEditAccountDialogFn(pro, a); else return NULL; } GWEN_DIALOG *AB_ProviderGetUserTypeDialog(AB_PROVIDER *pro) { assert(pro); if (pro->getUserTypeDialogFn) return pro->getUserTypeDialogFn(pro); else return NULL; } int AB_Provider_IsInit(const AB_PROVIDER *pro){ assert(pro); return (pro->isInit!=0); } uint32_t AB_Provider_GetFlags(const AB_PROVIDER *pro){ assert(pro); return pro->flags; } int AB_Provider_GetUserDataDir(const AB_PROVIDER *pro, GWEN_BUFFER *buf){ assert(pro); assert(buf); assert(pro->banking); assert(pro->escName); return AB_Banking_GetProviderUserDataDir(pro->banking, pro->escName, buf); } GWEN_PLUGIN *AB_Plugin_Provider_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; AB_PLUGIN_PROVIDER *xpl; pl=GWEN_Plugin_new(pm, name, fileName); GWEN_NEW_OBJECT(AB_PLUGIN_PROVIDER, xpl); GWEN_INHERIT_SETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl, xpl, AB_Plugin_Provider_FreeData); return pl; } void GWENHYWFAR_CB AB_Plugin_Provider_FreeData(void *bp, void *p) { AB_PLUGIN_PROVIDER *xpl; xpl=(AB_PLUGIN_PROVIDER*)p; GWEN_FREE_OBJECT(xpl); } AB_PROVIDER *AB_Plugin_Provider_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab) { AB_PLUGIN_PROVIDER *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl); assert(xpl); assert(xpl->pluginFactoryFn); return xpl->pluginFactoryFn(pl, ab); } void AB_Plugin_Provider_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_PROVIDER_FACTORY_FN fn) { AB_PLUGIN_PROVIDER *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_PROVIDER, pl); assert(xpl); xpl->pluginFactoryFn=fn; } aqbanking-5.6.4beta/src/libs/aqbanking/imexporter_p.h0000644000175000017500000000571412364015477017617 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_IMEXPORTER_P_H #define AQBANKING_IMEXPORTER_P_H #define AH_IMEXPORTER_TRANSFORM_MAXLEVEL 16 #include "imexporter_l.h" #include "account_l.h" #include "transaction_l.h" #include "accstatus_l.h" #include GWEN_LIST_FUNCTION_LIB_DEFS(AB_IMEXPORTER_ACCOUNTINFO, AB_ImExporterAccountInfo, AQBANKING_API) struct AB_IMEXPORTER { GWEN_LIST_ELEMENT(AB_IMEXPORTER); GWEN_INHERIT_ELEMENT(AB_IMEXPORTER); AB_BANKING *banking; char *name; uint32_t flags; GWEN_LIBLOADER *libLoader; AB_IMEXPORTER_IMPORT_FN importFn; AB_IMEXPORTER_EXPORT_FN exportFn; AB_IMEXPORTER_CHECKFILE_FN checkFileFn; AB_IMEXPORTER_GET_EDITPROFILE_DIALOG_FN getEditProfileDialogFn; }; struct AB_IMEXPORTER_CONTEXT { AB_IMEXPORTER_ACCOUNTINFO_LIST *accountInfoList; AB_IMEXPORTER_ACCOUNTINFO *nextAccountInfo; AB_SECURITY_LIST *securityList; AB_SECURITY *nextSecurity; AB_MESSAGE_LIST *messageList; AB_MESSAGE *nextMessage; GWEN_BUFFER *logs; }; struct AB_IMEXPORTER_ACCOUNTINFO { GWEN_LIST_ELEMENT(AB_IMEXPORTER_ACCOUNTINFO); /*AB_ACCOUNT *account;*/ char *bankCode; char *bankName; char *accountNumber; char *accountName; char *iban; char *bic; char *owner; char *currency; char *description; AB_ACCOUNT_TYPE accountType; uint32_t accountId; AB_TRANSACTION_LIST *transactions; AB_TRANSACTION *nextTransaction; AB_ACCOUNT_STATUS_LIST *accStatusList; AB_ACCOUNT_STATUS *nextAccountStatus; AB_TRANSACTION_LIST *standingOrders; AB_TRANSACTION *nextStandingOrder; AB_TRANSACTION_LIST *datedTransfers; AB_TRANSACTION *nextDatedTransfer; AB_TRANSACTION_LIST *notedTransactions; AB_TRANSACTION *nextNotedTransaction; AB_TRANSACTION_LIST *transfers; AB_TRANSACTION *nextTransfer; }; static int AH_ImExporter__Transform_Var(GWEN_DB_NODE *db, int level); static int AH_ImExporter__Transform_Group(GWEN_DB_NODE *db, int level); static AB_IMEXPORTER_ACCOUNTINFO *AB_ImExporterContext__GetAccountInfoForTransaction(AB_IMEXPORTER_CONTEXT *iec, const AB_TRANSACTION *t); typedef struct AB_PLUGIN_IMEXPORTER AB_PLUGIN_IMEXPORTER; struct AB_PLUGIN_IMEXPORTER { AB_PLUGIN_IMEXPORTER_FACTORY_FN pluginFactoryFn; }; static void GWENHYWFAR_CB AB_Plugin_ImExporter_FreeData(void *bp, void *p); #endif /* AQBANKING_IMEXPORTER_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/bankinfoplugin_be.h0000644000175000017500000001014512364015477020550 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKINFOPLUGIN_BE_H #define AQBANKING_BANKINFOPLUGIN_BE_H #include typedef struct AB_BANKINFO_PLUGIN AB_BANKINFO_PLUGIN; #include #include #include #include #include GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_BANKINFO_PLUGIN, AQBANKING_API) GWEN_LIST2_FUNCTION_LIB_DEFS(AB_BANKINFO_PLUGIN, AB_BankInfoPlugin, AQBANKING_API) typedef AB_BANKINFO_PLUGIN* (*AB_BANKINFO_PLUGIN_FACTORY_FN)(AB_BANKING *ab); /** @name Prototypes For Virtual Functions * */ /*@{*/ typedef AB_BANKINFO* (*AB_BANKINFOPLUGIN_GETBANKINFO_FN)(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId); typedef int (*AB_BANKINFOPLUGIN_GETBANKINFOBYTMPLATE_FN)(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl); typedef AB_BANKINFO_CHECKRESULT (*AB_BANKINFOPLUGIN_CHECKACCOUNT_FN)(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId, const char *accountId); /*@}*/ /** @name Constructors, Destructors * */ /*@{*/ AQBANKING_API AB_BANKINFO_PLUGIN *AB_BankInfoPlugin_new(const char *country); AQBANKING_API void AB_BankInfoPlugin_free(AB_BANKINFO_PLUGIN *bip); AQBANKING_API void AB_BankInfoPlugin_Attach(AB_BANKINFO_PLUGIN *bip); /*@}*/ /** @name Informational Functions * */ /*@{*/ AQBANKING_API const char *AB_BankInfoPlugin_GetCountry(const AB_BANKINFO_PLUGIN *bip); /*@}*/ /** @name Virtual Functions * */ /*@{*/ AQBANKING_API AB_BANKINFO *AB_BankInfoPlugin_GetBankInfo(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId); AQBANKING_API int AB_BankInfoPlugin_GetBankInfoByTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl); AQBANKING_API AB_BANKINFO_CHECKRESULT AB_BankInfoPlugin_CheckAccount(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId, const char *accountId); /*@}*/ /** @name Setters For Virtual Functions * */ /*@{*/ AQBANKING_API void AB_BankInfoPlugin_SetGetBankInfoFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_GETBANKINFO_FN f); AQBANKING_API void AB_BankInfoPlugin_SetGetBankInfoByTemplateFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_GETBANKINFOBYTMPLATE_FN f); AQBANKING_API void AB_BankInfoPlugin_SetCheckAccountFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_CHECKACCOUNT_FN f); /*@}*/ typedef AB_BANKINFO_PLUGIN* (*AB_PLUGIN_BANKINFO_FACTORY_FN)(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API GWEN_PLUGIN *AB_Plugin_BankInfo_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName); AQBANKING_API AB_BANKINFO_PLUGIN *AB_Plugin_BankInfo_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab); AQBANKING_API void AB_Plugin_BankInfo_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_BANKINFO_FACTORY_FN fn); #endif /* AQBANKING_BANKINFOPLUGIN_BE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/msgengine.h0000644000175000017500000000223612364015477017052 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_MSGENGINE_H #define AQBANKING_MSGENGINE_H #include /* for AQBANKING_API */ #include #ifdef __cplusplus extern "C" { #endif /** * @file aqbanking/msgengine.h * * This message engine implements a few new types: *
    *
  • byte
  • *
  • word (bigEndian="1")
  • *
  • dword (bigEndian="1")
  • *
  • bytes (size="-1")
  • *
  • tlv (tlvType="BER"||"SIMPLE")
  • *
*/ AQBANKING_API GWEN_MSGENGINE *AB_MsgEngine_new(void); #ifdef __cplusplus } #endif #endif /* AQBANKING_MSGENGINE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_imex.c0000644000175000017500000006057612407642762017540 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /* This file is included by banking.c */ void AB_Banking__fillTransactionRemoteInfo(AB_TRANSACTION *t) { const GWEN_STRINGLIST *sl; sl=AB_Transaction_GetPurpose(t); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (-1!=GWEN_Text_ComparePattern(s, "KTO* BLZ*", 0)) { char *cpy; char *p; char *kto; char *blz; cpy=strdup(s); p=cpy; /* skip "KTO", position to account number */ while(*p && !isdigit(*p)) p++; kto=p; /* skip account number */ while(*p && isdigit(*p)) p++; /* terminate account number */ *(p++)=0; /* skip "BLZ", position to account number */ while(*p && !isdigit(*p)) p++; blz=p; /* skip bank code */ while(*p && isdigit(*p)) p++; /* terminate bank code */ *p=0; if (*kto && *blz) { AB_Transaction_SetRemoteAccountNumber(t, kto); AB_Transaction_SetRemoteBankCode(t, blz); free(cpy); break; } else free(cpy); } se=GWEN_StringListEntry_Next(se); } } } void AB_Banking__fillTransactionRemoteSepaInfo(AB_BANKING *ab, AB_TRANSACTION *t) { const char *sRemoteCountry; sRemoteCountry=AB_Transaction_GetRemoteCountry(t); if (!(sRemoteCountry && *sRemoteCountry)) { DBG_INFO(AQBANKING_LOGDOMAIN, "No remote country info, assuming \"de\""); sRemoteCountry="de"; } if (strcasecmp(sRemoteCountry, "de")==0) { const char *sRemoteBankCode; const char *sRemoteAccountNumber; const char *sRemoteBic; const char *sRemoteIban; sRemoteBankCode=AB_Transaction_GetRemoteBankCode(t); sRemoteAccountNumber=AB_Transaction_GetRemoteAccountNumber(t); sRemoteBic=AB_Transaction_GetRemoteBic(t); sRemoteIban=AB_Transaction_GetRemoteIban(t); if (!(sRemoteBic && *sRemoteBic) && (sRemoteBankCode && *sRemoteBankCode)) { AB_BANKINFO *bi; bi=AB_Banking_GetBankInfo(ab, sRemoteCountry, "*", sRemoteBankCode); if (bi) { const char *s; s=AB_BankInfo_GetBic(bi); if (s && *s) { DBG_INFO(AQBANKING_LOGDOMAIN, "Setting remote BIC for [%s] to [%s]", sRemoteBankCode, s); AB_Transaction_SetRemoteBic(t, s); } AB_BankInfo_free(bi); } } if (!(sRemoteIban && *sRemoteIban) && (sRemoteBankCode && *sRemoteBankCode) && (sRemoteAccountNumber && *sRemoteAccountNumber)) { GWEN_BUFFER *tbuf; int rv; tbuf=GWEN_Buffer_new(0, 32, 0, 1); rv=AB_Banking_MakeGermanIban(sRemoteBankCode, sRemoteAccountNumber, tbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Setting remote IBAN for [%s/%s] to [%s]", sRemoteBankCode, sRemoteAccountNumber, GWEN_Buffer_GetStart(tbuf)); AB_Transaction_SetRemoteIban(t, GWEN_Buffer_GetStart(tbuf)); } GWEN_Buffer_free(tbuf); } } } void AB_Banking_FillGapsInTransaction(AB_BANKING *ab, AB_ACCOUNT *a, AB_TRANSACTION *t) { if (a) AB_Transaction_FillLocalFromAccount(t, a); AB_Banking__fillTransactionRemoteSepaInfo(ab, t); } int AB_Banking_FillGapsInImExporterContext(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *iec) { AB_IMEXPORTER_ACCOUNTINFO *iea; int notFounds=0; assert(iec); iea=AB_ImExporterContext_GetFirstAccountInfo(iec); while(iea) { AB_ACCOUNT *a; a=AB_Banking_GetAccountByCodeAndNumber(ab, AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); if (!a) a=AB_Banking_GetAccountByIban(ab, AB_ImExporterAccountInfo_GetIban(iea)); if (a) { AB_TRANSACTION *t; AB_ImExporterAccountInfo_FillFromAccount(iea, a); /* fill transactions */ t=AB_ImExporterAccountInfo_GetFirstTransaction(iea); while(t) { AB_Transaction_FillLocalFromAccount(t, a); if (AB_Transaction_GetRemoteBankCode(t)==NULL && AB_Transaction_GetRemoteAccountNumber(t)==NULL) AB_Banking__fillTransactionRemoteInfo(t); t=AB_ImExporterAccountInfo_GetNextTransaction(iea); } /* fill standing orders */ t=AB_ImExporterAccountInfo_GetFirstStandingOrder(iea); while(t) { AB_Banking_FillGapsInTransaction(ab, a, t); t=AB_ImExporterAccountInfo_GetNextStandingOrder(iea); } /* fill transfers */ t=AB_ImExporterAccountInfo_GetFirstTransfer(iea); while(t) { AB_Banking_FillGapsInTransaction(ab, a, t); t=AB_ImExporterAccountInfo_GetNextTransfer(iea); } /* fill dated transfers */ t=AB_ImExporterAccountInfo_GetFirstDatedTransfer(iea); while(t) { AB_Banking_FillGapsInTransaction(ab, a, t); t=AB_ImExporterAccountInfo_GetNextDatedTransfer(iea); } /* fill noted transactions */ t=AB_ImExporterAccountInfo_GetFirstNotedTransaction(iea); while(t) { AB_Transaction_FillLocalFromAccount(t, a); if (AB_Transaction_GetRemoteBankCode(t)==NULL && AB_Transaction_GetRemoteAccountNumber(t)==NULL) AB_Banking__fillTransactionRemoteInfo(t); t=AB_ImExporterAccountInfo_GetNextNotedTransaction(iea); } } else notFounds++; iea=AB_ImExporterContext_GetNextAccountInfo(iec); } return (notFounds==0)?0:1; } int AB_Banking_ExportToBuffer(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, GWEN_BUFFER *buf) { AB_IMEXPORTER *ie; GWEN_DB_NODE *dbProfile; int rv; ie=AB_Banking_GetImExporter(ab, exporterName); if (ie==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return GWEN_ERROR_NO_DATA; } if (profileName && *profileName) dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName); else dbProfile=GWEN_DB_Group_new("profile"); if (dbProfile==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found", profileName?profileName:"(null)"); return GWEN_ERROR_NO_DATA; } rv=AB_ImExporter_ExportToBuffer(ie, ctx, buf, dbProfile); GWEN_DB_Group_free(dbProfile); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AB_Banking_ExportToFile(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, const char *fname) { AB_IMEXPORTER *ie; GWEN_DB_NODE *dbProfile; int rv; ie=AB_Banking_GetImExporter(ab, exporterName); if (ie==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return GWEN_ERROR_NO_DATA; } if (profileName && *profileName) dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName); else dbProfile=GWEN_DB_Group_new("profile"); if (dbProfile==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found", profileName?profileName:"(null)"); return GWEN_ERROR_NO_DATA; } rv=AB_ImExporter_ExportToFile(ie, ctx, fname, dbProfile); GWEN_DB_Group_free(dbProfile); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } int AB_Banking_ImportBuffer(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *exporterName, const char *profileName, GWEN_BUFFER *buf) { AB_IMEXPORTER *ie; GWEN_DB_NODE *dbProfile; int rv; ie=AB_Banking_GetImExporter(ab, exporterName); if (ie==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return GWEN_ERROR_NO_DATA; } if (profileName && *profileName) dbProfile=AB_Banking_GetImExporterProfile(ab, exporterName, profileName); else dbProfile=GWEN_DB_Group_new("profile"); if (dbProfile==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] not found", profileName?profileName:"(null)"); return GWEN_ERROR_NO_DATA; } rv=AB_ImExporter_ImportBuffer(ie, ctx, buf, dbProfile); GWEN_DB_Group_free(dbProfile); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } return 0; } GWEN_PLUGIN_DESCRIPTION_LIST2 *AB_Banking_GetImExporterDescrs(AB_BANKING *ab){ assert(ab); if (ab_pluginManagerImExporter) { GWEN_PLUGIN_DESCRIPTION_LIST2 *l; l=GWEN_PluginManager_GetPluginDescrs(ab_pluginManagerImExporter); return l; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No plugin manager for imexporters"); return NULL; } } int AB_Banking__ReadImExporterProfiles(AB_BANKING *ab, const char *path, GWEN_DB_NODE *db, int isGlobal) { GWEN_DIRECTORY *d; GWEN_BUFFER *nbuf; char nbuffer[64]; unsigned int pathLen; if (!path) path=""; /* create path */ nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, path); pathLen=GWEN_Buffer_GetUsedBytes(nbuf); d=GWEN_Directory_new(); if (GWEN_Directory_Open(d, GWEN_Buffer_GetStart(nbuf))) { DBG_INFO(AQBANKING_LOGDOMAIN, "Path \"%s\" is not available", GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); GWEN_Directory_free(d); return GWEN_ERROR_NOT_FOUND; } while(!GWEN_Directory_Read(d, nbuffer, sizeof(nbuffer))) { if (strcmp(nbuffer, ".") && strcmp(nbuffer, "..")) { int nlen; nlen=strlen(nbuffer); if (nlen>4) { if (strcasecmp(nbuffer+nlen-5, ".conf")==0) { struct stat st; GWEN_Buffer_Crop(nbuf, 0, pathLen); GWEN_Buffer_SetPos(nbuf, pathLen); GWEN_Buffer_AppendString(nbuf, DIRSEP); GWEN_Buffer_AppendString(nbuf, nbuffer); if (stat(GWEN_Buffer_GetStart(nbuf), &st)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "stat(%s): %s", GWEN_Buffer_GetStart(nbuf), strerror(errno)); } else { if (!S_ISDIR(st.st_mode)) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_Group_new("profile"); if (GWEN_DB_ReadFile(dbT, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not read file \"%s\"", GWEN_Buffer_GetStart(nbuf)); } else { const char *s; s=GWEN_DB_GetCharValue(dbT, "name", 0, 0); if (!s) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad file \"%s\" (no name)", GWEN_Buffer_GetStart(nbuf)); } else { GWEN_DB_NODE *dbTarget; DBG_INFO(AQBANKING_LOGDOMAIN, "File \"%s\" contains profile \"%s\"", GWEN_Buffer_GetStart(nbuf), s); dbTarget=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, s); assert(dbTarget); GWEN_DB_AddGroupChildren(dbTarget, dbT); GWEN_DB_SetIntValue(dbTarget, GWEN_DB_FLAGS_OVERWRITE_VARS, "isGlobal", isGlobal); GWEN_DB_SetCharValue(dbTarget, GWEN_DB_FLAGS_OVERWRITE_VARS, "fileName", nbuffer); } /* if name */ } /* if file successfully read */ GWEN_DB_Group_free(dbT); } /* if !dir */ } /* if stat was ok */ } /* if conf */ } /* if name has more than 4 chars */ } /* if not "." and not ".." */ } /* while */ GWEN_Directory_Close(d); GWEN_Directory_free(d); GWEN_Buffer_free(nbuf); return 0; } GWEN_DB_NODE *AB_Banking_GetImExporterProfiles(AB_BANKING *ab, const char *name){ GWEN_BUFFER *buf; GWEN_DB_NODE *db; int rv; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *sentry; buf=GWEN_Buffer_new(0, 256, 0, 1); db=GWEN_DB_Group_new("profiles"); sl=AB_Banking_GetGlobalDataDirs(); assert(sl); sentry=GWEN_StringList_FirstEntry(sl); assert(sentry); while(sentry) { const char *pkgdatadir; pkgdatadir = GWEN_StringListEntry_Data(sentry); assert(pkgdatadir); /* read global profiles */ GWEN_Buffer_AppendString(buf, pkgdatadir); GWEN_Buffer_AppendString(buf, DIRSEP "aqbanking" DIRSEP AB_IMEXPORTER_FOLDER DIRSEP); if (GWEN_Text_EscapeToBufferTolerant(name, buf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad name for importer/exporter"); GWEN_StringList_free(sl); GWEN_DB_Group_free(db); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_AppendString(buf, DIRSEP "profiles"); rv=AB_Banking__ReadImExporterProfiles(ab, GWEN_Buffer_GetStart(buf), db, 1); if (rv && rv!=GWEN_ERROR_NOT_FOUND) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading global profiles"); GWEN_StringList_free(sl); GWEN_DB_Group_free(db); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_Reset(buf); sentry=GWEN_StringListEntry_Next(sentry); } GWEN_StringList_free(sl); /* read local user profiles */ if (AB_Banking_GetUserDataDir(ab, buf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not get user data dir"); GWEN_DB_Group_free(db); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_AppendString(buf, DIRSEP AB_IMEXPORTER_FOLDER DIRSEP); if (GWEN_Text_EscapeToBufferTolerant(name, buf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad name for importer/exporter"); GWEN_DB_Group_free(db); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_AppendString(buf, DIRSEP "profiles"); rv=AB_Banking__ReadImExporterProfiles(ab, GWEN_Buffer_GetStart(buf), db, 0); if (rv && rv!=GWEN_ERROR_NOT_FOUND) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error reading users profiles"); GWEN_DB_Group_free(db); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_free(buf); return db; } int AB_Banking_SaveLocalImExporterProfile(AB_BANKING *ab, const char *imexporterName, GWEN_DB_NODE *dbProfile, const char *fname){ GWEN_BUFFER *buf; int rv; buf=GWEN_Buffer_new(0, 256, 0, 1); /* get folder for local user profiles */ rv=AB_Banking_GetUserDataDir(ab, buf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not get user data dir"); GWEN_Buffer_free(buf); return rv; } GWEN_Buffer_AppendString(buf, DIRSEP AB_IMEXPORTER_FOLDER DIRSEP); rv=GWEN_Text_EscapeToBufferTolerant(imexporterName, buf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad name for importer/exporter (%d)", rv); GWEN_Buffer_free(buf); return rv; } GWEN_Buffer_AppendString(buf, DIRSEP "profiles"); /* make sure the path exists */ rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(buf), GWEN_PATH_FLAGS_CHECKROOT); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(buf); return rv; } GWEN_Buffer_AppendString(buf, DIRSEP); if (fname && *fname) GWEN_Buffer_AppendString(buf, fname); else { const char *s; s=GWEN_DB_GetCharValue(dbProfile, "name", 0, NULL); if (s && *s) { FILE *f; rv=GWEN_Text_EscapeToBufferTolerant(s, buf); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad profile name (%d)", rv); GWEN_Buffer_free(buf); return rv; } GWEN_Buffer_AppendString(buf, ".conf"); f=fopen(GWEN_Buffer_GetStart(buf), "r"); if (f) { DBG_ERROR(AQBANKING_LOGDOMAIN, "There already is a profile of that name"); GWEN_Buffer_free(buf); fclose(f); return GWEN_ERROR_INVALID; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing profile name"); GWEN_Buffer_free(buf); return GWEN_ERROR_INVALID; } } rv=GWEN_DB_WriteFile(dbProfile, GWEN_Buffer_GetStart(buf), GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing users profile (%d)", rv); GWEN_Buffer_free(buf); return 0; } GWEN_Buffer_free(buf); return 0; } AB_IMEXPORTER *AB_Banking_FindImExporter(AB_BANKING *ab, const char *name) { AB_IMEXPORTER *ie; assert(ab); assert(name); ie=AB_ImExporter_List_First(ab_imexporters); while(ie) { if (strcasecmp(AB_ImExporter_GetName(ie), name)==0) break; ie=AB_ImExporter_List_Next(ie); } /* while */ return ie; } AB_IMEXPORTER *AB_Banking_GetImExporter(AB_BANKING *ab, const char *name){ AB_IMEXPORTER *ie; assert(ab); assert(name); ie=AB_Banking_FindImExporter(ab, name); if (ie) return ie; ie=AB_Banking__LoadImExporterPlugin(ab, name); if (ie) { AB_ImExporter_List_Add(ie, ab_imexporters); } return ie; } AB_IMEXPORTER *AB_Banking__LoadImExporterPlugin(AB_BANKING *ab, const char *modname){ GWEN_PLUGIN *pl; pl=GWEN_PluginManager_GetPlugin(ab_pluginManagerImExporter, modname); if (pl) { AB_IMEXPORTER *ie; ie=AB_Plugin_ImExporter_Factory(pl, ab); if (!ie) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in plugin [%s]: No im/exporter created", modname); return NULL; } return ie; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Plugin [%s] not found", modname); return NULL; } } int AB_Banking_ExportWithProfile(AB_BANKING *ab, const char *exporterName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, GWEN_SYNCIO *sio) { AB_IMEXPORTER *exporter; GWEN_DB_NODE *dbProfiles; GWEN_DB_NODE *dbProfile; int rv; exporter=AB_Banking_GetImExporter(ab, exporterName); if (!exporter) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Export module \"%s\" not found", exporterName); return GWEN_ERROR_NOT_FOUND; } /* get profiles */ if (profileFile) { dbProfiles=GWEN_DB_Group_new("profiles"); if (GWEN_DB_ReadFile(dbProfiles, profileFile, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { DBG_ERROR(0, "Error reading profiles from \"%s\"", profileFile); return GWEN_ERROR_GENERIC; } } else { dbProfiles=AB_Banking_GetImExporterProfiles(ab, exporterName); } /* select profile */ dbProfile=GWEN_DB_GetFirstGroup(dbProfiles); while(dbProfile) { const char *name; name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0); assert(name); if (strcasecmp(name, profileName)==0) break; dbProfile=GWEN_DB_GetNextGroup(dbProfile); } if (!dbProfile) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile \"%s\" for exporter \"%s\" not found", profileName, exporterName); GWEN_DB_Group_free(dbProfiles); return GWEN_ERROR_NOT_FOUND; } rv=AB_ImExporter_Export(exporter, ctx, sio, dbProfile); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbProfiles); return rv; } GWEN_DB_Group_free(dbProfiles); return 0; } int AB_Banking_ImportWithProfile(AB_BANKING *ab, const char *importerName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, GWEN_SYNCIO *sio) { AB_IMEXPORTER *importer; GWEN_DB_NODE *dbProfiles; GWEN_DB_NODE *dbProfile; int rv; importer=AB_Banking_GetImExporter(ab, importerName); if (!importer) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Import module \"%s\" not found", importerName); return GWEN_ERROR_NOT_FOUND; } /* get profiles */ if (profileFile) { dbProfiles=GWEN_DB_Group_new("profiles"); if (GWEN_DB_ReadFile(dbProfiles, profileFile, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { DBG_ERROR(0, "Error reading profiles from \"%s\"", profileFile); return GWEN_ERROR_GENERIC; } } else { dbProfiles=AB_Banking_GetImExporterProfiles(ab, importerName); } /* select profile */ dbProfile=GWEN_DB_GetFirstGroup(dbProfiles); while(dbProfile) { const char *name; name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0); if (!name) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No element \"name\" found in group \"%s\" of file \"%s\" (watch out: --profileFile most probably does not work)", GWEN_DB_GroupName(dbProfile), profileFile); GWEN_DB_Group_free(dbProfiles); return GWEN_ERROR_NOT_FOUND; } assert(name); if (strcasecmp(name, profileName)==0) break; dbProfile=GWEN_DB_GetNextGroup(dbProfile); } if (!dbProfile) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile \"%s\" for importer \"%s\" not found", profileName, importerName); GWEN_DB_Group_free(dbProfiles); return GWEN_ERROR_NOT_FOUND; } rv=AB_ImExporter_Import(importer, ctx, sio, dbProfile); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbProfiles); return rv; } GWEN_DB_Group_free(dbProfiles); return 0; } int AB_Banking_ImportFileWithProfile(AB_BANKING *ab, const char *importerName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, const char *inputFileName) { GWEN_SYNCIO *sio; int rv; if (inputFileName) { sio=GWEN_SyncIo_File_new(inputFileName, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } } else { sio=GWEN_SyncIo_File_fromStdin(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } rv=AB_Banking_ImportWithProfile(ab, importerName, ctx, profileName, profileFile, sio); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } int AB_Banking_ExportToFileWithProfile(AB_BANKING *ab, const char *exporterName, AB_IMEXPORTER_CONTEXT *ctx, const char *profileName, const char *profileFile, const char *outputFileName) { GWEN_SYNCIO *sio; int rv; if (outputFileName) { sio=GWEN_SyncIo_File_new(outputFileName, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_free(sio); return rv; } } else { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE); } rv=AB_Banking_ExportWithProfile(ab, exporterName, ctx, profileName, profileFile, sio); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return 0; } GWEN_DB_NODE *AB_Banking_GetImExporterProfile(AB_BANKING *ab, const char *imExporterName, const char *profileName) { GWEN_DB_NODE *dbProfiles; dbProfiles=AB_Banking_GetImExporterProfiles(ab, imExporterName); if (dbProfiles) { GWEN_DB_NODE *dbProfile; dbProfile=GWEN_DB_GetFirstGroup(dbProfiles); while(dbProfile) { const char *name; name=GWEN_DB_GetCharValue(dbProfile, "name", 0, 0); assert(name); if (strcasecmp(name, profileName)==0) break; dbProfile=GWEN_DB_GetNextGroup(dbProfile); } if (!dbProfile) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile \"%s\" for exporter \"%s\" not found", profileName, imExporterName); GWEN_DB_Group_free(dbProfiles); return NULL; } GWEN_DB_UnlinkGroup(dbProfile); GWEN_DB_Group_free(dbProfiles); return dbProfile; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No profiles found for exporter \"%s\"", imExporterName); return NULL; } return NULL; } aqbanking-5.6.4beta/src/libs/aqbanking/provider.h0000644000175000017500000001142012364015477016723 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /** @file aqbanking/provider.h * @short This file is used by AqBanking and provider backends. */ #ifndef AQBANKING_PROVIDER_H #define AQBANKING_PROVIDER_H #include #include #include #include #include /* for AQBANKING_API */ #define AB_PROVIDER_FLAGS_COMPLETE_DAY_REPORTS 0x00000001 #ifdef __cplusplus extern "C" { #endif typedef struct AB_PROVIDER AB_PROVIDER; GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_PROVIDER, AQBANKING_API) typedef struct AB_PROVIDER_DESCRIPTION AB_PROVIDER_DESCRIPTION; GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_PROVIDER_DESCRIPTION, AQBANKING_API) GWEN_LIST_FUNCTION_LIB_DEFS(AB_PROVIDER_DESCRIPTION, AB_ProviderDescription, AQBANKING_API) GWEN_LIST2_FUNCTION_LIB_DEFS(AB_PROVIDER_DESCRIPTION, AB_ProviderDescription, AQBANKING_API) #ifdef __cplusplus } #endif #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_PROVIDER * * @brief This group represents backends. (Don't use in applications) * *

* (Provider is simply another word for backend.) *

* *

* Functions in this group MUST NEVER be used by applications or * depending libraries ! They may only be called by AqBanking or a provider * on its own. *

* *

* Writing an online banking provider for AqBanking is easy. There are only * a few callback functions which must be set by the provider (marked as * Virtual Functions below). *

* *

* The work of a provider is based on jobs (see @ref AB_JOB). * AqBanking also works based on jobs. If the application wants to create * a job AqBanking calls the function @ref AB_Provider_UpdateJob. This * function lets the provider prepare some parameters for the job given (e.g. * the maximum number of purpose lines for transfer jobs etc). These limits * are used by applications when preparing a job. *

*

* If the application is finished preparing the job it calls * @ref AB_Banking_EnqueueJob. After the application has enqueued all jobs * it calls @ref AB_Banking_ExecuteQueue. This function now sends all jobs * to their respective providers using @ref AB_Provider_AddJob. When all * jobs for a given provider are added AqBanking calls * @ref AB_Provider_Execute on this provider. This functions really sends the * jobs to the bank server or creates DTAUS discs or whatever the provider is * supposed to do. * After that AqBanking calls @ref AB_Provider_ResetQueue to make sure no job * is left in the providers queue after execution. *

*

* Another base class used between AqBanking and providers is @ref AB_ACCOUNT. * An account stores a reference to its associated provider. * When executing @ref AB_Banking_Init AqBanking calls the provider function * @ref AB_Provider_ExtendAccount on every account to let the backend * initialize the account. *

*

* It is the same with @ref AB_USER. *

*/ /*@{*/ /** * Returns the name of the backend (e.g. "aqhbci"). */ AQBANKING_API const char *AB_Provider_GetName(const AB_PROVIDER *pro); /** * Returns the escaped name of the backend. This is needed when using the * name of the backend to form a file path. */ AQBANKING_API const char *AB_Provider_GetEscapedName(const AB_PROVIDER *pro); /** * Returns the Banking object that this Provider belongs to. */ AQBANKING_API AB_BANKING *AB_Provider_GetBanking(const AB_PROVIDER *pro); AQBANKING_API uint32_t AB_Provider_GetFlags(const AB_PROVIDER *pro); /** * This copies the name of the folder for AqBanking's backend data into * the given GWEN_Buffer. This folder is reserved for this backend. * Please note that this folder does not necessarily exist, but the backend * is free to create it. * @return 0 if ok, error code otherwise (see @ref AB_ERROR) * @param pro pointer to the provider object * @param buf buffer to append the path name to */ AQBANKING_API int AB_Provider_GetUserDataDir(const AB_PROVIDER *pro, GWEN_BUFFER *buf); /*@}*/ /* defgroup */ #ifdef __cplusplus } #endif #endif /* AQBANKING_PROVIDER_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_p.h0000644000175000017500000001202212364015477017020 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_P_H #define AQBANKING_BANKING_P_H #define AB_BANKING_MAX_PIN_TRY 10 #define AB_BANKING_REGKEY_PATHS "Software\\AqBanking\\Paths" #define AB_BANKING_REGKEY_DATADIR "pkgdatadir" #define AB_BANKING_REGKEY_BANKINFODIR "bankinfodir" #define AB_BANKING_REGKEY_PROVIDERDIR "providerdir" #define AB_BANKING_REGKEY_IMPORTERDIR "importerdir" #define AB_BANKING_REGKEY_SYSCONFDIR "sysconfdir" #define AB_BANKING_REGKEY_WIZARDDIR "wizarddir" #define AB_BANKING_REGKEY_LOCALEDIR "localedir" #define AB_WIZARD_FOLDER "wizards" #ifdef OS_WIN32 # define AB_BANKING_USERDATADIR "aqbanking" #else # define AB_BANKING_USERDATADIR ".aqbanking" #endif /** * Name of the default configuration file within the users home folder. */ #define AB_BANKING_CONFIGFILE "settings.conf" #define AB_BANKING_OLD_CONFIGFILE ".aqbanking.conf" #define AB_CFG_GROUP_USERS "users" #define AB_CFG_GROUP_ACCOUNTS "accounts" #define AB_CFG_GROUP_MAIN "aqbanking" #define AB_CFG_GROUP_APPS "apps" #define AB_CFG_GROUP_SHARED "shared" #include "banking_l.h" #include "provider_l.h" #include "account_l.h" #include "job_l.h" #include "imexporter_l.h" #include "pin_l.h" #include "bankinfoplugin_l.h" #include "user_l.h" #include struct AB_BANKING { GWEN_INHERIT_ELEMENT(AB_BANKING) int initCount; int onlineInitCount; char *appName; char *appEscName; int appExtensions; uint32_t lastVersion; char *dataDir; AB_USER_LIST *users; AB_ACCOUNT_LIST *accounts; GWEN_STRINGLIST *activeProviders; char *startFolder; GWEN_DB_NODE *dbProfiles; AB_PROVIDER_LIST *providers; void *user_data; AB_JOB_LIST2 *currentJobs; GWEN_CRYPT_TOKEN_LIST2 *cryptTokenList; GWEN_CONFIGMGR *configMgr; }; static int AB_Banking__GetConfigManager(AB_BANKING *ab, const char *dname); static AB_PROVIDER *AB_Banking_FindProvider(AB_BANKING *ab, const char *name); static AB_IMEXPORTER *AB_Banking_FindImExporter(AB_BANKING *ab, const char *name); static AB_PROVIDER *AB_Banking__LoadProviderPlugin(AB_BANKING *ab, const char *modname); static AB_IMEXPORTER *AB_Banking__LoadImExporterPlugin(AB_BANKING *ab, const char *modname); static AB_BANKINFO_PLUGIN* AB_Banking__LoadBankInfoPlugin(AB_BANKING *ab, const char *modname); static AB_BANKINFO_PLUGIN *AB_Banking__GetBankInfoPlugin(AB_BANKING *ab, const char *country); static int AB_Banking__ReadImExporterProfiles(AB_BANKING *ab, const char *path, GWEN_DB_NODE *db, int isGlobal); static int AB_Banking_InitProvider(AB_BANKING *ab, AB_PROVIDER *pro); static int AB_Banking_FiniProvider(AB_BANKING *ab, AB_PROVIDER *pro); static int AB_Banking__ExecuteQueue(AB_BANKING *ab, AB_JOB_LIST2 *jl2, AB_IMEXPORTER_CONTEXT *ctx); static AB_ACCOUNT *AB_Banking__GetAccount(AB_BANKING *ab, const char *accountId); static int AB_Banking__GetDebuggerPath(AB_BANKING *ab, const char *backend, GWEN_BUFFER *pbuf); static int AB_Banking__TransformIban(const char *iban, int len, char *newIban, int maxLen); static uint64_t AB_Banking__char2uint64(const char *accountId); static void AB_Banking_ActivateAllProviders(AB_BANKING *ab); static void AB_Banking__fillTransactionRemoteInfo(AB_TRANSACTION *t); static void AB_Banking__fillTransactionRemoteSepaInfo(AB_BANKING *ab, AB_TRANSACTION *t); static int AB_Banking_LoadAllUsers(AB_BANKING *ab); static int AB_Banking_LoadAllAccounts(AB_BANKING *ab); static int AB_Banking_LoadConfig(AB_BANKING *ab); static int AB_Banking_UnloadConfig(AB_BANKING *ab); static int AB_Banking_SaveConfig(AB_BANKING *ab); /* only for import of older configurations */ static int AB_Banking_SetUniqueId(AB_BANKING *ab, uint32_t uid); static int AB_Banking__ImportConfDir(AB_BANKING *ab, const char *path, const char *groupName); /** * Write the settings of the user while in exclusive use. This is also called * internally by @ref AB_Banking_EndExclUseUser. * Please note that the user must be locked with @ref AB_Banking_BeginExclUseUser. */ static int AB_Banking_SaveUser(AB_BANKING *ab, AB_USER *u); #endif /* AQBANKING_BANKING_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/provider_p.h0000644000175000017500000000350112364015477017243 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_PROVIDER_P_H #define AQBANKING_PROVIDER_P_H #include "provider_l.h" #include #include #include #include #include struct AB_PROVIDER { GWEN_INHERIT_ELEMENT(AB_PROVIDER) GWEN_LIST_ELEMENT(AB_PROVIDER) AB_BANKING *banking; char *name; char *escName; AB_PROVIDER_INIT_FN initFn; AB_PROVIDER_FINI_FN finiFn; AB_PROVIDER_UPDATEJOB_FN updateJobFn; AB_PROVIDER_ADDJOB_FN addJobFn; AB_PROVIDER_EXECUTE_FN executeFn; AB_PROVIDER_RESETQUEUE_FN resetQueueFn; AB_PROVIDER_EXTEND_USER_FN extendUserFn; AB_PROVIDER_EXTEND_ACCOUNT_FN extendAccountFn; AB_PROVIDER_UPDATE_FN updateFn; AB_PROVIDER_GET_NEWUSER_DIALOG_FN getNewUserDialogFn; AB_PROVIDER_GET_EDITUSER_DIALOG_FN getEditUserDialogFn; AB_PROVIDER_GET_NEWACCOUNT_DIALOG_FN getNewAccountDialogFn; AB_PROVIDER_GET_EDITACCOUNT_DIALOG_FN getEditAccountDialogFn; AB_PROVIDER_GET_USERTYPE_DIALOG_FN getUserTypeDialogFn; GWEN_PLUGIN *plugin; uint32_t usage; uint32_t flags; int isInit; }; typedef struct AB_PLUGIN_PROVIDER AB_PLUGIN_PROVIDER; struct AB_PLUGIN_PROVIDER { AB_PLUGIN_PROVIDER_FACTORY_FN pluginFactoryFn; }; static void GWENHYWFAR_CB AB_Plugin_Provider_FreeData(void *bp, void *p); #endif /* AQBANKING_PROVIDER_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/testlib.c0000644000175000017500000001451112416502277016533 00000000000000 #ifdef HAVE_CONFIG_H # include #endif #include "banking.h" #include "types/value.h" #include #include void dumpNumDenom(const char *t, const AB_VALUE *v) { char numbuf[256]; if (!AB_Value_GetNumDenomString(v, numbuf, sizeof(numbuf))) { fprintf(stderr, "%s (num/den): %s\n", t, numbuf); } else { fprintf(stderr, "%s (num/den): Error\n", t); } } int test1(int argc, char **argv) { AB_VALUE *v1; AB_VALUE *v2; AB_VALUE *v3; AB_VALUE *v4; int rv; v1=AB_Value_fromString("987654321.12345"); if (v1==NULL) { fprintf(stderr, "ERROR: v1\n"); return 1; } fprintf(stderr, "v1 : %f\n", AB_Value_GetValueAsDouble(v1)); dumpNumDenom("v1", v1); v2=AB_Value_fromString("10/1"); if (v2==NULL) { fprintf(stderr, "ERROR: v2\n"); return 1; } fprintf(stderr, "v2 : %f\n", AB_Value_GetValueAsDouble(v2)); dumpNumDenom("v2", v2); v3=AB_Value_dup(v1); if (v3==NULL) { fprintf(stderr, "ERROR: v3\n"); return 1; } fprintf(stderr, "v3 : %f\n", AB_Value_GetValueAsDouble(v3)); dumpNumDenom("v3", v3); v4=AB_Value_fromString("-1250,"); if (v4==NULL) { fprintf(stderr, "ERROR: v4\n"); return 1; } fprintf(stderr, "v4 : %f\n", AB_Value_GetValueAsDouble(v4)); dumpNumDenom("v4", v4); rv=AB_Value_MultValue(v3, v2); if (rv) { fprintf(stderr, "ERROR: v3*v2\n"); return 1; } fprintf(stderr, "r : %f\n", AB_Value_GetValueAsDouble(v3)); dumpNumDenom("r ", v3); if (AB_Value_GetValueAsDouble(v3)!=9876543211.2345) { fprintf(stderr, "Bad result : %f\n", AB_Value_GetValueAsDouble(v3)); return 1; } dumpNumDenom("v3", v3); fprintf(stderr, "Ok.\n"); return 0; } int test2(int argc, char **argv) { int rv; AB_BANKING *ab; GWEN_GUI *gui; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("testlib", NULL, 0); rv=AB_Banking_HasConf4(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 4 found\n"); return 0; } fprintf(stderr, "Config for AqBanking 4 not found (%d)\n", rv); rv=AB_Banking_HasConf3(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 3 found\n"); return 0; } fprintf(stderr, "Config for AqBanking 3 not found (%d)\n", rv); rv=AB_Banking_HasConf2(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 2 found\n"); return 0; } fprintf(stderr, "Config for AqBanking 2 not found (%d)\n", rv); return 0; } int test3(int argc, char **argv) { int rv; AB_BANKING *ab; GWEN_GUI *gui; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("testlib", NULL, 0); rv=AB_Banking_HasConf4(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 4 found\n"); return 0; } fprintf(stderr, "Config for AqBanking 4 not found (%d)\n", rv); rv=AB_Banking_HasConf3(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 3 found, importing\n"); rv=AB_Banking_ImportConf3(ab); if (rv<0) { fprintf(stderr, "Error importing configuration (%d)\n", rv); return 2; } return 0; } fprintf(stderr, "Config for AqBanking 3 not found (%d)\n", rv); rv=AB_Banking_HasConf2(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 2 found, importing\n"); rv=AB_Banking_ImportConf3(ab); if (rv<0) { fprintf(stderr, "Error importing configuration (%d)\n", rv); return 2; } return 0; } fprintf(stderr, "Config for AqBanking 2 not found (%d)\n", rv); return 0; } int test4(int argc, char **argv) { int rv; // AB_BANKING *ab; GWEN_GUI *gui; GWEN_BUFFER *tbuf; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); // ab=AB_Banking_new("testlib", NULL, 0); if (argc<3) { fprintf(stderr, "Missing bank code and account number\n"); return 1; } tbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=AB_Banking_MakeGermanIban(argv[1], argv[2], tbuf); if (rv<0) { fprintf(stderr, "ERROR: %d\n", rv); return 2; } rv=AB_Banking_CheckIban(GWEN_Buffer_GetStart(tbuf)); if (rv != 0) { fprintf(stderr, "Bad IBAN (%s)\n", GWEN_Buffer_GetStart(tbuf)); return 2; } fprintf(stderr, "Verified IBAN: %s\n", GWEN_Buffer_GetStart(tbuf)); return 0; } int test5(int argc, char **argv) { AB_VALUE *v1; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); v1=AB_Value_fromString("11,90"); if (v1==NULL) { fprintf(stderr, "ERROR: v1\n"); return 1; } AB_Value_toHbciString(v1, tbuf); if (strcmp(GWEN_Buffer_GetStart(tbuf), "11,9")!=0) { fprintf(stderr, "ERROR: Bad HBCI string (%s)\n", GWEN_Buffer_GetStart(tbuf)); return 2; } GWEN_Buffer_free(tbuf); AB_Value_free(v1); tbuf=GWEN_Buffer_new(0, 256, 0, 1); v1=AB_Value_fromString("11,91"); if (v1==NULL) { fprintf(stderr, "ERROR: v1\n"); return 1; } AB_Value_toHbciString(v1, tbuf); if (strcmp(GWEN_Buffer_GetStart(tbuf), "11,91")!=0) { fprintf(stderr, "ERROR: Bad HBCI string (%s)\n", GWEN_Buffer_GetStart(tbuf)); return 2; } GWEN_Buffer_free(tbuf); AB_Value_free(v1); tbuf=GWEN_Buffer_new(0, 256, 0, 1); v1=AB_Value_fromString("1190"); if (v1==NULL) { fprintf(stderr, "ERROR: v1\n"); return 1; } AB_Value_toHbciString(v1, tbuf); if (strcmp(GWEN_Buffer_GetStart(tbuf), "1190,")!=0) { fprintf(stderr, "ERROR: Bad HBCI string (%s)\n", GWEN_Buffer_GetStart(tbuf)); return 2; } GWEN_Buffer_free(tbuf); AB_Value_free(v1); tbuf=GWEN_Buffer_new(0, 256, 0, 1); v1=AB_Value_fromString("11,00"); if (v1==NULL) { fprintf(stderr, "ERROR: v1\n"); return 1; } AB_Value_toHbciString(v1, tbuf); if (strcmp(GWEN_Buffer_GetStart(tbuf), "11,")!=0) { fprintf(stderr, "ERROR: Bad HBCI string (%s)\n", GWEN_Buffer_GetStart(tbuf)); return 2; } GWEN_Buffer_free(tbuf); AB_Value_free(v1); fprintf(stderr, "Ok.\n"); return 0; } int main(int argc, char *argv[]){ #if 1 return test5(argc, argv); #else AB_BANKING *ab; ab=AB_Banking_new("testlib", "testname", AB_BANKING_EXTENSION_NONE); AB_Banking_free(ab); return 0; #endif } aqbanking-5.6.4beta/src/libs/aqbanking/banking_cfg.c0000644000175000017500000007631412364015477017331 00000000000000/*************************************************************************** begin : Sat Sep 27 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ int AB_Banking__GetConfigManager(AB_BANKING *ab, const char *dname) { GWEN_BUFFER *buf; char home[256]; if (GWEN_Directory_GetHomeDirectory(home, sizeof(home))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not determine home directory, aborting."); abort(); } buf=GWEN_Buffer_new(0, 256, 0, 1); if (dname) { /* setup data dir */ ab->dataDir=strdup(dname); /* determine config manager URL */ GWEN_Buffer_AppendString(buf, "dir://"); GWEN_Buffer_AppendString(buf, dname); GWEN_Buffer_AppendString(buf, DIRSEP); GWEN_Buffer_AppendString(buf, "settings"); } else { const char *s; uint32_t pos; GWEN_Buffer_AppendString(buf, "dir://"); pos=GWEN_Buffer_GetPos(buf); /* determine config directory */ s=getenv("AQBANKING_HOME"); if (s && !*s) s=0; if (s) GWEN_Buffer_AppendString(buf, s); else { /* use default */ GWEN_Buffer_AppendString(buf, home); GWEN_Buffer_AppendString(buf, DIRSEP); GWEN_Buffer_AppendString(buf, AB_BANKING_USERDATADIR); } /* as we are at it: store default data dir */ ab->dataDir=strdup(GWEN_Buffer_GetStart(buf)+pos); /* continue with settings folder */ GWEN_Buffer_AppendString(buf, DIRSEP); GWEN_Buffer_AppendString(buf, "settings"); } DBG_INFO(AQBANKING_LOGDOMAIN, "Using data folder [%s]", ab->dataDir); DBG_INFO(AQBANKING_LOGDOMAIN, "Using ConfigManager [%s]", GWEN_Buffer_GetStart(buf)); ab->configMgr=GWEN_ConfigMgr_Factory(GWEN_Buffer_GetStart(buf)); if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create ConfigMgr[%s]. " "Maybe the gwenhywfar plugins are not installed?", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return GWEN_ERROR_GENERIC; } /* done */ GWEN_Buffer_free(buf); return 0; } int AB_Banking_HasConf4(AB_BANKING *ab) { int rv; GWEN_DB_NODE *db=NULL; int backends=0; int users=0; int accounts=0; GWEN_STRINGLIST *sl; /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager. Maybe the gwenhywfar plugins are not installed correctly?"); return GWEN_ERROR_GENERIC; } /* load main group, check version */ rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config", &db); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not load main config group (%d)", rv); return rv; } GWEN_DB_Group_free(db); sl=GWEN_StringList_new(); /* count backends */ rv=GWEN_ConfigMgr_ListSubGroups(ab->configMgr, AB_CFG_GROUP_BACKENDS, sl); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not list backend groups (%d)", rv); GWEN_StringList_free(sl); return rv; } backends=GWEN_StringList_Count(sl); GWEN_StringList_Clear(sl); /* count users */ rv=GWEN_ConfigMgr_ListSubGroups(ab->configMgr, AB_CFG_GROUP_USERS, sl); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not list user groups (%d)", rv); GWEN_StringList_free(sl); return rv; } users=GWEN_StringList_Count(sl); GWEN_StringList_Clear(sl); /* count accounts */ rv=GWEN_ConfigMgr_ListSubGroups(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, sl); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not list account groups (%d)", rv); GWEN_StringList_free(sl); return rv; } accounts=GWEN_StringList_Count(sl); GWEN_StringList_free(sl); if (users) return 0; if (backends || accounts) return GWEN_ERROR_PARTIAL; return GWEN_ERROR_NO_DATA; } int AB_Banking_LoadAppConfig(AB_BANKING *ab, GWEN_DB_NODE **pDb) { assert(ab); assert(ab->appName); if (ab->appName) { int rv; rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_APPS, ab->appName, pDb); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load app group [%s] (%d)", ab->appName, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No application name"); return GWEN_ERROR_GENERIC; } } int AB_Banking_SaveAppConfig(AB_BANKING *ab, GWEN_DB_NODE *db) { assert(ab); assert(ab->appName); if (ab->appName) { int rv; rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_APPS, ab->appName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save app group [%s] (%d)", ab->appName, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No application name"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LockAppConfig(AB_BANKING *ab) { assert(ab); assert(ab->appName); if (ab->appName) { int rv; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_APPS, ab->appName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not lock app group [%s] (%d)", ab->appName, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No application name"); return GWEN_ERROR_GENERIC; } } int AB_Banking_UnlockAppConfig(AB_BANKING *ab) { assert(ab); assert(ab->appName); if (ab->appName) { int rv; rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_APPS, ab->appName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock app group [%s] (%d)", ab->appName, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No application name"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LoadSharedConfig(AB_BANKING *ab, const char *name, GWEN_DB_NODE **pDb) { assert(ab); assert(name); if (name) { int rv; rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_SHARED, name, pDb); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load shared group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of shared group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_SaveSharedConfig(AB_BANKING *ab, const char *name, GWEN_DB_NODE *db) { assert(ab); assert(name); if (name) { int rv; rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_SHARED, name, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save shared group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of shared group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LockSharedConfig(AB_BANKING *ab, const char *name) { assert(ab); assert(name); if (name) { int rv; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_SHARED, name); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not lock shared group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of shared group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_UnlockSharedConfig(AB_BANKING *ab, const char *name) { assert(ab); assert(name); if (name) { int rv; rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_SHARED, name); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock shared group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of shared group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LoadPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name, GWEN_DB_NODE **pDb) { assert(ab); assert(pluginName); assert(name); if (pluginName && name) { int rv; rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, pluginName, name, pDb); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load plugin group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of plugin group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_SavePluginConfig(AB_BANKING *ab, const char *pluginName, const char *name, GWEN_DB_NODE *db) { assert(ab); assert(pluginName); assert(name); if (pluginName && name) { int rv; rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, pluginName, name, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save plugin group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of plugin group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LockPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name) { assert(ab); assert(pluginName); assert(name); if (pluginName && name) { int rv; /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager. Maybe the gwenhywfar plugins are not installed correctly?"); return GWEN_ERROR_GENERIC; } rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, pluginName, name); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not lock plugin group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of plugin group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_UnlockPluginConfig(AB_BANKING *ab, const char *pluginName, const char *name) { assert(ab); assert(pluginName); assert(name); if (pluginName && name) { int rv; rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, pluginName, name); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock plugin group [%s] (%d)", name, rv); return rv; } return 0; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Name of plugin group missing"); return GWEN_ERROR_GENERIC; } } int AB_Banking_LoadAllUsers(AB_BANKING *ab) { GWEN_STRINGLIST *sl; int rv; sl=GWEN_StringList_new(); rv=GWEN_ConfigMgr_ListSubGroups(ab->configMgr, AB_CFG_GROUP_USERS, sl); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_StringList_free(sl); return rv; } if (GWEN_StringList_Count(sl)) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *t; GWEN_DB_NODE *db=NULL; t=GWEN_StringListEntry_Data(se); assert(t); rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_USERS, t, &db); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not load user group [%s] (%d), ignoring", t, rv); } else { AB_USER *u=NULL; uint32_t uid; assert(db); uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid) u=AB_Banking_GetUser(ab, uid); if (u) { /* user already exists, reload existing user */ const char *s; AB_PROVIDER *pro=NULL; DBG_INFO(AQBANKING_LOGDOMAIN, "Loading established user [%08x]", (unsigned int) uid); AB_User_SetDbId(u, t); s=AB_User_GetBackendName(u); if (s && *s) pro=AB_Banking_GetProvider(ab, s); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Provider \"%s\" not found, ignoring user [%s]", s?s:"(null)", AB_User_GetUserId(u)); } else { int rv; GWEN_DB_NODE *dbP; /* reload user from DB */ AB_User_ReadDb(u, db); /* let provider also reload user data */ dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendUser(pro, u, AB_ProviderExtendMode_Reload, dbP); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not extend user [%s] (%d)", AB_User_GetUserId(u), rv); } } } else { /* user is new, load and add it */ DBG_INFO(AQBANKING_LOGDOMAIN, "Loading new user [%08x]", (unsigned int) uid); u=AB_User_fromDb(ab, db); if (u) { const char *s; AB_PROVIDER *pro=NULL; AB_User_SetDbId(u, t); s=AB_User_GetBackendName(u); if (s && *s) pro=AB_Banking_GetProvider(ab, s); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Provider \"%s\" not found, ignoring user [%s]", s, AB_User_GetUserId(u)); } else { int rv; GWEN_DB_NODE *dbP; dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendUser(pro, u, AB_ProviderExtendMode_Extend, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); AB_User_free(u); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding user"); AB_User_List_Add(u, ab->users); } } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not load user from DB"); } } GWEN_DB_Group_free(db); } se=GWEN_StringListEntry_Next(se); } } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No users"); } GWEN_StringList_free(sl); return 0; } int AB_Banking_LoadAllAccounts(AB_BANKING *ab) { GWEN_STRINGLIST *sl; int rv; sl=GWEN_StringList_new(); rv=GWEN_ConfigMgr_ListSubGroups(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, sl); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_StringList_free(sl); return rv; } if (GWEN_StringList_Count(sl)) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *t; GWEN_DB_NODE *db=NULL; t=GWEN_StringListEntry_Data(se); assert(t); rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, t, &db); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not load account group [%s] (%d), ignoring", t, rv); } else { AB_ACCOUNT *a=NULL; uint32_t uid; assert(db); uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid) a=AB_Banking_GetAccount(ab, uid); if (a) { /* account already exists, reload existing account */ const char *s; AB_PROVIDER *pro; AB_Account_SetDbId(a, t); s=AB_Account_GetBackendName(a); assert(s && *s); pro=AB_Banking_GetProvider(ab, s); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Provider \"%s\" not found, ignoring account [%s/%s]", s, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); } else { int rv; GWEN_DB_NODE *dbP; /* reload account from DB */ AB_Account_ReadDb(a, db); /* let provider also reload account data */ dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(pro, a, AB_ProviderExtendMode_Reload, dbP); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not extend account [%s/%s] (%d)", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); } } } else { /* account is new, load and add it */ a=AB_Account_fromDb(ab, db); if (a) { const char *s; AB_PROVIDER *pro; AB_Account_SetDbId(a, t); s=AB_Account_GetBackendName(a); assert(s && *s); pro=AB_Banking_GetProvider(ab, s); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Provider \"%s\" not found, ignoring account [%s/%s]", s, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a)); } else { int rv; GWEN_DB_NODE *dbP; dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(pro, a, AB_ProviderExtendMode_Extend, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); AB_Account_free(a); } else { DBG_DEBUG(AQBANKING_LOGDOMAIN, "Adding account"); AB_Account_List_Add(a, ab->accounts); } } } } GWEN_DB_Group_free(db); } se=GWEN_StringListEntry_Next(se); } } GWEN_StringList_free(sl); return 0; } int AB_Banking_LoadConfig(AB_BANKING *ab) { int rv; GWEN_DB_NODE *db=NULL; /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager. Maybe the gwenhywfar plugins are not installed correctly?"); return GWEN_ERROR_GENERIC; } /* load main group, check version */ rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config", &db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load main config group (%d)", rv); return rv; } ab->lastVersion=GWEN_DB_GetIntValue(db, "lastVersion", 0, 0); GWEN_DB_Group_free(db); if (ab->lastVersion==0) { /* first start */ ab->lastVersion= (AQBANKING_VERSION_MAJOR<<24) | (AQBANKING_VERSION_MINOR<<16) | (AQBANKING_VERSION_PATCHLEVEL<<8) | AQBANKING_VERSION_BUILD; } /* init all providers */ AB_Banking_ActivateAllProviders(ab); /* load all users */ rv=AB_Banking_LoadAllUsers(ab); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } /* load all accounts */ rv=AB_Banking_LoadAllAccounts(ab); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } /* update active providers if necessary */ if (AB_Provider_List_GetCount(ab->providers) && ab->lastVersion < ((AQBANKING_VERSION_MAJOR<<24) | (AQBANKING_VERSION_MINOR<<16) | (AQBANKING_VERSION_PATCHLEVEL<<8) | AQBANKING_VERSION_BUILD)) { AB_PROVIDER *pro; pro=AB_Provider_List_First(ab->providers); while(pro) { int rv; rv=AB_Provider_Update(pro, ab->lastVersion, ((AQBANKING_VERSION_MAJOR<<24) | (AQBANKING_VERSION_MINOR<<16) | (AQBANKING_VERSION_PATCHLEVEL<<8) | AQBANKING_VERSION_BUILD)); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not update provider \"%s\"", AB_Provider_GetName(pro)); return rv; } pro=AB_Provider_List_Next(pro); } /* while */ } /* done */ return 0; } int AB_Banking_UnloadConfig(AB_BANKING *ab) { AB_PROVIDER *pro; int rv; assert(ab); /* clear all active crypt token */ AB_Banking_ClearCryptTokenList(ab); AB_Account_List_Clear(ab->accounts); AB_User_List_Clear(ab->users); /* deinit all providers */ pro=AB_Provider_List_First(ab->providers); while(pro) { while (AB_Provider_IsInit(pro)) { rv=AB_Banking_FiniProvider(ab, pro); if (rv) { DBG_WARN(AQBANKING_LOGDOMAIN, "Error deinitializing backend \"%s\"", AB_Provider_GetName(pro)); break; } } pro=AB_Provider_List_Next(pro); } /* while */ AB_Provider_List_Clear(ab->providers); return 0; } int AB_Banking_SaveConfig(AB_BANKING *ab) { GWEN_DB_NODE *db=NULL; int rv; assert(ab); /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager (maybe the gwenhywfar plugins are not installed?"); return GWEN_ERROR_GENERIC; } /* lock group */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock main config group (%d)", rv); return rv; } /* load group (is locked now) */ rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config", &db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load main config group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); return rv; } /* modify group */ GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", (AQBANKING_VERSION_MAJOR<<24) | (AQBANKING_VERSION_MINOR<<16) | (AQBANKING_VERSION_PATCHLEVEL<<8) | AQBANKING_VERSION_BUILD); /* save group (still locked) */ rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config", db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save main config group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); GWEN_DB_Group_free(db); return rv; } /* unlock group */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock main config group (%d)", rv); GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); return 0; } int AB_Banking_GetUserDataDir(const AB_BANKING *ab, GWEN_BUFFER *buf){ if (ab->dataDir) { GWEN_Buffer_AppendString(buf, ab->dataDir); return 0; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No data dir (not init?)"); return GWEN_ERROR_GENERIC; } } int AB_Banking_GetSharedDataDir(const AB_BANKING *ab, const char *name, GWEN_BUFFER *buf){ assert(ab); if (ab->dataDir) { GWEN_Buffer_AppendString(buf, ab->dataDir); GWEN_Buffer_AppendString(buf, DIRSEP "shared" DIRSEP); if (GWEN_Text_EscapeToBufferTolerant(name, buf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad share name, aborting."); abort(); } else { char *s; s=GWEN_Buffer_GetStart(buf); while(*s) { *s=tolower(*s); s++; } } return 0; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No data dir (not init?)"); return GWEN_ERROR_GENERIC; } } int AB_Banking_GetAppUserDataDir(const AB_BANKING *ab, GWEN_BUFFER *buf){ int rv; assert(ab->appEscName); rv=AB_Banking_GetUserDataDir(ab, buf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } GWEN_Buffer_AppendString(buf, DIRSEP "apps" DIRSEP); GWEN_Buffer_AppendString(buf, ab->appEscName); GWEN_Buffer_AppendString(buf, DIRSEP "data"); return 0; } int AB_Banking_GetProviderUserDataDir(const AB_BANKING *ab, const char *name, GWEN_BUFFER *buf){ int rv; rv=AB_Banking_GetUserDataDir(ab, buf); if (rv) return rv; GWEN_Buffer_AppendString(buf, DIRSEP "backends" DIRSEP); GWEN_Buffer_AppendString(buf, name); GWEN_Buffer_AppendString(buf, DIRSEP "data"); return 0; } int AB_Banking_BeginExclUseAccount(AB_BANKING *ab, AB_ACCOUNT *a) { GWEN_DB_NODE *db=NULL; GWEN_DB_NODE *dbP; int rv; assert(ab); /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager (maybe the gwenhywfar plugins are not installed?"); return GWEN_ERROR_GENERIC; } /* lock group */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config group (%d)", rv); return rv; } /* load group (is locked now) */ rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a), &db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load account group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); return rv; } AB_Account_ReadDb(a, db); /* let provider also reload account data */ dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Reload, dbP); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not extend account [%s/%s] (%d)", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); return 0; } int AB_Banking_EndExclUseAccount(AB_BANKING *ab, AB_ACCOUNT *a, int abandon) { int rv; if (!abandon) { GWEN_DB_NODE *db=GWEN_DB_Group_new("account"); GWEN_DB_NODE *dbP; AB_Account_toDb(a, db); dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Save, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } /* save group (still locked) */ rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a), db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save account group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); } /* unlock group */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock account group (%d)", rv); return rv; } return 0; } int AB_Banking_BeginExclUseUser(AB_BANKING *ab, AB_USER *u) { GWEN_DB_NODE *db=NULL; GWEN_DB_NODE *dbP; int rv; assert(ab); /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager (maybe the gwenhywfar plugins are not installed?"); return GWEN_ERROR_GENERIC; } /* lock group */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config group (%d)", rv); return rv; } /* load group (is locked now) */ rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u), &db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not load account group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); return rv; } /* reload user from DB */ AB_User_ReadDb(u, db); dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); AB_User_toDb(u, db); rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Reload, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); return 0; } int AB_Banking_SaveUser(AB_BANKING *ab, AB_USER *u) { GWEN_DB_NODE *db; GWEN_DB_NODE *dbP; int rv; db=GWEN_DB_Group_new("user"); AB_User_toDb(u, db); dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Save, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } /* save group (still locked) */ rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u), db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save user group (%d)", rv); GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); return 0; } int AB_Banking_EndExclUseUser(AB_BANKING *ab, AB_USER *u, int abandon) { int rv; if (!abandon) { /* save group (still locked) */ rv=AB_Banking_SaveUser(ab, u); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save user group (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); return rv; } } /* unlock group */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock user group (%d)", rv); return rv; } return 0; } int AB_Banking_SaveAccountConfig(AB_BANKING *ab, AB_ACCOUNT *a, int doLock) { GWEN_DB_NODE *db; GWEN_DB_NODE *dbP; int rv; assert(ab); /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager (maybe the gwenhywfar plugins are not installed?"); return GWEN_ERROR_GENERIC; } if (doLock) { /* lock group */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config group (%d)", rv); return rv; } } db=GWEN_DB_Group_new("account"); AB_Account_toDb(a, db); /* let backend save its data */ dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendAccount(AB_Account_GetProvider(a), a, AB_ProviderExtendMode_Save, dbP); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not extend account [%s/%s] (%d)", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); GWEN_DB_Group_free(db); if (doLock) GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); return rv; } /* save group (still locked) */ rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a), db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save account group (%d)", rv); if (doLock) { GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); } GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); if (doLock) { /* unlock group */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, AB_Account_GetDbId(a)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock account group (%d)", rv); return rv; } } return 0; } int AB_Banking_SaveUserConfig(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DB_NODE *db; GWEN_DB_NODE *dbP; int rv; assert(ab); /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager (maybe the gwenhywfar plugins are not installed?"); return GWEN_ERROR_GENERIC; } if (doLock) { /* lock group */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock user config group (%d)", rv); return rv; } } db=GWEN_DB_Group_new("user"); AB_User_toDb(u, db); /* let the backend save its data */ dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Save, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); if (doLock) { GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); } return rv; } /* save group (still locked) */ rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u), db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not save user group (%d)", rv); if (doLock) { GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); } GWEN_DB_Group_free(db); return rv; } GWEN_DB_Group_free(db); if (doLock) { /* unlock group */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, AB_User_GetDbId(u)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not unlock user group (%d)", rv); return rv; } } return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/Makefile.am0000644000175000017500000000507412364015477016764 00000000000000SUBDIRS=types jobs gui dialogs backendsupport typemaker2 INCLUDES = \ -I$(aqbanking_symlinkdir) \ -I$(srcdir)/types -I$(srcdir)/jobs $(gwenhywfar_includes) lib_LTLIBRARIES=libaqbanking.la AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ EXTRA_DIST=\ banking_account.c \ banking_cfg.c \ banking_deprec.c \ banking_init.c \ banking_online.c \ banking_user.c \ banking_imex.c # We define those here because within the configure script the variables # $(datadir) et al are not available. DEFS += \ -DEXEEXT=\"$(EXEEXT)\" \ -DLOCALEDIR=\"@aqbanking_locale_searchdir@\" \ -DAQBANKING_PLUGINS=\"$(aqbanking_plugin_searchdir)\" \ -DAQBANKING_SYSCONF_DIR=\"$(aqbanking_cfg_searchdir)\" \ -DAQBANKING_DATA_DIR=\"$(aqbanking_data_searchdir)\" \ -DCOMPILE_DATETIME=\"@DATETIME@\" noinst_HEADERS=\ account_l.h \ account_p.h \ banking_l.h \ banking_p.h \ bankinfoplugin_l.h \ bankinfoplugin_p.h \ country_l.h \ country_p.h \ i18n_l.h \ imexporter_l.h \ imexporter_p.h \ job_l.h \ job_p.h \ provider_l.h \ provider_p.h \ msgengine_p.h \ httpsession_p.h iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=\ account.h \ account_be.h \ banking.h \ banking_be.h \ banking_cfg.h \ banking_imex.h \ banking_info.h \ banking_ob.h \ banking_simple.h \ banking_virt.h \ bankinfoplugin.h \ bankinfoplugin_be.h \ country.h \ error.h \ imexporter.h \ imexporter_be.h \ job.h \ job_be.h \ provider.h \ provider_be.h\ msgengine.h \ httpsession.h libaqbanking_la_SOURCES=\ account.c \ bankinfoplugin.c \ banking.c \ country.c \ imexporter.c \ job.c \ provider.c \ msgengine.c \ httpsession.c libaqbanking_la_LIBADD= $(gwenhywfar_libs) $(gmp_libs) $(i18n_libs) \ backendsupport/libabbesupport.la \ jobs/libjobs.la \ types/libtypes.la \ gui/libabgui.la \ dialogs/libabdialogs.la libaqbanking_la_LDFLAGS = -no-undefined \ -version-info @AQBANKING_SO_CURRENT@:@AQBANKING_SO_REVISION@:@AQBANKING_SO_AGE@ sources: for f in $(libaqbanking_la_SOURCES) $(EXTRA_DIST); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in backendsupport ; do \ $(MAKE) -C $$d built_sources; \ done ; # Build and link a test program to verify the linker flags noinst_PROGRAMS = testlib ab_value_test testlib_SOURCES = testlib.c testlib_LDADD = libaqbanking.la $(gwenhywfar_libs) # Another test program to verify the parsing of decimal numbers ab_value_test_SOURCES = ab-value-test.c ab_value_test_LDADD = libaqbanking.la $(gwenhywfar_libs) TESTS = testlib ab_value_test aqbanking-5.6.4beta/src/libs/aqbanking/account.h0000644000175000017500000001275012364015477016534 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCOUNT_H #define AQBANKING_ACCOUNT_H #include #include #include #include #include #include #include /* for AQBANKING_API */ /** @addtogroup G_AB_ACCOUNT Accounts * * @brief This group represents accounts. * * Accounts are only created by AB_PROVIDERs, not by the application. * * Please note: Changing any of the attributes of an account permanently requires * calling @ref AB_Banking_BeginExclUseAccount() before the modifications * and @ref AB_Banking_EndExclUseAccount() afterwards. * This locking makes sure that concurrent access to the settings doesn't corrupt * the configuration database. */ /*@{*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_ACCOUNT AB_ACCOUNT; GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_ACCOUNT, AQBANKING_API) GWEN_LIST2_FUNCTION_LIB_DEFS(AB_ACCOUNT, AB_Account, AQBANKING_API) /* Do not terminate these lines with semicolon because they are macros, not functions, and ISO C89 does not allow a semicolon there. */ AQBANKING_API void AB_Account_List2_FreeAll(AB_ACCOUNT_LIST2 *al); AQBANKING_API AB_ACCOUNT *AB_Account_List2_GetAccountByUniqueId(const AB_ACCOUNT_LIST2 *al, uint32_t aid); typedef enum { AB_AccountType_Unknown=0, AB_AccountType_Bank, AB_AccountType_CreditCard, AB_AccountType_Checking, AB_AccountType_Savings, AB_AccountType_Investment, AB_AccountType_Cash, AB_AccountType_MoneyMarket } AB_ACCOUNT_TYPE; #ifdef __cplusplus } #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API void AB_Account_free(AB_ACCOUNT *acc); AQBANKING_API AB_BANKING *AB_Account_GetBanking(const AB_ACCOUNT *acc); AQBANKING_API AB_ACCOUNT_TYPE AB_Account_GetAccountType(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetAccountType(AB_ACCOUNT *acc, AB_ACCOUNT_TYPE t); AQBANKING_API uint32_t AB_Account_GetUniqueId(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetUniqueId(AB_ACCOUNT *acc, uint32_t id); AQBANKING_API const char *AB_Account_GetBackendName(const AB_ACCOUNT *acc); AQBANKING_API AB_PROVIDER *AB_Account_GetProvider(const AB_ACCOUNT *acc); AQBANKING_API const char *AB_Account_GetAccountNumber(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetAccountNumber(AB_ACCOUNT *acc, const char *s); AQBANKING_API const char *AB_Account_GetSubAccountId(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetSubAccountId(AB_ACCOUNT *acc, const char *s); AQBANKING_API const char *AB_Account_GetBankCode(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetBankCode(AB_ACCOUNT *acc, const char *s); /** Returns the name of the account product (really: "Kontoproduktbezeichnung" according to HBCI spec). This may or may not be useful for your application. The bank may freely choose what to say in here. */ AQBANKING_API const char *AB_Account_GetAccountName(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetAccountName(AB_ACCOUNT *acc, const char *s); /** Returns the name of the bank, or NULL if none was set. */ AQBANKING_API const char *AB_Account_GetBankName(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetBankName(AB_ACCOUNT *acc, const char *s); AQBANKING_API const char *AB_Account_GetIBAN(const AB_ACCOUNT *a); AQBANKING_API void AB_Account_SetIBAN(AB_ACCOUNT *a, const char *s); AQBANKING_API const char *AB_Account_GetBIC(const AB_ACCOUNT *a); AQBANKING_API void AB_Account_SetBIC(AB_ACCOUNT *a, const char *s); AQBANKING_API const char *AB_Account_GetOwnerName(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetOwnerName(AB_ACCOUNT *acc, const char *s); AQBANKING_API const char *AB_Account_GetCurrency(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetCurrency(AB_ACCOUNT *acc, const char *s); /** * Returns the two-character ISO 3166 country code ("de" for Germany). */ AQBANKING_API const char *AB_Account_GetCountry(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetCountry(AB_ACCOUNT *acc, const char *s); /** * Returns a stringlist containing the unique ids of the users assigned to * this account. The caller is responsible for freeing the list returned * (if any). */ AQBANKING_API AB_USER_LIST2 *AB_Account_GetUsers(const AB_ACCOUNT *acc); AQBANKING_API AB_USER *AB_Account_GetFirstUser(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetUsers(AB_ACCOUNT *acc, const AB_USER_LIST2 *ul); AQBANKING_API void AB_Account_SetUser(AB_ACCOUNT *acc, const AB_USER *u); AQBANKING_API AB_USER_LIST2 *AB_Account_GetSelectedUsers(const AB_ACCOUNT *acc); AQBANKING_API AB_USER *AB_Account_GetFirstSelectedUser(const AB_ACCOUNT *acc); AQBANKING_API void AB_Account_SetSelectedUsers(AB_ACCOUNT *acc, const AB_USER_LIST2 *ul); AQBANKING_API void AB_Account_SetSelectedUser(AB_ACCOUNT *a, const AB_USER *u); #ifdef __cplusplus } #endif /*@}*/ /* defgroup */ #endif /* AQBANKING_ACCOUNT_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking.c0000644000175000017500000004652312453312630016477 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif /* don't warn about our own deprecated functions */ #define AQBANKING_NOWARN_DEPRECATED #include "banking_p.h" #include "provider_l.h" #include "imexporter_l.h" #include "bankinfoplugin_l.h" #include "i18n_l.h" #include "country_l.h" #include "userfns_l.h" #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* includes for high level API */ #include "jobgetbalance.h" #include "jobgettransactions.h" #include "jobgetstandingorders.h" #include "jobsingletransfer.h" #include "jobsingledebitnote.h" #include "jobeutransfer.h" #include "jobgetdatedtransfers.h" #ifdef OS_WIN32 # define ftruncate chsize # define DIRSEP "\\" #else # define DIRSEP "/" #endif GWEN_INHERIT_FUNCTIONS(AB_BANKING) #include #include "banking_init.c" #include "banking_account.c" #include "banking_user.c" #include "banking_online.c" #include "banking_deprec.c" #include "banking_cfg.c" #include "banking_imex.c" AB_BANKING *AB_Banking_new(const char *appName, const char *dname, uint32_t extensions){ AB_BANKING *ab; GWEN_BUFFER *nbuf; char buffer[256]; int err; assert(appName); err=GWEN_Init(); if (err) { DBG_ERROR_ERR(AQBANKING_LOGDOMAIN, err); abort(); } DBG_INFO(AQBANKING_LOGDOMAIN, "Application \"%s\" compiled with extensions %08x", appName, extensions); nbuf=GWEN_Buffer_new(0, 256, 0, 1); if (GWEN_Text_EscapeToBufferTolerant(appName, nbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad application name, aborting."); GWEN_Buffer_free(nbuf); abort(); } else { char *s; s=GWEN_Buffer_GetStart(nbuf); while(*s) { *s=tolower(*s); s++; } } GWEN_NEW_OBJECT(AB_BANKING, ab); GWEN_INHERIT_INIT(AB_BANKING, ab); ab->providers=AB_Provider_List_new(); ab->users=AB_User_List_new(); ab->accounts=AB_Account_List_new(); ab->appEscName=strdup(GWEN_Buffer_GetStart(nbuf)); ab->appName=strdup(appName); ab->activeProviders=GWEN_StringList_new(); ab->cryptTokenList=GWEN_Crypt_Token_List2_new(); GWEN_StringList_SetSenseCase(ab->activeProviders, 0); GWEN_Buffer_free(nbuf); AB_Banking__GetConfigManager(ab, dname); ab->appExtensions=extensions; if (getcwd(buffer, sizeof(buffer)-1)==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "getcwd: %s", strerror(errno)); } else { struct stat st; if (stat(buffer, &st)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "stat(%s): %s", buffer, strerror(errno)); } else { ab->startFolder=strdup(buffer); } } return ab; } void AB_Banking_free(AB_BANKING *ab){ if (ab) { DBG_INFO(AQBANKING_LOGDOMAIN, "Destroying AB_BANKING"); GWEN_INHERIT_FINI(AB_BANKING, ab); AB_Banking_ClearCryptTokenList(ab); GWEN_Crypt_Token_List2_free(ab->cryptTokenList); AB_Account_List_free(ab->accounts); AB_User_List_free(ab->users); AB_Provider_List_free(ab->providers); GWEN_StringList_free(ab->activeProviders); GWEN_ConfigMgr_free(ab->configMgr); free(ab->startFolder); free(ab->appName); free(ab->appEscName); free(ab->dataDir); GWEN_FREE_OBJECT(ab); GWEN_Fini(); } } int AB_Banking_GetUniqueId(AB_BANKING *ab){ int rv; int uid=0; GWEN_DB_NODE *dbConfig=NULL; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock main config (%d)", rv); return rv; } rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId", &dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to read main config (%d)", rv); return rv; } uid=GWEN_DB_GetIntValue(dbConfig, "uniqueId", 0, 0); uid++; GWEN_DB_SetIntValue(dbConfig, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", uid); rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId", dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to write main config (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); GWEN_DB_Group_free(dbConfig); return rv; } GWEN_DB_Group_free(dbConfig); /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock main config (%d)", rv); return rv; } return uid; } int AB_Banking_SetUniqueId(AB_BANKING *ab, uint32_t uid){ int rv; GWEN_DB_NODE *dbConfig=NULL; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock main config (%d)", rv); return rv; } rv=GWEN_ConfigMgr_GetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId", &dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to read main config (%d)", rv); return rv; } GWEN_DB_SetIntValue(dbConfig, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", uid); rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId", dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to write main config (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); GWEN_DB_Group_free(dbConfig); return rv; } GWEN_DB_Group_free(dbConfig); /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "uniqueId"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock main config (%d)", rv); return rv; } return 0; } GWEN_CONFIGMGR *AB_Banking_GetConfigMgr(AB_BANKING *ab) { assert(ab); return ab->configMgr; } const char *AB_Banking_GetAppName(const AB_BANKING *ab){ assert(ab); return ab->appName; } const char *AB_Banking_GetEscapedAppName(const AB_BANKING *ab){ assert(ab); return ab->appEscName; } AB_BANKINFO_PLUGIN *AB_Banking__LoadBankInfoPlugin(AB_BANKING *ab, const char *modname){ GWEN_PLUGIN *pl; pl=GWEN_PluginManager_GetPlugin(ab_pluginManagerBankInfo, modname); if (pl) { AB_BANKINFO_PLUGIN *bip; bip=AB_Plugin_BankInfo_Factory(pl, ab); if (!bip) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error in plugin [%s]: No bank info created", modname); return NULL; } return bip; } else { DBG_INFO(AQBANKING_LOGDOMAIN, "Plugin [%s] not found", modname); return NULL; } } AB_BANKINFO_PLUGIN *AB_Banking__GetBankInfoPlugin(AB_BANKING *ab, const char *country) { AB_BANKINFO_PLUGIN *bip; assert(ab); assert(country); bip=AB_BankInfoPlugin_List_First(ab_bankInfoPlugins); while(bip) { if (strcasecmp(AB_BankInfoPlugin_GetCountry(bip), country)==0) return bip; bip=AB_BankInfoPlugin_List_Next(bip); } bip=AB_Banking__LoadBankInfoPlugin(ab, country); if (!bip) { DBG_ERROR(AQBANKING_LOGDOMAIN, "BankInfo plugin for country \"%s\" not found", country); return 0; } AB_BankInfoPlugin_List_Add(bip, ab_bankInfoPlugins); return bip; } AB_BANKINFO *AB_Banking_GetBankInfo(AB_BANKING *ab, const char *country, const char *branchId, const char *bankId){ AB_BANKINFO_PLUGIN *bip; assert(ab); assert(country); bip=AB_Banking__GetBankInfoPlugin(ab, country); if (!bip) { DBG_INFO(AQBANKING_LOGDOMAIN, "BankInfo plugin for country \"%s\" not found", country); return 0; } return AB_BankInfoPlugin_GetBankInfo(bip, branchId, bankId); } int AB_Banking_GetBankInfoByTemplate(AB_BANKING *ab, const char *country, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl){ AB_BANKINFO_PLUGIN *bip; assert(ab); assert(country); bip=AB_Banking__GetBankInfoPlugin(ab, country); if (!bip) { DBG_INFO(AQBANKING_LOGDOMAIN, "BankInfo plugin for country \"%s\" not found", country); return 0; } return AB_BankInfoPlugin_GetBankInfoByTemplate(bip, tbi, bl); } AB_BANKINFO_CHECKRESULT AB_Banking_CheckAccount(AB_BANKING *ab, const char *country, const char *branchId, const char *bankId, const char *accountId) { AB_BANKINFO_PLUGIN *bip; assert(ab); assert(country); bip=AB_Banking__GetBankInfoPlugin(ab, country); if (!bip) { DBG_INFO(AQBANKING_LOGDOMAIN, "BankInfo plugin for country \"%s\" not found", country); return AB_BankInfoCheckResult_UnknownResult; } return AB_BankInfoPlugin_CheckAccount(bip, branchId, bankId, accountId); } int AB_Banking__GetDebuggerPath(AB_BANKING *ab, const char *backend, GWEN_BUFFER *pbuf){ const char *s; GWEN_Buffer_AppendString(pbuf, AQBANKING_PLUGINS DIRSEP AB_PROVIDER_DEBUGGER_FOLDER DIRSEP); s=backend; while(*s) GWEN_Buffer_AppendByte(pbuf, tolower(*(s++))); return 0; } void *AB_Banking_GetUserData(AB_BANKING *ab) { assert(ab); return ab->user_data; } void AB_Banking_SetUserData(AB_BANKING *ab, void *user_data) { assert(ab); ab->user_data = user_data; } /* __________________________________________________________________________ * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * High Level API * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY */ AB_ACCOUNT *AB_Banking__GetAccount(AB_BANKING *ab, const char *accountId){ int rv; GWEN_DB_NODE *dbData=NULL; rv=AB_Banking_LoadAppConfig(ab, &dbData); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to load app config"); return NULL; } else { uint32_t uniqueId; AB_ACCOUNT *a; GWEN_DB_NODE *db; assert(dbData); uniqueId=0; db=GWEN_DB_GetGroup(dbData, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "banking/aliases"); if (db) uniqueId=GWEN_DB_GetIntValue(db, accountId, 0, 0); GWEN_DB_Group_free(dbData); if (!uniqueId) { DBG_INFO(AQBANKING_LOGDOMAIN, "Account has no unique id assigned to the alias [%s].", accountId); return NULL; } a=AB_Banking_GetAccount(ab, uniqueId); if (!a) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Account with alias \"%s\" not found", accountId); return NULL; } return a; } } AB_ACCOUNT *AB_Banking_GetAccountByAlias(AB_BANKING *ab, const char *accountId){ return AB_Banking__GetAccount(ab, accountId); } void AB_Banking_SetAccountAlias(AB_BANKING *ab, AB_ACCOUNT *a, const char *alias){ int rv; GWEN_DB_NODE *dbConfig=NULL; GWEN_DB_NODE *db; rv=AB_Banking_LockAppConfig(ab); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here (%d)", rv); return; } rv=AB_Banking_LoadAppConfig(ab, &dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnlockAppConfig(ab); return; } db=GWEN_DB_GetGroup(dbConfig, GWEN_DB_FLAGS_DEFAULT, "banking/aliases"); GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, alias, AB_Account_GetUniqueId(a)); rv=AB_Banking_SaveAppConfig(ab, dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Banking_UnlockAppConfig(ab); return; } rv=AB_Banking_UnlockAppConfig(ab); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "here (%d)", rv); return; } } const AB_COUNTRY *AB_Banking_FindCountryByName(AB_BANKING *ab, const char *name){ assert(ab); return AB_Country_FindByName(name); } const AB_COUNTRY *AB_Banking_FindCountryByLocalName(AB_BANKING *ab, const char *name){ assert(ab); return AB_Country_FindByLocalName(name); } const AB_COUNTRY *AB_Banking_FindCountryByCode(AB_BANKING *ab, const char *code){ assert(ab); return AB_Country_FindByCode(code); } const AB_COUNTRY *AB_Banking_FindCountryByNumeric(AB_BANKING *ab, int numid){ assert(ab); return AB_Country_FindByNumeric(numid); } AB_COUNTRY_CONSTLIST2 *AB_Banking_ListCountriesByName(AB_BANKING *ab, const char *name){ assert(ab); return AB_Country_ListByName(name); } AB_COUNTRY_CONSTLIST2 *AB_Banking_ListCountriesByLocalName(AB_BANKING *ab, const char *name){ assert(ab); return AB_Country_ListByLocalName(name); } int AB_Banking__TransformIban(const char *iban, int len, char *newIban, int maxLen) { int i, j; const char *p; char *s; assert(iban); /* format IBAN */ i=0; j=0; p=iban; s=newIban; while(j='A' && c<='Z') { c=10+(c-'A'); *s='0'+(c/10); s++; i++; if (i>=maxLen) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (too long)"); return -1; } *s='0'+(c%10); s++; i++; } else if (isdigit(c)) { *s=c; s++; i++; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (bad char)"); return -1; } } p++; j++; } /* while */ if (j= 'A' && *p++ <= 'Z' && *p >= 'A' && *p++ <= 'Z')) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (country code not in upper case)"); return -1; } p+=2; /* convert IBAN+4 to buffer */ if (AB_Banking__TransformIban(p, strlen(p), newIban, sizeof(newIban)-1)) { DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } /* append country and checksum */ p=iban; s=newIban+strlen(newIban); if (AB_Banking__TransformIban(p, 4, s, sizeof(newIban)-strlen(newIban)-1)){ DBG_INFO(AQBANKING_LOGDOMAIN, "here"); return -1; } /* calculate checksum in 9er steps */ p=newIban; tmp[0]=0; j=0; while(*p) { for (i=strlen(tmp); i<9; i++) { if (!*p) break; tmp[i]=*(p++); } tmp[i]=0; if (1!=sscanf(tmp, "%u", &j)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (bad char)"); return -1; } j=j%97; /* modulo 97 */ snprintf(tmp, sizeof(tmp), "%u", j); } /* while */ if (j!=1) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (bad checksum)"); return 1; } DBG_INFO(AQBANKING_LOGDOMAIN, "IBAN is valid"); return 0; } int AB_Banking_MakeGermanIban(const char *bankCode, const char *accountNumber, GWEN_BUFFER *ibanBuf) { GWEN_BUFFER *tbuf; int i; char numbuf[32]; char tmp[10]; int rv; unsigned int j; const char *p; /* create BBAN */ tbuf=GWEN_Buffer_new(0, 256, 0, 1); /* bank code */ i=strlen(bankCode); if (i<8) GWEN_Buffer_FillWithBytes(tbuf, '0', 8-i); rv=AB_Banking__TransformIban(bankCode, strlen(bankCode), numbuf, sizeof(numbuf)-1); if (rv<0) { GWEN_Buffer_free(tbuf); DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad bank code (bad char) (%d)", rv); return rv; } GWEN_Buffer_AppendString(tbuf, numbuf); /* account number */ i=strlen(accountNumber); if (i<10) GWEN_Buffer_FillWithBytes(tbuf, '0', 10-i); rv=AB_Banking__TransformIban(accountNumber, strlen(accountNumber), numbuf, sizeof(numbuf)-1); if (rv<0) { GWEN_Buffer_free(tbuf); DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad account number (bad char) (%d)", rv); return rv; } GWEN_Buffer_AppendString(tbuf, numbuf); /* add "DE00" */ GWEN_Buffer_AppendString(tbuf, "131400"); /* calculate checksum in 9er steps */ p=GWEN_Buffer_GetStart(tbuf); tmp[0]=0; j=0; while(*p) { for (i=strlen(tmp); i<9; i++) { if (!*p) break; tmp[i]=*(p++); } tmp[i]=0; if (1!=sscanf(tmp, "%u", &j)) { GWEN_Buffer_free(tbuf); DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad IBAN (bad char)"); return -1; } j=j%97; /* modulo 97 */ snprintf(tmp, sizeof(tmp), "%u", j); } /* while */ /* j contains the modulus */ snprintf(tmp, sizeof(tmp), "%02u", 98-j); GWEN_Buffer_AppendString(ibanBuf, "DE"); /* DE */ GWEN_Buffer_AppendString(ibanBuf, tmp); /* checksum */ i=strlen(bankCode); /* bank code */ if (i<8) GWEN_Buffer_FillWithBytes(ibanBuf, '0', 8-i); GWEN_Buffer_AppendString(ibanBuf, bankCode); i=strlen(accountNumber); /* account number */ if (i<10) GWEN_Buffer_FillWithBytes(ibanBuf, '0', 10-i); GWEN_Buffer_AppendString(ibanBuf, accountNumber); DBG_INFO(AQBANKING_LOGDOMAIN, "IBAN is %s", GWEN_Buffer_GetStart(ibanBuf)); GWEN_Buffer_free(tbuf); return 0; } GWEN_STRINGLIST *AB_Banking_GetGlobalDataDirs(void) { GWEN_STRINGLIST *sl; sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_DATADIR); return sl; } GWEN_STRINGLIST *AB_Banking_GetGlobalSysconfDirs(void) { GWEN_STRINGLIST *sl; sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_SYSCONFDIR); return sl; } void AB_Banking_GetVersion(int *major, int *minor, int *patchlevel, int *build) { if (major) *major=AQBANKING_VERSION_MAJOR; if (minor) *minor=AQBANKING_VERSION_MINOR; if (patchlevel) *patchlevel=AQBANKING_VERSION_PATCHLEVEL; if (build) *build=AQBANKING_VERSION_BUILD; } GWEN_DIALOG *AB_Banking_GetNewUserDialog(AB_BANKING *ab, const char *backend, int mode) { AB_PROVIDER *pro; GWEN_DIALOG *dlg; assert(ab); pro=AB_Banking_GetProvider(ab, backend); if (!pro) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Backend \"%s\" not found", backend); return NULL; } dlg=AB_Provider_GetNewUserDialog(pro, mode); if (dlg==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "Provider did not return a NewUser dialog (backend=%s, mode=%d)", backend, mode); return NULL; } return dlg; } aqbanking-5.6.4beta/src/libs/aqbanking/bankinfoplugin.c0000644000175000017500000001176012364015477020101 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "bankinfoplugin_p.h" #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AB_BANKINFO_PLUGIN) GWEN_LIST_FUNCTIONS(AB_BANKINFO_PLUGIN, AB_BankInfoPlugin) GWEN_LIST2_FUNCTIONS(AB_BANKINFO_PLUGIN, AB_BankInfoPlugin) GWEN_INHERIT(GWEN_PLUGIN, AB_PLUGIN_BANKINFO) AB_BANKINFO_PLUGIN *AB_BankInfoPlugin_new(const char *country){ AB_BANKINFO_PLUGIN *bip; assert(country); GWEN_NEW_OBJECT(AB_BANKINFO_PLUGIN, bip); GWEN_INHERIT_INIT(AB_BANKINFO_PLUGIN, bip); GWEN_LIST_INIT(AB_BANKINFO_PLUGIN, bip); bip->usage=1; bip->country=strdup(country); return bip; } void AB_BankInfoPlugin_free(AB_BANKINFO_PLUGIN *bip){ if (bip) { assert(bip->usage); if (--(bip->usage)==0) { GWEN_INHERIT_FINI(AB_BANKINFO_PLUGIN, bip); GWEN_Plugin_free(bip->plugin); free(bip->country); GWEN_LIST_FINI(AB_BANKINFO_PLUGIN, bip); GWEN_FREE_OBJECT(bip); } } } void AB_BankInfoPlugin_Attach(AB_BANKINFO_PLUGIN *bip){ assert(bip); assert(bip->usage); bip->usage++; } const char *AB_BankInfoPlugin_GetCountry(const AB_BANKINFO_PLUGIN *bip){ assert(bip); assert(bip->usage); return bip->country; } AB_BANKINFO *AB_BankInfoPlugin_GetBankInfo(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId){ assert(bip); assert(bip->usage); if (bip->getBankInfoFn) return bip->getBankInfoFn(bip, branchId, bankId); DBG_INFO(AQBANKING_LOGDOMAIN, "GetBankInfo function not set"); return 0; } int AB_BankInfoPlugin_GetBankInfoByTemplate(AB_BANKINFO_PLUGIN *bip, AB_BANKINFO *tbi, AB_BANKINFO_LIST2 *bl){ assert(bip); assert(bip->usage); if (bip->getBankInfoByTemplateFn) return bip->getBankInfoByTemplateFn(bip, tbi, bl); DBG_INFO(AQBANKING_LOGDOMAIN, "GetBankInfoByTemplate function not set"); return GWEN_ERROR_NOT_SUPPORTED; } AB_BANKINFO_CHECKRESULT AB_BankInfoPlugin_CheckAccount(AB_BANKINFO_PLUGIN *bip, const char *branchId, const char *bankId, const char *accountId){ assert(bip); assert(bip->usage); if (bip->checkAccountFn) return bip->checkAccountFn(bip, branchId, bankId, accountId); DBG_INFO(AQBANKING_LOGDOMAIN, "CheckAccount function not set"); return AB_BankInfoCheckResult_UnknownResult; } void AB_BankInfoPlugin_SetGetBankInfoFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_GETBANKINFO_FN f){ assert(bip); assert(bip->usage); bip->getBankInfoFn=f; } void AB_BankInfoPlugin_SetGetBankInfoByTemplateFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_GETBANKINFOBYTMPLATE_FN f){ assert(bip); assert(bip->usage); bip->getBankInfoByTemplateFn=f; } void AB_BankInfoPlugin_SetCheckAccountFn(AB_BANKINFO_PLUGIN *bip, AB_BANKINFOPLUGIN_CHECKACCOUNT_FN f){ assert(bip); assert(bip->usage); bip->checkAccountFn=f; } void AB_BankInfoPlugin_SetPlugin(AB_BANKINFO_PLUGIN *bip, GWEN_PLUGIN *pl) { assert(bip); assert(bip->usage); bip->plugin=pl; } GWEN_PLUGIN *AB_Plugin_BankInfo_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName) { GWEN_PLUGIN *pl; AB_PLUGIN_BANKINFO *xpl; pl=GWEN_Plugin_new(pm, name, fileName); GWEN_NEW_OBJECT(AB_PLUGIN_BANKINFO, xpl); GWEN_INHERIT_SETDATA(GWEN_PLUGIN, AB_PLUGIN_BANKINFO, pl, xpl, AB_Plugin_BankInfo_FreeData); return pl; } GWENHYWFAR_CB void AB_Plugin_BankInfo_FreeData(void *bp, void *p) { AB_PLUGIN_BANKINFO *xpl; xpl=(AB_PLUGIN_BANKINFO*)p; GWEN_FREE_OBJECT(xpl); } AB_BANKINFO_PLUGIN *AB_Plugin_BankInfo_Factory(GWEN_PLUGIN *pl, AB_BANKING *ab) { AB_PLUGIN_BANKINFO *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_BANKINFO, pl); assert(xpl); assert(xpl->pluginFactoryFn); return xpl->pluginFactoryFn(pl, ab); } void AB_Plugin_BankInfo_SetFactoryFn(GWEN_PLUGIN *pl, AB_PLUGIN_BANKINFO_FACTORY_FN fn) { AB_PLUGIN_BANKINFO *xpl; assert(pl); xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, AB_PLUGIN_BANKINFO, pl); assert(xpl); xpl->pluginFactoryFn=fn; } aqbanking-5.6.4beta/src/libs/aqbanking/msgengine_p.h0000644000175000017500000000457212364015477017376 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_MSGENGINE_P_H #define AQBANKING_MSGENGINE_P_H #include "msgengine.h" typedef struct AB_MSGENGINE AB_MSGENGINE; struct AB_MSGENGINE { int dummy; }; static void GWENHYWFAR_CB AB_MsgEngine_FreeData(void *bp, void *p); static int AB_MsgEngine_TypeRead(GWEN_MSGENGINE *e, GWEN_BUFFER *msgbuf, GWEN_XMLNODE *node, GWEN_BUFFER *vbuf, char escapeChar, const char *delimiters); static int AB_MsgEngine_TypeWrite(GWEN_MSGENGINE *e, GWEN_BUFFER *gbuf, GWEN_BUFFER *data, GWEN_XMLNODE *node); static GWEN_DB_NODE_TYPE AB_MsgEngine_TypeCheck(GWEN_MSGENGINE *e, const char *tname); static const char *AB_MsgEngine_GetCharValue(GWEN_MSGENGINE *e, const char *name, const char *defValue); static int AB_MsgEngine_GetIntValue(GWEN_MSGENGINE *e, const char *name, int defValue); static int AB_MsgEngine_BinTypeRead(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *vbuf); static int AB_MsgEngine_BinTypeWrite(GWEN_MSGENGINE *e, GWEN_XMLNODE *node, GWEN_DB_NODE *gr, GWEN_BUFFER *dbuf); static uint32_t AB_MsgEngine__FromBCD(uint32_t value); static uint32_t AB_MsgEngine__ToBCD(uint32_t value); #endif /* CHIPCARD_CLIENT_MSGENGINE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/country_l.h0000644000175000017500000000203312364015477017107 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_COUNTRY_L_H #define AQBANKING_COUNTRY_L_H #include const AB_COUNTRY *AB_Country_FindByName(const char *name); const AB_COUNTRY *AB_Country_FindByLocalName(const char *name); const AB_COUNTRY *AB_Country_FindByCode(const char *code); const AB_COUNTRY *AB_Country_FindByNumeric(int numid); AB_COUNTRY_CONSTLIST2 *AB_Country_ListByName(const char *name); AB_COUNTRY_CONSTLIST2 *AB_Country_ListByLocalName(const char *name); #endif /* AQBANKING_COUNTRY_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_ob.h0000644000175000017500000002614212364015477017171 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_OB_H #define AQBANKING_BANKING_OB_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** @addtogroup G_AB_ONLINE_BANKING * */ /*@{*/ /** @name User Management Functions * * AqBanking controls a list of users. You can ask it for the full list * (@ref AB_Banking_GetUsers) or directly request a specific user * (@ref AB_Banking_GetUser). * AB_USERs contain all information needed to identify a user to the bank's * server. */ /*@{*/ /** * Returns a list of currently known users, or NULL if there are no * users. The returned list is owned by the caller, so he is * responsible for freeing it (using @ref AB_User_List2_free). * * Please note that even while the list is owned by the caller the users * in that list are not! So you may not free any of those users in the * list (e.g. by calling @ref AB_User_List2_FreeAll). * * @return The list of users, or NULL if there are none. * @param ab pointer to the AB_BANKING object */ AQBANKING_API AB_USER_LIST2 *AB_Banking_GetUsers(const AB_BANKING *ab); /** * Returns the user with the given unique id. */ AQBANKING_API AB_USER *AB_Banking_GetUser(const AB_BANKING *ab, uint32_t uniqueId); /** * This function returns the first user which matches the given parameters. * For all parameters wildcards ("*") and joker ("?") are allowed. */ AQBANKING_API AB_USER *AB_Banking_FindUser(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *userId, const char *customerId); /** * This function returns a list of users which match the given parameters. * For all parameters wildcards ("*") and joker ("?") are allowed. * If no user matches (or there simply are no users) then NULL is returned. * The caller is responsible for freeing the list returned (if any) by calling * @ref AB_User_List2_free. * AqBanking still remains the owner of every user reported via this * function, so you MUST NOT call @ref AB_User_List2_freeAll. */ AQBANKING_API AB_USER_LIST2 *AB_Banking_FindUsers(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *userId, const char *customerId); /** * Creates a user and presents it to the backend (which might want to extend * the newly created user in order to associate some data with it). * This function does not add the user to AqBanking, please use * @ref AB_Banking_AddUser for that purpose. */ AQBANKING_API AB_USER *AB_Banking_CreateUser(AB_BANKING *ab, const char *backendName); /** * Enqueues the given user with AqBanking. */ AQBANKING_API int AB_Banking_AddUser(AB_BANKING *ab, AB_USER *u); /** * Searches all accounts for one that contains the given user. Returns * the first of these accounts, or NULL if this user does not belong * to any account. * * It is a prerequisite of AB_Banking_DeleteUser() that the user must * not belong to any account anymore. Use this function to check * whether this is the case (i.e. this function returns NULL), or if * it is not the case, you know at least one account that this user * still belongs to. * * @return The first account that this user belongs to, or NULL if * this user does not belong to any account. * * New in aqbanking-2.2.9. */ AQBANKING_API AB_ACCOUNT *AB_Banking_FindFirstAccountOfUser(AB_BANKING *ab, AB_USER *u); /** * Removes the given user from all internal lists and deletes the * object. The caller must not use the AB_USER pointer anymore after * calling this function. * * Watch out: Before this can succeed, this user *must* be removed * from all AB_Accounts that it was added to. Otherwise this operation * will fail. So before you call this operation, make sure you either * removed the user from its accounts, or delete the accounts in * question. * * @returns Zero on success, nonzero on error. In particular, if the * user still belongs to any account, "-10" is returned and no * operation is done. * * New in aqbanking-2.2.9. */ AQBANKING_API int AB_Banking_DeleteUser(AB_BANKING *ab, AB_USER *u); /*@}*/ /** @name Account Management Functions * * AqBanking controls a list of accounts. You can ask it for the full list * (@ref AB_Banking_GetAccounts) or directly request a specific account * (@ref AB_Banking_GetAccount). */ /*@{*/ /** * Returns a list of currently known accounts, or NULL if there are no * accounts. The returned list is owned by the caller, so he is * responsible for freeing it (using @ref AB_Account_List2_free). * * Please note that even while the list is owned by the caller the accounts * in that list are not! Sou you may not free any of those accounts in the * list (e.g. by calling @ref AB_Account_List2_FreeAll). * * @return The list of accounts, or NULL if there are none. * @param ab pointer to the AB_BANKING object */ AQBANKING_API AB_ACCOUNT_LIST2 *AB_Banking_GetAccounts(const AB_BANKING *ab); /** * This function does an account lookup based on the given unique id. * This id is assigned by AqBanking when an account is added to AqBanking * via @ref AB_Banking_AddAccount. * * AqBanking remains the owner of the object returned (if any), so you must * not free it. * * Please also note that the object returned is only valid until * @ref AB_Banking_Fini() has been called (or until the corresponding backend * for this particular account has been deactivated). * * @return The account, or NULL if it is not found. * @param ab pointer to the AB_BANKING object * @param uniqueId unique id of the account assigned by AqBanking */ AQBANKING_API AB_ACCOUNT *AB_Banking_GetAccount(const AB_BANKING *ab, uint32_t uniqueId); /** * This function does an account lookup based on the given bank code and * account number. No wildards or jokers allowed. * * AqBanking remains the owner of the object returned (if any), so you must * not free it. * * Please also note that the object returned is only valid until * @ref AB_Banking_Fini() has been called (or until the corresponding backend * for this particular account has been deactivated). * * @return The account, or NULL if it is not found. * @param ab pointer to the AB_BANKING object * @param bankCode bank code (use 0 if your country does not use bank codes) * @param accountId account number */ AQBANKING_API AB_ACCOUNT *AB_Banking_GetAccountByCodeAndNumber(const AB_BANKING *ab, const char *bankCode, const char *accountId); /** * This function does an account lookup based on the given IBAN. * No wildards or jokers allowed. * * AqBanking remains the owner of the object returned (if any), so you must * not free it. * * Please also note that the object returned is only valid until * @ref AB_Banking_Fini() has been called (or until the corresponding backend * for this particular account has been deactivated). * * @return The account, or NULL if it is not found. * @param ab pointer to the AB_BANKING object * @param bankCode bank code (use 0 if your country does not use bank codes) * @param accountId account number */ AQBANKING_API AB_ACCOUNT *AB_Banking_GetAccountByIban(const AB_BANKING *ab, const char *iban); /** * This function returns the first account which matches the given parameters. * For all parameters wildcards ("*") and joker ("?") are allowed. */ AQBANKING_API AB_ACCOUNT *AB_Banking_FindAccount(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *accountId, const char *subAccountId); /** * This function returns a list of accounts which match the given * parameters. * For all parameters wildcards ("*") and joker ("?") are allowed. * If no account matches (or there simply are no accounts) then NULL is * returned. * The caller is responsible for freeing the list returned (ifany) by calling * @ref AB_Account_List2_free. * AqBanking still remains the owner of every account reported via this * function, so you MUST NOT call @ref AB_Account_List2_FreeAll. */ AQBANKING_API AB_ACCOUNT_LIST2 *AB_Banking_FindAccounts(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *accountId, const char *subAccountId); /** * Creates an account and shows it to the backend (which might want to extend * the newly created account in order to associate some data with it). * The newly created account does not have a unique id yet. This id is * assigned upon @ref AB_Banking_AddAccount. The caller becomes the owner * of the object returned, so you must either call @ref AB_Banking_AddAccount * or @ref AB_Account_free on it. * This function does @b not add the user to AqBankings internal list. */ AQBANKING_API AB_ACCOUNT *AB_Banking_CreateAccount(AB_BANKING *ab, const char *backendName); /** * Adds the given account to the internal list of accounts. Only now it gets a * unique id assigned to it. * AqBanking takes over the ownership of the given account, so you MUST NOT * call @ref AB_Account_free on it! */ AQBANKING_API int AB_Banking_AddAccount(AB_BANKING *ab, AB_ACCOUNT *a); /** * Removes the given account from all internal lists and deletes the * object. The caller must not use the AB_ACCOUNT pointer anymore * after calling this function. * * @returns Zero on success, nonzero on error. * * New in aqbanking-2.2.9. */ AQBANKING_API int AB_Banking_DeleteAccount(AB_BANKING *ab, AB_ACCOUNT *a); /*@}*/ /** @name Executing Jobs * */ /*@{*/ /** *

* This function sends all jobs from the given list to their * respective backend. The results will be stored in the given im-/exporter * context. *

*

* This function does @b not take over or free the jobs. *

* @return 0 if ok, error code otherwise (see @ref AB_ERROR) * @param ab pointer to the AB_BANKING object * @param jl2 list of enqueued jobs to execute */ AQBANKING_API int AB_Banking_ExecuteJobs(AB_BANKING *ab, AB_JOB_LIST2 *jl2, AB_IMEXPORTER_CONTEXT *ctx); /*@}*/ /*@}*/ /* addtogroup */ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/gui/0000755000175000017500000000000012643540651015563 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/gui/abgui.h0000644000175000017500000000617512364015477016757 00000000000000/*************************************************************************** begin : Thu Jun 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_GUI_H #define AQBANKING_GUI_H #include #include /** @addtogroup G_AB_GUI Gwenhywfar GUI Extension * * @brief Extends the GWEN_GUI framework. * * This module adds the following features to GWEN_GUI: *
    *
  • maintenance of SSL certificates
  • *
  • reading and writing of GWEN_DIALOG settings (allows storing the settings of every * dialog in AqBanking's shared settings database)
  • *
* * * The following example shows how to use this module correctly. We use the FOX implementation * of the GWEN_GUI framework here, but the basic steps are the same for every implementation. *
    *
  1. GWEN_Init()
  2. *
  3. basic setup of your application
  4. *
  5. create a GUI, set it as the application's GUI (GWEN_Gui_SetGui())
  6. *
  7. create the AqBanking object (AB_Banking_new())
  8. *
  9. init the AqBanking object (just AB_Banking_Init(), no need for AB_Banking_Online_Init() here)
  10. *
  11. call @ref AB_Gui_Extend() to extend the GUI (regardless of the heritage if the GUI, this works * with every GUI implementation, even on console)
  12. *
* * @code * * FF_App app("AqFinance", "Martin Preuss"); * AB_BANKING *ab; * FF_Gui *gui; * * GWEN_Init(); * * app.init(argc, argv); * * gui=new FF_Gui(&app, "/some/where"); * GWEN_Gui_SetGui(gui->getCInterface()); * * ab=AB_Banking_new("MyApplication", NULL, 0); * AB_Banking_Init(ab); * * AB_Gui_Extend(gui->getCInterface(), ab); * * @endcode */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * This function creates a GWEN_GUI object which uses AqBanking's shared certificate data * for certificate checking. * AB_Banking_Init() must be called before the certificate check callback of this GWEN_GUI * object is called. */ AQBANKING_API GWEN_GUI *AB_Gui_new(AB_BANKING *ab); /** * This function can be used to add certificate handling using AqBanking's shared certificate * data to any GWEN_GUI object. * It sets the callback for certificate checking. * Use this function if you have your own GWEN_GUI implementation but still want to use AqBanking's * certificate handling. * AB_Banking_Init() must be called before the certificate check callback of this GWEN_GUI * object is called. */ AQBANKING_API void AB_Gui_Extend(GWEN_GUI *gui, AB_BANKING *ab); /** * This function unlinks the given GWEN_GUI object from AqBanking. * It resets the callback for certificate checking to the value it had before * @ref AB_Gui_Extend was called. */ AQBANKING_API void AB_Gui_Unextend(GWEN_GUI *gui); #ifdef __cplusplus } #endif /*@}*/ /* end of group G_AB_GUI */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/gui/Makefile.in0000644000175000017500000006323012643540055017552 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/gui DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libabgui_la_LIBADD = am_libabgui_la_OBJECTS = abgui.lo libabgui_la_OBJECTS = $(am_libabgui_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libabgui_la_SOURCES) DIST_SOURCES = $(libabgui_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES = libabgui.la EXTRA_DIST = $(typefiles) noinst_HEADERS = \ abgui_p.h iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ abgui.h libabgui_la_SOURCES = \ abgui.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/gui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/gui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libabgui.la: $(libabgui_la_OBJECTS) $(libabgui_la_DEPENDENCIES) $(EXTRA_libabgui_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libabgui_la_OBJECTS) $(libabgui_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abgui.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS sources: for f in $(libabgui_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbanking/gui/abgui_p.h0000644000175000017500000000245012364015477017266 00000000000000/*************************************************************************** begin : Thu Jun 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_GUI_P_H #define AQBANKING_GUI_P_H #include "abgui.h" typedef struct AB_GUI AB_GUI; struct AB_GUI { AB_BANKING *banking; GWEN_GUI_CHECKCERT_FN checkCertFn; GWEN_GUI_READ_DIALOG_PREFS_FN readDialogPrefsFn; GWEN_GUI_WRITE_DIALOG_PREFS_FN writeDialogPrefsFn; }; static void GWENHYWFAR_CB AB_Gui_FreeData(void *bp, void *p); static int AB_Gui__HashPair(const char *token, const char *pin, GWEN_BUFFER *buf); static int AB_Gui_CheckCert(GWEN_GUI *gui, const GWEN_SSLCERTDESCR *cd, GWEN_SYNCIO *sio, uint32_t guiid); static int AB_Gui_WriteDialogPrefs(GWEN_GUI *gui, const char *groupName, GWEN_DB_NODE *db); static int AB_Gui_ReadDialogPrefs(GWEN_GUI *gui, const char *groupName, const char *altName, GWEN_DB_NODE **pDb); #endif aqbanking-5.6.4beta/src/libs/aqbanking/gui/Makefile.am0000644000175000017500000000063012364015477017541 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES=libabgui.la EXTRA_DIST=$(typefiles) noinst_HEADERS=\ abgui_p.h iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=\ abgui.h libabgui_la_SOURCES=\ abgui.c sources: for f in $(libabgui_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/libs/aqbanking/gui/abgui.c0000644000175000017500000002061512364015477016745 00000000000000/*************************************************************************** begin : Thu Jun 18 2009 copyright : (C) 2009 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "abgui_p.h" #include #include #include #include GWEN_INHERIT(GWEN_GUI, AB_GUI) GWEN_GUI *AB_Gui_new(AB_BANKING *ab) { GWEN_GUI *gui; AB_GUI *xgui; gui=GWEN_Gui_new(); GWEN_NEW_OBJECT(AB_GUI, xgui); GWEN_INHERIT_SETDATA(GWEN_GUI, AB_GUI, gui, xgui, AB_Gui_FreeData); xgui->banking=ab; xgui->checkCertFn=GWEN_Gui_SetCheckCertFn(gui, AB_Gui_CheckCert); xgui->readDialogPrefsFn=GWEN_Gui_SetReadDialogPrefsFn(gui, AB_Gui_ReadDialogPrefs); xgui->writeDialogPrefsFn=GWEN_Gui_SetWriteDialogPrefsFn(gui, AB_Gui_WriteDialogPrefs); return gui; } void AB_Gui_Extend(GWEN_GUI *gui, AB_BANKING *ab) { AB_GUI *xgui; assert(gui); GWEN_NEW_OBJECT(AB_GUI, xgui); GWEN_INHERIT_SETDATA(GWEN_GUI, AB_GUI, gui, xgui, AB_Gui_FreeData); xgui->banking=ab; xgui->checkCertFn=GWEN_Gui_SetCheckCertFn(gui, AB_Gui_CheckCert); GWEN_Gui_SetReadDialogPrefsFn(gui, AB_Gui_ReadDialogPrefs); GWEN_Gui_SetWriteDialogPrefsFn(gui, AB_Gui_WriteDialogPrefs); } void AB_Gui_Unextend(GWEN_GUI *gui) { AB_GUI *xgui; assert(gui); xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui); assert(xgui); /* reset callbacks which point into AB_GUI */ GWEN_Gui_SetCheckCertFn(gui, xgui->checkCertFn); /* unlink from GWEN_GUI object */ DBG_INFO(AQBANKING_LOGDOMAIN, "Unlinking GUI from banking object"); GWEN_Gui_SetReadDialogPrefsFn(gui, xgui->readDialogPrefsFn); GWEN_Gui_SetWriteDialogPrefsFn(gui, xgui->writeDialogPrefsFn); GWEN_INHERIT_UNLINK(GWEN_GUI, AB_GUI, gui); } void GWENHYWFAR_CB AB_Gui_FreeData(void *bp, void *p) { AB_GUI *xgui; xgui=(AB_GUI*) p; assert(xgui); GWEN_FREE_OBJECT(xgui); } int AB_Gui__HashPair(const char *token, const char *pin, GWEN_BUFFER *buf) { GWEN_MDIGEST *md; int rv; /* hash token and pin */ md=GWEN_MDigest_Md5_new(); rv=GWEN_MDigest_Begin(md); if (rv==0) rv=GWEN_MDigest_Update(md, (const uint8_t*)token, strlen(token)); if (rv==0) rv=GWEN_MDigest_Update(md, (const uint8_t*)pin, strlen(pin)); if (rv==0) rv=GWEN_MDigest_End(md); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Hash error (%d)", rv); GWEN_MDigest_free(md); return rv; } GWEN_Text_ToHexBuffer((const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md), buf, 0, 0, 0); GWEN_MDigest_free(md); return 0; } int AB_Gui_CheckCert(GWEN_GUI *gui, const GWEN_SSLCERTDESCR *cd, GWEN_SYNCIO *sio, uint32_t guiid) { AB_GUI *xgui; const char *hash; const char *status; GWEN_BUFFER *hbuf; GWEN_DB_NODE *dbCerts=NULL; int rv; int result=GWEN_ERROR_USER_ABORTED; assert(gui); xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui); assert(xgui); hash=GWEN_SslCertDescr_GetFingerPrint(cd); status=GWEN_SslCertDescr_GetStatusText(cd); hbuf=GWEN_Buffer_new(0, 64, 0, 1); AB_Gui__HashPair(hash, status, hbuf); /* lock certificate data */ rv=AB_Banking_LockSharedConfig(xgui->banking, "certs"); if (rv<0) { /* fallback */ DBG_WARN(AQBANKING_LOGDOMAIN, "Could not lock certs db, asking user (%d)", rv); result=xgui->checkCertFn(gui, cd, sio, guiid); } else { int i; /* load certificate data */ rv=AB_Banking_LoadSharedConfig(xgui->banking, "certs", &dbCerts); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not load certs (%d)", rv); dbCerts=GWEN_DB_Group_new("certs"); } /* lookup cert or ask */ i=GWEN_DB_GetIntValue(dbCerts, GWEN_Buffer_GetStart(hbuf), 0, 1); if (i==0) { DBG_NOTICE(AQBANKING_LOGDOMAIN, "Automatically accepting certificate [%s]", hash); result=0; } else { /* no info in the cert cache. * If in non-interactive mode we check whether the certificate is valid. If so * and the GUI flags allow us to accept valid certs we do so. Otherwise we ask the * user (only if not in non-interactive mode) */ if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_NONINTERACTIVE) { uint32_t fl; fl=GWEN_SslCertDescr_GetStatusFlags(cd); if (fl==GWEN_SSL_CERT_FLAGS_OK) { if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_ACCEPTVALIDCERTS) { DBG_NOTICE(AQBANKING_LOGDOMAIN, "Automatically accepting valid new certificate [%s]", hash); GWEN_Buffer_free(hbuf); AB_Banking_UnlockSharedConfig(xgui->banking, "certs"); return 0; } else { DBG_NOTICE(AQBANKING_LOGDOMAIN, "Automatically rejecting certificate [%s] (noninteractive)", hash); GWEN_Buffer_free(hbuf); AB_Banking_UnlockSharedConfig(xgui->banking, "certs"); return GWEN_ERROR_USER_ABORTED; } } /* if cert is valid */ else { if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_REJECTINVALIDCERTS) { DBG_NOTICE(AQBANKING_LOGDOMAIN, "Automatically rejecting invalid certificate [%s] (noninteractive)", hash); GWEN_Buffer_free(hbuf); AB_Banking_UnlockSharedConfig(xgui->banking, "certs"); return GWEN_ERROR_USER_ABORTED; } } } /* if non-interactive */ if (xgui->checkCertFn) { result=xgui->checkCertFn(gui, cd, sio, guiid); if (result==0) { GWEN_DB_SetIntValue(dbCerts, GWEN_DB_FLAGS_OVERWRITE_VARS, GWEN_Buffer_GetStart(hbuf), result); } } } /* write new certs */ DBG_DEBUG(AQBANKING_LOGDOMAIN, "Saving certs"); rv=AB_Banking_SaveSharedConfig(xgui->banking, "certs", dbCerts); if (rv<0) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not unlock certs db (%d)", rv); } /* unlock certs */ DBG_DEBUG(AQBANKING_LOGDOMAIN, "Unlocking certs"); rv=AB_Banking_UnlockSharedConfig(xgui->banking, "certs"); if (rv<0) { DBG_NOTICE(AQBANKING_LOGDOMAIN, "Could not unlock certs db (%d)", rv); } } GWEN_Buffer_free(hbuf); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Returning %d", result); return result; } int AB_Gui_ReadDialogPrefs(GWEN_GUI *gui, const char *groupName, const char *altName, GWEN_DB_NODE **pDb) { AB_GUI *xgui; assert(gui); xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui); assert(xgui); if (groupName && *groupName) { int rv; const char *s; GWEN_DB_NODE *db; GWEN_BUFFER *nbuf; nbuf=GWEN_Buffer_new(0, 64, 0, 1); s=GWEN_Gui_GetName(); if (s && *s) { GWEN_Buffer_AppendString(nbuf, s); GWEN_Buffer_AppendString(nbuf, "_"); } GWEN_Buffer_AppendString(nbuf, groupName); rv=AB_Banking_LoadSharedConfig(xgui->banking, GWEN_Buffer_GetStart(nbuf), &db); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); return rv; } *pDb=db; GWEN_Buffer_free(nbuf); return 0; } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No groupName"); return GWEN_ERROR_NO_DATA; } } int AB_Gui_WriteDialogPrefs(GWEN_GUI *gui, const char *groupName, GWEN_DB_NODE *db) { AB_GUI *xgui; assert(gui); xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui); assert(xgui); if (groupName && *groupName && db) { int rv; const char *s; GWEN_BUFFER *nbuf; nbuf=GWEN_Buffer_new(0, 64, 0, 1); s=GWEN_Gui_GetName(); if (s && *s) { GWEN_Buffer_AppendString(nbuf, s); GWEN_Buffer_AppendString(nbuf, "_"); } GWEN_Buffer_AppendString(nbuf, groupName); /* lock configuration */ rv=AB_Banking_LockSharedConfig(xgui->banking, GWEN_Buffer_GetStart(nbuf)); if (rv==0) { /* save configuration */ rv=AB_Banking_SaveSharedConfig(xgui->banking, GWEN_Buffer_GetStart(nbuf), db); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); } /* unlock configuration */ rv=AB_Banking_UnlockSharedConfig(xgui->banking, GWEN_Buffer_GetStart(nbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); } } GWEN_Buffer_free(nbuf); } return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/banking_simple.h0000644000175000017500000000421412364015477020056 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_SIMPLE_H #define AQBANKING_BANKING_SIMPLE_H #ifdef __cplusplus extern "C" { #endif /** @name Mapping Application Accounts to Online Accounts * * Functions in this group provide an optional service for account mapping. * Most applications assign unique ids to their own accounts. This unique * id can be mapped to an account of AqBanking. */ /*@{*/ /** *

* Sets an alias for the given AqBanking account. You can later use * @ref AB_Banking_GetAccountByAlias to refer to an online account by using * the unique id of your application's account. *

*

* AqBanking separates the aliases for each application. *

* @param ab AqBanking main object * @param a online account of AqBanking you wish to map your account to * @param alias unique id of your application's own account structure */ AQBANKING_API void AB_Banking_SetAccountAlias(AB_BANKING *ab, AB_ACCOUNT *a, const char *alias); /** * This function returns the AqBanking account to which the given * alias (=unique id of your application's own account data) has been * mapped. * * AqBanking remains the owner of the object returned (if any), so you must * not free it. * * Please also note that the object returned is only valid until * AB_Banking_Fini() has been called (or until the corresponding backend for * this particular account has been deactivated). * * @return corresponding AqBanking (or 0 if none) * @param ab AqBanking main object * @param alias unique id of your application's own account structure */ AQBANKING_API AB_ACCOUNT *AB_Banking_GetAccountByAlias(AB_BANKING *ab, const char *alias); /*@}*/ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/bankinfoplugin.h0000644000175000017500000000156212364015477020105 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKINFOPLUGIN_H #define AQBANKING_BANKINFOPLUGIN_H #include typedef enum { AB_BankInfoCheckResult_Ok=0, AB_BankInfoCheckResult_NotOk, AB_BankInfoCheckResult_UnknownBank, AB_BankInfoCheckResult_UnknownResult } AB_BANKINFO_CHECKRESULT; #endif /* AQBANKING_BANKINFOPLUGIN_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_virt.h0000644000175000017500000000120412364015477017545 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_VIRT_H #define AQBANKING_BANKING_VIRT_H #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/httpsession.h0000644000175000017500000000314112364015477017455 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_HTTPSESS_H #define AB_HTTPSESS_H #include #include #include /** @defgroup G_AB_PROVIDER_HTTPSESS HTTP Session Management * @ingroup G_AB_BE_INTERFACE * * Functions in this group provide a HTTP session management. This can be * used by backends which use the SSL transport protocol. */ /*@{*/ /** @name Constructor/Destructor * */ /*@{*/ AQBANKING_API GWEN_HTTP_SESSION *AB_HttpSession_new(AB_PROVIDER *pro, AB_USER *u, const char *url, const char *defaultProto, int defaultPort); /*@}*/ /** @name Getters for Related Objects * */ /*@{*/ AQBANKING_API AB_USER *AB_HttpSession_GetUser(const GWEN_HTTP_SESSION *sess); AQBANKING_API AB_PROVIDER *AB_HttpSession_GetProvider(const GWEN_HTTP_SESSION *sess); AQBANKING_API void Ab_HttpSession_AddLog(GWEN_HTTP_SESSION *sess, const char *s); AQBANKING_API const char *AB_HttpSession_GetLog(const GWEN_HTTP_SESSION *sess); AQBANKING_API void AB_HttpSession_ClearLog(GWEN_HTTP_SESSION *sess); /*@}*/ /*@}*/ /* defgroup */ #endif aqbanking-5.6.4beta/src/libs/aqbanking/account_p.h0000644000175000017500000000252712364015477017054 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCOUNT_P_H #define AQBANKING_ACCOUNT_P_H #include "account_l.h" #include #include #include #include struct AB_ACCOUNT { GWEN_INHERIT_ELEMENT(AB_ACCOUNT) GWEN_LIST_ELEMENT(AB_ACCOUNT) uint32_t usage; uint32_t uniqueId; AB_ACCOUNT_TYPE accountType; AB_BANKING *banking; AB_PROVIDER *provider; char *backendName; char *subAccountId; char *accountNumber; char *bankCode; char *accountName; char *bankName; char *iban; char *bic; char *ownerName; char *currency; char *country; GWEN_STRINGLIST *userIds; GWEN_STRINGLIST *selectedUserIds; GWEN_DB_NODE *appData; GWEN_DB_NODE *providerData; char *dbId; }; static AB_ACCOUNT *AB_Account__freeAll_cb(AB_ACCOUNT *a, void *userData); #endif /* AQBANKING_ACCOUNT_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_deprec.c0000644000175000017500000006170712364015477020034 00000000000000/*************************************************************************** begin : Tue Sep 30 2008 copyright : (C) 2008 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /* This file is included by banking.c */ int AB_Banking__ImportConfDir(AB_BANKING *ab, const char *path, const char *groupName) { GWEN_STRINGLIST *sl; GWEN_BUFFER *nbuf; int rv; uint32_t pos; nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, path); sl=GWEN_StringList_new(); rv=GWEN_Directory_GetDirEntries(GWEN_Buffer_GetStart(nbuf), sl, NULL); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No configurations for group [%s]", groupName); } else { GWEN_STRINGLISTENTRY *se; GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); pos=GWEN_Buffer_GetPos(nbuf); se=GWEN_StringList_FirstEntry(sl); while(se) { GWEN_DB_NODE *dbConfig=NULL; GWEN_BUFFER *gbuf; /* get group name */ gbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Text_UnescapeToBuffer(GWEN_StringListEntry_Data(se), gbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(gbuf); GWEN_DB_Group_free(dbConfig); GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return rv; } GWEN_Buffer_AppendString(nbuf, GWEN_StringListEntry_Data(se)); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); GWEN_Buffer_AppendString(nbuf, "settings.conf"); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Reading file [%s]", GWEN_Buffer_GetStart(nbuf)); if (!GWEN_Directory_GetPath(GWEN_Buffer_GetStart(nbuf), GWEN_PATH_FLAGS_PATHMUSTEXIST | GWEN_PATH_FLAGS_NAMEMUSTEXIST | GWEN_PATH_FLAGS_VARIABLE)) { dbConfig=GWEN_DB_Group_new("shared"); rv=GWEN_DB_ReadFile(dbConfig, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP | GWEN_DB_FLAGS_ALLOW_EMPTY_STREAM); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbConfig); GWEN_Buffer_free(gbuf); GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, groupName, GWEN_Buffer_GetStart(gbuf)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock shared config [%s] (%d)", GWEN_Buffer_GetStart(gbuf), rv); GWEN_DB_Group_free(dbConfig); GWEN_Buffer_free(gbuf); GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, groupName, GWEN_Buffer_GetStart(gbuf), dbConfig); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save shared config [%s] (%d)", GWEN_Buffer_GetStart(gbuf), rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, groupName, GWEN_Buffer_GetStart(gbuf)); GWEN_DB_Group_free(dbConfig); GWEN_Buffer_free(gbuf); GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, groupName, GWEN_Buffer_GetStart(gbuf)); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock shared config [%s] (%d)", GWEN_Buffer_GetStart(gbuf), rv); GWEN_DB_Group_free(dbConfig); GWEN_Buffer_free(gbuf); GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return rv; } } /* if settings.conf in folder */ else { DBG_INFO(AQBANKING_LOGDOMAIN, "Path [%s] not found", GWEN_Buffer_GetStart(nbuf)); } GWEN_DB_Group_free(dbConfig); GWEN_Buffer_free(gbuf); GWEN_Buffer_Crop(nbuf, 0, pos); se=GWEN_StringListEntry_Next(se); } /* while */ } GWEN_StringList_free(sl); GWEN_Buffer_free(nbuf); return 0; } int AB_Banking_ImportConf3(AB_BANKING *ab) { char home[256]; GWEN_BUFFER *nbuf; uint32_t pos; GWEN_DB_NODE *dbSettings; GWEN_DB_NODE *db; int rv; uint32_t highestUid=0; uint32_t lastVersion; /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager. Maybe the gwenhywfar plugins are not installed correctly?"); return GWEN_ERROR_GENERIC; } rv=GWEN_Directory_GetHomeDirectory(home, sizeof(home)-1); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, home); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); GWEN_Buffer_AppendString(nbuf, ".aqbanking"); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); pos=GWEN_Buffer_GetPos(nbuf); GWEN_Buffer_AppendString(nbuf, "settings.conf"); dbSettings=GWEN_DB_Group_new("settings"); rv=GWEN_DB_ReadFile(dbSettings, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* now the settings.conf has been read, copy stuff */ lastVersion=GWEN_DB_GetIntValue(dbSettings, "lastVersion", 0, 0); /* import backends */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "backends"); if (db) { db=GWEN_DB_GetFirstGroup(db); while(db) { const char *groupName; groupName=GWEN_DB_GroupName(db); rv=AB_Banking_LockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock plugin config [%s] (%d)", groupName, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=AB_Banking_SavePluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save plugin config [%s] (%d)", groupName, rv); AB_Banking_UnlockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=AB_Banking_UnlockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock plugin config [%s] (%d)", groupName, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } db=GWEN_DB_GetNextGroup(db); } /* while */ } /* if backends */ /* import users */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "users"); if (db) { db=GWEN_DB_FindFirstGroup(db, "user"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for user"); } else { char groupName[32]; if (uid>highestUid) highestUid=uid; rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_USERS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for user [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock user config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save user config [%08x] (%d)", uid, rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock user config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "user"); } /* while */ } /* if users */ /* import accounts */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "accounts"); if (db) { db=GWEN_DB_FindFirstGroup(db, "account"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for account"); } else { char groupName[32]; if (uid>highestUid) highestUid=uid; rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for account [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save account config [%08x] (%d)", uid, rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock account config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "account"); } /* while */ } /* if accounts */ /* save main configuration */ rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock main config (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } GWEN_DB_ClearGroup(dbSettings, NULL); GWEN_DB_SetIntValue(dbSettings, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", lastVersion); rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config", dbSettings); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save main config (%d)", rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_MAIN, "config"); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock main config (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } GWEN_DB_Group_free(dbSettings); /* import shared configurations */ GWEN_Buffer_Crop(nbuf, 0, pos); GWEN_Buffer_AppendString(nbuf, "shared"); rv=AB_Banking__ImportConfDir(ab, GWEN_Buffer_GetStart(nbuf), AB_CFG_GROUP_SHARED); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); return rv; } /* import app configurations */ GWEN_Buffer_Crop(nbuf, 0, pos); GWEN_Buffer_AppendString(nbuf, "apps"); rv=AB_Banking__ImportConfDir(ab, GWEN_Buffer_GetStart(nbuf), AB_CFG_GROUP_APPS); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); return rv; } GWEN_Buffer_free(nbuf); if (highestUid) { rv=AB_Banking_SetUniqueId(ab, highestUid); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to store highest unique id used (%d)", rv); return rv; } } return 0; } int AB_Banking_HasConf3(AB_BANKING *ab) { char home[256]; GWEN_BUFFER *nbuf; //uint32_t pos; GWEN_DB_NODE *dbSettings; GWEN_DB_NODE *db; int rv; int backends=0; int users=0; int accounts=0; rv=GWEN_Directory_GetHomeDirectory(home, sizeof(home)-1); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, home); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); GWEN_Buffer_AppendString(nbuf, ".aqbanking"); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); //pos=GWEN_Buffer_GetPos(nbuf); GWEN_Buffer_AppendString(nbuf, "settings.conf"); if (GWEN_Directory_GetPath(GWEN_Buffer_GetStart(nbuf), GWEN_PATH_FLAGS_PATHMUSTEXIST | GWEN_PATH_FLAGS_NAMEMUSTEXIST | GWEN_PATH_FLAGS_VARIABLE)) { DBG_INFO(AQBANKING_LOGDOMAIN, "No settings.conf"); GWEN_Buffer_free(nbuf); return GWEN_ERROR_NOT_FOUND; } dbSettings=GWEN_DB_Group_new("settings"); rv=GWEN_DB_ReadFile(dbSettings, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* count backends */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "backends"); if (db) { db=GWEN_DB_GetFirstGroup(db); while(db) { backends++; db=GWEN_DB_GetNextGroup(db); } /* while */ } /* if backends */ /* count users */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "users"); if (db) { db=GWEN_DB_FindFirstGroup(db, "user"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for user"); } else { users++; } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "user"); } /* while */ } /* if users */ /* count accounts */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "accounts"); if (db) { db=GWEN_DB_FindFirstGroup(db, "account"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for account"); } else { accounts++; } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "account"); } /* while */ } /* if accounts */ GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); if (users) return 0; if (backends || accounts) return GWEN_ERROR_PARTIAL; return GWEN_ERROR_NO_DATA; } int AB_Banking_ImportConf2(AB_BANKING *ab) { char home[256]; GWEN_BUFFER *nbuf; uint32_t pos; GWEN_DB_NODE *dbSettings; GWEN_DB_NODE *db; int rv; uint32_t highestUid=0; //uint32_t lastVersion; /* check for config manager (created by AB_Banking_Init) */ if (ab->configMgr==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No config manager. Maybe the gwenhywfar plugins are not installed correctly?"); return GWEN_ERROR_GENERIC; } rv=GWEN_Directory_GetHomeDirectory(home, sizeof(home)-1); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, home); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); GWEN_Buffer_AppendString(nbuf, ".banking"); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); pos=GWEN_Buffer_GetPos(nbuf); GWEN_Buffer_AppendString(nbuf, "settings.conf"); dbSettings=GWEN_DB_Group_new("settings"); rv=GWEN_DB_ReadFile(dbSettings, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* now the settings.conf has been read, copy stuff */ //lastVersion=GWEN_DB_GetIntValue(dbSettings, "lastVersion", 0, 0); /* import backends */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "backends"); if (db) { db=GWEN_DB_GetFirstGroup(db); while(db) { const char *groupName; groupName=GWEN_DB_GroupName(db); rv=AB_Banking_LockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock plugin config [%s] (%d)", groupName, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=AB_Banking_SavePluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save plugin config [%s] (%d)", groupName, rv); AB_Banking_UnlockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=AB_Banking_UnlockPluginConfig(ab, AB_CFG_GROUP_BACKENDS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock plugin config [%s] (%d)", groupName, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } db=GWEN_DB_GetNextGroup(db); } /* while */ } /* if backends */ /* import users */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "users"); if (db) { db=GWEN_DB_FindFirstGroup(db, "user"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for user"); } else { char groupName[32]; if (uid>highestUid) highestUid=uid; rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_USERS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for user [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock user config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save user config [%08x] (%d)", uid, rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock user config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "user"); } /* while */ } /* if users */ /* import accounts */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "accounts"); if (db) { db=GWEN_DB_FindFirstGroup(db, "account"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for account"); } else { char groupName[32]; if (uid>highestUid) highestUid=uid; rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for account [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock account config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName, db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save account config [%08x] (%d)", uid, rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_ACCOUNTS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock account config [%08x] (%d)", uid, rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "account"); } /* while */ } /* if accounts */ GWEN_DB_Group_free(dbSettings); /* import shared configurations */ GWEN_Buffer_Crop(nbuf, 0, pos); GWEN_Buffer_AppendString(nbuf, "shared"); rv=AB_Banking__ImportConfDir(ab, GWEN_Buffer_GetStart(nbuf), AB_CFG_GROUP_SHARED); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); return rv; } /* import app configurations */ GWEN_Buffer_Crop(nbuf, 0, pos); GWEN_Buffer_AppendString(nbuf, "apps"); rv=AB_Banking__ImportConfDir(ab, GWEN_Buffer_GetStart(nbuf), AB_CFG_GROUP_APPS); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(nbuf); return rv; } GWEN_Buffer_free(nbuf); if (highestUid) { rv=AB_Banking_SetUniqueId(ab, highestUid); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to store highest unique id used (%d)", rv); return rv; } } return 0; } int AB_Banking_HasConf2(AB_BANKING *ab) { char home[256]; GWEN_BUFFER *nbuf; //uint32_t pos; GWEN_DB_NODE *dbSettings; GWEN_DB_NODE *db; int rv; int backends=0; int users=0; int accounts=0; rv=GWEN_Directory_GetHomeDirectory(home, sizeof(home)-1); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); return rv; } nbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(nbuf, home); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); GWEN_Buffer_AppendString(nbuf, ".banking"); GWEN_Buffer_AppendString(nbuf, GWEN_DIR_SEPARATOR_S); //pos=GWEN_Buffer_GetPos(nbuf); GWEN_Buffer_AppendString(nbuf, "settings.conf"); if (GWEN_Directory_GetPath(GWEN_Buffer_GetStart(nbuf), GWEN_PATH_FLAGS_PATHMUSTEXIST | GWEN_PATH_FLAGS_NAMEMUSTEXIST | GWEN_PATH_FLAGS_VARIABLE)) { DBG_INFO(AQBANKING_LOGDOMAIN, "No settings.conf"); GWEN_Buffer_free(nbuf); return GWEN_ERROR_NOT_FOUND; } dbSettings=GWEN_DB_Group_new("settings"); rv=GWEN_DB_ReadFile(dbSettings, GWEN_Buffer_GetStart(nbuf), GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); return rv; } /* count backends */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "backends"); if (db) { db=GWEN_DB_GetFirstGroup(db); while(db) { backends++; db=GWEN_DB_GetNextGroup(db); } /* while */ } /* if backends */ /* count users */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "users"); if (db) { db=GWEN_DB_FindFirstGroup(db, "user"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for user"); } else { users++; } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "user"); } /* while */ } /* if users */ /* count accounts */ db=GWEN_DB_GetGroup(dbSettings, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "accounts"); if (db) { db=GWEN_DB_FindFirstGroup(db, "account"); while(db) { uint32_t uid; uid=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0); if (uid==0) { DBG_WARN(AQBANKING_LOGDOMAIN, "No unique id for account"); } else { accounts++; } /* if unique id */ db=GWEN_DB_FindNextGroup(db, "account"); } /* while */ } /* if accounts */ GWEN_DB_Group_free(dbSettings); GWEN_Buffer_free(nbuf); if (users) return 0; if (backends || accounts) return GWEN_ERROR_PARTIAL; return GWEN_ERROR_NO_DATA; } aqbanking-5.6.4beta/src/libs/aqbanking/job.h0000644000175000017500000002620612367461467015662 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_JOB_H #define AQBANKING_JOB_H #include #include #include #include /* for AQBANKING_API */ #ifdef __cplusplus extern "C" { #endif /** @defgroup G_AB_JOB Online Banking Tasks * @ingroup G_AB_ONLINE_BANKING * * This group represents online banking tasks such as retrieving the balance, * downloading transaction statements, issue transfers etc. */ /** @defgroup G_AB_JOBS_GETBALANCE Get Balance * @ingroup G_AB_JOB */ /** @defgroup G_AB_JOBS_GETTRANSACTIONS Get Transaction Statements * @ingroup G_AB_JOB */ /** @defgroup G_AB_JOBS_XFERS Transfer Jobs * @ingroup G_AB_JOB */ /** @defgroup G_AB_JOBS_XFER_TRANSFER National Transfer * @ingroup G_AB_JOBS_XFERS */ /** @defgroup G_AB_JOBS_XFER_DEBIT Debit Notes * @ingroup G_AB_JOBS_XFERS */ /** @defgroup G_AB_JOBS_XFER_EU EU Transfer * @ingroup G_AB_JOBS_XFERS */ /** @defgroup G_AB_JOBS_XFER_INTERNAL Internal Transfer * @ingroup G_AB_JOBS_XFERS */ /** @defgroup G_AB_JOBS_XFER_SEPA_TRANSFER SEPA Transfer * @ingroup G_AB_JOBS_XFERS */ /** @defgroup G_AB_JOBS_DATED_TRANSFER Dated Transfers * @ingroup G_AB_JOB * * This is a scheduled transaction managed by the credit institute. */ /** @defgroup G_AB_JOBS_DATED_TRANSFER_MK Create a Dated Transfer * @ingroup G_AB_JOBS_DATED_TRANSFER */ /** @defgroup G_AB_JOBS_DATED_TRANSFER_MOD Modify a Dated Transfer * @ingroup G_AB_JOBS_DATED_TRANSFER */ /** @defgroup G_AB_JOBS_DATED_TRANSFER_DEL Delete a Dated Transfer * @ingroup G_AB_JOBS_DATED_TRANSFER */ /** @defgroup G_AB_JOBS_DATED_TRANSFER_GET Get Dated Transfers * @ingroup G_AB_JOBS_DATED_TRANSFER */ /** @defgroup G_AB_JOBS_STO Standing Orders * @ingroup G_AB_JOB * * Standing orders are transfers which are performed automatically by the * bank on a regular basis. */ /** @defgroup G_AB_JOBS_STO_MK Create a Standing Order * @ingroup G_AB_JOBS_STO */ /** @defgroup G_AB_JOBS_STO_MOD Modify a Standing Order * @ingroup G_AB_JOBS_STO */ /** @defgroup G_AB_JOBS_STO_DEL Delete a Standing Order * @ingroup G_AB_JOBS_STO */ /** @defgroup G_AB_JOBS_STO_GET Get Standing Orders * @ingroup G_AB_JOBS_STO */ /** @addtogroup G_AB_JOB * */ /*@{*/ typedef struct AB_JOB AB_JOB; GWEN_LIST2_FUNCTION_LIB_DEFS(AB_JOB, AB_Job, AQBANKING_API) /** This function frees all jobs contained in the given list and the list itself. */ AQBANKING_API void AB_Job_List2_FreeAll(AB_JOB_LIST2 *jl); /** This function frees all jobs contained in the given list but does not destroy * the list itself */ AQBANKING_API void AB_Job_List2_ClearAll(AB_JOB_LIST2 *jl); /** The status of a job. */ typedef enum { /** Job is new and not yet enqueued. */ AB_Job_StatusNew=0, /** job has been updated by the backend and is still not yet enqueued. */ AB_Job_StatusUpdated, /** Job has been enqueued, i.e. it has not yet been sent, but will be sent at the next AB_BANKING_ExecuteQueue(). These jobs are stored in the "todo" directory. */ AB_Job_StatusEnqueued, /** Job has been sent, but there is not yet any response. */ AB_Job_StatusSent, /** Job has been sent, and an answer has been received, so the Job has been successfully sent to the bank. However, the answer to this job said that the job is still pending at the bank server. This status is most likely used with transfer orders which are accepted by the bank server but checked (and possibly rejected) later. These jobs are stored in the "pending" directory.*/ AB_Job_StatusPending, /** Job has been sent, a response has been received, and everything has been sucessfully executed. These jobs are stored in the "finished" directory. */ AB_Job_StatusFinished, /** There was an error in jobs' execution. These jobs are stored in the * "finished" directory. Jobs are never enqueued twice for execution, * so if it has this status it will never be sent again. */ AB_Job_StatusError, /** Unknown status */ AB_Job_StatusUnknown=999 } AB_JOB_STATUS; /** The type of the job, which also corresponds to its subclass of AB_JOB. */ typedef enum { /** unknown job */ AB_Job_TypeUnknown=0, /** retrieve the balance of an online account */ AB_Job_TypeGetBalance, /** retrieve transaction statements for an online account */ AB_Job_TypeGetTransactions, /** issue a transfer */ AB_Job_TypeTransfer, /** issue a debit note (Lastschrift) */ AB_Job_TypeDebitNote, /** EU transfer (transfer within the EMU zone) */ AB_Job_TypeEuTransfer, /** retrieve list of standing orders for an online account */ AB_Job_TypeGetStandingOrders, /** retrieve list of dated transfers for an online account */ AB_Job_TypeGetDatedTransfers, /** creates a new standing order */ AB_Job_TypeCreateStandingOrder, /** modifies an existing standing order */ AB_Job_TypeModifyStandingOrder, /** deletes an existing standing order */ AB_Job_TypeDeleteStandingOrder, /** creates a new dated transfer */ AB_Job_TypeCreateDatedTransfer, /** modifies an existing dated transfer */ AB_Job_TypeModifyDatedTransfer, /** deletes an existing dated transfer */ AB_Job_TypeDeleteDatedTransfer, /* internal transfer between two accounts at the same bank */ AB_Job_TypeInternalTransfer, /** Load a prepaid card from a bank account */ AB_Job_TypeLoadCellPhone, /** SEPA transfer */ AB_Job_TypeSepaTransfer, /** SEPA debit note */ AB_Job_TypeSepaDebitNote, /** creates a new standing order (SEPA) */ AB_Job_TypeSepaCreateStandingOrder, /** modifies an existing standing order (SEPA) */ AB_Job_TypeSepaModifyStandingOrder, /** deletes an existing standing order (SEPA) */ AB_Job_TypeSepaDeleteStandingOrder, /** SEPA debit note with shortest possible setup time */ AB_Job_TypeSepaFlashDebitNote, /** get SEPA standing orders */ AB_Job_TypeSepaGetStandingOrders, } AB_JOB_TYPE; #ifdef __cplusplus } #endif #include #include #ifdef __cplusplus extern "C" { #endif /** @name Constructing, Destroying, Attaching * * Actually this group does not contain a constructor since you never * create an AB_JOB directly. You rather create a derived job (e.g. by using * @ref AB_JobGetBalance_new). */ /*@{*/ AQBANKING_API void AB_Job_free(AB_JOB *j); AQBANKING_API void AB_Job_Attach(AB_JOB *j); /*@}*/ /** @name Informational Functions * */ /*@{*/ /** * Every created job gets an unique id. This allows any application to * identify a specific job. However, unique ids are assigned when they get * enqueued (i.e. by calling @ref AB_Banking_EnqueueJob). */ AQBANKING_API uint32_t AB_Job_GetJobId(const AB_JOB *j); /** * Returns the name of the application which created this job. */ AQBANKING_API const char *AB_Job_GetCreatedBy(const AB_JOB *j); /** * Returns a GWEN_DB_NODE which can be used to store/retrieve data for * the currently running application. The group returned MUST NOT be * freed ! * AqBanking is able to separate and store the data for every application. */ AQBANKING_API GWEN_DB_NODE *AB_Job_GetAppData(AB_JOB *j); /** * Not all jobs have to be supported by every backend. The application needs * to know whether a job actually @b is supported, and this is done by calling * this function. It returns the error code (see @ref AB_ERROR) returned * by the backend when asked to check for this job. */ AQBANKING_API int AB_Job_CheckAvailability(AB_JOB *j); /** * Returns the status of this job. */ AQBANKING_API AB_JOB_STATUS AB_Job_GetStatus(const AB_JOB *j); AQBANKING_API void AB_Job_SetStatus(AB_JOB *j, AB_JOB_STATUS st); /** * Returns the time when the status of this job changed last. */ AQBANKING_API const GWEN_TIME *AB_Job_GetLastStatusChange(const AB_JOB *j); /** * Returns the job type. */ AQBANKING_API AB_JOB_TYPE AB_Job_GetType(const AB_JOB *j); /** * Every job is linked to a single account to operate on. */ AQBANKING_API AB_ACCOUNT *AB_Job_GetAccount(const AB_JOB *j); /** * Returns a text result provided by the backend upon execution of this * job. This should only be presented to the user when there is no other * way to determine the result (e.g. no log etc). */ AQBANKING_API const char *AB_Job_GetResultText(const AB_JOB *j); AQBANKING_API const char *AB_Job_GetUsedTan(const AB_JOB *j); /*@}*/ /** @name Transaction Functions * */ /*@{*/ AQBANKING_API int AB_Job_SetTransaction(AB_JOB *j, const AB_TRANSACTION *t); AQBANKING_API AB_TRANSACTION *AB_Job_GetTransaction(const AB_JOB *j); AQBANKING_API const AB_TRANSACTION_LIMITS *AB_Job_GetFieldLimits(AB_JOB *j); AQBANKING_API void AB_Job_SetFieldLimits(AB_JOB *j, AB_TRANSACTION_LIMITS *limits); /*@}*/ /** @name Helper Functions * */ /*@{*/ /** * Transforms the given status code into a string. */ AQBANKING_API const char *AB_Job_Status2Char(AB_JOB_STATUS i); /** * Transforms the given string into a job status code. */ AQBANKING_API AB_JOB_STATUS AB_Job_Char2Status(const char *s); /** * Transforms the given job type into a string. */ AQBANKING_API const char *AB_Job_Type2Char(AB_JOB_TYPE i); /** * Transforms the given string into a job type. */ AQBANKING_API AB_JOB_TYPE AB_Job_Char2Type(const char *s); /** * Transforms the given job type into a localized string which can be * presented to the user. */ AQBANKING_API const char *AB_Job_Type2LocalChar(AB_JOB_TYPE i); AQBANKING_API GWEN_TIME *AB_Job_DateFromDb(GWEN_DB_NODE *db, const char *name); AQBANKING_API void AB_Job_DateOnlyToDb(const GWEN_TIME *ti, GWEN_DB_NODE *db, const char *name); AQBANKING_API GWEN_TIME *AB_Job_DateOnlyFromDb(GWEN_DB_NODE *db, const char *name); AQBANKING_API void AB_Job_DateToDb(const GWEN_TIME *ti, GWEN_DB_NODE *db, const char *name); /*@}*/ /** @name Logging Functions * * AqBanking logs every activity on a job. These logs can be usefull when * something went wrong. * If a job performs without problems most of the logs are removed from the * job because otherwise the jobs would fill up your disk space. */ /*@{*/ AQBANKING_API void AB_Job_Log(AB_JOB *j, GWEN_LOGGER_LEVEL ll, const char *who, const char *txt); /** * Returns a string list containing the logs of the job. Each entry of that * string list contains the date/time, loglevel, source and text. * The caller becomes the owner of the returned object (if any), please call * @ref GWEN_StringList_free on it to avoid memory leaks. */ AQBANKING_API GWEN_STRINGLIST *AB_Job_GetLogs(const AB_JOB *j); /*@}*/ /*@}*/ /* defgroup */ #ifdef __cplusplus } #endif #endif /* AQBANKING_JOB_H */ aqbanking-5.6.4beta/src/libs/aqbanking/i18n_l.h0000644000175000017500000000140412364015477016164 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_I18N_L_H #define AQBANKING_I18N_L_H #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg #endif /* AQBANKING_I18N_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/country_p.h0000644000175000017500000000145412364015477017121 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_COUNTRY_P_H #define AQBANKING_COUNTRY_P_H #include "country_l.h" struct AB_COUNTRY { const char *name; const char *code; int numericCode; const char *currencyName; const char *currencyCode; }; #endif /* AQBANKING_COUNTRY_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/0000755000175000017500000000000012643540651016143 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/types/message_l.h0000644000175000017500000000065412372461742020202 00000000000000/* This file is auto-generated from "message.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef MESSAGE_L_H #define MESSAGE_L_H /** @page P_AB_MESSAGE_LIB AB_Message (lib) This page describes the properties of AB_MESSAGE */ #include "message.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* MESSAGE_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/security_p.h0000644000175000017500000000075312372461742020431 00000000000000/* This file is auto-generated from "security.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef SECURITY_P_H #define SECURITY_P_H #include "security_l.h" struct AB_SECURITY { GWEN_LIST_ELEMENT(AB_SECURITY) int _usage; int _modified; char *name; char *uniqueId; char *nameSpace; char *tickerSymbol; AB_VALUE *units; AB_VALUE *unitPriceValue; GWEN_TIME *unitPriceDate; }; #endif /* SECURITY_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionfns.h0000644000175000017500000000511312364015477021273 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_TRANSACTIONFNS_H #define AQBANKING_TRANSACTIONFNS_H #include #include #ifdef __cplusplus extern "C" { #endif /** * @return 0 if both transactions are equal, 1 otherwise (and -1 on error) */ AQBANKING_API int AB_Transaction_Compare(const AB_TRANSACTION *t1, const AB_TRANSACTION *t0); /** * Fills "local account" parts of the given transaction with the data * from the given account. In particular, the following fields are set * through this function: SetLocalCountry, SetRemoteCountry, * SetLocalBankCode, SetLocalAccountNumber, and SetLocalName. */ AQBANKING_API void AB_Transaction_FillLocalFromAccount(AB_TRANSACTION *t, const AB_ACCOUNT *a); AQBANKING_API int AB_Transaction_CheckPurposeAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckNamesAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckTextKeyAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckRecurrenceAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckFirstExecutionDateAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckDateAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); AQBANKING_API int AB_Transaction_CheckDateAgainstSequenceLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim); /** * Checks whether a given transaction conforms to SEPA specs. This functions especially checks whether local and remote * BIC and IBAN are present and whether the local and remote names conform to the retricted SEPA character set. */ AQBANKING_API int AB_Transaction_CheckForSepaConformity(const AB_TRANSACTION *t, int restricted); AQBANKING_API int AB_Transaction_WriteToFile(const AB_TRANSACTION *t, const char *tFile); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* AQBANKING_TRANSACTIONFNS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/user.h0000644000175000017500000001271312372461742017220 00000000000000/* This file is auto-generated from "user.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef USER_H #define USER_H /** @page P_AB_USER_PUBLIC AB_User (public) This page describes the properties of AB_USER This group represents a user within AqBanking. Please note: Changing any of the attributes of a user permanently requires calling @ref AB_Banking_BeginExclUseAccount() before the modifications and @ref AB_Banking_EndExclUseAccount() afterwards. This locking makes sure that concurrent access to the settings doesn't corrupt the configuration database.@anchor AB_USER_UniqueId

UniqueId

Set this property with @ref AB_User_SetUniqueId, get it with @ref AB_User_GetUniqueId

@anchor AB_USER_BackendName

BackendName

Set this property with @ref AB_User_SetBackendName, get it with @ref AB_User_GetBackendName

@anchor AB_USER_UserName

UserName

Set this property with @ref AB_User_SetUserName, get it with @ref AB_User_GetUserName

@anchor AB_USER_UserId

UserId

Set this property with @ref AB_User_SetUserId, get it with @ref AB_User_GetUserId

@anchor AB_USER_CustomerId

CustomerId

Set this property with @ref AB_User_SetCustomerId, get it with @ref AB_User_GetCustomerId

@anchor AB_USER_Country

Country

Set this property with @ref AB_User_SetCountry, get it with @ref AB_User_GetCountry

@anchor AB_USER_BankCode

BankCode

Set this property with @ref AB_User_SetBankCode, get it with @ref AB_User_GetBankCode

@anchor AB_USER_LastSessionId

LastSessionId

Set this property with @ref AB_User_SetLastSessionId, get it with @ref AB_User_GetLastSessionId

@anchor AB_USER_Banking

Banking

Set this property with @ref AB_User_SetBanking, get it with @ref AB_User_GetBanking

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_USER AB_USER; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* pre-headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_USER, AQBANKING_API) GWEN_LIST2_FUNCTION_LIB_DEFS(AB_USER, AB_User, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_User_List2_freeAll(AB_USER_LIST2 *stl); /* post-headers */ #include #include /** Destroys the given object. */ AQBANKING_API void AB_User_free(AB_USER *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_User_Attach(AB_USER *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_User_ReadDb(AB_USER *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_User_toDb(const AB_USER*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_User_IsModified(const AB_USER *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_User_SetModified(AB_USER *st, int i); /** * Returns the property @ref AB_USER_UniqueId */ AQBANKING_API uint32_t AB_User_GetUniqueId(const AB_USER *el); /** * Set the property @ref AB_USER_UniqueId */ AQBANKING_API void AB_User_SetUniqueId(AB_USER *el, uint32_t d); /** * Returns the property @ref AB_USER_BackendName */ AQBANKING_API const char *AB_User_GetBackendName(const AB_USER *el); /** * Set the property @ref AB_USER_BackendName */ AQBANKING_API void AB_User_SetBackendName(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_UserName */ AQBANKING_API const char *AB_User_GetUserName(const AB_USER *el); /** * Set the property @ref AB_USER_UserName */ AQBANKING_API void AB_User_SetUserName(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_UserId */ AQBANKING_API const char *AB_User_GetUserId(const AB_USER *el); /** * Set the property @ref AB_USER_UserId */ AQBANKING_API void AB_User_SetUserId(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_CustomerId */ AQBANKING_API const char *AB_User_GetCustomerId(const AB_USER *el); /** * Set the property @ref AB_USER_CustomerId */ AQBANKING_API void AB_User_SetCustomerId(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_Country */ AQBANKING_API const char *AB_User_GetCountry(const AB_USER *el); /** * Set the property @ref AB_USER_Country */ AQBANKING_API void AB_User_SetCountry(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_BankCode */ AQBANKING_API const char *AB_User_GetBankCode(const AB_USER *el); /** * Set the property @ref AB_USER_BankCode */ AQBANKING_API void AB_User_SetBankCode(AB_USER *el, const char *d); /** * Returns the property @ref AB_USER_LastSessionId */ AQBANKING_API uint32_t AB_User_GetLastSessionId(const AB_USER *el); /** * Set the property @ref AB_USER_LastSessionId */ AQBANKING_API void AB_User_SetLastSessionId(AB_USER *el, uint32_t d); /** * Returns the property @ref AB_USER_Banking */ AQBANKING_API AB_BANKING *AB_User_GetBanking(const AB_USER *el); /** * Set the property @ref AB_USER_Banking */ AQBANKING_API void AB_User_SetBanking(AB_USER *el, AB_BANKING *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* USER_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/cellphoneproduct_l.h0000644000175000017500000000077012372461742022127 00000000000000/* This file is auto-generated from "cellphoneproduct.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef CELLPHONEPRODUCT_L_H #define CELLPHONEPRODUCT_L_H /** @page P_AB_CELLPHONE_PRODUCT_LIB AB_CellPhoneProduct (lib) This page describes the properties of AB_CELLPHONE_PRODUCT */ #include "cellphoneproduct.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* CELLPHONEPRODUCT_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/security_l.h0000644000175000017500000000066612372461742020430 00000000000000/* This file is auto-generated from "security.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef SECURITY_L_H #define SECURITY_L_H /** @page P_AB_SECURITY_LIB AB_Security (lib) This page describes the properties of AB_SECURITY */ #include "security.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* SECURITY_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transaction.xml0000644000175000017500000010521412641027237021133 00000000000000 This type contains the description of a textkey. Please note that all text fields are in UTF-8.
aqbanking/error.h
This is the localized name for the text key value given above. This is the localized description for the text key value given above.
This type describes the limits for fields of an @ref AB_TRANSACTION. The limits have the following meanings:
  • maxLenSOMETHING: if 0 then this limit is unknown, if -1 then the described element is not allowed to be set in the transaction. All other values represent the maximum length of the described field.
  • minLenSOMETHING: if 0 then this limit is unknown. All other values represent the minimum length of the described field.
  • maxLinesSOMETHING: if 0 then this limit is unknown All other values represent the maximum number of lines for the described field.
  • minLinesSOMETHING: if 0 then this limit is unknown. All other values represent the minimum number of lines for the described field.
  • valuesSOMETHING: A list of allowed values (as string). If this list is empty then there all values are allowed (those lists @b exist in any case, so the appropriate getter function will never return NULL).
  • allowSOMETHING: If SOMETHING is allowed then the value is "1". If SOMETHING is NOT allowed then the value is "-1". If it is unknown whether SOMETHING is allowed or not then this value is "0".
So if you want to check whether an given field is at all allowed you must check whether "maxLenSOMETHING" has a value of "-1".
gwenhywfar/types.h
gwenhywfar/stringlist.h
aqbanking/error.h
aqbanking/textkeydescr.h
Limits for the issuer name. Limits for the payee name. Limits for local bank code. Limits for local account id. Limits for local account id suffix. Limits for remote bank code. Limits for remote account number. Limits for remote account id suffix. Limits for remote IAN. Limits for textKey. This string list contains one entry for every supported text key. The values must be positive integers in decimal form (no leading zero, no comma or decimal point). This list of text key descriptions may contain an entry for every supported text key. However, not all backends fill this list and this list does not have to be complete. If you want to know which textkeys are supported please use valuesTextKey instead. Limits for customer reference. Limits for bank reference. Limits for purpose (called memo in some apps). Limits for date. Defines whether setting of the execution date (@ref AB_Transaction_SetDate) is required (value=1) or forbidden (value=-1), value=0 means "unknown". These limits apply to standing orders and dated transfers only. Minimum time in days between issuing of a request and its first execution. Maximum time in days between issuing of a request and its first execution. Minimum time in days between issuing of a request and its first execution. This is for a first request (e.g. first debit note). Maximum time in days between issuing of a request and its first execution. This is for a first request (e.g. first debit note). Minimum time in days between issuing of a request and its execution. This is for a one time only request (e.g. onetime debit note). Maximum time in days between issuing of a request and its execution. This is for a one time only request (e.g. onetime debit note). Minimum time in days between issuing of a request and its execution. This is for a following request (e.g. a recurring debit note). Maximum time in days between issuing of a request and its first execution. This is for a following request (e.g. a recurring debit note). Minimum time in days between issuing of a request and its execution. This is for a final request (e.g. last debit note). Maximum time in days between issuing of a request and its execution. This is for a final request (e.g. last debit note). This string list contains one entry for every supported cycle. These value are accepted when "period" is "weekly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all cycles possible) and "1"-"52". This string list contains one entry for every supported cycle. These value are accepted when "period" is "monthly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all cycles possible) and "1"-"12". This string list contains one entry for every supported day of the week. These value are accepted when "period" is "weekly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all days allowed) and "1"-"7". This string list contains one entry for every supported monthly cycle. These value are accepted when "period" is "monthly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed are "0" (all days possible), "1"-"30", "97" (ultimo-2), "98" (ultimo-1) and "99" (ultimo).
none No period. monthly The standing order is to be executed every month. weekly The standing order is to be executed every week. transaction Simple transaction (as in transaction statements) transfer Transfer type of transaction (as used with transfer jobs) debitNote Debit note type of transaction (as used with debit note jobs) euTransfer EU-Transfer type of transaction (as used for with transfer jobs) sepaTransfer SEPA-Transfer type of transaction (as used with SEPA transfer jobs) sepaDebitNote SEPA debit note type of transaction (as used with SEPA debit note jobs) internalTransfer Internal transfer (transfer between accounts at the same bank) none No transfer sub-type standard Standard transfer. check Check. bookedDebitNote Debit note (Abbuchungsverfahren) drawnDebitNote Debit note (Einzugsermaechtigung) standingOrder Standing order (Dauerauftrag) loan Loan transfer. euStandard EU standard transfer. euASAP Eu transfer which is to be executed the same day. buy Buy stocks and alike sell Sell stocks and alike reinvest Reinvestment. dividend Dividend. none No status. accepted The transfer has been accepted by the bank. rejected The transfer has been rejected by the bank (or was erroneous). pending The transfer is still pending. sending The transfer is being sent. autoReconciled The transfer has automatically been reconciled. manuallyReconciled The transfer has automatically been reconciled. revoked The transfer has been revoked. aborted The transfer has been aborted. Nobody Nobody is to be charged. local Issuer is to be charged. remote Peer is to be charged. share Issuer and peer share the charges. once One-time operation, OOFF. first First operation with more following, FRST. following Following operation (not the first), RCUR. final Final operation (last), FNAL. Only used if it is known that this is the final one. This type contains all important information about transactions. All text fields are in UTF-8.
gwenhywfar/types.h
gwenhywfar/gwentime.h
gwenhywfar/gwendate.h
gwenhywfar/stringlist.h
aqbanking/value.h
aqbanking/transactionlimits.h
aqbanking/transactionfns.h
This group contains information about the local account. This is the two-character country code according to ISO 3166-1 (Alpha-2). This is also used in DNS toplevel domain names. For Germany use "DE" (not case-sensitive). This is the code of the local bank (i.e. your bank). This is the branch id of the local bank (OFX only) If your account has subaccounts which are distinguished by different suffixes, then this is that suffix. Otherwise it's empty. (HBCI only) International Bank Account Number according to ECBS EBS 204.
PosMeaning
0-1Country code according to ISO 3166
2-3Checksum
4-33Country specific account info
Examples:
  • BE62510007547061
  • FR1420041010050500013M02606
This is the SWIFT id of the local bank.
This group contains information about the remote account. This is the two-character ISO country code (as used in toplevel domains). For Germany use "DE". This is the branch id of the remote bank (OFX only) International Bank Account Number according to ECBS EBS 204.
PosMeaning
0-1Country code according to ISO 3166
2-3Checksum
4-33Country specific account info
Examples:
  • BE62510007547061
  • FR1420041010050500013M02606
This is the SWIFT id of the local bank.
This is a unique id assigned by the application. However, when adding a transaction to a job (like JobTransfer) this id is assigned by AqBanking to make sure that this id is unique across all applications. This is a unique id assigned by the application only. This id is never changed by AqBanking. This id is assigned by a backend when sending mutliple transfer jobs in one backend request (e.g. AqHBCI uses DTAUS files when sending multi-transfer requests; in this case every every transfer which goes into the same DTAUS file receives the same id). The date when the transaction was really executed (Datum Valuta/Wertstellung) The date when the transaction was booked (but sometimes it is unused). (Buchungsdatum)

This group contains information which differ between backends.

Some of this information might not even be supported by every backends.

A numerical transaction code, defined for all kinds of different actions. (Textschluessel)

For a normal transfer you should set it to 51. For debit notes the values 04 or 05 may be used. For other values please refer to your credit institute. (HBCI only)

An extension to the text key (Textschluesselergaenzung, SWIFT Feld 34)

For a normal transfer you should set it to 51. For debit notes the values 04 or 05 may be used. For other values please refer to your credit institute. (HBCI only)

this is the transaction id that tells you more about the type of transaction (3 character code) (Buchungsschluessel) (HBCI only) Reference string, if the customer (you) has specified one. (E.g. the cheque number.) Otherwise "NONREF" or empty (Kundenreferenz) Reference string for this transaction given by the bank, if it has given one. Otherwise empty. (Bankreferenz) This is a reference provided by the issuer of a SEPA transfer. Used for SEPA transfers. A 3 digit numerical transaction code, defined for all kinds of different actions. (Geschaeftsvorfallcode) Transaction text (e.g. STANDING ORDER) (Buchungstext)

This is an id optionally assigned by the Financial Institute. It is mostly used by OFX.

This string list contains the purpose of the transaction. Every entry of this list represents a single purpose line.

This string list contains the categories this transaction belongs to. This element is not used by AqBanking itself but some im/exporter plugins may choose to use these.

This group contains information which is used with standing orders. It is not needed for other usage of this type.

This variable contains the execution period (e.g. whether a standing order is to be executed weekly or monthly etc). The standing order is executed every cycle x period. So if period is weekly and cycle is 2 then the standing order is executed every 2 weeks. The execution day. The meaning of this variable depends on the content of period:
  • monthly: day of the month (starting with 1)
  • weekly: day of the week (starting with 1=Monday)
The date when the standing order is to be executed for the first time. The date when the standing order is to be executed for the last time. The date when the standing order is to be executed next (this field is only interesting when retrieving the list of currently active standing orders)

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

This variable contains the type of transfer (transfer, debit note etc). This variable contains the sub-type of transfer. This variable contains the status of the transfer (accepted, rejected, pending). etc). Specify who is to be charged for the transaction.

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

"Creditor Scheme Identification" ("Glaeubiger-ID", assigned by Deutsche Bundesbank) "SEPA Direct debit mandate id "Issue date of the direct debit mandate "Debitor name for direct debit mandate if given by the debtor Original value for "Creditor Scheme Identification", in case that value changed over time "Original SEPA Direct debit mandate id, in case that changed over time "Original SEPA Direct debit creditor name, in case that changed over time Sequence type of the debit (one-time, first, recurring).
aqbanking-5.6.4beta/src/libs/aqbanking/types/user.xml0000644000175000017500000000455612364015477017600 00000000000000 This group represents a user within AqBanking. Please note: Changing any of the attributes of a user permanently requires calling @ref AB_Banking_BeginExclUseAccount() before the modifications and @ref AB_Banking_EndExclUseAccount() afterwards. This locking makes sure that concurrent access to the settings doesn't corrupt the configuration database.
gwenhywfar/types.h
gwenhywfar/fslock.h
aqbanking/error.h
aqbanking/banking.h
aqbanking/userfns.h
userfns_l.h
aqbanking-5.6.4beta/src/libs/aqbanking/types/user_l.h0000644000175000017500000000310012372461742017521 00000000000000/* This file is auto-generated from "user.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef USER_L_H #define USER_L_H /** @page P_AB_USER_LIB AB_User (lib) This page describes the properties of AB_USER This group represents a user within AqBanking. Please note: Changing any of the attributes of a user permanently requires calling @ref AB_Banking_BeginExclUseAccount() before the modifications and @ref AB_Banking_EndExclUseAccount() afterwards. This locking makes sure that concurrent access to the settings doesn't corrupt the configuration database.@anchor AB_USER_FileLock

FileLock

Set this property with @ref AB_User_SetFileLock, get it with @ref AB_User_GetFileLock

@anchor AB_USER_DbId

DbId

Set this property with @ref AB_User_SetDbId, get it with @ref AB_User_GetDbId

*/ #include #include "user.h" #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_DEFS(AB_USER, AB_User) /** * Returns the property @ref AB_USER_FileLock */ AQBANKING_API GWEN_FSLOCK *AB_User_GetFileLock(const AB_USER *el); /** * Set the property @ref AB_USER_FileLock */ AQBANKING_API void AB_User_SetFileLock(AB_USER *el, GWEN_FSLOCK *d); /** * Returns the property @ref AB_USER_DbId */ AQBANKING_API const char *AB_User_GetDbId(const AB_USER *el); /** * Set the property @ref AB_USER_DbId */ AQBANKING_API void AB_User_SetDbId(AB_USER *el, const char *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* USER_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/pin.xml0000644000175000017500000000100212364015477017367 00000000000000
gwenhywfar/types.h
aqbanking/banking.h
aqbanking-5.6.4beta/src/libs/aqbanking/types/textkeydescr_l.h0000644000175000017500000000106412372461741021267 00000000000000/* This file is auto-generated from "textkeydescr.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TEXTKEYDESCR_L_H #define TEXTKEYDESCR_L_H /** @page P_AB_TEXTKEY_DESCR_LIB AB_TextKeyDescr (lib) This page describes the properties of AB_TEXTKEY_DESCR This type contains the description of a textkey. Please note that all text fields are in UTF-8.*/ #include "textkeydescr.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TEXTKEYDESCR_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionlimits_p.h0000644000175000017500000000636412372461741022334 00000000000000/* This file is auto-generated from "transactionlimits.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTIONLIMITS_P_H #define TRANSACTIONLIMITS_P_H #include "transactionlimits_l.h" struct AB_TRANSACTION_LIMITS { GWEN_LIST_ELEMENT(AB_TRANSACTION_LIMITS) int _usage; int _modified; int maxLenLocalName; int minLenLocalName; int maxLenRemoteName; int minLenRemoteName; int maxLinesRemoteName; int minLinesRemoteName; int maxLenLocalBankCode; int minLenLocalBankCode; int maxLenLocalAccountNumber; int minLenLocalAccountNumber; int maxLenLocalSuffix; int minLenLocalSuffix; int maxLenRemoteBankCode; int minLenRemoteBankCode; int maxLenRemoteAccountNumber; int minLenRemoteAccountNumber; int maxLenRemoteSuffix; int minLenRemoteSuffix; int maxLenRemoteIban; int minLenRemoteIban; int maxLenTextKey; int minLenTextKey; GWEN_STRINGLIST *valuesTextKey; AB_TEXTKEY_DESCR_LIST *textKeys; int maxLenCustomerReference; int minLenCustomerReference; int maxLenBankReference; int minLenBankReference; int maxLenPurpose; int minLenPurpose; int maxLinesPurpose; int minLinesPurpose; int needDate; int minValueSetupTime; int maxValueSetupTime; int minValueSetupTimeFirst; int maxValueSetupTimeFirst; int minValueSetupTimeOnce; int maxValueSetupTimeOnce; int minValueSetupTimeRecurring; int maxValueSetupTimeRecurring; int minValueSetupTimeFinal; int maxValueSetupTimeFinal; GWEN_STRINGLIST *valuesCycleWeek; GWEN_STRINGLIST *valuesCycleMonth; GWEN_STRINGLIST *valuesExecutionDayWeek; GWEN_STRINGLIST *valuesExecutionDayMonth; int allowMonthly; int allowWeekly; int allowChangeRecipientAccount; int allowChangeRecipientName; int allowChangeValue; int allowChangeTextKey; int allowChangePurpose; int allowChangeFirstExecutionDate; int allowChangeLastExecutionDate; int allowChangeCycle; int allowChangePeriod; int allowChangeExecutionDay; }; /** @name Issuer Name * Limits for the issuer name.*/ /*@{*/ /*@}*/ /** @name Payee Name * Limits for the payee name.*/ /*@{*/ /*@}*/ /** @name Local Bank Code * Limits for local bank code.*/ /*@{*/ /*@}*/ /** @name Local Account Id * Limits for local account id.*/ /*@{*/ /*@}*/ /** @name Local Account Number * Limits for local account id suffix.*/ /*@{*/ /*@}*/ /** @name Remote Bank Code * Limits for remote bank code.*/ /*@{*/ /*@}*/ /** @name Remote Account Number * Limits for remote account number.*/ /*@{*/ /*@}*/ /** @name Remote Account Number Suffix * Limits for remote account id suffix.*/ /*@{*/ /*@}*/ /** @name Remote IBAN * Limits for remote IAN.*/ /*@{*/ /*@}*/ /** @name Text Key * Limits for textKey.*/ /*@{*/ /*@}*/ /** @name Customer Reference * Limits for customer reference.*/ /*@{*/ /*@}*/ /** @name Bank Reference * Limits for bank reference.*/ /*@{*/ /*@}*/ /** @name Purpose * Limits for purpose (called memo in some apps).*/ /*@{*/ /*@}*/ /** @name Date * Limits for date.*/ /*@{*/ /*@}*/ /** @name Standing Orders And Dated Transfer * These limits apply to standing orders and dated transfers only.*/ /*@{*/ /*@}*/ #endif /* TRANSACTIONLIMITS_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/pin.c0000644000175000017500000001026412372461742017022 00000000000000/* This file is auto-generated from "pin.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "pin_p.h" #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_PIN, AB_Pin) GWEN_LIST2_FUNCTIONS(AB_PIN, AB_Pin) AB_PIN *AB_Pin_new(void) { AB_PIN *st; GWEN_NEW_OBJECT(AB_PIN, st) st->_usage=1; GWEN_LIST_INIT(AB_PIN, st) return st; } void AB_Pin_free(AB_PIN *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->token) free(st->token); if (st->value) free(st->value); if (st->hash) free(st->hash); if (st->status) free(st->status); GWEN_LIST_FINI(AB_PIN, st) GWEN_FREE_OBJECT(st); } } } AB_PIN *AB_Pin_dup(const AB_PIN *d) { AB_PIN *st; assert(d); st=AB_Pin_new(); if (d->token) st->token=strdup(d->token); if (d->value) st->value=strdup(d->value); if (d->hash) st->hash=strdup(d->hash); if (d->status) st->status=strdup(d->status); return st; } int AB_Pin_toDb(const AB_PIN *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->token) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "token", st->token)) return -1; if (st->value) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", st->value)) return -1; if (st->hash) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "hash", st->hash)) return -1; if (st->status) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "status", st->status)) return -1; return 0; } int AB_Pin_ReadDb(AB_PIN *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_Pin_SetToken(st, GWEN_DB_GetCharValue(db, "token", 0, 0)); AB_Pin_SetValue(st, GWEN_DB_GetCharValue(db, "value", 0, 0)); AB_Pin_SetHash(st, GWEN_DB_GetCharValue(db, "hash", 0, 0)); AB_Pin_SetStatus(st, GWEN_DB_GetCharValue(db, "status", 0, 0)); return 0; } AB_PIN *AB_Pin_fromDb(GWEN_DB_NODE *db) { AB_PIN *st; assert(db); st=AB_Pin_new(); AB_Pin_ReadDb(st, db); st->_modified=0; return st; } const char *AB_Pin_GetToken(const AB_PIN *st) { assert(st); return st->token; } void AB_Pin_SetToken(AB_PIN *st, const char *d) { assert(st); if (st->token) free(st->token); if (d && *d) st->token=strdup(d); else st->token=0; st->_modified=1; } const char *AB_Pin_GetValue(const AB_PIN *st) { assert(st); return st->value; } void AB_Pin_SetValue(AB_PIN *st, const char *d) { assert(st); if (st->value) free(st->value); if (d && *d) st->value=strdup(d); else st->value=0; st->_modified=1; } const char *AB_Pin_GetHash(const AB_PIN *st) { assert(st); return st->hash; } void AB_Pin_SetHash(AB_PIN *st, const char *d) { assert(st); if (st->hash) free(st->hash); if (d && *d) st->hash=strdup(d); else st->hash=0; st->_modified=1; } const char *AB_Pin_GetStatus(const AB_PIN *st) { assert(st); return st->status; } void AB_Pin_SetStatus(AB_PIN *st, const char *d) { assert(st); if (st->status) free(st->status); if (d && *d) st->status=strdup(d); else st->status=0; st->_modified=1; } int AB_Pin_IsModified(const AB_PIN *st) { assert(st); return st->_modified; } void AB_Pin_SetModified(AB_PIN *st, int i) { assert(st); st->_modified=i; } void AB_Pin_Attach(AB_PIN *st) { assert(st); st->_usage++; } AB_PIN *AB_Pin_List2__freeAll_cb(AB_PIN *st, void *user_data) { AB_Pin_free(st); return 0; } void AB_Pin_List2_freeAll(AB_PIN_LIST2 *stl) { if (stl) { AB_Pin_List2_ForEach(stl, AB_Pin_List2__freeAll_cb, 0); AB_Pin_List2_free(stl); } } AB_PIN_LIST *AB_Pin_List_dup(const AB_PIN_LIST *stl) { if (stl) { AB_PIN_LIST *nl; AB_PIN *e; nl=AB_Pin_List_new(); e=AB_Pin_List_First(stl); while(e) { AB_PIN *ne; ne=AB_Pin_dup(e); assert(ne); AB_Pin_List_Add(ne, nl); e=AB_Pin_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/message.c0000644000175000017500000001213512372461742017657 00000000000000/* This file is auto-generated from "message.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "message_p.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_MESSAGE, AB_Message) GWEN_LIST2_FUNCTIONS(AB_MESSAGE, AB_Message) AB_MESSAGE *AB_Message_new(void) { AB_MESSAGE *st; GWEN_NEW_OBJECT(AB_MESSAGE, st) st->_usage=1; GWEN_LIST_INIT(AB_MESSAGE, st) return st; } void AB_Message_free(AB_MESSAGE *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->subject) free(st->subject); if (st->text) free(st->text); if (st->dateReceived) GWEN_Time_free(st->dateReceived); GWEN_LIST_FINI(AB_MESSAGE, st) GWEN_FREE_OBJECT(st); } } } AB_MESSAGE *AB_Message_dup(const AB_MESSAGE *d) { AB_MESSAGE *st; assert(d); st=AB_Message_new(); st->userId=d->userId; st->accountId=d->accountId; if (d->subject) st->subject=strdup(d->subject); if (d->text) st->text=strdup(d->text); if (d->dateReceived) st->dateReceived=GWEN_Time_dup(d->dateReceived); return st; } int AB_Message_toDb(const AB_MESSAGE *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "userId", st->userId)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "accountId", st->accountId)) return -1; if (st->subject) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "subject", st->subject)) return -1; if (st->text) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "text", st->text)) return -1; if (st->dateReceived) if (GWEN_Time_toDb(st->dateReceived, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "dateReceived"))) return -1; return 0; } int AB_Message_ReadDb(AB_MESSAGE *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_Message_SetUserId(st, GWEN_DB_GetIntValue(db, "userId", 0, 0)); AB_Message_SetAccountId(st, GWEN_DB_GetIntValue(db, "accountId", 0, 0)); AB_Message_SetSubject(st, GWEN_DB_GetCharValue(db, "subject", 0, 0)); AB_Message_SetText(st, GWEN_DB_GetCharValue(db, "text", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "dateReceived"); if (dbT) { if (st->dateReceived) GWEN_Time_free(st->dateReceived); st->dateReceived=GWEN_Time_fromDb(dbT); } } return 0; } AB_MESSAGE *AB_Message_fromDb(GWEN_DB_NODE *db) { AB_MESSAGE *st; assert(db); st=AB_Message_new(); AB_Message_ReadDb(st, db); st->_modified=0; return st; } uint32_t AB_Message_GetUserId(const AB_MESSAGE *st) { assert(st); return st->userId; } void AB_Message_SetUserId(AB_MESSAGE *st, uint32_t d) { assert(st); st->userId=d; st->_modified=1; } uint32_t AB_Message_GetAccountId(const AB_MESSAGE *st) { assert(st); return st->accountId; } void AB_Message_SetAccountId(AB_MESSAGE *st, uint32_t d) { assert(st); st->accountId=d; st->_modified=1; } const char *AB_Message_GetSubject(const AB_MESSAGE *st) { assert(st); return st->subject; } void AB_Message_SetSubject(AB_MESSAGE *st, const char *d) { assert(st); if (st->subject) free(st->subject); if (d && *d) st->subject=strdup(d); else st->subject=0; st->_modified=1; } const char *AB_Message_GetText(const AB_MESSAGE *st) { assert(st); return st->text; } void AB_Message_SetText(AB_MESSAGE *st, const char *d) { assert(st); if (st->text) free(st->text); if (d && *d) st->text=strdup(d); else st->text=0; st->_modified=1; } const GWEN_TIME *AB_Message_GetDateReceived(const AB_MESSAGE *st) { assert(st); return st->dateReceived; } void AB_Message_SetDateReceived(AB_MESSAGE *st, const GWEN_TIME *d) { assert(st); if (st->dateReceived) GWEN_Time_free(st->dateReceived); if (d) st->dateReceived=GWEN_Time_dup(d); else st->dateReceived=0; st->_modified=1; } int AB_Message_IsModified(const AB_MESSAGE *st) { assert(st); return st->_modified; } void AB_Message_SetModified(AB_MESSAGE *st, int i) { assert(st); st->_modified=i; } void AB_Message_Attach(AB_MESSAGE *st) { assert(st); st->_usage++; } AB_MESSAGE *AB_Message_List2__freeAll_cb(AB_MESSAGE *st, void *user_data) { AB_Message_free(st); return 0; } void AB_Message_List2_freeAll(AB_MESSAGE_LIST2 *stl) { if (stl) { AB_Message_List2_ForEach(stl, AB_Message_List2__freeAll_cb, 0); AB_Message_List2_free(stl); } } AB_MESSAGE_LIST *AB_Message_List_dup(const AB_MESSAGE_LIST *stl) { if (stl) { AB_MESSAGE_LIST *nl; AB_MESSAGE *e; nl=AB_Message_List_new(); e=AB_Message_List_First(stl); while(e) { AB_MESSAGE *ne; ne=AB_Message_dup(e); assert(ne); AB_Message_List_Add(ne, nl); e=AB_Message_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/eutransferinfo.h0000644000175000017500000001146312372461742021275 00000000000000/* This file is auto-generated from "eutransferinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef EUTRANSFERINFO_H #define EUTRANSFERINFO_H /** @page P_AB_EUTRANSFER_INFO_PUBLIC AB_EuTransferInfo (public) This page describes the properties of AB_EUTRANSFER_INFO @anchor AB_EUTRANSFER_INFO_CountryCode

CountryCode

This is the two-character ISO country code (as used in toplevel domains). For Germany use "DE".

Set this property with @ref AB_EuTransferInfo_SetCountryCode, get it with @ref AB_EuTransferInfo_GetCountryCode

@anchor AB_EUTRANSFER_INFO_FieldLimits

FieldLimits

This is the list of known field limits for an AB_TRANSACTION. This object remains the owner of lists returned via @ref AB_JobEuTransferInfo_GetFieldLimits.

Set this property with @ref AB_EuTransferInfo_SetFieldLimits, get it with @ref AB_EuTransferInfo_GetFieldLimits

@anchor AB_EUTRANSFER_INFO_LimitLocalValue

LimitLocalValue

Optional limit for a transfer in local currency.

Set this property with @ref AB_EuTransferInfo_SetLimitLocalValue, get it with @ref AB_EuTransferInfo_GetLimitLocalValue

@anchor AB_EUTRANSFER_INFO_LimitForeignValue

LimitForeignValue

Optional limit for a transfer in foreign currency.

Set this property with @ref AB_EuTransferInfo_SetLimitForeignValue, get it with @ref AB_EuTransferInfo_GetLimitForeignValue

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_EUTRANSFER_INFO AB_EUTRANSFER_INFO; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_EUTRANSFER_INFO, AB_EuTransferInfo, AQBANKING_API) AQBANKING_API AB_EUTRANSFER_INFO_LIST *AB_EuTransferInfo_List_dup(const AB_EUTRANSFER_INFO_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_EUTRANSFER_INFO, AB_EuTransferInfo, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_EuTransferInfo_List2_freeAll(AB_EUTRANSFER_INFO_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_EUTRANSFER_INFO *AB_EuTransferInfo_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_EUTRANSFER_INFO *AB_EuTransferInfo_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_EUTRANSFER_INFO *AB_EuTransferInfo_dup(const AB_EUTRANSFER_INFO*st); /** Destroys the given object. */ AQBANKING_API void AB_EuTransferInfo_free(AB_EUTRANSFER_INFO *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_EuTransferInfo_Attach(AB_EUTRANSFER_INFO *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_EuTransferInfo_ReadDb(AB_EUTRANSFER_INFO *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_EuTransferInfo_toDb(const AB_EUTRANSFER_INFO*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_EuTransferInfo_IsModified(const AB_EUTRANSFER_INFO *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_EuTransferInfo_SetModified(AB_EUTRANSFER_INFO *st, int i); /** * Returns the property @ref AB_EUTRANSFER_INFO_CountryCode */ AQBANKING_API const char *AB_EuTransferInfo_GetCountryCode(const AB_EUTRANSFER_INFO *el); /** * Set the property @ref AB_EUTRANSFER_INFO_CountryCode */ AQBANKING_API void AB_EuTransferInfo_SetCountryCode(AB_EUTRANSFER_INFO *el, const char *d); /** * Returns the property @ref AB_EUTRANSFER_INFO_FieldLimits */ AQBANKING_API const AB_TRANSACTION_LIMITS *AB_EuTransferInfo_GetFieldLimits(const AB_EUTRANSFER_INFO *el); /** * Set the property @ref AB_EUTRANSFER_INFO_FieldLimits */ AQBANKING_API void AB_EuTransferInfo_SetFieldLimits(AB_EUTRANSFER_INFO *el, const AB_TRANSACTION_LIMITS *d); /** * Returns the property @ref AB_EUTRANSFER_INFO_LimitLocalValue */ AQBANKING_API const AB_VALUE *AB_EuTransferInfo_GetLimitLocalValue(const AB_EUTRANSFER_INFO *el); /** * Set the property @ref AB_EUTRANSFER_INFO_LimitLocalValue */ AQBANKING_API void AB_EuTransferInfo_SetLimitLocalValue(AB_EUTRANSFER_INFO *el, const AB_VALUE *d); /** * Returns the property @ref AB_EUTRANSFER_INFO_LimitForeignValue */ AQBANKING_API const AB_VALUE *AB_EuTransferInfo_GetLimitForeignValue(const AB_EUTRANSFER_INFO *el); /** * Set the property @ref AB_EUTRANSFER_INFO_LimitForeignValue */ AQBANKING_API void AB_EuTransferInfo_SetLimitForeignValue(AB_EUTRANSFER_INFO *el, const AB_VALUE *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* EUTRANSFERINFO_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/user.c0000644000175000017500000001464412372461742017220 00000000000000/* This file is auto-generated from "user.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "user_p.h" #include #include #include #include #include #include #include "userfns_l.h" GWEN_INHERIT_FUNCTIONS(AB_USER) GWEN_LIST_FUNCTIONS(AB_USER, AB_User) GWEN_LIST2_FUNCTIONS(AB_USER, AB_User) AB_USER *AB_User__new(void) { AB_USER *st; GWEN_NEW_OBJECT(AB_USER, st) st->_usage=1; GWEN_INHERIT_INIT(AB_USER, st) GWEN_LIST_INIT(AB_USER, st) return st; } void AB_User_free(AB_USER *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { GWEN_INHERIT_FINI(AB_USER, st) if (st->backendName) free(st->backendName); if (st->userName) free(st->userName); if (st->userId) free(st->userId); if (st->customerId) free(st->customerId); if (st->country) free(st->country); if (st->bankCode) free(st->bankCode); if (st->fileLock) GWEN_FSLock_free(st->fileLock); if (st->dbId) free(st->dbId); GWEN_LIST_FINI(AB_USER, st) GWEN_FREE_OBJECT(st); } } } int AB_User_toDb(const AB_USER *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", st->uniqueId)) return -1; if (st->backendName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "backendName", st->backendName)) return -1; if (st->userName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "userName", st->userName)) return -1; if (st->userId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "userId", st->userId)) return -1; if (st->customerId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "customerId", st->customerId)) return -1; if (st->country) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "country", st->country)) return -1; if (st->bankCode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankCode", st->bankCode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastSessionId", st->lastSessionId)) return -1; return 0; } int AB_User_ReadDb(AB_USER *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_User_SetUniqueId(st, GWEN_DB_GetIntValue(db, "uniqueId", 0, 0)); AB_User_SetBackendName(st, GWEN_DB_GetCharValue(db, "backendName", 0, 0)); AB_User_SetUserName(st, GWEN_DB_GetCharValue(db, "userName", 0, 0)); AB_User_SetUserId(st, GWEN_DB_GetCharValue(db, "userId", 0, 0)); AB_User_SetCustomerId(st, GWEN_DB_GetCharValue(db, "customerId", 0, 0)); AB_User_SetCountry(st, GWEN_DB_GetCharValue(db, "country", 0, "de")); AB_User_SetBankCode(st, GWEN_DB_GetCharValue(db, "bankCode", 0, 0)); AB_User_SetLastSessionId(st, GWEN_DB_GetIntValue(db, "lastSessionId", 0, 0)); return 0; } uint32_t AB_User_GetUniqueId(const AB_USER *st) { assert(st); return st->uniqueId; } void AB_User_SetUniqueId(AB_USER *st, uint32_t d) { assert(st); st->uniqueId=d; st->_modified=1; } const char *AB_User_GetBackendName(const AB_USER *st) { assert(st); return st->backendName; } void AB_User_SetBackendName(AB_USER *st, const char *d) { assert(st); if (st->backendName) free(st->backendName); if (d && *d) st->backendName=strdup(d); else st->backendName=0; st->_modified=1; } const char *AB_User_GetUserName(const AB_USER *st) { assert(st); return st->userName; } void AB_User_SetUserName(AB_USER *st, const char *d) { assert(st); if (st->userName) free(st->userName); if (d && *d) st->userName=strdup(d); else st->userName=0; st->_modified=1; } const char *AB_User_GetUserId(const AB_USER *st) { assert(st); return st->userId; } void AB_User_SetUserId(AB_USER *st, const char *d) { assert(st); if (st->userId) free(st->userId); if (d && *d) st->userId=strdup(d); else st->userId=0; st->_modified=1; } const char *AB_User_GetCustomerId(const AB_USER *st) { assert(st); return st->customerId; } void AB_User_SetCustomerId(AB_USER *st, const char *d) { assert(st); if (st->customerId) free(st->customerId); if (d && *d) st->customerId=strdup(d); else st->customerId=0; st->_modified=1; } const char *AB_User_GetCountry(const AB_USER *st) { assert(st); return st->country; } void AB_User_SetCountry(AB_USER *st, const char *d) { assert(st); if (st->country) free(st->country); if (d && *d) st->country=strdup(d); else st->country=0; st->_modified=1; } const char *AB_User_GetBankCode(const AB_USER *st) { assert(st); return st->bankCode; } void AB_User_SetBankCode(AB_USER *st, const char *d) { assert(st); if (st->bankCode) free(st->bankCode); if (d && *d) st->bankCode=strdup(d); else st->bankCode=0; st->_modified=1; } uint32_t AB_User_GetLastSessionId(const AB_USER *st) { assert(st); return st->lastSessionId; } void AB_User_SetLastSessionId(AB_USER *st, uint32_t d) { assert(st); st->lastSessionId=d; st->_modified=1; } GWEN_FSLOCK *AB_User_GetFileLock(const AB_USER *st) { assert(st); return st->fileLock; } void AB_User_SetFileLock(AB_USER *st, GWEN_FSLOCK *d) { assert(st); if (st->fileLock) GWEN_FSLock_free(st->fileLock); if (d) st->fileLock=d; else st->fileLock=0; st->_modified=1; } AB_BANKING *AB_User_GetBanking(const AB_USER *st) { assert(st); return st->banking; } void AB_User_SetBanking(AB_USER *st, AB_BANKING *d) { assert(st); if (d) st->banking=d; else st->banking=0; st->_modified=1; } const char *AB_User_GetDbId(const AB_USER *st) { assert(st); return st->dbId; } void AB_User_SetDbId(AB_USER *st, const char *d) { assert(st); if (st->dbId) free(st->dbId); if (d && *d) st->dbId=strdup(d); else st->dbId=0; st->_modified=1; } int AB_User_IsModified(const AB_USER *st) { assert(st); return st->_modified; } void AB_User_SetModified(AB_USER *st, int i) { assert(st); st->_modified=i; } void AB_User_Attach(AB_USER *st) { assert(st); st->_usage++; } AB_USER *AB_User_List2__freeAll_cb(AB_USER *st, void *user_data) { AB_User_free(st); return 0; } void AB_User_List2_freeAll(AB_USER_LIST2 *stl) { if (stl) { AB_User_List2_ForEach(stl, AB_User_List2__freeAll_cb, 0); AB_User_List2_free(stl); } } aqbanking-5.6.4beta/src/libs/aqbanking/types/accstatus_l.h0000644000175000017500000000161312364015477020545 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCSTATUS_L_H #define AQBANKING_ACCSTATUS_L_H #include #include GWEN_LIST_FUNCTION_DEFS(AB_ACCOUNT_STATUS, AB_AccountStatus) AB_ACCOUNT_STATUS_LIST *AB_AccountStatus_List_dup(const AB_ACCOUNT_STATUS_LIST *asl); #endif /* AQBANKING_ACCSTATUS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/user_p.h0000644000175000017500000000113212372461742017530 00000000000000/* This file is auto-generated from "user.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef USER_P_H #define USER_P_H #include "user_l.h" struct AB_USER { GWEN_INHERIT_ELEMENT(AB_USER) GWEN_LIST_ELEMENT(AB_USER) int _usage; int _modified; uint32_t uniqueId; char *backendName; char *userName; char *userId; char *customerId; char *country; char *bankCode; uint32_t lastSessionId; GWEN_FSLOCK *fileLock; AB_BANKING *banking; char *dbId; }; AB_USER *AB_User__new(void); #endif /* USER_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/accstatus_p.h0000644000175000017500000000206412364015477020552 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCSTATUS_P_H #define AQBANKING_ACCSTATUS_P_H #include "accstatus_l.h" struct AB_ACCOUNT_STATUS { GWEN_LIST_ELEMENT(AB_ACCOUNT_STATUS) GWEN_TIME *time; AB_VALUE *bankLine; AB_VALUE *disposable; AB_VALUE *disposed; AB_BALANCE *bookedBalance; AB_BALANCE *notedBalance; }; static AB_ACCOUNT_STATUS* AB_AccountStatus_List2__freeAll_cb(AB_ACCOUNT_STATUS *as, void *user_data); #endif /* AQBANKING_ACCSTATUS_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/userfns.c0000644000175000017500000000261312364015477017721 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2011 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "userfns.h" #include "user_p.h" #include #include AB_USER *AB_User_new(AB_BANKING *ab) { AB_USER *u; assert(ab); u=AB_User__new(); AB_User_SetBanking(u, ab); return u; } AB_USER *AB_User_fromDb(AB_BANKING *ab, GWEN_DB_NODE *db) { AB_USER *u; const char *pname; assert(ab); u=AB_User_new(ab); AB_User_SetBanking(u, ab); AB_User_ReadDb(u, db); pname=AB_User_GetBackendName(u); if (!(pname && *pname)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "User group does not contain a provider name, ignoring user"); AB_User_free(u); return NULL; } return u; } AB_PROVIDER *AB_User_GetProvider(const AB_USER *u) { const char *s; AB_PROVIDER *pro; s=AB_User_GetBackendName(u); assert(s); pro=AB_Banking_GetProvider(u->banking, s); assert(pro); return pro; } aqbanking-5.6.4beta/src/libs/aqbanking/types/eutransferinfo.xml0000644000175000017500000000376112364015477021651 00000000000000
gwenhywfar/types.h
aqbanking/value.h
aqbanking/transactionlimits.h
This is the two-character ISO country code (as used in toplevel domains). For Germany use "DE". This is the list of known field limits for an AB_TRANSACTION. This object remains the owner of lists returned via @ref AB_JobEuTransferInfo_GetFieldLimits. Optional limit for a transfer in local currency. Optional limit for a transfer in foreign currency.
aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfoservice_p.h0000644000175000017500000000107512372461742021730 00000000000000/* This file is auto-generated from "bankinfoservice.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFOSERVICE_P_H #define BANKINFOSERVICE_P_H #include "bankinfoservice_l.h" struct AB_BANKINFO_SERVICE { GWEN_LIST_ELEMENT(AB_BANKINFO_SERVICE) int _usage; int _modified; char *type; char *address; char *suffix; char *pversion; char *mode; uint32_t userFlags; char *hversion; char *aux1; char *aux2; char *aux3; char *aux4; }; #endif /* BANKINFOSERVICE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/balance.c0000644000175000017500000000502312364015477017617 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "balance_p.h" #include #include #include #include #include #include #ifdef HAVE_LOCALE_H # include #endif AB_BALANCE *AB_Balance_new(const AB_VALUE *v, const GWEN_TIME *t){ AB_BALANCE *b; GWEN_NEW_OBJECT(AB_BALANCE, b); if (v) b->value=AB_Value_dup(v); if (t) b->time=GWEN_Time_dup(t); return b; } AB_BALANCE *AB_Balance_dup(const AB_BALANCE *b){ AB_BALANCE *newB; newB=AB_Balance_new(b->value, b->time); return newB; } AB_BALANCE *AB_Balance_fromDb(GWEN_DB_NODE *db){ AB_BALANCE *b; GWEN_TIME *t; AB_VALUE *v; GWEN_DB_NODE *tdb; uint32_t i; tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (tdb) v=AB_Value_fromDb(tdb); else v=0; i=GWEN_DB_GetIntValue(db, "time", 0, 0); if (i) t=GWEN_Time_fromSeconds(i); else t=0; b=AB_Balance_new(v, t); AB_Value_free(v); GWEN_Time_free(t); return b; } int AB_Balance_toDb(const AB_BALANCE *b, GWEN_DB_NODE *db){ if (b->value) { GWEN_DB_NODE *tdb; tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "value"); assert(tdb); if (AB_Value_toDb(b->value, tdb)) return -1; } else { DBG_WARN(AQBANKING_LOGDOMAIN, "No value"); } if (b->time) GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "time", GWEN_Time_Seconds(b->time)); return 0; } void AB_Balance_free(AB_BALANCE *b){ if (b) { GWEN_Time_free(b->time); AB_Value_free(b->value); GWEN_FREE_OBJECT(b); } } const AB_VALUE *AB_Balance_GetValue(const AB_BALANCE *b){ assert(b); return b->value; } void AB_Balance_SetValue(AB_BALANCE *b, const AB_VALUE *v) { assert(b); assert(v); AB_Value_free(b->value); b->value=AB_Value_dup(v); } const GWEN_TIME *AB_Balance_GetTime(const AB_BALANCE *b){ assert(b); return b->time; } aqbanking-5.6.4beta/src/libs/aqbanking/types/security.c0000644000175000017500000001654512372461742020113 00000000000000/* This file is auto-generated from "security.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "security_p.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_SECURITY, AB_Security) GWEN_LIST2_FUNCTIONS(AB_SECURITY, AB_Security) AB_SECURITY *AB_Security_new(void) { AB_SECURITY *st; GWEN_NEW_OBJECT(AB_SECURITY, st) st->_usage=1; GWEN_LIST_INIT(AB_SECURITY, st) return st; } void AB_Security_free(AB_SECURITY *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->name) free(st->name); if (st->uniqueId) free(st->uniqueId); if (st->nameSpace) free(st->nameSpace); if (st->tickerSymbol) free(st->tickerSymbol); if (st->units) AB_Value_free(st->units); if (st->unitPriceValue) AB_Value_free(st->unitPriceValue); if (st->unitPriceDate) GWEN_Time_free(st->unitPriceDate); GWEN_LIST_FINI(AB_SECURITY, st) GWEN_FREE_OBJECT(st); } } } AB_SECURITY *AB_Security_dup(const AB_SECURITY *d) { AB_SECURITY *st; assert(d); st=AB_Security_new(); if (d->name) st->name=strdup(d->name); if (d->uniqueId) st->uniqueId=strdup(d->uniqueId); if (d->nameSpace) st->nameSpace=strdup(d->nameSpace); if (d->tickerSymbol) st->tickerSymbol=strdup(d->tickerSymbol); if (d->units) st->units=AB_Value_dup(d->units); if (d->unitPriceValue) st->unitPriceValue=AB_Value_dup(d->unitPriceValue); if (d->unitPriceDate) st->unitPriceDate=GWEN_Time_dup(d->unitPriceDate); return st; } int AB_Security_toDb(const AB_SECURITY *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->name) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", st->name)) return -1; if (st->uniqueId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", st->uniqueId)) return -1; if (st->nameSpace) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "nameSpace", st->nameSpace)) return -1; if (st->tickerSymbol) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "tickerSymbol", st->tickerSymbol)) return -1; if (st->units) if (AB_Value_toDb(st->units, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "units"))) return -1; if (st->unitPriceValue) if (AB_Value_toDb(st->unitPriceValue, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "unitPriceValue"))) return -1; if (st->unitPriceDate) if (GWEN_Time_toDb(st->unitPriceDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "unitPriceDate"))) return -1; return 0; } int AB_Security_ReadDb(AB_SECURITY *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_Security_SetName(st, GWEN_DB_GetCharValue(db, "name", 0, 0)); AB_Security_SetUniqueId(st, GWEN_DB_GetCharValue(db, "uniqueId", 0, 0)); AB_Security_SetNameSpace(st, GWEN_DB_GetCharValue(db, "nameSpace", 0, 0)); AB_Security_SetTickerSymbol(st, GWEN_DB_GetCharValue(db, "tickerSymbol", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "units"); if (dbT) { if (st->units) AB_Value_free(st->units); st->units=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "unitPriceValue"); if (dbT) { if (st->unitPriceValue) AB_Value_free(st->unitPriceValue); st->unitPriceValue=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "unitPriceDate"); if (dbT) { if (st->unitPriceDate) GWEN_Time_free(st->unitPriceDate); st->unitPriceDate=GWEN_Time_fromDb(dbT); } } return 0; } AB_SECURITY *AB_Security_fromDb(GWEN_DB_NODE *db) { AB_SECURITY *st; assert(db); st=AB_Security_new(); AB_Security_ReadDb(st, db); st->_modified=0; return st; } const char *AB_Security_GetName(const AB_SECURITY *st) { assert(st); return st->name; } void AB_Security_SetName(AB_SECURITY *st, const char *d) { assert(st); if (st->name) free(st->name); if (d && *d) st->name=strdup(d); else st->name=0; st->_modified=1; } const char *AB_Security_GetUniqueId(const AB_SECURITY *st) { assert(st); return st->uniqueId; } void AB_Security_SetUniqueId(AB_SECURITY *st, const char *d) { assert(st); if (st->uniqueId) free(st->uniqueId); if (d && *d) st->uniqueId=strdup(d); else st->uniqueId=0; st->_modified=1; } const char *AB_Security_GetNameSpace(const AB_SECURITY *st) { assert(st); return st->nameSpace; } void AB_Security_SetNameSpace(AB_SECURITY *st, const char *d) { assert(st); if (st->nameSpace) free(st->nameSpace); if (d && *d) st->nameSpace=strdup(d); else st->nameSpace=0; st->_modified=1; } const char *AB_Security_GetTickerSymbol(const AB_SECURITY *st) { assert(st); return st->tickerSymbol; } void AB_Security_SetTickerSymbol(AB_SECURITY *st, const char *d) { assert(st); if (st->tickerSymbol) free(st->tickerSymbol); if (d && *d) st->tickerSymbol=strdup(d); else st->tickerSymbol=0; st->_modified=1; } const AB_VALUE *AB_Security_GetUnits(const AB_SECURITY *st) { assert(st); return st->units; } void AB_Security_SetUnits(AB_SECURITY *st, const AB_VALUE *d) { assert(st); if (st->units) AB_Value_free(st->units); if (d) st->units=AB_Value_dup(d); else st->units=0; st->_modified=1; } const AB_VALUE *AB_Security_GetUnitPriceValue(const AB_SECURITY *st) { assert(st); return st->unitPriceValue; } void AB_Security_SetUnitPriceValue(AB_SECURITY *st, const AB_VALUE *d) { assert(st); if (st->unitPriceValue) AB_Value_free(st->unitPriceValue); if (d) st->unitPriceValue=AB_Value_dup(d); else st->unitPriceValue=0; st->_modified=1; } const GWEN_TIME *AB_Security_GetUnitPriceDate(const AB_SECURITY *st) { assert(st); return st->unitPriceDate; } void AB_Security_SetUnitPriceDate(AB_SECURITY *st, const GWEN_TIME *d) { assert(st); if (st->unitPriceDate) GWEN_Time_free(st->unitPriceDate); if (d) st->unitPriceDate=GWEN_Time_dup(d); else st->unitPriceDate=0; st->_modified=1; } int AB_Security_IsModified(const AB_SECURITY *st) { assert(st); return st->_modified; } void AB_Security_SetModified(AB_SECURITY *st, int i) { assert(st); st->_modified=i; } void AB_Security_Attach(AB_SECURITY *st) { assert(st); st->_usage++; } AB_SECURITY *AB_Security_List2__freeAll_cb(AB_SECURITY *st, void *user_data) { AB_Security_free(st); return 0; } void AB_Security_List2_freeAll(AB_SECURITY_LIST2 *stl) { if (stl) { AB_Security_List2_ForEach(stl, AB_Security_List2__freeAll_cb, 0); AB_Security_List2_free(stl); } } AB_SECURITY_LIST *AB_Security_List_dup(const AB_SECURITY_LIST *stl) { if (stl) { AB_SECURITY_LIST *nl; AB_SECURITY *e; nl=AB_Security_List_new(); e=AB_Security_List_First(stl); while(e) { AB_SECURITY *ne; ne=AB_Security_dup(e); assert(ne); AB_Security_List_Add(ne, nl); e=AB_Security_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/Makefile.in0000644000175000017500000007026212643540055020135 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/types DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtypes_la_LIBADD = am_libtypes_la_OBJECTS = accstatus.lo balance.lo bankinfo.lo \ bankinfoservice.lo eutransferinfo.lo pin.lo textkeydescr.lo \ transaction.lo transactionfns.lo transactionlimits.lo user.lo \ userfns.lo value.lo cellphoneproduct.lo security.lo message.lo libtypes_la_OBJECTS = $(am_libtypes_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtypes_la_SOURCES) DIST_SOURCES = $(libtypes_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(iheaderdir)" HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES = libtypes.la typefiles = \ transaction.xml \ pin.xml \ bankinfo.xml \ eutransferinfo.xml \ user.xml \ cellphone.xml \ security.xml \ message.xml EXTRA_DIST = $(typefiles) noinst_HEADERS = \ accstatus_p.h \ accstatus_l.h \ balance_p.h \ bankinfo_l.h \ bankinfo_p.h \ eutransferinfo_l.h \ eutransferinfo_p.h \ bankinfoservice_l.h \ bankinfoservice_p.h \ pin_l.h \ pin_p.h \ textkeydescr_l.h \ textkeydescr_p.h \ transaction_l.h \ transaction_p.h \ transactionlimits_l.h \ transactionlimits_p.h \ user_l.h \ user_p.h \ userfns_l.h \ value_p.h \ cellphoneproduct_l.h \ cellphoneproduct_p.h \ security_l.h \ security_p.h \ message_l.h \ message_p.h iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ accstatus.h \ balance.h \ bankinfo.h \ bankinfoservice.h \ textkeydescr.h \ transaction.h \ transactionfns.h \ transactionlimits.h \ eutransferinfo.h \ user.h \ userfns.h \ value.h \ cellphoneproduct.h \ security.h \ message.h libtypes_la_SOURCES = \ accstatus.c \ balance.c \ bankinfo.c \ bankinfoservice.c \ eutransferinfo.c \ pin.c \ textkeydescr.c \ transaction.c \ transactionfns.c \ transactionlimits.c \ user.c \ userfns.c \ value.c \ cellphoneproduct.c \ security.c \ message.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/types/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/types/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtypes.la: $(libtypes_la_OBJECTS) $(libtypes_la_DEPENDENCIES) $(EXTRA_libtypes_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libtypes_la_OBJECTS) $(libtypes_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accstatus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bankinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bankinfoservice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cellphoneproduct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eutransferinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/security.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textkeydescr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transaction.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transactionfns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transactionlimits.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/userfns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/value.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iheaderHEADERS types: $(typefiles) $(gwenhywfar_bindir)/typemaker -d AQBANKING_API $(typefiles) sources: for f in $(libtypes_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbanking/types/message_p.h0000644000175000017500000000066112372461742020204 00000000000000/* This file is auto-generated from "message.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef MESSAGE_P_H #define MESSAGE_P_H #include "message_l.h" struct AB_MESSAGE { GWEN_LIST_ELEMENT(AB_MESSAGE) int _usage; int _modified; uint32_t userId; uint32_t accountId; char *subject; char *text; GWEN_TIME *dateReceived; }; #endif /* MESSAGE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transaction_l.h0000644000175000017500000000746012372461741021104 00000000000000/* This file is auto-generated from "transaction.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTION_L_H #define TRANSACTION_L_H /** @page P_AB_TRANSACTION_LIB AB_Transaction (lib) This page describes the properties of AB_TRANSACTION This type contains all important information about transactions. All text fields are in UTF-8.

Local Account Info

This group contains information about the local account.

Remote Account Info

This group contains information about the remote account.

Dates

Value

Info Which Is Not Supported by All Backends

This group contains information which differ between backends.

Some of this information might not even besupportedby every backends.

Additional Information for Standing Orders

This group contains information which is used with standing orders. It is not needed for other usage of this type.

Additional Information for Transfers

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

Additional Information for Foreign Transfers

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

Additional Information for Investment Transfers

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

Additional Information for SEPA Direct Debits

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

*/ #include "transaction.h" #ifdef __cplusplus extern "C" { #endif /** @name Local Account Info * This group contains information about the local account.*/ /*@{*/ /*@}*/ /** @name Remote Account Info * This group contains information about the remote account.*/ /*@{*/ /*@}*/ /** @name Dates */ /*@{*/ /*@}*/ /** @name Value * */ /*@{*/ /*@}*/ /** @name Info Which Is Not Supported by All Backends *

This group contains information which differ between backends.

Some of this information might not even besupportedby every backends.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Standing Orders *

This group contains information which is used with standing orders. It is not needed for other usage of this type.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Transfers *

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Foreign Transfers *

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Investment Transfers *

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ /** @name Additional Information for SEPA Direct Debits *

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TRANSACTION_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/cellphoneproduct.h0000644000175000017500000001455312372461742021620 00000000000000/* This file is auto-generated from "cellphoneproduct.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef CELLPHONEPRODUCT_H #define CELLPHONEPRODUCT_H /** @page P_AB_CELLPHONE_PRODUCT_PUBLIC AB_CellPhoneProduct (public) This page describes the properties of AB_CELLPHONE_PRODUCT @anchor AB_CELLPHONE_PRODUCT_Id

Id

Id assigned by the backend.

Set this property with @ref AB_CellPhoneProduct_SetId, get it with @ref AB_CellPhoneProduct_GetId

@anchor AB_CELLPHONE_PRODUCT_ProviderName

ProviderName

Name of the provider.

Set this property with @ref AB_CellPhoneProduct_SetProviderName, get it with @ref AB_CellPhoneProduct_GetProviderName

@anchor AB_CELLPHONE_PRODUCT_ProductName

ProductName

Name of the product.

Set this property with @ref AB_CellPhoneProduct_SetProductName, get it with @ref AB_CellPhoneProduct_GetProductName

@anchor AB_CELLPHONE_PRODUCT_AllowFreeValue

AllowFreeValue

Set this property with @ref AB_CellPhoneProduct_SetAllowFreeValue, get it with @ref AB_CellPhoneProduct_GetAllowFreeValue

@anchor AB_CELLPHONE_PRODUCT_MinimumValue

MinimumValue

This field contains the minimum value which can be loaded onto the prepaid card. This value can be empty (or non-existent) for some backends and banks.

Set this property with @ref AB_CellPhoneProduct_SetMinimumValue, get it with @ref AB_CellPhoneProduct_GetMinimumValue

@anchor AB_CELLPHONE_PRODUCT_MaximumValue

MaximumValue

This field contains the maximum value which can be loaded onto the prepaid card. This value can be empty (or non-existent) for some backends and banks.

Set this property with @ref AB_CellPhoneProduct_SetMaximumValue, get it with @ref AB_CellPhoneProduct_GetMaximumValue

@anchor AB_CELLPHONE_PRODUCT_Values

Values

This is the list of allowed values. This list might be empty!

Set this property with @ref AB_CellPhoneProduct_SetValues, get it with @ref AB_CellPhoneProduct_GetValues

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_CELLPHONE_PRODUCT AB_CELLPHONE_PRODUCT; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_CELLPHONE_PRODUCT, AB_CellPhoneProduct, AQBANKING_API) AQBANKING_API AB_CELLPHONE_PRODUCT_LIST *AB_CellPhoneProduct_List_dup(const AB_CELLPHONE_PRODUCT_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_CELLPHONE_PRODUCT, AB_CellPhoneProduct, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_CellPhoneProduct_List2_freeAll(AB_CELLPHONE_PRODUCT_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_dup(const AB_CELLPHONE_PRODUCT*st); /** Destroys the given object. */ AQBANKING_API void AB_CellPhoneProduct_free(AB_CELLPHONE_PRODUCT *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_CellPhoneProduct_Attach(AB_CELLPHONE_PRODUCT *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_CellPhoneProduct_ReadDb(AB_CELLPHONE_PRODUCT *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_CellPhoneProduct_toDb(const AB_CELLPHONE_PRODUCT*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_CellPhoneProduct_IsModified(const AB_CELLPHONE_PRODUCT *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_CellPhoneProduct_SetModified(AB_CELLPHONE_PRODUCT *st, int i); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_Id */ AQBANKING_API const char *AB_CellPhoneProduct_GetId(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_Id */ AQBANKING_API void AB_CellPhoneProduct_SetId(AB_CELLPHONE_PRODUCT *el, const char *d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_ProviderName */ AQBANKING_API const char *AB_CellPhoneProduct_GetProviderName(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_ProviderName */ AQBANKING_API void AB_CellPhoneProduct_SetProviderName(AB_CELLPHONE_PRODUCT *el, const char *d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_ProductName */ AQBANKING_API const char *AB_CellPhoneProduct_GetProductName(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_ProductName */ AQBANKING_API void AB_CellPhoneProduct_SetProductName(AB_CELLPHONE_PRODUCT *el, const char *d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_AllowFreeValue */ AQBANKING_API int AB_CellPhoneProduct_GetAllowFreeValue(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_AllowFreeValue */ AQBANKING_API void AB_CellPhoneProduct_SetAllowFreeValue(AB_CELLPHONE_PRODUCT *el, int d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_MinimumValue */ AQBANKING_API const AB_VALUE *AB_CellPhoneProduct_GetMinimumValue(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_MinimumValue */ AQBANKING_API void AB_CellPhoneProduct_SetMinimumValue(AB_CELLPHONE_PRODUCT *el, const AB_VALUE *d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_MaximumValue */ AQBANKING_API const AB_VALUE *AB_CellPhoneProduct_GetMaximumValue(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_MaximumValue */ AQBANKING_API void AB_CellPhoneProduct_SetMaximumValue(AB_CELLPHONE_PRODUCT *el, const AB_VALUE *d); /** * Returns the property @ref AB_CELLPHONE_PRODUCT_Values */ AQBANKING_API AB_VALUE_LIST *AB_CellPhoneProduct_GetValues(const AB_CELLPHONE_PRODUCT *el); /** * Set the property @ref AB_CELLPHONE_PRODUCT_Values */ AQBANKING_API void AB_CellPhoneProduct_SetValues(AB_CELLPHONE_PRODUCT *el, AB_VALUE_LIST *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* CELLPHONEPRODUCT_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/eutransferinfo.c0000644000175000017500000001451212372461742021266 00000000000000/* This file is auto-generated from "eutransferinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "eutransferinfo_p.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_EUTRANSFER_INFO, AB_EuTransferInfo) GWEN_LIST2_FUNCTIONS(AB_EUTRANSFER_INFO, AB_EuTransferInfo) AB_EUTRANSFER_INFO *AB_EuTransferInfo_new(void) { AB_EUTRANSFER_INFO *st; GWEN_NEW_OBJECT(AB_EUTRANSFER_INFO, st) st->_usage=1; GWEN_LIST_INIT(AB_EUTRANSFER_INFO, st) return st; } void AB_EuTransferInfo_free(AB_EUTRANSFER_INFO *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->countryCode) free(st->countryCode); if (st->fieldLimits) AB_TransactionLimits_free(st->fieldLimits); if (st->limitLocalValue) AB_Value_free(st->limitLocalValue); if (st->limitForeignValue) AB_Value_free(st->limitForeignValue); GWEN_LIST_FINI(AB_EUTRANSFER_INFO, st) GWEN_FREE_OBJECT(st); } } } AB_EUTRANSFER_INFO *AB_EuTransferInfo_dup(const AB_EUTRANSFER_INFO *d) { AB_EUTRANSFER_INFO *st; assert(d); st=AB_EuTransferInfo_new(); if (d->countryCode) st->countryCode=strdup(d->countryCode); if (d->fieldLimits) st->fieldLimits=AB_TransactionLimits_dup(d->fieldLimits); if (d->limitLocalValue) st->limitLocalValue=AB_Value_dup(d->limitLocalValue); if (d->limitForeignValue) st->limitForeignValue=AB_Value_dup(d->limitForeignValue); return st; } int AB_EuTransferInfo_toDb(const AB_EUTRANSFER_INFO *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->countryCode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "countryCode", st->countryCode)) return -1; if (st->fieldLimits) if (AB_TransactionLimits_toDb(st->fieldLimits, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "fieldLimits"))) return -1; if (st->limitLocalValue) if (AB_Value_toDb(st->limitLocalValue, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "limitLocalValue"))) return -1; if (st->limitForeignValue) if (AB_Value_toDb(st->limitForeignValue, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "limitForeignValue"))) return -1; return 0; } int AB_EuTransferInfo_ReadDb(AB_EUTRANSFER_INFO *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_EuTransferInfo_SetCountryCode(st, GWEN_DB_GetCharValue(db, "countryCode", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "fieldLimits"); if (dbT) { if (st->fieldLimits) AB_TransactionLimits_free(st->fieldLimits); st->fieldLimits=AB_TransactionLimits_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "limitLocalValue"); if (dbT) { if (st->limitLocalValue) AB_Value_free(st->limitLocalValue); st->limitLocalValue=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "limitForeignValue"); if (dbT) { if (st->limitForeignValue) AB_Value_free(st->limitForeignValue); st->limitForeignValue=AB_Value_fromDb(dbT); } } return 0; } AB_EUTRANSFER_INFO *AB_EuTransferInfo_fromDb(GWEN_DB_NODE *db) { AB_EUTRANSFER_INFO *st; assert(db); st=AB_EuTransferInfo_new(); AB_EuTransferInfo_ReadDb(st, db); st->_modified=0; return st; } const char *AB_EuTransferInfo_GetCountryCode(const AB_EUTRANSFER_INFO *st) { assert(st); return st->countryCode; } void AB_EuTransferInfo_SetCountryCode(AB_EUTRANSFER_INFO *st, const char *d) { assert(st); if (st->countryCode) free(st->countryCode); if (d && *d) st->countryCode=strdup(d); else st->countryCode=0; st->_modified=1; } const AB_TRANSACTION_LIMITS *AB_EuTransferInfo_GetFieldLimits(const AB_EUTRANSFER_INFO *st) { assert(st); return st->fieldLimits; } void AB_EuTransferInfo_SetFieldLimits(AB_EUTRANSFER_INFO *st, const AB_TRANSACTION_LIMITS *d) { assert(st); if (st->fieldLimits) AB_TransactionLimits_free(st->fieldLimits); if (d) st->fieldLimits=AB_TransactionLimits_dup(d); else st->fieldLimits=0; st->_modified=1; } const AB_VALUE *AB_EuTransferInfo_GetLimitLocalValue(const AB_EUTRANSFER_INFO *st) { assert(st); return st->limitLocalValue; } void AB_EuTransferInfo_SetLimitLocalValue(AB_EUTRANSFER_INFO *st, const AB_VALUE *d) { assert(st); if (st->limitLocalValue) AB_Value_free(st->limitLocalValue); if (d) st->limitLocalValue=AB_Value_dup(d); else st->limitLocalValue=0; st->_modified=1; } const AB_VALUE *AB_EuTransferInfo_GetLimitForeignValue(const AB_EUTRANSFER_INFO *st) { assert(st); return st->limitForeignValue; } void AB_EuTransferInfo_SetLimitForeignValue(AB_EUTRANSFER_INFO *st, const AB_VALUE *d) { assert(st); if (st->limitForeignValue) AB_Value_free(st->limitForeignValue); if (d) st->limitForeignValue=AB_Value_dup(d); else st->limitForeignValue=0; st->_modified=1; } int AB_EuTransferInfo_IsModified(const AB_EUTRANSFER_INFO *st) { assert(st); return st->_modified; } void AB_EuTransferInfo_SetModified(AB_EUTRANSFER_INFO *st, int i) { assert(st); st->_modified=i; } void AB_EuTransferInfo_Attach(AB_EUTRANSFER_INFO *st) { assert(st); st->_usage++; } AB_EUTRANSFER_INFO *AB_EuTransferInfo_List2__freeAll_cb(AB_EUTRANSFER_INFO *st, void *user_data) { AB_EuTransferInfo_free(st); return 0; } void AB_EuTransferInfo_List2_freeAll(AB_EUTRANSFER_INFO_LIST2 *stl) { if (stl) { AB_EuTransferInfo_List2_ForEach(stl, AB_EuTransferInfo_List2__freeAll_cb, 0); AB_EuTransferInfo_List2_free(stl); } } AB_EUTRANSFER_INFO_LIST *AB_EuTransferInfo_List_dup(const AB_EUTRANSFER_INFO_LIST *stl) { if (stl) { AB_EUTRANSFER_INFO_LIST *nl; AB_EUTRANSFER_INFO *e; nl=AB_EuTransferInfo_List_new(); e=AB_EuTransferInfo_List_First(stl); while(e) { AB_EUTRANSFER_INFO *ne; ne=AB_EuTransferInfo_dup(e); assert(ne); AB_EuTransferInfo_List_Add(ne, nl); e=AB_EuTransferInfo_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfo_p.h0000644000175000017500000000114412372461742020344 00000000000000/* This file is auto-generated from "bankinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFO_P_H #define BANKINFO_P_H #include "bankinfo_l.h" struct AB_BANKINFO { GWEN_LIST_ELEMENT(AB_BANKINFO) int _usage; int _modified; char *country; char *branchId; char *bankId; char *bic; char *bankName; char *location; char *street; char *zipcode; char *city; char *region; char *phone; char *fax; char *email; char *website; AB_BANKINFO_SERVICE_LIST *services; }; #endif /* BANKINFO_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/accstatus.c0000644000175000017500000001625612364015477020236 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "accstatus_p.h" #include #include #include #include #include #include #ifdef HAVE_LOCALE_H # include #endif GWEN_LIST_FUNCTIONS(AB_ACCOUNT_STATUS,AB_AccountStatus) GWEN_LIST2_FUNCTIONS(AB_ACCOUNT_STATUS,AB_AccountStatus) AB_ACCOUNT_STATUS *AB_AccountStatus_new(void){ AB_ACCOUNT_STATUS *as; GWEN_NEW_OBJECT(AB_ACCOUNT_STATUS, as); GWEN_LIST_INIT(AB_ACCOUNT_STATUS, as); return as; } AB_ACCOUNT_STATUS *AB_AccountStatus_dup(const AB_ACCOUNT_STATUS *as){ AB_ACCOUNT_STATUS *newAs; GWEN_NEW_OBJECT(AB_ACCOUNT_STATUS, newAs); GWEN_LIST_INIT(AB_ACCOUNT_STATUS, newAs); if (as->time) newAs->time=GWEN_Time_dup(as->time); if (as->bankLine) newAs->bankLine=AB_Value_dup(as->bankLine); if (as->disposable) newAs->disposable=AB_Value_dup(as->disposable); if (as->disposed) newAs->disposed=AB_Value_dup(as->disposed); if (as->bookedBalance) newAs->bookedBalance=AB_Balance_dup(as->bookedBalance); if (as->notedBalance) newAs->notedBalance=AB_Balance_dup(as->notedBalance); return newAs; } AB_ACCOUNT_STATUS *AB_AccountStatus_fromDb(GWEN_DB_NODE *db){ AB_ACCOUNT_STATUS *as; uint32_t i; GWEN_DB_NODE *tdb; GWEN_NEW_OBJECT(AB_ACCOUNT_STATUS, as); GWEN_LIST_INIT(AB_ACCOUNT_STATUS, as); i=GWEN_DB_GetIntValue(db, "time", 0, 0); if (i) as->time=GWEN_Time_fromSeconds(i); tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bankLine"); if (tdb) as->bankLine=AB_Value_fromDb(tdb); tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "disposable"); if (tdb) as->disposable=AB_Value_fromDb(tdb); tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "disposed"); if (tdb) as->disposed=AB_Value_fromDb(tdb); tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "bookedBalance"); if (tdb) as->bookedBalance=AB_Balance_fromDb(tdb); tdb=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "notedBalance"); if (tdb) as->notedBalance=AB_Balance_fromDb(tdb); return as; } int AB_AccountStatus_toDb(const AB_ACCOUNT_STATUS *as, GWEN_DB_NODE *db){ GWEN_DB_NODE *tdb; assert(as); assert(db); if (as->time) { GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "time", GWEN_Time_Seconds(as->time)); } if (as->bankLine) { tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "bankLine"); assert(tdb); if (AB_Value_toDb(as->bankLine, tdb)) return -1; } if (as->disposable) { tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "disposable"); assert(tdb); if (AB_Value_toDb(as->disposable, tdb)) return -1; } if (as->disposed) { tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "disposed"); assert(tdb); if (AB_Value_toDb(as->disposed, tdb)) return -1; } if (as->bookedBalance) { tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "bookedBalance"); assert(tdb); if (AB_Balance_toDb(as->bookedBalance, tdb)) return -1; } if (as->notedBalance) { tdb=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_OVERWRITE_GROUPS, "notedBalance"); assert(tdb); if (AB_Balance_toDb(as->notedBalance, tdb)) return -1; } return 0; } void AB_AccountStatus_free(AB_ACCOUNT_STATUS *as){ if (as) { GWEN_Time_free(as->time); AB_Value_free(as->disposable); AB_Value_free(as->disposed); AB_Value_free(as->bankLine); AB_Balance_free(as->bookedBalance); AB_Balance_free(as->notedBalance); GWEN_LIST_FINI(AB_ACCOUNT_STATUS, as); GWEN_FREE_OBJECT(as); } } const GWEN_TIME* AB_AccountStatus_GetTime(const AB_ACCOUNT_STATUS *as){ assert(as); return as->time; } void AB_AccountStatus_SetTime(AB_ACCOUNT_STATUS *as, const GWEN_TIME *t){ assert(as); GWEN_Time_free(as->time); if (t) as->time=GWEN_Time_dup(t); else as->time=NULL; } const AB_VALUE* AB_AccountStatus_GetBankLine(const AB_ACCOUNT_STATUS *as){ assert(as); return as->bankLine; } void AB_AccountStatus_SetBankLine(AB_ACCOUNT_STATUS *as, const AB_VALUE *v){ assert(as); AB_Value_free(as->bankLine); if (v) as->bankLine=AB_Value_dup(v); else as->bankLine=NULL; } const AB_VALUE* AB_AccountStatus_GetDisposable(const AB_ACCOUNT_STATUS *as){ assert(as); return as->disposable; } void AB_AccountStatus_SetDisposable(AB_ACCOUNT_STATUS *as, const AB_VALUE *v){ assert(as); AB_Value_free(as->disposable); if (v) as->disposable=AB_Value_dup(v); else as->disposable=NULL; } const AB_VALUE* AB_AccountStatus_GetDisposed(const AB_ACCOUNT_STATUS *as){ assert(as); return as->disposed; } void AB_AccountStatus_SetDisposed(AB_ACCOUNT_STATUS *as, const AB_VALUE *v){ assert(as); AB_Value_free(as->disposed); if (v) as->disposed=AB_Value_dup(v); else as->disposed=NULL; } const AB_BALANCE* AB_AccountStatus_GetBookedBalance(const AB_ACCOUNT_STATUS *as){ assert(as); return as->bookedBalance; } void AB_AccountStatus_SetBookedBalance(AB_ACCOUNT_STATUS *as, const AB_BALANCE *b){ assert(as); AB_Balance_free(as->bookedBalance); if (b) as->bookedBalance=AB_Balance_dup(b); else as->bookedBalance=NULL; } const AB_BALANCE* AB_AccountStatus_GetNotedBalance(const AB_ACCOUNT_STATUS *as){ assert(as); return as->notedBalance; } void AB_AccountStatus_SetNotedBalance(AB_ACCOUNT_STATUS *as, const AB_BALANCE *b){ assert(as); AB_Balance_free(as->notedBalance); if (b) as->notedBalance=AB_Balance_dup(b); else as->notedBalance=NULL; } AB_ACCOUNT_STATUS_LIST* AB_AccountStatus_List_dup(const AB_ACCOUNT_STATUS_LIST *asl) { if (asl) { AB_ACCOUNT_STATUS_LIST *nl; AB_ACCOUNT_STATUS *e; nl=AB_AccountStatus_List_new(); e=AB_AccountStatus_List_First(asl); while(e) { AB_ACCOUNT_STATUS *ne; ne=AB_AccountStatus_dup(e); assert(ne); AB_AccountStatus_List_Add(ne, nl); e=AB_AccountStatus_List_Next(e); } /* while (e) */ return nl; } else return 0; } AB_ACCOUNT_STATUS *AB_AccountStatus_List2__freeAll_cb(AB_ACCOUNT_STATUS *as, void *user_data) { AB_AccountStatus_free(as); return 0; } void AB_AccountStatus_List2_freeAll(AB_ACCOUNT_STATUS_LIST2 *asl) { if (asl) { AB_AccountStatus_List2_ForEach(asl, AB_AccountStatus_List2__freeAll_cb, 0); AB_AccountStatus_List2_free(asl); } } aqbanking-5.6.4beta/src/libs/aqbanking/types/eutransferinfo_l.h0000644000175000017500000000074512372461742021611 00000000000000/* This file is auto-generated from "eutransferinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef EUTRANSFERINFO_L_H #define EUTRANSFERINFO_L_H /** @page P_AB_EUTRANSFER_INFO_LIB AB_EuTransferInfo (lib) This page describes the properties of AB_EUTRANSFER_INFO */ #include "eutransferinfo.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* EUTRANSFERINFO_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfo.h0000644000175000017500000002033012372461742020023 00000000000000/* This file is auto-generated from "bankinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFO_H #define BANKINFO_H /** @page P_AB_BANKINFO_PUBLIC AB_BankInfo (public) This page describes the properties of AB_BANKINFO @anchor AB_BANKINFO_Country

Country

Set this property with @ref AB_BankInfo_SetCountry, get it with @ref AB_BankInfo_GetCountry

@anchor AB_BANKINFO_BranchId

BranchId

Set this property with @ref AB_BankInfo_SetBranchId, get it with @ref AB_BankInfo_GetBranchId

@anchor AB_BANKINFO_BankId

BankId

Set this property with @ref AB_BankInfo_SetBankId, get it with @ref AB_BankInfo_GetBankId

@anchor AB_BANKINFO_Bic

Bic

Set this property with @ref AB_BankInfo_SetBic, get it with @ref AB_BankInfo_GetBic

@anchor AB_BANKINFO_BankName

BankName

Set this property with @ref AB_BankInfo_SetBankName, get it with @ref AB_BankInfo_GetBankName

@anchor AB_BANKINFO_Location

Location

Set this property with @ref AB_BankInfo_SetLocation, get it with @ref AB_BankInfo_GetLocation

@anchor AB_BANKINFO_Street

Street

Set this property with @ref AB_BankInfo_SetStreet, get it with @ref AB_BankInfo_GetStreet

@anchor AB_BANKINFO_Zipcode

Zipcode

Set this property with @ref AB_BankInfo_SetZipcode, get it with @ref AB_BankInfo_GetZipcode

@anchor AB_BANKINFO_City

City

Set this property with @ref AB_BankInfo_SetCity, get it with @ref AB_BankInfo_GetCity

@anchor AB_BANKINFO_Region

Region

Set this property with @ref AB_BankInfo_SetRegion, get it with @ref AB_BankInfo_GetRegion

@anchor AB_BANKINFO_Phone

Phone

Set this property with @ref AB_BankInfo_SetPhone, get it with @ref AB_BankInfo_GetPhone

@anchor AB_BANKINFO_Fax

Fax

Set this property with @ref AB_BankInfo_SetFax, get it with @ref AB_BankInfo_GetFax

@anchor AB_BANKINFO_Email

Email

Set this property with @ref AB_BankInfo_SetEmail, get it with @ref AB_BankInfo_GetEmail

@anchor AB_BANKINFO_Website

Website

Set this property with @ref AB_BankInfo_SetWebsite, get it with @ref AB_BankInfo_GetWebsite

@anchor AB_BANKINFO_Services

Services

This is the list of known servises of this bank. This object remains the owner of lists returned via @ref AB_BankInfo_GetServices.

Set this property with @ref AB_BankInfo_SetServices, get it with @ref AB_BankInfo_GetServices

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_BANKINFO AB_BANKINFO; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_BANKINFO, AB_BankInfo, AQBANKING_API) AQBANKING_API AB_BANKINFO_LIST *AB_BankInfo_List_dup(const AB_BANKINFO_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_BANKINFO, AB_BankInfo, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_BankInfo_List2_freeAll(AB_BANKINFO_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_BANKINFO *AB_BankInfo_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_BANKINFO *AB_BankInfo_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_BANKINFO *AB_BankInfo_dup(const AB_BANKINFO*st); /** Destroys the given object. */ AQBANKING_API void AB_BankInfo_free(AB_BANKINFO *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_BankInfo_Attach(AB_BANKINFO *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_BankInfo_ReadDb(AB_BANKINFO *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_BankInfo_toDb(const AB_BANKINFO*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_BankInfo_IsModified(const AB_BANKINFO *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_BankInfo_SetModified(AB_BANKINFO *st, int i); /** * Returns the property @ref AB_BANKINFO_Country */ AQBANKING_API const char *AB_BankInfo_GetCountry(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Country */ AQBANKING_API void AB_BankInfo_SetCountry(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_BranchId */ AQBANKING_API const char *AB_BankInfo_GetBranchId(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_BranchId */ AQBANKING_API void AB_BankInfo_SetBranchId(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_BankId */ AQBANKING_API const char *AB_BankInfo_GetBankId(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_BankId */ AQBANKING_API void AB_BankInfo_SetBankId(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Bic */ AQBANKING_API const char *AB_BankInfo_GetBic(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Bic */ AQBANKING_API void AB_BankInfo_SetBic(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_BankName */ AQBANKING_API const char *AB_BankInfo_GetBankName(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_BankName */ AQBANKING_API void AB_BankInfo_SetBankName(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Location */ AQBANKING_API const char *AB_BankInfo_GetLocation(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Location */ AQBANKING_API void AB_BankInfo_SetLocation(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Street */ AQBANKING_API const char *AB_BankInfo_GetStreet(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Street */ AQBANKING_API void AB_BankInfo_SetStreet(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Zipcode */ AQBANKING_API const char *AB_BankInfo_GetZipcode(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Zipcode */ AQBANKING_API void AB_BankInfo_SetZipcode(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_City */ AQBANKING_API const char *AB_BankInfo_GetCity(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_City */ AQBANKING_API void AB_BankInfo_SetCity(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Region */ AQBANKING_API const char *AB_BankInfo_GetRegion(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Region */ AQBANKING_API void AB_BankInfo_SetRegion(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Phone */ AQBANKING_API const char *AB_BankInfo_GetPhone(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Phone */ AQBANKING_API void AB_BankInfo_SetPhone(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Fax */ AQBANKING_API const char *AB_BankInfo_GetFax(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Fax */ AQBANKING_API void AB_BankInfo_SetFax(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Email */ AQBANKING_API const char *AB_BankInfo_GetEmail(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Email */ AQBANKING_API void AB_BankInfo_SetEmail(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Website */ AQBANKING_API const char *AB_BankInfo_GetWebsite(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Website */ AQBANKING_API void AB_BankInfo_SetWebsite(AB_BANKINFO *el, const char *d); /** * Returns the property @ref AB_BANKINFO_Services */ AQBANKING_API AB_BANKINFO_SERVICE_LIST *AB_BankInfo_GetServices(const AB_BANKINFO *el); /** * Set the property @ref AB_BANKINFO_Services */ AQBANKING_API void AB_BankInfo_SetServices(AB_BANKINFO *el, AB_BANKINFO_SERVICE_LIST *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* BANKINFO_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionfns.c0000644000175000017500000005701212364015477021273 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004-2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "transaction_p.h" #include #include #include #include #include #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18N_NOOP(msg) msg #define I18S(msg) msg int AB_Transaction_Compare(const AB_TRANSACTION *t1, const AB_TRANSACTION *t0) { if (t1==t0) return 0; if (t1 && t0) { GWEN_DB_NODE *dbT; GWEN_BUFFER *buf1; GWEN_BUFFER *buf0; buf1=GWEN_Buffer_new(0, 256, 0, 1); buf0=GWEN_Buffer_new(0, 256, 0, 1); /* prepare first buffer */ dbT=GWEN_DB_Group_new("transaction"); if (AB_Transaction_toDb(t1, dbT)==0) { int err; /* remove variables from comparison */ GWEN_DB_DeleteVar(dbT, "status"); err=GWEN_DB_WriteToBuffer(dbT, buf1, GWEN_DB_FLAGS_COMPACT); if (err) { DBG_ERROR(AQBANKING_LOGDOMAIN, "INTERNAL: Error writing DB to buffer"); GWEN_Buffer_free(buf0); GWEN_Buffer_free(buf1); GWEN_DB_Group_free(dbT); return -1; } } GWEN_DB_Group_free(dbT); /* prepare second buffer */ dbT=GWEN_DB_Group_new("transaction"); if (AB_Transaction_toDb(t0, dbT)==0) { int err; /* remove variables from comparison */ GWEN_DB_DeleteVar(dbT, "status"); err=GWEN_DB_WriteToBuffer(dbT, buf0, GWEN_DB_FLAGS_COMPACT); if (err) { DBG_ERROR(AQBANKING_LOGDOMAIN, "INTERNAL: Error writing DB to buffer"); GWEN_Buffer_free(buf0); GWEN_Buffer_free(buf1); GWEN_DB_Group_free(dbT); return -1; } } GWEN_DB_Group_free(dbT); /* actually compare */ if (strcasecmp(GWEN_Buffer_GetStart(buf1), GWEN_Buffer_GetStart(buf0))==0) { GWEN_Buffer_free(buf0); GWEN_Buffer_free(buf1); return 0; } GWEN_Buffer_free(buf0); GWEN_Buffer_free(buf1); } return 1; } void AB_Transaction_FillLocalFromAccount(AB_TRANSACTION *t, const AB_ACCOUNT *a) { const char *s; assert(t); assert(a); /* local account */ s=AB_Account_GetCountry(a); if (!s || !*s) s="de"; AB_Transaction_SetLocalCountry(t, s); AB_Transaction_SetRemoteCountry(t, s); s=AB_Account_GetBankCode(a); if (s && *s) AB_Transaction_SetLocalBankCode(t, s); s=AB_Account_GetAccountNumber(a); if (s && *s) AB_Transaction_SetLocalAccountNumber(t, s); s=AB_Account_GetOwnerName(a); if (s && *s) AB_Transaction_SetLocalName(t, s); s=AB_Account_GetBIC(a); if (s && *s) AB_Transaction_SetLocalBic(t, s); s=AB_Account_GetIBAN(a); if (s && *s) AB_Transaction_SetLocalIban(t, s); } int AB_Transaction_CheckPurposeAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { const GWEN_STRINGLIST *sl; int maxn; int maxs; int n; /* check purpose */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesPurpose(lim); maxs=AB_TransactionLimits_GetMaxLenPurpose(lim); } else { DBG_INFO(AQBANKING_LOGDOMAIN, "No transaction limits"); maxn=0; maxs=0; } sl=AB_Transaction_GetPurpose(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; const char *p; se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { n++; if (maxn && n>maxn) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many purpose lines (%d>%d)", n, maxn); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Too many purpose lines (%d>%d)"), n, maxn); return GWEN_ERROR_INVALID; } else { int l; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, maxs, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); GWEN_Text_CondenseBuffer(tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (maxs && l>maxs) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many chars in purpose line %d (%d>%d)", n, l, maxs); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Too many chars in purpose line %d (%d>%d)"), n, l, maxs); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } GWEN_Buffer_free(tbuf); } } se=GWEN_StringListEntry_Next(se); } /* while */ } if (!n) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No purpose lines"); return GWEN_ERROR_INVALID; } return 0; } int AB_Transaction_CheckNamesAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { const GWEN_STRINGLIST *sl; int maxn; int maxs; int n; const char *s; /* check remote name */ if (lim) { maxn=AB_TransactionLimits_GetMaxLinesRemoteName(lim); maxs=AB_TransactionLimits_GetMaxLenRemoteName(lim); } else { maxn=0; maxs=0; } sl=AB_Transaction_GetRemoteName(t); n=0; if (sl) { GWEN_STRINGLISTENTRY *se; const char *p; se=GWEN_StringList_FirstEntry(sl); while(se) { p=GWEN_StringListEntry_Data(se); if (p && *p) { n++; if (maxn && n>maxn) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many remote name lines (%d>%d)", n, maxn); return GWEN_ERROR_INVALID; } else { GWEN_BUFFER *tbuf; int l; tbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_ImExporter_Utf8ToDta(p, -1, tbuf); GWEN_Text_CondenseBuffer(tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (maxs>0 && l>maxs) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many chars in remote name line %d (%d>%d)", n, l, maxs); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } GWEN_Buffer_free(tbuf); } } se=GWEN_StringListEntry_Next(se); } /* while */ } if (!n) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No remote name lines"); return GWEN_ERROR_INVALID; } /* check local name */ if (lim) maxs=AB_TransactionLimits_GetMaxLenLocalName(lim); else maxs=0; s=AB_Transaction_GetLocalName(t); if (s && *s) { int l; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_ImExporter_Utf8ToDta(s, -1, tbuf); GWEN_Text_CondenseBuffer(tbuf); l=GWEN_Buffer_GetUsedBytes(tbuf); if (maxs>0 && l>maxs) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too many chars in local name (%d>%d)", l, maxs); GWEN_Buffer_free(tbuf); return GWEN_ERROR_INVALID; } GWEN_Buffer_free(tbuf); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing local name"); return GWEN_ERROR_INVALID; } return 0; } int AB_Transaction_CheckTextKeyAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { int n; /* check text key */ if (lim) { if (GWEN_StringList_Count(AB_TransactionLimits_GetValuesTextKey(lim))){ char numbuf[32]; n=AB_Transaction_GetTextKey(t); snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesTextKey(lim, numbuf)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Text key \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Text key \"%d\" not supported by the bank"), n); return GWEN_ERROR_INVALID; } } } return 0; } int AB_Transaction_CheckRecurrenceAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { if (lim) { /* check period */ if (AB_Transaction_GetPeriod(t)==AB_Transaction_PeriodMonthly) { const GWEN_STRINGLIST *sl; /* check cycle */ sl=AB_TransactionLimits_GetValuesCycleMonth(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; int n; n=AB_Transaction_GetCycle(t); if (n==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No cycle given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesCycleMonth(lim, numbuf) && !AB_TransactionLimits_HasValuesCycleMonth(lim, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* check execution day */ sl=AB_TransactionLimits_GetValuesExecutionDayMonth(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; int n; n=AB_Transaction_GetExecutionDay(t); if (n==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No execution day given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesExecutionDayMonth(lim, numbuf) && !AB_TransactionLimits_HasValuesExecutionDayMonth(lim, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Execution month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Execution month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ } else if (AB_Transaction_GetPeriod(t)==AB_Transaction_PeriodWeekly) { const GWEN_STRINGLIST *sl; /* check cycle */ sl=AB_TransactionLimits_GetValuesCycleWeek(lim); if (GWEN_StringList_Count(sl)) { char numbuf[32]; int n; n=AB_Transaction_GetCycle(t); if (n==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No cycle given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesCycleWeek(lim, numbuf) && !AB_TransactionLimits_HasValuesCycleWeek(lim, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Week day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Week day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ /* check execution day */ sl=AB_TransactionLimits_GetValuesExecutionDayWeek(lim); if (GWEN_StringList_Count(sl)){ char numbuf[32]; int n; n=AB_Transaction_GetExecutionDay(t); if (n==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No execution day given"); return GWEN_ERROR_INVALID; } snprintf(numbuf, sizeof(numbuf), "%d", n); if (!AB_TransactionLimits_HasValuesExecutionDayWeek(lim, numbuf) && !AB_TransactionLimits_HasValuesExecutionDayWeek(lim, "0")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Execution month day \"%s\" not supported by bank", numbuf); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Execution month day \"%d\" not supported by bank"), n); return GWEN_ERROR_INVALID; } } /* if there are limits */ } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unsupported period %d", AB_Transaction_GetPeriod(t)); return GWEN_ERROR_INVALID; } } /* if limits */ return 0; } int AB_Transaction_CheckFirstExecutionDateAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { if (lim) { const GWEN_TIME *ti; /* check setup times */ ti=AB_Transaction_GetFirstExecutionDate(t); if (ti) { GWEN_TIME *currDate; int dt; int n; currDate=GWEN_CurrentTime(); assert(currDate); dt=((int)GWEN_Time_DiffSeconds(ti, currDate))/(60*60*24); GWEN_Time_free(currDate); /* check minimum setup time */ n=AB_TransactionLimits_GetMinValueSetupTime(lim); if (n && dtn) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Maximum setup time violated"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Maximum setup time violated. " "Dated transactions need to be at most %d days away"), n); return GWEN_ERROR_INVALID; } } } return 0; } int AB_Transaction_CheckDateAgainstLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { if (lim) { const GWEN_TIME *ti; ti=AB_Transaction_GetDate(t); if (ti) { GWEN_TIME *currDate; int dt; int n; currDate=GWEN_CurrentTime(); assert(currDate); dt=((int)GWEN_Time_DiffSeconds(ti, currDate))/(60*60*24); GWEN_Time_free(currDate); /* check minimum setup time */ n=AB_TransactionLimits_GetMinValueSetupTime(lim); if (n && dtn) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Maximum setup time violated"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Maximum setup time violated. " "Dated transactions need to be at most %d days away"), n); return GWEN_ERROR_INVALID; } } } return 0; } int AB_Transaction_CheckDateAgainstSequenceLimits(const AB_TRANSACTION *t, const AB_TRANSACTION_LIMITS *lim) { if (lim) { const GWEN_TIME *ti; ti=AB_Transaction_GetDate(t); if (ti) { GWEN_TIME *currDate; int dt; int minTime=0; int maxTime=0; currDate=GWEN_CurrentTime(); assert(currDate); dt=((int)GWEN_Time_DiffSeconds(ti, currDate))/(60*60*24); GWEN_Time_free(currDate); switch(AB_Transaction_GetSequenceType(t)) { case AB_Transaction_SequenceTypeOnce: minTime=AB_TransactionLimits_GetMinValueSetupTimeOnce(lim); maxTime=AB_TransactionLimits_GetMaxValueSetupTimeOnce(lim); break; case AB_Transaction_SequenceTypeFirst: minTime=AB_TransactionLimits_GetMinValueSetupTimeFirst(lim); maxTime=AB_TransactionLimits_GetMaxValueSetupTimeFirst(lim); break; case AB_Transaction_SequenceTypeFollowing: minTime=AB_TransactionLimits_GetMinValueSetupTimeRecurring(lim); maxTime=AB_TransactionLimits_GetMaxValueSetupTimeRecurring(lim); break; case AB_Transaction_SequenceTypeFinal: minTime=AB_TransactionLimits_GetMinValueSetupTimeFinal(lim); maxTime=AB_TransactionLimits_GetMaxValueSetupTimeFinal(lim); break; case AB_Transaction_SequenceTypeUnknown: break; } if (minTime==0) minTime=AB_TransactionLimits_GetMinValueSetupTime(lim); if (maxTime==0) maxTime=AB_TransactionLimits_GetMaxValueSetupTime(lim); /* check minimum setup time */ if (minTime && dtmaxTime) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Maximum setup time violated"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Maximum setup time violated. " "Dated transactions need to be at most %d days away"), maxTime); return GWEN_ERROR_INVALID; } } } return 0; } static int _checkStringForSepaCharset(const char *s, int restricted) { char *ascii = "':?,-(+.)/ &*$%"; #define DTAUSOFFSET 11 assert(s); if (restricted) ascii[DTAUSOFFSET] = '\0'; while(*s) { unsigned char c=*s++; if (!((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9') || strchr(ascii, c)!=NULL)) { char errchr[7]; int i = 0; if (c == 0xC3 && !restricted) { c = *s++; switch(c) { case 0x84: /* AE */ case 0xA4: /* ae */ case 0x96: /* OE */ case 0xB6: /* oe */ case 0x9C: /* UE */ case 0xBC: /* ue */ case 0x9F: /* ss */ if ((*s & 0xC0) != 0x80) break; /* these are no umlauts, after all, so fall through */ default: errchr[i++]=0xC3; if ((c & 0xC0) == 0x80) errchr[i++]=c; else /* UTF-8 sequence ended prematurely */ s--; break; } } else errchr[i++] = c; if (i) { while((*s & 0xC0) == 0x80) if (i<6) errchr[i++]=*s++; else { i++; s++; } if (i<7 && (i>1 || !(c & 0x80))) { errchr[i] = '\0'; DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in string: '%s'", errchr); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "String not properly UTF-8 encoded"); } return GWEN_ERROR_BAD_DATA; } } } return 0; } /* This function does not check full UTF8, it only checks whether the given string contains characters * other than "A"-"Z", "a"-"z" and "0"-"9". * We don't use isalnum here because I'm not sure how that function handles UTF-8 chars with umlauts... */ static int _checkStringForAlNum(const char *s, int lcase) { assert(s); while(*s) { unsigned char c=*s; if (!((c>='0' && c<='9') || (c>='A' && c<='Z') || (lcase && c>='a' && c<='z'))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in string: '%c'", c); return GWEN_ERROR_BAD_DATA; } s++; } return 0; } int AB_Transaction_CheckForSepaConformity(const AB_TRANSACTION *t, int restricted) { if (t) { const GWEN_STRINGLIST *sl; const char *s; int rv; s=AB_Transaction_GetLocalIban(t); if (!(s && *s)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty local IBAN in transaction"); return GWEN_ERROR_BAD_DATA; } rv=_checkStringForAlNum(s, 1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in local IBAN"); return rv; } s=AB_Transaction_GetLocalBic(t); if (!(s && *s)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty local BIC in transaction"); return GWEN_ERROR_BAD_DATA; } rv=_checkStringForAlNum(s, 0); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in local BIC"); return rv; } s=AB_Transaction_GetRemoteIban(t); if (!(s && *s)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty remote IBAN in transaction"); return GWEN_ERROR_BAD_DATA; } rv=_checkStringForAlNum(s, 1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in remote IBAN"); return rv; } s=AB_Transaction_GetRemoteBic(t); if (!(s && *s)) { if (strncmp(AB_Transaction_GetLocalIban(t), AB_Transaction_GetRemoteIban(t), 2)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty remote BIC in transaction"); return GWEN_ERROR_BAD_DATA; } } else { rv=_checkStringForAlNum(s, 0); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in remote BIC"); return rv; } } s=AB_Transaction_GetLocalName(t); if (!(s && *s)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty local name in transaction"); return GWEN_ERROR_BAD_DATA; } rv=_checkStringForSepaCharset(s, restricted); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in local name"); return rv; } sl=AB_Transaction_GetRemoteName(t); if (sl) { GWEN_STRINGLISTENTRY *se; int lines=0; se=GWEN_StringList_FirstEntry(sl); while(se) { s=GWEN_StringListEntry_Data(se); if (s && *s) { rv=_checkStringForSepaCharset(s, restricted); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Invalid character in remote name"); return rv; } } else { if (lines==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty remote name in transaction"); return GWEN_ERROR_BAD_DATA; } } lines++; se=GWEN_StringListEntry_Next(se); } /* while */ } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing or empty remote name in transaction"); return GWEN_ERROR_BAD_DATA; } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing transaction"); return GWEN_ERROR_BAD_DATA; } DBG_INFO(AQBANKING_LOGDOMAIN, "Transaction conforms to restricted SEPA charset"); return 0; } int AB_Transaction_WriteToFile(const AB_TRANSACTION *t, const char *tFile) { GWEN_DB_NODE *dbCtx; GWEN_SYNCIO *sio; int rv; dbCtx=GWEN_DB_Group_new("context"); rv=AB_Transaction_toDb(t, dbCtx); if (rv<0) { DBG_ERROR(0, "Error transaction context to db"); return rv; } if (tFile==NULL) { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE | GWEN_SYNCIO_FILE_FLAGS_WRITE); } else { sio=GWEN_SyncIo_File_new(tFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error selecting output file: %s", strerror(errno)); GWEN_SyncIo_free(sio); return rv; } } rv=GWEN_DB_WriteToIo(dbCtx, sio, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(0, "Error writing context (%d)", rv); GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_DB_Group_free(dbCtx); return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/pin_p.h0000644000175000017500000000055512372461742017350 00000000000000/* This file is auto-generated from "pin.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef PIN_P_H #define PIN_P_H #include "pin_l.h" struct AB_PIN { GWEN_LIST_ELEMENT(AB_PIN) int _usage; int _modified; char *token; char *value; char *hash; char *status; }; #endif /* PIN_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/textkeydescr.h0000644000175000017500000000732212372461741020757 00000000000000/* This file is auto-generated from "textkeydescr.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TEXTKEYDESCR_H #define TEXTKEYDESCR_H /** @page P_AB_TEXTKEY_DESCR_PUBLIC AB_TextKeyDescr (public) This page describes the properties of AB_TEXTKEY_DESCR This type contains the description of a textkey. Please note that all text fields are in UTF-8.@anchor AB_TEXTKEY_DESCR_Value

Value

Set this property with @ref AB_TextKeyDescr_SetValue, get it with @ref AB_TextKeyDescr_GetValue

@anchor AB_TEXTKEY_DESCR_Name

Name

This is the localized name for the text key value given above.

Set this property with @ref AB_TextKeyDescr_SetName, get it with @ref AB_TextKeyDescr_GetName

@anchor AB_TEXTKEY_DESCR_Descr

Descr

This is the localized description for the text key value given above.

Set this property with @ref AB_TextKeyDescr_SetDescr, get it with @ref AB_TextKeyDescr_GetDescr

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_TEXTKEY_DESCR AB_TEXTKEY_DESCR; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_TEXTKEY_DESCR, AB_TextKeyDescr, AQBANKING_API) AQBANKING_API AB_TEXTKEY_DESCR_LIST *AB_TextKeyDescr_List_dup(const AB_TEXTKEY_DESCR_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_TEXTKEY_DESCR, AB_TextKeyDescr, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_TextKeyDescr_List2_freeAll(AB_TEXTKEY_DESCR_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_TEXTKEY_DESCR *AB_TextKeyDescr_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_TEXTKEY_DESCR *AB_TextKeyDescr_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_TEXTKEY_DESCR *AB_TextKeyDescr_dup(const AB_TEXTKEY_DESCR*st); /** Destroys the given object. */ AQBANKING_API void AB_TextKeyDescr_free(AB_TEXTKEY_DESCR *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_TextKeyDescr_Attach(AB_TEXTKEY_DESCR *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_TextKeyDescr_ReadDb(AB_TEXTKEY_DESCR *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_TextKeyDescr_toDb(const AB_TEXTKEY_DESCR*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_TextKeyDescr_IsModified(const AB_TEXTKEY_DESCR *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_TextKeyDescr_SetModified(AB_TEXTKEY_DESCR *st, int i); /** * Returns the property @ref AB_TEXTKEY_DESCR_Value */ AQBANKING_API int AB_TextKeyDescr_GetValue(const AB_TEXTKEY_DESCR *el); /** * Set the property @ref AB_TEXTKEY_DESCR_Value */ AQBANKING_API void AB_TextKeyDescr_SetValue(AB_TEXTKEY_DESCR *el, int d); /** * Returns the property @ref AB_TEXTKEY_DESCR_Name */ AQBANKING_API const char *AB_TextKeyDescr_GetName(const AB_TEXTKEY_DESCR *el); /** * Set the property @ref AB_TEXTKEY_DESCR_Name */ AQBANKING_API void AB_TextKeyDescr_SetName(AB_TEXTKEY_DESCR *el, const char *d); /** * Returns the property @ref AB_TEXTKEY_DESCR_Descr */ AQBANKING_API const char *AB_TextKeyDescr_GetDescr(const AB_TEXTKEY_DESCR *el); /** * Set the property @ref AB_TEXTKEY_DESCR_Descr */ AQBANKING_API void AB_TextKeyDescr_SetDescr(AB_TEXTKEY_DESCR *el, const char *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TEXTKEYDESCR_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/value.h0000644000175000017500000001163012364015477017354 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_VALUE_H #define AB_VALUE_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct AB_VALUE AB_VALUE; GWEN_LIST_FUNCTION_LIB_DEFS(AB_VALUE, AB_Value, AQBANKING_API) /** Creates a deep copy of an AB_VALUE_LIST object * */ AQBANKING_API AB_VALUE_LIST *AB_Value_List_dup(const AB_VALUE_LIST *vl); AQBANKING_API AB_VALUE *AB_Value_new(void); AQBANKING_API AB_VALUE *AB_Value_dup(const AB_VALUE *ov); AQBANKING_API void AB_Value_free(AB_VALUE *v); /** * This function reads a AB_VALUE from a string. Strings suitable as * arguments are those created by @ref AB_Value_toString or simple * floating point string (as in "123.45" or "-123.45"). */ AQBANKING_API AB_VALUE *AB_Value_fromString(const char *s); /** * This function exports the value in a format which can be recognized * by the function @ref AB_Value_fromString. You should not make any * assumption about the format of the string created here. */ AQBANKING_API void AB_Value_toString(const AB_VALUE *v, GWEN_BUFFER *buf); AQBANKING_API void AB_Value_toHumanReadableString(const AB_VALUE *v, GWEN_BUFFER *buf, int prec); AQBANKING_API void AB_Value_toHumanReadableString2(const AB_VALUE *v, GWEN_BUFFER *buf, int prec, int withCurrency); AQBANKING_API AB_VALUE *AB_Value_fromDouble(double i); /** Returns a newly allocated rational number, initialized to * num/denom. */ AQBANKING_API AB_VALUE *AB_Value_fromInt(long int num, long int denom); /** Create a value from the given GWEN_DB. */ AQBANKING_API AB_VALUE *AB_Value_fromDb(GWEN_DB_NODE *db); /** Write the given value into the given GWEN_DB. */ AQBANKING_API int AB_Value_toDb(const AB_VALUE *v, GWEN_DB_NODE *db); /** Write the given value into the given GWEN_DB (uses float instead of rational). */ AQBANKING_API int AB_Value_toDbFloat(const AB_VALUE *v, GWEN_DB_NODE *db); /** * This function returns the value as a double. * You should not feed another AB_VALUE from this double, because the * conversion from an AB_VALUE to a double might be lossy! */ AQBANKING_API double AB_Value_GetValueAsDouble(const AB_VALUE *v); /** * You should not use a double retrieved via * @ref AB_Value_GetValueAsDouble as an argument to this function, because * the conversion from AB_VALUE to double to AB_VALUE might change the * real value. */ AQBANKING_API void AB_Value_SetValueFromDouble(AB_VALUE *v, double i); /** * Write the value (without the currency) in nominator/denominator * form into the given buffer if possibly. * This form looks like "12345/6789" (nominator/denominator). */ AQBANKING_API int AB_Value_GetNumDenomString(const AB_VALUE *v, char *buffer, uint32_t buflen); AQBANKING_API void AB_Value_SetZero(AB_VALUE *v); AQBANKING_API int AB_Value_IsZero(const AB_VALUE *v); AQBANKING_API int AB_Value_IsNegative(const AB_VALUE *v); AQBANKING_API int AB_Value_IsPositive(const AB_VALUE *v); AQBANKING_API int AB_Value_Compare(const AB_VALUE *v1, const AB_VALUE *v2); /** Returns non-zero if v1 and v2 are equal, zero if they are * non-equal. Although AB_Value_Compare() can be used for the same * purpose, this function is much faster. */ AQBANKING_API int AB_Value_Equal(const AB_VALUE *v1, const AB_VALUE *v2); AQBANKING_API int AB_Value_AddValue(AB_VALUE *v1, const AB_VALUE *v2); AQBANKING_API int AB_Value_SubValue(AB_VALUE *v1, const AB_VALUE *v2); AQBANKING_API int AB_Value_MultValue(AB_VALUE *v1, const AB_VALUE *v2); AQBANKING_API int AB_Value_DivValue(AB_VALUE *v1, const AB_VALUE *v2); AQBANKING_API int AB_Value_Negate(AB_VALUE *v); AQBANKING_API const char *AB_Value_GetCurrency(const AB_VALUE *v); AQBANKING_API void AB_Value_SetCurrency(AB_VALUE *v, const char *s); AQBANKING_API void AB_Value_Dump(const AB_VALUE *v, FILE *f, unsigned int indent); /** Returns the numerator of the given rational number. */ AQBANKING_API long int AB_Value_Num(const AB_VALUE *v); /** Returns the denominator of the given rational number. */ AQBANKING_API long int AB_Value_Denom(const AB_VALUE *v); /** Write value to HBCI string (e.g. "11,90" is written as "11,9") */ AQBANKING_API void AB_Value_toHbciString(const AB_VALUE *v, GWEN_BUFFER *buf); #ifdef __cplusplus } #endif #endif /* AB_VALUE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/security.h0000644000175000017500000001255612372461742020116 00000000000000/* This file is auto-generated from "security.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef SECURITY_H #define SECURITY_H /** @page P_AB_SECURITY_PUBLIC AB_Security (public) This page describes the properties of AB_SECURITY @anchor AB_SECURITY_Name

Name

Full name of the security.

Set this property with @ref AB_Security_SetName, get it with @ref AB_Security_GetName

@anchor AB_SECURITY_UniqueId

UniqueId

Unique id of the security within the namespace.

Set this property with @ref AB_Security_SetUniqueId, get it with @ref AB_Security_GetUniqueId

@anchor AB_SECURITY_NameSpace

NameSpace

Namespace for uniqueId (e.g. CUSIP for North America)

Set this property with @ref AB_Security_SetNameSpace, get it with @ref AB_Security_GetNameSpace

@anchor AB_SECURITY_TickerSymbol

TickerSymbol

Ticker symbol of the security.

Set this property with @ref AB_Security_SetTickerSymbol, get it with @ref AB_Security_GetTickerSymbol

@anchor AB_SECURITY_Units

Units

Number of units held (e.g. number of stock units etc)

Set this property with @ref AB_Security_SetUnits, get it with @ref AB_Security_GetUnits

@anchor AB_SECURITY_UnitPriceValue

UnitPriceValue

Price of a unit as of unitPriceDate.

Set this property with @ref AB_Security_SetUnitPriceValue, get it with @ref AB_Security_GetUnitPriceValue

@anchor AB_SECURITY_UnitPriceDate

UnitPriceDate

Date for the unitPriceValue

Set this property with @ref AB_Security_SetUnitPriceDate, get it with @ref AB_Security_GetUnitPriceDate

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_SECURITY AB_SECURITY; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_SECURITY, AB_Security, AQBANKING_API) AQBANKING_API AB_SECURITY_LIST *AB_Security_List_dup(const AB_SECURITY_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_SECURITY, AB_Security, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_Security_List2_freeAll(AB_SECURITY_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_SECURITY *AB_Security_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_SECURITY *AB_Security_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_SECURITY *AB_Security_dup(const AB_SECURITY*st); /** Destroys the given object. */ AQBANKING_API void AB_Security_free(AB_SECURITY *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_Security_Attach(AB_SECURITY *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_Security_ReadDb(AB_SECURITY *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_Security_toDb(const AB_SECURITY*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_Security_IsModified(const AB_SECURITY *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_Security_SetModified(AB_SECURITY *st, int i); /** * Returns the property @ref AB_SECURITY_Name */ AQBANKING_API const char *AB_Security_GetName(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_Name */ AQBANKING_API void AB_Security_SetName(AB_SECURITY *el, const char *d); /** * Returns the property @ref AB_SECURITY_UniqueId */ AQBANKING_API const char *AB_Security_GetUniqueId(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_UniqueId */ AQBANKING_API void AB_Security_SetUniqueId(AB_SECURITY *el, const char *d); /** * Returns the property @ref AB_SECURITY_NameSpace */ AQBANKING_API const char *AB_Security_GetNameSpace(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_NameSpace */ AQBANKING_API void AB_Security_SetNameSpace(AB_SECURITY *el, const char *d); /** * Returns the property @ref AB_SECURITY_TickerSymbol */ AQBANKING_API const char *AB_Security_GetTickerSymbol(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_TickerSymbol */ AQBANKING_API void AB_Security_SetTickerSymbol(AB_SECURITY *el, const char *d); /** * Returns the property @ref AB_SECURITY_Units */ AQBANKING_API const AB_VALUE *AB_Security_GetUnits(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_Units */ AQBANKING_API void AB_Security_SetUnits(AB_SECURITY *el, const AB_VALUE *d); /** * Returns the property @ref AB_SECURITY_UnitPriceValue */ AQBANKING_API const AB_VALUE *AB_Security_GetUnitPriceValue(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_UnitPriceValue */ AQBANKING_API void AB_Security_SetUnitPriceValue(AB_SECURITY *el, const AB_VALUE *d); /** * Returns the property @ref AB_SECURITY_UnitPriceDate */ AQBANKING_API const GWEN_TIME *AB_Security_GetUnitPriceDate(const AB_SECURITY *el); /** * Set the property @ref AB_SECURITY_UnitPriceDate */ AQBANKING_API void AB_Security_SetUnitPriceDate(AB_SECURITY *el, const GWEN_TIME *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* SECURITY_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/pin_l.h0000644000175000017500000000403012372461742017334 00000000000000/* This file is auto-generated from "pin.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef PIN_L_H #define PIN_L_H /** @page P_AB_PIN_LIB AB_Pin (lib) This page describes the properties of AB_PIN */ #ifdef __cplusplus extern "C" { #endif typedef struct AB_PIN AB_PIN; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_DEFS(AB_PIN, AB_Pin) AB_PIN_LIST *AB_Pin_List_dup(const AB_PIN_LIST *stl); GWEN_LIST2_FUNCTION_DEFS(AB_PIN, AB_Pin) void AB_Pin_List2_freeAll(AB_PIN_LIST2 *stl); AB_PIN *AB_Pin_new(void); AB_PIN *AB_Pin_fromDb(GWEN_DB_NODE *db); AB_PIN *AB_Pin_dup(const AB_PIN*st); void AB_Pin_free(AB_PIN *st); void AB_Pin_Attach(AB_PIN *st); int AB_Pin_ReadDb(AB_PIN *st, GWEN_DB_NODE *db); int AB_Pin_toDb(const AB_PIN*st, GWEN_DB_NODE *db); int AB_Pin_IsModified(const AB_PIN *st); void AB_Pin_SetModified(AB_PIN *st, int i); /** * Returns the property @ref AB_PIN_Token */ AQBANKING_API const char *AB_Pin_GetToken(const AB_PIN *el); /** * Set the property @ref AB_PIN_Token */ AQBANKING_API void AB_Pin_SetToken(AB_PIN *el, const char *d); /** * Returns the property @ref AB_PIN_Value */ AQBANKING_API const char *AB_Pin_GetValue(const AB_PIN *el); /** * Set the property @ref AB_PIN_Value */ AQBANKING_API void AB_Pin_SetValue(AB_PIN *el, const char *d); /** * Returns the property @ref AB_PIN_Hash */ AQBANKING_API const char *AB_Pin_GetHash(const AB_PIN *el); /** * Set the property @ref AB_PIN_Hash */ AQBANKING_API void AB_Pin_SetHash(AB_PIN *el, const char *d); /** * Returns the property @ref AB_PIN_Status */ AQBANKING_API const char *AB_Pin_GetStatus(const AB_PIN *el); /** * Set the property @ref AB_PIN_Status */ AQBANKING_API void AB_Pin_SetStatus(AB_PIN *el, const char *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* PIN_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/value_p.h0000644000175000017500000000164612364015477017701 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_VALUE_P_H #define AB_VALUE_P_H #include "value.h" #include /** Internal structure of AB_VALUE -- do not access this directly! */ struct AB_VALUE { GWEN_LIST_ELEMENT(AB_VALUE) mpq_t value; char *currency; }; static void AB_Value__toString(const AB_VALUE *v, GWEN_BUFFER *buf); #endif /* AB_VALUE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionlimits.c0000644000175000017500000013216712372462213022004 00000000000000/* This file is auto-generated from "transactionlimits.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "transactionlimits_p.h" #include #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_TRANSACTION_LIMITS, AB_TransactionLimits) GWEN_LIST2_FUNCTIONS(AB_TRANSACTION_LIMITS, AB_TransactionLimits) AB_TRANSACTION_LIMITS *AB_TransactionLimits_new(void) { AB_TRANSACTION_LIMITS *st; GWEN_NEW_OBJECT(AB_TRANSACTION_LIMITS, st) st->_usage=1; GWEN_LIST_INIT(AB_TRANSACTION_LIMITS, st) st->valuesTextKey=GWEN_StringList_new(); st->textKeys=AB_TextKeyDescr_List_new(); st->valuesCycleWeek=GWEN_StringList_new(); st->valuesCycleMonth=GWEN_StringList_new(); st->valuesExecutionDayWeek=GWEN_StringList_new(); st->valuesExecutionDayMonth=GWEN_StringList_new(); return st; } void AB_TransactionLimits_free(AB_TRANSACTION_LIMITS *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->valuesTextKey) GWEN_StringList_free(st->valuesTextKey); if (st->textKeys) AB_TextKeyDescr_List_free(st->textKeys); if (st->valuesCycleWeek) GWEN_StringList_free(st->valuesCycleWeek); if (st->valuesCycleMonth) GWEN_StringList_free(st->valuesCycleMonth); if (st->valuesExecutionDayWeek) GWEN_StringList_free(st->valuesExecutionDayWeek); if (st->valuesExecutionDayMonth) GWEN_StringList_free(st->valuesExecutionDayMonth); GWEN_LIST_FINI(AB_TRANSACTION_LIMITS, st) GWEN_FREE_OBJECT(st); } } } AB_TRANSACTION_LIMITS *AB_TransactionLimits_dup(const AB_TRANSACTION_LIMITS *d) { AB_TRANSACTION_LIMITS *st; assert(d); st=AB_TransactionLimits_new(); st->maxLenLocalName=d->maxLenLocalName; st->minLenLocalName=d->minLenLocalName; st->maxLenRemoteName=d->maxLenRemoteName; st->minLenRemoteName=d->minLenRemoteName; st->maxLinesRemoteName=d->maxLinesRemoteName; st->minLinesRemoteName=d->minLinesRemoteName; st->maxLenLocalBankCode=d->maxLenLocalBankCode; st->minLenLocalBankCode=d->minLenLocalBankCode; st->maxLenLocalAccountNumber=d->maxLenLocalAccountNumber; st->minLenLocalAccountNumber=d->minLenLocalAccountNumber; st->maxLenLocalSuffix=d->maxLenLocalSuffix; st->minLenLocalSuffix=d->minLenLocalSuffix; st->maxLenRemoteBankCode=d->maxLenRemoteBankCode; st->minLenRemoteBankCode=d->minLenRemoteBankCode; st->maxLenRemoteAccountNumber=d->maxLenRemoteAccountNumber; st->minLenRemoteAccountNumber=d->minLenRemoteAccountNumber; st->maxLenRemoteSuffix=d->maxLenRemoteSuffix; st->minLenRemoteSuffix=d->minLenRemoteSuffix; st->maxLenRemoteIban=d->maxLenRemoteIban; st->minLenRemoteIban=d->minLenRemoteIban; st->maxLenTextKey=d->maxLenTextKey; st->minLenTextKey=d->minLenTextKey; if (d->valuesTextKey) { GWEN_StringList_free(st->valuesTextKey); st->valuesTextKey=GWEN_StringList_dup(d->valuesTextKey); } if (d->textKeys) { AB_TextKeyDescr_List_free(st->textKeys); st->textKeys=AB_TextKeyDescr_List_dup(d->textKeys); } st->maxLenCustomerReference=d->maxLenCustomerReference; st->minLenCustomerReference=d->minLenCustomerReference; st->maxLenBankReference=d->maxLenBankReference; st->minLenBankReference=d->minLenBankReference; st->maxLenPurpose=d->maxLenPurpose; st->minLenPurpose=d->minLenPurpose; st->maxLinesPurpose=d->maxLinesPurpose; st->minLinesPurpose=d->minLinesPurpose; st->needDate=d->needDate; st->minValueSetupTime=d->minValueSetupTime; st->maxValueSetupTime=d->maxValueSetupTime; st->minValueSetupTimeFirst=d->minValueSetupTimeFirst; st->maxValueSetupTimeFirst=d->maxValueSetupTimeFirst; st->minValueSetupTimeOnce=d->minValueSetupTimeOnce; st->maxValueSetupTimeOnce=d->maxValueSetupTimeOnce; st->minValueSetupTimeRecurring=d->minValueSetupTimeRecurring; st->maxValueSetupTimeRecurring=d->maxValueSetupTimeRecurring; st->minValueSetupTimeFinal=d->minValueSetupTimeFinal; st->maxValueSetupTimeFinal=d->maxValueSetupTimeFinal; if (d->valuesCycleWeek) { GWEN_StringList_free(st->valuesCycleWeek); st->valuesCycleWeek=GWEN_StringList_dup(d->valuesCycleWeek); } if (d->valuesCycleMonth) { GWEN_StringList_free(st->valuesCycleMonth); st->valuesCycleMonth=GWEN_StringList_dup(d->valuesCycleMonth); } if (d->valuesExecutionDayWeek) { GWEN_StringList_free(st->valuesExecutionDayWeek); st->valuesExecutionDayWeek=GWEN_StringList_dup(d->valuesExecutionDayWeek); } if (d->valuesExecutionDayMonth) { GWEN_StringList_free(st->valuesExecutionDayMonth); st->valuesExecutionDayMonth=GWEN_StringList_dup(d->valuesExecutionDayMonth); } st->allowMonthly=d->allowMonthly; st->allowWeekly=d->allowWeekly; st->allowChangeRecipientAccount=d->allowChangeRecipientAccount; st->allowChangeRecipientName=d->allowChangeRecipientName; st->allowChangeValue=d->allowChangeValue; st->allowChangeTextKey=d->allowChangeTextKey; st->allowChangePurpose=d->allowChangePurpose; st->allowChangeFirstExecutionDate=d->allowChangeFirstExecutionDate; st->allowChangeLastExecutionDate=d->allowChangeLastExecutionDate; st->allowChangeCycle=d->allowChangeCycle; st->allowChangePeriod=d->allowChangePeriod; st->allowChangeExecutionDay=d->allowChangeExecutionDay; return st; } int AB_TransactionLimits_toDb(const AB_TRANSACTION_LIMITS *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenLocalName", st->maxLenLocalName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenLocalName", st->minLenLocalName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenRemoteName", st->maxLenRemoteName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenRemoteName", st->minLenRemoteName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLinesRemoteName", st->maxLinesRemoteName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLinesRemoteName", st->minLinesRemoteName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenLocalBankCode", st->maxLenLocalBankCode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenLocalBankCode", st->minLenLocalBankCode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenLocalAccountNumber", st->maxLenLocalAccountNumber)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenLocalAccountNumber", st->minLenLocalAccountNumber)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenLocalSuffix", st->maxLenLocalSuffix)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenLocalSuffix", st->minLenLocalSuffix)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenRemoteBankCode", st->maxLenRemoteBankCode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenRemoteBankCode", st->minLenRemoteBankCode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenRemoteAccountNumber", st->maxLenRemoteAccountNumber)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenRemoteAccountNumber", st->minLenRemoteAccountNumber)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenRemoteSuffix", st->maxLenRemoteSuffix)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenRemoteSuffix", st->minLenRemoteSuffix)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenRemoteIban", st->maxLenRemoteIban)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenRemoteIban", st->minLenRemoteIban)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenTextKey", st->maxLenTextKey)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenTextKey", st->minLenTextKey)) return -1; if (st->valuesTextKey) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "valuesTextKey"); se=GWEN_StringList_FirstEntry(st->valuesTextKey); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "valuesTextKey", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->textKeys) if (1) { GWEN_DB_NODE *dbT; AB_TEXTKEY_DESCR *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_CREATE_GROUP, "textKeys"); assert(dbT); e=AB_TextKeyDescr_List_First(st->textKeys); while(e) { if (AB_TextKeyDescr_toDb(e, GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_CREATE_GROUP, "element"))) return -1; e=AB_TextKeyDescr_List_Next(e); } /* while */ } /* if (1) */ if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenCustomerReference", st->maxLenCustomerReference)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenCustomerReference", st->minLenCustomerReference)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenBankReference", st->maxLenBankReference)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenBankReference", st->minLenBankReference)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLenPurpose", st->maxLenPurpose)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLenPurpose", st->minLenPurpose)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxLinesPurpose", st->maxLinesPurpose)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minLinesPurpose", st->minLinesPurpose)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "needDate", st->needDate)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minValueSetupTime", st->minValueSetupTime)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxValueSetupTime", st->maxValueSetupTime)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minValueSetupTimeFirst", st->minValueSetupTimeFirst)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxValueSetupTimeFirst", st->maxValueSetupTimeFirst)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minValueSetupTimeOnce", st->minValueSetupTimeOnce)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxValueSetupTimeOnce", st->maxValueSetupTimeOnce)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minValueSetupTimeRecurring", st->minValueSetupTimeRecurring)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxValueSetupTimeRecurring", st->maxValueSetupTimeRecurring)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "minValueSetupTimeFinal", st->minValueSetupTimeFinal)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "maxValueSetupTimeFinal", st->maxValueSetupTimeFinal)) return -1; if (st->valuesCycleWeek) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "valuesCycleWeek"); se=GWEN_StringList_FirstEntry(st->valuesCycleWeek); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "valuesCycleWeek", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->valuesCycleMonth) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "valuesCycleMonth"); se=GWEN_StringList_FirstEntry(st->valuesCycleMonth); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "valuesCycleMonth", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->valuesExecutionDayWeek) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "valuesExecutionDayWeek"); se=GWEN_StringList_FirstEntry(st->valuesExecutionDayWeek); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "valuesExecutionDayWeek", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->valuesExecutionDayMonth) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "valuesExecutionDayMonth"); se=GWEN_StringList_FirstEntry(st->valuesExecutionDayMonth); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "valuesExecutionDayMonth", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowMonthly", st->allowMonthly)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowWeekly", st->allowWeekly)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeRecipientAccount", st->allowChangeRecipientAccount)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeRecipientName", st->allowChangeRecipientName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeValue", st->allowChangeValue)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeTextKey", st->allowChangeTextKey)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangePurpose", st->allowChangePurpose)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeFirstExecutionDate", st->allowChangeFirstExecutionDate)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeLastExecutionDate", st->allowChangeLastExecutionDate)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeCycle", st->allowChangeCycle)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangePeriod", st->allowChangePeriod)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowChangeExecutionDay", st->allowChangeExecutionDay)) return -1; return 0; } int AB_TransactionLimits_ReadDb(AB_TRANSACTION_LIMITS *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_TransactionLimits_SetMaxLenLocalName(st, GWEN_DB_GetIntValue(db, "maxLenLocalName", 0, 0)); AB_TransactionLimits_SetMinLenLocalName(st, GWEN_DB_GetIntValue(db, "minLenLocalName", 0, 0)); AB_TransactionLimits_SetMaxLenRemoteName(st, GWEN_DB_GetIntValue(db, "maxLenRemoteName", 0, 0)); AB_TransactionLimits_SetMinLenRemoteName(st, GWEN_DB_GetIntValue(db, "minLenRemoteName", 0, 0)); AB_TransactionLimits_SetMaxLinesRemoteName(st, GWEN_DB_GetIntValue(db, "maxLinesRemoteName", 0, 0)); AB_TransactionLimits_SetMinLinesRemoteName(st, GWEN_DB_GetIntValue(db, "minLinesRemoteName", 0, 0)); AB_TransactionLimits_SetMaxLenLocalBankCode(st, GWEN_DB_GetIntValue(db, "maxLenLocalBankCode", 0, 0)); AB_TransactionLimits_SetMinLenLocalBankCode(st, GWEN_DB_GetIntValue(db, "minLenLocalBankCode", 0, 0)); AB_TransactionLimits_SetMaxLenLocalAccountNumber(st, GWEN_DB_GetIntValue(db, "maxLenLocalAccountNumber", 0, 0)); AB_TransactionLimits_SetMinLenLocalAccountNumber(st, GWEN_DB_GetIntValue(db, "minLenLocalAccountNumber", 0, 0)); AB_TransactionLimits_SetMaxLenLocalSuffix(st, GWEN_DB_GetIntValue(db, "maxLenLocalSuffix", 0, 0)); AB_TransactionLimits_SetMinLenLocalSuffix(st, GWEN_DB_GetIntValue(db, "minLenLocalSuffix", 0, 0)); AB_TransactionLimits_SetMaxLenRemoteBankCode(st, GWEN_DB_GetIntValue(db, "maxLenRemoteBankCode", 0, 0)); AB_TransactionLimits_SetMinLenRemoteBankCode(st, GWEN_DB_GetIntValue(db, "minLenRemoteBankCode", 0, 0)); AB_TransactionLimits_SetMaxLenRemoteAccountNumber(st, GWEN_DB_GetIntValue(db, "maxLenRemoteAccountNumber", 0, 0)); AB_TransactionLimits_SetMinLenRemoteAccountNumber(st, GWEN_DB_GetIntValue(db, "minLenRemoteAccountNumber", 0, 0)); AB_TransactionLimits_SetMaxLenRemoteSuffix(st, GWEN_DB_GetIntValue(db, "maxLenRemoteSuffix", 0, 0)); AB_TransactionLimits_SetMinLenRemoteSuffix(st, GWEN_DB_GetIntValue(db, "minLenRemoteSuffix", 0, 0)); AB_TransactionLimits_SetMaxLenRemoteIban(st, GWEN_DB_GetIntValue(db, "maxLenRemoteIban", 0, 0)); AB_TransactionLimits_SetMinLenRemoteIban(st, GWEN_DB_GetIntValue(db, "minLenRemoteIban", 0, 0)); AB_TransactionLimits_SetMaxLenTextKey(st, GWEN_DB_GetIntValue(db, "maxLenTextKey", 0, 0)); AB_TransactionLimits_SetMinLenTextKey(st, GWEN_DB_GetIntValue(db, "minLenTextKey", 0, 0)); if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "valuesTextKey", i, 0); if (!s) break; AB_TransactionLimits_AddValuesTextKey(st, s, 0); } /* for */ } st->textKeys=AB_TextKeyDescr_List_new(); if (1) {/* just for local vars */ GWEN_DB_NODE *dbT; AB_TEXTKEY_DESCR *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "textKeys"); if (dbT) { GWEN_DB_NODE *dbT2; dbT2=GWEN_DB_FindFirstGroup(dbT, "element"); while(dbT2) { e=AB_TextKeyDescr_fromDb(dbT2); if (!e) { DBG_ERROR(0, "Bad element for type \"AB_TEXTKEY_DESCR\""); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbT2, 2); AB_TransactionLimits_free(st); return 0; } AB_TextKeyDescr_List_Add(e, st->textKeys); dbT2=GWEN_DB_FindNextGroup(dbT2, "element"); } /* while */ } /* if (dbT) */ } /* if (1) */ AB_TransactionLimits_SetMaxLenCustomerReference(st, GWEN_DB_GetIntValue(db, "maxLenCustomerReference", 0, 0)); AB_TransactionLimits_SetMinLenCustomerReference(st, GWEN_DB_GetIntValue(db, "minLenCustomerReference", 0, 0)); AB_TransactionLimits_SetMaxLenBankReference(st, GWEN_DB_GetIntValue(db, "maxLenBankReference", 0, 0)); AB_TransactionLimits_SetMinLenBankReference(st, GWEN_DB_GetIntValue(db, "minLenBankReference", 0, 0)); AB_TransactionLimits_SetMaxLenPurpose(st, GWEN_DB_GetIntValue(db, "maxLenPurpose", 0, 0)); AB_TransactionLimits_SetMinLenPurpose(st, GWEN_DB_GetIntValue(db, "minLenPurpose", 0, 0)); AB_TransactionLimits_SetMaxLinesPurpose(st, GWEN_DB_GetIntValue(db, "maxLinesPurpose", 0, 0)); AB_TransactionLimits_SetMinLinesPurpose(st, GWEN_DB_GetIntValue(db, "minLinesPurpose", 0, 0)); AB_TransactionLimits_SetNeedDate(st, GWEN_DB_GetIntValue(db, "needDate", 0, 0)); AB_TransactionLimits_SetMinValueSetupTime(st, GWEN_DB_GetIntValue(db, "minValueSetupTime", 0, 0)); AB_TransactionLimits_SetMaxValueSetupTime(st, GWEN_DB_GetIntValue(db, "maxValueSetupTime", 0, 0)); AB_TransactionLimits_SetMinValueSetupTimeFirst(st, GWEN_DB_GetIntValue(db, "minValueSetupTimeFirst", 0, 0)); AB_TransactionLimits_SetMaxValueSetupTimeFirst(st, GWEN_DB_GetIntValue(db, "maxValueSetupTimeFirst", 0, 0)); AB_TransactionLimits_SetMinValueSetupTimeOnce(st, GWEN_DB_GetIntValue(db, "minValueSetupTimeOnce", 0, 0)); AB_TransactionLimits_SetMaxValueSetupTimeOnce(st, GWEN_DB_GetIntValue(db, "maxValueSetupTimeOnce", 0, 0)); AB_TransactionLimits_SetMinValueSetupTimeRecurring(st, GWEN_DB_GetIntValue(db, "minValueSetupTimeRecurring", 0, 0)); AB_TransactionLimits_SetMaxValueSetupTimeRecurring(st, GWEN_DB_GetIntValue(db, "maxValueSetupTimeRecurring", 0, 0)); AB_TransactionLimits_SetMinValueSetupTimeFinal(st, GWEN_DB_GetIntValue(db, "minValueSetupTimeFinal", 0, 0)); AB_TransactionLimits_SetMaxValueSetupTimeFinal(st, GWEN_DB_GetIntValue(db, "maxValueSetupTimeFinal", 0, 0)); if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "valuesCycleWeek", i, 0); if (!s) break; AB_TransactionLimits_AddValuesCycleWeek(st, s, 0); } /* for */ } if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "valuesCycleMonth", i, 0); if (!s) break; AB_TransactionLimits_AddValuesCycleMonth(st, s, 0); } /* for */ } if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "valuesExecutionDayWeek", i, 0); if (!s) break; AB_TransactionLimits_AddValuesExecutionDayWeek(st, s, 0); } /* for */ } if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "valuesExecutionDayMonth", i, 0); if (!s) break; AB_TransactionLimits_AddValuesExecutionDayMonth(st, s, 0); } /* for */ } AB_TransactionLimits_SetAllowMonthly(st, GWEN_DB_GetIntValue(db, "allowMonthly", 0, 0)); AB_TransactionLimits_SetAllowWeekly(st, GWEN_DB_GetIntValue(db, "allowWeekly", 0, 0)); AB_TransactionLimits_SetAllowChangeRecipientAccount(st, GWEN_DB_GetIntValue(db, "allowChangeRecipientAccount", 0, 0)); AB_TransactionLimits_SetAllowChangeRecipientName(st, GWEN_DB_GetIntValue(db, "allowChangeRecipientName", 0, 0)); AB_TransactionLimits_SetAllowChangeValue(st, GWEN_DB_GetIntValue(db, "allowChangeValue", 0, 0)); AB_TransactionLimits_SetAllowChangeTextKey(st, GWEN_DB_GetIntValue(db, "allowChangeTextKey", 0, 0)); AB_TransactionLimits_SetAllowChangePurpose(st, GWEN_DB_GetIntValue(db, "allowChangePurpose", 0, 0)); AB_TransactionLimits_SetAllowChangeFirstExecutionDate(st, GWEN_DB_GetIntValue(db, "allowChangeFirstExecutionDate", 0, 0)); AB_TransactionLimits_SetAllowChangeLastExecutionDate(st, GWEN_DB_GetIntValue(db, "allowChangeLastExecutionDate", 0, 0)); AB_TransactionLimits_SetAllowChangeCycle(st, GWEN_DB_GetIntValue(db, "allowChangeCycle", 0, 0)); AB_TransactionLimits_SetAllowChangePeriod(st, GWEN_DB_GetIntValue(db, "allowChangePeriod", 0, 0)); AB_TransactionLimits_SetAllowChangeExecutionDay(st, GWEN_DB_GetIntValue(db, "allowChangeExecutionDay", 0, 0)); return 0; } AB_TRANSACTION_LIMITS *AB_TransactionLimits_fromDb(GWEN_DB_NODE *db) { AB_TRANSACTION_LIMITS *st; assert(db); st=AB_TransactionLimits_new(); AB_TransactionLimits_ReadDb(st, db); st->_modified=0; return st; } int AB_TransactionLimits_GetMaxLenLocalName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenLocalName; } void AB_TransactionLimits_SetMaxLenLocalName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenLocalName=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenLocalName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenLocalName; } void AB_TransactionLimits_SetMinLenLocalName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenLocalName=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenRemoteName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenRemoteName; } void AB_TransactionLimits_SetMaxLenRemoteName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenRemoteName=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenRemoteName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenRemoteName; } void AB_TransactionLimits_SetMinLenRemoteName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenRemoteName=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLinesRemoteName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLinesRemoteName; } void AB_TransactionLimits_SetMaxLinesRemoteName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLinesRemoteName=d; st->_modified=1; } int AB_TransactionLimits_GetMinLinesRemoteName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLinesRemoteName; } void AB_TransactionLimits_SetMinLinesRemoteName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLinesRemoteName=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenLocalBankCode(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenLocalBankCode; } void AB_TransactionLimits_SetMaxLenLocalBankCode(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenLocalBankCode=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenLocalBankCode(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenLocalBankCode; } void AB_TransactionLimits_SetMinLenLocalBankCode(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenLocalBankCode=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenLocalAccountNumber(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenLocalAccountNumber; } void AB_TransactionLimits_SetMaxLenLocalAccountNumber(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenLocalAccountNumber=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenLocalAccountNumber(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenLocalAccountNumber; } void AB_TransactionLimits_SetMinLenLocalAccountNumber(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenLocalAccountNumber=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenLocalSuffix(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenLocalSuffix; } void AB_TransactionLimits_SetMaxLenLocalSuffix(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenLocalSuffix=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenLocalSuffix(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenLocalSuffix; } void AB_TransactionLimits_SetMinLenLocalSuffix(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenLocalSuffix=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenRemoteBankCode(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenRemoteBankCode; } void AB_TransactionLimits_SetMaxLenRemoteBankCode(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenRemoteBankCode=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenRemoteBankCode(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenRemoteBankCode; } void AB_TransactionLimits_SetMinLenRemoteBankCode(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenRemoteBankCode=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenRemoteAccountNumber(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenRemoteAccountNumber; } void AB_TransactionLimits_SetMaxLenRemoteAccountNumber(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenRemoteAccountNumber=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenRemoteAccountNumber(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenRemoteAccountNumber; } void AB_TransactionLimits_SetMinLenRemoteAccountNumber(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenRemoteAccountNumber=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenRemoteSuffix(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenRemoteSuffix; } void AB_TransactionLimits_SetMaxLenRemoteSuffix(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenRemoteSuffix=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenRemoteSuffix(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenRemoteSuffix; } void AB_TransactionLimits_SetMinLenRemoteSuffix(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenRemoteSuffix=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenRemoteIban(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenRemoteIban; } void AB_TransactionLimits_SetMaxLenRemoteIban(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenRemoteIban=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenRemoteIban(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenRemoteIban; } void AB_TransactionLimits_SetMinLenRemoteIban(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenRemoteIban=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenTextKey(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenTextKey; } void AB_TransactionLimits_SetMaxLenTextKey(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenTextKey=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenTextKey(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenTextKey; } void AB_TransactionLimits_SetMinLenTextKey(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenTextKey=d; st->_modified=1; } GWEN_STRINGLIST *AB_TransactionLimits_GetValuesTextKey(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->valuesTextKey; } void AB_TransactionLimits_SetValuesTextKey(AB_TRANSACTION_LIMITS *st, GWEN_STRINGLIST *d) { assert(st); if (st->valuesTextKey) GWEN_StringList_free(st->valuesTextKey); if (d) st->valuesTextKey=GWEN_StringList_dup(d); else st->valuesTextKey=0; st->_modified=1; } void AB_TransactionLimits_AddValuesTextKey(AB_TRANSACTION_LIMITS *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->valuesTextKey, d, 0, chk)) st->_modified=1; } void AB_TransactionLimits_RemoveValuesTextKey(AB_TRANSACTION_LIMITS *st, const char *d) { if (GWEN_StringList_RemoveString(st->valuesTextKey, d)) st->_modified=1; } void AB_TransactionLimits_ClearValuesTextKey(AB_TRANSACTION_LIMITS *st) { if (GWEN_StringList_Count(st->valuesTextKey)) { GWEN_StringList_Clear(st->valuesTextKey); st->_modified=1; } } int AB_TransactionLimits_HasValuesTextKey(const AB_TRANSACTION_LIMITS *st, const char *d) { return GWEN_StringList_HasString(st->valuesTextKey, d); } AB_TEXTKEY_DESCR_LIST *AB_TransactionLimits_GetTextKeys(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->textKeys; } void AB_TransactionLimits_SetTextKeys(AB_TRANSACTION_LIMITS *st, AB_TEXTKEY_DESCR_LIST *d) { assert(st); if (st->textKeys) AB_TextKeyDescr_List_free(st->textKeys); if (d) { AB_TEXTKEY_DESCR *e; st->textKeys=AB_TextKeyDescr_List_new(); e=AB_TextKeyDescr_List_First(d); while(e) { AB_TEXTKEY_DESCR *ne; ne=AB_TextKeyDescr_dup(e); assert(ne); AB_TextKeyDescr_List_Add(ne, st->textKeys); e=AB_TextKeyDescr_List_Next(e); } /* while (e) */ } /* if LIST */ else st->textKeys=0; st->_modified=1; } int AB_TransactionLimits_GetMaxLenCustomerReference(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenCustomerReference; } void AB_TransactionLimits_SetMaxLenCustomerReference(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenCustomerReference=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenCustomerReference(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenCustomerReference; } void AB_TransactionLimits_SetMinLenCustomerReference(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenCustomerReference=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenBankReference(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenBankReference; } void AB_TransactionLimits_SetMaxLenBankReference(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenBankReference=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenBankReference(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenBankReference; } void AB_TransactionLimits_SetMinLenBankReference(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenBankReference=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLenPurpose(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLenPurpose; } void AB_TransactionLimits_SetMaxLenPurpose(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLenPurpose=d; st->_modified=1; } int AB_TransactionLimits_GetMinLenPurpose(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLenPurpose; } void AB_TransactionLimits_SetMinLenPurpose(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLenPurpose=d; st->_modified=1; } int AB_TransactionLimits_GetMaxLinesPurpose(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxLinesPurpose; } void AB_TransactionLimits_SetMaxLinesPurpose(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxLinesPurpose=d; st->_modified=1; } int AB_TransactionLimits_GetMinLinesPurpose(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minLinesPurpose; } void AB_TransactionLimits_SetMinLinesPurpose(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minLinesPurpose=d; st->_modified=1; } int AB_TransactionLimits_GetNeedDate(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->needDate; } void AB_TransactionLimits_SetNeedDate(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->needDate=d; st->_modified=1; } int AB_TransactionLimits_GetMinValueSetupTime(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minValueSetupTime; } void AB_TransactionLimits_SetMinValueSetupTime(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minValueSetupTime=d; st->_modified=1; } int AB_TransactionLimits_GetMaxValueSetupTime(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxValueSetupTime; } void AB_TransactionLimits_SetMaxValueSetupTime(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxValueSetupTime=d; st->_modified=1; } int AB_TransactionLimits_GetMinValueSetupTimeFirst(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minValueSetupTimeFirst; } void AB_TransactionLimits_SetMinValueSetupTimeFirst(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minValueSetupTimeFirst=d; st->_modified=1; } int AB_TransactionLimits_GetMaxValueSetupTimeFirst(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxValueSetupTimeFirst; } void AB_TransactionLimits_SetMaxValueSetupTimeFirst(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxValueSetupTimeFirst=d; st->_modified=1; } int AB_TransactionLimits_GetMinValueSetupTimeOnce(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minValueSetupTimeOnce; } void AB_TransactionLimits_SetMinValueSetupTimeOnce(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minValueSetupTimeOnce=d; st->_modified=1; } int AB_TransactionLimits_GetMaxValueSetupTimeOnce(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxValueSetupTimeOnce; } void AB_TransactionLimits_SetMaxValueSetupTimeOnce(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxValueSetupTimeOnce=d; st->_modified=1; } int AB_TransactionLimits_GetMinValueSetupTimeRecurring(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minValueSetupTimeRecurring; } void AB_TransactionLimits_SetMinValueSetupTimeRecurring(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minValueSetupTimeRecurring=d; st->_modified=1; } int AB_TransactionLimits_GetMaxValueSetupTimeRecurring(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxValueSetupTimeRecurring; } void AB_TransactionLimits_SetMaxValueSetupTimeRecurring(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxValueSetupTimeRecurring=d; st->_modified=1; } int AB_TransactionLimits_GetMinValueSetupTimeFinal(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->minValueSetupTimeFinal; } void AB_TransactionLimits_SetMinValueSetupTimeFinal(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->minValueSetupTimeFinal=d; st->_modified=1; } int AB_TransactionLimits_GetMaxValueSetupTimeFinal(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->maxValueSetupTimeFinal; } void AB_TransactionLimits_SetMaxValueSetupTimeFinal(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->maxValueSetupTimeFinal=d; st->_modified=1; } GWEN_STRINGLIST *AB_TransactionLimits_GetValuesCycleWeek(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->valuesCycleWeek; } void AB_TransactionLimits_SetValuesCycleWeek(AB_TRANSACTION_LIMITS *st, GWEN_STRINGLIST *d) { assert(st); if (st->valuesCycleWeek) GWEN_StringList_free(st->valuesCycleWeek); if (d) st->valuesCycleWeek=GWEN_StringList_dup(d); else st->valuesCycleWeek=0; st->_modified=1; } void AB_TransactionLimits_AddValuesCycleWeek(AB_TRANSACTION_LIMITS *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->valuesCycleWeek, d, 0, chk)) st->_modified=1; } void AB_TransactionLimits_RemoveValuesCycleWeek(AB_TRANSACTION_LIMITS *st, const char *d) { if (GWEN_StringList_RemoveString(st->valuesCycleWeek, d)) st->_modified=1; } void AB_TransactionLimits_ClearValuesCycleWeek(AB_TRANSACTION_LIMITS *st) { if (GWEN_StringList_Count(st->valuesCycleWeek)) { GWEN_StringList_Clear(st->valuesCycleWeek); st->_modified=1; } } int AB_TransactionLimits_HasValuesCycleWeek(const AB_TRANSACTION_LIMITS *st, const char *d) { return GWEN_StringList_HasString(st->valuesCycleWeek, d); } GWEN_STRINGLIST *AB_TransactionLimits_GetValuesCycleMonth(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->valuesCycleMonth; } void AB_TransactionLimits_SetValuesCycleMonth(AB_TRANSACTION_LIMITS *st, GWEN_STRINGLIST *d) { assert(st); if (st->valuesCycleMonth) GWEN_StringList_free(st->valuesCycleMonth); if (d) st->valuesCycleMonth=GWEN_StringList_dup(d); else st->valuesCycleMonth=0; st->_modified=1; } void AB_TransactionLimits_AddValuesCycleMonth(AB_TRANSACTION_LIMITS *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->valuesCycleMonth, d, 0, chk)) st->_modified=1; } void AB_TransactionLimits_RemoveValuesCycleMonth(AB_TRANSACTION_LIMITS *st, const char *d) { if (GWEN_StringList_RemoveString(st->valuesCycleMonth, d)) st->_modified=1; } void AB_TransactionLimits_ClearValuesCycleMonth(AB_TRANSACTION_LIMITS *st) { if (GWEN_StringList_Count(st->valuesCycleMonth)) { GWEN_StringList_Clear(st->valuesCycleMonth); st->_modified=1; } } int AB_TransactionLimits_HasValuesCycleMonth(const AB_TRANSACTION_LIMITS *st, const char *d) { return GWEN_StringList_HasString(st->valuesCycleMonth, d); } GWEN_STRINGLIST *AB_TransactionLimits_GetValuesExecutionDayWeek(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->valuesExecutionDayWeek; } void AB_TransactionLimits_SetValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st, GWEN_STRINGLIST *d) { assert(st); if (st->valuesExecutionDayWeek) GWEN_StringList_free(st->valuesExecutionDayWeek); if (d) st->valuesExecutionDayWeek=GWEN_StringList_dup(d); else st->valuesExecutionDayWeek=0; st->_modified=1; } void AB_TransactionLimits_AddValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->valuesExecutionDayWeek, d, 0, chk)) st->_modified=1; } void AB_TransactionLimits_RemoveValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st, const char *d) { if (GWEN_StringList_RemoveString(st->valuesExecutionDayWeek, d)) st->_modified=1; } void AB_TransactionLimits_ClearValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st) { if (GWEN_StringList_Count(st->valuesExecutionDayWeek)) { GWEN_StringList_Clear(st->valuesExecutionDayWeek); st->_modified=1; } } int AB_TransactionLimits_HasValuesExecutionDayWeek(const AB_TRANSACTION_LIMITS *st, const char *d) { return GWEN_StringList_HasString(st->valuesExecutionDayWeek, d); } GWEN_STRINGLIST *AB_TransactionLimits_GetValuesExecutionDayMonth(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->valuesExecutionDayMonth; } void AB_TransactionLimits_SetValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st, GWEN_STRINGLIST *d) { assert(st); if (st->valuesExecutionDayMonth) GWEN_StringList_free(st->valuesExecutionDayMonth); if (d) st->valuesExecutionDayMonth=GWEN_StringList_dup(d); else st->valuesExecutionDayMonth=0; st->_modified=1; } void AB_TransactionLimits_AddValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->valuesExecutionDayMonth, d, 0, chk)) st->_modified=1; } void AB_TransactionLimits_RemoveValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st, const char *d) { if (GWEN_StringList_RemoveString(st->valuesExecutionDayMonth, d)) st->_modified=1; } void AB_TransactionLimits_ClearValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st) { if (GWEN_StringList_Count(st->valuesExecutionDayMonth)) { GWEN_StringList_Clear(st->valuesExecutionDayMonth); st->_modified=1; } } int AB_TransactionLimits_HasValuesExecutionDayMonth(const AB_TRANSACTION_LIMITS *st, const char *d) { return GWEN_StringList_HasString(st->valuesExecutionDayMonth, d); } int AB_TransactionLimits_GetAllowMonthly(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowMonthly; } void AB_TransactionLimits_SetAllowMonthly(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowMonthly=d; st->_modified=1; } int AB_TransactionLimits_GetAllowWeekly(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowWeekly; } void AB_TransactionLimits_SetAllowWeekly(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowWeekly=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeRecipientAccount(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeRecipientAccount; } void AB_TransactionLimits_SetAllowChangeRecipientAccount(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeRecipientAccount=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeRecipientName(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeRecipientName; } void AB_TransactionLimits_SetAllowChangeRecipientName(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeRecipientName=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeValue(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeValue; } void AB_TransactionLimits_SetAllowChangeValue(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeValue=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeTextKey(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeTextKey; } void AB_TransactionLimits_SetAllowChangeTextKey(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeTextKey=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangePurpose(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangePurpose; } void AB_TransactionLimits_SetAllowChangePurpose(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangePurpose=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeFirstExecutionDate(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeFirstExecutionDate; } void AB_TransactionLimits_SetAllowChangeFirstExecutionDate(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeFirstExecutionDate=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeLastExecutionDate(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeLastExecutionDate; } void AB_TransactionLimits_SetAllowChangeLastExecutionDate(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeLastExecutionDate=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeCycle(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeCycle; } void AB_TransactionLimits_SetAllowChangeCycle(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeCycle=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangePeriod(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangePeriod; } void AB_TransactionLimits_SetAllowChangePeriod(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangePeriod=d; st->_modified=1; } int AB_TransactionLimits_GetAllowChangeExecutionDay(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->allowChangeExecutionDay; } void AB_TransactionLimits_SetAllowChangeExecutionDay(AB_TRANSACTION_LIMITS *st, int d) { assert(st); st->allowChangeExecutionDay=d; st->_modified=1; } int AB_TransactionLimits_IsModified(const AB_TRANSACTION_LIMITS *st) { assert(st); return st->_modified; } void AB_TransactionLimits_SetModified(AB_TRANSACTION_LIMITS *st, int i) { assert(st); st->_modified=i; } void AB_TransactionLimits_Attach(AB_TRANSACTION_LIMITS *st) { assert(st); st->_usage++; } AB_TRANSACTION_LIMITS *AB_TransactionLimits_List2__freeAll_cb(AB_TRANSACTION_LIMITS *st, void *user_data) { AB_TransactionLimits_free(st); return 0; } void AB_TransactionLimits_List2_freeAll(AB_TRANSACTION_LIMITS_LIST2 *stl) { if (stl) { AB_TransactionLimits_List2_ForEach(stl, AB_TransactionLimits_List2__freeAll_cb, 0); AB_TransactionLimits_List2_free(stl); } } AB_TRANSACTION_LIMITS_LIST *AB_TransactionLimits_List_dup(const AB_TRANSACTION_LIMITS_LIST *stl) { if (stl) { AB_TRANSACTION_LIMITS_LIST *nl; AB_TRANSACTION_LIMITS *e; nl=AB_TransactionLimits_List_new(); e=AB_TransactionLimits_List_First(stl); while(e) { AB_TRANSACTION_LIMITS *ne; ne=AB_TransactionLimits_dup(e); assert(ne); AB_TransactionLimits_List_Add(ne, nl); e=AB_TransactionLimits_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfoservice_l.h0000644000175000017500000000076412372461742021730 00000000000000/* This file is auto-generated from "bankinfoservice.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFOSERVICE_L_H #define BANKINFOSERVICE_L_H /** @page P_AB_BANKINFO_SERVICE_LIB AB_BankInfoService (lib) This page describes the properties of AB_BANKINFO_SERVICE */ #include "bankinfoservice.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* BANKINFOSERVICE_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/Makefile.am0000644000175000017500000000314712364015477020127 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES=libtypes.la typefiles=\ transaction.xml \ pin.xml \ bankinfo.xml \ eutransferinfo.xml \ user.xml \ cellphone.xml \ security.xml \ message.xml EXTRA_DIST=$(typefiles) noinst_HEADERS=\ accstatus_p.h \ accstatus_l.h \ balance_p.h \ bankinfo_l.h \ bankinfo_p.h \ eutransferinfo_l.h \ eutransferinfo_p.h \ bankinfoservice_l.h \ bankinfoservice_p.h \ pin_l.h \ pin_p.h \ textkeydescr_l.h \ textkeydescr_p.h \ transaction_l.h \ transaction_p.h \ transactionlimits_l.h \ transactionlimits_p.h \ user_l.h \ user_p.h \ userfns_l.h \ value_p.h \ cellphoneproduct_l.h \ cellphoneproduct_p.h \ security_l.h \ security_p.h \ message_l.h \ message_p.h iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=\ accstatus.h \ balance.h \ bankinfo.h \ bankinfoservice.h \ textkeydescr.h \ transaction.h \ transactionfns.h \ transactionlimits.h \ eutransferinfo.h \ user.h \ userfns.h \ value.h \ cellphoneproduct.h \ security.h \ message.h libtypes_la_SOURCES=\ accstatus.c \ balance.c \ bankinfo.c \ bankinfoservice.c \ eutransferinfo.c \ pin.c \ textkeydescr.c \ transaction.c \ transactionfns.c \ transactionlimits.c \ user.c \ userfns.c \ value.c \ cellphoneproduct.c \ security.c \ message.c types: $(typefiles) $(gwenhywfar_bindir)/typemaker -d AQBANKING_API $(typefiles) sources: for f in $(libtypes_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/libs/aqbanking/types/accstatus.h0000644000175000017500000000545012364015477020235 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_ACCSTATUS_H #define AQBANKING_ACCSTATUS_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct AB_ACCOUNT_STATUS AB_ACCOUNT_STATUS; GWEN_LIST2_FUNCTION_LIB_DEFS(AB_ACCOUNT_STATUS, AB_AccountStatus, AQBANKING_API) AQBANKING_API AB_ACCOUNT_STATUS *AB_AccountStatus_new(); AQBANKING_API AB_ACCOUNT_STATUS *AB_AccountStatus_dup(const AB_ACCOUNT_STATUS *as); AQBANKING_API AB_ACCOUNT_STATUS *AB_AccountStatus_fromDb(GWEN_DB_NODE *db); AQBANKING_API int AB_AccountStatus_toDb(const AB_ACCOUNT_STATUS *as, GWEN_DB_NODE *db); AQBANKING_API void AB_AccountStatus_free(AB_ACCOUNT_STATUS *as); AQBANKING_API const GWEN_TIME* AB_AccountStatus_GetTime(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetTime(AB_ACCOUNT_STATUS *as, const GWEN_TIME *t); AQBANKING_API const AB_VALUE* AB_AccountStatus_GetBankLine(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetBankLine(AB_ACCOUNT_STATUS *as, const AB_VALUE *v); AQBANKING_API const AB_VALUE* AB_AccountStatus_GetDisposable(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetDisposable(AB_ACCOUNT_STATUS *as, const AB_VALUE *v); AQBANKING_API const AB_VALUE* AB_AccountStatus_GetDisposed(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetDisposed(AB_ACCOUNT_STATUS *as, const AB_VALUE *v); AQBANKING_API const AB_BALANCE* AB_AccountStatus_GetBookedBalance(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetBookedBalance(AB_ACCOUNT_STATUS *as, const AB_BALANCE *b); AQBANKING_API const AB_BALANCE* AB_AccountStatus_GetNotedBalance(const AB_ACCOUNT_STATUS *as); AQBANKING_API void AB_AccountStatus_SetNotedBalance(AB_ACCOUNT_STATUS *as, const AB_BALANCE *b); AQBANKING_API void AB_AccountStatus_List2_freeAll(AB_ACCOUNT_STATUS_LIST2 *asl); #ifdef __cplusplus } #endif #endif /* AQBANKING_ACCSTATUS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfo.xml0000644000175000017500000001302012364015477020373 00000000000000
gwenhywfar/types.h
aqbanking/error.h
The following types have been registered with AqBanking:
  • HBCI - German homebanking protocol
  • EBICS - German and French homebanking protocol
  • OFX - OFX direct connect protocol
For most services this is the URL or hostname of the server. For IP based services this is the port to be used (if omitted a default value suitable for the service is chosen). The content of this field depends on the service type. For HBCI this is the protocol version to be used:
  • 2.01
  • 2.10
  • 2.20
For EBICS this is also the protocol version:
  • H002
  • H003
The content of this field depends on the service type. For HBCI the following values are used:
  • DDV
  • RDH1
  • RDH2
  • RDH3
  • RDH4
  • RDH5
  • RDH6
  • RDH7
  • RDH8
  • RDH9
  • RDH10
  • PINTAN
This field contains some service-dependent user flags. For HBCI these are the flags of AH_USER (e.g. forceSslv3 etc). For HTTP-based protocols this is the HTTP version to be used:
  • 1.0
  • 1.1
This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the FID from the bankinfo file. EBICS stores the HOSTID here. This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the ORG field from the bankinfo file. This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the APPID field from the bankinfo file. This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the APPVER field from the bankinfo file.
gwenhywfar/types.h
aqbanking/error.h
aqbanking/bankinfoservice.h
This is the list of known servises of this bank. This object remains the owner of lists returned via @ref AB_BankInfo_GetServices.
aqbanking-5.6.4beta/src/libs/aqbanking/types/textkeydescr.c0000644000175000017500000001006112372461742020745 00000000000000/* This file is auto-generated from "textkeydescr.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "textkeydescr_p.h" #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_TEXTKEY_DESCR, AB_TextKeyDescr) GWEN_LIST2_FUNCTIONS(AB_TEXTKEY_DESCR, AB_TextKeyDescr) AB_TEXTKEY_DESCR *AB_TextKeyDescr_new(void) { AB_TEXTKEY_DESCR *st; GWEN_NEW_OBJECT(AB_TEXTKEY_DESCR, st) st->_usage=1; GWEN_LIST_INIT(AB_TEXTKEY_DESCR, st) return st; } void AB_TextKeyDescr_free(AB_TEXTKEY_DESCR *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->name) free(st->name); if (st->descr) free(st->descr); GWEN_LIST_FINI(AB_TEXTKEY_DESCR, st) GWEN_FREE_OBJECT(st); } } } AB_TEXTKEY_DESCR *AB_TextKeyDescr_dup(const AB_TEXTKEY_DESCR *d) { AB_TEXTKEY_DESCR *st; assert(d); st=AB_TextKeyDescr_new(); st->value=d->value; if (d->name) st->name=strdup(d->name); if (d->descr) st->descr=strdup(d->descr); return st; } int AB_TextKeyDescr_toDb(const AB_TEXTKEY_DESCR *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", st->value)) return -1; if (st->name) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "name", st->name)) return -1; if (st->descr) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "descr", st->descr)) return -1; return 0; } int AB_TextKeyDescr_ReadDb(AB_TEXTKEY_DESCR *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_TextKeyDescr_SetValue(st, GWEN_DB_GetIntValue(db, "value", 0, 0)); AB_TextKeyDescr_SetName(st, GWEN_DB_GetCharValue(db, "name", 0, 0)); AB_TextKeyDescr_SetDescr(st, GWEN_DB_GetCharValue(db, "descr", 0, 0)); return 0; } AB_TEXTKEY_DESCR *AB_TextKeyDescr_fromDb(GWEN_DB_NODE *db) { AB_TEXTKEY_DESCR *st; assert(db); st=AB_TextKeyDescr_new(); AB_TextKeyDescr_ReadDb(st, db); st->_modified=0; return st; } int AB_TextKeyDescr_GetValue(const AB_TEXTKEY_DESCR *st) { assert(st); return st->value; } void AB_TextKeyDescr_SetValue(AB_TEXTKEY_DESCR *st, int d) { assert(st); st->value=d; st->_modified=1; } const char *AB_TextKeyDescr_GetName(const AB_TEXTKEY_DESCR *st) { assert(st); return st->name; } void AB_TextKeyDescr_SetName(AB_TEXTKEY_DESCR *st, const char *d) { assert(st); if (st->name) free(st->name); if (d && *d) st->name=strdup(d); else st->name=0; st->_modified=1; } const char *AB_TextKeyDescr_GetDescr(const AB_TEXTKEY_DESCR *st) { assert(st); return st->descr; } void AB_TextKeyDescr_SetDescr(AB_TEXTKEY_DESCR *st, const char *d) { assert(st); if (st->descr) free(st->descr); if (d && *d) st->descr=strdup(d); else st->descr=0; st->_modified=1; } int AB_TextKeyDescr_IsModified(const AB_TEXTKEY_DESCR *st) { assert(st); return st->_modified; } void AB_TextKeyDescr_SetModified(AB_TEXTKEY_DESCR *st, int i) { assert(st); st->_modified=i; } void AB_TextKeyDescr_Attach(AB_TEXTKEY_DESCR *st) { assert(st); st->_usage++; } AB_TEXTKEY_DESCR *AB_TextKeyDescr_List2__freeAll_cb(AB_TEXTKEY_DESCR *st, void *user_data) { AB_TextKeyDescr_free(st); return 0; } void AB_TextKeyDescr_List2_freeAll(AB_TEXTKEY_DESCR_LIST2 *stl) { if (stl) { AB_TextKeyDescr_List2_ForEach(stl, AB_TextKeyDescr_List2__freeAll_cb, 0); AB_TextKeyDescr_List2_free(stl); } } AB_TEXTKEY_DESCR_LIST *AB_TextKeyDescr_List_dup(const AB_TEXTKEY_DESCR_LIST *stl) { if (stl) { AB_TEXTKEY_DESCR_LIST *nl; AB_TEXTKEY_DESCR *e; nl=AB_TextKeyDescr_List_new(); e=AB_TextKeyDescr_List_First(stl); while(e) { AB_TEXTKEY_DESCR *ne; ne=AB_TextKeyDescr_dup(e); assert(ne); AB_TextKeyDescr_List_Add(ne, nl); e=AB_TextKeyDescr_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionlimits_l.h0000644000175000017500000000766512372461741022335 00000000000000/* This file is auto-generated from "transactionlimits.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTIONLIMITS_L_H #define TRANSACTIONLIMITS_L_H /** @page P_AB_TRANSACTION_LIMITS_LIB AB_TransactionLimits (lib) This page describes the properties of AB_TRANSACTION_LIMITS This type describes the limits for fields of an @ref AB_TRANSACTION. The limits have the following meanings:
  • maxLenSOMETHING: if 0 then this limit is unknown, if -1 then the described element is not allowed to be set in the transaction. All other values represent the maximum length of the described field.
  • minLenSOMETHING: if 0 then this limit is unknown. All other values represent the minimum length of the described field.
  • maxLinesSOMETHING: if 0 then this limit is unknown All other values represent the maximum number of lines for the described field.
  • minLinesSOMETHING: if 0 then this limit is unknown. All other values represent the minimum number of lines for the described field.
  • valuesSOMETHING: A list of allowed values (as string). If this list is empty then there all values are allowed (those lists @b exist in any case, so the appropriate getter function will never return NULL).
  • allowSOMETHING: If SOMETHING is allowed then the value is "1". If SOMETHING is NOT allowed then the value is "-1". If it is unknown whether SOMETHING is allowed or not then this value is "0".
So if you want to check whether an given field is at all allowed you must check whether "maxLenSOMETHING" has a value of "-1".

Issuer Name

Limits for the issuer name.

Payee Name

Limits for the payee name.

Local Bank Code

Limits for local bank code.

Local Account Id

Limits for local account id.

Local Account Number

Limits for local account id suffix.

Remote Bank Code

Limits for remote bank code.

Remote Account Number

Limits for remote account number.

Remote Account Number Suffix

Limits for remote account id suffix.

Remote IBAN

Limits for remote IAN.

Text Key

Limits for textKey.

Customer Reference

Limits for customer reference.

Bank Reference

Limits for bank reference.

Purpose

Limits for purpose (called memo in some apps).

Date

Limits for date.

Standing Orders And Dated Transfer

These limits apply to standing orders and dated transfers only.

*/ #include "transactionlimits.h" #ifdef __cplusplus extern "C" { #endif /** @name Issuer Name * Limits for the issuer name.*/ /*@{*/ /*@}*/ /** @name Payee Name * Limits for the payee name.*/ /*@{*/ /*@}*/ /** @name Local Bank Code * Limits for local bank code.*/ /*@{*/ /*@}*/ /** @name Local Account Id * Limits for local account id.*/ /*@{*/ /*@}*/ /** @name Local Account Number * Limits for local account id suffix.*/ /*@{*/ /*@}*/ /** @name Remote Bank Code * Limits for remote bank code.*/ /*@{*/ /*@}*/ /** @name Remote Account Number * Limits for remote account number.*/ /*@{*/ /*@}*/ /** @name Remote Account Number Suffix * Limits for remote account id suffix.*/ /*@{*/ /*@}*/ /** @name Remote IBAN * Limits for remote IAN.*/ /*@{*/ /*@}*/ /** @name Text Key * Limits for textKey.*/ /*@{*/ /*@}*/ /** @name Customer Reference * Limits for customer reference.*/ /*@{*/ /*@}*/ /** @name Bank Reference * Limits for bank reference.*/ /*@{*/ /*@}*/ /** @name Purpose * Limits for purpose (called memo in some apps).*/ /*@{*/ /*@}*/ /** @name Date * Limits for date.*/ /*@{*/ /*@}*/ /** @name Standing Orders And Dated Transfer * These limits apply to standing orders and dated transfers only.*/ /*@{*/ /*@}*/ #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TRANSACTIONLIMITS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/userfns.h0000644000175000017500000000141012364015477017720 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_USERFNS_H #define AQBANKING_USERFNS_H #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API AB_PROVIDER *AB_User_GetProvider(const AB_USER *u); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* AQBANKING_USERFNS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transactionlimits.h0000644000175000017500000013012112372461741022002 00000000000000/* This file is auto-generated from "transactionlimits.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTIONLIMITS_H #define TRANSACTIONLIMITS_H /** @page P_AB_TRANSACTION_LIMITS_PUBLIC AB_TransactionLimits (public) This page describes the properties of AB_TRANSACTION_LIMITS This type describes the limits for fields of an @ref AB_TRANSACTION. The limits have the following meanings:
  • maxLenSOMETHING: if 0 then this limit is unknown, if -1 then the described element is not allowed to be set in the transaction. All other values represent the maximum length of the described field.
  • minLenSOMETHING: if 0 then this limit is unknown. All other values represent the minimum length of the described field.
  • maxLinesSOMETHING: if 0 then this limit is unknown All other values represent the maximum number of lines for the described field.
  • minLinesSOMETHING: if 0 then this limit is unknown. All other values represent the minimum number of lines for the described field.
  • valuesSOMETHING: A list of allowed values (as string). If this list is empty then there all values are allowed (those lists @b exist in any case, so the appropriate getter function will never return NULL).
  • allowSOMETHING: If SOMETHING is allowed then the value is "1". If SOMETHING is NOT allowed then the value is "-1". If it is unknown whether SOMETHING is allowed or not then this value is "0".
So if you want to check whether an given field is at all allowed you must check whether "maxLenSOMETHING" has a value of "-1".

Issuer Name

Limits for the issuer name.

@anchor AB_TRANSACTION_LIMITS_MaxLenLocalName

MaxLenLocalName

Set this property with @ref AB_TransactionLimits_SetMaxLenLocalName, get it with @ref AB_TransactionLimits_GetMaxLenLocalName

@anchor AB_TRANSACTION_LIMITS_MinLenLocalName

MinLenLocalName

Set this property with @ref AB_TransactionLimits_SetMinLenLocalName, get it with @ref AB_TransactionLimits_GetMinLenLocalName

Payee Name

Limits for the payee name.

@anchor AB_TRANSACTION_LIMITS_MaxLenRemoteName

MaxLenRemoteName

Set this property with @ref AB_TransactionLimits_SetMaxLenRemoteName, get it with @ref AB_TransactionLimits_GetMaxLenRemoteName

@anchor AB_TRANSACTION_LIMITS_MinLenRemoteName

MinLenRemoteName

Set this property with @ref AB_TransactionLimits_SetMinLenRemoteName, get it with @ref AB_TransactionLimits_GetMinLenRemoteName

@anchor AB_TRANSACTION_LIMITS_MaxLinesRemoteName

MaxLinesRemoteName

Set this property with @ref AB_TransactionLimits_SetMaxLinesRemoteName, get it with @ref AB_TransactionLimits_GetMaxLinesRemoteName

@anchor AB_TRANSACTION_LIMITS_MinLinesRemoteName

MinLinesRemoteName

Set this property with @ref AB_TransactionLimits_SetMinLinesRemoteName, get it with @ref AB_TransactionLimits_GetMinLinesRemoteName

Local Bank Code

Limits for local bank code.

@anchor AB_TRANSACTION_LIMITS_MaxLenLocalBankCode

MaxLenLocalBankCode

Set this property with @ref AB_TransactionLimits_SetMaxLenLocalBankCode, get it with @ref AB_TransactionLimits_GetMaxLenLocalBankCode

@anchor AB_TRANSACTION_LIMITS_MinLenLocalBankCode

MinLenLocalBankCode

Set this property with @ref AB_TransactionLimits_SetMinLenLocalBankCode, get it with @ref AB_TransactionLimits_GetMinLenLocalBankCode

Local Account Id

Limits for local account id.

@anchor AB_TRANSACTION_LIMITS_MaxLenLocalAccountNumber

MaxLenLocalAccountNumber

Set this property with @ref AB_TransactionLimits_SetMaxLenLocalAccountNumber, get it with @ref AB_TransactionLimits_GetMaxLenLocalAccountNumber

@anchor AB_TRANSACTION_LIMITS_MinLenLocalAccountNumber

MinLenLocalAccountNumber

Set this property with @ref AB_TransactionLimits_SetMinLenLocalAccountNumber, get it with @ref AB_TransactionLimits_GetMinLenLocalAccountNumber

Local Account Number

Limits for local account id suffix.

@anchor AB_TRANSACTION_LIMITS_MaxLenLocalSuffix

MaxLenLocalSuffix

Set this property with @ref AB_TransactionLimits_SetMaxLenLocalSuffix, get it with @ref AB_TransactionLimits_GetMaxLenLocalSuffix

@anchor AB_TRANSACTION_LIMITS_MinLenLocalSuffix

MinLenLocalSuffix

Set this property with @ref AB_TransactionLimits_SetMinLenLocalSuffix, get it with @ref AB_TransactionLimits_GetMinLenLocalSuffix

Remote Bank Code

Limits for remote bank code.

@anchor AB_TRANSACTION_LIMITS_MaxLenRemoteBankCode

MaxLenRemoteBankCode

Set this property with @ref AB_TransactionLimits_SetMaxLenRemoteBankCode, get it with @ref AB_TransactionLimits_GetMaxLenRemoteBankCode

@anchor AB_TRANSACTION_LIMITS_MinLenRemoteBankCode

MinLenRemoteBankCode

Set this property with @ref AB_TransactionLimits_SetMinLenRemoteBankCode, get it with @ref AB_TransactionLimits_GetMinLenRemoteBankCode

Remote Account Number

Limits for remote account number.

@anchor AB_TRANSACTION_LIMITS_MaxLenRemoteAccountNumber

MaxLenRemoteAccountNumber

Set this property with @ref AB_TransactionLimits_SetMaxLenRemoteAccountNumber, get it with @ref AB_TransactionLimits_GetMaxLenRemoteAccountNumber

@anchor AB_TRANSACTION_LIMITS_MinLenRemoteAccountNumber

MinLenRemoteAccountNumber

Set this property with @ref AB_TransactionLimits_SetMinLenRemoteAccountNumber, get it with @ref AB_TransactionLimits_GetMinLenRemoteAccountNumber

Remote Account Number Suffix

Limits for remote account id suffix.

@anchor AB_TRANSACTION_LIMITS_MaxLenRemoteSuffix

MaxLenRemoteSuffix

Set this property with @ref AB_TransactionLimits_SetMaxLenRemoteSuffix, get it with @ref AB_TransactionLimits_GetMaxLenRemoteSuffix

@anchor AB_TRANSACTION_LIMITS_MinLenRemoteSuffix

MinLenRemoteSuffix

Set this property with @ref AB_TransactionLimits_SetMinLenRemoteSuffix, get it with @ref AB_TransactionLimits_GetMinLenRemoteSuffix

Remote IBAN

Limits for remote IAN.

@anchor AB_TRANSACTION_LIMITS_MaxLenRemoteIban

MaxLenRemoteIban

Set this property with @ref AB_TransactionLimits_SetMaxLenRemoteIban, get it with @ref AB_TransactionLimits_GetMaxLenRemoteIban

@anchor AB_TRANSACTION_LIMITS_MinLenRemoteIban

MinLenRemoteIban

Set this property with @ref AB_TransactionLimits_SetMinLenRemoteIban, get it with @ref AB_TransactionLimits_GetMinLenRemoteIban

Text Key

Limits for textKey.

@anchor AB_TRANSACTION_LIMITS_MaxLenTextKey

MaxLenTextKey

Set this property with @ref AB_TransactionLimits_SetMaxLenTextKey, get it with @ref AB_TransactionLimits_GetMaxLenTextKey

@anchor AB_TRANSACTION_LIMITS_MinLenTextKey

MinLenTextKey

Set this property with @ref AB_TransactionLimits_SetMinLenTextKey, get it with @ref AB_TransactionLimits_GetMinLenTextKey

@anchor AB_TRANSACTION_LIMITS_ValuesTextKey

ValuesTextKey

This string list contains one entry for every supported text key. The values must be positive integers in decimal form (no leading zero, no comma or decimal point).

Set this property with @ref AB_TransactionLimits_SetValuesTextKey, get it with @ref AB_TransactionLimits_GetValuesTextKey

@anchor AB_TRANSACTION_LIMITS_TextKeys

TextKeys

This list of text key descriptions may contain an entry for every supported text key. However, not all backends fill this list and this list does not have to be complete. If you want to know which textkeys are supported please use valuesTextKey instead.

Set this property with @ref AB_TransactionLimits_SetTextKeys, get it with @ref AB_TransactionLimits_GetTextKeys

Customer Reference

Limits for customer reference.

@anchor AB_TRANSACTION_LIMITS_MaxLenCustomerReference

MaxLenCustomerReference

Set this property with @ref AB_TransactionLimits_SetMaxLenCustomerReference, get it with @ref AB_TransactionLimits_GetMaxLenCustomerReference

@anchor AB_TRANSACTION_LIMITS_MinLenCustomerReference

MinLenCustomerReference

Set this property with @ref AB_TransactionLimits_SetMinLenCustomerReference, get it with @ref AB_TransactionLimits_GetMinLenCustomerReference

Bank Reference

Limits for bank reference.

@anchor AB_TRANSACTION_LIMITS_MaxLenBankReference

MaxLenBankReference

Set this property with @ref AB_TransactionLimits_SetMaxLenBankReference, get it with @ref AB_TransactionLimits_GetMaxLenBankReference

@anchor AB_TRANSACTION_LIMITS_MinLenBankReference

MinLenBankReference

Set this property with @ref AB_TransactionLimits_SetMinLenBankReference, get it with @ref AB_TransactionLimits_GetMinLenBankReference

Purpose

Limits for purpose (called memo in some apps).

@anchor AB_TRANSACTION_LIMITS_MaxLenPurpose

MaxLenPurpose

Set this property with @ref AB_TransactionLimits_SetMaxLenPurpose, get it with @ref AB_TransactionLimits_GetMaxLenPurpose

@anchor AB_TRANSACTION_LIMITS_MinLenPurpose

MinLenPurpose

Set this property with @ref AB_TransactionLimits_SetMinLenPurpose, get it with @ref AB_TransactionLimits_GetMinLenPurpose

@anchor AB_TRANSACTION_LIMITS_MaxLinesPurpose

MaxLinesPurpose

Set this property with @ref AB_TransactionLimits_SetMaxLinesPurpose, get it with @ref AB_TransactionLimits_GetMaxLinesPurpose

@anchor AB_TRANSACTION_LIMITS_MinLinesPurpose

MinLinesPurpose

Set this property with @ref AB_TransactionLimits_SetMinLinesPurpose, get it with @ref AB_TransactionLimits_GetMinLinesPurpose

Date

Limits for date.

@anchor AB_TRANSACTION_LIMITS_NeedDate

NeedDate

Defines whether setting of the execution date (@ref AB_Transaction_SetDate) is required (value=1) or forbidden (value=-1), value=0 means "unknown".

Set this property with @ref AB_TransactionLimits_SetNeedDate, get it with @ref AB_TransactionLimits_GetNeedDate

Standing Orders And Dated Transfer

These limits apply to standing orders and dated transfers only.

@anchor AB_TRANSACTION_LIMITS_MinValueSetupTime

MinValueSetupTime

Minimum time in days between issuing of a request and its first execution.

Set this property with @ref AB_TransactionLimits_SetMinValueSetupTime, get it with @ref AB_TransactionLimits_GetMinValueSetupTime

@anchor AB_TRANSACTION_LIMITS_MaxValueSetupTime

MaxValueSetupTime

Maximum time in days between issuing of a request and its first execution.

Set this property with @ref AB_TransactionLimits_SetMaxValueSetupTime, get it with @ref AB_TransactionLimits_GetMaxValueSetupTime

@anchor AB_TRANSACTION_LIMITS_MinValueSetupTimeFirst

MinValueSetupTimeFirst

Minimum time in days between issuing of a request and its first execution. This is for a first request (e.g. first debit note).

Set this property with @ref AB_TransactionLimits_SetMinValueSetupTimeFirst, get it with @ref AB_TransactionLimits_GetMinValueSetupTimeFirst

@anchor AB_TRANSACTION_LIMITS_MaxValueSetupTimeFirst

MaxValueSetupTimeFirst

Maximum time in days between issuing of a request and its first execution. This is for a first request (e.g. first debit note).

Set this property with @ref AB_TransactionLimits_SetMaxValueSetupTimeFirst, get it with @ref AB_TransactionLimits_GetMaxValueSetupTimeFirst

@anchor AB_TRANSACTION_LIMITS_MinValueSetupTimeOnce

MinValueSetupTimeOnce

Minimum time in days between issuing of a request and its execution. This is for a one time only request (e.g. onetime debit note).

Set this property with @ref AB_TransactionLimits_SetMinValueSetupTimeOnce, get it with @ref AB_TransactionLimits_GetMinValueSetupTimeOnce

@anchor AB_TRANSACTION_LIMITS_MaxValueSetupTimeOnce

MaxValueSetupTimeOnce

Maximum time in days between issuing of a request and its execution. This is for a one time only request (e.g. onetime debit note).

Set this property with @ref AB_TransactionLimits_SetMaxValueSetupTimeOnce, get it with @ref AB_TransactionLimits_GetMaxValueSetupTimeOnce

@anchor AB_TRANSACTION_LIMITS_MinValueSetupTimeRecurring

MinValueSetupTimeRecurring

Minimum time in days between issuing of a request and its execution. This is for a following request (e.g. a recurring debit note).

Set this property with @ref AB_TransactionLimits_SetMinValueSetupTimeRecurring, get it with @ref AB_TransactionLimits_GetMinValueSetupTimeRecurring

@anchor AB_TRANSACTION_LIMITS_MaxValueSetupTimeRecurring

MaxValueSetupTimeRecurring

Maximum time in days between issuing of a request and its first execution. This is for a following request (e.g. a recurring debit note).

Set this property with @ref AB_TransactionLimits_SetMaxValueSetupTimeRecurring, get it with @ref AB_TransactionLimits_GetMaxValueSetupTimeRecurring

@anchor AB_TRANSACTION_LIMITS_MinValueSetupTimeFinal

MinValueSetupTimeFinal

Minimum time in days between issuing of a request and its execution. This is for a final request (e.g. last debit note).

Set this property with @ref AB_TransactionLimits_SetMinValueSetupTimeFinal, get it with @ref AB_TransactionLimits_GetMinValueSetupTimeFinal

@anchor AB_TRANSACTION_LIMITS_MaxValueSetupTimeFinal

MaxValueSetupTimeFinal

Maximum time in days between issuing of a request and its execution. This is for a final request (e.g. last debit note).

Set this property with @ref AB_TransactionLimits_SetMaxValueSetupTimeFinal, get it with @ref AB_TransactionLimits_GetMaxValueSetupTimeFinal

@anchor AB_TRANSACTION_LIMITS_ValuesCycleWeek

ValuesCycleWeek

This string list contains one entry for every supported cycle. These value are accepted when "period" is "weekly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all cycles possible) and "1"-"52".

Set this property with @ref AB_TransactionLimits_SetValuesCycleWeek, get it with @ref AB_TransactionLimits_GetValuesCycleWeek

@anchor AB_TRANSACTION_LIMITS_ValuesCycleMonth

ValuesCycleMonth

This string list contains one entry for every supported cycle. These value are accepted when "period" is "monthly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all cycles possible) and "1"-"12".

Set this property with @ref AB_TransactionLimits_SetValuesCycleMonth, get it with @ref AB_TransactionLimits_GetValuesCycleMonth

@anchor AB_TRANSACTION_LIMITS_ValuesExecutionDayWeek

ValuesExecutionDayWeek

This string list contains one entry for every supported day of the week. These value are accepted when "period" is "weekly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed values are "0" (all days allowed) and "1"-"7".

Set this property with @ref AB_TransactionLimits_SetValuesExecutionDayWeek, get it with @ref AB_TransactionLimits_GetValuesExecutionDayWeek

@anchor AB_TRANSACTION_LIMITS_ValuesExecutionDayMonth

ValuesExecutionDayMonth

This string list contains one entry for every supported monthly cycle. These value are accepted when "period" is "monthly". The values must be positive integers in decimal form (no leading zero, no comma or decimal point). Allowed are "0" (all days possible), "1"-"30", "97" (ultimo-2), "98" (ultimo-1) and "99" (ultimo).

Set this property with @ref AB_TransactionLimits_SetValuesExecutionDayMonth, get it with @ref AB_TransactionLimits_GetValuesExecutionDayMonth

@anchor AB_TRANSACTION_LIMITS_AllowMonthly

AllowMonthly

Set this property with @ref AB_TransactionLimits_SetAllowMonthly, get it with @ref AB_TransactionLimits_GetAllowMonthly

@anchor AB_TRANSACTION_LIMITS_AllowWeekly

AllowWeekly

Set this property with @ref AB_TransactionLimits_SetAllowWeekly, get it with @ref AB_TransactionLimits_GetAllowWeekly

@anchor AB_TRANSACTION_LIMITS_AllowChangeRecipientAccount

AllowChangeRecipientAccount

Set this property with @ref AB_TransactionLimits_SetAllowChangeRecipientAccount, get it with @ref AB_TransactionLimits_GetAllowChangeRecipientAccount

@anchor AB_TRANSACTION_LIMITS_AllowChangeRecipientName

AllowChangeRecipientName

Set this property with @ref AB_TransactionLimits_SetAllowChangeRecipientName, get it with @ref AB_TransactionLimits_GetAllowChangeRecipientName

@anchor AB_TRANSACTION_LIMITS_AllowChangeValue

AllowChangeValue

Set this property with @ref AB_TransactionLimits_SetAllowChangeValue, get it with @ref AB_TransactionLimits_GetAllowChangeValue

@anchor AB_TRANSACTION_LIMITS_AllowChangeTextKey

AllowChangeTextKey

Set this property with @ref AB_TransactionLimits_SetAllowChangeTextKey, get it with @ref AB_TransactionLimits_GetAllowChangeTextKey

@anchor AB_TRANSACTION_LIMITS_AllowChangePurpose

AllowChangePurpose

Set this property with @ref AB_TransactionLimits_SetAllowChangePurpose, get it with @ref AB_TransactionLimits_GetAllowChangePurpose

@anchor AB_TRANSACTION_LIMITS_AllowChangeFirstExecutionDate

AllowChangeFirstExecutionDate

Set this property with @ref AB_TransactionLimits_SetAllowChangeFirstExecutionDate, get it with @ref AB_TransactionLimits_GetAllowChangeFirstExecutionDate

@anchor AB_TRANSACTION_LIMITS_AllowChangeLastExecutionDate

AllowChangeLastExecutionDate

Set this property with @ref AB_TransactionLimits_SetAllowChangeLastExecutionDate, get it with @ref AB_TransactionLimits_GetAllowChangeLastExecutionDate

@anchor AB_TRANSACTION_LIMITS_AllowChangeCycle

AllowChangeCycle

Set this property with @ref AB_TransactionLimits_SetAllowChangeCycle, get it with @ref AB_TransactionLimits_GetAllowChangeCycle

@anchor AB_TRANSACTION_LIMITS_AllowChangePeriod

AllowChangePeriod

Set this property with @ref AB_TransactionLimits_SetAllowChangePeriod, get it with @ref AB_TransactionLimits_GetAllowChangePeriod

@anchor AB_TRANSACTION_LIMITS_AllowChangeExecutionDay

AllowChangeExecutionDay

Set this property with @ref AB_TransactionLimits_SetAllowChangeExecutionDay, get it with @ref AB_TransactionLimits_GetAllowChangeExecutionDay

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_TRANSACTION_LIMITS AB_TRANSACTION_LIMITS; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_TRANSACTION_LIMITS, AB_TransactionLimits, AQBANKING_API) AQBANKING_API AB_TRANSACTION_LIMITS_LIST *AB_TransactionLimits_List_dup(const AB_TRANSACTION_LIMITS_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_TRANSACTION_LIMITS, AB_TransactionLimits, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_TransactionLimits_List2_freeAll(AB_TRANSACTION_LIMITS_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_TRANSACTION_LIMITS *AB_TransactionLimits_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_TRANSACTION_LIMITS *AB_TransactionLimits_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_TRANSACTION_LIMITS *AB_TransactionLimits_dup(const AB_TRANSACTION_LIMITS*st); /** Destroys the given object. */ AQBANKING_API void AB_TransactionLimits_free(AB_TRANSACTION_LIMITS *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_TransactionLimits_Attach(AB_TRANSACTION_LIMITS *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_TransactionLimits_ReadDb(AB_TRANSACTION_LIMITS *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_TransactionLimits_toDb(const AB_TRANSACTION_LIMITS*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_TransactionLimits_IsModified(const AB_TRANSACTION_LIMITS *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_TransactionLimits_SetModified(AB_TRANSACTION_LIMITS *st, int i); /** @name Issuer Name * Limits for the issuer name.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalName */ AQBANKING_API int AB_TransactionLimits_GetMaxLenLocalName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalName */ AQBANKING_API void AB_TransactionLimits_SetMaxLenLocalName(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenLocalName */ AQBANKING_API int AB_TransactionLimits_GetMinLenLocalName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenLocalName */ AQBANKING_API void AB_TransactionLimits_SetMinLenLocalName(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Payee Name * Limits for the payee name.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteName */ AQBANKING_API int AB_TransactionLimits_GetMaxLenRemoteName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteName */ AQBANKING_API void AB_TransactionLimits_SetMaxLenRemoteName(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteName */ AQBANKING_API int AB_TransactionLimits_GetMinLenRemoteName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteName */ AQBANKING_API void AB_TransactionLimits_SetMinLenRemoteName(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLinesRemoteName */ AQBANKING_API int AB_TransactionLimits_GetMaxLinesRemoteName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLinesRemoteName */ AQBANKING_API void AB_TransactionLimits_SetMaxLinesRemoteName(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLinesRemoteName */ AQBANKING_API int AB_TransactionLimits_GetMinLinesRemoteName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLinesRemoteName */ AQBANKING_API void AB_TransactionLimits_SetMinLinesRemoteName(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Local Bank Code * Limits for local bank code.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalBankCode */ AQBANKING_API int AB_TransactionLimits_GetMaxLenLocalBankCode(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalBankCode */ AQBANKING_API void AB_TransactionLimits_SetMaxLenLocalBankCode(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenLocalBankCode */ AQBANKING_API int AB_TransactionLimits_GetMinLenLocalBankCode(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenLocalBankCode */ AQBANKING_API void AB_TransactionLimits_SetMinLenLocalBankCode(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Local Account Id * Limits for local account id.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalAccountNumber */ AQBANKING_API int AB_TransactionLimits_GetMaxLenLocalAccountNumber(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalAccountNumber */ AQBANKING_API void AB_TransactionLimits_SetMaxLenLocalAccountNumber(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenLocalAccountNumber */ AQBANKING_API int AB_TransactionLimits_GetMinLenLocalAccountNumber(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenLocalAccountNumber */ AQBANKING_API void AB_TransactionLimits_SetMinLenLocalAccountNumber(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Local Account Number * Limits for local account id suffix.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalSuffix */ AQBANKING_API int AB_TransactionLimits_GetMaxLenLocalSuffix(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenLocalSuffix */ AQBANKING_API void AB_TransactionLimits_SetMaxLenLocalSuffix(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenLocalSuffix */ AQBANKING_API int AB_TransactionLimits_GetMinLenLocalSuffix(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenLocalSuffix */ AQBANKING_API void AB_TransactionLimits_SetMinLenLocalSuffix(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Remote Bank Code * Limits for remote bank code.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteBankCode */ AQBANKING_API int AB_TransactionLimits_GetMaxLenRemoteBankCode(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteBankCode */ AQBANKING_API void AB_TransactionLimits_SetMaxLenRemoteBankCode(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteBankCode */ AQBANKING_API int AB_TransactionLimits_GetMinLenRemoteBankCode(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteBankCode */ AQBANKING_API void AB_TransactionLimits_SetMinLenRemoteBankCode(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Remote Account Number * Limits for remote account number.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteAccountNumber */ AQBANKING_API int AB_TransactionLimits_GetMaxLenRemoteAccountNumber(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteAccountNumber */ AQBANKING_API void AB_TransactionLimits_SetMaxLenRemoteAccountNumber(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteAccountNumber */ AQBANKING_API int AB_TransactionLimits_GetMinLenRemoteAccountNumber(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteAccountNumber */ AQBANKING_API void AB_TransactionLimits_SetMinLenRemoteAccountNumber(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Remote Account Number Suffix * Limits for remote account id suffix.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteSuffix */ AQBANKING_API int AB_TransactionLimits_GetMaxLenRemoteSuffix(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteSuffix */ AQBANKING_API void AB_TransactionLimits_SetMaxLenRemoteSuffix(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteSuffix */ AQBANKING_API int AB_TransactionLimits_GetMinLenRemoteSuffix(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteSuffix */ AQBANKING_API void AB_TransactionLimits_SetMinLenRemoteSuffix(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Remote IBAN * Limits for remote IAN.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteIban */ AQBANKING_API int AB_TransactionLimits_GetMaxLenRemoteIban(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenRemoteIban */ AQBANKING_API void AB_TransactionLimits_SetMaxLenRemoteIban(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteIban */ AQBANKING_API int AB_TransactionLimits_GetMinLenRemoteIban(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenRemoteIban */ AQBANKING_API void AB_TransactionLimits_SetMinLenRemoteIban(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Text Key * Limits for textKey.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenTextKey */ AQBANKING_API int AB_TransactionLimits_GetMaxLenTextKey(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenTextKey */ AQBANKING_API void AB_TransactionLimits_SetMaxLenTextKey(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenTextKey */ AQBANKING_API int AB_TransactionLimits_GetMinLenTextKey(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenTextKey */ AQBANKING_API void AB_TransactionLimits_SetMinLenTextKey(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_ValuesTextKey */ AQBANKING_API GWEN_STRINGLIST *AB_TransactionLimits_GetValuesTextKey(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_ValuesTextKey */ AQBANKING_API void AB_TransactionLimits_SetValuesTextKey(AB_TRANSACTION_LIMITS *el, GWEN_STRINGLIST *d); AQBANKING_API void AB_TransactionLimits_AddValuesTextKey(AB_TRANSACTION_LIMITS *st, const char *d, int chk); AQBANKING_API void AB_TransactionLimits_RemoveValuesTextKey(AB_TRANSACTION_LIMITS *st, const char *d); AQBANKING_API void AB_TransactionLimits_ClearValuesTextKey(AB_TRANSACTION_LIMITS *st); AQBANKING_API int AB_TransactionLimits_HasValuesTextKey(const AB_TRANSACTION_LIMITS *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_TextKeys */ AQBANKING_API AB_TEXTKEY_DESCR_LIST *AB_TransactionLimits_GetTextKeys(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_TextKeys */ AQBANKING_API void AB_TransactionLimits_SetTextKeys(AB_TRANSACTION_LIMITS *el, AB_TEXTKEY_DESCR_LIST *d); /*@}*/ /** @name Customer Reference * Limits for customer reference.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenCustomerReference */ AQBANKING_API int AB_TransactionLimits_GetMaxLenCustomerReference(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenCustomerReference */ AQBANKING_API void AB_TransactionLimits_SetMaxLenCustomerReference(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenCustomerReference */ AQBANKING_API int AB_TransactionLimits_GetMinLenCustomerReference(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenCustomerReference */ AQBANKING_API void AB_TransactionLimits_SetMinLenCustomerReference(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Bank Reference * Limits for bank reference.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenBankReference */ AQBANKING_API int AB_TransactionLimits_GetMaxLenBankReference(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenBankReference */ AQBANKING_API void AB_TransactionLimits_SetMaxLenBankReference(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenBankReference */ AQBANKING_API int AB_TransactionLimits_GetMinLenBankReference(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenBankReference */ AQBANKING_API void AB_TransactionLimits_SetMinLenBankReference(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Purpose * Limits for purpose (called memo in some apps).*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLenPurpose */ AQBANKING_API int AB_TransactionLimits_GetMaxLenPurpose(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLenPurpose */ AQBANKING_API void AB_TransactionLimits_SetMaxLenPurpose(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLenPurpose */ AQBANKING_API int AB_TransactionLimits_GetMinLenPurpose(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLenPurpose */ AQBANKING_API void AB_TransactionLimits_SetMinLenPurpose(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxLinesPurpose */ AQBANKING_API int AB_TransactionLimits_GetMaxLinesPurpose(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxLinesPurpose */ AQBANKING_API void AB_TransactionLimits_SetMaxLinesPurpose(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinLinesPurpose */ AQBANKING_API int AB_TransactionLimits_GetMinLinesPurpose(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinLinesPurpose */ AQBANKING_API void AB_TransactionLimits_SetMinLinesPurpose(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Date * Limits for date.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_NeedDate */ AQBANKING_API int AB_TransactionLimits_GetNeedDate(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_NeedDate */ AQBANKING_API void AB_TransactionLimits_SetNeedDate(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ /** @name Standing Orders And Dated Transfer * These limits apply to standing orders and dated transfers only.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTime */ AQBANKING_API int AB_TransactionLimits_GetMinValueSetupTime(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTime */ AQBANKING_API void AB_TransactionLimits_SetMinValueSetupTime(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTime */ AQBANKING_API int AB_TransactionLimits_GetMaxValueSetupTime(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTime */ AQBANKING_API void AB_TransactionLimits_SetMaxValueSetupTime(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeFirst */ AQBANKING_API int AB_TransactionLimits_GetMinValueSetupTimeFirst(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeFirst */ AQBANKING_API void AB_TransactionLimits_SetMinValueSetupTimeFirst(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeFirst */ AQBANKING_API int AB_TransactionLimits_GetMaxValueSetupTimeFirst(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeFirst */ AQBANKING_API void AB_TransactionLimits_SetMaxValueSetupTimeFirst(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeOnce */ AQBANKING_API int AB_TransactionLimits_GetMinValueSetupTimeOnce(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeOnce */ AQBANKING_API void AB_TransactionLimits_SetMinValueSetupTimeOnce(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeOnce */ AQBANKING_API int AB_TransactionLimits_GetMaxValueSetupTimeOnce(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeOnce */ AQBANKING_API void AB_TransactionLimits_SetMaxValueSetupTimeOnce(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeRecurring */ AQBANKING_API int AB_TransactionLimits_GetMinValueSetupTimeRecurring(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeRecurring */ AQBANKING_API void AB_TransactionLimits_SetMinValueSetupTimeRecurring(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeRecurring */ AQBANKING_API int AB_TransactionLimits_GetMaxValueSetupTimeRecurring(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeRecurring */ AQBANKING_API void AB_TransactionLimits_SetMaxValueSetupTimeRecurring(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeFinal */ AQBANKING_API int AB_TransactionLimits_GetMinValueSetupTimeFinal(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MinValueSetupTimeFinal */ AQBANKING_API void AB_TransactionLimits_SetMinValueSetupTimeFinal(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeFinal */ AQBANKING_API int AB_TransactionLimits_GetMaxValueSetupTimeFinal(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_MaxValueSetupTimeFinal */ AQBANKING_API void AB_TransactionLimits_SetMaxValueSetupTimeFinal(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_ValuesCycleWeek */ AQBANKING_API GWEN_STRINGLIST *AB_TransactionLimits_GetValuesCycleWeek(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_ValuesCycleWeek */ AQBANKING_API void AB_TransactionLimits_SetValuesCycleWeek(AB_TRANSACTION_LIMITS *el, GWEN_STRINGLIST *d); AQBANKING_API void AB_TransactionLimits_AddValuesCycleWeek(AB_TRANSACTION_LIMITS *st, const char *d, int chk); AQBANKING_API void AB_TransactionLimits_RemoveValuesCycleWeek(AB_TRANSACTION_LIMITS *st, const char *d); AQBANKING_API void AB_TransactionLimits_ClearValuesCycleWeek(AB_TRANSACTION_LIMITS *st); AQBANKING_API int AB_TransactionLimits_HasValuesCycleWeek(const AB_TRANSACTION_LIMITS *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_ValuesCycleMonth */ AQBANKING_API GWEN_STRINGLIST *AB_TransactionLimits_GetValuesCycleMonth(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_ValuesCycleMonth */ AQBANKING_API void AB_TransactionLimits_SetValuesCycleMonth(AB_TRANSACTION_LIMITS *el, GWEN_STRINGLIST *d); AQBANKING_API void AB_TransactionLimits_AddValuesCycleMonth(AB_TRANSACTION_LIMITS *st, const char *d, int chk); AQBANKING_API void AB_TransactionLimits_RemoveValuesCycleMonth(AB_TRANSACTION_LIMITS *st, const char *d); AQBANKING_API void AB_TransactionLimits_ClearValuesCycleMonth(AB_TRANSACTION_LIMITS *st); AQBANKING_API int AB_TransactionLimits_HasValuesCycleMonth(const AB_TRANSACTION_LIMITS *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_ValuesExecutionDayWeek */ AQBANKING_API GWEN_STRINGLIST *AB_TransactionLimits_GetValuesExecutionDayWeek(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_ValuesExecutionDayWeek */ AQBANKING_API void AB_TransactionLimits_SetValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *el, GWEN_STRINGLIST *d); AQBANKING_API void AB_TransactionLimits_AddValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st, const char *d, int chk); AQBANKING_API void AB_TransactionLimits_RemoveValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st, const char *d); AQBANKING_API void AB_TransactionLimits_ClearValuesExecutionDayWeek(AB_TRANSACTION_LIMITS *st); AQBANKING_API int AB_TransactionLimits_HasValuesExecutionDayWeek(const AB_TRANSACTION_LIMITS *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_ValuesExecutionDayMonth */ AQBANKING_API GWEN_STRINGLIST *AB_TransactionLimits_GetValuesExecutionDayMonth(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_ValuesExecutionDayMonth */ AQBANKING_API void AB_TransactionLimits_SetValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *el, GWEN_STRINGLIST *d); AQBANKING_API void AB_TransactionLimits_AddValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st, const char *d, int chk); AQBANKING_API void AB_TransactionLimits_RemoveValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st, const char *d); AQBANKING_API void AB_TransactionLimits_ClearValuesExecutionDayMonth(AB_TRANSACTION_LIMITS *st); AQBANKING_API int AB_TransactionLimits_HasValuesExecutionDayMonth(const AB_TRANSACTION_LIMITS *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowMonthly */ AQBANKING_API int AB_TransactionLimits_GetAllowMonthly(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowMonthly */ AQBANKING_API void AB_TransactionLimits_SetAllowMonthly(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowWeekly */ AQBANKING_API int AB_TransactionLimits_GetAllowWeekly(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowWeekly */ AQBANKING_API void AB_TransactionLimits_SetAllowWeekly(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeRecipientAccount */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeRecipientAccount(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeRecipientAccount */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeRecipientAccount(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeRecipientName */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeRecipientName(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeRecipientName */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeRecipientName(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeValue */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeValue(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeValue */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeValue(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeTextKey */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeTextKey(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeTextKey */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeTextKey(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangePurpose */ AQBANKING_API int AB_TransactionLimits_GetAllowChangePurpose(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangePurpose */ AQBANKING_API void AB_TransactionLimits_SetAllowChangePurpose(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeFirstExecutionDate */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeFirstExecutionDate(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeFirstExecutionDate */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeFirstExecutionDate(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeLastExecutionDate */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeLastExecutionDate(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeLastExecutionDate */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeLastExecutionDate(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeCycle */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeCycle(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeCycle */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeCycle(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangePeriod */ AQBANKING_API int AB_TransactionLimits_GetAllowChangePeriod(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangePeriod */ AQBANKING_API void AB_TransactionLimits_SetAllowChangePeriod(AB_TRANSACTION_LIMITS *el, int d); /** * Returns the property @ref AB_TRANSACTION_LIMITS_AllowChangeExecutionDay */ AQBANKING_API int AB_TransactionLimits_GetAllowChangeExecutionDay(const AB_TRANSACTION_LIMITS *el); /** * Set the property @ref AB_TRANSACTION_LIMITS_AllowChangeExecutionDay */ AQBANKING_API void AB_TransactionLimits_SetAllowChangeExecutionDay(AB_TRANSACTION_LIMITS *el, int d); /*@}*/ #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TRANSACTIONLIMITS_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfo.c0000644000175000017500000003062412372461742020025 00000000000000/* This file is auto-generated from "bankinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "bankinfo_p.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_BANKINFO, AB_BankInfo) GWEN_LIST2_FUNCTIONS(AB_BANKINFO, AB_BankInfo) AB_BANKINFO *AB_BankInfo_new(void) { AB_BANKINFO *st; GWEN_NEW_OBJECT(AB_BANKINFO, st) st->_usage=1; GWEN_LIST_INIT(AB_BANKINFO, st) st->services=AB_BankInfoService_List_new(); return st; } void AB_BankInfo_free(AB_BANKINFO *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->country) free(st->country); if (st->branchId) free(st->branchId); if (st->bankId) free(st->bankId); if (st->bic) free(st->bic); if (st->bankName) free(st->bankName); if (st->location) free(st->location); if (st->street) free(st->street); if (st->zipcode) free(st->zipcode); if (st->city) free(st->city); if (st->region) free(st->region); if (st->phone) free(st->phone); if (st->fax) free(st->fax); if (st->email) free(st->email); if (st->website) free(st->website); if (st->services) AB_BankInfoService_List_free(st->services); GWEN_LIST_FINI(AB_BANKINFO, st) GWEN_FREE_OBJECT(st); } } } AB_BANKINFO *AB_BankInfo_dup(const AB_BANKINFO *d) { AB_BANKINFO *st; assert(d); st=AB_BankInfo_new(); if (d->country) st->country=strdup(d->country); if (d->branchId) st->branchId=strdup(d->branchId); if (d->bankId) st->bankId=strdup(d->bankId); if (d->bic) st->bic=strdup(d->bic); if (d->bankName) st->bankName=strdup(d->bankName); if (d->location) st->location=strdup(d->location); if (d->street) st->street=strdup(d->street); if (d->zipcode) st->zipcode=strdup(d->zipcode); if (d->city) st->city=strdup(d->city); if (d->region) st->region=strdup(d->region); if (d->phone) st->phone=strdup(d->phone); if (d->fax) st->fax=strdup(d->fax); if (d->email) st->email=strdup(d->email); if (d->website) st->website=strdup(d->website); if (d->services) st->services=AB_BankInfoService_List_dup(d->services); return st; } int AB_BankInfo_toDb(const AB_BANKINFO *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->country) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "country", st->country)) return -1; if (st->branchId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "branchId", st->branchId)) return -1; if (st->bankId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankId", st->bankId)) return -1; if (st->bic) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bic", st->bic)) return -1; if (st->bankName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankName", st->bankName)) return -1; if (st->location) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "location", st->location)) return -1; if (st->street) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "street", st->street)) return -1; if (st->zipcode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "zipcode", st->zipcode)) return -1; if (st->city) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "city", st->city)) return -1; if (st->region) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "region", st->region)) return -1; if (st->phone) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "phone", st->phone)) return -1; if (st->fax) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "fax", st->fax)) return -1; if (st->email) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "email", st->email)) return -1; if (st->website) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "website", st->website)) return -1; if (st->services) if (1) { GWEN_DB_NODE *dbT; AB_BANKINFO_SERVICE *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_CREATE_GROUP, "services"); assert(dbT); e=AB_BankInfoService_List_First(st->services); while(e) { if (AB_BankInfoService_toDb(e, GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_CREATE_GROUP, "element"))) return -1; e=AB_BankInfoService_List_Next(e); } /* while */ } /* if (1) */ return 0; } int AB_BankInfo_ReadDb(AB_BANKINFO *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_BankInfo_SetCountry(st, GWEN_DB_GetCharValue(db, "country", 0, 0)); AB_BankInfo_SetBranchId(st, GWEN_DB_GetCharValue(db, "branchId", 0, 0)); AB_BankInfo_SetBankId(st, GWEN_DB_GetCharValue(db, "bankId", 0, 0)); AB_BankInfo_SetBic(st, GWEN_DB_GetCharValue(db, "bic", 0, 0)); AB_BankInfo_SetBankName(st, GWEN_DB_GetCharValue(db, "bankName", 0, 0)); AB_BankInfo_SetLocation(st, GWEN_DB_GetCharValue(db, "location", 0, 0)); AB_BankInfo_SetStreet(st, GWEN_DB_GetCharValue(db, "street", 0, 0)); AB_BankInfo_SetZipcode(st, GWEN_DB_GetCharValue(db, "zipcode", 0, 0)); AB_BankInfo_SetCity(st, GWEN_DB_GetCharValue(db, "city", 0, 0)); AB_BankInfo_SetRegion(st, GWEN_DB_GetCharValue(db, "region", 0, 0)); AB_BankInfo_SetPhone(st, GWEN_DB_GetCharValue(db, "phone", 0, 0)); AB_BankInfo_SetFax(st, GWEN_DB_GetCharValue(db, "fax", 0, 0)); AB_BankInfo_SetEmail(st, GWEN_DB_GetCharValue(db, "email", 0, 0)); AB_BankInfo_SetWebsite(st, GWEN_DB_GetCharValue(db, "website", 0, 0)); st->services=AB_BankInfoService_List_new(); if (1) {/* just for local vars */ GWEN_DB_NODE *dbT; AB_BANKINFO_SERVICE *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "services"); if (dbT) { GWEN_DB_NODE *dbT2; dbT2=GWEN_DB_FindFirstGroup(dbT, "element"); while(dbT2) { e=AB_BankInfoService_fromDb(dbT2); if (!e) { DBG_ERROR(0, "Bad element for type \"AB_BANKINFO_SERVICE\""); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbT2, 2); AB_BankInfo_free(st); return 0; } AB_BankInfoService_List_Add(e, st->services); dbT2=GWEN_DB_FindNextGroup(dbT2, "element"); } /* while */ } /* if (dbT) */ } /* if (1) */ return 0; } AB_BANKINFO *AB_BankInfo_fromDb(GWEN_DB_NODE *db) { AB_BANKINFO *st; assert(db); st=AB_BankInfo_new(); AB_BankInfo_ReadDb(st, db); st->_modified=0; return st; } const char *AB_BankInfo_GetCountry(const AB_BANKINFO *st) { assert(st); return st->country; } void AB_BankInfo_SetCountry(AB_BANKINFO *st, const char *d) { assert(st); if (st->country) free(st->country); if (d && *d) st->country=strdup(d); else st->country=0; st->_modified=1; } const char *AB_BankInfo_GetBranchId(const AB_BANKINFO *st) { assert(st); return st->branchId; } void AB_BankInfo_SetBranchId(AB_BANKINFO *st, const char *d) { assert(st); if (st->branchId) free(st->branchId); if (d && *d) st->branchId=strdup(d); else st->branchId=0; st->_modified=1; } const char *AB_BankInfo_GetBankId(const AB_BANKINFO *st) { assert(st); return st->bankId; } void AB_BankInfo_SetBankId(AB_BANKINFO *st, const char *d) { assert(st); if (st->bankId) free(st->bankId); if (d && *d) st->bankId=strdup(d); else st->bankId=0; st->_modified=1; } const char *AB_BankInfo_GetBic(const AB_BANKINFO *st) { assert(st); return st->bic; } void AB_BankInfo_SetBic(AB_BANKINFO *st, const char *d) { assert(st); if (st->bic) free(st->bic); if (d && *d) st->bic=strdup(d); else st->bic=0; st->_modified=1; } const char *AB_BankInfo_GetBankName(const AB_BANKINFO *st) { assert(st); return st->bankName; } void AB_BankInfo_SetBankName(AB_BANKINFO *st, const char *d) { assert(st); if (st->bankName) free(st->bankName); if (d && *d) st->bankName=strdup(d); else st->bankName=0; st->_modified=1; } const char *AB_BankInfo_GetLocation(const AB_BANKINFO *st) { assert(st); return st->location; } void AB_BankInfo_SetLocation(AB_BANKINFO *st, const char *d) { assert(st); if (st->location) free(st->location); if (d && *d) st->location=strdup(d); else st->location=0; st->_modified=1; } const char *AB_BankInfo_GetStreet(const AB_BANKINFO *st) { assert(st); return st->street; } void AB_BankInfo_SetStreet(AB_BANKINFO *st, const char *d) { assert(st); if (st->street) free(st->street); if (d && *d) st->street=strdup(d); else st->street=0; st->_modified=1; } const char *AB_BankInfo_GetZipcode(const AB_BANKINFO *st) { assert(st); return st->zipcode; } void AB_BankInfo_SetZipcode(AB_BANKINFO *st, const char *d) { assert(st); if (st->zipcode) free(st->zipcode); if (d && *d) st->zipcode=strdup(d); else st->zipcode=0; st->_modified=1; } const char *AB_BankInfo_GetCity(const AB_BANKINFO *st) { assert(st); return st->city; } void AB_BankInfo_SetCity(AB_BANKINFO *st, const char *d) { assert(st); if (st->city) free(st->city); if (d && *d) st->city=strdup(d); else st->city=0; st->_modified=1; } const char *AB_BankInfo_GetRegion(const AB_BANKINFO *st) { assert(st); return st->region; } void AB_BankInfo_SetRegion(AB_BANKINFO *st, const char *d) { assert(st); if (st->region) free(st->region); if (d && *d) st->region=strdup(d); else st->region=0; st->_modified=1; } const char *AB_BankInfo_GetPhone(const AB_BANKINFO *st) { assert(st); return st->phone; } void AB_BankInfo_SetPhone(AB_BANKINFO *st, const char *d) { assert(st); if (st->phone) free(st->phone); if (d && *d) st->phone=strdup(d); else st->phone=0; st->_modified=1; } const char *AB_BankInfo_GetFax(const AB_BANKINFO *st) { assert(st); return st->fax; } void AB_BankInfo_SetFax(AB_BANKINFO *st, const char *d) { assert(st); if (st->fax) free(st->fax); if (d && *d) st->fax=strdup(d); else st->fax=0; st->_modified=1; } const char *AB_BankInfo_GetEmail(const AB_BANKINFO *st) { assert(st); return st->email; } void AB_BankInfo_SetEmail(AB_BANKINFO *st, const char *d) { assert(st); if (st->email) free(st->email); if (d && *d) st->email=strdup(d); else st->email=0; st->_modified=1; } const char *AB_BankInfo_GetWebsite(const AB_BANKINFO *st) { assert(st); return st->website; } void AB_BankInfo_SetWebsite(AB_BANKINFO *st, const char *d) { assert(st); if (st->website) free(st->website); if (d && *d) st->website=strdup(d); else st->website=0; st->_modified=1; } AB_BANKINFO_SERVICE_LIST *AB_BankInfo_GetServices(const AB_BANKINFO *st) { assert(st); return st->services; } void AB_BankInfo_SetServices(AB_BANKINFO *st, AB_BANKINFO_SERVICE_LIST *d) { assert(st); if (st->services) AB_BankInfoService_List_free(st->services); if (d) { AB_BANKINFO_SERVICE *e; st->services=AB_BankInfoService_List_new(); e=AB_BankInfoService_List_First(d); while(e) { AB_BANKINFO_SERVICE *ne; ne=AB_BankInfoService_dup(e); assert(ne); AB_BankInfoService_List_Add(ne, st->services); e=AB_BankInfoService_List_Next(e); } /* while (e) */ } /* if LIST */ else st->services=0; st->_modified=1; } int AB_BankInfo_IsModified(const AB_BANKINFO *st) { assert(st); return st->_modified; } void AB_BankInfo_SetModified(AB_BANKINFO *st, int i) { assert(st); st->_modified=i; } void AB_BankInfo_Attach(AB_BANKINFO *st) { assert(st); st->_usage++; } AB_BANKINFO *AB_BankInfo_List2__freeAll_cb(AB_BANKINFO *st, void *user_data) { AB_BankInfo_free(st); return 0; } void AB_BankInfo_List2_freeAll(AB_BANKINFO_LIST2 *stl) { if (stl) { AB_BankInfo_List2_ForEach(stl, AB_BankInfo_List2__freeAll_cb, 0); AB_BankInfo_List2_free(stl); } } AB_BANKINFO_LIST *AB_BankInfo_List_dup(const AB_BANKINFO_LIST *stl) { if (stl) { AB_BANKINFO_LIST *nl; AB_BANKINFO *e; nl=AB_BankInfo_List_new(); e=AB_BankInfo_List_First(stl); while(e) { AB_BANKINFO *ne; ne=AB_BankInfo_dup(e); assert(ne); AB_BankInfo_List_Add(ne, nl); e=AB_BankInfo_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/transaction.h0000644000175000017500000013543312372461742020574 00000000000000/* This file is auto-generated from "transaction.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTION_H #define TRANSACTION_H /** @page P_AB_TRANSACTION_PUBLIC AB_Transaction (public) This page describes the properties of AB_TRANSACTION This type contains all important information about transactions. All text fields are in UTF-8.

Local Account Info

This group contains information about the local account.

@anchor AB_TRANSACTION_LocalCountry

LocalCountry

This is the two-character country code according to ISO 3166-1 (Alpha-2). This is also used in DNS toplevel domain names. For Germany use "DE" (not case-sensitive).

Set this property with @ref AB_Transaction_SetLocalCountry, get it with @ref AB_Transaction_GetLocalCountry

@anchor AB_TRANSACTION_LocalBankCode

LocalBankCode

This is the code of the local bank (i.e. your bank).

Set this property with @ref AB_Transaction_SetLocalBankCode, get it with @ref AB_Transaction_GetLocalBankCode

@anchor AB_TRANSACTION_LocalBranchId

LocalBranchId

This is the branch id of the local bank (OFX only)

Set this property with @ref AB_Transaction_SetLocalBranchId, get it with @ref AB_Transaction_GetLocalBranchId

@anchor AB_TRANSACTION_LocalAccountNumber

LocalAccountNumber

Set this property with @ref AB_Transaction_SetLocalAccountNumber, get it with @ref AB_Transaction_GetLocalAccountNumber

@anchor AB_TRANSACTION_LocalSuffix

LocalSuffix

If your account has subaccounts which are distinguished by different suffixes, then this is that suffix. Otherwise it's empty. (HBCI only)

Set this property with @ref AB_Transaction_SetLocalSuffix, get it with @ref AB_Transaction_GetLocalSuffix

@anchor AB_TRANSACTION_LocalIban

LocalIban

International Bank Account Number according to ECBS EBS 204.
PosMeaning
0-1Country code according to ISO 3166
2-3Checksum
4-33Country specific account info
Examples:

  • BE62510007547061
  • FR1420041010050500013M02606

Set this property with @ref AB_Transaction_SetLocalIban, get it with @ref AB_Transaction_GetLocalIban

@anchor AB_TRANSACTION_LocalName

LocalName

Set this property with @ref AB_Transaction_SetLocalName, get it with @ref AB_Transaction_GetLocalName

@anchor AB_TRANSACTION_LocalBic

LocalBic

This is the SWIFT id of the local bank.

Set this property with @ref AB_Transaction_SetLocalBic, get it with @ref AB_Transaction_GetLocalBic

Remote Account Info

This group contains information about the remote account.

@anchor AB_TRANSACTION_RemoteCountry

RemoteCountry

This is the two-character ISO country code (as used in toplevel domains). For Germany use "DE".

Set this property with @ref AB_Transaction_SetRemoteCountry, get it with @ref AB_Transaction_GetRemoteCountry

@anchor AB_TRANSACTION_RemoteBankName

RemoteBankName

Set this property with @ref AB_Transaction_SetRemoteBankName, get it with @ref AB_Transaction_GetRemoteBankName

@anchor AB_TRANSACTION_RemoteBankLocation

RemoteBankLocation

Set this property with @ref AB_Transaction_SetRemoteBankLocation, get it with @ref AB_Transaction_GetRemoteBankLocation

@anchor AB_TRANSACTION_RemoteBankCode

RemoteBankCode

Set this property with @ref AB_Transaction_SetRemoteBankCode, get it with @ref AB_Transaction_GetRemoteBankCode

@anchor AB_TRANSACTION_RemoteBranchId

RemoteBranchId

This is the branch id of the remote bank (OFX only)

Set this property with @ref AB_Transaction_SetRemoteBranchId, get it with @ref AB_Transaction_GetRemoteBranchId

@anchor AB_TRANSACTION_RemoteAccountNumber

RemoteAccountNumber

Set this property with @ref AB_Transaction_SetRemoteAccountNumber, get it with @ref AB_Transaction_GetRemoteAccountNumber

@anchor AB_TRANSACTION_RemoteSuffix

RemoteSuffix

Set this property with @ref AB_Transaction_SetRemoteSuffix, get it with @ref AB_Transaction_GetRemoteSuffix

@anchor AB_TRANSACTION_RemoteIban

RemoteIban

International Bank Account Number according to ECBS EBS 204.
PosMeaning
0-1Country code according to ISO 3166
2-3Checksum
4-33Country specific account info
Examples:

  • BE62510007547061
  • FR1420041010050500013M02606

Set this property with @ref AB_Transaction_SetRemoteIban, get it with @ref AB_Transaction_GetRemoteIban

@anchor AB_TRANSACTION_RemoteName

RemoteName

Set this property with @ref AB_Transaction_SetRemoteName, get it with @ref AB_Transaction_GetRemoteName

@anchor AB_TRANSACTION_RemoteBic

RemoteBic

This is the SWIFT id of the local bank.

Set this property with @ref AB_Transaction_SetRemoteBic, get it with @ref AB_Transaction_GetRemoteBic

@anchor AB_TRANSACTION_UniqueId

UniqueId

This is a unique id assigned by the application. However, when adding a transaction to a job (like JobTransfer) this id is assigned by AqBanking to make sure that this id is unique across all applications.

Set this property with @ref AB_Transaction_SetUniqueId, get it with @ref AB_Transaction_GetUniqueId

@anchor AB_TRANSACTION_IdForApplication

IdForApplication

This is a unique id assigned by the application only. This id is never changed by AqBanking.

Set this property with @ref AB_Transaction_SetIdForApplication, get it with @ref AB_Transaction_GetIdForApplication

@anchor AB_TRANSACTION_GroupId

GroupId

This id is assigned by a backend when sending mutliple transfer jobs in one backend request (e.g. AqHBCI uses DTAUS files when sending multi-transfer requests; in this case every every transfer which goes into the same DTAUS file receives the same id).

Set this property with @ref AB_Transaction_SetGroupId, get it with @ref AB_Transaction_GetGroupId

Dates

@anchor AB_TRANSACTION_ValutaDate

ValutaDate

The date when the transaction was really executed (Datum Valuta/Wertstellung)

Set this property with @ref AB_Transaction_SetValutaDate, get it with @ref AB_Transaction_GetValutaDate

@anchor AB_TRANSACTION_Date

Date

The date when the transaction was booked (but sometimes it is unused). (Buchungsdatum)

Set this property with @ref AB_Transaction_SetDate, get it with @ref AB_Transaction_GetDate

Value

@anchor AB_TRANSACTION_Value

Value

Set this property with @ref AB_Transaction_SetValue, get it with @ref AB_Transaction_GetValue

@anchor AB_TRANSACTION_Fees

Fees

Set this property with @ref AB_Transaction_SetFees, get it with @ref AB_Transaction_GetFees

Info Which Is Not Supported by All Backends

This group contains information which differ between backends.

Some of this information might not even besupportedby every backends.

@anchor AB_TRANSACTION_TextKey

TextKey

A numerical transaction code, defined for all kinds of different actions. (Textschluessel)

For a normal transfer you should set it to 51. For debit notes the values 04 or 05 may be used. For other values please refer to your credit institute. (HBCI only)

Set this property with @ref AB_Transaction_SetTextKey, get it with @ref AB_Transaction_GetTextKey

@anchor AB_TRANSACTION_TextKeyExt

TextKeyExt

An extension to the text key (Textschluesselergaenzung, SWIFT Feld 34)

For a normal transfer you should set it to 51. For debit notes the values 04 or 05 may be used. For other values please refer to your credit institute. (HBCI only)

Set this property with @ref AB_Transaction_SetTextKeyExt, get it with @ref AB_Transaction_GetTextKeyExt

@anchor AB_TRANSACTION_TransactionKey

TransactionKey

this is the transaction id that tells you more about the type of transaction (3 character code) (Buchungsschluessel) (HBCI only)

Set this property with @ref AB_Transaction_SetTransactionKey, get it with @ref AB_Transaction_GetTransactionKey

@anchor AB_TRANSACTION_CustomerReference

CustomerReference

Reference string, if the customer (you) has specified one. (E.g. the cheque number.) Otherwise "NONREF" or empty (Kundenreferenz)

Set this property with @ref AB_Transaction_SetCustomerReference, get it with @ref AB_Transaction_GetCustomerReference

@anchor AB_TRANSACTION_BankReference

BankReference

Reference string for this transaction given by the bank, if it has given one. Otherwise empty. (Bankreferenz)

Set this property with @ref AB_Transaction_SetBankReference, get it with @ref AB_Transaction_GetBankReference

@anchor AB_TRANSACTION_EndToEndReference

EndToEndReference

This is a reference provided by the issuer of a SEPA transfer.

Set this property with @ref AB_Transaction_SetEndToEndReference, get it with @ref AB_Transaction_GetEndToEndReference

@anchor AB_TRANSACTION_OriginatorIdentifier

OriginatorIdentifier

Used for SEPA transfers.

Set this property with @ref AB_Transaction_SetOriginatorIdentifier, get it with @ref AB_Transaction_GetOriginatorIdentifier

@anchor AB_TRANSACTION_TransactionCode

TransactionCode

A 3 digit numerical transaction code, defined for all kinds of different actions. (Geschaeftsvorfallcode)

Set this property with @ref AB_Transaction_SetTransactionCode, get it with @ref AB_Transaction_GetTransactionCode

@anchor AB_TRANSACTION_TransactionText

TransactionText

Transaction text (e.g. STANDING ORDER) (Buchungstext)

Set this property with @ref AB_Transaction_SetTransactionText, get it with @ref AB_Transaction_GetTransactionText

@anchor AB_TRANSACTION_Primanota

Primanota

Set this property with @ref AB_Transaction_SetPrimanota, get it with @ref AB_Transaction_GetPrimanota

@anchor AB_TRANSACTION_FiId

FiId

This is an id optionally assigned by the Financial Institute. It is mostly used by OFX.

Set this property with @ref AB_Transaction_SetFiId, get it with @ref AB_Transaction_GetFiId

@anchor AB_TRANSACTION_Purpose

Purpose

This string list contains the purpose of the transaction. Every entry of this list represents a single purpose line.

Set this property with @ref AB_Transaction_SetPurpose, get it with @ref AB_Transaction_GetPurpose

@anchor AB_TRANSACTION_Category

Category

This string list contains the categories this transaction belongs to. This element is not used by AqBanking itself but some im/exporter plugins may choose to use these.

Set this property with @ref AB_Transaction_SetCategory, get it with @ref AB_Transaction_GetCategory

Additional Information for Standing Orders

This group contains information which is used with standing orders. It is not needed for other usage of this type.

@anchor AB_TRANSACTION_Period

Period

This variable contains the execution period (e.g. whether a standing order is to be executed weekly or monthly etc).

Set this property with @ref AB_Transaction_SetPeriod, get it with @ref AB_Transaction_GetPeriod

@anchor AB_TRANSACTION_Cycle

Cycle

The standing order is executed every cycle x period . So if period is weekly and cycle is 2 then the standing order is executed every 2 weeks.

Set this property with @ref AB_Transaction_SetCycle, get it with @ref AB_Transaction_GetCycle

@anchor AB_TRANSACTION_ExecutionDay

ExecutionDay

The execution day. The meaning of this variable depends on the content of period :

  • monthly: day of the month (starting with1)
  • weekly: day of the week (starting with1=Monday)

Set this property with @ref AB_Transaction_SetExecutionDay, get it with @ref AB_Transaction_GetExecutionDay

@anchor AB_TRANSACTION_FirstExecutionDate

FirstExecutionDate

The date when the standing order is to be executed for the first time.

Set this property with @ref AB_Transaction_SetFirstExecutionDate, get it with @ref AB_Transaction_GetFirstExecutionDate

@anchor AB_TRANSACTION_LastExecutionDate

LastExecutionDate

The date when the standing order is to be executed for the last time.

Set this property with @ref AB_Transaction_SetLastExecutionDate, get it with @ref AB_Transaction_GetLastExecutionDate

@anchor AB_TRANSACTION_NextExecutionDate

NextExecutionDate

The date when the standing order is to be executed next (this field is only interesting when retrieving the list of currently active standing orders)

Set this property with @ref AB_Transaction_SetNextExecutionDate, get it with @ref AB_Transaction_GetNextExecutionDate

Additional Information for Transfers

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

@anchor AB_TRANSACTION_Type

Type

This variable contains the type of transfer (transfer, debit note etc).

Set this property with @ref AB_Transaction_SetType, get it with @ref AB_Transaction_GetType

@anchor AB_TRANSACTION_SubType

SubType

This variable contains the sub-type of transfer.

Set this property with @ref AB_Transaction_SetSubType, get it with @ref AB_Transaction_GetSubType

@anchor AB_TRANSACTION_Status

Status

This variable contains the status of the transfer (accepted, rejected, pending). etc).

Set this property with @ref AB_Transaction_SetStatus, get it with @ref AB_Transaction_GetStatus

@anchor AB_TRANSACTION_Charge

Charge

Specify who is to be charged for the transaction.

Set this property with @ref AB_Transaction_SetCharge, get it with @ref AB_Transaction_GetCharge

Additional Information for Foreign Transfers

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

@anchor AB_TRANSACTION_RemoteAddrStreet

RemoteAddrStreet

Set this property with @ref AB_Transaction_SetRemoteAddrStreet, get it with @ref AB_Transaction_GetRemoteAddrStreet

@anchor AB_TRANSACTION_RemoteAddrZipcode

RemoteAddrZipcode

Set this property with @ref AB_Transaction_SetRemoteAddrZipcode, get it with @ref AB_Transaction_GetRemoteAddrZipcode

@anchor AB_TRANSACTION_RemoteAddrCity

RemoteAddrCity

Set this property with @ref AB_Transaction_SetRemoteAddrCity, get it with @ref AB_Transaction_GetRemoteAddrCity

@anchor AB_TRANSACTION_RemotePhone

RemotePhone

Set this property with @ref AB_Transaction_SetRemotePhone, get it with @ref AB_Transaction_GetRemotePhone

Additional Information for Investment Transfers

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

@anchor AB_TRANSACTION_UnitId

UnitId

Set this property with @ref AB_Transaction_SetUnitId, get it with @ref AB_Transaction_GetUnitId

@anchor AB_TRANSACTION_UnitIdNameSpace

UnitIdNameSpace

Set this property with @ref AB_Transaction_SetUnitIdNameSpace, get it with @ref AB_Transaction_GetUnitIdNameSpace

@anchor AB_TRANSACTION_Units

Units

Set this property with @ref AB_Transaction_SetUnits, get it with @ref AB_Transaction_GetUnits

@anchor AB_TRANSACTION_UnitPrice

UnitPrice

Set this property with @ref AB_Transaction_SetUnitPrice, get it with @ref AB_Transaction_GetUnitPrice

@anchor AB_TRANSACTION_Commission

Commission

Set this property with @ref AB_Transaction_SetCommission, get it with @ref AB_Transaction_GetCommission

Additional Information for SEPA Direct Debits

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

@anchor AB_TRANSACTION_CreditorSchemeId

CreditorSchemeId

"Creditor Scheme Identification" ("Glaeubiger-ID", assigned by Deutsche Bundesbank)

Set this property with @ref AB_Transaction_SetCreditorSchemeId, get it with @ref AB_Transaction_GetCreditorSchemeId

@anchor AB_TRANSACTION_MandateId

MandateId

"SEPA Direct debit mandate id

Set this property with @ref AB_Transaction_SetMandateId, get it with @ref AB_Transaction_GetMandateId

@anchor AB_TRANSACTION_MandateDate

MandateDate

"Issue date of the direct debit mandate

Set this property with @ref AB_Transaction_SetMandateDate, get it with @ref AB_Transaction_GetMandateDate

@anchor AB_TRANSACTION_MandateDebitorName

MandateDebitorName

"Debitor name for direct debit mandate if given by the debtor

Set this property with @ref AB_Transaction_SetMandateDebitorName, get it with @ref AB_Transaction_GetMandateDebitorName

@anchor AB_TRANSACTION_OriginalCreditorSchemeId

OriginalCreditorSchemeId

Original value for "Creditor Scheme Identification", in case that value changed over time

Set this property with @ref AB_Transaction_SetOriginalCreditorSchemeId, get it with @ref AB_Transaction_GetOriginalCreditorSchemeId

@anchor AB_TRANSACTION_OriginalMandateId

OriginalMandateId

"Original SEPA Direct debit mandate id, in case that changed over time

Set this property with @ref AB_Transaction_SetOriginalMandateId, get it with @ref AB_Transaction_GetOriginalMandateId

@anchor AB_TRANSACTION_OriginalCreditorName

OriginalCreditorName

"Original SEPA Direct debit creditor name, in case that changed over time

Set this property with @ref AB_Transaction_SetOriginalCreditorName, get it with @ref AB_Transaction_GetOriginalCreditorName

@anchor AB_TRANSACTION_SequenceType

SequenceType

Sequence type of the debit (one-time, first, recurring).

Set this property with @ref AB_Transaction_SetSequenceType, get it with @ref AB_Transaction_GetSequenceType

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_TRANSACTION AB_TRANSACTION; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include #include /* headers */ #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef enum { AB_Transaction_PeriodUnknown=-1, /** No period. */ AB_Transaction_PeriodNone=0, /** The standing order is to be executed every month. */ AB_Transaction_PeriodMonthly, /** The standing order is to be executed every week. */ AB_Transaction_PeriodWeekly } AB_TRANSACTION_PERIOD; AQBANKING_API AB_TRANSACTION_PERIOD AB_Transaction_Period_fromString(const char *s); AQBANKING_API const char *AB_Transaction_Period_toString(AB_TRANSACTION_PERIOD v); typedef enum { AB_Transaction_TypeUnknown=-1, /** Simple transaction (as in transaction statements) */ AB_Transaction_TypeTransaction=0, /** Transfer type of transaction (as used with transfer jobs) */ AB_Transaction_TypeTransfer, /** Debit note type of transaction (as used with debit note jobs) */ AB_Transaction_TypeDebitNote, /** EU-Transfer type of transaction (as used for with transfer jobs) */ AB_Transaction_TypeEuTransfer, /** SEPA-Transfer type of transaction (as used with SEPA transfer jobs) */ AB_Transaction_TypeSepaTransfer, /** SEPA debit note type of transaction (as used with SEPA debit note jobs) */ AB_Transaction_TypeSepaDebitNote, /** Internal transfer (transfer between accounts at the same bank) */ AB_Transaction_TypeInternalTransfer } AB_TRANSACTION_TYPE; AQBANKING_API AB_TRANSACTION_TYPE AB_Transaction_Type_fromString(const char *s); AQBANKING_API const char *AB_Transaction_Type_toString(AB_TRANSACTION_TYPE v); typedef enum { AB_Transaction_SubTypeUnknown=-1, /** No transfer sub-type */ AB_Transaction_SubTypeNone=0, /** Standard transfer. */ AB_Transaction_SubTypeStandard, /** Check. */ AB_Transaction_SubTypeCheck, /** Debit note (Abbuchungsverfahren) */ AB_Transaction_SubTypeBookedDebitNote, /** Debit note (Einzugsermaechtigung) */ AB_Transaction_SubTypeDrawnDebitNote, /** Standing order (Dauerauftrag) */ AB_Transaction_SubTypeStandingOrder, /** Loan transfer. */ AB_Transaction_SubTypeLoan, /** EU standard transfer. */ AB_Transaction_SubTypeEuStandard, /** Eu transfer which is to be executed the same day. */ AB_Transaction_SubTypeEuASAP, /** Buy stocks and alike */ AB_Transaction_SubTypeBuy, /** Sell stocks and alike */ AB_Transaction_SubTypeSell, /** Reinvestment. */ AB_Transaction_SubTypeReinvest, /** Dividend. */ AB_Transaction_SubTypeDividend } AB_TRANSACTION_SUBTYPE; AQBANKING_API AB_TRANSACTION_SUBTYPE AB_Transaction_SubType_fromString(const char *s); AQBANKING_API const char *AB_Transaction_SubType_toString(AB_TRANSACTION_SUBTYPE v); typedef enum { AB_Transaction_StatusUnknown=-1, /** No status. */ AB_Transaction_StatusNone=0, /** The transfer has been accepted by the bank. */ AB_Transaction_StatusAccepted, /** The transfer has been rejected by the bank (or was erroneous). */ AB_Transaction_StatusRejected, /** The transfer is still pending. */ AB_Transaction_StatusPending, /** The transfer is being sent. */ AB_Transaction_StatusSending, /** The transfer has automatically been reconciled. */ AB_Transaction_StatusAutoReconciled, /** The transfer has automatically been reconciled. */ AB_Transaction_StatusManuallyReconciled, /** The transfer has been revoked. */ AB_Transaction_StatusRevoked, /** The transfer has been aborted. */ AB_Transaction_StatusAborted } AB_TRANSACTION_STATUS; AQBANKING_API AB_TRANSACTION_STATUS AB_Transaction_Status_fromString(const char *s); AQBANKING_API const char *AB_Transaction_Status_toString(AB_TRANSACTION_STATUS v); typedef enum { AB_Transaction_ChargeUnknown=-1, /** Nobody is to be charged. */ AB_Transaction_ChargeNobody=0, /** Issuer is to be charged. */ AB_Transaction_ChargeLocal, /** Peer is to be charged. */ AB_Transaction_ChargeRemote, /** Issuer and peer share the charges. */ AB_Transaction_ChargeShare } AB_TRANSACTION_CHARGE; AQBANKING_API AB_TRANSACTION_CHARGE AB_Transaction_Charge_fromString(const char *s); AQBANKING_API const char *AB_Transaction_Charge_toString(AB_TRANSACTION_CHARGE v); typedef enum { AB_Transaction_SequenceTypeUnknown=-1, /** One-time operation. */ AB_Transaction_SequenceTypeOnce=0, /** First operation with more following. */ AB_Transaction_SequenceTypeFirst, /** Following operation (not the first). */ AB_Transaction_SequenceTypeFollowing, /** Final operation (last). */ AB_Transaction_SequenceTypeFinal } AB_TRANSACTION_SEQUENCETYPE; AQBANKING_API AB_TRANSACTION_SEQUENCETYPE AB_Transaction_SequenceType_fromString(const char *s); AQBANKING_API const char *AB_Transaction_SequenceType_toString(AB_TRANSACTION_SEQUENCETYPE v); GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_TRANSACTION, AQBANKING_API) GWEN_LIST_FUNCTION_LIB_DEFS(AB_TRANSACTION, AB_Transaction, AQBANKING_API) AQBANKING_API AB_TRANSACTION_LIST *AB_Transaction_List_dup(const AB_TRANSACTION_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_TRANSACTION, AB_Transaction, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_Transaction_List2_freeAll(AB_TRANSACTION_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_TRANSACTION *AB_Transaction_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_TRANSACTION *AB_Transaction_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_TRANSACTION *AB_Transaction_dup(const AB_TRANSACTION*st); /** Destroys the given object. */ AQBANKING_API void AB_Transaction_free(AB_TRANSACTION *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_Transaction_Attach(AB_TRANSACTION *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_Transaction_ReadDb(AB_TRANSACTION *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_Transaction_toDb(const AB_TRANSACTION*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_Transaction_IsModified(const AB_TRANSACTION *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_Transaction_SetModified(AB_TRANSACTION *st, int i); /** @name Local Account Info * This group contains information about the local account.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_LocalCountry */ AQBANKING_API const char *AB_Transaction_GetLocalCountry(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalCountry */ AQBANKING_API void AB_Transaction_SetLocalCountry(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalBankCode */ AQBANKING_API const char *AB_Transaction_GetLocalBankCode(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalBankCode */ AQBANKING_API void AB_Transaction_SetLocalBankCode(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalBranchId */ AQBANKING_API const char *AB_Transaction_GetLocalBranchId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalBranchId */ AQBANKING_API void AB_Transaction_SetLocalBranchId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalAccountNumber */ AQBANKING_API const char *AB_Transaction_GetLocalAccountNumber(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalAccountNumber */ AQBANKING_API void AB_Transaction_SetLocalAccountNumber(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalSuffix */ AQBANKING_API const char *AB_Transaction_GetLocalSuffix(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalSuffix */ AQBANKING_API void AB_Transaction_SetLocalSuffix(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalIban */ AQBANKING_API const char *AB_Transaction_GetLocalIban(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalIban */ AQBANKING_API void AB_Transaction_SetLocalIban(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalName */ AQBANKING_API const char *AB_Transaction_GetLocalName(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalName */ AQBANKING_API void AB_Transaction_SetLocalName(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_LocalBic */ AQBANKING_API const char *AB_Transaction_GetLocalBic(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LocalBic */ AQBANKING_API void AB_Transaction_SetLocalBic(AB_TRANSACTION *el, const char *d); /*@}*/ /** @name Remote Account Info * This group contains information about the remote account.*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_RemoteCountry */ AQBANKING_API const char *AB_Transaction_GetRemoteCountry(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteCountry */ AQBANKING_API void AB_Transaction_SetRemoteCountry(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteBankName */ AQBANKING_API const char *AB_Transaction_GetRemoteBankName(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteBankName */ AQBANKING_API void AB_Transaction_SetRemoteBankName(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteBankLocation */ AQBANKING_API const char *AB_Transaction_GetRemoteBankLocation(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteBankLocation */ AQBANKING_API void AB_Transaction_SetRemoteBankLocation(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteBankCode */ AQBANKING_API const char *AB_Transaction_GetRemoteBankCode(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteBankCode */ AQBANKING_API void AB_Transaction_SetRemoteBankCode(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteBranchId */ AQBANKING_API const char *AB_Transaction_GetRemoteBranchId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteBranchId */ AQBANKING_API void AB_Transaction_SetRemoteBranchId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteAccountNumber */ AQBANKING_API const char *AB_Transaction_GetRemoteAccountNumber(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteAccountNumber */ AQBANKING_API void AB_Transaction_SetRemoteAccountNumber(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteSuffix */ AQBANKING_API const char *AB_Transaction_GetRemoteSuffix(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteSuffix */ AQBANKING_API void AB_Transaction_SetRemoteSuffix(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteIban */ AQBANKING_API const char *AB_Transaction_GetRemoteIban(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteIban */ AQBANKING_API void AB_Transaction_SetRemoteIban(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteName */ AQBANKING_API const GWEN_STRINGLIST *AB_Transaction_GetRemoteName(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteName */ AQBANKING_API void AB_Transaction_SetRemoteName(AB_TRANSACTION *el, const GWEN_STRINGLIST *d); AQBANKING_API void AB_Transaction_AddRemoteName(AB_TRANSACTION *st, const char *d, int chk); AQBANKING_API void AB_Transaction_RemoveRemoteName(AB_TRANSACTION *st, const char *d); AQBANKING_API void AB_Transaction_ClearRemoteName(AB_TRANSACTION *st); AQBANKING_API int AB_Transaction_HasRemoteName(const AB_TRANSACTION *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteBic */ AQBANKING_API const char *AB_Transaction_GetRemoteBic(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteBic */ AQBANKING_API void AB_Transaction_SetRemoteBic(AB_TRANSACTION *el, const char *d); /*@}*/ /** * Returns the property @ref AB_TRANSACTION_UniqueId */ AQBANKING_API uint32_t AB_Transaction_GetUniqueId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_UniqueId */ AQBANKING_API void AB_Transaction_SetUniqueId(AB_TRANSACTION *el, uint32_t d); /** * Returns the property @ref AB_TRANSACTION_IdForApplication */ AQBANKING_API uint32_t AB_Transaction_GetIdForApplication(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_IdForApplication */ AQBANKING_API void AB_Transaction_SetIdForApplication(AB_TRANSACTION *el, uint32_t d); /** * Returns the property @ref AB_TRANSACTION_GroupId */ AQBANKING_API uint32_t AB_Transaction_GetGroupId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_GroupId */ AQBANKING_API void AB_Transaction_SetGroupId(AB_TRANSACTION *el, uint32_t d); /** @name Dates */ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_ValutaDate */ AQBANKING_API const GWEN_TIME *AB_Transaction_GetValutaDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_ValutaDate */ AQBANKING_API void AB_Transaction_SetValutaDate(AB_TRANSACTION *el, const GWEN_TIME *d); /** * Returns the property @ref AB_TRANSACTION_Date */ AQBANKING_API const GWEN_TIME *AB_Transaction_GetDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Date */ AQBANKING_API void AB_Transaction_SetDate(AB_TRANSACTION *el, const GWEN_TIME *d); /*@}*/ /** @name Value * */ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_Value */ AQBANKING_API const AB_VALUE *AB_Transaction_GetValue(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Value */ AQBANKING_API void AB_Transaction_SetValue(AB_TRANSACTION *el, const AB_VALUE *d); /*@}*/ /** * Returns the property @ref AB_TRANSACTION_Fees */ AQBANKING_API const AB_VALUE *AB_Transaction_GetFees(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Fees */ AQBANKING_API void AB_Transaction_SetFees(AB_TRANSACTION *el, const AB_VALUE *d); /** @name Info Which Is Not Supported by All Backends *

This group contains information which differ between backends.

Some of this information might not even besupportedby every backends.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_TextKey */ AQBANKING_API int AB_Transaction_GetTextKey(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_TextKey */ AQBANKING_API void AB_Transaction_SetTextKey(AB_TRANSACTION *el, int d); /** * Returns the property @ref AB_TRANSACTION_TextKeyExt */ AQBANKING_API int AB_Transaction_GetTextKeyExt(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_TextKeyExt */ AQBANKING_API void AB_Transaction_SetTextKeyExt(AB_TRANSACTION *el, int d); /** * Returns the property @ref AB_TRANSACTION_TransactionKey */ AQBANKING_API const char *AB_Transaction_GetTransactionKey(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_TransactionKey */ AQBANKING_API void AB_Transaction_SetTransactionKey(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_CustomerReference */ AQBANKING_API const char *AB_Transaction_GetCustomerReference(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_CustomerReference */ AQBANKING_API void AB_Transaction_SetCustomerReference(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_BankReference */ AQBANKING_API const char *AB_Transaction_GetBankReference(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_BankReference */ AQBANKING_API void AB_Transaction_SetBankReference(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_EndToEndReference */ AQBANKING_API const char *AB_Transaction_GetEndToEndReference(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_EndToEndReference */ AQBANKING_API void AB_Transaction_SetEndToEndReference(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_OriginatorIdentifier */ AQBANKING_API const char *AB_Transaction_GetOriginatorIdentifier(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_OriginatorIdentifier */ AQBANKING_API void AB_Transaction_SetOriginatorIdentifier(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_TransactionCode */ AQBANKING_API int AB_Transaction_GetTransactionCode(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_TransactionCode */ AQBANKING_API void AB_Transaction_SetTransactionCode(AB_TRANSACTION *el, int d); /** * Returns the property @ref AB_TRANSACTION_TransactionText */ AQBANKING_API const char *AB_Transaction_GetTransactionText(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_TransactionText */ AQBANKING_API void AB_Transaction_SetTransactionText(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_Primanota */ AQBANKING_API const char *AB_Transaction_GetPrimanota(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Primanota */ AQBANKING_API void AB_Transaction_SetPrimanota(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_FiId */ AQBANKING_API const char *AB_Transaction_GetFiId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_FiId */ AQBANKING_API void AB_Transaction_SetFiId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_Purpose */ AQBANKING_API const GWEN_STRINGLIST *AB_Transaction_GetPurpose(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Purpose */ AQBANKING_API void AB_Transaction_SetPurpose(AB_TRANSACTION *el, const GWEN_STRINGLIST *d); AQBANKING_API void AB_Transaction_AddPurpose(AB_TRANSACTION *st, const char *d, int chk); AQBANKING_API void AB_Transaction_RemovePurpose(AB_TRANSACTION *st, const char *d); AQBANKING_API void AB_Transaction_ClearPurpose(AB_TRANSACTION *st); AQBANKING_API int AB_Transaction_HasPurpose(const AB_TRANSACTION *st, const char *d); /** * Returns the property @ref AB_TRANSACTION_Category */ AQBANKING_API const GWEN_STRINGLIST *AB_Transaction_GetCategory(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Category */ AQBANKING_API void AB_Transaction_SetCategory(AB_TRANSACTION *el, const GWEN_STRINGLIST *d); AQBANKING_API void AB_Transaction_AddCategory(AB_TRANSACTION *st, const char *d, int chk); AQBANKING_API void AB_Transaction_RemoveCategory(AB_TRANSACTION *st, const char *d); AQBANKING_API void AB_Transaction_ClearCategory(AB_TRANSACTION *st); AQBANKING_API int AB_Transaction_HasCategory(const AB_TRANSACTION *st, const char *d); /*@}*/ /** @name Additional Information for Standing Orders *

This group contains information which is used with standing orders. It is not needed for other usage of this type.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_Period */ AQBANKING_API AB_TRANSACTION_PERIOD AB_Transaction_GetPeriod(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Period */ AQBANKING_API void AB_Transaction_SetPeriod(AB_TRANSACTION *el, AB_TRANSACTION_PERIOD d); /** * Returns the property @ref AB_TRANSACTION_Cycle */ AQBANKING_API int AB_Transaction_GetCycle(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Cycle */ AQBANKING_API void AB_Transaction_SetCycle(AB_TRANSACTION *el, int d); /** * Returns the property @ref AB_TRANSACTION_ExecutionDay */ AQBANKING_API int AB_Transaction_GetExecutionDay(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_ExecutionDay */ AQBANKING_API void AB_Transaction_SetExecutionDay(AB_TRANSACTION *el, int d); /** * Returns the property @ref AB_TRANSACTION_FirstExecutionDate */ AQBANKING_API const GWEN_TIME *AB_Transaction_GetFirstExecutionDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_FirstExecutionDate */ AQBANKING_API void AB_Transaction_SetFirstExecutionDate(AB_TRANSACTION *el, const GWEN_TIME *d); /** * Returns the property @ref AB_TRANSACTION_LastExecutionDate */ AQBANKING_API const GWEN_TIME *AB_Transaction_GetLastExecutionDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_LastExecutionDate */ AQBANKING_API void AB_Transaction_SetLastExecutionDate(AB_TRANSACTION *el, const GWEN_TIME *d); /** * Returns the property @ref AB_TRANSACTION_NextExecutionDate */ AQBANKING_API const GWEN_TIME *AB_Transaction_GetNextExecutionDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_NextExecutionDate */ AQBANKING_API void AB_Transaction_SetNextExecutionDate(AB_TRANSACTION *el, const GWEN_TIME *d); /*@}*/ /** @name Additional Information for Transfers *

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_Type */ AQBANKING_API AB_TRANSACTION_TYPE AB_Transaction_GetType(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Type */ AQBANKING_API void AB_Transaction_SetType(AB_TRANSACTION *el, AB_TRANSACTION_TYPE d); /** * Returns the property @ref AB_TRANSACTION_SubType */ AQBANKING_API AB_TRANSACTION_SUBTYPE AB_Transaction_GetSubType(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_SubType */ AQBANKING_API void AB_Transaction_SetSubType(AB_TRANSACTION *el, AB_TRANSACTION_SUBTYPE d); /** * Returns the property @ref AB_TRANSACTION_Status */ AQBANKING_API AB_TRANSACTION_STATUS AB_Transaction_GetStatus(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Status */ AQBANKING_API void AB_Transaction_SetStatus(AB_TRANSACTION *el, AB_TRANSACTION_STATUS d); /** * Returns the property @ref AB_TRANSACTION_Charge */ AQBANKING_API AB_TRANSACTION_CHARGE AB_Transaction_GetCharge(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Charge */ AQBANKING_API void AB_Transaction_SetCharge(AB_TRANSACTION *el, AB_TRANSACTION_CHARGE d); /*@}*/ /** @name Additional Information for Foreign Transfers *

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_RemoteAddrStreet */ AQBANKING_API const char *AB_Transaction_GetRemoteAddrStreet(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteAddrStreet */ AQBANKING_API void AB_Transaction_SetRemoteAddrStreet(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteAddrZipcode */ AQBANKING_API const char *AB_Transaction_GetRemoteAddrZipcode(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteAddrZipcode */ AQBANKING_API void AB_Transaction_SetRemoteAddrZipcode(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemoteAddrCity */ AQBANKING_API const char *AB_Transaction_GetRemoteAddrCity(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemoteAddrCity */ AQBANKING_API void AB_Transaction_SetRemoteAddrCity(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_RemotePhone */ AQBANKING_API const char *AB_Transaction_GetRemotePhone(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_RemotePhone */ AQBANKING_API void AB_Transaction_SetRemotePhone(AB_TRANSACTION *el, const char *d); /*@}*/ /** @name Additional Information for Investment Transfers *

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_UnitId */ AQBANKING_API const char *AB_Transaction_GetUnitId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_UnitId */ AQBANKING_API void AB_Transaction_SetUnitId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_UnitIdNameSpace */ AQBANKING_API const char *AB_Transaction_GetUnitIdNameSpace(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_UnitIdNameSpace */ AQBANKING_API void AB_Transaction_SetUnitIdNameSpace(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_Units */ AQBANKING_API const AB_VALUE *AB_Transaction_GetUnits(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Units */ AQBANKING_API void AB_Transaction_SetUnits(AB_TRANSACTION *el, const AB_VALUE *d); /** * Returns the property @ref AB_TRANSACTION_UnitPrice */ AQBANKING_API const AB_VALUE *AB_Transaction_GetUnitPrice(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_UnitPrice */ AQBANKING_API void AB_Transaction_SetUnitPrice(AB_TRANSACTION *el, const AB_VALUE *d); /** * Returns the property @ref AB_TRANSACTION_Commission */ AQBANKING_API const AB_VALUE *AB_Transaction_GetCommission(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_Commission */ AQBANKING_API void AB_Transaction_SetCommission(AB_TRANSACTION *el, const AB_VALUE *d); /*@}*/ /** @name Additional Information for SEPA Direct Debits *

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /** * Returns the property @ref AB_TRANSACTION_CreditorSchemeId */ AQBANKING_API const char *AB_Transaction_GetCreditorSchemeId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_CreditorSchemeId */ AQBANKING_API void AB_Transaction_SetCreditorSchemeId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_MandateId */ AQBANKING_API const char *AB_Transaction_GetMandateId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_MandateId */ AQBANKING_API void AB_Transaction_SetMandateId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_MandateDate */ AQBANKING_API const GWEN_DATE *AB_Transaction_GetMandateDate(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_MandateDate */ AQBANKING_API void AB_Transaction_SetMandateDate(AB_TRANSACTION *el, const GWEN_DATE *d); /** * Returns the property @ref AB_TRANSACTION_MandateDebitorName */ AQBANKING_API const char *AB_Transaction_GetMandateDebitorName(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_MandateDebitorName */ AQBANKING_API void AB_Transaction_SetMandateDebitorName(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_OriginalCreditorSchemeId */ AQBANKING_API const char *AB_Transaction_GetOriginalCreditorSchemeId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_OriginalCreditorSchemeId */ AQBANKING_API void AB_Transaction_SetOriginalCreditorSchemeId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_OriginalMandateId */ AQBANKING_API const char *AB_Transaction_GetOriginalMandateId(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_OriginalMandateId */ AQBANKING_API void AB_Transaction_SetOriginalMandateId(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_OriginalCreditorName */ AQBANKING_API const char *AB_Transaction_GetOriginalCreditorName(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_OriginalCreditorName */ AQBANKING_API void AB_Transaction_SetOriginalCreditorName(AB_TRANSACTION *el, const char *d); /** * Returns the property @ref AB_TRANSACTION_SequenceType */ AQBANKING_API AB_TRANSACTION_SEQUENCETYPE AB_Transaction_GetSequenceType(const AB_TRANSACTION *el); /** * Set the property @ref AB_TRANSACTION_SequenceType */ AQBANKING_API void AB_Transaction_SetSequenceType(AB_TRANSACTION *el, AB_TRANSACTION_SEQUENCETYPE d); /*@}*/ #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* TRANSACTION_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/userfns_l.h0000644000175000017500000000131612364015477020240 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_USERFNS_L_H #define AQBANKING_USERFNS_L_H #include "userfns.h" AB_USER *AB_User_new(AB_BANKING *ab); AB_USER *AB_User_fromDb(AB_BANKING *ab, GWEN_DB_NODE *db); #endif /* AQBANKING_USERFNS_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/message.h0000644000175000017500000001061312372461742017663 00000000000000/* This file is auto-generated from "message.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef MESSAGE_H #define MESSAGE_H /** @page P_AB_MESSAGE_PUBLIC AB_Message (public) This page describes the properties of AB_MESSAGE @anchor AB_MESSAGE_UserId

UserId

ID of the user in whose context the message has been received (see @ref AB_User_GetUniqueId).

Set this property with @ref AB_Message_SetUserId, get it with @ref AB_Message_GetUserId

@anchor AB_MESSAGE_AccountId

AccountId

ID of the account in whose context the message has been received (if any). This field is not set by AqHBCI but may be used by other backends in some cases.

Set this property with @ref AB_Message_SetAccountId, get it with @ref AB_Message_GetAccountId

@anchor AB_MESSAGE_Subject

Subject

Subject of the message.

Set this property with @ref AB_Message_SetSubject, get it with @ref AB_Message_GetSubject

@anchor AB_MESSAGE_Text

Text

The message itself.

Set this property with @ref AB_Message_SetText, get it with @ref AB_Message_GetText

@anchor AB_MESSAGE_DateReceived

DateReceived

Receiption date and time.

Set this property with @ref AB_Message_SetDateReceived, get it with @ref AB_Message_GetDateReceived

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_MESSAGE AB_MESSAGE; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_MESSAGE, AB_Message, AQBANKING_API) AQBANKING_API AB_MESSAGE_LIST *AB_Message_List_dup(const AB_MESSAGE_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_MESSAGE, AB_Message, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_Message_List2_freeAll(AB_MESSAGE_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_MESSAGE *AB_Message_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_MESSAGE *AB_Message_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_MESSAGE *AB_Message_dup(const AB_MESSAGE*st); /** Destroys the given object. */ AQBANKING_API void AB_Message_free(AB_MESSAGE *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_Message_Attach(AB_MESSAGE *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_Message_ReadDb(AB_MESSAGE *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_Message_toDb(const AB_MESSAGE*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_Message_IsModified(const AB_MESSAGE *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_Message_SetModified(AB_MESSAGE *st, int i); /** * Returns the property @ref AB_MESSAGE_UserId */ AQBANKING_API uint32_t AB_Message_GetUserId(const AB_MESSAGE *el); /** * Set the property @ref AB_MESSAGE_UserId */ AQBANKING_API void AB_Message_SetUserId(AB_MESSAGE *el, uint32_t d); /** * Returns the property @ref AB_MESSAGE_AccountId */ AQBANKING_API uint32_t AB_Message_GetAccountId(const AB_MESSAGE *el); /** * Set the property @ref AB_MESSAGE_AccountId */ AQBANKING_API void AB_Message_SetAccountId(AB_MESSAGE *el, uint32_t d); /** * Returns the property @ref AB_MESSAGE_Subject */ AQBANKING_API const char *AB_Message_GetSubject(const AB_MESSAGE *el); /** * Set the property @ref AB_MESSAGE_Subject */ AQBANKING_API void AB_Message_SetSubject(AB_MESSAGE *el, const char *d); /** * Returns the property @ref AB_MESSAGE_Text */ AQBANKING_API const char *AB_Message_GetText(const AB_MESSAGE *el); /** * Set the property @ref AB_MESSAGE_Text */ AQBANKING_API void AB_Message_SetText(AB_MESSAGE *el, const char *d); /** * Returns the property @ref AB_MESSAGE_DateReceived */ AQBANKING_API const GWEN_TIME *AB_Message_GetDateReceived(const AB_MESSAGE *el); /** * Set the property @ref AB_MESSAGE_DateReceived */ AQBANKING_API void AB_Message_SetDateReceived(AB_MESSAGE *el, const GWEN_TIME *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* MESSAGE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/cellphone.xml0000644000175000017500000000432112364015477020561 00000000000000
gwenhywfar/types.h
aqbanking/error.h
aqbanking/value.h
Id assigned by the backend. Name of the provider. Name of the product. This field contains the minimum value which can be loaded onto the prepaid card. This value can be empty (or non-existent) for some backends and banks. This field contains the maximum value which can be loaded onto the prepaid card. This value can be empty (or non-existent) for some backends and banks. This is the list of allowed values. This list might be empty!
aqbanking-5.6.4beta/src/libs/aqbanking/types/message.xml0000644000175000017500000000303212364015477020232 00000000000000
gwenhywfar/types.h
gwenhywfar/gwentime.h
aqbanking/error.h
ID of the user in whose context the message has been received (see @ref AB_User_GetUniqueId). ID of the account in whose context the message has been received (if any). This field is not set by AqHBCI but may be used by other backends in some cases. Subject of the message. The message itself. Receiption date and time.
aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfoservice.h0000644000175000017500000002210312372461742021404 00000000000000/* This file is auto-generated from "bankinfoservice.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFOSERVICE_H #define BANKINFOSERVICE_H /** @page P_AB_BANKINFO_SERVICE_PUBLIC AB_BankInfoService (public) This page describes the properties of AB_BANKINFO_SERVICE @anchor AB_BANKINFO_SERVICE_Type

Type

The following types have been registered with AqBanking:

  • HBCI- German homebanking protocol
  • EBICS- German and French homebanking protocol
  • OFX- OFX direct connect protocol

Set this property with @ref AB_BankInfoService_SetType, get it with @ref AB_BankInfoService_GetType

@anchor AB_BANKINFO_SERVICE_Address

Address

For most services this is the URL or hostname of the server.

Set this property with @ref AB_BankInfoService_SetAddress, get it with @ref AB_BankInfoService_GetAddress

@anchor AB_BANKINFO_SERVICE_Suffix

Suffix

For IP based services this is the port to be used (if omitted a default value suitable for the service is chosen).

Set this property with @ref AB_BankInfoService_SetSuffix, get it with @ref AB_BankInfoService_GetSuffix

@anchor AB_BANKINFO_SERVICE_Pversion

Pversion

The content of this field depends on the service type. For HBCI this is the protocol version to be used:

  • 2.01
  • 2.10
  • 2.20
For EBICS this is also the protocol version:
  • H002
  • H003

Set this property with @ref AB_BankInfoService_SetPversion, get it with @ref AB_BankInfoService_GetPversion

@anchor AB_BANKINFO_SERVICE_Mode

Mode

The content of this field depends on the service type. For HBCI the following values are used:

  • DDV
  • RDH1
  • RDH2
  • RDH3
  • RDH4
  • RDH5
  • RDH6
  • RDH7
  • RDH8
  • RDH9
  • RDH10
  • PINTAN

Set this property with @ref AB_BankInfoService_SetMode, get it with @ref AB_BankInfoService_GetMode

@anchor AB_BANKINFO_SERVICE_UserFlags

UserFlags

This field contains some service-dependent user flags. For HBCI these are the flags of AH_USER (e.g. forceSslv3 etc).

Set this property with @ref AB_BankInfoService_SetUserFlags, get it with @ref AB_BankInfoService_GetUserFlags

@anchor AB_BANKINFO_SERVICE_Hversion

Hversion

For HTTP-based protocols this is the HTTP version to be used:

  • 1.0
  • 1.1

Set this property with @ref AB_BankInfoService_SetHversion, get it with @ref AB_BankInfoService_GetHversion

@anchor AB_BANKINFO_SERVICE_Aux1

Aux1

This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the FID from the bankinfo file. EBICS stores the HOSTID here.

Set this property with @ref AB_BankInfoService_SetAux1, get it with @ref AB_BankInfoService_GetAux1

@anchor AB_BANKINFO_SERVICE_Aux2

Aux2

This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the ORG field from the bankinfo file.

Set this property with @ref AB_BankInfoService_SetAux2, get it with @ref AB_BankInfoService_GetAux2

@anchor AB_BANKINFO_SERVICE_Aux3

Aux3

This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the APPID field from the bankinfo file.

Set this property with @ref AB_BankInfoService_SetAux3, get it with @ref AB_BankInfoService_GetAux3

@anchor AB_BANKINFO_SERVICE_Aux4

Aux4

This is a multi purpose field to be used by a bankinfo plugin as it sees fit. OFX uses this to store the APPVER field from the bankinfo file.

Set this property with @ref AB_BankInfoService_SetAux4, get it with @ref AB_BankInfoService_GetAux4

*/ #ifdef __cplusplus extern "C" { #endif typedef struct AB_BANKINFO_SERVICE AB_BANKINFO_SERVICE; #ifdef __cplusplus } /* __cplusplus */ #endif #include #include #include /* headers */ #include #include #ifdef __cplusplus extern "C" { #endif GWEN_LIST_FUNCTION_LIB_DEFS(AB_BANKINFO_SERVICE, AB_BankInfoService, AQBANKING_API) AQBANKING_API AB_BANKINFO_SERVICE_LIST *AB_BankInfoService_List_dup(const AB_BANKINFO_SERVICE_LIST *stl); GWEN_LIST2_FUNCTION_LIB_DEFS(AB_BANKINFO_SERVICE, AB_BankInfoService, AQBANKING_API) /** Destroys all objects stored in the given LIST2 and the list itself */ AQBANKING_API void AB_BankInfoService_List2_freeAll(AB_BANKINFO_SERVICE_LIST2 *stl); /** Creates a new object. */ AQBANKING_API AB_BANKINFO_SERVICE *AB_BankInfoService_new(void); /** Creates an object from the data in the given GWEN_DB_NODE */ AQBANKING_API AB_BANKINFO_SERVICE *AB_BankInfoService_fromDb(GWEN_DB_NODE *db); /** Creates and returns a deep copy of thegiven object. */ AQBANKING_API AB_BANKINFO_SERVICE *AB_BankInfoService_dup(const AB_BANKINFO_SERVICE*st); /** Destroys the given object. */ AQBANKING_API void AB_BankInfoService_free(AB_BANKINFO_SERVICE *st); /** Increments the usage counter of the given object, so an additional free() is needed to destroy the object. */ AQBANKING_API void AB_BankInfoService_Attach(AB_BANKINFO_SERVICE *st); /** Reads data from a GWEN_DB. */ AQBANKING_API int AB_BankInfoService_ReadDb(AB_BANKINFO_SERVICE *st, GWEN_DB_NODE *db); /** Stores an object in the given GWEN_DB_NODE */ AQBANKING_API int AB_BankInfoService_toDb(const AB_BANKINFO_SERVICE*st, GWEN_DB_NODE *db); /** Returns 0 if this object has not been modified, !=0 otherwise */ AQBANKING_API int AB_BankInfoService_IsModified(const AB_BANKINFO_SERVICE *st); /** Sets the modified state of the given object */ AQBANKING_API void AB_BankInfoService_SetModified(AB_BANKINFO_SERVICE *st, int i); /** * Returns the property @ref AB_BANKINFO_SERVICE_Type */ AQBANKING_API const char *AB_BankInfoService_GetType(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Type */ AQBANKING_API void AB_BankInfoService_SetType(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Address */ AQBANKING_API const char *AB_BankInfoService_GetAddress(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Address */ AQBANKING_API void AB_BankInfoService_SetAddress(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Suffix */ AQBANKING_API const char *AB_BankInfoService_GetSuffix(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Suffix */ AQBANKING_API void AB_BankInfoService_SetSuffix(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Pversion */ AQBANKING_API const char *AB_BankInfoService_GetPversion(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Pversion */ AQBANKING_API void AB_BankInfoService_SetPversion(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Mode */ AQBANKING_API const char *AB_BankInfoService_GetMode(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Mode */ AQBANKING_API void AB_BankInfoService_SetMode(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_UserFlags */ AQBANKING_API uint32_t AB_BankInfoService_GetUserFlags(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_UserFlags */ AQBANKING_API void AB_BankInfoService_SetUserFlags(AB_BANKINFO_SERVICE *el, uint32_t d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Hversion */ AQBANKING_API const char *AB_BankInfoService_GetHversion(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Hversion */ AQBANKING_API void AB_BankInfoService_SetHversion(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Aux1 */ AQBANKING_API const char *AB_BankInfoService_GetAux1(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Aux1 */ AQBANKING_API void AB_BankInfoService_SetAux1(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Aux2 */ AQBANKING_API const char *AB_BankInfoService_GetAux2(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Aux2 */ AQBANKING_API void AB_BankInfoService_SetAux2(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Aux3 */ AQBANKING_API const char *AB_BankInfoService_GetAux3(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Aux3 */ AQBANKING_API void AB_BankInfoService_SetAux3(AB_BANKINFO_SERVICE *el, const char *d); /** * Returns the property @ref AB_BANKINFO_SERVICE_Aux4 */ AQBANKING_API const char *AB_BankInfoService_GetAux4(const AB_BANKINFO_SERVICE *el); /** * Set the property @ref AB_BANKINFO_SERVICE_Aux4 */ AQBANKING_API void AB_BankInfoService_SetAux4(AB_BANKINFO_SERVICE *el, const char *d); #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* BANKINFOSERVICE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/security.xml0000644000175000017500000000367212364015477020467 00000000000000
gwenhywfar/types.h
gwenhywfar/gwentime.h
aqbanking/value.h
Full name of the security. Unique id of the security within the namespace. Namespace for uniqueId (e.g. CUSIP for North America) Ticker symbol of the security. Number of units held (e.g. number of stock units etc) Price of a unit as of unitPriceDate. Date for the unitPriceValue
aqbanking-5.6.4beta/src/libs/aqbanking/types/textkeydescr_p.h0000644000175000017500000000063412372461741021275 00000000000000/* This file is auto-generated from "textkeydescr.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TEXTKEYDESCR_P_H #define TEXTKEYDESCR_P_H #include "textkeydescr_l.h" struct AB_TEXTKEY_DESCR { GWEN_LIST_ELEMENT(AB_TEXTKEY_DESCR) int _usage; int _modified; int value; char *name; char *descr; }; #endif /* TEXTKEYDESCR_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/value.c0000644000175000017500000002514012364015477017350 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "value_p.h" #include #include #include #include #include #ifdef HAVE_LOCALE_H # include #endif #include #define AB_VALUE_STRSIZE 256 GWEN_LIST_FUNCTIONS(AB_VALUE, AB_Value) AB_VALUE *AB_Value_new(void) { AB_VALUE *v; GWEN_NEW_OBJECT(AB_VALUE, v); GWEN_LIST_INIT(AB_VALUE, v); mpq_init(v->value); return v; } void AB_Value_free(AB_VALUE *v) { if (v) { mpq_clear(v->value); free(v->currency); GWEN_LIST_FINI(AB_VALUE, v); GWEN_FREE_OBJECT(v); } } AB_VALUE *AB_Value_dup(const AB_VALUE *ov) { AB_VALUE *v; assert(ov); v=AB_Value_new(); mpq_set(v->value, ov->value); if (ov->currency) v->currency=strdup(ov->currency); return v; } AB_VALUE *AB_Value_fromDouble(double i) { GWEN_BUFFER *nbuf; AB_VALUE *v; int rv; nbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_Text_DoubleToBuffer(i, nbuf); assert(rv==0); v=AB_Value_fromString(GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); return v; } AB_VALUE *AB_Value_fromInt(long int num, long int denom) { AB_VALUE *v; v=AB_Value_new(); mpq_set_si(v->value, num, denom); return v; } static int AB_Value_determineDecimalComma(const char *s) { int len; int i; len=strlen(s); for (i=len-1; i>=0; i--) { if (s[i]==',' || s[i]=='.') return (int) (s[i]); } return 0; } AB_VALUE *AB_Value_fromString(const char *s) { AB_VALUE *v; const char *currency=NULL; int conversion_succeeded = 1; // assume conversion will succeed char *tmpString=NULL; char *p; char *t; char decimalComma; int isNeg=0; if( !s ) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Attempt to convert a NULL value"); return NULL; } tmpString=strdup(s); p=tmpString; while(*p && *p<33) p++; if (*p=='-') { isNeg=1; p++; } else if (*p=='+') { p++; } t=strchr(p, ':'); if (t) { currency=t+1; *t=0; } /* remove thousand's comma */ decimalComma=AB_Value_determineDecimalComma(p); if (decimalComma) { char *s1, *d1; s1=p; d1=p; while(*s1) { register char c; c=*(s1++); if (isdigit(c) || c=='/') *(d1++)=c; else if (c==decimalComma) /* always use '.' as decimal comma */ *(d1++)='.'; } *d1=0; } v=AB_Value_new(); t=strchr(p, '.'); if (t) { // remove comma and calculate denominator unsigned long denominator = 1; char *next; do { next=t+1; *t=*next; if (*next != 0) denominator *= 10; t++; } while (*next); // set denominator to the calculated value mpz_set_ui(mpq_denref(v->value), denominator); // set numerator to the resulting integer string without comma if (mpz_set_str(mpq_numref(v->value), p, 10) == -1) { conversion_succeeded = 0; } } else { /*DBG_ERROR(0, "Scanning this value: %s\n", p);*/ conversion_succeeded = (gmp_sscanf(p, "%Qu", v->value) == 1); } /* set currency (if any) */ if (currency) v->currency=strdup(currency); /* temporary string no longer needed */ free(tmpString); if (!conversion_succeeded) { DBG_ERROR(AQBANKING_LOGDOMAIN, "[%s] is not a valid value", s); AB_Value_free(v); return NULL; } if (isNeg) mpq_neg(v->value, v->value); return v; } const char *AB_Value_GetCurrency(const AB_VALUE *v){ assert(v); return v->currency; } void AB_Value_SetCurrency(AB_VALUE *v, const char *s){ assert(v); free(v->currency); if (s) v->currency=strdup(s); else v->currency=0; } AB_VALUE *AB_Value_fromDb(GWEN_DB_NODE *db){ AB_VALUE *vc; const char *p; /* read and parse value */ p=GWEN_DB_GetCharValue(db, "value", 0, 0); if (!p) return NULL; vc=AB_Value_fromString(p); if (vc==NULL) return NULL; /* read currency (if any) */ p=GWEN_DB_GetCharValue(db, "currency", 0, "EUR"); if (p) AB_Value_SetCurrency(vc, p); return vc; } int AB_Value_toDb(const AB_VALUE *v, GWEN_DB_NODE *db) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 128, 0, 1); AB_Value__toString(v, buf); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); if (v->currency) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", v->currency); return 0; } int AB_Value_toDbFloat(const AB_VALUE *v, GWEN_DB_NODE *db) { GWEN_BUFFER *buf; buf=GWEN_Buffer_new(0, 128, 0, 1); AB_Value_toHumanReadableString2(v, buf, 2, 0); GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "value", GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); if (v->currency) GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "currency", v->currency); return 0; } void AB_Value__toString(const AB_VALUE *v, GWEN_BUFFER *buf) { int rv; uint32_t size; char *p; assert(v); GWEN_Buffer_AllocRoom(buf, AB_VALUE_STRSIZE); p=GWEN_Buffer_GetPosPointer(buf); size=GWEN_Buffer_GetMaxUnsegmentedWrite(buf); rv=gmp_snprintf(p, size, "%Qi", v->value); assert(rvvalue); if (rv<0 || rv>=buflen) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Buffer too small"); return GWEN_ERROR_BUFFER_OVERFLOW; } return 0; } void AB_Value_toString(const AB_VALUE *v, GWEN_BUFFER *buf) { assert(v); AB_Value__toString(v, buf); if (v->currency) { GWEN_Buffer_AppendString(buf, ":"); GWEN_Buffer_AppendString(buf, v->currency); } } void AB_Value_toHumanReadableString(const AB_VALUE *v, GWEN_BUFFER *buf, int prec) { AB_Value_toHumanReadableString2(v, buf, prec?prec:2, 0); } void AB_Value_toHumanReadableString2(const AB_VALUE *v, GWEN_BUFFER *buf, int prec, int withCurrency) { char numbuf[128]; double num; int rv; #ifdef HAVE_SETLOCALE const char *orig_locale = setlocale(LC_NUMERIC, NULL); char *currentLocale = strdup(orig_locale ? orig_locale : "C"); setlocale(LC_NUMERIC, "C"); #endif num=AB_Value_GetValueAsDouble(v); rv=snprintf(numbuf, sizeof(numbuf), "%.*f", prec, num); #ifdef HAVE_SETLOCALE setlocale(LC_NUMERIC, currentLocale); free(currentLocale); #endif if (rv<1 || rv>=sizeof(numbuf)) { assert(0); } GWEN_Buffer_AppendString(buf, numbuf); if (v->currency && withCurrency) { GWEN_Buffer_AppendString(buf, " "); GWEN_Buffer_AppendString(buf, v->currency); } } double AB_Value_GetValueAsDouble(const AB_VALUE *v) { assert(v); if (mpz_fits_slong_p(mpq_numref(v->value)) && mpz_fits_slong_p(mpq_denref(v->value))) { return (double) (mpz_get_d(mpq_numref(v->value)) / mpz_get_d(mpq_denref(v->value))); } else { return mpq_get_d(v->value); } } void AB_Value_SetValueFromDouble(AB_VALUE *v, double i) { assert(v); mpq_set_d(v->value, i); } void AB_Value_SetZero(AB_VALUE *v) { assert(v); mpq_clear(v->value); mpq_init(v->value); } int AB_Value_IsZero(const AB_VALUE *v) { assert(v); return (mpq_sgn(v->value)==0); } int AB_Value_IsNegative(const AB_VALUE *v) { assert(v); return (mpq_sgn(v->value)<0); } int AB_Value_IsPositive(const AB_VALUE *v) { assert(v); return (mpq_sgn(v->value)>=0); } int AB_Value_Compare(const AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); return mpq_cmp(v1->value, v2->value); } int AB_Value_Equal(const AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); return mpq_equal(v1->value, v2->value); } int AB_Value_AddValue(AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); mpq_add(v1->value, v1->value, v2->value); return 0; } int AB_Value_SubValue(AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); mpq_sub(v1->value, v1->value, v2->value); return 0; } int AB_Value_MultValue(AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); mpq_mul(v1->value, v1->value, v2->value); return 0; } int AB_Value_DivValue(AB_VALUE *v1, const AB_VALUE *v2) { assert(v1); assert(v2); mpq_div(v1->value, v1->value, v2->value); return 0; } int AB_Value_Negate(AB_VALUE *v) { assert(v); mpq_neg(v->value, v->value); return 0; } void AB_Value_Dump(const AB_VALUE *v, FILE *f, unsigned int indent) { unsigned int i; for (i=0; ivalue, GWEN_Buffer_GetStart(nbuf)); GWEN_Buffer_free(nbuf); } else fprintf(f, "[none]\n"); } AB_VALUE_LIST *AB_Value_List_dup(const AB_VALUE_LIST *stl) { if (stl) { AB_VALUE_LIST *nl; AB_VALUE *e; nl=AB_Value_List_new(); e=AB_Value_List_First(stl); while(e) { AB_VALUE *ne; ne=AB_Value_dup(e); assert(ne); AB_Value_List_Add(ne, nl); e=AB_Value_List_Next(e); } /* while (e) */ return nl; } else return 0; } long int AB_Value_Num(const AB_VALUE *v) { assert(v); return mpz_get_si(mpq_numref(v->value)); } long int AB_Value_Denom(const AB_VALUE *v) { assert(v); return mpz_get_si(mpq_denref(v->value)); } void AB_Value_toHbciString(const AB_VALUE *v, GWEN_BUFFER *buf) { GWEN_BUFFER *tbuf; char *p; int l; tbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHumanReadableString2(v, tbuf, 2, 0); /* convert decimal komma */ p=GWEN_Buffer_GetStart(tbuf); while(*p) { if (*p=='.') { *p=','; break; } p++; } /* remove trailing zeroes */ p=GWEN_Buffer_GetStart(tbuf); l=strlen(GWEN_Buffer_GetStart(tbuf)); if (l>0 && strchr(p, ',')!=NULL) { l--; while(l>0 && p[l]=='0') { p[l]=0; l--; } } GWEN_Buffer_AppendString(buf, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } aqbanking-5.6.4beta/src/libs/aqbanking/types/cellphoneproduct.c0000644000175000017500000002161012372461742021603 00000000000000/* This file is auto-generated from "cellphoneproduct.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "cellphoneproduct_p.h" #include #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_CELLPHONE_PRODUCT, AB_CellPhoneProduct) GWEN_LIST2_FUNCTIONS(AB_CELLPHONE_PRODUCT, AB_CellPhoneProduct) AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_new(void) { AB_CELLPHONE_PRODUCT *st; GWEN_NEW_OBJECT(AB_CELLPHONE_PRODUCT, st) st->_usage=1; GWEN_LIST_INIT(AB_CELLPHONE_PRODUCT, st) st->values=AB_Value_List_new(); return st; } void AB_CellPhoneProduct_free(AB_CELLPHONE_PRODUCT *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->id) free(st->id); if (st->providerName) free(st->providerName); if (st->productName) free(st->productName); if (st->minimumValue) AB_Value_free(st->minimumValue); if (st->maximumValue) AB_Value_free(st->maximumValue); if (st->values) AB_Value_List_free(st->values); GWEN_LIST_FINI(AB_CELLPHONE_PRODUCT, st) GWEN_FREE_OBJECT(st); } } } AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_dup(const AB_CELLPHONE_PRODUCT *d) { AB_CELLPHONE_PRODUCT *st; assert(d); st=AB_CellPhoneProduct_new(); if (d->id) st->id=strdup(d->id); if (d->providerName) st->providerName=strdup(d->providerName); if (d->productName) st->productName=strdup(d->productName); st->allowFreeValue=d->allowFreeValue; if (d->minimumValue) st->minimumValue=AB_Value_dup(d->minimumValue); if (d->maximumValue) st->maximumValue=AB_Value_dup(d->maximumValue); if (d->values) st->values=AB_Value_List_dup(d->values); return st; } int AB_CellPhoneProduct_toDb(const AB_CELLPHONE_PRODUCT *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->id) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "id", st->id)) return -1; if (st->providerName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "providerName", st->providerName)) return -1; if (st->productName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "productName", st->productName)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "allowFreeValue", st->allowFreeValue)) return -1; if (st->minimumValue) if (AB_Value_toDb(st->minimumValue, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "minimumValue"))) return -1; if (st->maximumValue) if (AB_Value_toDb(st->maximumValue, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "maximumValue"))) return -1; if (st->values) if (1) { GWEN_DB_NODE *dbT; AB_VALUE *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_CREATE_GROUP, "values"); assert(dbT); e=AB_Value_List_First(st->values); while(e) { if (AB_Value_toDb(e, GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_CREATE_GROUP, "element"))) return -1; e=AB_Value_List_Next(e); } /* while */ } /* if (1) */ return 0; } int AB_CellPhoneProduct_ReadDb(AB_CELLPHONE_PRODUCT *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_CellPhoneProduct_SetId(st, GWEN_DB_GetCharValue(db, "id", 0, 0)); AB_CellPhoneProduct_SetProviderName(st, GWEN_DB_GetCharValue(db, "providerName", 0, 0)); AB_CellPhoneProduct_SetProductName(st, GWEN_DB_GetCharValue(db, "productName", 0, 0)); AB_CellPhoneProduct_SetAllowFreeValue(st, GWEN_DB_GetIntValue(db, "allowFreeValue", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "minimumValue"); if (dbT) { if (st->minimumValue) AB_Value_free(st->minimumValue); st->minimumValue=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "maximumValue"); if (dbT) { if (st->maximumValue) AB_Value_free(st->maximumValue); st->maximumValue=AB_Value_fromDb(dbT); } } st->values=AB_Value_List_new(); if (1) {/* just for local vars */ GWEN_DB_NODE *dbT; AB_VALUE *e; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "values"); if (dbT) { GWEN_DB_NODE *dbT2; dbT2=GWEN_DB_FindFirstGroup(dbT, "element"); while(dbT2) { e=AB_Value_fromDb(dbT2); if (!e) { DBG_ERROR(0, "Bad element for type \"AB_VALUE\""); if (GWEN_Logger_GetLevel(0)>=GWEN_LoggerLevel_Debug) GWEN_DB_Dump(dbT2, 2); AB_CellPhoneProduct_free(st); return 0; } AB_Value_List_Add(e, st->values); dbT2=GWEN_DB_FindNextGroup(dbT2, "element"); } /* while */ } /* if (dbT) */ } /* if (1) */ return 0; } AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_fromDb(GWEN_DB_NODE *db) { AB_CELLPHONE_PRODUCT *st; assert(db); st=AB_CellPhoneProduct_new(); AB_CellPhoneProduct_ReadDb(st, db); st->_modified=0; return st; } const char *AB_CellPhoneProduct_GetId(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->id; } void AB_CellPhoneProduct_SetId(AB_CELLPHONE_PRODUCT *st, const char *d) { assert(st); if (st->id) free(st->id); if (d && *d) st->id=strdup(d); else st->id=0; st->_modified=1; } const char *AB_CellPhoneProduct_GetProviderName(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->providerName; } void AB_CellPhoneProduct_SetProviderName(AB_CELLPHONE_PRODUCT *st, const char *d) { assert(st); if (st->providerName) free(st->providerName); if (d && *d) st->providerName=strdup(d); else st->providerName=0; st->_modified=1; } const char *AB_CellPhoneProduct_GetProductName(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->productName; } void AB_CellPhoneProduct_SetProductName(AB_CELLPHONE_PRODUCT *st, const char *d) { assert(st); if (st->productName) free(st->productName); if (d && *d) st->productName=strdup(d); else st->productName=0; st->_modified=1; } int AB_CellPhoneProduct_GetAllowFreeValue(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->allowFreeValue; } void AB_CellPhoneProduct_SetAllowFreeValue(AB_CELLPHONE_PRODUCT *st, int d) { assert(st); st->allowFreeValue=d; st->_modified=1; } const AB_VALUE *AB_CellPhoneProduct_GetMinimumValue(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->minimumValue; } void AB_CellPhoneProduct_SetMinimumValue(AB_CELLPHONE_PRODUCT *st, const AB_VALUE *d) { assert(st); if (st->minimumValue) AB_Value_free(st->minimumValue); if (d) st->minimumValue=AB_Value_dup(d); else st->minimumValue=0; st->_modified=1; } const AB_VALUE *AB_CellPhoneProduct_GetMaximumValue(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->maximumValue; } void AB_CellPhoneProduct_SetMaximumValue(AB_CELLPHONE_PRODUCT *st, const AB_VALUE *d) { assert(st); if (st->maximumValue) AB_Value_free(st->maximumValue); if (d) st->maximumValue=AB_Value_dup(d); else st->maximumValue=0; st->_modified=1; } AB_VALUE_LIST *AB_CellPhoneProduct_GetValues(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->values; } void AB_CellPhoneProduct_SetValues(AB_CELLPHONE_PRODUCT *st, AB_VALUE_LIST *d) { assert(st); if (st->values) AB_Value_List_free(st->values); if (d) { AB_VALUE *e; st->values=AB_Value_List_new(); e=AB_Value_List_First(d); while(e) { AB_VALUE *ne; ne=AB_Value_dup(e); assert(ne); AB_Value_List_Add(ne, st->values); e=AB_Value_List_Next(e); } /* while (e) */ } /* if LIST */ else st->values=0; st->_modified=1; } int AB_CellPhoneProduct_IsModified(const AB_CELLPHONE_PRODUCT *st) { assert(st); return st->_modified; } void AB_CellPhoneProduct_SetModified(AB_CELLPHONE_PRODUCT *st, int i) { assert(st); st->_modified=i; } void AB_CellPhoneProduct_Attach(AB_CELLPHONE_PRODUCT *st) { assert(st); st->_usage++; } AB_CELLPHONE_PRODUCT *AB_CellPhoneProduct_List2__freeAll_cb(AB_CELLPHONE_PRODUCT *st, void *user_data) { AB_CellPhoneProduct_free(st); return 0; } void AB_CellPhoneProduct_List2_freeAll(AB_CELLPHONE_PRODUCT_LIST2 *stl) { if (stl) { AB_CellPhoneProduct_List2_ForEach(stl, AB_CellPhoneProduct_List2__freeAll_cb, 0); AB_CellPhoneProduct_List2_free(stl); } } AB_CELLPHONE_PRODUCT_LIST *AB_CellPhoneProduct_List_dup(const AB_CELLPHONE_PRODUCT_LIST *stl) { if (stl) { AB_CELLPHONE_PRODUCT_LIST *nl; AB_CELLPHONE_PRODUCT *e; nl=AB_CellPhoneProduct_List_new(); e=AB_CellPhoneProduct_List_First(stl); while(e) { AB_CELLPHONE_PRODUCT *ne; ne=AB_CellPhoneProduct_dup(e); assert(ne); AB_CellPhoneProduct_List_Add(ne, nl); e=AB_CellPhoneProduct_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/eutransferinfo_p.h0000644000175000017500000000076712372461742021621 00000000000000/* This file is auto-generated from "eutransferinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef EUTRANSFERINFO_P_H #define EUTRANSFERINFO_P_H #include "eutransferinfo_l.h" struct AB_EUTRANSFER_INFO { GWEN_LIST_ELEMENT(AB_EUTRANSFER_INFO) int _usage; int _modified; char *countryCode; AB_TRANSACTION_LIMITS *fieldLimits; AB_VALUE *limitLocalValue; AB_VALUE *limitForeignValue; }; #endif /* EUTRANSFERINFO_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transaction_p.h0000644000175000017500000000726412372461741021112 00000000000000/* This file is auto-generated from "transaction.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef TRANSACTION_P_H #define TRANSACTION_P_H #include "transaction_l.h" struct AB_TRANSACTION { GWEN_INHERIT_ELEMENT(AB_TRANSACTION) GWEN_LIST_ELEMENT(AB_TRANSACTION) int _usage; int _modified; char *localCountry; char *localBankCode; char *localBranchId; char *localAccountNumber; char *localSuffix; char *localIban; char *localName; char *localBic; char *remoteCountry; char *remoteBankName; char *remoteBankLocation; char *remoteBankCode; char *remoteBranchId; char *remoteAccountNumber; char *remoteSuffix; char *remoteIban; GWEN_STRINGLIST *remoteName; char *remoteBic; uint32_t uniqueId; uint32_t idForApplication; uint32_t groupId; GWEN_TIME *valutaDate; GWEN_TIME *date; AB_VALUE *value; AB_VALUE *fees; int textKey; int textKeyExt; char *transactionKey; char *customerReference; char *bankReference; char *endToEndReference; char *originatorIdentifier; int transactionCode; char *transactionText; char *primanota; char *fiId; GWEN_STRINGLIST *purpose; GWEN_STRINGLIST *category; AB_TRANSACTION_PERIOD period; int cycle; int executionDay; GWEN_TIME *firstExecutionDate; GWEN_TIME *lastExecutionDate; GWEN_TIME *nextExecutionDate; AB_TRANSACTION_TYPE type; AB_TRANSACTION_SUBTYPE subType; AB_TRANSACTION_STATUS status; AB_TRANSACTION_CHARGE charge; char *remoteAddrStreet; char *remoteAddrZipcode; char *remoteAddrCity; char *remotePhone; char *unitId; char *unitIdNameSpace; AB_VALUE *units; AB_VALUE *unitPrice; AB_VALUE *commission; char *creditorSchemeId; char *mandateId; GWEN_DATE *mandateDate; char *mandateDebitorName; char *originalCreditorSchemeId; char *originalMandateId; char *originalCreditorName; AB_TRANSACTION_SEQUENCETYPE sequenceType; }; /** @name Local Account Info * This group contains information about the local account.*/ /*@{*/ /*@}*/ /** @name Remote Account Info * This group contains information about the remote account.*/ /*@{*/ /*@}*/ /** @name Dates */ /*@{*/ /*@}*/ /** @name Value * */ /*@{*/ /*@}*/ /** @name Info Which Is Not Supported by All Backends *

This group contains information which differ between backends.

Some of this information might not even besupportedby every backends.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Standing Orders *

This group contains information which is used with standing orders. It is not needed for other usage of this type.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Transfers *

This group contains information which is used with all kinds of transfers. It is setup by the function @ref AB_Banking_GatherResponses for transfers but not used by AqBanking otherwise.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Foreign Transfers *

This group contains information which is used with transfers to other countries in the world. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ /** @name Additional Information for Investment Transfers *

This group contains information which is used with investment/stock transfers. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ /** @name Additional Information for SEPA Direct Debits *

This group contains information which is used with SEPA transfers within the European Community. It is used by backends and applications but not by AqBanking itself.

*/ /*@{*/ /*@}*/ #endif /* TRANSACTION_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/transaction.c0000644000175000017500000016434412372461742020572 00000000000000/* This file is auto-generated from "transaction.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "transaction_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include GWEN_INHERIT_FUNCTIONS(AB_TRANSACTION) GWEN_LIST_FUNCTIONS(AB_TRANSACTION, AB_Transaction) GWEN_LIST2_FUNCTIONS(AB_TRANSACTION, AB_Transaction) AB_TRANSACTION_PERIOD AB_Transaction_Period_fromString(const char *s) { if (s) { if (strcasecmp(s, "none")==0) return AB_Transaction_PeriodNone; else if (strcasecmp(s, "monthly")==0) return AB_Transaction_PeriodMonthly; else if (strcasecmp(s, "weekly")==0) return AB_Transaction_PeriodWeekly; } return AB_Transaction_PeriodUnknown; } const char *AB_Transaction_Period_toString(AB_TRANSACTION_PERIOD v) { switch(v) { case AB_Transaction_PeriodNone: return "none"; case AB_Transaction_PeriodMonthly: return "monthly"; case AB_Transaction_PeriodWeekly: return "weekly"; default: return "unknown"; } /* switch */ } AB_TRANSACTION_TYPE AB_Transaction_Type_fromString(const char *s) { if (s) { if (strcasecmp(s, "transaction")==0) return AB_Transaction_TypeTransaction; else if (strcasecmp(s, "transfer")==0) return AB_Transaction_TypeTransfer; else if (strcasecmp(s, "debitNote")==0) return AB_Transaction_TypeDebitNote; else if (strcasecmp(s, "euTransfer")==0) return AB_Transaction_TypeEuTransfer; else if (strcasecmp(s, "sepaTransfer")==0) return AB_Transaction_TypeSepaTransfer; else if (strcasecmp(s, "sepaDebitNote")==0) return AB_Transaction_TypeSepaDebitNote; else if (strcasecmp(s, "internalTransfer")==0) return AB_Transaction_TypeInternalTransfer; } return AB_Transaction_TypeUnknown; } const char *AB_Transaction_Type_toString(AB_TRANSACTION_TYPE v) { switch(v) { case AB_Transaction_TypeTransaction: return "transaction"; case AB_Transaction_TypeTransfer: return "transfer"; case AB_Transaction_TypeDebitNote: return "debitNote"; case AB_Transaction_TypeEuTransfer: return "euTransfer"; case AB_Transaction_TypeSepaTransfer: return "sepaTransfer"; case AB_Transaction_TypeSepaDebitNote: return "sepaDebitNote"; case AB_Transaction_TypeInternalTransfer: return "internalTransfer"; default: return "unknown"; } /* switch */ } AB_TRANSACTION_SUBTYPE AB_Transaction_SubType_fromString(const char *s) { if (s) { if (strcasecmp(s, "none")==0) return AB_Transaction_SubTypeNone; else if (strcasecmp(s, "standard")==0) return AB_Transaction_SubTypeStandard; else if (strcasecmp(s, "check")==0) return AB_Transaction_SubTypeCheck; else if (strcasecmp(s, "bookedDebitNote")==0) return AB_Transaction_SubTypeBookedDebitNote; else if (strcasecmp(s, "drawnDebitNote")==0) return AB_Transaction_SubTypeDrawnDebitNote; else if (strcasecmp(s, "standingOrder")==0) return AB_Transaction_SubTypeStandingOrder; else if (strcasecmp(s, "loan")==0) return AB_Transaction_SubTypeLoan; else if (strcasecmp(s, "euStandard")==0) return AB_Transaction_SubTypeEuStandard; else if (strcasecmp(s, "euASAP")==0) return AB_Transaction_SubTypeEuASAP; else if (strcasecmp(s, "buy")==0) return AB_Transaction_SubTypeBuy; else if (strcasecmp(s, "sell")==0) return AB_Transaction_SubTypeSell; else if (strcasecmp(s, "reinvest")==0) return AB_Transaction_SubTypeReinvest; else if (strcasecmp(s, "dividend")==0) return AB_Transaction_SubTypeDividend; } return AB_Transaction_SubTypeUnknown; } const char *AB_Transaction_SubType_toString(AB_TRANSACTION_SUBTYPE v) { switch(v) { case AB_Transaction_SubTypeNone: return "none"; case AB_Transaction_SubTypeStandard: return "standard"; case AB_Transaction_SubTypeCheck: return "check"; case AB_Transaction_SubTypeBookedDebitNote: return "bookedDebitNote"; case AB_Transaction_SubTypeDrawnDebitNote: return "drawnDebitNote"; case AB_Transaction_SubTypeStandingOrder: return "standingOrder"; case AB_Transaction_SubTypeLoan: return "loan"; case AB_Transaction_SubTypeEuStandard: return "euStandard"; case AB_Transaction_SubTypeEuASAP: return "euASAP"; case AB_Transaction_SubTypeBuy: return "buy"; case AB_Transaction_SubTypeSell: return "sell"; case AB_Transaction_SubTypeReinvest: return "reinvest"; case AB_Transaction_SubTypeDividend: return "dividend"; default: return "unknown"; } /* switch */ } AB_TRANSACTION_STATUS AB_Transaction_Status_fromString(const char *s) { if (s) { if (strcasecmp(s, "none")==0) return AB_Transaction_StatusNone; else if (strcasecmp(s, "accepted")==0) return AB_Transaction_StatusAccepted; else if (strcasecmp(s, "rejected")==0) return AB_Transaction_StatusRejected; else if (strcasecmp(s, "pending")==0) return AB_Transaction_StatusPending; else if (strcasecmp(s, "sending")==0) return AB_Transaction_StatusSending; else if (strcasecmp(s, "autoReconciled")==0) return AB_Transaction_StatusAutoReconciled; else if (strcasecmp(s, "manuallyReconciled")==0) return AB_Transaction_StatusManuallyReconciled; else if (strcasecmp(s, "revoked")==0) return AB_Transaction_StatusRevoked; else if (strcasecmp(s, "aborted")==0) return AB_Transaction_StatusAborted; } return AB_Transaction_StatusUnknown; } const char *AB_Transaction_Status_toString(AB_TRANSACTION_STATUS v) { switch(v) { case AB_Transaction_StatusNone: return "none"; case AB_Transaction_StatusAccepted: return "accepted"; case AB_Transaction_StatusRejected: return "rejected"; case AB_Transaction_StatusPending: return "pending"; case AB_Transaction_StatusSending: return "sending"; case AB_Transaction_StatusAutoReconciled: return "autoReconciled"; case AB_Transaction_StatusManuallyReconciled: return "manuallyReconciled"; case AB_Transaction_StatusRevoked: return "revoked"; case AB_Transaction_StatusAborted: return "aborted"; default: return "unknown"; } /* switch */ } AB_TRANSACTION_CHARGE AB_Transaction_Charge_fromString(const char *s) { if (s) { if (strcasecmp(s, "Nobody")==0) return AB_Transaction_ChargeNobody; else if (strcasecmp(s, "local")==0) return AB_Transaction_ChargeLocal; else if (strcasecmp(s, "remote")==0) return AB_Transaction_ChargeRemote; else if (strcasecmp(s, "share")==0) return AB_Transaction_ChargeShare; } return AB_Transaction_ChargeUnknown; } const char *AB_Transaction_Charge_toString(AB_TRANSACTION_CHARGE v) { switch(v) { case AB_Transaction_ChargeNobody: return "Nobody"; case AB_Transaction_ChargeLocal: return "local"; case AB_Transaction_ChargeRemote: return "remote"; case AB_Transaction_ChargeShare: return "share"; default: return "unknown"; } /* switch */ } AB_TRANSACTION_SEQUENCETYPE AB_Transaction_SequenceType_fromString(const char *s) { if (s) { if (strcasecmp(s, "once")==0) return AB_Transaction_SequenceTypeOnce; else if (strcasecmp(s, "first")==0) return AB_Transaction_SequenceTypeFirst; else if (strcasecmp(s, "following")==0) return AB_Transaction_SequenceTypeFollowing; else if (strcasecmp(s, "final")==0) return AB_Transaction_SequenceTypeFinal; } return AB_Transaction_SequenceTypeUnknown; } const char *AB_Transaction_SequenceType_toString(AB_TRANSACTION_SEQUENCETYPE v) { switch(v) { case AB_Transaction_SequenceTypeOnce: return "once"; case AB_Transaction_SequenceTypeFirst: return "first"; case AB_Transaction_SequenceTypeFollowing: return "following"; case AB_Transaction_SequenceTypeFinal: return "final"; default: return "unknown"; } /* switch */ } AB_TRANSACTION *AB_Transaction_new(void) { AB_TRANSACTION *st; GWEN_NEW_OBJECT(AB_TRANSACTION, st) st->_usage=1; GWEN_INHERIT_INIT(AB_TRANSACTION, st) GWEN_LIST_INIT(AB_TRANSACTION, st) st->remoteName=GWEN_StringList_new(); st->purpose=GWEN_StringList_new(); st->category=GWEN_StringList_new(); return st; } void AB_Transaction_free(AB_TRANSACTION *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { GWEN_INHERIT_FINI(AB_TRANSACTION, st) if (st->localCountry) free(st->localCountry); if (st->localBankCode) free(st->localBankCode); if (st->localBranchId) free(st->localBranchId); if (st->localAccountNumber) free(st->localAccountNumber); if (st->localSuffix) free(st->localSuffix); if (st->localIban) free(st->localIban); if (st->localName) free(st->localName); if (st->localBic) free(st->localBic); if (st->remoteCountry) free(st->remoteCountry); if (st->remoteBankName) free(st->remoteBankName); if (st->remoteBankLocation) free(st->remoteBankLocation); if (st->remoteBankCode) free(st->remoteBankCode); if (st->remoteBranchId) free(st->remoteBranchId); if (st->remoteAccountNumber) free(st->remoteAccountNumber); if (st->remoteSuffix) free(st->remoteSuffix); if (st->remoteIban) free(st->remoteIban); if (st->remoteName) GWEN_StringList_free(st->remoteName); if (st->remoteBic) free(st->remoteBic); if (st->valutaDate) GWEN_Time_free(st->valutaDate); if (st->date) GWEN_Time_free(st->date); if (st->value) AB_Value_free(st->value); if (st->fees) AB_Value_free(st->fees); if (st->transactionKey) free(st->transactionKey); if (st->customerReference) free(st->customerReference); if (st->bankReference) free(st->bankReference); if (st->endToEndReference) free(st->endToEndReference); if (st->originatorIdentifier) free(st->originatorIdentifier); if (st->transactionText) free(st->transactionText); if (st->primanota) free(st->primanota); if (st->fiId) free(st->fiId); if (st->purpose) GWEN_StringList_free(st->purpose); if (st->category) GWEN_StringList_free(st->category); if (st->firstExecutionDate) GWEN_Time_free(st->firstExecutionDate); if (st->lastExecutionDate) GWEN_Time_free(st->lastExecutionDate); if (st->nextExecutionDate) GWEN_Time_free(st->nextExecutionDate); if (st->remoteAddrStreet) free(st->remoteAddrStreet); if (st->remoteAddrZipcode) free(st->remoteAddrZipcode); if (st->remoteAddrCity) free(st->remoteAddrCity); if (st->remotePhone) free(st->remotePhone); if (st->unitId) free(st->unitId); if (st->unitIdNameSpace) free(st->unitIdNameSpace); if (st->units) AB_Value_free(st->units); if (st->unitPrice) AB_Value_free(st->unitPrice); if (st->commission) AB_Value_free(st->commission); if (st->creditorSchemeId) free(st->creditorSchemeId); if (st->mandateId) free(st->mandateId); if (st->mandateDate) GWEN_Date_free(st->mandateDate); if (st->mandateDebitorName) free(st->mandateDebitorName); if (st->originalCreditorSchemeId) free(st->originalCreditorSchemeId); if (st->originalMandateId) free(st->originalMandateId); if (st->originalCreditorName) free(st->originalCreditorName); GWEN_LIST_FINI(AB_TRANSACTION, st) GWEN_FREE_OBJECT(st); } } } AB_TRANSACTION *AB_Transaction_dup(const AB_TRANSACTION *d) { AB_TRANSACTION *st; assert(d); st=AB_Transaction_new(); if (d->localCountry) st->localCountry=strdup(d->localCountry); if (d->localBankCode) st->localBankCode=strdup(d->localBankCode); if (d->localBranchId) st->localBranchId=strdup(d->localBranchId); if (d->localAccountNumber) st->localAccountNumber=strdup(d->localAccountNumber); if (d->localSuffix) st->localSuffix=strdup(d->localSuffix); if (d->localIban) st->localIban=strdup(d->localIban); if (d->localName) st->localName=strdup(d->localName); if (d->localBic) st->localBic=strdup(d->localBic); if (d->remoteCountry) st->remoteCountry=strdup(d->remoteCountry); if (d->remoteBankName) st->remoteBankName=strdup(d->remoteBankName); if (d->remoteBankLocation) st->remoteBankLocation=strdup(d->remoteBankLocation); if (d->remoteBankCode) st->remoteBankCode=strdup(d->remoteBankCode); if (d->remoteBranchId) st->remoteBranchId=strdup(d->remoteBranchId); if (d->remoteAccountNumber) st->remoteAccountNumber=strdup(d->remoteAccountNumber); if (d->remoteSuffix) st->remoteSuffix=strdup(d->remoteSuffix); if (d->remoteIban) st->remoteIban=strdup(d->remoteIban); if (d->remoteName) st->remoteName=GWEN_StringList_dup(d->remoteName); if (d->remoteBic) st->remoteBic=strdup(d->remoteBic); st->uniqueId=d->uniqueId; st->idForApplication=d->idForApplication; st->groupId=d->groupId; if (d->valutaDate) st->valutaDate=GWEN_Time_dup(d->valutaDate); if (d->date) st->date=GWEN_Time_dup(d->date); if (d->value) st->value=AB_Value_dup(d->value); if (d->fees) st->fees=AB_Value_dup(d->fees); st->textKey=d->textKey; st->textKeyExt=d->textKeyExt; if (d->transactionKey) st->transactionKey=strdup(d->transactionKey); if (d->customerReference) st->customerReference=strdup(d->customerReference); if (d->bankReference) st->bankReference=strdup(d->bankReference); if (d->endToEndReference) st->endToEndReference=strdup(d->endToEndReference); if (d->originatorIdentifier) st->originatorIdentifier=strdup(d->originatorIdentifier); st->transactionCode=d->transactionCode; if (d->transactionText) st->transactionText=strdup(d->transactionText); if (d->primanota) st->primanota=strdup(d->primanota); if (d->fiId) st->fiId=strdup(d->fiId); if (d->purpose) st->purpose=GWEN_StringList_dup(d->purpose); if (d->category) st->category=GWEN_StringList_dup(d->category); st->period=d->period; st->cycle=d->cycle; st->executionDay=d->executionDay; if (d->firstExecutionDate) st->firstExecutionDate=GWEN_Time_dup(d->firstExecutionDate); if (d->lastExecutionDate) st->lastExecutionDate=GWEN_Time_dup(d->lastExecutionDate); if (d->nextExecutionDate) st->nextExecutionDate=GWEN_Time_dup(d->nextExecutionDate); st->type=d->type; st->subType=d->subType; st->status=d->status; st->charge=d->charge; if (d->remoteAddrStreet) st->remoteAddrStreet=strdup(d->remoteAddrStreet); if (d->remoteAddrZipcode) st->remoteAddrZipcode=strdup(d->remoteAddrZipcode); if (d->remoteAddrCity) st->remoteAddrCity=strdup(d->remoteAddrCity); if (d->remotePhone) st->remotePhone=strdup(d->remotePhone); if (d->unitId) st->unitId=strdup(d->unitId); if (d->unitIdNameSpace) st->unitIdNameSpace=strdup(d->unitIdNameSpace); if (d->units) st->units=AB_Value_dup(d->units); if (d->unitPrice) st->unitPrice=AB_Value_dup(d->unitPrice); if (d->commission) st->commission=AB_Value_dup(d->commission); if (d->creditorSchemeId) st->creditorSchemeId=strdup(d->creditorSchemeId); if (d->mandateId) st->mandateId=strdup(d->mandateId); if (d->mandateDate) st->mandateDate=GWEN_Date_dup(d->mandateDate); if (d->mandateDebitorName) st->mandateDebitorName=strdup(d->mandateDebitorName); if (d->originalCreditorSchemeId) st->originalCreditorSchemeId=strdup(d->originalCreditorSchemeId); if (d->originalMandateId) st->originalMandateId=strdup(d->originalMandateId); if (d->originalCreditorName) st->originalCreditorName=strdup(d->originalCreditorName); st->sequenceType=d->sequenceType; return st; } int AB_Transaction_toDb(const AB_TRANSACTION *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->localCountry) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localCountry", st->localCountry)) return -1; if (st->localBankCode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localBankCode", st->localBankCode)) return -1; if (st->localBranchId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localBranchId", st->localBranchId)) return -1; if (st->localAccountNumber) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localAccountNumber", st->localAccountNumber)) return -1; if (st->localSuffix) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localSuffix", st->localSuffix)) return -1; if (st->localIban) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localIban", st->localIban)) return -1; if (st->localName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localName", st->localName)) return -1; if (st->localBic) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "localBic", st->localBic)) return -1; if (st->remoteCountry) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteCountry", st->remoteCountry)) return -1; if (st->remoteBankName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBankName", st->remoteBankName)) return -1; if (st->remoteBankLocation) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBankLocation", st->remoteBankLocation)) return -1; if (st->remoteBankCode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBankCode", st->remoteBankCode)) return -1; if (st->remoteBranchId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBranchId", st->remoteBranchId)) return -1; if (st->remoteAccountNumber) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteAccountNumber", st->remoteAccountNumber)) return -1; if (st->remoteSuffix) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteSuffix", st->remoteSuffix)) return -1; if (st->remoteIban) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteIban", st->remoteIban)) return -1; if (st->remoteName) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "remoteName"); se=GWEN_StringList_FirstEntry(st->remoteName); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "remoteName", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->remoteBic) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteBic", st->remoteBic)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", st->uniqueId)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "idForApplication", st->idForApplication)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "groupId", st->groupId)) return -1; if (st->valutaDate) if (GWEN_Time_toDb(st->valutaDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "valutaDate"))) return -1; if (st->date) if (GWEN_Time_toDb(st->date, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "date"))) return -1; if (st->value) if (AB_Value_toDb(st->value, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "value"))) return -1; if (st->fees) if (AB_Value_toDb(st->fees, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "fees"))) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "textKey", st->textKey)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "textKeyExt", st->textKeyExt)) return -1; if (st->transactionKey) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "transactionKey", st->transactionKey)) return -1; if (st->customerReference) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "customerReference", st->customerReference)) return -1; if (st->bankReference) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "bankReference", st->bankReference)) return -1; if (st->endToEndReference) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "endToEndReference", st->endToEndReference)) return -1; if (st->originatorIdentifier) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "originatorIdentifier", st->originatorIdentifier)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "transactionCode", st->transactionCode)) return -1; if (st->transactionText) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "transactionText", st->transactionText)) return -1; if (st->primanota) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "primanota", st->primanota)) return -1; if (st->fiId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "fiId", st->fiId)) return -1; if (st->purpose) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "purpose"); se=GWEN_StringList_FirstEntry(st->purpose); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "purpose", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (st->category) { GWEN_STRINGLISTENTRY *se; GWEN_DB_DeleteVar(db, "category"); se=GWEN_StringList_FirstEntry(st->category); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); assert(s); if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_DEFAULT, "category", s)) return -1; se=GWEN_StringListEntry_Next(se); } /* while */ } if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "period", AB_Transaction_Period_toString(st->period))) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "cycle", st->cycle)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "executionDay", st->executionDay)) return -1; if (st->firstExecutionDate) if (GWEN_Time_toDb(st->firstExecutionDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "firstExecutionDate"))) return -1; if (st->lastExecutionDate) if (GWEN_Time_toDb(st->lastExecutionDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "lastExecutionDate"))) return -1; if (st->nextExecutionDate) if (GWEN_Time_toDb(st->nextExecutionDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "nextExecutionDate"))) return -1; if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", AB_Transaction_Type_toString(st->type))) return -1; if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "subType", AB_Transaction_SubType_toString(st->subType))) return -1; if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "status", AB_Transaction_Status_toString(st->status))) return -1; if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "charge", AB_Transaction_Charge_toString(st->charge))) return -1; if (st->remoteAddrStreet) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteAddrStreet", st->remoteAddrStreet)) return -1; if (st->remoteAddrZipcode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteAddrZipcode", st->remoteAddrZipcode)) return -1; if (st->remoteAddrCity) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remoteAddrCity", st->remoteAddrCity)) return -1; if (st->remotePhone) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "remotePhone", st->remotePhone)) return -1; if (st->unitId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "unitId", st->unitId)) return -1; if (st->unitIdNameSpace) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "unitIdNameSpace", st->unitIdNameSpace)) return -1; if (st->units) if (AB_Value_toDb(st->units, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "units"))) return -1; if (st->unitPrice) if (AB_Value_toDb(st->unitPrice, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "unitPrice"))) return -1; if (st->commission) if (AB_Value_toDb(st->commission, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "commission"))) return -1; if (st->creditorSchemeId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "creditorSchemeId", st->creditorSchemeId)) return -1; if (st->mandateId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "mandateId", st->mandateId)) return -1; if (st->mandateDate) if (GWEN_Date_toDb(st->mandateDate, GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "mandateDate"))) return -1; if (st->mandateDebitorName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "mandateDebitorName", st->mandateDebitorName)) return -1; if (st->originalCreditorSchemeId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "originalCreditorSchemeId", st->originalCreditorSchemeId)) return -1; if (st->originalMandateId) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "originalMandateId", st->originalMandateId)) return -1; if (st->originalCreditorName) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "originalCreditorName", st->originalCreditorName)) return -1; if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "sequenceType", AB_Transaction_SequenceType_toString(st->sequenceType))) return -1; return 0; } int AB_Transaction_ReadDb(AB_TRANSACTION *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_Transaction_SetLocalCountry(st, GWEN_DB_GetCharValue(db, "localCountry", 0, 0)); AB_Transaction_SetLocalBankCode(st, GWEN_DB_GetCharValue(db, "localBankCode", 0, 0)); AB_Transaction_SetLocalBranchId(st, GWEN_DB_GetCharValue(db, "localBranchId", 0, 0)); AB_Transaction_SetLocalAccountNumber(st, GWEN_DB_GetCharValue(db, "localAccountNumber", 0, 0)); AB_Transaction_SetLocalSuffix(st, GWEN_DB_GetCharValue(db, "localSuffix", 0, 0)); AB_Transaction_SetLocalIban(st, GWEN_DB_GetCharValue(db, "localIban", 0, 0)); AB_Transaction_SetLocalName(st, GWEN_DB_GetCharValue(db, "localName", 0, 0)); AB_Transaction_SetLocalBic(st, GWEN_DB_GetCharValue(db, "localBic", 0, 0)); AB_Transaction_SetRemoteCountry(st, GWEN_DB_GetCharValue(db, "remoteCountry", 0, 0)); AB_Transaction_SetRemoteBankName(st, GWEN_DB_GetCharValue(db, "remoteBankName", 0, 0)); AB_Transaction_SetRemoteBankLocation(st, GWEN_DB_GetCharValue(db, "remoteBankLocation", 0, 0)); AB_Transaction_SetRemoteBankCode(st, GWEN_DB_GetCharValue(db, "remoteBankCode", 0, 0)); AB_Transaction_SetRemoteBranchId(st, GWEN_DB_GetCharValue(db, "remoteBranchId", 0, 0)); AB_Transaction_SetRemoteAccountNumber(st, GWEN_DB_GetCharValue(db, "remoteAccountNumber", 0, 0)); AB_Transaction_SetRemoteSuffix(st, GWEN_DB_GetCharValue(db, "remoteSuffix", 0, 0)); AB_Transaction_SetRemoteIban(st, GWEN_DB_GetCharValue(db, "remoteIban", 0, 0)); if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "remoteName", i, 0); if (!s) break; AB_Transaction_AddRemoteName(st, s, 0); } /* for */ } AB_Transaction_SetRemoteBic(st, GWEN_DB_GetCharValue(db, "remoteBic", 0, 0)); AB_Transaction_SetUniqueId(st, GWEN_DB_GetIntValue(db, "uniqueId", 0, 0)); AB_Transaction_SetIdForApplication(st, GWEN_DB_GetIntValue(db, "idForApplication", 0, 0)); AB_Transaction_SetGroupId(st, GWEN_DB_GetIntValue(db, "groupId", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "valutaDate"); if (dbT) { if (st->valutaDate) GWEN_Time_free(st->valutaDate); st->valutaDate=GWEN_Time_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); if (dbT) { if (st->date) GWEN_Time_free(st->date); st->date=GWEN_Time_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbT) { if (st->value) AB_Value_free(st->value); st->value=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "fees"); if (dbT) { if (st->fees) AB_Value_free(st->fees); st->fees=AB_Value_fromDb(dbT); } } AB_Transaction_SetTextKey(st, GWEN_DB_GetIntValue(db, "textKey", 0, 0)); AB_Transaction_SetTextKeyExt(st, GWEN_DB_GetIntValue(db, "textKeyExt", 0, 0)); AB_Transaction_SetTransactionKey(st, GWEN_DB_GetCharValue(db, "transactionKey", 0, 0)); AB_Transaction_SetCustomerReference(st, GWEN_DB_GetCharValue(db, "customerReference", 0, 0)); AB_Transaction_SetBankReference(st, GWEN_DB_GetCharValue(db, "bankReference", 0, 0)); AB_Transaction_SetEndToEndReference(st, GWEN_DB_GetCharValue(db, "endToEndReference", 0, 0)); AB_Transaction_SetOriginatorIdentifier(st, GWEN_DB_GetCharValue(db, "originatorIdentifier", 0, 0)); AB_Transaction_SetTransactionCode(st, GWEN_DB_GetIntValue(db, "transactionCode", 0, 0)); AB_Transaction_SetTransactionText(st, GWEN_DB_GetCharValue(db, "transactionText", 0, 0)); AB_Transaction_SetPrimanota(st, GWEN_DB_GetCharValue(db, "primanota", 0, 0)); AB_Transaction_SetFiId(st, GWEN_DB_GetCharValue(db, "fiId", 0, 0)); if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "purpose", i, 0); if (!s) break; AB_Transaction_AddPurpose(st, s, 0); } /* for */ } if (1) { int i; for (i=0; ; i++) { const char *s; s=GWEN_DB_GetCharValue(db, "category", i, 0); if (!s) break; AB_Transaction_AddCategory(st, s, 0); } /* for */ } AB_Transaction_SetPeriod(st, AB_Transaction_Period_fromString(GWEN_DB_GetCharValue(db, "period", 0, 0))); AB_Transaction_SetCycle(st, GWEN_DB_GetIntValue(db, "cycle", 0, 0)); AB_Transaction_SetExecutionDay(st, GWEN_DB_GetIntValue(db, "executionDay", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "firstExecutionDate"); if (dbT) { if (st->firstExecutionDate) GWEN_Time_free(st->firstExecutionDate); st->firstExecutionDate=GWEN_Time_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "lastExecutionDate"); if (dbT) { if (st->lastExecutionDate) GWEN_Time_free(st->lastExecutionDate); st->lastExecutionDate=GWEN_Time_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "nextExecutionDate"); if (dbT) { if (st->nextExecutionDate) GWEN_Time_free(st->nextExecutionDate); st->nextExecutionDate=GWEN_Time_fromDb(dbT); } } AB_Transaction_SetType(st, AB_Transaction_Type_fromString(GWEN_DB_GetCharValue(db, "type", 0, 0))); AB_Transaction_SetSubType(st, AB_Transaction_SubType_fromString(GWEN_DB_GetCharValue(db, "subType", 0, 0))); AB_Transaction_SetStatus(st, AB_Transaction_Status_fromString(GWEN_DB_GetCharValue(db, "status", 0, 0))); AB_Transaction_SetCharge(st, AB_Transaction_Charge_fromString(GWEN_DB_GetCharValue(db, "charge", 0, 0))); AB_Transaction_SetRemoteAddrStreet(st, GWEN_DB_GetCharValue(db, "remoteAddrStreet", 0, 0)); AB_Transaction_SetRemoteAddrZipcode(st, GWEN_DB_GetCharValue(db, "remoteAddrZipcode", 0, 0)); AB_Transaction_SetRemoteAddrCity(st, GWEN_DB_GetCharValue(db, "remoteAddrCity", 0, 0)); AB_Transaction_SetRemotePhone(st, GWEN_DB_GetCharValue(db, "remotePhone", 0, 0)); AB_Transaction_SetUnitId(st, GWEN_DB_GetCharValue(db, "unitId", 0, 0)); AB_Transaction_SetUnitIdNameSpace(st, GWEN_DB_GetCharValue(db, "unitIdNameSpace", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "units"); if (dbT) { if (st->units) AB_Value_free(st->units); st->units=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "unitPrice"); if (dbT) { if (st->unitPrice) AB_Value_free(st->unitPrice); st->unitPrice=AB_Value_fromDb(dbT); } } if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "commission"); if (dbT) { if (st->commission) AB_Value_free(st->commission); st->commission=AB_Value_fromDb(dbT); } } AB_Transaction_SetCreditorSchemeId(st, GWEN_DB_GetCharValue(db, "creditorSchemeId", 0, 0)); AB_Transaction_SetMandateId(st, GWEN_DB_GetCharValue(db, "mandateId", 0, 0)); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "mandateDate"); if (dbT) { if (st->mandateDate) GWEN_Date_free(st->mandateDate); st->mandateDate=GWEN_Date_fromDb(dbT); } } AB_Transaction_SetMandateDebitorName(st, GWEN_DB_GetCharValue(db, "mandateDebitorName", 0, 0)); AB_Transaction_SetOriginalCreditorSchemeId(st, GWEN_DB_GetCharValue(db, "originalCreditorSchemeId", 0, 0)); AB_Transaction_SetOriginalMandateId(st, GWEN_DB_GetCharValue(db, "originalMandateId", 0, 0)); AB_Transaction_SetOriginalCreditorName(st, GWEN_DB_GetCharValue(db, "originalCreditorName", 0, 0)); AB_Transaction_SetSequenceType(st, AB_Transaction_SequenceType_fromString(GWEN_DB_GetCharValue(db, "sequenceType", 0, 0))); return 0; } AB_TRANSACTION *AB_Transaction_fromDb(GWEN_DB_NODE *db) { AB_TRANSACTION *st; assert(db); st=AB_Transaction_new(); AB_Transaction_ReadDb(st, db); st->_modified=0; return st; } const char *AB_Transaction_GetLocalCountry(const AB_TRANSACTION *st) { assert(st); return st->localCountry; } void AB_Transaction_SetLocalCountry(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localCountry) free(st->localCountry); if (d && *d) st->localCountry=strdup(d); else st->localCountry=0; st->_modified=1; } const char *AB_Transaction_GetLocalBankCode(const AB_TRANSACTION *st) { assert(st); return st->localBankCode; } void AB_Transaction_SetLocalBankCode(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localBankCode) free(st->localBankCode); if (d && *d) st->localBankCode=strdup(d); else st->localBankCode=0; st->_modified=1; } const char *AB_Transaction_GetLocalBranchId(const AB_TRANSACTION *st) { assert(st); return st->localBranchId; } void AB_Transaction_SetLocalBranchId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localBranchId) free(st->localBranchId); if (d && *d) st->localBranchId=strdup(d); else st->localBranchId=0; st->_modified=1; } const char *AB_Transaction_GetLocalAccountNumber(const AB_TRANSACTION *st) { assert(st); return st->localAccountNumber; } void AB_Transaction_SetLocalAccountNumber(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localAccountNumber) free(st->localAccountNumber); if (d && *d) st->localAccountNumber=strdup(d); else st->localAccountNumber=0; st->_modified=1; } const char *AB_Transaction_GetLocalSuffix(const AB_TRANSACTION *st) { assert(st); return st->localSuffix; } void AB_Transaction_SetLocalSuffix(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localSuffix) free(st->localSuffix); if (d && *d) st->localSuffix=strdup(d); else st->localSuffix=0; st->_modified=1; } const char *AB_Transaction_GetLocalIban(const AB_TRANSACTION *st) { assert(st); return st->localIban; } void AB_Transaction_SetLocalIban(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localIban) free(st->localIban); if (d && *d) st->localIban=strdup(d); else st->localIban=0; st->_modified=1; } const char *AB_Transaction_GetLocalName(const AB_TRANSACTION *st) { assert(st); return st->localName; } void AB_Transaction_SetLocalName(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localName) free(st->localName); if (d && *d) st->localName=strdup(d); else st->localName=0; st->_modified=1; } const char *AB_Transaction_GetLocalBic(const AB_TRANSACTION *st) { assert(st); return st->localBic; } void AB_Transaction_SetLocalBic(AB_TRANSACTION *st, const char *d) { assert(st); if (st->localBic) free(st->localBic); if (d && *d) st->localBic=strdup(d); else st->localBic=0; st->_modified=1; } const char *AB_Transaction_GetRemoteCountry(const AB_TRANSACTION *st) { assert(st); return st->remoteCountry; } void AB_Transaction_SetRemoteCountry(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteCountry) free(st->remoteCountry); if (d && *d) st->remoteCountry=strdup(d); else st->remoteCountry=0; st->_modified=1; } const char *AB_Transaction_GetRemoteBankName(const AB_TRANSACTION *st) { assert(st); return st->remoteBankName; } void AB_Transaction_SetRemoteBankName(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteBankName) free(st->remoteBankName); if (d && *d) st->remoteBankName=strdup(d); else st->remoteBankName=0; st->_modified=1; } const char *AB_Transaction_GetRemoteBankLocation(const AB_TRANSACTION *st) { assert(st); return st->remoteBankLocation; } void AB_Transaction_SetRemoteBankLocation(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteBankLocation) free(st->remoteBankLocation); if (d && *d) st->remoteBankLocation=strdup(d); else st->remoteBankLocation=0; st->_modified=1; } const char *AB_Transaction_GetRemoteBankCode(const AB_TRANSACTION *st) { assert(st); return st->remoteBankCode; } void AB_Transaction_SetRemoteBankCode(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteBankCode) free(st->remoteBankCode); if (d && *d) st->remoteBankCode=strdup(d); else st->remoteBankCode=0; st->_modified=1; } const char *AB_Transaction_GetRemoteBranchId(const AB_TRANSACTION *st) { assert(st); return st->remoteBranchId; } void AB_Transaction_SetRemoteBranchId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteBranchId) free(st->remoteBranchId); if (d && *d) st->remoteBranchId=strdup(d); else st->remoteBranchId=0; st->_modified=1; } const char *AB_Transaction_GetRemoteAccountNumber(const AB_TRANSACTION *st) { assert(st); return st->remoteAccountNumber; } void AB_Transaction_SetRemoteAccountNumber(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteAccountNumber) free(st->remoteAccountNumber); if (d && *d) st->remoteAccountNumber=strdup(d); else st->remoteAccountNumber=0; st->_modified=1; } const char *AB_Transaction_GetRemoteSuffix(const AB_TRANSACTION *st) { assert(st); return st->remoteSuffix; } void AB_Transaction_SetRemoteSuffix(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteSuffix) free(st->remoteSuffix); if (d && *d) st->remoteSuffix=strdup(d); else st->remoteSuffix=0; st->_modified=1; } const char *AB_Transaction_GetRemoteIban(const AB_TRANSACTION *st) { assert(st); return st->remoteIban; } void AB_Transaction_SetRemoteIban(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteIban) free(st->remoteIban); if (d && *d) st->remoteIban=strdup(d); else st->remoteIban=0; st->_modified=1; } const GWEN_STRINGLIST *AB_Transaction_GetRemoteName(const AB_TRANSACTION *st) { assert(st); return st->remoteName; } void AB_Transaction_SetRemoteName(AB_TRANSACTION *st, const GWEN_STRINGLIST *d) { assert(st); if (st->remoteName) GWEN_StringList_free(st->remoteName); if (d) st->remoteName=GWEN_StringList_dup(d); else st->remoteName=0; st->_modified=1; } void AB_Transaction_AddRemoteName(AB_TRANSACTION *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->remoteName, d, 0, chk)) st->_modified=1; } void AB_Transaction_RemoveRemoteName(AB_TRANSACTION *st, const char *d) { if (GWEN_StringList_RemoveString(st->remoteName, d)) st->_modified=1; } void AB_Transaction_ClearRemoteName(AB_TRANSACTION *st) { if (GWEN_StringList_Count(st->remoteName)) { GWEN_StringList_Clear(st->remoteName); st->_modified=1; } } int AB_Transaction_HasRemoteName(const AB_TRANSACTION *st, const char *d) { return GWEN_StringList_HasString(st->remoteName, d); } const char *AB_Transaction_GetRemoteBic(const AB_TRANSACTION *st) { assert(st); return st->remoteBic; } void AB_Transaction_SetRemoteBic(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteBic) free(st->remoteBic); if (d && *d) st->remoteBic=strdup(d); else st->remoteBic=0; st->_modified=1; } uint32_t AB_Transaction_GetUniqueId(const AB_TRANSACTION *st) { assert(st); return st->uniqueId; } void AB_Transaction_SetUniqueId(AB_TRANSACTION *st, uint32_t d) { assert(st); st->uniqueId=d; st->_modified=1; } uint32_t AB_Transaction_GetIdForApplication(const AB_TRANSACTION *st) { assert(st); return st->idForApplication; } void AB_Transaction_SetIdForApplication(AB_TRANSACTION *st, uint32_t d) { assert(st); st->idForApplication=d; st->_modified=1; } uint32_t AB_Transaction_GetGroupId(const AB_TRANSACTION *st) { assert(st); return st->groupId; } void AB_Transaction_SetGroupId(AB_TRANSACTION *st, uint32_t d) { assert(st); st->groupId=d; st->_modified=1; } const GWEN_TIME *AB_Transaction_GetValutaDate(const AB_TRANSACTION *st) { assert(st); return st->valutaDate; } void AB_Transaction_SetValutaDate(AB_TRANSACTION *st, const GWEN_TIME *d) { assert(st); if (st->valutaDate) GWEN_Time_free(st->valutaDate); if (d) st->valutaDate=GWEN_Time_dup(d); else st->valutaDate=0; st->_modified=1; } const GWEN_TIME *AB_Transaction_GetDate(const AB_TRANSACTION *st) { assert(st); return st->date; } void AB_Transaction_SetDate(AB_TRANSACTION *st, const GWEN_TIME *d) { assert(st); if (st->date) GWEN_Time_free(st->date); if (d) st->date=GWEN_Time_dup(d); else st->date=0; st->_modified=1; } const AB_VALUE *AB_Transaction_GetValue(const AB_TRANSACTION *st) { assert(st); return st->value; } void AB_Transaction_SetValue(AB_TRANSACTION *st, const AB_VALUE *d) { assert(st); if (st->value) AB_Value_free(st->value); if (d) st->value=AB_Value_dup(d); else st->value=0; st->_modified=1; } const AB_VALUE *AB_Transaction_GetFees(const AB_TRANSACTION *st) { assert(st); return st->fees; } void AB_Transaction_SetFees(AB_TRANSACTION *st, const AB_VALUE *d) { assert(st); if (st->fees) AB_Value_free(st->fees); if (d) st->fees=AB_Value_dup(d); else st->fees=0; st->_modified=1; } int AB_Transaction_GetTextKey(const AB_TRANSACTION *st) { assert(st); return st->textKey; } void AB_Transaction_SetTextKey(AB_TRANSACTION *st, int d) { assert(st); st->textKey=d; st->_modified=1; } int AB_Transaction_GetTextKeyExt(const AB_TRANSACTION *st) { assert(st); return st->textKeyExt; } void AB_Transaction_SetTextKeyExt(AB_TRANSACTION *st, int d) { assert(st); st->textKeyExt=d; st->_modified=1; } const char *AB_Transaction_GetTransactionKey(const AB_TRANSACTION *st) { assert(st); return st->transactionKey; } void AB_Transaction_SetTransactionKey(AB_TRANSACTION *st, const char *d) { assert(st); if (st->transactionKey) free(st->transactionKey); if (d && *d) st->transactionKey=strdup(d); else st->transactionKey=0; st->_modified=1; } const char *AB_Transaction_GetCustomerReference(const AB_TRANSACTION *st) { assert(st); return st->customerReference; } void AB_Transaction_SetCustomerReference(AB_TRANSACTION *st, const char *d) { assert(st); if (st->customerReference) free(st->customerReference); if (d && *d) st->customerReference=strdup(d); else st->customerReference=0; st->_modified=1; } const char *AB_Transaction_GetBankReference(const AB_TRANSACTION *st) { assert(st); return st->bankReference; } void AB_Transaction_SetBankReference(AB_TRANSACTION *st, const char *d) { assert(st); if (st->bankReference) free(st->bankReference); if (d && *d) st->bankReference=strdup(d); else st->bankReference=0; st->_modified=1; } const char *AB_Transaction_GetEndToEndReference(const AB_TRANSACTION *st) { assert(st); return st->endToEndReference; } void AB_Transaction_SetEndToEndReference(AB_TRANSACTION *st, const char *d) { assert(st); if (st->endToEndReference) free(st->endToEndReference); if (d && *d) st->endToEndReference=strdup(d); else st->endToEndReference=0; st->_modified=1; } const char *AB_Transaction_GetOriginatorIdentifier(const AB_TRANSACTION *st) { assert(st); return st->originatorIdentifier; } void AB_Transaction_SetOriginatorIdentifier(AB_TRANSACTION *st, const char *d) { assert(st); if (st->originatorIdentifier) free(st->originatorIdentifier); if (d && *d) st->originatorIdentifier=strdup(d); else st->originatorIdentifier=0; st->_modified=1; } int AB_Transaction_GetTransactionCode(const AB_TRANSACTION *st) { assert(st); return st->transactionCode; } void AB_Transaction_SetTransactionCode(AB_TRANSACTION *st, int d) { assert(st); st->transactionCode=d; st->_modified=1; } const char *AB_Transaction_GetTransactionText(const AB_TRANSACTION *st) { assert(st); return st->transactionText; } void AB_Transaction_SetTransactionText(AB_TRANSACTION *st, const char *d) { assert(st); if (st->transactionText) free(st->transactionText); if (d && *d) st->transactionText=strdup(d); else st->transactionText=0; st->_modified=1; } const char *AB_Transaction_GetPrimanota(const AB_TRANSACTION *st) { assert(st); return st->primanota; } void AB_Transaction_SetPrimanota(AB_TRANSACTION *st, const char *d) { assert(st); if (st->primanota) free(st->primanota); if (d && *d) st->primanota=strdup(d); else st->primanota=0; st->_modified=1; } const char *AB_Transaction_GetFiId(const AB_TRANSACTION *st) { assert(st); return st->fiId; } void AB_Transaction_SetFiId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->fiId) free(st->fiId); if (d && *d) st->fiId=strdup(d); else st->fiId=0; st->_modified=1; } const GWEN_STRINGLIST *AB_Transaction_GetPurpose(const AB_TRANSACTION *st) { assert(st); return st->purpose; } void AB_Transaction_SetPurpose(AB_TRANSACTION *st, const GWEN_STRINGLIST *d) { assert(st); if (st->purpose) GWEN_StringList_free(st->purpose); if (d) st->purpose=GWEN_StringList_dup(d); else st->purpose=0; st->_modified=1; } void AB_Transaction_AddPurpose(AB_TRANSACTION *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->purpose, d, 0, chk)) st->_modified=1; } void AB_Transaction_RemovePurpose(AB_TRANSACTION *st, const char *d) { if (GWEN_StringList_RemoveString(st->purpose, d)) st->_modified=1; } void AB_Transaction_ClearPurpose(AB_TRANSACTION *st) { if (GWEN_StringList_Count(st->purpose)) { GWEN_StringList_Clear(st->purpose); st->_modified=1; } } int AB_Transaction_HasPurpose(const AB_TRANSACTION *st, const char *d) { return GWEN_StringList_HasString(st->purpose, d); } const GWEN_STRINGLIST *AB_Transaction_GetCategory(const AB_TRANSACTION *st) { assert(st); return st->category; } void AB_Transaction_SetCategory(AB_TRANSACTION *st, const GWEN_STRINGLIST *d) { assert(st); if (st->category) GWEN_StringList_free(st->category); if (d) st->category=GWEN_StringList_dup(d); else st->category=0; st->_modified=1; } void AB_Transaction_AddCategory(AB_TRANSACTION *st, const char *d, int chk){ assert(st); assert(d); if (GWEN_StringList_AppendString(st->category, d, 0, chk)) st->_modified=1; } void AB_Transaction_RemoveCategory(AB_TRANSACTION *st, const char *d) { if (GWEN_StringList_RemoveString(st->category, d)) st->_modified=1; } void AB_Transaction_ClearCategory(AB_TRANSACTION *st) { if (GWEN_StringList_Count(st->category)) { GWEN_StringList_Clear(st->category); st->_modified=1; } } int AB_Transaction_HasCategory(const AB_TRANSACTION *st, const char *d) { return GWEN_StringList_HasString(st->category, d); } AB_TRANSACTION_PERIOD AB_Transaction_GetPeriod(const AB_TRANSACTION *st) { assert(st); return st->period; } void AB_Transaction_SetPeriod(AB_TRANSACTION *st, AB_TRANSACTION_PERIOD d) { assert(st); st->period=d; st->_modified=1; } int AB_Transaction_GetCycle(const AB_TRANSACTION *st) { assert(st); return st->cycle; } void AB_Transaction_SetCycle(AB_TRANSACTION *st, int d) { assert(st); st->cycle=d; st->_modified=1; } int AB_Transaction_GetExecutionDay(const AB_TRANSACTION *st) { assert(st); return st->executionDay; } void AB_Transaction_SetExecutionDay(AB_TRANSACTION *st, int d) { assert(st); st->executionDay=d; st->_modified=1; } const GWEN_TIME *AB_Transaction_GetFirstExecutionDate(const AB_TRANSACTION *st) { assert(st); return st->firstExecutionDate; } void AB_Transaction_SetFirstExecutionDate(AB_TRANSACTION *st, const GWEN_TIME *d) { assert(st); if (st->firstExecutionDate) GWEN_Time_free(st->firstExecutionDate); if (d) st->firstExecutionDate=GWEN_Time_dup(d); else st->firstExecutionDate=0; st->_modified=1; } const GWEN_TIME *AB_Transaction_GetLastExecutionDate(const AB_TRANSACTION *st) { assert(st); return st->lastExecutionDate; } void AB_Transaction_SetLastExecutionDate(AB_TRANSACTION *st, const GWEN_TIME *d) { assert(st); if (st->lastExecutionDate) GWEN_Time_free(st->lastExecutionDate); if (d) st->lastExecutionDate=GWEN_Time_dup(d); else st->lastExecutionDate=0; st->_modified=1; } const GWEN_TIME *AB_Transaction_GetNextExecutionDate(const AB_TRANSACTION *st) { assert(st); return st->nextExecutionDate; } void AB_Transaction_SetNextExecutionDate(AB_TRANSACTION *st, const GWEN_TIME *d) { assert(st); if (st->nextExecutionDate) GWEN_Time_free(st->nextExecutionDate); if (d) st->nextExecutionDate=GWEN_Time_dup(d); else st->nextExecutionDate=0; st->_modified=1; } AB_TRANSACTION_TYPE AB_Transaction_GetType(const AB_TRANSACTION *st) { assert(st); return st->type; } void AB_Transaction_SetType(AB_TRANSACTION *st, AB_TRANSACTION_TYPE d) { assert(st); st->type=d; st->_modified=1; } AB_TRANSACTION_SUBTYPE AB_Transaction_GetSubType(const AB_TRANSACTION *st) { assert(st); return st->subType; } void AB_Transaction_SetSubType(AB_TRANSACTION *st, AB_TRANSACTION_SUBTYPE d) { assert(st); st->subType=d; st->_modified=1; } AB_TRANSACTION_STATUS AB_Transaction_GetStatus(const AB_TRANSACTION *st) { assert(st); return st->status; } void AB_Transaction_SetStatus(AB_TRANSACTION *st, AB_TRANSACTION_STATUS d) { assert(st); st->status=d; st->_modified=1; } AB_TRANSACTION_CHARGE AB_Transaction_GetCharge(const AB_TRANSACTION *st) { assert(st); return st->charge; } void AB_Transaction_SetCharge(AB_TRANSACTION *st, AB_TRANSACTION_CHARGE d) { assert(st); st->charge=d; st->_modified=1; } const char *AB_Transaction_GetRemoteAddrStreet(const AB_TRANSACTION *st) { assert(st); return st->remoteAddrStreet; } void AB_Transaction_SetRemoteAddrStreet(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteAddrStreet) free(st->remoteAddrStreet); if (d && *d) st->remoteAddrStreet=strdup(d); else st->remoteAddrStreet=0; st->_modified=1; } const char *AB_Transaction_GetRemoteAddrZipcode(const AB_TRANSACTION *st) { assert(st); return st->remoteAddrZipcode; } void AB_Transaction_SetRemoteAddrZipcode(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteAddrZipcode) free(st->remoteAddrZipcode); if (d && *d) st->remoteAddrZipcode=strdup(d); else st->remoteAddrZipcode=0; st->_modified=1; } const char *AB_Transaction_GetRemoteAddrCity(const AB_TRANSACTION *st) { assert(st); return st->remoteAddrCity; } void AB_Transaction_SetRemoteAddrCity(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remoteAddrCity) free(st->remoteAddrCity); if (d && *d) st->remoteAddrCity=strdup(d); else st->remoteAddrCity=0; st->_modified=1; } const char *AB_Transaction_GetRemotePhone(const AB_TRANSACTION *st) { assert(st); return st->remotePhone; } void AB_Transaction_SetRemotePhone(AB_TRANSACTION *st, const char *d) { assert(st); if (st->remotePhone) free(st->remotePhone); if (d && *d) st->remotePhone=strdup(d); else st->remotePhone=0; st->_modified=1; } const char *AB_Transaction_GetUnitId(const AB_TRANSACTION *st) { assert(st); return st->unitId; } void AB_Transaction_SetUnitId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->unitId) free(st->unitId); if (d && *d) st->unitId=strdup(d); else st->unitId=0; st->_modified=1; } const char *AB_Transaction_GetUnitIdNameSpace(const AB_TRANSACTION *st) { assert(st); return st->unitIdNameSpace; } void AB_Transaction_SetUnitIdNameSpace(AB_TRANSACTION *st, const char *d) { assert(st); if (st->unitIdNameSpace) free(st->unitIdNameSpace); if (d && *d) st->unitIdNameSpace=strdup(d); else st->unitIdNameSpace=0; st->_modified=1; } const AB_VALUE *AB_Transaction_GetUnits(const AB_TRANSACTION *st) { assert(st); return st->units; } void AB_Transaction_SetUnits(AB_TRANSACTION *st, const AB_VALUE *d) { assert(st); if (st->units) AB_Value_free(st->units); if (d) st->units=AB_Value_dup(d); else st->units=0; st->_modified=1; } const AB_VALUE *AB_Transaction_GetUnitPrice(const AB_TRANSACTION *st) { assert(st); return st->unitPrice; } void AB_Transaction_SetUnitPrice(AB_TRANSACTION *st, const AB_VALUE *d) { assert(st); if (st->unitPrice) AB_Value_free(st->unitPrice); if (d) st->unitPrice=AB_Value_dup(d); else st->unitPrice=0; st->_modified=1; } const AB_VALUE *AB_Transaction_GetCommission(const AB_TRANSACTION *st) { assert(st); return st->commission; } void AB_Transaction_SetCommission(AB_TRANSACTION *st, const AB_VALUE *d) { assert(st); if (st->commission) AB_Value_free(st->commission); if (d) st->commission=AB_Value_dup(d); else st->commission=0; st->_modified=1; } const char *AB_Transaction_GetCreditorSchemeId(const AB_TRANSACTION *st) { assert(st); return st->creditorSchemeId; } void AB_Transaction_SetCreditorSchemeId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->creditorSchemeId) free(st->creditorSchemeId); if (d && *d) st->creditorSchemeId=strdup(d); else st->creditorSchemeId=0; st->_modified=1; } const char *AB_Transaction_GetMandateId(const AB_TRANSACTION *st) { assert(st); return st->mandateId; } void AB_Transaction_SetMandateId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->mandateId) free(st->mandateId); if (d && *d) st->mandateId=strdup(d); else st->mandateId=0; st->_modified=1; } const GWEN_DATE *AB_Transaction_GetMandateDate(const AB_TRANSACTION *st) { assert(st); return st->mandateDate; } void AB_Transaction_SetMandateDate(AB_TRANSACTION *st, const GWEN_DATE *d) { assert(st); if (st->mandateDate) GWEN_Date_free(st->mandateDate); if (d) st->mandateDate=GWEN_Date_dup(d); else st->mandateDate=0; st->_modified=1; } const char *AB_Transaction_GetMandateDebitorName(const AB_TRANSACTION *st) { assert(st); return st->mandateDebitorName; } void AB_Transaction_SetMandateDebitorName(AB_TRANSACTION *st, const char *d) { assert(st); if (st->mandateDebitorName) free(st->mandateDebitorName); if (d && *d) st->mandateDebitorName=strdup(d); else st->mandateDebitorName=0; st->_modified=1; } const char *AB_Transaction_GetOriginalCreditorSchemeId(const AB_TRANSACTION *st) { assert(st); return st->originalCreditorSchemeId; } void AB_Transaction_SetOriginalCreditorSchemeId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->originalCreditorSchemeId) free(st->originalCreditorSchemeId); if (d && *d) st->originalCreditorSchemeId=strdup(d); else st->originalCreditorSchemeId=0; st->_modified=1; } const char *AB_Transaction_GetOriginalMandateId(const AB_TRANSACTION *st) { assert(st); return st->originalMandateId; } void AB_Transaction_SetOriginalMandateId(AB_TRANSACTION *st, const char *d) { assert(st); if (st->originalMandateId) free(st->originalMandateId); if (d && *d) st->originalMandateId=strdup(d); else st->originalMandateId=0; st->_modified=1; } const char *AB_Transaction_GetOriginalCreditorName(const AB_TRANSACTION *st) { assert(st); return st->originalCreditorName; } void AB_Transaction_SetOriginalCreditorName(AB_TRANSACTION *st, const char *d) { assert(st); if (st->originalCreditorName) free(st->originalCreditorName); if (d && *d) st->originalCreditorName=strdup(d); else st->originalCreditorName=0; st->_modified=1; } AB_TRANSACTION_SEQUENCETYPE AB_Transaction_GetSequenceType(const AB_TRANSACTION *st) { assert(st); return st->sequenceType; } void AB_Transaction_SetSequenceType(AB_TRANSACTION *st, AB_TRANSACTION_SEQUENCETYPE d) { assert(st); st->sequenceType=d; st->_modified=1; } int AB_Transaction_IsModified(const AB_TRANSACTION *st) { assert(st); return st->_modified; } void AB_Transaction_SetModified(AB_TRANSACTION *st, int i) { assert(st); st->_modified=i; } void AB_Transaction_Attach(AB_TRANSACTION *st) { assert(st); st->_usage++; } AB_TRANSACTION *AB_Transaction_List2__freeAll_cb(AB_TRANSACTION *st, void *user_data) { AB_Transaction_free(st); return 0; } void AB_Transaction_List2_freeAll(AB_TRANSACTION_LIST2 *stl) { if (stl) { AB_Transaction_List2_ForEach(stl, AB_Transaction_List2__freeAll_cb, 0); AB_Transaction_List2_free(stl); } } AB_TRANSACTION_LIST *AB_Transaction_List_dup(const AB_TRANSACTION_LIST *stl) { if (stl) { AB_TRANSACTION_LIST *nl; AB_TRANSACTION *e; nl=AB_Transaction_List_new(); e=AB_Transaction_List_First(stl); while(e) { AB_TRANSACTION *ne; ne=AB_Transaction_dup(e); assert(ne); AB_Transaction_List_Add(ne, nl); e=AB_Transaction_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfoservice.c0000644000175000017500000002221412372461742021402 00000000000000/* This file is auto-generated from "bankinfoservice.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "bankinfoservice_p.h" #include #include #include #include #include #include #include #include GWEN_LIST_FUNCTIONS(AB_BANKINFO_SERVICE, AB_BankInfoService) GWEN_LIST2_FUNCTIONS(AB_BANKINFO_SERVICE, AB_BankInfoService) AB_BANKINFO_SERVICE *AB_BankInfoService_new(void) { AB_BANKINFO_SERVICE *st; GWEN_NEW_OBJECT(AB_BANKINFO_SERVICE, st) st->_usage=1; GWEN_LIST_INIT(AB_BANKINFO_SERVICE, st) return st; } void AB_BankInfoService_free(AB_BANKINFO_SERVICE *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->type) free(st->type); if (st->address) free(st->address); if (st->suffix) free(st->suffix); if (st->pversion) free(st->pversion); if (st->mode) free(st->mode); if (st->hversion) free(st->hversion); if (st->aux1) free(st->aux1); if (st->aux2) free(st->aux2); if (st->aux3) free(st->aux3); if (st->aux4) free(st->aux4); GWEN_LIST_FINI(AB_BANKINFO_SERVICE, st) GWEN_FREE_OBJECT(st); } } } AB_BANKINFO_SERVICE *AB_BankInfoService_dup(const AB_BANKINFO_SERVICE *d) { AB_BANKINFO_SERVICE *st; assert(d); st=AB_BankInfoService_new(); if (d->type) st->type=strdup(d->type); if (d->address) st->address=strdup(d->address); if (d->suffix) st->suffix=strdup(d->suffix); if (d->pversion) st->pversion=strdup(d->pversion); if (d->mode) st->mode=strdup(d->mode); st->userFlags=d->userFlags; if (d->hversion) st->hversion=strdup(d->hversion); if (d->aux1) st->aux1=strdup(d->aux1); if (d->aux2) st->aux2=strdup(d->aux2); if (d->aux3) st->aux3=strdup(d->aux3); if (d->aux4) st->aux4=strdup(d->aux4); return st; } int AB_BankInfoService_toDb(const AB_BANKINFO_SERVICE *st, GWEN_DB_NODE *db) { assert(st); assert(db); if (st->type) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", st->type)) return -1; if (st->address) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "address", st->address)) return -1; if (st->suffix) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "suffix", st->suffix)) return -1; if (st->pversion) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "pversion", st->pversion)) return -1; if (st->mode) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "mode", st->mode)) return -1; if (GWEN_DB_SetIntValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "userFlags", st->userFlags)) return -1; if (st->hversion) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "hversion", st->hversion)) return -1; if (st->aux1) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "aux1", st->aux1)) return -1; if (st->aux2) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "aux2", st->aux2)) return -1; if (st->aux3) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "aux3", st->aux3)) return -1; if (st->aux4) if (GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "aux4", st->aux4)) return -1; return 0; } int AB_BankInfoService_ReadDb(AB_BANKINFO_SERVICE *st, GWEN_DB_NODE *db) { assert(st); assert(db); AB_BankInfoService_SetType(st, GWEN_DB_GetCharValue(db, "type", 0, 0)); AB_BankInfoService_SetAddress(st, GWEN_DB_GetCharValue(db, "address", 0, 0)); AB_BankInfoService_SetSuffix(st, GWEN_DB_GetCharValue(db, "suffix", 0, 0)); AB_BankInfoService_SetPversion(st, GWEN_DB_GetCharValue(db, "pversion", 0, 0)); AB_BankInfoService_SetMode(st, GWEN_DB_GetCharValue(db, "mode", 0, 0)); AB_BankInfoService_SetUserFlags(st, GWEN_DB_GetIntValue(db, "userFlags", 0, 0)); AB_BankInfoService_SetHversion(st, GWEN_DB_GetCharValue(db, "hversion", 0, 0)); AB_BankInfoService_SetAux1(st, GWEN_DB_GetCharValue(db, "aux1", 0, 0)); AB_BankInfoService_SetAux2(st, GWEN_DB_GetCharValue(db, "aux2", 0, 0)); AB_BankInfoService_SetAux3(st, GWEN_DB_GetCharValue(db, "aux3", 0, 0)); AB_BankInfoService_SetAux4(st, GWEN_DB_GetCharValue(db, "aux4", 0, 0)); return 0; } AB_BANKINFO_SERVICE *AB_BankInfoService_fromDb(GWEN_DB_NODE *db) { AB_BANKINFO_SERVICE *st; assert(db); st=AB_BankInfoService_new(); AB_BankInfoService_ReadDb(st, db); st->_modified=0; return st; } const char *AB_BankInfoService_GetType(const AB_BANKINFO_SERVICE *st) { assert(st); return st->type; } void AB_BankInfoService_SetType(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->type) free(st->type); if (d && *d) st->type=strdup(d); else st->type=0; st->_modified=1; } const char *AB_BankInfoService_GetAddress(const AB_BANKINFO_SERVICE *st) { assert(st); return st->address; } void AB_BankInfoService_SetAddress(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->address) free(st->address); if (d && *d) st->address=strdup(d); else st->address=0; st->_modified=1; } const char *AB_BankInfoService_GetSuffix(const AB_BANKINFO_SERVICE *st) { assert(st); return st->suffix; } void AB_BankInfoService_SetSuffix(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->suffix) free(st->suffix); if (d && *d) st->suffix=strdup(d); else st->suffix=0; st->_modified=1; } const char *AB_BankInfoService_GetPversion(const AB_BANKINFO_SERVICE *st) { assert(st); return st->pversion; } void AB_BankInfoService_SetPversion(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->pversion) free(st->pversion); if (d && *d) st->pversion=strdup(d); else st->pversion=0; st->_modified=1; } const char *AB_BankInfoService_GetMode(const AB_BANKINFO_SERVICE *st) { assert(st); return st->mode; } void AB_BankInfoService_SetMode(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->mode) free(st->mode); if (d && *d) st->mode=strdup(d); else st->mode=0; st->_modified=1; } uint32_t AB_BankInfoService_GetUserFlags(const AB_BANKINFO_SERVICE *st) { assert(st); return st->userFlags; } void AB_BankInfoService_SetUserFlags(AB_BANKINFO_SERVICE *st, uint32_t d) { assert(st); st->userFlags=d; st->_modified=1; } const char *AB_BankInfoService_GetHversion(const AB_BANKINFO_SERVICE *st) { assert(st); return st->hversion; } void AB_BankInfoService_SetHversion(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->hversion) free(st->hversion); if (d && *d) st->hversion=strdup(d); else st->hversion=0; st->_modified=1; } const char *AB_BankInfoService_GetAux1(const AB_BANKINFO_SERVICE *st) { assert(st); return st->aux1; } void AB_BankInfoService_SetAux1(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->aux1) free(st->aux1); if (d && *d) st->aux1=strdup(d); else st->aux1=0; st->_modified=1; } const char *AB_BankInfoService_GetAux2(const AB_BANKINFO_SERVICE *st) { assert(st); return st->aux2; } void AB_BankInfoService_SetAux2(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->aux2) free(st->aux2); if (d && *d) st->aux2=strdup(d); else st->aux2=0; st->_modified=1; } const char *AB_BankInfoService_GetAux3(const AB_BANKINFO_SERVICE *st) { assert(st); return st->aux3; } void AB_BankInfoService_SetAux3(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->aux3) free(st->aux3); if (d && *d) st->aux3=strdup(d); else st->aux3=0; st->_modified=1; } const char *AB_BankInfoService_GetAux4(const AB_BANKINFO_SERVICE *st) { assert(st); return st->aux4; } void AB_BankInfoService_SetAux4(AB_BANKINFO_SERVICE *st, const char *d) { assert(st); if (st->aux4) free(st->aux4); if (d && *d) st->aux4=strdup(d); else st->aux4=0; st->_modified=1; } int AB_BankInfoService_IsModified(const AB_BANKINFO_SERVICE *st) { assert(st); return st->_modified; } void AB_BankInfoService_SetModified(AB_BANKINFO_SERVICE *st, int i) { assert(st); st->_modified=i; } void AB_BankInfoService_Attach(AB_BANKINFO_SERVICE *st) { assert(st); st->_usage++; } AB_BANKINFO_SERVICE *AB_BankInfoService_List2__freeAll_cb(AB_BANKINFO_SERVICE *st, void *user_data) { AB_BankInfoService_free(st); return 0; } void AB_BankInfoService_List2_freeAll(AB_BANKINFO_SERVICE_LIST2 *stl) { if (stl) { AB_BankInfoService_List2_ForEach(stl, AB_BankInfoService_List2__freeAll_cb, 0); AB_BankInfoService_List2_free(stl); } } AB_BANKINFO_SERVICE_LIST *AB_BankInfoService_List_dup(const AB_BANKINFO_SERVICE_LIST *stl) { if (stl) { AB_BANKINFO_SERVICE_LIST *nl; AB_BANKINFO_SERVICE *e; nl=AB_BankInfoService_List_new(); e=AB_BankInfoService_List_First(stl); while(e) { AB_BANKINFO_SERVICE *ne; ne=AB_BankInfoService_dup(e); assert(ne); AB_BankInfoService_List_Add(ne, nl); e=AB_BankInfoService_List_Next(e); } /* while (e) */ return nl; } else return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/types/cellphoneproduct_p.h0000644000175000017500000000105312372461742022126 00000000000000/* This file is auto-generated from "cellphoneproduct.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef CELLPHONEPRODUCT_P_H #define CELLPHONEPRODUCT_P_H #include "cellphoneproduct_l.h" struct AB_CELLPHONE_PRODUCT { GWEN_LIST_ELEMENT(AB_CELLPHONE_PRODUCT) int _usage; int _modified; char *id; char *providerName; char *productName; int allowFreeValue; AB_VALUE *minimumValue; AB_VALUE *maximumValue; AB_VALUE_LIST *values; }; #endif /* CELLPHONEPRODUCT_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/bankinfo_l.h0000644000175000017500000000067612372461742020351 00000000000000/* This file is auto-generated from "bankinfo.xml" by the typemaker tool of Gwenhywfar. Do not edit this file -- all changes will be lost! */ #ifndef BANKINFO_L_H #define BANKINFO_L_H /** @page P_AB_BANKINFO_LIB AB_BankInfo (lib) This page describes the properties of AB_BANKINFO */ #include "bankinfo.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } /* __cplusplus */ #endif #endif /* BANKINFO_L_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/balance_p.h0000644000175000017500000000142112364015477020141 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BALANCE_P_H #define AQBANKING_BALANCE_P_H #include struct AB_BALANCE { AB_VALUE *value; GWEN_TIME *time; }; #endif /* AQBANKING_BALANCE_P_H */ aqbanking-5.6.4beta/src/libs/aqbanking/types/balance.h0000644000175000017500000000260612364015477017630 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Apr 05 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BALANCE_H #define AQBANKING_BALANCE_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct AB_BALANCE AB_BALANCE; AQBANKING_API AB_BALANCE *AB_Balance_new(const AB_VALUE *v, const GWEN_TIME *t); AQBANKING_API AB_BALANCE *AB_Balance_fromDb(GWEN_DB_NODE *db); AQBANKING_API int AB_Balance_toDb(const AB_BALANCE *b, GWEN_DB_NODE *db); AQBANKING_API AB_BALANCE *AB_Balance_dup(const AB_BALANCE *b); AQBANKING_API void AB_Balance_free(AB_BALANCE *b); AQBANKING_API const AB_VALUE *AB_Balance_GetValue(const AB_BALANCE *b); AQBANKING_API void AB_Balance_SetValue(AB_BALANCE *b, const AB_VALUE *v); AQBANKING_API const GWEN_TIME *AB_Balance_GetTime(const AB_BALANCE *b); #ifdef __cplusplus } #endif #endif /* AQBANKING_BALANCE_H */ aqbanking-5.6.4beta/src/libs/aqbanking/banking_user.c0000644000175000017500000002311012364015477017532 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: banking_simple.h 1106 2007-01-09 21:14:59Z martin $ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ AB_USER_LIST2 *AB_Banking_GetUsers(const AB_BANKING *ab){ AB_USER_LIST2 *ul; AB_USER *u; assert(ab); if (AB_User_List_GetCount(ab->users)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No users"); return 0; } ul=AB_User_List2_new(); u=AB_User_List_First(ab->users); assert(u); while(u) { AB_User_List2_PushBack(ul, u); u=AB_User_List_Next(u); } /* while */ return ul; } AB_USER *AB_Banking_GetUser(const AB_BANKING *ab, uint32_t uniqueId){ AB_USER *u; assert(ab); if (AB_User_List_GetCount(ab->users)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No users"); return 0; } u=AB_User_List_First(ab->users); assert(u); while(u) { if (AB_User_GetUniqueId(u)==uniqueId) break; u=AB_User_List_Next(u); } /* while */ return u; } AB_USER *AB_Banking_FindUser(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *userId, const char *customerId) { AB_USER *u; assert(ab); if (AB_User_List_GetCount(ab->users)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No users"); return 0; } u=AB_User_List_First(ab->users); assert(u); if (!backendName) backendName="*"; if (!country) country="*"; if (!bankId) bankId="*"; if (!userId) userId="*"; if (!customerId) customerId="*"; while(u) { const char *lCountry; const char *lBankCode; const char *lUserId; const char *lCustomerId; lCountry=AB_User_GetCountry(u); if (!lCountry) lCountry=""; lBankCode=AB_User_GetBankCode(u); if (!lBankCode) lBankCode=""; lUserId=AB_User_GetUserId(u); if (!lUserId) lUserId=""; lCustomerId=AB_User_GetCustomerId(u); if (!lCustomerId) lCustomerId=""; if ((-1!=GWEN_Text_ComparePattern(AB_User_GetBackendName(u), backendName, 0)) && (-1!=GWEN_Text_ComparePattern(lCountry, country, 0)) && (-1!=GWEN_Text_ComparePattern(lBankCode, bankId, 0)) && (-1!=GWEN_Text_ComparePattern(lUserId, userId, 0)) && (-1!=GWEN_Text_ComparePattern(lCustomerId, customerId, 0))) break; u=AB_User_List_Next(u); } /* while */ return u; } AB_USER_LIST2 *AB_Banking_FindUsers(const AB_BANKING *ab, const char *backendName, const char *country, const char *bankId, const char *userId, const char *customerId) { AB_USER_LIST2 *ul; AB_USER *u; assert(ab); if (AB_User_List_GetCount(ab->users)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "No users"); return 0; } ul=AB_User_List2_new(); u=AB_User_List_First(ab->users); assert(u); if (!backendName) backendName="*"; if (!country) country="*"; if (!bankId) bankId="*"; if (!userId) userId="*"; if (!customerId) customerId="*"; while(u) { const char *lCountry; const char *lBankCode; const char *lUserId; const char *lCustomerId; lCountry=AB_User_GetCountry(u); if (!lCountry) lCountry=""; lBankCode=AB_User_GetBankCode(u); if (!lBankCode) lBankCode=""; lUserId=AB_User_GetUserId(u); if (!lUserId) lUserId=""; lCustomerId=AB_User_GetCustomerId(u); if (!lCustomerId) lCustomerId=""; if ((-1!=GWEN_Text_ComparePattern(AB_User_GetBackendName(u), backendName, 0)) && (-1!=GWEN_Text_ComparePattern(lCountry, country, 0)) && (-1!=GWEN_Text_ComparePattern(lBankCode, bankId, 0)) && (-1!=GWEN_Text_ComparePattern(lUserId, userId, 0)) && (-1!=GWEN_Text_ComparePattern(lCustomerId, customerId, 0))) { AB_User_List2_PushBack(ul, u); } u=AB_User_List_Next(u); } /* while */ if (AB_User_List2_GetSize(ul)==0) { AB_User_List2_free(ul); return 0; } return ul; } AB_USER *AB_Banking_CreateUser(AB_BANKING *ab, const char *backendName) { AB_USER *u; AB_PROVIDER *pro; uint32_t uid; int rv; assert(ab); pro=AB_Banking_GetProvider(ab, backendName); if (!pro) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Backend \"%s\" not found", backendName); return 0; } u=AB_User_new(ab); AB_User_SetBackendName(u, AB_Provider_GetName(pro)); uid=AB_Banking_GetUniqueId(ab); assert(uid); AB_User_SetUniqueId(u, uid); rv=AB_Provider_ExtendUser(pro, u, AB_ProviderExtendMode_Create, NULL); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error extending user (%d)", rv); AB_User_free(u); return 0; } return u; } int AB_Banking_AddUser(AB_BANKING *ab, AB_USER *u) { int rv; AB_USER *uTmp; char groupName[32]; GWEN_DB_NODE *db; GWEN_DB_NODE *dbP; const char *s; assert(ab); assert(u); s=AB_User_GetUserId(u); if (!s || *s==0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Missing user id"); return GWEN_ERROR_INVALID; } uTmp=AB_User_List_First(ab->users); while(uTmp) { if (uTmp==u) { DBG_INFO(AQBANKING_LOGDOMAIN, "User already added!"); return GWEN_ERROR_INVALID; } uTmp=AB_User_List_Next(uTmp); } rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Add, NULL); if (rv) return rv; db=GWEN_DB_Group_new("user"); AB_User_toDb(u, db); dbP=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, "data/backend"); rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Save, dbP); if (rv) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_DB_Group_free(db); return rv; } rv=GWEN_ConfigMgr_GetUniqueId(ab->configMgr, AB_CFG_GROUP_USERS, groupName, sizeof(groupName)-1); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to create a unique id for user [%08x] (%d)", AB_User_GetUniqueId(u), rv); GWEN_DB_Group_free(db); return rv; } groupName[sizeof(groupName)-1]=0; rv=GWEN_ConfigMgr_LockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to lock user config [%08x] (%d)", AB_User_GetUniqueId(u), rv); GWEN_DB_Group_free(db); return rv; } rv=GWEN_ConfigMgr_SetGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName, db); GWEN_DB_Group_free(db); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to save user config [%08x] (%d)", AB_User_GetUniqueId(u), rv); GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); return rv; } /* unlock */ rv=GWEN_ConfigMgr_UnlockGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to unlock user config [%08x] (%d)", AB_User_GetUniqueId(u), rv); return rv; } AB_User_SetDbId(u, groupName); AB_User_List_Add(u, ab->users); return 0; } static AB_USER *checkusers_fn(AB_USER *item, void *user_data) { AB_USER *u = user_data; return (item == u) ? item : NULL; } static AB_ACCOUNT *checkaccounts_fn(AB_ACCOUNT *item, void *user_data) { AB_USER_LIST2 *userlist = AB_Account_GetUsers(item); AB_USER *u = AB_User_List2_ForEach(userlist, checkusers_fn, user_data); AB_User_List2_free(userlist); return u ? item : NULL; } AB_ACCOUNT *AB_Banking_FindFirstAccountOfUser(AB_BANKING *ab, AB_USER *u) { AB_ACCOUNT_LIST2 *acclist; AB_ACCOUNT *result; assert(ab); assert(u); acclist = AB_Banking_GetAccounts(ab); result = AB_Account_List2_ForEach(acclist, checkaccounts_fn, u); AB_Account_List2_free(acclist); return result; } int AB_Banking_DeleteUser(AB_BANKING *ab, AB_USER *u) { int rv; AB_ACCOUNT *acc_rv; const char *groupName; assert(ab); assert(u); acc_rv=AB_Banking_FindFirstAccountOfUser(ab, u); if (acc_rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error on removing user: Still belongs to an account (bankcode %s, accountnumber %s). Delete the account first.", AB_Account_GetBankCode(acc_rv), AB_Account_GetAccountNumber(acc_rv)); return GWEN_ERROR_INVALID; } rv=AB_User_List_Del(u); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error on removing user from list (%d)", rv); return rv; } rv=AB_Provider_ExtendUser(AB_User_GetProvider(u), u, AB_ProviderExtendMode_Remove, NULL); if (rv) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error on remove extension of user (%d)", rv); return rv; } groupName=AB_User_GetDbId(u); if (groupName) { rv=GWEN_ConfigMgr_DeleteGroup(ab->configMgr, AB_CFG_GROUP_USERS, groupName); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to delete user config [%08x] (%d)", AB_User_GetUniqueId(u), rv); return rv; } } AB_User_free(u); return 0; } aqbanking-5.6.4beta/src/libs/aqbanking/country.h0000644000175000017500000000414712364015477016604 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_COUNTRY_H #define AQBANKING_COUNTRY_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct AB_COUNTRY AB_COUNTRY; GWEN_CONSTLIST2_FUNCTION_LIB_DEFS(AB_COUNTRY, AB_Country, AQBANKING_API) #include /** * Returns the untranslated name of the given country. */ AQBANKING_API const char *AB_Country_GetName(const AB_COUNTRY *cntry); /** * Returns the ISO-3166-1 2-character code of the given country. */ AQBANKING_API const char *AB_Country_GetCode(const AB_COUNTRY *cntry); /** * Returns the ISO-3166-1 numeric code of the given country. */ AQBANKING_API int AB_Country_GetNumericCode(const AB_COUNTRY *cntry); /** * Returns a localized version of the name of the given country. * If no localized version is available (i.e. because there is no translation) * then the untranslated version is returned. */ AQBANKING_API const char *AB_Country_GetLocalName(const AB_COUNTRY *cntry); /** * Returns the ISO 4217 name of the currency used in the given * country. */ AQBANKING_API const char *AB_Country_GetCurrencyName(const AB_COUNTRY *cntry); /** * Returns the 3-character ISO 4217 code of the currency used in the given * country. */ AQBANKING_API const char *AB_Country_GetCurrencyCode(const AB_COUNTRY *cntry); /** * Returns a localized version of the ISO 4217 name of the currency used in * the given country. */ AQBANKING_API const char *AB_Country_GetLocalCurrencyName(const AB_COUNTRY *cntry); #ifdef __cplusplus } #endif #endif /* AQBANKING_COUNTRY_H */ aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/0000755000175000017500000000000012643540652020024 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queue.xml0000644000175000017500000000164512364015477022264 00000000000000 AB_QUEUE AB_Queue with_inherit with_refcount
aqbanking/banking.h
aqbanking/ab_userqueue.h
aqbanking/ab_queuefns.h
ab_queuefns.c
NULL AB_UserQueue_List_new() public volatile own dup none none
aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue_list.tm20000644000175000017500000000035512364015544024566 00000000000000 AB_ACCOUNTQUEUE_LIST AB_AccountQueue_List aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue.c0000644000175000017500000000613312364015544023253 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_accountqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ab_accountqueue_p.h" #include #include /* code headers */ #include "ab_accountqueuefns.c" /* macro functions */ GWEN_LIST_FUNCTIONS(AB_ACCOUNTQUEUE, AB_AccountQueue) GWEN_INHERIT_FUNCTIONS(AB_ACCOUNTQUEUE) AB_ACCOUNTQUEUE *AB_AccountQueue_new(void) { AB_ACCOUNTQUEUE *p_struct; GWEN_NEW_OBJECT(AB_ACCOUNTQUEUE, p_struct) p_struct->_refCount=1; GWEN_INHERIT_INIT(AB_ACCOUNTQUEUE, p_struct) GWEN_LIST_INIT(AB_ACCOUNTQUEUE, p_struct) /* members */ p_struct->account=NULL; p_struct->jobQueueList=AB_JobQueue_List_new(); /* virtual functions */ return p_struct; } void AB_AccountQueue_free(AB_ACCOUNTQUEUE *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_INHERIT_FINI(AB_ACCOUNTQUEUE, p_struct) GWEN_LIST_FINI(AB_ACCOUNTQUEUE, p_struct) /* members */ AB_JobQueue_List_free(p_struct->jobQueueList); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void AB_AccountQueue_Attach(AB_ACCOUNTQUEUE *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } AB_ACCOUNTQUEUE *AB_AccountQueue_dup(const AB_ACCOUNTQUEUE *p_src) { AB_ACCOUNTQUEUE *p_struct; assert(p_src); p_struct=AB_AccountQueue_new(); /* member "account" */ p_struct->account=p_src->account; /* member "jobQueueList" */ if (p_struct->jobQueueList) { AB_JobQueue_List_free(p_struct->jobQueueList); p_struct->jobQueueList=NULL; } if (p_src->jobQueueList) { p_struct->jobQueueList=AB_JobQueue_List_dup(p_src->jobQueueList); } return p_struct; } AB_ACCOUNT *AB_AccountQueue_GetAccount(const AB_ACCOUNTQUEUE *p_struct) { assert(p_struct); return p_struct->account; } AB_JOBQUEUE_LIST *AB_AccountQueue_GetJobQueueList(const AB_ACCOUNTQUEUE *p_struct) { assert(p_struct); return p_struct->jobQueueList; } void AB_AccountQueue_SetAccount(AB_ACCOUNTQUEUE *p_struct, AB_ACCOUNT *p_src) { assert(p_struct); p_struct->account=p_src; } void AB_AccountQueue_SetJobQueueList(AB_ACCOUNTQUEUE *p_struct, AB_JOBQUEUE_LIST *p_src) { assert(p_struct); if (p_struct->jobQueueList) { AB_JobQueue_List_free(p_struct->jobQueueList); } p_struct->jobQueueList=p_src; } /* list1 functions */ AB_ACCOUNTQUEUE_LIST *AB_AccountQueue_List_dup(const AB_ACCOUNTQUEUE_LIST *p_src) { AB_ACCOUNTQUEUE_LIST *p_dest; AB_ACCOUNTQUEUE *p_elem; assert(p_src); p_dest=AB_AccountQueue_List_new(); p_elem=AB_AccountQueue_List_First(p_src); while(p_elem) { AB_ACCOUNTQUEUE *p_cpy; p_cpy=AB_AccountQueue_dup(p_elem); AB_AccountQueue_List_Add(p_cpy, p_dest); p_elem=AB_AccountQueue_List_Next(p_elem); } return p_dest; } /* code headers */ aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue.h0000644000175000017500000000362412364015544022604 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_userqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_USERQUEUE_H #define AB_USERQUEUE_H #ifdef __cplusplus extern "C" { #endif /* needed system headers */ #include #include #include /* pre-headers */ #include #include typedef struct AB_USERQUEUE AB_USERQUEUE; GWEN_LIST_FUNCTION_LIB_DEFS(AB_USERQUEUE, AB_UserQueue, AQBANKING_API) GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_USERQUEUE, AQBANKING_API) /* post-headers */ #include /** Constructor. */ AQBANKING_API AB_USERQUEUE *AB_UserQueue_new(void); /** Destructor. */ AQBANKING_API void AB_UserQueue_free(AB_USERQUEUE *p_struct); AQBANKING_API void AB_UserQueue_Attach(AB_USERQUEUE *p_struct); AQBANKING_API AB_USERQUEUE *AB_UserQueue_dup(const AB_USERQUEUE *p_struct); /** Getter. * Use this function to get the member "user" */ AQBANKING_API AB_USER *AB_UserQueue_GetUser(const AB_USERQUEUE *p_struct); /** Getter. * Use this function to get the member "accountQueueList" */ AQBANKING_API AB_ACCOUNTQUEUE_LIST *AB_UserQueue_GetAccountQueueList(const AB_USERQUEUE *p_struct); /** Setter. * Use this function to set the member "user" */ AQBANKING_API void AB_UserQueue_SetUser(AB_USERQUEUE *p_struct, AB_USER *p_src); /** Setter. * Use this function to set the member "accountQueueList" */ AQBANKING_API void AB_UserQueue_SetAccountQueueList(AB_USERQUEUE *p_struct, AB_ACCOUNTQUEUE_LIST *p_src); /* list1 functions */ AQBANKING_API AB_USERQUEUE_LIST *AB_UserQueue_List_dup(const AB_USERQUEUE_LIST *p_src); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue_p.h0000644000175000017500000000130212364015544023570 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_accountqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_ACCOUNTQUEUE_P_H #define AB_ACCOUNTQUEUE_P_H #include "ab_accountqueue.h" #ifdef __cplusplus extern "C" { #endif struct AB_ACCOUNTQUEUE { GWEN_INHERIT_ELEMENT(AB_ACCOUNTQUEUE) GWEN_LIST_ELEMENT(AB_ACCOUNTQUEUE) int _refCount; AB_ACCOUNT *account; /* volatile */ AB_JOBQUEUE_LIST *jobQueueList; /* volatile */ }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue.tm20000644000175000017500000000027312364015544023054 00000000000000 AB_USERQUEUE AB_UserQueue aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue.c0000644000175000017500000000537112364015544022374 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_jobqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ab_jobqueue_p.h" #include #include /* code headers */ /* macro functions */ GWEN_LIST_FUNCTIONS(AB_JOBQUEUE, AB_JobQueue) GWEN_INHERIT_FUNCTIONS(AB_JOBQUEUE) AB_JOBQUEUE *AB_JobQueue_new(void) { AB_JOBQUEUE *p_struct; GWEN_NEW_OBJECT(AB_JOBQUEUE, p_struct) p_struct->_refCount=1; GWEN_INHERIT_INIT(AB_JOBQUEUE, p_struct) GWEN_LIST_INIT(AB_JOBQUEUE, p_struct) /* members */ p_struct->jobList=AB_Job_List2_new(); p_struct->jobType=AB_Job_TypeUnknown; /* virtual functions */ return p_struct; } void AB_JobQueue_free(AB_JOBQUEUE *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_INHERIT_FINI(AB_JOBQUEUE, p_struct) GWEN_LIST_FINI(AB_JOBQUEUE, p_struct) /* members */ AB_Job_List2_free(p_struct->jobList); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void AB_JobQueue_Attach(AB_JOBQUEUE *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } AB_JOBQUEUE *AB_JobQueue_dup(const AB_JOBQUEUE *p_src) { AB_JOBQUEUE *p_struct; assert(p_src); p_struct=AB_JobQueue_new(); /* member "jobList" */ if (p_struct->jobList) { AB_Job_List2_free(p_struct->jobList); p_struct->jobList=NULL; } if (p_src->jobList) { } /* member "jobType" */ p_struct->jobType=p_src->jobType; return p_struct; } AB_JOB_LIST2 *AB_JobQueue_GetJobList(const AB_JOBQUEUE *p_struct) { assert(p_struct); return p_struct->jobList; } int AB_JobQueue_GetJobType(const AB_JOBQUEUE *p_struct) { assert(p_struct); return p_struct->jobType; } void AB_JobQueue_SetJobList(AB_JOBQUEUE *p_struct, AB_JOB_LIST2 *p_src) { assert(p_struct); if (p_struct->jobList) { AB_Job_List2_free(p_struct->jobList); } p_struct->jobList=p_src; } void AB_JobQueue_SetJobType(AB_JOBQUEUE *p_struct, int p_src) { assert(p_struct); p_struct->jobType=p_src; } /* list1 functions */ AB_JOBQUEUE_LIST *AB_JobQueue_List_dup(const AB_JOBQUEUE_LIST *p_src) { AB_JOBQUEUE_LIST *p_dest; AB_JOBQUEUE *p_elem; assert(p_src); p_dest=AB_JobQueue_List_new(); p_elem=AB_JobQueue_List_First(p_src); while(p_elem) { AB_JOBQUEUE *p_cpy; p_cpy=AB_JobQueue_dup(p_elem); AB_JobQueue_List_Add(p_cpy, p_dest); p_elem=AB_JobQueue_List_Next(p_elem); } return p_dest; } /* code headers */ aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue.xml0000644000175000017500000000246312364015477023640 00000000000000 AB_ACCOUNTQUEUE AB_AccountQueue with_inherit with_list1 with_refcount nocopy
aqbanking/banking.h
aqbanking/ab_jobqueue.h
aqbanking/ab_accountqueuefns.h
ab_accountqueuefns.c
NULL NULL public volatile none none assign assign NULL AB_JobQueue_List_new() public volatile own dup none none
aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueuefns.c0000644000175000017500000000177412364015477023775 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ AB_JOBQUEUE *AB_AccountQueue_FindJobQueue(const AB_ACCOUNTQUEUE *aq, AB_JOB_TYPE jt) { AB_JOBQUEUE *jq; jq=AB_JobQueue_List_First(aq->jobQueueList); while(jq) { if (AB_JobQueue_GetJobType(jq)==jt) return jq; jq=AB_JobQueue_List_Next(jq); } return NULL; } void AB_AccountQueue_AddJob(AB_ACCOUNTQUEUE *aq, AB_JOB *j) { AB_JOBQUEUE *jq; jq=AB_AccountQueue_FindJobQueue(aq, AB_Job_GetType(j)); if (jq==NULL) { jq=AB_JobQueue_new(); AB_JobQueue_List_Add(jq, aq->jobQueueList); } AB_Job_List2_PushBack(AB_JobQueue_GetJobList(jq), j); } aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queuefns.h0000644000175000017500000000136012364015477022414 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_QUEUEFNS_H #define AQBANKING_QUEUEFNS_H AQBANKING_API AB_USERQUEUE *AB_Queue_FindUserQueue(const AB_QUEUE *q, AB_USER *u); AQBANKING_API void AB_Queue_AddJob(AB_QUEUE *q, AB_USER *u, AB_JOB *j); AQBANKING_API AB_JOB *AB_Queue_FindFirstJobLikeThis(AB_QUEUE *q, AB_USER *u, AB_JOB *bj); #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue_list.tm20000644000175000017500000000034112364015544024103 00000000000000 AB_USERQUEUE_LIST AB_UserQueue_List aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue.h0000644000175000017500000000336412364015544022401 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_jobqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_JOBQUEUE_H #define AB_JOBQUEUE_H #ifdef __cplusplus extern "C" { #endif /* needed system headers */ #include #include #include /* pre-headers */ #include typedef struct AB_JOBQUEUE AB_JOBQUEUE; GWEN_LIST_FUNCTION_LIB_DEFS(AB_JOBQUEUE, AB_JobQueue, AQBANKING_API) GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_JOBQUEUE, AQBANKING_API) /* post-headers */ /** Constructor. */ AQBANKING_API AB_JOBQUEUE *AB_JobQueue_new(void); /** Destructor. */ AQBANKING_API void AB_JobQueue_free(AB_JOBQUEUE *p_struct); AQBANKING_API void AB_JobQueue_Attach(AB_JOBQUEUE *p_struct); AQBANKING_API AB_JOBQUEUE *AB_JobQueue_dup(const AB_JOBQUEUE *p_struct); /** Getter. * Use this function to get the member "jobList" */ AQBANKING_API AB_JOB_LIST2 *AB_JobQueue_GetJobList(const AB_JOBQUEUE *p_struct); /** Getter. * Use this function to get the member "jobType" */ AQBANKING_API int AB_JobQueue_GetJobType(const AB_JOBQUEUE *p_struct); /** Setter. * Use this function to set the member "jobList" */ AQBANKING_API void AB_JobQueue_SetJobList(AB_JOBQUEUE *p_struct, AB_JOB_LIST2 *p_src); /** Setter. * Use this function to set the member "jobType" */ AQBANKING_API void AB_JobQueue_SetJobType(AB_JOBQUEUE *p_struct, int p_src); /* list1 functions */ AQBANKING_API AB_JOBQUEUE_LIST *AB_JobQueue_List_dup(const AB_JOBQUEUE_LIST *p_src); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue.xml0000644000175000017500000000245612364015477023164 00000000000000 AB_USERQUEUE AB_UserQueue with_inherit with_list1 with_refcount nocopy
aqbanking/banking.h
aqbanking/ab_accountqueue.h
aqbanking/ab_userqueuefns.h
ab_userqueuefns.c
NULL NULL public volatile none none assign assign NULL AB_AccountQueue_List_new() public volatile own dup none none
aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queue.tm20000644000175000017500000000025712364015544022157 00000000000000 AB_QUEUE AB_Queue aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue_p.h0000644000175000017500000000125712364015544023123 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_userqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_USERQUEUE_P_H #define AB_USERQUEUE_P_H #include "ab_userqueue.h" #ifdef __cplusplus extern "C" { #endif struct AB_USERQUEUE { GWEN_INHERIT_ELEMENT(AB_USERQUEUE) GWEN_LIST_ELEMENT(AB_USERQUEUE) int _refCount; AB_USER *user; /* volatile */ AB_ACCOUNTQUEUE_LIST *accountQueueList; /* volatile */ }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queue_p.h0000644000175000017500000000111712364015544022217 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_queue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_QUEUE_P_H #define AB_QUEUE_P_H #include "ab_queue.h" #ifdef __cplusplus extern "C" { #endif struct AB_QUEUE { GWEN_INHERIT_ELEMENT(AB_QUEUE) int _refCount; AB_USERQUEUE_LIST *userQueueList; /* volatile */ }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/Makefile.in0000644000175000017500000007122612643540055022016 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/backendsupport DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(dist_typedata_DATA) $(iheader_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libabbesupport_la_LIBADD = am__objects_1 = ab_jobqueue.lo ab_accountqueue.lo ab_userqueue.lo \ ab_queue.lo am_libabbesupport_la_OBJECTS = $(am__objects_1) libabbesupport_la_OBJECTS = $(am_libabbesupport_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libabbesupport_la_SOURCES) DIST_SOURCES = $(libabbesupport_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(typedatadir)" "$(DESTDIR)$(iheaderdir)" DATA = $(dist_typedata_DATA) HEADERS = $(iheader_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ typefiles = \ ab_accountqueue.xml \ ab_jobqueue.xml \ ab_userqueue.xml \ ab_queue.xml typedatadir = $(aqbanking_pkgdatadir)/typemaker2/c dist_typedata_DATA = \ ab_accountqueue.tm2 \ ab_accountqueue_list.tm2 \ ab_userqueue.tm2 \ ab_userqueue_list.tm2 \ ab_queue.tm2 \ ab_jobqueue.tm2 \ ab_jobqueue_list.tm2 # order is important here typedata_sources = \ ab_jobqueue.c \ ab_accountqueue.c \ ab_userqueue.c \ ab_queue.c built_headers_priv = \ ab_accountqueue_p.h \ ab_jobqueue_p.h \ ab_userqueue_p.h \ ab_queue_p.h built_headers_pub = \ ab_accountqueue.h \ ab_jobqueue.h \ ab_userqueue.h \ ab_queue.h built_headers = $(built_headers_priv) $(built_headers_pub) iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = $(built_headers_pub)\ ab_accountqueuefns.h \ ab_userqueuefns.h \ ab_queuefns.h extra_sources = \ ab_accountqueuefns.c \ ab_userqueuefns.c \ ab_queuefns.c EXTRA_DIST = $(typefiles) $(typedata_sources) $(built_headers) $(extra_sources) MAINTAINERCLEANFILES = $(typedata_sources) $(built_headers) $(dist_typedata_DATA) noinst_LTLIBRARIES = libabbesupport.la libabbesupport_la_SOURCES = $(typedata_sources) SUFFIXES = .xml .c all: all-am .SUFFIXES: .SUFFIXES: .xml .c .h .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/backendsupport/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/backendsupport/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libabbesupport.la: $(libabbesupport_la_OBJECTS) $(libabbesupport_la_DEPENDENCIES) $(EXTRA_libabbesupport_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libabbesupport_la_OBJECTS) $(libabbesupport_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab_accountqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab_jobqueue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab_queue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab_userqueue.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_typedataDATA: $(dist_typedata_DATA) @$(NORMAL_INSTALL) @list='$(dist_typedata_DATA)'; test -n "$(typedatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(typedatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(typedatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typedatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(typedatadir)" || exit $$?; \ done uninstall-dist_typedataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_typedata_DATA)'; test -n "$(typedatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(typedatadir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(typedatadir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_typedataDATA install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_typedataDATA uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_typedataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-dist_typedataDATA uninstall-iheaderHEADERS built_sources: $(typedata_sources) .xml.c: $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) -I $(builddir) --destfolder="$(builddir)" -D AQBANKING_API $< .xml.h: $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) -I $(builddir) --destfolder="$(builddir)" -D AQBANKING_API $< types: $(typefiles) $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQBANKING_API $(typefiles) sources: $(typedata_sources) for f in $(libabbesupport_la_SOURCES) $(extra_sources); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueue.c0000644000175000017500000000602712364015544022577 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_userqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ab_userqueue_p.h" #include #include /* code headers */ #include "ab_userqueuefns.c" /* macro functions */ GWEN_LIST_FUNCTIONS(AB_USERQUEUE, AB_UserQueue) GWEN_INHERIT_FUNCTIONS(AB_USERQUEUE) AB_USERQUEUE *AB_UserQueue_new(void) { AB_USERQUEUE *p_struct; GWEN_NEW_OBJECT(AB_USERQUEUE, p_struct) p_struct->_refCount=1; GWEN_INHERIT_INIT(AB_USERQUEUE, p_struct) GWEN_LIST_INIT(AB_USERQUEUE, p_struct) /* members */ p_struct->user=NULL; p_struct->accountQueueList=AB_AccountQueue_List_new(); /* virtual functions */ return p_struct; } void AB_UserQueue_free(AB_USERQUEUE *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_INHERIT_FINI(AB_USERQUEUE, p_struct) GWEN_LIST_FINI(AB_USERQUEUE, p_struct) /* members */ AB_AccountQueue_List_free(p_struct->accountQueueList); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void AB_UserQueue_Attach(AB_USERQUEUE *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } AB_USERQUEUE *AB_UserQueue_dup(const AB_USERQUEUE *p_src) { AB_USERQUEUE *p_struct; assert(p_src); p_struct=AB_UserQueue_new(); /* member "user" */ p_struct->user=p_src->user; /* member "accountQueueList" */ if (p_struct->accountQueueList) { AB_AccountQueue_List_free(p_struct->accountQueueList); p_struct->accountQueueList=NULL; } if (p_src->accountQueueList) { p_struct->accountQueueList=AB_AccountQueue_List_dup(p_src->accountQueueList); } return p_struct; } AB_USER *AB_UserQueue_GetUser(const AB_USERQUEUE *p_struct) { assert(p_struct); return p_struct->user; } AB_ACCOUNTQUEUE_LIST *AB_UserQueue_GetAccountQueueList(const AB_USERQUEUE *p_struct) { assert(p_struct); return p_struct->accountQueueList; } void AB_UserQueue_SetUser(AB_USERQUEUE *p_struct, AB_USER *p_src) { assert(p_struct); p_struct->user=p_src; } void AB_UserQueue_SetAccountQueueList(AB_USERQUEUE *p_struct, AB_ACCOUNTQUEUE_LIST *p_src) { assert(p_struct); if (p_struct->accountQueueList) { AB_AccountQueue_List_free(p_struct->accountQueueList); } p_struct->accountQueueList=p_src; } /* list1 functions */ AB_USERQUEUE_LIST *AB_UserQueue_List_dup(const AB_USERQUEUE_LIST *p_src) { AB_USERQUEUE_LIST *p_dest; AB_USERQUEUE *p_elem; assert(p_src); p_dest=AB_UserQueue_List_new(); p_elem=AB_UserQueue_List_First(p_src); while(p_elem) { AB_USERQUEUE *p_cpy; p_cpy=AB_UserQueue_dup(p_elem); AB_UserQueue_List_Add(p_cpy, p_dest); p_elem=AB_UserQueue_List_Next(p_elem); } return p_dest; } /* code headers */ aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue_p.h0000644000175000017500000000122512364015544022712 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_jobqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_JOBQUEUE_P_H #define AB_JOBQUEUE_P_H #include "ab_jobqueue.h" #ifdef __cplusplus extern "C" { #endif struct AB_JOBQUEUE { GWEN_INHERIT_ELEMENT(AB_JOBQUEUE) GWEN_LIST_ELEMENT(AB_JOBQUEUE) int _refCount; AB_JOB_LIST2 *jobList; /* volatile */ int jobType; /* volatile */ }; #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/Makefile.am0000644000175000017500000000364612364015477022013 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) @all_includes@ AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ typefiles= \ ab_accountqueue.xml \ ab_jobqueue.xml \ ab_userqueue.xml \ ab_queue.xml typedatadir=$(aqbanking_pkgdatadir)/typemaker2/c dist_typedata_DATA=\ ab_accountqueue.tm2 \ ab_accountqueue_list.tm2 \ ab_userqueue.tm2 \ ab_userqueue_list.tm2 \ ab_queue.tm2 \ ab_jobqueue.tm2 \ ab_jobqueue_list.tm2 # order is important here typedata_sources= \ ab_jobqueue.c \ ab_accountqueue.c \ ab_userqueue.c \ ab_queue.c built_headers_priv= \ ab_accountqueue_p.h \ ab_jobqueue_p.h \ ab_userqueue_p.h \ ab_queue_p.h built_headers_pub= \ ab_accountqueue.h \ ab_jobqueue.h \ ab_userqueue.h \ ab_queue.h built_headers=$(built_headers_priv) $(built_headers_pub) iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=$(built_headers_pub)\ ab_accountqueuefns.h \ ab_userqueuefns.h \ ab_queuefns.h extra_sources=\ ab_accountqueuefns.c \ ab_userqueuefns.c \ ab_queuefns.c EXTRA_DIST=$(typefiles) $(typedata_sources) $(built_headers) $(extra_sources) MAINTAINERCLEANFILES = $(typedata_sources) $(built_headers) $(dist_typedata_DATA) noinst_LTLIBRARIES=libabbesupport.la libabbesupport_la_SOURCES=$(typedata_sources) built_sources: $(typedata_sources) .xml.c: $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) -I $(builddir) --destfolder="$(builddir)" -D AQBANKING_API $< .xml.h: $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) -I $(builddir) --destfolder="$(builddir)" -D AQBANKING_API $< SUFFIXES = .xml .c types: $(typefiles) $(typemaker2_exe) -I $(top_srcdir)/src/libs/aqbanking/typemaker2/c -I $(srcdir) --destfolder="$(srcdir)" -D AQBANKING_API $(typefiles) sources: $(typedata_sources) for f in $(libabbesupport_la_SOURCES) $(extra_sources); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queue.c0000644000175000017500000000477012364015544021703 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_queue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "ab_queue_p.h" #include #include /* code headers */ #include "ab_queuefns.c" /* macro functions */ GWEN_INHERIT_FUNCTIONS(AB_QUEUE) AB_QUEUE *AB_Queue_new(void) { AB_QUEUE *p_struct; GWEN_NEW_OBJECT(AB_QUEUE, p_struct) p_struct->_refCount=1; GWEN_INHERIT_INIT(AB_QUEUE, p_struct) /* members */ p_struct->userQueueList=AB_UserQueue_List_new(); /* virtual functions */ return p_struct; } void AB_Queue_free(AB_QUEUE *p_struct) { if (p_struct) { assert(p_struct->_refCount); if (p_struct->_refCount==1) { GWEN_INHERIT_FINI(AB_QUEUE, p_struct) /* members */ AB_UserQueue_List_free(p_struct->userQueueList); p_struct->_refCount=0; GWEN_FREE_OBJECT(p_struct); } else p_struct->_refCount--; } } void AB_Queue_Attach(AB_QUEUE *p_struct) { assert(p_struct); assert(p_struct->_refCount); p_struct->_refCount++; } AB_QUEUE *AB_Queue_dup(const AB_QUEUE *p_src) { AB_QUEUE *p_struct; assert(p_src); p_struct=AB_Queue_new(); /* member "userQueueList" */ if (p_struct->userQueueList) { AB_UserQueue_List_free(p_struct->userQueueList); p_struct->userQueueList=NULL; } if (p_src->userQueueList) { p_struct->userQueueList=AB_UserQueue_List_dup(p_src->userQueueList); } return p_struct; } AB_QUEUE *AB_Queue_copy(AB_QUEUE *p_struct, const AB_QUEUE *p_src) { assert(p_struct); assert(p_src); /* member "userQueueList" */ if (p_struct->userQueueList) { AB_UserQueue_List_free(p_struct->userQueueList); } if (p_struct->userQueueList) { AB_UserQueue_List_free(p_struct->userQueueList); p_struct->userQueueList=NULL; } if (p_src->userQueueList) { p_struct->userQueueList=AB_UserQueue_List_dup(p_src->userQueueList); } return p_struct; } AB_USERQUEUE_LIST *AB_Queue_GetUserQueueList(const AB_QUEUE *p_struct) { assert(p_struct); return p_struct->userQueueList; } void AB_Queue_SetUserQueueList(AB_QUEUE *p_struct, AB_USERQUEUE_LIST *p_src) { assert(p_struct); if (p_struct->userQueueList) { AB_UserQueue_List_free(p_struct->userQueueList); } p_struct->userQueueList=p_src; } /* code headers */ aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue.tm20000644000175000017500000000030412364015544023525 00000000000000 AB_ACCOUNTQUEUE AB_AccountQueue aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue.xml0000644000175000017500000000200412364015477022745 00000000000000 AB_JOBQUEUE AB_JobQueue with_inherit with_list1 with_refcount nocopy
aqbanking/job.h
NULL AB_Job_List2_new() public volatile own none none AB_Job_TypeUnknown AB_Job_TypeUnknown public volatile none none
aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueue.h0000644000175000017500000000374112364015544023262 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_accountqueue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_ACCOUNTQUEUE_H #define AB_ACCOUNTQUEUE_H #ifdef __cplusplus extern "C" { #endif /* needed system headers */ #include #include #include /* pre-headers */ #include #include typedef struct AB_ACCOUNTQUEUE AB_ACCOUNTQUEUE; GWEN_LIST_FUNCTION_LIB_DEFS(AB_ACCOUNTQUEUE, AB_AccountQueue, AQBANKING_API) GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_ACCOUNTQUEUE, AQBANKING_API) /* post-headers */ #include /** Constructor. */ AQBANKING_API AB_ACCOUNTQUEUE *AB_AccountQueue_new(void); /** Destructor. */ AQBANKING_API void AB_AccountQueue_free(AB_ACCOUNTQUEUE *p_struct); AQBANKING_API void AB_AccountQueue_Attach(AB_ACCOUNTQUEUE *p_struct); AQBANKING_API AB_ACCOUNTQUEUE *AB_AccountQueue_dup(const AB_ACCOUNTQUEUE *p_struct); /** Getter. * Use this function to get the member "account" */ AQBANKING_API AB_ACCOUNT *AB_AccountQueue_GetAccount(const AB_ACCOUNTQUEUE *p_struct); /** Getter. * Use this function to get the member "jobQueueList" */ AQBANKING_API AB_JOBQUEUE_LIST *AB_AccountQueue_GetJobQueueList(const AB_ACCOUNTQUEUE *p_struct); /** Setter. * Use this function to set the member "account" */ AQBANKING_API void AB_AccountQueue_SetAccount(AB_ACCOUNTQUEUE *p_struct, AB_ACCOUNT *p_src); /** Setter. * Use this function to set the member "jobQueueList" */ AQBANKING_API void AB_AccountQueue_SetJobQueueList(AB_ACCOUNTQUEUE *p_struct, AB_JOBQUEUE_LIST *p_src); /* list1 functions */ AQBANKING_API AB_ACCOUNTQUEUE_LIST *AB_AccountQueue_List_dup(const AB_ACCOUNTQUEUE_LIST *p_src); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueuefns.c0000644000175000017500000000213112364015477023303 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ AB_ACCOUNTQUEUE *AB_UserQueue_FindAccountQueue(const AB_USERQUEUE *uq, AB_ACCOUNT *acc) { AB_ACCOUNTQUEUE *aq; aq=AB_AccountQueue_List_First(uq->accountQueueList); while(aq) { if (AB_AccountQueue_GetAccount(aq)==acc) return aq; aq=AB_AccountQueue_List_Next(aq); } return NULL; } void AB_UserQueue_AddJob(AB_USERQUEUE *uq, AB_JOB *j) { AB_ACCOUNT *a; AB_ACCOUNTQUEUE *aq; a=AB_Job_GetAccount(j); assert(a); aq=AB_UserQueue_FindAccountQueue(uq, a); if (aq==NULL) { aq=AB_AccountQueue_new(); AB_AccountQueue_SetAccount(aq, a); AB_AccountQueue_List_Add(aq, uq->accountQueueList); } AB_AccountQueue_AddJob(aq, j); } aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue.tm20000644000175000017500000000027012364015544022645 00000000000000 AB_JOBQUEUE AB_JobQueue aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_userqueuefns.h0000644000175000017500000000125712364015477023320 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_USERQUEUEFNS_H #define AQBANKING_USERQUEUEFNS_H AQBANKING_API AB_ACCOUNTQUEUE *AB_UserQueue_FindAccountQueue(const AB_USERQUEUE *uq, AB_ACCOUNT *acc); AQBANKING_API void AB_UserQueue_AddJob(AB_USERQUEUE *uq, AB_JOB *j); #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_accountqueuefns.h0000644000175000017500000000127012364015477023771 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_ACCOUNTQUEUEFNS_H #define AQBANKING_ACCOUNTQUEUEFNS_H AQBANKING_API AB_JOBQUEUE *AB_AccountQueue_FindJobQueue(const AB_ACCOUNTQUEUE *aq, AB_JOB_TYPE jt); AQBANKING_API void AB_AccountQueue_AddJob(AB_ACCOUNTQUEUE *aq, AB_JOB *j); #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queue.h0000644000175000017500000000262612364015544021706 00000000000000/********************************************************** * This file has been automatically created by "typemaker2" * from the file "ab_queue.xml". * Please do not edit this file, all changes will be lost. * Better edit the mentioned source file instead. **********************************************************/ #ifndef AB_QUEUE_H #define AB_QUEUE_H #ifdef __cplusplus extern "C" { #endif /* needed system headers */ #include #include /* pre-headers */ #include #include typedef struct AB_QUEUE AB_QUEUE; GWEN_INHERIT_FUNCTION_LIB_DEFS(AB_QUEUE, AQBANKING_API) /* post-headers */ #include /** Constructor. */ AQBANKING_API AB_QUEUE *AB_Queue_new(void); /** Destructor. */ AQBANKING_API void AB_Queue_free(AB_QUEUE *p_struct); AQBANKING_API void AB_Queue_Attach(AB_QUEUE *p_struct); AQBANKING_API AB_QUEUE *AB_Queue_dup(const AB_QUEUE *p_struct); AQBANKING_API AB_QUEUE *AB_Queue_copy(AB_QUEUE *p_struct, const AB_QUEUE *p_src); /** Getter. * Use this function to get the member "userQueueList" */ AQBANKING_API AB_USERQUEUE_LIST *AB_Queue_GetUserQueueList(const AB_QUEUE *p_struct); /** Setter. * Use this function to set the member "userQueueList" */ AQBANKING_API void AB_Queue_SetUserQueueList(AB_QUEUE *p_struct, AB_USERQUEUE_LIST *p_src); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_jobqueue_list.tm20000644000175000017500000000033512364015544023702 00000000000000 AB_JOBQUEUE_LIST AB_JobQueue_List aqbanking-5.6.4beta/src/libs/aqbanking/backendsupport/ab_queuefns.c0000644000175000017500000000257212364015477022415 00000000000000/*************************************************************************** begin : Mon May 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ AB_USERQUEUE *AB_Queue_FindUserQueue(const AB_QUEUE *q, AB_USER *u) { AB_USERQUEUE *uq; uq=AB_UserQueue_List_First(q->userQueueList); while(uq) { if (AB_UserQueue_GetUser(uq)==u) return uq; uq=AB_UserQueue_List_Next(uq); } return NULL; } void AB_Queue_AddJob(AB_QUEUE *q, AB_USER *u, AB_JOB *j) { AB_USERQUEUE *uq; uq=AB_Queue_FindUserQueue(q, u); if (uq==NULL) { uq=AB_UserQueue_new(); AB_UserQueue_SetUser(uq, u); AB_UserQueue_List_Add(uq, q->userQueueList); } AB_UserQueue_AddJob(uq, j); } AB_JOB *AB_Queue_FindFirstJobLikeThis(AB_QUEUE *q, AB_USER *u, AB_JOB *bj) { AB_USERQUEUE *uq=AB_Queue_FindUserQueue(q, u); if (uq) { AB_ACCOUNTQUEUE *aq=AB_UserQueue_FindAccountQueue(uq, AB_Job_GetAccount(bj)); if (aq) { AB_JOBQUEUE *jq=AB_AccountQueue_FindJobQueue(aq, AB_Job_GetType(bj)); if (jq) return AB_Job_List2_GetFront(AB_JobQueue_GetJobList(jq)); } } return NULL; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/0000755000175000017500000000000012643540652016422 500000000000000aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbankinfo.dlg0000644000175000017500000000353412364015477022656 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_pagedefault.dlg0000644000175000017500000000147412364015477024111 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_importer.dlg0000644000175000017500000000611012364015477021521 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newuser_p.h0000644000175000017500000000142712364015477021356 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_NEWUSER_P_H #define AB_DLG_NEWUSER_P_H #include "dlg_newuser_be.h" typedef struct AB_NEWUSER_DIALOG AB_NEWUSER_DIALOG; struct AB_NEWUSER_DIALOG { AB_BANKING *banking; AB_USER *user; }; static void GWENHYWFAR_CB AB_NewUserDialog_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_pagedefault_p.h0000644000175000017500000000144212364015477024104 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_USERTYPE_PAGEDEFAULT_P_H #define AQBANKING_DLG_USERTYPE_PAGEDEFAULT_P_H #include "dlg_usertype_pagedefault_l.h" static int GWENHYWFAR_CB AB_UserTypePageDefaultDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup.c0000644000175000017500000006741312364015477020511 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_setup_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 100 #define USER_LIST_MINCOLWIDTH 50 #define ACCOUNT_LIST_MINCOLWIDTH 50 GWEN_INHERIT(GWEN_DIALOG, AB_SETUP_DIALOG) GWEN_DIALOG *AB_SetupDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AB_SETUP_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_setup"); GWEN_NEW_OBJECT(AB_SETUP_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg, xdlg, AB_SetupDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_SetupDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_setup.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; /* done */ return dlg; } void GWENHYWFAR_CB AB_SetupDialog_FreeData(void *bp, void *p) { AB_SETUP_DIALOG *xdlg; xdlg=(AB_SETUP_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static void createUserListBoxString(const AB_USER *u, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; uint32_t uid; /* column 1 */ uid=AB_User_GetUniqueId(u); snprintf(numbuf, sizeof(numbuf)-1, "%06d", uid); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 2 */ s=AB_User_GetBankCode(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 3 */ s=AB_User_GetUserId(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 4 */ s=AB_User_GetCustomerId(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 5 */ s=AB_User_GetUserName(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 6 */ s=AB_User_GetBackendName(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); } static void createAccountListBoxString(const AB_ACCOUNT *a, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; uint32_t uid; /* column 1 */ uid=AB_Account_GetUniqueId(a); snprintf(numbuf, sizeof(numbuf)-1, "%06d", uid); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 2 */ s=AB_Account_GetBankCode(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 3 */ s=AB_Account_GetBankName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 4 */ s=AB_Account_GetAccountNumber(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 5 */ s=AB_Account_GetAccountName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 6 */ s=AB_Account_GetOwnerName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); /* column 7 */ s=AB_Account_GetBackendName(a); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); } AB_USER *AB_SetupDialog_GetCurrentUser(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_USER_LIST2 *ul; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); /* user list */ ul=AB_Banking_GetUsers(xdlg->banking); if (ul) { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "userListBox", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "userListBox", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); u=AB_User_List2Iterator_Data(it); while(u) { createUserListBoxString(u, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); AB_User_List2_free(ul); return u; } GWEN_Buffer_Reset(tbuf); u=AB_User_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); } AB_User_List2_free(ul); } } } return NULL; } AB_ACCOUNT *AB_SetupDialog_GetCurrentAccount(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_ACCOUNT_LIST2 *al; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); /* user list */ al=AB_Banking_GetAccounts(xdlg->banking); if (al) { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "accountListBox", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { AB_ACCOUNT_LIST2_ITERATOR *it; it=AB_Account_List2_First(al); if (it) { AB_ACCOUNT *a; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); a=AB_Account_List2Iterator_Data(it); while(a) { createAccountListBoxString(a, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); AB_Account_List2Iterator_free(it); AB_Account_List2_free(al); return a; } GWEN_Buffer_Reset(tbuf); a=AB_Account_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Account_List2Iterator_free(it); } AB_Account_List2_free(al); } } } return NULL; } int AB_SetupDialog_UserChanged(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_AccountChanged(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); return GWEN_DialogEvent_ResultHandled; } void AB_SetupDialog_Reload(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_USER_LIST2 *ul; AB_ACCOUNT_LIST2 *al; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); /* user list */ i=0; GWEN_Dialog_SetIntProperty(dlg, "userListBox", GWEN_DialogProperty_ClearValues, 0, 0, 0); ul=AB_Banking_GetUsers(xdlg->banking); if (ul) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); u=AB_User_List2Iterator_Data(it); while(u) { createUserListBoxString(u, tbuf); GWEN_Dialog_SetCharProperty(dlg, "userListBox", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); i++; GWEN_Buffer_Reset(tbuf); u=AB_User_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); } AB_User_List2_free(ul); } GWEN_Dialog_SetIntProperty(dlg, "userListBox", GWEN_DialogProperty_Sort, 0, 0, 0); if (i) GWEN_Dialog_SetIntProperty(dlg, "userListBox", GWEN_DialogProperty_Value, 0, 0, 0); /* account list */ i=0; GWEN_Dialog_SetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_ClearValues, 0, 0, 0); al=AB_Banking_GetAccounts(xdlg->banking); if (al) { AB_ACCOUNT_LIST2_ITERATOR *it; it=AB_Account_List2_First(al); if (it) { AB_ACCOUNT *a; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); a=AB_Account_List2Iterator_Data(it); while(a) { createAccountListBoxString(a, tbuf); GWEN_Dialog_SetCharProperty(dlg, "accountListBox", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); i++; GWEN_Buffer_Reset(tbuf); a=AB_Account_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Account_List2Iterator_free(it); } AB_Account_List2_free(al); } GWEN_Dialog_SetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_Sort, 0, 0, 0); if (i) GWEN_Dialog_SetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_Value, 0, 0, 0); AB_SetupDialog_UserChanged(dlg); AB_SetupDialog_AccountChanged(dlg); } void AB_SetupDialog_Init(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; int j; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("AqBanking Setup"), 0); /* user list */ GWEN_Dialog_SetCharProperty(dlg, "userListBox", GWEN_DialogProperty_Title, 0, I18N("Id\tBank Code\tUser Id\tCustomer Id\tUser Name\tModule"), 0); GWEN_Dialog_SetIntProperty(dlg, "userListBox", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); /* account list */ GWEN_Dialog_SetCharProperty(dlg, "accountListBox", GWEN_DialogProperty_Title, 0, I18N("Id\tBank Code\tBank Name\tAccount Number\tAccount Name\tOwner Name\tModule"), 0); GWEN_Dialog_SetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* read user column widths */ for (i=0; i<6; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "user_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "userListBox", GWEN_DialogProperty_SortDirection, i, j, 0); /* read account column widths */ for (i=0; i<7; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "account_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "accountListBox", GWEN_DialogProperty_SortDirection, i, j, 0); AB_SetupDialog_Reload(dlg); } void AB_SetupDialog_Fini(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); /* store column widths of user list */ GWEN_DB_DeleteVar(dbPrefs, "user_list_columns"); for (i=0; i<6; i++) { int j; j=GWEN_Dialog_GetIntProperty(dlg, "userListBox", GWEN_DialogProperty_ColumnWidth, i, -1); if (jbanking, u, 1); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg2); AB_SetupDialog_Reload(dlg); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_AddUser(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); dlg2=AB_SetupNewUserDialog_new(xdlg->banking); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); } else { const char *s; s=AB_SetupNewUserDialog_GetSelectedBackend(dlg2); if (s && *s) { AB_PROVIDER *pro; int selectedType; uint32_t flags; pro=AB_Banking_GetProvider(xdlg->banking, s); if (pro==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider [%s] not found", s); GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } selectedType=AB_SetupNewUserDialog_GetSelectedType(dlg2); GWEN_Dialog_free(dlg2); flags=AB_Provider_GetFlags(pro); if (flags & AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG) { GWEN_DIALOG *dlg3; int rv; dlg3=AB_Provider_GetNewUserDialog(pro, selectedType); if (dlg3==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg3, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg3); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg3); AB_SetupDialog_Reload(dlg); } else { GWEN_DIALOG *dlg3; AB_USER *u; const AB_COUNTRY *c=NULL; const char *s; int rv; u=AB_Banking_CreateUser(xdlg->banking, AB_Provider_GetName(pro)); if (u==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "No user created."); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } s=GWEN_I18N_GetCurrentLocale(); if (s && *s) { if (strstr(s, "de_")) c=AB_Banking_FindCountryByCode(xdlg->banking, "de"); else if (strstr(s, "us_")) c=AB_Banking_FindCountryByCode(xdlg->banking, "us"); } if (c) { AB_User_SetCountry(u, AB_Country_GetCode(c)); } dlg3=AB_EditUserDialog_new(xdlg->banking, u, 0); if (dlg3==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not create dialog"); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg3, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg3); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg3); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } AB_SetupDialog_Reload(dlg); } } else { GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_DelUser(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_USER *u; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); u=AB_SetupDialog_GetCurrentUser(dlg); if (u) { AB_ACCOUNT *a; int rv; char nbuf[512]; snprintf(nbuf, sizeof(nbuf)-1, I18N("" "

Do you really want to delete the user %s?" "" "Do you really want to delete the user \"%s\"?"), AB_User_GetUserId(u), AB_User_GetUserId(u)); nbuf[sizeof(nbuf)-1]=0; rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Delete User"), nbuf, I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } a=AB_Banking_FindFirstAccountOfUser(xdlg->banking, u); if (a) { int i; rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Error"), I18N("" "

There is at least one account assigned to the selected user.

" "

Do you want to remove the account(s) and continue removing the user?

" "" "There is at least one account assigned to the selected user.\n" "Do you want to remove the account(s) and continue removing the user?"), I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } i=0; while( (a=AB_Banking_FindFirstAccountOfUser(xdlg->banking, u)) ) { rv=AB_Banking_DeleteAccount(xdlg->banking, a); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting account: %d (%d deleted)"), rv, i); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } i++; } } /* now delete the user */ rv=AB_Banking_DeleteUser(xdlg->banking, u); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting user: %d"), rv); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } AB_SetupDialog_Reload(dlg); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_EditAccount(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_ACCOUNT *a; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); a=AB_SetupDialog_GetCurrentAccount(dlg); if (a) { AB_PROVIDER *pro; uint32_t flags=0; GWEN_DIALOG *dlg2; int rv; pro=AB_Account_GetProvider(a); assert(pro); flags=AB_Provider_GetFlags(pro); if (flags & AB_PROVIDER_FLAGS_HAS_EDITACCOUNT_DIALOG) dlg2=AB_Provider_GetEditAccountDialog(pro, a); else dlg2=AB_EditAccountDialog_new(xdlg->banking, a, 1); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg2); AB_SetupDialog_Reload(dlg); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_AddAccount(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_PROVIDER *pro; const char *s; const char *initialProvider=NULL; uint32_t flags; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); s=GWEN_I18N_GetCurrentLocale(); if (s && *s) { if (strstr(s, "de_")) initialProvider="aqhbci"; else initialProvider="aqofxconnect"; } pro=AB_SelectBackend(xdlg->banking, initialProvider, I18N("Please select the online banking backend the new " "account is to be created for.")); if (pro==NULL) { DBG_ERROR(0, "No provider selected."); return GWEN_DialogEvent_ResultHandled; } flags=AB_Provider_GetFlags(pro); if (flags & AB_PROVIDER_FLAGS_HAS_EDITACCOUNT_DIALOG) { GWEN_DIALOG *dlg2; int rv; dlg2=AB_Provider_GetNewAccountDialog(pro); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg2); AB_SetupDialog_Reload(dlg); } else { GWEN_DIALOG *dlg2; AB_ACCOUNT *a; const AB_COUNTRY *c=NULL; const char *s; int rv; a=AB_Banking_CreateAccount(xdlg->banking, AB_Provider_GetName(pro)); if (a==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "No account created."); AB_Account_free(a); return GWEN_DialogEvent_ResultHandled; } s=GWEN_I18N_GetCurrentLocale(); if (s && *s) { if (strstr(s, "de_")) c=AB_Banking_FindCountryByCode(xdlg->banking, "de"); else if (strstr(s, "us_")) c=AB_Banking_FindCountryByCode(xdlg->banking, "us"); } if (c) { AB_Account_SetCountry(a, AB_Country_GetCode(c)); AB_Account_SetCurrency(a, AB_Country_GetCurrencyCode(c)); } dlg2=AB_EditAccountDialog_new(xdlg->banking, a, 0); if (dlg2==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "Could not create dialog"); AB_Account_free(a); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } GWEN_Dialog_free(dlg2); rv=AB_Banking_AddAccount(xdlg->banking, a); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_Account_free(a); return GWEN_DialogEvent_ResultHandled; } AB_SetupDialog_Reload(dlg); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_DelAccount(GWEN_DIALOG *dlg) { AB_SETUP_DIALOG *xdlg; AB_ACCOUNT *a; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); a=AB_SetupDialog_GetCurrentAccount(dlg); if (a) { int rv; char nbuf[512]; char ibuf[32]; const char *an; an=AB_Account_GetAccountName(a); if (!(an && *an)) an=AB_Account_GetAccountNumber(a); if (!(an && *an)) { snprintf(ibuf, sizeof(ibuf)-1, "%d", (int) AB_Account_GetUniqueId(a)); ibuf[sizeof(ibuf)-1]=0; an=ibuf; } snprintf(nbuf, sizeof(nbuf)-1, I18N("" "

Do you really want to delete the account %s?" "" "Do you really want to delete the account \"%s\"?"), an, an); nbuf[sizeof(nbuf)-1]=0; rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_WARN | GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS, I18N("Delete Account"), nbuf, I18N("Yes"), I18N("No"), NULL, 0); if (rv!=1) { DBG_INFO(AQBANKING_LOGDOMAIN, "Aborted by user"); return GWEN_DialogEvent_ResultHandled; } rv=AB_Banking_DeleteAccount(xdlg->banking, a); if (rv<0) { GWEN_Gui_ShowError(I18N("Error"), I18N("Error deleting account: %d"), rv); AB_SetupDialog_Reload(dlg); return GWEN_DialogEvent_ResultHandled; } AB_SetupDialog_Reload(dlg); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "closeButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "editUserButton")==0) return AB_SetupDialog_EditUser(dlg); else if (strcasecmp(sender, "addUserButton")==0) return AB_SetupDialog_AddUser(dlg); else if (strcasecmp(sender, "delUserButton")==0) return AB_SetupDialog_DelUser(dlg); else if (strcasecmp(sender, "editAccountButton")==0) return AB_SetupDialog_EditAccount(dlg); else if (strcasecmp(sender, "addAccountButton")==0) return AB_SetupDialog_AddAccount(dlg); else if (strcasecmp(sender, "delAccountButton")==0) return AB_SetupDialog_DelAccount(dlg); else if (strcasecmp(sender, "userListBox")==0) return AB_SetupDialog_UserChanged(dlg); else if (strcasecmp(sender, "accountListBox")==0) return AB_SetupDialog_AccountChanged(dlg); else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_SetupDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_SETUP_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_SetupDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_SetupDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_SetupDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup_newuser.dlg0000644000175000017500000000362312364015477022576 00000000000000

aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbackend.h0000644000175000017500000000344212364015477022135 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SELECTBACKEND_H #define AQBANKING_DLG_SELECTBACKEND_H #include #include #include #include #include /** @defgroup G_AB_DIALOGS_SELECT_BACKEND Select a Backend * @ingroup G_AB_DIALOGS * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * This function creates and executes a dialog which lets the user choose an online banking * backend from the list of installed backends. * This is a convenience function. * @param ab pointer to the AB_BANKING object used by the application * @param initial name of the initially selected backend * @param text text to be shown as introduction declaring what the backend is needed for (e.g. * "Please select the backend to create a new user for"). * @return pointer to the selected backend (or NULL on error) */ AQBANKING_API AB_PROVIDER *AB_SelectBackend(AB_BANKING *ab, const char *initial, const char *text); AQBANKING_API GWEN_DIALOG *AB_SelectBackendDialog_new(AB_BANKING *ab, const char *text); AQBANKING_API const char *AB_SelectBackendDialog_GetSelectedProvider(const GWEN_DIALOG *dlg); AQBANKING_API void AB_SelectBackendDialog_SetSelectedProvider(GWEN_DIALOG *dlg, const char *s); #ifdef __cplusplus } #endif /*@}*/ #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_editaccount.c0000644000175000017500000006164212364015477021651 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_editaccount_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 300 #define USER_LIST_MINCOLWIDTH 50 GWEN_INHERIT(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG) GWEN_DIALOG *AB_EditAccountDialog_new(AB_BANKING *ab, AB_ACCOUNT *a, int doLock) { GWEN_DIALOG *dlg; AB_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_edit_account"); GWEN_NEW_OBJECT(AB_EDIT_ACCOUNT_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg, xdlg, AB_EditAccountDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_EditAccountDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_editaccount.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->account=a; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AB_EditAccountDialog_FreeData(void *bp, void *p) { AB_EDIT_ACCOUNT_DIALOG *xdlg; xdlg=(AB_EDIT_ACCOUNT_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQBANKING_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } static int createCurrencyString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalCurrencyName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCurrencyCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQBANKING_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } static void createUserString(const AB_USER *u, GWEN_BUFFER *tbuf) { const char *s; char numbuf[32]; uint32_t uid; /* column 1 */ uid=AB_User_GetUniqueId(u); snprintf(numbuf, sizeof(numbuf)-1, "%d", uid); numbuf[sizeof(numbuf)-1]=0; s=AB_User_GetUserName(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "-"); s=AB_User_GetBankCode(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "-"); s=AB_User_GetCustomerId(u); if (!(s && *s)) s=AB_User_GetUserId(u); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, numbuf); GWEN_Buffer_AppendString(tbuf, ")"); } AB_USER *AB_EditAccountDialog_GetCurrentUser(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; AB_USER_LIST2 *ul; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); /* user list */ ul=AB_Banking_GetUsers(xdlg->banking); if (ul) { int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "userCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "userCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { AB_USER_LIST2_ITERATOR *it; it=AB_User_List2_First(ul); if (it) { AB_USER *u; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); u=AB_User_List2Iterator_Data(it); while(u) { createUserString(u, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); AB_User_List2_free(ul); return u; } GWEN_Buffer_Reset(tbuf); u=AB_User_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_User_List2Iterator_free(it); } AB_User_List2_free(ul); } } } return NULL; } int AB_EditAccountDialog_FindUserEntry(GWEN_DIALOG *dlg, AB_USER *u) { AB_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_BUFFER *tbuf; int i; int num; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); tbuf=GWEN_Buffer_new(0, 256, 0, 1); createUserString(u, tbuf); s=GWEN_Buffer_GetStart(tbuf); /* user list */ num=GWEN_Dialog_GetIntProperty(dlg, "userCombo", GWEN_DialogProperty_ValueCount, 0, 0); for (i=0; i=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } const AB_COUNTRY *AB_EditAccountDialog_GetCurrentCurrency(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCurrencyString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void AB_EditAccountDialog_RebuildUserLists(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; AB_USER_LIST2 *users; GWEN_STRINGLIST *sl; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); GWEN_Dialog_SetIntProperty(dlg, "userCombo", GWEN_DialogProperty_ClearValues, 0, 0, 0); GWEN_Dialog_SetCharProperty(dlg, "userCombo", GWEN_DialogProperty_AddValue, 0, I18N("-- select --"), 0); /* setup lists of available and selected users */ sl=GWEN_StringList_new(); users=AB_Banking_FindUsers(xdlg->banking, AB_Account_GetBackendName(xdlg->account), "*", "*", "*", "*"); if (users) { AB_USER_LIST2_ITERATOR *it1; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); it1=AB_User_List2_First(users); if (it1) { AB_USER *u1; u1=AB_User_List2Iterator_Data(it1); while(u1) { createUserString(u1, tbuf); GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); GWEN_Buffer_Reset(tbuf); u1=AB_User_List2Iterator_Next(it1); } AB_User_List2Iterator_free(it1); } GWEN_Buffer_free(tbuf); } AB_User_List2_free(users); if (GWEN_StringList_Count(sl)) { GWEN_STRINGLISTENTRY *se; /* sort user list */ GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (s && *s) GWEN_Dialog_SetCharProperty(dlg, "userCombo", GWEN_DialogProperty_AddValue, 0, s, 0); se=GWEN_StringListEntry_Next(se); } } GWEN_StringList_free(sl); } void AB_EditAccountDialog_Init(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; AB_ACCOUNT_TYPE t; AB_USER *u; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit Account"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_Account_GetCountry(xdlg->account); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } /* setup currency */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCurrency; selectedCurrency=AB_Account_GetCurrency(xdlg->account); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCurrencyString(c, tbuf)==0) { const char *s; s=AB_Country_GetCurrencyCode(c); if (idx==-1 && selectedCurrency && s && strcasecmp(s, selectedCurrency)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "currencyCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "currencyCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_Account_GetBankCode(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBankName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetBIC(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountNumber(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNumberEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetAccountName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "accountNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetIBAN(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ibanEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_Account_GetOwnerName(xdlg->account); GWEN_Dialog_SetCharProperty(dlg, "ownerNameEdit", GWEN_DialogProperty_Value, 0, s, 0); /* setup account type */ GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("unknown"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Bank Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Credit Card Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Checking Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Savings Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Investment Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Cash Account"), 0); GWEN_Dialog_SetCharProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_AddValue, 0, I18N("Moneymarket Account"), 0); t=AB_Account_GetAccountType(xdlg->account); if (taccount); if (u) { int idx; idx=AB_EditAccountDialog_FindUserEntry(dlg, u); if (idx>=0) GWEN_Dialog_SetIntProperty(dlg, "userCombo", GWEN_DialogProperty_Value, 0, idx, 0); } /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AB_EditAccountDialog_fromGui(GWEN_DIALOG *dlg, AB_ACCOUNT *a, int quiet) { AB_EDIT_ACCOUNT_DIALOG *xdlg; int i; const char *s; const AB_COUNTRY *c; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "accountNumberEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); s=GWEN_Buffer_GetStart(tbuf); if (a) AB_Account_SetAccountNumber(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "accountNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetAccountName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "ibanEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetIBAN(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "ownerNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetOwnerName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get currency */ c=AB_EditAccountDialog_GetCurrentCurrency(dlg); if (c) AB_Account_SetCurrency(a, AB_Country_GetCurrencyCode(c)); i=GWEN_Dialog_GetIntProperty(dlg, "accountTypeCombo", GWEN_DialogProperty_Value, 0, 0); if (a) AB_Account_SetAccountType(a, i); /* get country */ c=AB_EditAccountDialog_GetCurrentCountry(dlg); if (c) { if (a) AB_Account_SetCountry(a, AB_Country_GetCode(c)); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetBankCode(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (a) AB_Account_SetBankName(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (a) AB_Account_SetBIC(a, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } if (a) { AB_USER *u; u=AB_EditAccountDialog_GetCurrentUser(dlg); AB_Account_SetSelectedUser(a, u); } return 0; } void AB_EditAccountDialog_Fini(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AB_EditAccountDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBankName(bi); GWEN_Dialog_SetCharProperty(dlg, "bankNameEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); s=AB_BankInfo_GetBic(bi); GWEN_Dialog_SetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AB_EditAccountDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AB_EDIT_ACCOUNT_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); rv=AB_EditAccountDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseAccount(xdlg->banking, xdlg->account); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock account. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AB_EditAccountDialog_fromGui(dlg, xdlg->account, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseAccount(xdlg->banking, xdlg->account, 0); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock account."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } int AB_EditAccountDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AB_EditAccountDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "okButton")==0) return AB_EditAccountDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_EditAccountDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_EDIT_ACCOUNT_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_ACCOUNT_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_EditAccountDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_EditAccountDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: DBG_NOTICE(0, "ValueChanged: %s", sender); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_EditAccountDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newuser.c0000644000175000017500000000334112364015477021027 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newuser_p.h" GWEN_INHERIT(GWEN_DIALOG, AB_NEWUSER_DIALOG) GWEN_DIALOG *AB_NewUserDialog_new(AB_BANKING *ab, const char *dname) { GWEN_DIALOG *dlg; AB_NEWUSER_DIALOG *xdlg; dlg=GWEN_Dialog_new(dname); GWEN_NEW_OBJECT(AB_NEWUSER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_NEWUSER_DIALOG, dlg, xdlg, AB_NewUserDialog_FreeData); xdlg->banking=ab; return dlg; } void GWENHYWFAR_CB AB_NewUserDialog_FreeData(void *bp, void *p) { AB_NEWUSER_DIALOG *xdlg; xdlg=(AB_NEWUSER_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } AB_USER *AB_NewUserDialog_GetUser(const GWEN_DIALOG *dlg) { AB_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->user; } void AB_NewUserDialog_SetUser(GWEN_DIALOG *dlg, AB_USER *u) { AB_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->user=u; } AB_BANKING *AB_NewUserDialog_GetBanking(const GWEN_DIALOG *dlg) { AB_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->banking; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_editaccount.h0000644000175000017500000000152412364015477021647 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_EDITACCOUNT_DIALOG_H #define AQBANKING_EDITACCOUNT_DIALOG_H #include #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API GWEN_DIALOG *AB_EditAccountDialog_new(AB_BANKING *ab, AB_ACCOUNT *a, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup.h0000644000175000017500000000157712364015477020515 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_SETUP_H #define AB_DLG_SETUP_H #include #include #include /** @defgroup G_AB_DIALOGS_SETUP Online Banking Setup Dialog * @ingroup G_AB_DIALOGS * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif AQBANKING_API GWEN_DIALOG *AB_SetupDialog_new(AB_BANKING *ab); #ifdef __cplusplus } #endif /*@}*/ #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbackend_p.h0000644000175000017500000000205512364015477022453 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SELECTBACKEND_P_H #define AQBANKING_DLG_SELECTBACKEND_P_H #include "dlg_selectbackend.h" typedef struct AB_SELECTBACKEND_DIALOG AB_SELECTBACKEND_DIALOG; struct AB_SELECTBACKEND_DIALOG { AB_BANKING *banking; char *selectedProvider; char *text; GWEN_PLUGIN_DESCRIPTION_LIST *pluginDescrList; }; static void GWENHYWFAR_CB AB_SelectBackendDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AB_SelectBackendDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbankinfo.c0000644000175000017500000003621512364015477022334 00000000000000/*************************************************************************** begin : Tue Apr 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_selectbankinfo_p.h" #include "i18n_l.h" #include #include #include #include #include #include #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 200 #define LIST_MINCOLWIDTH 50 GWEN_INHERIT(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG) GWEN_DIALOG *AB_SelectBankInfoDialog_new(AB_BANKING *ab, const char *country, const char *bankCode) { GWEN_DIALOG *dlg; AB_SELECTBANKINFO_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_selectbankinfo"); GWEN_NEW_OBJECT(AB_SELECTBANKINFO_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg, xdlg, AB_SelectBankInfoDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_SelectBankInfoDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_selectbankinfo.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; if (country) xdlg->country=strdup(country); else xdlg->country=strdup("de"); if (bankCode) xdlg->bankCode=strdup(bankCode); else xdlg->bankCode=NULL; /* done */ return dlg; } void GWENHYWFAR_CB AB_SelectBankInfoDialog_FreeData(void *bp, void *p) { AB_SELECTBANKINFO_DIALOG *xdlg; xdlg=(AB_SELECTBANKINFO_DIALOG*) p; AB_BankInfo_free(xdlg->selectedBankInfo); AB_BankInfo_List2_freeAll(xdlg->matchingBankInfos); free(xdlg->country); free(xdlg->bankCode); GWEN_FREE_OBJECT(xdlg); } static void createListBoxString(const AB_BANKINFO *bi, GWEN_BUFFER *tbuf) { const char *s; AB_BANKINFO_SERVICE *sv; uint32_t pos; int svsAdded=0; s=AB_BankInfo_GetBankId(bi); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); s=AB_BankInfo_GetBic(bi); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); s=AB_BankInfo_GetBankName(bi); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); s=AB_BankInfo_GetLocation(bi); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); pos=GWEN_Buffer_GetPos(tbuf); sv=AB_BankInfoService_List_First(AB_BankInfo_GetServices(bi)); while(sv) { const char *s; s=AB_BankInfoService_GetType(sv); if (s && *s) { const char *p; p=GWEN_Buffer_GetStart(tbuf)+pos; if (strstr(p, s)==NULL) { if (svsAdded) GWEN_Buffer_AppendString(tbuf, ", "); GWEN_Buffer_AppendString(tbuf, s); svsAdded++; } } sv=AB_BankInfoService_List_Next(sv); } } const AB_BANKINFO *AB_SelectBankInfoDialog_GetSelectedBankInfo(GWEN_DIALOG *dlg) { AB_SELECTBANKINFO_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); return xdlg->selectedBankInfo; } AB_BANKINFO *AB_SelectBankInfoDialog_DetermineSelectedBankInfo(GWEN_DIALOG *dlg) { AB_SELECTBANKINFO_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); if (xdlg->matchingBankInfos) { AB_BANKINFO_LIST2_ITERATOR *it; int idx; idx=GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "listBox", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText) { it=AB_BankInfo_List2_First(xdlg->matchingBankInfos); if (it) { AB_BANKINFO *bi; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); bi=AB_BankInfo_List2Iterator_Data(it); while(bi) { createListBoxString(bi, tbuf); if (strcasecmp(currentText, GWEN_Buffer_GetStart(tbuf))==0) { GWEN_Buffer_free(tbuf); AB_BankInfo_List2Iterator_free(it); return bi; } GWEN_Buffer_Reset(tbuf); bi=AB_BankInfo_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_BankInfo_List2Iterator_free(it); } } } } return NULL; } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } void AB_SelectBankInfoDialog_UpdateList(GWEN_DIALOG *dlg) { AB_SELECTBANKINFO_DIALOG *xdlg; AB_BANKINFO *tbi; const char *s; AB_BANKINFO_LIST2 *bl; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); /* clear bank info list */ GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_ClearValues, 0, 0, 0); if (xdlg->matchingBankInfos) AB_BankInfo_List2_freeAll(xdlg->matchingBankInfos); xdlg->matchingBankInfos=NULL; /* setup template */ tbi=AB_BankInfo_new(); /* set country */ AB_BankInfo_SetCountry(tbi, xdlg->country); /* set bank code */ s=GWEN_Dialog_GetCharProperty(dlg, "blzEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { int len; char *cpy; len=strlen(s); cpy=(char*) malloc(len+2); assert(cpy); memmove(cpy, s, len+1); /* copy including terminating zero char */ removeAllSpaces((uint8_t*)cpy); len=strlen(cpy); if (len) { /* append joker */ cpy[len]='*'; cpy[len+1]=0; } AB_BankInfo_SetBankId(tbi, cpy); free(cpy); } /* set bank code */ s=GWEN_Dialog_GetCharProperty(dlg, "bicEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { int len; char *cpy; len=strlen(s); cpy=(char*) malloc(len+2); assert(cpy); memmove(cpy, s, len+1); /* copy including terminating zero char */ removeAllSpaces((uint8_t*)cpy); len=strlen(cpy); if (len) { /* append joker */ cpy[len]='*'; cpy[len+1]=0; } AB_BankInfo_SetBic(tbi, cpy); free(cpy); } /* set bank name */ s=GWEN_Dialog_GetCharProperty(dlg, "nameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); GWEN_Buffer_AppendString(tbuf, "*"); AB_BankInfo_SetBankName(tbi, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* set bank name */ s=GWEN_Dialog_GetCharProperty(dlg, "locationEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); GWEN_Buffer_AppendString(tbuf, "*"); AB_BankInfo_SetLocation(tbi, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } bl=AB_BankInfo_List2_new(); rv=AB_Banking_GetBankInfoByTemplate(xdlg->banking, xdlg->country, tbi, bl); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); AB_BankInfo_List2_freeAll(bl); } else { AB_BANKINFO_LIST2_ITERATOR *it; it=AB_BankInfo_List2_First(bl); if (it) { AB_BANKINFO *bi; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); bi=AB_BankInfo_List2Iterator_Data(it); while(bi) { createListBoxString(bi, tbuf); GWEN_Dialog_SetCharProperty(dlg, "listBox", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); bi=AB_BankInfo_List2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_BankInfo_List2Iterator_free(it); } xdlg->matchingBankInfos=bl; } AB_BankInfo_free(tbi); if (GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_Value, 0, -1)>=0) GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 1, 0); else GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0); } void AB_SelectBankInfoDialog_Init(GWEN_DIALOG *dlg) { AB_SELECTBANKINFO_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; int j; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Select a Bank"), 0); GWEN_Dialog_SetCharProperty(dlg, "listBox", GWEN_DialogProperty_Title, 0, I18N("Bank Code\tBIC\tName\tLocation\tProtocols"), 0); GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* read bank column widths */ for (i=0; i<5; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "bank_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "listBox", GWEN_DialogProperty_SortDirection, i, j, 0); /* disable ok button */ GWEN_Dialog_SetIntProperty(dlg, "okButton", GWEN_DialogProperty_Enabled, 0, 0, 0); } void AB_SelectBankInfoDialog_Fini(GWEN_DIALOG *dlg) { AB_SELECTBANKINFO_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); /* store column widths of importer list */ GWEN_DB_DeleteVar(dbPrefs, "bank_list_columns"); for (i=0; i<5; i++) { int j; j=GWEN_Dialog_GetIntProperty(dlg, "listBox", GWEN_DialogProperty_ColumnWidth, i, -1); if (jselectedBankInfo=AB_BankInfo_dup(bi); return GWEN_DialogEvent_ResultAccept; } else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int AB_SelectBankInfoDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { const char *s; DBG_NOTICE(0, "Changed %s", sender); if (strcasecmp(sender, "blzEdit")==0 || strcasecmp(sender, "bicEdit")==0) { s=GWEN_Dialog_GetCharProperty(dlg, sender, GWEN_DialogProperty_Value, 0, NULL); if (s && strlen(s)>2) { AB_SelectBankInfoDialog_UpdateList(dlg); return GWEN_DialogEvent_ResultHandled; } } else if (strcasecmp(sender, "nameEdit")==0 || strcasecmp(sender, "locationEdit")==0) { s=GWEN_Dialog_GetCharProperty(dlg, sender, GWEN_DialogProperty_Value, 0, NULL); if (s && strlen(s)>3) { AB_SelectBankInfoDialog_UpdateList(dlg); return GWEN_DialogEvent_ResultHandled; } } else if (strcasecmp(sender, "listBox")==0) { return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_SelectBankInfoDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_SELECTBANKINFO_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBANKINFO_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_SelectBankInfoDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_SelectBankInfoDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AB_SelectBankInfoDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AB_SelectBankInfoDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_edituser.c0000644000175000017500000003225112364015477021165 00000000000000/*************************************************************************** begin : Fri Apr 16 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_edituser_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 200 GWEN_INHERIT(GWEN_DIALOG, AB_EDIT_USER_DIALOG) GWEN_DIALOG *AB_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock) { GWEN_DIALOG *dlg; AB_EDIT_USER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_edit_user"); GWEN_NEW_OBJECT(AB_EDIT_USER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg, xdlg, AB_EditUserDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_EditUserDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_edituser.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->user=u; xdlg->doLock=doLock; /* done */ return dlg; } void GWENHYWFAR_CB AB_EditUserDialog_FreeData(void *bp, void *p) { AB_EDIT_USER_DIALOG *xdlg; xdlg=(AB_EDIT_USER_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } static int createCountryString(const AB_COUNTRY *c, GWEN_BUFFER *tbuf) { const char *s; s=AB_Country_GetLocalName(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); s=AB_Country_GetCode(c); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " ("); GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, ")"); } return 0; } DBG_INFO(AQBANKING_LOGDOMAIN, "No local name"); return GWEN_ERROR_NO_DATA; } const AB_COUNTRY *AB_EditUserDialog_GetCurrentCountry(GWEN_DIALOG *dlg) { AB_EDIT_USER_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0) { const char *currentText; currentText=GWEN_Dialog_GetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, idx, NULL); if (currentText && *currentText && xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { if (createCountryString(c, tbuf)==0 && strcasecmp(GWEN_Buffer_GetStart(tbuf), currentText)==0) { GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); return c; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); } } } return NULL; } void AB_EditUserDialog_Init(GWEN_DIALOG *dlg) { AB_EDIT_USER_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; const char *s; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* init */ xdlg->countryList=AB_Banking_ListCountriesByName(xdlg->banking, "*"); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Edit User"), 0); /* setup country */ if (xdlg->countryList) { AB_COUNTRY_CONSTLIST2_ITERATOR *it; int idx=-1; const char *selectedCountry; selectedCountry=AB_User_GetCountry(xdlg->user); it=AB_Country_ConstList2_First(xdlg->countryList); if (it) { const AB_COUNTRY *c; GWEN_BUFFER *tbuf; GWEN_STRINGLIST *sl; GWEN_STRINGLISTENTRY *se; int i=0; sl=GWEN_StringList_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); c=AB_Country_ConstList2Iterator_Data(it); while(c) { GWEN_Buffer_AppendByte(tbuf, '1'); if (createCountryString(c, tbuf)==0) { const char *s; s=AB_Country_GetCode(c); if (idx==-1 && selectedCountry && s && strcasecmp(s, selectedCountry)==0) { char *p; p=GWEN_Buffer_GetStart(tbuf); if (p) *p='0'; idx=i; } GWEN_StringList_AppendString(sl, GWEN_Buffer_GetStart(tbuf), 0, 1); i++; } GWEN_Buffer_Reset(tbuf); c=AB_Country_ConstList2Iterator_Next(it); } GWEN_Buffer_free(tbuf); AB_Country_ConstList2Iterator_free(it); GWEN_StringList_Sort(sl, 1, GWEN_StringList_SortModeNoCase); idx=-1; i=0; se=GWEN_StringList_FirstEntry(sl); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (*s=='0') idx=i; GWEN_Dialog_SetCharProperty(dlg, "countryCombo", GWEN_DialogProperty_AddValue, 0, s+1, 0); i++; se=GWEN_StringListEntry_Next(se); } GWEN_StringList_free(sl); } if (idx>=0) /* chooses selected entry in combo box */ GWEN_Dialog_SetIntProperty(dlg, "countryCombo", GWEN_DialogProperty_Value, 0, idx, 0); } s=AB_User_GetUserName(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetBankCode(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetUserId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, s, 0); s=AB_User_GetCustomerId(xdlg->user); GWEN_Dialog_SetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, s, 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); } static void removeAllSpaces(uint8_t *s) { uint8_t *d; d=s; while(*s) { if (*s>33) *(d++)=*s; s++; } *d=0; } int AB_EditUserDialog_fromGui(GWEN_DIALOG *dlg, AB_USER *u, int quiet) { AB_EDIT_USER_DIALOG *xdlg; const char *s; const AB_COUNTRY *c; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); /* fromGui */ s=GWEN_Dialog_GetCharProperty(dlg, "userNameEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserName(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); removeAllSpaces((uint8_t*)GWEN_Buffer_GetStart(tbuf)); if (u) AB_User_SetBankCode(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "userIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetUserId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } s=GWEN_Dialog_GetCharProperty(dlg, "customerIdEdit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, s); GWEN_Text_CondenseBuffer(tbuf); if (u) AB_User_SetCustomerId(u, GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } /* get country */ c=AB_EditUserDialog_GetCurrentCountry(dlg); if (c) { if (u) AB_User_SetCountry(u, AB_Country_GetCode(c)); } return 0; } void AB_EditUserDialog_Fini(GWEN_DIALOG *dlg) { AB_EDIT_USER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AB_EditUserDialog_HandleActivatedBankCode(GWEN_DIALOG *dlg) { AB_EDIT_USER_DIALOG *xdlg; GWEN_DIALOG *dlg2; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); dlg2=AB_SelectBankInfoDialog_new(xdlg->banking, "de", NULL); if (dlg2==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(dlg2, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } else { const AB_BANKINFO *bi; bi=AB_SelectBankInfoDialog_GetSelectedBankInfo(dlg2); if (bi) { const char *s; s=AB_BankInfo_GetBankId(bi); GWEN_Dialog_SetCharProperty(dlg, "bankCodeEdit", GWEN_DialogProperty_Value, 0, (s && *s)?s:"", 0); } } GWEN_Dialog_free(dlg2); return GWEN_DialogEvent_ResultHandled; } int AB_EditUserDialog_HandleActivatedOk(GWEN_DIALOG *dlg) { AB_EDIT_USER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); rv=AB_EditUserDialog_fromGui(dlg, NULL, 0); if (rv<0) { return GWEN_DialogEvent_ResultHandled; } if (xdlg->doLock) { int rv; rv=AB_Banking_BeginExclUseUser(xdlg->banking, xdlg->user); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to lock user. Maybe already in use?"), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } AB_EditUserDialog_fromGui(dlg, xdlg->user, 1); if (xdlg->doLock) { int rv; rv=AB_Banking_EndExclUseUser(xdlg->banking, xdlg->user, 0); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL | GWEN_GUI_MSG_FLAGS_TYPE_ERROR | GWEN_GUI_MSG_FLAGS_CONFIRM_B1, I18N("Error"), I18N("Unable to unlock user."), I18N("Dismiss"), NULL, NULL, 0); return GWEN_DialogEvent_ResultHandled; } } return GWEN_DialogEvent_ResultAccept; } int AB_EditUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "bankCodeButton")==0) return AB_EditUserDialog_HandleActivatedBankCode(dlg); else if (strcasecmp(sender, "okButton")==0) return AB_EditUserDialog_HandleActivatedOk(dlg); else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open u help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_EDIT_USER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_EDIT_USER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_EditUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_EditUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: DBG_NOTICE(0, "ValueChanged: %s", sender); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_EditUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup_newuser.h0000644000175000017500000000225712364015477022261 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SETUP_NEWUSER_H #define AQBANKING_DLG_SETUP_NEWUSER_H #include #include /** @defgroup G_AB_DIALOGS_SETUP_NEWUSER Generic New User Dialog * @ingroup G_AB_DIALOGS * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * Creates a user creation assistent. * * @return pointer to the created dialog. * * @param banking pointer to the AqBanking object */ AQBANKING_API GWEN_DIALOG *AB_SetupNewUserDialog_new(AB_BANKING *ab); const char *AB_SetupNewUserDialog_GetSelectedBackend(const GWEN_DIALOG *dlg); int AB_SetupNewUserDialog_GetSelectedType(const GWEN_DIALOG *dlg); #ifdef __cplusplus } #endif /*@}*/ #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_edituser.h0000644000175000017500000000150512364015477021170 00000000000000/*************************************************************************** begin : Fri Apr 16 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_EDITUSER_DIALOG_H #define AQBANKING_EDITUSER_DIALOG_H #include #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API GWEN_DIALOG *AB_EditUserDialog_new(AB_BANKING *ab, AB_USER *u, int doLock); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newaccount_p.h0000644000175000017500000000145712364015477022037 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_NEWACCOUNT_P_H #define AB_DLG_NEWACCOUNT_P_H #include "dlg_newaccount_be.h" typedef struct AB_NEWACCOUNT_DIALOG AB_NEWACCOUNT_DIALOG; struct AB_NEWACCOUNT_DIALOG { AB_BANKING *banking; AB_ACCOUNT *account; }; static void GWENHYWFAR_CB AB_NewAccountDialog_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup.dlg0000644000175000017500000000463212364015477021027 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_editaccount.dlg0000644000175000017500000000632512364015477022172 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_page_p.h0000644000175000017500000000150312364015477022535 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_USERTYPE_PAGE_P_H #define AB_DLG_USERTYPE_PAGE_P_H #include "dlg_usertype_page_be.h" typedef struct AB_USERTYPE_PAGE_DIALOG AB_USERTYPE_PAGE_DIALOG; struct AB_USERTYPE_PAGE_DIALOG { AB_BANKING *banking; int selectedType; }; static void GWENHYWFAR_CB AB_UserTypePageDialog_FreeData(void *bp, void *p); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/Makefile.in0000644000175000017500000007146712643540055020423 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs/aqbanking/dialogs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libabdialogs_la_LIBADD = am_libabdialogs_la_OBJECTS = dlg_importer.lo dlg_selectbankinfo.lo \ dlg_setup.lo dlg_newaccount.lo dlg_newuser.lo \ dlg_selectbackend.lo dlg_editaccount.lo dlg_edituser.lo \ dlg_usertype_page.lo dlg_setup_newuser.lo \ dlg_usertype_pagedefault.lo libabdialogs_la_OBJECTS = $(am_libabdialogs_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libabdialogs_la_SOURCES) DIST_SOURCES = $(libabdialogs_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(iheaderdir)" DATA = $(dlgdata_DATA) HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) \ -I.. -I$(srcdir)/.. \ @all_includes@ AM_CFLAGS = -DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES = libabdialogs.la iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ dlg_importer.h \ dlg_selectbankinfo.h \ dlg_setup.h \ dlg_newaccount_be.h \ dlg_newuser_be.h \ dlg_selectbackend.h \ dlg_editaccount.h \ dlg_edituser.h \ dlg_usertype_page_be.h \ dlg_setup_newuser.h noinst_HEADERS = \ dlg_importer_p.h \ dlg_selectbankinfo_p.h \ dlg_setup_p.h \ dlg_newaccount_p.h \ dlg_newuser_p.h \ dlg_selectbackend_p.h \ dlg_editaccount_p.h \ dlg_edituser_p.h \ dlg_usertype_page_p.h \ dlg_setup_newuser_p.h \ dlg_usertype_pagedefault_l.h \ dlg_usertype_pagedefault_p.h libabdialogs_la_SOURCES = \ dlg_importer.c \ dlg_selectbankinfo.c \ dlg_setup.c \ dlg_newaccount.c \ dlg_newuser.c \ dlg_selectbackend.c \ dlg_editaccount.c \ dlg_edituser.c \ dlg_usertype_page.c \ dlg_setup_newuser.c \ dlg_usertype_pagedefault.c dlgdatadir = $(aqbanking_pkgdatadir)/dialogs dlgdata_DATA = \ dlg_importer.dlg \ dlg_selectbankinfo.dlg \ dlg_setup.dlg \ dlg_selectbackend.dlg \ dlg_editaccount.dlg \ dlg_edituser.dlg \ dlg_setup_newuser.dlg \ dlg_usertype_pagedefault.dlg EXTRA_DIST = $(typefiles) $(dlgdata_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbanking/dialogs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbanking/dialogs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libabdialogs.la: $(libabdialogs_la_OBJECTS) $(libabdialogs_la_DEPENDENCIES) $(EXTRA_libabdialogs_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libabdialogs_la_OBJECTS) $(libabdialogs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_editaccount.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_edituser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_importer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newaccount.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_newuser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_selectbackend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_selectbankinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_setup_newuser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_usertype_page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_usertype_pagedefault.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dlgdataDATA: $(dlgdata_DATA) @$(NORMAL_INSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dlgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dlgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dlgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dlgdatadir)" || exit $$?; \ done uninstall-dlgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dlgdata_DATA)'; test -n "$(dlgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(dlgdatadir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(dlgdatadir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dlgdataDATA install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dlgdataDATA uninstall-iheaderHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dlgdataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dlgdataDATA uninstall-iheaderHEADERS sources: for f in $(libabdialogs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_page.c0000644000175000017500000000354012364015477022214 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_usertype_page_p.h" GWEN_INHERIT(GWEN_DIALOG, AB_USERTYPE_PAGE_DIALOG) GWEN_DIALOG *AB_UserTypePageDialog_new(AB_BANKING *ab, const char *dname) { GWEN_DIALOG *dlg; AB_USERTYPE_PAGE_DIALOG *xdlg; dlg=GWEN_Dialog_new(dname); GWEN_NEW_OBJECT(AB_USERTYPE_PAGE_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_USERTYPE_PAGE_DIALOG, dlg, xdlg, AB_UserTypePageDialog_FreeData); xdlg->banking=ab; return dlg; } void GWENHYWFAR_CB AB_UserTypePageDialog_FreeData(void *bp, void *p) { AB_USERTYPE_PAGE_DIALOG *xdlg; xdlg=(AB_USERTYPE_PAGE_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } AB_BANKING *AB_UserTypePageDialog_GetBanking(const GWEN_DIALOG *dlg) { AB_USERTYPE_PAGE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_USERTYPE_PAGE_DIALOG, dlg); assert(xdlg); return xdlg->banking; } int AB_UserTypePageDialog_GetSelectedType(const GWEN_DIALOG *dlg) { AB_USERTYPE_PAGE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_USERTYPE_PAGE_DIALOG, dlg); assert(xdlg); return xdlg->selectedType; } void AB_UserTypePageDialog_SetSelectedType(GWEN_DIALOG *dlg, int t) { AB_USERTYPE_PAGE_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_USERTYPE_PAGE_DIALOG, dlg); assert(xdlg); xdlg->selectedType=t; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_edituser.dlg0000644000175000017500000000412012364015477021503 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup_newuser.c0000644000175000017500000003664112364015477022260 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_setup_newuser_p.h" #include "dlg_usertype_pagedefault_l.h" #include "dlg_usertype_page_be.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_BACKEND 1 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 400 GWEN_INHERIT(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG) GWEN_DIALOG *AB_SetupNewUserDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; AB_SETUP_NEWUSER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; GWEN_XMLNODE *n; GWEN_XMLNODE *nDialog; GWEN_PLUGIN_DESCRIPTION_LIST2 *providers; GWEN_DIALOG_LIST *subDialogs=NULL; dlg=GWEN_Dialog_new("ab_setup_newuser"); GWEN_NEW_OBJECT(AB_SETUP_NEWUSER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg, xdlg, AB_SetupNewUserDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_SetupNewUserDialog_SignalHandler); xdlg->backendDialogs=GWEN_Dialog_List2_new(); xdlg->backendRadioNames=GWEN_StringList_new(); xdlg->backendNames=GWEN_StringList_new(); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_setup_newuser.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read XML file, extend it */ n=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root"); rv=GWEN_XML_ReadFile(n, GWEN_Buffer_GetStart(fbuf), GWEN_XML_FLAGS_DEFAULT | GWEN_XML_FLAGS_HANDLE_HEADERS); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_XMLNode_free(n); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } nDialog=GWEN_XMLNode_FindFirstTag(n, "dialog", NULL, NULL); if (nDialog==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog element not found in XML file [%s]", GWEN_Buffer_GetStart(fbuf)); GWEN_XMLNode_free(n); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } providers=AB_Banking_GetProviderDescrs(ab); if (providers) { GWEN_XMLNODE *nBackendRadioWidget; nBackendRadioWidget=GWEN_XMLNode_FindFirstTag(nDialog, "widget", "name", "dialogVLayout"); if (nBackendRadioWidget) nBackendRadioWidget=GWEN_XMLNode_FindFirstTag(nBackendRadioWidget, "widget", "name", "wiz_stack"); if (nBackendRadioWidget) nBackendRadioWidget=GWEN_XMLNode_FindFirstTag(nBackendRadioWidget, "widget", "name", "backendRadioWidget"); subDialogs=GWEN_Dialog_List_new(); if (nBackendRadioWidget) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; pit=GWEN_PluginDescription_List2_First(providers); if (pit) { GWEN_PLUGIN_DESCRIPTION *pd; pd=GWEN_PluginDescription_List2Iterator_Data(pit); while(pd) { const char *name; name=GWEN_PluginDescription_GetName(pd); if (name && *name) { AB_PROVIDER *pro; pro=AB_Banking_GetProvider(ab, name); if (pro) { GWEN_DIALOG *cdlg; GWEN_BUFFER *tbuf; GWEN_XMLNODE *wn; const char *s; if (AB_Provider_GetFlags(pro) & AB_PROVIDER_FLAGS_HAS_USERTYPE_DIALOG) { cdlg=AB_ProviderGetUserTypeDialog(pro); if (cdlg==NULL) { DBG_WARN(AQBANKING_LOGDOMAIN, "Backend [%s] does not return a userType dialog, using default", name); cdlg=AB_UserTypePageDefaultDialog_new(ab); } } else cdlg=AB_UserTypePageDefaultDialog_new(ab); tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(tbuf, "backend_"); GWEN_Buffer_AppendString(tbuf, name); GWEN_Buffer_AppendString(tbuf, "_radio"); wn=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "widget"); GWEN_XMLNode_SetProperty(wn, "type", "radioButton"); GWEN_XMLNode_SetProperty(wn, "name", GWEN_Buffer_GetStart(tbuf)); GWEN_StringList_AppendString(xdlg->backendRadioNames, GWEN_Buffer_GetStart(tbuf), 0, 0); GWEN_StringList_AppendString(xdlg->backendNames, name, 0, 0); s=GWEN_PluginDescription_GetShortDescr(pd); if (!(s && *s)) s=name; GWEN_XMLNode_SetProperty(wn, "text", I18N(s)); GWEN_XMLNode_SetProperty(wn, "groupId", "999999"); GWEN_XMLNode_SetProperty(wn, "flags", "fillX justifyLeft"); GWEN_XMLNode_AddChild(nBackendRadioWidget, wn); GWEN_Dialog_List_Add(cdlg, subDialogs); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not activate backend [%s]", name); } } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } GWEN_PluginDescription_List2Iterator_free(pit); } } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Dialog description does not contain path [dialogVLayout/wiz_stack/backendRadioWidget]"); GWEN_XMLNode_Dump(nDialog, 2); GWEN_XMLNode_free(n); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXml(dlg, nDialog); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Dialog_List_free(subDialogs); GWEN_XMLNode_free(n); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_XMLNode_free(n); GWEN_Buffer_free(fbuf); /* insert pages for each backend */ if (GWEN_Dialog_List_GetCount(subDialogs)) { GWEN_DIALOG *cdlg; while ( (cdlg=GWEN_Dialog_List_First(subDialogs)) ) { GWEN_Dialog_List_Del(cdlg); DBG_NOTICE(AQBANKING_LOGDOMAIN, "Adding dialog %s", GWEN_Dialog_GetId(cdlg)); rv=GWEN_Dialog_AddSubDialog(dlg, "wiz_stack", cdlg); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Dialog_List_free(subDialogs); GWEN_Dialog_free(cdlg); GWEN_Dialog_free(dlg); return NULL; } GWEN_Dialog_List2_PushBack(xdlg->backendDialogs, cdlg); } } GWEN_Dialog_List_free(subDialogs); xdlg->banking=ab; /* done */ return dlg; } void GWENHYWFAR_CB AB_SetupNewUserDialog_FreeData(void *bp, void *p) { AB_SETUP_NEWUSER_DIALOG *xdlg; xdlg=(AB_SETUP_NEWUSER_DIALOG*) p; GWEN_Dialog_List2_free(xdlg->backendDialogs); /* don't use _freeAll here! */ GWEN_StringList_free(xdlg->backendRadioNames); GWEN_StringList_free(xdlg->backendNames); GWEN_FREE_OBJECT(xdlg); } void AB_SetupNewUserDialog_Init(GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("New User Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N("" "

This dialog assists you in creating an online banking user." "The following steps are:

" "
    " "
  • select the banking protocol
  • " "
  • select the type of user to create
  • " "
" "" "This dialog assists you in creating an online banking user.\n" "The following steps are:\n" " - select the banking protocol\n" " - select the type of user to create\n"), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AB_SetupNewUserDialog_Fini(GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); xdlg->selectedType=0; free(xdlg->selectedBackend); xdlg->selectedBackend=NULL; i=AB_SetupNewUserDialog_DetermineBackendIndex(dlg); if (i>=0) { const char *s; GWEN_DIALOG_LIST2_ITERATOR *it; s=GWEN_StringList_StringAt(xdlg->backendNames, i); if (s && *s) xdlg->selectedBackend=strdup(s); it=GWEN_Dialog_List2_First(xdlg->backendDialogs); if (it) { int j=i; GWEN_DIALOG *cdlg; cdlg=GWEN_Dialog_List2Iterator_Data(it); while(cdlg && j>0) { j--; cdlg=GWEN_Dialog_List2Iterator_Next(it); } GWEN_Dialog_List2Iterator_free(it); if (cdlg) xdlg->selectedType=AB_UserTypePageDialog_GetSelectedType(cdlg); } } /* save dialog settings */ dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AB_SetupNewUserDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AB_SETUP_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_BACKEND: GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; default: if (forwards){ DBG_NOTICE(0, "About to enter page %d", page); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Run"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AB_SetupNewUserDialog_DetermineBackendIndex(GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; GWEN_STRINGLISTENTRY *se; int i=0; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); se=GWEN_StringList_FirstEntry(xdlg->backendRadioNames); while(se) { const char *s; s=GWEN_StringListEntry_Data(se); if (GWEN_Dialog_GetIntProperty(dlg, s, GWEN_DialogProperty_Value, 0, 0)) break; i++; se=GWEN_StringListEntry_Next(se); } if (se) return i; return -1; } int AB_SetupNewUserDialog_Next(GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); DBG_NOTICE(0, "Value of wiz_stack: %d", page); if (page==PAGE_BEGIN) { DBG_NOTICE(0, "First page"); page++; return AB_SetupNewUserDialog_EnterPage(dlg, page, 1); } if (page==PAGE_BACKEND) { int idx; DBG_NOTICE(0, "Backend page"); idx=AB_SetupNewUserDialog_DetermineBackendIndex(dlg); if (idx!=-1) { page=idx+PAGE_BACKEND+1; return AB_SetupNewUserDialog_EnterPage(dlg, page, 1); } } else if (page>PAGE_BACKEND) return GWEN_DialogEvent_ResultAccept; return GWEN_DialogEvent_ResultHandled; } int AB_SetupNewUserDialog_Previous(GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); if (page>PAGE_BACKEND) { page=PAGE_BACKEND; return AB_SetupNewUserDialog_EnterPage(dlg, page, 0); } if (page==PAGE_BACKEND) { page=PAGE_BEGIN; return AB_SetupNewUserDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AB_SetupNewUserDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "wiz_prev_button")==0) return AB_SetupNewUserDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AB_SetupNewUserDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_SetupNewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_SETUP_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_SetupNewUserDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_SetupNewUserDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_SetupNewUserDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeValueChanged: case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } const char *AB_SetupNewUserDialog_GetSelectedBackend(const GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->selectedBackend; } int AB_SetupNewUserDialog_GetSelectedType(const GWEN_DIALOG *dlg) { AB_SETUP_NEWUSER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SETUP_NEWUSER_DIALOG, dlg); assert(xdlg); return xdlg->selectedType; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_importer.c0000644000175000017500000007626512364015477021217 00000000000000/*************************************************************************** begin : Tue Feb 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_importer_p.h" #include "i18n_l.h" #include #include #include #include #include #include #define PAGE_BEGIN 0 #define PAGE_FILE 1 #define PAGE_IMPORTER 2 #define PAGE_PROFILE 3 #define PAGE_END 4 #define IMPORTER_LIST_MINCOLWIDTH 50 #define PROFILE_LIST_MINCOLWIDTH 50 #define DIALOG_MINWIDTH 400 #define DIALOG_MINHEIGHT 400 GWEN_INHERIT(GWEN_DIALOG, AB_IMPORTER_DIALOG) GWEN_DIALOG *AB_ImporterDialog_new(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *finishedMessage) { GWEN_DIALOG *dlg; AB_IMPORTER_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_importwizard"); GWEN_NEW_OBJECT(AB_IMPORTER_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg, xdlg, AB_ImporterDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_ImporterDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_importer.dlg", fbuf); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; xdlg->context=ctx; xdlg->finishedMessage=finishedMessage; /* done */ return dlg; } void GWENHYWFAR_CB AB_ImporterDialog_FreeData(void *bp, void *p) { AB_IMPORTER_DIALOG *xdlg; xdlg=(AB_IMPORTER_DIALOG*) p; free(xdlg->fileName); free(xdlg->importerName); free(xdlg->profileName); GWEN_FREE_OBJECT(xdlg); } #if 0 const char *AB_ImporterDialog_GetFileName(const GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); return xdlg->fileName; } void AB_ImporterDialog_SetFileName(GWEN_DIALOG *dlg, const char *s) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); free(xdlg->fileName); if (s) xdlg->fileName=strdup(s); else xdlg->fileName=NULL; } const char *AB_ImporterDialog_GetImporterName(const GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); return xdlg->importerName; } void AB_ImporterDialog_SetImporterName(GWEN_DIALOG *dlg, const char *s) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); free(xdlg->importerName); if (s) xdlg->importerName=strdup(s); else xdlg->importerName=NULL; } const char *AB_ImporterDialog_GetProfileName(const GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); return xdlg->profileName; } void AB_ImporterDialog_SetProfileName(GWEN_DIALOG *dlg, const char *s) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); free(xdlg->profileName); if (s) xdlg->profileName=strdup(s); else xdlg->profileName=NULL; } #endif void AB_ImporterDialog_Init(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; int j; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("File Import Wizard"), 0); /* select first page */ GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, 0, 0); /* setup intro page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_begin_label", GWEN_DialogProperty_Title, 0, I18N( "" "

This dialog assists you in importing files." "The following steps are:

" "
    " "
  • select file to import
  • " "
  • select importer module
  • " "
  • select importer profile
  • " "
" "" "This dialog assists you in importing files.\n" "The following steps are:\n" "- select file to import\n" "- select importer module\n" "- select importer profile\n"), 0); /* setup file page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_file_label", GWEN_DialogProperty_Title, 0, I18N("Please select the file to import."), 0); /* setup importer page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_importer_label", GWEN_DialogProperty_Title, 0, I18N("Please select the import module for the file."), 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_Title, 0, I18N("Name\tDescription"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); /* setup profile page */ GWEN_Dialog_SetCharProperty(dlg, "wiz_profile_label", GWEN_DialogProperty_Title, 0, I18N("Please select the import profile for the file."), 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Title, 0, I18N("Name\tDescription"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_SelectionMode, 0, GWEN_Dialog_SelectionMode_Single, 0); /* setup extro page */ if (xdlg->finishedMessage && *(xdlg->finishedMessage)) GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, xdlg->finishedMessage, 0); else GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The file has been successfully imported."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); /* read importer column widths */ for (i=0; i<2; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "importer_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_SortDirection, i, j, 0); /* read profile column widths */ for (i=0; i<2; i++) { j=GWEN_DB_GetIntValue(dbPrefs, "profile_list_columns", i, -1); if (j=0 && j>=0) GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_SortDirection, i, j, 0); /* disable next and previous buttons */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } void AB_ImporterDialog_Fini(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); /* store column widths of importer list */ GWEN_DB_DeleteVar(dbPrefs, "importer_list_columns"); for (i=0; i<2; i++) { int j; j=GWEN_Dialog_GetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_ColumnWidth, i, -1); if (jbanking); if (il) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *ilit; ilit=GWEN_PluginDescription_List2_First(il); if (ilit) { GWEN_PLUGIN_DESCRIPTION *pd; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); pd=GWEN_PluginDescription_List2Iterator_Data(ilit); while(pd) { const char *s; s=GWEN_PluginDescription_GetName(pd); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); s=GWEN_PluginDescription_GetShortDescr(pd); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Dialog_SetCharProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); } pd=GWEN_PluginDescription_List2Iterator_Next(ilit); } GWEN_Buffer_free(tbuf); GWEN_PluginDescription_List2Iterator_free(ilit); } GWEN_PluginDescription_List2_free(il); } GWEN_Dialog_SetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_Sort, 0, 0, 0); } int AB_ImporterDialog_DetermineSelectedImporter(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); /* preset */ free(xdlg->importerName); xdlg->importerName=NULL; /* get current value */ rv=GWEN_Dialog_GetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_Value, 0, -1); DBG_NOTICE(0, "Selected value: %d", rv); if (rv!=-1) { const char *s; s=GWEN_Dialog_GetCharProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_Value, rv, NULL); if (s && *s) { const char *p; p=strchr(s, '\t'); if (p) { int len; len=(int) (p-s); if (len) { xdlg->importerName=(char*) malloc(len+1); assert(xdlg->importerName); memmove(xdlg->importerName, s, len); xdlg->importerName[len]=0; } } else /* no tab, use the whole line */ xdlg->importerName=strdup(s); if (xdlg->importerName) { DBG_NOTICE(0, "Selected importer [%s]", xdlg->importerName); return 0; } } } return GWEN_ERROR_NOT_FOUND; } void AB_ImporterDialog_UpdateProfileList(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_ClearValues, 0, 0, 0); if (xdlg->importerName && *(xdlg->importerName)) { GWEN_DB_NODE *db; db=AB_Banking_GetImExporterProfiles(xdlg->banking, xdlg->importerName); if (db) { GWEN_DB_NODE *dbProfile; GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 256, 0, 1); dbProfile=GWEN_DB_GetFirstGroup(db); while(dbProfile) { const char *s; s=GWEN_DB_GetCharValue(dbProfile, "name", 0, NULL); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); GWEN_Buffer_AppendString(tbuf, "\t"); s=GWEN_DB_GetCharValue(dbProfile, "shortDescr", 0, NULL); if (s && *s) GWEN_Buffer_AppendString(tbuf, s); GWEN_Dialog_SetCharProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); } dbProfile=GWEN_DB_GetNextGroup(dbProfile); } GWEN_Buffer_free(tbuf); GWEN_DB_Group_free(db); } } GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Sort, 0, 0, 0); } int AB_ImporterDialog_DetermineSelectedProfile(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); /* preset */ free(xdlg->profileName); xdlg->profileName=NULL; /* get current value */ rv=GWEN_Dialog_GetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Value, 0, -1); DBG_NOTICE(0, "Selected value: %d", rv); if (rv!=-1) { const char *s; s=GWEN_Dialog_GetCharProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Value, rv, NULL); if (s && *s) { const char *p; p=strchr(s, '\t'); if (p) { int len; len=(int) (p-s); if (len) { xdlg->profileName=(char*) malloc(len+1); assert(xdlg->profileName); memmove(xdlg->profileName, s, len); xdlg->profileName[len]=0; } } else /* no tab, use the whole line */ xdlg->profileName=strdup(s); if (xdlg->profileName) { DBG_NOTICE(0, "Selected profile [%s]", xdlg->profileName); return 0; } } } return GWEN_ERROR_NOT_FOUND; } int AB_ImporterDialog_FindIndexOfProfile(GWEN_DIALOG *dlg, const char *proname) { AB_IMPORTER_DIALOG *xdlg; int cnt; int slen; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); slen=strlen(proname); cnt=GWEN_Dialog_GetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_ValueCount, 0, -1); if (cnt>0 && slen>0) { int i; for (i=0; ifileName); xdlg->fileName=NULL; s=GWEN_Dialog_GetCharProperty(dlg, "wiz_file_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) { xdlg->fileName=strdup(s); return 0; } return GWEN_ERROR_NOT_FOUND; } int AB_ImporterDialog_EnterPage(GWEN_DIALOG *dlg, int page, int forwards) { AB_IMPORTER_DIALOG *xdlg; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); switch(page) { case PAGE_BEGIN: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_FILE: GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 1, 0); rv=AB_ImporterDialog_DetermineFilename(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_IMPORTER: if (forwards) { AB_ImporterDialog_DetermineFilename(dlg); AB_ImporterDialog_UpdateImporterList(dlg); GWEN_Dialog_SetIntProperty(dlg, "wiz_importer_list", GWEN_DialogProperty_Value, 0, 0, 0); } rv=AB_ImporterDialog_DetermineSelectedImporter(dlg); if (rv<0) { /* TODO: show error message */ GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); } else { /* we have a selected importer, enable "next" button */ GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_PROFILE: if (forwards) { AB_ImporterDialog_DetermineSelectedImporter(dlg); AB_ImporterDialog_UpdateProfileList(dlg); GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Value, 0, 0, 0); } rv=AB_ImporterDialog_DetermineSelectedProfile(dlg); if (rv<0) { /* TODO: show error message */ GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); } else { /* we have a selected importer, enable "next" button */ GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Next"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; case PAGE_END: if (forwards){ rv=AB_ImporterDialog_DetermineSelectedProfile(dlg); if (rv<0) { /* no profile... */ DBG_ERROR(0, "No profile"); } else { rv=AB_Banking_ImportFileWithProfile(xdlg->banking, xdlg->importerName, xdlg->context, xdlg->profileName, NULL, xdlg->fileName); if (rv<0) { /* TODO: show error message */ DBG_ERROR(0, "Error importing file: %d", rv); AB_ImExporterContext_Clear(xdlg->context); } else { DBG_NOTICE(0, "Import ok."); /* no way back */ GWEN_Dialog_SetIntProperty(dlg, "wiz_prev_button", GWEN_DialogProperty_Enabled, 0, 0, 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); GWEN_Dialog_SetCharProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Title, 0, I18N("Finished"), 0); GWEN_Dialog_SetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, page, 0); return GWEN_DialogEvent_ResultHandled; } } } return GWEN_DialogEvent_ResultHandled; default: return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultHandled; } int AB_ImporterDialog_Next(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; int page; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); page=GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1); DBG_NOTICE(0, "Value of wiz_stack: %d", page); if (pagePAGE_BEGIN) { page--; return AB_ImporterDialog_EnterPage(dlg, page, 0); } return GWEN_DialogEvent_ResultHandled; } int AB_ImporterDialog_EditProfile(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); if (AB_ImporterDialog_DetermineSelectedProfile(dlg)==0) { AB_IMEXPORTER *ie; GWEN_DB_NODE *dbProfiles; GWEN_DB_NODE *dbT; GWEN_DIALOG *edlg=NULL; const char *s; char *fileNameCopy=NULL; int rv; ie=AB_Banking_GetImExporter(xdlg->banking, xdlg->importerName); if (ie==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "ImExporter [%s] not found", xdlg->importerName); return GWEN_DialogEvent_ResultHandled; } dbProfiles=AB_Banking_GetImExporterProfiles(xdlg->banking, xdlg->importerName); if (dbProfiles==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "ImExporter [%s] has no profiles", xdlg->importerName); return GWEN_DialogEvent_ResultHandled; } dbT=GWEN_DB_GetFirstGroup(dbProfiles); while(dbT) { const char *s; s=GWEN_DB_GetCharValue(dbT, "name", 0, NULL); if (s && *s && strcasecmp(s, xdlg->profileName)==0) break; dbT=GWEN_DB_GetNextGroup(dbT); } if (dbT==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Profile [%s] for ImExporter [%s] not found", xdlg->profileName, xdlg->importerName); GWEN_DB_Group_free(dbProfiles); return GWEN_DialogEvent_ResultHandled; } s=GWEN_DB_GetCharValue(dbT, "fileName", 0, NULL); if (!(s && *s)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No filename, can't save profile"); GWEN_DB_Group_free(dbProfiles); return GWEN_DialogEvent_ResultHandled; } fileNameCopy=strdup(s); rv=AB_ImExporter_GetEditProfileDialog(ie, dbT, xdlg->fileName, &edlg); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "ImExporter [%s] has no EditProfileDialog", xdlg->importerName); free(fileNameCopy); GWEN_DB_Group_free(dbProfiles); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(edlg, 0); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); free(fileNameCopy); GWEN_Dialog_free(edlg); GWEN_DB_Group_free(dbProfiles); return GWEN_DialogEvent_ResultHandled; } if (rv==1) { const char *proname; /* accepted */ proname=GWEN_DB_GetCharValue(dbT, "name", 0, NULL); DBG_NOTICE(0, "Accepted, writing profile"); rv=AB_Banking_SaveLocalImExporterProfile(xdlg->banking, xdlg->importerName, dbT, fileNameCopy); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); free(fileNameCopy); GWEN_Dialog_free(edlg); GWEN_DB_Group_free(dbProfiles); return GWEN_DialogEvent_ResultHandled; } /* reload "wiz_profile_list", select new profile */ AB_ImporterDialog_UpdateProfileList(dlg); if (proname && *proname) { int idx; idx=AB_ImporterDialog_FindIndexOfProfile(dlg, proname); if (idx>=0) { GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Value, 0, idx, 1); AB_ImporterDialog_DetermineSelectedProfile(dlg); } } } GWEN_Dialog_free(edlg); free(fileNameCopy); GWEN_DB_Group_free(dbProfiles); } return GWEN_DialogEvent_ResultHandled; } int AB_ImporterDialog_NewProfile(GWEN_DIALOG *dlg) { AB_IMPORTER_DIALOG *xdlg; AB_IMEXPORTER *ie; GWEN_DB_NODE *dbProfile; GWEN_DIALOG *edlg=NULL; char *fileNameCopy=NULL; int rv; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); ie=AB_Banking_GetImExporter(xdlg->banking, xdlg->importerName); if (ie==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "ImExporter [%s] not found", xdlg->importerName); return GWEN_DialogEvent_ResultHandled; } dbProfile=GWEN_DB_Group_new("profile"); rv=AB_ImExporter_GetEditProfileDialog(ie, dbProfile, xdlg->fileName, &edlg); if (rv<0) { DBG_ERROR(AQBANKING_LOGDOMAIN, "ImExporter [%s] has no EditProfileDialog", xdlg->importerName); GWEN_DB_Group_free(dbProfile); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ExecDialog(edlg, 0); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Dialog_free(edlg); GWEN_DB_Group_free(dbProfile); return GWEN_DialogEvent_ResultHandled; } if (rv==1) { const char *proname; /* accepted */ proname=GWEN_DB_GetCharValue(dbProfile, "name", 0, NULL); DBG_NOTICE(0, "Accepted, writing profile"); rv=AB_Banking_SaveLocalImExporterProfile(xdlg->banking, xdlg->importerName, dbProfile, fileNameCopy); if (rv<0) { DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv); GWEN_Dialog_free(edlg); GWEN_DB_Group_free(dbProfile); return GWEN_DialogEvent_ResultHandled; } /* reload "wiz_profile_list", select new profile */ AB_ImporterDialog_UpdateProfileList(dlg); if (proname && *proname) { int idx; idx=AB_ImporterDialog_FindIndexOfProfile(dlg, proname); if (idx>=0) { GWEN_Dialog_SetIntProperty(dlg, "wiz_profile_list", GWEN_DialogProperty_Value, 0, idx, 1); AB_ImporterDialog_DetermineSelectedProfile(dlg); } } } GWEN_Dialog_free(edlg); GWEN_DB_Group_free(dbProfile); return GWEN_DialogEvent_ResultHandled; } int AB_ImporterDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "wiz_prev_button")==0) return AB_ImporterDialog_Previous(dlg); else if (strcasecmp(sender, "wiz_next_button")==0) return AB_ImporterDialog_Next(dlg); else if (strcasecmp(sender, "wiz_abort_button")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "wiz_help_button")==0) { /* TODO: open a help dialog */ } else if (strcasecmp(sender, "wiz_importer_list")==0) { if (AB_ImporterDialog_DetermineSelectedImporter(dlg)<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else if (strcasecmp(sender, "wiz_file_button")==0) { int rv; const char *s; GWEN_BUFFER *pathBuffer; pathBuffer=GWEN_Buffer_new(0, 256, 0, 1); s=GWEN_Dialog_GetCharProperty(dlg, "wiz_file_edit", GWEN_DialogProperty_Value, 0, NULL); if (s && *s) GWEN_Buffer_AppendString(pathBuffer, s); rv=GWEN_Gui_GetFileName(I18N("Select File to Import"), GWEN_Gui_FileNameType_OpenFileName, 0, I18N("All Files (*)\tCSV Files (*csv;*.CSV)\t*.sta"), pathBuffer, GWEN_Dialog_GetGuiId(dlg)); if (rv==0) { GWEN_Dialog_SetCharProperty(dlg, "wiz_file_edit", GWEN_DialogProperty_Value, 0, GWEN_Buffer_GetStart(pathBuffer), 0); rv=AB_ImporterDialog_DetermineFilename(dlg); if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } else { DBG_NOTICE(AQBANKING_LOGDOMAIN, "here (%d)", rv); } GWEN_Buffer_free(pathBuffer); return GWEN_DialogEvent_ResultNotHandled; } else if (strcasecmp(sender, "wiz_profile_edit_button")==0) { return AB_ImporterDialog_EditProfile(dlg); } else if (strcasecmp(sender, "wiz_profile_new_button")==0) { return AB_ImporterDialog_NewProfile(dlg); } else if (strcasecmp(sender, "wiz_profile_del_button")==0) { /* TODO: get appropriate profile editor */ } return GWEN_DialogEvent_ResultNotHandled; } int AB_ImporterDialog_HandleValueChanged(GWEN_DIALOG *dlg, const char *sender) { if (strcasecmp(sender, "wiz_file_edit")==0) { int rv; rv=AB_ImporterDialog_DetermineFilename(dlg); if (GWEN_Dialog_GetIntProperty(dlg, "wiz_stack", GWEN_DialogProperty_Value, 0, -1)==PAGE_FILE) { if (rv<0) GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 0, 0); else GWEN_Dialog_SetIntProperty(dlg, "wiz_next_button", GWEN_DialogProperty_Enabled, 0, 1, 0); } return GWEN_DialogEvent_ResultHandled; } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_ImporterDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_IMPORTER_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_IMPORTER_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_ImporterDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_ImporterDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return AB_ImporterDialog_HandleValueChanged(dlg, sender); case GWEN_DialogEvent_TypeActivated: return AB_ImporterDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_importer_p.h0000644000175000017500000000336312364015477021530 00000000000000/*************************************************************************** begin : Tue Feb 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_IMPORTER_P_H #define AQBANKING_DLG_IMPORTER_P_H #include "dlg_importer.h" #include typedef struct AB_IMPORTER_DIALOG AB_IMPORTER_DIALOG; struct AB_IMPORTER_DIALOG { AB_BANKING *banking; AB_IMEXPORTER_CONTEXT *context; const char *finishedMessage; char *fileName; char *importerName; char *profileName; }; static GWENHYWFAR_CB void AB_ImporterDialog_FreeData(void *bp, void *p); #if 0 static const char *AB_ImporterDialog_GetFileName(const GWEN_DIALOG *dlg); static void AB_ImporterDialog_SetFileName(GWEN_DIALOG *dlg, const char *s); static const char *AB_ImporterDialog_GetImporterName(const GWEN_DIALOG *dlg); static void AB_ImporterDialog_SetImporterName(GWEN_DIALOG *dlg, const char *s); static const char *AB_ImporterDialog_GetProfileName(const GWEN_DIALOG *dlg); static void AB_ImporterDialog_SetProfileName(GWEN_DIALOG *dlg, const char *s); #endif static int AB_ImporterDialog_FindIndexOfProfile(GWEN_DIALOG *dlg, const char *proname); static int AB_ImporterDialog_EditProfile(GWEN_DIALOG *dlg); static int AB_ImporterDialog_NewProfile(GWEN_DIALOG *dlg); static GWENHYWFAR_CB int AB_ImporterDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbankinfo.h0000644000175000017500000000210412364015477022327 00000000000000/*************************************************************************** begin : Tue Apr 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SELECTBANKINFO_H #define AQBANKING_DLG_SELECTBANKINFO_H #include #include #include #ifdef __cplusplus extern "C" { #endif /** @defgroup G_AB_DIALOGS_SELECT_BANKINFO Bank Finder Dialog * @ingroup G_AB_DIALOGS * */ /*@{*/ AQBANKING_API GWEN_DIALOG *AB_SelectBankInfoDialog_new(AB_BANKING *ab, const char *country, const char *bankCode); AQBANKING_API const AB_BANKINFO *AB_SelectBankInfoDialog_GetSelectedBankInfo(GWEN_DIALOG *dlg); /*@}*/ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_editaccount_p.h0000644000175000017500000000202512364015477022163 00000000000000/*************************************************************************** begin : Thu Apr 15 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_EDITACCOUNT_DIALOG_P_H #define AQBANKING_EDITACCOUNT_DIALOG_P_H #include "dlg_editaccount.h" typedef struct AB_EDIT_ACCOUNT_DIALOG AB_EDIT_ACCOUNT_DIALOG; struct AB_EDIT_ACCOUNT_DIALOG { AB_BANKING *banking; AB_ACCOUNT *account; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB AB_EditAccountDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AB_EditAccountDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/Makefile.am0000644000175000017500000000307312364015477020403 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) \ -I.. -I$(srcdir)/.. \ @all_includes@ AM_CFLAGS=-DBUILDING_AQBANKING @visibility_cflags@ noinst_LTLIBRARIES=libabdialogs.la iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=\ dlg_importer.h \ dlg_selectbankinfo.h \ dlg_setup.h \ dlg_newaccount_be.h \ dlg_newuser_be.h \ dlg_selectbackend.h \ dlg_editaccount.h \ dlg_edituser.h \ dlg_usertype_page_be.h \ dlg_setup_newuser.h noinst_HEADERS=\ dlg_importer_p.h \ dlg_selectbankinfo_p.h \ dlg_setup_p.h \ dlg_newaccount_p.h \ dlg_newuser_p.h \ dlg_selectbackend_p.h \ dlg_editaccount_p.h \ dlg_edituser_p.h \ dlg_usertype_page_p.h \ dlg_setup_newuser_p.h \ dlg_usertype_pagedefault_l.h \ dlg_usertype_pagedefault_p.h libabdialogs_la_SOURCES=\ dlg_importer.c \ dlg_selectbankinfo.c \ dlg_setup.c \ dlg_newaccount.c \ dlg_newuser.c \ dlg_selectbackend.c \ dlg_editaccount.c \ dlg_edituser.c \ dlg_usertype_page.c \ dlg_setup_newuser.c \ dlg_usertype_pagedefault.c dlgdatadir=$(aqbanking_pkgdatadir)/dialogs dlgdata_DATA=\ dlg_importer.dlg \ dlg_selectbankinfo.dlg \ dlg_setup.dlg \ dlg_selectbackend.dlg \ dlg_editaccount.dlg \ dlg_edituser.dlg \ dlg_setup_newuser.dlg \ dlg_usertype_pagedefault.dlg EXTRA_DIST=$(typefiles) $(dlgdata_DATA) sources: for f in $(libabdialogs_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done for f in $(dlgdata_DATA); do \ echo $(subdir)/$$f >>$(top_srcdir)/dlgsources; \ done for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup_newuser_p.h0000644000175000017500000000226112364015477022573 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SETUP_NEWUSER_P_H #define AQBANKING_DLG_SETUP_NEWUSER_P_H #include "dlg_setup_newuser.h" typedef struct AB_SETUP_NEWUSER_DIALOG AB_SETUP_NEWUSER_DIALOG; struct AB_SETUP_NEWUSER_DIALOG { AB_BANKING *banking; GWEN_DIALOG_LIST2 *backendDialogs; GWEN_STRINGLIST *backendRadioNames; GWEN_STRINGLIST *backendNames; char *selectedBackend; int selectedType; }; static GWENHYWFAR_CB void AB_SetupNewUserDialog_FreeData(void *bp, void *p); static GWENHYWFAR_CB int AB_SetupNewUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); static int AB_SetupNewUserDialog_DetermineBackendIndex(GWEN_DIALOG *dlg); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_setup_p.h0000644000175000017500000000160412364015477021023 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_SETUP_P_H #define AB_DLG_SETUP_P_H #include "dlg_setup.h" typedef struct AB_SETUP_DIALOG AB_SETUP_DIALOG; struct AB_SETUP_DIALOG { AB_BANKING *banking; }; static void GWENHYWFAR_CB AB_SetupDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AB_SetupDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_page_be.h0000644000175000017500000000257112364015477022672 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_USERTYPE_PAGE_BE_H #define AB_DLG_USERTYPE_PAGE_BE_H #include #include #ifdef __cplusplus extern "C" { #endif /** * This is the base class for a user setup type page. * It is the page shown after the user selected a backend for which a new user is to * be created. This page will then allow the user to choose the type of user setup. * For HBCI there are many options (like PinTan, chipcard, keyfile etc). For others * there might be only one option. */ AQBANKING_API GWEN_DIALOG *AB_UserTypePageDialog_new(AB_BANKING *ab, const char *dname); AQBANKING_API AB_BANKING *AB_UserTypePageDialog_GetBanking(const GWEN_DIALOG *dlg); AQBANKING_API int AB_UserTypePageDialog_GetSelectedType(const GWEN_DIALOG *dlg); AQBANKING_API void AB_UserTypePageDialog_SetSelectedType(GWEN_DIALOG *dlg, int t); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbankinfo_p.h0000644000175000017500000000211612364015477022651 00000000000000/*************************************************************************** begin : Tue Apr 13 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_SELECTBANKINFO_P_H #define AQBANKING_DLG_SELECTBANKINFO_P_H #include "dlg_selectbankinfo.h" typedef struct AB_SELECTBANKINFO_DIALOG AB_SELECTBANKINFO_DIALOG; struct AB_SELECTBANKINFO_DIALOG { AB_BANKING *banking; char *country; char *bankCode; AB_BANKINFO_LIST2 *matchingBankInfos; AB_BANKINFO *selectedBankInfo; }; static GWENHYWFAR_CB void AB_SelectBankInfoDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AB_SelectBankInfoDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_pagedefault.c0000644000175000017500000000720512364015477023563 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_usertype_pagedefault_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #include GWEN_DIALOG *AB_UserTypePageDefaultDialog_new(AB_BANKING *ab) { GWEN_DIALOG *dlg; GWEN_BUFFER *fbuf; int rv; dlg=AB_UserTypePageDialog_new(ab, "ab_usertype_pagedefault"); GWEN_Dialog_SetSignalHandler(dlg, AB_UserTypePageDefaultDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_usertype_pagedefault.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); /* add media paths for icons */ GWEN_Dialog_AddMediaPathsFromPathManager(dlg, GWEN_PM_LIBNAME, GWEN_PM_SYSDATADIR, "aqbanking/dialogs/dialogs"); /* done */ return dlg; } void AB_UserTypePageDefaultDialog_Init(GWEN_DIALOG *dlg) { GWEN_Dialog_SetCharProperty(dlg, "defaultIntroLabel", GWEN_DialogProperty_Title, 0, I18N("" "

Click on the run button below to create the user.

" "" "Click on the RUN button below to create the user."), 0); } void AB_UserTypePageDefaultDialog_Fini(GWEN_DIALOG *dlg) { DBG_NOTICE(AQBANKING_LOGDOMAIN, "fini called"); AB_UserTypePageDialog_SetSelectedType(dlg, 0); } int AB_UserTypePageDefaultDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { /* nothing for now */ return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_UserTypePageDefaultDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { switch(t) { case GWEN_DialogEvent_TypeInit: AB_UserTypePageDefaultDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_UserTypePageDefaultDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_UserTypePageDefaultDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newaccount.c0000644000175000017500000000305712364015477021511 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_newaccount_p.h" GWEN_INHERIT(GWEN_DIALOG, AB_NEWACCOUNT_DIALOG) GWEN_DIALOG *AB_NewAccountDialog_new(AB_BANKING *ab, const char *dname) { GWEN_DIALOG *dlg; AB_NEWACCOUNT_DIALOG *xdlg; dlg=GWEN_Dialog_new(dname); GWEN_NEW_OBJECT(AB_NEWACCOUNT_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_NEWACCOUNT_DIALOG, dlg, xdlg, AB_NewAccountDialog_FreeData); return dlg; } void GWENHYWFAR_CB AB_NewAccountDialog_FreeData(void *bp, void *p) { AB_NEWACCOUNT_DIALOG *xdlg; xdlg=(AB_NEWACCOUNT_DIALOG*) p; GWEN_FREE_OBJECT(xdlg); } AB_ACCOUNT *AB_NewAccountDialog_GetAccount(const GWEN_DIALOG *dlg) { AB_NEWACCOUNT_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_NEWACCOUNT_DIALOG, dlg); assert(dlg); return xdlg->account; } void AB_NewAccountDialog_SetAccount(GWEN_DIALOG *dlg, AB_ACCOUNT *a) { AB_NEWACCOUNT_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_NEWACCOUNT_DIALOG, dlg); assert(dlg); xdlg->account=a; } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_edituser_p.h0000644000175000017500000000176112364015477021513 00000000000000/*************************************************************************** begin : Fri Apr 16 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_EDITUSER_DIALOG_P_H #define AQBANKING_EDITUSER_DIALOG_P_H #include "dlg_edituser.h" typedef struct AB_EDIT_USER_DIALOG AB_EDIT_USER_DIALOG; struct AB_EDIT_USER_DIALOG { AB_BANKING *banking; AB_USER *user; int doLock; AB_COUNTRY_CONSTLIST2 *countryList; }; static void GWENHYWFAR_CB AB_EditUserDialog_FreeData(void *bp, void *p); static int GWENHYWFAR_CB AB_EditUserDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender); #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbackend.dlg0000644000175000017500000000301012364015477022443 00000000000000 aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_selectbackend.c0000644000175000017500000002472212364015477022134 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "dlg_selectbackend_p.h" #include "i18n_l.h" #include #include #include #include #include #include #include #include #include #define DIALOG_MINWIDTH 200 #define DIALOG_MINHEIGHT 100 GWEN_INHERIT(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG) GWEN_DIALOG *AB_SelectBackendDialog_new(AB_BANKING *ab, const char *text) { GWEN_DIALOG *dlg; AB_SELECTBACKEND_DIALOG *xdlg; GWEN_BUFFER *fbuf; int rv; dlg=GWEN_Dialog_new("ab_selectbackend"); GWEN_NEW_OBJECT(AB_SELECTBACKEND_DIALOG, xdlg); GWEN_INHERIT_SETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg, xdlg, AB_SelectBackendDialog_FreeData); GWEN_Dialog_SetSignalHandler(dlg, AB_SelectBackendDialog_SignalHandler); /* get path of dialog description file */ fbuf=GWEN_Buffer_new(0, 256, 0, 1); rv=GWEN_PathManager_FindFile(AB_PM_LIBNAME, AB_PM_DATADIR, "aqbanking/dialogs/dlg_selectbackend.dlg", fbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Dialog description file not found (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } /* read dialog from dialog description file */ rv=GWEN_Dialog_ReadXmlFile(dlg, GWEN_Buffer_GetStart(fbuf)); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d).", rv); GWEN_Buffer_free(fbuf); GWEN_Dialog_free(dlg); return NULL; } GWEN_Buffer_free(fbuf); xdlg->banking=ab; if (text) xdlg->text=strdup(text); /* done */ return dlg; } void GWENHYWFAR_CB AB_SelectBackendDialog_FreeData(void *bp, void *p) { AB_SELECTBACKEND_DIALOG *xdlg; xdlg=(AB_SELECTBACKEND_DIALOG*) p; free(xdlg->selectedProvider); free(xdlg->text); GWEN_FREE_OBJECT(xdlg); } const char *AB_SelectBackendDialog_GetSelectedProvider(const GWEN_DIALOG *dlg) { AB_SELECTBACKEND_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); return xdlg->selectedProvider; } void AB_SelectBackendDialog_SetSelectedProvider(GWEN_DIALOG *dlg, const char *s) { AB_SELECTBACKEND_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); free(xdlg->selectedProvider); if (s) xdlg->selectedProvider=strdup(s); else xdlg->selectedProvider=NULL; } void AB_SelectBackendDialog_DetermineBackend(GWEN_DIALOG *dlg) { int idx; AB_SELECTBACKEND_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); AB_SelectBackendDialog_SetSelectedProvider(dlg, NULL); idx=GWEN_Dialog_GetIntProperty(dlg, "backendCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0 && xdlg->pluginDescrList) { GWEN_PLUGIN_DESCRIPTION *d; d=GWEN_PluginDescription_List_First(xdlg->pluginDescrList); while(d && idx>0) { idx--; d=GWEN_PluginDescription_List_Next(d); } if (d) AB_SelectBackendDialog_SetSelectedProvider(dlg, GWEN_PluginDescription_GetName(d)); } } int AB_SelectBackendDialog_BackendChanged(GWEN_DIALOG *dlg) { AB_SELECTBACKEND_DIALOG *xdlg; int idx; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); idx=GWEN_Dialog_GetIntProperty(dlg, "backendCombo", GWEN_DialogProperty_Value, 0, -1); if (idx>=0 && xdlg->pluginDescrList) { GWEN_PLUGIN_DESCRIPTION *d; d=GWEN_PluginDescription_List_First(xdlg->pluginDescrList); while(d && idx>0) { idx--; d=GWEN_PluginDescription_List_Next(d); } if (d) { const char *s; s=GWEN_PluginDescription_GetLongDescr(d); GWEN_Dialog_SetCharProperty(dlg, "descrLabel", GWEN_DialogProperty_Title, 0, s, 0); } } return GWEN_DialogEvent_ResultHandled; } void AB_SelectBackendDialog_Reload(GWEN_DIALOG *dlg) { AB_SELECTBACKEND_DIALOG *xdlg; GWEN_PLUGIN_DESCRIPTION_LIST2 *ll; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); if (xdlg->selectedProvider==NULL) AB_SelectBackendDialog_DetermineBackend(dlg); GWEN_Dialog_SetIntProperty(dlg, "backendCombo", GWEN_DialogProperty_ClearValues, 0, 0, 0); if (xdlg->pluginDescrList) GWEN_PluginDescription_List_Clear(xdlg->pluginDescrList); else xdlg->pluginDescrList=GWEN_PluginDescription_List_new(); ll=AB_Banking_GetProviderDescrs(xdlg->banking); if (ll) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *it; it=GWEN_PluginDescription_List2_First(ll); if (it) { GWEN_PLUGIN_DESCRIPTION *d; GWEN_BUFFER *tbuf; int idx=-1; int i=0; tbuf=GWEN_Buffer_new(0, 256, 0, 1); d=GWEN_PluginDescription_List2Iterator_Data(it); while(d) { const char *s; s=GWEN_PluginDescription_GetName(d); if (s && *s) { GWEN_Buffer_AppendString(tbuf, s); if (idx==-1 && xdlg->selectedProvider && strcasecmp(xdlg->selectedProvider, s)==0) idx=i; s=GWEN_PluginDescription_GetShortDescr(d); if (s && *s) { GWEN_Buffer_AppendString(tbuf, " - "); GWEN_Buffer_AppendString(tbuf, s); } GWEN_PluginDescription_Attach(d); GWEN_PluginDescription_List_Add(d, xdlg->pluginDescrList); GWEN_Dialog_SetCharProperty(dlg, "backendCombo", GWEN_DialogProperty_AddValue, 0, GWEN_Buffer_GetStart(tbuf), 0); GWEN_Buffer_Reset(tbuf); i++; } d=GWEN_PluginDescription_List2Iterator_Next(it); } if (idx!=-1) GWEN_Dialog_SetIntProperty(dlg, "backendCombo", GWEN_DialogProperty_Value, 0, idx, 0); GWEN_Buffer_free(tbuf); GWEN_PluginDescription_List2Iterator_free(it); } GWEN_PluginDescription_List2_freeAll(ll); } AB_SelectBackendDialog_BackendChanged(dlg); } void AB_SelectBackendDialog_Init(GWEN_DIALOG *dlg) { AB_SELECTBACKEND_DIALOG *xdlg; GWEN_DB_NODE *dbPrefs; int i; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); GWEN_Dialog_SetCharProperty(dlg, "", GWEN_DialogProperty_Title, 0, I18N("Select Backend"), 0); if (xdlg->text && *(xdlg->text)) GWEN_Dialog_SetCharProperty(dlg, "introLabel", GWEN_DialogProperty_Title, 0, xdlg->text, 0); else GWEN_Dialog_SetCharProperty(dlg, "introLabel", GWEN_DialogProperty_Title, 0, I18N("Select a backend."), 0); /* read width */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_width", 0, -1); if (i>=DIALOG_MINWIDTH) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, i, 0); /* read height */ i=GWEN_DB_GetIntValue(dbPrefs, "dialog_height", 0, -1); if (i>=DIALOG_MINHEIGHT) GWEN_Dialog_SetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, i, 0); AB_SelectBackendDialog_Reload(dlg); } void AB_SelectBackendDialog_Fini(GWEN_DIALOG *dlg) { AB_SELECTBACKEND_DIALOG *xdlg; int i; GWEN_DB_NODE *dbPrefs; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); dbPrefs=GWEN_Dialog_GetPreferences(dlg); AB_SelectBackendDialog_DetermineBackend(dlg); /* store dialog width */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Width, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_width", i); /* store dialog height */ i=GWEN_Dialog_GetIntProperty(dlg, "", GWEN_DialogProperty_Height, 0, -1); GWEN_DB_SetIntValue(dbPrefs, GWEN_DB_FLAGS_OVERWRITE_VARS, "dialog_height", i); } int AB_SelectBackendDialog_HandleActivated(GWEN_DIALOG *dlg, const char *sender) { DBG_NOTICE(0, "Activated: %s", sender); if (strcasecmp(sender, "okButton")==0) return GWEN_DialogEvent_ResultAccept; else if (strcasecmp(sender, "abortButton")==0) return GWEN_DialogEvent_ResultReject; else if (strcasecmp(sender, "backendCombo")==0) return AB_SelectBackendDialog_BackendChanged(dlg); else if (strcasecmp(sender, "helpButton")==0) { /* TODO: open a help dialog */ } return GWEN_DialogEvent_ResultNotHandled; } int GWENHYWFAR_CB AB_SelectBackendDialog_SignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender) { AB_SELECTBACKEND_DIALOG *xdlg; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AB_SELECTBACKEND_DIALOG, dlg); assert(xdlg); switch(t) { case GWEN_DialogEvent_TypeInit: AB_SelectBackendDialog_Init(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeFini: AB_SelectBackendDialog_Fini(dlg); return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeValueChanged: return GWEN_DialogEvent_ResultHandled;; case GWEN_DialogEvent_TypeActivated: return AB_SelectBackendDialog_HandleActivated(dlg, sender); case GWEN_DialogEvent_TypeEnabled: case GWEN_DialogEvent_TypeDisabled: case GWEN_DialogEvent_TypeClose: case GWEN_DialogEvent_TypeLast: return GWEN_DialogEvent_ResultNotHandled; } return GWEN_DialogEvent_ResultNotHandled; } AB_PROVIDER *AB_SelectBackend(AB_BANKING *ab, const char *initial, const char *text) { GWEN_DIALOG *dlg; int rv; dlg=AB_SelectBackendDialog_new(ab, text); if (dlg==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not create dialog"); return NULL; } AB_SelectBackendDialog_SetSelectedProvider(dlg, initial); rv=GWEN_Gui_ExecDialog(dlg, 0); if (rv==0) { /* rejected */ GWEN_Dialog_free(dlg); return NULL; } else { const char *s; s=AB_SelectBackendDialog_GetSelectedProvider(dlg); if (s && *s) { AB_PROVIDER *pro; pro=AB_Banking_GetProvider(ab, s); if (pro==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Provider [%s] not found", s); GWEN_Dialog_free(dlg); return NULL; } GWEN_Dialog_free(dlg); return pro; } GWEN_Dialog_free(dlg); return NULL; } } aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newuser_be.h0000644000175000017500000000202412364015477021477 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_NEW_USER_BE_H #define AB_DLG_NEW_USER_BE_H #include #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API GWEN_DIALOG *AB_NewUserDialog_new(AB_BANKING *ab, const char *dname); AQBANKING_API AB_BANKING *AB_NewUserDialog_GetBanking(const GWEN_DIALOG *dlg); AQBANKING_API AB_USER *AB_NewUserDialog_GetUser(const GWEN_DIALOG *dlg); AQBANKING_API void AB_NewUserDialog_SetUser(GWEN_DIALOG *dlg, AB_USER *u); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_usertype_pagedefault_l.h0000644000175000017500000000144112364015477024077 00000000000000/*************************************************************************** begin : Fri Jul 30 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_USERTYPE_PAGEDEFAULT_L_H #define AQBANKING_DLG_USERTYPE_PAGEDEFAULT_L_H #include #include #ifdef __cplusplus extern "C" { #endif GWEN_DIALOG *AB_UserTypePageDefaultDialog_new(AB_BANKING *ab); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_newaccount_be.h0000644000175000017500000000174212364015477022163 00000000000000/*************************************************************************** begin : Wed Apr 14 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_DLG_NEW_ACCOUNT_BE_H #define AB_DLG_NEW_ACCOUNT_BE_H #include #include #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API GWEN_DIALOG *AB_NewAccountDialog_new(AB_BANKING *ab, const char *dname); AQBANKING_API AB_ACCOUNT *AB_NewAccountDialog_GetAccount(const GWEN_DIALOG *dlg); AQBANKING_API void AB_NewAccountDialog_SetAccount(GWEN_DIALOG *dlg, AB_ACCOUNT *a); #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbanking/dialogs/dlg_importer.h0000644000175000017500000000263312364015477021210 00000000000000/*************************************************************************** begin : Tue Feb 10 2010 copyright : (C) 2010 by Martin Preuss email : martin@aqbanking.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_DLG_IMPORTER_H #define AQBANKING_DLG_IMPORTER_H #include #include #include #include /** @defgroup G_AB_DIALOGS_IMPORTER Generic File Import Dialog * @ingroup G_AB_DIALOGS * */ /*@{*/ #ifdef __cplusplus extern "C" { #endif /** * Creates a file import assistent. * * @return pointer to the created dialog. * * @param banking pointer to the AqBanking object * @param ctx pointer to the import context to receive the content of the * imported file * * @param finishedMessage message to show on the last page of the assistent * (i.e. the page which is shown after a successfull import into the given * import context). */ AQBANKING_API GWEN_DIALOG *AB_ImporterDialog_new(AB_BANKING *ab, AB_IMEXPORTER_CONTEXT *ctx, const char *finishedMessage); #ifdef __cplusplus } #endif /*@}*/ #endif aqbanking-5.6.4beta/src/libs/aqbanking/banking_cfg.h0000644000175000017500000000634012364015477017326 00000000000000/*************************************************************************** begin : Sat Sep 27 2008 copyright : (C) 2008-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AQBANKING_BANKING_CFG_H #define AQBANKING_BANKING_CFG_H #include #ifdef __cplusplus extern "C" { #endif AQBANKING_API int AB_Banking_LoadAppConfig(AB_BANKING *ab, GWEN_DB_NODE **pDb); AQBANKING_API int AB_Banking_SaveAppConfig(AB_BANKING *ab, GWEN_DB_NODE *db); AQBANKING_API int AB_Banking_LockAppConfig(AB_BANKING *ab); AQBANKING_API int AB_Banking_UnlockAppConfig(AB_BANKING *ab); AQBANKING_API int AB_Banking_LoadSharedConfig(AB_BANKING *ab, const char *name, GWEN_DB_NODE **pDb); AQBANKING_API int AB_Banking_SaveSharedConfig(AB_BANKING *ab, const char *name, GWEN_DB_NODE *db); AQBANKING_API int AB_Banking_LockSharedConfig(AB_BANKING *ab, const char *name); AQBANKING_API int AB_Banking_UnlockSharedConfig(AB_BANKING *ab, const char *name); /** * Before making any permanent changes to an account this function must be called. * It reloads the current configuration and locks the given account. While this * lock is in place no other application can make any changes to the account. */ AQBANKING_API int AB_Banking_BeginExclUseAccount(AB_BANKING *ab, AB_ACCOUNT *a); /** * This function writes the configuration of the given account to the database and * releases the given account so that other applications can access it. */ AQBANKING_API int AB_Banking_EndExclUseAccount(AB_BANKING *ab, AB_ACCOUNT *a, int abandon); /** * Before making any permanent changes to an user this function must be called. * It reloads the current configuration and locks the given user. While this * lock is in place no other application can make any changes to the user. */ AQBANKING_API int AB_Banking_BeginExclUseUser(AB_BANKING *ab, AB_USER *u); /** * This function writes the configuration of the given user to the database and * releases the given user so that other applications can access it. * @param ab pointer to the AqBanking object * @param u user * @param abandon if 0 then the changes are written to the database, otherwise they are not */ AQBANKING_API int AB_Banking_EndExclUseUser(AB_BANKING *ab, AB_USER *u, int abandon); /** @name Checking Configuration for AqBanking4 * */ /*@{*/ AQBANKING_API int AB_Banking_HasConf4(AB_BANKING *ab); /*@}*/ /** @name Importing Configuration from AqBanking3 * */ /*@{*/ AQBANKING_API int AB_Banking_HasConf3(AB_BANKING *ab); /** * This function imports the configuration of AqBanking3. */ AQBANKING_API int AB_Banking_ImportConf3(AB_BANKING *ab); /*@}*/ /** @name Importing Configuration from AqBanking2 * */ /*@{*/ AQBANKING_API int AB_Banking_HasConf2(AB_BANKING *ab); /** * This function imports the configuration of AqBanking2. */ AQBANKING_API int AB_Banking_ImportConf2(AB_BANKING *ab); /*@}*/ #ifdef __cplusplus } #endif #endif aqbanking-5.6.4beta/src/libs/aqbankingpp/0000755000175000017500000000000012643540652015340 500000000000000aqbanking-5.6.4beta/src/libs/aqbankingpp/aqbankingppdecl.hpp0000644000175000017500000000167612364015477021130 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 2 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_AQBANKINGPPDECL_HPP #define AB_AQBANKINGPPDECL_HPP #if defined(_WIN32) || defined(_MSC_VER) # define AQBANKINGPP_IS_WINDOWS #endif #ifdef AQBANKINGPP_IS_WINDOWS # ifdef export_AQBANKINGPP # define AQBANKINGPP_DECL __declspec (dllexport) # else # define AQBANKINGPP_DECL __declspec (dllimport) # endif #else # define AQBANKINGPP_DECL #endif #endif // AB_STRINGLIST_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/balance.hpp0000644000175000017500000000242512364015477017363 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 2 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_BALANCE_HPP #define AB_BALANCE_HPP #include #include #include #include namespace AB { /** A wrapper class around the \ref AB_BALANCE type */ class Balance { public: typedef AB_BALANCE wrapped_type; private: wrapped_type* m_ptr; public: Balance(const Value& v, const Time& t) : m_ptr(AB_Balance_new(v, t)) {} AB_CXXWRAP_CONSTRUCTORS(Balance, AB_Balance); Value AB_CXXWRAP_GET0_CONST(getValue, AB_Balance_GetValue); AB_CXXWRAP_SET1(setValue, const Value&, AB_Balance_SetValue); const GWEN_TIME *AB_CXXWRAP_GET0_CONST(getTime, AB_Balance_GetTime); }; } // END namespace AB #endif // AB_BALANCE_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/cxxwrap.hpp0000644000175000017500000000640212364015477017471 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 1 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_CXXWRAP_HPP #define AB_CXXWRAP_HPP /** * \file * * This file contains macros that simplify the wrapping of aqbanking's * data types in a C++ class. The macros assume the following: * * - The wrapped C type is available as a typedef "wrapped_type" * - The pointer to the wrapped C object is called m_ptr * * The only additional assumptions are necessary in the * AB_CXXWRAP_CONSTRUCTORS() macro. */ /** Wraps a getter function with 0 arguments, const */ #define AB_CXXWRAP_GET0_CONST(cxxname, cname) \ cxxname() const \ { return cname(m_ptr); } /** Wraps a getter function with 0 arguments */ #define AB_CXXWRAP_GET0(cxxname, cname) \ cxxname() \ { return cname(m_ptr); } /** Wraps a getter function with 1 argument, const */ #define AB_CXXWRAP_GET1_CONST(cxxname, type1, cname) \ cxxname(type1 arg1) const \ { return cname(m_ptr, arg1); } /** Wraps a getter function with 1 argument */ #define AB_CXXWRAP_GET1(cxxname, type1, cname) \ cxxname(type1 arg1) \ { return cname(m_ptr, arg1); } /** Wraps a setter function with 0 argument */ #define AB_CXXWRAP_SET0(cxxname, cname) \ void cxxname() \ { cname(m_ptr); } /** Wraps a setter function with 1 argument */ #define AB_CXXWRAP_SET1(cxxname, type1, cname) \ void cxxname(type1 arg1) \ { cname(m_ptr, arg1); } /** Wraps the default C++ constructor with zero arguments. This macro only works if FOO_new() is available. Some of the FOO_new() functions take additional arguments, in which case this macro doesn't work. */ #define AB_CXXWRAP_CONSTRUCTOR0(cxxname, cprefix) \ cxxname() \ : m_ptr(cprefix##_new()) {} /** Wraps the set of C++ constructors, destructor, and assignment operator. * * This macro additionally assumes that the C type FOO has a set of * constructor/ destructor/ copy functions which are called FOO_free() * and FOO_dup(), respectively. */ #define AB_CXXWRAP_CONSTRUCTORS(cxxname, cprefix) \ ~cxxname() \ { cprefix##_free(m_ptr); } \ cxxname(const wrapped_type *other) \ : m_ptr(cprefix##_dup(other)) {} \ cxxname(const cxxname& other) \ : m_ptr(cprefix##_dup(other.m_ptr)) {} \ cxxname& operator=(const cxxname& other) \ { \ if (&other == this) \ return *this; \ cprefix##_free(m_ptr); \ m_ptr = cprefix##_dup(other.m_ptr); \ return *this; \ } \ operator const wrapped_type*() const \ { return m_ptr; } \ operator wrapped_type*() \ { return m_ptr; } \ const wrapped_type* ptr() const \ { return m_ptr; } \ wrapped_type* ptr() \ { return m_ptr; } #endif // AB_CXXWRAP_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/value.hpp0000644000175000017500000000663512364015477017121 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 1 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_VALUE_HPP #define AB_VALUE_HPP #include #include #include namespace AB { /** A wrapper class around the AB_VALUE rational number type */ class /*AQBANKING_API*/ Value // note: AQBANKING_API isn't needed as long as this class is defined // purely in the header. { public: typedef AB_VALUE wrapped_type; private: wrapped_type* m_ptr; public: AB_CXXWRAP_CONSTRUCTOR0(Value, AB_Value); AB_CXXWRAP_CONSTRUCTORS(Value, AB_Value); /** Extra constructor: Create this value from a double. \see AB_Value_fromDouble() */ Value(double d) : m_ptr(AB_Value_fromDouble(d)) {} /** Extra constructor: Create this value from two integer values for numerator and denominator. \see AB_Value_fromInt() */ Value(long int num, long int denom) : m_ptr(AB_Value_fromInt(num, denom)) {} /** Conversion to string. \see AB_Value_toString() */ void toString(GWEN_BUFFER *buf) const { AB_Value_toString(m_ptr, buf); } /** Conversion to string. \see AB_Value_toString() */ std::string toString() const { GWEN_BUFFER *buf = GWEN_Buffer_new(NULL, 100, 0, 0); toString(buf); std::string result(GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return result; } long int AB_CXXWRAP_GET0_CONST(getNum, AB_Value_Num); long int AB_CXXWRAP_GET0_CONST(getDenom, AB_Value_Denom); double AB_CXXWRAP_GET0_CONST(getValueAsDouble, AB_Value_GetValueAsDouble); AB_CXXWRAP_SET1(setValueFromDouble, double, AB_Value_SetValueFromDouble); AB_CXXWRAP_SET0(setZero, AB_Value_SetZero); bool AB_CXXWRAP_GET0_CONST(isZero, AB_Value_IsZero); bool AB_CXXWRAP_GET0_CONST(isNegative, AB_Value_IsNegative); bool AB_CXXWRAP_GET0_CONST(isPositive, AB_Value_IsPositive); int AB_CXXWRAP_GET1_CONST(compare, const Value&, AB_Value_Compare); bool AB_CXXWRAP_GET1_CONST(equal, const Value&, AB_Value_Equal); int AB_CXXWRAP_GET1(addValue, const Value&, AB_Value_AddValue); int AB_CXXWRAP_GET1(subValue, const Value&, AB_Value_SubValue); int AB_CXXWRAP_GET1(multValue, const Value&, AB_Value_MultValue); int AB_CXXWRAP_GET1(divValue, const Value&, AB_Value_DivValue); int AB_CXXWRAP_GET0(negate, AB_Value_Negate); std::string AB_CXXWRAP_GET0_CONST(getCurrency, AB_Value_GetCurrency); void setCurrency(const std::string& s) { AB_Value_SetCurrency(m_ptr, s.c_str()); } /** Conversion from string. \see AB_Value_fromString() */ static Value fromString(const std::string& s) { return Value(AB_Value_fromString(s.c_str())); } }; bool operator==(const Value& v1, const Value& v2) { return v1.equal(v2); } bool operator!=(const Value& v1, const Value& v2) { return !(v1 == v2); } bool operator>(const Value& v1, const Value& v2) { return v1.compare(v2) > 0; } bool operator<(const Value& v1, const Value& v2) { return v1.compare(v2) < 0; } } // END namespace AB #endif // AB_VALUE_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/stringlist.hpp0000644000175000017500000000356512364015477020206 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 2 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_STRINGLIST_HPP #define AB_STRINGLIST_HPP #include #include #include #include #include namespace AB { /** A wrapper class around the GWEN_STRINGLIST type */ class AQBANKINGPP_DECL StringList { public: typedef GWEN_STRINGLIST wrapped_type; typedef std::size_t size_type; typedef std::string value_type; private: wrapped_type* m_ptr; public: AB_CXXWRAP_CONSTRUCTOR0(StringList, GWEN_StringList); AB_CXXWRAP_CONSTRUCTORS(StringList, GWEN_StringList); StringList(const std::vector& other); AB_CXXWRAP_SET0(clear, GWEN_StringList_Clear); size_type AB_CXXWRAP_GET0_CONST(size, GWEN_StringList_Count); bool empty() const { return size() == 0; } std::string AB_CXXWRAP_GET0_CONST(front, GWEN_StringList_FirstString); std::string AB_CXXWRAP_GET1_CONST(at, size_type, GWEN_StringList_StringAt); std::string operator[](size_type i) const { return at(i); } void push_back(const std::string& s) { GWEN_StringList_AppendString(m_ptr, s.c_str(), false, false); } void push_front(const std::string& s) { GWEN_StringList_InsertString(m_ptr, s.c_str(), false, false); } std::vector toVector() const; }; } // END namespace AB #endif // AB_STRINGLIST_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/Makefile.in0000644000175000017500000012365312643540055017334 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = testlibcc$(EXEEXT) TESTS = testlibcc$(EXEEXT) subdir = src/libs/aqbankingpp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(iheader_HEADERS) $(noinst_HEADERS) \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(iheaderdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libaqbankingpp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libaqbankingpp_la_OBJECTS = libaqbankingpp_la-stringlist.lo libaqbankingpp_la_OBJECTS = $(am_libaqbankingpp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libaqbankingpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(libaqbankingpp_la_LDFLAGS) \ $(LDFLAGS) -o $@ PROGRAMS = $(noinst_PROGRAMS) am_testlibcc_OBJECTS = testlibcc.$(OBJEXT) testlibcc_OBJECTS = $(am_testlibcc_OBJECTS) testlibcc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libaqbankingpp_la_SOURCES) $(testlibcc_SOURCES) DIST_SOURCES = $(libaqbankingpp_la_SOURCES) $(testlibcc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(iheader_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) lib_LTLIBRARIES = libaqbankingpp.la noinst_HEADERS = @IS_WINDOWS_TRUE@libaqbankingpp_la_CPPFLAGS = -Dexport_AQBANKINGPP $(AM_CPPFLAGS) iheaderdir = @aqbanking_headerdir_am@/aqbankingpp iheader_HEADERS = \ accountstatus.hpp \ aqbankingppdecl.hpp \ balance.hpp \ cxxwrap.hpp \ stringlist.hpp \ time.hpp \ value.hpp libaqbankingpp_la_SOURCES = \ stringlist.cpp libaqbankingpp_la_LIBADD = \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) $(i18n_libs) libaqbankingpp_la_LDFLAGS = # Test program to verify the c++ usage testlibcc_SOURCES = testlibcc.cpp testlibcc_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/aqbankingpp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/aqbankingpp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libaqbankingpp.la: $(libaqbankingpp_la_OBJECTS) $(libaqbankingpp_la_DEPENDENCIES) $(EXTRA_libaqbankingpp_la_DEPENDENCIES) $(AM_V_CXXLD)$(libaqbankingpp_la_LINK) -rpath $(libdir) $(libaqbankingpp_la_OBJECTS) $(libaqbankingpp_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testlibcc$(EXEEXT): $(testlibcc_OBJECTS) $(testlibcc_DEPENDENCIES) $(EXTRA_testlibcc_DEPENDENCIES) @rm -f testlibcc$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(testlibcc_OBJECTS) $(testlibcc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaqbankingpp_la-stringlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testlibcc.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libaqbankingpp_la-stringlist.lo: stringlist.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libaqbankingpp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libaqbankingpp_la-stringlist.lo -MD -MP -MF $(DEPDIR)/libaqbankingpp_la-stringlist.Tpo -c -o libaqbankingpp_la-stringlist.lo `test -f 'stringlist.cpp' || echo '$(srcdir)/'`stringlist.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libaqbankingpp_la-stringlist.Tpo $(DEPDIR)/libaqbankingpp_la-stringlist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stringlist.cpp' object='libaqbankingpp_la-stringlist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libaqbankingpp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libaqbankingpp_la-stringlist.lo `test -f 'stringlist.cpp' || echo '$(srcdir)/'`stringlist.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? testlibcc.log: testlibcc$(EXEEXT) @p='testlibcc$(EXEEXT)'; \ b='testlibcc'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iheaderHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iheaderHEADERS uninstall-libLTLIBRARIES .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iheaderHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-iheaderHEADERS uninstall-libLTLIBRARIES sources: for f in $(libaqbankingpp_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # 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: aqbanking-5.6.4beta/src/libs/aqbankingpp/time.hpp0000644000175000017500000000346512364015477016741 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 2 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_TIME_HPP #define AB_TIME_HPP #include #include namespace AB { /** A wrapper class around the GWEN_TIME type */ class Time { public: typedef GWEN_TIME wrapped_type; private: wrapped_type* m_ptr; public: Time(int year, int month, int day, int hour, int min, int sec, int inUtc) : m_ptr(GWEN_Time_new(year, month, day, hour, min, sec, inUtc)) {} AB_CXXWRAP_CONSTRUCTORS(Time, GWEN_Time); uint32_t AB_CXXWRAP_GET0_CONST(seconds, GWEN_Time_Seconds); double AB_CXXWRAP_GET0_CONST(milliseconds, GWEN_Time_Milliseconds); struct tm AB_CXXWRAP_GET0_CONST(toTm, GWEN_Time_toTm); time_t AB_CXXWRAP_GET0_CONST(toTime_t, GWEN_Time_toTime_t); /** * Returns the broken down date as local date. */ int getBrokenDownDate(int& day, int& month, int& year) { return GWEN_Time_GetBrokenDownDate(m_ptr, &day, &month, &year); } /** * Returns the broken down time as UTC date (Greenwhich Mean time). */ int getBrokenDownUtcDate(int& day, int& month, int& year) { return GWEN_Time_GetBrokenDownUtcDate(m_ptr, &day, &month, &year); } static Time currentTime() { return GWEN_CurrentTime(); } }; } // END namespace AB #endif // AB_TIME_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/testlibcc.cpp0000644000175000017500000000171512364015477017746 00000000000000#include #include #include "value.hpp" #include "balance.hpp" #include "time.hpp" #include "accountstatus.hpp" #include "stringlist.hpp" const char *input = "1,361.54"; int main(int argc, char *argv[]) { AB::Value value; GWEN_BUFFER *buf, *buf2; int result = 0; if (argc > 1) input = argv[1]; value = AB::Value::fromString(input); buf = GWEN_Buffer_new(NULL, 300, 0, 0); value.toString(buf); if (strcmp(GWEN_Buffer_GetStart(buf), "136154/100") != 0) result = -1; buf2 = GWEN_Buffer_new(NULL, 300, 0, 0); AB_Value_toHumanReadableString2(value.ptr(), buf2, 2, 0); if ((strcmp(GWEN_Buffer_GetStart(buf2), "1361.54") != 0) && (strcmp(GWEN_Buffer_GetStart(buf2), "1361,54") != 0)) result = -1; printf("Storing %s internally as rational number %s; as double: %s\n", input, GWEN_Buffer_GetStart(buf), GWEN_Buffer_GetStart(buf2)); GWEN_Buffer_free(buf); GWEN_Buffer_free(buf2); return result; } aqbanking-5.6.4beta/src/libs/aqbankingpp/Makefile.am0000644000175000017500000000161312364015477017317 00000000000000INCLUDES=-I$(aqbanking_symlinkdir) $(gwenhywfar_includes) lib_LTLIBRARIES=libaqbankingpp.la noinst_HEADERS= if IS_WINDOWS libaqbankingpp_la_CPPFLAGS = -Dexport_AQBANKINGPP $(AM_CPPFLAGS) endif iheaderdir=@aqbanking_headerdir_am@/aqbankingpp iheader_HEADERS=\ accountstatus.hpp \ aqbankingppdecl.hpp \ balance.hpp \ cxxwrap.hpp \ stringlist.hpp \ time.hpp \ value.hpp libaqbankingpp_la_SOURCES=\ stringlist.cpp libaqbankingpp_la_LIBADD = \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) $(i18n_libs) libaqbankingpp_la_LDFLAGS = sources: for f in $(libaqbankingpp_la_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done # Build and link a test program to verify the linker flags noinst_PROGRAMS = testlibcc # Test program to verify the c++ usage testlibcc_SOURCES = testlibcc.cpp testlibcc_LDADD = $(aqbanking_internal_libs) $(gwenhywfar_libs) TESTS = testlibcc aqbanking-5.6.4beta/src/libs/aqbankingpp/accountstatus.hpp0000644000175000017500000000313712364015477020677 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : Mon March 2 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #ifndef AB_ACCOUNTSTATUS_HPP #define AB_ACCOUNTSTATUS_HPP #include #include #include #include #include namespace AB { /** A wrapper class around the AB_ACCOUNT_STATUS type */ class AccountStatus { public: typedef AB_ACCOUNT_STATUS wrapped_type; private: wrapped_type* m_ptr; public: AB_CXXWRAP_CONSTRUCTOR0(AccountStatus, AB_AccountStatus); AB_CXXWRAP_CONSTRUCTORS(AccountStatus, AB_AccountStatus); Time AB_CXXWRAP_GET0_CONST(getTime, AB_AccountStatus_GetTime); Value AB_CXXWRAP_GET0_CONST(getBankLine, AB_AccountStatus_GetBankLine); Value AB_CXXWRAP_GET0_CONST(getDisposable, AB_AccountStatus_GetDisposable); Value AB_CXXWRAP_GET0_CONST(getDisposed, AB_AccountStatus_GetDisposed); Balance AB_CXXWRAP_GET0_CONST(getBookedBalance, AB_AccountStatus_GetBookedBalance); Balance AB_CXXWRAP_GET0_CONST(getNotedBalance, AB_AccountStatus_GetNotedBalance); }; } // END namespace AB #endif // AB_ACCOUNTSTATUS_HPP aqbanking-5.6.4beta/src/libs/aqbankingpp/stringlist.cpp0000644000175000017500000000224412364015477020172 00000000000000/*************************************************************************** $RCSfile$ ------------------- begin : March 3 2011 copyright : (C) 2011 by Christian Stimming email : christian@cstimming.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ #include "stringlist.hpp" namespace AB { typedef std::vector SVector; StringList::StringList(const std::vector& sv) : m_ptr(GWEN_StringList_new()) { for (SVector::const_iterator iter = sv.begin(); iter != sv.end(); ++iter) { push_back(*iter); } } static void *cb_func(const char* value, void *user_data) { SVector* result = reinterpret_cast(user_data); result->push_back(value); return NULL; } SVector StringList::toVector() const { SVector result; GWEN_StringList_ForEach(m_ptr, &cb_func, &result); return result; } } // END namespace AB aqbanking-5.6.4beta/src/libs/Makefile.in0000644000175000017500000006005412643540054015033 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = aqbanking aqbankingpp all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/libs/Makefile.am0000644000175000017500000000027412643536041015021 00000000000000SUBDIRS=aqbanking aqbankingpp sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/tools/0000755000175000017500000000000012643540661013254 500000000000000aqbanking-5.6.4beta/src/tools/Makefile.in0000644000175000017500000006007312643540064015244 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/tools DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ DIST_SUBDIRS = aqbanking-cli @ENABLE_CLI_TRUE@SUBDIRS = aqbanking-cli all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/tools/aqbanking-cli/0000755000175000017500000000000012643540661015754 500000000000000aqbanking-5.6.4beta/src/tools/aqbanking-cli/chkiban.c0000644000175000017500000000634112416502277017442 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include static int chkIban(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; AB_BANKINFO_CHECKRESULT res; const char *iban; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "iban", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "iban", /* long option */ "Specify the IBAN to check", /* short description */ "Specify the IBAN to check" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, I18N("This command checks the given combination of account id\n" "and bank code for validity.\n" "\n" "Return codes:\n" " 1: missing/bad arguments\n" " 2: error while initializing AqBanking\n" " 3: given combination is definately invalid\n" " 5: error while deinitializing AqBanking\n" "\n" "Arguments:\n" "%s\n"), GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } iban=GWEN_DB_GetCharValue(db, "iban", 0, 0); assert(iban); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } res=AB_Banking_CheckIban(iban); if (res != 0) { DBG_ERROR(0, "IBAN is invalid"); return 3; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/chkacc.c0000644000175000017500000001210112364015477017251 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include static int chkAcc(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; AB_BANKINFO_CHECKRESULT res; const char *country; const char *bankId; const char *accountId; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteCountry", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rcountry", /* long option */ "Specify the remote country code",/* short description */ "Specify the remote country code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBankId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbank", /* long option */ "Specify the remote bank code",/* short description */ "Specify the remote bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteAccountId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "raccount", /* long option */ "Specify the remote account number", /* short description */ "Specify the remote account number" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, I18N("This command checks the given combination of account id\n" "and bank code for validity.\n" "\n" "Return codes:\n" " 1: missing/bad arguments\n" " 2: error while initializing AqBanking\n" " 3: given combination is definately invalid\n" " 4: either bank code or check result are unknown\n" " 5: error while deinitializing AqBanking\n" "\n" "Arguments:\n" "%s\n"), GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } country=GWEN_DB_GetCharValue(db, "remoteCountry", 0, "de"); assert(country); bankId=GWEN_DB_GetCharValue(db, "remoteBankId", 0, 0); assert(bankId); accountId=GWEN_DB_GetCharValue(db, "remoteAccountId", 0, 0); assert(bankId); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } res=AB_Banking_CheckAccount(ab, country, 0, bankId, accountId); switch(res) { case AB_BankInfoCheckResult_NotOk: DBG_ERROR(0, "Invalid combination of bank code and account number " "for remote account"); return 3; case AB_BankInfoCheckResult_UnknownBank: DBG_ERROR(0, "Remote bank code is unknown"); return 4; case AB_BankInfoCheckResult_UnknownResult: DBG_ERROR(0, "Indifferent result for remote account check"); return 4; case AB_BankInfoCheckResult_Ok: break; default: DBG_ERROR(0, "Unknown check result %d", res); return 4; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/import.c0000644000175000017500000001631312364015477017360 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include static int import(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *inFile; const char *importerName; const char *profileName; const char *profileFile; const char *bankId; const char *accountId; AB_IMEXPORTER_CONTEXT *ctx=0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "importerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "importer", /* long option */ "Specify the importer to use", /* short description */ "Specify the importer to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); importerName=GWEN_DB_GetCharValue(db, "importerName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "default"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* import new context */ ctx=AB_ImExporterContext_new(); rv=AB_Banking_ImportFileWithProfile(ab, importerName, ctx, profileName, profileFile, inFile); if (rv<0) { DBG_ERROR(0, "Error reading file: %d", rv); AB_ImExporterContext_free(ctx); return 4; } /* adjust local account id if requested */ if (bankId || accountId) { AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { if (bankId) AB_ImExporterAccountInfo_SetBankCode(iea, bankId); if (accountId) AB_ImExporterAccountInfo_SetAccountNumber(iea, accountId); iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ } /* write context */ rv=writeContext(ctxFile, ctx); if (rv<0) { AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } AB_ImExporterContext_free(ctx); /* that's is */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/transfer.c0000644000175000017500000003253012425214301017652 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include #include #include static int transfer(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_JOB_TYPE jobType; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; AB_JOB_LIST2 *jobList; AB_JOB *j; int rvExec; const char *rBankId; const char *rAccountId; int forceCheck; AB_BANKINFO_CHECKRESULT res; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBankId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbank", /* long option */ "Specify the remote bank code",/* short description */ "Specify the remote bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteAccountId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "raccount", /* long option */ "Specify the remote account number", /* short description */ "Specify the remote account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "textkey", /* name */ 0, /* minnum */ 1, /* maxnum */ "t", /* short option */ "textkey", /* long option */ "Specify the text key (51 for normal transfer)", /* short description */ "Specify the text key (51 for normal transfer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { 0, GWEN_ArgsType_Int, "forceCheck", 0, 1, 0, "force-check", "force account number check", "force account number check" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "executionDate", 0, 1, 0, "executionDate", "set execution date of transfer", "set execution date of transfer" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "firstExecutionDate", 0, 1, 0, "firstExecutionDate", "set date of first execution (standing orders)", "set date of first execution (standing orders)" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "lastExecutionDate", 0, 1, 0, "lastExecutionDate", "set date of last execution (standing orders)", "set date of last execution (standing orders)" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "executionDay", 0, 1, 0, "executionDay", "set day of execution (standing orders)", "set day of execution (standing orders)" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "executionCycle", 0, 1, 0, "executionCycle", "set execution cycle (standing orders)", "set execution cycle (standing orders)" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "executionPeriod", 0, 1, 0, "executionPeriod", "set execution period (standing orders)", "set execution period (standing orders)" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "fiId", /* HKDAL */ 0, 1, 0, "fiId", "set the fiId (standing orders)", "set the fiId (standing orders) - Auftragsidentifikation fuer HKDAL" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); forceCheck=GWEN_DB_GetIntValue(db, "forceCheck", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkTransfer(a, db, &jobType); if (t==NULL) { DBG_ERROR(0, "Could not create transaction from arguments"); return 2; } if (AB_Transaction_GetTextKey(t)==0) AB_Transaction_SetTextKey(t, 51); rBankId=AB_Transaction_GetRemoteBankCode(t); rAccountId=AB_Transaction_GetRemoteAccountNumber(t); res=AB_Banking_CheckAccount(ab, "de", 0, rBankId, rAccountId); switch(res) { case AB_BankInfoCheckResult_NotOk: DBG_ERROR(0, "Invalid combination of bank code and account number " "for remote account (%s/%s)", rBankId, rAccountId); AB_Transaction_free(t); return 3; case AB_BankInfoCheckResult_UnknownBank: DBG_ERROR(0, "Remote bank code is unknown (%s/%s)", rBankId, rAccountId); if (forceCheck) { AB_Transaction_free(t); return 4; } break; case AB_BankInfoCheckResult_UnknownResult: DBG_WARN(0, "Indifferent result for remote account check (%s/%s)", rBankId, rAccountId); break; case AB_BankInfoCheckResult_Ok: break; default: DBG_ERROR(0, "Unknown check result %d", res); AB_Transaction_free(t); return 4; } if (jobType==AB_Job_TypeTransfer) j=AB_JobSingleTransfer_new(a); else if (jobType==AB_Job_TypeCreateDatedTransfer) j=AB_JobCreateDatedTransfer_new(a); else if (jobType==AB_Job_TypeCreateStandingOrder) j=AB_JobCreateStandingOrder_new(a); else if (jobType==AB_Job_TypeDeleteStandingOrder) j=AB_JobDeleteStandingOrder_new(a); else { DBG_ERROR(0, "Unknown job type"); AB_Transaction_free(t); return 6; } rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Transaction_free(t); return 3; } rv=AB_Job_SetTransaction(j, t); AB_Transaction_free(t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction"); AB_Job_free(j); return 3; } /* populate job list */ jobList=AB_Job_List2_new(); AB_Job_List2_PushBack(jobList, j); /* execute job */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write result */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/updateconf.c0000644000175000017500000000715412364015477020201 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" static int _getConfig(AB_BANKING *ab) { int rv; rv=AB_Banking_HasConf4(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 4 found, no update needed.\n"); return 0; } fprintf(stderr, "Config for AqBanking 4 not found, update needed (%d)\n", rv); rv=AB_Banking_HasConf3(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 3 found, importing\n"); rv=AB_Banking_ImportConf3(ab); if (rv<0) { fprintf(stderr, "Error importing configuration (%d)\n", rv); return rv; } return 3; } fprintf(stderr, "Config for AqBanking 3 not found (%d)\n", rv); rv=AB_Banking_HasConf2(ab); if (!rv) { fprintf(stderr, "Config for AqBanking 2 found, importing\n"); rv=AB_Banking_ImportConf2(ab); if (rv<0) { fprintf(stderr, "Error importing configuration (%d)\n", rv); return rv; } return 2; } fprintf(stderr, "Config for AqBanking 2 not found (%d), " "no usable configuration found to update.\n", rv); return -1; } static int updateConf(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=_getConfig(ab); if (rv<0) return 2; if (rv>=2) { /* init to check whether the new configuration works */ rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Error while loading the newly imported configuration (1:%d)\n", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { AB_Banking_Fini(ab); fprintf(stderr, "Error while loading the newly imported configuration (2:%d)\n", rv); return 2; } /* uninit immediately */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "Error on deinit (1:%d)\n", rv); AB_Banking_Fini(ab); return 2; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "Error on deinit (2:%d)\n", rv); return 2; } } fprintf(stdout, "Your configuration seems to be ok.\n"); return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/main.c0000644000175000017500000003243312416502277016770 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include "globals.h" #include "chkacc.c" #include "chkiban.c" #include "debitnote.c" #include "debitnotes.c" #include "import.c" #include "listaccs.c" #include "listbal.c" #include "listprofiles.c" #include "listtrans.c" #include "listtransfers.c" #include "request.c" #include "senddtazv.c" #include "transfer.c" #include "transfers.c" #include "util.c" #include "versions.c" #include "addtransaction.c" #include "fillgaps.c" #include "updateconf.c" #include "sepatransfer.c" #include "addsepadebitnote.c" #include "sepadebitnote.c" #include "sepamultijobs.c" #include "separecurtransfer.c" static void cmdAddHelpStr(GWEN_BUFFER *ubuf, const char* cmdname, const char* cmdhelp) { // Indentation of the command: one space GWEN_Buffer_AppendString(ubuf, " "); GWEN_Buffer_AppendString(ubuf, cmdname); GWEN_Buffer_AppendString(ubuf, ":\n"); // Indentation of the help: three spaces GWEN_Buffer_AppendString(ubuf, " "); GWEN_Buffer_AppendString(ubuf, cmdhelp); GWEN_Buffer_AppendString(ubuf, "\n"); } int main(int argc, char **argv) { GWEN_DB_NODE *db; const char *cmd; int rv; AB_BANKING *ab; GWEN_GUI *gui; int nonInteractive=0; int acceptValidCerts=0; const char *pinFile; const char *cfgDir; const char *s; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "cfgdir", /* name */ 0, /* minnum */ 1, /* maxnum */ "D", /* short option */ "cfgdir", /* long option */ I18S("Specify the configuration folder"), I18S("Specify the configuration folder") }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "nonInteractive", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "noninteractive", /* long option */ "Select non-interactive mode",/* short description */ "Select non-interactive mode.\n" /* long description */ "This automatically returns a confirmative answer to any non-critical\n" "message." }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "acceptValidCerts", /* name */ 0, /* minnum */ 1, /* maxnum */ "A", /* short option */ "acceptvalidcerts", /* long option */ "Automatically accept all valid TLS certificate", "Automatically accept all valid TLS certificate" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "charset", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "charset", /* long option */ "Specify the output character set", /* short description */ "Specify the output character set" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "pinfile", /* name */ 0, /* minnum */ 1, /* maxnum */ "P", /* short option */ "pinfile", /* long option */ "Specify the PIN file", /* short description */ "Specify the PIN file" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", I18S("Show this help screen. For help on commands, " "run aqbanking-cli --help."), I18S("Show this help screen. For help on commands, run aqbanking-cli --help.") } }; rv=GWEN_Init(); if (rv) { fprintf(stderr, "ERROR: Unable to init Gwen.\n"); exit(2); } GWEN_Logger_Open(0, "aqbanking-cli", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning); rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, LOCALEDIR); if (rv) { DBG_ERROR(0, "Could not bind textdomain (%d)", rv); } else { rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8"); if (rv) { DBG_ERROR(0, "Could not set codeset (%d)", rv); } } db=GWEN_DB_Group_new("arguments"); rv=GWEN_Args_Check(argc, argv, 1, GWEN_ARGS_MODE_ALLOW_FREEPARAM | GWEN_ARGS_MODE_STOP_AT_FREEPARAM, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments main\n"); GWEN_DB_Group_free(db); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); GWEN_Buffer_AppendString(ubuf, I18N("This is version ")); GWEN_Buffer_AppendString(ubuf, AQHBCI_VERSION_STRING "\n"); GWEN_Buffer_AppendString(ubuf, I18N("Usage: ")); GWEN_Buffer_AppendString(ubuf, argv[0]); GWEN_Buffer_AppendString(ubuf, I18N(" [GLOBAL OPTIONS] COMMAND " "[LOCAL OPTIONS]\n")); GWEN_Buffer_AppendString(ubuf, I18N("\nGlobal Options:\n")); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); GWEN_DB_Group_free(db); return 1; } GWEN_Buffer_AppendString(ubuf, I18N("\nCommands:\n")); cmdAddHelpStr(ubuf, "senddtazv", I18N("Sends a DTAZV file to the bank")); cmdAddHelpStr(ubuf, "listaccs", I18N("Prints the list of accounts")); cmdAddHelpStr(ubuf, "listbal", I18N("Export balances from a context file.")); cmdAddHelpStr(ubuf, "listtrans", I18N("Export transactions from a context file.")); cmdAddHelpStr(ubuf, "listtransfers", I18N("Export transactions from a context file which match certain status.")); cmdAddHelpStr(ubuf, "request", I18N("Requests transactions, balances, standing orders etc.")); cmdAddHelpStr(ubuf, "chkacc", I18N("Check a combination of bank id and account number")); cmdAddHelpStr(ubuf, "chkiban", I18N("Check an IBAN")); cmdAddHelpStr(ubuf, "import", I18N("Import a file into an import context file")); cmdAddHelpStr(ubuf, "transfer", I18N("Issue a single transfer (data from command line)")); cmdAddHelpStr(ubuf, "transfers", I18N("Issue a number of transfers (data from a file)")); cmdAddHelpStr(ubuf, "sepatransfer", I18N("Issue a single SEPA transfer (data from command line)")); cmdAddHelpStr(ubuf, "sepatransfers", I18N("Issue a number of SEPA transfers (data from a file)")); cmdAddHelpStr(ubuf, "debitnote", I18N("Issue a single debit note (data from command line)")); cmdAddHelpStr(ubuf, "debitnotes", I18N("Issue a number of debit notes (data from a file)")); cmdAddHelpStr(ubuf, "sepadebitnote", I18N("Issue a single SEPA debit note (data from command line)")); cmdAddHelpStr(ubuf, "sepaflashdebitnote", I18N("Issue a single flash SEPA debit note COR1 (data from command line)")); cmdAddHelpStr(ubuf, "sepadebitnotes", I18N("Issue a number of SEPA debit notes (data from a file)")); cmdAddHelpStr(ubuf, "addtrans", I18N("Add a transfer to an existing import context file")); cmdAddHelpStr(ubuf, "addsepadebitnote", I18N("Add a SEPA debit note to an existing import context file")); cmdAddHelpStr(ubuf, "sepacreatesto", I18N("Create SEPA standing order")); cmdAddHelpStr(ubuf, "fillgaps", I18N("Fill gaps in an import context file from configuration settings")); cmdAddHelpStr(ubuf, "updateconf", I18N("Update configuration from previous AqBanking versions")); cmdAddHelpStr(ubuf, "listprofiles", I18N("Print existing profiles")); cmdAddHelpStr(ubuf, "versions", I18N("Print the program and library versions")); GWEN_Buffer_AppendString(ubuf, "\n"); fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); GWEN_DB_Group_free(db); return 0; } if (rv) { argc-=rv-1; argv+=rv-1; } nonInteractive=GWEN_DB_GetIntValue(db, "nonInteractive", 0, 0); acceptValidCerts=GWEN_DB_GetIntValue(db, "acceptValidCerts", 0, 0); cfgDir=GWEN_DB_GetCharValue(db, "cfgdir", 0, 0); cmd=GWEN_DB_GetCharValue(db, "params", 0, 0); if (!cmd) { fprintf(stderr, "ERROR: Command needed.\n"); GWEN_DB_Group_free(db); return 1; } gui=GWEN_Gui_CGui_new(); s=GWEN_DB_GetCharValue(db, "charset", 0, NULL); if (s && *s) GWEN_Gui_SetCharSet(gui, s); if (nonInteractive) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE); if (acceptValidCerts) GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); else GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS); pinFile=GWEN_DB_GetCharValue(db, "pinFile", 0, NULL); if (pinFile) { GWEN_DB_NODE *dbPins; dbPins=GWEN_DB_Group_new("pins"); if (GWEN_DB_ReadFile(dbPins, pinFile, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP)) { fprintf(stderr, "Error reading pinfile \"%s\"\n", pinFile); GWEN_DB_Group_free(dbPins); GWEN_DB_Group_free(db); return 2; } GWEN_Gui_SetPasswordDb(gui, dbPins, 1); } GWEN_Gui_SetGui(gui); ab=AB_Banking_new("aqbanking-cli", cfgDir, 0); AB_Gui_Extend(gui, ab); if (strcasecmp(cmd, "senddtazv")==0) { rv=sendDtazv(ab, db, argc, argv); } else if (strcasecmp(cmd, "listaccs")==0) { rv=listAccs(ab, db, argc, argv); } else if (strcasecmp(cmd, "listbal")==0) { rv=listBal(ab, db, argc, argv); } else if (strcasecmp(cmd, "listtrans")==0) { rv=listTrans(ab, db, argc, argv); } else if (strcasecmp(cmd, "listtransfers")==0) { rv=listTransfers(ab, db, argc, argv); } else if (strcasecmp(cmd, "request")==0) { rv=request(ab, db, argc, argv); } else if (strcasecmp(cmd, "chkacc")==0) { rv=chkAcc(ab, db, argc, argv); } else if (strcasecmp(cmd, "chkiban")==0) { rv=chkIban(ab, db, argc, argv); } else if (strcasecmp(cmd, "import")==0) { rv=import(ab, db, argc, argv); } else if (strcasecmp(cmd, "transfer")==0) { rv=transfer(ab, db, argc, argv); } else if (strcasecmp(cmd, "transfers")==0) { rv=transfers(ab, db, argc, argv); } else if (strcasecmp(cmd, "sepatransfer")==0) { rv=sepaTransfer(ab, db, argc, argv); } else if (strcasecmp(cmd, "sepatransfers")==0) { rv=sepaMultiJobs(ab, db, argc, argv, AQBANKING_TOOL_SEPA_TRANSFERS); } else if (strcasecmp(cmd, "debitnote")==0) { rv=debitNote(ab, db, argc, argv); } else if (strcasecmp(cmd, "debitnotes")==0) { rv=debitNotes(ab, db, argc, argv); } else if (strcasecmp(cmd, "sepadebitnote")==0) { rv=sepaDebitNote(ab, db, argc, argv, 0); } else if (strcasecmp(cmd, "sepaFlashDebitNote")==0) { rv=sepaDebitNote(ab, db, argc, argv, 1); } else if (strcasecmp(cmd, "sepadebitnotes")==0) { rv=sepaMultiJobs(ab, db, argc, argv, AQBANKING_TOOL_SEPA_DEBITNOTES); } else if (strcasecmp(cmd, "addtrans")==0) { rv=addTransaction(ab, db, argc, argv); } else if (strcasecmp(cmd, "addsepadebitnote")==0) { rv=addSepaDebitNote(ab, db, argc, argv); } else if (strcasecmp(cmd, "sepacreatesto")==0) { rv=sepaRecurTransfer(ab, db, argc, argv); } else if (strcasecmp(cmd, "fillgaps")==0) { rv=fillGaps(ab, db, argc, argv); } else if (strcasecmp(cmd, "updateconf")==0) { rv=updateConf(ab, db, argc, argv); } else if (strcasecmp(cmd, "listprofiles")==0) { rv=listProfiles(ab, db, argc, argv); } else if (strcasecmp(cmd, "versions")==0) { rv=versions(ab, db, argc, argv); } else { fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd); rv=1; } GWEN_DB_Group_free(db); return rv; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/versions.c0000644000175000017500000000223512364015477017714 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include static int versions(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { int vmajor, vminor, vpatchLevel, vbuild; fprintf(stdout, "Versions:\n"); fprintf(stdout, " AqBanking-CLI: %s\n", AQBANKING_CLI_VERSION_STRING); GWEN_Version(&vmajor, &vminor, &vpatchLevel, &vbuild); fprintf(stdout, " Gwenhywfar : %d.%d.%d.%d\n", vmajor, vminor, vpatchLevel, vbuild); AB_Banking_GetVersion(&vmajor, &vminor, &vpatchLevel, &vbuild); fprintf(stdout, " AqBanking : %d.%d.%d.%d\n", vmajor, vminor, vpatchLevel, vbuild); return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/debitnotes.c0000644000175000017500000002600312364015477020203 00000000000000/*************************************************************************** begin : Thu Apr 24 2008 copyright : (C) 2008-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include static int debitNotes(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *inFile; const char *importerName; const char *profileName; const char *profileFile; const char *bankId; const char *accountId; int forceCheck; int fillGaps; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea; AB_JOB_LIST2 *jobList; int rvExec; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "importerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "importer", /* long option */ "Specify the importer to use", /* short description */ "Specify the importer to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { 0, GWEN_ArgsType_Int, "forceCheck", 0, 1, 0, "force-check", "force account number check", "force account number check" }, { 0, GWEN_ArgsType_Int, "fillGaps", 0, 1, 0, "fill-gaps", "let AqBanking fill-in missing account information if possible", "let AqBanking fill-in missing account information if possible", }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); importerName=GWEN_DB_GetCharValue(db, "importerName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "default"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); forceCheck=GWEN_DB_GetIntValue(db, "forceCheck", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); fillGaps=GWEN_DB_GetIntValue(db, "fillGaps", 0, 0); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* import new context */ ctx=AB_ImExporterContext_new(); rv=AB_Banking_ImportFileWithProfile(ab, importerName, ctx, profileName, profileFile, inFile); if (rv<0) { DBG_ERROR(0, "Error reading file: %d", rv); AB_ImExporterContext_free(ctx); return 4; } /* adjust local account id if requested */ if (bankId || accountId) { iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { if (bankId) AB_ImExporterAccountInfo_SetBankCode(iea, bankId); if (accountId) AB_ImExporterAccountInfo_SetAccountNumber(iea, accountId); iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ } /* fill gaps */ if (fillGaps) AB_Banking_FillGapsInImExporterContext(ab, ctx); /* populate job list */ jobList=AB_Job_List2_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { AB_ACCOUNT *a; a=AB_Banking_GetAccountByCodeAndNumber(ab, AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); if (!a) { DBG_ERROR(0, "Account %s/%s not found, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } else { AB_TRANSACTION *t; t=AB_ImExporterAccountInfo_GetFirstTransaction(iea); while(t) { const char *rBankId; const char *rAccountId; AB_BANKINFO_CHECKRESULT res; AB_JOB *j; rBankId=AB_Transaction_GetRemoteBankCode(t); rAccountId=AB_Transaction_GetRemoteAccountNumber(t); res=AB_Banking_CheckAccount(ab, "de", 0, rBankId, rAccountId); switch(res) { case AB_BankInfoCheckResult_NotOk: DBG_ERROR(0, "Invalid combination of bank code and account number " "for remote account (%s/%s)", rBankId, rAccountId); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; case AB_BankInfoCheckResult_UnknownBank: DBG_ERROR(0, "Remote bank code is unknown (%s/%s)", rBankId, rAccountId); if (forceCheck) { AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 4; } break; case AB_BankInfoCheckResult_UnknownResult: DBG_WARN(0, "Indifferent result for remote account check (%s/%s)", rBankId, rAccountId); break; case AB_BankInfoCheckResult_Ok: break; default: DBG_ERROR(0, "Unknown check result %d", res); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 4; } /* update transaction */ if (AB_Transaction_GetTextKey(t)==0) AB_Transaction_SetTextKey(t, 5); j=AB_JobSingleDebitNote_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } rv=AB_Job_SetTransaction(j, t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction for account %s/%s, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); AB_Job_free(j); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } AB_Job_List2_PushBack(jobList, j); t=AB_ImExporterAccountInfo_GetNextTransaction(iea); } /* while t */ } iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ AB_ImExporterContext_free(ctx); /* execute jobs */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write context */ rv=writeContext(ctxFile, ctx); if (rv<0) { AB_ImExporterContext_free(ctx); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } AB_ImExporterContext_free(ctx); /* that's is */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/listtransfers.c0000644000175000017500000002345512364015477020756 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include static int listTransfers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *outFile; const char *exporterName; const char *profileName; const char *profileFile; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_CONTEXT *nctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea=0; const char *bankId; const char *accountId; const char *bankName; const char *accountName; AB_TRANSACTION_STATUS tStatus; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the file to store the data in", /* short description */ "Specify the file to store the data in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "exporterName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "exporter", /* long option */ "Specify the exporter to use", /* short description */ "Specify the exporter to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "status", /* name */ 0, /* minnum */ 1, /* maxnum */ "S", /* short option */ "status", /* long option */ "Only list transfers with the given status", /* short description */ "Only list transfers with the given status" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } exporterName=GWEN_DB_GetCharValue(db, "exporterName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "cli-transfers"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); outFile=GWEN_DB_GetCharValue(db, "outFile", 0, 0); tStatus=AB_Transaction_Status_fromString(GWEN_DB_GetCharValue(db, "status", 0, "none")); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=readContext(ctxFile, &ctx, 1); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); return 4; } nctx=AB_ImExporterContext_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { int matches=1; const char *s; if (matches && bankId) { s=AB_ImExporterAccountInfo_GetBankCode(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s) s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && accountName) { s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s) s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { AB_IMEXPORTER_ACCOUNTINFO *nai; const AB_TRANSACTION *t; nai=AB_ImExporterAccountInfo_new(); t=AB_ImExporterAccountInfo_GetFirstTransfer(iea); while(t) { if ((tStatus==AB_Transaction_StatusNone) || (tStatus==AB_Transaction_GetStatus(t))) { AB_TRANSACTION *nt; nt=AB_Transaction_dup(t); AB_ImExporterAccountInfo_AddTransaction(nai, nt); } t=AB_ImExporterAccountInfo_GetNextTransfer(iea); } AB_ImExporterContext_AddAccountInfo(nctx, nai); } /* if matches */ iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ /* export new context */ rv=AB_Banking_ExportToFileWithProfile(ab, exporterName, nctx, profileName, profileFile, outFile); if (rv<0) { DBG_ERROR(0, "Error exporting (%d).", rv); AB_ImExporterContext_free(nctx); return 4; } AB_ImExporterContext_free(nctx); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/debitnote.c0000644000175000017500000002634212425214301020007 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include static int debitNote(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; AB_JOB_LIST2 *jobList; AB_JOB *j; int rvExec; AB_JOB_TYPE transferType; const char *rBankId; const char *rAccountId; int forceCheck; AB_BANKINFO_CHECKRESULT res; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBankId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbank", /* long option */ "Specify the remote bank code",/* short description */ "Specify the remote bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteAccountId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "raccount", /* long option */ "Specify the remote account number", /* short description */ "Specify the remote account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "textkey", /* name */ 0, /* minnum */ 1, /* maxnum */ "t", /* short option */ "textkey", /* long option */ "Specify the text key (5 for normal debit notes)", /* short description */ "Specify the text key (5 for normal debit notes)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { 0, GWEN_ArgsType_Int, "forceCheck", 0, 1, 0, "force-check", "force account number check", "force account number check" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); forceCheck=GWEN_DB_GetIntValue(db, "forceCheck", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkTransfer(a, db, &transferType); if (t==NULL) { DBG_ERROR(0, "Could not create transaction from arguments"); return 2; } if (AB_Transaction_GetTextKey(t)==0) AB_Transaction_SetTextKey(t, 5); rBankId=AB_Transaction_GetRemoteBankCode(t); rAccountId=AB_Transaction_GetRemoteAccountNumber(t); res=AB_Banking_CheckAccount(ab, "de", 0, rBankId, rAccountId); switch(res) { case AB_BankInfoCheckResult_NotOk: DBG_ERROR(0, "Invalid combination of bank code and account number " "for remote account (%s/%s)", rBankId, rAccountId); AB_Transaction_free(t); return 3; case AB_BankInfoCheckResult_UnknownBank: DBG_ERROR(0, "Remote bank code is unknown (%s/%s)", rBankId, rAccountId); if (forceCheck) { AB_Transaction_free(t); return 4; } break; case AB_BankInfoCheckResult_UnknownResult: DBG_WARN(0, "Indifferent result for remote account check (%s/%s)", rBankId, rAccountId); break; case AB_BankInfoCheckResult_Ok: break; default: DBG_ERROR(0, "Unknown check result %d", res); AB_Transaction_free(t); return 4; } j=AB_JobSingleDebitNote_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Transaction_free(t); return 3; } rv=AB_Job_SetTransaction(j, t); AB_Transaction_free(t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction"); AB_Job_free(j); return 3; } /* populate job list */ jobList=AB_Job_List2_new(); if (!jobList) { DBG_ERROR(0, "Could not set up job list."); AB_Job_free(j); return 3; } AB_Job_List2_PushBack(jobList, j); /* execute job */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write context */ rv=writeContext(ctxFile, ctx); if (rv<0) { AB_ImExporterContext_free(ctx); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } AB_ImExporterContext_free(ctx); /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/util.c0000644000175000017500000003627412624441730017025 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include int readContext(const char *ctxFile, AB_IMEXPORTER_CONTEXT **pCtx, int mustExist) { AB_IMEXPORTER_CONTEXT *ctx; GWEN_SYNCIO *sio; GWEN_DB_NODE *dbCtx; int rv; if (ctxFile==NULL) { sio=GWEN_SyncIo_File_fromStdin(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE | GWEN_SYNCIO_FILE_FLAGS_READ); } else { sio=GWEN_SyncIo_File_new(ctxFile, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { if (!mustExist) { ctx=AB_ImExporterContext_new(); *pCtx=ctx; GWEN_SyncIo_free(sio); return 0; } GWEN_SyncIo_free(sio); return 4; } } /* actually read */ dbCtx=GWEN_DB_Group_new("context"); rv=GWEN_DB_ReadFromIo(dbCtx, sio, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_ERROR(0, "Error reading context file (%d)", rv); GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); ctx=AB_ImExporterContext_fromDb(dbCtx); if (!ctx) { DBG_ERROR(0, "No context in input data"); GWEN_DB_Group_free(dbCtx); return GWEN_ERROR_BAD_DATA; } GWEN_DB_Group_free(dbCtx); *pCtx=ctx; return 0; } int writeContext(const char *ctxFile, const AB_IMEXPORTER_CONTEXT *ctx) { GWEN_DB_NODE *dbCtx; GWEN_SYNCIO *sio; int rv; if (ctxFile==NULL) { sio=GWEN_SyncIo_File_fromStdout(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE | GWEN_SYNCIO_FILE_FLAGS_WRITE); } else { sio=GWEN_SyncIo_File_new(ctxFile, GWEN_SyncIo_File_CreationMode_CreateAlways); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ | GWEN_SYNCIO_FILE_FLAGS_WRITE | GWEN_SYNCIO_FILE_FLAGS_UREAD | GWEN_SYNCIO_FILE_FLAGS_UWRITE | GWEN_SYNCIO_FILE_FLAGS_GREAD | GWEN_SYNCIO_FILE_FLAGS_GWRITE); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { DBG_ERROR(0, "Error selecting output file: %s", strerror(errno)); GWEN_SyncIo_free(sio); return 4; } } dbCtx=GWEN_DB_Group_new("context"); rv=AB_ImExporterContext_toDb(ctx, dbCtx); if (rv<0) { DBG_ERROR(0, "Error writing context to db (%d)", rv); GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } rv=GWEN_DB_WriteToIo(dbCtx, sio, GWEN_DB_FLAGS_DEFAULT); if (rv<0) { DBG_ERROR(0, "Error writing context (%d)", rv); } else rv=0; GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } AB_TRANSACTION *mkTransfer(AB_ACCOUNT *a, GWEN_DB_NODE *db, AB_JOB_TYPE *jobType) { AB_BANKING *ab; AB_TRANSACTION *t; const char *s; int i; GWEN_TIME *d; AB_TRANSACTION_PERIOD period=AB_Transaction_PeriodUnknown; *jobType=AB_Job_TypeTransfer; // single transfer assert(a); assert(db); ab=AB_Account_GetBanking(a); assert(ab); t=AB_Transaction_new(); AB_Banking_FillGapsInTransaction(ab, a, t); s=GWEN_DB_GetCharValue(db, "name", 0, 0); if (s && *s) AB_Transaction_SetLocalName(t, s); /* remote account */ s=GWEN_DB_GetCharValue(db, "remoteBankId", 0, 0); if (s && *s) AB_Transaction_SetRemoteBankCode(t, s); else { DBG_ERROR(0, "No remote bank id given"); AB_Transaction_free(t); return 0; } s=GWEN_DB_GetCharValue(db, "remoteAccountId", 0, 0); if (s && *s) AB_Transaction_SetRemoteAccountNumber(t, s); s=GWEN_DB_GetCharValue(db, "remoteIban", 0, 0); if (s && *s) AB_Transaction_SetRemoteIban(t, s); s=GWEN_DB_GetCharValue(db, "remoteBic", 0, 0); if (s && *s) AB_Transaction_SetRemoteBic(t, s); for (i=0; i<10; i++) { s=GWEN_DB_GetCharValue(db, "remoteName", i, 0); if (!s) break; if (*s) AB_Transaction_AddRemoteName(t, s, 0); } if (i<1) { DBG_ERROR(0, "No remote name given"); AB_Transaction_free(t); return 0; } /* transfer data */ for (i=0; i<20; i++) { s=GWEN_DB_GetCharValue(db, "purpose", i, 0); if (!s) break; if (*s) AB_Transaction_AddPurpose(t, s, 0); } if (i<1) { DBG_ERROR(0, "No purpose given"); AB_Transaction_free(t); return 0; } i=GWEN_DB_GetIntValue(db, "textkey", 0, -1); if (i>0) AB_Transaction_SetTextKey(t, i); s=GWEN_DB_GetCharValue(db, "value", 0, 0); if (s && *s) { AB_VALUE *v; v=AB_Value_fromString(s); assert(v); if (AB_Value_IsNegative(v) || AB_Value_IsZero(v)) { DBG_ERROR(0, "Only positive non-zero amount allowed"); AB_Transaction_free(t); return 0; } AB_Transaction_SetValue(t, v); AB_Value_free(v); } else { DBG_ERROR(0, "No value given"); AB_Transaction_free(t); return 0; } // dated transfer s=GWEN_DB_GetCharValue(db, "executionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid execution date value \"%s\"", s); AB_Transaction_free(t); return 0; } AB_Transaction_SetDate(t, d); GWEN_Time_free(d); *jobType=AB_Job_TypeCreateDatedTransfer; return t; } // standing orders s=GWEN_DB_GetCharValue(db, "firstExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid first execution date value \"%s\"", s); AB_Transaction_free(t); return 0; } AB_Transaction_SetFirstExecutionDate(t, d); GWEN_Time_free(d); } else return t; // single transfer *jobType=AB_Job_TypeCreateStandingOrder; s=GWEN_DB_GetCharValue(db, "lastExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid last execution date value \"%s\"", s); AB_Transaction_free(t); return 0; } AB_Transaction_SetLastExecutionDate(t, d); GWEN_Time_free(d); } s=GWEN_DB_GetCharValue(db, "executionPeriod", 0, 0); if (s && *s) { period=AB_Transaction_Period_fromString(s); if (period==AB_Transaction_PeriodUnknown) { DBG_ERROR(0, "Invalid execution period value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetPeriod(t, period); } i=GWEN_DB_GetIntValue(db, "executionCycle", 0, -1); if (i <= 0) { DBG_ERROR(0, "Invalid execution cycle value \"%d\"", i); AB_Transaction_free(t); return 0; } AB_Transaction_SetCycle(t, i); i=GWEN_DB_GetIntValue(db, "executionDay", 0, -1); if (i <= 0 || (period == AB_Transaction_PeriodWeekly && i > 7) || (period == AB_Transaction_PeriodMonthly && i > 30 && (i < 97 || i > 99))) { DBG_ERROR(0, "Invalid execution day value \"%d\"", i); AB_Transaction_free(t); return 0; } AB_Transaction_SetExecutionDay(t, i); s=GWEN_DB_GetCharValue(db, "fiId", 0, 0); if (s && *s) { AB_Transaction_SetFiId(t, s); *jobType=AB_Job_TypeDeleteStandingOrder; } return t; } AB_TRANSACTION *mkSepaTransfer(AB_ACCOUNT *a, GWEN_DB_NODE *db, int expTransferType) { AB_BANKING *ab; AB_TRANSACTION *t; const char *s; int i; GWEN_TIME *d; assert(a); assert(db); ab=AB_Account_GetBanking(a); assert(ab); t=AB_Transaction_new(); AB_Banking_FillGapsInTransaction(ab, a, t); s=GWEN_DB_GetCharValue(db, "name", 0, 0); if (s && *s) AB_Transaction_SetLocalName(t, s); /* remote account */ s=GWEN_DB_GetCharValue(db, "remoteBankId", 0, 0); if (s && *s) AB_Transaction_SetRemoteBankCode(t, s); s=GWEN_DB_GetCharValue(db, "remoteAccountId", 0, 0); if (s && *s) AB_Transaction_SetRemoteAccountNumber(t, s); s=GWEN_DB_GetCharValue(db, "remoteIban", 0, 0); if (s && *s) AB_Transaction_SetRemoteIban(t, s); else { DBG_ERROR(0, "No remote IBAN given"); AB_Transaction_free(t); return NULL; } s=GWEN_DB_GetCharValue(db, "remoteBic", 0, 0); if (s && *s) AB_Transaction_SetRemoteBic(t, s); else if (strncmp(AB_Transaction_GetLocalIban(t), AB_Transaction_GetRemoteIban(t), 2)) { DBG_ERROR(0, "Remote BIC id required for international transaction"); AB_Transaction_free(t); return NULL; } for (i=0; i<10; i++) { s=GWEN_DB_GetCharValue(db, "remoteName", i, 0); if (!s) break; if (*s) AB_Transaction_AddRemoteName(t, s, 0); } if (i<1) { DBG_ERROR(0, "No remote name given"); AB_Transaction_free(t); return NULL; } /* transfer data */ for (i=0; i<20; i++) { s=GWEN_DB_GetCharValue(db, "purpose", i, 0); if (!s) break; if (*s) AB_Transaction_AddPurpose(t, s, 0); } if (i<1) { DBG_ERROR(0, "No purpose given"); AB_Transaction_free(t); return NULL; } i=GWEN_DB_GetIntValue(db, "textkey", 0, -1); if (i>0) AB_Transaction_SetTextKey(t, i); s=GWEN_DB_GetCharValue(db, "value", 0, 0); if (s && *s) { AB_VALUE *v; v=AB_Value_fromString(s); assert(v); if (AB_Value_IsNegative(v) || AB_Value_IsZero(v)) { DBG_ERROR(0, "Only positive non-zero amount allowed"); AB_Transaction_free(t); return NULL; } AB_Transaction_SetValue(t, v); AB_Value_free(v); } else { DBG_ERROR(0, "No value given"); AB_Transaction_free(t); return NULL; } /* dated transfer, SEPA debit notes */ s=GWEN_DB_GetCharValue(db, "executionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetDate(t, d); GWEN_Time_free(d); } /* standing orders */ s=GWEN_DB_GetCharValue(db, "firstExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid first execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetFirstExecutionDate(t, d); GWEN_Time_free(d); } s=GWEN_DB_GetCharValue(db, "lastExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid last execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetLastExecutionDate(t, d); GWEN_Time_free(d); } if (expTransferType==AB_Job_TypeSepaCreateStandingOrder || expTransferType==AB_Job_TypeSepaModifyStandingOrder) { const char *s; AB_TRANSACTION_PERIOD period=AB_Transaction_PeriodUnknown; /* only needed for standing orders */ s=GWEN_DB_GetCharValue(db, "executionPeriod", 0, 0); if (s && *s) { period=AB_Transaction_Period_fromString(s); if (period==AB_Transaction_PeriodUnknown) { DBG_ERROR(0, "Invalid execution period value \"%s\"", s); AB_Transaction_free(t); return NULL; } } else { DBG_ERROR(0, "Missing execution period value"); return NULL; } AB_Transaction_SetPeriod(t, period); i=GWEN_DB_GetIntValue(db, "executionCycle", 0, -1); if (i <= 0) { DBG_ERROR(0, "Invalid execution cycle value \"%d\"", i); AB_Transaction_free(t); return NULL; } AB_Transaction_SetCycle(t, i); i=GWEN_DB_GetIntValue(db, "executionDay", 0, -1); if (i <= 0 || (period == AB_Transaction_PeriodWeekly && i > 7) || (period == AB_Transaction_PeriodMonthly && i > 30 && (i < 97 || i > 99))) { DBG_ERROR(0, "Invalid execution day value \"%d\"", i); AB_Transaction_free(t); return NULL; } AB_Transaction_SetExecutionDay(t, i); /* SetFiId */ s=GWEN_DB_GetCharValue(db, "fiId", 0, 0); if (s && *s) AB_Transaction_SetFiId(t, s); } return t; } AB_TRANSACTION *mkSepaDebitNote(AB_ACCOUNT *a, GWEN_DB_NODE *db) { AB_TRANSACTION *t; const char *s; t=mkSepaTransfer(a, db, AB_Job_TypeSepaDebitNote); if (t==NULL) { DBG_INFO(0, "here"); return NULL; } /* read some additional fields */ s=GWEN_DB_GetCharValue(db, "creditorSchemeId", 0, 0); if (!(s && *s)) { DBG_ERROR(0, "Missing creditor scheme id"); AB_Transaction_free(t); return NULL; } AB_Transaction_SetCreditorSchemeId(t, s); s=GWEN_DB_GetCharValue(db, "mandateId", 0, 0); if (!(s && *s)) { DBG_ERROR(0, "Missing mandate id"); AB_Transaction_free(t); return NULL; } AB_Transaction_SetMandateId(t, s); s=GWEN_DB_GetCharValue(db, "mandateDate", 0, 0); if (!(s && *s)) { DBG_ERROR(0, "Missing mandate date"); AB_Transaction_free(t); return NULL; } else { GWEN_DATE *dt; dt=GWEN_Date_fromString(s); if (dt==NULL) { DBG_ERROR(0, "Bad date format for mandate date"); AB_Transaction_free(t); return NULL; } AB_Transaction_SetMandateDate(t, dt); GWEN_Date_free(dt); } s=GWEN_DB_GetCharValue(db, "sequenceType", 0, "once"); if (s && *s) { AB_TRANSACTION_SEQUENCETYPE st; st=AB_Transaction_SequenceType_fromString(s); if (st!=AB_Transaction_SequenceTypeUnknown) AB_Transaction_SetSequenceType(t, st); else { DBG_ERROR(0, "Unknown sequence type [%s]", s); AB_Transaction_free(t); return NULL; } } else AB_Transaction_SetSequenceType(t, AB_Transaction_SequenceTypeOnce); return t; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/addsepadebitnote.c0000644000175000017500000003154612416502277021347 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include #include #include static int addSepaDebitNote(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=NULL; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; const char *rIBAN; const char *rBIC; const char *lIBAN; const char *lBIC; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "name", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "name", /* long option */ "Specify your name", /* short description */ "Specify your name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBIC", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbic", /* long option */ "Specify the remote SWIFT BIC",/* short description */ "Specify the remote SWIFT BIC" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteIBAN", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "riban", /* long option */ "Specify the remote IBAN", /* short description */ "Specify the remote IBAN" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "creditorSchemeId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "creditorSchemeId", /* long option */ "Specify the creditor scheme id (\"Glaeubiger-ID\")", /* short description */ "Specify the creditor scheme id (\"Glaeubiger-ID\")" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "mandateId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "mandateId", /* long option */ "Specify the mandate id", /* short description */ "Specify the mandate id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "mandateDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "mandateDate", /* long option */ "Specify the date of the mandate", /* short description */ "Specify the date of the mandate" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "sequenceType", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "sequenceType", /* long option */ "Specify the sequence type (once, first, following)", /* short description */ "Specify the sequence type (once, first, following)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "executionDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "execdate", /* long option */ "Specify the execution date (YYYYMMDD)", /* short */ "Specify the execution date (YYYYMMDD)" /* long */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); AB_Banking_Fini(ab); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkSepaDebitNote(a, db); if (t==NULL) { DBG_ERROR(0, "Could not create SEPA transaction from arguments"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } AB_Transaction_SetType(t, AB_Transaction_TypeSepaDebitNote); rIBAN=AB_Transaction_GetRemoteIban(t); rBIC=AB_Transaction_GetRemoteBic(t); lIBAN=AB_Transaction_GetLocalIban(t); lBIC=AB_Transaction_GetLocalBic(t); if (!rBIC || !(*rBIC)) { DBG_ERROR(0, "Missing remote BIC"); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } if (!rIBAN || !(*rIBAN)) { DBG_ERROR(0, "Missing remote IBAN"); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } rv=AB_Banking_CheckIban(rIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid remote IBAN (%s)", rIBAN); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } if (!lBIC || !(*lBIC)) { DBG_ERROR(0, "Missing local BIC"); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } if (!lIBAN || !(*lIBAN)) { DBG_ERROR(0, "Missing local IBAN"); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } rv=AB_Banking_CheckIban(lIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid local IBAN (%s)", rIBAN); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 3; } if (!lBIC || !(*lBIC)) { DBG_ERROR(0, "Missing local BIC"); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 1; } /* load ctx file */ ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 0); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* add transfer to */ AB_ImExporterContext_AddTransfer(ctx, t); /* write result back */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/fillgaps.c0000644000175000017500000000645312364015477017653 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include static int fillGaps(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; AB_IMEXPORTER_CONTEXT *ctx=0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 0); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); return 4; } AB_Banking_FillGapsInImExporterContext(ab, ctx); rv=writeContext(ctxFile, ctx); if (rv<0) { DBG_ERROR(0, "Error writing context (%d)", rv); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/separecurtransfer.c0000644000175000017500000003167012624441730021601 00000000000000/*************************************************************************** begin : Sat Dec 28 2013 copyright : (C) 2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include static int sepaRecurTransfer(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; AB_JOB_LIST2 *jobList; AB_JOB *j; const AB_TRANSACTION_LIMITS *lim; int rvExec; const char *rIBAN; const char *lIBAN; const char *s; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "name", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "name", /* long option */ "Specify your name", /* short description */ "Specify your name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBIC", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbic", /* long option */ "Specify the remote SWIFT BIC",/* short description */ "Specify the remote SWIFT BIC" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteIBAN", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "riban", /* long option */ "Specify the remote IBAN", /* short description */ "Specify the remote IBAN" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "firstExecutionDate", 1, 1, 0, "firstExecutionDate", "set date of first execution", "set date of first execution" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "lastExecutionDate", 0, 1, 0, "lastExecutionDate", "set date of last execution", "set date of last execution" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "executionDay", 1, 1, 0, "executionDay", "set day of execution", "set day of execution" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "executionCycle", 1, 1, 0, "executionCycle", "set execution cycle", "set execution cycle" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "executionPeriod", 1, 1, 0, "executionPeriod", "set execution period", "set execution period" }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "fiId", /* HKCDL */ 0, 1, 0, "fiId", "set the fiId (standing orders)", "set the fiId (standing orders) - Auftragsidentifikation fuer HKCDL" }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkSepaTransfer(a, db, AB_Job_TypeSepaCreateStandingOrder); if (t==NULL) { DBG_ERROR(0, "Could not create SEPA transaction from arguments"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } AB_Transaction_SetType(t, AB_Transaction_TypeSepaTransfer); AB_Transaction_SetSubType(t, AB_Transaction_SubTypeStandingOrder); rv=AB_Transaction_CheckForSepaConformity(t, 0); /* TODO: determine the flag to use here */ if (rv<0) { DBG_ERROR(0, "Transaction does not conform to SEPA specs (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } /* determine the type of job and create it */ s=AB_Transaction_GetFiId(t); if (s && *s) j=AB_JobSepaDeleteStandingOrder_new(a); else j=AB_JobSepaCreateStandingOrder_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Transaction_free(t); return 3; } lim=AB_Job_GetFieldLimits(j); assert(lim); /* check transaction */ rv=AB_Transaction_CheckPurposeAgainstLimits(t, lim); if (rv<0) { DBG_ERROR(0, "Invalid purpose length (%d)", rv); AB_Job_free(j); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } rv=AB_Transaction_CheckNamesAgainstLimits(t, lim); if (rv<0) { DBG_ERROR(0, "Invalid local and/or remote name (%d)", rv); AB_Job_free(j); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } rv=AB_Transaction_CheckRecurrenceAgainstLimits(t, lim); if (rv<0) { DBG_ERROR(0, "Recurrence specs violate bank paramaters (%d)", rv); AB_Job_free(j); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } rv=AB_Transaction_CheckFirstExecutionDateAgainstLimits(t, lim); if (rv<0) { DBG_ERROR(0, "Setup time violated (%d)", rv); AB_Job_free(j); AB_Transaction_free(t); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } /* check remote IBAN */ rIBAN=AB_Transaction_GetRemoteIban(t); if (!rIBAN || !(*rIBAN)) { DBG_ERROR(0, "Missing remote IBAN"); AB_Job_free(j); AB_Transaction_free(t); return 1; } rv=AB_Banking_CheckIban(rIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid remote IBAN (%s)", rIBAN); AB_Job_free(j); AB_Transaction_free(t); return 3; } /* check local IBAN */ lIBAN=AB_Transaction_GetLocalIban(t); rv=AB_Banking_CheckIban(lIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid local IBAN (%s)", rIBAN); AB_Job_free(j); AB_Transaction_free(t); return 3; } rv=AB_Job_SetTransaction(j, t); AB_Transaction_free(t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction"); AB_Job_free(j); return 3; } /* populate job list */ jobList=AB_Job_List2_new(); AB_Job_List2_PushBack(jobList, j); /* execute job */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write result */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/sepamultijobs.c0000644000175000017500000003271112416502277020724 00000000000000/*************************************************************************** begin : Tue Mar 25 2014 copyright : (C) 2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include typedef enum { AQBANKING_TOOL_SEPA_TRANSFERS , AQBANKING_TOOL_SEPA_DEBITNOTES } AQBANKING_TOOL_MULTISEPA_TYPE; static int sepaMultiJobs(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv, AQBANKING_TOOL_MULTISEPA_TYPE multisepa_type) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *inFile; const char *importerName; const char *profileName; const char *profileFile; const char *bankId; const char *accountId; const char *subAccountId; int fillGaps, use_flash_debitnote; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea; AB_ACCOUNT *forcedAccount=NULL; AB_JOB_LIST2 *jobList; int rvExec, reallyExecute = 1, transactionLine = 0; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "importerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "importer", /* long option */ "Specify the importer to use", /* short description */ "Specify the importer to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the import profile to use", /* short description */ "Specify the import profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the import profile from (WATCH OUT: Feature might be broken)",/* short description */ "Specify the file to load the import profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { 0, GWEN_ArgsType_Int, "fillGaps", 0, 1, 0, "fill-gaps", "let AqBanking fill-in missing account information if possible", "let AqBanking fill-in missing account information if possible", }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "useCOR1", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "use-COR1", /* long option */ "If given, use COR1 variant of debit notes (faster), otherwise CORE (slower)", /* short description */ "If given, use COR1 variant of debit notes (faster), otherwise CORE (slower)" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); importerName=GWEN_DB_GetCharValue(db, "importerName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, (multisepa_type == AQBANKING_TOOL_SEPA_TRANSFERS) ? "default" : "sepadebitnotes"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); fillGaps=GWEN_DB_GetIntValue(db, "fillGaps", 0, 0); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, 0); use_flash_debitnote = GWEN_DB_GetIntValue(db, "useCOR1", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* find local account to set later if requested */ if (bankId || accountId) { AB_ACCOUNT_LIST2 *al; /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } forcedAccount=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); } /* import new context */ ctx=AB_ImExporterContext_new(); rv=AB_Banking_ImportFileWithProfile(ab, importerName, ctx, profileName, profileFile, inFile); if (rv<0) { DBG_ERROR(0, "Error reading file: %d", rv); AB_ImExporterContext_free(ctx); return 4; } /* fill gaps */ if (fillGaps) AB_Banking_FillGapsInImExporterContext(ab, ctx); /* populate job list */ jobList=AB_Job_List2_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { AB_ACCOUNT *a; AB_TRANSACTION *t; if (forcedAccount) a=forcedAccount; else { a=AB_Banking_GetAccountByCodeAndNumber(ab, AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); if (!a) { DBG_ERROR(0, "Local account %s/%s not found, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } } t=AB_ImExporterAccountInfo_GetFirstTransaction(iea); while(t) { AB_JOB *j; const char *rIBAN; const char *lIBAN; const char *lBIC; transactionLine++; if (forcedAccount) { AB_Transaction_SetLocalIban(t, AB_Account_GetIBAN(forcedAccount)); AB_Transaction_SetLocalBic(t, AB_Account_GetBIC(forcedAccount)); } rIBAN=AB_Transaction_GetRemoteIban(t); lIBAN=AB_Transaction_GetLocalIban(t); lBIC=AB_Transaction_GetLocalBic(t); /* preset local BIC and IBAN from account, if not set */ if (!lBIC || !(*lBIC)) lBIC=AB_Account_GetBIC(a); if (!lIBAN || !(*lIBAN)) lIBAN=AB_Account_GetIBAN(a); /* check remote account */ if (!rIBAN || !(*rIBAN)) { DBG_ERROR(0, "Missing remote IBAN, in line %d", transactionLine); reallyExecute = 0; } rv=AB_Banking_CheckIban(rIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid remote IBAN (%s), in line %d", rIBAN, transactionLine); reallyExecute = 0; } /* check local account */ if (!lBIC || !(*lBIC)) { DBG_ERROR(0, "Missing local BIC, in line %d", transactionLine); reallyExecute = 0; } if (!lIBAN || !(*lIBAN)) { DBG_ERROR(0, "Missing local IBAN, in line %d", transactionLine); reallyExecute = 0; } rv=AB_Banking_CheckIban(lIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid local IBAN (%s), in line %d", lIBAN, transactionLine); reallyExecute = 0; } /* Create job */ j = (multisepa_type == AQBANKING_TOOL_SEPA_TRANSFERS) // The command was sepatransfers, so we create JobSepaTransfer ? AB_JobSepaTransfer_new(a) // The command was sepadebitnotes, so we create some debit note : (use_flash_debitnote // Did we have --use-COR1? Use this extra job type ? AB_JobSepaFlashDebitNote_new(a) // No COR1, just standard CORE debit note : AB_JobSepaDebitNote_new(a)); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported, in line %d.", transactionLine); reallyExecute = 0; } rv=AB_Job_SetTransaction(j, t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction for account %s/%s, line %d, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea), transactionLine); reallyExecute = 0; } AB_Job_List2_PushBack(jobList, j); t=AB_ImExporterAccountInfo_GetNextTransaction(iea); } /* while t */ iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ AB_ImExporterContext_free(ctx); if (reallyExecute != 1) { AB_Job_List2_FreeAll(jobList); return 3; } /* execute jobs */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write context */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/Makefile.in0000644000175000017500000006460112643540064017745 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #EXTRA_DIST= VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = aqbanking-cli$(EXEEXT) @IS_WINDOWS_TRUE@am__append_1 = -mconsole subdir = src/tools/aqbanking-cli DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_aqbanking_cli_OBJECTS = main.$(OBJEXT) aqbanking_cli_OBJECTS = $(am_aqbanking_cli_OBJECTS) am__DEPENDENCIES_1 = aqbanking_cli_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = aqbanking_cli_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(aqbanking_cli_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(aqbanking_cli_SOURCES) DIST_SOURCES = $(aqbanking_cli_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ #-Wl,-static DEFS = @DEFS@ -DLOCALEDIR=\"$(localedir)\" \ -DAQBANKING_CLI_VERSION_STRING=\"@AQBANKING_CLI_VERSION_STRING@\" DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) $(aqfinance_includes) \ -I$(top_srcdir)/src/plugins/backends/aqhbci/plugin/banking \ -I$(top_srcdir)/src/plugins/backends/aqhbci/plugin/msglayer AM_CFLAGS = @visibility_cflags@ aqbanking_cli_LDADD = \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ aqbanking_cli_SOURCES = \ main.c aqbanking_cli_LDFLAGS = $(am__append_1) noinst_HEADERS = globals.h EXTRA_DIST = \ addsepadebitnote.c \ addtransaction.c \ chkacc.c \ chkiban.c \ debitnote.c \ debitnotes.c \ fillgaps.c \ import.c \ listaccs.c \ listbal.c \ listprofiles.c \ listtrans.c \ listtransfers.c \ request.c \ senddtazv.c \ transfer.c \ transfers.c \ util.c \ versions.c \ updateconf.c \ sepatransfer.c \ sepadebitnote.c \ sepamultijobs.c \ separecurtransfer.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tools/aqbanking-cli/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/tools/aqbanking-cli/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list aqbanking-cli$(EXEEXT): $(aqbanking_cli_OBJECTS) $(aqbanking_cli_DEPENDENCIES) $(EXTRA_aqbanking_cli_DEPENDENCIES) @rm -f aqbanking-cli$(EXEEXT) $(AM_V_CCLD)$(aqbanking_cli_LINK) $(aqbanking_cli_OBJECTS) $(aqbanking_cli_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS sources: for f in $(aqbanking_cli_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; # 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: aqbanking-5.6.4beta/src/tools/aqbanking-cli/transfers.c0000644000175000017500000002621212364015477020054 00000000000000/*************************************************************************** begin : Thu Apr 24 2008 copyright : (C) 2008-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include static int transfers(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *inFile; const char *importerName; const char *profileName; const char *profileFile; const char *bankId; const char *accountId; int forceCheck; int fillGaps; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea; AB_JOB_LIST2 *jobList; int rvExec; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "inFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "f", /* short option */ "infile", /* long option */ "Specify the file to read the data from", /* short description */ "Specify the file to read the data from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "importerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "importer", /* long option */ "Specify the importer to use", /* short description */ "Specify the importer to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { 0, GWEN_ArgsType_Int, "forceCheck", 0, 1, 0, "force-check", "force account number check", "force account number check" }, { 0, GWEN_ArgsType_Int, "fillGaps", 0, 1, 0, "fill-gaps", "let AqBanking fill-in missing account information if possible", "let AqBanking fill-in missing account information if possible", }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); importerName=GWEN_DB_GetCharValue(db, "importerName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "default"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); forceCheck=GWEN_DB_GetIntValue(db, "forceCheck", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); inFile=GWEN_DB_GetCharValue(db, "inFile", 0, 0); fillGaps=GWEN_DB_GetIntValue(db, "fillGaps", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* import new context */ ctx=AB_ImExporterContext_new(); rv=AB_Banking_ImportFileWithProfile(ab, importerName, ctx, profileName, profileFile, inFile); if (rv<0) { DBG_ERROR(0, "Error reading file: %d", rv); AB_ImExporterContext_free(ctx); return 4; } /* adjust local account id if requested */ if (bankId || accountId) { iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { if (bankId) AB_ImExporterAccountInfo_SetBankCode(iea, bankId); if (accountId) AB_ImExporterAccountInfo_SetAccountNumber(iea, accountId); iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ } /* fill gaps */ if (fillGaps) AB_Banking_FillGapsInImExporterContext(ab, ctx); /* populate job list */ jobList=AB_Job_List2_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { AB_ACCOUNT *a; a=AB_Banking_GetAccountByCodeAndNumber(ab, AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); if (!a) { DBG_ERROR(0, "Account %s/%s not found, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } else { AB_TRANSACTION *t; t=AB_ImExporterAccountInfo_GetFirstTransaction(iea); while(t) { const char *rBankId; const char *rAccountId; AB_BANKINFO_CHECKRESULT res; AB_JOB *j; rBankId=AB_Transaction_GetRemoteBankCode(t); rAccountId=AB_Transaction_GetRemoteAccountNumber(t); res=AB_Banking_CheckAccount(ab, "de", 0, rBankId, rAccountId); switch(res) { case AB_BankInfoCheckResult_NotOk: DBG_ERROR(0, "Invalid combination of bank code and account number " "for remote account (%s/%s)", rBankId, rAccountId); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; case AB_BankInfoCheckResult_UnknownBank: DBG_ERROR(0, "Remote bank code is unknown (%s/%s)", rBankId, rAccountId); if (forceCheck) { AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 4; } break; case AB_BankInfoCheckResult_UnknownResult: DBG_WARN(0, "Indifferent result for remote account check (%s/%s)", rBankId, rAccountId); break; case AB_BankInfoCheckResult_Ok: break; default: DBG_ERROR(0, "Unknown check result %d", res); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 4; } /* update transaction */ if (AB_Transaction_GetTextKey(t)==0) AB_Transaction_SetTextKey(t, 51); j=AB_JobSingleTransfer_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } rv=AB_Job_SetTransaction(j, t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction for account %s/%s, aborting", AB_ImExporterAccountInfo_GetBankCode(iea), AB_ImExporterAccountInfo_GetAccountNumber(iea)); AB_Job_free(j); AB_Job_List2_FreeAll(jobList); AB_ImExporterContext_free(ctx); return 3; } AB_Job_List2_PushBack(jobList, j); t=AB_ImExporterAccountInfo_GetNextTransaction(iea); } /* while t */ } iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ AB_ImExporterContext_free(ctx); /* execute jobs */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write context */ rv=writeContext(ctxFile, ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_ImExporterContext_free(ctx); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } AB_ImExporterContext_free(ctx); /* that's is */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/sepatransfer.c0000644000175000017500000002423712416502277020544 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include #include #include static int sepaTransfer(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; AB_JOB_LIST2 *jobList; AB_JOB *j; int rvExec; const char *rIBAN; const char *lIBAN; const char *lBIC; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "name", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "name", /* long option */ "Specify your name", /* short description */ "Specify your name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBIC", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbic", /* long option */ "Specify the remote SWIFT BIC",/* short description */ "Specify the remote SWIFT BIC" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteIBAN", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "riban", /* long option */ "Specify the remote IBAN", /* short description */ "Specify the remote IBAN" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkSepaTransfer(a, db, AB_Job_TypeSepaTransfer); if (t==NULL) { DBG_ERROR(0, "Could not create SEPA transaction from arguments"); return 2; } rIBAN=AB_Transaction_GetRemoteIban(t); lIBAN=AB_Transaction_GetLocalIban(t); lBIC=AB_Transaction_GetLocalBic(t); if (!rIBAN || !(*rIBAN)) { DBG_ERROR(0, "Missing remote IBAN"); AB_Transaction_free(t); return 1; } rv=AB_Banking_CheckIban(rIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid remote IBAN (%s)", rIBAN); AB_Transaction_free(t); return 3; } if (!lBIC || !(*lBIC)) { DBG_ERROR(0, "Missing local BIC"); AB_Transaction_free(t); return 1; } if (!lIBAN || !(*lIBAN)) { DBG_ERROR(0, "Missing local IBAN"); AB_Transaction_free(t); return 1; } rv=AB_Banking_CheckIban(lIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid local IBAN (%s)", rIBAN); AB_Transaction_free(t); return 3; } j=AB_JobSepaTransfer_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Transaction_free(t); return 3; } rv=AB_Job_SetTransaction(j, t); AB_Transaction_free(t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction"); AB_Job_free(j); return 3; } /* populate job list */ jobList=AB_Job_List2_new(); AB_Job_List2_PushBack(jobList, j); /* execute job */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write result */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/listaccs.c0000644000175000017500000001414412364015477017653 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include static int listAccs(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { AB_ACCOUNT_LIST2 *al; GWEN_DB_NODE *db; int rv; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } al=AB_Banking_GetAccounts(ab); if (al) { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; const char *bankId; const char *accountId; const char *bankName; const char *accountName; const char *s; bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { int matches=1; if (matches && bankId) { s=AB_Account_GetBankCode(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_Account_GetBankName(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_Account_GetAccountNumber(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && accountName) { s=AB_Account_GetAccountName(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { fprintf(stdout, "Account\t"); s=AB_Account_GetBankCode(a); if (!s) s=""; fprintf(stdout, "%s\t", s); s=AB_Account_GetAccountNumber(a); if (!s) s=""; fprintf(stdout, "%s\t", s); s=AB_Account_GetBankName(a); if (!s) s=""; fprintf(stdout, "%s\t", s); s=AB_Account_GetAccountName(a); if (!s) s=""; fprintf(stdout, "%s\n", s); } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/senddtazv.c0000644000175000017500000002505212364015477020050 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id: getsysid.c 1288 2007-08-11 16:53:57Z martin $ begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" /* The code below uses the private symbol AH_Provider_SendDtazv from libaqhbci */ #include "hbci_l.h" #include "provider_l.h" #include #include #include #include #include #include #include #include #ifdef OS_WIN32 # define DIRSEP "\\" #else # define DIRSEP "/" #endif static int _incrementUniqueId(AB_ACCOUNT *a, const char *path) { GWEN_BUFFER *pbuf; const char *s; FILE *f; int cnt=0; int rv; GWEN_FSLOCK *fl; GWEN_FSLOCK_RESULT res; GWEN_TIME *ti; pbuf=GWEN_Buffer_new(0, 256, 0, 1); if (path) { GWEN_Buffer_AppendString(pbuf, path); GWEN_Buffer_AppendString(pbuf, DIRSEP); } ti=GWEN_CurrentTime(); assert(ti); s=AB_Account_GetBankCode(a); assert(s); GWEN_Buffer_AppendString(pbuf, s); GWEN_Buffer_AppendString(pbuf, "-"); s=AB_Account_GetAccountNumber(a); assert(s); GWEN_Buffer_AppendString(pbuf, s); GWEN_Buffer_AppendString(pbuf, "-"); rv=GWEN_Time_toString(ti, "YYYYMMDD", pbuf); assert(rv>=0); GWEN_Time_free(ti); GWEN_Buffer_AppendString(pbuf, ".cnt"); fl=GWEN_FSLock_new(GWEN_Buffer_GetStart(pbuf), GWEN_FSLock_TypeFile); assert(fl); /* lock file */ res=GWEN_FSLock_Lock(fl, 10000, 0); if (res!=GWEN_FSLock_ResultOk) { fprintf(stderr, "ERROR: Could not lock file [%s]", GWEN_Buffer_GetStart(pbuf)); GWEN_FSLock_free(fl); GWEN_Buffer_free(pbuf); return -1; } /* read value, if possible */ f=fopen(GWEN_Buffer_GetStart(pbuf), "r"); if (f) { if (1!=fscanf(f, "%d", &cnt)) { fprintf(stderr, "ERROR: Bad value in file [%s], assuming 0\n", GWEN_Buffer_GetStart(pbuf)); cnt=0; } fclose(f); } /* incremente value */ cnt++; /* write value */ f=fopen(GWEN_Buffer_GetStart(pbuf), "w+"); if (f) { fprintf(f, "%d\n", cnt); if (fclose(f)) { fprintf(stderr, "ERROR: Could not close file [%s]: %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_FSLock_Unlock(fl); GWEN_FSLock_free(fl); GWEN_Buffer_free(pbuf); return -1; } } else { fprintf(stderr, "ERROR: Could not create file [%s]: %s", GWEN_Buffer_GetStart(pbuf), strerror(errno)); GWEN_FSLock_Unlock(fl); GWEN_FSLock_free(fl); GWEN_Buffer_free(pbuf); return -1; } /* unlock file */ GWEN_FSLock_Unlock(fl); GWEN_FSLock_free(fl); GWEN_Buffer_free(pbuf); return 0; } static int _readFile(const char *fname, GWEN_BUFFER *fbuf) { FILE *f; char buffer[512]; if (!fname) f=stdin; else f=fopen(fname, "rb"); if (!f) { fprintf(stderr, "Could not open file [%s]: %s\n", fname, strerror(errno)); return -1; } while(!feof(f)) { size_t s; s=fread(buffer, 1, sizeof(buffer), f); if (s==0) { if (ferror(f)) { fprintf(stderr, "Could not read from file [%s]: %s\n", fname, strerror(errno)); if (fname) fclose(f); return -1; } else break; } else { GWEN_Buffer_AppendBytes(fbuf, buffer, s); } } if (fname) fclose(f); return 0; } static int sendDtazv(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; AB_PROVIDER *pro; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a=0; int rv; const char *bankId; const char *accountId; const char *subAccountId; const char *inFile; const char *ctxFile; const char *cpath; GWEN_BUFFER *dtazv; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "infile", /* name */ 0, /* minnum */ 1, /* maxnum */ "i", /* short option */ "infile", /* long option */ "Specify the input file", /* short description */ "Specify the input file" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "cpath", /* name */ 0, /* minnum */ 1, /* maxnum */ "p", /* short option */ "cdir", /* long option */ "Specify the folder for counter files", /* short description */ "Specify the folder for counter files" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, "*"); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, "*"); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, "*"); inFile=GWEN_DB_GetCharValue(db, "infile", 0, NULL); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, NULL); cpath=GWEN_DB_GetCharValue(db, "cpath", 0, NULL); dtazv=GWEN_Buffer_new(0, 1024, 0, 1); /* Read DTAZV file */ if (_readFile(inFile, dtazv)) { GWEN_Buffer_free(dtazv); return 3; } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); GWEN_Buffer_free(dtazv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on onlineInit (%d)", rv); GWEN_Buffer_free(dtazv); return 2; } pro=AB_Banking_GetProvider(ab, AH_PROVIDER_NAME); assert(pro); al=AB_Banking_FindAccounts(ab, AH_PROVIDER_NAME, "de", bankId, accountId, subAccountId); if (al) { if (AB_Account_List2_GetSize(al)!=1) { DBG_ERROR(0, "Ambiguous account specification"); GWEN_Buffer_free(dtazv); return 3; } else { a=AB_Account_List2_GetFront(al); assert(a); } AB_Account_List2_free(al); } if (!a) { DBG_ERROR(0, "No matching account"); GWEN_Buffer_free(dtazv); return 3; } else { AB_IMEXPORTER_CONTEXT *ctx; int rv2=0; _incrementUniqueId(a, cpath); ctx=AB_ImExporterContext_new(); rv=AH_Provider_SendDtazv(pro, a, ctx, (const uint8_t*)GWEN_Buffer_GetStart(dtazv), GWEN_Buffer_GetUsedBytes(dtazv), 1, 1, 0); /* write ctx file */ if (ctxFile) { GWEN_DB_NODE *dbCtx; dbCtx=GWEN_DB_Group_new("context"); rv2=AB_ImExporterContext_toDb(ctx, dbCtx); if (rv2) { DBG_ERROR(0, "Error writing context to DB (%d)", rv2); } else { rv2=GWEN_DB_WriteFile(dbCtx, ctxFile, GWEN_DB_FLAGS_DEFAULT); if (rv2) { DBG_ERROR(0, "Error writing context to file [%s] (%d)", ctxFile, rv2); } } GWEN_DB_Group_free(dbCtx); } AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR(0, "Error sending DTAZV (%d)", rv); AB_Banking_Fini(ab); GWEN_Buffer_free(dtazv); return 4; } if (rv2) { AB_Banking_Fini(ab); GWEN_Buffer_free(dtazv); return 5; } } GWEN_Buffer_free(dtazv); rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 6; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 6; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/Makefile.am0000644000175000017500000000236112416502277017731 00000000000000#EXTRA_DIST= INCLUDES = -I$(aqbanking_symlinkdir) $(gwenhywfar_includes) $(aqfinance_includes) \ -I$(top_srcdir)/src/plugins/backends/aqhbci/plugin/banking \ -I$(top_srcdir)/src/plugins/backends/aqhbci/plugin/msglayer AM_CFLAGS=@visibility_cflags@ bin_PROGRAMS=aqbanking-cli aqbanking_cli_LDADD= \ $(aqhbci_internal_libs) \ $(aqbanking_internal_libs) \ $(gwenhywfar_libs) -lstdc++ aqbanking_cli_SOURCES= \ main.c aqbanking_cli_LDFLAGS= #-Wl,-static DEFS += -DLOCALEDIR=\"$(localedir)\" -DAQBANKING_CLI_VERSION_STRING=\"@AQBANKING_CLI_VERSION_STRING@\" noinst_HEADERS=globals.h EXTRA_DIST=\ addsepadebitnote.c \ addtransaction.c \ chkacc.c \ chkiban.c \ debitnote.c \ debitnotes.c \ fillgaps.c \ import.c \ listaccs.c \ listbal.c \ listprofiles.c \ listtrans.c \ listtransfers.c \ request.c \ senddtazv.c \ transfer.c \ transfers.c \ util.c \ versions.c \ updateconf.c \ sepatransfer.c \ sepadebitnote.c \ sepamultijobs.c \ separecurtransfer.c if IS_WINDOWS aqbanking_cli_LDFLAGS+=-mconsole endif sources: for f in $(aqbanking_cli_SOURCES); do \ echo $(subdir)/$$f >>$(top_srcdir)/i18nsources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/src/tools/aqbanking-cli/addtransaction.c0000644000175000017500000002272412425214301021030 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include static int addTransaction(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; AB_JOB_TYPE transferType; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBankId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbank", /* long option */ "Specify the remote bank code",/* short description */ "Specify the remote bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteAccountId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "raccount", /* long option */ "Specify the remote account number", /* short description */ "Specify the remote account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteIban", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "riban", /* long option */ "Specify the remote IBAN", /* short description */ "Specify the remote IBAN" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBic", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbic", /* long option */ "Specify the remote BIC", /* short description */ "Specify the remote BIC" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "textkey", /* name */ 0, /* minnum */ 1, /* maxnum */ "t", /* short option */ "textkey", /* long option */ "Specify the text key (51 for normal transfer)", /* short description */ "Specify the text key (51 for normal transfer)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkTransfer(a, db, &transferType); if (t==NULL) { DBG_ERROR(0, "Could not create transaction from arguments"); return 2; } ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 0); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); AB_Transaction_free(t); return 4; } AB_ImExporterContext_AddTransaction(ctx, t); rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context (%d)", rv); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/sepadebitnote.c0000644000175000017500000003130312416502277020665 00000000000000/*************************************************************************** begin : Sat Dec 28 2013 copyright : (C) 2013 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include static int sepaDebitNote(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv, int use_flash_debitnote) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *bankId; const char *accountId; const char *subAccountId; AB_IMEXPORTER_CONTEXT *ctx=0; AB_ACCOUNT_LIST2 *al; AB_ACCOUNT *a; AB_TRANSACTION *t; AB_JOB_LIST2 *jobList; AB_JOB *j; int rvExec; const char *rIBAN; const char *lIBAN; const char *lBIC; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "overwrite the bank code", /* short description */ "overwrite the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "overwrite the account number", /* short description */ "overwrite the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "name", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "name", /* long option */ "Specify your name", /* short description */ "Specify your name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteBIC", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "rbic", /* long option */ "Specify the remote SWIFT BIC",/* short description */ "Specify the remote SWIFT BIC" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteIBAN", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "riban", /* long option */ "Specify the remote IBAN", /* short description */ "Specify the remote IBAN" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "value", /* name */ 1, /* minnum */ 1, /* maxnum */ "v", /* short option */ "value", /* long option */ "Specify the transfer amount", /* short description */ "Specify the transfer amount" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "remoteName", /* name */ 1, /* minnum */ 2, /* maxnum */ 0, /* short option */ "rname", /* long option */ "Specify the remote name", /* short description */ "Specify the remote name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "creditorSchemeId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "creditorSchemeId", /* long option */ "Specify the creditor scheme id (\"Glaeubiger-ID\")", /* short description */ "Specify the creditor scheme id (\"Glaeubiger-ID\")" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "mandateId", /* name */ 1, /* minnum */ 1, /* maxnum */ 0, /* short option */ "mandateId", /* long option */ "Specify the mandate id", /* short description */ "Specify the mandate id" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "mandateDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "mandateDate", /* long option */ "Specify the date when the mandate was issued", /* short description */ "Specify the date when the mandate was issued" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "sequenceType", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "sequenceType", /* long option */ "Specify the sequence type (once, first, following)", /* short description */ "Specify the sequence type (once, first, following)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "purpose", /* name */ 1, /* minnum */ 6, /* maxnum */ "p", /* short option */ "purpose", /* long option */ "Specify the purpose", /* short description */ "Specify the purpose" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "executionDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "execdate", /* long option */ "Specify the execution date (YYYYMMDD)", /* short */ "Specify the execution date (YYYYMMDD)" /* long */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* get account */ al=AB_Banking_FindAccounts(ab, "*", "*", bankId, accountId, subAccountId); if (al==NULL || AB_Account_List2_GetSize(al)==0) { DBG_ERROR(0, "Account not found"); AB_Account_List2_free(al); return 2; } else if (AB_Account_List2_GetSize(al)>1) { DBG_ERROR(0, "Ambiguous account specification"); AB_Account_List2_free(al); return 2; } a=AB_Account_List2_GetFront(al); AB_Account_List2_free(al); /* create transaction from arguments */ t=mkSepaDebitNote(a, db); if (t==NULL) { DBG_ERROR(0, "Could not create SEPA transaction from arguments"); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 2; } AB_Transaction_SetType(t, AB_Transaction_TypeSepaDebitNote); rIBAN=AB_Transaction_GetRemoteIban(t); lIBAN=AB_Transaction_GetLocalIban(t); lBIC=AB_Transaction_GetLocalBic(t); if (!rIBAN || !(*rIBAN)) { DBG_ERROR(0, "Missing remote IBAN"); AB_Transaction_free(t); return 1; } rv=AB_Banking_CheckIban(rIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid remote IBAN (%s)", rIBAN); AB_Transaction_free(t); return 3; } if (!lBIC || !(*lBIC)) { DBG_ERROR(0, "Missing local BIC"); AB_Transaction_free(t); return 1; } if (!lIBAN || !(*lIBAN)) { DBG_ERROR(0, "Missing local IBAN"); AB_Transaction_free(t); return 1; } rv=AB_Banking_CheckIban(lIBAN); if (rv != 0) { DBG_ERROR(0, "Invalid local IBAN (%s)", lIBAN); AB_Transaction_free(t); return 3; } j= use_flash_debitnote ? AB_JobSepaFlashDebitNote_new(a) : AB_JobSepaDebitNote_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Job not supported."); AB_Job_free(j); AB_Transaction_free(t); return 3; } rv=AB_Job_SetTransaction(j, t); AB_Transaction_free(t); if (rv<0) { DBG_ERROR(0, "Unable to add transaction"); AB_Job_free(j); return 3; } /* populate job list */ jobList=AB_Job_List2_new(); assert(jobList); AB_Job_List2_PushBack(jobList, j); /* execute job */ rvExec=0; ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); rvExec=3; } AB_Job_List2_FreeAll(jobList); /* write result */ rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } /* that's it */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); if (rvExec) return rvExec; else return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); if (rvExec) return rvExec; else return 5; } if (rvExec) return rvExec; else return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/request.c0000644000175000017500000003741412367757734017557 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2014 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include #include #include #include #include static int request(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { AB_ACCOUNT_LIST2 *al; GWEN_DB_NODE *db; const char *s; int rv; const char *ctxFile; int requests=0; int reqTrans=0; int reqBalance=0; int reqSto=0; int reqSepaSto=0; int reqDT=0; GWEN_TIME *fromTime=0; GWEN_TIME *toTime=0; AB_JOB_LIST2 *jobList; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "subAccountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "aa", /* short option */ "subaccount", /* long option */ "Specify the sub account id (Unterkontomerkmal)", /* short description */ "Specify the sub account id (Unterkontomerkmal)" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "reqTrans", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "transactions", /* long option */ "Request transactions", /* short description */ "Request transactions" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "reqBalance", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "balance", /* long option */ "Request balance", /* short description */ "Request balance" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "reqSto", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "sto", /* long option */ "Request standing orders", /* short description */ "Request standing orders" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "reqSepaSto", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "sepaSto", /* long option */ "Request SEPA standing orders", /* short description */ "Request SEPA standing orders" /* long description */ }, { 0, /* flags */ GWEN_ArgsType_Int, /* type */ "reqDT", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "dated", /* long option */ "Request dated transfers", /* short description */ "Request dated transfers" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "fromDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "fromdate", /* long option */ "Specify the first date for which transactions are wanted (YYYYMMDD)", /* short */ "Specify the first date for which transactions are wanted (YYYYMMDD)" /* long */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "toDate", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "todate", /* long option */ "Specify the first date for which transactions are wanted (YYYYMMDD)", /* short */ "Specify the first date for which transactions are wanted (YYYYMMDD)" /* long */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } reqTrans=GWEN_DB_GetIntValue(db, "reqTrans", 0, 0); reqBalance=GWEN_DB_GetIntValue(db, "reqBalance", 0, 0); reqSto=GWEN_DB_GetIntValue(db, "reqSto", 0, 0); reqSepaSto=GWEN_DB_GetIntValue(db, "reqSepaSto", 0, 0); reqDT=GWEN_DB_GetIntValue(db, "reqDT", 0, 0); ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); s=GWEN_DB_GetCharValue(db, "fromDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); fromTime=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (fromTime==0) { DBG_ERROR(0, "Invalid fromdate value \"%s\"", s); return 1; } } s=GWEN_DB_GetCharValue(db, "toDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-12:00"); toTime=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (toTime==0) { DBG_ERROR(0, "Invalid todate value \"%s\"", s); GWEN_Time_free(fromTime); return 1; } } rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 2; } jobList=AB_Job_List2_new(); al=AB_Banking_GetAccounts(ab); if (al) { AB_ACCOUNT_LIST2_ITERATOR *ait; ait=AB_Account_List2_First(al); if (ait) { AB_ACCOUNT *a; const char *bankId; const char *accountId; const char *subAccountId; const char *bankName; const char *accountName; const char *s; bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); subAccountId=GWEN_DB_GetCharValue(db, "subAccountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); a=AB_Account_List2Iterator_Data(ait); assert(a); while(a) { int matches=1; if (matches && bankId) { s=AB_Account_GetBankCode(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_Account_GetBankName(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_Account_GetAccountNumber(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && subAccountId) { s=AB_Account_GetSubAccountId(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, subAccountId, 0)) matches=0; } if (matches && accountName) { s=AB_Account_GetAccountName(a); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { if (reqTrans) { AB_JOB *j; j=AB_JobGetTransactions_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Error requesting transactions for %s/%s: %d", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); AB_Account_List2Iterator_free(ait); AB_Account_List2_free(al); AB_Job_List2_FreeAll(jobList); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 3; } if (fromTime) AB_JobGetTransactions_SetFromTime(j, fromTime); if (toTime) AB_JobGetTransactions_SetToTime(j, toTime); AB_Job_List2_PushBack(jobList, j); requests++; } if (reqBalance) { AB_JOB *j; j=AB_JobGetBalance_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Error requesting balance for %s/%s: %d", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); AB_Account_List2Iterator_free(ait); AB_Account_List2_free(al); AB_Job_List2_FreeAll(jobList); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 3; } AB_Job_List2_PushBack(jobList, j); requests++; } if (reqSto) { AB_JOB *j; j=AB_JobGetStandingOrders_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Error requesting standing order for %s/%s: %d", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); AB_Account_List2Iterator_free(ait); AB_Account_List2_free(al); AB_Job_List2_FreeAll(jobList); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 3; } AB_Job_List2_PushBack(jobList, j); requests++; } if (reqSepaSto) { AB_JOB *j; j=AB_JobSepaGetStandingOrders_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Error requesting SEPA standing order for %s/%s: %d", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); AB_Account_List2Iterator_free(ait); AB_Account_List2_free(al); AB_Job_List2_FreeAll(jobList); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 3; } AB_Job_List2_PushBack(jobList, j); requests++; } if (reqDT) { AB_JOB *j; j=AB_JobGetDatedTransfers_new(a); rv=AB_Job_CheckAvailability(j); if (rv<0) { DBG_ERROR(0, "Error requesting dated transfers for %s/%s: %d", AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), rv); AB_Account_List2Iterator_free(ait); AB_Account_List2_free(al); AB_Job_List2_FreeAll(jobList); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); return 3; } AB_Job_List2_PushBack(jobList, j); requests++; } } a=AB_Account_List2Iterator_Next(ait); } AB_Account_List2Iterator_free(ait); } } AB_Account_List2_free(al); GWEN_Time_free(toTime); GWEN_Time_free(fromTime); if (requests) { AB_IMEXPORTER_CONTEXT *ctx; DBG_INFO(0, "%d requests created", requests); ctx=AB_ImExporterContext_new(); rv=AB_Banking_ExecuteJobs(ab, jobList, ctx); AB_Job_List2_FreeAll(jobList); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); AB_ImExporterContext_free(ctx); return 3; } rv=writeContext(ctxFile, ctx); AB_ImExporterContext_free(ctx); if (rv<0) { DBG_ERROR(0, "Error writing context file (%d)", rv); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } } else { DBG_ERROR(0, "No requests created"); AB_Job_List2_FreeAll(jobList); AB_Banking_OnlineFini(ab); AB_Banking_Fini(ab); return 4; } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/listprofiles.c0000644000175000017500000000757712364015477020601 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include static int listProfiles(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; GWEN_DB_NODE *dbProfiles; int rv; const char *importerName; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "importerName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "importer", /* long option */ "Specify the importer to use", /* short description */ "Specify the importer to use" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } importerName=GWEN_DB_GetCharValue(db, "importerName", 0, "csv"); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } dbProfiles=AB_Banking_GetImExporterProfiles(ab, importerName); if (dbProfiles) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetFirstGroup(dbProfiles); while(dbT) { const char *sName; const char *sVersion; const char *sShortDescr; int isGlobal; sName=GWEN_DB_GetCharValue(dbT, "name", 0, "(none)"); sVersion=GWEN_DB_GetCharValue(dbT, "version", 0, "(none)"); sShortDescr=GWEN_DB_GetCharValue(dbT, "shortDescr", 0, ""); isGlobal=GWEN_DB_GetIntValue(dbT, "isGlobal", 0, 0); fprintf(stdout, "%s\t%s\t%s\t%s\n", sName?sName:"(none)", sVersion?sVersion:"(none)", sShortDescr?sShortDescr:"", isGlobal?"global":"local"); dbT=GWEN_DB_GetNextGroup(dbT); } GWEN_DB_Group_free(dbProfiles); } else { fprintf(stderr, "No profiles for this im-/exporter"); } /* that's is */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); AB_Banking_Fini(ab); return 5; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/listtrans.c0000644000175000017500000002150312364015477020066 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include static int listTrans(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *outFile; const char *exporterName; const char *profileName; const char *profileFile; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_CONTEXT *nctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea=0; const char *bankId; const char *accountId; const char *bankName; const char *accountName; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the file to store the data in", /* short description */ "Specify the file to store the data in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "exporterName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "exporter", /* long option */ "Specify the exporter to use", /* short description */ "Specify the exporter to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } exporterName=GWEN_DB_GetCharValue(db, "exporterName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "default"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); outFile=GWEN_DB_GetCharValue(db, "outFile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* load ctx file */ ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 1); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); AB_ImExporterContext_free(ctx); return 4; } nctx=AB_ImExporterContext_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { int matches=1; const char *s; if (matches && bankId) { s=AB_ImExporterAccountInfo_GetBankCode(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && accountName) { s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { AB_IMEXPORTER_ACCOUNTINFO *nai; nai=AB_ImExporterAccountInfo_dup(iea); AB_ImExporterContext_AddAccountInfo(nctx, nai); } /* if matches */ iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ AB_ImExporterContext_free(ctx); /* export new context */ rv=AB_Banking_ExportToFileWithProfile(ab, exporterName, nctx, profileName, profileFile, outFile); if (rv<0) { DBG_ERROR(0, "Error exporting (%d).", rv); AB_ImExporterContext_free(nctx); return 4; } AB_ImExporterContext_free(nctx); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/listbal.c0000644000175000017500000002260712364015477017503 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005-2010 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "globals.h" #include #include #include #include #include #include #include #include static AB_ACCOUNT_STATUS *_getLastAccountStatus(AB_IMEXPORTER_ACCOUNTINFO *iea) { AB_ACCOUNT_STATUS *lastAst=0; const GWEN_TIME *lastTi=0; AB_ACCOUNT_STATUS *ast=0; ast=AB_ImExporterAccountInfo_GetFirstAccountStatus(iea); while(ast) { const GWEN_TIME *ti; if (lastAst && lastTi && (ti=AB_AccountStatus_GetTime(ast))) { if (GWEN_Time_Diff(ti, lastTi)>0) { lastAst=ast; lastTi=ti; } } else { lastAst=ast; lastTi=AB_AccountStatus_GetTime(ast); } ast=AB_ImExporterAccountInfo_GetNextAccountStatus(iea); } return lastAst; } static void _dumpBal(const AB_BALANCE *bal, const GWEN_TIME *ti, FILE *fd) { if (bal) { const GWEN_TIME *bti; const AB_VALUE *val; bti=AB_Balance_GetTime(bal); if (bti==0) bti=ti; if (bti) { GWEN_BUFFER *tbuf; tbuf=GWEN_Buffer_new(0, 24, 0, 1); GWEN_Time_toString(bti, "DD.MM.YYYY\thh:mm", tbuf); fprintf(fd, "%s\t", GWEN_Buffer_GetStart(tbuf)); GWEN_Buffer_free(tbuf); } else { fprintf(fd, "\t\t"); } val=AB_Balance_GetValue(bal); if (val) { AB_VALUE *vNew; GWEN_BUFFER *vbuf; const char *cur; vNew=AB_Value_dup(val); AB_Value_SetCurrency(vNew, NULL); vbuf=GWEN_Buffer_new(0, 32, 0, 1); AB_Value_toHumanReadableString(vNew, vbuf, 2); fprintf(fd, "%s\t", GWEN_Buffer_GetStart(vbuf)); GWEN_Buffer_free(vbuf); AB_Value_free(vNew); cur=AB_Value_GetCurrency(val); if (cur) fprintf(fd, "%s\t", cur); else fprintf(fd, "\t"); } else { fprintf(fd, "\t\t"); } } else { fprintf(fd, "\t\t\t\t"); } } static int listBal(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *outFile; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea=0; const char *bankId; const char *accountId; const char *bankName; const char *accountName; FILE *f; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the file to store the data in", /* short description */ "Specify the file to store the data in" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 1); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); return 4; } /* open output stream */ outFile=GWEN_DB_GetCharValue(db, "outFile", 0, 0); if (outFile==0) f=stdout; else f=fopen(outFile, "w+"); if (f==0) { DBG_ERROR(0, "Error selecting output file: %s", strerror(errno)); return 4; } iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { int matches=1; const char *s; if (matches && bankId) { s=AB_ImExporterAccountInfo_GetBankCode(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s) s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && accountName) { s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s) s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { AB_ACCOUNT_STATUS *ast; ast=_getLastAccountStatus(iea); if (ast) { const GWEN_TIME *ti; const char *s; fprintf(f, "Account\t"); s=AB_ImExporterAccountInfo_GetBankCode(iea); if (!s) s=""; fprintf(f, "%s\t", s); s=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!s) s=""; fprintf(f, "%s\t", s); s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s) s=""; fprintf(f, "%s\t", s); s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s) s=""; fprintf(f, "%s\t", s); ti=AB_AccountStatus_GetTime(ast); _dumpBal(AB_AccountStatus_GetBookedBalance(ast), ti, f); _dumpBal(AB_AccountStatus_GetNotedBalance(ast), ti, f); fprintf(f, "\n"); } } /* if matches */ iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ if (outFile) { if (fclose(f)) { DBG_ERROR(0, "Error closing output file: %s", strerror(errno)); return 4; } } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; } aqbanking-5.6.4beta/src/tools/aqbanking-cli/globals.h0000644000175000017500000000232312425214301017453 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQB_TOOL_GLOBALS_H #define AQB_TOOL_GLOBALS_H #include #include #include #include #include #include #include #include #include #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) #define I18S(msg) msg int readContext(const char *ctxFile, AB_IMEXPORTER_CONTEXT **pCtx, int mustExist); int writeContext(const char *ctxFile, const AB_IMEXPORTER_CONTEXT *ctx); AB_TRANSACTION *mkTransfer(AB_ACCOUNT *a, GWEN_DB_NODE *db, AB_JOB_TYPE *jobType); AB_TRANSACTION *mkSepaTransfer(AB_ACCOUNT *a, GWEN_DB_NODE *db, int expTransferType); AB_TRANSACTION *mkSepaDebitNote(AB_ACCOUNT *a, GWEN_DB_NODE *db); #endif aqbanking-5.6.4beta/src/tools/Makefile.am0000644000175000017500000000034512364015477015234 00000000000000DIST_SUBDIRS=aqbanking-cli if ENABLE_CLI SUBDIRS=aqbanking-cli endif sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d sources; \ done built_sources: for d in $(SUBDIRS); do \ $(MAKE) -C $$d built_sources; \ done ; aqbanking-5.6.4beta/depcomp0000755000175000017500000005601612261335263012626 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aqbanking-5.6.4beta/aqbanking.pc.in0000644000175000017500000000172412526042437014133 00000000000000# pkg-config configuration for aqbanking # For information about the syntax, see pkg-config(1) # General installation directories prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ pkgincludedir=@includedir@/aqbanking datarootdir=@datarootdir@ datadir=@datadir@ bindir=@bindir@ # Particular variables of aqbanking plugindir=@aqbanking_plugindir@ pkgdatadir=@aqbanking_pkgdatadir@ all_includes=@all_includes@ # ... and particular variables of all included subpackages aqbanking_libs=@aqbanking_ldflags@ @aqbanking_libs@ aqbanking_includes=@aqbanking_includes@ aqbanking_plugindir=@aqbanking_plugindir@ aqhbci_includes=@aqhbci_includes@ aqhbci_libs=@aqhbci_ldflags@ @aqhbci_libs@ # Human-readable name Name: AqBanking # Human-readable description Description: A library for online banking functions and financial data import/export Version: @VERSION@ Libs: @aqbanking_ldflags@ @aqbanking_libs@ Cflags: @aqbanking_includes@ @gwenhywfar_includes@ aqbanking-5.6.4beta/doc/0000755000175000017500000000000012643540650012070 500000000000000aqbanking-5.6.4beta/doc/03-APPS0000644000175000017500000000776012364015477012734 00000000000000 1. Introduction =============== This document explains what an application needs to perform to setup and use AqBanking. 2. Application Coding Overview ============================== This section gives an overview of the necessary initialisation and de-initialisation steps of AqBanking, and how the banking jobs fit into this frame. 1. Create an instance of AB_BANKING (AB_Banking_new()) 2. Call AB_Banking_Init This makes AqBanking actually read its configuration. Before this call AqBanking can not work. 4. Do whatever you want (see section 4) 3. Call AB_Banking_Fini This allows AqBanking to write its configuration back. You should always call this function to avoid data inconsistencies. 4. Free the AqBanking object (AB_Banking_free()) This function releases all data currently owned by AqBanking. You should always call this function to avoid memory leaks. Please note that you still have to call the corresponding *_free() functions of any AqBanking object you own. This MUST be done before AB_Banking_free() is called. 3. Performing Jobs ================== This section describes the program flow for the normal operation of online banking jobs with AqBanking. The general initialisation steps from section 2 are repeated here for an easier overview. To perform a job - such as getting the balance of an account, retrieving transaction statements, transferring money etc - you need to take the following steps (Example: Getting the balance of an account): 1. Create an instance of AB_BANKING (AB_Banking_new()) 2. Call AB_Banking_Init This makes AqBanking prepare the plugin framework. 3. Call AB_Banking_OnlineInit This makes AqBanking actually read its configuration. Without this call online banking is not possible. ---------------------------------------------------------- X8 4. Create the job to get the balance by AB_JobGetBalance_new(), which also means you have to find the correct AB_ACCOUNT beforehand. 5. Check whether this job is available with the account chosen: AB_Job_CheckAvailability() This function also does setup the parameters for the job (well, this particular job has no parameters, but one parameter for JobGetTransactions is the maximum number of days the bank server stores transaction statements for). 6. Check the parameters (if any) As described above this job has no parameters. 7. Set arguments for the job (if any) Besides the account which has been given to the constructor this job has no further arguments. 8. Add this job to a job list 9. Execute the queue AB_Banking_ExecuteQueue() This function sends all enqueued jobs to their backends which will then do the necessary communication with the bank server etc. 10. Check for the status of each job. AB_Job_GetStatus() This function returns the status of the job. Some jobs might have the status "pending". Those jobs have been processed by the backend but did not yield a result quite yet. So you will have to re-enqueue such a job later to make the backend check whether meanwhile some results are available (see step 9) If the job has been finished you may apply the information returned (in this case the balance of an account). ---------------------------------------------------------- X8 11. Call AB_Banking_OnlineFini This allows AqBanking to write its configuration back. You should always call this function to avoid data inconsistencies. 12. Call AB_Banking_Fini This releases all ressources assigned to AqBanking. Please note that before calling this function you MUST free all AqBanking objects you own. 13. Release all AqBanking data (AB_Banking_free()) This function releases all data currently owned by AqBanking. You should always call this function to avoid memory leaks. Actually, steps 4 to 10 may be performed multiple times. Most likely an application will perform steps 1-3 and 11-13 only upon startup and then later loop between steps 4 and 10. aqbanking-5.6.4beta/doc/Makefile.in0000644000175000017500000004324612643540054014064 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = 01-OVERVIEW 02-CODING 03-APPS apidoc.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/doc/apidoc.h0000644000175000017500000001054612364015477013432 00000000000000 /** @defgroup G_AB_LIBRARY AqBanking Library */ /** @defgroup G_AB_C_INTERFACE API for Applications * @ingroup G_AB_LIBRARY */ /** @defgroup G_AB_BANKING Main Interface * @ingroup G_AB_C_INTERFACE */ /** @defgroup G_AB_INFO Bank/Country Info * @ingroup G_AB_C_INTERFACE */ /** @defgroup G_AB_IMEXPORTER Generic Im- and Exporter * @ingroup G_AB_C_INTERFACE */ /** @defgroup G_AB_ONLINE_BANKING Online Banking * @ingroup G_AB_C_INTERFACE */ /** @defgroup G_AB_ACCOUNT Accounts * @ingroup G_AB_ONLINE_BANKING */ /** @defgroup G_AB_DIALOGS Platform-indepentent Dialogs * @ingroup G_AB_C_INTERFACE * * Dialogs are only available if the application created and set a GWEN_GUI * object with support for the GWEN_DIALOG framework. * * Currently these are the following implementations: *
    *
  • FOX16 (see @ref FOX16_Gui)
  • *
  • QT3 (see @ref QT3_Gui)
  • *
  • QT4 (see @ref QT4_Gui)
  • *
  • GTK2 (see @ref Gtk2_Gui_new)
  • *
* * * The following is a demonstration of the use of AqBankings new dialogs * (using the generic file importer): * * @code * * GWEN_DIALOG *dlg; * AB_IMEXPORTER_CONTEXT *ctx; * int rv; * ctx=AB_ImExporterContext_new(); * dlg=AB_ImporterDialog_new(banking, * ctx, * I18N("Your file has been successfully imported.\n" * "Click the finish button below to import the " * "data into the application\n")); * * if (dlg==NULL) { * fprintf(stderr, "Could not create dialog\n"); * return 1; * } * * rv=GWEN_Gui_ExecDialog(dlg, 0); * if (rv==0) { * GWEN_Dialog_free(dlg); * AB_ImExporterContext_free(ctx); * return 1; * } * GWEN_Dialog_free(dlg); * * @endcode * */ /** @defgroup G_AB_BE_INTERFACE API for Backends * @ingroup G_AB_LIBRARY */ /** @defgroup G_AB_BE_BANKING Main Interface * @ingroup G_AB_BE_INTERFACE */ /** @defgroup G_AB_PROVIDER Backend Objects * @ingroup G_AB_BE_INTERFACE */ /** @defgroup G_AB_GUI Gwenhywfar GUI Extension */ /** @defgroup G_AB_BACKENDS Backends */ /** @mainpage AqBanking Documentation Main Page This is AqBanking, a modular library for Online Banking and related tasks. This library was designed by Martin Preuss to provide a generic way for applications to use Online Banking (e.g. HBCI, EBICS), and to import/export financial data (such as OFX, SWIFT, DTAUS). It is written in C (see @ref G_AB_C_INTERFACE). A general Note: All strings exchanged from and to AqBanking are expected in UTF-8 encoding unless stated otherwise. Please do not pass Latin-1 strings (i.e. with latin1-Umlauts) into AqBanking or expect the returned strings (which might be translated into German in UTF-8) in that way. For converting UTF-8 into or from other encodings, see the system function iconv(3) in iconv.h. @section AB_features Features AqBanking is very modular. It simply provides the means to manage online accounts and to import/export financial data. AqBanking itself does not implement the actual online banking protocols -- this is done in extra plugins which serve as backends/providers. This library is organized in multiple layers:
  • API for Applications: This contains the complete API to be used by applications (see @ref G_AB_C_INTERFACE). It is subdivided into several groups and includes (among other things):
    • Managing Backends/Providers
    • Managing Accounts
    • Accepting @ref AB_JOB objects for online banking jobs from the application and sending them to the corresponding provider
  • API for Backends This level is represented by the function group @ref G_AB_BE_INTERFACE). These functions should not be accessed by an application; instead, they are accessed by plugins. The plugins (e.g. AqHBCI) implement the Provider functions which actually implement the online banking functionality. ("Provider" is simply another word for "backend".) The API has been designed to be as wide open as possible, and currently it is used by plugins for HBCI, OFX Direct Connect, YellowNet, DTAUS and GeldKarte providers.
*/ /** @page G_APP_INTRO Introduction into application programming with AqBanking @verbinclude 03-APPS */ /** @defgroup G_TUTORIALS Tutorials */ aqbanking-5.6.4beta/doc/Makefile.am0000644000175000017500000000006412364015477014050 00000000000000 EXTRA_DIST=01-OVERVIEW 02-CODING 03-APPS apidoc.h aqbanking-5.6.4beta/doc/01-OVERVIEW0000644000175000017500000000000012364015477013411 00000000000000aqbanking-5.6.4beta/doc/02-CODING0000644000175000017500000000477312364015477013134 00000000000000 1. Object Orientation ===================== In all documents concerning AqBanking the term "class" refers to modules, because AqBanking follows the object-orientated pragma. Example: Functions concerning AB_TRANSACTION are inside the files transaction.c, transaction_p.h and transaction.h and start with AB_Transaction_Something. So AB_TRANSACTION is called a "class" inside this document. 2. Header Files =============== 2.1 Private Header Files ------------------------ Header files ending in *_p.h are considered private header files, only to be included by the matching *.c file. These are not installed and MUST NOT be included by any other source file. 2.2. Library-private Header Files --------------------------------- Header files ending in *_l.h are considered private to AqBanking. These headers are also not installed and MUST NOT be included by any source file outside AqBanking (even not by plugins!). 2.3. Backend Header Files ------------------------- Header files ending in *_be.h can be included by backends but should NOT be included by applications. These header files might be shipped with special development packages dedicated to backend development. 2.4. Public Header Files ------------------------ All other header files are public ones which all get installed and which are free to be included by applications and plugins. 3. QT 3.x, moc, uic =================== AqBanking makes use of GCC's visibility features. However, uic and moc of QT3 are not aware of that feature, so they generate code which does not export all needed symbols. Therefore we added a small tool which adds EXPORT macros to those generated files. In order to use that tool correctly you'll have to use the following rules in the makefiles of AqBanking: %.moc.cpp: %.h $(qt3_moc) -o $<.moc.tmp $< && \ echo "#ifdef HAVE_CONFIG_H" >$@ && \ echo "# include " >>$@ && \ echo "#endif" >>$@ && \ cat $<.moc.tmp >>$@ && \ rm $<.moc.tmp %.ui.cpp: %.ui $(UIC3) $< -impl $<.h -o $<.tmp && \ echo "#ifdef HAVE_CONFIG_H" >$@ && \ echo "# include " >>$@ && \ echo "#endif" >>$@ && \ cat $<.tmp >>$@ && \ rm $<.tmp %.ui.h: %.ui $(UIC3) $< -o $<.tmp && \ echo "#include " >$@ && \ $(top_srcdir)/admin/insert_api.sh QBANKING_API < $<.tmp >>$@ && \ rm $<.tmp The last needs to be adapted for every frontend, e.g. for "QBanking" you would need QBANKING_API and the header as used in this example. For "KBanking" you would use KBANKING_API and . aqbanking-5.6.4beta/Makefile.cvs0000644000175000017500000001445212364015477013507 00000000000000 MY_CFLAGS=-ggdb -Wall -O #MP_CONF_FLAGS=--enable-maintainer-mode --disable-static MP_CONF_FLAGS=INSTALL="/usr/bin/install -p" --enable-maintainer-mode --disable-static --enable-local WIN32_OPTIONS=\ --host=i586-mingw32msvc \ --target=i586-mingw32msvc \ --enable-version-specific-runtime-libs \ --with-gcc \ --with-gnu-ld \ --without-x \ --enable-threads=win32 \ --disable-win32-registry MINGW32_PREFIX=/usr/i586-mingw32msvc WIN32_INSTALL_DIR=/home/martin/install/win32 default: all dist: @echo "This file is to make it easier for you to create all you need" aclocal -I ./m4 autoheader # use --include-deps, if you want to release the stuff. Don't use it for # yourself if test ! -f i18nsources; then echo > i18nsources; fi automake --include-deps autoconf touch stamp-h.in rm -f `find . -name \*~` rm -Rf `find . -type d -name CVS` rm -f `find . -type f -name .cvsignore` rm -Rf apidoc rm -Rf gwenipc rm -f Makefile.cvs rm -Rf autom4te.cache cvsclean:: if test ! -f i18nsources; then echo > i18nsources; fi automake --include-deps autoconf touch stamp-h.in rm -Rf gwenipc rm -f `find . -name \*~` rm -Rf apidoc rm -Rf autom4te.cache all: libtoolize -f --automake @if test -r config.status; then \ prefix=`grep '@prefix@' config.status |cut -d , -f 3`; \ gwen_prefix=`grep '@GWEN_PREFIX@' config.status |cut -d , -f 3`; \ fi; \ for A in "$${gwen_prefix}/share/aclocal" "$${prefix}/share/aclocal" m4; do \ if test -d "$${A}"; then \ ACLOCAL_FLAGS="$${ACLOCAL_FLAGS} -I $${A}"; \ fi; \ done; \ echo "aclocal $${ACLOCAL_FLAGS}"; \ aclocal $${ACLOCAL_FLAGS} || (echo -e '***\n*** If the line above shows the error message "macro AC_GWENHYWFAR not \n*** found", you need to specify the environment variable ACLOCAL_FLAGS \n*** to be "-I GWENHYWFAR_PREFIX/share/aclocal". For example, do the following:\n***\n*** export ACLOCAL_FLAGS="-I ${HOME}/usr/share/aclocal"\n*** make -f Makefile.cvs\n***'; exit 1) @if ! grep -q AC_GWENHYWFAR aclocal.m4 ; then echo -e "***\n*** Error: The configure macro of the gwenhywfar package could not be found. \n*** Please specify the environment variable ACLOCAL_FLAGS \n*** to be \"-I GWENHYWFAR_PREFIX/share/aclocal\". \n"; exit 1 ; fi @if ! grep -q PKG_CHECK_MODULES aclocal.m4 ; then echo -e "***\n*** Error: The configure macro of the pkg-config package \n*** (usually included in gnome) could not be found. \n*** Please specify the environment variable ACLOCAL_FLAGS \n*** to be \"-I GNOME_PREFIX/share/aclocal\". \n"; exit 1 ; fi autoheader if test ! -f i18nsources; then echo > i18nsources; fi if test ! -f qtsources; then echo > qtsources; fi automake --add-missing @echo "autoconf"; \ autoconf || (echo -e '***\n*** If the line above shows the error message "possibly undefined macro: \n*** AC_GWENHYWFAR", you need to specify the environment variable ACLOCAL_FLAGS \n*** to be "-I GWENHYWFAR_PREFIX/share/aclocal". For example, do the following:\n***\n*** export ACLOCAL_FLAGS="-I ${HOME}/usr/share/aclocal"\n*** make -f Makefile.cvs\n***'; exit 1) @echo "Now you can run ./configure" mp: libtoolize -f --automake aclocal -I ./m4 autoheader if test ! -f i18nsources; then echo > i18nsources; fi automake --add-missing autoconf PKG_CONFIG_PATH="$(PKG_CONFIG_PATH):./m4" \ CXXFLAGS="-ggdb -Wall" \ CFLAGS="$(MP_CFLAGS)" \ ./configure $(MP_CONF_FLAGS) \ --with-backends="aqhbci aqofxconnect aqebics" \ --prefix=/usr/local --enable-full-doc=yes make sources clang: libtoolize -f --automake aclocal -I ./m4 autoheader if test ! -f i18nsources; then echo > i18nsources; fi automake --add-missing autoconf PKG_CONFIG_PATH="$(PKG_CONFIG_PATH):./m4" \ CC=clang \ CXX=clang \ CXXFLAGS="-ggdb -Wall" \ CFLAGS="$(MP_CFLAGS)" \ ./configure $(MP_CONF_FLAGS) \ --with-backends="aqhbci aqofxconnect aqebics" make sources mp-priv: libtoolize -f --automake aclocal -I ./m4 autoheader if test ! -f i18nsources; then echo > i18nsources; fi automake --add-missing autoconf PKG_CONFIG_PATH="$PKG_CONFIG_PATH:./m4" \ CXXFLAGS="-ggdb -Wall" \ CFLAGS="$(MP_CFLAGS)" \ LIBOFX_CFLAGS="-I/opt/devel/4/include" \ LIBOFX_LIBS="-L/opt/devel/4/lib -lofx" \ ./configure $(MP_CONF_FLAGS) \ --with-backends="aqhbci aqofxconnect" \ --with-frontends="" \ --with-gwen-dir=/opt/devel/4 \ --with-chipcard-client-dir=/opt/devel/4 \ --prefix=/opt/devel/4 make sources mp-orig: libtoolize -f --automake aclocal -I ./m4 autoheader if test ! -f i18nsources; then echo > i18nsources; fi automake --add-missing autoconf PKG_CONFIG_PATH="$PKG_CONFIG_PATH:./m4" CXXFLAGS="-ggdb -Wall" CFLAGS="$(MP_CFLAGS)" ./configure $(MP_CONF_FLAGS) --with-backends="aqhbci aqofxconnect aqdtaus aqyellownet aqgeldkarte" --with-frontends="" --with-gwen-dir=/opt/devel --with-chipcard-client-dir=/opt/devel make sources mp2: libtoolize -f --automake aclocal -I ./m4 autoheader if test ! -f i18nsources; then echo > i18nsources; fi automake --add-missing autoconf PKG_CONFIG_PATH="$PKG_CONFIG_PATH:./m4" CXXFLAGS="-ggdb -Wall" CFLAGS="$(MP_CFLAGS)" ./configure $(MP_CONF_FLAGS) --with-backends="aqhbci aqofxconnect aqdtaus" --with-frontends="" make sources mp-win: PKG_CONFIG_PATH="$PKG_CONFIG_PATH:./m4" CXXFLAGS="-Wall" CFLAGS="-Wall" ./configure --prefix=/c/posix --with-gwen-dir=/c/posix --enable-local mp-w32: libtoolize -f --automake aclocal -I ./m4 autoheader automake --add-missing autoconf PATH="$(MINGW32_PREFIX)/bin:$(PATH)" \ PKG_CONFIG_PATH=$(WIN32_INSTALL_DIR)/lib/pkgconfig \ CFLAGS="$(MY_CFLAGS) -I$(WIN32_INSTALL_DIR)/include -L$(WIN32_INSTALL_DIR)/lib" CXXFLAGS="-ggdb -Wall -I$(WIN32_INSTALL_DIR)/include -L$(WIN32_INSTALL_DIR)/lib" \ DLLTOOL=i586-mingw32msvc-dlltool \ OBJDUMP=i586-mingw32msvc-objdump \ LD=i586-mingw32msvc-ld \ AR=i586-mingw32msvc-ar \ NM=i586-mingw32msvc-nm \ RANLIB=i586-mingw32msvc-ranlib \ STRIP=i586-mingw32msvc-strip \ STRIPPROG=i586-mingw32msvc-strip \ AS=i586-mingw32msvc-as \ RC=i586-mingw32msvc-windres \ ./configure \ --prefix=$(WIN32_INSTALL_DIR) $(WIN32_OPTIONS) \ --enable-release \ --with-gwen-dir=$(WIN32_INSTALL_DIR) \ --with-frontends="" \ --with-backends="aqhbci aqofxconnect" \ --disable-tutorials \ --with-xmlmerge=/usr/bin/xmlmerge git-log: git-log --pretty="format:%ad %an%n%s%n%b" --since="2008-08-26" >git.log aqbanking-5.6.4beta/TODO0000644000175000017500000000163712416502252011734 00000000000000 Mid-term ======== - types/*.xml: convert to typemaker2 - remove job for EU transfers (no longer needed Long-term ========= - very much simplify API (just jobs, accounts and probably bank info) - probably remove country info stuff - remove data storage stuff (APPS should store their info themselves) - remove message engine stuff, use gparser instead Old === - loganalyzer: read messages from FASTBUFFER instead from IO CAVEATS: - you need to call AB_Job_CheckAvailability() after creating a job - generic settings - bank code - bank name - hbci version - bank url - flags: - userId == customerId - settings in DDV mode: - flags: - bankDoesntSign - bankUsesSignSeq - settings in RDH mode - rdh version - keysize - flags: - bankDoesntSign - bankUsesSignSeq - settings in pin/tan mode - http version - flags - forceSslv3 - noBase64 - omitSmsAccount Test aqbanking-5.6.4beta/aqbanking.spec0000644000175000017500000002052412643540105014050 00000000000000# norootforbuild # neededforbuild gwenhywfar gwenhywfar-devel ktoblzcheck python python-ctypes pyyxml libchipcard2-devel libchipcard2 pkgconfig gettext-devel libacl-devel libacl libattr-devel libattr %define name aqbanking %define version 5.6.4beta %define dist Ubuntu %define disttag ubuntu %define distver %define aq_plugindir %{_libdir}/aqbanking/plugins/35 %define fronts_libdir %{aq_plugindir}/frontends %define imex_plugindir %{aq_plugindir}/imexporters %define imex_datadir %{_datadir}/%{name}/imexporters %define fronts_datadir %{_datadir}/%{name}/frontends %define qb_cfgmoddir %{fronts_libdir}/qbanking/cfgmodules ### Optionally disable chipcard and ofx sub-packages - resulting ### rpms should not be released! %define have_libchipcard 0 %define have_libofx 1 %define with_yellownet 0 # Note: There is not yet a special symbol for the rpm release # version. We set it to one here. %define release 1.%{disttag}%{distver} ### Choose backends to be built %if %have_libofx %if %have_libchipcard %if %with_yellownet %define backendlist "aqhbci aqofxconnect aqyellownet" %else %define backendlist "aqhbci aqofxconnect" %endif %else %if %with_yellownet %define backendlist "aqhbci aqofxconnect aqyellownet" %else %define backendlist "aqhbci aqofxconnect" %endif %endif %else %if %have_libchipcard %if %with_yellownet %define backendlist "aqhbci aqyellownet" %else %define backendlist "aqhbci" %endif %else %if %with_yellownet %define backendlist "aqhbci aqyellownet" %else %define backendlist "aqhbci" %endif %endif %endif # versions of required helper-libraries %define _gwenhywfar_version 2.9.15 %define _libchipcard3_version 3.9.13 ### The standard information fields. Name: %{name} Summary: A library for online banking functions and financial data import/export Version: %{version} Release: %{release} Source: http://download.sourceforge.net/aqbanking/%{name}-%{version}.tar.gz Group: System Environment/Libraries License: GPL Packager: Martin Preuss URL: http://sourceforge.net/projects/aqbanking BuildRoot: %{_tmppath}/%{name}-%{version}-root Requires: gwenhywfar >= %{_gwenhywfar_version} Requires: ktoblzcheck BuildRequires: gwenhywfar-devel >= %{_gwenhywfar_version} BuildRequires: ktoblzcheck #BuildRequires: python-ctypes BuildRequires: python >= 2.3 BuildRequires: pyxml BuildRequires: pkgconfig >= 0.9 #BuildRequires: gettext-devel #BuildRequires: libacl-devel #BuildRequires: libattr-devel Prefix: %{_prefix} Obsoletes: aqdtaus Obsoletes: aqhbci Obsoletes: kbanking Obsoletes: aqofxconnect %description The intention of AqBanking is to provide a middle layer between the program and the various Online Banking libraries (e.g. AqHBCI). The first backend which is already supported is AqHBCI, a library which implements a client for the German HBCI (Home Banking Computer Interface) protocol. Additionally, Aqbanking provides various plugins to simplify import and export of financial data. Currently there are import plugins for the following formats: DTAUS (German financial format), SWIFT (MT940 and MT942). Further information in German can be found on http://linuxwiki.de/AqBanking %package devel Summary: Aqbanking development kit Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Obsoletes: aqhbci-devel Obsoletes: aqofxconnect-devel Obsoletes: aqdtaus-devel %description devel This package contains aqbanking-config and header files for writing and compiling programs using Aqbanking. %package -n python-%{name} Summary: Aqbanking python-bindings Group: Development/Libraries/Python %py_requires Requires: %{name} = %{version} #Requires: python-ctypes Requires: python >= 2.3 Requires: pyxml %description -n python-%{name} This package contains the python-bindings for aqbanking. %package qt3 Summary: Aqbanking tools for Qt3 Group: Productivity/Office/Finance Obsoletes: aqhbci-qt-tools Obsoletes: aqdtaus-qt-tools Requires: %{name} = %{version} Requires: gwenhywfar >= %{_gwenhywfar_version} %description qt3 This package contains the QT3 setup wizard for AqBanking. ### Sub-packages for OFX %if %have_libofx %package ofx Summary: Aqbanking tools for Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Obsoletes: %{name}-ofx-qt3 %description ofx Aqbanking tools for Qt3. Necessary for OFX direct connect access. Author: Martin Preuss %package ofx-qt3 Summary: Aqbanking tools for Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Requires: gwenhywfar >= %{_gwenhywfar_version} %description ofx-qt3 Aqbanking tools for Qt3. Necessary for OFX direct connect access. Author: Martin Preuss %endif ### Sub-packages for yellownet %if %with_yellownet %package yellownet Summary: YellowNet backend Group: Development/Libraries/C and C++ Requires: %{name} = %{version} %description yellownet This backend provides support for Suisse YellowNet (Post-Finance) Author: Martin Preuss %package yellownet-qt3 Summary: Configuration plugins for Aqbanking with Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} %description yellownet-qt3 This backend provides support for Suisse YellowNet (Post-Finance) Author: Martin Preuss %endif ### The build commands %prep %setup -q %build %{configure} \ --enable-release \ --with-docpath=%{_docdir} \ --enable-python \ --with-backends=%{backendlist} make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make install-strip \ DESTDIR=%{buildroot} \ idatadir=%{_docdir}/%{name} %clean [ -d %{buildroot} -a "%{buildroot}" != "" ] && rm -rf %{buildroot} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %post -n %{name}-qt3 -p /sbin/ldconfig %postun -n %{name}-qt3 -p /sbin/ldconfig ### The file list for all packages, starting with the base package %files %defattr(-,root,root) %doc AUTHORS COPYING ChangeLog README # The directories used by the base package %dir %{_libdir}/%{name} %dir %{_libdir}/%{name}/plugins %dir %{aq_plugindir} %dir %{aq_plugindir}/debugger %dir %{aq_plugindir}/providers %dir %{imex_plugindir} %dir %{fronts_libdir} %dir %{fronts_libdir}/qbanking %dir %{qb_cfgmoddir} %dir %{_datadir}/%{name} %dir %{fronts_datadir} %dir %{imex_datadir} ### The original aqbanking files %{_libdir}/lib%{name}*.so.* %{_libdir}/gwenhywfar %{_datadir}/%{name}/bankinfo %{_datadir}/locale/*/LC_MESSAGES/%{name}.mo %{aq_plugindir}/bankinfo %{imex_plugindir}/csv.* %{imex_plugindir}/dtaus.* %{imex_plugindir}/eri2.* %{imex_plugindir}/openhbci1.* %{imex_plugindir}/swift.* %{imex_plugindir}/xmldb.* %{imex_plugindir}/yellownet.* %{imex_datadir}/csv %{imex_datadir}/dtaus %{imex_datadir}/eri %{imex_datadir}/eri2 %{imex_datadir}/openhbci1 %{imex_datadir}/swift %{imex_datadir}/xmldb %{imex_datadir}/yellownet ### The aqhbci files %{_bindir}/aqhbci-tool@QBANKING_SO_EFFECTIVE@ %{_libdir}/libaqhbci.so.* %{aq_plugindir}/providers/aqhbci.* #%{_datadir}/doc/aqhbci ### The aqnone files %{_libdir}/libaqnone.so.* %{aq_plugindir}/providers/aqnone.* %files devel %defattr(-,root,root) ### The aqbanking files %{_bindir}/%{name}-config %{_includedir}/%{name} %{_libdir}/*.la %{_libdir}/libaqbanking.so %{_libdir}/libaqhbci.so %{_libdir}/libaqnone.so %{_libdir}/pkgconfig/%{name}.pc %{_datadir}/aclocal ### The aqhbci files %{_bindir}/hbcixml3 %{_includedir}/aqhbci %{_datadir}/%{name}/backends/aqhbci ### The qbanking files %{_includedir}/qbanking %files -n python-aqbanking %defattr(644,root,root,755) %{py_sitedir}/* %files qt3 %defattr(-,root,root) %{_bindir}/qb-help@QBANKING_SO_EFFECTIVE@ %{_libdir}/libqbanking.so.* %{_libdir}/libqbanking.so %{aq_plugindir}/debugger/aqhbci %{aq_plugindir}/wizards %{qb_cfgmoddir}/aqhbci* %{_datadir}/%{name}/i18n %{fronts_datadir}/qbanking %if %have_libofx %files ofx %defattr(-,root,root) %{_libdir}/libaqofxconnect.so.* %{_libdir}/libaqofxconnect.so %{_includedir}/aqofxconnect %{aq_plugindir}/providers/aqofxconnect.* %{imex_plugindir}/ofx.* %{imex_datadir}/ofx %files ofx-qt3 %defattr(-,root,root) %{qb_cfgmoddir}/aqofxconnect* %endif %if %with_yellownet %files yellownet %{_libdir}/libaqyellownet.so %{_includedir}/aqyellownet %{aq_plugindir}/providers/aqyellownet.* %files yellownet-qt3 %{qb_cfgmoddir}/aqyellownet* %endif aqbanking-5.6.4beta/config.h.in0000644000175000017500000001513012643540116013263 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* if plugin init is wanted */ #undef AQBANKING_ENABLE_INIT_PLUGINS /* whether aqb is a subproject */ #undef AQBANKING_IS_SUBPROJECT /* effective SO version */ #undef AQBANKING_SO_EFFECTIVE_STR /* plugin availability */ #undef AQBANKING_WITH_PLUGIN_BACKEND_AQEBICS /* plugin availability */ #undef AQBANKING_WITH_PLUGIN_BACKEND_AQHBCI /* plugin availability */ #undef AQBANKING_WITH_PLUGIN_BACKEND_AQNONE /* plugin availability */ #undef AQBANKING_WITH_PLUGIN_BACKEND_AQOFXCONNECT /* effective SO version */ #undef AQEBICS_SO_EFFECTIVE_STR /* build */ #undef AQEBICS_VERSION_BUILD /* full version string */ #undef AQEBICS_VERSION_FULL_STRING /* major version */ #undef AQEBICS_VERSION_MAJOR /* minor version */ #undef AQEBICS_VERSION_MINOR /* patchlevel */ #undef AQEBICS_VERSION_PATCHLEVEL /* version string */ #undef AQEBICS_VERSION_STRING /* tag */ #undef AQEBICS_VERSION_TAG /* effective SO version */ #undef AQHBCI_SO_EFFECTIVE_STR /* build */ #undef AQHBCI_VERSION_BUILD /* full version string */ #undef AQHBCI_VERSION_FULL_STRING /* major version */ #undef AQHBCI_VERSION_MAJOR /* minor version */ #undef AQHBCI_VERSION_MINOR /* patchlevel */ #undef AQHBCI_VERSION_PATCHLEVEL /* version string */ #undef AQHBCI_VERSION_STRING /* tag */ #undef AQHBCI_VERSION_TAG /* effective SO version */ #undef AQOFXCONNECT_SO_EFFECTIVE_STR /* build */ #undef AQOFXCONNECT_VERSION_BUILD /* full version string */ #undef AQOFXCONNECT_VERSION_FULL_STRING /* major version */ #undef AQOFXCONNECT_VERSION_MAJOR /* minor version */ #undef AQOFXCONNECT_VERSION_MINOR /* patchlevel */ #undef AQOFXCONNECT_VERSION_PATCHLEVEL /* version string */ #undef AQOFXCONNECT_VERSION_STRING /* tag */ #undef AQOFXCONNECT_VERSION_TAG /* Define if DLL is built */ #undef BUILDING_AQBANKING_DLL /* Define if DLL is built */ #undef BUILDING_AQEBICS_DLL /* Define if DLL is built */ #undef BUILDING_AQHBCI_DLL /* Define if DLL is built */ #undef BUILDING_AQOFXCONNECT_DLL /* if DLL is to be built */ #undef BUILDING_DLL /* Define if you want debugging code enabled. */ #undef DEBUG /* whether local install is wanted */ #undef ENABLE_LOCAL_INSTALL /* visibility */ #undef GCC_WITH_VISIBILITY_ATTRIBUTE /* Define to 1 if you have the declaration of `sigprocmask', and to 0 if you don't. */ #undef HAVE_DECL_SIGPROCMASK /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_GMP_H /* whether I18N is available */ #undef HAVE_I18N /* Define to 1 if you have the header file. */ #undef HAVE_ICONV_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* if KTOBLZCHECK is available */ #undef HAVE_KTOBLZCHECK /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* if BeOS is used */ #undef OS_BEOS /* if Apple Darwin is used */ #undef OS_DARWIN /* if FreeBSD is used */ #undef OS_FREEBSD /* if linux is used */ #undef OS_LINUX /* host system */ #undef OS_NAME /* if NetBSD is used */ #undef OS_NETBSD /* if OpenBSD is used */ #undef OS_OPENBSD /* if PalmOS is used */ #undef OS_PALMOS /* if this is a POSIX system */ #undef OS_POSIX /* host system */ #undef OS_SHORTNAME /* if Solaris is used */ #undef OS_SOLARIS /* system type */ #undef OS_TYPE /* if WIN32 is used */ #undef OS_WIN32 /* 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 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* GTK2Gui availability */ #undef USE_GWENGUI_GTK2 /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const aqbanking-5.6.4beta/aqbanking-config.cmake.in0000644000175000017500000000156512367522076016064 00000000000000 macro(set_and_check _var _file) set(${_var} "${_file}") if(NOT EXISTS "${_file}") message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") endif() endmacro() macro(check_required_components _NAME) foreach(comp ${${_NAME}_FIND_COMPONENTS}) if(NOT ${_NAME}_${comp}_FOUND) if(${_NAME}_FIND_REQUIRED_${comp}) set(${_NAME}_FOUND FALSE) endif() endif() endforeach() endmacro() find_package(Gwenhywfar "@GWENHYWFAR_MINIMUM_VERSION@" REQUIRED) set_and_check(prefix "@prefix@") set_and_check(exec_prefix "@exec_prefix@") set_and_check(AQBANKING_INCLUDE_DIRS "@includedir@/aqbanking@AQBANKING_VERSION_MAJOR@") set_and_check(AQBANKING_LIBRARIES "@libdir@/libaqbanking.so") set(AQBANKING_LIBRARIES ${AQBANKING_LIBRARIES} ${GWENHYWFAR_LIBRARIES}) mark_as_advanced( AQBANKING_INCLUDE_DIRS AQBANKING_LIBRARIES ) aqbanking-5.6.4beta/i18nsources0000644000175000017500000002542512643540111013351 00000000000000src/libs/aqbanking/account.c src/libs/aqbanking/bankinfoplugin.c src/libs/aqbanking/banking.c src/libs/aqbanking/country.c src/libs/aqbanking/imexporter.c src/libs/aqbanking/job.c src/libs/aqbanking/provider.c src/libs/aqbanking/msgengine.c src/libs/aqbanking/httpsession.c src/libs/aqbanking/banking_account.c src/libs/aqbanking/banking_cfg.c src/libs/aqbanking/banking_deprec.c src/libs/aqbanking/banking_init.c src/libs/aqbanking/banking_online.c src/libs/aqbanking/banking_user.c src/libs/aqbanking/banking_imex.c src/libs/aqbanking/types/accstatus.c src/libs/aqbanking/types/balance.c src/libs/aqbanking/types/bankinfo.c src/libs/aqbanking/types/bankinfoservice.c src/libs/aqbanking/types/eutransferinfo.c src/libs/aqbanking/types/pin.c src/libs/aqbanking/types/textkeydescr.c src/libs/aqbanking/types/transaction.c src/libs/aqbanking/types/transactionfns.c src/libs/aqbanking/types/transactionlimits.c src/libs/aqbanking/types/user.c src/libs/aqbanking/types/userfns.c src/libs/aqbanking/types/value.c src/libs/aqbanking/types/cellphoneproduct.c src/libs/aqbanking/types/security.c src/libs/aqbanking/types/message.c src/libs/aqbanking/jobs/jobgetbalance.c src/libs/aqbanking/jobs/jobgettransactions.c src/libs/aqbanking/jobs/jobgetstandingorders.c src/libs/aqbanking/jobs/jobgetdatedtransfers.c src/libs/aqbanking/jobs/jobsingletransfer.c src/libs/aqbanking/jobs/jobsingledebitnote.c src/libs/aqbanking/jobs/jobsepatransfer.c src/libs/aqbanking/jobs/jobsepadebitnote.c src/libs/aqbanking/jobs/jobsepaflashdebitnote.c src/libs/aqbanking/jobs/jobcreatesto.c src/libs/aqbanking/jobs/jobmodifysto.c src/libs/aqbanking/jobs/jobdeletesto.c src/libs/aqbanking/jobs/jobcreatedatedtransfer.c src/libs/aqbanking/jobs/jobmodifydatedtransfer.c src/libs/aqbanking/jobs/jobdeletedatedtransfer.c src/libs/aqbanking/jobs/jobinternaltransfer.c src/libs/aqbanking/jobs/jobeutransfer.c src/libs/aqbanking/jobs/jobloadcellphone.c src/libs/aqbanking/jobs/jobsepacreatesto.c src/libs/aqbanking/jobs/jobsepagetstandingorders.c src/libs/aqbanking/jobs/jobsepadeletesto.c src/libs/aqbanking/gui/abgui.c src/libs/aqbanking/dialogs/dlg_importer.c src/libs/aqbanking/dialogs/dlg_selectbankinfo.c src/libs/aqbanking/dialogs/dlg_setup.c src/libs/aqbanking/dialogs/dlg_newaccount.c src/libs/aqbanking/dialogs/dlg_newuser.c src/libs/aqbanking/dialogs/dlg_selectbackend.c src/libs/aqbanking/dialogs/dlg_editaccount.c src/libs/aqbanking/dialogs/dlg_edituser.c src/libs/aqbanking/dialogs/dlg_usertype_page.c src/libs/aqbanking/dialogs/dlg_setup_newuser.c src/libs/aqbanking/dialogs/dlg_usertype_pagedefault.c src/libs/aqbanking/backendsupport/ab_jobqueue.c src/libs/aqbanking/backendsupport/ab_accountqueue.c src/libs/aqbanking/backendsupport/ab_userqueue.c src/libs/aqbanking/backendsupport/ab_queue.c src/libs/aqbanking/backendsupport/ab_accountqueuefns.c src/libs/aqbanking/backendsupport/ab_userqueuefns.c src/libs/aqbanking/backendsupport/ab_queuefns.c src/libs/aqbankingpp/stringlist.cpp src/plugins/parsers/dtaus/dtaus.c src/plugins/parsers/dtaus/dtaus-import.c src/plugins/parsers/dtaus/dtaus-export.c src/plugins/parsers/swift/swift.c src/plugins/parsers/swift/swift940.c src/plugins/imexporters/csv/csv.c src/plugins/imexporters/csv/csv_editprofile.c src/plugins/imexporters/dtaus/dtaus.c src/plugins/imexporters/eri2/eri2.c src/plugins/imexporters/ofx/parser/ofxxmlctx.c src/plugins/imexporters/ofx/parser/ofxgroup.c src/plugins/imexporters/ofx/parser/g_acctinfo.c src/plugins/imexporters/ofx/parser/g_acctinfors.c src/plugins/imexporters/ofx/parser/g_acctinfotrnrs.c src/plugins/imexporters/ofx/parser/g_bal.c src/plugins/imexporters/ofx/parser/g_bankacc.c src/plugins/imexporters/ofx/parser/g_bankacctinfo.c src/plugins/imexporters/ofx/parser/g_bankmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_banktranlist.c src/plugins/imexporters/ofx/parser/g_buymf.c src/plugins/imexporters/ofx/parser/g_buystock.c src/plugins/imexporters/ofx/parser/g_creditcardmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_document.c src/plugins/imexporters/ofx/parser/g_generic.c src/plugins/imexporters/ofx/parser/g_ignore.c src/plugins/imexporters/ofx/parser/g_income.c src/plugins/imexporters/ofx/parser/g_invacc.c src/plugins/imexporters/ofx/parser/g_invbuy.c src/plugins/imexporters/ofx/parser/g_invpos.c src/plugins/imexporters/ofx/parser/g_invposlist.c src/plugins/imexporters/ofx/parser/g_invstmtmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_invstmtrs.c src/plugins/imexporters/ofx/parser/g_invstmttrnrs.c src/plugins/imexporters/ofx/parser/g_invtran.c src/plugins/imexporters/ofx/parser/g_invtranlist.c src/plugins/imexporters/ofx/parser/g_mfinfo.c src/plugins/imexporters/ofx/parser/g_ofx.c src/plugins/imexporters/ofx/parser/g_posmf.c src/plugins/imexporters/ofx/parser/g_posstock.c src/plugins/imexporters/ofx/parser/g_reinvest.c src/plugins/imexporters/ofx/parser/g_secid.c src/plugins/imexporters/ofx/parser/g_secinfo.c src/plugins/imexporters/ofx/parser/g_seclist.c src/plugins/imexporters/ofx/parser/g_seclistmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_signonmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_signupmsgsrsv1.c src/plugins/imexporters/ofx/parser/g_sonrs.c src/plugins/imexporters/ofx/parser/g_status.c src/plugins/imexporters/ofx/parser/g_stmtrn.c src/plugins/imexporters/ofx/parser/g_stmtrs.c src/plugins/imexporters/ofx/parser/g_stmttrnrs.c src/plugins/imexporters/ofx/parser/g_stockinfo.c src/plugins/imexporters/openhbci1/openhbci1.c src/plugins/imexporters/swift/swift.c src/plugins/imexporters/xmldb/xmldb.c src/plugins/imexporters/yellownet/yellownet.c src/plugins/imexporters/sepa/sepa.c src/plugins/imexporters/ctxfile/ctxfile.c src/plugins/imexporters/q43/q43.c src/plugins/bankinfo/at/at.c src/plugins/bankinfo/ca/ca.c src/plugins/bankinfo/ch/ch.c src/plugins/bankinfo/de/de.c src/plugins/bankinfo/us/us.c src/plugins/backends/aqhbci/plugin/aqhbci.c src/plugins/backends/aqhbci/plugin/msglayer/account.c src/plugins/backends/aqhbci/plugin/msglayer/bpd.c src/plugins/backends/aqhbci/plugin/msglayer/dialog.c src/plugins/backends/aqhbci/plugin/msglayer/hbci.c src/plugins/backends/aqhbci/plugin/msglayer/hbci-updates.c src/plugins/backends/aqhbci/plugin/msglayer/message.c src/plugins/backends/aqhbci/plugin/msglayer/msgengine.c src/plugins/backends/aqhbci/plugin/msglayer/user.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt.inc src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_ddv.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_pintan.c src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c src/plugins/backends/aqhbci/plugin/joblayer/job.c src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c src/plugins/backends/aqhbci/plugin/joblayer/result.c src/plugins/backends/aqhbci/plugin/joblayer/tanmethod.c src/plugins/backends/aqhbci/plugin/ajobs/accountjob.c src/plugins/backends/aqhbci/plugin/ajobs/jobgetbalance.c src/plugins/backends/aqhbci/plugin/ajobs/jobgettransactions.c src/plugins/backends/aqhbci/plugin/ajobs/jobgetdatedxfers.c src/plugins/backends/aqhbci/plugin/ajobs/jobgetstandingorders.c src/plugins/backends/aqhbci/plugin/ajobs/jobsingletransfer.c src/plugins/backends/aqhbci/plugin/ajobs/jobeutransfer.c src/plugins/backends/aqhbci/plugin/ajobs/jobmultitransfer.c src/plugins/backends/aqhbci/plugin/ajobs/jobforeignxferwh.c src/plugins/backends/aqhbci/plugin/ajobs/jobloadcellphone.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedsinglecreate.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitdatedmulticreate.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedmulticreate.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfermulti.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepaxfersingle.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepadebitsingle.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepacor1datedsinglecreate.c src/plugins/backends/aqhbci/plugin/ajobs/jobtransferbase.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingordercreate.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderget.c src/plugins/backends/aqhbci/plugin/ajobs/jobsepastandingorderdelete.c src/plugins/backends/aqhbci/plugin/applayer/adminjobs.c src/plugins/backends/aqhbci/plugin/applayer/outbox.c src/plugins/backends/aqhbci/plugin/applayer/hhd.c src/plugins/backends/aqhbci/plugin/banking/provider.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.c src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c src/plugins/backends/aqofxconnect/plugin/account.c src/plugins/backends/aqofxconnect/plugin/provider.c src/plugins/backends/aqofxconnect/plugin/queues.c src/plugins/backends/aqofxconnect/plugin/user.c src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.c src/plugins/backends/aqofxconnect/plugin/dummy.c src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.c src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.c src/plugins/backends/aqofxconnect/plugin/libofxhome/ofxhome.c src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.c src/plugins/backends/aqnone/provider.c src/plugins/backends/aqebics/plugin/msg/keys.c src/plugins/backends/aqebics/plugin/msg/msg.c src/plugins/backends/aqebics/plugin/msg/xml.c src/plugins/backends/aqebics/plugin/msg/zip.c src/plugins/backends/aqebics/plugin/msg/eu.c src/plugins/backends/aqebics/plugin/client/account.c src/plugins/backends/aqebics/plugin/client/user.c src/plugins/backends/aqebics/plugin/client/context.c src/plugins/backends/aqebics/plugin/client/dialog.c src/plugins/backends/aqebics/plugin/client/provider.c src/plugins/backends/aqebics/plugin/client/queues.c src/plugins/backends/aqebics/plugin/dialogs/dlg_edituser.c src/plugins/backends/aqebics/plugin/dialogs/dlg_newkeyfile.c src/plugins/backends/aqebics/plugin/dialogs/dlg_user_special.c src/plugins/backends/aqebics/plugin/dummy.c src/tools/aqbanking-cli/main.c aqbanking-5.6.4beta/aqbanking.m40000644000175000017500000001344012364015477013446 00000000000000# $Id$ # (c) 2004 Martin Preuss # This function checks for AqBanking AC_DEFUN([AC_AQBANKING], [ dnl searches for aqbanking dnl Arguments: dnl $1: major version minimum dnl $2: minor version minimum dnl $3: patchlevel version minimum dnl $4: build version minimum dnl Returns: aqbanking_dir dnl aqbanking_libs dnl aqbanking_libspp dnl aqbanking_data dnl aqbanking_plugins dnl aqbanking_includes dnl have_aqbanking if test -z "$1"; then vma="0"; else vma="$1"; fi if test -z "$2"; then vmi="1"; else vmi="$2"; fi if test -z "$3"; then vpl="0"; else vpl="$3"; fi if test -z "$4"; then vbld="0"; else vbld="$4"; fi AC_MSG_CHECKING(if aqbanking support desired) AC_ARG_ENABLE(aqbanking, [ --enable-aqbanking enable aqbanking support (default=yes)], enable_aqbanking="$enableval", enable_aqbanking="yes") AC_MSG_RESULT($enable_aqbanking) have_aqbanking="no" aqbanking_dir="" aqbanking_data="" aqbanking_plugins="" aqbanking_libs="" aqbanking_libspp="" aqbanking_includes="" qbanking_libs="" qbanking_plugindir="" qbanking_helpdir="" aqhbci_libs="" if test "$enable_aqbanking" != "no"; then AC_MSG_CHECKING(for aqbanking) AC_ARG_WITH(aqbanking-dir, [ --with-aqbanking-dir=DIR uses aqbanking from given dir], [lcc_dir="$withval"], [lcc_dir="${prefix} \ /usr/local \ /usr \ /"]) for li in $lcc_dir; do if test -x "$li/bin/aqbanking-config"; then aqbanking_dir="$li"; break fi done if test -z "$aqbanking_dir"; then AC_MSG_RESULT([not found ]) AC_MSG_ERROR([ *** The library AqBanking was not found. Obtain it from *** http://www.aquamaniac.de. *** If it is already installed (including the -devel package), *** you might need to specify the location with the *** option --with-aqbanking-dir=DIR.]) else AC_MSG_RESULT($aqbanking_dir) AC_MSG_CHECKING(for aqbanking libs) aqbanking_libs="`$aqbanking_dir/bin/aqbanking-config --libraries`" AC_MSG_RESULT($aqbanking_libs) AC_MSG_CHECKING(for aqbanking C++ libs) aqbanking_libspp="`$aqbanking_dir/bin/aqbanking-config --libraries++`" AC_MSG_RESULT($aqbanking_libspp) AC_MSG_CHECKING(for aqbanking includes) aqbanking_includes="`$aqbanking_dir/bin/aqbanking-config --includes`" AC_MSG_RESULT($aqbanking_includes) AC_MSG_CHECKING(for aqbanking plugins) aqbanking_plugins="`$aqbanking_dir/bin/aqbanking-config --plugins`" AC_MSG_RESULT($aqbanking_plugins) AC_MSG_CHECKING(for aqbanking data) aqbanking_data="`$aqbanking_dir/bin/aqbanking-config --data`" AC_MSG_RESULT($aqbanking_data) AC_MSG_CHECKING(whether QBanking is supported) have_qbanking="`$aqbanking_dir/bin/aqbanking-config --has-qbanking`" AC_MSG_RESULT($have_qbanking) AC_MSG_CHECKING(for qbanking libs) qbanking_libs="`$aqbanking_dir/bin/aqbanking-config --qbanking-libraries`" AC_MSG_RESULT($aqbanking_libs) AC_MSG_CHECKING(for qbanking plugins) qbanking_plugins="`$aqbanking_dir/bin/aqbanking-config --qbanking-plugins`" AC_MSG_RESULT($qbanking_plugins) AC_MSG_CHECKING(for qbanking helpdir) qbanking_helpdir="`$aqbanking_dir/bin/aqbanking-config --qbanking-helpdir`" AC_MSG_RESULT($qbanking_helpdir) AC_MSG_CHECKING(whether AqHBCI is supported) have_aqhbci="`$aqbanking_dir/bin/aqbanking-config --has-aqhbci`" AC_MSG_RESULT($have_aqhbci) AC_MSG_CHECKING(for AqHBCI libs) aqhbci_libs="`$aqbanking_dir/bin/aqbanking-config --aqhbci-libraries`" AC_MSG_RESULT($aqhbci_libs) fi AC_MSG_CHECKING(if aqbanking test desired) AC_ARG_ENABLE(aqbanking, [ --enable-aqbanking-test enable aqbanking-test (default=yes)], enable_aqbanking_test="$enableval", enable_aqbanking_test="yes") AC_MSG_RESULT($enable_aqbanking_test) AC_MSG_CHECKING(for AqBanking version >=$vma.$vmi.$vpl.$vbld) if test "$enable_aqbanking_test" != "no"; then aqbanking_versionstring="`$aqbanking_dir/bin/aqbanking-config --vstring`.`$aqbanking_dir/bin/aqbanking-config --vbuild`" AC_MSG_RESULT([found $aqbanking_versionstring]) if test "$vma" -gt "`$aqbanking_dir/bin/aqbanking-config --vmajor`"; then AC_MSG_ERROR([Your AqBanking version is way too old. Please update from http://www.aquamaniac.de/aqbanking/]) elif test "$vma" = "`$aqbanking_dir/bin/aqbanking-config --vmajor`"; then if test "$vmi" -gt "`$aqbanking_dir/bin/aqbanking-config --vminor`"; then AC_MSG_ERROR([Your AqBanking version is too old. Please update from http://www.aquamaniac.de/aqbanking/]) elif test "$vmi" = "`$aqbanking_dir/bin/aqbanking-config --vminor`"; then if test "$vpl" -gt "`$aqbanking_dir/bin/aqbanking-config --vpatchlevel`"; then AC_MSG_ERROR([Your AqBanking version is a little bit too old. Please update from http://www.aquamaniac.de/aqbanking/]) elif test "$vpl" = "`$aqbanking_dir/bin/aqbanking-config --vpatchlevel`"; then if test "$vbld" -gt "`$aqbanking_dir/bin/aqbanking-config --vbuild`"; then AC_MSG_ERROR([Your AqBanking version is a little bit too old. Please update to the latest CVS version. Instructions for accessing CVS can be found on http://www.aquamaniac.de/aqbanking/]) fi fi fi fi have_aqbanking="yes" #AC_MSG_RESULT(yes) else have_aqbanking="yes" AC_MSG_RESULT(assuming yes) fi dnl end of "if enable-aqbanking" fi AC_SUBST(aqhbci_libs) AC_SUBST(qbanking_libs) AC_SUBST(qbanking_plugins) AC_SUBST(qbanking_helpdir) AC_SUBST(aqbanking_dir) AC_SUBST(aqbanking_plugins) AC_SUBST(aqbanking_libs) AC_SUBST(aqbanking_libspp) AC_SUBST(aqbanking_data) AC_SUBST(aqbanking_includes) ]) aqbanking-5.6.4beta/NEWS0000644000175000017500000006331412364015477011755 00000000000000 This file is no longer maintained. See ChangeLog for recent news. =========================================================================== Released AqBanking - 3.99.7rc1 (2009-01-22) =========================================================================== This is the first release candidate for AqBanking4. Some bugs have been fixed. =========================================================================== Released AqBanking - 3.99.0 (2008-11-08) =========================================================================== This is the first beta release of AqBanking4. Now multiple applications can use AqBanking concurrently without interference. This was archieved by implementing a lock-and-reload mechanism which makes sure that the latest configuration is used in any case. AqBanking4 facilitates import of previous configurations by the application. The SWIFT parser has yet again been improved. This release requires Gwenhywfar 3.5.2 or better. =========================================================================== Released AqBanking - 3.7.2 (2008-08-26) =========================================================================== This release fixes a problem with some HBCI-RDH accounts when requesting the system id. A CSV profile for Austrian Postbank has been added. =========================================================================== Released AqBanking - 3.7.1 (2008-08-16) =========================================================================== This release features workarounds for recently discovered problems with HBCI, improves the CSV importer and adds two CSV profiles. The OFX parser is now more tolerant (thanks to David Reiser for providing test files). =========================================================================== Released AqBanking - 3.7.0 (2008-08-11) =========================================================================== This release fixes many HBCI-related problems, features a safer PIN handling and provides improved support for WIN32 platforms. Error responses to segment HKEND with HBCI job HKSYNC are now ignored, a CSV profil for LBB Berlin has been added and the build system was cleaned up. The iTAN mode to be used can now be chosen by the user. This release needs at least Gwenhywfar 3.4.0. =========================================================================== Released AqBanking - 3.6.2 (2008-07-09) =========================================================================== This release fixes two serious bugs which could crash an application. An update is recommended. =========================================================================== Released AqBanking - 3.6.1 (2008-07-08) =========================================================================== This release fixes some minor bugs. It allows for the HBCI version to be selected even in PIN/TAN mode. The account type can now also be set from within the graphical setup dialogs. =========================================================================== Released AqBanking - 3.6.0 (2008-07-01) =========================================================================== This release adds a SEPA exporter which is able to create CCM documents. It simplifies working with ImExporterContexts. =========================================================================== Released AqBanking - 3.5.1 (2008-06-11) =========================================================================== This release fixes some more bugs and allows to be build with the special version of aqbanking-cli with EBICS support. When a new pin is to be entered for any reason (e.g. changing the password of a key file) the user is now always asked (no pin caching in this case). =========================================================================== Released AqBanking - 3.5.0 (2008-06-06) =========================================================================== This release improves support for FinTS3 (now transfers/debit notes work in Pin/Tan mode of FinTS3). The TAN method can now be choosen by the user (no GUI yet). Some bugs have been fixed and the CSV exporter now exports values in floating point format instead of rationals (however, rationals are still supported here). =========================================================================== Released AqBanking - 3.4.2 (2008-05-27) =========================================================================== This release updates the German bank info files and adds export capabilities to the DTAUS ImExporter module. =========================================================================== Released AqBanking - 3.4.1 (2008-04-25) =========================================================================== This release fixes a problem with some weird SWIFT MT940 files. Transfer jobs now add transfers to the IMEXPORTER given to AB_Banking_ExecuteJobs. =========================================================================== Released AqBanking - 3.4.0 (2008-04-22) =========================================================================== This is a bugfix and cleanup release. Obsolete code has been removed and some bugs in the SWIFT parser have been fixed. All plugins are now loaded using GWEN's plugin framework. The OFX parser is now able to import investment accounts. Support for static linking has been improved. =========================================================================== Released AqBanking - 3.3.0 (2008-03-16) =========================================================================== This release fixes many bugs especially in the HBCI code. AqBanking now starts to manage CryptToken (because this is now used in two backends). This release requires Gwenhywfar 3.2.0 or better. =========================================================================== Released AqBanking - 3.2.1 (2008-02-08) =========================================================================== This release fixes two bugs: One in the HBCI backend and the other in the OFX parser. The AqHBCI user wizard now automatically sets the NO_BASE64 flag for "Dt. Apotheker- und Aerztebank". =========================================================================== Released AqBanking - 3.2.0 (2008-01-29) =========================================================================== This release now finally works with APO Bank (their server is quite special). The user settings page of the AqHBCI setup wizard now offers some advanced settings. Informational bank messages are now stored in the imexporter context. This release has preliminary support for FinTS 3.0 (the successor of HBCI). Some bugs have been fixed. =========================================================================== Released AqBanking - 3.1.1 (2008-01-28) =========================================================================== This release adds the option "--hbciversion" to the AqHBCI tool. This is used to select the HBCI protocol version to be used. It also tries to fix a problem with transfers in 2-step pin/tan mode (in this mode sometimes the job result was not available. The QT4-port code has been fixed. =========================================================================== Released AqBanking - 3.1.0 (2008-01-25) =========================================================================== This release fixes some important bugs and adds basic supports for import/ export of securities (stocks, mutual funds etc). =========================================================================== Released AqBanking - 3.0.1 (2007-11-27) =========================================================================== This release fixes an important bug in Pin/Tan mode. An update is strongly recommended. =========================================================================== Released AqBanking - 3.0.0 (2007-11-22) =========================================================================== This release fixes a few bugs. =========================================================================== Released AqBanking - 2.9.17rc5 (2007-11-17) =========================================================================== This release simplifies WIN32 installations. =========================================================================== Released AqBanking - 2.9.16rc4 (2007-11-14) =========================================================================== This is a bugfix and cleanup release. =========================================================================== Released AqBanking - 2.9.15rc3 (2007-11-13) =========================================================================== This release introduces yet more workarounds for difficult servers. =========================================================================== Released AqBanking - 2.9.14rc2 (2007-11-11) =========================================================================== This release introduces workarounds for common server problems. =========================================================================== Released AqBanking - 2.9.13rc1 (2007-11-09) =========================================================================== This is a release candidate for the next stable release. This version adds the command "getcert" to the aqhbci-tool. =========================================================================== Released AqBanking - 2.9.12beta (2007-11-07) =========================================================================== This is a bugfix release. =========================================================================== Released AqBanking - 2.9.11beta (2007-11-03) =========================================================================== This release fixes some bugs in AqHBCI. It is now more tolerant when checking the name of a remote signer since the security does not come from the signer name but from the signature. =========================================================================== Released AqBanking - 2.9.10beta (2007-11-02) =========================================================================== The HBCI user wizard now retries retrieving of SSL certificates with SSL3 in case the default SSL setup doesn't work. This version only installs a single configuration shell script (aqbanking-config). This is now able to return the configuration of AqHBCI and QBanking as well so there is no need for multiple of those files. =========================================================================== Released AqBanking - 2.9.9beta (2007-10-31) =========================================================================== With this release the HBCI setup wizard is back and working again. Some important bugs have been fixed and the German bank info files have been updated. =========================================================================== Released AqBanking - 2.9.8beta (2007-10-30) =========================================================================== The previous release was missing two files. =========================================================================== Released AqBanking - 2.9.7beta (2007-10-28) =========================================================================== This release fixes some bugs in AqOfxConnect and a potential problem in AqHBCI. With the latest CVS version of LibOFX it now also allows changing some protocol-relevant settings (like appid, OFX header version). =========================================================================== Released AqBanking - 2.9.6beta (2007-10-27) =========================================================================== This release features support for OFX Direct Connect again. The tutorials have been adapted so that they demonstrate the current API. AqBanking is now completely relocatable on WIN32 platforms (and if enabled by a configure option on Linux as well). =========================================================================== Released AqBanking - 2.9.5beta (2007-10-25) =========================================================================== The previous release was missing a file. This release is complete. =========================================================================== Released AqBanking - 2.9.4beta (2007-10-24) =========================================================================== This is the first release of AqBanking which no longer requires OpenSSL. It is also the first to be prepared for cross-compiling for win32 platforms. Pin/Tan with Netbank works again and many bugs from the last beta release have been fixed. This version now uses Gwen's new CryptToken framework. =========================================================================== Released AqBanking - 2.9.3beta (2007-09-11) =========================================================================== With this release AqBanking has been adapted to the latest version of Gwenhywfar. Currently the only working online banking backend is AqHBCI, the other backends will be reenabled as needed. This release needs Gwenhywfar 2.9.2beta. =========================================================================== Released AqBanking - 2.9.2beta (2007-05-14) =========================================================================== This release fixes some major bugs in the previous version. A new banking job for loading prepaid cards for cell phones has been added (so far implemented only for HBCI). Started working on FinTS3 support in AqHBCI. =========================================================================== Released AqBanking - 2.9.1beta (2007-04-04) =========================================================================== This release fixes some important bugs discovered after the previous release. =========================================================================== Released AqBanking - 2.9.0beta (2007-04-03) =========================================================================== This is the first release of AqBanking3. It now uses libgmp instead of simple "double" type for more precise calculations. AqBanking now uses the GUI functions of Gwenhywfar3 instead of declaring its own GUI modules. The OFX DC plugin now supports additional account types. General code cleanup. This version requires Gwenhywfar3>=2.9.0beta and Libchipcard3>=3.1.0beta. =========================================================================== Released AqBanking - 2.2.4 (2006-12-27) =========================================================================== AqGeldKarte has been fixed and adapted to Libchipcard3 which is now required instead of Libchipcard2. The QBanking frontend is now less verbous, QT should now be found on Darwin, too. Some other minor bugs have been fixed as well and the bank data files for Germany have been updated. =========================================================================== Released AqBanking - 2.2.3 (2006-10-10) =========================================================================== This version now allows to setup iTAN HBCI accounts. =========================================================================== Released AqBanking - 2.2.2beta (2006-10-09) =========================================================================== This version has improved support for HBCI iTAN mode, adds an import profile for ABN AMRO Bank (NL) and fixes some errors. Please test! =========================================================================== Released AqBanking - 2.2.1 (2006-08-25) =========================================================================== This release fixes some minor bugs and typos. The HBCI plugin now also works with HBCI servers with a faulty iTAN implementation (using iTAN method 900). =========================================================================== Released AqBanking - 2.2.0 (2006-07-13) =========================================================================== This release introduces support for HBCI iTAN mode, adds the ability to modify the PIN in PIN/TAN mode and finally fixes some nasty umlaut problems. An XML exporter for transaction export has been added. Bank info files for Germany and Austria have been updated. =========================================================================== Released AqBanking - 2.1.0 (2006-06-15) =========================================================================== The YellowNet plugin now uses XML files provided by PostFinance instead of hard-to-get MT940 files when downloading transaction statements. It also contains some OFX-related fixes and an improved German translation. =========================================================================== Released AqBanking - 2.0.0 (2006-04-03) =========================================================================== No major bugs have been reported so I decided to finally release AqBanking 2.0.0. =========================================================================== Released AqBanking - 1.9.11rc1 (2006-03-26) =========================================================================== This is the first release candidate of AqBanking2. Creating users for HBCI and now works again and an important bug in OFX DirectConnect has been fixed. =========================================================================== Released AqBanking - 1.9.10beta (2006-03-23) =========================================================================== This release fixes a bug in AqHBCI which prevented PINTAN media from being created. It also now includes an improved version of the SWIFT parser which reads more kinds of SWIFT documents (especially those provided by some Swiss banks). =========================================================================== Released AqBanking - 1.9.9beta (2006-03-20) =========================================================================== This release fixes some bugs in YellowNet code and improves the documentation. It needs the latest release of Gwenhywfar (2.1.0). =========================================================================== Released AqBanking - 1.9.8beta (2006-03-07) =========================================================================== This release fixes some bugs concerning importing/creating HBCI users and problems with the YellowNet backend. The build system and the API have been cleaned up (including documentation). An update is recommended. Depending applications need to be recompiled due to changes in the API. This version is source-compatible with the previous release. =========================================================================== Released AqBanking - 1.9.7beta (2006-02-06) =========================================================================== This release fixes some bugs in the build-system, adds a CSV profile for American Express cards and some tutorials. An updated RPM specfile is now available. =========================================================================== Released AqBanking - 1.9.6beta (2006-01-30) =========================================================================== This release fixes a problem of AqHBCI with attach points. It now allows the reception of multi-message responses from the bank. =========================================================================== Released AqBanking - 1.9.5beta (2006-01-28) =========================================================================== This version fixes some makefiles of the new backends. =========================================================================== Released AqBanking - 1.9.4beta (2006-01-27) =========================================================================== This release adds a backend for YellowNet (Suisse Postfinance, binary-only), adds a fake-backend to be used for accounts which are not managed via any other online banking backend and fixes some bugs. Most importantly, OFX Direct Connect now works again (thanks to David Reiser!!) =========================================================================== Released AqBanking - 1.9.3beta (2006-01-26) =========================================================================== This release fixes some bugs, improves safety of working with crypt tokens (now a crypt token can report a bad pin), includes a help system, features hidden visibility for the QT3-depending files and an improved GTK2 frontend. Nearly complete German translation is now provided. =========================================================================== Released AqBanking - 1.9.2beta (2006-01-19) =========================================================================== This relese fixes a bug which made Gnucash unable to find the QT3 wizard. It also reintroduces support for OFX DirectConnect (yet untested, though). =========================================================================== Released AqBanking - 1.9.1beta (2006-01-17) =========================================================================== This release fixes many bugs in the previous version. It is now able to completely migrate user configuration data from older versions to the current one. =========================================================================== Released AqBanking - 1.9.0beta (2006-01-11) =========================================================================== This version features a complete redesign of the configuration framework. It also removes some deprecated functions and makes use of GCCs visibility feature (thus removing several hundred symbols from the libraries export table which decreases application loading time). =========================================================================== Released AqBanking - 1.8.1beta (2005-12-15) =========================================================================== This version fixes some network problems and cleans up the build system. It now allows to choose the transfer mode independantly for transfer orders and debit notes. =========================================================================== Released AqBanking - 1.8.0beta (2005-11-22) =========================================================================== This version fixes many bugs, adapts to Gwenhywfar2 (1.99.0) and fixes many problems encountered in HBCI-PIN/TAN mode. The user setup wizard for HBCI has been rewritten (but it can only import existing media for now). =========================================================================== Released AqBanking - 1.6.0beta (2005/09/02) =========================================================================== This release fixes some bugs and adds job-related logging (to be viewed with aqbanking-tool's new command "joblog"). =========================================================================== Released AqBanking - 1.3.0beta (2005/07/15) =========================================================================== This release now includes all backends (AqHBCI, AqDTAUS, AqGeldKarte, AqOfxConnect) and all frontends (console, gtk2, qt3, kde3) and all QT3 setup wizards for all backends. AqHBCI now uses Gwenhywfar's CryptToken plugins instead of its own media plugins. "aqhbci-tool" can now be used to setup a new user from console. An ERI importer plugin has been added, some important bugs have been fixed and code duplication has been replaced by the new QT3 frontend. (Note: Further information in German can be found on http://linuxwiki.de/AqBanking ) Please note that the media plugins for AqHBCI (DDVCard, RSACard) are now obsoleted by the latest versions of AqBanking, Gwen and Libchipcard2. New package structure since aqbanking-1.3.0 ------------------------------------------- Starting from aqbanking-1.3.0, the aqbanking package now includes all sub-packages that previously were released in separate packages or projects. Source packages --------------- In particular, all the following source packages are now included by and obsoleted by aqbanking-1.3.0.tar.gz and newer versions: aqhbci aqhbci-qt-tools aqdtaus aqdtaus-qt-tools aqgeldkarte aqgeldkarte-qt-tools aqofxconnect aqofxconnect-qt-tools kbanking g2banking -> Again, these are now all obsoleted by aqbanking-1.3.0.tar.gz and newer. The chipcard-related sub-packages of aqbanking/aqhbci are also obsoleted by aqbanking-1.3.0 and libchipcard-1.9.13, because the relevant source code files are now included in libchipcard: aqhbci-ddvcard aqhbci-rsacard -> Again, these are now all obsoleted by aqbanking-1.3.0.tar.gz with libchipcard-1.9.13.tar.gz and newer. RPM packages ------------ The aqbanking-1.3.0.tar.gz source packages will create several different RPM packages according to the different requirements of each of its parts. In particular: aqbanking -> Still named aqbanking aqhbci -> Obsoleted by aqbanking aqdtaus -> Obsoleted by aqbanking aqhbci-qt-tools -> Obsoleted by aqbanking-qt3 aqdtaus-qt-tools -> Obsoleted by aqbanking-qt3 kbanking -> Obsoleted by aqbanking-kde3 g2banking -> Obsoleted by aqbanking-gtk2 aqhbci-ddvcard -> Obsoleted by libchipcard aqhbci-rsacard -> Obsoleted by libchipcard aqgeldkarte -> Obsoleted by aqbanking-geldkarte aqgeldkarte-qt-tools -> Obsoleted by aqbanking-geldkarte-qt3 aqofxconnect -> Obsoleted by aqbanking-ofx aqofxconnect-qt-tools -> Obsoleted by aqbanking-ofx-qt3 aqbanking-5.6.4beta/COPYING0000644000175000017500000014667012364015477012320 00000000000000 Licenses 1. AqBanking ============ AqBanking is licensed under the GPLv2 or GPLv3 (see below). All contributions from Christian Stimming, Patrick Prasse, Stephen R. Besch, G. Paul Ziemba, Tomas Pospisek, Paul Conrady and Matthias Gehre are licensed under the "Modified BSD-License" (see at the end of this document). All contributions from Micha Lenk are licensed either under the terms of the GPL in the version AqBanking is released with, or under the terms of the "Modified BSD-License" (see at the end of this document), at your choice. All contributions from Martin Preuss are licensed under GPL. Hence, the full package is licensed under GPL. 3. GNU GPL v2 ============= GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ---------------------------------------------------------------- 4. GNU GPL v3 ============= GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . 5. Modified BSD-License ======================= Modified BSD-License (Source: E.g. http://en.wikipedia.org/wiki/BSD_licenses) Copyright (c) 2004-2008 Christian Stimming Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Christian Stimming nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY Christian Stimming ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Christian Stimming BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. aqbanking-5.6.4beta/Doxyfile.in0000644000175000017500000017463712364015477013404 00000000000000# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = aqbanking # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @AQBANKING_VERSION_RELEASE_STRING@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = apidoc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = no # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = no # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = no # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = doc/apidoc.h \ tutorials/tutorials.h \ @DOXYGEN_INPUT@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = *moc* \ *_p.h # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = doc \ tutorials # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = doc # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 4 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = GWEN #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html/aqbanking-@AQBANKING_VERSION_RELEASE_STRING@ # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see #
Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = no # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = @DOXYGEN_DEFINE@ \ __cplusplus \ AQBANKING_API= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = AB_CXXWRAP_GET0_CONST AB_CXXWRAP_GET0 \ AB_CXXWRAP_GET1_CONST AB_CXXWRAP_GET1 \ AB_CXXWRAP_SET0 AB_CXXWRAP_SET1 \ AB_CXXWRAP_CONSTRUCTOR0 AB_CXXWRAP_CONSTRUCTORS # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = @DOXYGEN_TAGFILES@ # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = apidoc/aqbanking.tag # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = NO # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = @USE_DOT@ # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES aqbanking-5.6.4beta/mksymlinks.sh.in0000755000175000017500000000653412364015477014424 00000000000000#!/bin/sh srcdir="$1" builddir="$2" # -------------------------------------------------------------------------- # # code # rm -Rf aqbanking5 2>/dev/null # The prefix to the source code (=srcdir) sprefix=`( cd ${srcdir} ; pwd )` # The prefix to the build directory (=builddir) bprefix=`pwd` # -------------------------------------------------------------------------- # # functions # symlinkFolder () { local dfiles local src local dst src="$1" dst="$2" dfiles=`( cd "${sprefix}/${src}" && ls 2>/dev/null )` for f in $dfiles; do if test -d "${src}/${f}"; then case "$f" in . | .. | CVS | .* | bin | tools) ;; *) symlinkFolder "${src}/${f}" "${dst}" ;; esac else case "${f}" in *_p.h | *_l.h | *.ui.h | version.h | system.h) ;; *.ui) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}.h" ln -s "${bprefix}/${src}/${f}.h" "${dst}/${f}.h" ;; version.h.in) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/version.h" ln -s "${bprefix}/${src}/version.h" "${dst}/version.h" ;; system.h.in) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/system.h" ln -s "${bprefix}/${src}/system.h" "${dst}/system.h" ;; *.h) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}" ln -s "${sprefix}/${src}/${f}" "${dst}/${f}" ;; *.hpp) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}" ln -s "${sprefix}/${src}/${f}" "${dst}/${f}" ;; esac fi done } # symlink all headers from src/lib/aqbanking AQ_HEADER_FILES="${sprefix}/version.h ${sprefix}/system.h" mkdir -p aqbanking5/aqbanking symlinkFolder "src/libs/aqbanking" "aqbanking5/aqbanking" ln -s "${bprefix}/version.h" aqbanking5/aqbanking/version.h ln -s "${bprefix}/system.h" aqbanking5/aqbanking/system.h ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_jobqueue.h" aqbanking5/aqbanking ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_accountqueue.h" aqbanking5/aqbanking ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_userqueue.h" aqbanking5/aqbanking # symlink all headers from src/lib/aqbankingpp mkdir -p aqbanking5/aqbankingpp symlinkFolder "src/libs/aqbankingpp" "aqbanking5/aqbankingpp" # symlink all headers from src/plugins/backends/ dirlist='@aqbanking_backends@' # list might be empty for backend in ${dirlist} ; do mkdir -p aqbanking5/${backend} if [ -d "src/plugins/backends/${backend}/plugin" ] ; then symlinkFolder "src/plugins/backends/${backend}/plugin" "aqbanking5/${backend}" # symlink all subfolders for f in src/plugins/backends/${backend}/plugin/*; do if [ -d "src/plugins/backends/${backend}/plugin/$f" ] ; then case $f in .libs | .deps) ;; *) symlinkFolder "src/plugins/backends/${backend}/plugin/$f" "aqbanking5/${backend}" ;; esac fi done fi done if [ -d aqbanking5/aqofxconnect ] ; then ln -s "${bprefix}/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.h" aqbanking5/aqofxconnect ln -s "${bprefix}/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.h" aqbanking5/aqofxconnect fi rm -f sl-headers 2>/dev/null for i in ${AQ_HEADER_FILES}; do echo "$i" >>sl-headers done aqbanking-5.6.4beta/config.guess0000755000175000017500000013036112201675101013555 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: aqbanking-5.6.4beta/aqbanking.spec.in0000644000175000017500000002062312364015477014466 00000000000000# norootforbuild # neededforbuild gwenhywfar gwenhywfar-devel ktoblzcheck python python-ctypes pyyxml libchipcard2-devel libchipcard2 pkgconfig gettext-devel libacl-devel libacl libattr-devel libattr %define name @PACKAGE@ %define version @VERSION@ %define dist @aq_distrib_name@ %define disttag @aq_distrib_tag@ %define distver @aq_distrib_version@ %define aq_plugindir %{_libdir}/aqbanking/plugins/@AQBANKING_SO_EFFECTIVE@ %define fronts_libdir %{aq_plugindir}/frontends %define imex_plugindir %{aq_plugindir}/imexporters %define imex_datadir %{_datadir}/%{name}/imexporters %define fronts_datadir %{_datadir}/%{name}/frontends %define qb_cfgmoddir %{fronts_libdir}/qbanking/cfgmodules ### Optionally disable chipcard and ofx sub-packages - resulting ### rpms should not be released! %define have_libchipcard 0 %define have_libofx 1 %define with_yellownet 0 # Note: There is not yet a special symbol for the rpm release # version. We set it to one here. %define release 1.%{disttag}%{distver} ### Choose backends to be built %if %have_libofx %if %have_libchipcard %if %with_yellownet %define backendlist "aqhbci aqofxconnect aqyellownet" %else %define backendlist "aqhbci aqofxconnect" %endif %else %if %with_yellownet %define backendlist "aqhbci aqofxconnect aqyellownet" %else %define backendlist "aqhbci aqofxconnect" %endif %endif %else %if %have_libchipcard %if %with_yellownet %define backendlist "aqhbci aqyellownet" %else %define backendlist "aqhbci" %endif %else %if %with_yellownet %define backendlist "aqhbci aqyellownet" %else %define backendlist "aqhbci" %endif %endif %endif # versions of required helper-libraries %define _gwenhywfar_version 2.9.15 %define _libchipcard3_version 3.9.13 ### The standard information fields. Name: %{name} Summary: A library for online banking functions and financial data import/export Version: %{version} Release: %{release} Source: http://download.sourceforge.net/aqbanking/%{name}-%{version}.tar.gz Group: System Environment/Libraries License: GPL Packager: Martin Preuss URL: http://sourceforge.net/projects/aqbanking BuildRoot: %{_tmppath}/%{name}-%{version}-root Requires: gwenhywfar >= %{_gwenhywfar_version} Requires: ktoblzcheck BuildRequires: gwenhywfar-devel >= %{_gwenhywfar_version} BuildRequires: ktoblzcheck #BuildRequires: python-ctypes BuildRequires: python >= 2.3 BuildRequires: pyxml BuildRequires: pkgconfig >= 0.9 #BuildRequires: gettext-devel #BuildRequires: libacl-devel #BuildRequires: libattr-devel Prefix: %{_prefix} Obsoletes: aqdtaus Obsoletes: aqhbci Obsoletes: kbanking Obsoletes: aqofxconnect %description The intention of AqBanking is to provide a middle layer between the program and the various Online Banking libraries (e.g. AqHBCI). The first backend which is already supported is AqHBCI, a library which implements a client for the German HBCI (Home Banking Computer Interface) protocol. Additionally, Aqbanking provides various plugins to simplify import and export of financial data. Currently there are import plugins for the following formats: DTAUS (German financial format), SWIFT (MT940 and MT942). Further information in German can be found on http://linuxwiki.de/AqBanking %package devel Summary: Aqbanking development kit Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Obsoletes: aqhbci-devel Obsoletes: aqofxconnect-devel Obsoletes: aqdtaus-devel %description devel This package contains aqbanking-config and header files for writing and compiling programs using Aqbanking. %package -n python-%{name} Summary: Aqbanking python-bindings Group: Development/Libraries/Python %py_requires Requires: %{name} = %{version} #Requires: python-ctypes Requires: python >= 2.3 Requires: pyxml %description -n python-%{name} This package contains the python-bindings for aqbanking. %package qt3 Summary: Aqbanking tools for Qt3 Group: Productivity/Office/Finance Obsoletes: aqhbci-qt-tools Obsoletes: aqdtaus-qt-tools Requires: %{name} = %{version} Requires: gwenhywfar >= %{_gwenhywfar_version} %description qt3 This package contains the QT3 setup wizard for AqBanking. ### Sub-packages for OFX %if %have_libofx %package ofx Summary: Aqbanking tools for Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Obsoletes: %{name}-ofx-qt3 %description ofx Aqbanking tools for Qt3. Necessary for OFX direct connect access. Author: Martin Preuss %package ofx-qt3 Summary: Aqbanking tools for Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} Requires: gwenhywfar >= %{_gwenhywfar_version} %description ofx-qt3 Aqbanking tools for Qt3. Necessary for OFX direct connect access. Author: Martin Preuss %endif ### Sub-packages for yellownet %if %with_yellownet %package yellownet Summary: YellowNet backend Group: Development/Libraries/C and C++ Requires: %{name} = %{version} %description yellownet This backend provides support for Suisse YellowNet (Post-Finance) Author: Martin Preuss %package yellownet-qt3 Summary: Configuration plugins for Aqbanking with Qt3 Group: Development/Libraries/C and C++ Requires: %{name} = %{version} %description yellownet-qt3 This backend provides support for Suisse YellowNet (Post-Finance) Author: Martin Preuss %endif ### The build commands %prep %setup -q %build %{configure} \ --enable-release \ --with-docpath=%{_docdir} \ --enable-python \ --with-backends=%{backendlist} make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT make install-strip \ DESTDIR=%{buildroot} \ idatadir=%{_docdir}/%{name} %clean [ -d %{buildroot} -a "%{buildroot}" != "" ] && rm -rf %{buildroot} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %post -n %{name}-qt3 -p /sbin/ldconfig %postun -n %{name}-qt3 -p /sbin/ldconfig ### The file list for all packages, starting with the base package %files %defattr(-,root,root) %doc AUTHORS COPYING ChangeLog README # The directories used by the base package %dir %{_libdir}/%{name} %dir %{_libdir}/%{name}/plugins %dir %{aq_plugindir} %dir %{aq_plugindir}/debugger %dir %{aq_plugindir}/providers %dir %{imex_plugindir} %dir %{fronts_libdir} %dir %{fronts_libdir}/qbanking %dir %{qb_cfgmoddir} %dir %{_datadir}/%{name} %dir %{fronts_datadir} %dir %{imex_datadir} ### The original aqbanking files %{_libdir}/lib%{name}*.so.* %{_libdir}/gwenhywfar %{_datadir}/%{name}/bankinfo %{_datadir}/locale/*/LC_MESSAGES/%{name}.mo %{aq_plugindir}/bankinfo %{imex_plugindir}/csv.* %{imex_plugindir}/dtaus.* %{imex_plugindir}/eri2.* %{imex_plugindir}/openhbci1.* %{imex_plugindir}/swift.* %{imex_plugindir}/xmldb.* %{imex_plugindir}/yellownet.* %{imex_datadir}/csv %{imex_datadir}/dtaus %{imex_datadir}/eri %{imex_datadir}/eri2 %{imex_datadir}/openhbci1 %{imex_datadir}/swift %{imex_datadir}/xmldb %{imex_datadir}/yellownet ### The aqhbci files %{_bindir}/aqhbci-tool@QBANKING_SO_EFFECTIVE@ %{_libdir}/libaqhbci.so.* %{aq_plugindir}/providers/aqhbci.* #%{_datadir}/doc/aqhbci ### The aqnone files %{_libdir}/libaqnone.so.* %{aq_plugindir}/providers/aqnone.* %files devel %defattr(-,root,root) ### The aqbanking files %{_bindir}/%{name}-config %{_includedir}/%{name} %{_libdir}/*.la %{_libdir}/libaqbanking.so %{_libdir}/libaqhbci.so %{_libdir}/libaqnone.so %{_libdir}/pkgconfig/%{name}.pc %{_datadir}/aclocal ### The aqhbci files %{_bindir}/hbcixml3 %{_includedir}/aqhbci %{_datadir}/%{name}/backends/aqhbci ### The qbanking files %{_includedir}/qbanking %files -n python-aqbanking %defattr(644,root,root,755) %{py_sitedir}/* %files qt3 %defattr(-,root,root) %{_bindir}/qb-help@QBANKING_SO_EFFECTIVE@ %{_libdir}/libqbanking.so.* %{_libdir}/libqbanking.so %{aq_plugindir}/debugger/aqhbci %{aq_plugindir}/wizards %{qb_cfgmoddir}/aqhbci* %{_datadir}/%{name}/i18n %{fronts_datadir}/qbanking %if %have_libofx %files ofx %defattr(-,root,root) %{_libdir}/libaqofxconnect.so.* %{_libdir}/libaqofxconnect.so %{_includedir}/aqofxconnect %{aq_plugindir}/providers/aqofxconnect.* %{imex_plugindir}/ofx.* %{imex_datadir}/ofx %files ofx-qt3 %defattr(-,root,root) %{qb_cfgmoddir}/aqofxconnect* %endif %if %with_yellownet %files yellownet %{_libdir}/libaqyellownet.so %{_includedir}/aqyellownet %{aq_plugindir}/providers/aqyellownet.* %files yellownet-qt3 %{qb_cfgmoddir}/aqyellownet* %endif aqbanking-5.6.4beta/system.h.in0000644000175000017500000000117312364015477013353 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_SYSTEM_H #define AQBANKING_SYSTEM_H #define AQBANKING_SYS_IS_WINDOWS @aqbanking_sys_is_windows@ #define AQBANKING_SYSTEM "@OSYSTEM@" #endif aqbanking-5.6.4beta/missing0000755000175000017500000001533012261335263012642 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aqbanking-5.6.4beta/aqbanking-config.in.in0000644000175000017500000000402112364015477015377 00000000000000# $Id$ # Author of this file: Martin Preuss prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ datarootdir=@datarootdir@ includedir=@includedir@ datadir=@datadir@ result="" for d in $*; do case $d in --includes) result="$result @aqbanking_includes@ @gwenhywfar_includes@" ;; --libraries) result="$result @aqbanking_ldflags@ @aqbanking_libs@" ;; --libraries++) result="$result " ;; --plugins) result="$result @aqbanking_plugindir@" ;; --data) result="$result @aqbanking_pkgdatadir@" ;; --has-qbanking) result=@with_qbanking@ ;; --qbanking-libraries) result="$result @aqbanking_ldflags@ @qbanking_libs@" ;; --qbanking-plugins) result="$result @qbanking_plugindir@" ;; --qbanking-helpdir) result="$result @qbanking_helpdir@" ;; --has-aqhbci) result=@with_aqhbci@ ;; --aqhbci-libraries) result="$result @aqbanking_ldflags@ @aqhbci_libs@" ;; --vmajor) result="$result @AQBANKING_VERSION_MAJOR@" ;; --vminor) result="$result @AQBANKING_VERSION_MINOR@" ;; --vpatchlevel) result="$result @AQBANKING_VERSION_PATCHLEVEL@" ;; --vbuild) result="$result @AQBANKING_VERSION_BUILD@" ;; --vtag) result="$result @AQBANKING_VERSION_TAG@" ;; --vstring) result="$result @AQBANKING_VERSION_MAJOR@.@AQBANKING_VERSION_MINOR@.@AQBANKING_VERSION_PATCHLEVEL@" ;; *) echo "Usage:" echo "$0 --includes gives you the include flags" echo "$0 --libraries gives you the library flags" echo "$0 --vmajor gives the major version of AqBanking" echo "$0 --vminor gives the minor version of AqBanking" echo "$0 --vpatchlevel gives the patchlevel of AqBanking" echo "$0 --vbuild gives the build number of AqBanking" echo "$0 --vtag gives the tag of AqBanking (cvs, beta or stable)" echo "$0 --vstring returns a version string" exit 1 ;; esac done echo $result aqbanking-5.6.4beta/system.h0000644000175000017500000000113612643540105012734 00000000000000/*************************************************************************** $RCSfile$ ------------------- cvs : $Id$ begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_SYSTEM_H #define AQBANKING_SYSTEM_H #define AQBANKING_SYS_IS_WINDOWS 0 #define AQBANKING_SYSTEM "linux" #endif aqbanking-5.6.4beta/Makefile.in0000644000175000017500000014563612643540054013325 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @IF_MAKE_I18N_FILES_TRUE@am__append_1 = $(I18NCATALOGS) subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/mksymlinks.sh.in \ $(srcdir)/Doxyfile.in $(srcdir)/aqbanking-config.in.in \ $(srcdir)/aqbanking.pc.in $(srcdir)/aqbanking.spec.in \ $(srcdir)/aqbanking.iss.in $(srcdir)/version.h.in \ $(srcdir)/system.h.in $(srcdir)/aqbanking-config.cmake.in \ $(srcdir)/aqbanking-config-version.cmake.in \ $(dist_aclocal_DATA) $(iheader_HEADERS) COPYING TODO compile \ config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = mksymlinks.sh Doxyfile aqbanking-config.in \ aqbanking.pc aqbanking.spec aqbanking.iss version.h system.h \ aqbanking-config.cmake aqbanking-config-version.cmake CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cmakeconfigdir)" \ "$(DESTDIR)$(aclocaldir)" "$(DESTDIR)$(idatadir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(iheaderdir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(cmakeconfig_DATA) $(dist_aclocal_DATA) $(idata_DATA) \ $(pkgconfig_DATA) HEADERS = $(iheader_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ SUBDIRS = admin doc m4 src po @TUTORIALS@ DIST_SUBDIRS = admin doc m4 src po tutorials EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL NEWS README \ aqbanking.spec.in aqbanking.spec \ aqbanking.iss.in aqbanking.iss \ Doxyfile.in version.h.in system.h.in \ i18nsources \ mksymlinks.sh.in mksymlinks.sh Makefile.cvs idatadir = ${datadir}/doc/aqbanking idata_DATA = AUTHORS COPYING ChangeLog README bin_SCRIPTS = aqbanking-config aclocaldir = $(datadir)/aclocal dist_aclocal_DATA = aqbanking.m4 ACLOCAL_AMFLAGS = $(ADD_ACLOCAL_FLAGS) -I m4 iheaderdir = @aqbanking_headerdir_am@/aqbanking iheader_HEADERS = \ version.h system.h CLEANFILES = aqbanking-config aqbanking-config.in $(am__append_1) \ $(BUILT_SOURCES) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = aqbanking.pc cmakeconfigdir = $(libdir)/cmake/aqbanking-$(AQBANKING_VERSION_MAJOR).$(AQBANKING_VERSION_MINOR) cmakeconfig_DATA = aqbanking-config.cmake aqbanking-config-version.cmake # Rule for using the Inno Setup compiler. The path to iscc.exe is set # manually here for now. ISCC = "C:\Programme\Inno Setup 5\iscc.exe" wintmpdir = win32-tmp # We directly read that file list. For old make programs, you would # set this to an empty variable, because they are only needed by the # developers and release technicians. @IF_MAKE_I18N_FILES_TRUE@I18NFILES = $(shell cat $(srcdir)/i18nsources) @IF_MAKE_I18N_FILES_TRUE@DLGFILES = $(shell cat $(srcdir)/dlgsources) @IF_MAKE_I18N_FILES_TRUE@PDFILES = $(shell cat $(srcdir)/pdsources) # Could also be solved this way: Read the I18NFILES variable from file #include $(srcdir)/i18nsources # (Needs the following build rule:) #sources: # rm -f $(srcdir)/i18nsources # $(MAKE) -C $(top_srcdir)/src sources # mv $(srcdir)/i18nsources $(srcdir)/i18nsources.tmp # echo "I18NFILES = \\" > $(srcdir)/i18nsources # $(SED) 's!\(^.*$$\)!$$(top_srcdir)/\1 \\!' \ # $(srcdir)/i18nsources.tmp >> $(srcdir)/i18nsources # echo '$$(top_srcdir)/config.h' >> $(srcdir)/i18nsources # rm -f $(srcdir)/i18nsources.tmp # $(MAKE) Makefile # The list of available languages (makes file name transformations much easier) @IF_MAKE_I18N_FILES_TRUE@ALL_LINGUAS = $(basename $(notdir $(shell ls $(srcdir)/po/*.po))) # For old make programs, the locales would directly be written here: #ALL_LINGUAS = de # List of po files. Only necessary in the dependency of the catalogs # rule. For old make programs, you would simpy set this to an empty # variable. @IF_MAKE_I18N_FILES_TRUE@I18NLINGUAS = $(foreach lang,$(ALL_LINGUAS),$(srcdir)/po/$(lang).po) # List of mo files. Only necessary for cleanup. For old make programs, # you would simply set this to an empty variable. @IF_MAKE_I18N_FILES_TRUE@I18NCATALOGS = $(foreach \ @IF_MAKE_I18N_FILES_TRUE@ lang,$(ALL_LINGUAS),$(top_builddir)/po/$(lang).mo) \ @IF_MAKE_I18N_FILES_TRUE@ $(foreach \ @IF_MAKE_I18N_FILES_TRUE@ lang,$(ALL_LINGUAS),$(top_builddir)/po/$(lang).qm) @IF_MAKE_I18N_FILES_TRUE@ilocaledir = $(datadir)/locale BUILT_SOURCES = $(iheader_HEADERS) sl-headers all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mksymlinks.sh: $(top_builddir)/config.status $(srcdir)/mksymlinks.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking-config.in: $(top_builddir)/config.status $(srcdir)/aqbanking-config.in.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking.pc: $(top_builddir)/config.status $(srcdir)/aqbanking.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking.spec: $(top_builddir)/config.status $(srcdir)/aqbanking.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking.iss: $(top_builddir)/config.status $(srcdir)/aqbanking.iss.in cd $(top_builddir) && $(SHELL) ./config.status $@ version.h: $(top_builddir)/config.status $(srcdir)/version.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ system.h: $(top_builddir)/config.status $(srcdir)/system.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking-config.cmake: $(top_builddir)/config.status $(srcdir)/aqbanking-config.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $@ aqbanking-config-version.cmake: $(top_builddir)/config.status $(srcdir)/aqbanking-config-version.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-cmakeconfigDATA: $(cmakeconfig_DATA) @$(NORMAL_INSTALL) @list='$(cmakeconfig_DATA)'; test -n "$(cmakeconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(cmakeconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(cmakeconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakeconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakeconfigdir)" || exit $$?; \ done uninstall-cmakeconfigDATA: @$(NORMAL_UNINSTALL) @list='$(cmakeconfig_DATA)'; test -n "$(cmakeconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(cmakeconfigdir)'; $(am__uninstall_files_from_dir) install-dist_aclocalDATA: $(dist_aclocal_DATA) @$(NORMAL_INSTALL) @list='$(dist_aclocal_DATA)'; test -n "$(aclocaldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(aclocaldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(aclocaldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(aclocaldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(aclocaldir)" || exit $$?; \ done uninstall-dist_aclocalDATA: @$(NORMAL_UNINSTALL) @list='$(dist_aclocal_DATA)'; test -n "$(aclocaldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(aclocaldir)'; $(am__uninstall_files_from_dir) install-idataDATA: $(idata_DATA) @$(NORMAL_INSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(idatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(idatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(idatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(idatadir)" || exit $$?; \ done uninstall-idataDATA: @$(NORMAL_UNINSTALL) @list='$(idata_DATA)'; test -n "$(idatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(idatadir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-iheaderHEADERS: $(iheader_HEADERS) @$(NORMAL_INSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iheaderdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iheaderdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(iheaderdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(iheaderdir)" || exit $$?; \ done uninstall-iheaderHEADERS: @$(NORMAL_UNINSTALL) @list='$(iheader_HEADERS)'; test -n "$(iheaderdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iheaderdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(SCRIPTS) $(DATA) $(HEADERS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cmakeconfigdir)" "$(DESTDIR)$(aclocaldir)" "$(DESTDIR)$(idatadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(iheaderdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) @IF_MAKE_I18N_FILES_FALSE@uninstall-local: @IF_MAKE_I18N_FILES_FALSE@install-data-local: clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-cmakeconfigDATA install-data-local \ install-dist_aclocalDATA install-idataDATA \ install-iheaderHEADERS install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-cmakeconfigDATA \ uninstall-dist_aclocalDATA uninstall-idataDATA \ uninstall-iheaderHEADERS uninstall-local \ uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) all check install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binSCRIPTS install-cmakeconfigDATA install-data \ install-data-am install-data-local install-dist_aclocalDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-idataDATA \ install-iheaderHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-pkgconfigDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binSCRIPTS uninstall-cmakeconfigDATA \ uninstall-dist_aclocalDATA uninstall-idataDATA \ uninstall-iheaderHEADERS uninstall-local \ uninstall-pkgconfigDATA aqbanking-config: aqbanking-config.in echo "#! /bin/sh" >aqbanking-config && \ echo 'dir="@prefix@"' >>aqbanking-config && \ cat aqbanking-config.in >>aqbanking-config && \ chmod a+x aqbanking-config listdoc.h: $(gwenhywfar_bindir)/mklistdoc -I $(gwenhywfar_headers) -v `find $(aqbanking_symlinkdir) -name '*.h' | LC_ALL=C sort ` >listdoc.h srcdoc: Doxyfile listdoc.h if test -d apidoc; then rm -Rf apidoc; fi mkdir -p apidoc/html/aqbanking-@AQBANKING_VERSION_RELEASE_STRING@ doxygen install-srcdoc: srcdoc test -d "$(DESTDIR)@docpath@/$(PACKAGE)" || \ mkdir -p "$(DESTDIR)@docpath@/$(PACKAGE)" for f in apidoc/html/aqbanking-@AQBANKING_VERSION_RELEASE_STRING@/*; do \ cp $$f "$(DESTDIR)@docpath@/$(PACKAGE)/"; \ done cp "apidoc/$(PACKAGE).tag" "$(DESTDIR)@docpath@/" if test -x "$(DESTDIR)@docpath@/$(PACKAGE)/installdox"; then \ cd "$(DESTDIR)@docpath@/$(PACKAGE)" && \ ID_OPT="-q" ; \ for ff in ${DOXYGEN_TAGFILES}; do \ ID_OPT="$$ID_OPT -l `basename $$ff`@../`basename $$ff | $(SED) -e s/.tag//`";\ done ;\ ( cd "$(DESTDIR)@docpath@/$(PACKAGE)" && \ ./installdox -q $$ID_OPT \ ); \ fi rpm: $(PACKAGE).spec dist rpmbuild="rpm" && \ if [ `rpm --version | awk '{ print $$3 }'` > /dev/null ]; then rpmbuild="rpmbuild"; fi && \ $$rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz setup: aqbanking.iss mkdir -p $(wintmpdir) for A in `find src/plugins -name *.la`; do \ grep -v relink_command $${A} > $${A}.tmp && \ mv $${A}.tmp $${A}; \ done $(MAKE) DESTDIR="`pwd`/$(wintmpdir)" \ aqbanking_pkgdatadir="/share/$(PACKAGE)" \ gwenhywfar_plugins="/gwen" \ WIN_PATH_WINDOWS_MINGW="/windows" \ install \ && for A in `find $(wintmpdir) -name '*.exe'`; do \ strip $${A}; \ done \ && $(ISCC) aqbanking.iss \ && rm -rf $(wintmpdir) # Current build rule: @IF_MAKE_I18N_FILES_TRUE@sources: @IF_MAKE_I18N_FILES_TRUE@ rm -f $(srcdir)/i18nsources $(srcdir)/dlgsources $(srcdir)/pdsources @IF_MAKE_I18N_FILES_TRUE@ $(MAKE) -C $(top_builddir)/src sources @IF_MAKE_I18N_FILES_TRUE@$(srcdir)/i18nsources $(srcdir)/dlgsources $(srcdir)/pdsources: @IF_MAKE_I18N_FILES_TRUE@ $(MAKE) sources @IF_MAKE_I18N_FILES_TRUE@po/$(PACKAGE).pot: i18nsources dlgsources pdsources $(I18NFILES) @IF_MAKE_I18N_FILES_TRUE@ rm -f po/tmp* @IF_MAKE_I18N_FILES_TRUE@ if test -n "$(I18NFILES)"; then \ @IF_MAKE_I18N_FILES_TRUE@ $(XGETTEXT) -C -c -ki18n -ktr2i18n -kI18N -kI18S\ @IF_MAKE_I18N_FILES_TRUE@ -kI18N_NOOP -ktranslate -kaliasLocale \ @IF_MAKE_I18N_FILES_TRUE@ -ktr -ktrUtf8 \ @IF_MAKE_I18N_FILES_TRUE@ '--msgid-bugs-address=aqbanking-user@lists.aqbanking.de' \ @IF_MAKE_I18N_FILES_TRUE@ -o po/tmppot \ @IF_MAKE_I18N_FILES_TRUE@ $(I18NFILES) ; \ @IF_MAKE_I18N_FILES_TRUE@ fi @IF_MAKE_I18N_FILES_TRUE@ for i in $(DLGFILES); do \ @IF_MAKE_I18N_FILES_TRUE@ po4a-gettextize -f xml -m $$i -p po/tmppot1 -o attributes=text && \ @IF_MAKE_I18N_FILES_TRUE@ msghack -o po/tmppot2 --append po/tmppot po/tmppot1 && \ @IF_MAKE_I18N_FILES_TRUE@ mv po/tmppot2 po/tmppot; \ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@ for i in $(PDFILES); do \ @IF_MAKE_I18N_FILES_TRUE@ po4a-gettextize -f xml -m $$i -p po/tmppot1 -o wrap \ @IF_MAKE_I18N_FILES_TRUE@ -o translated=" " \ @IF_MAKE_I18N_FILES_TRUE@ -o untranslated=" " \ @IF_MAKE_I18N_FILES_TRUE@ && \ @IF_MAKE_I18N_FILES_TRUE@ msghack -o po/tmppot2 --append po/tmppot po/tmppot1 && \ @IF_MAKE_I18N_FILES_TRUE@ mv po/tmppot2 po/tmppot; \ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@ mv po/tmppot po/$(PACKAGE).pot @IF_MAKE_I18N_FILES_TRUE@ rm -f po/tmppot1 # This rule is not called automatically. It is necessary only for # the translators, so translators only call this manually. @IF_MAKE_I18N_FILES_TRUE@merge: po/$(PACKAGE).pot @IF_MAKE_I18N_FILES_TRUE@ @catalogs=$(I18NLINGUAS); \ @IF_MAKE_I18N_FILES_TRUE@ for cat in $$catalogs; do \ @IF_MAKE_I18N_FILES_TRUE@ echo msgmerge -o $$cat.new $$cat ./po/$(PACKAGE).pot ; \ @IF_MAKE_I18N_FILES_TRUE@ msgmerge -o $$cat.new $$cat ./po/$(PACKAGE).pot ; \ @IF_MAKE_I18N_FILES_TRUE@ if test -s $$cat.new; then \ @IF_MAKE_I18N_FILES_TRUE@ grep -v "\"POT-Creation" $$cat.new | grep -v '^#' > $$cat.new.2 ; \ @IF_MAKE_I18N_FILES_TRUE@ grep -v "\"POT-Creation" $$cat | grep -v '^#' >> $$cat.new.1; \ @IF_MAKE_I18N_FILES_TRUE@ if diff $$cat.new.1 $$cat.new.2; then \ @IF_MAKE_I18N_FILES_TRUE@ echo " $$cat unchanged; leaving existing po file untouched."; \ @IF_MAKE_I18N_FILES_TRUE@ rm $$cat.new; \ @IF_MAKE_I18N_FILES_TRUE@ else \ @IF_MAKE_I18N_FILES_TRUE@ mv $$cat.new $$cat ; \ @IF_MAKE_I18N_FILES_TRUE@ fi; \ @IF_MAKE_I18N_FILES_TRUE@ rm -f $$cat.new.1 $$cat.new.2 ;\ @IF_MAKE_I18N_FILES_TRUE@ fi ;\ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@catalogs: $(I18NLINGUAS) @IF_MAKE_I18N_FILES_TRUE@ @for i in $(ALL_LINGUAS); do \ @IF_MAKE_I18N_FILES_TRUE@ filelingua=$(srcdir)/po/$$i.po; \ @IF_MAKE_I18N_FILES_TRUE@ filecat=$(top_builddir)/po/$$i.mo; \ @IF_MAKE_I18N_FILES_TRUE@ fileqm=$(top_builddir)/po/$$i.qm; \ @IF_MAKE_I18N_FILES_TRUE@ echo "Creating translation catalogs for language \"$$i\""; \ @IF_MAKE_I18N_FILES_TRUE@ $(MSGFMT) -o $${filecat} $${filelingua} || touch $${filelingua}; \ @IF_MAKE_I18N_FILES_TRUE@ if test $(MSGFMT_SUPPORTS_QT) = "yes"; then \ @IF_MAKE_I18N_FILES_TRUE@ $(MSGFMT) -o $${fileqm} --qt $${filelingua} || touch $${filelingua}; \ @IF_MAKE_I18N_FILES_TRUE@ else \ @IF_MAKE_I18N_FILES_TRUE@ echo "$(MSGFMT) does not have the option --qt; ignoring qt translations"; \ @IF_MAKE_I18N_FILES_TRUE@ fi; \ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@install-mo-catalogs: catalogs @IF_MAKE_I18N_FILES_TRUE@ @for i in $(ALL_LINGUAS); do \ @IF_MAKE_I18N_FILES_TRUE@ filecat=$(top_builddir)/po/$$i.mo; \ @IF_MAKE_I18N_FILES_TRUE@ fileqm=$(top_builddir)/po/$$i.qm; \ @IF_MAKE_I18N_FILES_TRUE@ echo "Installing translation catalog for language \"$$i\""; \ @IF_MAKE_I18N_FILES_TRUE@ $(mkinstalldirs) "$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES"; \ @IF_MAKE_I18N_FILES_TRUE@ $(INSTALL_DATA) $${filecat} $(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo; \ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@uninstall-mo-catalogs: @IF_MAKE_I18N_FILES_TRUE@ @$(NORMAL_UNINSTALL) @IF_MAKE_I18N_FILES_TRUE@ @for i in $(ALL_LINGUAS); do \ @IF_MAKE_I18N_FILES_TRUE@ echo " rm -f '$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo'"; \ @IF_MAKE_I18N_FILES_TRUE@ rm -f "$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo"; \ @IF_MAKE_I18N_FILES_TRUE@ done @IF_MAKE_I18N_FILES_TRUE@install-data-local: install-mo-catalogs @IF_MAKE_I18N_FILES_TRUE@uninstall-local: uninstall-mo-catalogs # Rule for only building the source rpm srpm: $(PACKAGE).spec dist rpmbuild="rpm" && \ if [ `rpm --version | awk '{ print $$3 }'` > /dev/null ]; then rpmbuild="rpmbuild"; fi && \ $$rpmbuild --nodeps -ts $(PACKAGE)-$(VERSION).tar.gz symlinks: mksymlinks.sh ${SHELL} mksymlinks.sh $(srcdir) $(builddir) sl-headers: mksymlinks.sh $(MAKE) -C src built_sources ${SHELL} mksymlinks.sh $(srcdir) $(builddir) # Call this to have Qt's uic files and glade files cleaned up from # bad elements code-cleanup: -admin/fixuifiles -admin/glade-fixup cppcheck: for f in `find . -name \*.c -o -name \*.cpp`; do cppcheck $$f; done ChangeLog: git log -n 100 --pretty="format:------------------------------------------------------------------%n%ai %an%n%s%n%b" >ChangeLog dist-hook: rm -f ChangeLog 2>/dev/null $(MAKE) ChangeLog # 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: aqbanking-5.6.4beta/aqbanking.iss.in0000644000175000017500000003036512364015477014336 00000000000000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Input configuration for the Inno Setup Compiler ; Copyright (c) 2005 Christian Stimming ; ; Inno Setup Compiler: See http://www.jrsoftware.org/isdl.php ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Setup] ; Using the name here directly because we want it capitalized AppName=AqBanking AppVerName=AqBanking @VERSION@ AppPublisher=AqBanking Development Team AppPublisherURL=http://sourceforge.net/projects/aqbanking AppSupportURL=http://sourceforge.net/support/getsupport.php?group_id=115695 AppUpdatesURL=http://sourceforge.net/project/showfiles.php?group_id=115695 Compression=lzma DefaultDirName={pf}\@PACKAGE@ DirExistsWarning=no InfoAfterFile=README LicenseFile=COPYING OutputBaseFilename=@PACKAGE@-@VERSION@-setup OutputDir=. UninstallFilesDir={app}\uninstall\@PACKAGE@ [Types] Name: "full"; Description: "{cm:FullInstall}" Name: "binary"; Description: "{cm:BinaryInstall}" Name: "custom"; Description: "{cm:CustomInstall}"; Flags: iscustom [Components] Name: "main"; Description: "{cm:MainFiles}"; Types: full binary custom; Flags: fixed Name: "devel"; Description: "{cm:DevelFiles}"; Types: full Name: "doc"; Description: "{cm:DocFiles}"; Types: full ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Here we configure the included files and the place of their ; installation ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Files] ; All main DLLs Source: "win32-tmp\usr\bin\*.dll"; DestDir: "{app}\bin"; Flags: sharedfile promptifolder replacesameversion; Components: main ; Everything from the lib directory, including all plugins Source: "win32-tmp\usr\lib\lib*.la"; DestDir: "{app}\lib"; Components: main Source: "win32-tmp\usr\lib\aqbanking\*"; DestDir: "{app}\lib\aqbanking"; Flags: recursesubdirs; Components: main ; The plugins that belong to gwenhywfar. Source: "win32-tmp\gwen\dbio\*"; DestDir: "{reg:HKLM\Software\Gwenhywfar\Paths,dbio-plugins|{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@}"; Flags: ignoreversion recursesubdirs; Components: main Source: "win32-tmp\gwen\crypttoken\*"; DestDir: "{reg:HKLM\Software\Gwenhywfar\Paths,plugindir|{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@}\crypttoken"; Flags: ignoreversion recursesubdirs; Components: main ; The commandline tools Source: "win32-tmp\usr\bin\*.exe"; DestDir: "{app}\bin"; Components: main ; The config-scripts. They are post-processed by the Pascal script below. Source: "@PACKAGE@-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\@PACKAGE@-config')) Source: "src\plugins\backends\aqhbci\aqhbci-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\aqhbci-config')) Source: "src\frontends\qbanking\lib\qbanking-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\qbanking-config')) ; The headers, and the aclocal macro. Source: "win32-tmp\usr\include\*"; DestDir: "{app}\include"; Flags: ignoreversion recursesubdirs; Components: devel Source: "win32-tmp\usr\share\*"; DestDir: "{app}\share"; Flags: ignoreversion recursesubdirs; Components: devel Source: "win32-tmp\share\*"; DestDir: "{app}\share"; Flags: ignoreversion recursesubdirs; Components: devel ; And all the documentation Source: "README"; DestDir: "{app}\doc\@PACKAGE@"; Components: doc Source: "NEWS"; DestDir: "{app}\doc\@PACKAGE@"; Components: doc Source: "COPYING"; DestDir: "{app}\doc\@PACKAGE@"; Components: doc Source: "AUTHORS"; DestDir: "{app}\doc\@PACKAGE@"; Components: doc Source: "ChangeLog"; DestDir: "{app}\doc\@PACKAGE@"; Components: doc ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Delete automatically created files on uninstall ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [UninstallDelete] Type: files; Name: "{app}\bin\*-config" ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Define the registry keys Setup should create (HKLM = HKEY_LOCAL_MACHINE) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Registry] Root: HKLM; Subkey: "Software\Aqbanking"; ValueType: none; Flags: uninsdeletekeyifempty Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: none; Flags: uninsdeletekeyifempty Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "prefix"; ValueData: "{app}"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "libdir"; ValueData: "{app}\lib"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "pkglibdir"; ValueData: "{app}\lib\@PACKAGE@"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "plugindir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "providerdir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\providers"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "bankinfodir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\bankinfo"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "imexporterdir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\imexporters"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "importerdir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\imexporters"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "pkgdatadir"; ValueData: "{app}\share\@PACKAGE@"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "sysconfdir"; ValueData: "{app}\etc"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "wizarddir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\wizards"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "localedir"; ValueData: "{app}\share\locale"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\AqBanking\Paths"; ValueType: string; ValueName: "xmldatadir"; ValueData: "{app}\share\aqhbci\xml"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\AqBanking\Paths"; ValueType: string; ValueName: "cfgmoduledir"; ValueData: "{app}\lib\@PACKAGE@\plugins\@AQBANKING_SO_EFFECTIVE@\frontends\qbanking\cfgmodules"; Flags: uninsdeletevalue ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This large section is a Pascal scripting program that will modify ; the aqbanking-config shell script so that it then includes the ; correct values according to our local installation. See ; http://www.remobjects.com/?ps for a syntax reference. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Code] function MingwBacksl(const S: String): String; begin { Modify the path name S so that it can be used by MinGW } if Length(ExtractFileDrive(S)) = 0 then Result := S else begin Result := '/'+S; StringChange(Result, ':\', '\'); end; StringChange(Result, '\', '/'); end; procedure MyAfterInstallConfig(FileName: String); var FileString, appdir, windir, bindir, includedir, plugindir, datadir, pkgdatadir: String; Res: Boolean; begin { Load the unchanged original file } Res := LoadStringFromFile(Format('%s.in.in',[FileName]), FileString); if Res = False then MsgBox('Error on loading '+FileName+'.in.in for final adaptation', mbInformation, MB_OK); { Insert the custom file header; #10 is the linefeed character } Insert('#!/bin/sh '#10'dir="@prefix'+'@"'#10, FileString, 0); { Get the installation-specific paths } windir := MingwBacksl(ExpandConstant('{win}')); appdir := MingwBacksl(ExpandConstant('{app}')); includedir := appdir + '/include'; bindir := appdir + '/bin'; plugindir := appdir + '/lib/@PACKAGE@/plugins/@AQBANKING_SO_EFFECTIVE@'; datadir := appdir + '/share'; pkgdatadir := datadir + '/@PACKAGE@'; { Now make all the replacements } { Explanation: StringChange(S,FromStr,ToStr): Change all occurances in S of FromStr to ToStr. } StringChange(FileString, '@'+'prefix@', appdir); StringChange(FileString, '@'+'libdir@', windir); StringChange(FileString, '@'+'all_includes@', '@all_includes@'); StringChange(FileString, '@'+'aqbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'aqbanking_ldflags@', '-L'+bindir); StringChange(FileString, '@'+'aqbanking_libs@', '@aqbanking_libs@'); StringChange(FileString, '@'+'aqbanking_plugindir@', plugindir); StringChange(FileString, '@'+'aqbanking_pkgdatadir@', pkgdatadir); StringChange(FileString, '@'+'AQBANKING_VERSION_MAJOR@', '@AQBANKING_VERSION_MAJOR@'); StringChange(FileString, '@'+'AQBANKING_VERSION_MINOR@', '@AQBANKING_VERSION_MINOR@'); StringChange(FileString, '@'+'AQBANKING_VERSION_PATCHLEVEL@', '@AQBANKING_VERSION_PATCHLEVEL@'); StringChange(FileString, '@'+'AQBANKING_VERSION_BUILD@', '@AQBANKING_VERSION_BUILD@'); StringChange(FileString, '@'+'AQBANKING_VERSION_TAG@', '@AQBANKING_VERSION_TAG@'); StringChange(FileString, '@'+'cbanking_libs@', '-L' + bindir + ' @cbanking_libs@'); StringChange(FileString, '@'+'cbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'qbanking_libs@', '-L' + bindir + ' @qbanking_libs@'); StringChange(FileString, '@'+'qbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'qbanking_data@', datadir + '/qbanking'); StringChange(FileString, '@'+'QBANKING_VERSION_MAJOR@', '@QBANKING_VERSION_MAJOR@'); StringChange(FileString, '@'+'QBANKING_VERSION_MINOR@', '@QBANKING_VERSION_MINOR@'); StringChange(FileString, '@'+'QBANKING_VERSION_PATCHLEVEL@', '@QBANKING_VERSION_PATCHLEVEL@'); StringChange(FileString, '@'+'QBANKING_VERSION_BUILD@', '@QBANKING_VERSION_BUILD@'); StringChange(FileString, '@'+'kbanking_libs@', '-L' + bindir + ' @kbanking_libs@'); StringChange(FileString, '@'+'kbanking_includes@', '-I'+includedir); { Save the final file } Res := SaveStringToFile(FileName, FileString, False); if Res = False then MsgBox('Error on saving '+FileName+' for final adaptation', mbInformation, MB_OK); end; function InitializeSetup(): Boolean; begin Result := Length(ExpandConstant('{reg:HKLM\Software\Gwenhywfar\Paths,prefix|a}')) > 1; if Result = False then MsgBox(ExpandConstant('{cm:PrereqNotFound}'), mbInformation, MB_OK); end; [Languages] Name: "en"; MessagesFile: "compiler:Default.isl" Name: "de"; MessagesFile: "compiler:Languages\German.isl" ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; These are only for improved text messages ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[Messages] ;; *** "Select Destination" wizard page ;SelectDirLabel3=Setup will install [name] into the following folder. If you have MinGW installed on your system, you can safely choose MinGW's root folder here as well (e.g. c:\msys\1.0). ; ;de.SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. Wenn Sie MinGW auf Ihrem Computer installiert haben, können Sie hier problemlos das Root-Verzeichnis von MinGW angeben (z.B. c:\msys\1.0). ; The customized messages with their translations here. [CustomMessages] ; *** Prerequisite message PrereqNotFound=The setup program did not find the DLL of the Gwenhywfar package and/or the registry keys of the Gwenhywfar installation. You need to install Gwenhywfar from the setup executable, and then start this setup again. de.PrereqNotFound=Das Setup-Programm hat die DLL des Gwenhywfar-Pakets und/oder dessen Registry-Keys nicht gefunden. Sie müssen zuerst Gwenhywfar über dessen Setup-Programm installieren und dann dieses Setup-Programm erneut starten. ; *** "Select Components" wizard page FullInstall=Full installation BinaryInstall=Install only libraries CustomInstall=Custom installation MainFiles=Aqbanking DLL Library DevelFiles=Development files DocFiles=Documentation files de.FullInstall=Komplett-Installation de.BinaryInstall=Nur Bibliotheken installieren de.CustomInstall=Benutzerdefiniert de.MainFiles=Aqbanking DLL Bibliothek de.DevelFiles=Entwickler-Dateien de.DocFiles=Dokumentations-Dateien aqbanking-5.6.4beta/version.h.in0000644000175000017500000000220212364015477013506 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_VERSION_H #define AQBANKING_VERSION_H #define AQBANKING_VERSION_MAJOR @AQBANKING_VERSION_MAJOR@ #define AQBANKING_VERSION_MINOR @AQBANKING_VERSION_MINOR@ #define AQBANKING_VERSION_PATCHLEVEL @AQBANKING_VERSION_PATCHLEVEL@ #define AQBANKING_VERSION_BUILD @AQBANKING_VERSION_BUILD@ #define AQBANKING_VERSION_TAG "@AQBANKING_VERSION_TAG@" #define AQBANKING_VERSION_FULL_STRING "@AQBANKING_VERSION_FULL_STRING@" #define AQBANKING_VERSION_STRING "@AQBANKING_VERSION_STRING@" #define AQBANKING_SO_CURRENT @AQBANKING_SO_CURRENT@ #define AQBANKING_SO_REVISION @AQBANKING_SO_REVISION@ #define AQBANKING_SO_AGE @AQBANKING_SO_AGE@ #define AQBANKING_SO_EFFECTIVE @AQBANKING_SO_EFFECTIVE@ #endif /* AQBANKING_VERSION_H */ aqbanking-5.6.4beta/config.sub0000755000175000017500000010535412201675101013224 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-08-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: aqbanking-5.6.4beta/ltmain.sh0000644000175000017500000105204412276417211013067 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 aqbanking-5.6.4beta/test-driver0000755000175000017500000001027712261335263013446 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aqbanking-5.6.4beta/aclocal.m40000644000175000017500000013541212643540053013106 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acx_compile_warn.m4]) m4_include([m4/as-scrub-include.m4]) m4_include([m4/distri.m4]) m4_include([m4/gwenhywfar.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/os.m4]) aqbanking-5.6.4beta/po/0000755000175000017500000000000012643540662011744 500000000000000aqbanking-5.6.4beta/po/Makefile.in0000644000175000017500000004320212643540054013725 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = po DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = de.po all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu po/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/po/de.po0000644000175000017500000061174012416502277012623 00000000000000# translation of de.po to deutsch # Markus Frisch, 2005. # Martin Preuss , 2005, 2007, 2008. # Martin Preuss , 2010, 2011. msgid "" msgstr "" "Project-Id-Version: aqbanking\n" "Report-Msgid-Bugs-To: aqbanking-user@lists.aqbanking.de\n" "POT-Creation-Date: 2013-03-11 21:50+0100\n" "PO-Revision-Date: 2014-09-21 17:32+0200\n" "Last-Translator: Mechtilde \n" "Language-Team: Deutsch \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.0\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Poedit-Basepath: /home/martin/projekte/c/aqbanking/aqbanking-git/" "aqbanking\n" #: src/libs/aqbanking/country.c:29 msgid "Albania" msgstr "Albanien" #: src/libs/aqbanking/country.c:29 msgid "Lek" msgstr "Lek" #: src/libs/aqbanking/country.c:30 msgid "Algeria" msgstr "Algerien" #: src/libs/aqbanking/country.c:30 msgid "Algerian Dinar" msgstr "Algerischer Dinar" #: src/libs/aqbanking/country.c:31 msgid "American Samoa" msgstr "Amerikanisch Samoa" #: src/libs/aqbanking/country.c:31 src/libs/aqbanking/country.c:108 #: src/libs/aqbanking/country.c:147 src/libs/aqbanking/country.c:153 #: src/libs/aqbanking/country.c:171 src/libs/aqbanking/country.c:173 #: src/libs/aqbanking/country.c:182 src/libs/aqbanking/country.c:223 #: src/libs/aqbanking/country.c:229 src/libs/aqbanking/country.c:230 #: src/libs/aqbanking/country.c:236 msgid "US Dollar" msgstr "US-Dollar" #: src/libs/aqbanking/country.c:32 msgid "Andorra" msgstr "Andorra" #: src/libs/aqbanking/country.c:32 src/libs/aqbanking/country.c:41 #: src/libs/aqbanking/country.c:46 src/libs/aqbanking/country.c:92 #: src/libs/aqbanking/country.c:93 src/libs/aqbanking/country.c:94 #: src/libs/aqbanking/country.c:95 src/libs/aqbanking/country.c:97 #: src/libs/aqbanking/country.c:100 src/libs/aqbanking/country.c:101 #: src/libs/aqbanking/country.c:104 src/libs/aqbanking/country.c:107 #: src/libs/aqbanking/country.c:120 src/libs/aqbanking/country.c:122 #: src/libs/aqbanking/country.c:139 src/libs/aqbanking/country.c:148 #: src/libs/aqbanking/country.c:151 src/libs/aqbanking/country.c:155 #: src/libs/aqbanking/country.c:162 src/libs/aqbanking/country.c:181 #: src/libs/aqbanking/country.c:190 src/libs/aqbanking/country.c:202 #: src/libs/aqbanking/country.c:205 msgid "Euro" msgstr "Euro" #: src/libs/aqbanking/country.c:33 msgid "Angola" msgstr "Angola" #: src/libs/aqbanking/country.c:33 msgid "New Kwanza " msgstr "Neuer Kwanza" #: src/libs/aqbanking/country.c:34 msgid "Anguilla" msgstr "Anguilla" #: src/libs/aqbanking/country.c:34 src/libs/aqbanking/country.c:36 #: src/libs/aqbanking/country.c:79 src/libs/aqbanking/country.c:106 #: src/libs/aqbanking/country.c:157 src/libs/aqbanking/country.c:186 #: src/libs/aqbanking/country.c:187 src/libs/aqbanking/country.c:188 msgid "East Caribbean Dollar" msgstr "Ostkaribischer Dollar" #: src/libs/aqbanking/country.c:35 msgid "Antarctica" msgstr "Antarktis" #: src/libs/aqbanking/country.c:35 src/libs/aqbanking/country.c:54 #: src/libs/aqbanking/country.c:172 src/libs/aqbanking/country.c:208 msgid "Norwegian Krone" msgstr "Norwegische Krone" #: src/libs/aqbanking/country.c:36 msgid "Antigua and Barbuda" msgstr "Antigua und Barbuda" #: src/libs/aqbanking/country.c:37 msgid "Argentina" msgstr "Argentinien" #: src/libs/aqbanking/country.c:37 msgid "Austral and Argenintinian Neuvo Peso " msgstr "Südlicher und Argentinischer Neuer Peso" #: src/libs/aqbanking/country.c:38 msgid "Armenia" msgstr "Armenien" #: src/libs/aqbanking/country.c:38 msgid "Dram " msgstr "Dram" #: src/libs/aqbanking/country.c:39 msgid "Aruba" msgstr "Aruba" #: src/libs/aqbanking/country.c:39 msgid "Aruban Guilder " msgstr "Aruba Florin" #: src/libs/aqbanking/country.c:40 msgid "Australia" msgstr "Australien" #: src/libs/aqbanking/country.c:40 src/libs/aqbanking/country.c:69 #: src/libs/aqbanking/country.c:70 src/libs/aqbanking/country.c:113 #: src/libs/aqbanking/country.c:127 src/libs/aqbanking/country.c:160 #: src/libs/aqbanking/country.c:170 src/libs/aqbanking/country.c:224 msgid "Australian Dollar" msgstr "Australischer Dollar" #: src/libs/aqbanking/country.c:41 msgid "Austria" msgstr "Österreich" #: src/libs/aqbanking/country.c:42 msgid "Azerbaijan" msgstr "Aserbaidschan" #: src/libs/aqbanking/country.c:42 msgid "Azerbaijani Manat " msgstr "Aserbaidschan-Manat" #: src/libs/aqbanking/country.c:43 msgid "Bahrain" msgstr "Bahrain" #: src/libs/aqbanking/country.c:43 msgid "Bahraini Dinar" msgstr "Bahrain Dinar" #: src/libs/aqbanking/country.c:44 msgid "Bangladesh" msgstr "Bangladesch" #: src/libs/aqbanking/country.c:44 msgid "Taka" msgstr "Taka" #: src/libs/aqbanking/country.c:45 msgid "Barbados" msgstr "Barbados" #: src/libs/aqbanking/country.c:45 msgid "Barbados Dollar" msgstr "Barbados Dollar" #: src/libs/aqbanking/country.c:46 msgid "Belgium" msgstr "Belgien" #: src/libs/aqbanking/country.c:47 msgid "Belize" msgstr "Belize" #: src/libs/aqbanking/country.c:47 msgid "Belize Dollar" msgstr "Belize Dollar" #: src/libs/aqbanking/country.c:48 msgid "Benin" msgstr "Benin" #: src/libs/aqbanking/country.c:48 src/libs/aqbanking/country.c:59 #: src/libs/aqbanking/country.c:61 src/libs/aqbanking/country.c:65 #: src/libs/aqbanking/country.c:66 src/libs/aqbanking/country.c:73 #: src/libs/aqbanking/country.c:216 msgid "Franc de la Communauté financière africaine" msgstr "Franc des afrikanischen Finanzverbundes" #: src/libs/aqbanking/country.c:49 msgid "Bermuda" msgstr "Bermuda" #: src/libs/aqbanking/country.c:49 msgid "Bermudian Dollar" msgstr "Bermuda Dollar" #: src/libs/aqbanking/country.c:50 msgid "Bhutan" msgstr "Bhutan" #: src/libs/aqbanking/country.c:50 msgid "Ngultrum " msgstr "Ngultrum" #: src/libs/aqbanking/country.c:51 msgid "Bolivia" msgstr "Bolivien" #: src/libs/aqbanking/country.c:51 msgid "Boliviano and Bolivian Peso" msgstr "Boliviano und Bolivien Peso" #: src/libs/aqbanking/country.c:52 msgid "Bosnia & Herzegowina" msgstr "Bosnien-Herzogowina" #: src/libs/aqbanking/country.c:52 msgid "Convertible Mark" msgstr "Tausch-Mark" #: src/libs/aqbanking/country.c:53 msgid "Botswana" msgstr "Botswana" #: src/libs/aqbanking/country.c:53 msgid "Pula" msgstr "Pula" #: src/libs/aqbanking/country.c:54 msgid "Bouvet Island" msgstr "Bouvet-Insel" #: src/libs/aqbanking/country.c:55 msgid "Brazil" msgstr "Brasilien" #: src/libs/aqbanking/country.c:55 msgid "Cruzeiro Real" msgstr "Cruzeiro·Real" #: src/libs/aqbanking/country.c:56 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #: src/libs/aqbanking/country.c:56 msgid "Pound Sterling " msgstr "Pfund Sterling" #: src/libs/aqbanking/country.c:57 msgid "Brunei Darussalam" msgstr "Brunei-Darussalam" #: src/libs/aqbanking/country.c:57 msgid "Brunei Dollar" msgstr "Brunei·Dollar" #: src/libs/aqbanking/country.c:58 msgid "Bulgaria" msgstr "Bulgarien" #: src/libs/aqbanking/country.c:58 msgid "Lev" msgstr "Lev" #: src/libs/aqbanking/country.c:59 msgid "Burkina Faso" msgstr "Burkina·Faso" #: src/libs/aqbanking/country.c:60 msgid "Burundi" msgstr "Burundi" #: src/libs/aqbanking/country.c:60 msgid "Burundi Franc" msgstr "Burundi-Franc" #: src/libs/aqbanking/country.c:61 msgid "Cameroon" msgstr "Kamerun" #: src/libs/aqbanking/country.c:62 msgid "Canada" msgstr "Kanada" #: src/libs/aqbanking/country.c:62 msgid "Canadian Dollar" msgstr "Kanadischer Dollar" #: src/libs/aqbanking/country.c:63 msgid "Cape Verde" msgstr "Kap Verde" #: src/libs/aqbanking/country.c:63 msgid "Escudo Caboverdiano" msgstr "Capverdischer Escudo" #: src/libs/aqbanking/country.c:64 msgid "Cayman Islands" msgstr "Cayman Inseln" #: src/libs/aqbanking/country.c:64 msgid "Cayman Islands Dollar" msgstr "Cayman Inseln Dollar" #: src/libs/aqbanking/country.c:65 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #: src/libs/aqbanking/country.c:66 msgid "Chad" msgstr "Tschad" #: src/libs/aqbanking/country.c:67 msgid "Chili" msgstr "Chile" #: src/libs/aqbanking/country.c:67 msgid "Unidades de Fomento and Chilean Peso" msgstr "Peso" #: src/libs/aqbanking/country.c:68 msgid "China" msgstr "China" #: src/libs/aqbanking/country.c:68 msgid "Yuan Renminbi" msgstr "Renminbi" #: src/libs/aqbanking/country.c:69 msgid "Christmas Island" msgstr "Weihnachtsinseln" #: src/libs/aqbanking/country.c:70 msgid "Cocos " msgstr "Cocos " #: src/libs/aqbanking/country.c:71 msgid "Colombia" msgstr "Kolumbien" #: src/libs/aqbanking/country.c:71 msgid "Colombian Peso" msgstr "Kolumbianischer Peso" #: src/libs/aqbanking/country.c:72 msgid "Comoros" msgstr "Komoren" #: src/libs/aqbanking/country.c:72 msgid "Comorian Franc" msgstr "Komoreanischer Franc" #: src/libs/aqbanking/country.c:73 msgid "Congo" msgstr "Kongo" #: src/libs/aqbanking/country.c:74 msgid "Cook Islands" msgstr "Cook Inseln" #: src/libs/aqbanking/country.c:74 src/libs/aqbanking/country.c:165 #: src/libs/aqbanking/country.c:169 src/libs/aqbanking/country.c:179 #: src/libs/aqbanking/country.c:217 msgid "New Zealand Dollar" msgstr "Neuseeländischer Dollar" #: src/libs/aqbanking/country.c:75 msgid "Costa Rica" msgstr "Costa Rica" #: src/libs/aqbanking/country.c:75 msgid "Costa Rican Colón" msgstr "Colón" #: src/libs/aqbanking/country.c:76 msgid "Cuba" msgstr "Kuba" #: src/libs/aqbanking/country.c:76 msgid "Cuban Peso" msgstr "Kubanischer Peso" #: src/libs/aqbanking/country.c:77 msgid "Cyprus" msgstr "Zypern" #: src/libs/aqbanking/country.c:77 msgid "Cypriot Pound" msgstr "Zyprisches Pfund" #: src/libs/aqbanking/country.c:78 msgid "Djibouti" msgstr "Dschibuti" #: src/libs/aqbanking/country.c:78 msgid "Djibouti Franc" msgstr "Dschibutischer Franc" #: src/libs/aqbanking/country.c:79 msgid "Dominica" msgstr "Dominica" #: src/libs/aqbanking/country.c:80 msgid "Dominican Republic" msgstr "Dominikanische Republik" #: src/libs/aqbanking/country.c:80 msgid "Dominican Republic Peso" msgstr "Peso der Dominikanischen Rebublik" #: src/libs/aqbanking/country.c:81 msgid "Ecuador" msgstr "Equador" #: src/libs/aqbanking/country.c:81 msgid "US Dollar " msgstr "US Dollar" #: src/libs/aqbanking/country.c:82 msgid "Egypt" msgstr "Ägypten" #: src/libs/aqbanking/country.c:82 msgid "Egytian Pound" msgstr "Ägyptisches Pfund" #: src/libs/aqbanking/country.c:83 msgid "El Salvador" msgstr "El·Salvador" #: src/libs/aqbanking/country.c:83 msgid "El Salvadorian Colón" msgstr "Colón Dollar" #: src/libs/aqbanking/country.c:84 msgid "Equatorial Guinea" msgstr "Äquatorialguinea" #: src/libs/aqbanking/country.c:84 msgid "Franc de la Communauté financière africaine and Ekwele" msgstr "CFA Franc" #: src/libs/aqbanking/country.c:85 msgid "Eritrea" msgstr "Eritrea" #: src/libs/aqbanking/country.c:85 msgid "Eritreian Nakfa, Ethiopian Birr" msgstr "Eritreischer Nakfa, Äthiopischer Birr" #: src/libs/aqbanking/country.c:86 msgid "Estonia" msgstr "Estland" #: src/libs/aqbanking/country.c:86 msgid "Kroon" msgstr "Estnische Krone" #: src/libs/aqbanking/country.c:87 msgid "Ethiopia" msgstr "Äthiopien" #: src/libs/aqbanking/country.c:87 msgid "Birr" msgstr "Birr" #: src/libs/aqbanking/country.c:88 msgid "European Community" msgstr "Europäische Gemeinschaft" #: src/libs/aqbanking/country.c:88 msgid "Euro " msgstr "Euro" #: src/libs/aqbanking/country.c:89 msgid "Falkland Islands" msgstr "Falklandinseln" #: src/libs/aqbanking/country.c:89 msgid "Falkland Pound" msgstr "Pfund der Falklandinseln" #: src/libs/aqbanking/country.c:90 msgid "Faroe Islands" msgstr "Faröer" #: src/libs/aqbanking/country.c:90 src/libs/aqbanking/country.c:105 msgid "Danish Krone" msgstr "Dänische Krone" #: src/libs/aqbanking/country.c:91 msgid "Fiji Islands" msgstr "Fidschi Inseln" #: src/libs/aqbanking/country.c:91 msgid "Fiji Dollar" msgstr "Fidschi-Dollar" #: src/libs/aqbanking/country.c:92 msgid "Finland" msgstr "Finnland" #: src/libs/aqbanking/country.c:93 msgid "France" msgstr "Frankreich" #: src/libs/aqbanking/country.c:94 msgid "France, Metropolitan" msgstr "Frankreich" #: src/libs/aqbanking/country.c:95 msgid "French Guiana" msgstr "Französich-Guiana" #: src/libs/aqbanking/country.c:96 msgid "French Polynesia" msgstr "Französisch-Polynesien" #: src/libs/aqbanking/country.c:96 src/libs/aqbanking/country.c:164 msgid "Franc des Comptoirs français du Pacifique" msgstr "CFP-Franc" #: src/libs/aqbanking/country.c:97 msgid "French Southern and Antarctic Territories" msgstr "Französiche Süd- und Antarktikgebiete" #: src/libs/aqbanking/country.c:98 msgid "Gambia" msgstr "Gambia" #: src/libs/aqbanking/country.c:98 msgid "Dalasi" msgstr "Dalasi" #: src/libs/aqbanking/country.c:99 msgid "Georgia" msgstr "Georgien" #: src/libs/aqbanking/country.c:99 msgid "Lari " msgstr "Lari" #: src/libs/aqbanking/country.c:100 src/libs/aqbanking/country.c:101 msgid "Germany " msgstr "Deutschland" #: src/libs/aqbanking/country.c:102 msgid "Ghana" msgstr "Ghana" #: src/libs/aqbanking/country.c:102 msgid "Cedi" msgstr "Cedi" #: src/libs/aqbanking/country.c:103 msgid "Gibraltar" msgstr "Gibraltar" #: src/libs/aqbanking/country.c:103 msgid "Gibraltar Pound" msgstr "Gibraltisches Pfund" #: src/libs/aqbanking/country.c:104 msgid "Greece" msgstr "Griechenland" #: src/libs/aqbanking/country.c:105 msgid "Greenland" msgstr "Grönland" #: src/libs/aqbanking/country.c:106 msgid "Grenada" msgstr "Grenada" #: src/libs/aqbanking/country.c:107 msgid "Guadeloupe" msgstr "Guadeloupe" #: src/libs/aqbanking/country.c:108 msgid "Guam" msgstr "Guam" #: src/libs/aqbanking/country.c:109 msgid "Guatemala" msgstr "Guatemala" #: src/libs/aqbanking/country.c:109 msgid "Quetzal" msgstr "Quetzal" #: src/libs/aqbanking/country.c:110 msgid "Guinea" msgstr "Guinea" #: src/libs/aqbanking/country.c:110 msgid "Guinea Syli" msgstr "Guinea Syli" #: src/libs/aqbanking/country.c:111 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #: src/libs/aqbanking/country.c:111 msgid "" "Guinea-Bissau Peso and Franc de la Communauté financière " "africaine" msgstr "Franc Guinéen" #: src/libs/aqbanking/country.c:112 msgid "Guyana" msgstr "Guyana" #: src/libs/aqbanking/country.c:112 msgid "Guyana Dollar" msgstr "Guyana-Dollar" #: src/libs/aqbanking/country.c:113 msgid "Heard and McDonald Islands" msgstr "Heard und Mc Donald-Inseln" #: src/libs/aqbanking/country.c:114 msgid "Honduras" msgstr "Honduras" #: src/libs/aqbanking/country.c:114 msgid "Lempira" msgstr "Lempira" #: src/libs/aqbanking/country.c:115 msgid "Hong Kong" msgstr "Hong·Kong" #: src/libs/aqbanking/country.c:115 msgid "Hong Kong Dollar" msgstr "Hong·Kong·Dollar" #: src/libs/aqbanking/country.c:116 msgid "Hungary" msgstr "Ungarn" #: src/libs/aqbanking/country.c:116 msgid "Forint" msgstr "Forint" #: src/libs/aqbanking/country.c:117 msgid "India" msgstr "Indien" #: src/libs/aqbanking/country.c:117 msgid "Indian Rupee" msgstr "Indische Rupie" #: src/libs/aqbanking/country.c:118 msgid "Iran, Islamic Republic of" msgstr "Iran, Islamische Republik" #: src/libs/aqbanking/country.c:118 msgid "Iranian Rial" msgstr "Iranischer Rial" #: src/libs/aqbanking/country.c:119 msgid "Iraq" msgstr "Irak" #: src/libs/aqbanking/country.c:119 msgid "Iraqi Dinar" msgstr "Irakischer Dinar" #: src/libs/aqbanking/country.c:120 msgid "Ireland" msgstr "Irland" #: src/libs/aqbanking/country.c:121 msgid "Israel" msgstr "Israel" #: src/libs/aqbanking/country.c:121 msgid "Shekel" msgstr "Schekel" #: src/libs/aqbanking/country.c:122 msgid "Italy" msgstr "Italien" #: src/libs/aqbanking/country.c:123 msgid "Japan" msgstr "Japan" #: src/libs/aqbanking/country.c:123 msgid "Yen" msgstr "Yen" #: src/libs/aqbanking/country.c:124 msgid "Jordan" msgstr "Jordanien" #: src/libs/aqbanking/country.c:124 msgid "Jordanian Dinar" msgstr "Jordanischer Dinar" #: src/libs/aqbanking/country.c:125 msgid "Kazakhstan" msgstr "Kasachstan" #: src/libs/aqbanking/country.c:125 msgid "Tenge " msgstr "Tenge " #: src/libs/aqbanking/country.c:126 msgid "Kenya" msgstr "Kenia" #: src/libs/aqbanking/country.c:126 msgid "Kenyan Shilling" msgstr "Kenianischer Schilling" #: src/libs/aqbanking/country.c:127 msgid "Kiribati" msgstr "Kiribati" #: src/libs/aqbanking/country.c:128 msgid "Korea, Democratic People's Republic of " msgstr "Korea, Volksrepublik" #: src/libs/aqbanking/country.c:128 msgid "North Korean Won" msgstr "Nordkoreanischer Won" #: src/libs/aqbanking/country.c:129 msgid "Korea, Republic of " msgstr "Korea, Republik" #: src/libs/aqbanking/country.c:129 msgid "South Korean Won" msgstr "Südkoreanischer Won" #: src/libs/aqbanking/country.c:130 msgid "Kuwait" msgstr "Kuwait" #: src/libs/aqbanking/country.c:130 msgid "Kuwaiti Dinar" msgstr "Kuwaitischer·Dinar" #: src/libs/aqbanking/country.c:131 msgid "Kyrgyzstan" msgstr "Kirgisien" #: src/libs/aqbanking/country.c:131 msgid "Kyrgyzstani Som" msgstr "Kirgisischer Som" #: src/libs/aqbanking/country.c:132 msgid "Latvia" msgstr "Lettland" #: src/libs/aqbanking/country.c:132 msgid "Lats" msgstr "Lats" #: src/libs/aqbanking/country.c:133 msgid "Lebanon" msgstr "Libanon" #: src/libs/aqbanking/country.c:133 msgid "Lebanese Pound" msgstr "Libanesisches Pfund" #: src/libs/aqbanking/country.c:134 msgid "Lesotho" msgstr "Lesotho" #: src/libs/aqbanking/country.c:134 msgid "Loti, Maloti and South African Rand" msgstr "Loti,·Maloti·und Südafrikanischer·Rand" #: src/libs/aqbanking/country.c:135 msgid "Liberia" msgstr "Liberia" #: src/libs/aqbanking/country.c:135 msgid "Liberian Dollar" msgstr "Liberischer Dollar" #: src/libs/aqbanking/country.c:136 msgid "Libyan Arab Jamahiriya" msgstr "Libyen" #: src/libs/aqbanking/country.c:136 msgid "Libyan Dinar" msgstr "Libyscher Dinar" #: src/libs/aqbanking/country.c:137 msgid "Liechtenstein" msgstr "Liechtenstein" #: src/libs/aqbanking/country.c:137 src/libs/aqbanking/country.c:211 msgid "Swiss Franc" msgstr "Schweizer Franken" #: src/libs/aqbanking/country.c:138 msgid "Lithuania" msgstr "Litauen" #: src/libs/aqbanking/country.c:138 msgid "Litas" msgstr "Litas" #: src/libs/aqbanking/country.c:139 msgid "Luxembourg" msgstr "Luxemburg" #: src/libs/aqbanking/country.c:140 msgid "Macedonia, the Former Yugoslav Republic of" msgstr "Mazedonien, ehm. Jogoslawische Republik" #: src/libs/aqbanking/country.c:140 msgid "Macedonian Dinar" msgstr "Mazedonischer Dinar" #: src/libs/aqbanking/country.c:141 msgid "Madagascar" msgstr "Madagaskar" #: src/libs/aqbanking/country.c:141 msgid "Malagasy Franc" msgstr "Madagaskar-Franc" #: src/libs/aqbanking/country.c:142 msgid "Malawi" msgstr "Malawi" #: src/libs/aqbanking/country.c:142 msgid "Malawian Kwacha" msgstr "Malawischer Kwacha" #: src/libs/aqbanking/country.c:143 msgid "Malaysia" msgstr "Malaysia" #: src/libs/aqbanking/country.c:143 msgid "Ringgit " msgstr "Ringgit " #: src/libs/aqbanking/country.c:144 msgid "Maldives" msgstr "Malediven" #: src/libs/aqbanking/country.c:144 msgid "Rufiyaa" msgstr "Malediven Rupie" #: src/libs/aqbanking/country.c:145 msgid "Mali" msgstr "Mali" #: src/libs/aqbanking/country.c:145 msgid "" "Franc de la Communauté financière africaine and Malian Franc" msgstr "CFA Franc" #: src/libs/aqbanking/country.c:146 msgid "Malta" msgstr "Malta" #: src/libs/aqbanking/country.c:146 msgid "Maltese Lira " msgstr "Malteser Lira" #: src/libs/aqbanking/country.c:147 msgid "Marshall Islands" msgstr "Marshallinseln" #: src/libs/aqbanking/country.c:148 msgid "Martinique" msgstr "Martinique" #: src/libs/aqbanking/country.c:149 msgid "Mauritania" msgstr "Mauritanien" #: src/libs/aqbanking/country.c:149 msgid "Ouguiya" msgstr "Ouguiya" #: src/libs/aqbanking/country.c:150 msgid "Mauritius" msgstr "Mauritius" #: src/libs/aqbanking/country.c:150 msgid "Mauritius Rupee" msgstr "Mauretanische Rupie" #: src/libs/aqbanking/country.c:151 msgid "Mayotte" msgstr "Mayotte" #: src/libs/aqbanking/country.c:152 msgid "Mexico" msgstr "Mexico" #: src/libs/aqbanking/country.c:152 msgid "Mexican New Peso " msgstr "Mexikanischer Neuer Peso" #: src/libs/aqbanking/country.c:153 msgid "Micronesia, Federated States of" msgstr "Mikronesien" #: src/libs/aqbanking/country.c:154 msgid "Moldova, Republic of" msgstr "Moldavien, Republik" #: src/libs/aqbanking/country.c:154 msgid "Moldovian Leu" msgstr "Moldavischer Leu" #: src/libs/aqbanking/country.c:155 msgid "Monaco" msgstr "Monaco" #: src/libs/aqbanking/country.c:156 msgid "Mongolia" msgstr "Mongolei" #: src/libs/aqbanking/country.c:156 msgid "Tugrik" msgstr "Tugrik" #: src/libs/aqbanking/country.c:157 msgid "Montserrat" msgstr "Montserrat" #: src/libs/aqbanking/country.c:158 msgid "Morocco" msgstr "Marokko" #: src/libs/aqbanking/country.c:158 msgid "Moroccan Dirham" msgstr "Marokkanischer Dirham" #: src/libs/aqbanking/country.c:159 msgid "Mozambique" msgstr "Mosambik" #: src/libs/aqbanking/country.c:159 msgid "Metical" msgstr "Metical" #: src/libs/aqbanking/country.c:160 msgid "Nauru" msgstr "Nauru" #: src/libs/aqbanking/country.c:161 msgid "Nepal" msgstr "Nepal" #: src/libs/aqbanking/country.c:161 msgid "Nepalese Rupee" msgstr "Nepalesische Rupie" #: src/libs/aqbanking/country.c:162 msgid "Netherlands" msgstr "Niederlande" #: src/libs/aqbanking/country.c:163 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #: src/libs/aqbanking/country.c:163 msgid "Netherlands Antilles Guilder " msgstr "Gulden der Nierderländischen Antillen" #: src/libs/aqbanking/country.c:164 msgid "New Caledonia" msgstr "Neukaledonien" #: src/libs/aqbanking/country.c:165 msgid "New Zealand" msgstr "Neuseeland" #: src/libs/aqbanking/country.c:166 msgid "Nicaragua" msgstr "Nikaragua" #: src/libs/aqbanking/country.c:166 msgid "Córdoba" msgstr "Córdoba" #: src/libs/aqbanking/country.c:167 msgid "Niger" msgstr "Niger" #: src/libs/aqbanking/country.c:167 src/libs/aqbanking/country.c:193 msgid "" "West African Franc and Franc de la Communauté financière " "africaine" msgstr "Westafrikanischer Franc" #: src/libs/aqbanking/country.c:168 msgid "Nigeria" msgstr "Nigeria" #: src/libs/aqbanking/country.c:168 msgid "Naira" msgstr "Naira" #: src/libs/aqbanking/country.c:169 msgid "Niue" msgstr "Niue" #: src/libs/aqbanking/country.c:170 msgid "Norfolk Island" msgstr "Norfolkinsel" #: src/libs/aqbanking/country.c:171 msgid "Northern Mariana Islands" msgstr "Nördliche Marianen-Inseln" #: src/libs/aqbanking/country.c:172 msgid "Norway" msgstr "Norwegen" #: src/libs/aqbanking/country.c:173 msgid "Palau" msgstr "Palau" #: src/libs/aqbanking/country.c:174 msgid "Panama" msgstr "Panama" #: src/libs/aqbanking/country.c:174 msgid "Balboa and US Dollar" msgstr "Balboa·und US Dollar" #: src/libs/aqbanking/country.c:175 msgid "Papua New Guinea" msgstr "Papua-Neuguinea" #: src/libs/aqbanking/country.c:175 msgid "Kina" msgstr "Kina" #: src/libs/aqbanking/country.c:176 msgid "Paraguay" msgstr "Paraguay" #: src/libs/aqbanking/country.c:176 msgid "Guarani" msgstr "Guarani" #: src/libs/aqbanking/country.c:177 msgid "Peru" msgstr "Peru" #: src/libs/aqbanking/country.c:177 msgid "Inti and New Sol " msgstr "Inti und Neuer Sol " #: src/libs/aqbanking/country.c:178 msgid "Philippines" msgstr "Philippinen" #: src/libs/aqbanking/country.c:178 msgid "Philippines Peso" msgstr "Philippinischer Peso" #: src/libs/aqbanking/country.c:179 msgid "Pitcairn Island" msgstr "Pitcairninseln" #: src/libs/aqbanking/country.c:180 msgid "Poland" msgstr "Polen" #: src/libs/aqbanking/country.c:180 msgid "New Zloty " msgstr "Neuer Sloty" #: src/libs/aqbanking/country.c:181 msgid "Portugal" msgstr "Portugal" #: src/libs/aqbanking/country.c:182 msgid "Puerto Rico" msgstr "Puerto·Rico" #: src/libs/aqbanking/country.c:183 msgid "Romania" msgstr "Rumänien" #: src/libs/aqbanking/country.c:183 msgid "Romanian Leu" msgstr "Rumänischer Leu" #: src/libs/aqbanking/country.c:184 msgid "Russian Federation" msgstr "Russische Förderation" #: src/libs/aqbanking/country.c:184 msgid "Russian Federation Rouble" msgstr "Rubel der Russischen Förderation" #: src/libs/aqbanking/country.c:185 msgid "Rwanda" msgstr "Ruanda" #: src/libs/aqbanking/country.c:185 msgid "Rwanda Franc" msgstr "Ruanda-Franc" #: src/libs/aqbanking/country.c:186 msgid "Saint Kitts " msgstr "St. Kitts und Nevis" #: src/libs/aqbanking/country.c:187 msgid "Saint Lucia" msgstr "St. Lucia" #: src/libs/aqbanking/country.c:188 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent/Grenadinen" #: src/libs/aqbanking/country.c:189 msgid "Samoa" msgstr "Samoa" #: src/libs/aqbanking/country.c:189 msgid "Tala" msgstr "Tala" #: src/libs/aqbanking/country.c:190 msgid "San Marino" msgstr "San·Marino" #: src/libs/aqbanking/country.c:191 msgid "São Tomé and Príncipe" msgstr "São Tomé and Príncipe" #: src/libs/aqbanking/country.c:191 msgid "Dobra" msgstr "Dobra" #: src/libs/aqbanking/country.c:192 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #: src/libs/aqbanking/country.c:192 msgid "Saudi Riyal" msgstr "Saudischer Rial" #: src/libs/aqbanking/country.c:193 msgid "Senegal" msgstr "Senegal" #: src/libs/aqbanking/country.c:194 msgid "Seychelles" msgstr "Seychellen" #: src/libs/aqbanking/country.c:194 msgid "Seychelles Rupee" msgstr "Seychellen-Rupie" #: src/libs/aqbanking/country.c:195 msgid "Sierra Leone" msgstr "Sierra·Leone" #: src/libs/aqbanking/country.c:195 msgid "Leone" msgstr "Leone" #: src/libs/aqbanking/country.c:196 msgid "Singapore" msgstr "Singapur" #: src/libs/aqbanking/country.c:196 msgid "Singapore Dollar" msgstr "Singapur-Dollar" #: src/libs/aqbanking/country.c:197 msgid "Slovenia" msgstr "Slowenien" #: src/libs/aqbanking/country.c:197 msgid "Tolar" msgstr "Tolar" #: src/libs/aqbanking/country.c:198 msgid "Solomon Islands" msgstr "Salomonen" #: src/libs/aqbanking/country.c:198 msgid "Solomon Islands Dollar" msgstr "Salomonen-Dollar" #: src/libs/aqbanking/country.c:199 msgid "Somalia" msgstr "Somalia" #: src/libs/aqbanking/country.c:199 msgid "Somali Shilling" msgstr "Somalischer Schilling" #: src/libs/aqbanking/country.c:200 msgid "South Africa" msgstr "Südafrika" #: src/libs/aqbanking/country.c:200 msgid "Rand" msgstr "Rand" #: src/libs/aqbanking/country.c:201 msgid "South Georgia and the South Sandwich Islands" msgstr "Süd-Georgien und südliche Sandwichinseln" #: src/libs/aqbanking/country.c:201 src/libs/aqbanking/country.c:228 msgid "Pound Sterling" msgstr "Pfund Sterling" #: src/libs/aqbanking/country.c:202 msgid "Spain" msgstr "Spanien" #: src/libs/aqbanking/country.c:203 msgid "Sri Lanka" msgstr "Sri·Lanka" #: src/libs/aqbanking/country.c:203 msgid "Sri Lankan Rupee" msgstr "Sri·Lanka-Rupie" #: src/libs/aqbanking/country.c:204 msgid "St Helena" msgstr "St.·Helena" #: src/libs/aqbanking/country.c:204 msgid "St Helena Pound" msgstr "St.-Helena-Pfund" #: src/libs/aqbanking/country.c:205 msgid "St Pierre and Miquelon" msgstr "St. Pierre und Miquelon" #: src/libs/aqbanking/country.c:206 msgid "Sudan" msgstr "Sudan" #: src/libs/aqbanking/country.c:206 msgid "Sudanese Pound and Sudanese Dinar" msgstr "Sudanesisches Pfund und -Dinar" #: src/libs/aqbanking/country.c:207 msgid "Suriname" msgstr "Surinam" #: src/libs/aqbanking/country.c:207 msgid "Surinam Guilder " msgstr "Surinam-Gulden" #: src/libs/aqbanking/country.c:208 msgid "Svalbard and Jan Mayen Islands" msgstr "Svalbard und Jan Mayen Insel" #: src/libs/aqbanking/country.c:209 msgid "Swaziland" msgstr "Swasiland" #: src/libs/aqbanking/country.c:209 msgid "Lilangeni" msgstr "Lilangeni" #: src/libs/aqbanking/country.c:210 msgid "Sweden" msgstr "Schweden" #: src/libs/aqbanking/country.c:210 msgid "Swedish Krona" msgstr "Schwedische Krone" #: src/libs/aqbanking/country.c:211 msgid "Switzerland" msgstr "Schweiz" #: src/libs/aqbanking/country.c:212 msgid "Syrian Arab Republic" msgstr "Syrische Arabische Republik" #: src/libs/aqbanking/country.c:212 msgid "Syrian Pound" msgstr "Syrisches Pfund" #: src/libs/aqbanking/country.c:213 msgid "Tajikistan" msgstr "Tadshikistan" #: src/libs/aqbanking/country.c:213 msgid "Tajik Rouble " msgstr "Tadshikischer Rubel" #: src/libs/aqbanking/country.c:214 msgid "Tanzania, United Republic of" msgstr "Tansania, Vereinigte Rebublik·" #: src/libs/aqbanking/country.c:214 msgid "Tanzanian Shilling" msgstr "Tansania-Schilling" #: src/libs/aqbanking/country.c:215 msgid "Thailand" msgstr "Thailand" #: src/libs/aqbanking/country.c:215 msgid "Baht" msgstr "Baht" #: src/libs/aqbanking/country.c:216 msgid "Togo" msgstr "Togo" #: src/libs/aqbanking/country.c:217 msgid "Tokelau" msgstr "Tokelau" #: src/libs/aqbanking/country.c:218 msgid "Tonga" msgstr "Tonga" #: src/libs/aqbanking/country.c:218 msgid "Pa'anga" msgstr "Pa'anga" #: src/libs/aqbanking/country.c:219 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #: src/libs/aqbanking/country.c:219 msgid "Trinidad and Tobago Dollar" msgstr "Trinidad- und Tobago-Dollar" #: src/libs/aqbanking/country.c:220 msgid "Tunisia" msgstr "Tunesien" #: src/libs/aqbanking/country.c:220 msgid "Tunisian Dinar" msgstr "Tunesischer Dinar" #: src/libs/aqbanking/country.c:221 msgid "Turkey" msgstr "Türkei" #: src/libs/aqbanking/country.c:221 msgid "Turkish Lira" msgstr "Türkische Lira" #: src/libs/aqbanking/country.c:222 msgid "Turkmenistan" msgstr "Turkmenistan" #: src/libs/aqbanking/country.c:222 msgid "Turkmenistani Manat" msgstr "Turkmenischer Manat" #: src/libs/aqbanking/country.c:223 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #: src/libs/aqbanking/country.c:224 msgid "Tuvalu" msgstr "Tuvalu" #: src/libs/aqbanking/country.c:225 msgid "Ukraine" msgstr "Ukraine" #: src/libs/aqbanking/country.c:225 msgid "Hryvna and Karbovanet" msgstr "Hryvna und Karbovanet" #: src/libs/aqbanking/country.c:226 msgid "Union of Soviet Socialist Republics" msgstr "UDSSR" #: src/libs/aqbanking/country.c:226 msgid "USSR Rouble" msgstr "UDSSR Rubel" #: src/libs/aqbanking/country.c:227 msgid "United Arab Emirates" msgstr "Vereinigte Arabische Emirate" #: src/libs/aqbanking/country.c:227 msgid "UAE Dirham" msgstr "Dirham der VAE" #: src/libs/aqbanking/country.c:228 msgid "United Kingdom" msgstr "Vereinigtes Königreich" #: src/libs/aqbanking/country.c:229 msgid "United States of America" msgstr "Vereinigte Staaten von Amerika" #: src/libs/aqbanking/country.c:230 msgid "United States Minor Outlying Islands" msgstr "Minor·Outlying·Islands, den USA zugehörig" #: src/libs/aqbanking/country.c:231 msgid "Uruguay" msgstr "Uruguay" #: src/libs/aqbanking/country.c:231 msgid "Uruguayan New Peso " msgstr "Uruguayischer Neuer Peso" #: src/libs/aqbanking/country.c:232 msgid "Uzbekistan" msgstr "Usbekistan" #: src/libs/aqbanking/country.c:232 msgid "Uzbekistani Som " msgstr "Usbekischer Som" #: src/libs/aqbanking/country.c:233 msgid "Venezuela" msgstr "Venezuela" #: src/libs/aqbanking/country.c:233 msgid "Bolivar" msgstr "Bolivar" #: src/libs/aqbanking/country.c:234 msgid "Viet Nam" msgstr "Vietnam" #: src/libs/aqbanking/country.c:234 msgid "Dông" msgstr "Dong" #: src/libs/aqbanking/country.c:235 src/libs/aqbanking/country.c:236 msgid "Virgin Islands " msgstr "Jungferninseln" #: src/libs/aqbanking/country.c:235 msgid "US Dollar " msgstr "US Dollar" #: src/libs/aqbanking/country.c:237 msgid "West Africa" msgstr "Westafrika" #: src/libs/aqbanking/country.c:237 msgid "West African Franc" msgstr "Westafrika Franc" #: src/libs/aqbanking/country.c:238 msgid "Western Sahara" msgstr "West-Sahara" #: src/libs/aqbanking/country.c:238 msgid "Moroccan Dirham and Mauritanian Ouguiya" msgstr "Marokkanischer Dirham und Mauretanischer Ouguiya" #: src/libs/aqbanking/country.c:239 msgid "Yugoslavia" msgstr "Jogoslawien" #: src/libs/aqbanking/country.c:239 msgid "New Dinar" msgstr "Neuer Dinar" #: src/libs/aqbanking/country.c:240 msgid "Zambia" msgstr "Sambia" #: src/libs/aqbanking/country.c:240 msgid "Zambian Kwacha" msgstr "Sambischer Kwacha" #: src/libs/aqbanking/country.c:241 msgid "Zimbabwe" msgstr "Simbabwe" #: src/libs/aqbanking/country.c:241 msgid "Zimbabwe Dollar" msgstr "Simbabwe Dollar" #: src/libs/aqbanking/job.c:275 msgid "Get Balance" msgstr "Saldoabruf" #: src/libs/aqbanking/job.c:276 msgid "Get Transactions" msgstr "Umsatzabruf" #: src/libs/aqbanking/job.c:277 #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:225 msgid "Transfer" msgstr "Überweisung" #: src/libs/aqbanking/job.c:278 msgid "Debit Note" msgstr "Lastschrift" #: src/libs/aqbanking/job.c:279 msgid "EU Transfer" msgstr "EU Überweisung" #: src/libs/aqbanking/job.c:280 msgid "Get Standing Orders" msgstr "Daueraufträge abrufen" #: src/libs/aqbanking/job.c:281 msgid "Get Dated Transfers" msgstr "Terminierte Überweisungen abrufen" #: src/libs/aqbanking/job.c:282 msgid "Create Standing Order" msgstr "Dauerauftrag erstellen" #: src/libs/aqbanking/job.c:283 msgid "Modify Standing Order" msgstr "Dauerauftrag ändern" #: src/libs/aqbanking/job.c:284 msgid "Delete Standing Order" msgstr "Dauerauftrag löschen" #: src/libs/aqbanking/job.c:285 msgid "Create Dated Transfer" msgstr "Terminierte Überweisung erstellen" #: src/libs/aqbanking/job.c:286 msgid "Modify Dated Transfer" msgstr "Terminierte Überweisung ändern" #: src/libs/aqbanking/job.c:287 msgid "Delete Dated Transfer" msgstr "Terminierte Überweisung löschen" #: src/libs/aqbanking/job.c:288 msgid "Internal Transfer" msgstr "Interne Umbuchung" #: src/libs/aqbanking/job.c:289 msgid "Load Cellphone" msgstr "Handy aufladen" #: src/libs/aqbanking/job.c:290 msgid "SEPA Transfer" msgstr "SEPA Überweisung" #: src/libs/aqbanking/job.c:291 msgid "SEPA Debit Note" msgstr "SEPA-Lastschrift" #: src/libs/aqbanking/job.c:293 #: src/libs/aqbanking/dialogs/dlg_editaccount.c:590 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_ddv.c:773 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_ddv.c:1080 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c:761 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c:1088 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c:762 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c:1102 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c:765 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c:1104 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c:775 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c:1114 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c:786 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c:1126 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_pintan.c:497 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_pintan.c:684 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:592 msgid "unknown" msgstr "unbekannt" #: src/libs/aqbanking/banking_online.c:180 #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2098 msgid "Executing Jobs" msgstr "Aufträge werden ausgeführt" #: src/libs/aqbanking/banking_online.c:181 #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2099 msgid "Now the jobs are send via their backends to the credit institutes." msgstr "" "Die Aufträge werden durch die zuständigen Module zu den Kreditinstituten " "gesendet." #: src/libs/aqbanking/banking_online.c:186 msgid "Sending jobs to the bank(s)" msgstr "Sende Aufträge an die Bank(en)" #: src/libs/aqbanking/banking_online.c:195 msgid "Postprocessing jobs" msgstr "Nachbehandlung der Aufträge" #: src/libs/aqbanking/banking_online.c:232 msgid "Resetting provider queues" msgstr "Module zurücksetzen" #: src/libs/aqbanking/banking_online.c:821 #, c-format msgid "Could not init HTTP session (%d)" msgstr "Die HTTP-Sitzung konnte nicht initialisiert werden (%d)" #: src/libs/aqbanking/banking_online.c:831 #, c-format msgid "Could not connect to server, giving up (%d)" msgstr "Konnte keine Verbindung zum Server herstellen, Abbruch (%d)" #: src/libs/aqbanking/banking_online.c:842 msgid "Connection ok, certificate probably received" msgstr "Verbindung ok, Zertifikat vermutlich empfangen" #: src/libs/aqbanking/dialogs/dlg_importer.c:202 msgid "File Import Wizard" msgstr "Import-Assistent" #: src/libs/aqbanking/dialogs/dlg_importer.c:214 msgid "" "

This dialog assists you in importing files.The following steps are:" "

  • select file to import
  • select importer module
  • select importer profile
This dialog assists you in " "importing files.\n" "The following steps are:\n" "- select file to import\n" "- select importer module\n" "- select importer profile\n" msgstr "" "

Dieser Dialog unterstützt Sie beim Import von Dateien.Die folgenden " "Schritte sind:

  • Auswahl der zu importierenden Datei
  • Auswahl des Importer-Modules
  • Auswahl des zu verwendenden " "Importer-Profiles
Dieser Dialog unterstützt Sie beim Import " "von Dateien.\n" "Die folgenden Schritte sind:\n" "- Auswahl der zu importierenden Datei \n" "- Auswahl des Importer-Modules\n" "- Auswahl des zu verwendenden Importer-Profiles\n" #: src/libs/aqbanking/dialogs/dlg_importer.c:235 msgid "Please select the file to import." msgstr "Bitte wählen Sie die zu importierende Datei aus." #: src/libs/aqbanking/dialogs/dlg_importer.c:243 msgid "Please select the import module for the file." msgstr "Bitte wählen Sie das zum Dateiformat passende Modul aus." #: src/libs/aqbanking/dialogs/dlg_importer.c:249 #: src/libs/aqbanking/dialogs/dlg_importer.c:269 msgid "Name\tDescription" msgstr "Name\tBeschreibung" #: src/libs/aqbanking/dialogs/dlg_importer.c:263 msgid "Please select the import profile for the file." msgstr "Bitte wählen Sie das zu verwendende Profil aus." #: src/libs/aqbanking/dialogs/dlg_importer.c:291 msgid "The file has been successfully imported." msgstr "Die Datei wurde erfolgreich importiert." #: src/libs/aqbanking/dialogs/dlg_importer.c:749 #: src/libs/aqbanking/dialogs/dlg_setup_newuser.c:369 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:718 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:720 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:690 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:843 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:882 msgid "Next" msgstr "Weiter" #: src/libs/aqbanking/dialogs/dlg_importer.c:777 msgid "Finished" msgstr "Abgeschlossen" #: src/libs/aqbanking/dialogs/dlg_importer.c:1046 msgid "Select File to Import" msgstr "Zu importierende Datei auswählen" #: src/libs/aqbanking/dialogs/dlg_importer.c:1049 msgid "All Files (*)\tCSV Files (*csv;*.CSV)\t*.sta" msgstr "Alle Dateien (*)\tCSV-Dateien (*.csv;*.CSV)\t*.sta" #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.c:378 #: src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.c:244 msgid "Select a Bank" msgstr "Wählen Sie eine Bank" #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.c:385 msgid "Bank Code\tBIC\tName\tLocation\tProtocols" msgstr "BLZ\tBIC\tName\tOrt\tProtokolle" #: src/libs/aqbanking/dialogs/dlg_setup.c:430 msgid "AqBanking Setup" msgstr "AqBanking-Einrichtung" #: src/libs/aqbanking/dialogs/dlg_setup.c:438 msgid "Id\tBank Code\tUser Id\tCustomer Id\tUser Name\tModule" msgstr "Id\tBankleitzahl\tBenutzerkennung\tKundenkennung\tBenutzername\tModul" #: src/libs/aqbanking/dialogs/dlg_setup.c:452 msgid "" "Id\tBank Code\tBank Name\tAccount Number\tAccount Name\tOwner Name\tModule" msgstr "Id\tBLZ\tBankname\tKontonummer\tKontoname\tKontoinhaber\tModul" #: src/libs/aqbanking/dialogs/dlg_setup.c:776 #, c-format msgid "" "

Do you really want to delete the user %s?Do you " "really want to delete the user \"%s\"?" msgstr "" "

Wollen Sie den Benutzer %s wirklich löschen?Wollen " "Sie den Benutzer \"%s\" wirklich löschen?" #: src/libs/aqbanking/dialogs/dlg_setup.c:785 msgid "Delete User" msgstr "Benutzer entfernen" #: src/libs/aqbanking/dialogs/dlg_setup.c:787 #: src/libs/aqbanking/dialogs/dlg_setup.c:809 #: src/libs/aqbanking/dialogs/dlg_setup.c:1025 msgid "Yes" msgstr "Ja" #: src/libs/aqbanking/dialogs/dlg_setup.c:788 #: src/libs/aqbanking/dialogs/dlg_setup.c:810 #: src/libs/aqbanking/dialogs/dlg_setup.c:1026 msgid "No" msgstr "Nein" #: src/libs/aqbanking/dialogs/dlg_setup.c:802 #: src/libs/aqbanking/dialogs/dlg_setup.c:822 #: src/libs/aqbanking/dialogs/dlg_setup.c:833 #: src/libs/aqbanking/dialogs/dlg_setup.c:1036 #: src/libs/aqbanking/dialogs/dlg_editaccount.c:893 #: src/libs/aqbanking/dialogs/dlg_editaccount.c:914 #: src/libs/aqbanking/dialogs/dlg_edituser.c:449 #: src/libs/aqbanking/dialogs/dlg_edituser.c:470 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:421 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:476 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:497 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:587 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:651 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:706 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:727 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:487 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:542 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:563 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:101 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:112 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:757 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:764 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:799 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:936 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:1039 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:84 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:810 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:819 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:848 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:857 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:875 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:887 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:907 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1114 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1243 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:658 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:678 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:701 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:720 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:769 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:889 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:911 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:950 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1111 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1240 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:914 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:935 msgid "Error" msgstr "Fehler" #: src/libs/aqbanking/dialogs/dlg_setup.c:803 msgid "" "

There is at least one account assigned to the selected user.

Do you want to remove the account(s) and continue removing the user?There is at least one account assigned to the selected user.\n" "Do you want to remove the account(s) and continue removing the user?" msgstr "" "

Dem gewählten Benutzer ist mindestens ein Konto zugeordnet.

" "Wollen Sie die zugeordneten Konten löschen und anschließend den Benutzer " "entfernen?

Dem gewählten Benutzer ist mindestens ein Konto " "zugeordnet.

Wollen Sie die zugeordneten Konten löschen und anschließend " "den Benutzer entfernen?" #: src/libs/aqbanking/dialogs/dlg_setup.c:822 #, c-format msgid "Error deleting account: %d (%d deleted)" msgstr "Fehler beim Löschen eines Kontos: %d (%d bereits entfernt)" #: src/libs/aqbanking/dialogs/dlg_setup.c:833 #, c-format msgid "Error deleting user: %d" msgstr "Fehler beim Entfernen des Benutzers: %d" #: src/libs/aqbanking/dialogs/dlg_setup.c:906 msgid "" "Please select the online banking backend the new account is to be created " "for." msgstr "" "Bitte wählen Sie das Onlinebanking-Protokoll welches Sie mit dem neuen Konto " "verwenden wollen." #: src/libs/aqbanking/dialogs/dlg_setup.c:1014 #, c-format msgid "" "

Do you really want to delete the account %s?Do you " "really want to delete the account \"%s\"?" msgstr "" "

Wollen Sie das Konto %s entfernen?Wollen Sie das " "Konto \"%s\" entfernen?" #: src/libs/aqbanking/dialogs/dlg_setup.c:1023 msgid "Delete Account" msgstr "Konto entfernen" #: src/libs/aqbanking/dialogs/dlg_setup.c:1036 #, c-format msgid "Error deleting account: %d" msgstr "Fehler beim Entfernen des Kontos: %d" #: src/libs/aqbanking/dialogs/dlg_selectbackend.c:269 msgid "Select Backend" msgstr "Wählen Sie Banking-Modul (Backend)" #: src/libs/aqbanking/dialogs/dlg_selectbackend.c:284 msgid "Select a backend." msgstr "Wählen Sie Banking-Modul (Backend)" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:359 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:249 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:360 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:538 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:606 msgid "-- select --" msgstr "-- auswählen --" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:440 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:442 msgid "Edit Account" msgstr "Konto bearbeiten" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:593 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:595 msgid "Bank Account" msgstr "Girokonto" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:596 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:598 msgid "Credit Card Account" msgstr "Kreditkarte" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:599 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:601 msgid "Checking Account" msgstr "Scheckkonto" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:602 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:604 msgid "Savings Account" msgstr "Sparkonto" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:605 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:607 msgid "Investment Account" msgstr "Investmentkonto" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:608 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:610 msgid "Cash Account" msgstr "Bargeld" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:611 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:613 msgid "Moneymarket Account" msgstr "Geldmarktkonto" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:894 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:915 msgid "Unable to lock account. Maybe already in use?" msgstr "" "Es konnte kein exklusiver Zugriff auf das Konto erreicht werden. Eventuell " "ist das Konto bereits in Benutzung?" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:895 #: src/libs/aqbanking/dialogs/dlg_editaccount.c:916 #: src/libs/aqbanking/dialogs/dlg_edituser.c:451 #: src/libs/aqbanking/dialogs/dlg_edituser.c:472 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:478 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:499 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:708 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:729 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:544 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:565 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:916 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:937 msgid "Dismiss" msgstr "Schließen" #: src/libs/aqbanking/dialogs/dlg_editaccount.c:915 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.c:936 msgid "Unable to unlock account." msgstr "Exklusiver Zugriff auf das Konto konnte nicht freigegeben werden." #: src/libs/aqbanking/dialogs/dlg_edituser.c:178 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:182 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:307 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:183 msgid "Edit User" msgstr "Benutzer bearbeiten" #: src/libs/aqbanking/dialogs/dlg_edituser.c:450 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:477 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:707 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:543 msgid "Unable to lock user. Maybe already in use?" msgstr "" "Es konnte kein exklusiver Zugriff auf den Benutzer erreicht werden. " "Eventuell ist er schon in Benutzung?" #: src/libs/aqbanking/dialogs/dlg_edituser.c:471 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:498 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:728 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:564 msgid "Unable to unlock user." msgstr "Exklusiver Zugriff auf den Benutzer konnte nicht freigegeben werden." #: src/libs/aqbanking/dialogs/dlg_setup_newuser.c:255 msgid "New User Wizard" msgstr "Assistent für neue Benutzer" #: src/libs/aqbanking/dialogs/dlg_setup_newuser.c:266 msgid "" "

This dialog assists you in creating an online banking user.The " "following steps are:

  • select the banking protocol
  • select " "the type of user to create
This dialog assists you in " "creating an online banking user.\n" "The following steps are:\n" " - select the banking protocol\n" " - select the type of user to create\n" msgstr "" "

Dieser Dialog unterstützt Sie bei der Einrichtung eines " "Onlinebanking-Benutzers. Die folgenden Schritte werden durchgeführt:

" "
  • Auswahl des Onlinebanking-Protokolles
  • Auswahl des " "Benutzertyps (Chipkarte, Schlüsseldatei etc)
Dieser Dialog " "unterstützt Sie bei der Einrichtung eines Onlinebanking-Benutzers.\n" "Die folgenden Schritte werden durchgeführt:\n" "- Auswahl des Onlinebanking-Protokolles\n" "- Auswahl des Benutzertyps (Chipkarte, Schlüsseldatei etc)\n" #: src/libs/aqbanking/dialogs/dlg_setup_newuser.c:378 msgid "Run" msgstr "Ausführen" #: src/libs/aqbanking/dialogs/dlg_usertype_pagedefault.c:80 msgid "" "

Click on the run button below to create the user.

Click on the RUN button below to create the user." msgstr "" "

Klicken Sie auf Ausführen um den Benutzer anzulegen.

Klicken Sie auf AUSFÜHREN um den Benutzer anzulegen." #: src/plugins/parsers/swift/swift.c:897 msgid "Empty SWIFT file, aborting" msgstr "Leeres SWIFT-Dokument, abgebrochen" #: src/plugins/parsers/swift/swift.c:917 #, c-format msgid "Reading SWIFT document %d" msgstr "Lese SWIFT Dokument %d" #: src/plugins/parsers/swift/swift.c:949 msgid "Parsing SWIFT data" msgstr "Analysiere SWIFT Daten" #: src/plugins/parsers/swift/swift.c:954 msgid "Error parsing SWIFT data" msgstr "Fehler bei der Analyse der SWIFT-Daten" #: src/plugins/parsers/swift/swift.c:965 msgid "Empty SWIFT document, aborting" msgstr "Leeres SWIFT-Dokument, abgebrochen" #: src/plugins/parsers/swift/swift.c:975 msgid "Importing SWIFT data" msgstr "Importieren SWIFT-Daten" #: src/plugins/parsers/swift/swift.c:980 msgid "Error importing SWIFT data" msgstr "Fehler beim Importieren der SWIFT-Daten" #: src/plugins/parsers/swift/swift.c:986 msgid "Swift document successfully imported" msgstr "SWIFT-Dokument erfolgreich importiert" #: src/plugins/parsers/swift/swift940.c:1125 msgid "Importing SWIFT tags..." msgstr "Importiere SWIFT-Elemente..." #: src/plugins/parsers/swift/swift940.c:1298 #: src/plugins/imexporters/csv/csv.c:464 #: src/plugins/imexporters/swift/swift.c:242 msgid "Aborted by user" msgstr "Die Aktion wurde durch den Benutzer abgebrochen." #: src/plugins/imexporters/csv/csv.c:115 #: src/plugins/imexporters/eri2/eri2.c:206 #: src/plugins/imexporters/openhbci1/openhbci1.c:112 #: src/plugins/imexporters/ctxfile/ctxfile.c:95 msgid "Data imported, transforming to UTF-8" msgstr "Daten werden importiert. Konvertierung auf UTF-8" #: src/plugins/imexporters/csv/csv.c:223 #: src/plugins/imexporters/swift/swift.c:140 msgid "Importing parsed data..." msgstr "Buchungen importieren..." #: src/plugins/imexporters/csv/csv_editprofile.c:59 msgid "Tabulator (default)" msgstr "Tabulator (Standard)" #: src/plugins/imexporters/csv/csv_editprofile.c:60 msgid "Space" msgstr "Leerzeichen" #: src/plugins/imexporters/csv/csv_editprofile.c:61 msgid "Komma (,)" msgstr "Komma (,)" #: src/plugins/imexporters/csv/csv_editprofile.c:62 msgid "Semicolon (;)" msgstr "Semikolon (;)" #: src/plugins/imexporters/csv/csv_editprofile.c:63 msgid "Colon (:)" msgstr "Doppelpunkt (:)" #: src/plugins/imexporters/csv/csv_editprofile.c:69 msgid "Booked Transactions (default)" msgstr "Gebuchte Umsätze (standard)" #: src/plugins/imexporters/csv/csv_editprofile.c:70 msgid "Noted Transactions" msgstr "Vorgemerkte Umsätze" #: src/plugins/imexporters/csv/csv_editprofile.c:77 msgid "Rational (default)" msgstr "Rationale Zahl (Standard)" #: src/plugins/imexporters/csv/csv_editprofile.c:78 msgid "Float" msgstr "Fließkommazahl" #: src/plugins/imexporters/csv/csv_editprofile.c:84 msgid "-- empty --" msgstr "-- frei --" #: src/plugins/imexporters/csv/csv_editprofile.c:85 msgid "Local Country Code" msgstr "Eigener Ländercode" #: src/plugins/imexporters/csv/csv_editprofile.c:86 msgid "Local Bank Code" msgstr "Bankleitzahl (BLZ)" #: src/plugins/imexporters/csv/csv_editprofile.c:87 msgid "Local Branch Id" msgstr "Eigene Branchenkennung" #: src/plugins/imexporters/csv/csv_editprofile.c:88 msgid "Local Account Number" msgstr "Eigene Kontonummer" #: src/plugins/imexporters/csv/csv_editprofile.c:89 msgid "Local Account Suffix" msgstr "Eigenes Unterkontomerkmal" #: src/plugins/imexporters/csv/csv_editprofile.c:90 msgid "Local IBAN" msgstr "Eigene IBAN" #: src/plugins/imexporters/csv/csv_editprofile.c:91 msgid "Local Name (e.g. your name)" msgstr "Eigener Name" #: src/plugins/imexporters/csv/csv_editprofile.c:92 msgid "Local BIC" msgstr "Eigene BIC" #: src/plugins/imexporters/csv/csv_editprofile.c:93 msgid "Remote Country Code" msgstr "Staat des Zahlungspartners" #: src/plugins/imexporters/csv/csv_editprofile.c:94 msgid "Remote Bank Code" msgstr "Bankleitzahl des Zahlungspartners" #: src/plugins/imexporters/csv/csv_editprofile.c:95 msgid "Remote Branch Id" msgstr "Fremde Branchenkennung" #: src/plugins/imexporters/csv/csv_editprofile.c:96 msgid "Remote Account Number" msgstr "Kontonummer des Zahlungspartners" #: src/plugins/imexporters/csv/csv_editprofile.c:97 msgid "Remote Account Suffix" msgstr "Unterkontomerkmal des Zahlungspartners" #: src/plugins/imexporters/csv/csv_editprofile.c:98 msgid "Remote IBAN" msgstr "Fremde IBAN" #: src/plugins/imexporters/csv/csv_editprofile.c:99 msgid "Remote Name (First Line)" msgstr "Fremder Name (erste Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:100 msgid "Remote Name (Second Line)" msgstr "Fremder Name (zweite Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:101 msgid "Remote BIC" msgstr "BIC des Zahlungspartners" #: src/plugins/imexporters/csv/csv_editprofile.c:102 msgid "Unique Transaction Id" msgstr "Eindeutige Umsatz-ID" #: src/plugins/imexporters/csv/csv_editprofile.c:103 msgid "Id assigned by Application" msgstr "durch Anwendung zugewiesene Id" #. "groupId", I18S("Group Id"), #: src/plugins/imexporters/csv/csv_editprofile.c:105 msgid "Valuta Date" msgstr "Datum der Wertstellung" #: src/plugins/imexporters/csv/csv_editprofile.c:106 msgid "Booking Date" msgstr "Buchungsdatum" #: src/plugins/imexporters/csv/csv_editprofile.c:107 msgid "Amount (Value)" msgstr "Betrag (Wert)" #: src/plugins/imexporters/csv/csv_editprofile.c:108 msgid "Amount (Currency)" msgstr "Betrag (Währung)" #: src/plugins/imexporters/csv/csv_editprofile.c:109 msgid "Fees (Amount)" msgstr "Gebühren (Betrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:110 msgid "Fees (Currency)" msgstr "Gebühren (Währung)" #: src/plugins/imexporters/csv/csv_editprofile.c:111 msgid "Textkey" msgstr "Textschlüssel" #: src/plugins/imexporters/csv/csv_editprofile.c:112 msgid "Textkey Extensions" msgstr "Textschlüsselerweiterung" #: src/plugins/imexporters/csv/csv_editprofile.c:113 msgid "Transaction Key" msgstr "Textschlüsselergänzung" #: src/plugins/imexporters/csv/csv_editprofile.c:114 msgid "Customer Reference" msgstr "Kundenreferenz" #: src/plugins/imexporters/csv/csv_editprofile.c:115 msgid "Bank Reference" msgstr "Bankreferenz" #: src/plugins/imexporters/csv/csv_editprofile.c:116 msgid "Transaction Code" msgstr "Transaktionskode" #: src/plugins/imexporters/csv/csv_editprofile.c:117 msgid "Transaction Text (not purpose!)" msgstr "Umsatztext (nicht Verwendungszweck)" #: src/plugins/imexporters/csv/csv_editprofile.c:118 msgid "Primanota" msgstr "Primanota" #: src/plugins/imexporters/csv/csv_editprofile.c:119 msgid "Id assigned by Finance Institute" msgstr "durch Bank zugewiesene Id" #: src/plugins/imexporters/csv/csv_editprofile.c:120 msgid "Purpose (1st Line)" msgstr "Verwendungszweck (1. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:121 msgid "Purpose (2nd Line)" msgstr "Verwendungszweck (2. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:122 msgid "Purpose (3rd Line)" msgstr "Verwendungszweck (3. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:123 msgid "Purpose (4th Line)" msgstr "Verwendungszweck (4. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:124 msgid "Purpose (5th Line)" msgstr "Verwendungszweck (5. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:125 msgid "Purpose (6th Line)" msgstr "Verwendungszweck (6. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:126 msgid "Purpose (7th Line)" msgstr "Verwendungszweck (7. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:127 msgid "Purpose (8th Line)" msgstr "Verwendungszweck (8. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:128 msgid "Purpose (9th Line)" msgstr "Verwendungszweck (9. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:129 msgid "Purpose (10th Line)" msgstr "Verwendungszweck (10. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:130 msgid "Category (1st Line)" msgstr "Kategorie (1. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:131 msgid "Category (2nd Line)" msgstr "Kategorie (2. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:132 msgid "Category (3rd Line)" msgstr "Kategorie (3. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:133 msgid "Category (4th Line)" msgstr "Kategorie (4. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:134 msgid "Category (5th Line)" msgstr "Kategorie (5. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:135 msgid "Category (6th Line)" msgstr "Kategorie (6. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:136 msgid "Category (7th Line)" msgstr "Kategorie (7. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:137 msgid "Category (8th Line)" msgstr "Kategorie (8. Zeile)" #: src/plugins/imexporters/csv/csv_editprofile.c:138 msgid "Period (Standing Order)" msgstr "Periode (Dauerauftrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:139 msgid "Cycle (Standing Order)" msgstr "Zyklus (Dauerauftrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:140 msgid "Execution Day (Standing Order)" msgstr "Ausführungstag (Daueraufträge)" #: src/plugins/imexporters/csv/csv_editprofile.c:141 msgid "Date of First Execution (Standing Order)" msgstr "Datum der ersten Ausführung (Dauerauftrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:142 msgid "Date of Last Execution (Standing Order)" msgstr "Datum der letzten Ausführung (Dauerauftrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:143 msgid "Date of Next Execution (Standing Order)" msgstr "Datum der nächsten Ausführung (Dauerauftrag)" #: src/plugins/imexporters/csv/csv_editprofile.c:144 msgid "Type" msgstr "Auftragsart" #: src/plugins/imexporters/csv/csv_editprofile.c:145 msgid "Subtype" msgstr "Auftragsunterart" #: src/plugins/imexporters/csv/csv_editprofile.c:146 msgid "Status" msgstr "Status" #: src/plugins/imexporters/csv/csv_editprofile.c:147 msgid "Remote Address: Street" msgstr "Fremde Adresse: Straße" #: src/plugins/imexporters/csv/csv_editprofile.c:148 msgid "Remote Address: Zipcode" msgstr "Fremde Adresse: PLZ" #: src/plugins/imexporters/csv/csv_editprofile.c:149 msgid "Remote Address: City" msgstr "Fremde Adresse: Stadt" #: src/plugins/imexporters/csv/csv_editprofile.c:150 msgid "Remote Address: Phone Number" msgstr "Fremde Adresse: Telefonnummer" #: src/plugins/imexporters/csv/csv_editprofile.c:151 msgid "Unit Id (Stock)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:152 msgid "Namespace of Unit Id (Securities)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:153 msgid "Amount of Units (Securities) (value)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:154 msgid "Amount of Units (Securities) (currency)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:155 msgid "Price per Unit (Securities) (value)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:156 msgid "Price per Unit (Securities) (currency)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:157 msgid "Commission (Securities) (value)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:158 msgid "Commission (Securities) (currency)" msgstr "" #: src/plugins/imexporters/csv/csv_editprofile.c:159 msgid "Bank Account Id" msgstr "Kontonummer" #: src/plugins/imexporters/csv/csv_editprofile.c:160 msgid "Positive/Negative Mark" msgstr "Positiv/Negativ Markierung" #: src/plugins/imexporters/csv/csv_editprofile.c:520 msgid "Edit CSV Profile" msgstr "CSV-Profil bearbeiten" #: src/plugins/imexporters/csv/csv_editprofile.c:638 #: src/plugins/imexporters/csv/csv_editprofile.c:672 #: src/plugins/imexporters/csv/csv_editprofile.c:692 #: src/plugins/imexporters/csv/csv_editprofile.c:706 #: src/plugins/imexporters/csv/csv_editprofile.c:735 msgid "Input Error" msgstr "Eingabefehler" #: src/plugins/imexporters/csv/csv_editprofile.c:639 msgid "Please enter a name for the profile." msgstr "Bitte geben Sie einen Namen für das Profil ein." #: src/plugins/imexporters/csv/csv_editprofile.c:640 #: src/plugins/imexporters/csv/csv_editprofile.c:674 #: src/plugins/imexporters/csv/csv_editprofile.c:694 #: src/plugins/imexporters/csv/csv_editprofile.c:708 #: src/plugins/imexporters/csv/csv_editprofile.c:737 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1021 msgid "Continue" msgstr "Fortsetzen" #: src/plugins/imexporters/csv/csv_editprofile.c:673 msgid "Please select a field delimiter." msgstr "Bitte wählen Sie einen Feldtrenner." #: src/plugins/imexporters/csv/csv_editprofile.c:693 msgid "Please select a date format." msgstr "Bitte wählen Sie ein Datumsformat." #: src/plugins/imexporters/csv/csv_editprofile.c:707 msgid "Please select a value format." msgstr "Bitte wählen Sie ein Betragsformat." #: src/plugins/imexporters/csv/csv_editprofile.c:736 msgid "Please select a valid column type." msgstr "Bitte wählen Sie einen gültigen Spaltentyp." #: src/plugins/imexporters/dtaus/dtaus.c:280 msgid "Transactions with multiple bank codes found" msgstr "Umsätze mit verschiedenen Bankleitzahlen gefunden" #: src/plugins/imexporters/dtaus/dtaus.c:291 msgid "Transactions with multiple account numbers found" msgstr "Umsätze mit verschiedenen Kontonummern gefunden" #: src/plugins/imexporters/dtaus/dtaus.c:302 msgid "Transactions with multiple local names found" msgstr "Umsätze mit verschiedenen eigenen Namen gefunden" #: src/plugins/imexporters/ofx/parser/g_sonrs.c:62 msgid "Status for signon request" msgstr "Status der Anmeldung" #: src/plugins/imexporters/ofx/parser/g_status.c:45 msgid "Success" msgstr "Erfolgreich" #: src/plugins/imexporters/ofx/parser/g_status.c:45 msgid "The server successfully processed the request." msgstr "Der Auftrag wurde erfolgreich ausgeführt." #: src/plugins/imexporters/ofx/parser/g_status.c:46 msgid "Client is up-to-date" msgstr "Die Benutzerinformationen sind aktuell." #: src/plugins/imexporters/ofx/parser/g_status.c:46 msgid "" "Based on the client timestamp, the client has the latest information. The " "response does not supply any additional information." msgstr "" "Die Benutzerdaten sind bereits aktuell, die Antwort des Servers enthält " "keine weiteren Daten." #: src/plugins/imexporters/ofx/parser/g_status.c:47 msgid "General error" msgstr "Allgemeiner Fehler" #: src/plugins/imexporters/ofx/parser/g_status.c:47 msgid "" "Error other than those specified by the remaining error codes. (Note: " "Servers should provide a more specific error whenever possible. Error code " "2000 should be reserved for cases in which a more specific code is not " "available.)" msgstr "" "Es ist ein allgemeiner Fehler aufgetreten, auf den kein spezieller " "Fehlercode paßt." #: src/plugins/imexporters/ofx/parser/g_status.c:48 msgid "Invalid account" msgstr "Ungültiges Konto" #: src/plugins/imexporters/ofx/parser/g_status.c:48 msgid "The account was invalid (whatever that means)" msgstr "Das Konto ist ungültig" #: src/plugins/imexporters/ofx/parser/g_status.c:49 msgid "General account error" msgstr "Allgemeiner Kontofehler" #: src/plugins/imexporters/ofx/parser/g_status.c:49 msgid "Account error not specified by the remaining error codes." msgstr "" "Es ist ein allgemeiner Fehler im Zusammenhang mit einem Konto ausgetreten, " "der nicht näher spezifiziert ist." #: src/plugins/imexporters/ofx/parser/g_status.c:50 msgid "Account not found" msgstr "Konto nicht vorhanden" #: src/plugins/imexporters/ofx/parser/g_status.c:50 #: src/plugins/imexporters/ofx/parser/g_status.c:53 #: src/plugins/imexporters/ofx/parser/g_status.c:56 msgid "" "The specified account number does not correspond to one of the user's " "accounts." msgstr "" "Das angegebene Konto existiert nicht oder gehört nicht zum aufrufenden " "Benutzer." #: src/plugins/imexporters/ofx/parser/g_status.c:51 msgid "Account closed" msgstr "Konto geschlossen" #: src/plugins/imexporters/ofx/parser/g_status.c:51 #: src/plugins/imexporters/ofx/parser/g_status.c:54 #: src/plugins/imexporters/ofx/parser/g_status.c:57 msgid "" "The specified account number corresponds to an account that has been closed." msgstr "Das angegebene Konto ist geschlossen." #: src/plugins/imexporters/ofx/parser/g_status.c:52 msgid "Account not authorized" msgstr "Kontozugriff nicht erlaubt" #: src/plugins/imexporters/ofx/parser/g_status.c:52 #: src/plugins/imexporters/ofx/parser/g_status.c:55 #: src/plugins/imexporters/ofx/parser/g_status.c:58 msgid "" "The user is not authorized to perform this action on the account, or the " "server does not allow this type of action to be performed on the account." msgstr "" "Der Benutzer hat keine Berechtigung für diesen Auftrag mit dem angegebenen " "Konto, oder der Server unterstützt diesen Auftrag nicht mit dem angegebenen " "Konto." #: src/plugins/imexporters/ofx/parser/g_status.c:53 msgid "Source account not found" msgstr "Quellkonto nicht gefunden" #: src/plugins/imexporters/ofx/parser/g_status.c:54 msgid "Source account closed" msgstr "Quellkonto ist geschlossen" #: src/plugins/imexporters/ofx/parser/g_status.c:55 msgid "Source account not authorized" msgstr "Keine Berechtigung für Quellkonto" #: src/plugins/imexporters/ofx/parser/g_status.c:56 msgid "Destination account not found" msgstr "Zielkonto nicht gefunden" #: src/plugins/imexporters/ofx/parser/g_status.c:57 msgid "Destination account closed" msgstr "Zielkonto ist geschlossen" #: src/plugins/imexporters/ofx/parser/g_status.c:58 msgid "Destination account not authorized" msgstr "Keine Berechtigung für Zielkonto" #: src/plugins/imexporters/ofx/parser/g_status.c:59 msgid "Invalid amount" msgstr "Ungültiger Betrag" #: src/plugins/imexporters/ofx/parser/g_status.c:59 msgid "" "The specified amount is not valid for this action; for example, the user " "specified a negative payment amount." msgstr "" "Der angegebene Betrag ist für diesen Auftrag ungültig (z.B. negativer Betrag " "bei Überweisungen)" #: src/plugins/imexporters/ofx/parser/g_status.c:60 msgid "Date too soon" msgstr "Datum liegt zu nahe in der Zukunft" #: src/plugins/imexporters/ofx/parser/g_status.c:60 msgid "" "The server cannot process the requested action by the date specified by the " "user." msgstr "" "Der Server kann diesen Auftrag nicht bis zum angegebenen Datum ausführen." #: src/plugins/imexporters/ofx/parser/g_status.c:61 msgid "Date too far in future" msgstr "Datum zu weit in der Zukunft" #: src/plugins/imexporters/ofx/parser/g_status.c:61 msgid "The server cannot accept requests for an action that far in the future." msgstr "Der Server akzeptiert keine Aufträge in so weiter Zukunft." #: src/plugins/imexporters/ofx/parser/g_status.c:62 msgid "Transaction already committed" msgstr "Überweisung bereits übermittelt" #: src/plugins/imexporters/ofx/parser/g_status.c:62 msgid "" "Transaction has entered the processing loop and cannot be modified/cancelled " "using OFX. The transaction may still be cancelled or modified using other " "means (for example, a phone call to Customer Service)." msgstr "" "Die Überweisung wird bereits verarbeitet und kann nicht mehr über OFX " "geändert oder abgebrochen werden (eventuell ist dies aber immer noch " "telefonisch möglich)." #: src/plugins/imexporters/ofx/parser/g_status.c:63 msgid "Already canceled" msgstr "Überweisung bereits zurückgezogen" #: src/plugins/imexporters/ofx/parser/g_status.c:63 msgid "" "The transaction cannot be canceled or modified because it has already been " "canceled." msgstr "" "Die Überweisung kann nicht mehr geändert oder zurückgezogen werden, weil sie " "bereits zurückgezogen wurde." #: src/plugins/imexporters/ofx/parser/g_status.c:64 msgid "Unknown server ID" msgstr "Unbekannte Serverkennung" #: src/plugins/imexporters/ofx/parser/g_status.c:64 msgid "The specified server ID does not exist or no longer exists." msgstr "Die angegebene Serverkennung existiert nicht oder nicht mehr." #: src/plugins/imexporters/ofx/parser/g_status.c:65 msgid "Duplicate request" msgstr "Doppeleinreichung" #: src/plugins/imexporters/ofx/parser/g_status.c:65 msgid "A request with this has already been received and processed." msgstr "Es wurde bereits ein Auftrag mit der gleichen empfangen." #: src/plugins/imexporters/ofx/parser/g_status.c:66 msgid "Invalid date" msgstr "Ungültiges Datum" #: src/plugins/imexporters/ofx/parser/g_status.c:66 msgid "" "The specified datetime stamp cannot be parsed; for instance, the datetime " "stamp specifies 25:00 hours." msgstr "Das angegebene Datum ist ungültig (z.B. 25:00 Uhr)" #: src/plugins/imexporters/ofx/parser/g_status.c:67 msgid "Unsupported version" msgstr "Version nicht unterstützt" #: src/plugins/imexporters/ofx/parser/g_status.c:67 msgid "" "The server does not support the requested version. The version of the " "message set specified by the client is not supported by this server." msgstr "Der Server unterstützt die angegebene Version der Nachricht nicht." #: src/plugins/imexporters/ofx/parser/g_status.c:68 msgid "Invalid TAN" msgstr "Ungültige TAN" #: src/plugins/imexporters/ofx/parser/g_status.c:68 msgid "The server was unable to validate the TAN sent in the request." msgstr "Die angegebene TAN ist ungültig." #: src/plugins/imexporters/ofx/parser/g_status.c:69 msgid "Unknown FITID" msgstr "Unbekannte Transaktionskennung" #: src/plugins/imexporters/ofx/parser/g_status.c:69 msgid "" "The specified FITID/BILLID does not exist or no longer exists. [BILLID not " "found in the billing message sets]" msgstr "" "Die angegebene Transaktionskennung/Rechnungsnummer existiert nicht (mehr)." #: src/plugins/imexporters/ofx/parser/g_status.c:70 msgid "Branch ID missing" msgstr "Branchenkennung fehlt." #: src/plugins/imexporters/ofx/parser/g_status.c:70 msgid "" "A value must be provided in the aggregate for this " "country system, but this field is missing." msgstr "Die Branchenkennung fehlt obwohl sie erforderlich ist." #: src/plugins/imexporters/ofx/parser/g_status.c:71 msgid "Bank name does not match bank ID" msgstr "Bankname passt nicht zur Bankkennung" #: src/plugins/imexporters/ofx/parser/g_status.c:71 msgid "" "The value of in the aggregate is inconsistent " "with the value of in the aggregate." msgstr "" "Der angegebene Name der Zielbank stimmt nicht mit der angegebenen Kennung " "der Bank überein." #: src/plugins/imexporters/ofx/parser/g_status.c:72 msgid "Invalid date range" msgstr "Ungültiger Datumsbereich" #: src/plugins/imexporters/ofx/parser/g_status.c:72 msgid "" "Response for non-overlapping dates, date ranges in the future, et cetera." msgstr "" "Der angegebene Datumsbereich ist ungültig (z.B. nicht überlappend, in der " "Zukunft, o.a.)." #: src/plugins/imexporters/ofx/parser/g_status.c:73 msgid "Requested element unknown" msgstr "Angefordertes Element ist unbekannt" #: src/plugins/imexporters/ofx/parser/g_status.c:73 msgid "" "One or more elements of the request were not recognized by the server or the " "server (as noted in the FI Profile) does not support the elements. The " "server executed the element transactions it understood and supported. For " "example, the request file included private tags in a but the server " "was able to execute the rest of the request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:74 msgid "Y invalid without " msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:74 msgid "" "This error code may appear element of an wrapper (in " " and V2 message set responses) or the contained in " "any embedded transaction wrappers within a sync response. The corresponding " "sync request wrapper included Y with Y or " "Y, which is illegal." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:75 msgid "Embedded transactions in request failed to process: Out of date" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:75 msgid "" "Y and embedded transactions appeared in the request sync " "wrapper and the provided was out of date. This code should be used " "in the of the response sync wrapper." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:76 msgid "Unable to process embedded transaction due to out-of-date " msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:76 msgid "" "Used in response transaction wrapper for embedded transactions when " "6501 appears in the surrounding sync wrapper." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:77 msgid "Stop check in process" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:77 msgid "Stop check is already in process." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:78 msgid "Too many checks to process" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:78 msgid "The stop-payment request specifies too many checks." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:79 msgid "Invalid payee" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:79 msgid "Payee error not specified by the remainingerror codes." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:80 msgid "Invalid payee address" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:80 msgid "Some portion of the payee's address is incorrect or unknown." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:81 msgid "Invalid payee account number" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:81 msgid "The account number of the requested payee is invalid." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:82 msgid "Insufficient funds" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:82 msgid "" "The server cannot process the request because the specified account does not " "have enough funds." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:83 msgid "Cannot modify element" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:83 msgid "" "The server does not allow modifications to one or more values in a " "modification request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:84 msgid "Cannot modify source account" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:84 #: src/plugins/imexporters/ofx/parser/g_status.c:85 msgid "Reserved for future use." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:85 msgid "Cannot modify destination account" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:86 msgid "Invalid frequency" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:86 msgid "" "The specified frequency does not match one of the accepted " "frequencies for recurring transactions." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:87 msgid "Model already canceled" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:87 msgid "The server has already canceled the specified recurring model." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:88 msgid "Invalid payee ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:88 msgid "The specified payee ID does not exist or no longer exists." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:89 msgid "Invalid payee city" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:89 msgid "The specified city is incorrect or unknown." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:90 msgid "Invalid payee state" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:90 msgid "The specified state is incorrect or unknown." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:91 msgid "Invalid payee postal code" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:91 msgid "The specified postal code is incorrect or unknown." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:92 msgid "Transaction already processed" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:92 msgid "Transaction has already been sent or date due is past" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:93 msgid "Payee not modifiable by client" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:93 msgid "The server does not allow clients to change payee information." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:94 msgid "Wire beneficiary invalid" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:94 msgid "The specified wire beneficiary does not exist or no longer exists." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:95 msgid "Invalid payee name" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:95 msgid "The server does not recognize the specified payee name." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:96 msgid "Unknown model ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:96 msgid "The specified model ID does not exist or no longer exists." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:97 msgid "Invalid payee list ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:97 msgid "The specified payee list ID does not exist or no longer exists." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:98 msgid "Table type not found" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:98 msgid "The specified table type is not recognized or does not exist." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:99 msgid "Investment transaction download not supported (WARN)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:99 msgid "The server does not support investment transaction download." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:100 msgid "Investment position download not supported (WARN)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:100 msgid "The server does not support investment position download." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:101 msgid "Investment positions for specified date not available" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:101 msgid "" "The server does not support investment positions for the specified date." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:102 msgid "Investment open order download not supported (WARN)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:102 msgid "The server does not support open order download." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:103 msgid "Investment balances download not supported (WARN)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:103 msgid "The server does not support investment balances download." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:104 msgid "401(k) not available for this account" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:104 msgid "401(k) information requested from a non-401(k) account." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:105 msgid "One or more securities not found" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:105 msgid "The server could not find the requested securities." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:106 msgid "User ID & password will be sent out-of-band (INFO)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:106 msgid "" "The server will send the user ID and password via postal mail, e-mail, or " "another means. The accompanying message will provide details." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:107 msgid "Unable to enroll user" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:107 msgid "The server could not enroll the user." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:108 msgid "User already enrolled" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:108 msgid "The server has already enrolled the user." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:109 msgid "Invalid service" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:109 msgid "" "The server does not support the service specified in the service-" "activation request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:110 msgid "Cannot change user information" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:110 msgid "The server does not support the request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:111 msgid " Missing or Invalid in " msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:111 msgid "" "The FI requires the client to provide the aggregate in the " "request, but either none was provided, or the one provided was invalid." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:112 msgid "1099 forms not available" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:112 msgid "1099 forms are not yet available for the tax year requested." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:113 msgid "1099 forms not available for user ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:113 msgid "This user does not have any 1099 forms available." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:114 msgid "W2 forms not available" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:114 msgid "W2 forms are not yet available for the tax year requested." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:115 msgid "W2 forms not available for user ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:115 msgid "The user does not have any W2 forms available." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:116 msgid "1098 forms not available" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:116 msgid "1098 forms are not yet available for the tax year requested." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:117 msgid "1098 forms not available for user ID" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:117 msgid "The user does not have any 1098 forms available." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:118 msgid "Must change USERPASS" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:118 msgid "" "The user must change his or her number as part of the next OFX " "request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:119 msgid "Signon invalid" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:119 msgid "" "The user cannot signon because he or she entered an invalid user ID or " "password." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:120 msgid "Customer account already in use" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:120 msgid "" "The server allows only one connection at a time, and another user is already " "signed on. Please try again later." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:121 msgid "USERPASS lockout" msgstr "USERPASS Ausschluss" #: src/plugins/imexporters/ofx/parser/g_status.c:121 msgid "" "The server has received too many failed signon attempts for this user. " "Please call the FI's technical support number." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:122 msgid "Could not change USERPASS" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:122 msgid "The server does not support the request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:123 msgid "Could not provide random data" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:123 msgid "" "The server could not generate random data as requested by the ." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:124 msgid "Country system not supported" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:124 msgid "" "The server does not support the country specified in the field of " "the aggregate." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:125 msgid "Empty signon not supported" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:125 msgid "" "The server does not support signons not accompanied by some other " "transaction." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:126 msgid "Signon invalid without supporting pin change request" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:126 msgid "" "The OFX block associated with the signon does not contain a pin change " "request and should." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:127 msgid "Transaction not authorized" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:127 msgid "" "Current user is not authorized to perform this action on behalf of the " "." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:128 msgid "HTML not allowed" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:128 msgid "The server does not accept HTML formatting in the request." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:129 msgid "Unknown mail To:" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:129 msgid "The server was unable to send mail to the specified Internet address." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:130 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:587 msgid "Invalid URL" msgstr "Ungültige URL" #: src/plugins/imexporters/ofx/parser/g_status.c:130 msgid "The server could not parse the URL." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:131 msgid "Unable to get URL" msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:131 msgid "" "The server was unable to retrieve the information at this URL (e.g., an HTTP " "400 or 500 series error)." msgstr "" #: src/plugins/imexporters/ofx/parser/g_status.c:132 msgid "Unknown code" msgstr "Unbekannter Code" #: src/plugins/imexporters/ofx/parser/g_status.c:132 msgid "No description for this code" msgstr "Keine Beschreibung zu diesem Code" #: src/plugins/imexporters/ofx/parser/g_status.c:264 msgid "Code" msgstr "Code" #: src/plugins/imexporters/ofx/parser/g_status.c:271 msgid "severity" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmttrnrs.c:61 msgid "Status for transaction statement request" msgstr "Status des Umsatzabrufes" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:189 msgid "Generic credit" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:193 msgid "Generic debit" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:197 msgid "Interest earned or paid (Note: Depends on signage of amount)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:201 msgid "Dividend" msgstr "Dividende" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:205 msgid "FI fee" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:209 msgid "Service charge" msgstr "Dienstleistungsgebühren" #. FIXME: not sure #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:213 msgid "Deposit" msgstr "Einzahlung" #. misc #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:217 msgid "ATM debit or credit (Note: Depends on signage of amount)" msgstr "" #. misc #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:221 msgid "Point of sale debit or credit (Note: Depends on signage of amount)" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:229 msgid "Check" msgstr "Scheck" #. FIXME: not sure #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:233 msgid "Electronic payment" msgstr "Elektronische Überweisung" #. FIXME: not sure #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:237 msgid "Cash withdrawal" msgstr "" #. FIXME: not sure #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:241 msgid "Direct deposit" msgstr "" #. FIXME: not sure #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:245 msgid "Merchant initiated debit" msgstr "Lastschrift" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:249 msgid "Repeating payment/standing order" msgstr "" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:253 msgid "Other" msgstr "Andere" #: src/plugins/imexporters/ofx/parser/g_stmtrn.c:257 msgid "Unknown transaction type" msgstr "" #: src/plugins/imexporters/ofx/parser/g_acctinfotrnrs.c:61 msgid "Status for account info request" msgstr "Status des Kontenabrufes" #: src/plugins/imexporters/ofx/parser/g_invstmttrnrs.c:71 msgid "Status for investment transaction statement request" msgstr "Status des Umsatzabrufes für Wertpapiere" #: src/plugins/imexporters/swift/swift.c:97 #: src/plugins/imexporters/xmldb/xmldb.c:98 msgid "Reading file..." msgstr "Datei wird eingelesen..." #: src/plugins/imexporters/swift/swift.c:108 #: src/plugins/imexporters/xmldb/xmldb.c:109 msgid "Error importing data" msgstr "Fehler beim Importieren der Daten" #: src/plugins/imexporters/swift/swift.c:178 msgid "Error in config file" msgstr "Fehler in der Konfigurationsdatei" #: src/plugins/imexporters/swift/swift.c:183 msgid "Adding transaction" msgstr "Buchung wird hinzugefügt" #: src/plugins/imexporters/xmldb/xmldb.c:153 #: src/plugins/imexporters/xmldb/xmldb.c:167 msgid "Error exporting data" msgstr "Fehler beim Exportieren der Daten" #: src/plugins/backends/aqhbci/plugin/msglayer/account.c:57 #: src/plugins/backends/aqhbci/plugin/msglayer/account.c:67 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:182 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:195 msgid "AqBanking Settings Database Error" msgstr "AqBanking-Datenbankfehler" #: src/plugins/backends/aqhbci/plugin/msglayer/account.c:58 #: src/plugins/backends/aqhbci/plugin/msglayer/account.c:68 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:183 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:196 msgid "Your settings database might be in an inconsistent state!" msgstr "Ihre AqBanking-Konfiguration ist möglicherweise inkonsistent! " #: src/plugins/backends/aqhbci/plugin/msglayer/message.c:949 msgid "Bad message number, ignoring" msgstr "Fehlerhafte Nachrichten-Nummer (ignoriert)" #: src/plugins/backends/aqhbci/plugin/msglayer/message.c:1013 msgid "Dialog id does not match, ignoring" msgstr "Ignoriere unerwartete Dialog-ID" #: src/plugins/backends/aqhbci/plugin/msglayer/message.c:1021 msgid "Bad message reference number, ignoring" msgstr "Fehlerhafte Nachrichtenreferenz (ignoriert)" #: src/plugins/backends/aqhbci/plugin/msglayer/message.c:1030 msgid "No message reference found, ignoring" msgstr "Keine Nachrichtenreferenz (ignoriert)" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1178 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1266 msgid " You must only enter numbers, not letters." msgstr " Es dürfen nur Zahlen eingegeben werden, keine Buchstaben." #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1182 #, c-format msgid "" "Please enter a new PIN for \n" "user %s at %s\n" "The input must be at least %d characters long.%s

Please enter a new " "PIN for user %s at %s.

The input must be at least %d " "characters long.%s

" msgstr "" "Bitte geben Sie eine neue PIN für \n" "Benutzer %s bei %s\n" "ein. Die PIN muß mindestens %d Zeichen lang sein.%s

Bitte geben Sie " "eine neue PIN für Benutzer %s bei %s ein.

Die PIN muß " "mindestens %d Zeichen lang sein.%s

" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1203 #, c-format msgid "" "Please enter the PIN for \n" "user %s at %s\n" "%sPlease enter the PIN for user %s at %s.
%s" msgstr "" "Bitte geben Sie die PIN für \n" "Benutzer %s bei %s\n" "ein.%sBitte geben Sie die PIN für Benutzer %s bei %s ein." "
%s" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1225 msgid "Enter PIN" msgstr "PIN-Eingabe" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1270 #, c-format msgid "" "Please enter a new password for \n" "user %s at %s\n" "The input must be at least %d characters long.%s

Please enter a new " "password for user %s at %s.

The input must be at least " "%d characters long.%s

" msgstr "" "Bitte geben Sie ein neues Passwort für \n" "Benutzer %s bei %s\n" "ein. Das Passwort muß mindestens %d Zeichen lang sein.%s

Bitte geben " "Sie ein neues Passwort für Benutzer %s bei %s ein.

Das " "Passwort muß mindestens %d Zeichen lang sein.%s

" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1291 #, c-format msgid "" "Please enter the password for \n" "user %s at %s\n" "%sPlease enter the password for user %s at%s.
%s" msgstr "" "Bitte geben Sie das Passwort für \n" "Benutzer %s bei %s\n" "ein.%sBitte geben Sie das Passwort für Benutzer %s bei %s ein.
%s" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1313 msgid "Enter Password" msgstr "Passwort eingeben" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1352 #, c-format msgid "" "Please enter the next TAN\n" "for user %s at %s.Please enter the next TAN for user %s at " "%s." msgstr "" "Bitte geben Sie die nächste TAN\n" "für Benutzer %s bei %s ein Bitte geben Sie die nächste TAN für " "Benutzer %s bei %s ein. " #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1369 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1452 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:2034 msgid "Enter TAN" msgstr "TAN-Eingabe" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1414 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1972 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:2003 #, c-format msgid "" "Please enter the TAN\n" "for user %s at %s.\n" msgstr "" "Bitte geben Sie die TAN für \n" "Benutzer %s bei %s ein.\n" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1419 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1435 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:2024 msgid "The server provided the following challenge:" msgstr "Die Bank sendet folgende Angaben als Aufforderung:" #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1429 #, c-format msgid "Please enter the TAN for user %s at %s." msgstr "Bitte geben Sie die TAN für Benutzer %s bei %s ein." #. create own text #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:1981 #: src/plugins/backends/aqhbci/plugin/msglayer/user.c:2018 msgid "Please enter the TAN from the device." msgstr "Bitet geben Sie die TAN vom Gerät ein." #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c:1155 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c:1169 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c:1171 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c:1181 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c:1215 msgid "Unable to verify signature (no key)" msgstr "Signatur kann nicht überprüft werden (kein Schlüssel)" #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c:1166 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c:1180 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c:1182 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c:1192 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c:1226 msgid "Invalid signature!!!" msgstr "Ungültige Signatur!" #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh1.c:1172 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh2.c:1186 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh3.c:1188 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh5.c:1198 #: src/plugins/backends/aqhbci/plugin/msglayer/msgcrypt_rdh10.c:1232 msgid "Could not verify signature" msgstr "Signatur konnte nicht überprüft werden" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c:52 msgid "Connecting to bank..." msgstr "Verbindungsaufbau zur Bank..." #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c:71 #, c-format msgid "Could not connect (%d)" msgstr "Konnte keine Verbindung herstellen (%d)" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c:77 msgid "Connected." msgstr "Verbunden." #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c:90 msgid "Disconnecting from bank..." msgstr "Verbindung zur Bank wird beendet..." #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_hbci.c:98 msgid "Disconnected." msgstr "Beendet." #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:199 msgid "Could not BASE64-decode the message" msgstr "Die Nachricht konnte nicht BASE64-kodiert werden" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:213 msgid "Received message is not HBCI" msgstr "Die empfangene Nachricht ist nicht im HBCI-Format" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:263 msgid "Unparsable message received" msgstr "Unlesbare Nachricht empfangen" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:278 msgid "Received message was truncated" msgstr "Die empfangene Nachricht war abgeschnitten" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:300 msgid "Preparing connection" msgstr "Verbindung vorbereiten" #: src/plugins/backends/aqhbci/plugin/msglayer/dialog_https.c:306 msgid "Error preparing connection" msgstr "Fehler beim Vorbereiten der Verbindung" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1755 msgid "AH_JOB|-- no account id --" msgstr "-- keine Kontonummer --" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1762 msgid "AH_JOB|-- no bank code --" msgstr "-- keine Bankleitzahl --" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1770 msgid "Received account:" msgstr "Empfangenes Konto:" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1841 msgid "Extended account information available" msgstr "Erweiterte Konteninformationen vorhanden" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1848 msgid "Extended account information is not available, some jobs might not work" msgstr "" "Erweiterte Konteninformationen nicht vorhanden. Manche Aufträge sind nicht " "verfügbar." #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:1899 msgid "Bank message received" msgstr "Banknachricht erhalten" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2162 #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2240 msgid "Response without security info (internal)" msgstr "" "Empfangene Antwort hat keine Sicherheitsinformationen (interne Nachricht)" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2174 msgid "Response encrypted with invalid key" msgstr "Empfangene Antwort ist mit ungültigem Schlüssel verschlüsselt" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2185 msgid "Response is not encrypted as expected" msgstr "Empfangene Antwort ist auf unerwartete Art verschlüsselt" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2256 msgid "Invalid bank signature" msgstr "Ungültige Banksignatur" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2272 msgid "Response not signed by the bank" msgstr "Empfangene Antwort ist von der Bank nicht signiert" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2280 msgid "Security Warning" msgstr "Sicherheitswarnung" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2282 msgid "" "The HBCI response of the bank has not been signed by the bank, \n" "contrary to what has been expected. This can be the case because the \n" "bank just stopped signing their HBCI responses. This error message \n" "would also occur if there were a replay attack against your computer \n" "in progress right now, which is probably quite unlikely. \n" " \n" "Please contact your bank and ask them whether their HBCI server \n" "stopped signing the HBCI responses. If the bank is concerned about \n" "your security, it should not stop signing the HBCI responses. \n" " \n" "Do you nevertheless want to accept this response this time or always?" "

The HBCI response of the bank has not been signed by the bank, \n" "contrary to what has been expected. This can be the case because the \n" "bank just stopped signing their HBCI responses. This error message \n" "would also occur if there were a replay attack against your computer \n" "in progress right now, which is probably quite unlikely. \n" "

Please contact your bank and ask them whether their HBCI server \n" "stopped signing the HBCI responses. If the bank is concerned about \n" "your security, it should not stop signing the HBCI responses. \n" "

Do you nevertheless want to accept this response this time or always?" "

" msgstr "" "Die HBCI-Antwort der Bank ist nicht von der Bank signiert, anders als\n" "erwartet. Dies kann der Fall sein, wenn die Bank soeben ihre\n" "Einstellungen geändert hat und nun keine Antworten mehr\n" "signiert. Diese Meldung erscheint ebenfalls, wenn in diesem Moment ein\n" "Angreifer versucht, ihre Sicherheit durch »replay attacks« (mehrfache\n" "Zusendung der Bank-Antwort) zu kompromittieren, was allerdings ein\n" "unwahrscheinlicher Fall ist.\n" "\n" "Bitte kontaktieren Sie Ihre Bank und fragen nach, ob der HBCI-Server\n" "aufgehört hat, die Antworten zu signieren. Wenn Ihre Bank um Ihre\n" "Sicherheit besorgt ist, sollte der HBCI-Server nicht aufhören, die\n" "Antworten zu signieren.\n" "\n" "Wollen Sie trotzdem die Antwort dieses Mal oder für immer akzeptieren?\n" "

\n" "Die HBCI-Antwort der Bank ist nicht von der Bank signiert, anders als\n" "erwartet. Dies kann der Fall sein, wenn die Bank soeben ihre\n" "Einstellungen geändert hat und nun keine Antworten mehr\n" "signiert. Diese Meldung erscheint ebenfalls, wenn in diesem Moment ein\n" "Angreifer versucht, ihre Sicherheit durch »replay attacks« (mehrfache\n" "Zusendung der Bank-Antwort) zu kompromittieren, was allerdings ein\n" "unwahrscheinlicher Fall ist.\n" "

\n" "Bitte kontaktieren Sie Ihre Bank und fragen nach, ob der HBCI-Server\n" "aufgehört hat, die Antworten zu signieren. Wenn Ihre Bank um Ihre\n" "Sicherheit besorgt ist, sollte der HBCI-Server nicht aufhören, die\n" "Antworten zu signieren.\n" "

\n" "Wollen Sie trotzdem die Antwort dieses Mal oder für immer akzeptieren?\n" "

" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2307 msgid "Accept this time" msgstr "Dieses Mal akzeptieren" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2308 msgid "Accept always" msgstr "Für immer akzeptieren" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2309 msgid "Abort" msgstr "Abbrechen" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2313 msgid "User accepts this unsigned response" msgstr "Benutzer hat die unsignierte Antwort akzeptiert" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2321 msgid "User accepts all further unsigned responses" msgstr "Benutzer akzeptiert unsignierte Antworten dauerhaft" #: src/plugins/backends/aqhbci/plugin/joblayer/job.c:2330 msgid "Aborted" msgstr "Abgebrochen" #: src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c:513 #, c-format msgid "TAN \"%s\" has been used, please strike it out." msgstr "Die TAN \"%s\" wurde benutzt, Sie können sie streichen." #: src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c:672 msgid "PIN seems to be invalid" msgstr "Die PIN scheint ungültig zu sein" #: src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c:1032 msgid "Dialog aborted by bank, assuming bad PIN" msgstr "Dialog wurde von der Bank abgebrochen. PIN scheint ungültig zu sein" #: src/plugins/backends/aqhbci/plugin/joblayer/jobqueue.c:1052 msgid "Dialog not aborted, assuming PIN is ok" msgstr "Dialog wurde nicht abgebrochen, PIN scheint gültig zu sein" #: src/plugins/backends/aqhbci/plugin/accountjobs/accountjob.c:85 msgid "" "This job needs an account suffix, but your bank did not provide one. " "Therefore this job is not supported with your account.\n" "Setting a higher HBCI version in the user settings might fix the problem." msgstr "" "Dieser Auftrag benötigt ein Unterkontomerkmal, welches Ihre Bank allerdings " "nicht überträgt. Daher wird dieser Auftrag mit dem angegebenen Konto nicht " "unterstützt.\n" "Dieses Problem wird mitunter dadurch gelöst, dass Sie in den " "Benutzereinstellungen eine höhere HBCI-Version auswählen." #: src/plugins/backends/aqhbci/plugin/accountjobs/jobgettransactions.c:109 msgid "" "Plugin \"SWIFT\" not found.\n" "If you are using Debian/Ubuntu then you are probably missing the package " "\"libaqbanking-plugins-libgwenhywfar\"" msgstr "" "Das SWIFT-Modul wurde nicht gefunden.\n" "Falls Sie Debian/Ubuntu verwenden fehlt vermutlich das Paket \"libaqbanking-" "plugins-libgwenhywfar\"" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobgettransactions.c:162 msgid "Importing transactions..." msgstr "Buchungen importieren..." #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:542 #, c-format msgid "Too many purpose lines (%d>%d)" msgstr "Zu viele Zeichen im Verwendungszweck (%d>%d)" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:556 #, c-format msgid "Too many chars in purpose line %d (%d>%d)" msgstr "Zu viele Zeichen in Zeile %d des Verwendungszwecks (%d>%d) " #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:724 #, c-format msgid "Text key \"%d\" not supported by the bank" msgstr "Der Textschlüssel \"%d\" wird von der Bank nicht unterstützt" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:764 #, c-format msgid "Month day \"%d\" not supported by bank" msgstr "Monatstag \"%d\" wird von der Bank nicht unterstützt" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:790 #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:845 #, c-format msgid "Execution month day \"%d\" not supported by bank" msgstr "Ausführungs-Monatstag \"%d\" wird von der Bank nicht unterstützt" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:819 #, c-format msgid "Week day \"%d\" not supported by bank" msgstr "Wochentag \"%d\" wird von der Bank nicht unterstützt" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:876 #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:917 #, c-format msgid "" "Minimum setup time violated. Dated transactions need to be at least %d days " "away" msgstr "" "Vorlaufzeit unterschritten. Datierte Überweisungen benötigen mindestens %d " "Tage Vorlaufzeit" #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:889 #: src/plugins/backends/aqhbci/plugin/accountjobs/jobsingletransfer.c:930 #, c-format msgid "" "Maximum setup time violated. Dated transactions need to be at most %d days " "away" msgstr "" "Maximale Vorlaufzeit überschritten. Datierte Überweisungen dürfen nicht mehr " "als %d Tage in der Zukunft liegen" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:696 msgid "Encoding queue" msgstr "Aufträge werden kodiert" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:702 msgid "Unable to encode" msgstr "Antwort konnte nicht kodiert werden" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:708 msgid "Sending queue" msgstr "Aufträge werden gesendet" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:715 msgid "Unable to send (network error)" msgstr "Fehler beim Senden (Netzwerk-Fehler)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:735 msgid "Waiting for response" msgstr "Warte auf Antwort" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:745 #, c-format msgid "Error receiving response (%d)" msgstr "Fehler beim Empfangen der Antwort (%d)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:752 msgid "Response received" msgstr "Antwort erhalten" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:762 msgid "Bad response (unable to decode)" msgstr "Fehlerhafte Antwort (konnte nicht dekodiert werden)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:778 msgid "Bad response (bad message reference)" msgstr "Fehlerhafte Antwort (falsche Nachrichtenreferenz)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:788 msgid "Dialog aborted by server" msgstr "Dialog-Abbruch durch den Server." #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:794 msgid "Bad response (unable to dispatch)" msgstr "Fehlerhafte Antwort (konnte nicht den Aufträgen zugeordnet werden)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:900 msgid "Opening dialog" msgstr "Öffne Dialog mit dem Server" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:925 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1368 msgid "Adjusting to iTAN modes of the server" msgstr "Anpassung an die iTAN-Methoden des Servers" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:957 msgid "Closing dialog" msgstr "Beende Dialog mit dem Server" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1197 msgid "Retrying to open dialog" msgstr "Versuche erneut den Dialog zu eröffnen" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1572 #: src/plugins/backends/aqofxconnect/plugin/provider.c:975 #, c-format msgid "Locking user %s" msgstr "Exklusiver Zugriff auf Benutzer %s" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1584 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2031 #: src/plugins/backends/aqofxconnect/plugin/provider.c:987 #, c-format msgid "Could not lock user %s (%d)" msgstr "Für Benutzer %s konnte kein exklusiver Zugriff erreicht werden (%d)" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1764 #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1923 #, c-format msgid "Error processing job %s" msgstr "Fehler bei der Bearbeitung des Jobs %s" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:1790 #: src/plugins/backends/aqofxconnect/plugin/provider.c:1011 #, c-format msgid "Unlocking user %s" msgstr "Exklusiver Zugriff auf Benutzer %s freigeben" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2055 msgid "AqHBCI started" msgstr "AqHBCI gestartet" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2078 msgid "AqHBCI finished." msgstr "AqHBCI abgeschlossen." #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2110 msgid "Locking users" msgstr "Exklusiver Zugriff auf Benutzer" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2117 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:819 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:979 msgid "Unable to lock users" msgstr "Für die Benutzer konnte kein exklusiver Zugriff erreicht werden" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2126 msgid "Executing HBCI jobs" msgstr "HBCI-Aufträge werden ausgeführt" #: src/plugins/backends/aqhbci/plugin/applayer/outbox.c:2139 msgid "Unable to unlock users" msgstr "Für die Benutzer konnte der exklusive Zugriff nicht freigegeben werden" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:730 msgid "ERROR: Multiple signatures not yet supported" msgstr "Fehler: Mehrfachsignaturen sind bisher noch nicht unterstützt" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:996 msgid "AqHBCI-Notice" msgstr "AqHBCI-Anmerkung" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:998 msgid "" "The version of AqBanking/AqHBCI previously used is too old to be\n" "upgraded automatically.\n" "Therefore you should delete the settings file and setup AqBanking\n" "completely from scratch.\n" "The settings file usually is\n" " $HOME/.banking/settings.conf\n" "

The version of AqBanking/AqHBCI previously used is too old to be\n" "upgraded automatically.\n" "

Therefore you should delete the settings file and setup AqBanking\n" "completely from scratch.\n" "

The settings file usually is: \n" "$HOME/.banking/settings.conf\n" ".\n" "

" msgstr "" "Die zuletzt verwendete Version von AqBanking ist zu alt um automatisch " "angepasst zu werden.\n" "Sie sollten daher das Verzeichnis $HOME/.banking\n" " entfernen und AqBanking vollstaendig neu einrichten.\n" "

Die zuletzt verwendete Version von AqBanking ist zu alt um " "automatisch angepasst zu werden.

Sie sollten daher das Verzeichnis " "$HOME/.banking entfernen und AqBanking vollstaendig neu einrichten.

" "" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1045 msgid "Chipcard Error" msgstr "Chipkartenfehler" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1046 #, c-format msgid "" "Error checking chip card (%d).\n" "Maybe libchipcard or its plugins are not installed?" msgstr "" "Fehler beim Prüfen der Chipkarte (%d).\n" "Ist die Bibliothek libchipcard oder deren Plugins nicht installiert?" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1076 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:243 msgid "Create HBCI/FinTS DDV User" msgstr "Neuen DDV-Chipkarten-Benutzer erstellen" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1394 msgid "Retrying to get system id." msgstr "Versuche erneut die Systemkennung abzurufen" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1418 msgid "Could not get system id after multiple trials" msgstr "" "Die Systemkennung konnte auch nach mehreren Versuchen nicht abgerufen werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1458 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2105 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:916 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:857 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1041 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1038 #: src/plugins/backends/aqofxconnect/plugin/provider.c:1020 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:1018 #, c-format msgid "Could not unlock user %s (%d)" msgstr "" "Für den Benutzer %s konnte der exklusive Zugriff nicht freigegeben werden " "(%d)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1520 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1891 msgid "Could not execute outbox." msgstr "Der Ausgangskorb konnte nicht ausgeführt werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1530 msgid "No crypt key received." msgstr "Kein Chiffrierschlüssel empfangen." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1542 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1915 msgid "Could not commit result" msgstr "Das Ergebnis der Aufträge konnte nicht verarbeitet werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1553 msgid "Bank does not use a sign key." msgstr "Die Bank benutzt keinen Signaturschlüssel." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1574 #, c-format msgid "Setting peer ID to \"%s\")" msgstr "Setze Bankschlüsselkennung auf \"%s\"" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1592 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1768 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2387 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2687 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3008 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3348 msgid "Error getting crypt token" msgstr "Das zuständige CryptToken konnte nicht ermittelt werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1607 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1780 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2399 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2699 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3020 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3360 msgid "Error opening crypt token" msgstr "Das zuständige CryptToken konnte nicht geöffnet werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1622 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1792 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2411 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2711 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3032 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3372 msgid "User context not found on crypt token" msgstr "Der Benutzerkontext wurd auf dem CryptToken nicht gefunden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1646 msgid "Error saving sign key" msgstr "Fehler beim Speichern des Signierschlüssels" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1669 msgid "Error saving crypt key" msgstr "Fehler beim Speichern des Crypto-Schlüssels" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1692 msgid "Error saving auth key" msgstr "Fehler beim Speichern des Authentifizierungs-Schlüssels" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1706 msgid "Keys saved." msgstr "Schlüssel gespeichert." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1811 msgid "Sign key info not found on crypt token" msgstr "Signaturschlüssel wurde auf dem CryptToken nicht gefunden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1834 msgid "Crypt key info not found on crypt token" msgstr "Crypto-Schlüssel wurde auf dem CryptToken nicht gefunden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1858 msgid "Auth key info not found on crypt token" msgstr "Authentifizierungsschlüssel wurde auf dem CryptToken nicht gefunden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1875 msgid "Job not supported, should not happen" msgstr "" "Auftrag nicht unterstützt. Dieser interne Fehler sollte nicht vorkommen." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1903 msgid "Job contains errors." msgstr "Auftrag enthält Fehler." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1925 msgid "Keys sent" msgstr "Schlüssel übermittelt." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1969 #: src/plugins/backends/aqofxconnect/plugin/provider.c:1128 msgid "Getting Certificate" msgstr "Abruf des Zertifikats" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1970 #: src/plugins/backends/aqofxconnect/plugin/provider.c:1129 msgid "We are now asking the server for its SSL certificate" msgstr "Jetzt wird das SSL-Zertifikat vom Server abgerufen." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1985 msgid "Could not connect to server" msgstr "Konnte keine Verbindung zum Server herstellen" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:1992 msgid "Got certificate" msgstr "Zertifikat erhalten" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2071 msgid "No iTAN modes reported." msgstr "Der Server meldet keine iTAN-Methoden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2089 msgid "Could not commit result to the system" msgstr "Das Ergebnis der Aufträge konnte nicht verarbeitet werden." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2155 msgid "Enter New Banking PIN" msgstr "Neue Banking-PIN eingeben" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2156 msgid "" "Please enter a new banking PIN.\n" "You must only enter numbers, not letters.\n" "

Please enter a new banking PIN.

You must only enter numbers, " "not letters.

" msgstr "" "Bitte geben Sie eine neue Banking-PIN ein.\n" "Sie dürfen nur Zahlen eingeben, keine Buchstaben.\n" "

Bitte geben Sie eine neue Banking-PIN ein.

Sie dürfen nur " "Zahlen eingeben, keine Buchstaben.

" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2449 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2749 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3070 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3410 msgid "Server keys missing, please get them first" msgstr "Der Serverschlüssel fehlt, diesen bitte zuerst abrufen." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2473 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2773 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3094 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3434 msgid "User keys missing, please generate them first" msgstr "Die Schlüssel des Benutzers fehlen, bitte erst generieren." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2484 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3111 msgid "" "\n" "\n" "\n" "INI-Letter\n" "\n" msgstr "" "\n" "\n" "\n" "Ini-Brief\n" "\n" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2486 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3113 msgid "Date : " msgstr "Datum : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2489 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2791 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3116 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3459 msgid "YYYY/MM/DD" msgstr "DD.MM.YYYY" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2492 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3119 msgid "Time : " msgstr "Uhrzeit : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2493 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2797 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3120 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3465 msgid "hh:mm:ss" msgstr "hh:mm:ss" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2498 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3125 msgid "Bank Code : " msgstr "Bankleitzahl : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2503 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3130 msgid "User : " msgstr "Benutzerkennung : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2509 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3136 msgid "Key number : " msgstr "Schlüsselnummer : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2516 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3143 msgid "Key version : " msgstr "Schlüsselversion : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2524 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3151 msgid "Customer system: " msgstr "Kundensystem : " #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2531 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2841 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3158 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3509 msgid "Public key for electronic signature" msgstr "Öffentlicher Schlüssel für die elektronische Signatur" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2536 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2845 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3163 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3513 msgid "Exponent" msgstr "Exponent" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2545 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2581 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2854 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2892 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3172 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3211 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3522 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3563 msgid "Bad key" msgstr "Ungültiger Schlüssel" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2574 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2885 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3204 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3556 msgid "Modulus" msgstr "Modulus" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2609 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2921 msgid "Hash" msgstr "Hash" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2630 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2944 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3291 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3637 msgid "I confirm that I created the above key for my electronic signature.\n" msgstr "" "Ich bestätige hiermit den obigen öffentlichen Schlüssel für meine " "elektronische Signatur.\n" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2634 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3295 msgid "" "____________________________ ____________________________\n" "Place, date Signature\n" msgstr "" "____________________________ ____________________________\n" "Ort, Datum Unterschrift\n" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2783 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3451 msgid "INI-Letter" msgstr "Ini-Brief" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2787 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3455 msgid "Date" msgstr "Datum" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2795 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3463 msgid "Time" msgstr "Uhrzeit" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2802 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3470 msgid "Bank Code" msgstr "Bankleitzahl (BLZ)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2809 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3477 msgid "User" msgstr "Benutzerkennung" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2816 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3484 msgid "Key number" msgstr "Schlüsselnummer" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2824 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3492 msgid "Key version" msgstr "Schlüsselversion" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2833 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3501 msgid "Customer system" msgstr "Kundensystem" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2953 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3646 msgid "Place, date" msgstr "Ort, Datum" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:2955 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3648 msgid "Signature" msgstr "Unterschrift" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3240 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3593 msgid "Hash (RMD-160)" msgstr "Hash (RMD-160)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3265 #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3613 msgid "Hash (SHA-256)" msgstr "Hash (SHA-256)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3825 msgid "Creating keys, please wait..." msgstr "Schlüssel werden erstellt, bitte warten..." #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3843 #, c-format msgid "Error creating cipher key (%d)" msgstr "Fehler beim Erstellen des Crypto-Schlüssels (%d)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3892 #, c-format msgid "Error creating sign key (%d)" msgstr "Fehler beim Erstellen des Signierschlüssels (%d)" #: src/plugins/backends/aqhbci/plugin/banking/provider.c:3939 #, c-format msgid "Error creating auth key (%d)" msgstr "Fehler beim Erstellen des Authentifizierungs-Schlüssels (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.c:421 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:651 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:487 msgid "Could create dialog, maybe incomplete installation?" msgstr "" "Dialog konnte nicht erzeugt werden, eventuell unvollständige Installation?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.c:420 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special.c:292 msgid "" "For smsTAN or mTAN this is your mobile phone number. Please ask your bank " "for the necessary format of this number." msgstr "Bei smsTAN oder mTAN verwenden Sie hier Ihre Handynummer." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:268 msgid "HBCIUserStatus|new" msgstr "new" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:269 msgid "HBCIUserStatus|enabled" msgstr "aktiviert" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:270 msgid "HBCIUserStatus|pending" msgstr "wartend auf Freischaltung" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:271 msgid "HBCIUserStatus|disabled" msgstr "deaktiviert" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:282 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special.c:226 msgid "(auto)" msgstr "(auto)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:674 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1357 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1351 msgid "INI Letter" msgstr "Ini-Brief" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.c:676 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1359 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1353 msgid "INI Letter for HBCI" msgstr "Ini-Brief für HBCI" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:439 msgid "HBCI PIN/TAN Setup Wizard" msgstr "HBCI PIN/TAN Einrichtungsassistent" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:450 msgid "This dialog assists you in setting up a Pin/TAN User.\n" msgstr "" "Dieser Dialog unterstützt Sie bei der Einrichtung eines PIN/TAN-Zuganges.\n" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:458 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:477 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:447 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:448 msgid "" "

Please select the bank.

AqBanking has an internal database " "which contains HBCI/FinTS information about many banks.

If there is an " "entry for your bank this dialog will use the information from the database.Please select the bank.\n" "AqBanking has an internal database which contains\n" "HBCI/FinTS information about many banks.\n" "If there is an entry for your bank this dialog will use the\n" "information from the database." msgstr "" "

Bitte wählen Sie die Bank aus.

AqBanking verfügt über eine " "interne Datenbank welche auch HBCI-/FinTS-Informationen für viele Banken " "enthält.

Falls auch für Ihre Bank Informationen verfügbar sind, werden " "diese verwendet.

Bitte wählen Sie die Bank aus.\n" "AqBanking verfügt über eine interne Datenbank welche auch\n" "HBCI-/FinTS-Informationen für viele Banken enthält.\n" "Falls auch für Ihre Bank Informationen verfügbar sind, werden diese " "verwendet. " #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:477 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:496 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:466 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:467 msgid "" "

For most banks the customer id must be the same as the user id.

However, some banks actually use the customer id, so please look into " "the documentation provided by your bank to discover whether this is the case " "with your bank.

For most banks the customer id must be the same as " "the user id.\n" "However, some banks actually use the customer id, so please look into\n" "the documentation provided by your bank to discover whether this is the\n" "case with your bank." msgstr "" "

Bei den meisten Banken entspricht die Kundenkennung der " "Benutzerkennung

Manche Banken allerdings verwenden eine gesonderte " "Kundenkennung. Sie sollten daher in die Dokumente Ihrer Bank nachschlagen, " "ob das auch bei Ihnen der Fall ist.

Bei den meisten Banken " "entspricht die Kundenkennung der Benutzerkennung.\n" " Manche Banken allerdings verwenden eine gesonderte Kundenkennung. Sie " "sollten daher\n" "in die Dokumente Ihrer Bank nachschlagen, ob das auch bei Ihnen der Fall ist." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:494 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:513 msgid "" "

We are now ready to create the user and retrieve the account list.

Click the next button to proceed or abort to abort.

We are now ready to create the user and retrieve the account list.\n" "Click the NEXT button to proceed or ABORT to abort." msgstr "" "

Es ist nun alles vorbereitet, um den Benutzer anzulegen und die " "Kontenliste abzurufen.

Klicken Sie auf Weiter, um fortzusetzen " "oder Abbrechen zum abbrechen.

Es ist nun alles vorbereitet, " "um den Benutzer anzulegen und die Kontenliste abzurufen.\n" "Klicken Sie auf WEITER, um fortzusetzen oder ABBRECHEN zum abbrechen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:507 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:928 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:526 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:869 msgid "The user has been successfully setup." msgstr "Der Benutzer wurde erfolgreich eingerichtet." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:724 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:726 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:696 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:849 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:889 msgid "Finish" msgstr "Fertig" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:808 msgid "Setting Up PIN/TAN User" msgstr "PIN/TAN einrichten" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:809 msgid "The system id and a list of accounts will be retrieved." msgstr "Die Systemkennung und Kontenliste werden angefordert." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:829 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:987 msgid "Retrieving SSL certificate" msgstr "Server-Zertifikat abrufen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:848 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:875 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:902 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:844 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:972 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:999 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1027 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:999 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1025 #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:1004 msgid "Aborted by user." msgstr "Die Aktion wurde durch den Benutzer abgebrochen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:857 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1007 msgid "Retrieving system id" msgstr "Systemkennung abrufen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan.c:884 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:826 msgid "Retrieving account list" msgstr "Anforderung der Kontenliste" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_pintan_special.c:254 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard_special.c:184 msgid "HBCI PIN/TAN Special Settings" msgstr "Spezielle HBCI-PIN/TAN-Einstellungen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:94 msgid "Create a New User" msgstr "Neuer Benutzer erstellen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:101 msgid "" "

You can now create a new HBCI/FinTS user.

AqBanking supports the " "following user types:
  • Keyfile-based user
  • Chipcard-based " "user
  • PIN/TAN user

Which type of user you need to setup " "is determined by the bank. The letter from your bank should contain this " "information.

You can now create a new HBCI/FinTS user.\n" "AqBanking supports the following user types:\n" " - Keyfile-based user\n" " - Chipcard-based user\n" " - PIN/TAN user\n" "Which type of user you need to setup is determined\n" "by the bank. The letter from your bank should contain this\n" "information." msgstr "" "

Sie können nun einen neuen HBCI/FinTS-Benutzer anlegen.

" "

AqBanking unterstützt die folgenden Benutzerarten:

    " "
  • Schlüsseldatei-basiert
  • Chipkarten-basiert
  • PIN/TAN-" "Benutzer

Welche Benutzerart Sie verwenden müssen wird von " "Ihrer Bank vorgegeben.Diese Information sollten Sie in den Unterlagen von " "Ihrer Bank finden.

Sie können nun einen neuen HBCI/FinTS-Benutzer " "anlegen.\n" "AqBanking unterstützt die folgenden Benutzerarten:\n" "- Schlüsseldatei-basiert\n" "- Chipkarten-basiert\n" "- PIN/TAN-Benutzer\n" "Welche Benutzerart Sie verwenden müssen wird von Ihrer Bank vorgegeben.\n" "Diese Information sollten Sie in den Unterlagen von Ihrer Bank finden." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:174 msgid "Create HBCI/FinTS PIN/TAN User" msgstr "Neuen HBCI/FinTS PIN/TAN-Benutzer erstellen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:203 msgid "Checking Chipcard" msgstr "Chipkarte prüfen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:204 msgid "Checking chipcard type, please wait..." msgstr "Chipkarte wird geprüft, bitte warten..." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.c:286 msgid "Create HBCI/FinTS Keyfile User" msgstr "Neuen HBCI/FinTS Benutzer mit Schlüsseldatei erstellen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:101 #, c-format msgid "Could not contact card. Maybe removed? (%d)" msgstr "" "Die Chipkarte konnte nicht gelesen werden. Ist sie noch im Lesegerät? (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:112 #, c-format msgid "Could not read context id list from card (%d)" msgstr "Die Kontextliste konnte nicht von der Karte gelesen werden (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:451 msgid "HBCI DDV-Card Setup Wizard" msgstr "Einrichtung von HBCI-DDV-Karten" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:462 msgid "" "

This dialog assists you in setting up a DDV Chipcard User.

Some chipcards contain user information. You can click the button below " "to read that information from the card.

This dialog assists you in " "setting up a DDV Chipcard User.\n" "Some chipcards contain user information. You can click the button below\n" "to read that information from the card." msgstr "" "

Dieser Assistent unterstützt die Einrichtung eines\n" "HBCI-DDV-Chipkarten-Benutzers.

\n" "Einige Chipkarten enthalten bereits alle notwendigen\n" "Benutzerinformationen. Klicken Sie den Knopf unten um diese\n" "Informationen von der Karte auszulesen.

\n" "Dieser Assistent unterstützt die Einrichtung eines\n" "HBCI-DDV-Chipkarten-Benutzers.\n" "Einige Chipkarten enthalten bereits alle notwendigen\n" "Benutzerinformationen. Klicken Sie den Knopf unten um diese\n" "Informationen von der Karte auszulesen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:542 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:742 #, c-format msgid "Context %d:" msgstr "Kontext %d:" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:550 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:750 msgid "" msgstr "" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:557 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:757 msgid "" msgstr "" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:757 msgid "Could not find backend, maybe some plugins are not installed?" msgstr "" "Das Banking-Modul wurde nicht gefunden, eventuell sind nicht alle Module " "installiert?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:764 msgid "Could not create user, maybe some plugins are not installed?" msgstr "" "Benutzer konnte nicht angelegt werden, eventuell sind nicht alle Module " "installiert?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:799 #, c-format msgid "Could not add user (%d)" msgstr "Der Benutzer konnte nicht hinzugefügt werden (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:807 msgid "Setting Up DDV User" msgstr "Einrichtung eines DDV-Benutzers" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:808 msgid "The list of accounts will be retrieved." msgstr "Die Kontenliste wird abgerufen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:817 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:929 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:970 #, c-format msgid "Unable to lock users (%d)" msgstr "Für die Benutzer konnte kein exklusiver Zugriff erreicht werden (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:936 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.c:1039 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1114 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1243 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1111 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1240 msgid "Could not create dialog, maybe an installation error?" msgstr "" "Dialogfenster konnte nicht erstellt werden. Ist die Programminstallation " "fehlerhaft?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:85 #, c-format msgid "" "Could not read dialog description file [%s], maybe an installation error " "(%d)?" msgstr "" "Die Dialogbeschreibungsdatei [%s] konnte nicht gelesen werden, eventuell ist " "die Installation unvollständig (Fehler: %d)?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:428 msgid "HBCI Keyfile Setup Wizard" msgstr "HBCI Schlüsseldatei Einrichtungsassistent" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:439 msgid "This dialog assists you in setting up a Keyfile User.\n" msgstr "" "Dieser Dialog unterstützt Sie bei der Einrichtung eines Zuganges mit " "Schlüsseldatei.\n" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:483 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:484 msgid "" "

We are now ready to create the user and exchange keys with the " "server.

Click the next button to proceed or abort to " "abort.

We are now ready to create the user and exchange keys with " "the server.\n" "Click the NEXT button to proceed or ABORT to abort." msgstr "" "

Es liegen alle Daten vor, um den Benutzer zu erstellen und die\n" "Schlüssel zum Server zu senden.

\n" "Klicken Sie Weiter, um diesen Schritt nun auszuführen oder Abbrechen, um abzubrechen.

\n" "Es liegen alle Daten vor, um den Benutzer zu erstellen und die\n" "Schlüssel zum Server zu senden.\n" "Klicken Sie , um diesen Schritt nun auszuführen oder , um abzubrechen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:496 msgid "" "

The user has been successfully created.

You must now " "print the INI letter (click the button below) and send it to " "the bank.

The activation of your account by the bank can take a few " "days.

The user has been successfully created.\n" "You must now PRINT the INI letter (click the button below)\n" "and SEND it to the bank.\n" "The activation of your account by the bank can take a few days." msgstr "" "

Der Benutzer wurde erfolgreich erstellt.\n" "

\n" "Bitte drucken Sie nun den Ini-Brief (durck Klicken des entsprechenden\n" "Knopfes unten) und senden den ausgedruckten und unterschriebenen\n" "Ini-Brief an die Bank.\n" "

\n" "Die Aktivierung des Zugangs durch die Bank kann dann noch einige Tage dauern.\n" "

\n" "Der Benutzer wurde erfolgreich erstellt.\n" "\n" "Bitte drucken Sie nun den Ini-Brief (durck Klicken des entsprechenden\n" "Knopfes unten) und senden den ausgedruckten und unterschriebenen\n" "Ini-Brief an die Bank.\n" "\n" "Die Aktivierung des Zugangs durch die Bank kann dann noch einige Tage dauern." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:725 msgid "" "

The following is the INI letter describing the keys of your bank. Please " "look at it carefully and compare the information against that in the letter " "from your bank.

Important Warning: Only " "proceed if the hash matches! Contact your bank immediately if the hash does " "not match!

" msgstr "" "

Im folgenden wird der Ini-Brief gezeigt, der die elektronischen\n" "Schlüssel Ihrer Bank beschreibt. Bitte vergleichen Sie diese mit den\n" "Angaben, die die Bank Ihnen vorher zugeschickt hat.\n" "

\n" "Wichtig: Nur bei Übereinstimmung der Hash-Werte kann ein sicheres\n" "Online-Banking eingerichtet werden. Falls die Hash-Werte abweichen,\n" "kontaktieren Sie bitte unbedingt Ihre Bank und brechen die Einrichtung\n" "hier ab.

" #. add ASCII version of the INI letter for frontends which don't support HTML #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:746 msgid "" "The following is the INI letter describing the keys of your bank.\n" "Please look at it carefully and compare the information against that\n" "in the letter from your bank.\n" "\n" "IMPORTANT WARNING: Only proceed if the hash matches!\n" "Contact your bank immediately if the hash does not match!\n" "\n" msgstr "" "Im folgenden wird der Ini-Brief gezeigt, der die elektronischen\n" "Schlüssel Ihrer Bank beschreibt. Bitte vergleichen Sie diese mit den\n" "Angaben, die die Bank Ihnen vorher zugeschickt hat.\n" "\n" "Wichtig: Nur bei Übereinstimmung der Hash-Werte kann ein sicheres\n" "Online-Banking eingerichtet werden. Falls die Hash-Werte abweichen,\n" "kontaktieren Sie bitte unbedingt Ihre Bank und brechen die Einrichtung\n" "hier ab.\n" "\n" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:768 msgid "Check Bank Keys" msgstr "Überprüfe Bankschlüssel" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:770 msgid "Keys are ok" msgstr "Schlüssel ok." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:771 msgid "Keys do not match!" msgstr "Schlüssel ungültig!" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:812 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:819 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:891 msgid "Could not find HBCI backend, maybe some plugins are not installed?" msgstr "" "Das HBCI-Modul wurde nicht gefunden, eventuell sind einige Module nicht " "installiert?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:849 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:858 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:659 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:679 #, c-format msgid "" "CryptToken plugin for type %s is not available. Did you install all " "necessary packages?" msgstr "" "Das CryptToken-Modul des Typs %s wurde nicht gefunden. Sind alle nötigen " "Pakete installiert?" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:876 #, c-format msgid "" "The keyfile %s could not be created. Maybe there already is a file of that " "name (%d)." msgstr "" "Die Schlüsseldatei %s konnte nicht angelegt werden. Eventuell existiert " "bereits eine gleichnamige Datei (%d)." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:888 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:770 #, c-format msgid "The keyfile %s could not be closed. Please check disc space." msgstr "" "Die Schlüsseldatei %s konnte nicht geschrieben werden. Bitte prüfen Sie den " "Plattenspeicher." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:908 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:951 #, c-format msgid "Could not add HBCI user, maybe there already is a user of that id (%d)" msgstr "" "HBCI-Benutzer konnte nicht hinzugefügt werden, eventuell besteht bereits ein " "Benutzer mit der gleichen Kennung (%d)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:919 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:960 msgid "Setting Up Keyfile User" msgstr "Schlüsseldatei-Benutzer einrichten" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:920 msgid "" "The server keys will now be retrieved, keys created and sent to the bank." msgstr "" "Die Bankschlüssel werden nun abgerufen, eigene Schlüssel erzeugt und an die " "Bank gesendet." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:939 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:979 msgid "Retrieving server keys" msgstr "Server-Schlüssel abrufen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:959 msgid "Bad bank keys, you should contact your bank." msgstr "Serverschlüssel sind fehlerhaft. Bitte kontaktieren Sie Ihre Bank." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:986 #, c-format msgid "Error generating keys: %d" msgstr "Fehler beim Erzeugen der Schlüssel: %d" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1007 msgid "Sending user keys" msgstr "Benutzerschlüssel werden übermittelt" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1284 msgid "Create Keyfile" msgstr "Schlüsseldatei erstellen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.c:1287 #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1282 msgid "All Files (*)\tOHBCI Files (*ohbci;*.medium)" msgstr "Alle Dateien (*)\tOHBCI-Dateien (*.ohbci;*.OHBCI)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_rdh_special.c:209 msgid "HBCI Keyfile Special Settings" msgstr "Schlüsseldatei-Einstellungen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:429 msgid "HBCI Keyfile Import Wizard" msgstr "HBCI-Schlüsseldatei-Import-Assistent" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:440 msgid "This dialog assists you in importing a Keyfile User.\n" msgstr "" "Dieser Dialog unterstützt Sie bei der Einrichtung eines Schlüsseldatei-" "Zuganges.\n" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:497 msgid "" "

The user has been successfully created.

The user has been " "successfully created." msgstr "" "Der Benutzer wurde erfolgreich erstellt.

Der Benutzer wurde " "erfolgreich erstellt.

" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:702 #, c-format msgid "The keyfile %s could not be opened. Please check permissions (%d)." msgstr "" "Die Schlüsseldatei %s konnte nicht geöffnet werden. Bitte prüfen Sie die " "Berechtigungen (%d)." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:710 msgid "-- custom --" msgstr "-- benutzerdefiniert --" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:721 #, c-format msgid "Could not read context id list (%d)." msgstr "Die Kontextliste konnte nicht gelesen werden (%d)." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:913 msgid "Could not create HBCI user (internal error)" msgstr "Der HBCI-Benutzer konnte nicht erstellt werden (interner Fehler)" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:961 msgid "The server keys and system id will now be retrieved." msgstr "Die Bankschlüssel und Systemkennung werden nun abgerufen." #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_importkeyfile.c:1279 msgid "Select Keyfile" msgstr "Schlüsseldatei wählen" #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.c:80 msgid "" "

The HBCI module supports a broad range of security media. Please " "choose the user setup mode from the following list.

Click on the " "run button below to create the user.

The HBCI module " "supports a broad range of security\n" "media. Please choose the user setup mode from the following\n" "list.\n" "Click on the RUN button below to create the user." msgstr "" "

Das HBCI-Modul unterstützt viele verschiedene Sicherheitsmedien. " "Bitte\n" "wählen Sie die Einrichtungsart aus der folgenden Liste.

\n" "Klicken Sie auf den »Ausführen«-Knopf, um den Benutzer zu erstellen.

\n" "Das HBCI-Modul unterstützt viele verschiedene Sicherheitsmedien. Bitte\n" "wählen Sie die Einrichtungsart aus der folgenden Liste.\n" "Klicken Sie auf den »Ausführen«-Knopf, um den Benutzer zu erstellen." #. got this list from https://microsoftmoneyoffline.wordpress.com/appid-appver/ #: src/plugins/backends/aqofxconnect/plugin/provider.c:61 msgid "Intuit Quicken Windows 2013" msgstr "Intuit Quicken Windows 2013" #: src/plugins/backends/aqofxconnect/plugin/provider.c:62 msgid "Intuit Quicken Windows 2012" msgstr "Intuit Quicken Windows 2012" #: src/plugins/backends/aqofxconnect/plugin/provider.c:63 msgid "Intuit Quicken Windows 2011" msgstr "Intuit Quicken Windows 2011" #: src/plugins/backends/aqofxconnect/plugin/provider.c:64 msgid "Intuit Quicken Windows 2010" msgstr "Intuit Quicken Windows 2010" #: src/plugins/backends/aqofxconnect/plugin/provider.c:65 msgid "Intuit Quicken Windows 2009" msgstr "Intuit Quicken Windows 2009" #: src/plugins/backends/aqofxconnect/plugin/provider.c:66 msgid "Intuit Quicken Windows 2008" msgstr "Intuit Quicken Windows 2008" #: src/plugins/backends/aqofxconnect/plugin/provider.c:67 msgid "Intuit Quicken Windows 2007" msgstr "Intuit Quicken Windows 2007" #: src/plugins/backends/aqofxconnect/plugin/provider.c:68 msgid "Intuit Quicken Windows 2006" msgstr "Intuit Quicken Windows 2006" #: src/plugins/backends/aqofxconnect/plugin/provider.c:69 msgid "Intuit Quicken Windows 2005" msgstr "Intuit Quicken Windows 2005" #: src/plugins/backends/aqofxconnect/plugin/provider.c:71 msgid "Intuit Quicken Mac 2008" msgstr "Intuit Quicken Mac 2008" #: src/plugins/backends/aqofxconnect/plugin/provider.c:72 msgid "Intuit Quicken Mac 2007" msgstr "Intuit Quicken Mac 2007" #: src/plugins/backends/aqofxconnect/plugin/provider.c:73 msgid "Intuit Quicken Mac 2006" msgstr "Intuit Quicken Mac 2006" #: src/plugins/backends/aqofxconnect/plugin/provider.c:74 msgid "Intuit Quicken Mac 2005" msgstr "Intuit Quicken Mac 2005" #: src/plugins/backends/aqofxconnect/plugin/provider.c:76 msgid "Intuit QuickBooks Windows 2008" msgstr "Intuit QuickBooks Windows 2008" #: src/plugins/backends/aqofxconnect/plugin/provider.c:77 msgid "Intuit QuickBooks Windows 2007" msgstr "Intuit QuickBooks Windows 2007" #: src/plugins/backends/aqofxconnect/plugin/provider.c:78 msgid "Intuit QuickBooks Windows 2006" msgstr "Intuit QuickBooks Windows 2006" #: src/plugins/backends/aqofxconnect/plugin/provider.c:79 msgid "Intuit QuickBooks Windows 2005" msgstr "Intuit QuickBooks Windows 2005" #: src/plugins/backends/aqofxconnect/plugin/provider.c:81 msgid "Microsoft Money Plus" msgstr "Microsoft Money Plus" #: src/plugins/backends/aqofxconnect/plugin/provider.c:82 msgid "Microsoft Money 2007" msgstr "Microsoft Money 2007" #: src/plugins/backends/aqofxconnect/plugin/provider.c:83 msgid "Microsoft Money 2006" msgstr "Microsoft Money 2006" #: src/plugins/backends/aqofxconnect/plugin/provider.c:84 msgid "Microsoft Money 2005" msgstr "Microsoft Money 2005" #: src/plugins/backends/aqofxconnect/plugin/provider.c:85 msgid "Microsoft Money 2004" msgstr "Microsoft Money 2004" #: src/plugins/backends/aqofxconnect/plugin/provider.c:86 msgid "Microsoft Money 2003" msgstr "Microsoft Money 2003" #: src/plugins/backends/aqofxconnect/plugin/provider.c:229 #: src/plugins/backends/aqofxconnect/plugin/provider.c:272 msgid "Setup Error" msgstr "Einrichtungsfehler" #: src/plugins/backends/aqofxconnect/plugin/provider.c:230 #: src/plugins/backends/aqofxconnect/plugin/provider.c:273 msgid "No user assigned to this account. Please check your configuration." msgstr "" "Dieses Konto ist keinem Benutzer zugeordnet. Bitte überprüfen Sie Ihre " "Konfiguration." #: src/plugins/backends/aqofxconnect/plugin/provider.c:595 #, c-format msgid "Adding account %s to bank %s" msgstr "Füge Konto %s zur Bank %s hinzu" #: src/plugins/backends/aqofxconnect/plugin/provider.c:668 msgid "Requesting account list" msgstr "Anforderung der Kontenliste" #: src/plugins/backends/aqofxconnect/plugin/provider.c:669 msgid "" "We are now requesting a list of accounts\n" "which can be managed via OFX.\n" "We are now requesting a list of accounts which can be managed via " "OFX.\n" "" msgstr "" "Eine Liste der über OFX verfügbaren Konten wird nun angefordert. Eine " "Liste der über OFX verfügbaren Konten wird nun angefordert. " #: src/plugins/backends/aqofxconnect/plugin/provider.c:727 #: src/plugins/backends/aqofxconnect/plugin/provider.c:851 msgid "Parsing response" msgstr "Untersuche Antwort" #: src/plugins/backends/aqofxconnect/plugin/provider.c:751 #: src/plugins/backends/aqofxconnect/plugin/provider.c:873 msgid "Error parsing response" msgstr "Fehler beim Untersuchen der Antwort" #: src/plugins/backends/aqofxconnect/plugin/provider.c:764 msgid "Error importing accounts" msgstr "Fehler beim Importieren der Konten" #: src/plugins/backends/aqofxconnect/plugin/provider.c:838 msgid "Error parsing server response" msgstr "Fehler beim Untersuchen der Serverantwort" #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:531 msgid "OFX DirectConnect User Setup" msgstr "OFX DirectConnect Benutzereinrichtung" #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:661 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:679 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:691 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:703 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:728 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:740 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:771 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:783 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:795 msgid "Missing Input" msgstr "Fehlende Eingabe" #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:661 msgid "Please enter the name of your bank." msgstr "Bitte geben Sie den Namen der Bank ein." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:679 msgid "Please enter a valid FID code." msgstr "Bitte machen Sie eine Angabe zu FID." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:691 msgid "Please enter a valid ORG code." msgstr "Bitte machen Sie eine Angabe zu ORG." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:703 msgid "Please enter a server address." msgstr "Bitte geben Sie eine Server-Adresse ein." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:728 msgid "Please enter your name." msgstr "Bitte geben Sie Ihren Namen ein." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:740 msgid "Please enter your User ID." msgstr "Bitte geben Sie Ihre Benutzerkennung (User ID) ein." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:771 #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:783 msgid "Please select a valid application to emulate." msgstr "Bitte wählen Sie eine Anwendung, die emuliert werden soll." #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.c:795 msgid "Please enter a correct header version (default is 102)." msgstr "Bitte wählen Sie eine Header-Version (voreingestellt ist 102)." #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:529 msgid "OFX DirectConnect Setup Wizard" msgstr "OFX DirectConnect Setup-Assistent" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:540 msgid "" "

This dialog assists you in setting up an OFX DirectConnect User.This dialog assists you in setting up an OFX DirectConnect User." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:551 msgid "" "

Please enter your bank settings below.

Click the Select button to choose from a list of known banks. That will connect to www." "ofxhome.com and try to retrieve information about your bank.

If " "you had to manually enter this information because your bank was unknown to " "www.ofxhome.com you are kindly asked to submit your bank server " "information there to help the next user.

Click the SELECT button " "to choose from a list of\n" "known banks. That will connect to \"www.ofxhome.com\" and\n" "try to retrieve information about your bank.\n" "If you had to manually enter this information because your\n" "bank was unknown to \"www.ofxhome.com\" you are kindly\n" "asked to submit your bank server information there to help\n" "the next user." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:575 msgid "" "

Please enter your user settings below.

User Name is " "your real name, User Id is assigned to you by the bank after applying " "for OFX DirectConnect and Client UID is used by some banks only. If " "you do not have such a value in your documents from the bank just leave it " "blank.

Please enter your user settings below.\n" "\"User Name\" is your real name, \"User Id\" is\n" "assigned to you by the bank after applying for OFX DirectConnect\n" "and \"Client UID\" is used by some banks. If you do not have such\n" "a value in your documents from the bank just leave it blank." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:595 msgid "" "

Please choose the application you want AqBanking to emulate. Not " "all banks support all applications and versions, you might have to try " "multiple settings.

Please choose the application you want " "AqBanking to emulate.\n" "Not all banks support all applications and versions, you might have\n" "to try multiple settings." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:637 msgid "" "

We are now ready to create the user.

Click the next " "button to proceed or abort to abort.

We are now ready to " "create the user.\n" "Click the NEXT button to proceed or ABORT to abort." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:650 msgid "" "

The user has been successfully setup.

You can now try to " "retrieve the list of accounts the bank allows you to manage via OFX " "DirectConnect.

Please note that not every banks supports this. If your " "bank does not support account list download you will have to add the account " "manually.

The user has been successfully setup.\n" "You can now try to retrieve the list of accounts the\n" "bank allows you to manage via OFX DirectConnect.\n" "Please note that not every banks supports this. If your\n" "bank does not support account list download you will have to\n" "add the account manually." msgstr "" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:968 msgid "Setting Up OFX DirectConnect User" msgstr "Einrichtung eines OFX DirectConnect-Benutzers" #: src/plugins/backends/aqofxconnect/plugin/dlg_newuser.c:969 msgid "The user will be created and the certificate retrieved." msgstr "Der Benutzer wird erstellt und das Zertifikat abgerufen." #: src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.c:253 msgid "OFX DirectConnect Special Settings" msgstr "OFX DirectConnect Erweiterte Einstellungen" #: src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.c:251 msgid "Bank Name" msgstr "Bankname" #: src/plugins/backends/aqofxconnect/plugin/libofxhome/dlg_getinst.c:264 msgid "" "

Please start typing in the name of your bank. The list below will " "be updated to show matching banks.

Choose the bank from list below and " "click ok.

Please start typing in the name of your bank. The " "list\n" "below will be updated to show matching banks.\n" "Choose the bank from list below and click OK." msgstr "" #. flags #. type #. name #. minnum #. maxnum #. short option #. long option #: src/tools/aqbanking-cli/main.c:86 src/tools/aqbanking-cli/main.c:87 msgid "Specify the configuration folder" msgstr "Gibt den Konfigurationsordner an" #: src/tools/aqbanking-cli/main.c:143 src/tools/aqbanking-cli/main.c:145 msgid "" "Show this help screen. For help on commands, run aqbanking-cli --" "help." msgstr "" "Diesen Hilfetext anzeigen. Um die Hilfe für einzelne Kommandos zu erhalten, " "bitte aufrufen: aqbanking-cli --help" #: src/tools/aqbanking-cli/main.c:185 msgid "This is version " msgstr "Dies ist Version " #: src/tools/aqbanking-cli/main.c:188 msgid "Usage: " msgstr "Benutzung: " #: src/tools/aqbanking-cli/main.c:191 msgid " [GLOBAL OPTIONS] COMMAND [LOCAL OPTIONS]\n" msgstr " [ALLGEMEINE OPTIONEN] KOMMANDO [KOMMANDO-OPTIONEN]\n" #: src/tools/aqbanking-cli/main.c:194 msgid "" "\n" "Global Options:\n" msgstr "" "\n" "Allgemeine Optionen:\n" #: src/tools/aqbanking-cli/main.c:200 msgid "" "\n" "Commands:\n" msgstr "" "\n" "Kommandos:\n" #: src/tools/aqbanking-cli/main.c:202 msgid "Sends a DTAZV file to the bank" msgstr "Eine DTAZV-Datei zur Bank senden" #: src/tools/aqbanking-cli/main.c:205 msgid "Prints the list of accounts" msgstr "Anzeigen der Kontenliste" #: src/tools/aqbanking-cli/main.c:208 msgid "Export balances from a context file." msgstr "Salden aus einer Kontextdatei exportieren." #: src/tools/aqbanking-cli/main.c:211 msgid "Export transactions from a context file." msgstr "Buchungen aus einer Kontextdatei exportieren." #: src/tools/aqbanking-cli/main.c:214 msgid "Requests transactions, balances, standing orders etc." msgstr "" #: src/tools/aqbanking-cli/main.c:217 msgid "Check a combination of bank id and account number" msgstr "" #: src/tools/aqbanking-cli/main.c:220 msgid "Check an IBAN" msgstr "Eine IBAN überprüfen" #: src/tools/aqbanking-cli/main.c:223 msgid "Import a file into an import context file" msgstr "Eine Datei in eine Import-Kontextdatei importieren" #: src/tools/aqbanking-cli/main.c:226 msgid "Issue a single transfer (data from command line)" msgstr "" #: src/tools/aqbanking-cli/main.c:229 msgid "Issue a number of transfers (data from a file)" msgstr "" #: src/tools/aqbanking-cli/main.c:232 msgid "Issue a single debit note (data from command line)" msgstr "" #: src/tools/aqbanking-cli/main.c:235 msgid "Issue a number of debit notes (data from a file)" msgstr "" #: src/tools/aqbanking-cli/main.c:238 msgid "Add a transfer to an existing import context file" msgstr "" #: src/tools/aqbanking-cli/main.c:241 msgid "Fill gaps in an import context file from configuration settings" msgstr "" #: src/tools/aqbanking-cli/main.c:244 msgid "Update configuration from previous AqBanking versions" msgstr "Die Konfiguration aus früheren AqBanking-Versionen aktualisieren" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:29 #, no-wrap msgid "File" msgstr "Datei" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:31 #, no-wrap msgid "Select" msgstr "Wählen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:47 #, no-wrap msgid "Edit" msgstr "Ändern" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:48 #, no-wrap msgid "New" msgstr "Neu" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:49 #, no-wrap msgid "Delete" msgstr "Entfernen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:65 #, no-wrap msgid "Help" msgstr "Hilfe" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_importer.dlg:67 #, no-wrap msgid "Previous" msgstr "Zurück" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.dlg:23 #, no-wrap msgid "BIC" msgstr "BIC" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.dlg:29 #, no-wrap msgid "Location" msgstr "Ort" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.dlg:35 #, no-wrap msgid "Matching Banks" msgstr "Passende Banken" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_selectbankinfo.dlg:44 #, no-wrap msgid "Ok" msgstr "Ok" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_setup.dlg:22 #, no-wrap msgid "Users" msgstr "Benutzer" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_setup.dlg:27 #, no-wrap msgid "Create User" msgstr "Benutzer anlegen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_setup.dlg:35 #, no-wrap msgid "Accounts" msgstr "Konten" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_setup.dlg:40 #, no-wrap msgid "Create Account" msgstr "Konto anlegen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_setup.dlg:54 #, no-wrap msgid "Close" msgstr "Schließen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_selectbackend.dlg:20 #, no-wrap msgid "Backend" msgstr "Modul" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:18 #, no-wrap msgid "Account Info" msgstr "Kontoinformation" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:21 #, no-wrap msgid "Account Number" msgstr "Kontonummer" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:24 #, no-wrap msgid "Account Name" msgstr "Kontoname" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:27 #, no-wrap msgid "IBAN" msgstr "IBAN" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:30 #, no-wrap msgid "Owner Name" msgstr "Name des Kontoinhabers" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:33 #, no-wrap msgid "Currency" msgstr "Währung" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:36 #, no-wrap msgid "Account Type" msgstr "Kontoart" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:43 #, no-wrap msgid "Bank Info" msgstr "Bankinformationen" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:47 #, no-wrap msgid "Country" msgstr "Staat" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:59 #, no-wrap msgid "SWIFT BIC" msgstr "SWIFT BIC" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_editaccount.dlg:62 #, no-wrap msgid "Selected User" msgstr "Ausgewählte Benutzer " #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_edituser.dlg:25 #, no-wrap msgid "User Name" msgstr "Benutzername" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_edituser.dlg:34 #, no-wrap msgid "User Id" msgstr "Benutzerkennung" #. type: Attribute 'text' of: #: src/libs/aqbanking/dialogs/dlg_edituser.dlg:37 #, no-wrap msgid "Customer Id" msgstr "Kundennummer" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:20 #, no-wrap msgid "Generic" msgstr "Allgemein " #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:24 #, no-wrap msgid "General" msgstr "Allgemein" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:28 #, no-wrap msgid "Name" msgstr "Name" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:31 #, no-wrap msgid "Version" msgstr "Version" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:34 #, no-wrap msgid "Short Description" msgstr "kurze Beschreibung" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:37 #, no-wrap msgid "Long Description" msgstr "lange Beschreibung" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:41 #, no-wrap msgid "CSV_EditProfile|Applicable for Imports" msgstr "für Import geeignet" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:42 #, no-wrap msgid "CSV_EditProfile|Applicable for Exports" msgstr "für Export geeignet" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:49 #: src/plugins/imexporters/csv/csv_editprofile.dlg:52 #, no-wrap msgid "Structure" msgstr "Struktur" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:55 #, no-wrap msgid "Ignore Lines" msgstr "Zeilen ignorieren" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:58 #, no-wrap msgid "Column Delimiter" msgstr "Spaltentrenner" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:61 #, no-wrap msgid "CSV_EditProfile|Subject" msgstr "" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:65 #, no-wrap msgid "First Line Contains Headers" msgstr "Erste Zeile ist Kopfzeile" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:66 #, no-wrap msgid "Fields have Quotation Marks" msgstr "Felder in Anführungszeichen" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:71 #, no-wrap msgid "Field Formats" msgstr "Feldformate" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:74 #, no-wrap msgid "Date Format" msgstr "Datumsformat" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:77 #, no-wrap msgid "Amount Format" msgstr "Betragsformat" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:86 #: src/plugins/imexporters/csv/csv_editprofile.dlg:88 #, no-wrap msgid "Columns" msgstr "Spalten" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:93 #, no-wrap msgid "Column 1" msgstr "Spalte 1" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:97 #, no-wrap msgid "Column 2" msgstr "Spalte 2" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:101 #, no-wrap msgid "Column 3" msgstr "Spalte 3" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:105 #, no-wrap msgid "Column 4" msgstr "Spalte 4" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:109 #, no-wrap msgid "Column 5" msgstr "Spalte 5" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:113 #, no-wrap msgid "Column 6" msgstr "Spalte 6" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:117 #, no-wrap msgid "Column 7" msgstr "Spalte 7" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:121 #, no-wrap msgid "Column 8" msgstr "Spalte 8" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:125 #, no-wrap msgid "Column 9" msgstr "Spalte 9" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:129 #, no-wrap msgid "Column 10" msgstr "Spalte 10" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:133 #, no-wrap msgid "Column 11" msgstr "Spalte 11" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:137 #, no-wrap msgid "Column 12" msgstr "Spalte 12" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:141 #, no-wrap msgid "Column 13" msgstr "Spalte 13" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:145 #, no-wrap msgid "Column 14" msgstr "Spalte 14" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:149 #, no-wrap msgid "Column 15" msgstr "Spalte 15" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:153 #, no-wrap msgid "Column 16" msgstr "Spalte 16" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:157 #, no-wrap msgid "Column 17" msgstr "Spalte 17" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:161 #, no-wrap msgid "Column 18" msgstr "Spalte 18" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:165 #, no-wrap msgid "Column 19" msgstr "Spalte 19" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:169 #, no-wrap msgid "Column 20" msgstr "Spalte 20" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:173 #, no-wrap msgid "Column 21" msgstr "Spalte 21" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:177 #, no-wrap msgid "Column 22" msgstr "Spalte 22" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:181 #, no-wrap msgid "Column 23" msgstr "Spalte 23" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:185 #, no-wrap msgid "Column 24" msgstr "Spalte 24" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:189 #, no-wrap msgid "Column 25" msgstr "Spalte 25" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:193 #, no-wrap msgid "Column 26" msgstr "Spalte 26" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:197 #, no-wrap msgid "Column 27" msgstr "Spalte 27" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:201 #, no-wrap msgid "Column 28" msgstr "Spalte 28" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:205 #, no-wrap msgid "Column 29" msgstr "Spalte 29" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:209 #, no-wrap msgid "Column 30" msgstr "Spalte 30" #. type: Attribute 'text' of: #: src/plugins/imexporters/csv/csv_editprofile.dlg:222 #, no-wrap msgid "First Data Line" msgstr "Erste Datenzeile" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg:18 #, no-wrap msgid "General Settings" msgstr "Allgemeine Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg:49 #, no-wrap msgid "HBCI Settings" msgstr "HBCI-Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg:54 #, no-wrap msgid "HBCI Version" msgstr "HBCI-Version" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg:63 #, no-wrap msgid "Special Actions" msgstr "Spezielle Aktionen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserddv.dlg:65 #, no-wrap msgid "Get Accounts" msgstr "Kontenliste abrufen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:54 #, no-wrap msgid "Server URL" msgstr "Server-URL" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:60 #, no-wrap msgid "HTTP Version" msgstr "HTTP-Version" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:63 #, no-wrap msgid "Selected TAN Method" msgstr "Ausgewählte TAN-Methode" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:66 #, no-wrap msgid "TAN Medium ID" msgstr "TAN-Medienkennung" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:71 #, no-wrap msgid "Force SSLv3" msgstr "SSLv3 erzwingen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:72 #, no-wrap msgid "Disable Base64 Encoding" msgstr "Nicht BASE64 kodieren" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:73 #, no-wrap msgid "Omit SMS Account" msgstr "SMS-Konto überspringen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:81 #, no-wrap msgid "Get Certificate" msgstr "Abruf des Zertifikats " #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:82 #, no-wrap msgid "Get System Id" msgstr "Systemkennung abrufen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserpintan.dlg:83 #, no-wrap msgid "Get iTAN Modes" msgstr "iTAN-Modi abrufen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.dlg:57 #, no-wrap msgid "RDH Version" msgstr "RDH-Version" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.dlg:65 #, no-wrap msgid "Bank does not sign messages" msgstr "Bank signiert ihre Nachrichten nicht" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.dlg:66 #, no-wrap msgid "Bank uses own signature counter" msgstr "Bank verwendet Signaturzähler" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_edituserrdh.dlg:76 #, no-wrap msgid "Ini Letter" msgstr "Ini-Brief" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.dlg:31 #, no-wrap msgid "Context From File" msgstr "Kontext von Datei" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_ddvcard.dlg:72 #, no-wrap msgid "Special Settings" msgstr "Erweiterte Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newkeyfile.dlg:93 #, no-wrap msgid "Print Ini Letter" msgstr "Ini-Brief ausdrucken" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.dlg:24 #, no-wrap msgid "Import Keyfile" msgstr "Schlüsseldatei importieren" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.dlg:31 #, no-wrap msgid "Init Chipcard" msgstr "Chipkarte initialisieren" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.dlg:32 #, no-wrap msgid "Use Chipcard" msgstr "Chipkarte verwenden" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_newuser.dlg:39 #, no-wrap msgid "Use PIN/TAN" msgstr "PIN/TAN verwenden" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg:21 #, no-wrap msgid "Setup a PIN/TAN account" msgstr "PIN/TAN einrichten" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg:22 #, no-wrap msgid "Import an already used chipcard" msgstr "Chipkarte verwenden" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg:23 #, no-wrap msgid "Create a new Keyfile" msgstr "Neue Schlüsseldatei erstellen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg:24 #, no-wrap msgid "Import an existing Keyfile" msgstr "Existierende Schlüsseldatei importieren" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_choose_usertype.dlg:25 #, no-wrap msgid "Init a chipcard" msgstr "Chipkarte initialisieren" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.dlg:42 #, no-wrap msgid "Prefer Single Transfer" msgstr "Einzelüberweisung bevorzugen" #. type: Attribute 'text' of: #: src/plugins/backends/aqhbci/plugin/dialogs/dlg_editaccount.dlg:43 #, no-wrap msgid "Prefer Single Debit Note" msgstr "Einzellastschrift bevorzugen" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:21 #, no-wrap msgid "User Settings" msgstr "Benutzer-Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:33 #, no-wrap msgid "Client UID" msgstr "Kunden UID" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:42 #, no-wrap msgid "Bank Settings" msgstr "Bank-Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:54 #, no-wrap msgid "Broker Id" msgstr "Broker-Kennung" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:57 #, no-wrap msgid "FID" msgstr "FID" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:60 #, no-wrap msgid "ORG" msgstr "ORG" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:69 #, no-wrap msgid "Retrieve Account List" msgstr "Kontenliste abrufen" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:77 #, no-wrap msgid "Application Settings" msgstr "Anwendungs-Einstellungen" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:83 #, no-wrap msgid "Emulated Application" msgstr "Simulierte Anwendung" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:86 #, no-wrap msgid "Application ID" msgstr "Anwendungs ID" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:89 #, no-wrap msgid "Application Version" msgstr "Anwendungsversion" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_edituser.dlg:92 #, no-wrap msgid "Header Version" msgstr "Header Version" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.dlg:26 #, no-wrap msgid "Security Type" msgstr "Wertpapierart" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.dlg:32 #, no-wrap msgid "Send Empty Bank Id" msgstr "Leere Bankleitzahl senden" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.dlg:33 #, no-wrap msgid "Send Empty FID" msgstr "Leere FID senden" #. type: Attribute 'text' of: #: src/plugins/backends/aqofxconnect/plugin/dlg_ofx_special.dlg:34 #, no-wrap msgid "Send Short Date" msgstr "Kurzes Datum senden" #. type: Content of: #: src/plugins/parsers/dtaus/dtaus.xml:4 msgid "Importer and Exporter for DTAUS" msgstr "Im- und Exporter für DTAUS" #. type: Content of: #: src/plugins/parsers/dtaus/dtaus.xml:6 msgid "This plugin imports and exports German DTAUS data." msgstr "Dieses Modul im-/exportiert DTAUS-Dateien." #. type: Content of: #: src/plugins/parsers/swift/swift.xml:4 msgid "Importer and Exporter for SWIFT" msgstr "" #. type: Content of: #: src/plugins/parsers/swift/swift.xml:6 msgid "This plugin imports SWIFT (MT940) data." msgstr "" #. type: Content of: #: src/plugins/imexporters/csv/csv.xml:4 msgid "Im-/exporter for CSV" msgstr "Im- und Exporter für CSV" #. type: Content of: #: src/plugins/imexporters/csv/csv.xml:6 msgid "This plugin imports/exports CSV data." msgstr "Dieses Modul im-/exportiert CSV-Dateien." #. type: Content of: #: src/plugins/imexporters/dtaus/dtaus.xml:4 msgid "DTAUS" msgstr "DTAUS" #. type: Content of: #: src/plugins/imexporters/dtaus/dtaus.xml:6 msgid "This plugin imports and exports DTAUS data." msgstr "Dieses Modul im-/exportiert DTAUS-Dateien." #. type: Content of: #: src/plugins/imexporters/eri2/eri2.xml:4 msgid "ERI" msgstr "" #. type: Content of: #: src/plugins/imexporters/eri2/eri2.xml:6 msgid "This plugin imports ERI data." msgstr "Dieses Plugin importiert ERI Daten." #. type: Content of: #: src/plugins/imexporters/openhbci1/openhbci1.xml:4 msgid "Old AqMoney1/OpenHBCI1 data" msgstr "" #. type: Content of: #: src/plugins/imexporters/openhbci1/openhbci1.xml:6 msgid "This plugin imports/exports old data from AqMoney1 and OpenHBCI1." msgstr "" #. type: Content of: #: src/plugins/imexporters/swift/swift.xml:4 msgid "Im-/exporter for SWIFT" msgstr "Im- und Exporter für SWIFT" #. type: Content of: #: src/plugins/imexporters/swift/swift.xml:6 msgid "This plugin imports SWIFT MT940 and MT942 data." msgstr "" #. type: Content of: #: src/plugins/imexporters/xmldb/xmldb.xml:4 msgid "XML DB" msgstr "" #. type: Content of: #: src/plugins/imexporters/xmldb/xmldb.xml:6 msgid "This plugin imports XML data." msgstr "Dieses Plugin importiert XML-Daten." #. type: Content of: #: src/plugins/imexporters/yellownet/yellownet.xml:4 msgid "YellowNet XML Data" msgstr "" #. type: Content of: #: src/plugins/imexporters/yellownet/yellownet.xml:6 msgid "This plugin imports YellowNet XML files." msgstr "" #. type: Content of: #: src/plugins/imexporters/sepa/sepa.xml:4 msgid "SEPA" msgstr "" #. type: Content of: #: src/plugins/imexporters/sepa/sepa.xml:6 msgid "This plugin exports SEPA data." msgstr "" #. type: Content of: #: src/plugins/imexporters/ctxfile/ctxfile.xml:4 msgid "This plugin directly reads and writes context files." msgstr "" #. type: Content of: #: src/plugins/imexporters/ctxfile/ctxfile.xml:6 msgid "This plugin imports/exports CTX files." msgstr "" #. type: Content of: #: src/plugins/imexporters/q43/q43.xml:4 msgid "This plugin reads and writes Spanish Q43 files." msgstr "" #. type: Content of: #: src/plugins/imexporters/q43/q43.xml:6 msgid "This plugin imports Q43 files." msgstr "" #. type: Content of: #: src/plugins/bankinfo/at/at.xml:4 msgid "Bank info provider for Austria" msgstr "" #. type: Content of: #: src/plugins/bankinfo/at/at.xml:6 msgid "This plugin handles Austrian banks." msgstr "" #. type: Content of: #: src/plugins/bankinfo/ca/ca.xml:4 msgid "Bank info provider for Canada" msgstr "" #. type: Content of: #: src/plugins/bankinfo/ca/ca.xml:6 msgid "This plugin handles Canadian banks." msgstr "" #. type: Content of: #: src/plugins/bankinfo/ch/ch.xml:4 msgid "Bank info provider for Switzerland" msgstr "" #. type: Content of: #: src/plugins/bankinfo/ch/ch.xml:6 msgid "This plugin handles Swiss banks." msgstr "" #. type: Content of: #: src/plugins/bankinfo/de/de.xml:4 msgid "Bank info checker for Germany" msgstr "" #. type: Content of: #: src/plugins/bankinfo/de/de.xml:6 msgid "This plugin handles German banks and accounts." msgstr "" #. type: Content of: #: src/plugins/bankinfo/us/us.xml:4 msgid "Bank info provider for the United States of America" msgstr "Bankinformationen für die USA" #. type: Content of: #: src/plugins/bankinfo/us/us.xml:6 msgid "This plugin handles US banks." msgstr "" #. type: Content of: #: src/plugins/backends/aqhbci/plugin/aqhbci.xml:4 msgid "HBCI backend using AqHBCI" msgstr "" #. type: Content of: #: src/plugins/backends/aqhbci/plugin/aqhbci.xml:6 msgid "This backend provides support for HBCI using AqHBCI." msgstr "" #. type: Content of: #: src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml:4 msgid "OFX-DirectConnect backend" msgstr "OFX DirectConnect Backend" #. type: Content of: #: src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml:6 msgid "This backend provides support for OFX-DirectConnect." msgstr "" #. type: Content of: #: src/plugins/backends/aqnone/aqnone.xml:4 msgid "Offline backend" msgstr "Offline-Backend" #. type: Content of: #: src/plugins/backends/aqnone/aqnone.xml:6 msgid "This backend allows using offline accounts." msgstr "" aqbanking-5.6.4beta/po/Makefile.am0000644000175000017500000000002112364015477013712 00000000000000EXTRA_DIST=de.po aqbanking-5.6.4beta/mksymlinks.sh0000644000175000017500000000654312643540101013777 00000000000000#!/bin/sh srcdir="$1" builddir="$2" # -------------------------------------------------------------------------- # # code # rm -Rf aqbanking5 2>/dev/null # The prefix to the source code (=srcdir) sprefix=`( cd ${srcdir} ; pwd )` # The prefix to the build directory (=builddir) bprefix=`pwd` # -------------------------------------------------------------------------- # # functions # symlinkFolder () { local dfiles local src local dst src="$1" dst="$2" dfiles=`( cd "${sprefix}/${src}" && ls 2>/dev/null )` for f in $dfiles; do if test -d "${src}/${f}"; then case "$f" in . | .. | CVS | .* | bin | tools) ;; *) symlinkFolder "${src}/${f}" "${dst}" ;; esac else case "${f}" in *_p.h | *_l.h | *.ui.h | version.h | system.h) ;; *.ui) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}.h" ln -s "${bprefix}/${src}/${f}.h" "${dst}/${f}.h" ;; version.h.in) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/version.h" ln -s "${bprefix}/${src}/version.h" "${dst}/version.h" ;; system.h.in) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/system.h" ln -s "${bprefix}/${src}/system.h" "${dst}/system.h" ;; *.h) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}" ln -s "${sprefix}/${src}/${f}" "${dst}/${f}" ;; *.hpp) AQ_HEADER_FILES="${AQ_HEADER_FILES} ${dst}/${f}" ln -s "${sprefix}/${src}/${f}" "${dst}/${f}" ;; esac fi done } # symlink all headers from src/lib/aqbanking AQ_HEADER_FILES="${sprefix}/version.h ${sprefix}/system.h" mkdir -p aqbanking5/aqbanking symlinkFolder "src/libs/aqbanking" "aqbanking5/aqbanking" ln -s "${bprefix}/version.h" aqbanking5/aqbanking/version.h ln -s "${bprefix}/system.h" aqbanking5/aqbanking/system.h ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_jobqueue.h" aqbanking5/aqbanking ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_accountqueue.h" aqbanking5/aqbanking ln -s "${bprefix}/src/libs/aqbanking/backendsupport/ab_userqueue.h" aqbanking5/aqbanking # symlink all headers from src/lib/aqbankingpp mkdir -p aqbanking5/aqbankingpp symlinkFolder "src/libs/aqbankingpp" "aqbanking5/aqbankingpp" # symlink all headers from src/plugins/backends/ dirlist='aqhbci aqofxconnect aqebics' # list might be empty for backend in ${dirlist} ; do mkdir -p aqbanking5/${backend} if [ -d "src/plugins/backends/${backend}/plugin" ] ; then symlinkFolder "src/plugins/backends/${backend}/plugin" "aqbanking5/${backend}" # symlink all subfolders for f in src/plugins/backends/${backend}/plugin/*; do if [ -d "src/plugins/backends/${backend}/plugin/$f" ] ; then case $f in .libs | .deps) ;; *) symlinkFolder "src/plugins/backends/${backend}/plugin/$f" "aqbanking5/${backend}" ;; esac fi done fi done if [ -d aqbanking5/aqofxconnect ] ; then ln -s "${bprefix}/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_data.h" aqbanking5/aqofxconnect ln -s "${bprefix}/src/plugins/backends/aqofxconnect/plugin/libofxhome/oh_institute_spec.h" aqbanking5/aqofxconnect fi rm -f sl-headers 2>/dev/null for i in ${AQ_HEADER_FILES}; do echo "$i" >>sl-headers done aqbanking-5.6.4beta/Makefile.am0000644000175000017500000002056712613472114013305 00000000000000SUBDIRS=admin doc m4 src po @TUTORIALS@ DIST_SUBDIRS=admin doc m4 src po tutorials EXTRA_DIST=AUTHORS COPYING ChangeLog INSTALL NEWS README \ aqbanking.spec.in aqbanking.spec \ aqbanking.iss.in aqbanking.iss \ Doxyfile.in version.h.in system.h.in \ i18nsources \ mksymlinks.sh.in mksymlinks.sh Makefile.cvs idatadir=${datadir}/doc/aqbanking idata_DATA=AUTHORS COPYING ChangeLog README bin_SCRIPTS=aqbanking-config aclocaldir = $(datadir)/aclocal dist_aclocal_DATA = aqbanking.m4 ACLOCAL_AMFLAGS = $(ADD_ACLOCAL_FLAGS) -I m4 iheaderdir=@aqbanking_headerdir_am@/aqbanking iheader_HEADERS=\ version.h system.h CLEANFILES = aqbanking-config aqbanking-config.in aqbanking-config: aqbanking-config.in echo "#! /bin/sh" >aqbanking-config && \ echo 'dir="@prefix@"' >>aqbanking-config && \ cat aqbanking-config.in >>aqbanking-config && \ chmod a+x aqbanking-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = aqbanking.pc cmakeconfigdir = $(libdir)/cmake/aqbanking-$(AQBANKING_VERSION_MAJOR).$(AQBANKING_VERSION_MINOR) cmakeconfig_DATA = aqbanking-config.cmake aqbanking-config-version.cmake listdoc.h: $(gwenhywfar_bindir)/mklistdoc -I $(gwenhywfar_headers) -v `find $(aqbanking_symlinkdir) -name '*.h' | LC_ALL=C sort ` >listdoc.h srcdoc: Doxyfile listdoc.h if test -d apidoc; then rm -Rf apidoc; fi mkdir -p apidoc/html/aqbanking-@AQBANKING_VERSION_RELEASE_STRING@ doxygen install-srcdoc: srcdoc test -d "$(DESTDIR)@docpath@/$(PACKAGE)" || \ mkdir -p "$(DESTDIR)@docpath@/$(PACKAGE)" for f in apidoc/html/aqbanking-@AQBANKING_VERSION_RELEASE_STRING@/*; do \ cp $$f "$(DESTDIR)@docpath@/$(PACKAGE)/"; \ done cp "apidoc/$(PACKAGE).tag" "$(DESTDIR)@docpath@/" if test -x "$(DESTDIR)@docpath@/$(PACKAGE)/installdox"; then \ cd "$(DESTDIR)@docpath@/$(PACKAGE)" && \ ID_OPT="-q" ; \ for ff in ${DOXYGEN_TAGFILES}; do \ ID_OPT="$$ID_OPT -l `basename $$ff`@../`basename $$ff | $(SED) -e s/.tag//`";\ done ;\ ( cd "$(DESTDIR)@docpath@/$(PACKAGE)" && \ ./installdox -q $$ID_OPT \ ); \ fi rpm: $(PACKAGE).spec dist rpmbuild="rpm" && \ if [ `rpm --version | awk '{ print $$3 }'` > /dev/null ]; then rpmbuild="rpmbuild"; fi && \ $$rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz # Rule for using the Inno Setup compiler. The path to iscc.exe is set # manually here for now. ISCC = "C:\Programme\Inno Setup 5\iscc.exe" wintmpdir = win32-tmp setup: aqbanking.iss mkdir -p $(wintmpdir) for A in `find src/plugins -name *.la`; do \ grep -v relink_command $${A} > $${A}.tmp && \ mv $${A}.tmp $${A}; \ done $(MAKE) DESTDIR="`pwd`/$(wintmpdir)" \ aqbanking_pkgdatadir="/share/$(PACKAGE)" \ gwenhywfar_plugins="/gwen" \ WIN_PATH_WINDOWS_MINGW="/windows" \ install \ && for A in `find $(wintmpdir) -name '*.exe'`; do \ strip $${A}; \ done \ && $(ISCC) aqbanking.iss \ && rm -rf $(wintmpdir) if IF_MAKE_I18N_FILES # We directly read that file list. For old make programs, you would # set this to an empty variable, because they are only needed by the # developers and release technicians. I18NFILES=$(shell cat $(srcdir)/i18nsources) DLGFILES=$(shell cat $(srcdir)/dlgsources) PDFILES=$(shell cat $(srcdir)/pdsources) # Current build rule: sources: rm -f $(srcdir)/i18nsources $(srcdir)/dlgsources $(srcdir)/pdsources $(MAKE) -C $(top_builddir)/src sources $(srcdir)/i18nsources $(srcdir)/dlgsources $(srcdir)/pdsources: $(MAKE) sources # Could also be solved this way: Read the I18NFILES variable from file #include $(srcdir)/i18nsources # (Needs the following build rule:) #sources: # rm -f $(srcdir)/i18nsources # $(MAKE) -C $(top_srcdir)/src sources # mv $(srcdir)/i18nsources $(srcdir)/i18nsources.tmp # echo "I18NFILES = \\" > $(srcdir)/i18nsources # $(SED) 's!\(^.*$$\)!$$(top_srcdir)/\1 \\!' \ # $(srcdir)/i18nsources.tmp >> $(srcdir)/i18nsources # echo '$$(top_srcdir)/config.h' >> $(srcdir)/i18nsources # rm -f $(srcdir)/i18nsources.tmp # $(MAKE) Makefile # The list of available languages (makes file name transformations much easier) ALL_LINGUAS = $(basename $(notdir $(shell ls $(srcdir)/po/*.po))) # For old make programs, the locales would directly be written here: #ALL_LINGUAS = de # List of po files. Only necessary in the dependency of the catalogs # rule. For old make programs, you would simpy set this to an empty # variable. I18NLINGUAS = $(foreach lang,$(ALL_LINGUAS),$(srcdir)/po/$(lang).po) # List of mo files. Only necessary for cleanup. For old make programs, # you would simply set this to an empty variable. I18NCATALOGS = $(foreach lang,$(ALL_LINGUAS),$(top_builddir)/po/$(lang).mo) I18NCATALOGS += $(foreach lang,$(ALL_LINGUAS),$(top_builddir)/po/$(lang).qm) po/$(PACKAGE).pot: i18nsources dlgsources pdsources $(I18NFILES) rm -f po/tmp* if test -n "$(I18NFILES)"; then \ $(XGETTEXT) -C -c -ki18n -ktr2i18n -kI18N -kI18S\ -kI18N_NOOP -ktranslate -kaliasLocale \ -ktr -ktrUtf8 \ '--msgid-bugs-address=aqbanking-user@lists.aqbanking.de' \ -o po/tmppot \ $(I18NFILES) ; \ fi for i in $(DLGFILES); do \ po4a-gettextize -f xml -m $$i -p po/tmppot1 -o attributes=text && \ msghack -o po/tmppot2 --append po/tmppot po/tmppot1 && \ mv po/tmppot2 po/tmppot; \ done for i in $(PDFILES); do \ po4a-gettextize -f xml -m $$i -p po/tmppot1 -o wrap \ -o translated=" " \ -o untranslated=" " \ && \ msghack -o po/tmppot2 --append po/tmppot po/tmppot1 && \ mv po/tmppot2 po/tmppot; \ done mv po/tmppot po/$(PACKAGE).pot rm -f po/tmppot1 # This rule is not called automatically. It is necessary only for # the translators, so translators only call this manually. merge: po/$(PACKAGE).pot @catalogs=$(I18NLINGUAS); \ for cat in $$catalogs; do \ echo msgmerge -o $$cat.new $$cat ./po/$(PACKAGE).pot ; \ msgmerge -o $$cat.new $$cat ./po/$(PACKAGE).pot ; \ if test -s $$cat.new; then \ grep -v "\"POT-Creation" $$cat.new | grep -v '^#' > $$cat.new.2 ; \ grep -v "\"POT-Creation" $$cat | grep -v '^#' >> $$cat.new.1; \ if diff $$cat.new.1 $$cat.new.2; then \ echo " $$cat unchanged; leaving existing po file untouched."; \ rm $$cat.new; \ else \ mv $$cat.new $$cat ; \ fi; \ rm -f $$cat.new.1 $$cat.new.2 ;\ fi ;\ done catalogs: $(I18NLINGUAS) @for i in $(ALL_LINGUAS); do \ filelingua=$(srcdir)/po/$$i.po; \ filecat=$(top_builddir)/po/$$i.mo; \ fileqm=$(top_builddir)/po/$$i.qm; \ echo "Creating translation catalogs for language \"$$i\""; \ $(MSGFMT) -o $${filecat} $${filelingua} || touch $${filelingua}; \ if test $(MSGFMT_SUPPORTS_QT) = "yes"; then \ $(MSGFMT) -o $${fileqm} --qt $${filelingua} || touch $${filelingua}; \ else \ echo "$(MSGFMT) does not have the option --qt; ignoring qt translations"; \ fi; \ done ilocaledir = $(datadir)/locale install-mo-catalogs: catalogs @for i in $(ALL_LINGUAS); do \ filecat=$(top_builddir)/po/$$i.mo; \ fileqm=$(top_builddir)/po/$$i.qm; \ echo "Installing translation catalog for language \"$$i\""; \ $(mkinstalldirs) "$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES"; \ $(INSTALL_DATA) $${filecat} $(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo; \ done uninstall-mo-catalogs: @$(NORMAL_UNINSTALL) @for i in $(ALL_LINGUAS); do \ echo " rm -f '$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo'"; \ rm -f "$(DESTDIR)$(ilocaledir)/$$i/LC_MESSAGES/$(PACKAGE).mo"; \ done install-data-local: install-mo-catalogs uninstall-local: uninstall-mo-catalogs CLEANFILES += $(I18NCATALOGS) endif # if USE_I18N # Rule for only building the source rpm srpm: $(PACKAGE).spec dist rpmbuild="rpm" && \ if [ `rpm --version | awk '{ print $$3 }'` > /dev/null ]; then rpmbuild="rpmbuild"; fi && \ $$rpmbuild --nodeps -ts $(PACKAGE)-$(VERSION).tar.gz BUILT_SOURCES = $(iheader_HEADERS) sl-headers CLEANFILES += $(BUILT_SOURCES) symlinks: mksymlinks.sh ${SHELL} mksymlinks.sh $(srcdir) $(builddir) sl-headers: mksymlinks.sh $(MAKE) -C src built_sources ${SHELL} mksymlinks.sh $(srcdir) $(builddir) # Call this to have Qt's uic files and glade files cleaned up from # bad elements code-cleanup: -admin/fixuifiles -admin/glade-fixup cppcheck: for f in `find . -name \*.c -o -name \*.cpp`; do cppcheck $$f; done ChangeLog: git log -n 100 --pretty="format:------------------------------------------------------------------%n%ai %an%n%s%n%b" >ChangeLog dist-hook: rm -f ChangeLog 2>/dev/null $(MAKE) ChangeLog aqbanking-5.6.4beta/version.h0000644000175000017500000000162012643540105013073 00000000000000/*************************************************************************** begin : Mon Mar 01 2004 copyright : (C) 2004 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * Please see toplevel file COPYING for license details * ***************************************************************************/ #ifndef AQBANKING_VERSION_H #define AQBANKING_VERSION_H #define AQBANKING_VERSION_MAJOR 5 #define AQBANKING_VERSION_MINOR 6 #define AQBANKING_VERSION_PATCHLEVEL 4 #define AQBANKING_VERSION_BUILD 0 #define AQBANKING_VERSION_TAG "beta" #define AQBANKING_VERSION_FULL_STRING "5.6.4.0beta" #define AQBANKING_VERSION_STRING "5.6.4" #define AQBANKING_SO_CURRENT 40 #define AQBANKING_SO_REVISION 4 #define AQBANKING_SO_AGE 5 #define AQBANKING_SO_EFFECTIVE 35 #endif /* AQBANKING_VERSION_H */ aqbanking-5.6.4beta/ChangeLog0000644000175000017500000006013512643540632013022 00000000000000------------------------------------------------------------------ 2016-01-07 20:49:24 +0100 Martin Preuss Prepared release 5.6.4beta. ------------------------------------------------------------------ 2016-01-07 20:43:08 +0100 Martin Preuss Fixed a bug in XML description file. I don't know where this bug comes from... It leads to the secProfile/version being put into the HNVSK segment multiple times... The netbank server is quite gentle about this as it just ignores the additional elements, other servers aren't that forgiving. ------------------------------------------------------------------ 2016-01-06 19:23:02 +0100 Martin Preuss Work on bug #190. ------------------------------------------------------------------ 2015-12-27 13:31:01 +0100 Martin Preuss AqHBCI: Use the correct mode specification in HNVSK for PIN/TAN. ------------------------------------------------------------------ 2015-12-27 13:30:23 +0100 Martin Preuss Added some remarks. ------------------------------------------------------------------ 2015-12-20 20:45:34 +0100 Martin Preuss Fixed a "off-by-one" error (report and patch by Martin Kuehn, thanks!!). ------------------------------------------------------------------ 2015-12-20 17:42:34 +0100 Martin Preuss AqHBCI: Work on job AH_Job_SepaStandingOrdersGet. The job should now be able to import standings orders. The next step will be to create an importer for various SEPA formats (starting with PAIN 001.001.02 because that's what my bank delivers). ------------------------------------------------------------------ 2015-12-20 17:40:50 +0100 Martin Preuss Removed umlaut from comment (messes with eFTE). ------------------------------------------------------------------ 2015-12-15 18:00:10 +0100 Martin Preuss Reorganized some file in aqhbci. Each code file should be compiled by its own, including of source files should be minimized. ------------------------------------------------------------------ 2015-11-17 12:22:49 -0500 R.Weiner Deleted Comments (superfluous) in HKCDL Delete test-printf() in jobsepastandingordercreate.c ------------------------------------------------------------------ 2015-11-13 21:08:40 +0100 Martin Preuss Prepared release 5.6.3beta. ------------------------------------------------------------------ 2015-10-27 16:47:38 -0400 R.Weiner NEW: HKCDL for SEPA Patch (sequential of '0000-NEW-HKCDL-for-SEPA.patch') 5 Files added. ------------------------------------------------------------------ 2015-10-27 16:47:38 -0400 R.Weiner NEW: HKCDL for SEPA Use of aqbanking-cli sepacreatesto for HKCDE and HKCDL: HKCDE: aqbanking-cli sepacreatesto .. HKCDL: aqbanking-cli sepacreatesto .. --fiId= In separecurtransfer.c you can find a new if-else-statment to distinguish between CreateStandingOrder and DeleteStandingOrder. ------------------------------------------------------------------ 2015-11-13 20:26:36 +0100 Martin Preuss Fixed last patch (fixed mixing of variable definitions and code). ------------------------------------------------------------------ 2015-11-13 20:24:09 +0100 Martin Preuss Applied a patch submitted by martin.m.kuehn. ------------------------------------------------------------------ 2015-11-09 22:36:44 +0100 Martin Preuss Prepared release 5.6.2beta. ------------------------------------------------------------------ 2015-11-09 22:35:37 +0100 Martin Preuss Fixed another bug in HHD code for version 1.4 (as suggested by Martin Kuehn). ------------------------------------------------------------------ 2015-11-06 23:26:07 +0100 Martin Preuss Fixed a bug in HHD1.4 flicker code setup. ------------------------------------------------------------------ 2015-10-26 19:43:02 +0100 Martin Preuss Adjusted size of challengeHUD field. ------------------------------------------------------------------ 2015-07-13 21:42:48 +0200 Micha Lenk Make contents of listdoc.h reproducible There is a Debian initiative working on making builds reproducible, i.e. to make it possible to reproduce byte-for-byte identical binary packages from a given source. https://wiki.debian.org/ReproducibleBuilds The contents of listdoc.h is generated by the output of "find include -name '*.h'". Unfortunately the output of this command depends on readdir()'s output, which in general is non-deterministic. Under some yet unknown conditions this can result in unreproducible API documentation for Gwenhywfar. By sorting the output of "find" the generated API documentation should become reliably reproducible. ------------------------------------------------------------------ 2015-06-01 19:16:43 +0200 Martin Preuss Disabled debug output again. ------------------------------------------------------------------ 2015-06-01 19:16:18 +0200 Martin Preuss Hmm, the problem with SEPA tags in SWIFT parser is more persistent than I thought... Should be fixed now. ------------------------------------------------------------------ 2015-06-01 18:33:09 +0200 Martin Preuss Prepared release 5.6.1beta. ------------------------------------------------------------------ 2015-05-31 16:22:55 +0200 Martin Preuss Removed unneeded code. ------------------------------------------------------------------ 2015-05-31 16:11:46 +0200 Martin Preuss SWIFT: Really fixed the no-SEPA-tags problem. Even if there is no real SEPA tag, the code always creates a "_purpose" variable ion dbSepaTags, so a simple test for an empty dbSepaTags isn't enough... ------------------------------------------------------------------ 2015-05-31 15:50:40 +0200 Martin Preuss SWIFT_Parser: Fixed a problem with transaction without SEPA tags. If a transaction does not contain SEPA tags then the purpose strings are handles as before. ------------------------------------------------------------------ 2015-05-31 14:34:19 +0200 Matthias Gehre AcHBCI: DKKKU: Set FiId from "Referenz" ------------------------------------------------------------------ 2015-05-31 13:07:16 +0200 Matthias Gehre AqHBCI: Update of DKKKU to handle additional purpose lines ------------------------------------------------------------------ 2015-05-25 18:33:24 +0200 Martin Preuss Prepared release 5.6.0beta. ------------------------------------------------------------------ 2015-05-25 18:33:12 +0200 Martin Preuss Updated German bank data. ------------------------------------------------------------------ 2015-05-25 13:23:32 +0200 Elias Oltmanns AqHBCI: Add support for COR1 SEPA multi debit notes. ------------------------------------------------------------------ 2015-05-25 11:39:30 +0200 Elias Oltmanns AqHBCI: Remove autogenerated file from repository Commit 35292bfb erroneously added plugin/ajobs/accountjobs.xml to the repository. Just drop it again and adjust the corresponding entry in .gitignore instead. ------------------------------------------------------------------ 2015-05-20 21:51:40 +0200 Martin Preuss Fixed a memory leak. Correctly fixes a memory leak regarding "ctx". ------------------------------------------------------------------ 2015-05-20 21:32:24 +0200 Martin Preuss Partly revert a patch: Removed an errornous call to GWEN_Crypt_Token_Context_free(). The object "ctx" ist still used after that call, because we use some variables later which are stored inside the "ctx" object (e.g. in "luserId" etc). So we must not free the object at that point... ------------------------------------------------------------------ 2015-05-17 18:51:51 +0200 Martin Preuss Disabled debugging code. ------------------------------------------------------------------ 2015-05-17 18:51:23 +0200 Martin Preuss Removed unneeded code. ------------------------------------------------------------------ 2015-05-17 13:18:34 +0200 Martin Preuss Minor fix of SWIFT parser. Manually add purpose string outside a SEPA field as its own purpose line. ------------------------------------------------------------------ 2015-05-17 12:28:12 +0200 Martin Preuss Mainly a test for the CVS mailing list. ------------------------------------------------------------------ 2015-05-17 12:19:55 +0200 Martin Preuss Removes some unneeded preprocessor commands. ------------------------------------------------------------------ 2015-05-17 12:16:04 +0200 Martin Preuss Adapted SWIFT MT940 parser to bad behavior of some bank servers. Some banks - namely Sparda bank - don't adhere to the specs which state that SEPA fields (e.g. "EREF+") must start at SWIFT groups (e.g. "?20"). However, those banks put those SEPA tags anywere inside the SWIFT groups, so we need to concatenate all the purpose lines and cut out the SEPA fields by ourselves. This WILL change the output for those banks so that know the important information gets extracted now. This should not change the output for banks which already behave according to the specs (at least it does not for Sparkasse Wilhelmshaven, which always followed the specs here). ------------------------------------------------------------------ 2015-05-16 14:37:54 +0200 Micha Lenk Re-work Compiler Symbol Visibility Check This was inspired by http://stackoverflow.com/questions/5987219/best-practices-for-probing-for-symbol-visibility-extensions-in-autoconf ------------------------------------------------------------------ 2015-05-15 19:24:47 +0000 Micha Lenk Fix symbol visibilty check for GCC 5.x GCC 5.x supports the -fvisibility=hidden flag too. ------------------------------------------------------------------ 2015-05-10 17:08:40 +0200 Micha Lenk Drop unsubstituted variables from aqbanking.pc.in These variables are currently not substituted by ./configure, so they could not have worked for quite a while. Taking a closer look: - aqhbci_plugindir isn't defined by configure.ac - aqhbci_datadir referred to @aqhbci_data@, i.e. a typo - qbanking_libs, qbanking_datadir, q4banking_libs and q4banking_datadir refer to the gone frontend libraries qbanking and q4banking. ------------------------------------------------------------------ 2015-05-10 14:36:48 +0200 Micha Lenk Add configure option --with-build-datetime for fixed build timestamps With free software, anyone can inspect the source code for malicious flaws. But Debian provide binary packages to its users. The idea of “deterministic†or “reproducible†builds is to empower anyone to verify that no flaws have been introduced during the build process by reproducing byte-for-byte identical binary packages from a given source. See also https://wiki.debian.org/ReproducibleBuilds/About To support this idea, AqBanking should avoid adding timestamps to generated build artifacts. Currently it uses the DATETIME variable based on the output of `date +"%Y%m%d%H%M%S"' to auto-generate a version string for aqhbci.xml (see src/plugins/backends/aqhbci/plugin/header.xml.in line 4). Specifying this option the build system can influence this variable, so that the Debian packaging can ensure the same value is generated when building the same source package at a later time. ------------------------------------------------------------------ 2015-05-04 00:03:33 +0200 Micha Lenk Revert "Disable timestamps in HTML pages generated by Doxygen" This reverts commit 214dad250316f00f55b9dcb21b3ed8ad74d02cf1. Debian's Doxygen as of version 1.8.9.1-3 will have this disabled by default, so this change is not needed anymore. ------------------------------------------------------------------ 2015-04-13 19:35:45 +0200 Micha Lenk Disable timestamps in HTML pages generated by Doxygen There is a Debian initiative working on making builds reproducible, i.e. to make it possible to reproduce byte-for-byte identical binary packages from a given source. https://wiki.debian.org/ReproducibleBuilds One reason why AqBanking currently is not reproducible is the use of timestamps in HTML pages generated by Doxygen. More details about this particular issue can be found here: https://wiki.debian.org/ReproducibleBuilds/TimestampsInDocumentationGeneratedByDoxygen ------------------------------------------------------------------ 2015-04-05 10:43:47 +0200 Christian Stimming document functions and log levels ------------------------------------------------------------------ 2015-03-09 20:52:03 +0100 Tomas Pospisek rename AHB_SWIFT__ReadDocument to AHB_SWIFT_ReadTextBlock ------------------------------------------------------------------ 2015-02-01 22:22:21 +0100 Micha Lenk Force effective SONAME bump in next release This is needed because some symbols that were released in an earlier release got dropped in commit 2caec44c464b8894eba6075b3257bf79e276f922. ------------------------------------------------------------------ 2015-01-07 21:24:53 +0100 Martin Preuss Decreased verbosity even more. Apparently this message shows more often than I expected, and it is quite annoying. So I decreased the verbosity to only show this message if the loglevel is INFO or more. ------------------------------------------------------------------ 2015-01-07 20:53:39 +0100 Christian Stimming Decreate aqbanking logger verbosity: Set the initial "notice" value only if the logger did not yet exist. If the logger already exists, this is most likely because the application already set some LogLevel, and this shouldn't be overridden here. ------------------------------------------------------------------ 2015-01-02 21:30:42 +0100 Martin Preuss Prepared release 5.5.1 ------------------------------------------------------------------ 2014-11-11 22:41:16 +0100 Martin Preuss Reworked SWIFT MT940 parser. The Netbank/Sparda server is extremely nasty: The FinTS specs state, that a new SEPA identifier must start in a new SWIFT subfield ("?20" etc). However, this server just sends the SEPA multiple tags like "EREF+" et al within a single subfield, so our parser, adhering to the specs, can't parse the purpose string from this server... The next step will have to be to just concatenate all purpose-related subfields and try to read those SEPA tags from a single line. This is extremely ugly, and it will also significantly slow down the parser, and all that because those banking IT guys can't adhere to the specs which are extremely clean regarding this point... ------------------------------------------------------------------ 2014-11-11 22:06:00 +0100 Martin Preuss SWIFT Parser: Removed old code. ------------------------------------------------------------------ 2014-08-19 21:54:10 +0200 Rudi Weiner Add HKDAL in aqbanking-cli ------------------------------------------------------------------ 2014-10-08 20:42:48 +0200 Christian Stimming Extend aqhbci-tool "listaccounts" to optionally also show subAccountId and UniqueId. ------------------------------------------------------------------ 2014-10-06 20:49:29 +0200 Christian Stimming Fix erroneous double-free when aborting the multijobs. ------------------------------------------------------------------ 2014-09-27 23:30:01 +0200 Christian Stimming Code refactoring: Cover multi-transfers and multi-debitnotes by the same command implementation. The actual source code differences were really only the AB_JobSepa** creation call, so this could easily be merged into one command implementation. ------------------------------------------------------------------ 2014-09-26 23:06:36 +0200 Christian Stimming Improve error handling in sepadebitnotes: Parse through all transactions, showing all errors, and only abort before actually executing. ------------------------------------------------------------------ 2014-09-26 22:58:37 +0200 Christian Stimming Fix wrong check of IBAN codes: A failed checksum check was errorneously ignored. ------------------------------------------------------------------ 2014-09-24 22:12:34 +0200 Christian Stimming Fix default profileName of sepadebitnotes. Fix documentation string. Pointed out by Claus-Justus Heine . ------------------------------------------------------------------ 2014-09-23 22:34:50 +0200 Christian Stimming Add option in sepadebitnotes to use COR1 version in multi debit note job. ------------------------------------------------------------------ 2014-09-23 22:32:46 +0200 Christian Stimming Minor refactoring: Merge almost identical command calling code into one file and an extra function argument. ------------------------------------------------------------------ 2014-09-23 11:57:58 +0200 Micha Lenk Small corrections in German translation This was originally reported as Debian bug #762374 by Mechtilde . https://bugs.debian.org/762374 ------------------------------------------------------------------ 2014-09-22 23:03:37 +0200 Christian Stimming Fix command line help: Let all commands appear as help text. Sort help and commands in identical order. ------------------------------------------------------------------ 2014-09-21 22:25:58 +0200 Christian Stimming Add useful error message if profile file cannot be parsed. ------------------------------------------------------------------ 2014-08-30 11:56:36 +0200 Martin Preuss Updated German bankinfo files. ------------------------------------------------------------------ 2014-08-20 21:44:21 +0200 Martin Preuss Administrative changes: Shorten paths of some AqHBCI files. "tar" has a filename limit of 99, so we need to shorten the total path, otherwise "make dist" will fail. ------------------------------------------------------------------ 2014-08-19 21:13:17 +0200 Martin Preuss Merge branch 'master' of https://git.aqbanking.de/git/aqbanking ------------------------------------------------------------------ 2014-08-19 21:08:20 +0200 Martin Preuss SEPA exporter: Changed default for "singleBookingWanted" to 1 One user reported that the current default of 0 doesn't work. ------------------------------------------------------------------ 2014-08-15 13:28:43 +0200 Elias Oltmanns AqHBCI: Parse credit card transactions more liberally. ------------------------------------------------------------------ 2014-08-15 19:00:10 +0200 martin Test, please ignore. ------------------------------------------------------------------ 2014-08-12 23:24:53 +0200 Martin Preuss Added some entries to the TODO list. ------------------------------------------------------------------ 2014-08-12 21:49:37 +0200 Martin Preuss aqbanking-tool: Mention the sepatransfers command (Holger Hans Peter Freyther) ------------------------------------------------------------------ 2014-08-12 21:07:44 +0200 Martin Preuss Prepared GIT-release for Andreas. ------------------------------------------------------------------ 2014-08-12 21:04:19 +0200 Martin Preuss Removed some duplicate fields from AB_TRANSACTION. - mandateReference (replaced by mandateId) - creditorIdentifier (replaced by creditorSchemeId) ------------------------------------------------------------------ 2014-08-04 22:21:23 +0200 Martin Preuss aqbanking-cli: Added new requst type "sepaSto" for SEPA standing orders. ------------------------------------------------------------------ 2014-08-04 22:20:57 +0200 Martin Preuss AqHBCI: More work on AH_Job_SepaStandingOrdersGet. ------------------------------------------------------------------ 2014-08-04 22:20:29 +0200 Martin Preuss AqHBCI: Fixed XML definition for JobSepaStandingOrderGet. ------------------------------------------------------------------ 2014-08-03 23:14:31 +0200 Martin Preuss AqHBCI: Fixed a typo. ------------------------------------------------------------------ 2014-08-03 23:14:19 +0200 Martin Preuss Added new CMAKE files to .gitignore. ------------------------------------------------------------------ 2014-08-03 23:07:16 +0200 Martin Preuss Added CMake package configuration files Makes live for cmake users a lot easier. It is not platform idependent as the library extension .so is hard coded. Signed-off-by: Martin Preuss ------------------------------------------------------------------ 2014-08-03 19:17:42 +0200 Martin Preuss AqHBCI: Started working on job SepaGetStandingOrders. ------------------------------------------------------------------ 2014-08-03 19:16:59 +0200 Martin Preuss AqBanking: Added job SepaGetStandingOrders. Also added handling for some other jobs in AB_Job_Type2Char() and AB_Job_Type2LocalChar(). ------------------------------------------------------------------ 2014-08-02 18:24:36 +0200 Martin Preuss Added test-driver to .gitingore. ------------------------------------------------------------------ 2014-08-02 18:24:05 +0200 Martin Preuss Force IBAN and BIC for SEPA transfers and debit notes. The group "kti_i" his quite vague, it allows for either national or international specification of the local bank account, the parser can't handle that too well. Some jobs need SEPA info (e.g. the SEPA transfer jobs), and for those the parser should fail if IBAN or BIC are missing. ------------------------------------------------------------------ 2014-08-02 18:21:35 +0200 Martin Preuss Fixed a typo. ------------------------------------------------------------------ 2014-08-02 18:21:27 +0200 Martin Preuss Added compile to .gitignore. ------------------------------------------------------------------ 2014-07-15 22:52:17 +0200 Martin Preuss Ok, one more test for the email notifier... At least this one informs me about changed to the GIT repository. Maybe I will change later to git-multimail... ------------------------------------------------------------------ 2014-07-15 22:34:48 +0200 Martin Preuss Last test for today... ------------------------------------------------------------------ 2014-07-15 22:31:08 +0200 Martin Preuss Test5. ------------------------------------------------------------------ 2014-07-15 22:28:54 +0200 Martin Preuss Test4... ------------------------------------------------------------------ 2014-07-15 22:24:55 +0200 Martin Preuss Test3... ------------------------------------------------------------------ 2014-07-15 22:20:07 +0200 Martin Preuss Test... ------------------------------------------------------------------ 2014-07-15 21:31:10 +0200 Martin Preuss Test... ------------------------------------------------------------------ 2014-07-03 11:45:41 +0000 martin SEPA exporter: Fix some memory leaks. From: Elias Oltmanns git-svn-id: https://devel.aqbanking.de/svn/aqbanking/trunk@2595 5c42a225-8b10-0410-9873-89b7810ad06e ------------------------------------------------------------------ 2014-07-03 11:44:30 +0000 martin SEPA exporter: Enforce explicit setting of sequence type for debit notes. From: Elias Oltmanns git-svn-id: https://devel.aqbanking.de/svn/aqbanking/trunk@2594 5c42a225-8b10-0410-9873-89b7810ad06e ------------------------------------------------------------------ 2014-07-03 11:43:17 +0000 martin SEPA exporter: Eliminate reference to uninitialised variable. From: Elias Oltmanns git-svn-id: https://devel.aqbanking.de/svn/aqbanking/trunk@2593 5c42a225-8b10-0410-9873-89b7810ad06e ------------------------------------------------------------------ 2014-06-15 20:11:18 +0000 mlenk aqbanking-cli: Fix parameters for calling AH_Provider_SendDtazv from libaqhbci The parameter 'withProgress' were added to function AH_Provider_SendDtazv in SVN revision 1860. Prior to this change the function used a hard-coded 1 instead of the new parameter. So I figured that 1 is the correct value to restore the behavior prior to rev. 1860. This fixes the compiler error intentionally introduced by the previous commit. This fixes a regression that was introduced in SVN revision 1860 and that was discovered thanks to Michael Tautschnig reporting Debian bug #750046 ( http://bugs.debian.org/750046 ). git-svn-id: https://devel.aqbanking.de/svn/aqbanking/trunk@2592 5c42a225-8b10-0410-9873-89b7810ad06e ------------------------------------------------------------------ 2014-06-15 19:43:17 +0000 mlenk Fix conflicting declarations of function AH_Provider_SendDtazv aqbanking-cli used a local declaration of function AH_Provider_SendDtazv that is used at compile time. It shadows the real one from libaqhbci that is used at link time. This would not matter if the types of both functions match, but they do not match. I fixed this by dumping the local declaration in aqbanking-cli. Instead I included the ones from libaqhbci that are also used at linktime. This will now cause a compile error because the function paramter counts differ. Thanks to Michael Tautschnig for discovering and reporting this issue in Debian bug #750046, see http://bugs.debian.org/750046 . git-svn-id: https://devel.aqbanking.de/svn/aqbanking/trunk@2591 5c42a225-8b10-0410-9873-89b7810ad06e aqbanking-5.6.4beta/m4/0000755000175000017500000000000012643540650011643 500000000000000aqbanking-5.6.4beta/m4/os.m40000644000175000017500000000571012364015477012455 00000000000000# $Id$ # (c) 2002 Martin Preuss # These functions guess your operation system AC_DEFUN([AQ_CHECK_OS],[ dnl IN: dnl - AC_CANONICAL_SYSTEM muste be called before dnl OUT: dnl Variables: dnl OSYSTEM: Short name of your system (subst) dnl OS_TYPE: either "posix" or "windows" (subst) dnl MAKE_DLL_TARGET: under windows this is set to "dll" (subst) dnl INSTALL_DLL_TARGET: under Windows this is set to "dll-install" (subst) dnl Defines: dnl OS_NAME: full name of your system dnl OS_SHORTNAME: short name of your system dnl Depending on your system one of the following is defined in addition: dnl OS_LINUX, OS_OPENBSD, OS_FREEBSD, OS_BEOS, OS_WIN32 # check for OS AC_MSG_CHECKING([host system type]) OSYSTEM="" OS_TYPE="" MAKE_DLL_TARGET="" INSTALL_DLL_TARGET="" AC_DEFINE_UNQUOTED(OS_NAME,"$host", [host system]) case "$host" in *-linux*) OSYSTEM="linux" AC_DEFINE(OS_LINUX,1,[if linux is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-solaris*) OSYSTEM="solaris" AC_DEFINE(OS_SOLARIS,1,[if Solaris is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-darwin*) OSYSTEM="osx" AC_DEFINE(OS_DARWIN,1,[if Apple Darwin is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-openbsd*) OSYSTEM="openbsd" AC_DEFINE(OS_OPENBSD,1,[if OpenBSD is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-freebsd* | *-kfreebsd*) OSYSTEM="freebsd" AC_DEFINE(OS_FREEBSD,1,[if FreeBSD is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-netbsd*) OSYSTEM="netbsd" AC_DEFINE(OS_NETBSD,1,[if NetBSD is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-beos*) OSYSTEM="beos" AC_DEFINE(OS_BEOS,1,[if BeOS is used]) AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) OS_TYPE="posix" ;; *-win32*) OSYSTEM="windows" AC_DEFINE(OS_WIN32,1,[if WIN32 is used]) OS_TYPE="windows" AC_DEFINE_UNQUOTED(BUILDING_DLL,1,[if DLL is to be built]) MAKE_DLL_TARGET="dll" INSTALL_DLL_TARGET="dll-install" ;; *-mingw32*) OSYSTEM="windows" AC_DEFINE(OS_WIN32,1,[if WIN32 is used]) OS_TYPE="windows" AC_DEFINE_UNQUOTED(BUILDING_DLL,1,[if DLL is to be built]) MAKE_DLL_TARGET="dll" INSTALL_DLL_TARGET="dll-install" ;; *-palmos*) OSYSTEM="palmos" AC_DEFINE(OS_PALMOS,1,[if PalmOS is used]) OS_TYPE="palmos" ;; *) AC_MSG_WARN([Sorry, but host $host is not supported. Please report if it works anyway. We will assume that your system is a posix system and continue.]) OSYSTEM="unknown" OS_TYPE="posix" AC_DEFINE(OS_POSIX,1,[if this is a POSIX system]) ;; esac AC_SUBST(OSYSTEM) AC_DEFINE_UNQUOTED(OS_SHORTNAME,"$OSYSTEM",[host system]) AC_SUBST(OS_TYPE) AC_DEFINE_UNQUOTED(OS_TYPE,"$OS_TYPE",[system type]) AC_SUBST(MAKE_DLL_TARGET) AC_SUBST(INSTALL_DLL_TARGET) AC_MSG_RESULT($OS_TYPE) ]) aqbanking-5.6.4beta/m4/ac_python_module.m40000644000175000017500000000121012364015477015354 00000000000000dnl @synopsis AC_PYTHON_MODULE(modname[, fatal]) dnl dnl Checks for Python module. dnl dnl If fatal is non-empty then absence of a module will trigger an dnl error. dnl dnl @category InstalledPackages dnl @author Andrew Collier . dnl @version 2004-07-14 dnl @license AllPermissive AC_DEFUN([AC_PYTHON_MODULE],[ AC_MSG_CHECKING(python module: $1) $PYTHON -c "import $1" 2>/dev/null if test $? -eq 0; then AC_MSG_RESULT(yes) eval AS_TR_CPP(HAVE_PYMOD_$1)=yes else AC_MSG_RESULT(no) eval AS_TR_CPP(HAVE_PYMOD_$1)=no # if test -n "$2" then AC_MSG_ERROR(failed to find required module $1) exit 1 fi fi ]) aqbanking-5.6.4beta/m4/gwenhywfar.m40000644000175000017500000001145612364015477014221 00000000000000# $Id$ # (c) 2002 Martin Preuss # This function checks for libgwenhywfar AC_DEFUN([AC_GWENHYWFAR], [ dnl searches for gwenhywfar dnl Arguments: dnl $1: major version minimum dnl $2: minor version minimum dnl $3: patchlevel version minimum dnl $4: build version minimum dnl Returns: gwenhywfar_dir dnl gwenhywfar_bindir dnl gwenhywfar_libs dnl gwenhywfar_plugins dnl gwenhywfar_includes dnl gwenhywfar_headers dnl gwenhywfar_has_crypt dnl have_gwenhywfar if test -z "$1"; then vma="0"; else vma="$1"; fi if test -z "$2"; then vmi="1"; else vmi="$2"; fi if test -z "$3"; then vpl="0"; else vpl="$3"; fi if test -z "$4"; then vbld="0"; else vbld="$4"; fi AC_MSG_CHECKING(if gwenhywfar support desired) AC_ARG_ENABLE(gwenhywfar, [ --enable-gwenhywfar enable gwenhywfar support (default=yes)], enable_gwenhywfar="$enableval", enable_gwenhywfar="yes") AC_MSG_RESULT($enable_gwenhywfar) have_gwenhywfar="no" gwenhywfar_dir="" gwenhywfar_plugins="" gwenhywfar_libs="" gwenhywfar_bindir="" gwenhywfar_libspp="" gwenhywfar_includes="" gwenhywfar_has_crypt="yes" if test "$enable_gwenhywfar" != "no"; then AC_MSG_CHECKING(for gwenhywfar) AC_ARG_WITH(gwen-dir, [ --with-gwen-dir=DIR uses gwenhywfar from given dir], [lcc_dir="$withval"], [lcc_dir="${prefix} \ /usr/local \ /usr \ /gwen \ /sw \ /"]) for li in $lcc_dir; do if test -x "$li/bin/gwenhywfar-config"; then gwenhywfar_dir="$li"; break fi done if test -z "$gwenhywfar_dir"; then AC_MSG_RESULT([not found ]) AC_MSG_ERROR([ *** The library Gwenhywfar was not found. Obtain it from *** http://www.aquamaniac.de . *** If it is already installed (including the -devel package), *** you might need to specify the location with the *** option --with-gwen-dir=DIR.]) else AC_MSG_RESULT($gwenhywfar_dir) AC_MSG_CHECKING(for gwen libs) gwenhywfar_libs="`$gwenhywfar_dir/bin/gwenhywfar-config --libraries`" AC_MSG_RESULT($gwenhywfar_libs) AC_MSG_CHECKING(for gwen includes) gwenhywfar_includes="`$gwenhywfar_dir/bin/gwenhywfar-config --includes`" AC_MSG_RESULT($gwenhywfar_includes) AC_MSG_CHECKING(for gwen binary tools) gwenhywfar_bindir="`$gwenhywfar_dir/bin/gwenhywfar-config --bindir`" AC_MSG_RESULT($gwenhywfar_bindir) AC_MSG_CHECKING(for gwen plugins) gwenhywfar_plugins="`$gwenhywfar_dir/bin/gwenhywfar-config --plugins`" AC_MSG_RESULT($gwenhywfar_plugins) AC_MSG_CHECKING(for gwen headers) gwenhywfar_headers="`$gwenhywfar_dir/bin/gwenhywfar-config --headers`" AC_MSG_RESULT($gwenhywfar_headers) fi AC_MSG_CHECKING(if gwenhywfar test desired) AC_ARG_ENABLE(gwenhywfar, [ --enable-gwenhywfar-test enable gwenhywfar-test (default=yes)], enable_gwenhywfar_test="$enableval", enable_gwenhywfar_test="yes") AC_MSG_RESULT($enable_gwenhywfar_test) AC_MSG_CHECKING(for Gwenhywfar version >=$vma.$vmi.$vpl.$vbld) if test "$enable_gwenhywfar_test" != "no"; then gwen_versionstring="`$gwenhywfar_dir/bin/gwenhywfar-config --vstring`.`$gwenhywfar_dir/bin/gwenhywfar-config --vbuild`" AC_MSG_RESULT([found $gwen_versionstring]) if test "$vma" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vmajor`"; then AC_MSG_ERROR([Your Gwenhywfar version is way too old. Please update from http://www.aquamaniac.de]) elif test "$vma" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vmajor`"; then if test "$vmi" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vminor`"; then AC_MSG_ERROR([Your Gwenhywfar version is too old. Please update from http://www.aquamaniac.de]) elif test "$vmi" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vminor`"; then if test "$vpl" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vpatchlevel`"; then AC_MSG_ERROR([Your Gwenhywfar version is a little bit too old. Please update from http://www.aquamaniac.de]) elif test "$vpl" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vpatchlevel`"; then if test "$vbld" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vbuild`"; then AC_MSG_ERROR([Your Gwenhywfar version is a little bit too old. Please update to the latest SVN version. Instructions for accessing SVN can be found on http://www.aquamaniac.de]) fi fi fi fi have_gwenhywfar="yes" #AC_MSG_RESULT(yes) else have_gwenhywfar="yes" AC_MSG_RESULT(assuming yes) fi dnl end of "if enable-gwenhywfar" fi AC_SUBST(gwenhywfar_dir) AC_SUBST(gwenhywfar_plugins) AC_SUBST(gwenhywfar_bindir) AC_SUBST(gwenhywfar_libs) AC_SUBST(gwenhywfar_includes) AC_SUBST(gwenhywfar_headers) AC_SUBST(gwenhywfar_has_crypt) ]) aqbanking-5.6.4beta/m4/kde3.m40000644000175000017500000001256312364015477012666 00000000000000# $Id$ # (c) 2002 Martin Preuss # These functions search for KDE 3 AC_DEFUN([AQ_CHECK_KDE3],[ dnl PREREQUISITES: dnl none dnl IN: dnl $1 = "yes" if KDE3 is needed, "no" if KDE3 is optional dnl $2 = subdirs to include when KDE3 is available dnl You may preset the return variables. dnl All variables which already have a value will not be altered dnl OUT: dnl Variables: dnl have_kde3 - set to "yes" if KDE3 exists dnl kde3_includes - CFLAGS for includes (-I) dnl kde3_include_dir - path to includes dnl kde3_libs - LDFLAGS for linking the kde3 libraries (-L) dnl kde3_app - kde3 apps given as the argument to this funtion dnl kde3_install_dir - install directory for kde3 applications dnl Defines: dnl HAVE_KDE3 dnl USED MACROS: dnl AQ_CHECK_QT3 kde3_local_lforce="$1" kde3_local_lsd="$2" dnl check if kde apps are desired AC_MSG_CHECKING(if KDE3 is allowed) AC_ARG_ENABLE(kde3, [ --enable-kde3 enable kde3 (default=yes)], enable_kde3="$enableval", enable_kde3="yes") AC_MSG_RESULT($enable_kde3) if test "$enable_kde3" = "no"; then kde3_libs="" kde3_includes="" kde3_include_dir="" kde3_app="" kde3_install_dir="" else dnl check for QT3 AQ_CHECK_QT3("$kde3_local_lforce") AC_MSG_CHECKING(if qt3 version is fully useable) if test "$have_qt3" != "yes"; then kde3_libs="" kde3_includes="" kde3_include_dir="" kde3_app="" kde3_install_dir="" AC_MSG_RESULT(no, so no KDE3 without qt3) else AC_MSG_RESULT(yes) dnl paths for kde install dir AC_MSG_CHECKING(for kde3 install dir) AC_ARG_WITH(kde3-prefix, [ --with-kde3-prefix=DIR installs kde3 apps to the given dir], [local_kde3_prefix="$withval"], [local_kde3_prefix="\ $KDEDIR \ /usr/local \ /usr \ /opt/kde3 \ /opt/kde \ " ] ) if test -z "$kde3_install_dir"; then for i in $local_kde3_prefix; do if test -z "$kde3_install_dir"; then if test -x "$i/bin/kde-config"; then $i/bin/kde-config --prefix &>/dev/null && \ kde3_install_dir="`$i/bin/kde-config --prefix`" fi fi done fi if test -z "$kde3_install_dir"; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($kde3_install_dir) fi dnl paths for kde includes AC_MSG_CHECKING(for kde3 includes) AC_ARG_WITH(kde3-includes, [ --with-kde3-includes=DIR uses kde3 includes from given dir], [local_kde3_includes="$withval"], [local_kde3_includes="\ $KDEDIR/include \ /usr/include/kde3 \ /usr/local/include/kde3 \ /usr/include/kde \ /usr/local/include/kde \ /opt/kde3/include \ /opt/kde/include \ /usr/include \ /usr/local/include \ " ] ) if test -z "$kde3_include_dir"; then for i in $local_kde3_includes; do if test -z "$kde3_include_dir"; then if test -r "$i/kdeversion.h"; then tmp=`grep "KDE_VERSION_MAJOR 3" "$i/kdeversion.h"` if test -n "$tmp"; then kde3_include_dir="$i" fi fi fi done fi if test -n "$kde3_include_dir"; then kde3_includes="-I$kde3_include_dir" AC_MSG_RESULT($kde3_include_dir) else AC_MSG_RESULT(not found) fi # Check for x86_64 architecture; potentially set lib-directory suffix if test "$target_cpu" = "x86_64"; then libdirsuffix="64" else libdirsuffix="" fi dnl paths for kde libs AC_MSG_CHECKING(for kde3 libraries) AC_ARG_WITH(kde3-libs, [ --with-kde3-libs=DIR uses kde3 libs from given dir], [local_kde3_libs="$withval"], [local_kde3_libs="\ $KDEDIR/lib${libdirsuffix} \ /usr/lib/kde3 \ /usr/local/lib/kde3 \ /usr/lib/kde \ /usr/local/lib/kde \ /opt/kde3/lib${libdirsuffix} \ /opt/kde/lib${libdirsuffix} \ /usr/lib${libdirsuffix} \ /usr/local/lib${libdirsuffix} \ $KDEDIR/lib \ " ] ) if test -z "$kde3_libs"; then AQ_SEARCH_FOR_PATH([libkdeui.so.4],[$local_kde3_libs]) if test -n "$found_dir" ; then kde3_libs="-L$found_dir" fi fi if test -n "$kde3_libs"; then AC_MSG_RESULT($kde3_libs) else AC_MSG_RESULT(not found) fi # check if all necessary kde components where found if test -z "$kde3_includes" || \ test -z "$kde3_install_dir" || \ test -z "$kde3_libs"; then kde3_libs="" kde3_includes="" kde3_app="" have_kde3="no" if test "$kde3_local_lforce" = "yes"; then AC_MSG_WARN([ Compilation of KDE3 applications is enabled but I could not find some KDE3 components (see which are missing in messages above). If you don't want to compile KDE3 applications please use "--disable-kde3". ]) else AC_MSG_WARN([ KDE3 is not explicitly disabled and I could not find some KDE3 components (see which are missing in messages above). If you don't want to compile KDE3 applications please use "--disable-kde3". ]) fi else dnl TODO: AC_TRY_RUN, check whether kdeversion.h has matching versions kde3_app="$kde3_local_lsd" have_kde3="yes" AC_DEFINE(HAVE_KDE3, 1, [if KDE3 is available]) fi dnl end of if QT3 is useable fi dnl end of if "$enable_kdeapps" fi AS_SCRUB_INCLUDE(kde3_includes) AC_SUBST(kde3_app) AC_SUBST(kde3_libs) AC_SUBST(kde3_includes) AC_SUBST(kde3_include_dir) AC_SUBST(kde3_install_dir) ]) aqbanking-5.6.4beta/m4/acx_compile_warn.m40000644000175000017500000000604112364015477015344 00000000000000# Compile warning arguments to ./configure # by Christian Stimming 2003-11-19 dnl ACX_COMPILE_WARN() dnl Add arguments for compile warnings and debug options to ./configure. dnl AC_DEFUN([ACX_COMPILE_WARN], [ dnl Add compile arguments for debugging and warnings. Macro argument dnl $1 is the default argument if --enable-debug is not specified. dnl If no Macro argument is given, enable the debugging code. if test -z "$1"; then default_debug_arg="-g"; else default_debug_arg="$1"; fi AC_MSG_CHECKING([for compiler arguments]) dnl For enabling of debugging flags/code AC_ARG_ENABLE(debug, [ --enable-debug enable compile arguments for debugging code], [case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -g" # Remove -O2 CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's/-O2//'` CFLAGS=`echo "${CFLAGS}" | sed -e 's/-O2//'` CFLAGS="${CFLAGS} -g" LDFLAGS="${LDFLAGS} -g" AC_DEFINE(DEBUG,1,[Define if you want debugging code enabled.]) ;; no) ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac ], [ # Default value if the argument was not given CXXFLAGS="${CXXFLAGS} ${default_debug_arg}" CFLAGS="${CFLAGS} ${default_debug_arg}" LDFLAGS="${LDFLAGS} ${default_debug_arg}" ]) dnl If this is gcc, then ... if test ${GCC}x = yesx; then dnl Enable all warnings AC_ARG_ENABLE(warnings, [ --enable-warnings enable compilation warnings, default=yes], [case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -Wall" CFLAGS="${CFLAGS} -Wall" ;; all) CXXFLAGS="${CXXFLAGS} -Wall -pedantic -ansi" CFLAGS="${CFLAGS} -Wall -pedantic -ansi" ;; no) ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-warnings) ;; esac ], [ # Default value if the argument was not given CXXFLAGS="${CXXFLAGS} -Wall" CFLAGS="${CFLAGS} -Wall" ]) dnl For gcc >= 3.4.x, specifically enable the new warning switch dnl -Wdeclaration-after-statement in order to preserve source code dnl compatibility to gcc 2.95 and other compilers. GCC_VERSION=`${CC} -dumpversion` if test `echo ${GCC_VERSION} | cut -d. -f1` -ge 3; then # This is gcc >= 3.x.x if test `echo ${GCC_VERSION} | cut -d. -f2` -ge 4; then # This is gcc >= 3.4.x CFLAGS="${CFLAGS} -Wdeclaration-after-statement" fi fi dnl For enabling error on warnings AC_ARG_ENABLE(error-on-warning, [ --enable-error-on-warning treat all compile warnings as errors, default=no], [case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -Werror" CFLAGS="${CFLAGS} -Werror" ;; no) ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-error-on-warning) ;; esac ], [ # Default value if the argument was not given CXXFLAGS="${CXXFLAGS}" CFLAGS="${CFLAGS}" ]) fi # Beautify the CXXFLAGS: remove extra spaces, remove double -g CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's/ */ /g' | sed -e 's/-g -g/-g/'` CFLAGS=`echo "${CFLAGS}" | sed -e 's/ */ /g' | sed -e 's/-g -g/-g/'` # Print the result AC_MSG_RESULT($CFLAGS) ]) aqbanking-5.6.4beta/m4/searchfiles.m40000644000175000017500000000157312364015477014327 00000000000000# $Id$ # (c) 2002 Martin Preuss # These functions search for files AC_DEFUN([AQ_SEARCH_FOR_PATH],[ dnl searches for a file in a path dnl $1 = file to search dnl $2 = paths to search in dnl returns the directory where the file is found (found_dir) found_dir="" ls=$1 ld="$2" for li in $ld; do case "$build" in *-win32*) fname="$li\\$ls" ;; *) fname="$li/$ls" ;; esac if test -r "$fname"; then found_dir="$li" break fi done ]) AC_DEFUN([AQ_SEARCH_FILES],[ dnl searches a dir for some files dnl $1 = path where to search dnl $2 = files to find dnl returns the name of the file found (found_file) found_file="" ls="$1" ld="$2" lf="" for li in $ld; do lf2="`ls -d ${ls}/${li} 2>/dev/null`" lf="$lf $lf2" done for li in $lf; do if test -r "$li"; then found_file=`basename "$li"` break fi done ]) aqbanking-5.6.4beta/m4/qt4.m40000644000175000017500000001543612364015477012552 00000000000000# $Id$ # (c) 2010 Martin Preuss # These functions search for QT4 AC_DEFUN([AQ_CHECK_QT4],[ dnl PREREQUISITES: dnl AQ_CHECK_OS must be called before this dnl IN: dnl $1 = "yes" if QT4 is needed, "no" if QT4 is optional dnl You may preset the return variables. dnl All variables which already have a value will not be altered dnl OUT: dnl Variables: dnl have_qt4 - set to "yes" if QT4 exists dnl qt4_includes - path to includes dnl qt4_libs - path to libraries dnl qt4_uic - name and path of the uic tool dnl qt4_moc - name and path of the moc tool dnl Defines: dnl HAVE_QT4 lforce="$1" AC_MSG_CHECKING(if QT4 is allowed) AC_ARG_ENABLE(qt4, [ --enable-qt4 enable qt4 (default=yes)], enable_qt4="$enableval", enable_qt4="yes") AC_MSG_RESULT($enable_qt4) if test "$enable_qt4" = "no"; then qt4_libs="" qt4_includes="" qt4_moc="" qt4_uic="" have_qt4="no" else dnl paths for qt4 includes AC_MSG_CHECKING(for qt4 includes) AC_ARG_WITH(qt4-includes, [ --with-qt4-includes=DIR uses qt4 includes from given dir], [local_qt4_includes="$withval"], [local_qt4_includes="\ $QTDIR/include \ /usr/include/qt4 \ /usr/local/include/qt4 \ /usr/lib/qt4/include \ /usr/local/lib/qt4/include \ /opt/qt4/include \ /usr/include/qt \ /usr/local/include/qt \ /usr/lib/qt/include \ /usr/local/lib/qt/include \ /usr/include \ /usr/local/include \ /opt/qt/include \ /usr/X11R6/include \ " ] ) if test -z "$qt4_includes"; then for i in $local_qt4_includes; do if test -z "$qt4_includes"; then if test -f "$i/Qt/qglobal.h"; then lv1=`grep -h "#define QT_VERSION_STR" $i/Qt/qglobal.h` case $lv1 in *4.*) qt4_includes="-I$i -I$i/Qt -I$i/Qt3Support -I$i/QtCore -I$i/QtGui" qt4_dir=`echo $i | ${SED} 's-/include*--'` break; ;; esac fi fi done fi if test -n "$qt4_includes"; then AC_MSG_RESULT($qt4_includes) else AC_MSG_RESULT(not found) fi # Check for x86_64 architecture; potentially set lib-directory suffix if test "$target_cpu" = "x86_64"; then libdirsuffix="64" else libdirsuffix="" fi dnl paths for qt4 libs AC_MSG_CHECKING(for qt4 libraries) AC_ARG_WITH(qt4-libs, [ --with-qt4-libs=DIR uses qt4 libs from given dir], [local_qt4_libs="$withval"], [local_qt4_libs="\ $qt4_dir/lib${libdirsuffix} \ $QTDIR/lib${libdirsuffix} \ /usr/lib/qt4 \ /usr/local/lib/qt4 \ /usr/lib/qt4/lib${libdirsuffix} \ /usr/local/lib/qt4/lib${libdirsuffix} \ /opt/qt4/lib${libdirsuffix} \ /usr/lib/qt \ /usr/local/lib/qt \ /usr/lib/qt/lib${libdirsuffix} \ /usr/local/lib/qt/lib${libdirsuffix} \ /usr/lib${libdirsuffix} \ /usr/lib${libdirsuffix}/qt4/lib \ /usr/lib${libdirsuffix}/qt-4.5/lib \ /usr/lib${libdirsuffix}/qt-4.6/lib \ /usr/local/lib${libdirsuffix} \ /opt/qt/lib${libdirsuffix} \ /usr/X11R6/lib${libdirsuffix} \ " ] ) # Determine the extension of a shared library; the variable # std_shrext comes from the AC_PROG_LIBTOOL macro. Copied from # libtool. # Shared library suffix. On linux this was set as # shrext_cmds='.so'; but on darwin it is actually a text command. eval std_shrext=\"$shrext_cmds\" if test -n "${std_shrext}"; then std_shrext='.so' fi qt_libname="QtGui" # This is the name of the qt library to search for. if test "x$OSYSTEM" = "xdarwin"; then qt_searchname="lib${qt_libname}.4.dylib" else qt_searchname="lib${qt_libname}${std_shrext}.4" fi if test -z "$qt4_libs"; then AQ_SEARCH_FOR_PATH([$qt_searchname],[$local_qt4_libs]) if test -n "$found_dir" ; then qt4_libs="-L$found_dir -l${qt_libname}" fi fi if test -n "$qt4_libs"; then AC_MSG_RESULT($qt4_libs) else AC_MSG_RESULT(not found) fi dnl paths for qt4 moc AC_MSG_CHECKING(for qt4 moc) if test -z "$qt4_moc"; then AC_ARG_WITH(qt4-moc, [ --with-qt4-moc=FILE uses the given qt4 moc], [qt4_moc="$withval"], [qt4_moc=""] ) fi if test -z "$qt4_moc"; then searchdir="\ $qt4_dir/bin \ $QTDIR/bin \ /usr/lib/qt4/bin \ /usr/local/lib/qt4/bin \ /opt/qt4/bin \ /usr/lib/qt/bin \ /usr/local/lib/qt/bin \ /usr/bin \ /usr/local/bin \ /opt/qt/bin \ /usr/X11R6/bin \ " # search for "moc-qt4" for f in $searchdir; do if test -x $f/moc-qt4; then qt4_moc="$f/moc-qt4" break fi done # fall back to "moc" if test -z "$qt4_moc"; then for f in $searchdir; do if test -x $f/moc; then qt4_moc="$f/moc" break fi done fi fi if test -n "$qt4_moc"; then AC_MSG_RESULT($qt4_moc) else AC_MSG_RESULT(not found) fi dnl paths for qt4 uic AC_MSG_CHECKING(for qt4 uic) if test -z "$qt4_uic"; then AC_ARG_WITH(qt4-uic, [ --with-qt4-uic=FILE uses the given qt4 uic], [qt4_uic="$withval"], [qt4_uic=""] ) searchdir="\ $qt4_dir/bin \ $QTDIR/bin \ /usr/lib/qt4/bin \ /usr/local/lib/qt4/bin \ /opt/qt4/bin \ /usr/lib/qt/bin \ /usr/local/lib/qt/bin \ /usr/bin \ /usr/local/bin \ /opt/qt/bin \ /usr/X11R6/bin \ " # search for "uic-qt4" for f in $searchdir; do if test -x $f/uic-qt4; then qt4_uic="$f/uic-qt4" break fi done # fall back to "uic" if test -z "$qt4_uic"; then for f in $searchdir; do if test -x $f/uic; then qt4_uic="$f/uic" break fi done fi fi if test -n "$qt4_uic"; then AC_MSG_RESULT($qt4_uic) else AC_MSG_RESULT(not found) fi # check if all necessary qt4 components where found if test -z "$qt4_includes" || \ test -z "$qt4_moc" || \ test -z "$qt4_uic" || \ test -z "$qt4_libs"; then qt4_libs="" qt4_moc="" qt4_uic="" qt4_includes="" have_qt4="no" if test "$lforce" = "yes"; then AC_MSG_WARN([ Compilation of QT applications is enabled but I could not find some QT components (see which are missing in messages above). If you don't want to compile QT4 applications please use "--disable-qt4". ]) else AC_MSG_WARN([ QT4 is not explicitly disabled and I could not find some QT4 components (see which are missing in messages above). If you don't want to compile QT4 applications please use "--disable-qt4". ]) fi else dnl TODO: AC_TRY_RUN, check whether qversion.h has matching versions have_qt4="yes" AC_DEFINE(HAVE_QT4, 1, [whether QT4 is available]) fi dnl end of if "$enable_qt4" fi AS_SCRUB_INCLUDE(qt4_includes) AC_SUBST(qt4_libs) AC_SUBST(qt4_includes) AC_SUBST(qt4_moc) AC_SUBST(qt4_uic) ]) aqbanking-5.6.4beta/m4/Makefile.in0000644000175000017500000004351312643540054013634 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = m4 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = \ ac_python_module.m4 \ acx_compile_warn.m4 \ acx_windows_paths.m4 \ as-scrub-include.m4 \ chipcard.m4 \ distri.m4 \ kde3.m4 \ os.m4 \ qt3.m4 \ qt4.m4 \ searchfiles.m4 \ fox.pc \ gwenhywfar.m4 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/m4/qt3.m40000644000175000017500000001610012364015477012536 00000000000000# $Id$ # (c) 2010 Martin Preuss # These functions search for QT3 AC_DEFUN([AQ_CHECK_QT3],[ dnl PREREQUISITES: dnl AQ_CHECK_OS must be called before this dnl IN: dnl $1 = "yes" if QT3 is needed, "no" if QT3 is optional dnl You may preset the return variables. dnl All variables which already have a value will not be altered dnl OUT: dnl Variables: dnl have_qt3 - set to "yes" if QT3 exists dnl qt3_includes - path to includes dnl qt3_libs - path to libraries dnl qt3_uic - name and path of the uic tool dnl qt3_moc - name and path of the moc tool dnl Defines: dnl HAVE_QT3 lforce="$1" AC_MSG_CHECKING(if QT3 is allowed) AC_ARG_ENABLE(qt3, [ --enable-qt3 enable qt3 (default=yes)], enable_qt3="$enableval", enable_qt3="yes") AC_MSG_RESULT($enable_qt3) if test "$enable_qt3" = "no"; then qt3_libs="" qt3_includes="" qt3_moc="" qt3_uic="" have_qt3="no" else dnl paths for qt3 includes AC_MSG_CHECKING(for qt3 includes) AC_ARG_WITH(qt3-includes, [ --with-qt3-includes=DIR uses qt3 includes from given dir], [local_qt3_includes="$withval"], [local_qt3_includes="\ $QTDIR/include \ /usr/include/qt3 \ /usr/local/include/qt3 \ /usr/lib/qt3/include \ /usr/local/lib/qt3/include \ /opt/qt3/include \ /usr/include/qt \ /usr/local/include/qt \ /usr/lib/qt/include \ /usr/local/lib/qt/include \ /usr/include \ /usr/local/include \ /opt/qt/include \ /usr/X11R6/include \ " ] ) if test -z "$qt3_includes"; then for i in $local_qt3_includes; do if test -z "$qt3_includes"; then if test -f "$i/qglobal.h"; then lv1=`grep -h "#define QT_VERSION_STR" $i/qglobal.h` case $lv1 in *3.*) qt3_includes="-I$i" qt3_dir=`echo $i | ${SED} 's-/include*--'` break; ;; esac fi fi done fi if test -n "$qt3_includes"; then AC_MSG_RESULT($qt3_includes) else AC_MSG_RESULT(not found) fi AC_MSG_CHECKING(if threaded qt3 may be used) AC_ARG_ENABLE(qt3-threads, [ --enable-qt3-threads enable qt3-mt library (default=yes)], enable_qt3_threads="$enableval", enable_qt3_threads="yes") AC_MSG_RESULT($enable_qt3_threads) # Check for x86_64 architecture; potentially set lib-directory suffix if test "$target_cpu" = "x86_64"; then libdirsuffix="64" else libdirsuffix="" fi dnl paths for qt3 libs AC_MSG_CHECKING(for qt3 libraries) AC_ARG_WITH(qt3-libs, [ --with-qt3-libs=DIR uses qt3 libs from given dir], [local_qt3_libs="$withval"], [local_qt3_libs="\ $qt3_dir/lib${libdirsuffix} \ $QTDIR/lib${libdirsuffix} \ /usr/lib/qt3 \ /usr/local/lib/qt3 \ /usr/lib/qt3/lib${libdirsuffix} \ /usr/local/lib/qt3/lib${libdirsuffix} \ /opt/qt3/lib${libdirsuffix} \ /usr/lib/qt \ /usr/local/lib/qt \ /usr/lib/qt/lib${libdirsuffix} \ /usr/local/lib/qt/lib${libdirsuffix} \ /usr/lib${libdirsuffix} \ /usr/lib${libdirsuffix}/qt3/lib \ /usr/lib${libdirsuffix}/qt-3.3/lib \ /usr/lib${libdirsuffix}/qt-3.2/lib \ /usr/local/lib${libdirsuffix} \ /opt/qt/lib${libdirsuffix} \ /usr/X11R6/lib${libdirsuffix} \ " ] ) # Determine the extension of a shared library; the variable # std_shrext comes from the AC_PROG_LIBTOOL macro. Copied from # libtool. # Shared library suffix. On linux this was set as # shrext_cmds='.so'; but on darwin it is actually a text command. eval std_shrext=\"$shrext_cmds\" if test -n "${std_shrext}"; then std_shrext='.so' fi # Choose library name of qt if test "$enable_qt3_threads" != "no"; then qt_libname="qt-mt" else qt_libname="qt" fi # This is the name of the qt library to search for. if test "x$OSYSTEM" = "xdarwin"; then qt_searchname="lib${qt_libname}.3.dylib" else qt_searchname="lib${qt_libname}${std_shrext}.3" fi if test -z "$qt3_libs"; then AQ_SEARCH_FOR_PATH([$qt_searchname],[$local_qt3_libs]) if test -n "$found_dir" ; then qt3_libs="-L$found_dir -l${qt_libname}" fi fi if test -n "$qt3_libs"; then AC_MSG_RESULT($qt3_libs) else AC_MSG_RESULT(not found) fi dnl paths for qt3 moc AC_MSG_CHECKING(for qt3 moc) if test -z "$qt3_moc"; then AC_ARG_WITH(qt3-moc, [ --with-qt3-moc=FILE uses the given qt3 moc], [qt3_moc="$withval"], [qt3_moc=""] ) fi if test -z "$qt3_moc"; then searchdir="\ $qt3_dir/bin \ $QTDIR/bin \ /usr/lib/qt3/bin \ /usr/local/lib/qt3/bin \ /opt/qt3/bin \ /usr/lib/qt/bin \ /usr/local/lib/qt/bin \ /usr/bin \ /usr/local/bin \ /opt/qt/bin \ /usr/X11R6/bin \ " # search for "moc-qt3" for f in $searchdir; do if test -x $f/moc-qt3; then qt3_moc="$f/moc-qt3" break fi done # fall back to "moc" if test -z "$qt3_moc"; then for f in $searchdir; do if test -x $f/moc; then qt3_moc="$f/moc" break fi done fi fi if test -n "$qt3_moc"; then AC_MSG_RESULT($qt3_moc) else AC_MSG_RESULT(not found) fi dnl paths for qt3 uic AC_MSG_CHECKING(for qt3 uic) if test -z "$qt3_uic"; then AC_ARG_WITH(qt3-uic, [ --with-qt3-uic=FILE uses the given qt3 uic], [qt3_uic="$withval"], [qt3_uic=""] ) searchdir="\ $qt3_dir/bin \ $QTDIR/bin \ /usr/lib/qt3/bin \ /usr/local/lib/qt3/bin \ /opt/qt3/bin \ /usr/lib/qt/bin \ /usr/local/lib/qt/bin \ /usr/bin \ /usr/local/bin \ /opt/qt/bin \ /usr/X11R6/bin \ " # search for "uic-qt3" for f in $searchdir; do if test -x $f/uic-qt3; then qt3_uic="$f/uic-qt3" break fi done # fall back to "uic" if test -z "$qt3_uic"; then for f in $searchdir; do if test -x $f/uic; then qt3_uic="$f/uic" break fi done fi fi if test -n "$qt3_uic"; then AC_MSG_RESULT($qt3_uic) else AC_MSG_RESULT(not found) fi # check if all necessary qt3 components where found if test -z "$qt3_includes" || \ test -z "$qt3_moc" || \ test -z "$qt3_uic" || \ test -z "$qt3_libs"; then qt3_libs="" qt3_moc="" qt3_uic="" qt3_includes="" have_qt3="no" if test "$lforce" = "yes"; then AC_MSG_WARN([ Compilation of QT applications is enabled but I could not find some QT components (see which are missing in messages above). If you don't want to compile QT3 applications please use "--disable-qt3". ]) else AC_MSG_WARN([ QT3 is not explicitly disabled and I could not find some QT3 components (see which are missing in messages above). If you don't want to compile QT3 applications please use "--disable-qt3". ]) fi else dnl TODO: AC_TRY_RUN, check whether qversion.h has matching versions have_qt3="yes" AC_DEFINE(HAVE_QT3, 1, [whether QT3 is available]) fi dnl end of if "$enable_qt3" fi AS_SCRUB_INCLUDE(qt3_includes) AC_SUBST(qt3_libs) AC_SUBST(qt3_includes) AC_SUBST(qt3_moc) AC_SUBST(qt3_uic) ]) aqbanking-5.6.4beta/m4/chipcard.m40000644000175000017500000002306212364015477013611 00000000000000# $Id: chipcard.m4 79 2005-05-31 22:50:34Z aquamaniac $ # (c) 2004-2006 Martin Preuss # This function checks for chipcard-client and chipcard-server AC_DEFUN([AC_CHIPCARD_CLIENT], [ dnl searches for chipcard_client dnl Arguments: dnl $1: major version minimum dnl $2: minor version minimum dnl $3: patchlevel version minimum dnl $4: build version minimum dnl Returns: chipcard_client_dir dnl chipcard_client_datadir dnl chipcard_client_libs dnl chipcard_client_includes dnl have_chipcard_client if test -z "$1"; then vma="0"; else vma="$1"; fi if test -z "$2"; then vmi="1"; else vmi="$2"; fi if test -z "$3"; then vpl="0"; else vpl="$3"; fi if test -z "$4"; then vbld="0"; else vbld="$4"; fi AC_MSG_CHECKING(if chipcard_client support desired) AC_ARG_ENABLE(chipcard-client, [ --enable-chipcard-client enable chipcard_client support (default=yes)], enable_chipcard_client="$enableval", enable_chipcard_client="yes") AC_MSG_RESULT($enable_chipcard_client) have_chipcard_client="no" chipcard_client_dir="" chipcard_client_datadir="" chipcard_client_libs="" chipcard_client_infolib="" chipcard_client_includes="" chipcard_client_servicedir="" if test "$enable_chipcard_client" != "no"; then AC_MSG_CHECKING(for chipcard_client) AC_ARG_WITH(chipcard-client-dir, [ --with-chipcard-client-dir=DIR uses chipcard_client from given dir], [lcc_dir="$withval"], [lcc_dir="${prefix} \ /usr/local \ /usr \ /chipcard-client \ /sw \ /"]) for li in $lcc_dir; do if test -x "$li/bin/chipcard-config"; then chipcard_client_dir="$li"; break fi done if test -z "$chipcard_client_dir"; then AC_MSG_RESULT([not found ]) AC_MSG_ERROR([ *** The library libchipcardc was not found. Obtain it from *** http://www.libchipcard.de. *** If it is already installed (including the -devel package), *** you might need to specify the location with the *** option --with-chipcard-client-dir=DIR. *** *** Please note that it is not Libchipcard this package requested, it is the *** successor chipcard.]) else AC_MSG_RESULT($chipcard_client_dir) AC_MSG_CHECKING(for chipcard-client libs) chipcard_client_libs="`$chipcard_client_dir/bin/chipcard-config --client-libs`" AC_MSG_RESULT($chipcard_client_libs) AC_MSG_CHECKING(for chipcard-client includes) chipcard_client_includes="`$chipcard_client_dir/bin/chipcard-config --includes`" AC_MSG_RESULT($chipcard_client_includes) AC_MSG_CHECKING(for chipcard-client datadir) chipcard_client_datadir="`$chipcard_client_dir/bin/chipcard-config --client-datadir`" AC_MSG_RESULT($chipcard_client_datadir) fi AC_MSG_CHECKING(if chipcard_client test desired) AC_ARG_ENABLE(chipcard-client-test, [ --enable-chipcard-client-test enable chipcard_client-test (default=yes)], enable_chipcard_client_test="$enableval", enable_chipcard_client_test="yes") AC_MSG_RESULT($enable_chipcard_client_test) AC_MSG_CHECKING(for Chipcard-Client version >=$vma.$vmi.$vpl.$vbld) if test "$enable_chipcard_client_test" != "no"; then chipcard_client_versionstring="`$chipcard_client_dir/bin/chipcard-config --vstring`.`$chipcard_client_dir/bin/chipcard-config --vbuild`" AC_MSG_RESULT([found $chipcard_client_versionstring]) if test "$vma" -gt "`$chipcard_client_dir/bin/chipcard-config --vmajor`"; then AC_MSG_ERROR([Your Chipcard-Client version is way too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vma" = "`$chipcard_client_dir/bin/chipcard-config --vmajor`"; then if test "$vmi" -gt "`$chipcard_client_dir/bin/chipcard-config --vminor`"; then AC_MSG_ERROR([Your Chipcard-Client version is too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vmi" = "`$chipcard_client_dir/bin/chipcard-config --vminor`"; then if test "$vpl" -gt "`$chipcard_client_dir/bin/chipcard-config --vpatchlevel`"; then AC_MSG_ERROR([Your Chipcard-Client version is a little bit too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vpl" = "`$chipcard_client_dir/bin/chipcard-config --vpatchlevel`"; then if test "$vbld" -gt "`$chipcard_client_dir/bin/chipcard-config --vbuild`"; then AC_MSG_ERROR([Your Chipcard-Client version is a little bit too old. Please update to the latest CVS version. Instructions for accessing CVS can be found on http://sf.net/projects/libchipcard]) fi fi fi fi have_chipcard_client="yes" #AC_MSG_RESULT(yes) else have_chipcard_client="yes" AC_MSG_RESULT(assuming yes) fi dnl end of "if enable-chipcard-client" fi AC_SUBST(chipcard_client_dir) AC_SUBST(chipcard_client_datadir) AC_SUBST(chipcard_client_libs) AC_SUBST(chipcard_client_includes) ]) AC_DEFUN([AC_CHIPCARD_SERVER], [ dnl searches for chipcard_server dnl Arguments: dnl $1: major version minimum dnl $2: minor version minimum dnl $3: patchlevel version minimum dnl $4: build version minimum dnl Returns: chipcard_server_datadir dnl chipcard_server_driverdir dnl chipcard_server_servicedir dnl have_chipcard_server if test -z "$1"; then vma="0"; else vma="$1"; fi if test -z "$2"; then vmi="1"; else vmi="$2"; fi if test -z "$3"; then vpl="0"; else vpl="$3"; fi if test -z "$4"; then vbld="0"; else vbld="$4"; fi AC_MSG_CHECKING(if chipcard_server support desired) AC_ARG_ENABLE(chipcard-server, [ --enable-chipcard-server enable chipcard_server support (default=yes)], enable_chipcard_server="$enableval", enable_chipcard_server="yes") AC_MSG_RESULT($enable_chipcard_server) have_chipcard_server="no" chipcard_server_dir="" chipcard_server_servicedir="" chipcard_server_driverdir="" chipcard_server_datadir="" if test "$enable_chipcard_server" != "no"; then AC_MSG_CHECKING(for chipcard_server) AC_ARG_WITH(chipcard-server-dir, [ --with-chipcard-server-dir=DIR uses chipcard_server from given dir], [lcc_dir="$withval"], [lcc_dir="${prefix} \ /usr/local \ /usr \ /chipcard-server \ /"]) for li in $lcc_dir; do if test -x "$li/bin/chipcard-config"; then chipcard_server_dir="$li"; break fi done if test -z "$chipcard_server_dir"; then AC_MSG_RESULT([not found ]) AC_MSG_ERROR([ *** The library libchipcards was not found. Obtain it from *** http://www.libchipcard.de. *** If it is already installed (including the -devel package), *** you might need to specify the location with the *** option --with-chipcard-server-dir=DIR. *** *** Please note that it is not Libchipcard this package requested, it is the *** successor chipcard.]) else AC_MSG_RESULT($chipcard_server_dir) AC_MSG_CHECKING(for chipcard-server datadir) chipcard_server_datadir="`$chipcard_server_dir/bin/chipcard-config --server-datadir`" AC_MSG_RESULT($chipcard_server_datadir) AC_MSG_CHECKING(for chipcard-server driver dir) chipcard_server_driverdir="`$chipcard_server_dir/bin/chipcard-config --driverdir`" AC_MSG_RESULT($chipcard_server_driverdir) AC_MSG_CHECKING(for chipcard-server service dir) chipcard_server_servicedir="`$chipcard_server_dir/bin/chipcard-config --servicedir`" AC_MSG_RESULT($chipcard_server_servicedir) fi AC_MSG_CHECKING(if chipcard_server test desired) AC_ARG_ENABLE(chipcard-server-test, [ --enable-chipcard-server-test enable chipcard_server-test (default=yes)], enable_chipcard_server_test="$enableval", enable_chipcard_server_test="yes") AC_MSG_RESULT($enable_chipcard_server_test) AC_MSG_CHECKING(for Chipcard-Server version >=$vma.$vmi.$vpl.$vbld) if test "$enable_chipcard_server_test" != "no"; then chipcard_server_versionstring="`$chipcard_server_dir/bin/chipcard-config --vstring`.`$chipcard_server_dir/bin/chipcard-config --vbuild`" AC_MSG_RESULT([found $chipcard_server_versionstring]) if test "$vma" -gt "`$chipcard_server_dir/bin/chipcard-config --vmajor`"; then AC_MSG_ERROR([Your Chipcard-Server version is way too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vma" = "`$chipcard_server_dir/bin/chipcard-config --vmajor`"; then if test "$vmi" -gt "`$chipcard_server_dir/bin/chipcard-config --vminor`"; then AC_MSG_ERROR([Your Chipcard-Server version is too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vmi" = "`$chipcard_server_dir/bin/chipcard-config --vminor`"; then if test "$vpl" -gt "`$chipcard_server_dir/bin/chipcard-config --vpatchlevel`"; then AC_MSG_ERROR([Your Chipcard-Server version is a little bit too old. Please update from http://sf.net/projects/libchipcard]) elif test "$vpl" = "`$chipcard_server_dir/bin/chipcard-config --vpatchlevel`"; then if test "$vbld" -gt "`$chipcard_server_dir/bin/chipcard-config --vbuild`"; then AC_MSG_ERROR([Your Chipcard-Server version is a little bit too old. Please update to the latest CVS version. Instructions for accessing CVS can be found on http://sf.net/projects/libchipcard]) fi fi fi fi have_chipcard_server="yes" #AC_MSG_RESULT(yes) else have_chipcard_server="yes" AC_MSG_RESULT(assuming yes) fi dnl end of "if enable-chipcard-server" fi AC_SUBST(chipcard_server_servicedir) AC_SUBST(chipcard_server_driverdir) AC_SUBST(chipcard_server_datadir) ]) aqbanking-5.6.4beta/m4/lt~obsolete.m40000644000175000017500000001375612276417211014411 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) aqbanking-5.6.4beta/m4/ltoptions.m40000644000175000017500000003007312276417211014061 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) aqbanking-5.6.4beta/m4/Makefile.am0000644000175000017500000000033212364015477013621 00000000000000EXTRA_DIST=\ ac_python_module.m4 \ acx_compile_warn.m4 \ acx_windows_paths.m4 \ as-scrub-include.m4 \ chipcard.m4 \ distri.m4 \ kde3.m4 \ os.m4 \ qt3.m4 \ qt4.m4 \ searchfiles.m4 \ fox.pc \ gwenhywfar.m4 aqbanking-5.6.4beta/m4/libtool.m40000644000175000017500000106011112276417211013467 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS aqbanking-5.6.4beta/m4/fox.pc0000644000175000017500000000054612364015477012714 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: FOX Description: FOX is a C++ based Toolkit for developing Graphical User Interfaces Version: 1.6.16 Libs: -L${libdir} -lFOX-1.6 -lXext -lX11 -lXcursor -lXrandr -ldl -lpthread -lrt -ljpeg -lpng -ltiff -lz -lbz2 -lm -lGLU -lGL Cflags: -I${includedir}/fox-1.6 aqbanking-5.6.4beta/m4/acx_windows_paths.m40000644000175000017500000002302612364015477015560 00000000000000# $Id$ # (c) 2004 Martin Preuss # These functions retrieve some important paths AC_DEFUN([AQ_WINDOZE_GETPATH], [ dnl IN: dnl - $1: type of path to get: dnl - windows: windows path dnl - system: windows/system directory dnl - home: users home directory dnl - $2: default value dnl OUT: dnl - aq_windoze_path: path retrieved dnl rm -f conf.winpath save_LIBS="${LIBS}" LIBS="${LIBS} -lshfolder" AC_TRY_RUN([ #include #include #include #include #include int main (){ char buffer[260]; const char *choice = "$1"; FILE *f; buffer[0]=0; if (strlen("$2")) { if (strlen("$2")>=sizeof(buffer)) { printf("path is too long ($2)\n"); exit(1); } strcpy(buffer, "$2"); } else { if (strcasecmp(choice, "windows")==0) { GetWindowsDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "system")==0) { GetSystemDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "home")==0) { GetWindowsDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "program_files") == 0) { SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, buffer); } else if (strcasecmp(choice, "common_appdata") == 0) { SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, buffer); } else { printf("Unknown type \"$1\"\n"); exit(1); } } f=fopen("conf.winpath", "w+"); if (!f) { printf("Could not create file conf.winpath\n"); exit(1); } fprintf(f, "%s", buffer); if (fclose(f)) { printf("Could not close file.\n"); exit(1); } exit(0); } ], [aq_windoze_path="`cat conf.winpath`"], [AC_MSG_ERROR(Could not determine path for $1)], [aq_windoze_path="$2"; AC_MSG_RESULT([Crosscompiling, assuming $2])] ) LIBS="${save_LIBS}" rm -f conf.winpath ]) AC_DEFUN([AQ_WINDOZE_GETPATH_MINGW], [ dnl IN: dnl - $1: type of path to get: dnl - windows: windows path dnl - system: windows/system directory dnl - home: users home directory dnl - $2: default value dnl OUT: dnl - aq_windoze_path: path retrieved dnl rm -f conf.winpath LIBS="${LIBS} -lshfolder" AC_TRY_RUN([ #include #include #include #include #include int main (){ char buffer[260]; char buffer2[260+2]; const char *choice = "$1"; char *p; char *tp; FILE *f; int lastWasSlash; buffer[0]=0; if (strlen("$2")) { if (strlen("$2")>=sizeof(buffer)) { printf("path is too long ($2)\n"); exit(1); } strcpy(buffer, "$2"); } else { if (strcasecmp(choice, "windows")==0) { GetWindowsDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "system")==0) { GetSystemDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "home")==0) { GetWindowsDirectory(buffer, sizeof(buffer)); } else if (strcasecmp(choice, "program_files") == 0) { SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, buffer); } else if (strcasecmp(choice, "common_appdata") == 0) { SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, buffer); } else { printf("Unknown type \"$1\"\n"); exit(1); } } /* create mingw path */ tp=buffer2; p=buffer; if (strlen(buffer)>1) { if (buffer[1]==':') { *tp='/'; tp++; *tp=buffer[0]; tp++; p+=2; } } lastWasSlash=0; while(*p) { if (*p=='\\\\' || *p=='/') { if (!lastWasSlash) { *tp='/'; tp++; lastWasSlash=1; } } else { lastWasSlash=0; *tp=*p; tp++; } p++; } /* while */ *tp=0; f=fopen("conf.winpath", "w+"); if (!f) { printf("Could not create file conf.winpath\n"); exit(1); } fprintf(f, "%s", buffer2); if (fclose(f)) { printf("Could not close file.\n"); exit(1); } exit(0); } ], [aq_windoze_path=`cat conf.winpath`], [AC_MSG_ERROR(Could not determine path for $1)], [aq_windoze_path="$2"; AC_MSG_RESULT([Crosscompiling, assuming $2])] ) LIBS="${save_LIBS}" rm -f conf.winpath ]) AC_DEFUN([ACX_WINDOWS_PATHS],[ dnl IN: dnl - AC_CANONICAL_SYSTEM muste be called before dnl OUT: dnl Variables (subst): dnl WIN_PATH_HOME : path and name of the Windoze home folder dnl WIN_PATH_HOME_MINGW : path and name of the Windoze home folder dnl WIN_PATH_WINDOWS : path and name of the Windoze system folder dnl WIN_PATH_WINDOWS_MINGW : path and name of the Windoze system folder dnl WIN_PATH_SYSTEM : path and name of the Windoze folder dnl WIN_PATH_SYSTEM_MINGW : path and name of the Windoze folder dnl WIN_PATH_PROGRAM_FILES dnl WIN_PATH_PROGRAM_FILES_MINGW dnl WIN_PATH_COMMON_APPDATA dnl WIN_PATH_COMMON_APPDATA_MINGW dnl Defines: dnl WIN_PATH_HOME : path and name of the Windoze home folder dnl WIN_PATH_WINDOWS : path and name of the Windoze system folder dnl WIN_PATH_SYSTEM : path and name of the Windoze folder dnl WIN_PATH_PROGRAM_FILES : path of the program files folder dnl WIN_PATH_COMMON_APPDATA : The directory containing application data for all users # presets AC_ARG_WITH(home-path, [ --with-home-path=DIR specify the home directory for a user], [aq_windoze_path_home="$withval"]) AC_ARG_WITH(system-path, [ --with-system-path=DIR specify the system directory], [aq_windoze_path_system="$withval"]) AC_ARG_WITH(windows-path, [ --with-windows-path=DIR specify the windows directory], [aq_windoze_path_windows="$withval"]) # home directory AC_MSG_CHECKING([for windoze home path (program)]) AC_CACHE_VAL(gwenhywfar_cv_path_home, [ AQ_WINDOZE_GETPATH(home, [$aq_windoze_path_home]) gwenhywfar_cv_path_home="$aq_windoze_path" ]) WIN_PATH_HOME="$gwenhywfar_cv_path_home" AC_MSG_RESULT([$WIN_PATH_HOME]) AC_MSG_CHECKING([for windoze home path (mingw)]) AC_CACHE_VAL(gwenhywfar_cv_path_home_mingw, [ AQ_WINDOZE_GETPATH_MINGW(home, [$aq_windoze_path_home]) gwenhywfar_cv_path_home_mingw="$aq_windoze_path" ]) WIN_PATH_HOME_MINGW="$gwenhywfar_cv_path_home_mingw" AC_MSG_RESULT([$WIN_PATH_HOME_MINGW]) # windows directory AC_MSG_CHECKING([for windoze windows path (program)]) AC_CACHE_VAL(gwenhywfar_cv_path_windows, [ AQ_WINDOZE_GETPATH(windows, [$aq_windoze_path_windows]) gwenhywfar_cv_path_windows="$aq_windoze_path" ]) WIN_PATH_WINDOWS="$gwenhywfar_cv_path_windows" AC_MSG_RESULT([$WIN_PATH_WINDOWS]) AC_MSG_CHECKING([for windoze windows path (mingw)]) AC_CACHE_VAL(gwenhywfar_cv_path_windows_mingw, [ AQ_WINDOZE_GETPATH_MINGW(windows, [$aq_windoze_path_windows]) gwenhywfar_cv_path_windows_mingw="$aq_windoze_path" ]) WIN_PATH_WINDOWS_MINGW="$gwenhywfar_cv_path_windows_mingw" AC_MSG_RESULT([$WIN_PATH_WINDOWS_MINGW]) # windows system directory AC_MSG_CHECKING([for windoze system path (program)]) AC_CACHE_VAL(gwenhywfar_cv_path_system, [ AQ_WINDOZE_GETPATH(system, [$aq_windoze_path_system]) gwenhywfar_cv_path_system="$aq_windoze_path" ]) WIN_PATH_SYSTEM="$gwenhywfar_cv_path_system" AC_MSG_RESULT([$WIN_PATH_SYSTEM]) AC_MSG_CHECKING([for windoze system path (mingw)]) AC_CACHE_VAL(gwenhywfar_cv_path_system_mingw, [ AQ_WINDOZE_GETPATH_MINGW(system, [$aq_windoze_path_system]) gwenhywfar_cv_path_system_mingw="$aq_windoze_path" ]) WIN_PATH_SYSTEM_MINGW="$gwenhywfar_cv_path_system_mingw" AC_MSG_RESULT([$WIN_PATH_SYSTEM_MINGW]) # program files directory AC_MSG_CHECKING([for program files path (program)]) AC_CACHE_VAL(gwenhywfar_cv_path_programfiles, [ AQ_WINDOZE_GETPATH(program_files, [$aq_windoze_path_system]) gwenhywfar_cv_path_programfiles="$aq_windoze_path" ]) WIN_PATH_PROGRAM_FILES="$gwenhywfar_cv_path_programfiles" AC_MSG_RESULT([$WIN_PATH_PROGRAM_FILES]) AC_MSG_CHECKING([for program files path (mingw)]) AC_CACHE_VAL(gwenhywfar_cv_path_programfiles_mingw, [ AQ_WINDOZE_GETPATH_MINGW(program_files, [$aq_windoze_path_system]) gwenhywfar_cv_path_programfiles_mingw="$aq_windoze_path" ]) WIN_PATH_PROGRAM_FILES_MINGW="$gwenhywfar_cv_path_programfiles_mingw" AC_MSG_RESULT([$WIN_PATH_PROGRAM_FILES_MINGW]) # common application data directory AC_MSG_CHECKING([for common app data path (program)]) AC_CACHE_VAL(gwenhywfar_cv_path_commonappdata, [ AQ_WINDOZE_GETPATH(common_appdata, [$aq_windoze_path_system]) gwenhywfar_cv_path_commonappdata="$aq_windoze_path" ]) WIN_PATH_COMMON_APPDATA="$gwenhywfar_cv_path_commonappdata" AC_MSG_RESULT([$WIN_PATH_COMMON_APPDATA]) AC_MSG_CHECKING([for common app data path (mingw)]) AC_CACHE_VAL(gwenhywfar_cv_path_commonappdata_mingw, [ AQ_WINDOZE_GETPATH_MINGW(common_appdata, [$aq_windoze_path_system]) gwenhywfar_cv_path_commonappdata_mingw="$aq_windoze_path" ]) WIN_PATH_COMMON_APPDATA_MINGW="$gwenhywfar_cv_path_commonappdata_mingw" AC_MSG_RESULT([$WIN_PATH_COMMON_APPDATA_MINGW]) # finish variables AC_SUBST(WIN_PATH_HOME) AC_DEFINE_UNQUOTED(WIN_PATH_HOME, "$WIN_PATH_HOME", [home path]) AC_SUBST(WIN_PATH_HOME_MINGW) AC_SUBST(WIN_PATH_WINDOWS) AC_DEFINE_UNQUOTED(WIN_PATH_WINDOWS, "$WIN_PATH_WINDOWS", [windows path]) AC_SUBST(WIN_PATH_WINDOWS_MINGW) AC_SUBST(WIN_PATH_SYSTEM) AC_DEFINE_UNQUOTED(WIN_PATH_SYSTEM, "$WIN_PATH_SYSTEM", [system path]) AC_SUBST(WIN_PATH_SYSTEM_MINGW) AC_SUBST(WIN_PATH_PROGRAM_FILES) AC_DEFINE_UNQUOTED(WIN_PATH_PROGRAM_FILES, "$WIN_PATH_PROGRAM_FILES", [program files path]) AC_SUBST(WIN_PATH_PROGRAM_FILES_MINGW) AC_SUBST(WIN_PATH_COMMON_APPDATA) AC_DEFINE_UNQUOTED(WIN_PATH_COMMON_APPDATA, "$WIN_PATH_COMMON_APPDATA", [common app data path]) AC_SUBST(WIN_PATH_COMMON_APPDATA_MINGW) ]) aqbanking-5.6.4beta/m4/as-scrub-include.m40000644000175000017500000000201412364015477015166 00000000000000dnl as-scrub-include.m4 0.0.1 dnl autostars m4 macro for scrubbing CFLAGS of system include dirs dnl because gcc 3.x complains about including system including dirs dnl dnl thomas@apestaart.org dnl dnl This macro uses output of cpp -v and expects it to contain text that dnl looks a little bit like this: dnl #include <...> search starts here: dnl /usr/local/include dnl /usr/lib/gcc-lib/i386-redhat-linux/3.2/include dnl /usr/include dnl End of search list. dnl AS_SCRUB_INCLUDE(VAR) dnl example dnl AS_SCRUB_INCLUDE(CFLAGS) dnl will remove all system include dirs from the given CFLAGS AC_DEFUN([AS_SCRUB_INCLUDE], [ GIVEN_CFLAGS=$[$1] INCLUDE_DIRS=`echo | cpp -v 2>&1` dnl remove everything from this output between the "starts here" and "End of" dnl line INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done [$1]=$GIVEN_CFLAGS ]) aqbanking-5.6.4beta/m4/distri.m40000644000175000017500000000564012364015477013334 00000000000000 # distri.m4 # (c) 2006 Martin Preuss # This function checks for the Linux distribution AC_DEFUN([AQ_DISTRIBUTION], [ dnl searches for libusb dnl Arguments: none dnl Returns: aq_distrib_name (name of the Linux distribution) dnl aq_distrib_tag (tag for packages, like "suse") dnl aq_distrib_version (not for Debian-like systems) AC_MSG_CHECKING(for preselected distribution name) if test -n "$aq_distrib_name"; then AC_MSG_RESULT([yes, $aq_distrib_name]) else AC_MSG_RESULT([no, will have to determine it]) aq_distrib_name="" aq_distrib_version="" aq_distrib_tag="" # Debian-style AC_MSG_CHECKING(whether this is a Debian derivate) case `basename $CC` in gcc | gcc-* | *-gcc | *-gcc-*) debtype=["` ${CC} --version | head -1`"] case $debtype in *\(Debian\ *) aq_distrib_name="Debian" aq_distrib_tag="debian" AC_MSG_RESULT([yes, $aq_distrib_name]) ;; *\(Ubuntu\ * | *\(KUbuntu\ *) aq_distrib_name="Ubuntu" aq_distrib_tag="ubuntu" AC_MSG_RESULT([yes, $aq_distrib_name]) ;; *) AC_MSG_RESULT([no]) ;; esac ;; *) AC_MSG_RESULT([no]) ;; esac fi if test -z "$aq_distrib_name"; then # RPM-style AC_MSG_CHECKING(whether this is an RPM distribution) RPM_COMMAND="`which rpm`" aq_distrib_name="" aq_distrib_tag="" aq_distrib_version="" if test -n "${RPM_COMMAND}"; then if test -x "${RPM_COMMAND}"; then if test -e "/etc/mandriva-release"; then aq_distrib_name="mandriva" aq_distrib_tag="mdk" aq_distrib_version="`rpm -q --queryformat='%{VERSION}' mandriva-release 2>/dev/null`" AC_MSG_RESULT([yes, $aq_distrib_name]) elif test -e "/etc/mandrake-release"; then aq_distrib_name="mandrake" aq_distrib_tag="mdk" aq_distrib_version="`rpm -q --queryformat='%{VERSION}' mandrake-release 2>/dev/null`" AC_MSG_RESULT([yes, $aq_distrib_name]) elif test -e "/etc/SuSE-release"; then aq_distrib_name="suse" aq_distrib_tag="suse" read v1 v2 v3 v4 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) aqbanking-5.6.4beta/m4/ltversion.m40000644000175000017500000000126212276417211014051 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) aqbanking-5.6.4beta/INSTALL0000644000175000017500000002203012364015477012275 00000000000000Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. aqbanking-5.6.4beta/compile0000755000175000017500000001624512261335263012627 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aqbanking-5.6.4beta/install-sh0000755000175000017500000003325512261335263013255 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aqbanking-5.6.4beta/configure0000755000175000017500000261330012643540065013157 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="README" ac_default_prefix=/usr # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS aqbanking_backends all_libraries all_includes TUTORIALS AQBANKING_CLI_VERSION_STRING ENABLE_CLI_FALSE ENABLE_CLI_TRUE AQEBICS_LIBS AQEBICS_CFLAGS LIBXSLT_LIBS LIBXSLT_CFLAGS LIBXML_LIBS LIBXML_CFLAGS XMLSEC_LIBS XMLSEC_CFLAGS aqebics_datadir with_aqebics aqebics_ldflags aqebics_libs aqebics_internal_libs aqebics_includes aqofxconnect_libs aqofxconnect_internal_libs aqofxconnect_includes aqhbci_datadir with_aqhbci aqhbci_ldflags aqhbci_libs aqhbci_internal_libs aqhbci_includes DOXYGEN_TAGFILES DOXYGEN_FILE_PATTERNS DOXYGEN_DEFINE DOXYGEN_INPUT docpath aqbankingpp_modules aqbanking_modules ADD_ACLOCAL_FLAGS aqbanking_headerdir aqbanking_headerdir_am aqbanking_symlinkdir aqbanking_pkgdatadir aqbanking_plugindir aqbanking_libs aqbanking_ldflags aqbanking_internal_libs aqbanking_includes aqbanking_sys_is_windows visibility_cflags STRIPALL i18n_libs HAVE_I18N IF_MAKE_I18N_FILES_FALSE IF_MAKE_I18N_FILES_TRUE MSGFMT_SUPPORTS_QT MAKE_I18N_FILES MSGFMT XGETTEXT aq_distrib_version aq_distrib_tag aq_distrib_name aqbanking_data_searchdir aqbanking_locale_searchdir aqbanking_cfg_searchdir aqbanking_plugin_searchdir IS_WINDOWS_FALSE IS_WINDOWS_TRUE gmp_libs XMLMERGE typemaker2_exe WITH_GWENGUI_GTK2_FALSE WITH_GWENGUI_GTK2_TRUE HAVE_GWENGUI_GTK2 GTK2_LIBS GTK2_CFLAGS GWENGUI_GTK2_LIBS GWENGUI_GTK2_CFLAGS gwenhywfar_has_crypt gwenhywfar_headers gwenhywfar_includes gwenhywfar_libs gwenhywfar_bindir gwenhywfar_plugins gwenhywfar_dir GWENHYWFAR_MINIMUM_VERSION ktoblzcheck_includes ktoblzcheck_libs WITH_KTOBLZCHECK_FALSE WITH_KTOBLZCHECK_TRUE ktoblzcheck_LIBS ktoblzcheck_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG aqbanking_plugins_bankinfo_dirs aqbanking_plugins_parsers_dirs aqbanking_plugins_imexporters_dirs aqbanking_plugins_backends_dirs USE_DOT RC AS CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC abs_top_builddir INSTALL_DLL_TARGET MAKE_DLL_TARGET OS_TYPE OSYSTEM AQEBICS_SO_EFFECTIVE AQEBICS_SO_AGE AQEBICS_SO_REVISION AQEBICS_SO_CURRENT AQEBICS_VERSION_RELEASE_STRING AQEBICS_VERSION_STRING AQEBICS_VERSION_FULL_STRING AQEBICS_VERSION_TAG AQEBICS_VERSION_BUILD AQEBICS_VERSION_PATCHLEVEL AQEBICS_VERSION_MINOR AQEBICS_VERSION_MAJOR AQOFXCONNECT_SO_EFFECTIVE AQOFXCONNECT_SO_AGE AQOFXCONNECT_SO_REVISION AQOFXCONNECT_SO_CURRENT AQOFXCONNECT_VERSION_RELEASE_STRING AQOFXCONNECT_VERSION_STRING AQOFXCONNECT_VERSION_FULL_STRING AQOFXCONNECT_VERSION_TAG AQOFXCONNECT_VERSION_BUILD AQOFXCONNECT_VERSION_PATCHLEVEL AQOFXCONNECT_VERSION_MINOR AQOFXCONNECT_VERSION_MAJOR AQHBCI_SO_EFFECTIVE AQHBCI_SO_AGE AQHBCI_SO_REVISION AQHBCI_SO_CURRENT AQHBCI_VERSION_RELEASE_STRING AQHBCI_VERSION_STRING AQHBCI_VERSION_FULL_STRING AQHBCI_VERSION_TAG AQHBCI_VERSION_BUILD AQHBCI_VERSION_PATCHLEVEL AQHBCI_VERSION_MINOR AQHBCI_VERSION_MAJOR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AQBANKING_SO_EFFECTIVE AQBANKING_SO_AGE AQBANKING_SO_REVISION AQBANKING_SO_CURRENT AQBANKING_VERSION_RELEASE_STRING AQBANKING_VERSION_STRING AQBANKING_VERSION_FULL_STRING AQBANKING_VERSION_TAG AQBANKING_VERSION_BUILD AQBANKING_VERSION_PATCHLEVEL AQBANKING_VERSION_MINOR AQBANKING_VERSION_MAJOR DATETIME host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_build_datetime enable_silent_rules enable_static enable_shared enable_dependency_tracking with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_backends with_imexporters with_parsers with_bankinfos enable_gwenhywfar with_gwen_dir enable_gui_tests with_typemaker2_exe with_xmlmerge enable_local_install with_plugin_searchdir with_cfg_searchdir with_locale_searchdir with_data_searchdir enable_release enable_debug enable_warnings enable_error_on_warning with_docpath enable_full_doc with_aqhbci_datadir with_aqebics_datadir enable_init_plugins enable_aqb_subproject enable_cli with_cli_version_string enable_tutorials ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR ktoblzcheck_CFLAGS ktoblzcheck_LIBS GWENGUI_GTK2_CFLAGS GWENGUI_GTK2_LIBS GTK2_CFLAGS GTK2_LIBS XMLSEC_CFLAGS XMLSEC_LIBS LIBXML_CFLAGS LIBXML_LIBS LIBXSLT_CFLAGS LIBXSLT_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-gwenhywfar enable gwenhywfar support (default=yes) --enable-gwenhywfar-test enable gwenhywfar-test (default=yes) --enable-gui-tests allow GUI tests (default=no) --enable-local-install allow local installation mode (default=no) --enable-release make this an official release (default=no) --enable-debug enable compile arguments for debugging code --enable-warnings enable compilation warnings, default=yes --enable-error-on-warning treat all compile warnings as errors, default=no --enable-full-doc enable creating full apidoc (default=no) --enable-init-plugins enable plugin init (default=yes) --enable-aqb-subproject make gwen only a subproject (default=no) --enable-cli build aqbanking-cli (default=yes) --enable-tutorials build tutorials (default=yes) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-build-datetime=DATETIME use fixed datetime for build (default: current date and time) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-backends=list space separated list of backends (default:all) --with-imexporters=list space separated list of im-/exporters (default:all) --with-parsers=list space separated list of parsers (default:all) --with-bankinfos=list space separated list of bankinfo (default:all) --with-gwen-dir=DIR uses gwenhywfar from given dir --with-typemaker2-exe=EXE path and name of the executable typemaker2 --with-xmlmerge=PATH path and name of tool xmlmerge --with-plugin-searchdir=DIR where to search for plugins --with-cfg-searchdir=DIR where to search for cfg files --with-locale-searchdir=DIR where to search for locale files --with-data-searchdir=DIR where to search for data files --with-docpath=DIR where to store the apidoc --with-aqhbci-datadir=DIR where to search for data files --with-aqebics-datadir=DIR where to search for data files --with-cli-version-string list of additional libraries Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path ktoblzcheck_CFLAGS C compiler flags for ktoblzcheck, overriding pkg-config ktoblzcheck_LIBS linker flags for ktoblzcheck, overriding pkg-config GWENGUI_GTK2_CFLAGS C compiler flags for GWENGUI_GTK2, overriding pkg-config GWENGUI_GTK2_LIBS linker flags for GWENGUI_GTK2, overriding pkg-config GTK2_CFLAGS C compiler flags for GTK2, overriding pkg-config GTK2_LIBS linker flags for GTK2, overriding pkg-config XMLSEC_CFLAGS C compiler flags for XMLSEC, overriding pkg-config XMLSEC_LIBS linker flags for XMLSEC, overriding pkg-config LIBXML_CFLAGS C compiler flags for LIBXML, overriding pkg-config LIBXML_LIBS linker flags for LIBXML, overriding pkg-config LIBXSLT_CFLAGS C compiler flags for LIBXSLT, overriding pkg-config LIBXSLT_LIBS linker flags for LIBXSLT, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_config_headers="$ac_config_headers config.h" ###------------------------------------------------------------------------- # # AqBanking versions # AQBANKING_VERSION_MAJOR=5 AQBANKING_VERSION_MINOR=6 AQBANKING_VERSION_PATCHLEVEL=4 AQBANKING_VERSION_BUILD=0 AQBANKING_VERSION_TAG="beta" ###------------------------------------------------------------------------- # # SO versions # # # AqBanking # AQBANKING_SO_CURRENT=40 AQBANKING_SO_AGE=5 AQBANKING_SO_REVISION=4 AQBANKING_SO_EFFECTIVE="`echo \$(($AQBANKING_SO_CURRENT-$AQBANKING_SO_AGE))`" # # backends # AQHBCI_SO_CURRENT=22 AQHBCI_SO_AGE=0 AQHBCI_SO_REVISION=0 AQHBCI_SO_EFFECTIVE="`echo \$(($AQHBCI_SO_CURRENT-$AQHBCI_SO_AGE))`" AQOFXCONNECT_SO_CURRENT=7 AQOFXCONNECT_SO_AGE=0 AQOFXCONNECT_SO_REVISION=2 AQOFXCONNECT_SO_EFFECTIVE="`echo \$(($AQOFXCONNECT_SO_CURRENT-$AQOFXCONNECT_SO_AGE))`" AQEBICS_SO_CURRENT=2 AQEBICS_SO_AGE=1 AQEBICS_SO_REVISION=9 AQEBICS_SO_EFFECTIVE="`echo \$(($AQEBICS_SO_CURRENT-$AQEBICS_SO_AGE))`" ###------------------------------------------------------------------------- # # Generate version strings and BUILD # SVN="svn" AQBANKING_VERSION_FULL_STRING="${AQBANKING_VERSION_MAJOR}.${AQBANKING_VERSION_MINOR}.${AQBANKING_VERSION_PATCHLEVEL}.${AQBANKING_VERSION_BUILD}${AQBANKING_VERSION_TAG}" AQBANKING_VERSION_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" case "$AQBANKING_VERSION_TAG" in svn|cvs) rev=`LC_ALL="C" $SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` if test "x$rev" != "x" ; then AQBANKING_VERSION_FULL_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.${AQBANKING_VERSION_PATCHLEVEL}${AQBANKING_VERSION_TAG}-r${rev}" fi ;; git) AQBANKING_VERSION_FULL_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.${AQBANKING_VERSION_PATCHLEVEL}.${AQBANKING_VERSION_BUILD}" ;; esac ###------------------------------------------------------------------------- # # Versions (all versions are now linked to AqBanking versions, so the lines # here don't have to be changed) # AQHBCI_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQHBCI_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQHBCI_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQHBCI_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQHBCI_VERSION_TAG=$AQBANKING_VERSION_TAG AQHBCI_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQHBCI_VERSION_STRING="$AQBANKING_VERSION_STRING" AQOFXCONNECT_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQOFXCONNECT_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQOFXCONNECT_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQOFXCONNECT_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQOFXCONNECT_VERSION_TAG=$AQBANKING_VERSION_TAG AQOFXCONNECT_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQOFXCONNECT_VERSION_STRING="$AQBANKING_VERSION_STRING" AQEBICS_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQEBICS_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQEBICS_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQEBICS_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQEBICS_VERSION_TAG=$AQBANKING_VERSION_TAG AQEBICS_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQEBICS_VERSION_STRING="$AQBANKING_VERSION_STRING" ###------------------------------------------------------------------------- # # datetime # # Check whether --with-build-datetime was given. if test "${with_build_datetime+set}" = set; then : withval=$with_build_datetime; if test "x$withval" = "xyes"; then : DATETIME="`date +\"%Y%m%d%H%M%S\"`" else DATETIME="`date +\"%Y%m%d%H%M%S\" --date=\"$withval\"`" fi else DATETIME="`date +\"%Y%m%d%H%M%S\"`" fi ###------------------------------------------------------------------------- # # Create release strings # case "$AQBANKING_VERSION_TAG" in cvs|svn) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL.r${AQBANKING_VERSION_BUILD}" ;; git) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL.${AQBANKING_VERSION_BUILD}-${AQBANKING_VERSION_TAG}" ;; stable) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" ;; *) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" # add TAG AQBANKING_VERSION_RELEASE_STRING="${AQBANKING_VERSION_RELEASE_STRING}${AQBANKING_VERSION_TAG}" ;; esac AQHBCI_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" AQOFXCONNECT_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" AQEBICS_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" ###------------------------------------------------------------------------- # # SUBST and DEFINE versions # cat >>confdefs.h <<_ACEOF #define AQBANKING_SO_EFFECTIVE_STR "$AQBANKING_SO_EFFECTIVE" _ACEOF am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=aqbanking VERSION=$AQBANKING_VERSION_RELEASE_STRING cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # # same for AqHBCI # cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_MAJOR $AQHBCI_VERSION_MAJOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_MINOR $AQHBCI_VERSION_MINOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_PATCHLEVEL $AQHBCI_VERSION_PATCHLEVEL _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_BUILD $AQHBCI_VERSION_BUILD _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_STRING "$AQHBCI_VERSION_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_FULL_STRING "$AQHBCI_VERSION_FULL_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_VERSION_TAG $AQHBCI_VERSION_TAG _ACEOF cat >>confdefs.h <<_ACEOF #define AQHBCI_SO_EFFECTIVE_STR "$AQHBCI_SO_EFFECTIVE" _ACEOF # # same for AqOFXCONNECT # cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_MAJOR $AQOFXCONNECT_VERSION_MAJOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_MINOR $AQOFXCONNECT_VERSION_MINOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_PATCHLEVEL $AQOFXCONNECT_VERSION_PATCHLEVEL _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_BUILD $AQOFXCONNECT_VERSION_BUILD _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_STRING "$AQOFXCONNECT_VERSION_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_FULL_STRING "$AQOFXCONNECT_VERSION_FULL_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_VERSION_TAG $AQOFXCONNECT_VERSION_TAG _ACEOF cat >>confdefs.h <<_ACEOF #define AQOFXCONNECT_SO_EFFECTIVE_STR "$AQOFXCONNECT_SO_EFFECTIVE" _ACEOF # # same for AqEBICS # cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_MAJOR $AQEBICS_VERSION_MAJOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_MINOR $AQEBICS_VERSION_MINOR _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_PATCHLEVEL $AQEBICS_VERSION_PATCHLEVEL _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_BUILD $AQEBICS_VERSION_BUILD _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_STRING "$AQEBICS_VERSION_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_FULL_STRING "$AQEBICS_VERSION_FULL_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_VERSION_TAG $AQEBICS_VERSION_TAG _ACEOF cat >>confdefs.h <<_ACEOF #define AQEBICS_SO_EFFECTIVE_STR "$AQEBICS_SO_EFFECTIVE" _ACEOF ###------------------------------------------------------------------------- # # determine operating system # # check for OS { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } OSYSTEM="" OS_TYPE="" MAKE_DLL_TARGET="" INSTALL_DLL_TARGET="" cat >>confdefs.h <<_ACEOF #define OS_NAME "$host" _ACEOF case "$host" in *-linux*) OSYSTEM="linux" $as_echo "#define OS_LINUX 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-solaris*) OSYSTEM="solaris" $as_echo "#define OS_SOLARIS 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-darwin*) OSYSTEM="osx" $as_echo "#define OS_DARWIN 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-openbsd*) OSYSTEM="openbsd" $as_echo "#define OS_OPENBSD 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-freebsd* | *-kfreebsd*) OSYSTEM="freebsd" $as_echo "#define OS_FREEBSD 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-netbsd*) OSYSTEM="netbsd" $as_echo "#define OS_NETBSD 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-beos*) OSYSTEM="beos" $as_echo "#define OS_BEOS 1" >>confdefs.h $as_echo "#define OS_POSIX 1" >>confdefs.h OS_TYPE="posix" ;; *-win32*) OSYSTEM="windows" $as_echo "#define OS_WIN32 1" >>confdefs.h OS_TYPE="windows" cat >>confdefs.h <<_ACEOF #define BUILDING_DLL 1 _ACEOF MAKE_DLL_TARGET="dll" INSTALL_DLL_TARGET="dll-install" ;; *-mingw32*) OSYSTEM="windows" $as_echo "#define OS_WIN32 1" >>confdefs.h OS_TYPE="windows" cat >>confdefs.h <<_ACEOF #define BUILDING_DLL 1 _ACEOF MAKE_DLL_TARGET="dll" INSTALL_DLL_TARGET="dll-install" ;; *-palmos*) OSYSTEM="palmos" $as_echo "#define OS_PALMOS 1" >>confdefs.h OS_TYPE="palmos" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sorry, but host $host is not supported. Please report if it works anyway. We will assume that your system is a posix system and continue." >&5 $as_echo "$as_me: WARNING: Sorry, but host $host is not supported. Please report if it works anyway. We will assume that your system is a posix system and continue." >&2;} OSYSTEM="unknown" OS_TYPE="posix" $as_echo "#define OS_POSIX 1" >>confdefs.h ;; esac cat >>confdefs.h <<_ACEOF #define OS_SHORTNAME "$OSYSTEM" _ACEOF cat >>confdefs.h <<_ACEOF #define OS_TYPE "$OS_TYPE" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OS_TYPE" >&5 $as_echo "$OS_TYPE" >&6; } ###------------------------------------------------------------------------- # # prefix handling # if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix ac_configure_args="$ac_configure_args --prefix $prefix" fi ###------------------------------------------------------------------------- # # static/shared handling # # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=no fi # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi ###------------------------------------------------------------------------- # # define some needed variables # abs_top_builddir="`pwd`" ###------------------------------------------------------------------------- # # Enable some GNU extensions if using the GNU C library # DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h ###------------------------------------------------------------------------- # # Checks for programs. # ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes if test -n "$compiler"; then : fi GCC=$lt_save_GCC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS # Newer libtool doesn't have AC_LIBTOOL_RC anymore. Need to check for # $(RC) by ourselves. if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="no" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_USE_DOT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$USE_DOT"; then ac_cv_prog_USE_DOT="$USE_DOT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_USE_DOT="YES" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_USE_DOT" && ac_cv_prog_USE_DOT="NO" fi fi USE_DOT=$ac_cv_prog_USE_DOT if test -n "$USE_DOT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_DOT" >&5 $as_echo "$USE_DOT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_SED+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SED"; then ac_cv_prog_SED="$SED" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_SED="sed" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SED=$ac_cv_prog_SED if test -n "$SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 $as_echo "$SED" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Checks for libraries. ###------------------------------------------------------------------------- # # Checks for header files. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in fcntl.h stdlib.h string.h unistd.h locale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in termios.h signal.h iconv.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "sigprocmask" "ac_cv_have_decl_sigprocmask" " #ifdef HAVE_SIGNAL_H # include #endif " if test "x$ac_cv_have_decl_sigprocmask" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SIGPROCMASK $ac_have_decl _ACEOF ###------------------------------------------------------------------------- # # Checks for typedefs, structures, and compiler characteristics. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ###------------------------------------------------------------------------- # # Checks for library functions. # for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in memmove memset strcasecmp strdup strerror snprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in setlocale do : ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETLOCALE 1 _ACEOF fi done ###------------------------------------------------------------------------- # # Backends. Those do not have a required ordering. # # Check whether --with-backends was given. if test "${with_backends+set}" = set; then : withval=$with_backends; aqbanking_backends="$withval" else aqbanking_backends="all" fi if test "$aqbanking_backends" = "all"; then aqbanking_backends="aqhbci aqnone aqofxconnect aqebics" fi for f in ${aqbanking_backends}; do case "$f" in aqhbci) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqhbci" $as_echo "#define AQBANKING_WITH_PLUGIN_BACKEND_AQHBCI 1" >>confdefs.h ;; aqebics) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqebics" $as_echo "#define AQBANKING_WITH_PLUGIN_BACKEND_AQEBICS 1" >>confdefs.h ;; aqnone) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqnone" $as_echo "#define AQBANKING_WITH_PLUGIN_BACKEND_AQNONE 1" >>confdefs.h ;; aqofxconnect) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqofxconnect" $as_echo "#define AQBANKING_WITH_PLUGIN_BACKEND_AQOFXCONNECT 1" >>confdefs.h ;; aqpaypal) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"WARNING: AqPaypal no longer supported" >&5 $as_echo "$as_me: WARNING: \"WARNING: AqPaypal no longer supported" >&2;} ;; *) as_fn_error $? ""ERROR: Unknown plugin \"$f\""" "$LINENO" 5 ;; esac done ###------------------------------------------------------------------------- # # ImExporters. Those do not have a required ordering. # # Check whether --with-imexporters was given. if test "${with_imexporters+set}" = set; then : withval=$with_imexporters; aqbanking_imexporters="$withval" else aqbanking_imexporters="all" fi if test "$aqbanking_imexporters" = "all"; then aqbanking_imexporters="csv dtaus eri2 ofx openhbci1 swift xmldb yellownet sepa ctxfile q43" fi for f in ${aqbanking_imexporters}; do case "$f" in csv) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs csv" ;; dtaus) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs dtaus" ;; eri2) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs eri2" ;; ofx) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs ofx" ;; openhbci1) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs openhbci1" ;; swift) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs swift" ;; xmldb) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs xmldb" ;; yellownet) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs yellownet" ;; sepa) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs sepa" ;; ctxfile) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs ctxfile" ;; q43) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs q43" ;; *) as_fn_error $? ""ERROR: Unknown plugin \"$f\""" "$LINENO" 5 ;; esac done ###------------------------------------------------------------------------- # # Parsers. Those do not have a required ordering. # # Check whether --with-parsers was given. if test "${with_parsers+set}" = set; then : withval=$with_parsers; aqbanking_parsers="$withval" else aqbanking_parsers="all" fi if test "$aqbanking_parsers" = "all"; then aqbanking_parsers="dtaus swift" fi for f in ${aqbanking_parsers}; do case "$f" in dtaus) aqbanking_plugins_parsers_dirs="$aqbanking_plugins_parsers_dirs dtaus" ;; swift) aqbanking_plugins_parsers_dirs="$aqbanking_plugins_parsers_dirs swift" ;; *) as_fn_error $? ""ERROR: Unknown plugin \"$f\""" "$LINENO" 5 ;; esac done ###------------------------------------------------------------------------- # # Bankinfo plugins. Those do not have a required ordering. # # Check whether --with-bankinfos was given. if test "${with_bankinfos+set}" = set; then : withval=$with_bankinfos; aqbanking_bankinfos="$withval" else aqbanking_bankinfos="all" fi if test "$aqbanking_bankinfos" = "all"; then aqbanking_bankinfos="at ca ch de us" fi for f in ${aqbanking_bankinfos}; do case "$f" in at) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs at" ;; ca) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs ca" ;; ch) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs ch" ;; de) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs de" ;; us) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs us" ;; *) as_fn_error $? ""ERROR: Unknown plugin \"$f\""" "$LINENO" 5 ;; esac done ###------------------------------------------------------------------------- # # KtoBlzCheck # pkg_modules="ktoblzcheck >= 1.10" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ktoblzcheck" >&5 $as_echo_n "checking for ktoblzcheck... " >&6; } if test -n "$ktoblzcheck_CFLAGS"; then pkg_cv_ktoblzcheck_CFLAGS="$ktoblzcheck_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$pkg_modules\""; } >&5 ($PKG_CONFIG --exists --print-errors "$pkg_modules") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ktoblzcheck_CFLAGS=`$PKG_CONFIG --cflags "$pkg_modules" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ktoblzcheck_LIBS"; then pkg_cv_ktoblzcheck_LIBS="$ktoblzcheck_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$pkg_modules\""; } >&5 ($PKG_CONFIG --exists --print-errors "$pkg_modules") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ktoblzcheck_LIBS=`$PKG_CONFIG --libs "$pkg_modules" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ktoblzcheck_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$pkg_modules" 2>&1` else ktoblzcheck_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$pkg_modules" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ktoblzcheck_PKG_ERRORS" >&5 have_ktoblzcheck="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_ktoblzcheck="no" else ktoblzcheck_CFLAGS=$pkg_cv_ktoblzcheck_CFLAGS ktoblzcheck_LIBS=$pkg_cv_ktoblzcheck_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_ktoblzcheck="yes" fi if test "$have_ktoblzcheck" = "yes"; then $as_echo "#define HAVE_KTOBLZCHECK 1" >>confdefs.h ktoblzcheck_includes="$ktoblzcheck_CFLAGS" ktoblzcheck_libs="$ktoblzcheck_LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ktoblzcheck is missing. *** Account number checking will not be available. *** We strongly suggest installing ktoblzcheck and its devel *** package." >&5 $as_echo "$as_me: WARNING: *** ktoblzcheck is missing. *** Account number checking will not be available. *** We strongly suggest installing ktoblzcheck and its devel *** package." >&2;} fi if test "$have_ktoblzcheck" = "yes"; then WITH_KTOBLZCHECK_TRUE= WITH_KTOBLZCHECK_FALSE='#' else WITH_KTOBLZCHECK_TRUE='#' WITH_KTOBLZCHECK_FALSE= fi ###------------------------------------------------------------------------- # # Check for Gwen # # Variable used in aqbanking-config.cmake GWENHYWFAR_MINIMUM_VERSION="4.10.0.0" if test -z "4"; then vma="0"; else vma="4"; fi if test -z "10"; then vmi="1"; else vmi="10"; fi if test -z "0"; then vpl="0"; else vpl="0"; fi if test -z "0"; then vbld="0"; else vbld="0"; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gwenhywfar support desired" >&5 $as_echo_n "checking if gwenhywfar support desired... " >&6; } # Check whether --enable-gwenhywfar was given. if test "${enable_gwenhywfar+set}" = set; then : enableval=$enable_gwenhywfar; enable_gwenhywfar="$enableval" else enable_gwenhywfar="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gwenhywfar" >&5 $as_echo "$enable_gwenhywfar" >&6; } have_gwenhywfar="no" gwenhywfar_dir="" gwenhywfar_plugins="" gwenhywfar_libs="" gwenhywfar_bindir="" gwenhywfar_libspp="" gwenhywfar_includes="" gwenhywfar_has_crypt="yes" if test "$enable_gwenhywfar" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwenhywfar" >&5 $as_echo_n "checking for gwenhywfar... " >&6; } # Check whether --with-gwen-dir was given. if test "${with_gwen_dir+set}" = set; then : withval=$with_gwen_dir; lcc_dir="$withval" else lcc_dir="${prefix} \ /usr/local \ /usr \ /gwen \ /sw \ /" fi for li in $lcc_dir; do if test -x "$li/bin/gwenhywfar-config"; then gwenhywfar_dir="$li"; break fi done if test -z "$gwenhywfar_dir"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found " >&5 $as_echo "not found " >&6; } as_fn_error $? " *** The library Gwenhywfar was not found. Obtain it from *** http://www.aquamaniac.de . *** If it is already installed (including the -devel package), *** you might need to specify the location with the *** option --with-gwen-dir=DIR." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_dir" >&5 $as_echo "$gwenhywfar_dir" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwen libs" >&5 $as_echo_n "checking for gwen libs... " >&6; } gwenhywfar_libs="`$gwenhywfar_dir/bin/gwenhywfar-config --libraries`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_libs" >&5 $as_echo "$gwenhywfar_libs" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwen includes" >&5 $as_echo_n "checking for gwen includes... " >&6; } gwenhywfar_includes="`$gwenhywfar_dir/bin/gwenhywfar-config --includes`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_includes" >&5 $as_echo "$gwenhywfar_includes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwen binary tools" >&5 $as_echo_n "checking for gwen binary tools... " >&6; } gwenhywfar_bindir="`$gwenhywfar_dir/bin/gwenhywfar-config --bindir`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_bindir" >&5 $as_echo "$gwenhywfar_bindir" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwen plugins" >&5 $as_echo_n "checking for gwen plugins... " >&6; } gwenhywfar_plugins="`$gwenhywfar_dir/bin/gwenhywfar-config --plugins`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_plugins" >&5 $as_echo "$gwenhywfar_plugins" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gwen headers" >&5 $as_echo_n "checking for gwen headers... " >&6; } gwenhywfar_headers="`$gwenhywfar_dir/bin/gwenhywfar-config --headers`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gwenhywfar_headers" >&5 $as_echo "$gwenhywfar_headers" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gwenhywfar test desired" >&5 $as_echo_n "checking if gwenhywfar test desired... " >&6; } # Check whether --enable-gwenhywfar was given. if test "${enable_gwenhywfar+set}" = set; then : enableval=$enable_gwenhywfar; enable_gwenhywfar_test="$enableval" else enable_gwenhywfar_test="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gwenhywfar_test" >&5 $as_echo "$enable_gwenhywfar_test" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Gwenhywfar version >=$vma.$vmi.$vpl.$vbld" >&5 $as_echo_n "checking for Gwenhywfar version >=$vma.$vmi.$vpl.$vbld... " >&6; } if test "$enable_gwenhywfar_test" != "no"; then gwen_versionstring="`$gwenhywfar_dir/bin/gwenhywfar-config --vstring`.`$gwenhywfar_dir/bin/gwenhywfar-config --vbuild`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $gwen_versionstring" >&5 $as_echo "found $gwen_versionstring" >&6; } if test "$vma" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vmajor`"; then as_fn_error $? "Your Gwenhywfar version is way too old. Please update from http://www.aquamaniac.de" "$LINENO" 5 elif test "$vma" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vmajor`"; then if test "$vmi" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vminor`"; then as_fn_error $? "Your Gwenhywfar version is too old. Please update from http://www.aquamaniac.de" "$LINENO" 5 elif test "$vmi" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vminor`"; then if test "$vpl" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vpatchlevel`"; then as_fn_error $? "Your Gwenhywfar version is a little bit too old. Please update from http://www.aquamaniac.de" "$LINENO" 5 elif test "$vpl" = "`$gwenhywfar_dir/bin/gwenhywfar-config --vpatchlevel`"; then if test "$vbld" -gt "`$gwenhywfar_dir/bin/gwenhywfar-config --vbuild`"; then as_fn_error $? "Your Gwenhywfar version is a little bit too old. Please update to the latest SVN version. Instructions for accessing SVN can be found on http://www.aquamaniac.de" "$LINENO" 5 fi fi fi fi have_gwenhywfar="yes" #AC_MSG_RESULT(yes) else have_gwenhywfar="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming yes" >&5 $as_echo "assuming yes" >&6; } fi fi all_includes="$all_includes $gwenhywfar_includes" # Check whether --enable-gui-tests was given. if test "${enable_gui_tests+set}" = set; then : enableval=$enable_gui_tests; enable_gui_tests="$enableval" else enable_gui_tests="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gui_tests" >&5 $as_echo "$enable_gui_tests" >&6; } if test "$enable_gui_tests" != "no"; then # For libgwenhywfar > 3.99.20, look for its library gwengui-gtk2. pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GWENGUI_GTK2" >&5 $as_echo_n "checking for GWENGUI_GTK2... " >&6; } if test -n "$GWENGUI_GTK2_CFLAGS"; then pkg_cv_GWENGUI_GTK2_CFLAGS="$GWENGUI_GTK2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gwengui-gtk2 gwenhywfar\""; } >&5 ($PKG_CONFIG --exists --print-errors "gwengui-gtk2 gwenhywfar") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GWENGUI_GTK2_CFLAGS=`$PKG_CONFIG --cflags "gwengui-gtk2 gwenhywfar" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GWENGUI_GTK2_LIBS"; then pkg_cv_GWENGUI_GTK2_LIBS="$GWENGUI_GTK2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gwengui-gtk2 gwenhywfar\""; } >&5 ($PKG_CONFIG --exists --print-errors "gwengui-gtk2 gwenhywfar") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GWENGUI_GTK2_LIBS=`$PKG_CONFIG --libs "gwengui-gtk2 gwenhywfar" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GWENGUI_GTK2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gwengui-gtk2 gwenhywfar" 2>&1` else GWENGUI_GTK2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gwengui-gtk2 gwenhywfar" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GWENGUI_GTK2_PKG_ERRORS" >&5 HAVE_GWENGUI_GTK2=0 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GWENGUI_GTK2=0 else GWENGUI_GTK2_CFLAGS=$pkg_cv_GWENGUI_GTK2_CFLAGS GWENGUI_GTK2_LIBS=$pkg_cv_GWENGUI_GTK2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GWENGUI_GTK2=1 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK2" >&5 $as_echo_n "checking for GTK2... " >&6; } if test -n "$GTK2_CFLAGS"; then pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK2_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK2_LIBS"; then pkg_cv_GTK2_LIBS="$GTK2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK2_LIBS=`$PKG_CONFIG --libs "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0" 2>&1` else GTK2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-2.0) were not met: $GTK2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK2_CFLAGS and GTK2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK2_CFLAGS and GTK2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK2_CFLAGS=$pkg_cv_GTK2_CFLAGS GTK2_LIBS=$pkg_cv_GTK2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "$HAVE_GWENGUI_GTK2" = "1"; then $as_echo "#define USE_GWENGUI_GTK2 1" >>confdefs.h fi else HAVE_GWENGUI_GTK2=0 fi if test "$HAVE_GWENGUI_GTK2" = "1"; then WITH_GWENGUI_GTK2_TRUE= WITH_GWENGUI_GTK2_FALSE='#' else WITH_GWENGUI_GTK2_TRUE='#' WITH_GWENGUI_GTK2_FALSE= fi ###------------------------------------------------------------------------- # # check typemaker2 # { $as_echo "$as_me:${as_lineno-$LINENO}: checking typemaker2 binary" >&5 $as_echo_n "checking typemaker2 binary... " >&6; } # Check whether --with-typemaker2-exe was given. if test "${with_typemaker2_exe+set}" = set; then : withval=$with_typemaker2_exe; typemaker2_exe="$withval" else typemaker2_exe="\$(gwenhywfar_bindir)/typemaker2" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $typemaker2_exe" >&5 $as_echo "$typemaker2_exe" >&6; } ###------------------------------------------------------------------------- # # check xmlmerge # { $as_echo "$as_me:${as_lineno-$LINENO}: checking xmlmerge" >&5 $as_echo_n "checking xmlmerge... " >&6; } # Check whether --with-xmlmerge was given. if test "${with_xmlmerge+set}" = set; then : withval=$with_xmlmerge; XMLMERGE="$withval" else XMLMERGE="$gwenhywfar_dir/bin/xmlmerge" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLMERGE" >&5 $as_echo "$XMLMERGE" >&6; } ###------------------------------------------------------------------------- # # Check for GMP # # Allow the user to override the gmp_libs detection here if test "x$gmp_libs" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpz_init=yes else ac_cv_lib_gmp___gmpz_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : have_gmp="yes" else have_gmp="no" fi for ac_header in gmp.h do : ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GMP_H 1 _ACEOF else have_gmp="no" fi done if test "$have_gmp" != "yes"; then as_fn_error $? "GMP is required, see http://swox.com/gmp" "$LINENO" 5 else gmp_libs="-lgmp" fi fi ###------------------------------------------------------------------------- # # OS dependant settings # # Common settings; can be overridden per-OS below. aqbanking_internal_libs="${abs_top_builddir}/src/libs/aqbanking/libaqbanking.la" aqbanking_ldflags="-L\${libdir}" aqbanking_libs="-laqbanking" aqbanking_includes="-I\${includedir}/aqbanking5" aqbanking_headerdir_am="\$(includedir)/aqbanking5" aqbanking_headerdir="\${includedir}/aqbanking5" aqbanking_plugindir="\${libdir}/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" aqbanking_pkgdatadir="\${datadir}/aqbanking" aqbanking_symlinkdir="\$(top_builddir)/aqbanking5" case "$OS_TYPE" in posix) aqbanking_sys_is_windows=0 ;; windows) aqbanking_sys_is_windows=1 cat >>confdefs.h <<_ACEOF #define BUILDING_AQBANKING_DLL 1 _ACEOF ;; esac if test "$OS_TYPE" = "windows"; then IS_WINDOWS_TRUE= IS_WINDOWS_FALSE='#' else IS_WINDOWS_TRUE='#' IS_WINDOWS_FALSE= fi ###------------------------------------------------------------------------- # # check whether local installation mode is enabled # { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether local installation mode is wanted" >&5 $as_echo_n "checking whether local installation mode is wanted... " >&6; } # Check whether --enable-local-install was given. if test "${enable_local_install+set}" = set; then : enableval=$enable_local_install; enable_local_install="$enableval" else enable_local_install="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_local_install" >&5 $as_echo "$enable_local_install" >&6; } if test "$enable_local_install" != "no"; then $as_echo "#define ENABLE_LOCAL_INSTALL 1" >>confdefs.h fi ###------------------------------------------------------------------------- # # check plugin search path # { $as_echo "$as_me:${as_lineno-$LINENO}: checking plugin search dir" >&5 $as_echo_n "checking plugin search dir... " >&6; } # Check whether --with-plugin-searchdir was given. if test "${with_plugin_searchdir+set}" = set; then : withval=$with_plugin_searchdir; aqbanking_plugin_searchdir="$withval" else aqbanking_plugin_searchdir="" fi if test -z "${aqbanking_plugin_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_plugin_searchdir="lib/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" else if test "$enable_local_install" != "no"; then aqbanking_plugin_searchdir="lib/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" else aqbanking_plugin_searchdir="$aqbanking_plugindir" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqbanking_plugin_searchdir" >&5 $as_echo "$aqbanking_plugin_searchdir" >&6; } ###------------------------------------------------------------------------- # # check cfg search dir # { $as_echo "$as_me:${as_lineno-$LINENO}: checking cfg search dir" >&5 $as_echo_n "checking cfg search dir... " >&6; } # Check whether --with-cfg-searchdir was given. if test "${with_cfg_searchdir+set}" = set; then : withval=$with_cfg_searchdir; aqbanking_cfg_searchdir="$withval" else aqbanking_cfg_searchdir="" fi if test -z "$aqbanking_cfg_searchdir"; then if test "$OSYSTEM" = "windows"; then aqbanking_cfg_searchdir="etc" else if test "$enable_local_install" != "no"; then aqbanking_cfg_searchdir="etc" else aqbanking_cfg_searchdir="\$(sysconfdir)" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqbanking_cfg_searchdir" >&5 $as_echo "$aqbanking_cfg_searchdir" >&6; } ###------------------------------------------------------------------------- # # check locale search dir # { $as_echo "$as_me:${as_lineno-$LINENO}: checking locale search dir" >&5 $as_echo_n "checking locale search dir... " >&6; } # Check whether --with-locale-searchdir was given. if test "${with_locale_searchdir+set}" = set; then : withval=$with_locale_searchdir; aqbanking_locale_searchdir="$withval" else aqbanking_locale_searchdir="" fi if test -z "${aqbanking_locale_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_locale_searchdir="share/locale" else if test "$enable_local_install" != "no"; then aqbanking_locale_searchdir="share/locale" else aqbanking_locale_searchdir="\$(localedir)" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqbanking_locale_searchdir" >&5 $as_echo "$aqbanking_locale_searchdir" >&6; } ###------------------------------------------------------------------------- # # check data search dir # { $as_echo "$as_me:${as_lineno-$LINENO}: checking data search dir" >&5 $as_echo_n "checking data search dir... " >&6; } # Check whether --with-data-searchdir was given. if test "${with_data_searchdir+set}" = set; then : withval=$with_data_searchdir; aqbanking_data_searchdir="$withval" else aqbanking_data_searchdir="" fi if test -z "${aqbanking_data_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_data_searchdir="share" else if test "$enable_local_install" != "no"; then aqbanking_data_searchdir="share" else aqbanking_data_searchdir="\$(datadir)" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqbanking_data_searchdir" >&5 $as_echo "$aqbanking_data_searchdir" >&6; } ###------------------------------------------------------------------------- # check for Distribution { $as_echo "$as_me:${as_lineno-$LINENO}: checking for preselected distribution name" >&5 $as_echo_n "checking for preselected distribution name... " >&6; } if test -n "$aq_distrib_name"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, will have to determine it" >&5 $as_echo "no, will have to determine it" >&6; } aq_distrib_name="" aq_distrib_version="" aq_distrib_tag="" # Debian-style { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is a Debian derivate" >&5 $as_echo_n "checking whether this is a Debian derivate... " >&6; } case `basename $CC` in gcc | gcc-* | *-gcc | *-gcc-*) debtype="` ${CC} --version | head -1`" case $debtype in *\(Debian\ *) aq_distrib_name="Debian" aq_distrib_tag="debian" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } ;; *\(Ubuntu\ * | *\(KUbuntu\ *) aq_distrib_name="Ubuntu" aq_distrib_tag="ubuntu" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi if test -z "$aq_distrib_name"; then # RPM-style { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is an RPM distribution" >&5 $as_echo_n "checking whether this is an RPM distribution... " >&6; } RPM_COMMAND="`which rpm`" aq_distrib_name="" aq_distrib_tag="" aq_distrib_version="" if test -n "${RPM_COMMAND}"; then if test -x "${RPM_COMMAND}"; then if test -e "/etc/mandriva-release"; then aq_distrib_name="mandriva" aq_distrib_tag="mdk" aq_distrib_version="`rpm -q --queryformat='%{VERSION}' mandriva-release 2>/dev/null`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } elif test -e "/etc/mandrake-release"; then aq_distrib_name="mandrake" aq_distrib_tag="mdk" aq_distrib_version="`rpm -q --queryformat='%{VERSION}' mandrake-release 2>/dev/null`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } elif test -e "/etc/SuSE-release"; then aq_distrib_name="suse" aq_distrib_tag="suse" read v1 v2 v3 v4 &5 $as_echo "yes, $aq_distrib_name" >&6; } elif test -e "/etc/fedora-release"; then aq_distrib_name="fedora" aq_distrib_tag="fc" aq_distrib_version="`rpm -q --queryformat='%{VERSION}' fedora-release 2>/dev/null`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, $aq_distrib_name" >&5 $as_echo "yes, $aq_distrib_name" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (RPM found, but unknown distribution)" >&5 $as_echo "no (RPM found, but unknown distribution)" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (RPM not found)" >&5 $as_echo "no (RPM not found)" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (no RPM installed)" >&5 $as_echo "no (no RPM installed)" >&6; } fi fi ###------------------------------------------------------------------------- # # check for I18N # # check whether i18n files are to be created # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XGETTEXT"; then ac_cv_prog_XGETTEXT="$XGETTEXT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XGETTEXT="xgettext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_XGETTEXT" && ac_cv_prog_XGETTEXT="missing" fi fi XGETTEXT=$ac_cv_prog_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi MAKE_I18N_FILES="yes" if test "$XGETTEXT" = "missing"; then MAKE_I18N_FILES="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: xgettext is missing. Locale suport is disabled." >&5 $as_echo "$as_me: WARNING: xgettext is missing. Locale suport is disabled." >&2;} fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="missing" ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" = "missing"; then MAKE_I18N_FILES="no" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: msgfmt is missing. Locale suport is disabled." >&5 $as_echo "$as_me: WARNING: msgfmt is missing. Locale suport is disabled." >&2;} else # check for --qt argument of msgfmt { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether msgfmt understands --qt" >&5 $as_echo_n "checking whether msgfmt understands --qt... " >&6; } if test "x${MSGFMT}" != "x"; then if ${MSGFMT} --qt --help >/dev/null 2>&1; then MSGFMT_SUPPORTS_QT=yes else MSGFMT_SUPPORTS_QT=no fi else MSGFMT_SUPPORTS_QT=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT_SUPPORTS_QT" >&5 $as_echo "$MSGFMT_SUPPORTS_QT" >&6; } fi if test "$MAKE_I18N_FILES" = "yes"; then IF_MAKE_I18N_FILES_TRUE= IF_MAKE_I18N_FILES_FALSE='#' else IF_MAKE_I18N_FILES_TRUE='#' IF_MAKE_I18N_FILES_FALSE= fi # then check whether i18n support is to be compiled in i18n_libs="" HAVE_I18N="yes" for ac_header in locale.h libintl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else HAVE_I18N="no" fi done for ac_func in setlocale do : ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETLOCALE 1 _ACEOF fi done if test "$OS_TYPE" != "windows"; then oldlibs="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gettext" >&5 $as_echo_n "checking for library containing gettext... " >&6; } if ${ac_cv_search_gettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gettext (); int main () { return gettext (); ; return 0; } _ACEOF for ac_lib in '' intl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gettext=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gettext+:} false; then : break fi done if ${ac_cv_search_gettext+:} false; then : else ac_cv_search_gettext=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gettext" >&5 $as_echo "$ac_cv_search_gettext" >&6; } ac_res=$ac_cv_search_gettext if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else HAVE_I18N="no" fi i18n_libs="$LIBS" LIBS="$oldlibs" else i18n_libs="-lintl" fi if test "$HAVE_I18N" != "NO"; then cat >>confdefs.h <<_ACEOF #define HAVE_I18N 1 _ACEOF fi ###------------------------------------------------------------------------- # # check for release # { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is an official release" >&5 $as_echo_n "checking whether this is an official release... " >&6; } # Check whether --enable-release was given. if test "${enable_release+set}" = set; then : enableval=$enable_release; case "${enableval}" in yes) enable_release="yes";; no) enable_release="no";; *) as_fn_error $? "bad value ${enableval} for --enable-release" "$LINENO" 5;; esac else enable_release="no" fi if test "$enable_release" = "yes"; then STRIPALL="-s" else STRIPALL="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_release" >&5 $as_echo "$enable_release" >&6; } ###------------------------------------------------------------------------- # Debug arguments for compilation if test -z ""; then default_debug_arg="-g"; else default_debug_arg=""; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler arguments" >&5 $as_echo_n "checking for compiler arguments... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -g" # Remove -O2 CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's/-O2//'` CFLAGS=`echo "${CFLAGS}" | sed -e 's/-O2//'` CFLAGS="${CFLAGS} -g" LDFLAGS="${LDFLAGS} -g" $as_echo "#define DEBUG 1" >>confdefs.h ;; no) ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else # Default value if the argument was not given CXXFLAGS="${CXXFLAGS} ${default_debug_arg}" CFLAGS="${CFLAGS} ${default_debug_arg}" LDFLAGS="${LDFLAGS} ${default_debug_arg}" fi if test ${GCC}x = yesx; then # Check whether --enable-warnings was given. if test "${enable_warnings+set}" = set; then : enableval=$enable_warnings; case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -Wall" CFLAGS="${CFLAGS} -Wall" ;; all) CXXFLAGS="${CXXFLAGS} -Wall -pedantic -ansi" CFLAGS="${CFLAGS} -Wall -pedantic -ansi" ;; no) ;; *) as_fn_error $? "bad value ${enableval} for --enable-warnings" "$LINENO" 5 ;; esac else # Default value if the argument was not given CXXFLAGS="${CXXFLAGS} -Wall" CFLAGS="${CFLAGS} -Wall" fi GCC_VERSION=`${CC} -dumpversion` if test `echo ${GCC_VERSION} | cut -d. -f1` -ge 3; then # This is gcc >= 3.x.x if test `echo ${GCC_VERSION} | cut -d. -f2` -ge 4; then # This is gcc >= 3.4.x CFLAGS="${CFLAGS} -Wdeclaration-after-statement" fi fi # Check whether --enable-error-on-warning was given. if test "${enable_error_on_warning+set}" = set; then : enableval=$enable_error_on_warning; case "${enableval}" in yes) CXXFLAGS="${CXXFLAGS} -Werror" CFLAGS="${CFLAGS} -Werror" ;; no) ;; *) as_fn_error $? "bad value ${enableval} for --enable-error-on-warning" "$LINENO" 5 ;; esac else # Default value if the argument was not given CXXFLAGS="${CXXFLAGS}" CFLAGS="${CFLAGS}" fi fi # Beautify the CXXFLAGS: remove extra spaces, remove double -g CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's/ */ /g' | sed -e 's/-g -g/-g/'` CFLAGS=`echo "${CFLAGS}" | sed -e 's/ */ /g' | sed -e 's/-g -g/-g/'` # Print the result { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CFLAGS" >&5 $as_echo "$CFLAGS" >&6; } ###------------------------------------------------------------------------- # # Compiler check for symbol visibility # { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports symbol visibility" >&5 $as_echo_n "checking whether compiler supports symbol visibility... " >&6; } if ${ac_cv_hidden_visibility_attribute+:} false; then : $as_echo_n "(cached) " >&6 else echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c ac_cv_hidden_visibility_attribute=no if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then if grep '\.hidden.*foo' conftest.s >/dev/null; then ac_cv_hidden_visibility_attribute=yes fi fi rm -f conftest.* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hidden_visibility_attribute" >&5 $as_echo "$ac_cv_hidden_visibility_attribute" >&6; } if test $ac_cv_hidden_visibility_attribute = yes; then $as_echo "#define GCC_WITH_VISIBILITY_ATTRIBUTE 1" >>confdefs.h visibility_cflags="-fvisibility=hidden" fi ###------------------------------------------------------------------------- # # Subst # GIVEN_CFLAGS=$aqbanking_includes INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done aqbanking_includes=$GIVEN_CFLAGS ###------------------------------------------------------------------------- # # Check for additional aclocal flags # ADD_ACLOCAL_FLAGS="" for A in "${GWEN_PREFIX}/share/aclocal" \ "${prefix}/share/aclocal"; do if test -d "${A}"; then ADD_ACLOCAL_FLAGS="${ADD_ACLOCAL_FLAGS} -I ${A}" fi done ###------------------------------------------------------------------------- # # AqBanking modules # aqbanking_modules=". jobs types" aqbankingpp_modules="." ###------------------------------------------------------------------------- # # docpath # { $as_echo "$as_me:${as_lineno-$LINENO}: checking docpath" >&5 $as_echo_n "checking docpath... " >&6; } # Check whether --with-docpath was given. if test "${with_docpath+set}" = set; then : withval=$with_docpath; docpath="$withval" else docpath="${HOME}/apidoc" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $docpath" >&5 $as_echo "$docpath" >&6; } ###------------------------------------------------------------------------- # # check for doc type # { $as_echo "$as_me:${as_lineno-$LINENO}: checking if full docu should be created" >&5 $as_echo_n "checking if full docu should be created... " >&6; } # Check whether --enable-full-doc was given. if test "${enable_full_doc+set}" = set; then : enableval=$enable_full_doc; case "${enableval}" in yes) enable_fulldoc="yes";; no) enable_fulldoc="no";; *) as_fn_error $? "bad value ${enableval} for --enable-full-doc" "$LINENO" 5;; esac else enable_fulldoc="no" fi if test "$enable_fulldoc" = "yes"; then DOXYGEN_INPUT="listdoc.h src" DOXYGEN_DEFINE="" DOXYGEN_FILE_PATTERNS="*.h *.hpp *.c *.cpp" else DOXYGEN_DEFINE="DOXYGEN_HIDE" DOXYGEN_INPUT="listdoc.h aqbanking5" DOXYGEN_FILE_PATTERNS="*.h *.hpp" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fulldoc" >&5 $as_echo "$enable_fulldoc" >&6; } ###------------------------------------------------------------------------- # # search for tag files # { $as_echo "$as_me:${as_lineno-$LINENO}: checking doxygen tag files" >&5 $as_echo_n "checking doxygen tag files... " >&6; } DOXYGEN_TAGFILES="" if test -d "${docpath}"; then DOXYGEN_TAGFILES="`cd ${docpath} && ls *.tag`" if test -n "${DOXYGEN_TAGFILES}"; then DOXYGEN_TAGFILES="`echo ${DOXYGEN_TAGFILES} | ${SED} -e s/${PACKAGE}.tag//`" fi realfiles="" for ff in ${DOXYGEN_TAGFILES}; do realfiles="${realfiles} ${docpath}/${ff}" done DOXYGEN_TAGFILES="${realfiles}" fi if test -z "${DOXYGEN_TAGFILES}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi ###------------------------------------------------------------------------- # # check for dependencies of backends # (nothing to check for right now) dependencies_ok="yes" ###------------------------------------------------------------------------- # # Configure stuff for backend AqHBCI # # Common settings; can be overridden per-OS below. aqhbci_internal_libs="${abs_top_builddir}/src/plugins/backends/aqhbci/plugin/libaqhbci.la" aqhbci_ldflags="-L\${libdir}" aqhbci_includes="${aqbanking_includes}" aqhbci_libs="-laqhbci" with_aqhbci="no" case "$aqbanking_backends" in *aqhbci*) with_aqhbci="yes" case "$OS_TYPE" in posix) ;; windows) cat >>confdefs.h <<_ACEOF #define BUILDING_AQHBCI_DLL 1 _ACEOF ;; esac ;; esac GIVEN_CFLAGS=$aqhbci_includes INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done aqhbci_includes=$GIVEN_CFLAGS ###------------------------------------------------------------------------- # # check AqHBCI data dir # { $as_echo "$as_me:${as_lineno-$LINENO}: checking aqhbci data dir" >&5 $as_echo_n "checking aqhbci data dir... " >&6; } # Check whether --with-aqhbci-datadir was given. if test "${with_aqhbci_datadir+set}" = set; then : withval=$with_aqhbci_datadir; aqhbci_datadir="$withval" else aqhbci_datadir="$aqhbci_data" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqhbci_datadir" >&5 $as_echo "$aqhbci_datadir" >&6; } ###------------------------------------------------------------------------- # # Configure stuff for backend AqOfxConnect # # Common settings aqofxconnect_internal_libs="${abs_top_builddir}/src/plugins/backends/aqofxconnect/plugin/libaqofxconnect.la" aqofxconnect_includes="${aqbanking_includes}" aqofxconnect_libs="-L\${libdir} -laqofxconnect" case "$aqbanking_backends" in *aqofxconnect*) case "$OS_TYPE" in posix) ;; windows) cat >>confdefs.h <<_ACEOF #define BUILDING_AQOFXCONNECT_DLL 1 _ACEOF ;; esac ;; esac GIVEN_CFLAGS=$aqofxconnect_includes INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done aqofxconnect_includes=$GIVEN_CFLAGS #AC_DEFINE_UNQUOTED(AQOFXCONNECT_DATA, "${aqofxconnect_data}", [data dir]) ###------------------------------------------------------------------------- # # Configure stuff for backend AqEBICS # # Common settings; can be overridden per-OS below. aqebics_internal_libs="${abs_top_builddir}/src/plugins/backends/aqebics/plugin/libaqebics.la" aqebics_ldflags="-L\${libdir}" aqebics_includes="${aqbanking_includes}" aqebics_libs="-laqebics" with_aqebics="no" case "$aqbanking_backends" in *aqebics*) with_aqebics="yes" case "$OS_TYPE" in posix) ;; windows) cat >>confdefs.h <<_ACEOF #define BUILDING_AQEBICS_DLL 1 _ACEOF ;; esac ;; esac GIVEN_CFLAGS=$aqebics_includes INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done aqebics_includes=$GIVEN_CFLAGS ###------------------------------------------------------------------------- # # check AqEBICS data dir # { $as_echo "$as_me:${as_lineno-$LINENO}: checking aqebics data dir" >&5 $as_echo_n "checking aqebics data dir... " >&6; } # Check whether --with-aqebics-datadir was given. if test "${with_aqebics_datadir+set}" = set; then : withval=$with_aqebics_datadir; aqebics_datadir="$withval" else aqebics_datadir="$aqebics_data" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aqebics_datadir" >&5 $as_echo "$aqebics_datadir" >&6; } ###------------------------------------------------------------------------- # # Check for xmlsec # if test "$with_aqebics" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build requirements needed by EBICS backend" >&5 $as_echo_n "checking for build requirements needed by EBICS backend... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XMLSEC" >&5 $as_echo_n "checking for XMLSEC... " >&6; } if test -n "$XMLSEC_CFLAGS"; then pkg_cv_XMLSEC_CFLAGS="$XMLSEC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xmlsec1-gnutls >= 1.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "xmlsec1-gnutls >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XMLSEC_CFLAGS=`$PKG_CONFIG --cflags "xmlsec1-gnutls >= 1.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$XMLSEC_LIBS"; then pkg_cv_XMLSEC_LIBS="$XMLSEC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xmlsec1-gnutls >= 1.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "xmlsec1-gnutls >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XMLSEC_LIBS=`$PKG_CONFIG --libs "xmlsec1-gnutls >= 1.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XMLSEC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "xmlsec1-gnutls >= 1.0.0" 2>&1` else XMLSEC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "xmlsec1-gnutls >= 1.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$XMLSEC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (xmlsec1-gnutls >= 1.0.0) were not met: $XMLSEC_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables XMLSEC_CFLAGS and XMLSEC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables XMLSEC_CFLAGS and XMLSEC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else XMLSEC_CFLAGS=$pkg_cv_XMLSEC_CFLAGS XMLSEC_LIBS=$pkg_cv_XMLSEC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXML" >&5 $as_echo_n "checking for LIBXML... " >&6; } if test -n "$LIBXML_CFLAGS"; then pkg_cv_LIBXML_CFLAGS="$LIBXML_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBXML_LIBS"; then pkg_cv_LIBXML_LIBS="$LIBXML_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML_LIBS=`$PKG_CONFIG --libs "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBXML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0" 2>&1` else LIBXML_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBXML_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxml-2.0) were not met: $LIBXML_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBXML_CFLAGS and LIBXML_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBXML_CFLAGS and LIBXML_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBXML_CFLAGS=$pkg_cv_LIBXML_CFLAGS LIBXML_LIBS=$pkg_cv_LIBXML_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXSLT" >&5 $as_echo_n "checking for LIBXSLT... " >&6; } if test -n "$LIBXSLT_CFLAGS"; then pkg_cv_LIBXSLT_CFLAGS="$LIBXSLT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxslt\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxslt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXSLT_CFLAGS=`$PKG_CONFIG --cflags "libxslt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBXSLT_LIBS"; then pkg_cv_LIBXSLT_LIBS="$LIBXSLT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxslt\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxslt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXSLT_LIBS=`$PKG_CONFIG --libs "libxslt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBXSLT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxslt" 2>&1` else LIBXSLT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxslt" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBXSLT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxslt) were not met: $LIBXSLT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBXSLT_CFLAGS and LIBXSLT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBXSLT_CFLAGS and LIBXSLT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBXSLT_CFLAGS=$pkg_cv_LIBXSLT_CFLAGS LIBXSLT_LIBS=$pkg_cv_LIBXSLT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi AQEBICS_CFLAGS="$XMLSEC_CFLAGS $LIBXML_CFLAGS $LIBXSLT_CFLAGS" AQEBICS_LIBS="$XMLSEC_LIBS $LIBXML_LIBS $LIBXSLT_LIBS" fi ###------------------------------------------------------------------------- # # check for plugin init # { $as_echo "$as_me:${as_lineno-$LINENO}: checking if plugin init is wanted" >&5 $as_echo_n "checking if plugin init is wanted... " >&6; } # Check whether --enable-init-plugins was given. if test "${enable_init_plugins+set}" = set; then : enableval=$enable_init_plugins; enable_init_plugins="$enableval" else enable_init_plugins="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_init_plugins" >&5 $as_echo "$enable_init_plugins" >&6; } if test "$enable_init_plugins" != "no"; then $as_echo "#define AQBANKING_ENABLE_INIT_PLUGINS 1" >>confdefs.h fi ###------------------------------------------------------------------------- # # check whether aqbanking is a subproject to another one # { $as_echo "$as_me:${as_lineno-$LINENO}: checking if AqBanking is a subproject" >&5 $as_echo_n "checking if AqBanking is a subproject... " >&6; } # Check whether --enable-aqb-subproject was given. if test "${enable_aqb_subproject+set}" = set; then : enableval=$enable_aqb_subproject; enable_aqb_subproject="$enableval" else enable_aqb_subproject="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_aqb_subproject" >&5 $as_echo "$enable_aqb_subproject" >&6; } if test "$enable_aqb_subproject" != "no"; then $as_echo "#define AQBANKING_IS_SUBPROJECT 1" >>confdefs.h fi ###------------------------------------------------------------------------- # # check whether aqbanking-cli is enabled # { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether aqbanking-cli is wanted" >&5 $as_echo_n "checking whether aqbanking-cli is wanted... " >&6; } # Check whether --enable-cli was given. if test "${enable_cli+set}" = set; then : enableval=$enable_cli; enable_cli="$enableval" else enable_cli="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cli" >&5 $as_echo "$enable_cli" >&6; } if test "$enable_cli" = "yes"; then ENABLE_CLI_TRUE= ENABLE_CLI_FALSE='#' else ENABLE_CLI_TRUE='#' ENABLE_CLI_FALSE= fi # Check whether --with-cli-version-string was given. if test "${with_cli_version_string+set}" = set; then : withval=$with_cli_version_string; AQBANKING_CLI_VERSION_STRING="$withval" else AQBANKING_CLI_VERSION_STRING="$AQBANKING_VERSION_STRING" fi ###------------------------------------------------------------------------- # # check whether tutorials are to be built # { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tutorials are to be built" >&5 $as_echo_n "checking whether tutorials are to be built... " >&6; } # Check whether --enable-tutorials was given. if test "${enable_tutorials+set}" = set; then : enableval=$enable_tutorials; case "${enableval}" in yes) TUTORIALS="tutorials";; no) TUTORIALS="";; *) as_fn_error $? "bad value ${enableval} for --enable-tutorials" "$LINENO" 5;; esac else TUTORIALS="tutorials" enableval="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5 $as_echo "$enableval" >&6; } ###------------------------------------------------------------------------- # # Cleanup includes, define all_XXX # GIVEN_CFLAGS=$all_includes INCLUDE_DIRS=`echo | cpp -v 2>&1` INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` for dir in $INCLUDE_DIRS; do GIVEN_CFLAGS=$(echo $GIVEN_CFLAGS | sed -e "s;-I$dir ;;" | sed -e "s;-I$dir$;;") done all_includes=$GIVEN_CFLAGS # Adjust CFLAGS and LDFLAGS on Windows case "$OS_TYPE" in windows) # GnuCash compiles with this; maybe we need this, too? #CFLAGS="${CFLAGS} -mms-bitfields" LDFLAGS="${LDFLAGS} -no-undefined -mwindows" ;; esac ###------------------------------------------------------------------------- # # Output files # ac_config_files="$ac_config_files mksymlinks.sh admin/Makefile doc/Makefile m4/Makefile src/Makefile src/libs/Makefile src/libs/aqbanking/Makefile src/libs/aqbanking/jobs/Makefile src/libs/aqbanking/types/Makefile src/libs/aqbanking/gui/Makefile src/libs/aqbanking/dialogs/Makefile src/libs/aqbanking/typemaker2/Makefile src/libs/aqbanking/typemaker2/c/Makefile src/libs/aqbanking/backendsupport/Makefile src/libs/aqbankingpp/Makefile src/plugins/Makefile src/plugins/bankinfo/Makefile src/plugins/bankinfo/at/Makefile src/plugins/bankinfo/at/at.xml src/plugins/bankinfo/ca/Makefile src/plugins/bankinfo/ca/ca.xml src/plugins/bankinfo/ch/Makefile src/plugins/bankinfo/ch/ch.xml src/plugins/bankinfo/de/Makefile src/plugins/bankinfo/de/de.xml src/plugins/bankinfo/us/Makefile src/plugins/bankinfo/us/us.xml src/plugins/bankinfo/generic/Makefile src/plugins/imexporters/Makefile src/plugins/imexporters/dtaus/Makefile src/plugins/imexporters/dtaus/dtaus.xml src/plugins/imexporters/dtaus/profiles/Makefile src/plugins/imexporters/dtaus/profiles/default.conf src/plugins/imexporters/dtaus/profiles/debitnote.conf src/plugins/imexporters/dtaus/profiles/transfer.conf src/plugins/imexporters/eri2/Makefile src/plugins/imexporters/eri2/eri2.xml src/plugins/imexporters/eri2/profiles/Makefile src/plugins/imexporters/eri2/profiles/default.conf src/plugins/imexporters/ofx/Makefile src/plugins/imexporters/ofx/ofx.xml src/plugins/imexporters/ofx/parser/Makefile src/plugins/imexporters/ofx/profiles/Makefile src/plugins/imexporters/ofx/profiles/default.conf src/plugins/imexporters/ofx/profiles/iso8859.conf src/plugins/imexporters/swift/Makefile src/plugins/imexporters/swift/swift.xml src/plugins/imexporters/swift/profiles/Makefile src/plugins/imexporters/swift/profiles/swiftmt940.conf src/plugins/imexporters/swift/profiles/swiftmt942.conf src/plugins/imexporters/swift/profiles/amro940.conf src/plugins/imexporters/swift/profiles/amro942.conf src/plugins/imexporters/csv/Makefile src/plugins/imexporters/csv/csv.xml src/plugins/imexporters/csv/profiles/Makefile src/plugins/imexporters/csv/profiles/default.conf src/plugins/imexporters/csv/profiles/amex.conf src/plugins/imexporters/csv/profiles/aqmoney1.conf src/plugins/imexporters/csv/profiles/aqmoney2.conf src/plugins/imexporters/csv/profiles/comdirect.conf src/plugins/imexporters/csv/profiles/consors-tagesgeld.conf src/plugins/imexporters/csv/profiles/mijnpostbank.conf src/plugins/imexporters/csv/profiles/oko.conf src/plugins/imexporters/csv/profiles/spk-aachen.conf src/plugins/imexporters/csv/profiles/spk-steiermark.conf src/plugins/imexporters/csv/profiles/tonline-banking.conf src/plugins/imexporters/csv/profiles/test.conf src/plugins/imexporters/csv/profiles/vrnetworld.conf src/plugins/imexporters/csv/profiles/lbbberlin.conf src/plugins/imexporters/csv/profiles/bankaustria.conf src/plugins/imexporters/csv/profiles/psk.conf src/plugins/imexporters/csv/profiles/diba.conf src/plugins/imexporters/csv/profiles/dkb.conf src/plugins/imexporters/csv/profiles/dkb-cash.conf src/plugins/imexporters/csv/profiles/sparda.conf src/plugins/imexporters/csv/profiles/full.conf src/plugins/imexporters/csv/profiles/hypovereinsbank.conf src/plugins/imexporters/csv/profiles/postbankffm.conf src/plugins/imexporters/csv/profiles/cli-transfers.conf src/plugins/imexporters/csv/profiles/sns.conf src/plugins/imexporters/csv/profiles/transfers.conf src/plugins/imexporters/csv/profiles/sepadebitnotes.conf src/plugins/imexporters/openhbci1/Makefile src/plugins/imexporters/openhbci1/openhbci1.xml src/plugins/imexporters/openhbci1/profiles/Makefile src/plugins/imexporters/openhbci1/profiles/default.conf src/plugins/imexporters/qif/Makefile src/plugins/imexporters/qif/qif.xml src/plugins/imexporters/qif/profiles/Makefile src/plugins/imexporters/qif/profiles/default.conf src/plugins/imexporters/yellownet/Makefile src/plugins/imexporters/yellownet/yellownet.xml src/plugins/imexporters/yellownet/profiles/Makefile src/plugins/imexporters/yellownet/profiles/default.conf src/plugins/imexporters/xmldb/Makefile src/plugins/imexporters/xmldb/xmldb.xml src/plugins/imexporters/xmldb/profiles/Makefile src/plugins/imexporters/xmldb/profiles/default.conf src/plugins/imexporters/sepa/Makefile src/plugins/imexporters/sepa/sepa.xml src/plugins/imexporters/sepa/profiles/Makefile src/plugins/imexporters/sepa/profiles/default.conf src/plugins/imexporters/sepa/profiles/001_001_02.conf src/plugins/imexporters/sepa/profiles/001_002_03.conf src/plugins/imexporters/sepa/profiles/001_003_03.conf src/plugins/imexporters/sepa/profiles/008_001_01.conf src/plugins/imexporters/sepa/profiles/008_002_02.conf src/plugins/imexporters/sepa/profiles/008_003_02.conf src/plugins/imexporters/ctxfile/Makefile src/plugins/imexporters/ctxfile/ctxfile.xml src/plugins/imexporters/ctxfile/profiles/Makefile src/plugins/imexporters/ctxfile/profiles/default.conf src/plugins/imexporters/q43/Makefile src/plugins/imexporters/q43/q43.xml src/plugins/imexporters/q43/profiles/Makefile src/plugins/imexporters/q43/profiles/default.conf src/plugins/parsers/Makefile src/plugins/parsers/dtaus/Makefile src/plugins/parsers/dtaus/dtaus.xml src/plugins/parsers/swift/Makefile src/plugins/parsers/swift/swift.xml src/plugins/backends/Makefile src/plugins/backends/aqhbci/Makefile src/plugins/backends/aqhbci/plugin/Makefile src/plugins/backends/aqhbci/plugin/aqhbci.xml src/plugins/backends/aqhbci/plugin/dialogs/Makefile src/plugins/backends/aqhbci/plugin/header.xml src/plugins/backends/aqhbci/plugin/banking/Makefile src/plugins/backends/aqhbci/plugin/msglayer/Makefile src/plugins/backends/aqhbci/plugin/joblayer/Makefile src/plugins/backends/aqhbci/plugin/applayer/Makefile src/plugins/backends/aqhbci/plugin/ajobs/Makefile src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile src/plugins/backends/aqhbci/plugin/version.h src/plugins/backends/aqhbci/tools/Makefile src/plugins/backends/aqhbci/tools/hbcixml/Makefile src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile src/plugins/backends/aqofxconnect/Makefile src/plugins/backends/aqofxconnect/version.h src/plugins/backends/aqofxconnect/plugin/Makefile src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile src/plugins/backends/aqnone/Makefile src/plugins/backends/aqnone/aqnone.xml src/plugins/backends/aqebics/Makefile src/plugins/backends/aqebics/plugin/Makefile src/plugins/backends/aqebics/plugin/aqebics.xml src/plugins/backends/aqebics/plugin/client/Makefile src/plugins/backends/aqebics/plugin/dialogs/Makefile src/plugins/backends/aqebics/plugin/msg/Makefile src/plugins/backends/aqebics/tools/Makefile src/plugins/backends/aqebics/tools/aqebics-tool/Makefile src/test/Makefile src/tools/Makefile src/tools/aqbanking-cli/Makefile tutorials/Makefile po/Makefile Doxyfile Makefile aqbanking-config.in aqbanking.pc aqbanking.spec aqbanking.iss version.h system.h aqbanking-config.cmake aqbanking-config-version.cmake" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_KTOBLZCHECK_TRUE}" && test -z "${WITH_KTOBLZCHECK_FALSE}"; then as_fn_error $? "conditional \"WITH_KTOBLZCHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_GWENGUI_GTK2_TRUE}" && test -z "${WITH_GWENGUI_GTK2_FALSE}"; then as_fn_error $? "conditional \"WITH_GWENGUI_GTK2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IS_WINDOWS_TRUE}" && test -z "${IS_WINDOWS_FALSE}"; then as_fn_error $? "conditional \"IS_WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IF_MAKE_I18N_FILES_TRUE}" && test -z "${IF_MAKE_I18N_FILES_FALSE}"; then as_fn_error $? "conditional \"IF_MAKE_I18N_FILES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CLI_TRUE}" && test -z "${ENABLE_CLI_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CLI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' LD_RC='`$ECHO "$LD_RC" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_RC='`$ECHO "$reload_flag_RC" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_RC='`$ECHO "$reload_cmds_RC" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_RC='`$ECHO "$old_archive_cmds_RC" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' compiler_RC='`$ECHO "$compiler_RC" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' GCC_RC='`$ECHO "$GCC_RC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_RC='`$ECHO "$lt_prog_compiler_no_builtin_flag_RC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_RC='`$ECHO "$lt_prog_compiler_pic_RC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_RC='`$ECHO "$lt_prog_compiler_wl_RC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_RC='`$ECHO "$lt_prog_compiler_static_RC" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_RC='`$ECHO "$lt_cv_prog_compiler_c_o_RC" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_RC='`$ECHO "$archive_cmds_need_lc_RC" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_RC='`$ECHO "$enable_shared_with_static_runtimes_RC" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_RC='`$ECHO "$export_dynamic_flag_spec_RC" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_RC='`$ECHO "$whole_archive_flag_spec_RC" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_RC='`$ECHO "$compiler_needs_object_RC" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_RC='`$ECHO "$old_archive_from_new_cmds_RC" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_RC='`$ECHO "$old_archive_from_expsyms_cmds_RC" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_RC='`$ECHO "$archive_cmds_RC" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_RC='`$ECHO "$archive_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_RC='`$ECHO "$module_cmds_RC" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_RC='`$ECHO "$module_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_RC='`$ECHO "$with_gnu_ld_RC" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_RC='`$ECHO "$allow_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_RC='`$ECHO "$no_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_RC='`$ECHO "$hardcode_libdir_flag_spec_RC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_RC='`$ECHO "$hardcode_libdir_separator_RC" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_RC='`$ECHO "$hardcode_direct_RC" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_RC='`$ECHO "$hardcode_direct_absolute_RC" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_RC='`$ECHO "$hardcode_minus_L_RC" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_RC='`$ECHO "$hardcode_shlibpath_var_RC" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_RC='`$ECHO "$hardcode_automatic_RC" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_RC='`$ECHO "$inherit_rpath_RC" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_RC='`$ECHO "$link_all_deplibs_RC" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_RC='`$ECHO "$always_export_symbols_RC" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_RC='`$ECHO "$export_symbols_cmds_RC" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_RC='`$ECHO "$exclude_expsyms_RC" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_RC='`$ECHO "$include_expsyms_RC" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_RC='`$ECHO "$prelink_cmds_RC" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_RC='`$ECHO "$postlink_cmds_RC" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_RC='`$ECHO "$file_list_spec_RC" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_RC='`$ECHO "$hardcode_action_RC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_RC='`$ECHO "$compiler_lib_search_dirs_RC" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_RC='`$ECHO "$predep_objects_RC" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_RC='`$ECHO "$postdep_objects_RC" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' predeps_RC='`$ECHO "$predeps_RC" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_RC='`$ECHO "$postdeps_RC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_RC='`$ECHO "$compiler_lib_search_path_RC" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ AS \ LD_CXX \ LD_RC \ reload_flag_CXX \ reload_flag_RC \ compiler_CXX \ compiler_RC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_RC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_RC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_RC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_RC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_RC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_RC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_RC \ compiler_needs_object_CXX \ compiler_needs_object_RC \ with_gnu_ld_CXX \ with_gnu_ld_RC \ allow_undefined_flag_CXX \ allow_undefined_flag_RC \ no_undefined_flag_CXX \ no_undefined_flag_RC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_RC \ exclude_expsyms_CXX \ exclude_expsyms_RC \ include_expsyms_CXX \ include_expsyms_RC \ file_list_spec_CXX \ file_list_spec_RC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_RC \ predep_objects_CXX \ predep_objects_RC \ postdep_objects_CXX \ postdep_objects_RC \ predeps_CXX \ predeps_RC \ postdeps_CXX \ postdeps_RC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_RC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ reload_cmds_RC \ old_archive_cmds_CXX \ old_archive_cmds_RC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_RC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_RC \ archive_cmds_CXX \ archive_cmds_RC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_RC \ module_cmds_CXX \ module_cmds_RC \ module_expsym_cmds_CXX \ module_expsym_cmds_RC \ export_symbols_cmds_CXX \ export_symbols_cmds_RC \ prelink_cmds_CXX \ prelink_cmds_RC \ postlink_cmds_CXX \ postlink_cmds_RC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "mksymlinks.sh") CONFIG_FILES="$CONFIG_FILES mksymlinks.sh" ;; "admin/Makefile") CONFIG_FILES="$CONFIG_FILES admin/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/libs/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/Makefile" ;; "src/libs/aqbanking/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/Makefile" ;; "src/libs/aqbanking/jobs/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/jobs/Makefile" ;; "src/libs/aqbanking/types/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/types/Makefile" ;; "src/libs/aqbanking/gui/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/gui/Makefile" ;; "src/libs/aqbanking/dialogs/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/dialogs/Makefile" ;; "src/libs/aqbanking/typemaker2/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/typemaker2/Makefile" ;; "src/libs/aqbanking/typemaker2/c/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/typemaker2/c/Makefile" ;; "src/libs/aqbanking/backendsupport/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbanking/backendsupport/Makefile" ;; "src/libs/aqbankingpp/Makefile") CONFIG_FILES="$CONFIG_FILES src/libs/aqbankingpp/Makefile" ;; "src/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/Makefile" ;; "src/plugins/bankinfo/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/Makefile" ;; "src/plugins/bankinfo/at/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/at/Makefile" ;; "src/plugins/bankinfo/at/at.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/at/at.xml" ;; "src/plugins/bankinfo/ca/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/ca/Makefile" ;; "src/plugins/bankinfo/ca/ca.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/ca/ca.xml" ;; "src/plugins/bankinfo/ch/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/ch/Makefile" ;; "src/plugins/bankinfo/ch/ch.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/ch/ch.xml" ;; "src/plugins/bankinfo/de/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/de/Makefile" ;; "src/plugins/bankinfo/de/de.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/de/de.xml" ;; "src/plugins/bankinfo/us/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/us/Makefile" ;; "src/plugins/bankinfo/us/us.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/us/us.xml" ;; "src/plugins/bankinfo/generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/bankinfo/generic/Makefile" ;; "src/plugins/imexporters/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/Makefile" ;; "src/plugins/imexporters/dtaus/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/Makefile" ;; "src/plugins/imexporters/dtaus/dtaus.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/dtaus.xml" ;; "src/plugins/imexporters/dtaus/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/profiles/Makefile" ;; "src/plugins/imexporters/dtaus/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/profiles/default.conf" ;; "src/plugins/imexporters/dtaus/profiles/debitnote.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/profiles/debitnote.conf" ;; "src/plugins/imexporters/dtaus/profiles/transfer.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/dtaus/profiles/transfer.conf" ;; "src/plugins/imexporters/eri2/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/eri2/Makefile" ;; "src/plugins/imexporters/eri2/eri2.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/eri2/eri2.xml" ;; "src/plugins/imexporters/eri2/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/eri2/profiles/Makefile" ;; "src/plugins/imexporters/eri2/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/eri2/profiles/default.conf" ;; "src/plugins/imexporters/ofx/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/Makefile" ;; "src/plugins/imexporters/ofx/ofx.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/ofx.xml" ;; "src/plugins/imexporters/ofx/parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/parser/Makefile" ;; "src/plugins/imexporters/ofx/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/profiles/Makefile" ;; "src/plugins/imexporters/ofx/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/profiles/default.conf" ;; "src/plugins/imexporters/ofx/profiles/iso8859.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ofx/profiles/iso8859.conf" ;; "src/plugins/imexporters/swift/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/Makefile" ;; "src/plugins/imexporters/swift/swift.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/swift.xml" ;; "src/plugins/imexporters/swift/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/profiles/Makefile" ;; "src/plugins/imexporters/swift/profiles/swiftmt940.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/profiles/swiftmt940.conf" ;; "src/plugins/imexporters/swift/profiles/swiftmt942.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/profiles/swiftmt942.conf" ;; "src/plugins/imexporters/swift/profiles/amro940.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/profiles/amro940.conf" ;; "src/plugins/imexporters/swift/profiles/amro942.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/swift/profiles/amro942.conf" ;; "src/plugins/imexporters/csv/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/Makefile" ;; "src/plugins/imexporters/csv/csv.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/csv.xml" ;; "src/plugins/imexporters/csv/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/Makefile" ;; "src/plugins/imexporters/csv/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/default.conf" ;; "src/plugins/imexporters/csv/profiles/amex.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/amex.conf" ;; "src/plugins/imexporters/csv/profiles/aqmoney1.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/aqmoney1.conf" ;; "src/plugins/imexporters/csv/profiles/aqmoney2.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/aqmoney2.conf" ;; "src/plugins/imexporters/csv/profiles/comdirect.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/comdirect.conf" ;; "src/plugins/imexporters/csv/profiles/consors-tagesgeld.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/consors-tagesgeld.conf" ;; "src/plugins/imexporters/csv/profiles/mijnpostbank.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/mijnpostbank.conf" ;; "src/plugins/imexporters/csv/profiles/oko.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/oko.conf" ;; "src/plugins/imexporters/csv/profiles/spk-aachen.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/spk-aachen.conf" ;; "src/plugins/imexporters/csv/profiles/spk-steiermark.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/spk-steiermark.conf" ;; "src/plugins/imexporters/csv/profiles/tonline-banking.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/tonline-banking.conf" ;; "src/plugins/imexporters/csv/profiles/test.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/test.conf" ;; "src/plugins/imexporters/csv/profiles/vrnetworld.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/vrnetworld.conf" ;; "src/plugins/imexporters/csv/profiles/lbbberlin.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/lbbberlin.conf" ;; "src/plugins/imexporters/csv/profiles/bankaustria.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/bankaustria.conf" ;; "src/plugins/imexporters/csv/profiles/psk.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/psk.conf" ;; "src/plugins/imexporters/csv/profiles/diba.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/diba.conf" ;; "src/plugins/imexporters/csv/profiles/dkb.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/dkb.conf" ;; "src/plugins/imexporters/csv/profiles/dkb-cash.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/dkb-cash.conf" ;; "src/plugins/imexporters/csv/profiles/sparda.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/sparda.conf" ;; "src/plugins/imexporters/csv/profiles/full.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/full.conf" ;; "src/plugins/imexporters/csv/profiles/hypovereinsbank.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/hypovereinsbank.conf" ;; "src/plugins/imexporters/csv/profiles/postbankffm.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/postbankffm.conf" ;; "src/plugins/imexporters/csv/profiles/cli-transfers.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/cli-transfers.conf" ;; "src/plugins/imexporters/csv/profiles/sns.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/sns.conf" ;; "src/plugins/imexporters/csv/profiles/transfers.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/transfers.conf" ;; "src/plugins/imexporters/csv/profiles/sepadebitnotes.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/csv/profiles/sepadebitnotes.conf" ;; "src/plugins/imexporters/openhbci1/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/openhbci1/Makefile" ;; "src/plugins/imexporters/openhbci1/openhbci1.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/openhbci1/openhbci1.xml" ;; "src/plugins/imexporters/openhbci1/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/openhbci1/profiles/Makefile" ;; "src/plugins/imexporters/openhbci1/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/openhbci1/profiles/default.conf" ;; "src/plugins/imexporters/qif/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/qif/Makefile" ;; "src/plugins/imexporters/qif/qif.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/qif/qif.xml" ;; "src/plugins/imexporters/qif/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/qif/profiles/Makefile" ;; "src/plugins/imexporters/qif/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/qif/profiles/default.conf" ;; "src/plugins/imexporters/yellownet/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/yellownet/Makefile" ;; "src/plugins/imexporters/yellownet/yellownet.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/yellownet/yellownet.xml" ;; "src/plugins/imexporters/yellownet/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/yellownet/profiles/Makefile" ;; "src/plugins/imexporters/yellownet/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/yellownet/profiles/default.conf" ;; "src/plugins/imexporters/xmldb/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/xmldb/Makefile" ;; "src/plugins/imexporters/xmldb/xmldb.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/xmldb/xmldb.xml" ;; "src/plugins/imexporters/xmldb/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/xmldb/profiles/Makefile" ;; "src/plugins/imexporters/xmldb/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/xmldb/profiles/default.conf" ;; "src/plugins/imexporters/sepa/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/Makefile" ;; "src/plugins/imexporters/sepa/sepa.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/sepa.xml" ;; "src/plugins/imexporters/sepa/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/Makefile" ;; "src/plugins/imexporters/sepa/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/default.conf" ;; "src/plugins/imexporters/sepa/profiles/001_001_02.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/001_001_02.conf" ;; "src/plugins/imexporters/sepa/profiles/001_002_03.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/001_002_03.conf" ;; "src/plugins/imexporters/sepa/profiles/001_003_03.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/001_003_03.conf" ;; "src/plugins/imexporters/sepa/profiles/008_001_01.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/008_001_01.conf" ;; "src/plugins/imexporters/sepa/profiles/008_002_02.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/008_002_02.conf" ;; "src/plugins/imexporters/sepa/profiles/008_003_02.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/sepa/profiles/008_003_02.conf" ;; "src/plugins/imexporters/ctxfile/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ctxfile/Makefile" ;; "src/plugins/imexporters/ctxfile/ctxfile.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ctxfile/ctxfile.xml" ;; "src/plugins/imexporters/ctxfile/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ctxfile/profiles/Makefile" ;; "src/plugins/imexporters/ctxfile/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/ctxfile/profiles/default.conf" ;; "src/plugins/imexporters/q43/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/q43/Makefile" ;; "src/plugins/imexporters/q43/q43.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/q43/q43.xml" ;; "src/plugins/imexporters/q43/profiles/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/q43/profiles/Makefile" ;; "src/plugins/imexporters/q43/profiles/default.conf") CONFIG_FILES="$CONFIG_FILES src/plugins/imexporters/q43/profiles/default.conf" ;; "src/plugins/parsers/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/parsers/Makefile" ;; "src/plugins/parsers/dtaus/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/parsers/dtaus/Makefile" ;; "src/plugins/parsers/dtaus/dtaus.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/parsers/dtaus/dtaus.xml" ;; "src/plugins/parsers/swift/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/parsers/swift/Makefile" ;; "src/plugins/parsers/swift/swift.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/parsers/swift/swift.xml" ;; "src/plugins/backends/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/Makefile" ;; "src/plugins/backends/aqhbci/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/Makefile" ;; "src/plugins/backends/aqhbci/plugin/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/Makefile" ;; "src/plugins/backends/aqhbci/plugin/aqhbci.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/aqhbci.xml" ;; "src/plugins/backends/aqhbci/plugin/dialogs/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/dialogs/Makefile" ;; "src/plugins/backends/aqhbci/plugin/header.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/header.xml" ;; "src/plugins/backends/aqhbci/plugin/banking/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/banking/Makefile" ;; "src/plugins/backends/aqhbci/plugin/msglayer/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/msglayer/Makefile" ;; "src/plugins/backends/aqhbci/plugin/joblayer/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/joblayer/Makefile" ;; "src/plugins/backends/aqhbci/plugin/applayer/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/applayer/Makefile" ;; "src/plugins/backends/aqhbci/plugin/ajobs/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/ajobs/Makefile" ;; "src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile" ;; "src/plugins/backends/aqhbci/plugin/version.h") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/plugin/version.h" ;; "src/plugins/backends/aqhbci/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/tools/Makefile" ;; "src/plugins/backends/aqhbci/tools/hbcixml/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/tools/hbcixml/Makefile" ;; "src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile" ;; "src/plugins/backends/aqofxconnect/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqofxconnect/Makefile" ;; "src/plugins/backends/aqofxconnect/version.h") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqofxconnect/version.h" ;; "src/plugins/backends/aqofxconnect/plugin/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqofxconnect/plugin/Makefile" ;; "src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml" ;; "src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile" ;; "src/plugins/backends/aqnone/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqnone/Makefile" ;; "src/plugins/backends/aqnone/aqnone.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqnone/aqnone.xml" ;; "src/plugins/backends/aqebics/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/Makefile" ;; "src/plugins/backends/aqebics/plugin/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/plugin/Makefile" ;; "src/plugins/backends/aqebics/plugin/aqebics.xml") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/plugin/aqebics.xml" ;; "src/plugins/backends/aqebics/plugin/client/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/plugin/client/Makefile" ;; "src/plugins/backends/aqebics/plugin/dialogs/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/plugin/dialogs/Makefile" ;; "src/plugins/backends/aqebics/plugin/msg/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/plugin/msg/Makefile" ;; "src/plugins/backends/aqebics/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/tools/Makefile" ;; "src/plugins/backends/aqebics/tools/aqebics-tool/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/backends/aqebics/tools/aqebics-tool/Makefile" ;; "src/test/Makefile") CONFIG_FILES="$CONFIG_FILES src/test/Makefile" ;; "src/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/Makefile" ;; "src/tools/aqbanking-cli/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/aqbanking-cli/Makefile" ;; "tutorials/Makefile") CONFIG_FILES="$CONFIG_FILES tutorials/Makefile" ;; "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; "Doxyfile") CONFIG_FILES="$CONFIG_FILES Doxyfile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "aqbanking-config.in") CONFIG_FILES="$CONFIG_FILES aqbanking-config.in" ;; "aqbanking.pc") CONFIG_FILES="$CONFIG_FILES aqbanking.pc" ;; "aqbanking.spec") CONFIG_FILES="$CONFIG_FILES aqbanking.spec" ;; "aqbanking.iss") CONFIG_FILES="$CONFIG_FILES aqbanking.iss" ;; "version.h") CONFIG_FILES="$CONFIG_FILES version.h" ;; "system.h") CONFIG_FILES="$CONFIG_FILES system.h" ;; "aqbanking-config.cmake") CONFIG_FILES="$CONFIG_FILES aqbanking-config.cmake" ;; "aqbanking-config-version.cmake") CONFIG_FILES="$CONFIG_FILES aqbanking-config-version.cmake" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX RC " # ### BEGIN LIBTOOL CONFIG # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Assembler program. AS=$lt_AS # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: RC # The linker used to build libraries. LD=$lt_LD_RC # How to create reloadable object files. reload_flag=$lt_reload_flag_RC reload_cmds=$lt_reload_cmds_RC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_RC # A language specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU compiler? with_gcc=$GCC_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_RC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_RC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_RC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_RC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_RC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_RC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_RC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_RC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_RC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_RC postdep_objects=$lt_postdep_objects_RC predeps=$lt_predeps_RC postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # ### END LIBTOOL TAG CONFIG: RC _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ###------------------------------------------------------------------------- # # Summary # echo echo echo "Summary" echo "----------------------------------------------------" echo "AqBanking version : $AQBANKING_VERSION_FULL_STRING" echo "Local Installation Mode : $enable_local_install" echo "Prefix : $prefix" echo "Exec-Prefix : $exec_prefix" echo "Libdir : $libdir" echo "Cfg Search Folder : $aqbanking_cfg_searchdir" echo "Data Search Folder : $aqbanking_data_searchdir" echo "Locale Search Folder : $aqbanking_locale_searchdir" echo "Plugin Search Folder : $aqbanking_plugin_searchdir" echo "Symbol Visibility : $visibility_supported" echo "Use KtoBlzCheck : $have_ktoblzcheck" echo "Build AqBanking-CLI : $enable_cli" echo "CLI Version String : $AQBANKING_CLI_VERSION_STRING" echo echo echo "Plugins" echo "----------------------------------------------------" echo " Backends : $aqbanking_backends" echo " Im-/Exporters : $aqbanking_imexporters" echo " Parsers : $aqbanking_parsers" echo " Bank Infos : $aqbanking_bankinfos" echo echo "Additional Information" echo "----------------------------------------------------" if test "$have_ktoblzcheck" != "yes"; then echo " - you really should consider installing ktoblzcheck " echo " in order to enable account number validation!" fi echo echo "----------------------------------------------------" echo "You can now run \"make\" (or gmake on FreeBSD) to compile." aqbanking-5.6.4beta/admin/0000755000175000017500000000000012643540650012413 500000000000000aqbanking-5.6.4beta/admin/fixuifiles0000755000175000017500000002264712364015477014447 00000000000000#!/usr/bin/perl -w # fixuifiles processes .ui files and removes some insanity: # * Too high minimum Qt version (see $minversion_* in the top of the script) # * Hardcoded untranslatable Alt+Letter accels (auto-added by Qt Designer) # * Captions that are equal to classname (auto-added by Qt Designer) # This script is licensed under the GPL version 2. # (c) 2004 David Faure # Based on fixkdeincludes, (c) 2001-2003 Dirk Mueller use strict; use File::Basename; use Cwd; # Fix the version number in .ui files if it's bigger than this: my $default_minversion_maj = 3; my $default_minversion_min = 3; # Known words which are ok as captions my %knowncaptions = ( 'Settings' => '', 'Statistics' => '', 'General' => '', 'Tracks' => '', 'Constants' => '', 'Preferences' => '', 'Encryption' => '' ); # declaration of useful subroutines sub process_ui_file($); sub find_ui_files($); sub read_required_version($); # some global variables my $verbose = 0; # turns on debugging my $omit_Qt_check = 0; # turns off Qt version checking my @explicitfiles = (); # filled in if passing files on the command line my $minversion_maj = $default_minversion_maj; my $minversion_min = $default_minversion_min; while (defined ($ARGV[0])) { $_ = shift; if (/^--help$|^-h$/) { print "Usage: fixuifiles [OPTIONS] files...\n"; print "Options are:\n"; print "\t-v, --verbose\tBe verbose\n"; print "\t--omitqtcheck\tDoes not check for Qt minimum version\n"; exit 0; } elsif (/^--verbose$|^-v$/) { $verbose = 1; }elsif (/^--omitqtcheck/) { $omit_Qt_check = 1; } elsif (!/^-/) { push @explicitfiles, $_; } } # Find .ui files in the given dir sub find_ui_files($) { my ( $dir ) = @_; opendir (DIR, "$dir") || die "Couldn't read '$dir'\n"; my @files = grep { /^.*\.ui$/ } readdir(DIR); closedir(DIR); #print "found files: [ " . join(' ', @files) . " ] in $dir\n" if ($verbose); # prefix them with $dir my @retfiles = (); foreach my $file(@files) { push @retfiles, "$dir/$file"; } return @retfiles; } # Ensure the version at the top of the file is not too high sub fix_version($) { my $srcfile = shift @_; open(SRC, "< $srcfile") || die "fix_version: couldn't open '$srcfile'\n"; my @contents = ; my @fixedcontents = (); close(SRC); my $needfix = 0; my $foundversion = 0; foreach my $line (@contents) { if (!$foundversion && $line =~ m/version=\"([0-9]+)\.([0-9]+)(\.[0-9]+)?\"/) { my $version_maj = $1; my $version_min = $2; if ( $version_maj > $minversion_maj || ( $version_maj == $minversion_maj && $version_min > $minversion_min ) ) { $line =~ s/version=\"[0-9]+\.[0-9]+\"/version=\"$minversion_maj.$minversion_min\"/o; $needfix = 1; print "$srcfile: version was $version_maj.$version_min, set to $minversion_maj.$minversion_min\n"; } $foundversion = 1; } push @fixedcontents, $line; } if (!$foundversion) { # TODO improve so that the script adds the necessary line print "$srcfile has no UI version, please fix it\n"; } if ($needfix) { open(SRC, "> $srcfile") || die "fix_version: couldn't open '$srcfile' for writing\n"; print SRC @fixedcontents; close(SRC); } } # Ensure no auto-added Alt+letter accel exists - those are untranslatable sub fix_accels($) { my $srcfile = shift @_; open(SRC, "< $srcfile") || die "fix_accels: couldn't open '$srcfile'\n"; my @contents = ; close(SRC); return if ( !grep( /Alt\+[A-Z]<\/string>/, @contents )); my @fixedcontents = (); my $firstline; my $accelsremoved = 0; my $inside_accel = 0; # inside_accel is 0 before # 1 after and before # 2 after if alt+letter, and before foreach my $line (@contents) { if ( $inside_accel == 1 ) { if ( $line =~ m/(Alt\+[A-Z])<\/string>/ ) { print "$srcfile: accel $1 removed\n" if ($verbose); $inside_accel = 2; $accelsremoved++; } else { # Not alt+letter, keep accel push @fixedcontents, $firstline; $inside_accel = 0; } } if ($line =~ m/property name=\"accel\"/) { $inside_accel = 1; $firstline = $line; } if ($inside_accel == 0) { push @fixedcontents, $line; } $inside_accel = 0 if ($inside_accel && $line =~ m/<\/property>/); } if ($accelsremoved) { print "$srcfile: $accelsremoved accels removed\n"; open(SRC, "> $srcfile") || die "fix_accels: couldn't open '$srcfile' for writing\n"; print SRC @fixedcontents; close(SRC); } } # Ensure no auto-added includehints exist sub fix_includehints($) { my $srcfile = shift @_; open(SRC, "< $srcfile") || die "fix_includehints: couldn't open '$srcfile'\n"; my @contents = ; close(SRC); return if ( !grep( /.*<\/includehint>/, @contents )); my @fixedcontents = (); my $includesremoved = 0; my $inside_include = 0; # inside_include is 0 before # 1 after foreach my $line (@contents) { if ( $inside_include == 1 ) { if ( $line =~ m/(.*)<\/includehint>/ ) { print "$srcfile: includehint $1 removed\n" if ($verbose); $includesremoved++; } } if ($line =~ m//) { $inside_include = 1; } if ($inside_include == 0) { push @fixedcontents, $line; } $inside_include = 0 if ($inside_include && $line =~ m/<\/includehints>/); } if ($includesremoved) { print "$srcfile: $includesremoved includehints removed\n"; open(SRC, "> $srcfile") || die "fix_includehints: couldn't open '$srcfile' for writing\n"; print SRC @fixedcontents; close(SRC); } } # Ensure no auto-added caption exists - it's pretty stupid to have to # translate Form1 or MyClassName sub fix_captions($) { my $srcfile = shift @_; open(SRC, "< $srcfile") || die "fix_captions: couldn't open '$srcfile'\n"; my @contents = ; close(SRC); my @fixedcontents = (); my $firstline; my $class = ""; my $captionsremoved = 0; my $inside_caption = 0; # inside_caption is 0 before # 1 after and before # 2 after if caption should be removed, and before foreach my $line (@contents) { $class = $1 if ($line =~ m/(.*)<\/class>/); if ( $inside_caption == 1 ) { $line =~ m/(.*)<\/string>/ || die "Malformed XML (no string under caption)"; my $caption = $1; print "$srcfile: caption='$caption' class='$class'\n" if ($verbose); if ( ( $caption eq $class && !defined $knowncaptions{$caption} ) || ($caption =~ m/Form[0-9]/) ) { if ( $caption =~ m/^[A-Z][a-z]*$/ ) { print "$srcfile: removing caption '$caption' (warning! could be real caption)\n"; } else { print "$srcfile: removing caption '$caption'\n"; } $inside_caption = 2; $captionsremoved++; } else { # Real caption, keep it print "$srcfile: keeping caption '$caption'\n" if ($verbose); push @fixedcontents, $firstline; $inside_caption = 0; } } if ($line =~ m/property name=\"caption\"/) { $inside_caption = 1; $firstline = $line; } if ($inside_caption == 0) { push @fixedcontents, $line; } $inside_caption = 0 if ($inside_caption && $line =~ m/<\/property>/); } if ($captionsremoved) { open(SRC, "> $srcfile") || die "fix_captions: couldn't open '$srcfile' for writing\n"; print SRC @fixedcontents; close(SRC); } } # Find a .qt_minversion in $dir or any parent directory. sub read_required_version($) { my $dir = Cwd::abs_path( shift @_ ); $minversion_maj = $default_minversion_maj; $minversion_min = $default_minversion_min; while ( length($dir) > 1 ) { my $versfile = "$dir/.qt_minversion"; my $version; if ( open (VERSFILE, "< $versfile") ) { while () { $version = $_ if (!/^#/); } close(VERSFILE); } else { $versfile = "$dir/configure.in.in"; if ( open (VERSFILE, "< $versfile") ) { while () { $version = $1 if m/^#MIN_CONFIG\(([0-9]+.[0-9]+)\)/; } close(VERSFILE); } } if (defined $version && $version =~ m/([0-9]+)\.([0-9]+)/) { $minversion_maj = $1; $minversion_min = $2; print "Found min version $1.$2 in $versfile\n" if ($verbose); return; } $dir = dirname($dir); } } # Process one .ui file sub process_ui_file($) { my $file = shift @_; &read_required_version( dirname($file) ); print "Checking: $file\n" if($verbose); &fix_version($file) if(!$omit_Qt_check); &fix_accels($file); &fix_captions($file); &fix_includehints($file); } ############################################################################# # here is the main logic # # process files from the command line, if any if ( $#explicitfiles >= 0 ) { foreach my $file( @explicitfiles ) { &process_ui_file( $file ); } exit 0; } # first generate a list of subdirectories my @dirlist = (); push @dirlist, "."; foreach my $dir ( @dirlist ) { opendir (DIR, "$dir") || warn "Couldn't read '$dir'"; my $subdir = ""; while( $subdir = readdir(DIR)) { next if ($subdir =~ /^\./); next if !( -d "$dir/$subdir"); push @dirlist, "$dir/$subdir"; } closedir(DIR); } # now iterate over all subdirs foreach my $dir(@dirlist) { my @uifile = find_ui_files($dir); foreach my $file(@uifile) { &process_ui_file($file); } } aqbanking-5.6.4beta/admin/glade-fixup0000755000175000017500000000117512364015477014476 00000000000000#!/bin/sh # # Remove entries that are for post-gtk2.4 attributes. Glade on a # gtk2.4 system will complain when unknown attributes are present on a # widget. # # This script should be run from the top-level source directory before # committing changed glade files. # # This script has been taken from Gnucash (2006/01/24) -- aquamaniac # if test -d src ; then SEARCHDIRS=src else SEARCHDIRS=. fi find ${SEARCHDIRS} -name \*.glade | xargs \ sed -i -e '/name="focus_on_map"/d' \ -e '/name="ellipsize"/d' \ -e '/name="width_chars"/d' \ -e '/name="single_line_mode"/d' \ -e '/name="angle"/d' aqbanking-5.6.4beta/admin/Makefile.in0000644000175000017500000004325212643540054014404 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = admin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = insert_api.sh glade-fixup fixuifiles all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu admin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu admin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/admin/Makefile.am0000644000175000017500000000006012364015477014367 00000000000000EXTRA_DIST=insert_api.sh glade-fixup fixuifiles aqbanking-5.6.4beta/admin/insert_api.sh0000755000175000017500000000117312364015477015035 00000000000000#!/bin/sh # ------------------------------------------------------------------------- # This tool inserts export declarations into declarations of classes. e.g. # class MYCLASS : SOMECLASS # { lalala # ... # would become # class QBANKING_API MYCLASS : SOMECLASS # { lalala # ... # when used for QBanking. # The first (and only) argument is the export declaration to insert. # It reads from stdin and writes to stdout. # # (c) 2006 Martin Preuss # fapi=$1 while read line; do case "$line" in class\ *\ :*) line=`echo "$line" | sed "s/class /class $fapi /"` ;; esac echo "$line" done aqbanking-5.6.4beta/configure.ac0000644000175000017500000012757512643540045013550 00000000000000# Process this file with autoconf to produce a configure script. ###------------------------------------------------------------------------- # # The following line makes sure that this file is always touched when a new # revision is checked out. # # $Rev: 2550 $ # AC_PREREQ(2.56) AC_INIT AC_CANONICAL_BUILD AC_CANONICAL_HOST AC_CONFIG_SRCDIR([README]) AC_CONFIG_HEADERS([config.h]) ###------------------------------------------------------------------------- # # AqBanking versions # AQBANKING_VERSION_MAJOR=5 AQBANKING_VERSION_MINOR=6 AQBANKING_VERSION_PATCHLEVEL=4 AQBANKING_VERSION_BUILD=0 dnl "stable", "rcX", "betaX", "svn" AQBANKING_VERSION_TAG="beta" ###------------------------------------------------------------------------- # # SO versions # # # AqBanking # AQBANKING_SO_CURRENT=40 AQBANKING_SO_AGE=5 AQBANKING_SO_REVISION=4 AQBANKING_SO_EFFECTIVE="`echo \$(($AQBANKING_SO_CURRENT-$AQBANKING_SO_AGE))`" # # backends # AQHBCI_SO_CURRENT=22 AQHBCI_SO_AGE=0 AQHBCI_SO_REVISION=0 AQHBCI_SO_EFFECTIVE="`echo \$(($AQHBCI_SO_CURRENT-$AQHBCI_SO_AGE))`" AQOFXCONNECT_SO_CURRENT=7 AQOFXCONNECT_SO_AGE=0 AQOFXCONNECT_SO_REVISION=2 AQOFXCONNECT_SO_EFFECTIVE="`echo \$(($AQOFXCONNECT_SO_CURRENT-$AQOFXCONNECT_SO_AGE))`" AQEBICS_SO_CURRENT=2 AQEBICS_SO_AGE=1 AQEBICS_SO_REVISION=9 AQEBICS_SO_EFFECTIVE="`echo \$(($AQEBICS_SO_CURRENT-$AQEBICS_SO_AGE))`" ###------------------------------------------------------------------------- # # Generate version strings and BUILD # SVN="svn" AQBANKING_VERSION_FULL_STRING="${AQBANKING_VERSION_MAJOR}.${AQBANKING_VERSION_MINOR}.${AQBANKING_VERSION_PATCHLEVEL}.${AQBANKING_VERSION_BUILD}${AQBANKING_VERSION_TAG}" AQBANKING_VERSION_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" case "$AQBANKING_VERSION_TAG" in svn|cvs) rev=`LC_ALL="C" $SVN info|grep 'Last Changed Rev'|cut -d' ' -f4` if test "x$rev" != "x" ; then AQBANKING_VERSION_FULL_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.${AQBANKING_VERSION_PATCHLEVEL}${AQBANKING_VERSION_TAG}-r${rev}" fi ;; git) AQBANKING_VERSION_FULL_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.${AQBANKING_VERSION_PATCHLEVEL}.${AQBANKING_VERSION_BUILD}" ;; esac ###------------------------------------------------------------------------- # # Versions (all versions are now linked to AqBanking versions, so the lines # here don't have to be changed) # AQHBCI_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQHBCI_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQHBCI_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQHBCI_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQHBCI_VERSION_TAG=$AQBANKING_VERSION_TAG AQHBCI_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQHBCI_VERSION_STRING="$AQBANKING_VERSION_STRING" AQOFXCONNECT_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQOFXCONNECT_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQOFXCONNECT_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQOFXCONNECT_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQOFXCONNECT_VERSION_TAG=$AQBANKING_VERSION_TAG AQOFXCONNECT_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQOFXCONNECT_VERSION_STRING="$AQBANKING_VERSION_STRING" AQEBICS_VERSION_MAJOR=$AQBANKING_VERSION_MAJOR AQEBICS_VERSION_MINOR=$AQBANKING_VERSION_MINOR AQEBICS_VERSION_PATCHLEVEL=$AQBANKING_VERSION_PATCHLEVEL AQEBICS_VERSION_BUILD=$AQBANKING_VERSION_BUILD AQEBICS_VERSION_TAG=$AQBANKING_VERSION_TAG AQEBICS_VERSION_FULL_STRING="$AQBANKING_VERSION_FULL_STRING" AQEBICS_VERSION_STRING="$AQBANKING_VERSION_STRING" ###------------------------------------------------------------------------- # # datetime # AC_ARG_WITH([build-datetime], [AS_HELP_STRING([--with-build-datetime=DATETIME], [use fixed datetime for build (default: current date and time)])], [AS_IF([test "x$withval" = "xyes"], [DATETIME="`date +\"%Y%m%d%H%M%S\"`"], [DATETIME="`date +\"%Y%m%d%H%M%S\" --date=\"$withval\"`"])], [DATETIME="`date +\"%Y%m%d%H%M%S\"`"]) AC_SUBST(DATETIME) ###------------------------------------------------------------------------- # # Create release strings # case "$AQBANKING_VERSION_TAG" in cvs|svn) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL.r${AQBANKING_VERSION_BUILD}" ;; git) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL.${AQBANKING_VERSION_BUILD}-${AQBANKING_VERSION_TAG}" ;; stable) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" ;; *) AQBANKING_VERSION_RELEASE_STRING="$AQBANKING_VERSION_MAJOR.$AQBANKING_VERSION_MINOR.$AQBANKING_VERSION_PATCHLEVEL" # add TAG AQBANKING_VERSION_RELEASE_STRING="${AQBANKING_VERSION_RELEASE_STRING}${AQBANKING_VERSION_TAG}" ;; esac AQHBCI_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" AQOFXCONNECT_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" AQEBICS_VERSION_RELEASE_STRING="$AQBANKING_RELEASE_STRING" ###------------------------------------------------------------------------- # # SUBST and DEFINE versions # AC_SUBST(AQBANKING_VERSION_MAJOR) AC_SUBST(AQBANKING_VERSION_MINOR) AC_SUBST(AQBANKING_VERSION_PATCHLEVEL) AC_SUBST(AQBANKING_VERSION_BUILD) AC_SUBST(AQBANKING_VERSION_TAG) AC_SUBST(AQBANKING_VERSION_FULL_STRING) AC_SUBST(AQBANKING_VERSION_STRING) AC_SUBST(AQBANKING_VERSION_RELEASE_STRING) AC_SUBST(AQBANKING_SO_CURRENT) AC_SUBST(AQBANKING_SO_REVISION) AC_SUBST(AQBANKING_SO_AGE) AC_SUBST(AQBANKING_SO_EFFECTIVE) AC_DEFINE_UNQUOTED(AQBANKING_SO_EFFECTIVE_STR, "$AQBANKING_SO_EFFECTIVE", [effective SO version]) AM_INIT_AUTOMAKE(aqbanking, $AQBANKING_VERSION_RELEASE_STRING) # # same for AqHBCI # AC_SUBST(AQHBCI_VERSION_MAJOR) AC_SUBST(AQHBCI_VERSION_MINOR) AC_SUBST(AQHBCI_VERSION_PATCHLEVEL) AC_SUBST(AQHBCI_VERSION_BUILD) AC_SUBST(AQHBCI_VERSION_TAG) AC_SUBST(AQHBCI_VERSION_FULL_STRING) AC_SUBST(AQHBCI_VERSION_STRING) AC_SUBST(AQHBCI_VERSION_RELEASE_STRING) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_MAJOR,$AQHBCI_VERSION_MAJOR, [major version]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_MINOR,$AQHBCI_VERSION_MINOR, [minor version]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_PATCHLEVEL,$AQHBCI_VERSION_PATCHLEVEL, [patchlevel]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_BUILD,$AQHBCI_VERSION_BUILD, [build]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_STRING,"$AQHBCI_VERSION_STRING", [version string]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_FULL_STRING,"$AQHBCI_VERSION_FULL_STRING", [full version string]) AC_DEFINE_UNQUOTED(AQHBCI_VERSION_TAG,$AQHBCI_VERSION_TAG, [tag]) AC_SUBST(AQHBCI_SO_CURRENT) AC_SUBST(AQHBCI_SO_REVISION) AC_SUBST(AQHBCI_SO_AGE) AC_SUBST(AQHBCI_SO_EFFECTIVE) AC_DEFINE_UNQUOTED(AQHBCI_SO_EFFECTIVE_STR, "$AQHBCI_SO_EFFECTIVE", [effective SO version]) # # same for AqOFXCONNECT # AC_SUBST(AQOFXCONNECT_VERSION_MAJOR) AC_SUBST(AQOFXCONNECT_VERSION_MINOR) AC_SUBST(AQOFXCONNECT_VERSION_PATCHLEVEL) AC_SUBST(AQOFXCONNECT_VERSION_BUILD) AC_SUBST(AQOFXCONNECT_VERSION_TAG) AC_SUBST(AQOFXCONNECT_VERSION_FULL_STRING) AC_SUBST(AQOFXCONNECT_VERSION_STRING) AC_SUBST(AQOFXCONNECT_VERSION_RELEASE_STRING) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_MAJOR,$AQOFXCONNECT_VERSION_MAJOR, [major version]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_MINOR,$AQOFXCONNECT_VERSION_MINOR, [minor version]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_PATCHLEVEL,$AQOFXCONNECT_VERSION_PATCHLEVEL, [patchlevel]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_BUILD,$AQOFXCONNECT_VERSION_BUILD, [build]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_STRING,"$AQOFXCONNECT_VERSION_STRING", [version string]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_FULL_STRING,"$AQOFXCONNECT_VERSION_FULL_STRING", [full version string]) AC_DEFINE_UNQUOTED(AQOFXCONNECT_VERSION_TAG,$AQOFXCONNECT_VERSION_TAG, [tag]) AC_SUBST(AQOFXCONNECT_SO_CURRENT) AC_SUBST(AQOFXCONNECT_SO_REVISION) AC_SUBST(AQOFXCONNECT_SO_AGE) AC_SUBST(AQOFXCONNECT_SO_EFFECTIVE) AC_DEFINE_UNQUOTED(AQOFXCONNECT_SO_EFFECTIVE_STR, "$AQOFXCONNECT_SO_EFFECTIVE", [effective SO version]) # # same for AqEBICS # AC_SUBST(AQEBICS_VERSION_MAJOR) AC_SUBST(AQEBICS_VERSION_MINOR) AC_SUBST(AQEBICS_VERSION_PATCHLEVEL) AC_SUBST(AQEBICS_VERSION_BUILD) AC_SUBST(AQEBICS_VERSION_TAG) AC_SUBST(AQEBICS_VERSION_FULL_STRING) AC_SUBST(AQEBICS_VERSION_STRING) AC_SUBST(AQEBICS_VERSION_RELEASE_STRING) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_MAJOR,$AQEBICS_VERSION_MAJOR, [major version]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_MINOR,$AQEBICS_VERSION_MINOR, [minor version]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_PATCHLEVEL,$AQEBICS_VERSION_PATCHLEVEL, [patchlevel]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_BUILD,$AQEBICS_VERSION_BUILD, [build]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_STRING,"$AQEBICS_VERSION_STRING", [version string]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_FULL_STRING,"$AQEBICS_VERSION_FULL_STRING", [full version string]) AC_DEFINE_UNQUOTED(AQEBICS_VERSION_TAG,$AQEBICS_VERSION_TAG, [tag]) AC_SUBST(AQEBICS_SO_CURRENT) AC_SUBST(AQEBICS_SO_REVISION) AC_SUBST(AQEBICS_SO_AGE) AC_SUBST(AQEBICS_SO_EFFECTIVE) AC_DEFINE_UNQUOTED(AQEBICS_SO_EFFECTIVE_STR, "$AQEBICS_SO_EFFECTIVE", [effective SO version]) ###------------------------------------------------------------------------- # # determine operating system # AQ_CHECK_OS ###------------------------------------------------------------------------- # # prefix handling # AC_PREFIX_DEFAULT(/usr) if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix ac_configure_args="$ac_configure_args --prefix $prefix" fi AC_SUBST(prefix) ###------------------------------------------------------------------------- # # static/shared handling # AC_ENABLE_STATIC(no) AC_ENABLE_SHARED(yes) ###------------------------------------------------------------------------- # # define some needed variables # abs_top_builddir="`pwd`" AC_SUBST(abs_top_builddir) ###------------------------------------------------------------------------- # # Enable some GNU extensions if using the GNU C library # AC_GNU_SOURCE ###------------------------------------------------------------------------- # # Checks for programs. # AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL AC_PROG_LIBTOOL AC_LIBTOOL_WIN32_DLL AC_LIBTOOL_RC # Newer libtool doesn't have AC_LIBTOOL_RC anymore. Need to check for # $(RC) by ourselves. AC_CHECK_TOOL([RC], [windres], [no]) AC_CHECK_PROG(USE_DOT,dot,YES,NO) AC_CHECK_PROG(SED,sed,sed) # Checks for libraries. ###------------------------------------------------------------------------- # # Checks for header files. # AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h locale.h]) AC_CHECK_HEADERS([termios.h signal.h iconv.h]) AC_CHECK_DECLS([sigprocmask], [], [], [ #ifdef HAVE_SIGNAL_H # include #endif ]) ###------------------------------------------------------------------------- # # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST AC_STRUCT_TM ###------------------------------------------------------------------------- # # Checks for library functions. # AC_FUNC_STRFTIME AC_CHECK_FUNCS([memmove memset strcasecmp strdup strerror snprintf]) AC_CHECK_FUNCS([setlocale]) ###------------------------------------------------------------------------- # # Backends. Those do not have a required ordering. # AC_ARG_WITH(backends, [ --with-backends=list space separated list of backends (default:all)], [aqbanking_backends="$withval"], [aqbanking_backends="all"] ) if test "$aqbanking_backends" = "all"; then aqbanking_backends="aqhbci aqnone aqofxconnect aqebics" fi for f in ${aqbanking_backends}; do case "$f" in aqhbci) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqhbci" AC_DEFINE(AQBANKING_WITH_PLUGIN_BACKEND_AQHBCI, 1, [plugin availability]) ;; aqebics) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqebics" AC_DEFINE(AQBANKING_WITH_PLUGIN_BACKEND_AQEBICS, 1, [plugin availability]) ;; aqnone) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqnone" AC_DEFINE(AQBANKING_WITH_PLUGIN_BACKEND_AQNONE, 1, [plugin availability]) ;; aqofxconnect) aqbanking_plugins_backends_dirs="$aqbanking_plugins_backends_dirs aqofxconnect" AC_DEFINE(AQBANKING_WITH_PLUGIN_BACKEND_AQOFXCONNECT, 1, [plugin availability]) ;; aqpaypal) AC_MSG_WARN("WARNING: AqPaypal no longer supported, ignoring") ;; *) AC_MSG_ERROR("ERROR: Unknown plugin \"$f\"") ;; esac done AC_SUBST(aqbanking_plugins_backends_dirs) ###------------------------------------------------------------------------- # # ImExporters. Those do not have a required ordering. # AC_ARG_WITH(imexporters, [ --with-imexporters=list space separated list of im-/exporters (default:all)], [aqbanking_imexporters="$withval"], [aqbanking_imexporters="all"] ) if test "$aqbanking_imexporters" = "all"; then aqbanking_imexporters="csv dtaus eri2 ofx openhbci1 swift xmldb yellownet sepa ctxfile q43" fi for f in ${aqbanking_imexporters}; do case "$f" in csv) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs csv" ;; dtaus) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs dtaus" ;; eri2) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs eri2" ;; ofx) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs ofx" ;; openhbci1) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs openhbci1" ;; swift) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs swift" ;; xmldb) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs xmldb" ;; yellownet) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs yellownet" ;; sepa) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs sepa" ;; ctxfile) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs ctxfile" ;; q43) aqbanking_plugins_imexporters_dirs="$aqbanking_plugins_imexporters_dirs q43" ;; *) AC_MSG_ERROR("ERROR: Unknown plugin \"$f\"") ;; esac done AC_SUBST(aqbanking_plugins_imexporters_dirs) ###------------------------------------------------------------------------- # # Parsers. Those do not have a required ordering. # AC_ARG_WITH(parsers, [ --with-parsers=list space separated list of parsers (default:all)], [aqbanking_parsers="$withval"], [aqbanking_parsers="all"] ) if test "$aqbanking_parsers" = "all"; then aqbanking_parsers="dtaus swift" fi for f in ${aqbanking_parsers}; do case "$f" in dtaus) aqbanking_plugins_parsers_dirs="$aqbanking_plugins_parsers_dirs dtaus" ;; swift) aqbanking_plugins_parsers_dirs="$aqbanking_plugins_parsers_dirs swift" ;; *) AC_MSG_ERROR("ERROR: Unknown plugin \"$f\"") ;; esac done AC_SUBST(aqbanking_plugins_parsers_dirs) ###------------------------------------------------------------------------- # # Bankinfo plugins. Those do not have a required ordering. # AC_ARG_WITH(bankinfos, [ --with-bankinfos=list space separated list of bankinfo (default:all)], [aqbanking_bankinfos="$withval"], [aqbanking_bankinfos="all"] ) if test "$aqbanking_bankinfos" = "all"; then aqbanking_bankinfos="at ca ch de us" fi for f in ${aqbanking_bankinfos}; do case "$f" in at) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs at" ;; ca) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs ca" ;; ch) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs ch" ;; de) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs de" ;; us) aqbanking_plugins_bankinfo_dirs="$aqbanking_plugins_bankinfo_dirs us" ;; *) AC_MSG_ERROR("ERROR: Unknown plugin \"$f\"") ;; esac done AC_SUBST(aqbanking_plugins_bankinfo_dirs) ###------------------------------------------------------------------------- # # KtoBlzCheck # pkg_modules="ktoblzcheck >= 1.10" PKG_CHECK_MODULES(ktoblzcheck, [$pkg_modules], [have_ktoblzcheck="yes"], [have_ktoblzcheck="no"]) if test "$have_ktoblzcheck" = "yes"; then AC_DEFINE(HAVE_KTOBLZCHECK, 1, [if KTOBLZCHECK is available]) ktoblzcheck_includes="$ktoblzcheck_CFLAGS" ktoblzcheck_libs="$ktoblzcheck_LIBS" else AC_MSG_WARN([ *** ktoblzcheck is missing. *** Account number checking will not be available. *** We strongly suggest installing ktoblzcheck and its devel *** package.]) fi AM_CONDITIONAL(WITH_KTOBLZCHECK, [test "$have_ktoblzcheck" = "yes"]) AC_SUBST(ktoblzcheck_libs) AC_SUBST(ktoblzcheck_includes) ###------------------------------------------------------------------------- # # Check for Gwen # # Variable used in aqbanking-config.cmake AC_SUBST(GWENHYWFAR_MINIMUM_VERSION, "4.10.0.0") AC_GWENHYWFAR(4,10,0,0) all_includes="$all_includes $gwenhywfar_includes" AC_ARG_ENABLE(gui-tests, [ --enable-gui-tests allow GUI tests (default=no)], enable_gui_tests="$enableval", enable_gui_tests="no") AC_MSG_RESULT($enable_gui_tests) if test "$enable_gui_tests" != "no"; then # For libgwenhywfar > 3.99.20, look for its library gwengui-gtk2. PKG_CHECK_MODULES([GWENGUI_GTK2], [gwengui-gtk2 gwenhywfar], [ HAVE_GWENGUI_GTK2=1 PKG_CHECK_MODULES([GTK2], [gtk+-2.0]) ], [ HAVE_GWENGUI_GTK2=0 ]) AC_SUBST(HAVE_GWENGUI_GTK2) if test "$HAVE_GWENGUI_GTK2" = "1"; then AC_DEFINE(USE_GWENGUI_GTK2, 1, [GTK2Gui availability]) fi else HAVE_GWENGUI_GTK2=0 fi AM_CONDITIONAL(WITH_GWENGUI_GTK2, [test "$HAVE_GWENGUI_GTK2" = "1"]) ###------------------------------------------------------------------------- # # check typemaker2 # AC_MSG_CHECKING(typemaker2 binary) AC_ARG_WITH(typemaker2-exe, [ --with-typemaker2-exe=EXE path and name of the executable typemaker2], [typemaker2_exe="$withval"], [typemaker2_exe="\$(gwenhywfar_bindir)/typemaker2"] ) AC_MSG_RESULT($typemaker2_exe) AC_SUBST(typemaker2_exe) ###------------------------------------------------------------------------- # # check xmlmerge # AC_MSG_CHECKING(xmlmerge) AC_ARG_WITH(xmlmerge, [ --with-xmlmerge=PATH path and name of tool xmlmerge], [XMLMERGE="$withval"], [XMLMERGE="$gwenhywfar_dir/bin/xmlmerge"]) AC_SUBST(XMLMERGE) AC_MSG_RESULT($XMLMERGE) ###------------------------------------------------------------------------- # # Check for GMP # # Allow the user to override the gmp_libs detection here if test "x$gmp_libs" = "x"; then AC_CHECK_LIB(gmp, __gmpz_init, [have_gmp="yes"], [have_gmp="no"]) AC_CHECK_HEADERS(gmp.h, [], [have_gmp="no"]) if test "$have_gmp" != "yes"; then AC_MSG_ERROR([GMP is required, see http://swox.com/gmp]) else gmp_libs="-lgmp" fi fi AC_SUBST(gmp_libs) ###------------------------------------------------------------------------- # # OS dependant settings # # Common settings; can be overridden per-OS below. aqbanking_internal_libs="${abs_top_builddir}/src/libs/aqbanking/libaqbanking.la" aqbanking_ldflags="-L\${libdir}" aqbanking_libs="-laqbanking" aqbanking_includes="-I\${includedir}/aqbanking5" aqbanking_headerdir_am="\$(includedir)/aqbanking5" aqbanking_headerdir="\${includedir}/aqbanking5" aqbanking_plugindir="\${libdir}/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" aqbanking_pkgdatadir="\${datadir}/aqbanking" aqbanking_symlinkdir="\$(top_builddir)/aqbanking5" case "$OS_TYPE" in posix) aqbanking_sys_is_windows=0 ;; windows) aqbanking_sys_is_windows=1 AC_DEFINE_UNQUOTED(BUILDING_AQBANKING_DLL,1, [Define if DLL is built]) ;; esac AM_CONDITIONAL(IS_WINDOWS, [test "$OS_TYPE" = "windows"]) ###------------------------------------------------------------------------- # # check whether local installation mode is enabled # AC_MSG_CHECKING(whether local installation mode is wanted) AC_ARG_ENABLE(local-install, [ --enable-local-install allow local installation mode (default=no)], enable_local_install="$enableval", enable_local_install="no") AC_MSG_RESULT($enable_local_install) if test "$enable_local_install" != "no"; then AC_DEFINE(ENABLE_LOCAL_INSTALL, 1, [whether local install is wanted]) fi ###------------------------------------------------------------------------- # # check plugin search path # AC_MSG_CHECKING(plugin search dir) AC_ARG_WITH(plugin-searchdir, [ --with-plugin-searchdir=DIR where to search for plugins], [aqbanking_plugin_searchdir="$withval"], [aqbanking_plugin_searchdir=""]) if test -z "${aqbanking_plugin_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_plugin_searchdir="lib/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" else if test "$enable_local_install" != "no"; then aqbanking_plugin_searchdir="lib/aqbanking/plugins/${AQBANKING_SO_EFFECTIVE}" else aqbanking_plugin_searchdir="$aqbanking_plugindir" fi fi fi AC_SUBST(aqbanking_plugin_searchdir) AC_MSG_RESULT($aqbanking_plugin_searchdir) ###------------------------------------------------------------------------- # # check cfg search dir # AC_MSG_CHECKING(cfg search dir) AC_ARG_WITH(cfg-searchdir, [ --with-cfg-searchdir=DIR where to search for cfg files], [aqbanking_cfg_searchdir="$withval"], [aqbanking_cfg_searchdir=""]) if test -z "$aqbanking_cfg_searchdir"; then if test "$OSYSTEM" = "windows"; then aqbanking_cfg_searchdir="etc" else if test "$enable_local_install" != "no"; then aqbanking_cfg_searchdir="etc" else aqbanking_cfg_searchdir="\$(sysconfdir)" fi fi fi AC_SUBST(aqbanking_cfg_searchdir) AC_MSG_RESULT($aqbanking_cfg_searchdir) ###------------------------------------------------------------------------- # # check locale search dir # AC_MSG_CHECKING(locale search dir) AC_ARG_WITH(locale-searchdir, [ --with-locale-searchdir=DIR where to search for locale files], [aqbanking_locale_searchdir="$withval"], [aqbanking_locale_searchdir=""]) if test -z "${aqbanking_locale_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_locale_searchdir="share/locale" else if test "$enable_local_install" != "no"; then aqbanking_locale_searchdir="share/locale" else aqbanking_locale_searchdir="\$(localedir)" fi fi fi AC_SUBST(aqbanking_locale_searchdir) AC_MSG_RESULT($aqbanking_locale_searchdir) ###------------------------------------------------------------------------- # # check data search dir # AC_MSG_CHECKING(data search dir) AC_ARG_WITH(data-searchdir, [ --with-data-searchdir=DIR where to search for data files], [aqbanking_data_searchdir="$withval"], [aqbanking_data_searchdir=""]) if test -z "${aqbanking_data_searchdir}"; then if test "$OSYSTEM" = "windows"; then aqbanking_data_searchdir="share" else if test "$enable_local_install" != "no"; then aqbanking_data_searchdir="share" else aqbanking_data_searchdir="\$(datadir)" fi fi fi AC_SUBST(aqbanking_data_searchdir) AC_MSG_RESULT($aqbanking_data_searchdir) ###------------------------------------------------------------------------- # check for Distribution AQ_DISTRIBUTION ###------------------------------------------------------------------------- # # check for I18N # # check whether i18n files are to be created AC_CHECK_PROG(XGETTEXT,xgettext,xgettext, missing) MAKE_I18N_FILES="yes" if test "$XGETTEXT" = "missing"; then MAKE_I18N_FILES="no" AC_MSG_WARN([xgettext is missing. Locale suport is disabled.]) fi AC_PATH_PROG([MSGFMT], [msgfmt], [missing]) if test "$MSGFMT" = "missing"; then MAKE_I18N_FILES="no" AC_MSG_WARN([msgfmt is missing. Locale suport is disabled.]) else # check for --qt argument of msgfmt AC_MSG_CHECKING(whether msgfmt understands --qt) if test "x${MSGFMT}" != "x"; then if ${MSGFMT} --qt --help >/dev/null 2>&1; then MSGFMT_SUPPORTS_QT=yes else MSGFMT_SUPPORTS_QT=no fi else MSGFMT_SUPPORTS_QT=no fi AC_MSG_RESULT($MSGFMT_SUPPORTS_QT) fi AC_SUBST(MAKE_I18N_FILES) AC_SUBST(MSGFMT_SUPPORTS_QT) AM_CONDITIONAL(IF_MAKE_I18N_FILES, [test "$MAKE_I18N_FILES" = "yes"]) # then check whether i18n support is to be compiled in i18n_libs="" HAVE_I18N="yes" AC_CHECK_HEADERS([locale.h libintl.h], [], [HAVE_I18N="no"]) AC_CHECK_FUNCS([setlocale]) if test "$OS_TYPE" != "windows"; then oldlibs="$LIBS" LIBS="" AC_SEARCH_LIBS(gettext, intl, [], [HAVE_I18N="no"]) i18n_libs="$LIBS" LIBS="$oldlibs" else i18n_libs="-lintl" fi if test "$HAVE_I18N" != "NO"; then AC_DEFINE_UNQUOTED(HAVE_I18N, 1, [whether I18N is available]) fi AC_SUBST(HAVE_I18N) AC_SUBST(i18n_libs) ###------------------------------------------------------------------------- # # check for release # AC_MSG_CHECKING(whether this is an official release) AC_ARG_ENABLE(release, [ --enable-release make this an official release (default=no)], [ case "${enableval}" in yes) enable_release="yes";; no) enable_release="no";; *) AC_MSG_ERROR(bad value ${enableval} for --enable-release);; esac ], enable_release="no") if test "$enable_release" = "yes"; then STRIPALL="-s" else STRIPALL="" fi AC_SUBST(STRIPALL) AC_MSG_RESULT($enable_release) ###------------------------------------------------------------------------- # Debug arguments for compilation ACX_COMPILE_WARN() ###------------------------------------------------------------------------- # # Compiler check for symbol visibility # AC_CACHE_CHECK([whether compiler supports symbol visibility], ac_cv_hidden_visibility_attribute, [ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1; }' > conftest.c ac_cv_hidden_visibility_attribute=no if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then if grep '\.hidden.*foo' conftest.s >/dev/null; then ac_cv_hidden_visibility_attribute=yes fi fi rm -f conftest.* ]) if test $ac_cv_hidden_visibility_attribute = yes; then AC_DEFINE(GCC_WITH_VISIBILITY_ATTRIBUTE, 1, [visibility]) visibility_cflags="-fvisibility=hidden" fi AC_SUBST(visibility_cflags) ###------------------------------------------------------------------------- # # Subst # AS_SCRUB_INCLUDE(aqbanking_includes) AC_SUBST(aqbanking_sys_is_windows) AC_SUBST(aqbanking_includes) AC_SUBST(aqbanking_internal_libs) AC_SUBST(aqbanking_ldflags) AC_SUBST(aqbanking_libs) AC_SUBST(aqbanking_plugindir) AC_SUBST(aqbanking_pkgdatadir) AC_SUBST(aqbanking_symlinkdir) AC_SUBST(aqbanking_headerdir_am) AC_SUBST(aqbanking_headerdir) ###------------------------------------------------------------------------- # # Check for additional aclocal flags # ADD_ACLOCAL_FLAGS="" for A in "${GWEN_PREFIX}/share/aclocal" \ "${prefix}/share/aclocal"; do if test -d "${A}"; then ADD_ACLOCAL_FLAGS="${ADD_ACLOCAL_FLAGS} -I ${A}" fi done AC_SUBST(ADD_ACLOCAL_FLAGS) ###------------------------------------------------------------------------- # # AqBanking modules # aqbanking_modules=". jobs types" aqbankingpp_modules="." AC_SUBST(aqbanking_modules) AC_SUBST(aqbankingpp_modules) ###------------------------------------------------------------------------- # # docpath # AC_MSG_CHECKING(docpath) AC_ARG_WITH(docpath, [ --with-docpath=DIR where to store the apidoc], [docpath="$withval"], [docpath="${HOME}/apidoc"]) AC_SUBST(docpath) AC_MSG_RESULT($docpath) ###------------------------------------------------------------------------- # # check for doc type # AC_MSG_CHECKING(if full docu should be created) AC_ARG_ENABLE(full-doc, [ --enable-full-doc enable creating full apidoc (default=no)], [ case "${enableval}" in yes) enable_fulldoc="yes";; no) enable_fulldoc="no";; *) AC_MSG_ERROR(bad value ${enableval} for --enable-full-doc);; esac ], enable_fulldoc="no") if test "$enable_fulldoc" = "yes"; then DOXYGEN_INPUT="listdoc.h src" DOXYGEN_DEFINE="" DOXYGEN_FILE_PATTERNS="*.h *.hpp *.c *.cpp" else DOXYGEN_DEFINE="DOXYGEN_HIDE" DOXYGEN_INPUT="listdoc.h aqbanking5" DOXYGEN_FILE_PATTERNS="*.h *.hpp" fi AC_SUBST(DOXYGEN_INPUT) AC_SUBST(DOXYGEN_DEFINE) AC_SUBST(DOXYGEN_FILE_PATTERNS) AC_MSG_RESULT($enable_fulldoc) ###------------------------------------------------------------------------- # # search for tag files # AC_MSG_CHECKING(doxygen tag files) DOXYGEN_TAGFILES="" if test -d "${docpath}"; then DOXYGEN_TAGFILES="`cd ${docpath} && ls *.tag`" if test -n "${DOXYGEN_TAGFILES}"; then DOXYGEN_TAGFILES="`echo ${DOXYGEN_TAGFILES} | ${SED} -e s/${PACKAGE}.tag//`" fi realfiles="" for ff in ${DOXYGEN_TAGFILES}; do realfiles="${realfiles} ${docpath}/${ff}" done DOXYGEN_TAGFILES="${realfiles}" fi if test -z "${DOXYGEN_TAGFILES}"; then AC_MSG_RESULT(none) else AC_MSG_RESULT(found) fi AC_SUBST(DOXYGEN_TAGFILES) ###------------------------------------------------------------------------- # # check for dependencies of backends # (nothing to check for right now) dependencies_ok="yes" ###------------------------------------------------------------------------- # # Configure stuff for backend AqHBCI # # Common settings; can be overridden per-OS below. aqhbci_internal_libs="${abs_top_builddir}/src/plugins/backends/aqhbci/plugin/libaqhbci.la" aqhbci_ldflags="-L\${libdir}" aqhbci_includes="${aqbanking_includes}" aqhbci_libs="-laqhbci" with_aqhbci="no" case "$aqbanking_backends" in *aqhbci*) with_aqhbci="yes" case "$OS_TYPE" in posix) ;; windows) AC_DEFINE_UNQUOTED(BUILDING_AQHBCI_DLL,1, [Define if DLL is built]) ;; esac ;; esac AS_SCRUB_INCLUDE(aqhbci_includes) AC_SUBST(aqhbci_includes) AC_SUBST(aqhbci_internal_libs) AC_SUBST(aqhbci_libs) AC_SUBST(aqhbci_ldflags) AC_SUBST(with_aqhbci) ###------------------------------------------------------------------------- # # check AqHBCI data dir # AC_MSG_CHECKING(aqhbci data dir) AC_ARG_WITH(aqhbci-datadir, [ --with-aqhbci-datadir=DIR where to search for data files], [aqhbci_datadir="$withval"], [aqhbci_datadir="$aqhbci_data"]) AC_SUBST(aqhbci_datadir) AC_MSG_RESULT($aqhbci_datadir) ###------------------------------------------------------------------------- # # Configure stuff for backend AqOfxConnect # # Common settings aqofxconnect_internal_libs="${abs_top_builddir}/src/plugins/backends/aqofxconnect/plugin/libaqofxconnect.la" aqofxconnect_includes="${aqbanking_includes}" aqofxconnect_libs="-L\${libdir} -laqofxconnect" case "$aqbanking_backends" in *aqofxconnect*) case "$OS_TYPE" in posix) ;; windows) AC_DEFINE_UNQUOTED(BUILDING_AQOFXCONNECT_DLL,1, [Define if DLL is built]) ;; esac ;; esac AS_SCRUB_INCLUDE(aqofxconnect_includes) AC_SUBST(aqofxconnect_includes) AC_SUBST(aqofxconnect_internal_libs) AC_SUBST(aqofxconnect_libs) #AC_DEFINE_UNQUOTED(AQOFXCONNECT_DATA, "${aqofxconnect_data}", [data dir]) ###------------------------------------------------------------------------- # # Configure stuff for backend AqEBICS # # Common settings; can be overridden per-OS below. aqebics_internal_libs="${abs_top_builddir}/src/plugins/backends/aqebics/plugin/libaqebics.la" aqebics_ldflags="-L\${libdir}" aqebics_includes="${aqbanking_includes}" aqebics_libs="-laqebics" with_aqebics="no" case "$aqbanking_backends" in *aqebics*) with_aqebics="yes" case "$OS_TYPE" in posix) ;; windows) AC_DEFINE_UNQUOTED(BUILDING_AQEBICS_DLL,1, [Define if DLL is built]) ;; esac ;; esac AS_SCRUB_INCLUDE(aqebics_includes) AC_SUBST(aqebics_includes) AC_SUBST(aqebics_internal_libs) AC_SUBST(aqebics_libs) AC_SUBST(aqebics_ldflags) AC_SUBST(with_aqebics) ###------------------------------------------------------------------------- # # check AqEBICS data dir # AC_MSG_CHECKING(aqebics data dir) AC_ARG_WITH(aqebics-datadir, [ --with-aqebics-datadir=DIR where to search for data files], [aqebics_datadir="$withval"], [aqebics_datadir="$aqebics_data"]) AC_SUBST(aqebics_datadir) AC_MSG_RESULT($aqebics_datadir) ###------------------------------------------------------------------------- # # Check for xmlsec # if test "$with_aqebics" = "yes"; then AC_MSG_CHECKING(for build requirements needed by EBICS backend) AC_MSG_RESULT() PKG_CHECK_MODULES(XMLSEC, [xmlsec1-gnutls >= 1.0.0]) PKG_CHECK_MODULES(LIBXML, [libxml-2.0]) PKG_CHECK_MODULES(LIBXSLT, [libxslt]) AQEBICS_CFLAGS="$XMLSEC_CFLAGS $LIBXML_CFLAGS $LIBXSLT_CFLAGS" AQEBICS_LIBS="$XMLSEC_LIBS $LIBXML_LIBS $LIBXSLT_LIBS" AC_SUBST(AQEBICS_CFLAGS) AC_SUBST(AQEBICS_LIBS) fi ###------------------------------------------------------------------------- # # check for plugin init # AC_MSG_CHECKING(if plugin init is wanted) AC_ARG_ENABLE(init-plugins, [ --enable-init-plugins enable plugin init (default=yes)], enable_init_plugins="$enableval", enable_init_plugins="yes") AC_MSG_RESULT($enable_init_plugins) if test "$enable_init_plugins" != "no"; then AC_DEFINE(AQBANKING_ENABLE_INIT_PLUGINS, 1, [if plugin init is wanted]) fi ###------------------------------------------------------------------------- # # check whether aqbanking is a subproject to another one # AC_MSG_CHECKING(if AqBanking is a subproject) AC_ARG_ENABLE(aqb-subproject, [ --enable-aqb-subproject make gwen only a subproject (default=no)], enable_aqb_subproject="$enableval", enable_aqb_subproject="no") AC_MSG_RESULT($enable_aqb_subproject) if test "$enable_aqb_subproject" != "no"; then AC_DEFINE(AQBANKING_IS_SUBPROJECT, 1, [whether aqb is a subproject]) fi ###------------------------------------------------------------------------- # # check whether aqbanking-cli is enabled # AC_MSG_CHECKING(whether aqbanking-cli is wanted) AC_ARG_ENABLE(cli, [ --enable-cli build aqbanking-cli (default=yes)], enable_cli="$enableval", enable_cli="yes") AC_MSG_RESULT($enable_cli) AM_CONDITIONAL(ENABLE_CLI, [test "$enable_cli" = "yes"]) AC_ARG_WITH(cli-version-string, [ --with-cli-version-string list of additional libraries], [AQBANKING_CLI_VERSION_STRING="$withval"], [AQBANKING_CLI_VERSION_STRING="$AQBANKING_VERSION_STRING"] ) AC_SUBST(AQBANKING_CLI_VERSION_STRING) ###------------------------------------------------------------------------- # # check whether tutorials are to be built # AC_MSG_CHECKING(whether tutorials are to be built) AC_ARG_ENABLE(tutorials, [ --enable-tutorials build tutorials (default=yes)], [ case "${enableval}" in yes) TUTORIALS="tutorials";; no) TUTORIALS="";; *) AC_MSG_ERROR(bad value ${enableval} for --enable-tutorials);; esac ], [ TUTORIALS="tutorials" enableval="yes" ]) AC_MSG_RESULT($enableval) AC_SUBST(TUTORIALS) ###------------------------------------------------------------------------- # # Cleanup includes, define all_XXX # AS_SCRUB_INCLUDE(all_includes) AC_SUBST(all_includes) AC_SUBST(all_libraries) AC_SUBST(aqbanking_backends) # Adjust CFLAGS and LDFLAGS on Windows case "$OS_TYPE" in windows) # GnuCash compiles with this; maybe we need this, too? #CFLAGS="${CFLAGS} -mms-bitfields" LDFLAGS="${LDFLAGS} -no-undefined -mwindows" ;; esac ###------------------------------------------------------------------------- # # Output files # AC_CONFIG_FILES([ mksymlinks.sh admin/Makefile doc/Makefile m4/Makefile src/Makefile src/libs/Makefile src/libs/aqbanking/Makefile src/libs/aqbanking/jobs/Makefile src/libs/aqbanking/types/Makefile src/libs/aqbanking/gui/Makefile src/libs/aqbanking/dialogs/Makefile src/libs/aqbanking/typemaker2/Makefile src/libs/aqbanking/typemaker2/c/Makefile src/libs/aqbanking/backendsupport/Makefile src/libs/aqbankingpp/Makefile src/plugins/Makefile src/plugins/bankinfo/Makefile src/plugins/bankinfo/at/Makefile src/plugins/bankinfo/at/at.xml src/plugins/bankinfo/ca/Makefile src/plugins/bankinfo/ca/ca.xml src/plugins/bankinfo/ch/Makefile src/plugins/bankinfo/ch/ch.xml src/plugins/bankinfo/de/Makefile src/plugins/bankinfo/de/de.xml src/plugins/bankinfo/us/Makefile src/plugins/bankinfo/us/us.xml src/plugins/bankinfo/generic/Makefile src/plugins/imexporters/Makefile src/plugins/imexporters/dtaus/Makefile src/plugins/imexporters/dtaus/dtaus.xml src/plugins/imexporters/dtaus/profiles/Makefile src/plugins/imexporters/dtaus/profiles/default.conf src/plugins/imexporters/dtaus/profiles/debitnote.conf src/plugins/imexporters/dtaus/profiles/transfer.conf src/plugins/imexporters/eri2/Makefile src/plugins/imexporters/eri2/eri2.xml src/plugins/imexporters/eri2/profiles/Makefile src/plugins/imexporters/eri2/profiles/default.conf src/plugins/imexporters/ofx/Makefile src/plugins/imexporters/ofx/ofx.xml src/plugins/imexporters/ofx/parser/Makefile src/plugins/imexporters/ofx/profiles/Makefile src/plugins/imexporters/ofx/profiles/default.conf src/plugins/imexporters/ofx/profiles/iso8859.conf src/plugins/imexporters/swift/Makefile src/plugins/imexporters/swift/swift.xml src/plugins/imexporters/swift/profiles/Makefile src/plugins/imexporters/swift/profiles/swiftmt940.conf src/plugins/imexporters/swift/profiles/swiftmt942.conf src/plugins/imexporters/swift/profiles/amro940.conf src/plugins/imexporters/swift/profiles/amro942.conf src/plugins/imexporters/csv/Makefile src/plugins/imexporters/csv/csv.xml src/plugins/imexporters/csv/profiles/Makefile src/plugins/imexporters/csv/profiles/default.conf src/plugins/imexporters/csv/profiles/amex.conf src/plugins/imexporters/csv/profiles/aqmoney1.conf src/plugins/imexporters/csv/profiles/aqmoney2.conf src/plugins/imexporters/csv/profiles/comdirect.conf src/plugins/imexporters/csv/profiles/consors-tagesgeld.conf src/plugins/imexporters/csv/profiles/mijnpostbank.conf src/plugins/imexporters/csv/profiles/oko.conf src/plugins/imexporters/csv/profiles/spk-aachen.conf src/plugins/imexporters/csv/profiles/spk-steiermark.conf src/plugins/imexporters/csv/profiles/tonline-banking.conf src/plugins/imexporters/csv/profiles/test.conf src/plugins/imexporters/csv/profiles/vrnetworld.conf src/plugins/imexporters/csv/profiles/lbbberlin.conf src/plugins/imexporters/csv/profiles/bankaustria.conf src/plugins/imexporters/csv/profiles/psk.conf src/plugins/imexporters/csv/profiles/diba.conf src/plugins/imexporters/csv/profiles/dkb.conf src/plugins/imexporters/csv/profiles/dkb-cash.conf src/plugins/imexporters/csv/profiles/sparda.conf src/plugins/imexporters/csv/profiles/full.conf src/plugins/imexporters/csv/profiles/hypovereinsbank.conf src/plugins/imexporters/csv/profiles/postbankffm.conf src/plugins/imexporters/csv/profiles/cli-transfers.conf src/plugins/imexporters/csv/profiles/sns.conf src/plugins/imexporters/csv/profiles/transfers.conf src/plugins/imexporters/csv/profiles/sepadebitnotes.conf src/plugins/imexporters/openhbci1/Makefile src/plugins/imexporters/openhbci1/openhbci1.xml src/plugins/imexporters/openhbci1/profiles/Makefile src/plugins/imexporters/openhbci1/profiles/default.conf src/plugins/imexporters/qif/Makefile src/plugins/imexporters/qif/qif.xml src/plugins/imexporters/qif/profiles/Makefile src/plugins/imexporters/qif/profiles/default.conf src/plugins/imexporters/yellownet/Makefile src/plugins/imexporters/yellownet/yellownet.xml src/plugins/imexporters/yellownet/profiles/Makefile src/plugins/imexporters/yellownet/profiles/default.conf src/plugins/imexporters/xmldb/Makefile src/plugins/imexporters/xmldb/xmldb.xml src/plugins/imexporters/xmldb/profiles/Makefile src/plugins/imexporters/xmldb/profiles/default.conf src/plugins/imexporters/sepa/Makefile src/plugins/imexporters/sepa/sepa.xml src/plugins/imexporters/sepa/profiles/Makefile src/plugins/imexporters/sepa/profiles/default.conf src/plugins/imexporters/sepa/profiles/001_001_02.conf src/plugins/imexporters/sepa/profiles/001_002_03.conf src/plugins/imexporters/sepa/profiles/001_003_03.conf src/plugins/imexporters/sepa/profiles/008_001_01.conf src/plugins/imexporters/sepa/profiles/008_002_02.conf src/plugins/imexporters/sepa/profiles/008_003_02.conf src/plugins/imexporters/ctxfile/Makefile src/plugins/imexporters/ctxfile/ctxfile.xml src/plugins/imexporters/ctxfile/profiles/Makefile src/plugins/imexporters/ctxfile/profiles/default.conf src/plugins/imexporters/q43/Makefile src/plugins/imexporters/q43/q43.xml src/plugins/imexporters/q43/profiles/Makefile src/plugins/imexporters/q43/profiles/default.conf src/plugins/parsers/Makefile src/plugins/parsers/dtaus/Makefile src/plugins/parsers/dtaus/dtaus.xml src/plugins/parsers/swift/Makefile src/plugins/parsers/swift/swift.xml src/plugins/backends/Makefile src/plugins/backends/aqhbci/Makefile src/plugins/backends/aqhbci/plugin/Makefile src/plugins/backends/aqhbci/plugin/aqhbci.xml src/plugins/backends/aqhbci/plugin/dialogs/Makefile src/plugins/backends/aqhbci/plugin/header.xml src/plugins/backends/aqhbci/plugin/banking/Makefile src/plugins/backends/aqhbci/plugin/msglayer/Makefile src/plugins/backends/aqhbci/plugin/joblayer/Makefile src/plugins/backends/aqhbci/plugin/applayer/Makefile src/plugins/backends/aqhbci/plugin/ajobs/Makefile src/plugins/backends/aqhbci/plugin/applayer/xml/Makefile src/plugins/backends/aqhbci/plugin/version.h src/plugins/backends/aqhbci/tools/Makefile src/plugins/backends/aqhbci/tools/hbcixml/Makefile src/plugins/backends/aqhbci/tools/aqhbci-tool/Makefile src/plugins/backends/aqofxconnect/Makefile src/plugins/backends/aqofxconnect/version.h src/plugins/backends/aqofxconnect/plugin/Makefile src/plugins/backends/aqofxconnect/plugin/aqofxconnect.xml src/plugins/backends/aqofxconnect/plugin/libofxhome/Makefile src/plugins/backends/aqnone/Makefile src/plugins/backends/aqnone/aqnone.xml src/plugins/backends/aqebics/Makefile src/plugins/backends/aqebics/plugin/Makefile src/plugins/backends/aqebics/plugin/aqebics.xml src/plugins/backends/aqebics/plugin/client/Makefile src/plugins/backends/aqebics/plugin/dialogs/Makefile src/plugins/backends/aqebics/plugin/msg/Makefile src/plugins/backends/aqebics/tools/Makefile src/plugins/backends/aqebics/tools/aqebics-tool/Makefile src/test/Makefile src/tools/Makefile src/tools/aqbanking-cli/Makefile tutorials/Makefile po/Makefile Doxyfile Makefile aqbanking-config.in aqbanking.pc aqbanking.spec aqbanking.iss version.h system.h aqbanking-config.cmake aqbanking-config-version.cmake ]) AC_OUTPUT ###------------------------------------------------------------------------- # # Summary # echo echo echo "Summary" echo "----------------------------------------------------" echo "AqBanking version : $AQBANKING_VERSION_FULL_STRING" echo "Local Installation Mode : $enable_local_install" echo "Prefix : $prefix" echo "Exec-Prefix : $exec_prefix" echo "Libdir : $libdir" echo "Cfg Search Folder : $aqbanking_cfg_searchdir" echo "Data Search Folder : $aqbanking_data_searchdir" echo "Locale Search Folder : $aqbanking_locale_searchdir" echo "Plugin Search Folder : $aqbanking_plugin_searchdir" echo "Symbol Visibility : $visibility_supported" echo "Use KtoBlzCheck : $have_ktoblzcheck" echo "Build AqBanking-CLI : $enable_cli" echo "CLI Version String : $AQBANKING_CLI_VERSION_STRING" echo echo echo "Plugins" echo "----------------------------------------------------" echo " Backends : $aqbanking_backends" echo " Im-/Exporters : $aqbanking_imexporters" echo " Parsers : $aqbanking_parsers" echo " Bank Infos : $aqbanking_bankinfos" echo echo "Additional Information" echo "----------------------------------------------------" if test "$have_ktoblzcheck" != "yes"; then echo " - you really should consider installing ktoblzcheck " echo " in order to enable account number validation!" fi echo echo "----------------------------------------------------" echo "You can now run \"make\" (or gmake on FreeBSD) to compile." aqbanking-5.6.4beta/aqbanking-config-version.cmake.in0000644000175000017500000000045612367522076017545 00000000000000set(PACKAGE_VERSION "@VERSION@") if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() endif() aqbanking-5.6.4beta/aqbanking.iss0000644000175000017500000002765612643540105013731 00000000000000; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Input configuration for the Inno Setup Compiler ; Copyright (c) 2005 Christian Stimming ; ; Inno Setup Compiler: See http://www.jrsoftware.org/isdl.php ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Setup] ; Using the name here directly because we want it capitalized AppName=AqBanking AppVerName=AqBanking 5.6.4beta AppPublisher=AqBanking Development Team AppPublisherURL=http://sourceforge.net/projects/aqbanking AppSupportURL=http://sourceforge.net/support/getsupport.php?group_id=115695 AppUpdatesURL=http://sourceforge.net/project/showfiles.php?group_id=115695 Compression=lzma DefaultDirName={pf}\aqbanking DirExistsWarning=no InfoAfterFile=README LicenseFile=COPYING OutputBaseFilename=aqbanking-5.6.4beta-setup OutputDir=. UninstallFilesDir={app}\uninstall\aqbanking [Types] Name: "full"; Description: "{cm:FullInstall}" Name: "binary"; Description: "{cm:BinaryInstall}" Name: "custom"; Description: "{cm:CustomInstall}"; Flags: iscustom [Components] Name: "main"; Description: "{cm:MainFiles}"; Types: full binary custom; Flags: fixed Name: "devel"; Description: "{cm:DevelFiles}"; Types: full Name: "doc"; Description: "{cm:DocFiles}"; Types: full ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Here we configure the included files and the place of their ; installation ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Files] ; All main DLLs Source: "win32-tmp\usr\bin\*.dll"; DestDir: "{app}\bin"; Flags: sharedfile promptifolder replacesameversion; Components: main ; Everything from the lib directory, including all plugins Source: "win32-tmp\usr\lib\lib*.la"; DestDir: "{app}\lib"; Components: main Source: "win32-tmp\usr\lib\aqbanking\*"; DestDir: "{app}\lib\aqbanking"; Flags: recursesubdirs; Components: main ; The plugins that belong to gwenhywfar. Source: "win32-tmp\gwen\dbio\*"; DestDir: "{reg:HKLM\Software\Gwenhywfar\Paths,dbio-plugins|{app}\lib\aqbanking\plugins\35}"; Flags: ignoreversion recursesubdirs; Components: main Source: "win32-tmp\gwen\crypttoken\*"; DestDir: "{reg:HKLM\Software\Gwenhywfar\Paths,plugindir|{app}\lib\aqbanking\plugins\35}\crypttoken"; Flags: ignoreversion recursesubdirs; Components: main ; The commandline tools Source: "win32-tmp\usr\bin\*.exe"; DestDir: "{app}\bin"; Components: main ; The config-scripts. They are post-processed by the Pascal script below. Source: "aqbanking-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\aqbanking-config')) Source: "src\plugins\backends\aqhbci\aqhbci-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\aqhbci-config')) Source: "src\frontends\qbanking\lib\qbanking-config.in.in"; DestDir: "{app}\bin"; Components: devel; AfterInstall: MyAfterInstallConfig(ExpandConstant('{app}\bin\qbanking-config')) ; The headers, and the aclocal macro. Source: "win32-tmp\usr\include\*"; DestDir: "{app}\include"; Flags: ignoreversion recursesubdirs; Components: devel Source: "win32-tmp\usr\share\*"; DestDir: "{app}\share"; Flags: ignoreversion recursesubdirs; Components: devel Source: "win32-tmp\share\*"; DestDir: "{app}\share"; Flags: ignoreversion recursesubdirs; Components: devel ; And all the documentation Source: "README"; DestDir: "{app}\doc\aqbanking"; Components: doc Source: "NEWS"; DestDir: "{app}\doc\aqbanking"; Components: doc Source: "COPYING"; DestDir: "{app}\doc\aqbanking"; Components: doc Source: "AUTHORS"; DestDir: "{app}\doc\aqbanking"; Components: doc Source: "ChangeLog"; DestDir: "{app}\doc\aqbanking"; Components: doc ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Delete automatically created files on uninstall ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [UninstallDelete] Type: files; Name: "{app}\bin\*-config" ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Define the registry keys Setup should create (HKLM = HKEY_LOCAL_MACHINE) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Registry] Root: HKLM; Subkey: "Software\Aqbanking"; ValueType: none; Flags: uninsdeletekeyifempty Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: none; Flags: uninsdeletekeyifempty Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "prefix"; ValueData: "{app}"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "libdir"; ValueData: "{app}\lib"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "pkglibdir"; ValueData: "{app}\lib\aqbanking"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "plugindir"; ValueData: "{app}\lib\aqbanking\plugins\35"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "providerdir"; ValueData: "{app}\lib\aqbanking\plugins\35\providers"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "bankinfodir"; ValueData: "{app}\lib\aqbanking\plugins\35\bankinfo"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "imexporterdir"; ValueData: "{app}\lib\aqbanking\plugins\35\imexporters"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "importerdir"; ValueData: "{app}\lib\aqbanking\plugins\35\imexporters"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "pkgdatadir"; ValueData: "{app}\share\aqbanking"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "sysconfdir"; ValueData: "{app}\etc"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "wizarddir"; ValueData: "{app}\lib\aqbanking\plugins\35\wizards"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\Aqbanking\Paths"; ValueType: string; ValueName: "localedir"; ValueData: "{app}\share\locale"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\AqBanking\Paths"; ValueType: string; ValueName: "xmldatadir"; ValueData: "{app}\share\aqhbci\xml"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\AqBanking\Paths"; ValueType: string; ValueName: "cfgmoduledir"; ValueData: "{app}\lib\aqbanking\plugins\35\frontends\qbanking\cfgmodules"; Flags: uninsdeletevalue ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This large section is a Pascal scripting program that will modify ; the aqbanking-config shell script so that it then includes the ; correct values according to our local installation. See ; http://www.remobjects.com/?ps for a syntax reference. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [Code] function MingwBacksl(const S: String): String; begin { Modify the path name S so that it can be used by MinGW } if Length(ExtractFileDrive(S)) = 0 then Result := S else begin Result := '/'+S; StringChange(Result, ':\', '\'); end; StringChange(Result, '\', '/'); end; procedure MyAfterInstallConfig(FileName: String); var FileString, appdir, windir, bindir, includedir, plugindir, datadir, pkgdatadir: String; Res: Boolean; begin { Load the unchanged original file } Res := LoadStringFromFile(Format('%s.in.in',[FileName]), FileString); if Res = False then MsgBox('Error on loading '+FileName+'.in.in for final adaptation', mbInformation, MB_OK); { Insert the custom file header; #10 is the linefeed character } Insert('#!/bin/sh '#10'dir="@prefix'+'@"'#10, FileString, 0); { Get the installation-specific paths } windir := MingwBacksl(ExpandConstant('{win}')); appdir := MingwBacksl(ExpandConstant('{app}')); includedir := appdir + '/include'; bindir := appdir + '/bin'; plugindir := appdir + '/lib/aqbanking/plugins/35'; datadir := appdir + '/share'; pkgdatadir := datadir + '/aqbanking'; { Now make all the replacements } { Explanation: StringChange(S,FromStr,ToStr): Change all occurances in S of FromStr to ToStr. } StringChange(FileString, '@'+'prefix@', appdir); StringChange(FileString, '@'+'libdir@', windir); StringChange(FileString, '@'+'all_includes@', '-I/usr/local/include/gwenhywfar4'); StringChange(FileString, '@'+'aqbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'aqbanking_ldflags@', '-L'+bindir); StringChange(FileString, '@'+'aqbanking_libs@', '-laqbanking'); StringChange(FileString, '@'+'aqbanking_plugindir@', plugindir); StringChange(FileString, '@'+'aqbanking_pkgdatadir@', pkgdatadir); StringChange(FileString, '@'+'AQBANKING_VERSION_MAJOR@', '5'); StringChange(FileString, '@'+'AQBANKING_VERSION_MINOR@', '6'); StringChange(FileString, '@'+'AQBANKING_VERSION_PATCHLEVEL@', '4'); StringChange(FileString, '@'+'AQBANKING_VERSION_BUILD@', '0'); StringChange(FileString, '@'+'AQBANKING_VERSION_TAG@', 'beta'); StringChange(FileString, '@'+'cbanking_libs@', '-L' + bindir + ' @cbanking_libs@'); StringChange(FileString, '@'+'cbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'qbanking_libs@', '-L' + bindir + ' @qbanking_libs@'); StringChange(FileString, '@'+'qbanking_includes@', '-I'+includedir); StringChange(FileString, '@'+'qbanking_data@', datadir + '/qbanking'); StringChange(FileString, '@'+'QBANKING_VERSION_MAJOR@', '@QBANKING_VERSION_MAJOR@'); StringChange(FileString, '@'+'QBANKING_VERSION_MINOR@', '@QBANKING_VERSION_MINOR@'); StringChange(FileString, '@'+'QBANKING_VERSION_PATCHLEVEL@', '@QBANKING_VERSION_PATCHLEVEL@'); StringChange(FileString, '@'+'QBANKING_VERSION_BUILD@', '@QBANKING_VERSION_BUILD@'); StringChange(FileString, '@'+'kbanking_libs@', '-L' + bindir + ' @kbanking_libs@'); StringChange(FileString, '@'+'kbanking_includes@', '-I'+includedir); { Save the final file } Res := SaveStringToFile(FileName, FileString, False); if Res = False then MsgBox('Error on saving '+FileName+' for final adaptation', mbInformation, MB_OK); end; function InitializeSetup(): Boolean; begin Result := Length(ExpandConstant('{reg:HKLM\Software\Gwenhywfar\Paths,prefix|a}')) > 1; if Result = False then MsgBox(ExpandConstant('{cm:PrereqNotFound}'), mbInformation, MB_OK); end; [Languages] Name: "en"; MessagesFile: "compiler:Default.isl" Name: "de"; MessagesFile: "compiler:Languages\German.isl" ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; These are only for improved text messages ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[Messages] ;; *** "Select Destination" wizard page ;SelectDirLabel3=Setup will install [name] into the following folder. If you have MinGW installed on your system, you can safely choose MinGW's root folder here as well (e.g. c:\msys\1.0). ; ;de.SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. Wenn Sie MinGW auf Ihrem Computer installiert haben, können Sie hier problemlos das Root-Verzeichnis von MinGW angeben (z.B. c:\msys\1.0). ; The customized messages with their translations here. [CustomMessages] ; *** Prerequisite message PrereqNotFound=The setup program did not find the DLL of the Gwenhywfar package and/or the registry keys of the Gwenhywfar installation. You need to install Gwenhywfar from the setup executable, and then start this setup again. de.PrereqNotFound=Das Setup-Programm hat die DLL des Gwenhywfar-Pakets und/oder dessen Registry-Keys nicht gefunden. Sie müssen zuerst Gwenhywfar über dessen Setup-Programm installieren und dann dieses Setup-Programm erneut starten. ; *** "Select Components" wizard page FullInstall=Full installation BinaryInstall=Install only libraries CustomInstall=Custom installation MainFiles=Aqbanking DLL Library DevelFiles=Development files DocFiles=Documentation files de.FullInstall=Komplett-Installation de.BinaryInstall=Nur Bibliotheken installieren de.CustomInstall=Benutzerdefiniert de.MainFiles=Aqbanking DLL Bibliothek de.DevelFiles=Entwickler-Dateien de.DocFiles=Dokumentations-Dateien aqbanking-5.6.4beta/tutorials/0000755000175000017500000000000012643540662013354 500000000000000aqbanking-5.6.4beta/tutorials/tutorial1.c0000644000175000017500000000724512364015477015375 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /*************************************************************************** * This tutorial simply creates an instance of AqBanking, initializes and * * deinitializes it. * * * * You must either choose a GUI implementation to be used with AqBanking * * or create one yourself by implementing the user interface callbacks of * * LibGwenhywfar. * * * * However, for simplicity reasons we use the console GUI implementation * * which implements these callbacks for you. * * * * There are other GUI implementations, e.g. for GTK2, QT3, QT4 and FOX16. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include int main(int argc, char **argv) { AB_BANKING *ab; int rv; GWEN_GUI *gui; gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); /* The first argument is the name of the application. This is needed for * AqBanking to internally store some application-specific settings. * This name may contain whatever characters you like, it is escaped * internally before creating file paths or DB groups from it. * * The second argument is the folder in which the AqBanking settings are * stored. You should in most cases provide NULL here which makes AqBanking * choose the default path ($HOME/.aqbanking). * If this folder doesn't exist it will be created as soon as AqBanking has * something to store (in most cases when closing the application). */ ab=AB_Banking_new("tutorial1", 0, 0); /* This function initializes AqBanking. It is only after successfull return * from this function that any other AqBanking function may be used. */ rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Error on init (%d)\n", rv); return 2; } /* Initialize the only banking part of AqBanking. This is needed to * actually perform online banking actions (like retrieving account * statements etc). */ rv=AB_Banking_OnlineInit(ab); if (rv) { fprintf(stderr, "Error on onlineinit (%d)\n", rv); return 2; } fprintf(stderr, "AqBanking successfully initialized.\n"); /* deinit the online banking part of AqBanking */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 3; } /* You must always call this function before exiting, because only then * AqBanking's settings are written. * After this function has been called no other function except * AB_Banking_free() or AB_Banking_Init() may be called. */ rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 3; } /* The AqBanking instance you created at the beginning must always be * destroyed using this function to avoid memory leaks. */ AB_Banking_free(ab); return 0; } aqbanking-5.6.4beta/tutorials/tutorials.h0000644000175000017500000000374112364015477015501 00000000000000 /** @defgroup G_TUTORIAL1 Tutorial 1 (Basic Usage of AqBanking) * @ingroup G_TUTORIALS * @brief Basic usage of AqBanking * * This tutorial simply creates an instance of AqBanking, initializes and * deinitializes it. * * You must either choose a frontend to be used with AqBanking or create * one yourself by implementing the user interface callbacks of AqBanking. * * However, for simplicity reasons we use the console frontend CBanking * which implements these callbacks for you. * * There are other frontends, e.g. G2Banking for GTK2/Gnome, QBanking for * QT3 or KDE3 or KBanking for KDE3. * * @include "tutorial1.c" */ /** @defgroup G_TUTORIAL2 Tutorial 2 (Extended Usage of AqBanking) * @ingroup G_TUTORIALS * @brief Extended usage of AqBanking * * This tutorial shows the list of accounts currently known to AqBanking. * * It also gives an introduction into the usage of XXX_List2's and list2 * iterators. * * You must either choose a frontend to be used with AqBanking or create * one yourself by implementing the user interface callbacks of AqBanking. * * However, for simplicity reasons we use the console frontend CBanking * which implements these callbacks for you. * * There are other frontends, e.g. G2Banking for GTK2/Gnome, QBanking for * QT3 or KDE3 or KBanking for KDE3. * * @include "tutorial2.c" */ /** @defgroup G_TUTORIAL3 Tutorial 3 (Working With Jobs) * @ingroup G_TUTORIALS * @brief Working with jobs * * This tutorial shows how to use jobs in AqBanking. * In this example we retrieve transaction statements for a given account. * * You must either choose a frontend to be used with AqBanking or create * one yourself by implementing the user interface callbacks of AqBanking. * * However, for simplicity reasons we use the console frontend CBanking * which implements these callbacks for you. * * There are other frontends, e.g. G2Banking for GTK2/Gnome, QBanking for * QT3 or KDE3 or KBanking for KDE3. * * @include "tutorial3.c" */ aqbanking-5.6.4beta/tutorials/tutorial3.c0000644000175000017500000001511112364015477015366 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /*************************************************************************** * This tutorial shows how to use jobs in AqBanking. * * In this example we retrieve transaction statements for a given account. * * * * You must either choose a GUI implementation to be used with AqBanking * * or create one yourself by implementing the user interface callbacks of * * LibGwenhywfar. * * * * However, for simplicity reasons we use the console GUI implementation * * which implements these callbacks for you. * * * * There are other GUI implementations, e.g. for GTK2, QT3, QT4 and FOX16. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include int main(int argc, char **argv) { AB_BANKING *ab; int rv; AB_ACCOUNT *a; GWEN_GUI *gui; gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("tutorial3", 0, 0); /* This is the basic init function. It only initializes the minimum (like * setting up plugin and data paths). After this function successfully * returns you may freely use any non-online function. To use online * banking functions (like getting the list of managed accounts, users * etc) you will have to call AB_Banking_OnlineInit(). */ rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Error on init (%d)\n", rv); return 2; } fprintf(stderr, "AqBanking successfully initialized.\n"); /* This function loads the settings file of AqBanking so the users and * accounts become available after this function successfully returns. */ rv=AB_Banking_OnlineInit(ab); if (rv) { fprintf(stderr, "Error on init of online modules (%d)\n", rv); return 2; } /* Any type of job needs an account to operate on. The following function * allows wildcards (*) and jokers (?) in any of the arguments. */ a=AB_Banking_FindAccount(ab, "aqhbci", /* backend name */ "de", /* two-char ISO country code */ "200*", /* bank code (with wildcard) */ "*", /* account number (wildcard) */ "*"); /* sub account id (Unterkontomerkmal) */ if (a) { AB_JOB_LIST2 *jl; AB_JOB *j; AB_IMEXPORTER_CONTEXT *ctx; /* create a job which retrieves transaction statements. */ j=AB_JobGetTransactions_new(a); /* This function checks whether the given job is available with the * backend/provider to which the account involved is assigned. * The corresponding provider/backend might also check whether this job * is available with the given account. * If the job is available then 0 is returned, otherwise the error code * might give you a hint why the job is not supported. */ rv=AB_Job_CheckAvailability(j); if (rv) { fprintf(stderr, "Job is not available (%d)\n", rv); return 2; } /* create a job list to which the jobs to be executed are added. * This list is later given as an argument to the queue execution * function. */ jl=AB_Job_List2_new(); /* add job to this list */ AB_Job_List2_PushBack(jl, j); /* When executing a list of enqueued jobs (as we will do below) all the * data returned by the server will be stored within an ImExporter * context. */ ctx=AB_ImExporterContext_new(); /* execute the jobs which are in the given list (well, for this tutorial * there is only one job in the list, but the number is not limited). * This effectivly sends all jobs to the respective backends/banks. * It only returns an error code (!=0) if there has been a problem * sending the jobs. */ rv=AB_Banking_ExecuteJobs(ab, jl, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); return 2; } else { AB_IMEXPORTER_ACCOUNTINFO *ai; ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(ai) { const AB_TRANSACTION *t; t=AB_ImExporterAccountInfo_GetFirstTransaction(ai); while(t) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) { const GWEN_STRINGLIST *sl; const char *purpose; /* The purpose (memo field) might contain multiple lines. * Therefore AqBanking stores the purpose in a string list * of which the first entry is used in this tutorial */ sl=AB_Transaction_GetPurpose(t); if (sl) purpose=GWEN_StringList_FirstString(sl); else purpose=""; fprintf(stderr, " %-32s (%.2f %s)\n", purpose, AB_Value_GetValueAsDouble(v), AB_Value_GetCurrency(v)); } t=AB_ImExporterAccountInfo_GetNextTransaction(ai); } /* while transactions */ ai=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while ai */ } /* if executeQueue successfull */ /* free the job to avoid memory leaks */ AB_Job_free(j); } /* if account found */ else { fprintf(stderr, "No account found.\n"); } /* This function MUST be called in order to let AqBanking save the changes * to the users and accounts (like they occur after executing jobs). */ rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit online modules (%d)\n", rv); return 3; } /* This function deinitializes AqBanking. It undoes the effects of * AB_Banking_Init() and should be called before destroying an AB_BANKING * object. */ rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 3; } AB_Banking_free(ab); return 0; } aqbanking-5.6.4beta/tutorials/tutorial2.c0000644000175000017500000001155312364015477015373 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /*************************************************************************** * This tutorial shows the list of accounts currently known to AqBanking. * * * * It also gives an introduction into the usage of XXX_List2's and list2 * * iterators. * * * * You must either choose a GUI implementation to be used with AqBanking * * or create one yourself by implementing the user interface callbacks of * * LibGwenhywfar. * * * * However, for simplicity reasons we use the console GUI implementation * * which implements these callbacks for you. * * * * There are other GUI implementations, e.g. for GTK2, QT3, QT4 and FOX16. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include int main(int argc, char **argv) { AB_BANKING *ab; AB_ACCOUNT_LIST2 *accs; int rv; GWEN_GUI *gui; gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("tutorial2", 0, 0); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Error on init (%d)\n", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { fprintf(stderr, "Error on onlineinit (%d)\n", rv); return 2; } fprintf(stderr, "AqBanking successfully initialized.\n"); /* Get a list of accounts which are known to AqBanking. * There are some pecularities about the list returned: * The list itself is owned by the caller (who must call * AB_Account_List2_free() as we do below), but the elements of that * list (->the accounts) are still owned by AqBanking. * Therefore you MUST NOT free any of the accounts within the list returned. * This also rules out calling AB_Account_List2_freeAll() which not only * frees the list itself but also frees all its elements. * * The rest of this tutorial shows how lists are generally used by * AqBanking. */ accs=AB_Banking_GetAccounts(ab); if (accs) { AB_ACCOUNT_LIST2_ITERATOR *it; /* List2's are traversed using iterators. An iterator is an object * which points to a single element of a list. * If the list is empty NULL is returned. */ it=AB_Account_List2_First(accs); if (it) { AB_ACCOUNT *a; /* this function returns a pointer to the element of the list to * which the iterator currently points to */ a=AB_Account_List2Iterator_Data(it); while(a) { AB_PROVIDER *pro; /* every account is assigned to a backend (sometimes called provider) * which actually performs online banking tasks. We get a pointer * to that provider/backend with this call to show its name in our * example.*/ pro=AB_Account_GetProvider(a); fprintf(stderr, "Account: %s (%s) %s (%s) [%s]\n", AB_Account_GetBankCode(a), AB_Account_GetBankName(a), AB_Account_GetAccountNumber(a), AB_Account_GetAccountName(a), /* the name of the provider/backend as decribed above */ AB_Provider_GetName(pro)); /* this function lets the iterator advance to the next element in * the list, so a following call to AB_Account_List2Iterator_Data() * would return a pointer to the next element. * This function also returns a pointer to the next element of the * list. If there is no next element then NULL is returned. */ a=AB_Account_List2Iterator_Next(it); } /* the iterator must be freed after using it */ AB_Account_List2Iterator_free(it); } /* as discussed the list itself is only a container which has to be freed * after use. This explicitly does not free any of the elements in that * list, and it shouldn't because AqBanking still is the owner of the * accounts */ AB_Account_List2_free(accs); } rv=AB_Banking_OnlineFini(ab); if (rv) { fprintf(stderr, "ERROR: Error on online deinit (%d)\n", rv); return 3; } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 3; } AB_Banking_free(ab); return 0; } aqbanking-5.6.4beta/tutorials/Makefile.in0000644000175000017500000006225712643540064015351 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = tutorial1$(EXEEXT) tutorial2$(EXEEXT) \ tutorial3$(EXEEXT) tutorial4$(EXEEXT) subdir = tutorials DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_compile_warn.m4 \ $(top_srcdir)/m4/as-scrub-include.m4 \ $(top_srcdir)/m4/distri.m4 $(top_srcdir)/m4/gwenhywfar.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/os.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_tutorial1_OBJECTS = tutorial1.$(OBJEXT) tutorial1_OBJECTS = $(am_tutorial1_OBJECTS) am__DEPENDENCIES_1 = tutorial1_DEPENDENCIES = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_tutorial2_OBJECTS = tutorial2.$(OBJEXT) tutorial2_OBJECTS = $(am_tutorial2_OBJECTS) tutorial2_DEPENDENCIES = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la \ $(am__DEPENDENCIES_1) am_tutorial3_OBJECTS = tutorial3.$(OBJEXT) tutorial3_OBJECTS = $(am_tutorial3_OBJECTS) tutorial3_DEPENDENCIES = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la \ $(am__DEPENDENCIES_1) am_tutorial4_OBJECTS = tutorial4.$(OBJEXT) tutorial4_OBJECTS = $(am_tutorial4_OBJECTS) tutorial4_DEPENDENCIES = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(tutorial1_SOURCES) $(tutorial2_SOURCES) \ $(tutorial3_SOURCES) $(tutorial4_SOURCES) DIST_SOURCES = $(tutorial1_SOURCES) $(tutorial2_SOURCES) \ $(tutorial3_SOURCES) $(tutorial4_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADD_ACLOCAL_FLAGS = @ADD_ACLOCAL_FLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQBANKING_CLI_VERSION_STRING = @AQBANKING_CLI_VERSION_STRING@ AQBANKING_SO_AGE = @AQBANKING_SO_AGE@ AQBANKING_SO_CURRENT = @AQBANKING_SO_CURRENT@ AQBANKING_SO_EFFECTIVE = @AQBANKING_SO_EFFECTIVE@ AQBANKING_SO_REVISION = @AQBANKING_SO_REVISION@ AQBANKING_VERSION_BUILD = @AQBANKING_VERSION_BUILD@ AQBANKING_VERSION_FULL_STRING = @AQBANKING_VERSION_FULL_STRING@ AQBANKING_VERSION_MAJOR = @AQBANKING_VERSION_MAJOR@ AQBANKING_VERSION_MINOR = @AQBANKING_VERSION_MINOR@ AQBANKING_VERSION_PATCHLEVEL = @AQBANKING_VERSION_PATCHLEVEL@ AQBANKING_VERSION_RELEASE_STRING = @AQBANKING_VERSION_RELEASE_STRING@ AQBANKING_VERSION_STRING = @AQBANKING_VERSION_STRING@ AQBANKING_VERSION_TAG = @AQBANKING_VERSION_TAG@ AQEBICS_CFLAGS = @AQEBICS_CFLAGS@ AQEBICS_LIBS = @AQEBICS_LIBS@ AQEBICS_SO_AGE = @AQEBICS_SO_AGE@ AQEBICS_SO_CURRENT = @AQEBICS_SO_CURRENT@ AQEBICS_SO_EFFECTIVE = @AQEBICS_SO_EFFECTIVE@ AQEBICS_SO_REVISION = @AQEBICS_SO_REVISION@ AQEBICS_VERSION_BUILD = @AQEBICS_VERSION_BUILD@ AQEBICS_VERSION_FULL_STRING = @AQEBICS_VERSION_FULL_STRING@ AQEBICS_VERSION_MAJOR = @AQEBICS_VERSION_MAJOR@ AQEBICS_VERSION_MINOR = @AQEBICS_VERSION_MINOR@ AQEBICS_VERSION_PATCHLEVEL = @AQEBICS_VERSION_PATCHLEVEL@ AQEBICS_VERSION_RELEASE_STRING = @AQEBICS_VERSION_RELEASE_STRING@ AQEBICS_VERSION_STRING = @AQEBICS_VERSION_STRING@ AQEBICS_VERSION_TAG = @AQEBICS_VERSION_TAG@ AQHBCI_SO_AGE = @AQHBCI_SO_AGE@ AQHBCI_SO_CURRENT = @AQHBCI_SO_CURRENT@ AQHBCI_SO_EFFECTIVE = @AQHBCI_SO_EFFECTIVE@ AQHBCI_SO_REVISION = @AQHBCI_SO_REVISION@ AQHBCI_VERSION_BUILD = @AQHBCI_VERSION_BUILD@ AQHBCI_VERSION_FULL_STRING = @AQHBCI_VERSION_FULL_STRING@ AQHBCI_VERSION_MAJOR = @AQHBCI_VERSION_MAJOR@ AQHBCI_VERSION_MINOR = @AQHBCI_VERSION_MINOR@ AQHBCI_VERSION_PATCHLEVEL = @AQHBCI_VERSION_PATCHLEVEL@ AQHBCI_VERSION_RELEASE_STRING = @AQHBCI_VERSION_RELEASE_STRING@ AQHBCI_VERSION_STRING = @AQHBCI_VERSION_STRING@ AQHBCI_VERSION_TAG = @AQHBCI_VERSION_TAG@ AQOFXCONNECT_SO_AGE = @AQOFXCONNECT_SO_AGE@ AQOFXCONNECT_SO_CURRENT = @AQOFXCONNECT_SO_CURRENT@ AQOFXCONNECT_SO_EFFECTIVE = @AQOFXCONNECT_SO_EFFECTIVE@ AQOFXCONNECT_SO_REVISION = @AQOFXCONNECT_SO_REVISION@ AQOFXCONNECT_VERSION_BUILD = @AQOFXCONNECT_VERSION_BUILD@ AQOFXCONNECT_VERSION_FULL_STRING = @AQOFXCONNECT_VERSION_FULL_STRING@ AQOFXCONNECT_VERSION_MAJOR = @AQOFXCONNECT_VERSION_MAJOR@ AQOFXCONNECT_VERSION_MINOR = @AQOFXCONNECT_VERSION_MINOR@ AQOFXCONNECT_VERSION_PATCHLEVEL = @AQOFXCONNECT_VERSION_PATCHLEVEL@ AQOFXCONNECT_VERSION_RELEASE_STRING = @AQOFXCONNECT_VERSION_RELEASE_STRING@ AQOFXCONNECT_VERSION_STRING = @AQOFXCONNECT_VERSION_STRING@ AQOFXCONNECT_VERSION_TAG = @AQOFXCONNECT_VERSION_TAG@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATETIME = @DATETIME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN_DEFINE = @DOXYGEN_DEFINE@ DOXYGEN_FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ DOXYGEN_INPUT = @DOXYGEN_INPUT@ DOXYGEN_TAGFILES = @DOXYGEN_TAGFILES@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ GWENGUI_GTK2_CFLAGS = @GWENGUI_GTK2_CFLAGS@ GWENGUI_GTK2_LIBS = @GWENGUI_GTK2_LIBS@ GWENHYWFAR_MINIMUM_VERSION = @GWENHYWFAR_MINIMUM_VERSION@ HAVE_GWENGUI_GTK2 = @HAVE_GWENGUI_GTK2@ HAVE_I18N = @HAVE_I18N@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DLL_TARGET = @INSTALL_DLL_TARGET@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIBXSLT_CFLAGS = @LIBXSLT_CFLAGS@ LIBXSLT_LIBS = @LIBXSLT_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_DLL_TARGET = @MAKE_DLL_TARGET@ MAKE_I18N_FILES = @MAKE_I18N_FILES@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_SUPPORTS_QT = @MSGFMT_SUPPORTS_QT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSYSTEM = @OSYSTEM@ OS_TYPE = @OS_TYPE@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ RC = @RC@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRIPALL = @STRIPALL@ TUTORIALS = @TUTORIALS@ USE_DOT = @USE_DOT@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMLMERGE = @XMLMERGE@ XMLSEC_CFLAGS = @XMLSEC_CFLAGS@ XMLSEC_LIBS = @XMLSEC_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ all_includes = @all_includes@ all_libraries = @all_libraries@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ aq_distrib_name = @aq_distrib_name@ aq_distrib_tag = @aq_distrib_tag@ aq_distrib_version = @aq_distrib_version@ aqbanking_backends = @aqbanking_backends@ aqbanking_cfg_searchdir = @aqbanking_cfg_searchdir@ aqbanking_data_searchdir = @aqbanking_data_searchdir@ aqbanking_headerdir = @aqbanking_headerdir@ aqbanking_headerdir_am = @aqbanking_headerdir_am@ aqbanking_includes = @aqbanking_includes@ aqbanking_internal_libs = @aqbanking_internal_libs@ aqbanking_ldflags = @aqbanking_ldflags@ aqbanking_libs = @aqbanking_libs@ aqbanking_locale_searchdir = @aqbanking_locale_searchdir@ aqbanking_modules = @aqbanking_modules@ aqbanking_pkgdatadir = @aqbanking_pkgdatadir@ aqbanking_plugin_searchdir = @aqbanking_plugin_searchdir@ aqbanking_plugindir = @aqbanking_plugindir@ aqbanking_plugins_backends_dirs = @aqbanking_plugins_backends_dirs@ aqbanking_plugins_bankinfo_dirs = @aqbanking_plugins_bankinfo_dirs@ aqbanking_plugins_imexporters_dirs = @aqbanking_plugins_imexporters_dirs@ aqbanking_plugins_parsers_dirs = @aqbanking_plugins_parsers_dirs@ aqbanking_symlinkdir = @aqbanking_symlinkdir@ aqbanking_sys_is_windows = @aqbanking_sys_is_windows@ aqbankingpp_modules = @aqbankingpp_modules@ aqebics_datadir = @aqebics_datadir@ aqebics_includes = @aqebics_includes@ aqebics_internal_libs = @aqebics_internal_libs@ aqebics_ldflags = @aqebics_ldflags@ aqebics_libs = @aqebics_libs@ aqhbci_datadir = @aqhbci_datadir@ aqhbci_includes = @aqhbci_includes@ aqhbci_internal_libs = @aqhbci_internal_libs@ aqhbci_ldflags = @aqhbci_ldflags@ aqhbci_libs = @aqhbci_libs@ aqofxconnect_includes = @aqofxconnect_includes@ aqofxconnect_internal_libs = @aqofxconnect_internal_libs@ aqofxconnect_libs = @aqofxconnect_libs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ docpath = @docpath@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gmp_libs = @gmp_libs@ gwenhywfar_bindir = @gwenhywfar_bindir@ gwenhywfar_dir = @gwenhywfar_dir@ gwenhywfar_has_crypt = @gwenhywfar_has_crypt@ gwenhywfar_headers = @gwenhywfar_headers@ gwenhywfar_includes = @gwenhywfar_includes@ gwenhywfar_libs = @gwenhywfar_libs@ gwenhywfar_plugins = @gwenhywfar_plugins@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ i18n_libs = @i18n_libs@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ ktoblzcheck_CFLAGS = @ktoblzcheck_CFLAGS@ ktoblzcheck_LIBS = @ktoblzcheck_LIBS@ ktoblzcheck_includes = @ktoblzcheck_includes@ ktoblzcheck_libs = @ktoblzcheck_libs@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typemaker2_exe = @typemaker2_exe@ visibility_cflags = @visibility_cflags@ with_aqebics = @with_aqebics@ with_aqhbci = @with_aqhbci@ EXTRA_DIST = README tutorials.h INCLUDES = \ -I$(aqbanking_symlinkdir) \ $(gwenhywfar_includes) $(qt3_includes) tutorial1_SOURCES = tutorial1.c tutorial1_LDADD = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial2_SOURCES = tutorial2.c tutorial2_LDADD = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial3_SOURCES = tutorial3.c tutorial3_LDADD = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial4_SOURCES = tutorial4.c tutorial4_LDADD = \ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tutorials/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tutorials/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list tutorial1$(EXEEXT): $(tutorial1_OBJECTS) $(tutorial1_DEPENDENCIES) $(EXTRA_tutorial1_DEPENDENCIES) @rm -f tutorial1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tutorial1_OBJECTS) $(tutorial1_LDADD) $(LIBS) tutorial2$(EXEEXT): $(tutorial2_OBJECTS) $(tutorial2_DEPENDENCIES) $(EXTRA_tutorial2_DEPENDENCIES) @rm -f tutorial2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tutorial2_OBJECTS) $(tutorial2_LDADD) $(LIBS) tutorial3$(EXEEXT): $(tutorial3_OBJECTS) $(tutorial3_DEPENDENCIES) $(EXTRA_tutorial3_DEPENDENCIES) @rm -f tutorial3$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tutorial3_OBJECTS) $(tutorial3_LDADD) $(LIBS) tutorial4$(EXEEXT): $(tutorial4_OBJECTS) $(tutorial4_DEPENDENCIES) $(EXTRA_tutorial4_DEPENDENCIES) @rm -f tutorial4$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tutorial4_OBJECTS) $(tutorial4_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tutorial1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tutorial2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tutorial3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tutorial4.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aqbanking-5.6.4beta/tutorials/Makefile.am0000644000175000017500000000124312364015477015331 00000000000000EXTRA_DIST = README tutorials.h INCLUDES = \ -I$(aqbanking_symlinkdir) \ $(gwenhywfar_includes) $(qt3_includes) noinst_PROGRAMS=\ tutorial1 \ tutorial2 \ tutorial3 \ tutorial4 tutorial1_SOURCES=tutorial1.c tutorial1_LDADD=\ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial2_SOURCES=tutorial2.c tutorial2_LDADD=\ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial3_SOURCES=tutorial3.c tutorial3_LDADD=\ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) tutorial4_SOURCES=tutorial4.c tutorial4_LDADD=\ $(top_builddir)/src/libs/aqbanking/libaqbanking.la $(gwenhywfar_libs) aqbanking-5.6.4beta/tutorials/tutorial4.c0000644000175000017500000001276512364015477015403 00000000000000/*************************************************************************** begin : Tue May 03 2005 copyright : (C) 2005 by Martin Preuss email : martin@libchipcard.de *************************************************************************** * This file is part of the project "AqBanking". * * Please see toplevel file COPYING of that project for license details. * ***************************************************************************/ /*************************************************************************** * This tutorial shows how to use jobs in AqBanking. * * In this example we retrieve transaction statements for a given account. * * * * You must either choose a GUI implementation to be used with AqBanking * * or create one yourself by implementing the user interface callbacks of * * LibGwenhywfar. * * * * However, for simplicity reasons we use the console GUI implementation * * which implements these callbacks for you. * * * * There are other GUI implementations, e.g. for GTK2, QT3, QT4 and FOX16. * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include int main(int argc, char **argv) { AB_BANKING *ab; int rv; AB_ACCOUNT *a; AB_VALUE *v; GWEN_GUI *gui; const char *accNr; const char *number; const char *vstring; AB_JOB_LIST2 *jl; if (argc<4) { fprintf(stderr, "Usage:\n" "%s ACCOUNT_ID PHONE_NUMBER VALUE\n", argv[0]); return 1; } accNr=argv[1]; number=argv[2]; vstring=argv[3]; gui=GWEN_Gui_CGui_new(); assert(gui); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("tutorial4", 0, 0); rv=AB_Banking_Init(ab); if (rv) { fprintf(stderr, "Error on init (%d)\n", rv); return 2; } rv=AB_Banking_OnlineInit(ab); if (rv) { fprintf(stderr, "Error on OnlineInit (%d)\n", rv); return 2; } fprintf(stderr, "AqBanking successfully initialized.\n"); /* Any type of job needs an account to operate on. The following function * allows wildcards (*) and jokers (?) in any of the arguments. */ a=AB_Banking_FindAccount(ab, "aqhbci", /* backend name */ "de", /* two-char ISO country code */ "*", /* bank code (with wildcard) */ accNr, /* account number (wildcard) */ "*"); /* sub account id (Unterkontomerkmal) */ if (a) { AB_JOB *j; AB_IMEXPORTER_CONTEXT *ctx; const AB_CELLPHONE_PRODUCT_LIST *pl; /* create a job which loads a prepaid card for cell phones. */ j=AB_JobLoadCellPhone_new(a); /* This function checks whether the given job is available with the * backend/provider to which the account involved is assigned. * The corresponding provider/backend might also check whether this job * is available with the given account. * If the job is available then 0 is returned, otherwise the error code * might give you a hint why the job is not supported. */ rv=AB_Job_CheckAvailability(j); if (rv) { fprintf(stderr, "Job is not available (%d)\n", rv); return 2; } /* select correct product */ pl=AB_JobLoadCellPhone_GetCellPhoneProductList(j); if (pl==NULL) { fprintf(stderr, "No products supported\n"); return 2; } else { AB_CELLPHONE_PRODUCT *cp; cp=AB_CellPhoneProduct_List_First(pl); while(cp) { const char *s; s=AB_CellPhoneProduct_GetProviderName(cp); fprintf(stderr, "Provider: [%s]\n", s); if (s && strcasecmp(s, "T-Mobile")==0) break; cp=AB_CellPhoneProduct_List_Next(cp); } if (cp==NULL) { fprintf(stderr, "Provider not found\n"); return 2; } AB_JobLoadCellPhone_SetCellPhoneProduct(j, cp); } /* set number */ AB_JobLoadCellPhone_SetPhoneNumber(j, number); /* set value */ v=AB_Value_fromString(vstring); if (v==NULL) { fprintf(stderr, "Bad value\n"); return 2; } AB_JobLoadCellPhone_SetValue(j, v); AB_Value_free(v); /* enqueue this job so that AqBanking knows we want it executed. */ jl=AB_Job_List2_new(); AB_Job_List2_PushBack(jl, j); /* When executing a list of enqueued jobs (as we will do below) all the * data returned by the server will be stored within an ImExporter * context. */ ctx=AB_ImExporterContext_new(); /* execute the queue. This effectivly sends all jobs which have been * enqueued to the respective backends/banks. * It only returns an error code (!=0) if not a single job could be * executed successfully. */ rv=AB_Banking_ExecuteJobs(ab, jl, ctx); if (rv) { fprintf(stderr, "Error on executeQueue (%d)\n", rv); return 2; } else { } /* if executeQueue successfull */ /* free the job to avoid memory leaks */ AB_Job_free(j); } /* if account found */ else { fprintf(stderr, "No account found.\n"); } rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 3; } AB_Banking_free(ab); return 0; } aqbanking-5.6.4beta/tutorials/README0000644000175000017500000000107312364015477014156 00000000000000 This folder contains some simple tutorials which introduce possible developers to AqBanking. Tutorial1 ========= This just creates an instance of AqBanking, initializes and deinitializes it. Nothing fancy. Tutorial2 ========= This does the same as tutorial1, but in addition it dumps a list of all accounts AqBanking currently knows of. It also gives an introduction into the usage of XXX_List2's and list2 iterators. Tutorial3 ========= This tutorial shows how to use jobs in AqBanking. In this example we retrieve transaction statements for a given account. aqbanking-5.6.4beta/README0000644000175000017500000002714412526042437012133 00000000000000 Content ======= 1. What Is AqBanking ? 1.1. Generic Online Banking Interface 1.2. Generic Financial Data Importer/Exporter Framework 1.3. Bank/Account Information 2. Supported Platforms 3. Supported Backends 3.1. HBCI 3.2. OFX Direct Connect 3.3. EBICS 3.4. Paypal 3.5. None 4. What Do I Need ? 4.1. Required Packages 4.2. Applications 5. Building AqBanking 5.1. Building from the Tar File 5.2. Building from CVS/SVN 5.3. Building the API Documentation 6. Windows Registry Keys Used 6.1. Software\\AqBanking\\Paths\\pkgdatadir 6.2. Software\\AqBanking\\Paths\\sysconfdir 6.3. Software\\AqBanking\\Paths\\bankinfodir 6.4. Software\\AqBanking\\Paths\\providerdir 6.5. Software\\AqBanking\\Paths\\importerdir 7. Environment Variables Used 7.1. AQBANKING_LOGLEVEL 7.2. AQBANKING_STORE_JOBLOGS 7.3. AQHBCI_LOGBOOKED 7.4. AQHBCI_LOGNOTED 7.5. AQHBCI_DEBUG_JOBS 7.6. AQOFX_LOG_COMM 8 . Using Your Own Profiles for Im-/Exporters 9. Thanks 1. What Is AqBanking ? ====================== AqBanking is a library for online banking and financial applications. It has three major goals which are described in the following paragraphs. (Note: Information in German can be found on http://linuxwiki.de/AqBanking ) The homepage of AqBanking is http://www.aqbanking.de/ 1.1. Generic Online Banking Interface ------------------------------------- The intention of AqBanking is to provide a middle layer between the program and the various Online Banking libraries (e.g. AqHBCI, OpenHBCI etc). The real work is done in so-called banking backends. See chapter 3 for a list of supported backends. 1.2. Generic Financial Data Importer/Exporter Framework ------------------------------------------------------- AqBanking uses various plugins to simplify import and export of financial data. It also provides the administration of profiles on a per import/export plugin basis. Currently there are plugins for the following formats: - Importers: - DTAUS (German financial format) - SWIFT (MT940 and MT942) - OFX - CSV - OpenHBCI1 transactions - ERI - Q43 - Exporters - DTAUS (German financial format) - CSV 1.3. Bank/Account Information ----------------------------- AqBanking supports plugins which allow lookup and verification of bank code/ account id pair validity. For Germany the library KtoBlzCheck is used for validation, but the bank information is shipped with aqbanking. Currently AqBanking provides informations about: - ca 25,000 US banks - ca 20,000 German banks - ca 3,600 Swiss banks - ca 2,300 Austrian banks AqBanking also provides information about countries: Country name, ISO-3166 country code (both numeric and alpha) and currency information (ISO 4217 currency codes). 2. Supported Platforms ====================== AqBanking uses the library Gwenhywfar (http://www.aqbanking.de/) for abstraction of the underlying system. So it should work on any system for which Gwenhywfar is available. This includes (but is not limited to): - Linux (of course ;-) - Windows (WIN32 platforms, such as Windows95 up to Windows XP) - MacOSX 10.5 and newer - most POSIX systems (such as the BSDs) should also be supported, however, this is untested 3. Supported Backends ===================== AqBanking includes all its currently known banking backends. 3.1. HBCI --------- The backend AqHBCI provides support for the German online banking protocol called "Homebanking Computer Interface". It is a national standard provided by most German credit institutes. The following security media are supported: - DDV chipcard (DES-DES-Verfahren) - RSA chipcard (RSA-DES-Hybrid mode) - OpenHBCI keyfile (either OpenHBCI 1 or 2, this medium allows continued use with OpenHBCI in parallel) - PIN/TAN (PIN/TAN mode using HTTP over SSL) This backend supports the HBCI versions 2.01, 2.10, 2.20 and 3.00 3.2. OFX Direct Connect ----------------------- This backend provides support for an online banking protocol used in the United States, Canada and maybe in the United Kingdom. 3.3. EBICS ---------- EBICS is the successor of the German banking protocol FTAM. It is used in commercial environments. The tool AqBanking-CLI comes with optional support for this protocol. 3.4. Paypal ----------- This backend uses Paypal's native API for retrieving transactions. 3.5. None --------- This is a fallback module which can be used by applications for accounts which are not managed by any online banking backend. 4. What Do I Need ? =================== 4.1. Required Packages ---------------------- AqBanking has several direct dependencies: - "Gwenhywfar" >= 3.99.0, available from http://gwenhywfar.sf.net/, is absolutely required - "GMP", the GNU MP Bignum Library available from http://gmplib.org/index.html is required for calculations - "KtoBlzCheck" >= 1.0 from http://sf.net/projects/ktoblzcheck is required for the German bank account number checking, otherwise the account number checking will not be compiled. - The python module "ctypes" http://sf.net/projects/ctypes is required for the python wrappers of aqbanking. The python wrappers are installed by default (to disable it, use --disable-python), but they cannot be used unless "ctypes" is installed. 4.2. Applications ----------------- These applications fully or partially support AqBanking: - AqFinance (http://www2.aquamaniac.de/sites/aqfinance/index.php) - QBankManager (http://www.aquamaniac.de/qbanking/, discontinued) - Gnucash (http://www.gnucash.org/) - KMyMoney (http://www.kmymoney.org/) - OrgaMon (http://orgamon.org/) - Pecunia 0.2 (http://www.pecuniabanking.de/Pecunia/Home.html) The aqbanking package also includes several command-line tools (aqbanking-tool, aqhbci-tool). 5. Building AqBanking ===================== 5.1. Building from the Tar File ------------------------------- #>./configure #>make #>make install (the last step most probably requires you to be root) Compilation hints for specific platforms: - For FreeBSD and potentially other non-Linux platform, it might be necessary to use "gmake" instead of the "make" program. - Also, if your "make" program happens to complain about the variable definition "I18NFILES = $(shell cat ..." (in Makefile.in around line 230) and related definitions, then you need to look for comments in the Makefile about "old make programs". Follow the instructions in these comments, i.e. set some variable definitions to an empty variable manually. This should remove all potentially incompatible directives from the Makefile. - (especially on Mac/Darwin): If your configure run does not detect the QT libraries and it says "checking for qt3 libraries... not found", then you need to specify the linker flags for qt3 manually in the env variable qt3_libs. I.e. if your qt3 library files are in /opt/qt/lib and is called libqt-mt, then you need to specify ./configure qt3_libs="-L/opt/qt/lib -lqt-mt" 5.2. Building from CVS/SVN -------------------------- #>make -fMakefile.cvs and continue as described in "5.1. Building from the Tar File". 5.3. Building the API Documentation ----------------------------------- #>make srcdoc If you want to install a linked API documentation (which links against the API documentations of the projects AqBanking depends on) use this: #>make install-srcdoc This installs the linked doc to the path you gave to ./configure by "--with-docpath=PATH". It defaults to "$HOME/apidoc", which means it does *not* obey the --prefix argument. 6. Windows Registry Keys Used ============================= Some AqBanking versions might use registry keys below HKEY_CURRENT_USER. These are at the moment only versions shipped with GnuCash (at least that used to be the case which is why handling of registry keys was introduced in the first place). Most versions of AqBanking don't use the registry to determine installation paths because those versions are filesystem relocatable, so they don't need the registry. At any rate, those versions that still do use the registry use the following keys. These keys are created by the setup.exe which contains the binary package for WIN32 platforms. 6.1. Software\\AqBanking\\Paths\\pkgdatadir ------------------------------------------- This is the data folder (i.e. $PREFIX/share/aqbanking on POSIX systems). 6.2. Software\\AqBanking\\Paths\\sysconfdir ------------------------------------------- This is the folder containing system configuration files. (i.e. $PREFIX/etc on POSIX systems). 6.3. Software\\AqBanking\\Paths\\bankinfodir ------------------------------------------- This folder is used to store bankinfo plugins. 6.4. Software\\AqBanking\\Paths\\providerdir ------------------------------------------- This folder is used to store provider (backend) plugins. 6.5. Software\\AqBanking\\Paths\\importerdir ------------------------------------------- This folder is used to store importer/exporter plugins. 7. Environment Variables Used ============================= 7.1. AQBANKING_LOGLEVEL ----------------------- This variable stores the loglevel to be used for AqBanking. Possible values are: emergency, alert, critical, error, warning, notice, info, debug and verbous. Each following log level includes the previous one. 7.2. AQBANKING_STORE_JOBLOGS ---------------------------- If this variable is defined then AqBanking will always store job logs with jobs. Otherwise job logs are only stored for jobs with a status other than "finished". Job logs can become quite big. 7.3. AQHBCI_LOGBOOKED --------------------- If this environment variable exists then the file "/tmp/booked.mt" is created upon reception of transactions via the job GetTransactions. This file then contains a SWIFT MT940 document which can be very helpfull in case there is a problem in the SWIFT parser. 7.4. AQHBCI_LOGNOTED -------------------- Same as AQHBCI_LOGBOOKED but for noted transactions (which are transactions which are noted but not yet booked) 7.5. AQHBCI_DEBUG_JOBS ---------------------- If this variable exists then additional debugging data is stored with each job. 7.6. AQOFX_LOG_COMM ------------------- If this variable exists then all OFX communication is logged to /tmp/ofx.log. This is only needed when debugging AqOfxConnect. WARNING: This might expose your user id and password to everyone who can read that file! 8. Using Your Own Profiles for Im-/Exporters ============================================ You can create your own profiles to be used with the various importers. For AqBanking to recognize your private profiles they must be stored in the user local folder. E.g. CSV profiles on Linux must be stored in "$HOME/.aqbanking/imexporters/csv/profiles/". 9. Thanks ========== I wish to thank the following (among others) people for their support in making AqBanking work: - Christian Stimming (build-system and tarball cleanup, translations, inputs) - Jens Koerner (did some huge jobs to provide German translation) - David Reiser (for helping in debugging the OFX DirectConnect code) - Christoph Bohl (for helping with the YellowNet backend) - and of course the many people who submitted bug reports !! Martin Preuss, Hamburg/Germany, 2010/08/26 aqbanking-5.6.4beta/AUTHORS0000644000175000017500000000004512364015477012316 00000000000000Martin Preuss